Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
update
authorJonathan Rouzaud-Cornabas <jonathan.rouzaud-cornabas@ens-lyon.fr>
Tue, 27 Nov 2012 13:57:38 +0000 (07:57 -0600)
committerJonathan Rouzaud-Cornabas <jonathan.rouzaud-cornabas@ens-lyon.fr>
Tue, 27 Nov 2012 13:57:38 +0000 (07:57 -0600)
914 files changed:
.gitignore
CMakeLists.txt
ChangeLog
NEWS
README.IEEE [deleted file]
README.coding
SPEC [deleted file]
TODO
buildtools/Cmake/AddTests.cmake
buildtools/Cmake/CTestConfig.cmake
buildtools/Cmake/CTestCustom.cmake [new file with mode: 0644]
buildtools/Cmake/CompleteInFiles.cmake
buildtools/Cmake/DefinePackages.cmake
buildtools/Cmake/Distrib.cmake
buildtools/Cmake/Flags.cmake
buildtools/Cmake/GenerateDevGuide.cmake
buildtools/Cmake/GenerateDoc.cmake
buildtools/Cmake/GenerateDocWin.cmake
buildtools/Cmake/GenerateRefGuide.cmake
buildtools/Cmake/GenerateUserGuide.cmake
buildtools/Cmake/MaintainerMode.cmake
buildtools/Cmake/MakeExe.cmake
buildtools/Cmake/MakeLib.cmake
buildtools/Cmake/MakeLibWin.cmake
buildtools/Cmake/Modules/FindF2c.cmake
buildtools/Cmake/Modules/FindGTnets.cmake
buildtools/Cmake/Modules/FindGraphviz.cmake
buildtools/Cmake/Modules/FindLibunwind.cmake
buildtools/Cmake/Modules/FindLua51Simgrid.cmake
buildtools/Cmake/Modules/FindNS3.cmake
buildtools/Cmake/Modules/FindPCRE.cmake
buildtools/Cmake/Modules/FindPcreWin.cmake
buildtools/Cmake/Modules/FindRngStream.cmake
buildtools/Cmake/Modules/FindRubySimgrid.cmake
buildtools/Cmake/Modules/FindSimGrid.cmake
buildtools/Cmake/Modules/FindValgrind.cmake
buildtools/Cmake/Option.cmake
buildtools/Cmake/Pipol.cmake
buildtools/Cmake/PrintArgs.cmake
buildtools/Cmake/Supernovae.cmake
buildtools/Cmake/UnitTesting.cmake
buildtools/Cmake/src/internal_config.h.in [moved from buildtools/Cmake/src/gras_config.h.in with 90% similarity]
buildtools/Cmake/src/simgrid.nsi.in
buildtools/Cmake/test_prog/prog_GRAS_ARCH.c [deleted file]
buildtools/Cmake/test_prog/prog_GRAS_CHECK_STRUCT_COMPACTION.c [deleted file]
buildtools/Cmake/test_prog/prog_max_size.c [deleted file]
buildtools/pipol/CtestPipol.cmake [deleted file]
buildtools/pipol/Experimental.sh [deleted file]
buildtools/pipol/Experimental_bindings.sh
buildtools/pipol/MemCheck.sh
buildtools/pipol/Nightly_memCheck.sh
buildtools/pipol/Nightly_simgrid.sh
buildtools/pipol/deploy.sh
buildtools/pipol/pre-simgrid.sh
buildtools/pipol/rc.debian
buildtools/pipol/rc.ubuntu
doc/Doxyfile.in
doc/FAQ.doc
doc/HelloWorld/CMakeLists.txt
doc/HelloWorld/FindPcreWin.cmake
doc/SimgridDoxygenLayout.xml
doc/amok_bw_sat.png [deleted file]
doc/amok_bw_test.png [deleted file]
doc/dev_guide/doxygen/DevGuideDoxyfile.in
doc/dev_guide/doxygen/cmake.doc
doc/dev_guide/doxygen/header.html
doc/dev_guide/doxygen/index.doc
doc/dev_guide/doxygen/output.goal.pdf [new file with mode: 0644]
doc/dev_guide/doxygen/release.doc [new file with mode: 0644]
doc/dev_guide/doxygen/simgrid.doc
doc/dev_guide/doxygen/xps.doc
doc/gras_comm.png [deleted file]
doc/gtut-files/01-bones.c [deleted file]
doc/gtut-files/01-bones.output [deleted file]
doc/gtut-files/02-simple.c [deleted file]
doc/gtut-files/02-simple.output [deleted file]
doc/gtut-files/03-args.c [deleted file]
doc/gtut-files/03-args.output [deleted file]
doc/gtut-files/03-args.xml [deleted file]
doc/gtut-files/04-callback.c [deleted file]
doc/gtut-files/04-callback.output [deleted file]
doc/gtut-files/05-globals.c [deleted file]
doc/gtut-files/05-globals.output [deleted file]
doc/gtut-files/06-logs.c [deleted file]
doc/gtut-files/06-logs.output [deleted file]
doc/gtut-files/06-logs.output.error [deleted file]
doc/gtut-files/06-logs.output.fmt [deleted file]
doc/gtut-files/06-logs.output.fmt-bt [deleted file]
doc/gtut-files/06-logs.output.verbose [deleted file]
doc/gtut-files/07-timers.c [deleted file]
doc/gtut-files/07-timers.output [deleted file]
doc/gtut-files/08-exceptions.c [deleted file]
doc/gtut-files/08-exceptions.output [deleted file]
doc/gtut-files/09-datatype-dump.c [deleted file]
doc/gtut-files/09-simpledata.c [deleted file]
doc/gtut-files/09-simpledata.output [deleted file]
doc/gtut-files/10-rpc.c [deleted file]
doc/gtut-files/10-rpc.output [deleted file]
doc/gtut-files/11-explicitwait.c [deleted file]
doc/gtut-files/11-explicitwait.output [deleted file]
doc/gtut-files/11-explicitwait.xml [deleted file]
doc/gtut-files/Makefile [deleted file]
doc/gtut-files/README [deleted file]
doc/gtut-files/gtut-platform-3nodes.xml [deleted file]
doc/gtut-files/gtut-platform.xml [deleted file]
doc/gtut-files/test.xml [deleted file]
doc/index.doc
doc/ref_guide/doxygen/RefGuideDoxyfile.in
doc/ref_guide/doxygen/header.html
doc/ref_guide/doxygen/main.doc
doc/ref_guide/doxygen/module-amok.doc [deleted file]
doc/ref_guide/doxygen/module-gras.doc [deleted file]
doc/ref_guide/doxygen/module-msg.doc
doc/ref_guide/doxygen/module-xbt.doc
doc/ref_guide/doxygen/modules.doc
doc/shared/fig/simgrid_modules.fig
doc/shared/fig/simgrid_modules.png [deleted file]
doc/shared/fig/simgrid_modules2.fig
doc/shared/fig/simgrid_modules2.png [deleted file]
doc/user_guide/doxygen/UserGuideDoxyfile.in
doc/user_guide/doxygen/bindings.doc
doc/user_guide/doxygen/footer.html [new file with mode: 0644]
doc/user_guide/doxygen/gtut-files/gtut-howto-design.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-howto.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-introduction.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-main.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-00-install.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-01-bones.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-02-simple.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-03-args.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-04-callback.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-05-globals.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-06-logs.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-07-timers.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-08-exceptions.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-09-simpledata.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-10-rpc.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-11-explicitwait.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-12-staticstruct.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-13-pointers.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-14-dynar.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-15-manualdatadef.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-16-exchangecb.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour-recap-messages.doc [deleted file]
doc/user_guide/doxygen/gtut-files/gtut-tour.doc [deleted file]
doc/user_guide/doxygen/header.html [new file with mode: 0644]
doc/user_guide/doxygen/index.doc
doc/user_guide/doxygen/install.doc
doc/user_guide/doxygen/options.doc
doc/user_guide/doxygen/pls.doc
doc/user_guide/doxygen/stylesheet.css [new file with mode: 0644]
doc/user_guide/doxygen/use.doc
doc/user_guide/fig/amok_bw_sat.fig [deleted file]
doc/user_guide/fig/amok_bw_test.fig [deleted file]
doc/user_guide/fig/gras_comm.fig [deleted file]
examples/amok/alnem/alnem.c [deleted file]
examples/amok/alnem/alnem_builder.c [deleted file]
examples/amok/alnem/alnem_deployment.txt [deleted file]
examples/amok/alnem/deploy_WAN3.txt [deleted file]
examples/amok/alnem/interference.dat [deleted file]
examples/amok/bandwidth/CMakeLists.txt [deleted file]
examples/amok/bandwidth/bandwidth.c [deleted file]
examples/amok/bandwidth/bandwidth.xml [deleted file]
examples/amok/bandwidth/bandwidth_rl.tesh [deleted file]
examples/amok/bandwidth/bandwidth_sg_32.tesh [deleted file]
examples/amok/bandwidth/bandwidth_sg_64.tesh [deleted file]
examples/amok/saturate/CMakeLists.txt [deleted file]
examples/amok/saturate/env.c [deleted file]
examples/amok/saturate/medium_deployment.xml [deleted file]
examples/amok/saturate/saturate.c [deleted file]
examples/amok/saturate/saturate.xml [deleted file]
examples/amok/saturate/saturate_rl.tesh [deleted file]
examples/amok/saturate/saturate_sg_32.tesh [deleted file]
examples/amok/saturate/saturate_sg_64.tesh [deleted file]
examples/gras/all2all/CMakeLists.txt [deleted file]
examples/gras/all2all/all2all.c [deleted file]
examples/gras/all2all/all2all.xml [deleted file]
examples/gras/all2all/make_deployment.pl [deleted file]
examples/gras/all2all/run.sh [deleted file]
examples/gras/all2all/test_rl.tesh [deleted file]
examples/gras/all2all/test_sg_32.tesh [deleted file]
examples/gras/all2all/test_sg_64.tesh [deleted file]
examples/gras/chrono/CMakeLists.txt [deleted file]
examples/gras/chrono/chrono.c [deleted file]
examples/gras/chrono/chrono.xml [deleted file]
examples/gras/chrono/chrono2.c [deleted file]
examples/gras/chrono/test_rl.tesh [deleted file]
examples/gras/chrono/test_sg_32.tesh [deleted file]
examples/gras/chrono/test_sg_64.tesh [deleted file]
examples/gras/console/CMakeLists.txt [deleted file]
examples/gras/console/gras_platform_script.lua [deleted file]
examples/gras/console/ping.h [deleted file]
examples/gras/console/ping_client.c [deleted file]
examples/gras/console/ping_common.c [deleted file]
examples/gras/console/ping_generator.lua [deleted file]
examples/gras/console/ping_server.c [deleted file]
examples/gras/mmrpc/CMakeLists.txt [deleted file]
examples/gras/mmrpc/mmrpc.c [deleted file]
examples/gras/mmrpc/mmrpc.h [deleted file]
examples/gras/mmrpc/mmrpc.xml [deleted file]
examples/gras/mmrpc/mmrpc_client.c [deleted file]
examples/gras/mmrpc/mmrpc_common.c [deleted file]
examples/gras/mmrpc/mmrpc_server.c [deleted file]
examples/gras/mmrpc/test_rl.tesh [deleted file]
examples/gras/mmrpc/test_sg_32.tesh [deleted file]
examples/gras/mmrpc/test_sg_64.tesh [deleted file]
examples/gras/mutual_exclusion/simple_token/CMakeLists.txt [deleted file]
examples/gras/mutual_exclusion/simple_token/make_deployment.pl [deleted file]
examples/gras/mutual_exclusion/simple_token/run.sh [deleted file]
examples/gras/mutual_exclusion/simple_token/simple_token.c [deleted file]
examples/gras/mutual_exclusion/simple_token/simple_token.xml [deleted file]
examples/gras/mutual_exclusion/simple_token/test_rl.tesh [deleted file]
examples/gras/mutual_exclusion/simple_token/test_sg_32.tesh [deleted file]
examples/gras/mutual_exclusion/simple_token/test_sg_64.tesh [deleted file]
examples/gras/p2p/can/can.c [deleted file]
examples/gras/p2p/can/can.xml [deleted file]
examples/gras/p2p/can/can_tests.c [deleted file]
examples/gras/p2p/can/test_rl.in [deleted file]
examples/gras/p2p/can/test_sg.in [deleted file]
examples/gras/p2p/can/types.h [deleted file]
examples/gras/p2p/chord/chord.c [deleted file]
examples/gras/p2p/chord/chord.xml [deleted file]
examples/gras/p2p/chord/test_rl.in [deleted file]
examples/gras/p2p/chord/test_sg.in [deleted file]
examples/gras/ping/CMakeLists.txt [deleted file]
examples/gras/ping/ping.h [deleted file]
examples/gras/ping/ping.xml [deleted file]
examples/gras/ping/ping_client.c [deleted file]
examples/gras/ping/ping_common.c [deleted file]
examples/gras/ping/ping_server.c [deleted file]
examples/gras/ping/test_rl.tesh [deleted file]
examples/gras/ping/test_sg_32.tesh [deleted file]
examples/gras/ping/test_sg_64.tesh [deleted file]
examples/gras/pmm/CMakeLists.txt [deleted file]
examples/gras/pmm/make_deployment.pl [deleted file]
examples/gras/pmm/pmm.c [deleted file]
examples/gras/pmm/pmm.xml [deleted file]
examples/gras/pmm/test_rl.tesh [deleted file]
examples/gras/pmm/test_sg_32.tesh [deleted file]
examples/gras/pmm/test_sg_64.tesh [deleted file]
examples/gras/properties/CMakeLists.txt [deleted file]
examples/gras/properties/properties.c [deleted file]
examples/gras/properties/properties.xml [deleted file]
examples/gras/properties/test_rl.tesh [deleted file]
examples/gras/properties/test_sg.tesh [deleted file]
examples/gras/replay/do_simulation.pl [deleted file]
examples/gras/replay/replay.c [deleted file]
examples/gras/replay/replay.xml [deleted file]
examples/gras/replay/workload.h [deleted file]
examples/gras/replay/xbt_workload.c [deleted file]
examples/gras/rpc/CMakeLists.txt [deleted file]
examples/gras/rpc/rpc.c [deleted file]
examples/gras/rpc/rpc.xml [deleted file]
examples/gras/rpc/test_rl.tesh [deleted file]
examples/gras/rpc/test_sg_32.tesh [deleted file]
examples/gras/rpc/test_sg_64.tesh [deleted file]
examples/gras/spawn/CMakeLists.txt [deleted file]
examples/gras/spawn/spawn.c [deleted file]
examples/gras/spawn/spawn.h [deleted file]
examples/gras/spawn/spawn.xml [deleted file]
examples/gras/spawn/test_rl.tesh [deleted file]
examples/gras/spawn/test_sg_32.tesh [deleted file]
examples/gras/spawn/test_sg_64.tesh [deleted file]
examples/gras/synchro/CMakeLists.txt [deleted file]
examples/gras/synchro/philosopher.c [deleted file]
examples/gras/synchro/synchro.xml [deleted file]
examples/gras/synchro/test_rl.tesh [deleted file]
examples/gras/synchro/test_sg_32.tesh [deleted file]
examples/gras/synchro/test_sg_64.tesh [deleted file]
examples/gras/tests.mk [deleted file]
examples/gras/timer/CMakeLists.txt [deleted file]
examples/gras/timer/test_rl.tesh [deleted file]
examples/gras/timer/test_sg_32.tesh [deleted file]
examples/gras/timer/test_sg_64.tesh [deleted file]
examples/gras/timer/timer.c [deleted file]
examples/gras/timer/timer.xml [deleted file]
examples/lua/bittorrent/bittorrent.tesh
examples/lua/chord/chord.tesh
examples/lua/masterslave/master_slave.tesh
examples/msg/actions/actions.c
examples/msg/actions/actions.tesh
examples/msg/bittorrent/bittorrent.tesh
examples/msg/bittorrent/messages.c
examples/msg/bittorrent/messages.h
examples/msg/bittorrent/peer.c
examples/msg/bittorrent/peer.h
examples/msg/chord/CMakeLists.txt
examples/msg/chord/chord.c
examples/msg/chord/chord.tesh
examples/msg/chord/chord_crosstraffic.tesh
examples/msg/cloud/CMakeLists.txt
examples/msg/cloud/masterslave_virtual_machines.tesh
examples/msg/icomms/peer.tesh
examples/msg/io/CMakeLists.txt
examples/msg/kademlia/kademlia.tesh
examples/msg/kademlia/node.h
examples/msg/masterslave/CMakeLists.txt
examples/msg/masterslave/masterslave.tesh
examples/msg/masterslave/masterslave_bypass.tesh
examples/msg/masterslave/masterslave_cpu_ti_crosstraffic.tesh
examples/msg/masterslave/masterslave_crosstraffic.tesh
examples/msg/masterslave/masterslave_forwarder.tesh
examples/msg/masterslave/masterslave_forwarder_crosstraffic.tesh
examples/msg/masterslave/masterslave_mailbox.tesh
examples/msg/masterslave/masterslave_mailbox_crosstraffic.tesh
examples/msg/mc/CMakeLists.txt
examples/msg/mc/bugged1_liveness.c
examples/msg/mc/bugged1_liveness.tesh [new file with mode: 0644]
examples/msg/mc/chord/chord_liveness.c [moved from examples/msg/chord/chord_before_dsend.c with 77% similarity]
examples/msg/mc/chord/chord_liveness.h [new file with mode: 0644]
examples/msg/mc/chord/chord_neverjoin.tesh [new file with mode: 0644]
examples/msg/mc/chord/deploy_chord_before_dsend_liveness.xml [new file with mode: 0644]
examples/msg/mc/chord/deploy_chord_liveness.xml [new file with mode: 0644]
examples/msg/mc/chord/promela_chord_liveness [new file with mode: 0644]
examples/msg/mc/test/deploy_snapshot_comparison.xml [moved from teshsuite/gras/small_sleep/small_sleep.xml with 65% similarity]
examples/msg/mc/test/promela [new file with mode: 0644]
examples/msg/mc/test/snapshot_comparison1.c [new file with mode: 0644]
examples/msg/mc/test/snapshot_comparison1.tesh [new file with mode: 0644]
examples/msg/mc/test/snapshot_comparison2.c [new file with mode: 0644]
examples/msg/mc/test/snapshot_comparison2.tesh [new file with mode: 0644]
examples/msg/mc/test/snapshot_comparison3.c [new file with mode: 0644]
examples/msg/mc/test/snapshot_comparison3.tesh [new file with mode: 0644]
examples/msg/mc/test/snapshot_comparison4.c [new file with mode: 0644]
examples/msg/mc/test/snapshot_comparison4.tesh [new file with mode: 0644]
examples/msg/mc/test/snapshot_comparison5.c [new file with mode: 0644]
examples/msg/mc/test/snapshot_comparison5.tesh [new file with mode: 0644]
examples/msg/mc/test/snapshot_comparison_platform.xml [new file with mode: 0644]
examples/msg/mc/test/test_heap_comparison.c [deleted file]
examples/msg/ns3/CMakeLists.txt
examples/msg/pmm/pmm.tesh
examples/msg/properties/msg_prop.c
examples/msg/properties/msg_prop.tesh
examples/msg/sendrecv/sendrecv_CLM03.tesh
examples/msg/sendrecv/sendrecv_Reno.tesh
examples/msg/sendrecv/sendrecv_Vegas.tesh
examples/msg/start_kill_time/CMakeLists.txt
examples/msg/token_ring/CMakeLists.txt
examples/msg/token_ring/token_ring.tesh
examples/msg/tracing/CMakeLists.txt
examples/msg/tracing/categories.c
examples/msg/tracing/categories.tesh
examples/msg/tracing/ms.c
examples/msg/tracing/ms.tesh
examples/msg/tracing/trace_platform.tesh
examples/msg/tracing/user_variables.c
examples/msg/tracing/user_variables.tesh
examples/platforms/content/storage_content.txt
examples/platforms/prop.xml
examples/simdag/CMakeLists.txt
examples/simdag/dax/CMakeLists.txt
examples/simdag/dax/smalldax.tesh
examples/simdag/dot/CMakeLists.txt
examples/simdag/dot/test_simdag_dotload.tesh
examples/simdag/goal/CMakeLists.txt
examples/simdag/goal/goal_test.c
examples/simdag/metaxml/CMakeLists.txt
examples/simdag/metaxml/sd_meta.c
examples/simdag/properties/CMakeLists.txt
examples/simdag/properties/sd_prop.c
examples/simdag/properties/test_prop.tesh
examples/simdag/scheduling/CMakeLists.txt
examples/simdag/scheduling/test_minmin.tesh
examples/simdag/test_simdag.tesh
examples/simdag/test_simdag2.tesh
examples/simdag/test_simdag_seq_access.tesh
examples/simdag/test_simdag_tracing.tesh
examples/smpi/CMakeLists.txt
examples/smpi/MM/CMakeLists.txt
examples/smpi/MM/MM_mpi.c
examples/smpi/NAS/MPI_dummy/mpi_dummy.c
examples/smpi/bcbench.c
examples/smpi/replay/replay.c
examples/smpi/tracing/smpi_traced.c
examples/smpi/tracing/smpi_traced.tesh
examples/smpi/tracing/smpi_traced_simple.c
examples/temps-gras-stub.mk [deleted file]
include/amok/bandwidth.h [deleted file]
include/amok/base.h [deleted file]
include/amok/peermanagement.h [deleted file]
include/gras.h [deleted file]
include/gras/emul.h [deleted file]
include/gras/messages.h [deleted file]
include/gras/module.h [deleted file]
include/gras/process.h [deleted file]
include/gras/timer.h [deleted file]
include/gras/transport.h [deleted file]
include/gras/virtu.h [deleted file]
include/instr/instr.h
include/msg/datatypes.h
include/msg/msg.h
include/simgrid/modelchecker.h
include/simgrid/simix.h
include/smpi/mpi.h
include/smpi/mpif.h
include/smpi/smpi.h
include/smpi/smpi_main.h [new file with mode: 0644]
include/surf/surf_routing.h
include/xbt.h
include/xbt/automaton.h
include/xbt/datadesc.h [deleted file]
include/xbt/dynar.h
include/xbt/ex.h
include/xbt/fifo.h
include/xbt/file_stat.h
include/xbt/misc.h
include/xbt/mmalloc.h
include/xbt/module.h
include/xbt/socket.h [deleted file]
include/xbt/str.h
include/xbt/synchro.h [deleted file]
include/xbt/synchro_core.h
include/xbt/time.h [deleted file]
include/xbt/virtu.h
include/xbt/xbt_os_thread.h
src/amok/Bandwidth/bandwidth.c [deleted file]
src/amok/Bandwidth/bandwidth_private.h [deleted file]
src/amok/Bandwidth/saturate.c [deleted file]
src/amok/PeerManagement/peermanagement.c [deleted file]
src/amok/amok_base.c [deleted file]
src/amok/amok_modinter.h [deleted file]
src/bindings/lua/lua_stub_generator.c [deleted file]
src/bindings/lua/simgrid_lua.c
src/bindings/lua/simgrid_lua.h
src/gras/Msg/gras_msg_exchange.c [deleted file]
src/gras/Msg/gras_msg_listener.c [deleted file]
src/gras/Msg/gras_msg_mod.c [deleted file]
src/gras/Msg/gras_msg_types.c [deleted file]
src/gras/Msg/msg_interface.h [deleted file]
src/gras/Msg/msg_private.h [deleted file]
src/gras/Msg/rl_msg.c [deleted file]
src/gras/Msg/rpc.c [deleted file]
src/gras/Msg/sg_msg.c [deleted file]
src/gras/Msg/timer.c [deleted file]
src/gras/Transport/README [deleted file]
src/gras/Transport/rl_transport.c [deleted file]
src/gras/Transport/sg_transport.c [deleted file]
src/gras/Transport/transport.c [deleted file]
src/gras/Transport/transport_interface.h [deleted file]
src/gras/Transport/transport_plugin_file.c [deleted file]
src/gras/Transport/transport_plugin_sg.c [deleted file]
src/gras/Transport/transport_private.h [deleted file]
src/gras/Virtu/gras_module.c [deleted file]
src/gras/Virtu/process.c [deleted file]
src/gras/Virtu/rl_dns.c [deleted file]
src/gras/Virtu/rl_emul.c [deleted file]
src/gras/Virtu/rl_process.c [deleted file]
src/gras/Virtu/sg_dns.c [deleted file]
src/gras/Virtu/sg_emul.c [deleted file]
src/gras/Virtu/sg_process.c [deleted file]
src/gras/Virtu/virtu_interface.h [deleted file]
src/gras/Virtu/virtu_private.h [deleted file]
src/gras/Virtu/virtu_rl.h [deleted file]
src/gras/Virtu/virtu_sg.h [deleted file]
src/gras/gras.c [deleted file]
src/gras/rl_stubs.c [deleted file]
src/gras_modinter.h [deleted file]
src/include/mc/datatypes.h
src/include/mc/mc.h
src/include/simgrid/platf_interface.h
src/include/surf/maxmin.h
src/include/surf/surf.h
src/include/xbt/xbt_os_time.h
src/instr/instr_config.c
src/instr/instr_msg_process.c
src/instr/instr_msg_task.c
src/instr/instr_paje_trace.c
src/instr/instr_private.h
src/instr/instr_routing.c
src/instr/instr_smpi.c
src/mc/mc_checkpoint.c
src/mc/mc_compare.c
src/mc/mc_dpor.c
src/mc/mc_global.c
src/mc/mc_liveness.c
src/mc/mc_private.h
src/mc/mc_request.c
src/mc/mc_state.c
src/mc/test/heap_comparison.c [deleted file]
src/msg/msg_global.c
src/msg/msg_gos.c
src/msg/msg_mailbox.c
src/msg/msg_process.c
src/msg/msg_task.c
src/portable.h
src/simix/README_attempt_without_stack
src/simix/simix_network.tla [new file with mode: 0644]
src/simix/smx_context.c
src/simix/smx_context_base.c
src/simix/smx_context_raw.c
src/simix/smx_context_sysv.c
src/simix/smx_context_thread.c
src/simix/smx_global.c
src/simix/smx_network.c
src/simix/smx_private.h
src/simix/smx_process.c
src/simix/smx_smurf.c
src/simix/smx_smurf_private.h
src/simix/smx_user.c
src/smpi/private.h
src/smpi/smpi_base.c
src/smpi/smpi_bench.c
src/smpi/smpi_f77.c
src/smpi/smpi_global.c
src/smpi/smpi_mpi_dt.c
src/smpi/smpi_pmpi.c
src/smpi/smpi_replay.c
src/smpi/smpicc.in
src/smpi/smpif2c.in
src/smpi/smpirun.in
src/surf/network.c
src/surf/random_mgr.c
src/surf/simgrid_dtd.c
src/surf/storage.c
src/surf/surf.c
src/surf/surf_action.c
src/surf/surf_config.c
src/surf/surf_routing_private.h
src/surf/surfxml_parseplatf.c
src/win32/config.h
src/xbt/automaton/automaton.c
src/xbt/automaton/automaton_lexer.yy.c
src/xbt/automaton/parserPromela.lex
src/xbt/backtrace_linux.c
src/xbt/datadesc/cbps.c [deleted file]
src/xbt/datadesc/datadesc.c [deleted file]
src/xbt/datadesc/datadesc_interface.h [deleted file]
src/xbt/datadesc/datadesc_private.h [deleted file]
src/xbt/datadesc/ddt_convert.c [deleted file]
src/xbt/datadesc/ddt_create.c [deleted file]
src/xbt/datadesc/ddt_exchange.c [deleted file]
src/xbt/datadesc/ddt_parse.c [deleted file]
src/xbt/datadesc/ddt_parse.yy.c [deleted file]
src/xbt/datadesc/ddt_parse.yy.h [deleted file]
src/xbt/datadesc/ddt_parse.yy.l [deleted file]
src/xbt/dynar.c
src/xbt/ex.c
src/xbt/ex_interface.h
src/xbt/fifo.c
src/xbt/heap.c
src/xbt/log.c
src/xbt/mmalloc/mm_diff.c
src/xbt/mmalloc/mm_legacy.c
src/xbt/mmalloc/mm_module.c
src/xbt/mmalloc/mmalloc.c
src/xbt/mmalloc/mmorecore.c
src/xbt/mmalloc/mmprivate.h
src/xbt/parmap.c
src/xbt/setset.c
src/xbt/swag.c
src/xbt/xbt_log_layout_format.c
src/xbt/xbt_log_layout_simple.c
src/xbt/xbt_main.c
src/xbt/xbt_os_thread.c
src/xbt/xbt_queue.c
src/xbt/xbt_replay.c
src/xbt/xbt_rl_synchro.c [deleted file]
src/xbt/xbt_rl_time.c [deleted file]
src/xbt/xbt_sg_synchro.c
src/xbt/xbt_sg_time.c [deleted file]
src/xbt/xbt_socket.c [deleted file]
src/xbt/xbt_socket_private.h [deleted file]
src/xbt/xbt_str.c
src/xbt/xbt_synchro.c [deleted file]
src/xbt/xbt_trp_plugin_tcp.c [deleted file]
src/xbt/xbt_virtu.c
src/xbt_modinter.h
teshsuite/gras/CMakeLists.txt [deleted file]
teshsuite/gras/README [deleted file]
teshsuite/gras/datadesc/CMakeLists.txt [deleted file]
teshsuite/gras/datadesc/datadesc.big32_8_4 [deleted file]
teshsuite/gras/datadesc/datadesc.big64 [deleted file]
teshsuite/gras/datadesc/datadesc.little32_4 [deleted file]
teshsuite/gras/datadesc/datadesc.little64 [deleted file]
teshsuite/gras/datadesc/datadesc.tesh [deleted file]
teshsuite/gras/datadesc/datadesc_mem.tesh [deleted file]
teshsuite/gras/datadesc/datadesc_r_big32_8_4.tesh [deleted file]
teshsuite/gras/datadesc/datadesc_r_little32_4.tesh [deleted file]
teshsuite/gras/datadesc/datadesc_r_little64.tesh [deleted file]
teshsuite/gras/datadesc/datadesc_rw.tesh [deleted file]
teshsuite/gras/datadesc/datadesc_structs.c [deleted file]
teshsuite/gras/datadesc/datadesc_usage.c [deleted file]
teshsuite/gras/datadesc/mk_datadesc_structs.pl [deleted file]
teshsuite/gras/empty_main/CMakeLists.txt [deleted file]
teshsuite/gras/empty_main/empty_main.c [deleted file]
teshsuite/gras/empty_main/empty_main.xml [deleted file]
teshsuite/gras/empty_main/test_rl.tesh [deleted file]
teshsuite/gras/empty_main/test_sg.tesh [deleted file]
teshsuite/gras/gras.tesh [deleted file]
teshsuite/gras/msg_handle/CMakeLists.txt [deleted file]
teshsuite/gras/msg_handle/msg_handle.c [deleted file]
teshsuite/gras/msg_handle/msg_handle.xml [deleted file]
teshsuite/gras/msg_handle/test_rl.tesh [deleted file]
teshsuite/gras/msg_handle/test_sg_32.tesh [deleted file]
teshsuite/gras/msg_handle/test_sg_64.tesh [deleted file]
teshsuite/gras/numerous_rpc/CMakeLists.txt [deleted file]
teshsuite/gras/numerous_rpc/numerous_rpc.c [deleted file]
teshsuite/gras/numerous_rpc/numerous_rpc.xml [deleted file]
teshsuite/gras/small_sleep/CMakeLists.txt [deleted file]
teshsuite/gras/small_sleep/small_sleep.c [deleted file]
teshsuite/gras/small_sleep/test_sg_32.tesh [deleted file]
teshsuite/gras/small_sleep/test_sg_64.tesh [deleted file]
teshsuite/msg/CMakeLists.txt
teshsuite/simdag/CMakeLists.txt
teshsuite/simdag/basic0.c
teshsuite/simdag/basic0.tesh
teshsuite/simdag/basic1.c
teshsuite/simdag/basic2.c
teshsuite/simdag/basic2.tesh
teshsuite/simdag/basic3.c
teshsuite/simdag/basic3.tesh
teshsuite/simdag/basic4.c
teshsuite/simdag/basic4.tesh
teshsuite/simdag/basic5.c
teshsuite/simdag/basic5.tesh
teshsuite/simdag/basic6.c
teshsuite/simdag/basic6.tesh
teshsuite/simdag/incomplete.c
teshsuite/simdag/incomplete.tesh
teshsuite/simdag/network/CMakeLists.txt
teshsuite/simdag/network/mxn/CMakeLists.txt
teshsuite/simdag/network/p2p/CMakeLists.txt
teshsuite/simdag/network/p2p/platform_2p_1bb.xml
teshsuite/simdag/network/p2p/platform_2p_1fl.xml
teshsuite/simdag/network/p2p/platform_2p_1sl.xml
teshsuite/simdag/network/p2p/platform_2p_1switch.xml
teshsuite/simdag/partask/CMakeLists.txt
teshsuite/simdag/platforms/CMakeLists.txt
teshsuite/simdag/platforms/flatifier.c
teshsuite/smpi/CMakeLists.txt
teshsuite/smpi/alltoall2.c
teshsuite/smpi/alltoall_basic.c
teshsuite/smpi/alltoallv.c
teshsuite/smpi/compute.tesh [new file with mode: 0644]
teshsuite/smpi/hostfile
teshsuite/smpi/hvector.tesh
teshsuite/smpi/indexed_test.c
teshsuite/smpi/mpich-test/.gitignore [new file with mode: 0644]
teshsuite/smpi/mpich-test/CMakeLists.txt [new file with mode: 0644]
teshsuite/smpi/mpich-test/README [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/CMakeLists.txt [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/allgatherf.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/allred.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/allred.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/allred2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/allredf.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/allredf.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/allredmany.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/allredmany.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/alltoallv.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/assocf.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/barrier.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/bcast.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/bcast2.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/bcastbug.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/bcastbug2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/bcastlog.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/bcastvec.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll1.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll10.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll11.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll12.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll13.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll13.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll3.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll4.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll5.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll6.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll7.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll8.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/coll9.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/grouptest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/longuser.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/nbcoll.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/redscat.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/redtst.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/runtests [new file with mode: 0755]
teshsuite/smpi/mpich-test/coll/scantst.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/scattern.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/scatterv.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/scatterv.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/shortint.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/temprun [new file with mode: 0755]
teshsuite/smpi/mpich-test/coll/test.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/coll/test.h [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/CMakeLists.txt [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/attrerr.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/attrerr.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/attrt.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/attrt.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/attrtest.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/commnames.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/commnames.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/commnamesf.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/context.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/groupcreate.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/grouptest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/icdup.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/ictest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/ictest2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/ictest3.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/runtests [new file with mode: 0755]
teshsuite/smpi/mpich-test/context/test.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/context/test.h [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/CMakeLists.txt [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/aborttest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/aborttest.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/argstest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/baseattr.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/baseattrf.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/cmdline.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/env.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/errhand.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/errhand2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/errhandf.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/errstringsf.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/errstringsf.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/getproc.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/getprocf.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/gtime.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/hang.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/init.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/runtests [new file with mode: 0755]
teshsuite/smpi/mpich-test/env/sigchk.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/test.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/test.h [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/testerr.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/timers.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/env/timertest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/profile/CMakeLists.txt [new file with mode: 0644]
teshsuite/smpi/mpich-test/profile/colluses.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/profile/ptest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/profile/ptest.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/profile/runtests [new file with mode: 0755]
teshsuite/smpi/mpich-test/pt2pt/CMakeLists.txt [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/README [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/allpair.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/allpair.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/allpair2.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/allpair2.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/bsendtest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/cancel.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/cancel2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/cancel3.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/cancelibm.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/cancelissend.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/cancelmessages.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/commit.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/dataalign.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/dtypelife.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/dtyperecv.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/dtypes.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/dtypes.h [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/exittest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/fairness/README [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/fairness/fairness-euih.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/fairness/fairness.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/fairness/fairness2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/fairness/fairness2m.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/fairness/fairnessm.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/fifth.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/flood.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/flood2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/fourth.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/gcomm.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/gcomm.h [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/getelm.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/hindexed.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/hindexed.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/htmsg.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/hvec.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/hvec.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/hvectest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/hvectest2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/irecvtest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/irsend.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/irsendinit.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/isendf.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/isendtest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/isndrcv.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/isndrcv2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/issend2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/issendinit.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/issendtest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/longmsgs.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/mpitest.h [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/nblock.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/nblock.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/nbtest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/nbtest.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/nullproc.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/nullproc.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/nullproc2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/nullproc2.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/order.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/overtake.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/pack.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/persist.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/persist2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/persistent.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/persistent.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/pingpong.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/probe.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/probe1.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/relrank.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/reqcreate.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/reqcreate.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/reqfree.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/runtests [new file with mode: 0755]
teshsuite/smpi/mpich-test/pt2pt/secondf.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/self.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/self.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/selfvsworld.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/send1.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sendcplx.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sendcplx.stdo [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sendfort.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sendmany.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sendmany.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sendorder.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sendrecv.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sendrecv2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sendrecv3.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sendrecv4.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sixth.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sndrcv.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sndrcvrep.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sndrcvrep.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/sndrcvrpl2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/ssendtest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/ssendtest2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/ssendtest2.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/structf.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/structf.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/structlb.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/systest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/systest1.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/test.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/test.h [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/testall.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/testhetero [new file with mode: 0755]
teshsuite/smpi/mpich-test/pt2pt/testsome.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/testtest1.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/testtypes.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/third.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/trunc.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/truncmult.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/typebase.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/typebase.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/typebasef.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/typecreate.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/typecreate.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/typelb.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/typetest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/typeub.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/typeub2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/typeub2.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/typeub3.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/typeub3.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/waitall.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/waitall.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/waitall2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/waitall3.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/waitall4.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/waitany.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/pt2pt/waitany.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/runbase [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/cart.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/cart1f.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/cart2.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/cart2f.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/cartc.f90 [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/cartf.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/cartf.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/cartmap.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/cartmap.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/cartorder.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/dims.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/graphtest.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/graphtest.std [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/test.c [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/test.h [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/twod.f [new file with mode: 0644]
teshsuite/smpi/mpich-test/topol/twod2.f [new file with mode: 0644]
teshsuite/smpi/sendrecv.c
teshsuite/smpi/ttest01.c
teshsuite/xbt/CMakeLists.txt
teshsuite/xbt/log_large_test.c
teshsuite/xbt/parallel_log_crashtest.c
teshsuite/xbt/parallel_log_crashtest.tesh
testsuite/surf/CMakeLists.txt
testsuite/xbt/CMakeLists.txt
testsuite/xbt/heap_bench.c
testsuite/xbt/log_usage.c
testsuite/xbt/parmap_bench.c
tools/CMakeLists.txt
tools/compile-stats [deleted file]
tools/graphicator/CMakeLists.txt
tools/gras/CMakeLists.txt [deleted file]
tools/gras/gras_stub_generator.h [deleted file]
tools/gras/s_smx_process_t [deleted file]
tools/gras/s_smx_simcall_t [deleted file]
tools/gras/struct_diff.c [deleted file]
tools/gras/stub_generator.bpf [deleted file]
tools/gras/stub_generator.bpr [deleted file]
tools/gras/stub_generator.c [deleted file]
tools/gras/stub_generator4borland.mak [deleted file]
tools/gras/unix_stub_generator.c [deleted file]
tools/gras/windows_stub_generator.c [deleted file]
tools/simgrid_update_xml.pl
tools/tesh/CMakeLists.txt
tools/tesh/README
tools/tesh/run_context.c
tools/tesh/tesh.1

index ebd756a..99e7567 100644 (file)
@@ -29,7 +29,6 @@ src/bindings/ruby/simgrid.so
 examples/ruby/simgrid.so
 examples/lua/simgrid.so
 src/bindings/ruby/libsimgrid.so
-examples/gras/console/simgrid.so
 examples/msg/masterslave/simgrid.so
 examples/simdag/simgrid.so
 examples/lua/console/simgrid.so
@@ -48,7 +47,7 @@ include/xbt/version.h
 include/instr/tracing_config.h
 include/smpi/smpif.h
 src/context_sysv_config.h
-src/gras_config.h
+src/internal_config.h
 src/smpi/smpicc
 src/smpi/smpirun
 simgrid-*.tar.gz
@@ -176,6 +175,12 @@ examples/msg/mc/bugged1_for_liveness
 examples/msg/mc/bugged1_while_liveness
 examples/msg/mc/centralized_liveness_deadlock
 examples/msg/mc/test/test_heap_comparison
+examples/msg/mc/chord_liveness
+examples/msg/mc/test/snapshot_comparison_liveness1
+examples/msg/mc/test/snapshot_comparison_liveness2
+examples/msg/mc/test/snapshot_comparison_liveness3
+examples/msg/mc/test/snapshot_comparison_liveness4
+examples/msg/mc/test/snapshot_comparison_liveness5
 examples/msg/chord/chord
 examples/msg/chord/chord_stateful
 examples/msg/chord/deployments
@@ -185,9 +190,6 @@ examples/msg/token_ring/token_bypass
 examples/msg/icomms/peer
 examples/msg/icomms/peer2
 examples/msg/start_kill_time/sk_time
-examples/gras/console/ping_client_console
-examples/gras/console/ping_server_console
-examples/gras/console/ping_simulator_console
 examples/msg/icomms/.kdbgrc.peer3
 examples/msg/icomms/peer3
 examples/msg/icomms/toto.txt
@@ -213,35 +215,6 @@ examples/simdag/sd_test2
 examples/simdag/dax/dax_test
 examples/simdag/goal/goal_test
 examples/simdag/scheduling/minmin_test
-examples/amok/bandwidth/bandwidth_maestro
-examples/amok/bandwidth/bandwidth_sensor
-examples/amok/saturate/saturate_maestro
-examples/amok/saturate/saturate_sensor
-examples/gras/all2all/all2all_receiver
-examples/gras/all2all/all2all_sender
-examples/gras/chrono/chrono_multiplier
-examples/gras/mmrpc/mmrpc_client
-examples/gras/mmrpc/mmrpc_server
-examples/gras/mutual_exclusion/simple_token/simple_token_node
-examples/gras/mutual_exclusion/simple_token/simple_token_checker
-examples/gras/ping/ping_client
-examples/gras/ping/ping_server
-examples/gras/ping/ping_checker
-examples/gras/pmm/pmm_master
-examples/gras/pmm/pmm_slave
-examples/gras/properties/properties_alice
-examples/gras/properties/properties_bob
-examples/gras/properties/properties_master
-examples/gras/properties/properties_slave
-examples/gras/rpc/rpc_client
-examples/gras/rpc/rpc_forwarder
-examples/gras/rpc/rpc_server
-examples/gras/spawn/spawn_server
-examples/gras/synchro/synchro_philosopher
-examples/gras/timer/timer_client
-examples/gras/replay/replay_simulator
-examples/gras/replay/replay_master
-examples/gras/replay/replay_worker
 examples/msg/actions/actions
 examples/msg/bittorrent/bittorrent
 examples/msg/bittorrent/bittorrent_platfgen
@@ -271,32 +244,14 @@ examples/msg/parallel_contexts/pcontexts2
 examples/msg/pmm/msg_pmm
 examples/smpi/toto.txt
 examples/smpi/MM/MM_mpi
-examples/smpi/hvector_test
-examples/smpi/indexed_test
 examples/smpi/smpi_replay
-examples/smpi/struct_test
-examples/smpi/vector_test
 examples/smpi/replay
-examples/smpi/reduce
-examples/smpi/bcast
 examples/smpi/bcbench
-examples/smpi/compute
-examples/smpi/compute2
-examples/smpi/compute3
 examples/smpi/first
 examples/smpi/mvmul
 examples/smpi/ring_c
 examples/smpi/second
-examples/smpi/split
-examples/smpi/allreduce
-examples/smpi/pingpong
-examples/smpi/scatter
-examples/smpi/alltoall2
-examples/smpi/alltoall_basic
-examples/smpi/alltoallv
 examples/smpi/sendrecv
-examples/smpi/smpi_sendrecv
-examples/smpi/dsend
 examples/smpi/mc_bugged1
 examples/smpi/mc_bugged2
 examples/smpi/smpi_traced_simple
@@ -309,15 +264,25 @@ examples/msg/mc/centralized_liveness
 
 src/replay/replay
 src/testall
-teshsuite/gras/datadesc/datadesc_usage
-teshsuite/gras/empty_main/empty_main_function
-teshsuite/gras/msg_handle/msg_handle_client
-teshsuite/gras/msg_handle/msg_handle_server
-teshsuite/gras/small_sleep/log.txt
-teshsuite/gras/small_sleep/small_sleep_function
-teshsuite/gras/modelcheck/modelcheck_checker
-teshsuite/gras/numerous_rpc/numerous_rpc_client
-teshsuite/gras/numerous_rpc/numerous_rpc_server
+teshsuite/smpi/allreduce
+teshsuite/smpi/alltoall2
+teshsuite/smpi/alltoall_basic
+teshsuite/smpi/alltoallv
+teshsuite/smpi/bcast
+teshsuite/smpi/compute
+teshsuite/smpi/compute2
+teshsuite/smpi/compute3
+teshsuite/smpi/dsend
+teshsuite/smpi/hvector_test
+teshsuite/smpi/indexed_test
+teshsuite/smpi/pingpong
+teshsuite/smpi/reduce
+teshsuite/smpi/scatter
+teshsuite/smpi/smpi_sendrecv
+teshsuite/smpi/split
+teshsuite/smpi/struct_test
+teshsuite/smpi/ttest01
+teshsuite/smpi/vector_test
 teshsuite/msg/get_sender
 teshsuite/msg/trace/test_trace_integration
 teshsuite/simdag/basic0
@@ -361,15 +326,12 @@ testsuite/xbt/context_usage
 testsuite/xbt/graphxml_usage
 testsuite/xbt/heap_bench
 testsuite/xbt/log_usage
-tools/gras/gras_stub_generator
 tools/tesh/tesh
 examples/msg/tracing/categories
 examples/msg/tracing/ms
 teshsuite/simdag/platforms/is_router_test
 examples/msg/masterslave/masterslave_cluster
 examples/simdag/simdag_tracing
-examples/gras/spawn/spawn_child
-examples/gras/spawn/spawn_father
 examples/smpi/smpi_traced
 examples/smpi/ttest01
 teshsuite/datadesc_usage.out
index 8fab4f2..2ed2fea 100644 (file)
@@ -2,33 +2,60 @@ cmake_minimum_required(VERSION 2.6)
 ### Need to set rc ccompiler before enable language
 if(WIN32)
   SET(CMAKE_RC_COMPILER "windres")
-endif(WIN32)
-project(SimGrid CXX C)
+endif()
+project(SimGrid C)
+if (enable_gtnets OR enable_ns3)
+  enable_language(CXX)
+endif()
+if (NOT DEFINED enable_smpi OR enable_smpi) # smpi is enabled by default
+  # Call enable_language(Fortran) in order to load the build rules for
+  # this language, needed by teshsuite/smpi/mpich-test/.  Use
+  # CMAKE_FORCE_Fortran_COMPILER to bypass checks for a working
+  # compiler (smpiff don't exist at configure time).
+  include(CMakeForceCompiler)
+  if(NOT COMMAND CMAKE_FORCE_Fortran_COMPILER)
+    MACRO(CMAKE_FORCE_Fortran_COMPILER compiler id)
+      SET(CMAKE_Fortran_COMPILER "${compiler}")
+      SET(CMAKE_Fortran_COMPILER_ID_RUN TRUE)
+      SET(CMAKE_Fortran_COMPILER_ID ${id})
+      SET(CMAKE_Fortran_COMPILER_WORKS TRUE)
+      SET(CMAKE_Fortran_COMPILER_FORCED TRUE)
+
+      # Set old compiler id variables.
+      IF("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU")
+        SET(CMAKE_COMPILER_IS_GNUG77 1)
+      ENDIF("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU")
+    ENDMACRO(CMAKE_FORCE_Fortran_COMPILER)
+  endif()
+  CMAKE_FORCE_Fortran_COMPILER(smpiff smpiff)
+  enable_language(Fortran OPTIONAL)
+endif()
 
 set(CMAKE_C_FLAGS "" CACHE TYPE INTERNAL FORCE)
 set(CMAKE_CXX_FLAGS "" CACHE TYPE INTERNAL FORCE)
 set(CMAKE_EXE_LINKER_FLAGS "" CACHE TYPE INTERNAL FORCE)
 set(CMAKE_C_LINK_FLAGS "" CACHE TYPE INTERNAL FORCE)
-
+set(CMAKE_Fortran_FLAGS "" CACHE TYPE INTERNAL FORCE)
+set(CMAKE_Fortran_LINK_FLAGS "" CACHE TYPE INTERNAL FORCE)
 ## Mapping version number -> version name
 # 3.5.99 -> alpha1 (oops)
 # 3.5.9{1,2} -> beta{1,2}
 # 3.5.9{3,4,5} -> rc{1,2,3}
 # 3.6.{0,1,2} -> release 3.6, 3.6.1, 3.6.2
 # 3.7.{0,1} -> release 3.7, 3.7.1
-# 3.8.0 -> release 3.8
+# 3.8.{0,1} -> release 3.8, 3.8.1
+# 3.9.0 -> release 3.9
 
 set(SIMGRID_VERSION_MAJOR "3")
-set(SIMGRID_VERSION_MINOR "8")
+set(SIMGRID_VERSION_MINOR "9")
 set(SIMGRID_VERSION_PATCH "0")
 
 if(${SIMGRID_VERSION_PATCH} EQUAL "0")
   set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}")
-else(${SIMGRID_VERSION_PATCH} EQUAL "0")
+else()
   set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}.${SIMGRID_VERSION_PATCH}")
-endif(${SIMGRID_VERSION_PATCH} EQUAL "0")
+endif()
 set(libsimgrid_version "${release_version}")
-set(libgras_version "${release_version}")
 set(libsmpi_version "${release_version}")
 set(GCC_NEED_VERSION "4.0")
 set(APPLE_NEED_GCC_VERSION "4.6")
@@ -36,14 +63,14 @@ set(APPLE_NEED_GCC_VERSION "4.6")
 ### SET THE LIBRARY EXTENSION AND GCC VERSION
 if(APPLE) #MAC
   set(LIB_EXE "dylib")
-else(APPLE)
+else()
   if(WIN32) #WINDOWS
     set(LIB_EXE "a")
     set(BIN_EXE ".exe")
-  else(WIN32) #UNIX
+  else() #UNIX
     set(LIB_EXE "so")
-  endif(WIN32)
-endif(APPLE)
+  endif()
+endif()
 
 string(REGEX MATCH "gcc" GCC "${CMAKE_C_COMPILER}")
 if(GCC)
@@ -57,20 +84,20 @@ if(GCC)
 
   if(${GCC_NEED_VERSION} GREATER  COMPILER_C_VERSION_MAJOR_MINOR)
     message(FATAL_ERROR "Gcc must be to version ${GCC_NEED_VERSION} current version ${COMPILER_C_VERSION_MAJOR_MINOR}")
-  endif(${GCC_NEED_VERSION} GREATER  COMPILER_C_VERSION_MAJOR_MINOR)
-endif(GCC)
+  endif()
+endif()
 
 string(REGEX MATCH "cl.exe" VBC "${CMAKE_C_COMPILER}")
 if(VBC)
   message(FATAL_ERROR "VB is not yet supported by Simgrid.")
-endif(VBC)
+endif()
 
 ### Find programs and paths
 FIND_PROGRAM(GCOV_PATH gcov)
 include(FindPerl)
 if(NOT PERL_EXECUTABLE)
   message(FATAL_ERROR "-- SimGrid cannot be compiled without Perl installed -- sorry. Bailling out.")
-endif(NOT PERL_EXECUTABLE)
+endif()
 
 ### Set some variables for Cmake
 SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
@@ -87,21 +114,21 @@ set(INCLUDES
 
 if(WIN32)
   set(INCLUDES ${INCLUDES} ${CMAKE_HOME_DIRECTORY}/include/xbt ${CMAKE_HOME_DIRECTORY}/src/xbt) #for win32_ucontext.[ch]
-endif(WIN32)
+endif()
 set(CMAKE_SOURCE_DIR ${PROJECT_SOURCE_DIRECTORY})
 
 if(NOT CMAKE_CROSSCOMPILING AND EXISTS /usr/include/)
   set(INCLUDES ${INCLUDES} /usr/include/)
-endif(NOT CMAKE_CROSSCOMPILING AND EXISTS /usr/include/)
+endif()
 
 ### Check 32bits or 64bits
 INCLUDE (CheckTypeSize)
 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDSTAR)
 IF(SIZEOF_VOIDSTAR EQUAL 4)
   SET(ARCH_32_BITS 1)
-ELSE(SIZEOF_VOIDSTAR EQUAL 4)
+ELSE()
   SET(ARCH_32_BITS 0)
-ENDIF(SIZEOF_VOIDSTAR EQUAL 4)
+ENDIF()
 
 if(WIN32)
 
@@ -121,26 +148,26 @@ if(WIN32)
     string(REGEX REPLACE "^${COMPILER_C_MAJOR_VERSION}." "" COMPILER_C_MINOR_VERSION "${COMPILER_C_MINOR_VERSION}")
     if(COMPILER_C_MAJOR_VERSION)
       # set(__GNUC__ ${COMPILER_C_MAJOR_VERSION})
-    endif(COMPILER_C_MAJOR_VERSION)
+    endif()
     if(COMPILER_C_MINOR_VERSION)
       # set(__GNUC_MINOR__ ${COMPILER_C_MINOR_VERSION})
-    endif(COMPILER_C_MINOR_VERSION)
+    endif()
     set(MSVC 0)
     set(BORLAND 0)
-  else(CMAKE_COMPILER_IS_GNUCC)
+  else()
     message(FATAL_ERROR "Please use MinGW to compile SimGrid!")
-  endif(CMAKE_COMPILER_IS_GNUCC)
+  endif()
 
   if(ARCH_32_BITS)     ### Arch 32bits
     set(_WIN32 1)
-  else(ARCH_32_BITS)   ### Arch 64bits
+  else()       ### Arch 64bits
     set(_WIN64 1)
-  endif(ARCH_32_BITS)
+  endif()
 
   set(NSIS_WIN_VERSION $ENV{PROCESSOR_ARCHITEW6432})
   if(NSIS_WIN_VERSION MATCHES "")
     set(NSIS_WIN_VERSION $ENV{PROCESSOR_ARCHITECTURE})
-  endif(NSIS_WIN_VERSION MATCHES "")
+  endif()
   string(TOLOWER ${NSIS_WIN_VERSION} NSIS_WIN_VERSION)
 
   set(_XBT_WIN32 1)
@@ -158,7 +185,7 @@ if(WIN32)
   message(STATUS "VISUALC                      ${MSVC}")
   message(STATUS "GNUC                         ${CMAKE_COMPILER_IS_GNUCC}")
 
-endif(WIN32)
+endif()
 
 include_directories(${INCLUDES})
 
@@ -179,7 +206,7 @@ include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/DefinePackages.cmake)
 include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/MaintainerMode.cmake)
 if(NOT WIN32)
   include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/UnitTesting.cmake)
-endif(NOT WIN32)
+endif()
 
 ### Setup gcc flags
 include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Flags.cmake)
@@ -187,9 +214,9 @@ include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Flags.cmake)
 ### Make Libs
 if(NOT WIN32)
   include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/MakeLib.cmake)
-else(NOT WIN32)
+else()
   include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/MakeLibWin.cmake)
-endif(NOT WIN32)
+endif()
 
 ### Make Exes
 include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/MakeExe.cmake)
@@ -207,9 +234,9 @@ include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Pipol.cmake)
 ### Build the doc
 if(NOT WIN32)
   include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/GenerateDoc.cmake)
-else(NOT WIN32)
+else()
   include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/GenerateDocWin.cmake)
-endif(NOT WIN32)
+endif()
 
 ### Print ARGS
 include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/PrintArgs.cmake)
index 9f0dfe4..a33847d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,32 +1,80 @@
-SimGrid (3.8) NOT RELEASED; urgency=low
+SimGrid (3.9) NOT RELEASED; urgency=low
 
- The "SimGrid makes psssshiiiit and jumps into the cloud" release.
+ The Grasgory release: GRAS is really dead now.
+
+ GRAS:
+ * If you use GRAS, you should stay at SimGrid 3.7 or something since
+   it was not really maintained with the latest versions of SimGrid as
+   nobody stepped in to take the maintainership over.
+ * Keeping it was thus a trap to our potential users, that could take
+   it instead of MSG or SMPI by mistake. GRAS also induces a lot of XBT
+   code (for portability sake), that must be maintained too.
+ * For all these reasons, we killed GRAS. If someone wants to revive it
+   in the future, don't cry, our git history still remembers of GRAS.
+
+ SMPI:
+ * Now works on Windows too!
+ * Much more extensive test suite, from MPICH
+
+ MSG:
+ * New function: MSG_process_get_number()
+
+ SURF:
+ * Change the default value of the TCP_gamma constant (maximal size of TCP 
+   congestion window) to a more realistic 4MiB value. If you notice changes in 
+   your simulation results, you can fall back to the previous 20k tiny window 
+   by adding --cfg=network/TCP_gamma:20000 on command line.
+
+ XBT:
+ * Kill synchronized dynars, and xbt_dynar_dopar(). We cannot think of a
+   usecase where it's really mandatory, and maintaining it was a pain in
+   our codebase.   
+ * New: xbt_fifo_search(), search an item with a user-provided
+   comparison function instead of dumb pointer comparison.
+
+ -- $date Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
+
+SimGrid (3.8.1) stable; urgency=low
+
+ The "we are told that some people want to also *install* the simgrid
+ framework" release.
+
+ * Add missing file "tesh.1" to the archive.
+
+ -- Sat Oct 27 16:12:11 CEST 2012 Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
+
+SimGrid (3.8) stable; urgency=low
+
+ The Psssshiiiit release: SimGrid jumps into the Cloud.
 
  MSG:
  * Add an experimental interface to manipulate VMs. They are mainly
    process groups with very few intrinsic semantic, but they should
    allow you to build the semantic you want easily.
  * New function: MSG_host_set_property_value()
- * Deprecate functions MSG_global_init() / MSG_global_init_args()
-   Please use MSG_init() instead. (reducing the amount of entry
-   points in the library helps us).
- * Make it impossible to link against the wrong version of the lib
+ * New function: MSG_process_on_exit(). To clean memory in all cases.
  * Bug fixes that made the host (and link) failures unusable.
  * Add a way to auto-restart process when the host in which they are
    executing comes back (ON_FAILURE="RESTART" on deployment file,
    MSG_process_auto_restart_set).
  * Use the "msg_" prefix for all datatypes (instead of m_, msg_ and MSG_),
    please stop using the old ones, they are DEPRECATED.
+
+ * Deprecate functions MSG_global_init() / MSG_global_init_args()
+   Please use MSG_init() instead. (reducing the amount of entry
+   points in the library helps us).
+ * Make it impossible to link against the wrong version of the lib
  * Deprecate MSG_clean(). No need to call it anymore.
  * Function MSG_get_host_number() is not deprecated anymore.
 
  Documentation:
  * Split the doc into a user guide and a reference guide.
+ * Start a developper guide to help people hacking on SimGrid.
 
  Cmake:
+ * Enable tracing by default. This modules rocks you should use it.
  * Remove option custom_flags. Now use environment variables CFLAGS
    and LDFLAGS.
- * Enable tracing by default. This modules rocks you should use it.
  * Use default cmake things to detect lua instead of home grown ones.
  * New option "enable_mallocators" to disable mallocators, for debugging
    purpose ("on" by default).
@@ -34,8 +82,6 @@ SimGrid (3.8) NOT RELEASED; urgency=low
  Simix:
  * Bug fixes around the resource failures: don't let the processes
    survive the host they are running onto.
- * Add an interface to execute cleanup functions when a process is killed,
-   to avoid memory leaks.
  * Add an interface to auto-restart processes when the host in which they are
    executing comes back.
  * Ensures that SIMIX_clean is called automatically. It's not part of
@@ -74,13 +120,35 @@ SimGrid (3.8) NOT RELEASED; urgency=low
  * Re-implement time-independent trace replay using SMPI (at the
    smpi_smp_* level) instead of MSG. This should replace
    examples/msg/actions/actions.c
+ * Implement support of MPI Datatypes (vectors, hvectors, indexed,
+   hindexed and structs)
  * Implement the exchange of non-contiguous data.
    [Khalid Hasanov & Jean-Noel Quintin] Thanks for the patch, guys.
+ * Correct behavior of smpi/sender_gap and set its default value to 0
+ * Add option to asynchronously send small messages to allow better
+   simulation of pt2pt communications. --cfg=smpi/async_small_threshold:value
+   specifies the size in bytes under which messages will be asynchronously sent.
+ * Add support of MPI_Iprobe, MPI_Probe, MPI_Testall, MPI_Wtick functions
+ * SMPI now handles more MPI specific values in input. Closes [#14389] and [#14388]
 
  SimGrid:
+ * New C interface to define a platform: XML is now optional.
+   For more info, please check include/simgrid/platf.h.
+ * New interface to define random platforms from the C:
+   For more info, please check include/simgrid/platf_generator.h and
+   examples/msg/masterslave/masterslave_platfgen.c
  * Export a sg_cmdline dynar containing all the arguments we got from
    the command line.
 
+ TRACE:
+ * Two new tracing options for adding comments to trace file so you
+   can track your experiments (see --help-tracing for details).
+ * New option to generate a impoverished trace file (--cfg=tracing/basic:1)
+ * Adding the SimGrid version that generated the trace file as a comment.
+ * Instrumenting other MSG functions (MSG_task_isend_with_matching and MSG_task_dsend)
+ * Fix to avoid key clashes on Paje links
+ * Other minor fixes related to the Paje specification
+
  XBT:
  * Functions xbt_dict_hash() and xbt_dict_hash_ext() are made public,
    and renamed to xbt_str_hash() and xbt_str_hash_ext().
@@ -88,7 +156,7 @@ SimGrid (3.8) NOT RELEASED; urgency=low
  * Greatly improve the robustness of mmalloc to user errors (such as
    using an area after freeing it, or freeing it twice)
 
- -- $date Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
+ -- Thu Oct 25 17:30:06 CEST 2012 Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
 
 SimGrid (3.7.1) stable; urgency=low
 
@@ -2381,7 +2449,7 @@ SimGrid (2.90) unstable; urgency=low
  [Tests]
    - use gras_exit in example to track memleaks
    - get rid of gs_example now that GS is properly integrated into gras
-   - update run_test to integrate the lastest tests (datadesc)
+   - update run_test to integrate the latest tests (datadesc)
  [Logging]
    - rename WARNINGn macros to WARNn since it prooved error-prone
 
diff --git a/NEWS b/NEWS
index feb3de4..aef1cd3 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,10 +1,40 @@
+                    _               _____ ___
+__   _____ _ __ ___(_) ___  _ __   |___ // _ \
+\ \ / / _ \ '__/ __| |/ _ \| '_ \    |_ \ (_) |
+ \ V /  __/ |  \__ \ | (_) | | | |  ___) \__, |
+  \_/ \___|_|  |___/_|\___/|_| |_| |____(_)/_/
+
+The "Grasgory" release. Major changes:
+
+ * Gras was completely removed from this version 
+                    _               _____  ___   _
+__   _____ _ __ ___(_) ___  _ __   |___ / ( _ ) / |
+\ \ / / _ \ '__/ __| |/ _ \| '_ \    |_ \ / _ \ | |
+ \ V /  __/ |  \__ \ | (_) | | | |  ___) | (_) || |
+  \_/ \___|_|  |___/_|\___/|_| |_| |____(_)___(_)_|
+                Oct 27 2012
+
+The "we are told that some people want to also *install* the simgrid
+framework" release.
+
+ * Add missing manpage to the archive.
                     _               _____  ___
 __   _____ _ __ ___(_) ___  _ __   |___ / ( _ )
 \ \ / / _ \ '__/ __| |/ _ \| '_ \    |_ \ / _ \
  \ V /  __/ |  \__ \ | (_) | | | |  ___) | (_) |
   \_/ \___|_|  |___/_|\___/|_| |_| |____(_)___/
+                Oct 25 2012
+
+The Psssshiiiit release: SimGrid jumps into the Cloud.
+Major changes:
 
-(to complete)
+ * Experimental interface to manipulate VMs, EC2-style.
+ * Fixes around process restart and stochastic workloads
+ * platf: New C interface to create fixed or random platforms
+ * SimDag: Many fixes and improvements of typed tasks
+ * SMPI now covers more of the MPI interface.
+   More datatypes, more functions, more robust.
+ * Model-checking: mmalloc is more robust to user errors.
                     _               _____ _____ _
 __   _____ _ __ ___(_) ___  _ __   |___ /|___  / |
 \ \ / / _ \ '__/ __| |/ _ \| '_ \    |_ \   / /| |
diff --git a/README.IEEE b/README.IEEE
deleted file mode 100644 (file)
index b0141b0..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-
-Snippet of http://www.math.utah.edu/pub/zsh/README.NONSTOP-FP:
-
->>>>>
-Although IEEE 754 was not adopted until mid-1985, published drafts
-were available several years earlier.  The first implementation was
-the Intel 8087 on which the original IBM PC was based in 1981.  Since
-then, Intel IA-32 (formerly x86), i860, i960 and IA-64, Convex,
-HP/Compaq/DEC Alpha, HP PA-RISC, IBM Power and PowerPC, Motorola 68K
-and 88K, SGI MIPS, Sun SPARC, and most other CPUs (even on embedded
-systems) with floating-point point support adhere to at least part of
-the IEEE 754 specification.  All Cray supercomputers manufactured
-since the early 1990s have used IEEE 754 arithmetic.  The only
-non-IEEE-754 desktop (and larger) CPUs built since the mid-1980s have
-been the Compaq/DEC VAX (now obsolete), and the venerable IBM S/360
-architecture first introduced in 1964.  However, in 1998, IBM added
-the G5 processor boards on System/390 (Z series) with full IEEE 754
-support (including 128-bit quadruple precision in hardware), and
-GNU/Linux on that system uses only IEEE 754 arithmetic (even though
-the S/360 arithmetic is available, the GNU/Linux compilers and library
-don't support it).
-
-In addition to CPUs, the Java Virtual Machine specification mandates a
-subset of IEEE 754 arithmetic.
-<<<<<
-
-In conclusion, GRAS don't bother testing whether the architecture is IEEE
-compliant. It may change when I encounter such a beast, but I'm not sure it
-will ever happen.
index 791d365..481dfe9 100644 (file)
@@ -3,18 +3,13 @@
 **
 ******************************************************
 
-There is at least 5 sub-projects in the tree:
+There is at least 4 sub-projects in the tree:
 
  - XBT: eXtended Bundle of Tools (low-level toolbox: logging, datatypes).
  - SURF: a SimUlation aRtiFact. This is the simulation kernel.
  - MSG:  originally MetaSimGrid, MSG is a simple distributed application
          simulator.
- - GRAS: Grid Reality And Simulation (message passing API with two
-         implementations allowing to compile programs on top of the
-         simulator or for the real life without code modification)
- - AMOK: Advanced Metacomputing Overlay Kit (high level toolbox; Grid
-         application elements such as distributed database, topology
-         discovery service, and so on)
+ - SMPI: Simulated MPI, to run MPI application using emulation technics.
 
 They are all in the same tree because they are complementary tools and
 having all of them in the same package makes the installation easier
@@ -24,24 +19,6 @@ eases the development.
 The tree is not splited on projects, but on file finality:
  include/            -> all *public* headers
  include/xbt/*.h     -> one file per module
- include/gras.h      -> file including all modules headers
-  (same for xbt instead of gras)
-  
- src/Makefile.am     -> main makefile. All projects should fit in only one
-                        library (I mean 2, RL+SG), which is compiled here.
-                       
-                       Since all object.o files are placed here, you should
-                        choose the name of c files carfully to avoid
-                        conflict. 
-                       
- src/gras/DataDesc                      -> typical project module
- src/gras/DataDesc/datadesc_interface.h -> visible to any GRAS modules;
-                                           masked to the user and GROS/AMOK/SURF
- src/gras/DataDesc/datadesc_private.h   -> visible only from this module                                          
-  
-   So, the modules have 3 levels of publicity for their interface. 
-   Private, internal to GRAS, public. Of course, I try to keep as much stuff
-   private as possible.
 
  src/include -> another location for protected headers. Used by SURF, and
                 other should be converted, since this is the Right Thing.
@@ -50,10 +27,7 @@ The tree is not splited on projects, but on file finality:
                Same organization than src/ and include/
                Tests are allowed to load some headers of the module they test.
               All tests should be listed in run_test.in so that they get
-                  run on 'make check'. 
-              They are not listed directly in the check_PROGRAMS part of
-                  the makefile because run_test knows about the gras logging
-                  features and relaunch with full details the failed tests.
+               run on 'make check'. 
                  
  examples/ -> Supposed to be copy/pastable by the user, so keep it clear and
                 avoid any kind of trick. In particular, do only include the
@@ -78,7 +52,7 @@ FIXME: this list of arguments is still to be discussed, maybe
 *****************************************************
 
 It may sound strange, but the type naming convention was source of intense
-discution between da GRAS posse members. The convention we came to may not
+discution between da SimGrid posse members. The convention we came to may not
 be the best solution, but it has the merit to exist and leave everyone work.
 So please stick to it.
 
@@ -128,7 +102,7 @@ PRINTF pointer difference
 
 The global structure of the documentation is in doc/modules.doc 
 
-The structure of each module (xbt, gras, etc) is in doc/module-<module>.doc
+The structure of each module (xbt, msg, etc) is in doc/module-<module>.doc
 
 The structure of a module is in its public header. This way, you're sure to
 see all the public interface (and only it). The different parts of the
@@ -144,7 +118,7 @@ The documentation of each function must be in the C file were it lives.
 Any public element (function, type and macro) must have a @brief part.
 
 **
-** XBT virtualization mecanism
+** XBT virtualization mecanism (FIXME:this section is deprecated)
 **
 ****************************************************
 
diff --git a/SPEC b/SPEC
deleted file mode 100644 (file)
index 8e01652..0000000
--- a/SPEC
+++ /dev/null
@@ -1,34 +0,0 @@
-Here are some elements of specification of the GRAS protocol. It is not 
-supposed to have several implementations, but once version 1 will be out,
-all versions of GRAS are supposed to be able to communicate with previous
-ones.
-
-All messages have an header and a payload. Here is the header format,
-considering it as an array of chars.
-
-HEADER: Transport layer
-msg[0...3]: the string 'GRAS'
-msg[4]: protocol version (currently '0')
-
-HEADER: Messaging layer
-
-msg[5]: discriminent = Archi & msg type & Flags
-       D & 248 << 3 : archi (datasize, alignment, endianess) of message emitter
-                      (32 possibles; 5 known so far)
-        D & 7 : Type of message:
-          0: one-way message
-          1: method call (answer expected)
-         
-         2: successful return (usual datatype attached as payload)
-         3: error return (payload = remoterr)
-         
-         4..7: idem, with group communication (ask for forward)
-               list of receivers (and path for answer) placed before the
-                payload 
-
-msg[6..8]: message serial (for answers; omitted for one-ways)
-           short in binary encoding (loop every 65536)
-msg[9..]: message name (string in the binary encoding)
-
-PAYLOAD: in the binary encoding
-
diff --git a/TODO b/TODO
index 9176059..84ce366 100644 (file)
--- a/TODO
+++ b/TODO
 ### Ongoing stuff
 ###
 
-Document the fact that gras processes display the backtrace on sigusr and sigint
 Document host module
 
 /* FIXME: better place? */
 int vasprintf  (char **ptr, const char *fmt, va_list ap);
 char *bprintf(const char*fmt, ...) _XBT_GNUC_PRINTF(1,2);
 
-
-gras_socket_close should be blocking until all the data sent have been
-received by the other side (implemented with an ACK mechanism).
-
 ###
 ### Planned
 ###
@@ -66,92 +61,3 @@ received by the other side (implemented with an ACK mechanism).
   * Some of the datacontainer modules seem to overlap. Kill some of them?
     - replace fifo with dynars
     - replace set with SWAG
-
-*
-* GRAS
-******
-
-[doc]
-  * implement the P2P protocols that macedon does. They constitute great
-    examples, too
-
-[transport]  
-  * use poll(2) instead of select(2) when available. (first need to check
-    the advantage of doing so ;)
-
-    Another idea we spoke about was to simulate this feature with a bunch of
-    threads blocked in a read(1) on each incoming socket. The latency is
-    reduced by the cost of a syscall, but the more I think about it, the
-    less I find the idea adapted to our context.
-
-  * timeout the send/recv too (hard to do in RL)
-  * Adaptative timeout
-  * multiplex on incoming SOAP over HTTP (once datadesc can deal with it)
-
-  * The module syntax/API is too complex. 
-    - Everybody opens a server socket (or almost), and nobody open two of
-      them. This should be done automatically without user intervention.
-    - I'd like to offer the possibility to speak to someone, not to speak on
-      a socket. Users shouldn't care about such technical details. 
-    - the idea of host_cookie in NWS seem to match my needs, but we still
-      need a proper name ;)
-    - this would allow to exchange a "socket" between peer :)
-    - the creation needs to identify the peer actor within the process
-
-  * when a send failed because the socket was closed on the other side, 
-    try to reopen it seamlessly. Needs exceptions or another way to
-    differentiate between the several system_error.
-  * cache accepted sockets and close the old ones after a while. 
-    Depends on the previous item; difficult to achieve with firewalls
-
-[datadesc]
-  * Add a XML wire protocol alongside to the binary one (for SOAP/HTTP)
-  * cbps:
-    - Error handling
-    - Regression tests
-  * Inter-arch conversions
-    - Port to ARM
-    - Convert in the same buffer when size increase
-    - Exchange (on net) structures in one shoot when possible.
-  * datadesc_set_cste: give the value by default when receiving. 
-    - It's not transfered anymore, which is good for functions pointer.
-  * Parsing macro
-    - Cleanup the code (bison?)
-    - Factorize code in union/struct field adding
-    - Handle typedefs (gras_datatype_copy can be usefull, but only if
-      main type is already defined)
-    - Handle unions with annotate
-    - Handle enum
-    - Handle long long and long double
-    - Forbid "char", allow "signed char" and "unsigned char", or user code won't be 
-      portable to ARM, at least.
-    - Handle struct/union/enum embeeded within another container 
-      (needs modifications in DataDesc, too)
-    - Check short a, b;
-    - Check short ***
-    - Check struct { struct { int a } b; } 
-
-[Messaging]
-  * Other message types than oneway & RPC are possible:
-     - forwarding request, group communication
-  * Message priority
-  * Message forwarding
-  * Group communication
-  * Message declarations in a tree manner (such as log channels)?
-  
-[Other, more general issues]
-  * watchdog in RL (ie, while (1) { fork; exec the child, wait in father })
-  * Allow [homogeneous] dico to be sent
-  * Make GRAS thread safe by mutexing what needs to be
-
-*
-* AMOK
-******
-
-[bandwidth]
-  * add a version guessing the appropriate datasizes automatically
-[other modules]
-  * log control, management, dynamic token ring
-  * a way using SSH to ask a remote host to open a socket back on me
index f5f0d43..f530f1b 100644 (file)
@@ -1,14 +1,14 @@
 
 if(enable_memcheck)
   include(FindValgrind)
-endif(enable_memcheck)
+endif()
 
 if(enable_smpi AND NOT WIN32)
   exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpicc" OUTPUT_VARIABLE "OKITOKI")
   exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpif2c" OUTPUT_VARIABLE "OKITOKI")
   exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpiff" OUTPUT_VARIABLE "OKITOKI")
   exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpirun" OUTPUT_VARIABLE "OKITOKI")
-endif(enable_smpi AND NOT WIN32)
+endif()
 
 ### For code coverage
 ### Set some variables
@@ -50,59 +50,26 @@ if(NOT enable_memcheck)
   # teshsuite/xbt
   ADD_TEST(xbt-log-large                       ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/log_large_test.tesh)
   ADD_TEST(xbt-log-parallel                    ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/parallel_log_crashtest.tesh)
-  IF(${ARCH_32_BITS})
-    ADD_TEST(xbt-mmalloc-32                    ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/mmalloc_32.tesh)
-  ELSE(${ARCH_32_BITS})
-    ADD_TEST(xbt-mmalloc-64                    ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/mmalloc_64.tesh)
-  ENDIF(${ARCH_32_BITS})
-
-  # teshsuite/gras/datadesc directory
-  ADD_TEST(tesh-gras-dd-mem                     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_mem.tesh)
-  ADD_TEST(tesh-gras-dd-rw                      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_rw.tesh)
-  ADD_TEST(tesh-gras-dd-r-little32-4            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_r_little32_4.tesh)
-  ADD_TEST(tesh-gras-dd-r-little64              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_r_little64.tesh)
-  ADD_TEST(tesh-gras-dd-r-big32-8-4             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_r_big32_8_4.tesh)
-
-  IF(${ARCH_32_BITS})
-    ADD_TEST(tesh-gras-msg-handle-sg-32         ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/msg_handle/test_sg_32.tesh)
-  ELSE(${ARCH_32_BITS})
-    ADD_TEST(tesh-gras-msg-handle-sg-64         ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/msg_handle/test_sg_64.tesh)
-  ENDIF(${ARCH_32_BITS})
-
-  ADD_TEST(tesh-gras-empty-main-rl              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/empty_main --cd ${CMAKE_HOME_DIRECTORY}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/empty_main/test_rl.tesh)
-  ADD_TEST(tesh-gras-empty-main-sg              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/empty_main --cd ${CMAKE_HOME_DIRECTORY}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/empty_main/test_sg.tesh)
-
-  IF(${ARCH_32_BITS})
-    ADD_TEST(tesh-gras-small-sleep-sg-32        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/small_sleep --cd ${CMAKE_HOME_DIRECTORY}/teshsuite gras/small_sleep/test_sg_32.tesh)
-  ELSE(${ARCH_32_BITS})
-    ADD_TEST(tesh-gras-small-sleep-sg-64        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/small_sleep --cd ${CMAKE_HOME_DIRECTORY}/teshsuite gras/small_sleep/test_sg_64.tesh)
-  ENDIF(${ARCH_32_BITS})
-
-  # GRAS examples
-  ADD_TEST(gras-ping-rl                         ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_rl.tesh)
-  ADD_TEST(gras-rpc-rl                          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_rl.tesh)
-  ADD_TEST(gras-spawn-rl                        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_rl.tesh)
-  ADD_TEST(gras-timer-rl                        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_rl.tesh)
-  ADD_TEST(gras-chrono-rl                       ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_rl.tesh)
-  ADD_TEST(gras-simple-token-rl                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_rl.tesh)
-  ADD_TEST(gras-mmrpc-rl                        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_rl.tesh)
-  ADD_TEST(gras-all2all-rl                      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_rl.tesh)
-  ADD_TEST(gras-pmm-rl                          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_rl.tesh)
-  ADD_TEST(gras-synchro-rl                      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_rl.tesh)
-  ADD_TEST(gras-properties-rl                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_rl.tesh)
+  IF(HAVE_MMAP)
+    IF(${ARCH_32_BITS})
+      ADD_TEST(xbt-mmalloc-32                    ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/mmalloc_32.tesh)
+    ELSE()
+      ADD_TEST(xbt-mmalloc-64                    ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/mmalloc_64.tesh)
+    ENDIF()
+  ENDIF()
 
   # BEGIN CONTEXTS FACTORY
   ADD_TEST(tesh-msg-get-sender-thread           ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh)
   if(HAVE_RAWCTX)
     ADD_TEST(tesh-msg-get-sender-raw            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh)
-  endif(HAVE_RAWCTX)
+  endif()
   if(CONTEXT_UCONTEXT)
     ADD_TEST(tesh-msg-get-sender-ucontext       ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh)
-  endif(CONTEXT_UCONTEXT)
+  endif()
 
   IF(enable_debug) # these tests need the assertion mechanism
     ADD_TEST(tesh-simdag-parser-bogus-symmetric ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms two_hosts_asymetric.tesh)
-  ENDIF(enable_debug)
+  ENDIF()
 
   ADD_TEST(tesh-simdag-bypass                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test_bypass.tesh)
   ADD_TEST(tesh-simdag-flatifier                ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms flatifier.tesh)
@@ -175,7 +142,7 @@ if(NOT enable_memcheck)
     ADD_TEST(msg-masterslave-failure-ucontext   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_failure_crosstraffic.tesh)
     ADD_TEST(msg-masterslave-mailbox-ucontext   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_mailbox_crosstraffic.tesh)
     ADD_TEST(msg-masterslave-cpu-ti-ucontext    ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/masterslave --cd ${CMAKE_HOME_DIRECTORY}/examples/msg masterslave/masterslave_cpu_ti_crosstraffic.tesh)
-  endif(CONTEXT_UCONTEXT)
+  endif()
 
   if(HAVE_RAWCTX)
     ADD_TEST(msg-sendrecv-CLM03-raw             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_CLM03.tesh)
@@ -196,18 +163,18 @@ if(NOT enable_memcheck)
     ADD_TEST(msg-masterslave-failure-raw        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_failure_crosstraffic.tesh)
     ADD_TEST(msg-masterslave-mailbox-raw        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_mailbox_crosstraffic.tesh)
     ADD_TEST(msg-masterslave-cpu-ti-raw         ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/masterslave --cd ${CMAKE_HOME_DIRECTORY}/examples/msg masterslave/masterslave_cpu_ti_crosstraffic.tesh)
-  endif(HAVE_RAWCTX)
+  endif()
 
   ADD_TEST(msg-masterslave-vivaldi-thread       ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_vivaldi.tesh)
   ADD_TEST(msg-token-ring-thread                ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg/token_ring ${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring/token_ring.tesh)
   if(HAVE_RAWCTX)
     ADD_TEST(msg-masterslave-vivaldi-raw        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_vivaldi.tesh)
     ADD_TEST(msg-token-ring-raw                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg/token_ring ${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring/token_ring.tesh)
-  endif(HAVE_RAWCTX)
+  endif()
   if(CONTEXT_UCONTEXT)
     ADD_TEST(msg-masterslave-vivaldi-ucontext   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_vivaldi.tesh)
     ADD_TEST(msg-token-ring-ucontext            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg/token_ring ${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring/token_ring.tesh)
-  endif(CONTEXT_UCONTEXT)
+  endif()
 
   ADD_TEST(msg-migration-thread                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/migration/migration.tesh)
   ADD_TEST(msg-ptask-thread                     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task/parallel_task.tesh)
@@ -242,7 +209,7 @@ if(NOT enable_memcheck)
     ADD_TEST(msg-kademlia-ucontext              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh)
     ADD_TEST(msg-kademlia-ucontext-parallel     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/nthreads:4 --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh)
 
-  endif(CONTEXT_UCONTEXT)
+  endif()
   if(HAVE_RAWCTX)
     ADD_TEST(msg-migration-raw                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/migration/migration.tesh)
     ADD_TEST(msg-ptask-raw                      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task/parallel_task.tesh)
@@ -259,121 +226,12 @@ if(NOT enable_memcheck)
     ADD_TEST(msg-bittorrent-raw-parallel        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/nthreads:4 --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/bittorrent --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/bittorrent bittorrent.tesh)
     ADD_TEST(msg-kademlia-raw                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh)
     ADD_TEST(msg-kademlia-raw-parallel          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/nthreads:4 --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh)
-  endif(HAVE_RAWCTX)
-
-  IF(${ARCH_32_BITS})
-    ADD_TEST(gras-ping-sg-32-thread             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_32.tesh)
-    ADD_TEST(gras-rpc-sg-32-thread              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_32.tesh)
-    ADD_TEST(gras-spawn-sg-32-thread            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_32.tesh)
-    ADD_TEST(gras-timer-sg-32-thread            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_32.tesh)
-    ADD_TEST(gras-chrono-sg-32-thread           ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_32.tesh)
-    ADD_TEST(gras-simple-token-sg-32-thread     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_32.tesh)
-    ADD_TEST(gras-mmrpc-sg-32-thread            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_32.tesh)
-    ADD_TEST(gras-all2all-sg-32-thread          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_32.tesh)
-    ADD_TEST(gras-pmm-sg-32-thread              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_32.tesh)
-    ADD_TEST(gras-synchro-sg-32-thread          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_32.tesh)
-    if(CONTEXT_UCONTEXT)
-      ADD_TEST(gras-ping-sg-32-ucontext         ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_32.tesh)
-      ADD_TEST(gras-rpc-sg-32-ucontext          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_32.tesh)
-      ADD_TEST(gras-spawn-sg-32-ucontext        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_32.tesh)
-      ADD_TEST(gras-timer-sg-32-ucontext        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_32.tesh)
-      ADD_TEST(gras-chrono-sg-32-ucontext       ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_32.tesh)
-      ADD_TEST(gras-simple-token-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_32.tesh)
-      ADD_TEST(gras-mmrpc-sg-32-ucontext        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_32.tesh)
-      ADD_TEST(gras-all2all-sg-32-ucontext      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_32.tesh)
-      ADD_TEST(gras-pmm-sg-32-ucontext          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_32.tesh)
-      ADD_TEST(gras-synchro-sg-32-ucontext      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_32.tesh)
-    endif(CONTEXT_UCONTEXT)
-    if(HAVE_RAWCTX)
-      ADD_TEST(gras-ping-sg-32-raw              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_32.tesh)
-      ADD_TEST(gras-rpc-sg-32-raw               ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_32.tesh)
-      ADD_TEST(gras-spawn-sg-32-raw             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_32.tesh)
-      ADD_TEST(gras-timer-sg-32-raw             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_32.tesh)
-      ADD_TEST(gras-chrono-sg-32-raw            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_32.tesh)
-      ADD_TEST(gras-simple-token-sg-32-raw      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_32.tesh)
-      ADD_TEST(gras-mmrpc-sg-32-raw             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_32.tesh)
-      ADD_TEST(gras-all2all-sg-32-raw           ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_32.tesh)
-      ADD_TEST(gras-pmm-sg-32-raw               ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_32.tesh)
-      ADD_TEST(gras-synchro-sg-32-raw           ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_32.tesh)
-    endif(HAVE_RAWCTX)
-
-  ELSE(${ARCH_32_BITS})
-    ADD_TEST(gras-ping-sg-64-thread             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_64.tesh)
-    ADD_TEST(gras-rpc-sg-64-thread              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_64.tesh)
-    ADD_TEST(gras-spawn-sg-64-thread            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_64.tesh)
-    ADD_TEST(gras-timer-sg-64-thread            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_64.tesh)
-    ADD_TEST(gras-chrono-sg-64-thread           ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_64.tesh)
-    ADD_TEST(gras-simple-token-sg-64-thread     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_64.tesh)
-    ADD_TEST(gras-mmrpc-sg-64-thread            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_64.tesh)
-    ADD_TEST(gras-all2all-sg-64-thread          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_64.tesh)
-    ADD_TEST(gras-pmm-sg-64-thread              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_64.tesh)
-    ADD_TEST(gras-synchro-sg-64-thread          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_64.tesh)
-    if(CONTEXT_UCONTEXT)
-      ADD_TEST(gras-ping-sg-64-ucontext         ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_64.tesh)
-      ADD_TEST(gras-rpc-sg-64-ucontext          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_64.tesh)
-      ADD_TEST(gras-spawn-sg-64-ucontext        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_64.tesh)
-      ADD_TEST(gras-timer-sg-64-ucontext        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_64.tesh)
-      ADD_TEST(gras-chrono-sg-64-ucontext       ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_64.tesh)
-      ADD_TEST(gras-simple-token-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_64.tesh)
-      ADD_TEST(gras-mmrpc-sg-64-ucontext        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_64.tesh)
-      ADD_TEST(gras-all2all-sg-64-ucontext      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_64.tesh)
-      ADD_TEST(gras-pmm-sg-64-ucontext          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_64.tesh)
-      ADD_TEST(gras-synchro-sg-64-ucontext      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_64.tesh)
-    endif(CONTEXT_UCONTEXT)
-    if(HAVE_RAWCTX)
-      ADD_TEST(gras-ping-sg-64-raw              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_64.tesh)
-      ADD_TEST(gras-rpc-sg-64-raw               ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_64.tesh)
-      ADD_TEST(gras-spawn-sg-64-raw             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_64.tesh)
-      ADD_TEST(gras-timer-sg-64-raw             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_64.tesh)
-      ADD_TEST(gras-chrono-sg-64-raw            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_64.tesh)
-      ADD_TEST(gras-simple-token-sg-64-raw      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_64.tesh)
-      ADD_TEST(gras-mmrpc-sg-64-raw             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_64.tesh)
-      ADD_TEST(gras-all2all-sg-64-raw           ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_64.tesh)
-      ADD_TEST(gras-pmm-sg-64-raw               ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_64.tesh)
-      ADD_TEST(gras-synchro-sg-64-raw           ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_64.tesh)
-    endif(HAVE_RAWCTX)
-
-  ENDIF(${ARCH_32_BITS})
-  ADD_TEST(gras-properties-sg-thread            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/properties --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_sg.tesh)
-  if(CONTEXT_UCONTEXT)
-    ADD_TEST(gras-properties-sg-ucontext        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/properties --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_sg.tesh)
-  endif(CONTEXT_UCONTEXT)
-  if(HAVE_RAWCTX)
-    ADD_TEST(gras-properties-sg-raw             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/properties --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_sg.tesh)
-  endif(HAVE_RAWCTX)
-
-  # amok examples
-  ADD_TEST(amok-bandwidth-rl                    ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_rl.tesh)
-  ADD_TEST(amok-saturate-rl                     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_rl.tesh)
-
-  IF(${ARCH_32_BITS})
-    ADD_TEST(amok-bandwidth-sg-32-thread        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_32.tesh)
-    ADD_TEST(amok-saturate-sg-32-thread         ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_32.tesh)
-    if(HAVE_RAWCTX)
-      ADD_TEST(amok-bandwidth-sg-32-raw         ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_32.tesh)
-      ADD_TEST(amok-saturate-sg-32-raw          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_32.tesh)
-    endif(HAVE_RAWCTX)
-    if(CONTEXT_UCONTEXT)
-      ADD_TEST(amok-bandwidth-sg-32-ucontext    ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_32.tesh)
-      ADD_TEST(amok-saturate-sg-32-ucontext     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_32.tesh)
-    endif(CONTEXT_UCONTEXT)
-  ELSE(${ARCH_32_BITS})
-    ADD_TEST(amok-bandwidth-sg-64-thread        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_64.tesh)
-    ADD_TEST(amok-saturate-sg-64-thread         ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_64.tesh)
-    if(HAVE_RAWCTX)
-      ADD_TEST(amok-bandwidth-sg-64-raw         ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_64.tesh)
-      ADD_TEST(amok-saturate-sg-64-raw          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_64.tesh)
-    endif(HAVE_RAWCTX)
-    if(CONTEXT_UCONTEXT)
-      ADD_TEST(amok-saturate-sg-64-ucontext     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_64.tesh)
-      ADD_TEST(amok-bandwidth-sg-64-ucontext    ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_64.tesh)
-    endif(CONTEXT_UCONTEXT)
-  ENDIF(${ARCH_32_BITS})
+  endif()
 
   # simdag examples
   if(HAVE_GRAPHVIZ)
     ADD_TEST(simdag-test-dotload                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag/dot --cd ${CMAKE_BINARY_DIR}/examples/simdag/dot ${CMAKE_HOME_DIRECTORY}/examples/simdag/dot/test_simdag_dotload.tesh)
-  endif(HAVE_GRAPHVIZ)
+  endif()
   ADD_TEST(simdag-test-simdag                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag.tesh)
   ADD_TEST(simdag-test-simdag2                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag2.tesh)
   ADD_TEST(simdag-test-seq-access               ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag_seq_access.tesh)
@@ -388,10 +246,10 @@ if(NOT enable_memcheck)
   ADD_TEST(msg-gtnets-crosstraffic-thread       ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-crosstraffic.tesh)
   if(CONTEXT_UCONTEXT)
     ADD_TEST(msg-gtnets-crosstraffic-ucontext   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-crosstraffic.tesh)
-  endif(CONTEXT_UCONTEXT)
+  endif()
   if(HAVE_RAWCTX)
     ADD_TEST(msg-gtnets-crosstraffic-raw        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-crosstraffic.tesh)
-  endif(HAVE_RAWCTX)
+  endif()
 
   if(HAVE_GTNETS)
     ADD_TEST(msg-gtnets-waxman-thread           ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-waxman.tesh)
@@ -405,14 +263,14 @@ if(NOT enable_memcheck)
       ADD_TEST(msg-gtnets-onelink-ucontext      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-gtnets.tesh)
       ADD_TEST(msg-gtnets-dogbone-lv08-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-lv08.tesh)
       ADD_TEST(msg-gtnets-onelink-lv08-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-lv08.tesh)
-    endif(CONTEXT_UCONTEXT)
+    endif()
     if(HAVE_RAWCTX)
       ADD_TEST(msg-gtnets-waxman-raw            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-waxman.tesh)
       ADD_TEST(msg-gtnets-dogbone-raw           ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-gtnets.tesh)
       ADD_TEST(msg-gtnets-onelink-raw           ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-gtnets.tesh)
       ADD_TEST(msg-gtnets-dogbone-lv08-raw      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-lv08.tesh)
       ADD_TEST(msg-gtnets-onelink-lv08-raw      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-lv08.tesh)
-    endif(HAVE_RAWCTX)
+    endif()
 
     if(HAVE_TRACING)
       ADD_TEST(msg-tracing-gtnets-waxman        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-waxman.tesh)
@@ -420,14 +278,14 @@ if(NOT enable_memcheck)
       ADD_TEST(msg-tracing-gtnets-onelink       ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-onelink-gtnets.tesh)
       ADD_TEST(msg-tracing-gtnets-dogbone-lv08  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-dogbone-lv08.tesh)
       ADD_TEST(msg-tracing-gtnets-onelink-lv08  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-onelink-lv08.tesh)
-    endif(HAVE_TRACING)
-  endif(HAVE_GTNETS)
+    endif()
+  endif()
 
   if(HAVE_NS3)
     ADD_TEST(msg-ns3-thread                     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/ns3/ns3.tesh)
     ADD_TEST(msg-ns3-ucontext                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/ns3/ns3.tesh)
     ADD_TEST(msg-ns3-raw                        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/ns3/ns3.tesh)
-  endif(HAVE_NS3)
+  endif()
 
   IF(HAVE_TRACING)
     ADD_TEST(tracing-help                       ${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms/basic_parsing_test --help-tracing)
@@ -440,7 +298,7 @@ if(NOT enable_memcheck)
     ADD_TEST(tracing-categories                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/categories.tesh)
     ADD_TEST(tracing-process-migration          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/procmig.tesh)
     ADD_TEST(graphicator                        ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} --setenv bindir=${CMAKE_BINARY_DIR}/bin --cd ${CMAKE_HOME_DIRECTORY}/tools/graphicator graphicator.tesh)
-  ENDIF(HAVE_TRACING)
+  ENDIF()
 
   # Lua examples
   if(HAVE_LUA)
@@ -462,7 +320,7 @@ if(NOT enable_memcheck)
     set_tests_properties(lua-bittorrent                 PROPERTIES ENVIRONMENT "LUA_CPATH=${CMAKE_BINARY_DIR}/examples/lua/?.so")
     set_tests_properties(lua-kademlia                   PROPERTIES ENVIRONMENT "LUA_CPATH=${CMAKE_BINARY_DIR}/examples/lua/?.so")
     set_tests_properties(simdag-test-lua                PROPERTIES ENVIRONMENT "LUA_CPATH=${CMAKE_BINARY_DIR}/examples/lua/?.so")
-  endif(HAVE_LUA)
+  endif()
 
   # END TESH TESTS
 
@@ -471,33 +329,45 @@ if(NOT enable_memcheck)
     ADD_TEST(smpi-bcast-thread                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/bcast.tesh)
     ADD_TEST(smpi-reduce-thread                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce.tesh)
     ADD_TEST(smpi-vector-thread                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/vector.tesh)
+    ADD_TEST(smpi-hvector-thread                ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hvector.tesh)
     ADD_TEST(smpi-indexed-thread                ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/indexed.tesh)
     ADD_TEST(smpi-struct-thread                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/struct.tesh)
     ADD_TEST(smpi-pt2pt-thread                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt.tesh)
+    ADD_TEST(smpi-compute-thread                ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/compute.tesh)
 
     if(HAVE_RAWCTX)
       ADD_TEST(smpi-bcast-raw                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/bcast.tesh)
       ADD_TEST(smpi-reduce-raw                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce.tesh)
       ADD_TEST(smpi-vector-raw                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/vector.tesh)
+      ADD_TEST(smpi-hvector-raw                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hvector.tesh)
       ADD_TEST(smpi-indexed-raw                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/indexed.tesh)
       ADD_TEST(smpi-struct-raw                  ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/struct.tesh)
       ADD_TEST(smpi-pt2pt-raw                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt.tesh)
-
-    endif(HAVE_RAWCTX)
+      ADD_TEST(smpi-compute-raw                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/compute.tesh)
+      ADD_TEST(smpi-mpich-env-raw               ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/env ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/env/runtests -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/env -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C})
+      ADD_TEST(smpi-mpich-pt2pt-raw             ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/pt2pt ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/pt2pt/runtests -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/pt2pt -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C})
+      ADD_TEST(smpi-mpich-context-raw           ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/context ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/context/runtests -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/context -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C})
+      ADD_TEST(smpi-mpich-profile-raw           ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/profile  ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/profile/runtests -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/profile -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C} )
+      ADD_TEST(smpi-mpich-coll-raw              ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/coll ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll/runtests -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C})       
+      set_tests_properties(smpi-mpich-env-raw smpi-mpich-context-raw  smpi-mpich-pt2pt-raw smpi-mpich-coll-raw smpi-mpich-profile-raw PROPERTIES PASS_REGULAR_EXPRESSION "-- No differences found; test successful")
+    
+    
+    endif()
     if(CONTEXT_UCONTEXT)
       ADD_TEST(smpi-bcast-ucontext              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/bcast.tesh)
       ADD_TEST(smpi-reduce-ucontext             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce.tesh)
       ADD_TEST(smpi-vector-ucontex              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/vector.tesh)
+      ADD_TEST(smpi-hvector-ucontex             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hvector.tesh)
       ADD_TEST(smpi-indexed-ucontext            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/indexed.tesh)
       ADD_TEST(smpi-struct-ucontext             ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/struct.tesh)
       ADD_TEST(smpi-pt2pt-ucontext              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt.tesh)
-    
-    endif(CONTEXT_UCONTEXT)
+      ADD_TEST(smpi-compute-ucontext            ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/compute.tesh)
+    endif()
     if(HAVE_TRACING)
       ADD_TEST(smpi-tracing-ptp                 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/tracing/smpi_traced.tesh)
       ADD_TEST(smpi-replay                      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/smpi_replay.tesh)
-    endif(HAVE_TRACING)
-  endif(enable_smpi)
+    endif()
+  endif()
 
   # examples/msg/mc
   if(HAVE_MC)
@@ -508,40 +378,25 @@ if(NOT enable_memcheck)
       ADD_TEST(mc-bugged1-ucontext              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh)
       ADD_TEST(mc-bugged2-ucontext              ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh)
       ADD_TEST(mc-centralized-ucontext          ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh)
-    endif(CONTEXT_UCONTEXT)
+      ADD_TEST(mc-bugged1-liveness-ucontext     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1_liveness.tesh)
+      ADD_TEST(mc-chord-neverjoin-ucontext      ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/chord chord_neverjoin.tesh)
+      ADD_TEST(mc-test-snapshot-comparison1     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/test --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/test snapshot_comparison1.tesh)
+      ADD_TEST(mc-test-snapshot-comparison2     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/test --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/test snapshot-comparison2.tesh)
+      ADD_TEST(mc-test-snapshot-comparison3     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/test --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/test snapshot_comparison3.tesh)
+      ADD_TEST(mc-test-snapshot-comparison4     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/test --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/test snapshot_comparison4.tesh)
+      ADD_TEST(mc-test-snapshot-comparison5     ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc/test --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc/test snapshot_comparison5.tesh)
+    endif()
     if(HAVE_RAWCTX)
       ADD_TEST(mc-bugged1-raw                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh)
       ADD_TEST(mc-bugged2-raw                   ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh)
       ADD_TEST(mc-centralized-raw               ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh)
-    endif(HAVE_RAWCTX)
-  endif(HAVE_MC)
+    endif()
+  endif()
 
   ###
   ### Declare that we know that some tests are broken
   ###
 
-  # Amok is broken in RL since before v3.3 (should fix it one day)
-  set_tests_properties(amok-bandwidth-rl amok-saturate-rl PROPERTIES WILL_FAIL true)
-  if(${ARCH_32_BITS})
-    set_tests_properties(amok-bandwidth-sg-32-thread PROPERTIES WILL_FAIL true)
-    set_tests_properties(amok-saturate-sg-32-thread PROPERTIES WILL_FAIL true)
-    if(CONTEXT_UCONTEXT)
-      set_tests_properties(amok-bandwidth-sg-32-ucontext amok-saturate-sg-32-ucontext PROPERTIES WILL_FAIL true)
-    endif(CONTEXT_UCONTEXT)
-    if(HAVE_RAWCTX)
-      set_tests_properties(amok-bandwidth-sg-32-raw amok-saturate-sg-32-raw PROPERTIES WILL_FAIL true)
-    endif(HAVE_RAWCTX)
-  else(${ARCH_32_BITS})
-    set_tests_properties(amok-bandwidth-sg-64-thread PROPERTIES WILL_FAIL true)
-    set_tests_properties(amok-saturate-sg-64-thread PROPERTIES WILL_FAIL true)
-    if(CONTEXT_UCONTEXT)
-      set_tests_properties(amok-bandwidth-sg-64-ucontext amok-saturate-sg-64-ucontext PROPERTIES WILL_FAIL true)
-    endif(CONTEXT_UCONTEXT)
-    if(HAVE_RAWCTX)
-      set_tests_properties(amok-bandwidth-sg-64-raw amok-saturate-sg-64-raw PROPERTIES WILL_FAIL true)
-    endif(HAVE_RAWCTX)
-  endif(${ARCH_32_BITS})
-
   # Those tests are broken : set to "fail" for release v3.6
   if(release)
     if(HAVE_MC)
@@ -550,15 +405,15 @@ if(NOT enable_memcheck)
       set_tests_properties(mc-centralized-thread PROPERTIES WILL_FAIL true)
       if(CONTEXT_UCONTEXT)
         set_tests_properties(mc-centralized-ucontext PROPERTIES WILL_FAIL true)
-      endif(CONTEXT_UCONTEXT)
+      endif()
       if(HAVE_RAWCTX)
         set_tests_properties(mc-centralized-raw PROPERTIES WILL_FAIL true)
-      endif(HAVE_RAWCTX)
-    endif(HAVE_MC)
+      endif()
+    endif()
 
-  endif(release)
+  endif()
 
-endif(NOT enable_memcheck)
+endif()
 
 ADD_TEST(tesh-simdag-full-links01               ${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms/basic_parsing_test ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms/two_clusters.xml FULL_LINK)
 ADD_TEST(tesh-simdag-full-links02               ${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms/basic_parsing_test ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms/two_clusters_one_name.xml FULL_LINK)
@@ -580,8 +435,8 @@ add_test(testall                                ${CMAKE_BINARY_DIR}/src/testall)
 
 if(enable_auto_install)
   add_test(simgrid_install                      make install)
-endif(enable_auto_install)
+endif()
 
 if(enable_memcheck)
   include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/memcheck_tests.cmake)
-endif(enable_memcheck)
+endif()
index dd4935c..e51e466 100644 (file)
@@ -3,36 +3,36 @@
 
 if(APPLE)
   SET(BUILDNAME "APPLE" CACHE TYPE INTERNAL FORCE)
-else(APPLE)
+else()
   SET(BUILDNAME "UNIX" CACHE TYPE INTERNAL FORCE)
   if(WIN32)
     SET(BUILDNAME "WINDOWS" CACHE TYPE INTERNAL FORCE)
-  endif(WIN32)
-endif(APPLE)
+  endif()
+endif()
 
 if(enable_memcheck)
   set(CTEST_TIMEOUT "300") #TIMEOUT FOR EACH TEST
-endif(enable_memcheck)
+endif()
 
 if(enable_compile_warnings AND enable_compile_optimizations)
   SET(BUILDNAME "FULL_FLAGS" CACHE TYPE INTERNAL FORCE)
-endif(enable_compile_warnings AND enable_compile_optimizations)
+endif()
 
 if(enable_supernovae)
   SET(BUILDNAME "SUPERNOVAE" CACHE TYPE INTERNAL FORCE)
-endif(enable_supernovae)
+endif()
 
 if(HAVE_GTNETS)
   SET(BUILDNAME "GTNETS" CACHE TYPE INTERNAL FORCE)
-endif(HAVE_GTNETS)
+endif()
 
 if(HAVE_MC)
   SET(BUILDNAME "MODEL-CHECKING" CACHE TYPE INTERNAL FORCE)
-endif(HAVE_MC)
+endif()
 
 if(enable_memcheck)
   SET(BUILDNAME "MEMCHECK" CACHE TYPE INTERNAL FORCE)
-endif(enable_memcheck)
+endif()
 
 set(osname ${CMAKE_SYSTEM_NAME})
 set(cpu ${CMAKE_SYSTEM_PROCESSOR})
@@ -47,4 +47,24 @@ SET(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE "3000000")
 set(PIPOL_IMAGE $ENV{PIPOL_IMAGE})
 if(NOT ${PIPOL_IMAGE} MATCHES "\n")
   set(SITE ${PIPOL_IMAGE})
-endif(NOT ${PIPOL_IMAGE} MATCHES "\n")
+endif()
+
+set(PATTERN_CTEST_IGNORED "")
+if(enable_coverage)
+    set(PATTERN_CTEST_IGNORED 
+      "/tools/"
+      "/buildtools/"
+      "/include/"
+      "/testsuite/"
+      "/teshsuite/"
+      "/src/bindings/"
+    )
+    if(NOT release)
+       set(PATTERN_CTEST_IGNORED 
+        ${PATTERN_CTEST_IGNORED}
+        "/examples/"
+        )
+    endif()
+endif()
+
+CONFIGURE_FILE(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/CTestCustom.cmake ${CMAKE_BINARY_DIR}/CTestCustom.cmake @ONLY)
diff --git a/buildtools/Cmake/CTestCustom.cmake b/buildtools/Cmake/CTestCustom.cmake
new file mode 100644 (file)
index 0000000..3fa5fb9
--- /dev/null
@@ -0,0 +1,4 @@
+
+SET(CTEST_CUSTOM_COVERAGE_EXCLUDE
+@PATTERN_CTEST_IGNORED@
+)
\ No newline at end of file
index 078c27e..9630986 100644 (file)
@@ -12,12 +12,12 @@ IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86")
     set(PROCESSOR_i686 1)
     set(SIMGRID_SYSTEM_PROCESSOR "${CMAKE_SYSTEM_PROCESSOR}")
     message(STATUS "System processor: ${CMAKE_SYSTEM_PROCESSOR}")
-  ELSE(${ARCH_32_BITS})
+  ELSE()
     message(STATUS "System processor: amd64")
     set(SIMGRID_SYSTEM_PROCESSOR "amd64")
     set(PROCESSOR_x86_64 1)
     set(PROCESSOR_i686 0)
-  ENDIF(${ARCH_32_BITS})
+  ENDIF()
   set(HAVE_RAWCTX 1)
 
 ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^alpha")
@@ -52,10 +52,10 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^s390")
 ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^sh")
   message(STATUS "System processor: sh")
 
-ELSE(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") #PROCESSOR NOT fIND
+ELSE() #PROCESSOR NOT fIND
   message(STATUS "PROCESSOR NOT FOUND: ${CMAKE_SYSTEM_PROCESSOR}")
 
-ENDIF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86")
+ENDIF()
 
 message(STATUS "Cmake version ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}")
 
@@ -70,25 +70,25 @@ TEST_BIG_ENDIAN(BIGENDIAN)
 include(FindGraphviz)
 if(WIN32)
   include(FindPcreWin)
-else(WIN32)
+else()
   include(FindPCRE)
-endif(WIN32)
+endif()
 
 set(HAVE_GTNETS 0)
 if(enable_gtnets)
   include(FindGTnets)
-endif(enable_gtnets)
+endif()
 if(enable_smpi)
   include(FindF2c)
   SET(HAVE_SMPI 1)
-endif(enable_smpi)
+endif()
 if(enable_lua)
   include(FindLua51Simgrid)
-endif(enable_lua)
+endif()
 set(HAVE_NS3 0)
 if(enable_ns3)
   include(FindNS3)
-endif(enable_ns3)
+endif()
 
 # Checks for header libraries functions.
 CHECK_LIBRARY_EXISTS(pthread   pthread_create                  "" pthread)
@@ -152,22 +152,26 @@ execute_process(
 
 if(HAVE_thread_storage_run)
   set(HAVE_THREAD_LOCAL_STORAGE 0)
-else(HAVE_thread_storage_run)
+else()
   set(HAVE_THREAD_LOCAL_STORAGE 1)
-endif(HAVE_thread_storage_run)
+endif()
 
 # Our usage of mmap is Linux-specific (flag MAP_ANONYMOUS), but kFreeBSD uses a GNU libc
 IF(NOT "${CMAKE_SYSTEM}" MATCHES "Linux" AND NOT "${CMAKE_SYSTEM}" MATCHES "kFreeBSD" AND NOT "${CMAKE_SYSTEM}" MATCHES "GNU" AND NOT  "${CMAKE_SYSTEM}" MATCHES "Darwin")
   SET(HAVE_MMAP 0)
   message(STATUS "Warning: MMAP is thought as non functional on this architecture (${CMAKE_SYSTEM})")
+<<<<<<< HEAD
+ENDIF()
+=======
 ENDIF(NOT "${CMAKE_SYSTEM}" MATCHES "Linux" AND NOT "${CMAKE_SYSTEM}" MATCHES "kFreeBSD" AND NOT "${CMAKE_SYSTEM}" MATCHES "GNU" AND NOT  "${CMAKE_SYSTEM}" MATCHES "Darwin")
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
 
 if(WIN32) #THOSE FILES ARE FUNCTIONS ARE NOT DETECTED BUT THEY SHOULD...
   set(HAVE_UCONTEXT_H 1)
   set(HAVE_MAKECONTEXT 1)
   set(HAVE_SNPRINTF 1)
   set(HAVE_VSNPRINTF 1)
-endif(WIN32)
+endif()
 
 set(CONTEXT_UCONTEXT 0)
 SET(CONTEXT_THREADS 0)
@@ -175,40 +179,40 @@ SET(HAVE_TRACING 1)
 
 if(enable_tracing)
   SET(HAVE_TRACING 1)
-else(enable_tracing)
+else()
   SET(HAVE_TRACING 0)
-endif(enable_tracing)
+endif()
 
 if(enable_jedule)
   SET(HAVE_JEDULE 1)
-endif(enable_jedule)
+endif()
 
 if(enable_latency_bound_tracking)
   SET(HAVE_LATENCY_BOUND_TRACKING 1)
-else(enable_latency_bound_tracking)
+else()
   if(enable_gtnets)
     message(STATUS "Warning : Turning latency_bound_tracking to ON because GTNeTs is ON")
     SET(enable_latency_bound_tracking ON)
     SET(HAVE_LATENCY_BOUND_TRACKING 1)
-  else(enable_gtnets)
+  else()
     SET(HAVE_LATENCY_BOUND_TRACKING 0)
-  endif(enable_gtnets)
-endif(enable_latency_bound_tracking)
+  endif()
+endif()
 
 if(enable_mallocators)
   SET(MALLOCATOR_IS_WANTED 1)
-else(enable_mallocators)
+else()
   SET(MALLOCATOR_IS_WANTED 0)
-endif(enable_mallocators)
+endif()
 
 if(enable_model-checking AND HAVE_MMAP)
   SET(HAVE_MC 1)
   SET(MMALLOC_WANT_OVERRIDE_LEGACY 1)
   include(FindLibunwind)
-else(enable_model-checking AND HAVE_MMAP)
+else()
   SET(HAVE_MC 0)
   SET(MMALLOC_WANT_OVERRIDE_LEGACY 0)
-endif(enable_model-checking AND HAVE_MMAP)
+endif()
 
 #--------------------------------------------------------------------------------------------------
 ### Check for some architecture dependent values
@@ -222,74 +226,92 @@ if(pthread)
   set(pthread 1)
 elseif(pthread)
   set(pthread 0)
-endif(pthread)
+endif()
 
 if(pthread)
   ### Test that we have a way to create semaphores
 
   if(HAVE_SEM_OPEN_LIB)
-
-    exec_program(
-      "${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_sem_open.c -lpthread -o testprog"
-      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-      OUTPUT_VARIABLE HAVE_SEM_OPEN_compil
-      )
+    execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_sem_open.c -lpthread -o sem_open
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+    OUTPUT_VARIABLE HAVE_SEM_OPEN_compil
+    )
 
     if(HAVE_SEM_OPEN_compil)
       set(HAVE_SEM_OPEN 0)
       message(STATUS "Warning: sem_open not compilable")
       message(STATUS "HAVE_SEM_OPEN_comp_output: ${HAVE_SEM_OPEN_comp_output}")
-    else(HAVE_SEM_OPEN_compil)
+    else()
       set(HAVE_SEM_OPEN 1)
       message(STATUS "sem_open is compilable")
-    endif(HAVE_SEM_OPEN_compil)
+    endif()
 
-    exec_program("${CMAKE_BINARY_DIR}/testprog" RETURN_VALUE HAVE_SEM_OPEN_run OUTPUT_VARIABLE var_compil)
-    file(REMOVE "${CMAKE_BINARY_DIR}/testprog*")
+    execute_process(COMMAND ./sem_open
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR} 
+    RESULT_VARIABLE HAVE_SEM_OPEN_run 
+    OUTPUT_VARIABLE var_compil
+    )
+    file(REMOVE sem_open)
 
     if(NOT HAVE_SEM_OPEN_run)
       set(HAVE_SEM_OPEN 1)
       message(STATUS "sem_open is executable")
-    else(NOT HAVE_SEM_OPEN_run)
+    else()
       set(HAVE_SEM_OPEN 0)
+      if(EXISTS "${CMAKE_BINARY_DIR}/sem_open")
+        message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_open exists!")
+      else()
+        message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_open not exists!")
+      endif()
       message(STATUS "Warning: sem_open not executable")
-    endif(NOT HAVE_SEM_OPEN_run)
+      message(STATUS "Compilation output: '${var_compil}'")
+      message(STATUS "Exit result of sem_open: ${HAVE_SEM_OPEN_run}")
+    endif()
 
-  else(HAVE_SEM_OPEN_LIB)
+  else()
     set(HAVE_SEM_OPEN 0)
-  endif(HAVE_SEM_OPEN_LIB)
+  endif()
 
   if(HAVE_SEM_INIT_LIB)
-    exec_program(
-      "${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_sem_init.c -lpthread -o testprog"
-      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-      OUTPUT_VARIABLE HAVE_SEM_INIT_compil
-      )
-
+    execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_sem_init.c -lpthread -o sem_init
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR} 
+    RESULT_VARIABLE HAVE_SEM_INIT_run OUTPUT_VARIABLE HAVE_SEM_INIT_compil)
+    
     if(HAVE_SEM_INIT_compil)
       set(HAVE_SEM_INIT 0)
       message(STATUS "Warning: sem_init not compilable")
       message(STATUS "HAVE_SEM_INIT_comp_output: ${HAVE_SEM_OPEN_comp_output}")
-    else(HAVE_SEM_INIT_compil)
+    else()
       set(HAVE_SEM_INIT 1)
       message(STATUS "sem_init is compilable")
-    endif(HAVE_SEM_INIT_compil)
+    endif()
+    execute_process(COMMAND ./sem_init 
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR} 
+    RESULT_VARIABLE HAVE_SEM_INIT_run 
+    OUTPUT_VARIABLE var_compil
+    )
+    file(REMOVE sem_init)
 
-    exec_program("${CMAKE_BINARY_DIR}/testprog" RETURN_VALUE HAVE_SEM_INIT_run OUTPUT_VARIABLE var_compil)
-    file(REMOVE "${CMAKE_BINARY_DIR}/testprog*")
 
     if(NOT HAVE_SEM_INIT_run)
       set(HAVE_SEM_INIT 1)
       message(STATUS "sem_init is executable")
-    else(NOT HAVE_SEM_INIT_run)
+    else()
       set(HAVE_SEM_INIT 0)
+      if(EXISTS "${CMAKE_BINARY_DIR}/sem_init")
+        message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_init exists!")
+      else()
+        message(STATUS "Bin ${CMAKE_BINARY_DIR}/sem_init not exists!")
+      endif()
       message(STATUS "Warning: sem_init not executable")
-    endif(NOT HAVE_SEM_INIT_run)
-  endif(HAVE_SEM_INIT_LIB)
+      message(STATUS "Compilation output: '${var_compil}'")
+      message(STATUS "Exit result of sem_init: ${HAVE_SEM_INIT_run}")
+    endif()
+  endif()
 
   if(NOT HAVE_SEM_OPEN AND NOT HAVE_SEM_INIT)
     message(FATAL_ERROR "Semaphores are not usable (neither sem_open nor sem_init is both compilable and executable), but they are mandatory to threads (you may need to mount /dev).")
-  endif(NOT HAVE_SEM_OPEN AND NOT HAVE_SEM_INIT)
+  endif()
 
   ### Test that we have a way to timewait for semaphores
 
@@ -304,11 +326,11 @@ if(pthread)
     if(HAVE_SEM_TIMEDWAIT_run)
       set(HAVE_SEM_TIMEDWAIT 0)
       message(STATUS "timedwait not compilable")
-    else(HAVE_SEM_TIMEDWAIT_run)
+    else()
       set(HAVE_SEM_TIMEDWAIT 1)
       message(STATUS "timedwait is compilable")
-    endif(HAVE_SEM_TIMEDWAIT_run)
-  endif(HAVE_SEM_TIMEDWAIT_LIB)
+    endif()
+  endif()
 
   ### HAVE_MUTEX_TIMEDLOCK
 
@@ -323,46 +345,47 @@ if(pthread)
     if(HAVE_MUTEX_TIMEDLOCK_run)
       set(HAVE_MUTEX_TIMEDLOCK 0)
       message(STATUS "timedlock not compilable")
-    else(HAVE_MUTEX_TIMEDLOCK_run)
+    else()
       message(STATUS "timedlock is compilable")
       set(HAVE_MUTEX_TIMEDLOCK 1)
-    endif(HAVE_MUTEX_TIMEDLOCK_run)
-  endif(HAVE_MUTEX_TIMEDLOCK_LIB)
-endif(pthread)
+    endif()
+  endif()
+endif()
 
 # AC_CHECK_MCSC(mcsc=yes, mcsc=no)
 set(mcsc_flags "")
 if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
   set(mcsc_flags "-D_XOPEN_SOURCE")
-endif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+endif()
 
 if(WIN32)
   if(ARCH_32_BITS)
     set(mcsc_flags "-D_XBT_WIN32 -D_I_X86_ -I${CMAKE_HOME_DIRECTORY}/include/xbt -I${CMAKE_HOME_DIRECTORY}/src/xbt")
-  else(ARCH_32_BITS)
+  else()
     set(mcsc_flags "-D_XBT_WIN32 -D_AMD64_ -I${CMAKE_HOME_DIRECTORY}/include/xbt -I${CMAKE_HOME_DIRECTORY}/src/xbt")
-  endif(ARCH_32_BITS)
-endif(WIN32)
+  endif()
+endif()
 
 IF(CMAKE_CROSSCOMPILING)
   IF(WIN32)
     set(windows_context "yes")
     set(IS_WINDOWS 1)
-  ENDIF(WIN32)
-ELSE(CMAKE_CROSSCOMPILING)
+  ENDIF()
+ELSE()
   file(REMOVE "${CMAKE_BINARY_DIR}/testprog*")
   file(REMOVE ${CMAKE_BINARY_DIR}/conftestval)
-  exec_program(
-    "${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_AC_CHECK_MCSC.c ${mcsc_flags} -o testprog"
-    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/
-    OUTPUT_VARIABLE COMPILE_mcsc_VAR)
+  execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_AC_CHECK_MCSC.c ${mcsc_flags} -o testprog
+  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/
+  OUTPUT_VARIABLE COMPILE_mcsc_VAR)
 
   if(NOT COMPILE_mcsc_VAR)
     message(STATUS "prog_AC_CHECK_MCSC.c is compilable")
-    exec_program("${CMAKE_BINARY_DIR}/testprog" OUTPUT_VARIABLE var_compil)
-  else(NOT COMPILE_mcsc_VAR)
+    execute_process(COMMAND ./testprog
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/
+    OUTPUT_VARIABLE var_compil)
+  else()
     message(STATUS "prog_AC_CHECK_MCSC.c is not compilable")
-  endif(NOT COMPILE_mcsc_VAR)
+  endif()
   file(REMOVE "${CMAKE_BINARY_DIR}/testprog*")
 
   if(EXISTS "${CMAKE_BINARY_DIR}/conftestval")
@@ -371,15 +394,15 @@ ELSE(CMAKE_CROSSCOMPILING)
     if(mcsc)
       set(mcsc "yes")
       set(HAVE_UCONTEXT_H 1)
-    else(mcsc)
+    else()
       set(mcsc "no")
-    endif(mcsc)
-  else(EXISTS "${CMAKE_BINARY_DIR}/conftestval")
+    endif()
+  else()
     set(mcsc "no")
-  endif(EXISTS "${CMAKE_BINARY_DIR}/conftestval")
+  endif()
 
   message(STATUS "mcsc: ${mcsc}")
-ENDIF(CMAKE_CROSSCOMPILING)
+ENDIF()
 
 if(mcsc MATCHES "no" AND pthread)
   if(HAVE_WINDOWS_H)
@@ -387,186 +410,71 @@ if(mcsc MATCHES "no" AND pthread)
     set(IS_WINDOWS 1)
   elseif(HAVE_WINDOWS_H)
     message(FATAL_ERROR "no appropriate backend found")
-  endif(HAVE_WINDOWS_H)
-endif(mcsc MATCHES "no" AND pthread)
+  endif()
+endif()
 
 #Only windows
 
 if(WIN32)
   if(NOT HAVE_WINDOWS_H)
     message(FATAL_ERROR "no appropriate backend found windows")
-  endif(NOT HAVE_WINDOWS_H)
-endif(WIN32)
+  endif()
+endif()
 
 if(windows_context MATCHES "yes")
   message(STATUS "Context change to windows")
-endif(windows_context MATCHES "yes")
+endif()
 
 #If can have both context
 
 if(mcsc)
   set(CONTEXT_UCONTEXT 1)
-endif(mcsc)
+endif()
 
 if(pthread)
   set(CONTEXT_THREADS 1)
-endif(pthread)
+endif()
 
 ###############
 ## GIT version check
 ##
 if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/ AND NOT WIN32)
-  exec_program("git remote | head -n 1" OUTPUT_VARIABLE remote RETURN_VALUE ret)
-  exec_program("git config --get remote.${remote}.url" OUTPUT_VARIABLE url RETURN_VALUE ret)
-
+  execute_process(COMMAND git remote
+  COMMAND head -n 1
+  WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
+  OUTPUT_VARIABLE remote
+  RESULT_VARIABLE ret
+  )
+  string(REPLACE "\n" "" remote "${remote}")
+  #message(STATUS "Git remote: ${remote}")
+  execute_process(COMMAND git config --get remote.${remote}.url
+  WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
+  OUTPUT_VARIABLE url
+  RESULT_VARIABLE ret
+  )
+  string(REPLACE "\n" "" url "${url}")
+  #message(STATUS "Git url: ${url}")
   if(url)
-    exec_program("git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log --oneline -1" OUTPUT_VARIABLE "GIT_VERSION")
+    execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log --pretty=oneline --abbrev-commit -1
+    WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
+    OUTPUT_VARIABLE GIT_VERSION
+    RESULT_VARIABLE ret
+    )
+    string(REPLACE "\n" "" GIT_VERSION "${GIT_VERSION}")
     message(STATUS "Git version: ${GIT_VERSION}")
-    exec_program("git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log -n 1 --format=%ai ." OUTPUT_VARIABLE "GIT_DATE")
+    execute_process(COMMAND git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log -n 1 --pretty=format:%ai .
+    WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
+    OUTPUT_VARIABLE GIT_DATE
+    RESULT_VARIABLE ret
+    )
+    string(REPLACE "\n" "" GIT_DATE "${GIT_DATE}")
     message(STATUS "Git date: ${GIT_DATE}")
     string(REGEX REPLACE " .*" "" GIT_VERSION "${GIT_VERSION}")
-    STRING(REPLACE " +0000" "" GIT_DATE ${GIT_DATE})
-    STRING(REPLACE " " "~" GIT_DATE ${GIT_DATE})
-    STRING(REPLACE ":" "-" GIT_DATE ${GIT_DATE})
-  endif(url)
-endif(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/ AND NOT WIN32)
-
-###################################
-## SimGrid and GRAS specific checks
-##
-
-IF(NOT CMAKE_CROSSCOMPILING)
-  # Check architecture signature begin
-  try_run(RUN_GRAS_VAR COMPILE_GRAS_VAR
-    ${CMAKE_BINARY_DIR}
-    ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_GRAS_ARCH.c
-    RUN_OUTPUT_VARIABLE var1
-    )
-  if(BIGENDIAN)
-    set(val_big "B${var1}")
-    set(GRAS_BIGENDIAN 1)
-  else(BIGENDIAN)
-    set(val_big "l${var1}")
-    set(GRAS_BIGENDIAN 0)
-  endif(BIGENDIAN)
-
-  # The syntax of this magic string is given in src/xbt/datadesc/ddt_convert.c
-  # It kinda matches the values that the xbt_arch_desc_t structure can take
-
-  # Basically, the syntax is one char l or B for endianness (little or Big)
-  #   then there is a bunch of blocks separated by _.
-  # C block is for char, I block for integers, P block for pointers and
-  #   D block for floating points
-  # For each block there is an amount of chuncks separated by :, each of
-  #   them describing a data size. For example there is only one chunk
-  #   in the char block, because no architecture provide several sizes
-  #   of chars. In integer block, there is 4 chunks: "short int", "int",
-  #   "long int", "long long int". There is 2 pointer chunks for data
-  #   pointers and pointers on functions (thanks to the AMD64 madness).
-  #   Thee two floating points chuncks are for "float" and "double".
-  # Each chunk is of the form datasize/minimal_alignment_size
-
-  # These informations are used to convert a data stream from one
-  #    formalism to another. Only the GRAS_ARCH is transfered in the
-  #    stream, and it it of cruxial importance to keep these detection
-  #    information here synchronized with the data hardcoded in the
-  #    source in src/xbt/datadesc/ddt_convert.c
-
-  # If you add something here (like a previously unknown architecture),
-  #    please add it to the source code too.
-  # Please do not modify stuff here since it'd break the GRAS protocol.
-  #     If you really need to change stuff, please also bump
-  #    GRAS_PROTOCOL_VERSION in src/gras/Msg/msg_interface.h
-
-  SET(GRAS_THISARCH "none")
-
-  if(val_big MATCHES "l_C:1/1:_I:2/1:4/1:4/1:8/1:_P:4/1:4/1:_D:4/1:8/1:")
-    #gras_arch=0; gras_size=32; gras_arch_name=little32_1;
-    SET(GRAS_ARCH_32_BITS 1)
-    SET(GRAS_THISARCH 0)
-  endif(val_big MATCHES "l_C:1/1:_I:2/1:4/1:4/1:8/1:_P:4/1:4/1:_D:4/1:8/1:")
-  if(val_big MATCHES "l_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:")
-    #gras_arch=1; gras_size=32; gras_arch_name=little32_2;
-    SET(GRAS_ARCH_32_BITS 1)
-    SET(GRAS_THISARCH 1)
-  endif(val_big MATCHES "l_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:")
-  if(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:")
-    #gras_arch=2; gras_size=32; gras_arch_name=little32_4;
-    SET(GRAS_ARCH_32_BITS 1)
-    SET(GRAS_THISARCH 2)
-  endif(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:")
-  if(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:")
-    #gras_arch=3; gras_size=32; gras_arch_name=little32_8;
-    SET(GRAS_ARCH_32_BITS 1)
-    SET(GRAS_THISARCH 3)
-  endif(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:")
-  if(val_big MATCHES "l_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:")
-    #gras_arch=4; gras_size=64; gras_arch_name=little64;
-    SET(GRAS_ARCH_32_BITS 0)
-    SET(GRAS_THISARCH 4)
-  endif(val_big MATCHES "l_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:")
-  if(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:8/8:8/8:_D:4/4:8/8:")
-    #gras_arch=5; gras_size=64; gras_arch_name=little64_2;
-    SET(GRAS_ARCH_32_BITS 0)
-    SET(GRAS_THISARCH 5)
-  endif(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:8/8:8/8:_D:4/4:8/8:")
-
-  if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:")
-    #gras_arch=6; gras_size=32; gras_arch_name=big32_8;
-    SET(GRAS_ARCH_32_BITS 1)
-    SET(GRAS_THISARCH 6)
-  endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:")
-  if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/4:")
-    #gras_arch=7; gras_size=32; gras_arch_name=big32_8_4;
-    SET(GRAS_ARCH_32_BITS 1)
-    SET(GRAS_THISARCH 7)
-  endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/4:")
-  if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:")
-    #gras_arch=8; gras_size=32; gras_arch_name=big32_4;
-    SET(GRAS_ARCH_32_BITS 1)
-    SET(GRAS_THISARCH 8)
-  endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:")
-  if(val_big MATCHES "B_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:")
-    #gras_arch=9; gras_size=32; gras_arch_name=big32_2;
-    SET(GRAS_ARCH_32_BITS 1)
-    SET(GRAS_THISARCH 9)
-  endif(val_big MATCHES "B_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:")
-  if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:")
-    #gras_arch=10; gras_size=64; gras_arch_name=big64;
-    SET(GRAS_ARCH_32_BITS 0)
-    SET(GRAS_THISARCH 10)
-  endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:")
-  if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/4:")
-    #gras_arch=11; gras_size=64; gras_arch_name=big64_8_4;
-    SET(GRAS_ARCH_32_BITS 0)
-    SET(GRAS_THISARCH 11)
-  endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/4:")
-
-  if(GRAS_THISARCH MATCHES "none")
-    message(STATUS "architecture: ${val_big}")
-    message(FATAL_ERROR "GRAS_THISARCH is empty: '${GRAS_THISARCH}'")
-  endif(GRAS_THISARCH MATCHES "none")
-
-  # Check architecture signature end
-  try_run(RUN_GRAS_VAR COMPILE_GRAS_VAR
-    ${CMAKE_BINARY_DIR}
-    ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_GRAS_CHECK_STRUCT_COMPACTION.c
-    RUN_OUTPUT_VARIABLE var2
-    )
-  separate_arguments(var2)
-  foreach(var_tmp ${var2})
-    set(${var_tmp} 1)
-  endforeach(var_tmp ${var2})
-
-  # Check for [SIZEOF_MAX]
-  try_run(RUN_SM_VAR COMPILE_SM_VAR
-    ${CMAKE_BINARY_DIR}
-    ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_max_size.c
-    RUN_OUTPUT_VARIABLE var3
-    )
-  message(STATUS "SIZEOF_MAX ${var3}")
-  SET(SIZEOF_MAX ${var3})
-ENDIF(NOT CMAKE_CROSSCOMPILING)
+    STRING(REPLACE " +0000" "" GIT_DATE "${GIT_DATE}")
+    STRING(REPLACE " " "~" GIT_DATE "${GIT_DATE}")
+    STRING(REPLACE ":" "-" GIT_DATE "${GIT_DATE}")
+  endif()
+endif()
 
 #--------------------------------------------------------------------------------------------------
 
@@ -575,16 +483,16 @@ if(HAVE_MAKECONTEXT OR WIN32)
   set(makecontext_CPPFLAGS "-DTEST_makecontext")
   if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
     set(makecontext_CPPFLAGS_2 "-D_XOPEN_SOURCE")
-  endif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+  endif()
 
   if(WIN32)
     if(ARCH_32_BITS)
       set(makecontext_CPPFLAGS "-DTEST_makecontext -D_I_X86_")
-    else(ARCH_32_BITS)
+    else()
       set(makecontext_CPPFLAGS "-DTEST_makecontext -D_AMD64_")
-    endif(ARCH_32_BITS)
+    endif()
     set(makecontext_CPPFLAGS_2 "-D_XBT_WIN32 -I${CMAKE_HOME_DIRECTORY}/include/xbt -I${CMAKE_HOME_DIRECTORY}/src/xbt")
-  endif(WIN32)
+  endif()
 
   file(REMOVE ${CMAKE_BINARY_DIR}/conftestval)
 
@@ -605,10 +513,10 @@ if(HAVE_MAKECONTEXT OR WIN32)
     set(pth_sksize_makecontext "#define pth_sksize_makecontext(skaddr,sksize) (${makecontext_size})")
     message(STATUS "${pth_skaddr_makecontext}")
     message(STATUS "${pth_sksize_makecontext}")
-  else(EXISTS ${CMAKE_BINARY_DIR}/conftestval)
+  else()
     #      message(FATAL_ERROR "makecontext is not compilable")
-  endif(EXISTS ${CMAKE_BINARY_DIR}/conftestval)
-endif(HAVE_MAKECONTEXT OR WIN32)
+  endif()
+endif()
 
 #--------------------------------------------------------------------------------------------------
 
@@ -621,12 +529,12 @@ if (NOT CMAKE_CROSSCOMPILING)
   file(READ "${CMAKE_BINARY_DIR}/conftestval" stack)
   if(stack MATCHES "down")
     set(PTH_STACKGROWTH "-1")
-  endif(stack MATCHES "down")
+  endif()
   if(stack MATCHES "up")
     set(PTH_STACKGROWTH "1")
-  endif(stack MATCHES "up")
+  endif()
 
-endif(NOT CMAKE_CROSSCOMPILING)
+endif()
 ###############
 ## System checks
 ##
@@ -645,9 +553,9 @@ try_run(RUN_PRINTF_NULL_VAR COMPILE_PRINTF_NULL_VAR
 
 if(RUN_PRINTF_NULL_VAR MATCHES "FAILED_TO_RUN")
   SET(PRINTF_NULL_WORKING "0")
-else(RUN_PRINTF_NULL_VAR MATCHES "FAILED_TO_RUN")
+else()
   SET(PRINTF_NULL_WORKING "1")
-endif(RUN_PRINTF_NULL_VAR MATCHES "FAILED_TO_RUN")
+endif()
 
 #AC_CHECK_VA_COPY
 
@@ -701,49 +609,49 @@ foreach(fct ${diff_va})
       set(HAVE_VA_COPY 1)
       set(ac_cv_va_copy "C99")
       set(__VA_COPY_USE_C99 "va_copy((d),(s))")
-    endif(${fctbis} STREQUAL "va_copy((d),(s))")
+    endif()
 
     if(${fctbis} STREQUAL "VA_COPY((d),(s))")
       set(ac_cv_va_copy "GCM")
       set(__VA_COPY_USE_GCM "VA_COPY((d),(s))")
-    endif(${fctbis} STREQUAL "VA_COPY((d),(s))")
+    endif()
 
     if(${fctbis} STREQUAL "__va_copy((d),(s))")
       set(ac_cv_va_copy "GCH")
       set(__VA_COPY_USE_GCH "__va_copy((d),(s))")
-    endif(${fctbis} STREQUAL "__va_copy((d),(s))")
+    endif()
 
     if(${fctbis} STREQUAL "__builtin_va_copy((d),(s))")
       set(ac_cv_va_copy "GCB")
       set(__VA_COPY_USE_GCB "__builtin_va_copy((d),(s))")
-    endif(${fctbis} STREQUAL "__builtin_va_copy((d),(s))")
+    endif()
 
     if(${fctbis} STREQUAL "do { (d) = (s) } while (0)")
       set(ac_cv_va_copy "ASS")
       set(__VA_COPY_USE_ASS "do { (d) = (s); } while (0)")
-    endif(${fctbis} STREQUAL "do { (d) = (s) } while (0)")
+    endif()
 
     if(${fctbis} STREQUAL "do { *(d) = *(s) } while (0)")
       set(ac_cv_va_copy "ASP")
       set(__VA_COPY_USE_ASP "do { *(d) = *(s); } while (0)")
-    endif(${fctbis} STREQUAL "do { *(d) = *(s) } while (0)")
+    endif()
 
     if(${fctbis} STREQUAL "memcpy((void *)&(d), (void *)&(s), sizeof(s))")
       set(ac_cv_va_copy "CPS")
       set(__VA_COPY_USE_CPS "memcpy((void *)&(d), (void *)&(s), sizeof(s))")
-    endif(${fctbis} STREQUAL "memcpy((void *)&(d), (void *)&(s), sizeof(s))")
+    endif()
 
     if(${fctbis} STREQUAL "memcpy((void *)(d), (void *)(s), sizeof(*(s)))")
       set(ac_cv_va_copy "CPP")
       set(__VA_COPY_USE_CPP "memcpy((void *)(d), (void *)(s), sizeof(*(s)))")
-    endif(${fctbis} STREQUAL "memcpy((void *)(d), (void *)(s), sizeof(*(s)))")
+    endif()
 
     if(NOT STATUS_OK)
       set(__VA_COPY_USE "__VA_COPY_USE_${ac_cv_va_copy}(d, s)")
-    endif(NOT STATUS_OK)
+    endif()
     set(STATUS_OK "1")
 
-  endif(COMPILE_VA_NULL_VAR)
+  endif()
 
 endforeach(fct ${diff_va})
 
@@ -757,97 +665,97 @@ try_compile(COMPILE_RESULT_VAR
 if(NOT COMPILE_RESULT_VAR)
   SET(need_getline "#define SIMGRID_NEED_GETLINE 1")
   SET(SIMGRID_NEED_GETLINE 1)
-else(NOT COMPILE_RESULT_VAR)
+else()
   SET(need_getline "")
   SET(SIMGRID_NEED_GETLINE 0)
-endif(NOT COMPILE_RESULT_VAR)
+endif()
 
 ### check for a working snprintf
 if(HAVE_SNPRINTF AND HAVE_VSNPRINTF OR WIN32)
   if(WIN32)
     #set(HAVE_SNPRINTF 1)
     #set(HAVE_VSNPRINTF 1)
-  endif(WIN32)
+  endif()
 
   if(CMAKE_CROSSCOMPILING)
     set(RUN_SNPRINTF_FUNC "cross")
     #set(PREFER_PORTABLE_SNPRINTF 1)
-  else(CMAKE_CROSSCOMPILING)
+  else()
     try_run(RUN_SNPRINTF_FUNC_VAR COMPILE_SNPRINTF_FUNC_VAR
       ${CMAKE_BINARY_DIR}
       ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_snprintf.c
       )
-  endif(CMAKE_CROSSCOMPILING)
+  endif()
 
   if(CMAKE_CROSSCOMPILING)
     set(RUN_VSNPRINTF_FUNC "cross")
     set(PREFER_PORTABLE_VSNPRINTF 1)
-  else(CMAKE_CROSSCOMPILING)
+  else()
     try_run(RUN_VSNPRINTF_FUNC_VAR COMPILE_VSNPRINTF_FUNC_VAR
       ${CMAKE_BINARY_DIR}
       ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_vsnprintf.c
       )
-  endif(CMAKE_CROSSCOMPILING)
+  endif()
 
   set(PREFER_PORTABLE_SNPRINTF 0)
   if(RUN_VSNPRINTF_FUNC_VAR MATCHES "FAILED_TO_RUN")
     set(PREFER_PORTABLE_SNPRINTF 1)
-  endif(RUN_VSNPRINTF_FUNC_VAR MATCHES "FAILED_TO_RUN")
+  endif()
   if(RUN_SNPRINTF_FUNC_VAR MATCHES "FAILED_TO_RUN")
     set(PREFER_PORTABLE_SNPRINTF 1)
-  endif(RUN_SNPRINTF_FUNC_VAR MATCHES "FAILED_TO_RUN")
-endif(HAVE_SNPRINTF AND HAVE_VSNPRINTF OR WIN32)
+  endif()
+endif()
 
 ### check for asprintf function familly
 if(HAVE_ASPRINTF)
   SET(simgrid_need_asprintf "")
   SET(NEED_ASPRINTF 0)
-else(HAVE_ASPRINTF)
+else()
   SET(simgrid_need_asprintf "#define SIMGRID_NEED_ASPRINTF 1")
   SET(NEED_ASPRINTF 1)
-endif(HAVE_ASPRINTF)
+endif()
 
 if(HAVE_VASPRINTF)
   SET(simgrid_need_vasprintf "")
   SET(NEED_VASPRINTF 0)
-else(HAVE_VASPRINTF)
+else()
   SET(simgrid_need_vasprintf "#define SIMGRID_NEED_VASPRINTF 1")
   SET(NEED_VASPRINTF 1)
-endif(HAVE_VASPRINTF)
+endif()
 
 ### check for addr2line
 
 find_path(ADDR2LINE NAMES addr2line    PATHS NO_DEFAULT_PATHS  )
 if(ADDR2LINE)
   set(ADDR2LINE "${ADDR2LINE}/addr2line")
-endif(ADDR2LINE)
+endif()
 
 ### Check if OSX can compile with ucontext (with gcc 4.[1-5] it is broken)
 if(APPLE)
   if(APPLE_NEED_GCC_VERSION GREATER COMPILER_C_VERSION_MAJOR_MINOR)
     message(STATUS "Ucontext can't be used with this version of gcc (must be greater than 4.5)")
     set(HAVE_UCONTEXT_H 0)
-  endif(APPLE_NEED_GCC_VERSION GREATER COMPILER_C_VERSION_MAJOR_MINOR)
-endif(APPLE)
+  endif()
+endif()
 
 ### File to create
 
 configure_file("${CMAKE_HOME_DIRECTORY}/src/context_sysv_config.h.in"                  "${CMAKE_BINARY_DIR}/src/context_sysv_config.h" @ONLY IMMEDIATE)
 
 SET( CMAKEDEFINE "#cmakedefine" )
-configure_file("${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/src/gras_config.h.in"         "${CMAKE_BINARY_DIR}/src/gras_config.h" @ONLY IMMEDIATE)
-configure_file("${CMAKE_BINARY_DIR}/src/gras_config.h"                         "${CMAKE_BINARY_DIR}/src/gras_config.h" @ONLY IMMEDIATE)
+configure_file("${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/src/internal_config.h.in"     "${CMAKE_BINARY_DIR}/src/internal_config.h" @ONLY IMMEDIATE)
+configure_file("${CMAKE_BINARY_DIR}/src/internal_config.h"                     "${CMAKE_BINARY_DIR}/src/internal_config.h" @ONLY IMMEDIATE)
 configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid_config.h.in"           "${CMAKE_BINARY_DIR}/include/simgrid_config.h" @ONLY IMMEDIATE)
 
 set(top_srcdir "${CMAKE_HOME_DIRECTORY}")
 set(srcdir "${CMAKE_HOME_DIRECTORY}/src")
 
+### Script used when simgrid is installed
 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
-set(includedir ${CMAKE_INSTALL_PREFIX}/include)
-set(top_builddir ${CMAKE_HOME_DIRECTORY})
+set(includeflag "-I${CMAKE_INSTALL_PREFIX}/include -I${CMAKE_INSTALL_PREFIX}/include/smpi")
+set(includedir "${CMAKE_INSTALL_PREFIX}/include")
 set(libdir ${exec_prefix}/lib)
-set(CMAKE_LINKARGS "${CMAKE_BINARY_DIR}/lib")
-set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:${GTNETS_LIB_PATH}:${HAVE_NS3_LIB}:$LD_LIBRARY_PATH")
+set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib:${GTNETS_LIB_PATH}:${HAVE_NS3_LIB}:$LD_LIBRARY_PATH")
 
 configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/smpif.h.in ${CMAKE_BINARY_DIR}/include/smpi/smpif.h @ONLY)
 configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpicc.in ${CMAKE_BINARY_DIR}/bin/smpicc @ONLY)
@@ -855,12 +763,31 @@ configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpif2c.in ${CMAKE_BINARY_DIR}/b
 configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpiff.in ${CMAKE_BINARY_DIR}/bin/smpiff @ONLY)
 configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpirun.in ${CMAKE_BINARY_DIR}/bin/smpirun @ONLY)
 
+### Script used when simgrid is compiling
+set(includeflag "-I${CMAKE_HOME_DIRECTORY}/include -I${CMAKE_HOME_DIRECTORY}/include/smpi")
+set(includeflag "${includeflag} -I${CMAKE_BINARY_DIR}/include -I${CMAKE_BINARY_DIR}/include/smpi")
+set(includedir "${CMAKE_HOME_DIRECTORY}/include")
+set(exec_prefix "${CMAKE_BINARY_DIR}/smpi_script/")
+set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:${GTNETS_LIB_PATH}:${HAVE_NS3_LIB}:$LD_LIBRARY_PATH")
+set(libdir "${CMAKE_BINARY_DIR}/lib")
+
+configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpicc.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc @ONLY)
+configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpif2c.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpif2c @ONLY)
+configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpiff.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff @ONLY)
+configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpirun.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpirun @ONLY)
+
+set(top_builddir ${CMAKE_HOME_DIRECTORY})
+
 if(NOT WIN32)
-  exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpicc" OUTPUT_VARIABLE OKITOKI)
-  exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpif2c" OUTPUT_VARIABLE OKITOKI)
-  exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpiff" OUTPUT_VARIABLE OKITOKI)
-  exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpirun" OUTPUT_VARIABLE OKITOKI)
-endif(NOT WIN32)
+  execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpicc)
+  execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpif2c)
+  execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpiff)
+  execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpirun)
+  execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc)
+  execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpif2c)
+  execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff)
+  execute_process(COMMAND chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpirun)
+endif()
 
 set(generated_headers_to_install
   ${CMAKE_CURRENT_BINARY_DIR}/include/smpi/smpif.h
@@ -869,7 +796,7 @@ set(generated_headers_to_install
 
 set(generated_headers
   ${CMAKE_CURRENT_BINARY_DIR}/src/context_sysv_config.h
-  ${CMAKE_CURRENT_BINARY_DIR}/src/gras_config.h
+  ${CMAKE_CURRENT_BINARY_DIR}/src/internal_config.h
   )
 
 set(generated_files_to_clean
@@ -883,12 +810,11 @@ set(generated_files_to_clean
   ${CMAKE_BINARY_DIR}/bin/simgrid_update_xml
   ${CMAKE_BINARY_DIR}/examples/smpi/tracing/smpi_traced.trace
   ${CMAKE_BINARY_DIR}/src/supernovae_sg.c
-  ${CMAKE_BINARY_DIR}/src/supernovae_gras.c
   ${CMAKE_BINARY_DIR}/src/supernovae_smpi.c
   )
 
 if("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
-else("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
+else()
   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/hostfile ${CMAKE_BINARY_DIR}/examples/smpi/hostfile COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/examples/msg/small_platform.xml ${CMAKE_BINARY_DIR}/examples/msg/small_platform.xml COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/examples/msg/small_platform_with_routers.xml ${CMAKE_BINARY_DIR}/examples/msg/small_platform_with_routers.xml COPYONLY)
@@ -909,14 +835,14 @@ else("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
     ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt
     ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile
     )
-endif("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
+endif()
 
 SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
   "${generated_files_to_clean}")
 
 IF(${ARCH_32_BITS})
   set(WIN_ARCH "32")
-ELSE(${ARCH_32_BITS})
+ELSE()
   set(WIN_ARCH "64")
-ENDIF(${ARCH_32_BITS})
+ENDIF()
 configure_file("${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/src/simgrid.nsi.in"   "${CMAKE_BINARY_DIR}/simgrid.nsi" @ONLY IMMEDIATE)
index bf2bcbe..0f5e390 100644 (file)
@@ -1,13 +1,6 @@
 ### define source packages
 
 set(EXTRA_DIST
-  src/amok/Bandwidth/bandwidth_private.h
-  src/amok/amok_modinter.h
-  src/gras/Transport/transport_interface.h
-  src/gras/Virtu/virtu_interface.h
-  src/gras/Virtu/virtu_private.h
-  src/gras/Virtu/virtu_rl.h
-  src/gras/Virtu/virtu_sg.h
   src/include/mc/datatypes.h
   src/include/mc/mc.h
   src/include/simgrid/platf_interface.h
@@ -67,8 +60,6 @@ set(EXTRA_DIST
   src/xbt/backtrace_dummy.c
   src/xbt/backtrace_linux.c
   src/xbt/backtrace_windows.c
-  src/xbt/datadesc/ddt_parse.yy.h
-  src/xbt/datadesc/ddt_parse.yy.l
   src/xbt/dict_private.h
   src/xbt/ex_interface.h
   src/xbt/fifo_private.h
@@ -92,21 +83,10 @@ set(EXTRA_DIST
   src/xbt/mmalloc/mmtrace.awk
   src/xbt/mmalloc/mrealloc.c
   src/xbt/setset_private.h
-  tools/gras/gras_stub_generator.h
   tools/tesh/run_context.h
   tools/tesh/tesh.h
   )
 
-set(XBT_RL_SRC
-  src/xbt/xbt_rl_synchro.c
-  src/xbt/xbt_rl_time.c
-  )
-
-set(XBT_SG_SRC
-  src/xbt/xbt_sg_synchro.c
-  src/xbt/xbt_sg_time.c
-  )
-
 set(SMPI_SRC
   src/smpi/smpi_base.c
   src/smpi/smpi_bench.c
@@ -126,35 +106,20 @@ if(SMPI_F2C)
     ${SMPI_SRC}
     src/smpi/smpi_f77.c
     )
-endif(SMPI_F2C)
-
-set(GRAS_RL_SRC
-  ${XBT_RL_SRC}
-  src/gras/Msg/rl_msg.c
-  src/gras/Transport/rl_transport.c
-  src/gras/Virtu/rl_dns.c
-  src/gras/Virtu/rl_emul.c
-  src/gras/Virtu/rl_process.c
-  src/gras/rl_stubs.c
-  src/xbt/xbt_os_thread.c
+else()
+  set(EXTRA_DIST
+    ${EXTRA_DIST}
+    src/smpi/smpi_f77.c
   )
+endif()
+
 
 set(XBT_SRC
-  src/gras_modinter.h
   src/xbt/RngStream.c
   src/xbt/automaton/automaton.c
   src/xbt/automaton/automatonparse_promela.c
   src/xbt/config.c
   src/xbt/cunit.c
-  src/xbt/datadesc/cbps.c
-  src/xbt/datadesc/datadesc.c
-  src/xbt/datadesc/datadesc_interface.h
-  src/xbt/datadesc/datadesc_private.h
-  src/xbt/datadesc/ddt_convert.c
-  src/xbt/datadesc/ddt_create.c
-  src/xbt/datadesc/ddt_exchange.c
-  src/xbt/datadesc/ddt_parse.c
-  src/xbt/datadesc/ddt_parse.yy.c
   src/xbt/dict.c
   src/xbt/dict_cursor.c
   src/xbt/dict_elm.c
@@ -182,13 +147,10 @@ set(XBT_SRC
   src/xbt/xbt_peer.c
   src/xbt/xbt_queue.c
   src/xbt/xbt_replay.c
+  src/xbt/xbt_sg_synchro.c
   src/xbt/xbt_sha.c
-  src/xbt/xbt_socket.c
-  src/xbt/xbt_socket_private.h
   src/xbt/xbt_str.c
   src/xbt/xbt_strbuff.c
-  src/xbt/xbt_synchro.c
-  src/xbt/xbt_trp_plugin_tcp.c
   src/xbt/xbt_virtu.c
   src/xbt_modinter.h
   )
@@ -198,7 +160,7 @@ if(HAVE_MMAP)
     ${XBT_SRC}
     src/xbt/mmalloc/mm.c
     )
-endif(HAVE_MMAP)
+endif()
 
 set(GTNETS_SRC
   src/surf/gtnets/gtnets_interface.cc
@@ -320,45 +282,11 @@ if(HAVE_GRAPHVIZ)
   set(SIMDAG_SRC
     ${SIMDAG_SRC} src/simdag/sd_dotloader.c
     )
-else(HAVE_GRAPHVIZ)
+else()
   set(EXTRA_DIST
     ${EXTRA_DIST} src/simdag/sd_dotloader.c
     )
-endif(HAVE_GRAPHVIZ)
-
-set(GRAS_COMMON_SRC
-  src/gras/Msg/gras_msg_exchange.c
-  src/gras/Msg/gras_msg_listener.c
-  src/gras/Msg/gras_msg_mod.c
-  src/gras/Msg/gras_msg_types.c
-  src/gras/Msg/msg_interface.h
-  src/gras/Msg/msg_private.h
-  src/gras/Msg/rpc.c
-  src/gras/Msg/timer.c
-  src/gras/Transport/transport.c
-  src/gras/Transport/transport_plugin_file.c
-  src/gras/Transport/transport_private.h
-  src/gras/Virtu/gras_module.c
-  src/gras/Virtu/process.c
-  src/gras/gras.c
-  )
-
-set(GRAS_SG_SRC
-  ${XBT_SG_SRC}
-  src/gras/Msg/sg_msg.c
-  src/gras/Transport/sg_transport.c
-  src/gras/Transport/transport_plugin_sg.c
-  src/gras/Virtu/sg_dns.c
-  src/gras/Virtu/sg_emul.c
-  src/gras/Virtu/sg_process.c
-  )
-
-set(AMOK_SRC
-  src/amok/Bandwidth/bandwidth.c
-  src/amok/Bandwidth/saturate.c
-  src/amok/PeerManagement/peermanagement.c
-  src/amok/amok_base.c
-  )
+endif()
 
 set(BINDINGS_SRC
   src/bindings/bindings_global.c
@@ -374,7 +302,6 @@ set(LUA_SRC
   src/bindings/lua/lua_platf.c
   src/bindings/lua/lua_process.c
   src/bindings/lua/lua_state_cloner.c
-  src/bindings/lua/lua_stub_generator.c
   src/bindings/lua/lua_task.c
   src/bindings/lua/lua_utils.c
   src/bindings/lua/simgrid_lua.c
@@ -420,20 +347,9 @@ set(MC_SRC
   src/mc/mc_request.c
   src/mc/mc_state.c
   src/mc/memory_map.c
-  src/mc/test/heap_comparison.c
   )
 
 set(headers_to_install
-  include/amok/bandwidth.h
-  include/amok/peermanagement.h
-  include/gras.h
-  include/gras/emul.h
-  include/gras/messages.h
-  include/gras/module.h
-  include/gras/process.h
-  include/gras/timer.h
-  include/gras/transport.h
-  include/gras/virtu.h
   include/instr/instr.h
   include/msg/datatypes.h
   include/msg/msg.h
@@ -456,7 +372,6 @@ set(headers_to_install
   include/xbt/automaton.h
   include/xbt/config.h
   include/xbt/cunit.h
-  include/xbt/datadesc.h
   include/xbt/dict.h
   include/xbt/dynar.h
   include/xbt/ex.h
@@ -481,14 +396,11 @@ set(headers_to_install
   include/xbt/replay.h
   include/xbt/set.h
   include/xbt/setset.h
-  include/xbt/socket.h
   include/xbt/str.h
   include/xbt/strbuff.h
   include/xbt/swag.h
-  include/xbt/synchro.h
   include/xbt/synchro_core.h
   include/xbt/sysdep.h
-  include/xbt/time.h
   include/xbt/virtu.h
   include/xbt/xbt_os_thread.h
   )
@@ -505,45 +417,42 @@ if(${CONTEXT_THREADS}) #pthread
     src/simix/smx_context_thread.c
     src/xbt/xbt_os_thread.c
     )
-else(${CONTEXT_THREADS}) # NOT pthread
+else() # NOT pthread
   set(EXTRA_DIST
     ${EXTRA_DIST}
     src/simix/smx_context_thread.c
     src/xbt/xbt_os_thread.c
     )
-endif(${CONTEXT_THREADS})
+endif()
 
 if(${CONTEXT_UCONTEXT}) #ucontext
   set(SURF_SRC
     ${SURF_SRC}
     src/simix/smx_context_sysv.c
     )
-else(${CONTEXT_UCONTEXT}) # NOT ucontext
+else() # NOT ucontext
   set(EXTRA_DIST
     ${EXTRA_DIST}
     src/simix/smx_context_sysv.c
     )
-endif(${CONTEXT_UCONTEXT})
+endif()
 
 # -->HAVE_GTNETS
 if(HAVE_GTNETS)
   set(GTNETS_USED
     ${GTNETS_SRC}
     )
-else(HAVE_GTNETS)
+else()
   set(GTNETS_USED "")
   set(EXTRA_DIST
     ${EXTRA_DIST}
     ${GTNETS_SRC}
     )
-endif(HAVE_GTNETS)
+endif()
 
 ### Simgrid Lib sources
 set(simgrid_sources
-  ${AMOK_SRC}
   ${BINDINGS_SRC}
-  ${GRAS_COMMON_SRC}
-  ${GRAS_SG_SRC}
   ${GTNETS_USED}
   ${JEDULE_SRC}
   ${MSG_SRC}
@@ -559,14 +468,14 @@ if(HAVE_MC)
     ${simgrid_sources}
     ${MC_SRC}
     )
-endif(HAVE_MC)
+endif()
 
 if(HAVE_NS3)
   set(simgrid_sources
     ${simgrid_sources}
     ${NS3_SRC}
     )
-endif(HAVE_NS3)
+endif()
 
 # WINDOWS
 if(WIN32)
@@ -576,47 +485,56 @@ if(WIN32)
     src/xbt/win32_ucontext.c
     src/xbt/xbt_os_thread.c
     )
-endif(WIN32)
-
-### Gras Lib sources
-set(gras_sources
-  ${AMOK_SRC}
-  ${GRAS_COMMON_SRC}
-  ${GRAS_RL_SRC}
-  ${XBT_SRC}
-  )
+endif()
 
 if(${HAVE_LUA})
   set(simgrid_sources
     ${simgrid_sources}
     ${LUA_SRC}
     )
-else(${HAVE_LUA})
+else()
   set(EXTRA_DIST
     ${EXTRA_DIST}
     ${LUA_SRC}
     )
-endif(${HAVE_LUA})
+endif()
 
 set(DOC_SOURCES
+  doc/AS_hierarchy.png
+  doc/sg_thread_model.fig
+  doc/simix.fig
+  doc/surf_nutshell.fig
   doc/Doxyfile.in
   doc/FAQ.doc
   doc/index.doc
   doc/simgrid.css
+  doc/SimgridDoxygenLayout.xml
   doc/triva-graph_configuration.png
   doc/triva-graph_visualization.png
-  doc/webcruft/Paje_MSG_screenshot.jpg
-  doc/webcruft/Paje_MSG_screenshot_thn.jpg
-  doc/webcruft/awstats_logo3.png
-  doc/webcruft/poster_thumbnail.png
-  doc/webcruft/simgrid_logo_2011.png
-  doc/webcruft/simgrid_logo_2011_small.png
+  doc/triva-time_interval.png
+  )
+
+set(DOC_FIGS
+  ${CMAKE_HOME_DIRECTORY}/doc/shared/fig/simgrid_modules.fig
+  ${CMAKE_HOME_DIRECTORY}/doc/shared/fig/simgrid_modules2.fig
+  )
+  
+set(DOC_SHARED_TAG
+  doc/shared/doxygen/simgriddevguide.tag
+  doc/shared/doxygen/simgridrefguide.tag
+  doc/shared/doxygen/simgriduserguide.tag
+  )
+  
+set(DOC_TOOLS
   tools/doxygen/fig2dev_postprocessor.pl
   tools/doxygen/index_create.pl
   tools/doxygen/xbt_log_extract_hierarchy.pl
   )
 
+
 set(USER_GUIDE_SOURCES
+  doc/user_guide/doxygen/footer.html
+  doc/user_guide/doxygen/header.html
   doc/user_guide/doxygen/UserGuideDoxyfile.in
   doc/user_guide/doxygen/UserGuideDoxygenLayout.xml
   doc/user_guide/doxygen/bindings.doc
@@ -629,14 +547,13 @@ set(USER_GUIDE_SOURCES
   doc/user_guide/doxygen/pls.doc
   doc/user_guide/doxygen/tracing.doc
   doc/user_guide/doxygen/use.doc
+  doc/user_guide/doxygen/stylesheet.css
   )
-
+    
 set(REF_GUIDE_SOURCES
-  doc/ref_guide/doxygen/RefGuideDoxyfile.in
-  doc/ref_guide/doxygen/RefGuideDoxygenLayout.xml
+  doc/ref_guide/doxygen/footer.html
+  doc/ref_guide/doxygen/header.html
   doc/ref_guide/doxygen/main.doc
-  doc/ref_guide/doxygen/module-amok.doc
-  doc/ref_guide/doxygen/module-gras.doc
   doc/ref_guide/doxygen/module-msg.doc
   doc/ref_guide/doxygen/module-sd.doc
   doc/ref_guide/doxygen/module-simix.doc
@@ -644,27 +561,75 @@ set(REF_GUIDE_SOURCES
   doc/ref_guide/doxygen/module-trace.doc
   doc/ref_guide/doxygen/module-xbt.doc
   doc/ref_guide/doxygen/modules.doc
+  doc/ref_guide/doxygen/RefGuideDoxyfile.in
+  doc/ref_guide/doxygen/RefGuideDoxygenLayout.xml
+  doc/ref_guide/doxygen/stylesheet.css
   )
 
 set(DEV_GUIDE_SOURCES
+  doc/dev_guide/doxygen/footer.html
+  doc/dev_guide/doxygen/header.html
   doc/dev_guide/doxygen/index.doc
   doc/dev_guide/doxygen/cmake.doc
   doc/dev_guide/doxygen/simgrid.doc
   doc/dev_guide/doxygen/xps.doc
   doc/dev_guide/doxygen/DevGuideDoxyfile.in
   doc/dev_guide/doxygen/DevGuideDoxygenLayout.xml
-  )
-
-set(SHARED_SOURCES
-  )
-
-set(DOC_FIGS
-  ${CMAKE_HOME_DIRECTORY}/doc/shared/fig/simgrid_modules.fig
-  ${CMAKE_HOME_DIRECTORY}/doc/shared/fig/simgrid_modules2.fig
-  ${CMAKE_HOME_DIRECTORY}/doc/user_guide/fig/amok_bw_sat.fig
-  ${CMAKE_HOME_DIRECTORY}/doc/user_guide/fig/amok_bw_test.fig
-  ${CMAKE_HOME_DIRECTORY}/doc/user_guide/fig/gras_comm.fig
-  )
+  doc/dev_guide/doxygen/stylesheet.css
+  )
+
+set(DOC_IMG
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/awstats_logo3.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/Paje_MSG_screenshot.jpg
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/Paje_MSG_screenshot_thn.jpg
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/poster_thumbnail.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/README
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/SGicon.gif
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/SGicon.icns
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/SGicon.ico
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_001.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_002.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_003.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_004.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_005.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_006.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_007.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_008.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_009.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_010.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_011.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_012.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_013.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_014.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_015.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_016.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_017.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_018.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_019.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_020.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_021.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_022.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_023.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_024.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_025.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_026.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_027.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_028.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_029.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101_030.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid-101.pdf
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid_logo_2011.gif
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid_logo_2011.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid_logo_2011_small.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid_logo_win_2011.bmp
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid_logo_win.bmp
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/win_install_01.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/win_install_02.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/win_install_03.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/win_install_04.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/win_install_05.png
+${CMAKE_HOME_DIRECTORY}/doc/webcruft/win_install_06.png
+)
 
 set(bin_files
   ${bin_files}
@@ -675,9 +640,6 @@ set(bin_files
   )
 
 set(txt_files
-  "testsuite/surf/trace_A.txt"
-  "testsuite/surf/trace_A_failure.txt"
-  "testsuite/surf/trace_B.txt"
   ${txt_files}
   AUTHORS
   COPYING
@@ -690,20 +652,6 @@ set(txt_files
   )
 
 set(EXAMPLES_CMAKEFILES_TXT
-  examples/amok/bandwidth/CMakeLists.txt
-  examples/amok/saturate/CMakeLists.txt
-  examples/gras/all2all/CMakeLists.txt
-  examples/gras/chrono/CMakeLists.txt
-  examples/gras/console/CMakeLists.txt
-  examples/gras/mmrpc/CMakeLists.txt
-  examples/gras/mutual_exclusion/simple_token/CMakeLists.txt
-  examples/gras/ping/CMakeLists.txt
-  examples/gras/pmm/CMakeLists.txt
-  examples/gras/properties/CMakeLists.txt
-  examples/gras/rpc/CMakeLists.txt
-  examples/gras/spawn/CMakeLists.txt
-  examples/gras/synchro/CMakeLists.txt
-  examples/gras/timer/CMakeLists.txt
   examples/lua/CMakeLists.txt
   examples/msg/CMakeLists.txt
   examples/msg/actions/CMakeLists.txt
@@ -742,11 +690,6 @@ set(EXAMPLES_CMAKEFILES_TXT
 
 set(TESHSUITE_CMAKEFILES_TXT
   teshsuite/CMakeLists.txt
-  teshsuite/gras/CMakeLists.txt
-  teshsuite/gras/datadesc/CMakeLists.txt
-  teshsuite/gras/empty_main/CMakeLists.txt
-  teshsuite/gras/msg_handle/CMakeLists.txt
-  teshsuite/gras/small_sleep/CMakeLists.txt
   teshsuite/msg/CMakeLists.txt
   teshsuite/msg/trace/CMakeLists.txt
   teshsuite/simdag/CMakeLists.txt
@@ -757,12 +700,16 @@ set(TESHSUITE_CMAKEFILES_TXT
   teshsuite/simdag/platforms/CMakeLists.txt
   teshsuite/xbt/CMakeLists.txt
   teshsuite/smpi/CMakeLists.txt
+  teshsuite/smpi/mpich-test/env/CMakeLists.txt
+  teshsuite/smpi/mpich-test/coll/CMakeLists.txt
+  teshsuite/smpi/mpich-test/context/CMakeLists.txt
+  teshsuite/smpi/mpich-test/profile/CMakeLists.txt
+  teshsuite/smpi/mpich-test/pt2pt/CMakeLists.txt
   )
 
 set(TOOLS_CMAKEFILES_TXT
   tools/CMakeLists.txt
   tools/graphicator/CMakeLists.txt
-  tools/gras/CMakeLists.txt
   tools/tesh/CMakeLists.txt
   )
 
@@ -775,6 +722,7 @@ set(CMAKE_SOURCE_FILES
   CMakeLists.txt
   buildtools/Cmake/AddTests.cmake
   buildtools/Cmake/CTestConfig.cmake
+  buildtools/Cmake/CTestCustom.cmake
   buildtools/Cmake/CompleteInFiles.cmake
   buildtools/Cmake/DefinePackages.cmake
   buildtools/Cmake/Distrib.cmake
@@ -783,6 +731,7 @@ set(CMAKE_SOURCE_FILES
   buildtools/Cmake/GenerateDocWin.cmake
   buildtools/Cmake/GenerateRefGuide.cmake
   buildtools/Cmake/GenerateUserGuide.cmake
+  buildtools/Cmake/GenerateDevGuide.cmake
   buildtools/Cmake/MaintainerMode.cmake
   buildtools/Cmake/MakeExe.cmake
   buildtools/Cmake/MakeLib.cmake
@@ -815,13 +764,10 @@ set(CMAKE_SOURCE_FILES
   buildtools/Cmake/Scripts/update_tesh.pl
   buildtools/Cmake/Supernovae.cmake
   buildtools/Cmake/UnitTesting.cmake
-  buildtools/Cmake/src/gras_config.h.in
+  buildtools/Cmake/src/internal_config.h.in
   buildtools/Cmake/src/simgrid.nsi.in
   buildtools/Cmake/test_prog/prog_AC_CHECK_MCSC.c
-  buildtools/Cmake/test_prog/prog_GRAS_ARCH.c
-  buildtools/Cmake/test_prog/prog_GRAS_CHECK_STRUCT_COMPACTION.c
   buildtools/Cmake/test_prog/prog_getline.c
-  buildtools/Cmake/test_prog/prog_max_size.c
   buildtools/Cmake/test_prog/prog_mutex_timedlock.c
   buildtools/Cmake/test_prog/prog_printf_null.c
   buildtools/Cmake/test_prog/prog_sem_init.c
@@ -875,7 +821,6 @@ set(PLATFORMS_EXAMPLES
   )
 
 set(generated_src_files
-  ${CMAKE_HOME_DIRECTORY}/src/xbt/datadesc/ddt_parse.yy.c
   src/xbt/automaton/automaton_lexer.yy.c
   src/xbt/automaton/parserPromela.tab.cacc
   src/xbt/automaton/parserPromela.tab.hacc
index c8622b8..c1b319c 100644 (file)
@@ -27,7 +27,7 @@ install(DIRECTORY "${CMAKE_HOME_DIRECTORY}/doc/user_guide/html/"
 if(NOT WIN32)
   if( NOT MANPAGE_DIR)
     set( MANPAGE_DIR ${CMAKE_BINARY_DIR}/manpages )
-  endif( NOT MANPAGE_DIR)
+  endif()
 
   add_custom_target(manpages ALL
     COMMAND ${CMAKE_COMMAND} -E make_directory ${MANPAGE_DIR}
@@ -37,7 +37,7 @@ if(NOT WIN32)
   install(FILES ${MANPAGE_DIR}/simgrid_update_xml.1 ${CMAKE_HOME_DIRECTORY}/tools/tesh/tesh.1
     DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/share/man/man1)
 
-endif(NOT WIN32)
+endif()
 
 # binaries
 install(PROGRAMS ${CMAKE_BINARY_DIR}/bin/smpicc
@@ -70,17 +70,14 @@ add_custom_target(simgrid_update_xml ALL
   COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_HOME_DIRECTORY}/tools/simgrid_update_xml.pl ${CMAKE_BINARY_DIR}/bin/simgrid_update_xml
   )
 
-install(PROGRAMS ${CMAKE_BINARY_DIR}/bin/gras_stub_generator
-  DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/)
-
 # libraries
-install(TARGETS simgrid gras
+install(TARGETS simgrid 
   DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/)
 
 if(enable_smpi)
   install(TARGETS smpi
     DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/)
-endif(enable_smpi)
+endif()
 
 if(enable_lib_static AND NOT WIN32)
   install(TARGETS simgrid_static
@@ -88,8 +85,8 @@ if(enable_lib_static AND NOT WIN32)
   if(enable_smpi)
     install(TARGETS smpi_static
       DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/)
-  endif(enable_smpi)
-endif(enable_lib_static AND NOT WIN32)
+  endif()
+endif()
 
 # include files
 set(HEADERS
@@ -126,7 +123,7 @@ if(HAVE_LUA)
   install(FILES ${CMAKE_BINARY_DIR}/lib/lua/5.1/simgrid.${LIB_EXE}
     DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/lua/5.1
     )
-endif(HAVE_LUA)
+endif()
 
 ###########################################
 ### Fill in the "make uninstall" target ###
@@ -135,9 +132,9 @@ endif(HAVE_LUA)
 add_custom_target(uninstall
   COMMAND ${CMAKE_COMMAND} -E  remove_directory ${CMAKE_INSTALL_PREFIX}/doc/simgrid
   COMMAND ${CMAKE_COMMAND} -E  echo "uninstall doc ok"
-  COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/lib/libgras*
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/lib/libsimgrid*
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/lib/libsmpi*
+  COMMAND ${CMAKE_COMMAND} -E   remove -f ${CMAKE_INSTALL_PREFIX}/lib/lua/5.1/simgrid*
   COMMAND ${CMAKE_COMMAND} -E  echo "uninstall lib ok"
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/bin/smpicc
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/bin/smpif2c
@@ -146,11 +143,8 @@ add_custom_target(uninstall
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/bin/tesh
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/bin/simgrid-colorizer
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/bin/simgrid_update_xml
-  COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/bin/gras_stub_generator
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/bin/graphicator
   COMMAND ${CMAKE_COMMAND} -E  echo "uninstall bin ok"
-  COMMAND ${CMAKE_COMMAND} -E  remove_directory ${CMAKE_INSTALL_PREFIX}/include/amok
-  COMMAND ${CMAKE_COMMAND} -E  remove_directory ${CMAKE_INSTALL_PREFIX}/include/gras
   COMMAND ${CMAKE_COMMAND} -E  remove_directory ${CMAKE_INSTALL_PREFIX}/include/instr
   COMMAND ${CMAKE_COMMAND} -E  remove_directory ${CMAKE_INSTALL_PREFIX}/include/msg
   COMMAND ${CMAKE_COMMAND} -E  remove_directory ${CMAKE_INSTALL_PREFIX}/include/simdag
@@ -161,10 +155,10 @@ add_custom_target(uninstall
   COMMAND ${CMAKE_COMMAND} -E  remove_directory ${CMAKE_INSTALL_PREFIX}/include/mc
   COMMAND ${CMAKE_COMMAND} -E  remove_directory ${CMAKE_INSTALL_PREFIX}/include/simgrid
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/include/simgrid_config.h
-  COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/include/gras.h
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/include/xbt.h
   COMMAND ${CMAKE_COMMAND} -E  echo "uninstall include ok"
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/share/man/man1/simgrid_update_xml.1
+    COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_INSTALL_PREFIX}/share/man/man1/tesh.1
   COMMAND ${CMAKE_COMMAND} -E  echo "uninstall man ok"
   WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}"
   )
@@ -175,7 +169,7 @@ if(HAVE_LUA)
     COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_INSTALL_PREFIX}/lib/lua/5.1/simgrid.${LIB_EXE}
     WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}/"
     )
-endif(HAVE_LUA)
+endif()
 
 ################################################################
 ## Build a sain "make dist" target to build a source package ###
@@ -187,11 +181,7 @@ endif(HAVE_LUA)
 set(source_to_pack
   ${headers_to_install}
   ${source_of_generated_headers}
-  ${AMOK_SRC}
   ${BINDINGS_SRC}
-  ${GRAS_COMMON_SRC}
-  ${GRAS_RL_SRC}
-  ${GRAS_SG_SRC}
   ${GTNETS_SRC}
   ${JEDULE_SRC}
   ${LUA_SRC}
@@ -213,9 +203,13 @@ set(source_to_pack
   ${TESTSUITE_CMAKEFILES_TXT}
   ${TOOLS_CMAKEFILES_TXT}
   ${DOC_FIGS}
+  ${DOC_IMG}
   ${DOC_SOURCES}
+  ${DOC_TOOLS}
+  ${DOC_SHARED_TAG}
   ${REF_GUIDE_SOURCES}
   ${USER_GUIDE_SOURCES}
+  ${DEV_GUIDE_SOURCES}
   ${PLATFORMS_EXAMPLES}
   ${README_files}
   ${bin_files}
@@ -260,7 +254,7 @@ foreach(file ${source_to_pack})
       TARGET dist-dir
       COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_NAME}-${release_version}/${file_location}/
       )
-  endif(NOT OPERATION)
+  endif()
 
   # Actually copy the file
   add_custom_command(
@@ -300,7 +294,7 @@ if(NOT enable_maintainer_mode)
     COMMAND ${CMAKE_COMMAND} -E echo "WARNING: ----------------------------------------------------"
     )
   add_dependencies(dist echo-dist)
-endif(NOT enable_maintainer_mode)
+endif()
 
 ###########################################
 ### Fill in the "make distcheck" target ###
@@ -352,11 +346,11 @@ if(enable_memcheck)
   add_custom_target(check
     COMMAND ctest -D ExperimentalMemCheck
     )
-else(enable_memcheck)
+else()
   add_custom_target(check
     COMMAND make test
     )
-endif(enable_memcheck)
+endif()
 
 #######################################
 ### Fill in the "make xxx-clean" target ###
@@ -379,23 +373,10 @@ add_custom_target(maintainer-clean
   )
 
 add_custom_target(supernovae-clean
-  COMMAND ${CMAKE_COMMAND} -E remove -f src/supernovae_gras.c
   COMMAND ${CMAKE_COMMAND} -E remove -f src/supernovae_sg.c
   COMMAND ${CMAKE_COMMAND} -E remove -f src/supernovae_smpi.c
   WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}"
   )
 
-#############################################
-### Fill in the "make sync-gforge" target ###
-#############################################
-
-#PIPOL
-add_custom_target(sync-pipol
-  COMMAND scp -r Experimental_bindings.sh Experimental.sh  MemCheck.sh pre-simgrid.sh navarro@pipol.inria.fr:~/
-  COMMAND scp -r rc.* navarro@pipol.inria.fr:~/.pipol/
-  COMMAND scp -r Nightly* navarro@pipol.inria.fr:~/.pipol/nightly
-  COMMAND ssh navarro@pipol.inria.fr "chmod a=rwx ~/* ~/.pipol/rc.* ~/.pipol/nightly/*"
-  WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}/buildtools/pipol/"
-  )
 
 include(CPack)
index b864063..546551e 100644 (file)
@@ -4,39 +4,42 @@ set(optCFLAGS "")
 if(NOT __VISUALC__ AND NOT __BORLANDC__)
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-g3")
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-g3")
-else(NOT __VISUALC__ AND NOT __BORLANDC__)
+else()
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}/Zi")
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}/Zi")
-endif(NOT __VISUALC__ AND NOT __BORLANDC__)
+endif()
 
 if(enable_compile_warnings)
   set(warnCFLAGS "-fno-common -Wall -Wunused -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith -Wchar-subscripts -Wcomment -Wformat -Wwrite-strings -Wclobbered -Wno-unused-function -Wno-unused-parameter -Wno-strict-aliasing -Wno-format-nonliteral -Werror -Wno-error=clobbered ")
   if(COMPILER_C_VERSION_MAJOR_MINOR STRGREATER "4.5")
     set(warnCFLAGS "${warnCFLAGS}-Wno-error=unused-but-set-variable ")
-  endif(COMPILER_C_VERSION_MAJOR_MINOR STRGREATER "4.5")
-endif(enable_compile_warnings)
+  endif()
+  if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
+    string(REPLACE "-Wclobbered " "" warnCFLAGS "${warnCFLAGS}")
+  endif()
+endif()
 
 if(enable_compile_optimizations)
   set(optCFLAGS "-O3 -finline-functions -funroll-loops -fno-strict-aliasing ")
   if(COMPILER_C_VERSION_MAJOR_MINOR STRGREATER "4.5")
     set(optCFLAGS "${optCFLAGS}-flto ")
-  endif(COMPILER_C_VERSION_MAJOR_MINOR STRGREATER "4.5")
-else(enable_compile_optimizations)
+  endif()
+else()
   set(optCFLAGS "-O0 ")
-endif(enable_compile_optimizations)
+endif()
 
 if(APPLE AND COMPILER_C_VERSION_MAJOR_MINOR MATCHES "4.6")
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
   set(optCFLAGS "-O0 ")
-endif(APPLE AND COMPILER_C_VERSION_MAJOR_MINOR MATCHES "4.6")
+endif()
 
 if(NOT enable_debug)
   set(CMAKE_C_FLAGS "-DNDEBUG ${CMAKE_C_FLAGS}")
-endif(NOT enable_debug)
+endif()
 
 if(enable_msg_deprecated)
   set(CMAKE_C_FLAGS "-DMSG_USE_DEPRECATED ${CMAKE_C_FLAGS}")
-endif(enable_msg_deprecated)
+endif()
 
 set(CMAKE_C_FLAGS "${optCFLAGS}${warnCFLAGS}${CMAKE_C_FLAGS}")
 
@@ -45,7 +48,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${optCFLAGS}")
 # Try to make Mac a bit more complient to open source standards
 if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_XOPEN_SOURCE")
-endif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+endif()
 
 set(TESH_OPTION "")
 if(enable_coverage)
@@ -54,22 +57,23 @@ if(enable_coverage)
     SET(COVERAGE_COMMAND "${GCOV_PATH}" CACHE TYPE FILEPATH FORCE)
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCOVERAGE")
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
+    set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fprofile-arcs -ftest-coverage")
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
     set(TESH_OPTION --enable-coverage)
     add_definitions(-fprofile-arcs -ftest-coverage)
-  endif(GCOV_PATH)
-endif(enable_coverage)
+  endif()
+endif()
 
 if(NOT $ENV{CFLAGS} STREQUAL "")
   message(STATUS "Add CFLAGS: \"$ENV{CFLAGS}\" to CMAKE_C_FLAGS")
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} $ENV{CFLAGS}")
-endif(NOT $ENV{CFLAGS} STREQUAL "")
+endif()
 
 if(NOT $ENV{LDFLAGS} STREQUAL "")
   message(STATUS "Add LDFLAGS: \"$ENV{LDFLAGS}\" to CMAKE_C_LINK_FLAGS")
   set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} $ENV{LDFLAGS}")
-endif(NOT $ENV{LDFLAGS} STREQUAL "")
+endif()
 
 if(enable_model-checking AND enable_compile_optimizations)
   message(WARNING "Sorry for now GCC optimizations does not work with model checking.\nPlease turn off optimizations with command:\ncmake -Denable_compile_optimizations=off. ")
-endif(enable_model-checking AND enable_compile_optimizations)
+endif()
index a51e607..71850d8 100644 (file)
@@ -2,32 +2,47 @@
 
 if(DOXYGEN_PATH)
 
+  set(DOC_PNGS
+    ${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid_logo_2011.png
+    ${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid_logo_2011_small.png
+    )
+
   configure_file(${CMAKE_HOME_DIRECTORY}/doc/dev_guide/doxygen/DevGuideDoxyfile.in ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/doxygen/DevGuideDoxyfile @ONLY)
 
   ADD_CUSTOM_TARGET(dev_guide
     COMMENT "Generating the SimGrid dev guide..."
     DEPENDS ${DEV_GUIDE_SOURCES}
     COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/html
-    COMMAND ${CMAKE_COMMAND} -E make_directory   ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/html
-    WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/
-    )
-    
-  ADD_CUSTOM_COMMAND(TARGET dev_guide
+    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/latex
+    COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_HOME_DIRECTORY}/doc/shared/doxygen/simgriddevguide.tag
+    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/html
     COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_HOME_DIRECTORY}/doc/simgrid.css ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/html/
+    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/doxygen/output.goal.pdf ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/html/
     )
-
+       
+  foreach(file ${DOC_FIGS})
+    string(REPLACE ".fig" ".png" tmp_file ${file})
+    string(REPLACE "${CMAKE_HOME_DIRECTORY}/doc/shared/fig/" "${CMAKE_HOME_DIRECTORY}/doc/dev_guide/html/" tmp_file ${tmp_file})
+    ADD_CUSTOM_COMMAND(TARGET dev_guide
+      COMMAND ${FIG2DEV_PATH}/fig2dev -Lpng -S 4 ${file} ${tmp_file}
+      )
+  endforeach(file ${DOC_FIGS})
+
+  foreach(file ${DOC_PNGS})
+    ADD_CUSTOM_COMMAND(TARGET dev_guide
+      COMMAND ${CMAKE_COMMAND} -E copy ${file} ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/html/
+      )
+  endforeach(file ${DOC_PNGS})
+    
   ADD_CUSTOM_COMMAND(TARGET dev_guide
     COMMAND ${CMAKE_COMMAND} -E echo "XX First Doxygen pass"
-    COMMAND ${DOXYGEN_PATH}/doxygen DevGuideDoxyfile
-    COMMAND ${CMAKE_COMMAND} -E echo "XX Second Doxygen pass"
-    COMMAND ${DOXYGEN_PATH}/doxygen DevGuideDoxyfile
+    COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/doxygen/ doxygen ./DevGuideDoxyfile
 
-    COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/html/dir*
-
-    WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/doxygen
+    COMMAND ${CMAKE_COMMAND} -E echo "XX Second Doxygen pass"
+    COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/doxygen/ doxygen ./DevGuideDoxyfile
     )
 
-else(DOXYGEN_PATH)
+else()
 
   ADD_CUSTOM_TARGET(dev_guide
     COMMENT "Generating the SimGrid documentation..."
@@ -40,6 +55,6 @@ else(DOXYGEN_PATH)
     COMMAND false
     )
 
-endif(DOXYGEN_PATH)
+endif()
 
 ##############################################################################"
index 0d46ff1..d70d56a 100644 (file)
@@ -69,13 +69,13 @@ if(DOXYGEN_PATH)
 
   if(DOXYGEN_MAJOR_VERSION STRLESS "2" AND DOXYGEN_MINOR_VERSION STRLESS "8")
     add_dependencies(simgrid_documentation error_doxygen)
-  else(DOXYGEN_MAJOR_VERSION STRLESS "2" AND DOXYGEN_MINOR_VERSION STRLESS "8")
+  else()
     add_dependencies(simgrid_documentation ref_guide)
     add_dependencies(simgrid_documentation user_guide)
     add_dependencies(simgrid_documentation dev_guide)
-  endif(DOXYGEN_MAJOR_VERSION STRLESS "2" AND DOXYGEN_MINOR_VERSION STRLESS "8")
+  endif()
 
-endif(DOXYGEN_PATH)
+endif()
 
 #############################################
 ### Fill in the "make sync-gforge" target ###
@@ -88,14 +88,23 @@ add_custom_target(sync-gforge-doc
   COMMAND ssh scm.gforge.inria.fr mkdir /home/groups/simgrid/htdocs/simgrid/${release_version}/ || true
   COMMAND ssh scm.gforge.inria.fr mkdir /home/groups/simgrid/htdocs/simgrid/${release_version}/user_guide/ || true
   COMMAND ssh scm.gforge.inria.fr mkdir /home/groups/simgrid/htdocs/simgrid/${release_version}/ref_guide/ || true
+  COMMAND ssh scm.gforge.inria.fr mkdir /home/groups/simgrid/htdocs/simgrid/${release_version}/dev_guide/ || true
   COMMAND ssh scm.gforge.inria.fr mkdir /home/groups/simgrid/htdocs/simgrid/${release_version}/user_guide/html/ || true
   COMMAND ssh scm.gforge.inria.fr mkdir /home/groups/simgrid/htdocs/simgrid/${release_version}/ref_guide/html/ || true
+  COMMAND ssh scm.gforge.inria.fr mkdir /home/groups/simgrid/htdocs/simgrid/${release_version}/dev_guide/html/ || true
+
   COMMAND rsync --verbose --cvs-exclude --compress --delete --delete-excluded --rsh=ssh --ignore-times --recursive --links --perms --times --omit-dir-times
   doc/html/ scm.gforge.inria.fr:/home/groups/simgrid/htdocs/simgrid/${release_version}/doc/ || true
+
   COMMAND rsync --verbose --cvs-exclude --compress --delete --delete-excluded --rsh=ssh --ignore-times --recursive --links --perms --times --omit-dir-times
   doc/user_guide/html/ scm.gforge.inria.fr:/home/groups/simgrid/htdocs/simgrid/${release_version}/user_guide/html/ || true
+
   COMMAND rsync --verbose --cvs-exclude --compress --delete --delete-excluded --rsh=ssh --ignore-times --recursive --links --perms --times --omit-dir-times
   doc/ref_guide/html/ scm.gforge.inria.fr:/home/groups/simgrid/htdocs/simgrid/${release_version}/ref_guide/html || true
+
+  COMMAND rsync --verbose --cvs-exclude --compress --delete --delete-excluded --rsh=ssh --ignore-times --recursive --links --perms --times --omit-dir-times
+  doc/dev_guide/html/ scm.gforge.inria.fr:/home/groups/simgrid/htdocs/simgrid/${release_version}/dev_guide/html || true
+
   COMMAND scp doc/user_guide/html/simgrid_modules2.png doc/user_guide/html/simgrid_modules.png doc/webcruft/simgrid_logo_2011.png
   doc/webcruft/simgrid_logo_2011_small.png scm.gforge.inria.fr:/home/groups/simgrid/htdocs/simgrid/${release_version}/
   WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}"
@@ -107,3 +116,4 @@ add_custom_target(sync-gforge-dtd
   COMMAND scp src/surf/simgrid.dtd scm.gforge.inria.fr:/home/groups/simgrid/htdocs/simgrid.dtd
   WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}"
   )
+
index 61d1a47..a7bc518 100644 (file)
@@ -11,13 +11,13 @@ if(WGET_PATH)
     COMMAND ${WGET_PATH}/wget.exe -r -np -nH -nd http://simgrid.gforge.inria.fr/simgrid/${release_version}/doc/
     WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/html
     )
-endif(WGET_PATH)
+endif()
 
 if(NSIS_PATH)
   ADD_CUSTOM_TARGET(nsis
     COMMENT "Generating the SimGrid installor for Windows..."
-    DEPENDS simgrid simgrid gras graphicator tesh simgrid-colorizer simgrid_update_xml
+    DEPENDS simgrid simgrid graphicator tesh simgrid-colorizer simgrid_update_xml
     COMMAND ${NSIS_PATH}/makensis.exe simgrid.nsi
     WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/
     )
-endif(NSIS_PATH)
\ No newline at end of file
+endif()
\ No newline at end of file
index 1e7e6fe..9eb270f 100644 (file)
@@ -1,7 +1,6 @@
 #### Generate the html documentation
 
 file(GLOB_RECURSE source_doxygen
-  "${CMAKE_HOME_DIRECTORY}/tools/gras/*.[chl]"
   "${CMAKE_HOME_DIRECTORY}/src/*.[chl]"
   "${CMAKE_HOME_DIRECTORY}/include/*.[chl]"
   )
@@ -62,7 +61,7 @@ if(FIG2DEV_PATH)
     WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/ref_guide/doxygen
     )
 
-else(DOXYGEN_PATH AND FIG2DEV_PATH)
+else()
 
   ADD_CUSTOM_TARGET(ref_guide
     COMMENT "Generating the SimGrid documentation..."
@@ -76,7 +75,7 @@ else(DOXYGEN_PATH AND FIG2DEV_PATH)
     COMMAND false
     )
 
-endif(FIG2DEV_PATH)
+endif()
 
 ##############################################################################"
 
index 9014e95..41b792b 100644 (file)
@@ -1,7 +1,6 @@
 #### Generate the html documentation for the user guide.
 
 file(GLOB_RECURSE source_doxygen
-  "${CMAKE_HOME_DIRECTORY}/tools/gras/*.[chl]"
   "${CMAKE_HOME_DIRECTORY}/src/*.[chl]"
   "${CMAKE_HOME_DIRECTORY}/include/*.[chl]"
   )
@@ -66,7 +65,7 @@ if(FIG2DEV_PATH)
     WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen
     )
 
-else(FIG2DEV_PATH)
+else()
 
   ADD_CUSTOM_TARGET(user_guide
     COMMENT "Generating the SimGrid user guide..."
@@ -80,124 +79,7 @@ else(FIG2DEV_PATH)
     COMMAND false
     )
 
-endif(FIG2DEV_PATH)
-
-##############################################################################"
-
-#message(STATUS "Check individual TOCs")
-#set(LISTE_GTUT
-#      doc/user_guide/doxygen/gtut-tour-00-install.doc
-#      doc/user_guide/doxygen/gtut-tour-01-bones.doc
-#      doc/user_guide/doxygen/gtut-tour-02-simple.doc
-#      doc/user_guide/doxygen/gtut-tour-03-args.doc
-#      doc/user_guide/doxygen/gtut-tour-04-callback.doc
-#      doc/user_guide/doxygen/gtut-tour-05-globals.doc
-#      doc/user_guide/doxygen/gtut-tour-06-logs.doc
-#      doc/user_guide/doxygen/gtut-tour-07-timers.doc
-#      doc/user_guide/doxygen/gtut-tour-08-exceptions.doc
-#      doc/user_guide/doxygen/gtut-tour-09-simpledata.doc
-#      doc/user_guide/doxygen/gtut-tour-10-rpc.doc
-#      doc/user_guide/doxygen/gtut-tour-11-explicitwait.doc
-#      doc/user_guide/doxygen/gtut-tour-recap-messages.doc
-#      doc/user_guide/doxygen/gtut-tour-12-staticstruct.doc
-#      doc/user_guide/doxygen/gtut-tour-13-pointers.doc
-#      doc/user_guide/doxygen/gtut-tour-14-dynar.doc
-#      doc/user_guide/doxygen/gtut-tour-15-manualdatadef.doc
-#      doc/user_guide/doxygen/gtut-tour-16-exchangecb.doc
-#)
-#
-#foreach(file_name ${LISTE_GTUT})
-#      file(REMOVE ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.curtoc)
-#      file(REMOVE ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.realtoc)
-#
-#      file(READ "${file_name}" file_content)
-#      string(REGEX MATCH "Table of Contents.*<hr>" valeur_line "${file_content}")
-#      string(REPLACE "\n" ";" valeur_line "${valeur_line}")
-#      string(REPLACE "\n" ";" file_content "${file_content}")
-#
-#      file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.realtoc "\n") # make sure it exists
-#      foreach(line ${file_content})
-#              string(REGEX MATCH "[\\]s?u?b?s?u?b?section.*" line2 "${line}")
-#              string(REGEX MATCH ".*_toc.*" line3 "${line}")
-#              if(line2 AND NOT line3)
-#                      string(REPLACE "\\section " "" line2 ${line2})
-#                      string(REPLACE "\\subsection " "subsection" line2 ${line2})
-#                      string(REPLACE "\\subsubsection " "subsubsection" line2 ${line2})
-#                      string(REGEX REPLACE " .*" "" line2 ${line2})
-#                      set(line2                               " - \\ref ${line2}")
-#                      string(REPLACE " - \\ref subsection"    "   - \\ref " line2 ${line2})
-#                      string(REPLACE " - \\ref subsubsection" "     - \\ref " line2 ${line2})
-#                      file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.realtoc "${line2}\n")
-#              endif(line2 AND NOT line3)
-#      endforeach(line ${file_content})
-#
-#      file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.curtoc "\n") # make sure it exists
-#      foreach(line ${valeur_line})
-#              string(REGEX MATCH ".*ref.*" line_ok ${line})
-#              if(line_ok)
-#                      file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.curtoc "${line_ok}\n")
-#              endif(line_ok)
-#      endforeach(line ${valeur_line})
-#
-#      exec_program("${CMAKE_COMMAND} -E compare_files ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.curtoc ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.realtoc" OUTPUT_VARIABLE compare_files)
-#      if(compare_files)
-#              message(STATUS "Wrong toc for ${file_name}. Should be:")
-#              file(READ "${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.realtoc" file_content)
-#              message("${file_content}")
-#              exec_program("diff -u ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.curtoc ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.realtoc")
-#        endif(compare_files)
-#endforeach(file_name ${LISTE_GTUT})
-#
-#file(REMOVE ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.curtoc)
-#file(REMOVE ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.realtoc)
-#
-#message(STATUS "Check main TOC")
-#
-#foreach(file_name ${LISTE_GTUT})
-#      file(READ "${file_name}" file_content)
-#      string(REGEX MATCH "Table of Contents.*<hr>" valeur_line "${file_content}")
-#      string(REPLACE "\n" ";" valeur_line "${valeur_line}")
-#      string(REPLACE "\n" ";" file_content "${file_content}")
-#
-#      foreach(line ${file_content})
-#              string(REGEX MATCH ".*@page.*" line2 "${line}")
-#              if(line2)
-#                      string(REPLACE "@page " "" line2 "${line2}")
-#                      string(REGEX REPLACE " .*" "" line2 "${line2}")
-#                      set(line2 " - \\ref ${line2}")
-#                      file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.realtoc "${line2}\n")
-#              endif(line2)
-#      endforeach(line ${file_content})
-#
-#      foreach(line ${valeur_line})
-#              string(REGEX MATCH ".*toc.*" line1 "${line}")
-#              string(REGEX MATCH ".*<hr>.*" line2 "${line}")
-#              string(REGEX MATCH "^[ ]*$" line3 "${line}")
-#              string(REGEX MATCH "Table of Contents" line4 "${line}")
-#              if(NOT line1 AND NOT line2 AND NOT line3 AND NOT line4)
-#                      file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.realtoc "   ${line}\n")
-#              endif(NOT line1 AND NOT line2 AND NOT line3 AND NOT line4)
-#      endforeach(line ${valeur_line})
-#endforeach(file_name ${LISTE_GTUT})
-#
-#file(READ "${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/gtut-tour.doc" file_content)
-#string(REPLACE "\n" ";" file_content "${file_content}")
-#foreach(line ${file_content})
-#      string(REGEX MATCH "^[ ]+.*\\ref" line1 "${line}")
-#      if(line1)
-#              file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.curtoc "${line}\n")
-#      endif(line1)
-#endforeach(line ${file_content})
-#
-#exec_program("${CMAKE_COMMAND} -E compare_files ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.curtoc ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.realtoc" OUTPUT_VARIABLE compare_files)
-#if(compare_files)
-#      message(STATUS "Wrong toc for gtut-tour.doc Right one is in tmp.realtoc")
-#      exec_program("diff -u ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.curtoc ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.realtoc")
-#else(compare_files)
-#      file(REMOVE ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.realtoc)
-#endif(compare_files)
-#
-#file(REMOVE ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen/tmp.curtoc)
+endif()
 
 ADD_CUSTOM_TARGET(user_guide_pdf
     COMMAND ${CMAKE_COMMAND} -E echo "XX First pass simgrid_user_guide.pdf"
index 26d587d..985d093 100644 (file)
@@ -35,7 +35,7 @@ if(enable_maintainer_mode AND NOT WIN32)
     SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
       "${CMAKE_HOME_DIRECTORY}/src/xbt/automaton/parserPromela.tab.cacc;${CMAKE_HOME_DIRECTORY}/src/xbt/automaton/parserPromela.tab.hacc;${CMAKE_HOME_DIRECTORY}/src/xbt/automaton/automaton_parse.yy.c"
       )
-  endif(BISON_EXE AND LEX_EXE)
+  endif()
 
   IF(FLEX_EXE)
     set(HAVE_FLEX 1)
@@ -45,7 +45,7 @@ if(enable_maintainer_mode AND NOT WIN32)
     string(REGEX MATCH "[0-9]+[.]+[0-9]+$" FLEX_VERSION "${FLEX_VERSION}")
     string(REGEX MATCH "^[0-9]+" FLEX_MINOR_VERSION "${FLEX_VERSION}")
     string(REGEX MATCH "[0-9]+$" FLEX_PATCH_VERSION "${FLEX_VERSION}")
-  ENDIF(FLEX_EXE)
+  ENDIF()
 
   IF(FLEXML_EXE)
     set(HAVE_FLEXML 1)
@@ -53,7 +53,7 @@ if(enable_maintainer_mode AND NOT WIN32)
     string(REGEX MATCH "[0-9]+[.]+[0-9]+" FLEXML_VERSION "${FLEXML_VERSION}")
     string(REGEX MATCH "^[0-9]*" FLEXML_MAJOR_VERSION "${FLEXML_VERSION}")
     string(REGEX MATCH "[0-9]*$" FLEXML_MINOR_VERSION "${FLEXML_VERSION}")
-  ENDIF(FLEXML_EXE)
+  ENDIF()
 
   message(STATUS "Found flex: ${FLEX_EXE}")
   message(STATUS "Found flexml: ${FLEXML_EXE}")
@@ -86,12 +86,10 @@ if(enable_maintainer_mode AND NOT WIN32)
       ${CMAKE_HOME_DIRECTORY}/src/simdag/dax_dtd.h
       ${CMAKE_HOME_DIRECTORY}/src/surf/simgrid_dtd.c
       ${CMAKE_HOME_DIRECTORY}/src/xbt/graphxml.c
-      ${CMAKE_HOME_DIRECTORY}/src/xbt/datadesc/ddt_parse.yy.c
       ${CMAKE_HOME_DIRECTORY}/src/simdag/dax_dtd.c
 
       DEPENDS  ${CMAKE_HOME_DIRECTORY}/src/surf/simgrid.dtd
       ${CMAKE_HOME_DIRECTORY}/src/xbt/graphxml.dtd
-      ${CMAKE_HOME_DIRECTORY}/src/xbt/datadesc/ddt_parse.yy.l
       ${CMAKE_HOME_DIRECTORY}/src/simdag/dax.dtd
 
       #${CMAKE_HOME_DIRECTORY}/src/surf/simgrid_dtd.l: ${CMAKE_HOME_DIRECTORY}/src/surf/simgrid.dtd
@@ -151,10 +149,6 @@ if(enable_maintainer_mode AND NOT WIN32)
       COMMAND ${SED_EXE} -i ${string11} src/xbt/graphxml.c
       COMMAND ${CMAKE_COMMAND} -E echo "xbt/graphxml.c"
 
-      # src/xbt/datadesc/ddt_parse.yy.c: src/xbt/datadesc/ddt_parse.yy.l
-      COMMAND ${FLEX_EXE} -o src/xbt/datadesc/ddt_parse.yy.c -Pxbt_ddt_parse_ --noline src/xbt/datadesc/ddt_parse.yy.l
-      COMMAND ${CMAKE_COMMAND} -E echo "xbt/datadesc/ddt_parse.yy.c"
-
       #simdag/dax_dtd.c: simdag/dax_dtd.l
       COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_HOME_DIRECTORY}/src/simdag/dax_dtd.c
       COMMAND ${SED_EXE} -i ${string12} src/simdag/dax_dtd.l
@@ -173,22 +167,21 @@ if(enable_maintainer_mode AND NOT WIN32)
       ${CMAKE_HOME_DIRECTORY}/src/simdag/dax_dtd.h
       ${CMAKE_HOME_DIRECTORY}/src/surf/simgrid_dtd.c
       ${CMAKE_HOME_DIRECTORY}/src/xbt/graphxml.c
-      ${CMAKE_HOME_DIRECTORY}/src/xbt/datadesc/ddt_parse.yy.c
       ${CMAKE_HOME_DIRECTORY}/src/simdag/dax_dtd.c
       )
 
-  else(HAVE_FLEXML AND HAVE_FLEX  AND SED_EXE)
+  else()
     if(NOT HAVE_FLEXML)
       message(STATUS "Error : Install flexml before use maintainer mode.")
-    endif(NOT HAVE_FLEXML)
+    endif()
     if(NOT HAVE_FLEX)
       message(STATUS "Error : Install flex before use maintainer mode.")
-    endif(NOT HAVE_FLEX)
+    endif()
     if(NOT SED_EXE)
       message(STATUS "Error : Install sed before use maintainer mode.")
-    endif(NOT SED_EXE)
+    endif()
 
     message(FATAL_ERROR STATUS "Error : Need to install all tools for maintainer mode !!!")
-  endif(HAVE_FLEXML AND HAVE_FLEX  AND SED_EXE)
+  endif()
 
-endif(enable_maintainer_mode AND NOT WIN32)
+endif()
index 87d8221..8c1c4f7 100644 (file)
@@ -7,22 +7,15 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/lua)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/xbt)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/gras)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools)
 ##################################################################
 
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools/gras)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools/tesh)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/tools/graphicator/)
 
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/testsuite/xbt)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/testsuite/surf)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/xbt)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/gras/msg_handle)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/gras/empty_main)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/gras/small_sleep)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/gras/numerous_rpc)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p)
@@ -30,21 +23,14 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/env)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/context)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/profile)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/pt2pt)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/msg)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/msg/trace)
 
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/gras/ping)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/gras/rpc)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/gras/spawn)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/gras/timer)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/gras/chrono)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/gras/all2all)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/gras/pmm)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/gras/synchro)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/gras/properties)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/gras/console)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/properties)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/actions)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/migration)
@@ -69,9 +55,6 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/mc)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/ns3)
 
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth)
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/amok/saturate)
-
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/dax)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/goal)
index d37b8bf..92ebff7 100644 (file)
@@ -11,22 +11,18 @@ include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Supernovae.cmake)
 add_library(simgrid SHARED ${simgrid_sources})
 set_target_properties(simgrid PROPERTIES VERSION ${libsimgrid_version})
 
-add_library(gras SHARED ${gras_sources})
-set_target_properties(gras PROPERTIES VERSION ${libgras_version})
-
 if(enable_lib_static)
   add_library(simgrid_static STATIC ${simgrid_sources})
-endif(enable_lib_static)
+endif()
 
 if(enable_smpi)
   add_library(smpi SHARED ${SMPI_SRC})
   set_target_properties(smpi PROPERTIES VERSION ${libsmpi_version})
   if(enable_lib_static)
     add_library(smpi_static STATIC ${SMPI_SRC})
-  endif(enable_lib_static)
-endif(enable_smpi)
+  endif()
+endif()
 
-add_dependencies(gras maintainer_files)
 add_dependencies(simgrid maintainer_files)
 
 # if supernovaeing, we need some depends to make sure that the source gets generated
@@ -34,35 +30,15 @@ if (enable_supernovae)
   add_dependencies(simgrid ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c)
   if(enable_lib_static)
     add_dependencies(simgrid_static ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c)
-  endif(enable_lib_static)
-  add_dependencies(gras ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_gras.c)
+  endif()
 
   if(enable_smpi)
     add_dependencies(smpi ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c)
     if(enable_lib_static)
       add_dependencies(smpi_static ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c)
-    endif(enable_lib_static)
-  endif(enable_smpi)
-endif(enable_supernovae)
-
-# Compute the dependencies of GRAS
-##################################
-set(GRAS_DEP "-lm -pthread")
-
-if(HAVE_POSIX_GETTIME)
-  SET(GRAS_DEP "${GRAS_DEP} -lrt")
-endif(HAVE_POSIX_GETTIME)
-
-# the following is probably unneed since it kills the previous
-# GRAS_DEP (and is thus probably invalid).
-# My guess is that pthread is never true [Mt]
-# FIXME: KILLME if we get a working windows with that?
-if(with_context MATCHES windows)
-  if(pthread)
-    SET(GRAS_DEP "msg")
-  endif(pthread)
-endif(with_context MATCHES windows)
-target_link_libraries(gras     ${GRAS_DEP})
+    endif()
+  endif()
+endif()
 
 # Compute the dependencies of SimGrid
 #####################################
@@ -71,8 +47,8 @@ set(SIMGRID_DEP "-lm -lpcre")
 if(pthread)
   if(${CONTEXT_THREADS})
     SET(SIMGRID_DEP "${SIMGRID_DEP} -pthread")
-  endif(${CONTEXT_THREADS})
-endif(pthread)
+  endif()
+endif()
 
 if(HAVE_LUA)
   ADD_CUSTOM_TARGET(link_simgrid_lua ALL
@@ -98,21 +74,21 @@ if(HAVE_LUA)
     COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_BINARY_DIR}/lib/libsimgrid.${LIB_EXE} ${CMAKE_BINARY_DIR}/examples/simdag/simgrid.${LIB_EXE} #for test
     )
   SET(SIMGRID_DEP "${SIMGRID_DEP} -l${LIB_LUA_NAME}")
-endif(HAVE_LUA)
+endif()
 
 if(HAVE_GRAPHVIZ)
   if(HAVE_CGRAPH_LIB)
     SET(SIMGRID_DEP "${SIMGRID_DEP} -lcgraph")
-  else(HAVE_CGRAPH_LIB)
+  else()
     if(HAVE_AGRAPH_LIB)
       SET(SIMGRID_DEP "${SIMGRID_DEP} -lagraph -lcdt")
-    endif(HAVE_AGRAPH_LIB)
-  endif(HAVE_CGRAPH_LIB)
-endif(HAVE_GRAPHVIZ)
+    endif()
+  endif()
+endif()
 
 if(HAVE_GTNETS)
   SET(SIMGRID_DEP "${SIMGRID_DEP} -lgtnets")
-endif(HAVE_GTNETS)
+endif()
 
 if(HAVE_MC)
   # The availability of libunwind was checked in CompleteInFiles.cmake
@@ -122,36 +98,36 @@ if(HAVE_MC)
   # This is deeply wrong, and should be fixed by manually loading -lunwind-PLAT (FIXME)
   if(PROCESSOR_x86_64)
     SET(SIMGRID_DEP "${SIMGRID_DEP} -lunwind-x86_64")
-  else(PROCESSOR_x86_64)    
+  else()    
     SET(SIMGRID_DEP "${SIMGRID_DEP} -lunwind-x86")
-  endif(PROCESSOR_x86_64)
-endif(HAVE_MC)
+  endif()
+endif()
 
 if(HAVE_NS3)
   if(${NS3_VERSION} EQUAL 310)
     SET(SIMGRID_DEP "${SIMGRID_DEP} -lns3")
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_NS3_3_10")
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_NS3_3_10")
-  else(${NS3_VERSION} EQUAL 310)
+  else()
     SET(SIMGRID_DEP "${SIMGRID_DEP} -lns3-core -lns3-csma -lns3-point-to-point -lns3-internet -lns3-applications")
-  endif(${NS3_VERSION} EQUAL 310)
-endif(HAVE_NS3)
+  endif()
+endif()
 
 if(HAVE_POSIX_GETTIME)
   SET(SIMGRID_DEP "${SIMGRID_DEP} -lrt")
-endif(HAVE_POSIX_GETTIME)
+endif()
 
 target_link_libraries(simgrid  ${SIMGRID_DEP})
 
 # Compute the dependencies of SMPI
 ##################################
-set(SMPI_LDEP "")
+set(SMPI_DEP "")
 if(APPLE)
-  set(SMPI_LDEP "-Wl,-U -Wl,_smpi_simulated_main")
-endif(APPLE)
+  set(SMPI_DEP "-Wl,-U -Wl,_smpi_simulated_main")
+endif()
 if(enable_smpi)
-  target_link_libraries(smpi   simgrid ${SMPI_LDEP})
-endif(enable_smpi)
+  target_link_libraries(smpi   simgrid ${SMPI_DEP})
+endif()
 
 # Pass dependencies to static libs
 ##################################
@@ -160,13 +136,13 @@ if(enable_lib_static)
   add_dependencies(simgrid_static maintainer_files)
   set_target_properties(simgrid_static PROPERTIES OUTPUT_NAME simgrid)
   if(enable_smpi)
-    target_link_libraries(smpi_static  simgrid ${SMPI_LDEP})
+    target_link_libraries(smpi_static  simgrid ${SMPI_DEP})
     set_target_properties(smpi_static PROPERTIES OUTPUT_NAME smpi)
-  endif(enable_smpi)
-endif(enable_lib_static)
+  endif()
+endif()
 
 # Dependencies from maintainer mode
 ###################################
 if(enable_maintainer_mode AND BISON_EXE AND LEX_EXE)
   add_dependencies(simgrid automaton_generated_src)
-endif(enable_maintainer_mode AND BISON_EXE AND LEX_EXE)
+endif()
index 866fe1d..a8794ba 100644 (file)
@@ -1,11 +1,14 @@
 ### Make Libs
 #>gcc c:\simgrid-trunk\examples\msg\icomms\peer.c -static -Lc:\simgrid-trunk\lib -lsimgrid -Ic:\simgrid-trunk\include -lwsock32
 add_library(simgrid SHARED ${simgrid_sources})
-add_library(gras SHARED ${gras_sources})
 
-set_target_properties(gras     PROPERTIES COMPILE_FLAGS "-D_XBT_DLL_EXPORT -DDLL_EXPORT" VERSION ${libgras_version}    OUTPUT_NAME "gras")
 set_target_properties(simgrid  PROPERTIES COMPILE_FLAGS "-D_XBT_DLL_EXPORT -DDLL_EXPORT" VERSION ${libsimgrid_version} OUTPUT_NAME "simgrid")
 
+if(enable_smpi)
+  add_library(smpi SHARED ${SMPI_SRC})
+  set_target_properties(smpi PROPERTIES COMPILE_FLAGS "-D_XBT_DLL_EXPORT -DDLL_EXPORT" VERSION ${libsmpi_version} OUTPUT_NAME "smpi")
+endif()
+
 # libpthreadGC2.dll
 if(ARCH_32_BITS)
   find_library(PATH_PTHREAD_LIB
@@ -14,34 +17,37 @@ if(ARCH_32_BITS)
     $ENV{PATH}
     PATH_SUFFIXES bin/ c/bin
     )
-else(ARCH_32_BITS)
+else()
   find_library(PATH_PTHREAD_LIB
     NAMES pthreadGC2-w64.dll
     HINTS
     $ENV{PATH}
     PATH_SUFFIXES bin/ c/bin
     )
-endif(ARCH_32_BITS)
+endif()
 
-set(GRAS_DEP "ws2_32 ${PATH_PTHREAD_LIB}")
 set(SIMGRID_DEP "ws2_32 ${PATH_PCRE_LIB} ${PATH_PTHREAD_LIB}")
+set(SMPI_DEP "${LIBRARY_OUTPUT_PATH}/libsimgrid.dll")
 
 if(ARCH_32_BITS)
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -march=i486")
-else(ARCH_32_BITS)
+else()
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64")
   #        message(FATAL_ERROR "Sorry, Simgrid fails with full 64bits for now! Please contact us.")
-endif(ARCH_32_BITS)
+endif()
 
-target_link_libraries(gras     ${GRAS_DEP})
 target_link_libraries(simgrid  ${SIMGRID_DEP})
+if(enable_smpi)
+add_dependencies(smpi simgrid)
+target_link_libraries(smpi     ${SMPI_DEP})
+endif()
 
 find_path(PEXPORTS_PATH NAMES pexports.exe PATHS NO_DEFAULT_PATHS)
 message(STATUS "pexports: ${PEXPORTS_PATH}")
 if(PEXPORTS_PATH)
   add_custom_command(TARGET simgrid POST_BUILD
     COMMAND ${PEXPORTS_PATH}/pexports.exe ${CMAKE_BINARY_DIR}/lib/libsimgrid.dll > ${CMAKE_BINARY_DIR}/lib/libsimgrid.def)
-endif(PEXPORTS_PATH)
+endif()
 
 if(enable_smpi)
   add_library(smpi SHARED ${SMPI_SRC})
@@ -49,4 +55,4 @@ if(enable_smpi)
 
   set(SMPI_LDEP "")
   target_link_libraries(smpi   simgrid ${SMPI_LDEP})
-endif(enable_smpi)
\ No newline at end of file
+endif()
index e73fcc4..81cffee 100644 (file)
@@ -36,28 +36,28 @@ find_library(HAVE_F2C_LIB
 
 if(HAVE_F2C_H)
   set(HAVE_SMPI_F2C_H 1)
-endif(HAVE_F2C_H)
+endif()
 
 message(STATUS "Looking for f2c.h")
 if(HAVE_F2C_H)
   message(STATUS "Looking for f2c.h - found")
-else(HAVE_F2C_H)
+else()
   message(STATUS "Looking for f2c.h - not found")
-endif(HAVE_F2C_H)
+endif()
 
 message(STATUS "Looking for lib f2c")
 if(HAVE_F2C_LIB)
   message(STATUS "Looking for lib f2c - found")
-else(HAVE_F2C_LIB)
+else()
   message(STATUS "Looking for lib f2c - not found")
-endif(HAVE_F2C_LIB)
+endif()
 
 message(STATUS "Looking for bin f2c")
 if(F2C_EXE)
   message(STATUS "Found F2C: ${F2C_EXE}")
-else(F2C_EXE)
+else()
   message(STATUS "Looking for bin f2c - not found")
-endif(F2C_EXE)
+endif()
 
 mark_as_advanced(HAVE_F2C_H)
 mark_as_advanced(F2C_EXE)
@@ -65,15 +65,11 @@ mark_as_advanced(HAVE_F2C_LIB)
 
 if(HAVE_F2C_H)
   include_directories(${HAVE_F2C_H})
-else(HAVE_F2C_H)
-  if(WIN32)
+else()
     message("-- Fortran for smpi is not installed (http://www.netlib.org/f2c/).")
-  else(WIN32)
-    message(FATAL_ERROR "You should install f2c before use smpi.")
-  endif(WIN32)
-endif(HAVE_F2C_H)
+endif()
 
 set(SMPI_F2C 0)
 if(HAVE_F2C_H AND F2C_EXE AND HAVE_F2C_LIB)
   set(SMPI_F2C 1)
-endif(HAVE_F2C_H AND F2C_EXE AND HAVE_F2C_LIB)
+endif()
index 46e24c2..bd12fa6 100644 (file)
@@ -20,38 +20,38 @@ if(HAVE_GTNETS_LIB AND HAVE_SIMULATOR_H)
     OUTPUT_VARIABLE COMPILE_GTNETS_VAR)
   if(COMPILE_GTNETS_VAR)
     SET(HAVE_GTNETS 0)
-  else(COMPILE_GTNETS_VAR)
+  else()
     SET(HAVE_GTNETS 1)
 
     string(REGEX MATCH "-L${GTNETS_LIB_PATH} " operation "${CMAKE_C_FLAGS}")
     if(NOT operation)
       SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-L${GTNETS_LIB_PATH} ")
-    endif(NOT operation)
+    endif()
 
     SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-I${HAVE_SIMULATOR_H} -L${GTNETS_LIB_PATH} ")
 
     string(REGEX MATCH "${GTNETS_LIB_PATH}" operation "$ENV{LD_LIBRARY_PATH}")
     if(NOT operation)
       message(FATAL_ERROR "\n\nTo use GTNETS don't forget to set LD_LIBRARY_PATH with \n\texport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${GTNETS_LIB_PATH}\n\n")
-    endif(NOT operation)
+    endif()
 
-  endif(COMPILE_GTNETS_VAR)
+  endif()
 
-else(HAVE_GTNETS_LIB AND HAVE_SIMULATOR_H)
+else()
   if(NOT HAVE_GTNETS_LIB)
     message(STATUS "Gtnets is enabled but can't find it.")
-  endif(NOT HAVE_GTNETS_LIB)
+  endif()
   if(NOT HAVE_SIMULATOR_H)
     message(STATUS "Gtnets needs simulator.h")
-  endif(NOT HAVE_SIMULATOR_H)
-endif(HAVE_GTNETS_LIB AND HAVE_SIMULATOR_H)
+  endif()
+endif()
 
 message(STATUS "Looking for lib gtnets patch")
 if(HAVE_GTNETS)
   message(STATUS "Looking for lib gtnets patch - found")
-else(HAVE_GTNETS)
+else()
   message(STATUS "Looking for lib gtnets patch - not found")
-endif(HAVE_GTNETS)
+endif()
 
 mark_as_advanced(HAVE_GTNETS_LIB)
 mark_as_advanced(HAVE_SIMULATOR_H)
\ No newline at end of file
index cf16bff..c2c6c95 100644 (file)
@@ -100,11 +100,11 @@ if(HAVE_CDT_LIB)
 
     if(HAVE_AGRAPH_LIB)
       string(REGEX REPLACE "/libagraph.*" "" lib_graphviz ${HAVE_AGRAPH_LIB})
-    else(HAVE_AGRAPH_LIB)
+    else()
       if(HAVE_CGRAPH_LIB)
        string(REGEX REPLACE "/libcgraph.*" "" lib_graphviz ${HAVE_CGRAPH_LIB})
-      endif(HAVE_CGRAPH_LIB)
-    endif(HAVE_AGRAPH_LIB)
+      endif()
+    endif()
 
     if(HAVE_GRAPH_H OR HAVE_AGRAPH_H OR HAVE_CGRAPH_H)
 
@@ -112,81 +112,81 @@ if(HAVE_CDT_LIB)
        string(REPLACE "/graphviz/graph.h" "" file_graphviz_h ${HAVE_GRAPH_H})
        string(REPLACE "/graphviz" "" file_graphviz_h ${file_graphviz_h})
        set(GRAPH_H 1)
-      endif(HAVE_GRAPH_H)
+      endif()
 
       if(HAVE_AGRAPH_H)
        string(REPLACE "/graphviz/agraph.h" "" file_graphviz_h ${HAVE_AGRAPH_H})
        string(REPLACE "/graphviz" "" file_graphviz_h ${file_graphviz_h})
        set(AGRAPH_H 1)
-      endif(HAVE_AGRAPH_H)
+      endif()
 
       if(HAVE_CGRAPH_H)
        string(REPLACE "/graphviz/cgraph.h" "" file_graphviz_h ${HAVE_CGRAPH_H})
        string(REPLACE "/graphviz" "" file_graphviz_h ${file_graphviz_h})
        set(CGRAPH_H 1)
-      endif(HAVE_CGRAPH_H)
+      endif()
 
       include_directories(${file_graphviz_h} ${file_graphviz_h}/graphviz)
       link_directories(${lib_graphviz})
 
       set(HAVE_GRAPHVIZ "1")
-    else(HAVE_GRAPH_H OR HAVE_AGRAPH_H OR HAVE_CGRAPH_H)
+    else()
       set(HAVE_GRAPHVIZ "0")
-    endif(HAVE_GRAPH_H OR HAVE_AGRAPH_H OR HAVE_CGRAPH_H)
+    endif()
 
-  else(HAVE_CGRAPH_LIB OR HAVE_AGRAPH_LIB)
+  else()
     set(HAVE_GRAPHVIZ "0")
-  endif(HAVE_CGRAPH_LIB OR HAVE_AGRAPH_LIB)
+  endif()
 
-endif(HAVE_CDT_LIB)
+endif()
 
 mark_as_advanced(HAVE_GRAPHVIZ)
 
 message(STATUS "Looking for agraph.h")
 if(HAVE_AGRAPH_H)
   message(STATUS "Looking for agraph.h - found")
-else(HAVE_AGRAPH_H)
+else()
   message(STATUS "Looking for agraph.h - not found")
-endif(HAVE_AGRAPH_H)
+endif()
 
 message(STATUS "Looking for cgraph.h")
 if(HAVE_CGRAPH_H)
   message(STATUS "Looking for cgraph.h - found")
-else(HAVE_CGRAPH_H)
+else()
   message(STATUS "Looking for cgraph.h - not found")
-endif(HAVE_CGRAPH_H)
+endif()
 
 message(STATUS "Looking for graph.h")
 if(HAVE_GRAPH_H)
   message(STATUS "Looking for graph.h - found")
-else(HAVE_GRAPH_H)
+else()
   message(STATUS "Looking for graph.h - not found")
-endif(HAVE_GRAPH_H)
+endif()
 
 message(STATUS "Looking for lib agraph")
 if(HAVE_AGRAPH_LIB)
   message(STATUS "Looking for lib agraph - found")
-else(HAVE_AGRAPH_LIB)
+else()
   message(STATUS "Looking for lib agraph - not found")
-endif(HAVE_AGRAPH_LIB)
+endif()
 
 message(STATUS "Looking for lib cgraph")
 if(HAVE_CGRAPH_LIB)
   message(STATUS "Looking for lib cgraph - found")
-else(HAVE_CGRAPH_LIB)
+else()
   message(STATUS "Looking for lib cgraph - not found")
-endif(HAVE_CGRAPH_LIB)
+endif()
 
 message(STATUS "Looking for lib graph")
 if(HAVE_GRAPH_LIB)
   message(STATUS "Looking for lib graph - found")
-else(HAVE_GRAPH_LIB)
+else()
   message(STATUS "Looking for lib graph - not found")
-endif(HAVE_GRAPH_LIB)
+endif()
 
 message(STATUS "Looking for lib cdt")
 if(HAVE_CDT_LIB)
   message(STATUS "Looking for lib cdt - found")
-else(HAVE_CDT_LIB)
+else()
   message(STATUS "Looking for lib cdt - not found")
-endif(HAVE_CDT_LIB)
\ No newline at end of file
+endif()
\ No newline at end of file
index 101a9df..56de1f7 100644 (file)
@@ -12,7 +12,7 @@ if(PROCESSOR_x86_64)
     /opt/csw
     /sw
     /usr)
-else(PROCESSOR_x86_64)
+else()
   find_library(PATH_LIBUNWIND_LIB
     NAMES unwind
     HINTS
@@ -26,7 +26,7 @@ else(PROCESSOR_x86_64)
     /opt/csw
     /sw
     /usr)
-endif(PROCESSOR_x86_64)
+endif()
 
 find_path(PATH_LIBUNWIND_H "libunwind.h"
   HINTS
@@ -44,16 +44,16 @@ find_path(PATH_LIBUNWIND_H "libunwind.h"
 message(STATUS "Looking for libunwind.h")
 if(PATH_LIBUNWIND_H)
   message(STATUS "Looking for libunwind.h - found")
-else(PATH_LIBUNWIND_H)
+else()
   message(STATUS "Looking for libunwind.h - not found")
-endif(PATH_LIBUNWIND_H)
+endif()
 
 message(STATUS "Looking for libunwind")
 if(PATH_LIBUNWIND_LIB)
   message(STATUS "Looking for libunwind - found")
-else(PATH_LIBUNWIND_LIB)
+else()
   message(STATUS "Looking for libunwind - not found")
-endif(PATH_LIBUNWIND_LIB)
+endif()
 
 if(PATH_LIBUNWIND_LIB AND PATH_LIBUNWIND_H)
   string(REGEX REPLACE "/libunwind.*[.]${LIB_EXE}$" "" PATH_LIBUNWIND_LIB "${PATH_LIBUNWIND_LIB}")
@@ -62,9 +62,9 @@ if(PATH_LIBUNWIND_LIB AND PATH_LIBUNWIND_H)
   include_directories(${PATH_LIBUNWIND_H})
   link_directories(${PATH_LIBUNWIND_LIB})
   
-else(PATH_LIBUNWIND_LIB AND PATH_LIBUNWIND_H)
+else()
   message(FATAL_ERROR "Please either install the libunwind7-dev package (or equivalent) or turn off the model-checking option of SimGrid.")
-endif(PATH_LIBUNWIND_LIB AND PATH_LIBUNWIND_H)
+endif()
 
 mark_as_advanced(PATH_LIBUNWIND_H)
 mark_as_advanced(PATH_LIBUNWIND_LIB)
\ No newline at end of file
index 5d54f0d..2b3c4d1 100644 (file)
@@ -5,13 +5,13 @@ mark_as_advanced(HAVE_LUA_BIN)
 message(STATUS "Looking for lua.h")
 if(LUA_INCLUDE_DIR)
   message(STATUS "Looking for lua.h - found")
-else(LUA_INCLUDE_DIR)
+else()
   message(STATUS "Looking for lua.h - not found")
-endif(LUA_INCLUDE_DIR)
+endif()
 
 if(HAVE_LUA_BIN)
   message(STATUS "Found Lua: ${HAVE_LUA_BIN}")
-endif(HAVE_LUA_BIN)
+endif()
 
 set(LIB_LUA_NAME "")
 
@@ -22,8 +22,8 @@ foreach(lib_path ${LUA_LIBRARIES})
     string(REPLACE "lib" "" LIB_LUA_NAME "${LIB_LUA_NAME}")
     if(LIB_LUA_NAME)
       string(REPLACE "/lib${LIB_LUA_NAME}.${LIB_EXE}" "" LUA_LIBRARY_DIR ${lib_path})
-    endif(LIB_LUA_NAME)
-  endif(NOT LIB_LUA_NAME)
+    endif()
+  endif()
 endforeach(lib_path ${LUA_LIBRARIES})
 
 message(STATUS "Looking for lib lua")
@@ -31,14 +31,14 @@ if(LUA_LIBRARY_DIR)
   message(STATUS "Looking for lib lua - found")
   message(STATUS "Lua version: ${LIB_LUA_NAME}")
   message(STATUS "Lib path   : ${LUA_LIBRARY_DIR}")
-else(LUA_LIBRARY_DIR)
+else()
   message(STATUS "Looking for lib lua - not found")
-endif(LUA_LIBRARY_DIR)
+endif()
 
 if(LUA51_FOUND)
   set(HAVE_LUA 1)
   include_directories(${LUA_INCLUDE_DIR})
   link_directories(${LUA_LIBRARY_DIR})
-else(LUA51_FOUND)
+else()
   message(STATUS "Warning : Lua need version 5.1")
-endif(LUA51_FOUND)
+endif()
index d9a2687..04e568c 100644 (file)
@@ -29,25 +29,25 @@ find_path(HAVE_CORE_MODULE_H
 message(STATUS "Looking for core-module.h")
 if(HAVE_CORE_MODULE_H)
   message(STATUS "Looking for core-module.h - found")
-else(HAVE_CORE_MODULE_H)
+else()
   message(STATUS "Looking for core-module.h - not found")
-endif(HAVE_CORE_MODULE_H)
+endif()
 mark_as_advanced(HAVE_CORE_MODULE_H)
 
 message(STATUS "Looking for lib ns3")
 if(HAVE_NS3_LIB)
   message(STATUS "Looking for lib ns3 - found")
-else(HAVE_NS3_LIB)
+else()
   message(STATUS "Looking for lib ns3 - not found")
-endif(HAVE_NS3_LIB)
+endif()
 mark_as_advanced(HAVE_NS3_LIB)
 
 message(STATUS "Looking for lib ns3-core")
 if(HAVE_NS3_CORE_LIB)
   message(STATUS "Looking for lib ns3-core - found")
-else(HAVE_NS3_CORE_LIB)
+else()
   message(STATUS "Looking for lib ns3-core - not found")
-endif(HAVE_NS3_CORE_LIB)
+endif()
 
 mark_as_advanced(HAVE_NS3_LIB)
 mark_as_advanced(HAVE_NS3_CORE_LIB)
@@ -58,37 +58,37 @@ if(HAVE_CORE_MODULE_H)
     set(HAVE_NS3 1)
     set(NS3_VERSION 310)
     string(REPLACE "/libns3.${LIB_EXE}" ""  HAVE_NS3_LIB "${HAVE_NS3_LIB}")
-  endif(HAVE_NS3_LIB)
+  endif()
   if(HAVE_NS3_CORE_LIB)
     message(STATUS "NS-3 version > 3.10")
     set(HAVE_NS3 1)
     set(NS3_VERSION 312)
     string(REPLACE "/libns3-core.${LIB_EXE}" ""  HAVE_NS3_LIB "${HAVE_NS3_CORE_LIB}")
-  endif(HAVE_NS3_CORE_LIB)
-endif(HAVE_CORE_MODULE_H)
+  endif()
+endif()
 
 if(HAVE_NS3)
   string(REGEX MATCH "${HAVE_NS3_LIB}" operation "$ENV{LD_LIBRARY_PATH}")
   if(NOT operation)
     message(STATUS "Warning: To use NS-3 don't forget to set LD_LIBRARY_PATH with:     export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${HAVE_NS3_LIB}")
-  else(NOT operation)
+  else()
 
     string(REGEX MATCH "-L${HAVE_NS3_LIB} " operation1 "${CMAKE_C_FLAGS}")
     if(NOT operation1)
       SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-L${HAVE_NS3_LIB} ")
-    endif(NOT operation1)
+    endif()
 
     string(REGEX MATCH "-I${HAVE_CORE_MODULE_H} " operation1 "${CMAKE_C_FLAGS}")
     if(NOT operation1)
       SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${HAVE_CORE_MODULE_H} ")
-    endif(NOT operation1)
+    endif()
 
     SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-I${HAVE_CORE_MODULE_H} -L${HAVE_NS3_LIB} ")
-  endif(NOT operation)
-else(HAVE_NS3)
+  endif()
+else()
   message(STATUS "Warning: To use NS-3 Please install ns3 at least version 3.10 (http://www.nsnam.org/releases/)")
-endif(HAVE_NS3)
+endif()
 
 if(HAVE_NS3 AND enable_supernovae)
   set(enable_supernovae OFF)
-endif(HAVE_NS3 AND enable_supernovae)
+endif()
index f4b57b7..2e46c9b 100644 (file)
@@ -28,25 +28,25 @@ find_path(PATH_PCRE_H "pcre.h"
 message(STATUS "Looking for pcre.h")
 if(PATH_PCRE_H)
   message(STATUS "Looking for pcre.h - found")
-else(PATH_PCRE_H)
+else()
   message(STATUS "Looking for pcre.h - not found")
-endif(PATH_PCRE_H)
+endif()
 
 message(STATUS "Looking for lib pcre")
 if(PATH_PCRE_LIB)
   message(STATUS "Looking for lib pcre - found")
-else(PATH_PCRE_LIB)
+else()
   message(STATUS "Looking for lib pcre - not found")
-endif(PATH_PCRE_LIB)
+endif()
 
 if(PATH_PCRE_LIB AND PATH_PCRE_H)
   string(REGEX REPLACE "/libpcre.*[.]${LIB_EXE}$" "" PATH_PCRE_LIB "${PATH_PCRE_LIB}")
   string(REGEX REPLACE "/pcre.h" "" PATH_PCRE_H "${PATH_PCRE_H}")
   include_directories(${PATH_PCRE_H})
   link_directories(${PATH_PCRE_LIB})
-else(PATH_PCRE_LIB)
+else()
   message(FATAL_ERROR "Please install the libpcre3-dev package or equivalent before using SimGrid.")
-endif(PATH_PCRE_LIB AND PATH_PCRE_H)
+endif()
 
 set(PCRE_LIBRARY_PATH $ENV{PCRE_LIBRARY_PATH})
 
index 021867d..8f454fb 100644 (file)
@@ -17,26 +17,26 @@ find_path(PATH_PCRE_H "pcre.h"
 message(STATUS "Looking for pcre.h")
 if(PATH_PCRE_H)
   message(STATUS "Looking for pcre.h - found")
-else(PATH_PCRE_H)
+else()
   message(STATUS "Looking for pcre.h - not found")
-endif(PATH_PCRE_H)
+endif()
 
 message(STATUS "Looking for lib pcre")
 if(PATH_PCRE_LIB)
   message(STATUS "Looking for lib pcre - found")
-else(PATH_PCRE_LIB)
+else()
   message(STATUS "Looking for lib pcre - not found")
-endif(PATH_PCRE_LIB)
+endif()
 
 if(PATH_PCRE_LIB AND PATH_PCRE_H)
   string(REGEX REPLACE "/pcre.h" "" PATH_PCRE_H "${PATH_PCRE_H}")
   string(REGEX MATCH "-I${PATH_PCRE_H} " operation "${CMAKE_C_FLAGS}")
   if(NOT operation)
     SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${PATH_PCRE_H} ")
-  endif(NOT operation)
-else(PATH_PCRE_LIB)
+  endif()
+else()
   message(FATAL_ERROR "Please install the pcre package before using SimGrid.")
-endif(PATH_PCRE_LIB AND PATH_PCRE_H)
+endif()
 
 set(PCRE_LIBRARY_PATH $ENV{PCRE_LIBRARY_PATH})
 
index c057c27..33e6429 100644 (file)
@@ -30,10 +30,10 @@ if(HAVE_RNGSTREAM_H)
   string(REGEX MATCH "-I${HAVE_RNGSTREAM_H} " operation "${CMAKE_C_FLAGS}")
   if(NOT operation)
     SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${HAVE_RNGSTREAM_H} ")
-  endif(NOT operation)
-else(HAVE_RNGSTREAM_H)
+  endif()
+else()
   message(STATUS "Looking for RngStream.h - not found")
-endif(HAVE_RNGSTREAM_H)
+endif()
 
 message(STATUS "Looking for lib rngstreams")
 if(HAVE_RNGSTREAM_LIB)
@@ -42,10 +42,10 @@ if(HAVE_RNGSTREAM_LIB)
   string(REGEX MATCH "-L${HAVE_RNGSTREAM_LIB} " operation "${CMAKE_C_FLAGS}")
   if(NOT operation)
     SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-L${HAVE_RNGSTREAM_LIB} ")
-  endif(NOT operation)
-else(HAVE_RNGSTREAM_LIB)
+  endif()
+else()
   message(STATUS "Looking for lib rngstreams - not found")
-endif(HAVE_RNGSTREAM_LIB)
+endif()
 
 mark_as_advanced(HAVE_RNGSTREAM_LIB)
 mark_as_advanced(HAVE_RNGSTREAM_H)
\ No newline at end of file
index 742cda2..9228fd8 100644 (file)
@@ -2,28 +2,28 @@ include(FindRuby)
 
 if(RUBY_EXECUTABLE)
   message(STATUS "Found ruby:  ${RUBY_EXECUTABLE}")
-endif(RUBY_EXECUTABLE)
+endif()
 
 message(STATUS "Looking for ruby.h")
 if(RUBY_INCLUDE_DIR)
   message(STATUS "Looking for ruby.h - found")
-else(RUBY_INCLUDE_DIR)
+else()
   message(STATUS "Looking for ruby.h - not found")
-endif(RUBY_INCLUDE_DIR)
+endif()
 
 message(STATUS "Looking for confi.h")
 if(RUBY_CONFIG_INCLUDE_DIR)
   message(STATUS "Looking for config.h - found")
-else(RUBY_CONFIG_INCLUDE_DIR)
+else()
   message(STATUS "Looking for config.h - not found")
-endif(RUBY_CONFIG_INCLUDE_DIR)
+endif()
 
 message(STATUS "Looking for lib ruby")
 if(RUBY_LIBRARY)
   message(STATUS "Looking for lib ruby - found")
-else(RUBY_LIBRARY)
+else()
   message(STATUS "Looking for lib ruby - not found")
-endif(RUBY_LIBRARY)
+endif()
 
 if(RUBY_LIBRARY)
   set(LIB_RUBY_VERSION "${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}.${RUBY_VERSION_PATCH}")
@@ -32,23 +32,23 @@ if(RUBY_LIBRARY)
     string(REGEX MATCH "ruby.*[0-9]" RUBY_LIBRARY_NAME ${RUBY_LIBRARY})
     if(NOT RUBY_LIBRARY_NAME)
       set(RUBY_LIBRARY_NAME ruby)
-    endif(NOT RUBY_LIBRARY_NAME)
+    endif()
     string(REGEX REPLACE "/libruby.*$" "" RUBY_LIBRARY ${RUBY_LIBRARY})
     SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${RUBY_CONFIG_INCLUDE_DIR} ") #path to config.h
     string(COMPARE EQUAL "${RUBY_INCLUDE_DIR}" "${RUBY_CONFIG_INCLUDE_DIR}" operation)
     if(NOT operation)
       SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${RUBY_INCLUDE_DIR} ") #path to ruby.h
-    endif(NOT operation)
+    endif()
     ADD_DEFINITIONS("-I${CMAKE_HOME_DIRECTORY}/src/bindings/ruby -I${CMAKE_HOME_DIRECTORY}/src/simix")
     SET(HAVE_RUBY 1)
-  else(RUBY_VERSION_MAJOR MATCHES "1" AND RUBY_VERSION_MINOR MATCHES "9")
+  else()
     message(STATUS "Warning: Ruby bindings need version 1.9.x, but found version ${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}.x")
     SET(HAVE_RUBY 0)
-  endif(RUBY_VERSION_MAJOR MATCHES "1" AND RUBY_VERSION_MINOR MATCHES "9")
-else(RUBY_LIBRARY)
+  endif()
+else()
   SET(HAVE_RUBY 0)
-endif(RUBY_LIBRARY)
+endif()
 
 if(NOT RUBY_EXECUTABLE)
   message(STATUS "Warning: you are missing the ruby executable, so you can compile and build examples but can't execute them!")
-endif(NOT RUBY_EXECUTABLE)
\ No newline at end of file
+endif()
\ No newline at end of file
index d29da73..c8a6234 100644 (file)
@@ -1,5 +1,5 @@
 #IF YOU HAVE INSTALL SIMGRID IN A SPECIAL DIRECTORY
-#YOU CAN SPECIFY SIMGRID_ROOT OR GRAS_ROOT
+#YOU CAN SPECIFY SIMGRID_ROOT
 
 # TO CALL THIS FILE USE
 #set(CMAKE_MODULE_PATH
@@ -11,7 +11,6 @@ find_library(HAVE_SIMGRID_LIB
   NAME simgrid
   HINTS
   $ENV{LD_LIBRARY_PATH}
-  $ENV{GRAS_ROOT}
   $ENV{SIMGRID_ROOT}
   PATH_SUFFIXES lib64 lib
   PATHS
@@ -22,37 +21,9 @@ find_library(HAVE_SIMGRID_LIB
   /usr
   )
 
-find_path(HAVE_GRAS_H gras.h
-  HINTS
-  $ENV{GRAS_ROOT}
-  $ENV{SIMGRID_ROOT}
-  PATH_SUFFIXES include
-  PATHS
-  /opt
-  /opt/local
-  /opt/csw
-  /sw
-  /usr
-  )
-
 find_program(HAVE_TESH
   NAMES tesh
   HINTS
-  $ENV{GRAS_ROOT}
-  $ENV{SIMGRID_ROOT}
-  PATH_SUFFIXES bin
-  PATHS
-  /opt
-  /opt/local
-  /opt/csw
-  /sw
-  /usr
-  )
-
-find_program(HAVE_GRAS_STUB
-  NAMES gras_stub_generator
-  HINTS
-  $ENV{GRAS_ROOT}
   $ENV{SIMGRID_ROOT}
   PATH_SUFFIXES bin
   PATHS
@@ -74,21 +45,10 @@ if(HAVE_SIMGRID_LIB)
   string(REGEX REPLACE "^${SIMGRID_MINOR_VERSION}." "" SIMGRID_PATCH_VERSION "${SIMGRID_PATCH_VERSION}")
   string(REGEX REPLACE "^${SIMGRID_MAJOR_VERSION}." "" SIMGRID_MINOR_VERSION "${SIMGRID_MINOR_VERSION}")
   message(STATUS "Simgrid version : ${SIMGRID_MAJOR_VERSION}.${SIMGRID_MINOR_VERSION}")
-else(HAVE_SIMGRID_LIB)
+else()
   message(STATUS "Looking for lib SimGrid - not found")
-endif(HAVE_SIMGRID_LIB)
-
-message(STATUS "Looking for gras.h")
-if(HAVE_GRAS_H)
-  message(STATUS "Looking for gras.h - found")
-else(HAVE_GRAS_H)
-  message(STATUS "Looking for gras.h - not found")
-endif(HAVE_GRAS_H)
+endif()
 
 if(HAVE_TESH)
   message(STATUS "Found Tesh: ${HAVE_TESH}")
-endif(HAVE_TESH)
-
-if(HAVE_GRAS_STUB)
-  message(STATUS "Found gras_stub_generator: ${HAVE_GRAS_STUB}")
-endif(HAVE_GRAS_STUB)
\ No newline at end of file
+endif()
index 9cfcfc0..cbb044c 100644 (file)
@@ -13,7 +13,7 @@ if(VALGRIND_EXE)
   message(STATUS "Found valgrind: ${VALGRIND_EXE}")
   SET(VALGRIND_COMMAND "${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/my_valgrind.pl")
   SET(MEMORYCHECK_COMMAND "${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/my_valgrind.pl")
-endif(VALGRIND_EXE)
+endif()
 
 if(VALGRIND_EXE)
   exec_program("${VALGRIND_EXE} --version " OUTPUT_VARIABLE "VALGRIND_VERSION")
@@ -23,13 +23,13 @@ if(VALGRIND_EXE)
     exec_program("${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/generate_memcheck_tests.pl ${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/AddTests.cmake > ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/memcheck_tests.cmake" OUTPUT_VARIABLE SHUTT)
     set(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full --show-reachable=yes --track-origins=yes --read-var-info=no")
     message(STATUS "Valgrind options: ${MEMORYCHECK_COMMAND_OPTIONS}")
-  else(NEW_VALGRIND_VERSION)
+  else()
     set(enable_memcheck false)
     message(STATUS "Error: Command valgrind not found --> enable_memcheck autoset to false.")
-  endif(NEW_VALGRIND_VERSION)
-else(VALGRIND_EXE)
+  endif()
+else()
   set(enable_memcheck false)
   message(FATAL_ERROR "Command valgrind not found --> enable_memcheck autoset to false.")
-endif(VALGRIND_EXE)
+endif()
 
 mark_as_advanced(VALGRIND_EXE)
\ No newline at end of file
index 9a66066..609ae6e 100644 (file)
@@ -7,9 +7,9 @@ set(ns3_path ${ns3_path} CACHE PATH "Path to ns3 lib and include")
 
 if(NOT CMAKE_INSTALL_PREFIX)
   set(CMAKE_INSTALL_PREFIX "/usr/local/simgrid/" CACHE PATH "Path where to install project")
-else(NOT CMAKE_INSTALL_PREFIX)
+else()
   set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "Path where to install project")
-endif(NOT CMAKE_INSTALL_PREFIX)
+endif()
 
 set(pipol_user ${pipol_user} CACHE TYPE INTERNAL FORCE)
 
@@ -26,7 +26,7 @@ option(enable_tracing "Tracing simulations for visualization." on)
 option(enable_latency_bound_tracking "" off)
 option(enable_coverage "Enable coverage." off)
 option(enable_memcheck "Enable memcheck." off)
-option(enable_mallocators "Enable mallocators (for debugging purpose)." on)
+option(enable_mallocators "Enable mallocators (disable only for debugging purpose)." on)
 option(enable_print_message "Enable print message during config." off)
 option(enable_model-checking "Turn this on to experiment with our prototype of model-checker (hinders the simulation's performance even if turned of at runtime)" off)
 option(enable_lib_static "" off)
@@ -37,9 +37,9 @@ option(enable_msg_deprecated "This option enable the use of msg deprecated funct
 
 if(WIN32)
   option(enable_smpi "Whether the smpi library is compiled." off)
-else(WIN32)
+else()
   option(enable_smpi "Whether the smpi library is compiled." on)
-endif(WIN32)
+endif()
 
 mark_as_advanced(HAVE_SSH)
 mark_as_advanced(HAVE_RSYNC)
@@ -69,3 +69,5 @@ mark_as_advanced(CMAKE_OSX_SYSROOT)
 mark_as_advanced(SED_EXE)
 mark_as_advanced(BIBTEX2HTML)
 mark_as_advanced(CMAKE_C_LINK_FLAGS)
+mark_as_advanced(CMAKE_CXX_FLAGS)
+mark_as_advanced(CMAKE_Fortran_LINK_FLAGS)
index a225176..6f34b4e 100644 (file)
@@ -10,48 +10,48 @@ IF(pipol_user)
 
   if(with_context)
     set(CMAKE_OPTIONS "${CMAKE_OPTIONS}        -Dwith_context=${with_context}")
-  endif(with_context)
+  endif()
 
   if(enable_smpi)
     set(CMAKE_OPTIONS "${CMAKE_OPTIONS}        -Denable_smpi=on")
-  endif(enable_smpi)
+  endif()
 
   if(enable_lua)
     set(CMAKE_OPTIONS "${CMAKE_OPTIONS}        -Denable_lua=on")
-  endif(enable_lua)
+  endif()
 
   if(enable_compile_optimizations)
     set(CMAKE_OPTIONS "${CMAKE_OPTIONS}        -Denable_compile_optimizations=on")
-  endif(enable_compile_optimizations)
+  endif()
 
   if(enable_compile_warnings)
     set(CMAKE_OPTIONS "${CMAKE_OPTIONS}        -Denable_compile_warnings=on")
-  endif(enable_compile_warnings)
+  endif()
 
   if(enable_tracing)
     set(CMAKE_OPTIONS "${CMAKE_OPTIONS}        -Denable_tracing=on")
-  endif(enable_tracing)
+  endif()
 
   if(enable_coverage)
     set(CMAKE_OPTIONS "${CMAKE_OPTION} -Denable_coverage=on")
-  endif(enable_coverage)
+  endif()
 
   if(enable_print_message)
     set(CMAKE_OPTIONS "${CMAKE_OPTIONS}        -Denable_print_message=on")
-  endif(enable_print_message)
+  endif()
 
   if(enable_model-checking)
     set(CMAKE_OPTIONS "${CMAKE_OPTIONS}        -Denable_model-checking=on")
-  endif(enable_model-checking)
+  endif()
 
   if(enable_latency_bound_tracking)
     set(CMAKE_OPTIONS "${CMAKE_OPTIONS}        -Denable_latency_bound_tracking=on")
-  endif(enable_latency_bound_tracking)
+  endif()
 
   FIND_PROGRAM(HAVE_SSH ssh)
   FIND_PROGRAM(HAVE_RSYNC rsync)
 
-  MESSAGE(STATUS "Pipol user is ${pipol_user}")
+  MESSAGE(STATUS "Pipol user is '${pipol_user}'")
   IF(HAVE_SSH)
     message(STATUS "Found ssh: ${HAVE_SSH}")
     # get pipol systems
@@ -59,7 +59,7 @@ IF(pipol_user)
       ssh ${pipol_user}@pipol.inria.fr pipol-sub --query=systems
       OUTPUT_VARIABLE PIPOL_SYSTEMS OUTPUT_STRIP_TRAILING_WHITESPACE)
 
-  ENDIF(HAVE_SSH)
+  ENDIF()
 
   ADD_CUSTOM_TARGET(pipol_test_list_images
     COMMENT "Available images for pipol tests (cmake + make + make test) : "
@@ -125,8 +125,8 @@ IF(pipol_user)
            cmake ${CMAKE_HOME_DIRECTORY}${CMAKE_OPTIONS} \;
            ctest -D Experimental \"
            )
-       endif(NOT make_test)
-      endif(make_test)
+       endif()
+      endif()
 
       ADD_CUSTOM_COMMAND(TARGET ${SYSTEM_TARGET}_experimental
        POST_BUILD
@@ -136,26 +136,35 @@ IF(pipol_user)
       ADD_CUSTOM_COMMAND(TARGET pipol_test_list_images
        COMMAND echo ${SYSTEM_TARGET}
        )
-      ADD_CUSTOM_COMMAND(TARGET pipol_experimental_list_images
+    ADD_CUSTOM_COMMAND(TARGET pipol_experimental_list_images
        COMMAND echo "${SYSTEM_TARGET}_experimental"
        )
     ENDMACRO(PIPOL_TARGET)
 
-  ENDIF(HAVE_RSYNC)
+  ENDIF()
 
   # add a target for each pipol system
   IF(PIPOL_SYSTEMS)
-    MESSAGE(STATUS "Adding Pipol targets")
+    #MESSAGE(STATUS "Adding Pipol targets")
     FOREACH(SYSTEM ${PIPOL_SYSTEMS})
       PIPOL_TARGET(${SYSTEM})
     ENDFOREACH(SYSTEM ${PIPOL_SYSTEMS})
-  ENDIF(PIPOL_SYSTEMS)
+  ENDIF()
 
   ADD_CUSTOM_TARGET(pipol_kill_all_jobs
     COMMENT "PIPOL delete all jobs"
     COMMAND ./pipol-sub --pipol-user=${pipol_user} deleteallmyjobs
     )
 
-  message(STATUS "Pipol options: ${CMAKE_OPTIONS}")
-
-ENDIF(pipol_user)
\ No newline at end of file
+  #message(STATUS "Pipol options: ${CMAKE_OPTIONS}")
+
+  add_custom_target(sync-pipol
+  COMMENT "Update pipol script for user: ${pipol_user}"
+  COMMAND scp ${CMAKE_HOME_DIRECTORY}/buildtools/pipol/rc.* ${pipol_user}@pipol.inria.fr:~/.pipol/
+  COMMAND scp ${CMAKE_HOME_DIRECTORY}/buildtools/pipol/Nightly_simgrid.sh ${pipol_user}@pipol.inria.fr:~/.pipol/nightly/
+  COMMAND scp ${CMAKE_HOME_DIRECTORY}/buildtools/pipol/Nightly_memCheck.sh ${pipol_user}@pipol.inria.fr:~/.pipol/nightly/
+  COMMAND scp ${CMAKE_HOME_DIRECTORY}/buildtools/pipol/Experimental_bindings.sh ${pipol_user}@pipol.inria.fr:~/
+  COMMAND scp ${CMAKE_HOME_DIRECTORY}/buildtools/pipol/pre-simgrid.sh ${pipol_user}@pipol.inria.fr:~/
+  COMMAND ssh ${pipol_user}@pipol.inria.fr "chmod a=rwx ~/* ~/.pipol/rc.* ~/.pipol/nightly/*"
+  )
+ENDIF()
\ No newline at end of file
index 26e15db..861388f 100644 (file)
@@ -11,9 +11,6 @@ if(enable_print_message)
   message("need_vasprintf ..............: ${simgrid_need_vasprintf}")
   message("PREFER_PORTABLE_SNPRINTF ....: ${PREFER_PORTABLE_SNPRINTF}")
   message("HAVE_VA_COPY ................: ${HAVE_VA_COPY}")
-  message("GRAS_BIGENDIAN ..............: ${GRAS_BIGENDIAN}")
-  message("GRAS_ARCH val ...............: ${val_big}")
-  message("GRAS_ARCH_32_BITS ...........: ${GRAS_ARCH_32_BITS}")
   message("PRINTF_NULL_WORKING .........: ${PRINTF_NULL_WORKING}")
   message("")
   message("\#define pth_skaddr_makecontext(skaddr,sksize) (${makecontext_addr})")
@@ -72,17 +69,24 @@ if(enable_print_message)
   message("______________________________________________________________________")
   message("______________________________________________________________________ DEBUG END")
   message("")
-endif(enable_print_message)
+endif()
 
-message("\nConfiguration of package `simgrid' on arch (=${GRAS_THISARCH}):")
+message("\nConfiguration of package `simgrid':")
 message("        BUILDNAME ...........: ${BUILDNAME}")
 message("        SITE ................: ${SITE}")
 message("        Release .............: simgrid-${release_version}")
 message("")
-message("        Compiler: c++ .......: ${CMAKE_CXX_COMPILER}")
-message("                version .....: ${COMPILER_CXX_VERSION}")
-message("        Compiler: c .........: ${CMAKE_C_COMPILER}")
+message("        Compiler: C .........: ${CMAKE_C_COMPILER} (${CMAKE_C_COMPILER_ID})")
 message("                version .....: ${COMPILER_C_VERSION}")
+if(CMAKE_CXX_COMPILER)
+  message("        Compiler: C++ .......: ${CMAKE_CXX_COMPILER} (${CMAKE_CXX_COMPILER_ID})")
+  message("                version .....: ${COMPILER_CXX_VERSION}")
+endif()
+if(CMAKE_Fortran_COMPILER)
+  message("        Compiler: Fortran ...: ${CMAKE_Fortran_COMPILER} (${CMAKE_Fortran_COMPILER_ID})")
+  message("                version .....: ${COMPILER_Fortran_VERSION}")
+endif()
+message("        Linker: .............: ${CMAKE_LINKER}")
 message("")
 message("        CFlags ..............: ${CMAKE_C_FLAGS}")
 message("        CPPFlags ............: ${CMAKE_CXX_FLAGS}")
@@ -93,7 +97,7 @@ if(NOT APPLE AND NOT WIN32)
   message("        Compile NS-3 ........: ${HAVE_NS3}")
   message("        Gtnets path .........: ${gtnets_path}")
   message("        NS-3 path ...........: ${ns3_path}")
-endif(NOT APPLE AND NOT WIN32)
+endif()
 message("        Compile Lua .........: ${HAVE_LUA}")
 message("        Compile Smpi ........: ${HAVE_SMPI}")
 message("        Compile Smpi f77 ....: ${SMPI_F2C}")
@@ -106,9 +110,9 @@ message("        Tracing mode ........: ${enable_tracing}")
 message("        Jedule  mode ........: ${enable_jedule}")
 message("        Latency bound .......: ${enable_latency_bound_tracking}")
 message("        Graphviz mode .......: ${HAVE_GRAPHVIZ}")
+message("        Mallocators .........: ${enable_mallocators}")
 message("")
 message("        Simgrid dependencies : ${SIMGRID_DEP}")
-message("        Gras dependencies ...: ${GRAS_DEP}")
 message("        Smpi dependencies ...: ${SMPI_DEP}")
 message("")
 message("        INSTALL_PREFIX ......: ${CMAKE_INSTALL_PREFIX}")
index d6a3265..f56228a 100644 (file)
@@ -6,16 +6,10 @@
 set(simgrid_fragile_sources
   src/simdag/sd_daxloader.c
   src/surf/surfxml_parse.c
-  src/xbt/datadesc/ddt_parse.yy.c
   src/xbt/graphxml_parse.c
   src/xbt/mmalloc/mm.c
   ${GTNETS_USED}
   )
-set(gras_fragile_sources
-  src/xbt/datadesc/ddt_parse.yy.c
-  src/xbt/graphxml_parse.c
-  src/xbt/mmalloc/mm.c
-  )
 
 #####################################################
 ### END OF CONFIGURATION, NO NEED TO READ FURTHER ###
@@ -27,8 +21,6 @@ if (enable_supernovae) # I need supernovae
   # supernovae files are generated. I promise
   set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c
     PROPERTIES GENERATED true)
-  set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_gras.c
-    PROPERTIES GENERATED true)
   set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c
     PROPERTIES GENERATED true)
 
@@ -40,13 +32,6 @@ if (enable_supernovae) # I need supernovae
     COMMENT "Generating supernovae_sg.c"
     )
 
-  ADD_CUSTOM_COMMAND(
-    OUTPUT   ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_gras.c
-    DEPENDS  ${CMAKE_HOME_DIRECTORY}/src/mk_supernovae.pl ${gras_sources}
-    COMMAND  perl ${CMAKE_HOME_DIRECTORY}/src/mk_supernovae.pl --out=${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_gras.c '--fragile=${gras_fragile_sources}'    '${gras_sources}'
-    WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}
-    COMMENT "Generating supernovae_gras.c"
-    )
 
   ADD_CUSTOM_COMMAND(
     OUTPUT   ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c
@@ -61,11 +46,7 @@ if (enable_supernovae) # I need supernovae
     ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c
     ${simgrid_fragile_sources})
 
-  set(gras_sources
-    ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_gras.c
-    ${gras_fragile_sources})
-
   set(SMPI_SRC
     ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c)
 
-endif(enable_supernovae) # I need supernovae
+endif() # I need supernovae
index c084254..4351f1b 100644 (file)
@@ -12,7 +12,6 @@ set(TEST_CFILES
   src/xbt/xbt_strbuff.c
   src/xbt/xbt_sha.c
   src/xbt/config.c
-  src/xbt/xbt_synchro.c
   src/xbt/parmap.c
   )
 set(TEST_UNITS
@@ -26,7 +25,6 @@ set(TEST_UNITS
   ${CMAKE_CURRENT_BINARY_DIR}/src/xbt_strbuff_unit.c
   ${CMAKE_CURRENT_BINARY_DIR}/src/xbt_sha_unit.c
   ${CMAKE_CURRENT_BINARY_DIR}/src/config_unit.c
-  ${CMAKE_CURRENT_BINARY_DIR}/src/xbt_synchro_unit.c
   ${CMAKE_CURRENT_BINARY_DIR}/src/parmap_unit.c
 
   ${CMAKE_CURRENT_BINARY_DIR}/src/simgrid_units_main.c
@@ -58,9 +56,9 @@ add_executable(testall ${TEST_UNITS})
 
 ### Add definitions for compile
 if(NOT WIN32)
-  target_link_libraries(testall gras m)
-else(NOT WIN32)
-  target_link_libraries(testall gras)
-endif(NOT WIN32)
+  target_link_libraries(testall simgrid m)
+else()
+  target_link_libraries(testall simgrid)
+endif()
 
 add_dependencies(testall ${TEST_UNITS})
\ No newline at end of file
similarity index 90%
rename from buildtools/Cmake/src/gras_config.h.in
rename to buildtools/Cmake/src/internal_config.h.in
index 082e1b8..efbcacb 100644 (file)
@@ -1,5 +1,5 @@
-// <root>/buildtools/Cmake/gras_config.h.in is user-written.
-// With Cmake it creates <root>/src/gras_config.h
+// <root>/buildtools/Cmake/internal_config.h.in is user-written.
+// With Cmake it creates <root>/src/internal_config.h
 
 /* Set somes variables for Windows compilation */
 
 #cmakedefine CMAKE_SYSTEM_PROCESSOR @CMAKE_SYSTEM_PROCESSOR@
 #cmakedefine HAVE_RAWCTX @HAVE_RAWCTX@
 
-/* Defined if arrays in struct can straddle struct alignment boundaries. This
-   is like than the structure compaction above, but this time, the argument to
-   be compacted is an array whom each element would be normally compacted.
-   Exemple: struct s { double d; int i; char c[6]; }; Arrays can straddle if c
-   is allowed to come just after i. Note that GRAS only support architecture
-   presenting this caracteristic so far. */
-#cmakedefine GRAS_ARRAY_STRADDLE_STRUCT @GRAS_ARRAY_STRADDLE_STRUCT@
-
-/* define if big endian */
-#define GRAS_BIGENDIAN @GRAS_BIGENDIAN@
-
-/* Defined if structures are compacted when possible. Consider this structure:
-   struct s {double d; int i; char c;}; If it is allowed, the char is placed
-   just after the int. If not, it has to be on the 8 bytes boundary imposed by
-   the double. For now, GRAS requires the structures to be compacted. */
-#cmakedefine GRAS_STRUCT_COMPACT @GRAS_STRUCT_COMPACT@
-
-/* defines the GRAS architecture signature of this machine */
-#define GRAS_THISARCH @GRAS_THISARCH@
-
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #cmakedefine HAVE_DLFCN_H @HAVE_DLFCN_H@
 
index bb18c71..ff66d55 100644 (file)
@@ -47,14 +47,12 @@ Section "Libraries and Headers" LibSection
        # install lib\r
        CreateDirectory $INSTDIR\lib\r
        setOutPath $INSTDIR\lib\r
-       file lib\libgras.dll\r
        file lib\libsimgrid.dll\r
        file lib\libsimgrid.def\r
        \r
        #install headers\r
        CreateDirectory  $INSTDIR\include\r
        setOutPath $INSTDIR\include\r
-       file @CMAKE_HOME_DIRECTORY@\include\gras.h \r
        file @CMAKE_HOME_DIRECTORY@\include\xbt.h\r
        file include\simgrid_config.h\r
        \r
@@ -95,7 +93,6 @@ Section "Libraries and Headers" LibSection
        file @CMAKE_HOME_DIRECTORY@\include\xbt\parmap.h\r
        file @CMAKE_HOME_DIRECTORY@\include\xbt\automaton.h\r
        file @CMAKE_HOME_DIRECTORY@\include\xbt\automatonparse_promela.h\r
-       file @CMAKE_HOME_DIRECTORY@\include\xbt\datadesc.h\r
        file @CMAKE_HOME_DIRECTORY@\include\xbt\socket.h\r
        file @CMAKE_HOME_DIRECTORY@\include\xbt\file_stat.h\r
     file @CMAKE_HOME_DIRECTORY@\include\xbt\xbt_os_thread.h\r
@@ -131,21 +128,6 @@ Section "Libraries and Headers" LibSection
        file @CMAKE_HOME_DIRECTORY@\include\surf\simgrid_dtd.h\r
        file @CMAKE_HOME_DIRECTORY@\include\surf\surf_routing.h\r
        \r
-       CreateDirectory  $INSTDIR\include\gras\r
-       setOutPath $INSTDIR\include\gras\r
-       file @CMAKE_HOME_DIRECTORY@\include\gras\transport.h\r
-       file @CMAKE_HOME_DIRECTORY@\include\gras\virtu.h\r
-       file @CMAKE_HOME_DIRECTORY@\include\gras\emul.h\r
-       file @CMAKE_HOME_DIRECTORY@\include\gras\process.h\r
-       file @CMAKE_HOME_DIRECTORY@\include\gras\module.h\r
-       file @CMAKE_HOME_DIRECTORY@\include\gras\messages.h\r
-       file @CMAKE_HOME_DIRECTORY@\include\gras\timer.h\r
-       \r
-       CreateDirectory  $INSTDIR\include\amok\r
-       setOutPath $INSTDIR\include\amok\r
-       file @CMAKE_HOME_DIRECTORY@\include\amok\peermanagement.h\r
-       file @CMAKE_HOME_DIRECTORY@\include\amok\bandwidth.h\r
-       \r
        CreateDirectory  $INSTDIR\include\instr\r
        setOutPath $INSTDIR\include\instr\r
        file @CMAKE_HOME_DIRECTORY@\include\instr\instr.h\r
@@ -256,14 +238,14 @@ section
 # default section end\r
 sectionEnd\r
 \r
-LangString DESC_LibSection             ${LANG_ENGLISH} "Install Simgrid and gras libraries with associated headers."\r
+LangString DESC_LibSection             ${LANG_ENGLISH} "Install Simgrid libraries with associated headers."\r
 LangString DESC_BinSection             ${LANG_ENGLISH} "Install some useful tools for Simgrid."\r
 LangString DESC_DocSection             ${LANG_ENGLISH} "Generated (doxygen) documentation."\r
 LangString DESC_ExamplesSection ${LANG_ENGLISH} "Simgrid's HelloWorld example and some classical platforms."\r
 LangString DESC_PCRESection    ${LANG_ENGLISH} "Install the PCRE and PCREPOSIX libraries for SimGrid."\r
 LangString DESC_JAVASection    ${LANG_ENGLISH} "Install the Java binding and examples."\r
 \r
-LangString DESC_LibSection             ${LANG_FRENCH}  "Installer les librairies Simgrid et Gras et leurs Entêtes."\r
+LangString DESC_LibSection             ${LANG_FRENCH}  "Installer les librairies Simgrid et leurs Entêtes."\r
 LangString DESC_BinSection             ${LANG_FRENCH}  "Installer les outils optionnels."\r
 LangString DESC_DocSection             ${LANG_FRENCH}  "Installer la documentation."\r
 LangString DESC_ExamplesSection ${LANG_FRENCH}         "Installer un exemple 'HelloWorld' et des fichiers de plate-formes types."\r
@@ -287,7 +269,6 @@ section "Uninstall"
        delete $INSTDIR\uninstaller@BIN_EXE@\r
 \r
        # delete installed libs\r
-       delete $INSTDIR\lib\libgras.dll\r
        delete $INSTDIR\lib\libsimgrid.dll\r
        delete $INSTDIR\lib\libsimgrid.def\r
 \r
@@ -302,7 +283,6 @@ section "Uninstall"
        delete $INSTDIR\bin\tesh\r
        \r
        # delete installed headers\r
-       delete $INSTDIR\include\gras.h \r
        delete $INSTDIR\include\xbt.h\r
        delete $INSTDIR\include\simgrid_config.h\r
        delete $INSTDIR\include\xbt\misc.h\r
@@ -358,16 +338,6 @@ section "Uninstall"
        delete $INSTDIR\include\surf\surfxml_parse.h\r
        delete $INSTDIR\include\surf\simgrid_dtd.h\r
        delete $INSTDIR\include\surf\surf_routing.h\r
-       delete $INSTDIR\include\gras\datadesc.h\r
-       delete $INSTDIR\include\gras\transport.h\r
-       delete $INSTDIR\include\gras\virtu.h\r
-       delete $INSTDIR\include\gras\emul.h\r
-       delete $INSTDIR\include\gras\process.h\r
-       delete $INSTDIR\include\gras\module.h\r
-       delete $INSTDIR\include\gras\messages.h\r
-       delete $INSTDIR\include\gras\timer.h\r
-       delete $INSTDIR\include\amok\peermanagement.h\r
-       delete $INSTDIR\include\amok\bandwidth.h\r
        delete $INSTDIR\include\instr\instr.h\r
                \r
        # delete EXTRA FILES\r
@@ -382,8 +352,6 @@ section "Uninstall"
        RMDir  "$INSTDIR\lib"\r
        RMDir  "$INSTDIR\include\simix"\r
        RMDir  "$INSTDIR\include\instr"\r
-       RMDir  "$INSTDIR\include\amok"\r
-       RMDir  "$INSTDIR\include\gras"\r
        RMDir  "$INSTDIR\include\surf"\r
        RMDir  "$INSTDIR\include\smpi"\r
        RMDir  "$INSTDIR\include\simdag"\r
diff --git a/buildtools/Cmake/test_prog/prog_GRAS_ARCH.c b/buildtools/Cmake/test_prog/prog_GRAS_ARCH.c
deleted file mode 100644 (file)
index 00b6dff..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-//This programme check size of datatypes 
-
-/* Copyright (c) 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <sys/types.h>
-#include <stdio.h>
-
-int main(void)
-{
-
-  int c = sizeof(char);
-  int si = sizeof(short int);
-  int i = sizeof(int);
-  int li = sizeof(long int);
-  int lli = sizeof(long long int);
-  int f = sizeof(float);
-  int v = sizeof(void *);
-  int vv = sizeof(void (*)(void));
-  /*printf("char : %d\n",c);
-     printf("short int : %d\n",si);
-     printf("int : %d\n",i);
-     printf("long int : %d\n",li);
-     printf("long long int : %d\n",lli);
-     printf("float : %d\n",f);
-     printf("void * : %d\n",v);
-     printf("void (*) (void) : %d\n",vv); */
-
-  struct s0 {
-    char c0;
-    char i0;
-  };
-  struct s1 {
-    char c1;
-    short int i1;
-  };
-  struct s2 {
-    char c2;
-    int i2;
-  };
-  struct s3 {
-    char c3;
-    long int i3;
-  };
-  struct s4 {
-    char c4;
-    long long int i4;
-  };
-  struct s5 {
-    char c5;
-    double i5;
-  };
-  struct s6 {
-    char c6;
-    void *i6;
-  };
-  int res0 = sizeof(struct s0) - sizeof(char);
-  int res1 = sizeof(struct s1) - sizeof(short int);
-  int res2 = sizeof(struct s2) - sizeof(int);
-  int res3 = sizeof(struct s3) - sizeof(long int);
-  int res4 = sizeof(struct s4) - sizeof(long long int);
-  int res5 = sizeof(struct s5) - sizeof(double);
-  int res6 = sizeof(struct s6) - sizeof(void *);
-  /*printf("struct-char : %d\n",res0);
-     printf("struct-short int : %d\n",res1);      
-     printf("struct-int : %d\n",res2);    
-     printf("struct-long int : %d\n",res3);       
-     printf("struct-long long int : %d\n",res4);  
-     printf("struct-double : %d\n",res5); 
-     printf("struct-void * : %d\n",res6); */
-
-  printf
-      ("_C:%d/%d:_I:%d/%d:%d/%d:%d/%d:%d/%d:_P:%d/%d:%d/%d:_D:4/%d:8/%d:",
-       c, res0, si, res1, i, res2, li, res3, lli, res4, v, res6, vv, res6,
-       f, res5);
-  return 1;
-}
diff --git a/buildtools/Cmake/test_prog/prog_GRAS_CHECK_STRUCT_COMPACTION.c b/buildtools/Cmake/test_prog/prog_GRAS_CHECK_STRUCT_COMPACTION.c
deleted file mode 100644 (file)
index 865eeaf..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Copyright (c) 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <sys/types.h>
-#include <stddef.h>             /* offsetof() */
-#include <stdio.h>
-
-int main(void)
-{
-
-  struct s0 {
-    char c0;
-    double d0;
-  };
-  struct s1 {
-    double d1;
-    int i1;
-    char c1;
-  };
-  struct s2 {
-    double d2;
-    int i2;
-    char c2[6];
-  };
-  struct s3 {
-    double d3;
-    int a3;
-    int b3;
-  };
-
-  int gras_struct_packed;
-  int gras_struct_compact;
-  int gras_array_straddle_struct;
-  int gras_compact_struct;
-
-  if (sizeof(struct s0) == sizeof(double) + sizeof(char)) {
-    gras_struct_packed = 1;
-  } else {
-    gras_struct_packed = 0;
-  }
-  if (offsetof(struct s1, c1) == sizeof(double) + sizeof(int)) {
-    gras_struct_compact = 1;
-  } else {
-    gras_struct_compact = 0;
-  }
-  if (offsetof(struct s2, c2) == sizeof(double) + sizeof(int)) {
-    gras_array_straddle_struct = 1;
-  } else {
-    gras_array_straddle_struct = 0;
-  }
-  if (offsetof(struct s3, b3) == sizeof(double) + sizeof(int)) {
-    gras_compact_struct = 1;
-  } else {
-    gras_compact_struct = 0;
-  }
-
-
-  if (gras_struct_packed == 0 && gras_struct_compact == 1)
-    printf("GRAS_STRUCT_COMPACT ");
-
-  if (gras_array_straddle_struct == 1)
-    printf("GRAS_ARRAY_STRADDLE_STRUCT ");
-
-  if (gras_compact_struct == 1)
-    printf("GRAS_COMPACT_STRUCT ");
-
-  return 1;
-
-}
diff --git a/buildtools/Cmake/test_prog/prog_max_size.c b/buildtools/Cmake/test_prog/prog_max_size.c
deleted file mode 100644 (file)
index 021c5d5..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-//This programme check size of datatypes 
-
-/* Copyright (c) 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-
-#include <sys/types.h>
-#include <stdio.h>
-
-int main(void)
-{
-
-  int c = sizeof(char);
-  int si = sizeof(short int);
-  int i = sizeof(int);
-  int li = sizeof(long int);
-  int lli = sizeof(long long int);
-  int f = sizeof(float);
-  int v = sizeof(void *);
-  int vv = sizeof(void (*)(void));
-  int t[8] = { c, si, i, li, lli, f, v, vv };
-
-  int max = t[0];
-
-  for (i = 1; i < 8; i++) {
-    if (t[i] > max)
-      max = t[i];
-
-  }
-  printf("%d", max);
-  return 1;
-}
diff --git a/buildtools/pipol/CtestPipol.cmake b/buildtools/pipol/CtestPipol.cmake
deleted file mode 100755 (executable)
index f46507d..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-find_path(GCOV_PATH NAMES gcov PATHS NO_DEFAULT_PATHS)
-find_path(VALGRIND_PATH        NAMES valgrind  PATHS NO_DEFAULT_PATHS)
-find_program(PWD_EXE NAMES pwd)
-find_program(SED_EXE NAMES sed)
-
-### AUTO DETECT THE CMAKE_HOME_DIRECTORY
-exec_program("${PWD_EXE}" ARGS "| ${SED_EXE} 's/\\/Cmake//g'" OUTPUT_VARIABLE CMAKE_HOME_DIRECTORY)
-### MANUAL CMAKE_HOME_DIRECTORY
-#set(CMAKE_HOME_DIRECTORY "")
-
-SET(CTEST_PROJECT_NAME "Simgrid")
-
-SET(CTEST_BUILD_NAME "CTEST_UCONTEXT")
-SET(CTEST_SITE "Pierre_Navarro")
-
-SET(CTEST_SOURCE_DIRECTORY "./")
-SET(CTEST_BINARY_DIRECTORY "./")
-SET(CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE "3000000")
-SET(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE "3000000")
-
-SET(CTEST_CMAKE_COMMAND "/home/navarrop/Programmes/cmake-2.8.0/bin/cmake ./")
-SET(CTEST_CONFIGURE_COMMAND "/home/navarrop/Programmes/cmake-2.8.0/bin/cmake -Denable_coverage=on -Denable_memcheck=on ./")
-SET(CTEST_COMMAND "/home/navarrop/Programmes/cmake-2.8.0/bin/ctest")
-SET(CTEST_BUILD_COMMAND "/usr/bin/make -j3")
-SET(CTEST_COVERAGE_COMMAND "${GCOV_PATH}/gcov")
-SET(CTEST_VALGRIND_COMMAND "${VALGRIND_PATH}/valgrind")
-SET(CTEST_MEMORYCHECK_COMMAND "${VALGRIND_PATH}/valgrind")
-set(CTEST_MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full --show-reachable=yes --track-origins=yes --read-var-info=no")
-
-if(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.svn)
-  SET(CTEST_UPDATE_COMMAND "/usr/bin/svn")
-endif(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.svn)
-
-if(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git)
-  SET(CTEST_UPDATE_COMMAND "/usr/bin/git")
-endif(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git)
-
-SET(CTEST_DROP_METHOD "http")
-SET(CTEST_DROP_SITE "cdash.inria.fr/CDash")
-SET(CTEST_DROP_LOCATION "/submit.php?project=${CTEST_PROJECT_NAME}")
-SET(CTEST_DROP_SITE_CDASH TRUE)
-SET(CTEST_TRIGGER_SITE "http://cdash.inria.fr/CDash/cgi-bin/Submit-Random-TestingResults.cgi")
-
-###Custom ctest
-
-#CTEST_CUSTOM_ERROR_MATCH                       Regular expression for errors during build process
-#CTEST_CUSTOM_ERROR_EXCEPTION                   Regular expression for error exceptions during build process
-#CTEST_CUSTOM_WARNING_MATCH                     Regular expression for warnings during build process
-#CTEST_CUSTOM_WARNING_EXCEPTION                 Regular expression for warning exception during build process
-#CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS          Maximum number of errors to display
-#CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS        Maximum number of warnings to display
-#CTEST_CUSTOM_TESTS_IGNORE                      List of tests to ignore during the Test stage
-#CTEST_CUSTOM_MEMCHECK_IGNORE                   List of tests to ignore during the MemCheck stage
-#CTEST_CUSTOM_PRE_TEST                          Command to execute before any tests are run during Test stage
-#CTEST_CUSTOM_POST_TEST                         Command to execute after any tests are run during Test stage
-#CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE   Maximum size of passed test output
-#CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE   Maximum size of failed test output
-#CTEST_CUSTOM_PRE_MEMCHECK                      Command to execute before any tests are run during MemCheck stage
-#CTEST_CUSTOM_POST_MEMCHECK                     Command to execute after any tests are run during MemCheck stage
-#CTEST_CUSTOM_COVERAGE_EXCLUDE                  Regular expression for excluding files from coverage testing
-
-SET(CTEST_CUSTOM_COVERAGE_EXCLUDE
-  "${CMAKE_HOME_DIRECTORY}/tools/*"
-  "${CMAKE_HOME_DIRECTORY}/buildtools/*"
-  "${CMAKE_HOME_DIRECTORY}/include/*"
-  "${CMAKE_HOME_DIRECTORY}/examples/*"
-  "${CMAKE_HOME_DIRECTORY}/testsuite/*"
-  "${CMAKE_HOME_DIRECTORY}/teshsuite/*"
-  "${CMAKE_HOME_DIRECTORY}/src/bindings/*"
-  )
-
-#ignore some memcheck tests
-set(CTEST_CUSTOM_MEMCHECK_IGNORE
-  tesh-self-basic
-  tesh-self-cd
-  tesh-self-IO-broken-pipe
-  tesh-self-IO-orders
-  tesh-self-IO-bigsize
-  tesh-self-set-return
-  tesh-self-set-signal
-  tesh-self-set-timeout
-  tesh-self-set-ignore-output
-  tesh-self-catch-return
-  tesh-self-catch-signal
-  tesh-self-catch-timeout
-  tesh-self-catch-wrong-output
-  tesh-self-bg-basic
-  tesh-self-bg-set-signal
-  tesh-self-background
-  tesh-log-large
-  tesh-log-parallel
-  tesh-gras-dd-mem
-  tesh-gras-dd-rw
-  tesh-gras-dd-r_little32_4
-  tesh-gras-dd-r_little64
-  tesh-gras-dd-r_big32_8_4
-  tesh-gras-dd-r_big32_8
-  tesh-gras-dd-r_big32_2
-  tesh-gras-empty_main-rl
-  tesh-gras-empty_main-sg
-  tesh-simdag-reinit_costs
-  tesh-simdag-parser
-  tesh-simdag-flatifier
-  tesh-simdag-basic0
-  tesh-simdag-basic1
-  tesh-simdag-basic2
-  tesh-simdag-basic3
-  tesh-simdag-basic4
-  tesh-simdag-basic5
-  tesh-simdag-basic6
-  tesh-simdag-p2p-1
-  tesh-simdag-p2p-2
-  tesh-simdag-p2p-3
-  tesh-simdag-p2p-3
-  tesh-simdag-mxn-1
-  tesh-simdag-mxn-2
-  tesh-simdag-mxn-3
-  tesh-simdag-par-1
-  tesh-simdag-par-2
-  tesh-msg-get_sender
-  gras-ping-rl
-  gras-rpc-rl
-  gras-spawn-rl
-  gras-timer-rl
-  gras-chrono-rl
-  gras-simple_token-rl
-  gras-mmrpc-rl
-  gras-all2all-rl
-  gras-pmm-rl
-  gras-synchro-rl
-  gras-properties-rl
-  msg-sendrecv_CLM03
-  msg-sendrecv_Vegas
-  msg-sendrecv_Reno
-  msg-suspend
-  msg-masterslave
-  msg-masterslave-forwarder
-  msg-masterslave-failure
-  msg-masterslave-bypass
-  msg-migration
-  msg-ptask
-  msg-priority
-  msg-properties
-  msg-trace
-  msg-masterslave_cpu_ti
-  gras-properties-sg
-  amok-bandwidth-rl
-  amok-saturate-rl
-  simdag-test_simdag
-  simdag-test_simdag2
-  simdag-test_prop
-  simdag-metaxml_test
-  smpi-bcast
-  smpi-reduce
-  )
-
-IF(${ARCH_32_BITS})
-  SET(CTEST_CUSTOM_MEMCHECK_IGNORE
-    ${CTEST_CUSTOM_MEMCHECK_IGNORE}
-    tesh-gras-msg_handle-sg-32
-    tesh-gras-small_sleep-sg-32
-    gras-ping-sg-32
-    gras-rpc-sg-32
-    gras-spawn-sg-32
-    gras-timer-sg-32
-    gras-chrono-sg-32
-    gras-simple_token-sg-32
-    gras-mmrpc-sg-32
-    gras-all2all-sg-32
-    gras-pmm-sg-32
-    gras-synchro-sg-32
-    amok-bandwidth-sg-32
-    amok-saturate-sg-32
-    )
-ELSE(${ARCH_32_BITS})
-  SET(CTEST_CUSTOM_MEMCHECK_IGNORE
-    ${CTEST_CUSTOM_MEMCHECK_IGNORE}
-    tesh-gras-msg_handle-sg-64
-    tesh-gras-small_sleep-sg-64
-    gras-ping-sg-64
-    gras-rpc-sg-64
-    gras-spawn-sg-64
-    gras-timer-sg-64
-    gras-chrono-sg-64
-    gras-simple_token-sg-64
-    gras-mmrpc-sg-64
-    gras-all2all-sg-64
-    gras-pmm-sg-64
-    gras-synchro-sg-64
-    amok-bandwidth-sg-64
-    amok-saturate-sg-64
-    )
-ENDIF(${ARCH_32_BITS})
-
-if(HAVE_GTNETS)
-  SET(CTEST_CUSTOM_MEMCHECK_IGNORE
-    ${CTEST_CUSTOM_MEMCHECK_IGNORE}
-    msg-gtnets1
-    msg-gtnets2
-    msg-gtnets3
-    msg-gtnets4
-    msg-gtnets5
-    )
-endif(HAVE_GTNETS)
-
-if(HAVE_JAVA)
-  SET(CTEST_CUSTOM_MEMCHECK_IGNORE
-    ${CTEST_CUSTOM_MEMCHECK_IGNORE}
-    java-basic
-    java-pingpong
-    java-comm_time
-    java-suspend
-    )
-endif(HAVE_JAVA)
-
-ctest_start(Experimental)
-ctest_update(SOURCE "${CTEST_SOURCE_DIRECTORY}")
-ctest_configure(BUILD "${CTEST_SOURCE_DIRECTORY}")
-ctest_build(BUILD "${CTEST_SOURCE_DIRECTORY}")
-ctest_test(BUILD "${CTEST_SOURCE_DIRECTORY}")
-ctest_coverage(BUILD "${CTEST_SOURCE_DIRECTORY}")
-ctest_memcheck(BUILD "${CTEST_SOURCE_DIRECTORY}")
-ctest_submit()
diff --git a/buildtools/pipol/Experimental.sh b/buildtools/pipol/Experimental.sh
deleted file mode 100755 (executable)
index 3252fd9..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/bin/bash
-
-if [ -e ./pipol ] ; then
-       rm -rf ./pipol/$PIPOL_HOST
-       mkdir ./pipol/$PIPOL_HOST
-else
-       mkdir ./pipol
-       rm -rf ./pipol/$PIPOL_HOST
-       mkdir ./pipol/$PIPOL_HOST
-fi
-cd ./pipol/$PIPOL_HOST
-
-export GIT_SSL_NO_VERIFY=1
-git clone https://gforge.inria.fr/git/simgrid/simgrid.git
-cd simgrid
-
-perl ./buildtools/pipol/cmake.pl
-perl ./buildtools/pipol/ruby.pl
-
-if [ -e /usr/bin/gcc-4.6 ] ; then
-export CC=gcc-4.6
-export CXX=g++-4.6
-else
-export CC=gcc
-export CXX=g++
-fi
-
-#Those 3 lines is for GTNetS
-#sh ./buildtools/pipol/install_gtnets.sh ./gtnets_install
-#SIMGRID_ROOT=`pwd`
-#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SIMGRID_ROOT/gtnets_install/lib
-
-#MC
-cmake \
--Denable_latency_bound_tracking=on \
--Denable_gtnets=on \
--Dgtnets_path=./gtnets_install \
--Denable_coverage=on \
--Denable_model-checking=on \
--Denable_compile_optimizations=off \
--Denable_auto_install=on \
--DCMAKE_INSTALL_PREFIX=./simgrid_install \
--Drelease=on .
-ctest -D ExperimentalStart
-ctest -D ExperimentalConfigure
-ctest -D ExperimentalBuild
-ctest -D ExperimentalTest
-ctest -D ExperimentalCoverage
-ctest -D ExperimentalSubmit
-make clean
index 54cc0f2..7aaae2b 100755 (executable)
@@ -11,8 +11,9 @@ fi
 cd ./pipol/$PIPOL_HOST
 
 export GIT_SSL_NO_VERIFY=1
-git clone https://gforge.inria.fr/git/simgrid/simgrid.git
+git clone git://scm.gforge.inria.fr/simgrid/simgrid.git
 cd simgrid
+#git checkout v3_7_x
 
 perl ./buildtools/pipol/cmake.pl
 perl ./buildtools/pipol/ruby.pl
@@ -25,11 +26,34 @@ export CC=gcc
 export CXX=g++
 fi
 
-cmake -Drelease=on .
+mkdir build-def
+cd build-def
+
+#DEFAULT CONF
+cmake ..
+ctest -D ExperimentalStart
+ctest -D ExperimentalConfigure
+ctest -D ExperimentalBuild
+ctest -D ExperimentalTest
+ctest -D ExperimentalSubmit
+cd ../
+rm -rf ./build-def
+
+# really clean the working directory
+git reset --hard master
+git clean -dfx
+
+#MC
+cmake \
+-Denable_coverage=on \
+-Denable_model-checking=on \
+-Denable_lua=on \
+-Denable_compile_optimizations=off .
 ctest -D ExperimentalStart
 ctest -D ExperimentalConfigure
 ctest -D ExperimentalBuild
 ctest -D ExperimentalTest
+ctest -D ExperimentalCoverage
 ctest -D ExperimentalSubmit
 
 export SIMGRID_ROOT=`pwd`
index 8b13efc..d065819 100755 (executable)
@@ -28,7 +28,6 @@ fi
 #mem-check
 cmake \
 -Denable_lua=off \
--Denable_tracing=off \
 -Denable_compile_optimizations=off \
 -Denable_compile_warnings=on \
 -Denable_lib_static=off \
@@ -42,4 +41,4 @@ ctest -D ExperimentalStart
 ctest -D ExperimentalConfigure
 ctest -D ExperimentalBuild
 ctest -D ExperimentalMemCheck
-ctest -D ExperimentalSubmit
\ No newline at end of file
+ctest -D ExperimentalSubmit
index 6b07966..ccf05a4 100755 (executable)
@@ -13,7 +13,7 @@ fi
 cd ./pipol/$PIPOL_HOST
 
 export GIT_SSL_NO_VERIFY=1
-git clone https://gforge.inria.fr/git/simgrid/simgrid.git
+git clone git://scm.gforge.inria.fr/simgrid/simgrid.git
 cd simgrid
 
 perl ./buildtools/pipol/cmake.pl
@@ -39,6 +39,7 @@ cmake \
 -Denable_latency_bound_tracking=off \
 -Denable_gtnets=off \
 -Denable_jedule=off \
+-Denable_mallocators=off \
 -Denable_memcheck=on ./
 ctest -D NightlyStart
 ctest -D NightlyConfigure
index 52a5fbe..92aaccd 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-#PRE-PIPOL /home/mescal/navarro/pre-simgrid.sh
+#PRE-PIPOL ~/pre-simgrid.sh
 
 #___________________________________________________________________________________________________
 #Ubuntu 9.10________________________________________________________________________________________
@@ -34,7 +34,6 @@
 
 #Debian Lenny 6.0
 #PIPOL esn amd64_2010-linux-debian-squeeze.dd.gz none 02:00 --user --silent
-#PIPOL esn i386_2010-linux-debian-squeeze-navarro-2011-10-03-171100.dd.gz none 02:00 --user --silent
 
 #Debian Testing
 #PIPOL esn i386-linux-debian-testing none 02:00 --user --silent
@@ -42,7 +41,6 @@
 
 #___________________________________________________________________________________________________
 #MacOS Snow Leopard 10.6____________________________________________________________________________
-#PIPOL esn x86_mac-mac-osx-server-snow-leopard-navarro-2011-09-22-113726.dd.gz none 02:00 --user --silent
 
 if [ -e ./pipol ] ; then
         rm -rf ./pipol/$PIPOL_HOST
@@ -55,8 +53,9 @@ fi
 cd ./pipol/$PIPOL_HOST
 
 export GIT_SSL_NO_VERIFY=1
-git clone https://gforge.inria.fr/git/simgrid/simgrid.git
+git clone git://scm.gforge.inria.fr/simgrid/simgrid.git
 cd simgrid
+#git checkout v3_7_x
 
 perl ./buildtools/pipol/cmake.pl
 perl ./buildtools/pipol/ruby.pl
@@ -69,16 +68,18 @@ export CC=gcc
 export CXX=g++
 fi
 
+mkdir build-def
+cd build-def
+
 #DEFAULT CONF
-cmake \
--Drelease=on \
--Denable_lua=on .
+cmake ..
 ctest -D NightlyStart
 ctest -D NightlyConfigure
 ctest -D NightlyBuild
 ctest -D NightlyTest
 ctest -D NightlySubmit
-make clean
+cd ../
+rm -rf ./build-def
 
 # really clean the working directory
 git reset --hard master
@@ -88,9 +89,8 @@ git clean -dfx
 cmake \
 -Denable_coverage=on \
 -Denable_model-checking=on \
--Denable_lua=off \
--Drelease=on \
--Denable_supernovae=off .
+-Denable_lua=on \
+-Denable_compile_optimizations=off .
 ctest -D NightlyStart
 ctest -D NightlyConfigure
 ctest -D NightlyBuild
@@ -100,12 +100,13 @@ ctest -D NightlySubmit
 
 export SIMGRID_ROOT=`pwd`
 export LD_LIBRARY_PATH=`pwd`/lib
-export DYLD_LIBRARY_PATH=`pwd`/lib              
-cd ../
+export DYLD_LIBRARY_PATH=`pwd`/lib #for mac
+cd ..
+
 git clone git://scm.gforge.inria.fr/simgrid/simgrid-java.git simgrid-java --quiet
 cd simgrid-java
 export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:`pwd`/lib
-export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`/lib
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`/lib #for mac
 
 cmake .
 ctest -D NightlyStart
index 8895ee5..90b8af5 100755 (executable)
@@ -32,17 +32,8 @@ ssh pipol pipol-sub esn amd64-linux-debian-lenny.dd.gz none 02:00 "~/Experimenta
 
 #Debian Lenny 6.0
 ssh pipol pipol-sub esn amd64_2010-linux-debian-squeeze.dd.gz none 02:00 "~/Experimental_bindings.sh"
-#ssh pipol pipol-sub esn i386_2010-linux-debian-squeeze.dd.gz none 02:00 "~/Experimental_bindings.sh"
-ssh pipol pipol-sub esn i386_2010-linux-debian-squeeze-navarro-2011-10-03-171100.dd.gz none 02:00 "~/Experimental_bindings.sh"
+ssh pipol pipol-sub esn i386_2010-linux-debian-squeeze.dd.gz none 02:00 "~/Experimental_bindings.sh"
 
 #Debian Testing
 ssh pipol pipol-sub esn i386-linux-debian-testing none 02:00 "~/Experimental_bindings.sh"
-ssh pipol pipol-sub esn amd64-linux-debian-testing none 02:00 "~/Experimental_bindings.sh"
-
-#___________________________________________________________________________________________________
-#MacOS Snow Leopard 10.6____________________________________________________________________________
-ssh pipol pipol-sub esn x86_mac-mac-osx-server-snow-leopard-navarro-2011-09-22-113726.dd.gz none 02:00 "~/Experimental_bindings.sh"
-
-#___________________________________________________________________________________________________
-#windows-server-2008-64bits_________________________________________________________________________
-#ssh pipol pipol-sub esn amd64-windows-server-2008-64bits.dd.gz none 02:00 "~/Experimental_bindings.sh"
\ No newline at end of file
+ssh pipol pipol-sub esn amd64-linux-debian-testing none 02:00 "~/Experimental_bindings.sh"
\ No newline at end of file
index cdf5386..7d042f8 100644 (file)
@@ -2,24 +2,24 @@
 
 set -e
 
-rm -rf /home/mescal/navarro/.pipol/log/*
+rm -rf ~/.pipol/log/*
 
-#if [ -e /home/mescal/navarro/version/bckup_version ] ; then
+#if [ -e ~/version/bckup_version ] ; then
 #      svn cleanup version/
-#      cd /home/mescal/navarro/version
+#      cd ~/version
 #      svn up README --quiet
 #else
-#      if [ -e /home/mescal/navarro/version ] ; then
+#      if [ -e ~/version ] ; then
 #              svn cleanup version/
-#              echo "0000P" > /home/mescal/navarro/version/bckup_version
+#              echo "0000P" > ~/version/bckup_version
 #      else
-#              mkdir /home/mescal/navarro/version
-#              echo "0000P" > /home/mescal/navarro/version/bckup_version
+#              mkdir ~/version
+#              echo "0000P" > ~/version/bckup_version
 #      fi
-#      cd /home/mescal/navarro
-#      svn checkout svn://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk /home/mescal/navarro/version --depth empty --quiet
+#      cd ~/
+#      svn checkout svn://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk ~/version --depth empty --quiet
 #
-#      cd /home/mescal/navarro/version
+#      cd ~/version
 #      svn up README --quiet
 #fi
 
index 3507fce..3285d37 100644 (file)
@@ -9,6 +9,8 @@ sudo aptitude -y install valgrind
 sudo aptitude -y install f2c
 sudo aptitude -y install gcc-4.6
 sudo aptitude -y install g++-4.6
+sudo aptitude -y install graphviz-dev graphviz
+sudo aptitude -y install liblua5.1-dev lua5.1
 sudo aptitude -y install libpcre3-dev
 sudo aptitude -y install cmake
 sudo aptitude -y install libunwind7-dev
@@ -42,4 +44,4 @@ echo $which_perl
 echo $which_f2c
 echo $which_gcov
 echo $which_git
-echo "FIN------------------------------------"
\ No newline at end of file
+echo "FIN------------------------------------"
index 3b54a11..8462e76 100644 (file)
@@ -18,6 +18,16 @@ sudo apt-get -y -qq install valgrind
 sudo apt-get -y -qq install git-core
 sudo apt-get -y -qq install libunwind7-dev
 
+if [ $PIPOL_IMAGE == "i386-linux-ubuntu-lucid.dd.gz" ]; then
+  wget http://mirror.ovh.net/ubuntu//pool/universe/libu/libunwind/libunwind7_0.99-0.3ubuntu1_i386.deb
+  sudo dpkg -i libunwind7_0.99-0.3ubuntu1_i386.deb
+fi
+
+if [ $PIPOL_IMAGE == "amd64-linux-ubuntu-lucid.dd.gz" ]; then
+  wget http://mirror.ovh.net/ubuntu//pool/universe/libu/libunwind/libunwind7_0.99-0.3ubuntu1_amd64.deb
+  sudo dpkg -i libunwind7_0.99-0.3ubuntu1_amd64.deb
+fi
+
 which_svn=`which svn`          #svn necessary
 which_gcc=`which gcc`          #gcc gcc necessary
 which_gpp=`which g++`          #gcc g++ necessary
index 83195ba..38f7f6f 100644 (file)
@@ -720,7 +720,6 @@ EXCLUDE_SYMBOLS        =
 # the \include command).
 
 EXAMPLE_PATH           = ./ \
-                         @top_srcdir@/doc/gtut-files \
                          @top_srcdir@/src/surf/ \
                          @top_srcdir@/src/xbt/ \
                          @top_srcdir@/examples \
@@ -1557,7 +1556,9 @@ SKIP_FUNCTION_MACROS   = YES
 # NOT include the path). If a tag file is not located in the directory in which
 # doxygen is run, you must also specify the path to the tagfile here.
 
-TAGFILES               = shared/doxygen/simgridrefguide.tag=ref_guide/html/ shared/doxygen/simgriduserguide.tag=user_guide/html/
+TAGFILES               = shared/doxygen/simgridrefguide.tag=ref_guide/html/ \ 
+                         shared/doxygen/simgriduserguide.tag=user_guide/html/ \
+                         shared/doxygen/simgriddevguide.tag=dev_guide/html/
 
 # When a file name is specified after GENERATE_TAGFILE, doxygen will create
 # a tag file that is based on the input files it reads.
index e1653c9..c2b2d89 100644 (file)
@@ -15,7 +15,7 @@ MSG_examples.
 If you are stuck at any point and if this FAQ cannot help you, please drop us a
 mail to the user mailing list: <simgrid-user@lists.gforge.inria.fr>.
 
-\subsection faq_interfaces What is the difference between MSG, SimDag, and GRAS? Do they serve the same purpose?
+\subsection faq_interfaces What is the difference between MSG and SimDag? Do they serve the same purpose?
 
 It depend on how you define "purpose", I guess ;)
 
@@ -29,16 +29,9 @@ parallel tasks. So, in this model, applications can be seen as a DAG of
 tasks. This is the interface of choice for people wanting to port old
 code designed for SimGrid v1 or v2 to the framework current version.
 
-With both GRAS and MSG, your application is seen as a set of communicating
-processes, exchanging data by the way of messages and performing computation
-on their own.
-
-The difference between both is that MSG is somehow easier to use, but GRAS
-is not limited to the simulator. Once you're done writing your GRAS code,
-you can run your code both in the simulator and on a real platform. For this,
-there are two implementations of the GRAS interface, one for simulation, and one
-for real execution. So, you just have to relink your code to choose one of
-both worlds.
+With MSG, your application is seen as a set of communicating
+processes, exchanging data by the way of messages and performing
+computation on their own.
 
 \subsection faq_visualization Visualizing and analyzing the results
 
@@ -73,7 +66,7 @@ we do not feel a real demand for any other language. But if you think there is o
 
 \subsection faq_MIA "Could you please add (your favorite feature here) to SimGrid?"
 
-Here is the deal. The whole SimGrid project (MSG, SURF, GRAS, ...) is
+Here is the deal. The whole SimGrid project (MSG, SURF, ...) is
 meant to be kept as simple and generic as possible. We cannot add
 functions for everybody's needs when these functions can easily be
 built from the ones already in the API. Most of the time, it is
@@ -606,49 +599,9 @@ and it breaks the hack we devised to bypass the parser, as explained in
 \ref pf_flexml_bypassing. Indeed, this is not a classical usage of the
 parser, and Will didn't imagine that we may have used (and even documented)
 such a crude usage of FleXML. So, we now have to repair the bypassing
-functionality to use the lastest FleXML version and fix the memory usage in
+functionality to use the latest FleXML version and fix the memory usage in
 SimGrid.
 
-\subsubsection faq_trouble_gras_transport GRAS spits networking error messages
-
-Gras, on real platforms, naturally use regular sockets to communicate. They
-are deeply hidden in the gras abstraction, but when things go wrong, you may
-get some weird error messages. Here are some example, with the probable
-reason:
-
- - <b>Transport endpoint is not connected</b>: several processes try to open
-   a server socket on the same port number of the same machine. This is
-   naturally bad and each process should pick its own port number for this.\n
-   Maybe, you just have some processes remaining from a previous experiment
-   on your machine.\n
-   Killing them may help, but again if you kill -KILL them, you'll have to
-   wait for a while: they didn't close there sockets properly and the system
-   needs a while to notice that this port is free again.
-
- - <b>Socket closed by remote side</b>: if the remote process is not
-   supposed to close the socket at this point, it may be dead.
-
- - <b>Connection reset by peer</b>: I found this on Internet about this
-   error. I think it's what's happening here, too:\n
-   <i>This basically means that a network error occurred while the client was
-   receiving data from the server. But what is really happening is that the
-   server actually accepts the connection, processes the request, and sends
-   a reply to the client. However, when the server closes the socket, the
-   client believes that the connection has been terminated abnormally
-   because the socket implementation sends a TCP reset segment telling the
-   client to throw away the data and report an error.\n
-   Sometimes, this problem is caused by not properly closing the
-   input/output streams and the socket connection. Make sure you close the
-   input/output streams and socket connection properly. If everything is
-   closed properly, however, and the problem persists, you can work around
-   it by adding a one-second sleep before closing the streams and the
-   socket. This technique, however, is not reliable and may not work on all
-   systems.</i>\n
-   Since GRAS sockets are closed properly (repeat after me: there is no bug
-   in GRAS), it is either that you are closing your sockets on server side
-   before the client get a chance to read them (use gras_os_sleep() to delay
-   the server), or the server died awfully before the client got the data.
-
 \subsubsection faq_trouble_errors_big_fat_warning I'm told that my XML files are too old.
 
 The format of the XML platform description files is sometimes
index a63cd2c..99c2b58 100644 (file)
@@ -5,9 +5,9 @@ cmake_minimum_required(VERSION 2.8)
 if(WIN32)
   SET(CMAKE_RC_COMPILER "windres")
   set(LIBRARIES_DEP simgrid pcre ws2_32 pthread)
-else(WIN32)
+else()
   set(LIBRARIES_DEP simgrid pcre pthread)
-endif(WIN32)
+endif()
 
 project(MY_SIMGRID_PROJECT C)
 
@@ -22,13 +22,13 @@ message(STATUS "Looking for lib Simgrid")
 if("$ENV{SIMGRID_ROOT}" STREQUAL "")
   message(STATUS "Looking for lib Simgrid - Not found")
   message(FATAL_ERROR "Simgrid not found, reinstall it or set SIMGRID_ROOT")
-else("$ENV{SIMGRID_ROOT}" STREQUAL "")
+else()
   link_directories($ENV{SIMGRID_ROOT}/lib)
   include_directories($ENV{SIMGRID_ROOT}/include)
   include_directories($ENV{SIMGRID_ROOT}/src)
   include_directories($ENV{SIMGRID_ROOT}/src/include)
   message(STATUS "Looking for lib Simgrid - found")
-endif("$ENV{SIMGRID_ROOT}" STREQUAL "")
+endif()
 
 ################
 # FIND TARGETS #
index 871b144..d4628ea 100644 (file)
@@ -17,28 +17,28 @@ find_path(PATH_PCRE_H "pcre.h"
 message(STATUS "Looking for pcre.h")
 if(PATH_PCRE_H)
   message(STATUS "Looking for pcre.h - found")
-else(PATH_PCRE_H)
+else()
   message(STATUS "Looking for pcre.h - not found")
-endif(PATH_PCRE_H)
+endif()
 
 message(STATUS "Looking for lib pcre")
 if(PATH_PCRE_LIB)
   message(STATUS "Looking for lib pcre - found")
-else(PATH_PCRE_LIB)
+else()
   message(STATUS "Looking for lib pcre - not found")
-endif(PATH_PCRE_LIB)
+endif()
 
 if(PATH_PCRE_LIB AND PATH_PCRE_H)
   string(REGEX REPLACE "/pcre.h" "" PATH_PCRE_H "${PATH_PCRE_H}")
   string(REGEX MATCH "-I${PATH_PCRE_H} " operation "${CMAKE_C_FLAGS}")
   if(NOT operation)
     SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${PATH_PCRE_H} ")
-  endif(NOT operation)
+  endif()
   string(REGEX REPLACE "/libpcre.dll" "" PATH_PCRE_LIB  "${PATH_PCRE_LIB}")
   link_directories(${PATH_PCRE_LIB})
-else(PATH_PCRE_LIB)
+else()
   message(FATAL_ERROR "Please install the pcre package before using SimGrid.")
-endif(PATH_PCRE_LIB AND PATH_PCRE_H)
+endif()
 
 mark_as_advanced(PATH_PCRE_H)
 mark_as_advanced(PATH_PCRE_LIB)
\ No newline at end of file
index 263b04f..c671239 100644 (file)
@@ -4,6 +4,7 @@
     <tab type="mainpage" visible="yes" title="Home"/>
     <tab type="user" url="../ref_guide/html/index.html" title="Reference Manual"/>
     <tab type="user" url="../user_guide/html/index.html" title="User Guide"/>
+    <tab type="user" url="../dev_guide/html/index.html" title="Developer Guide"/>
     <tab type="user" url="http://simgrid.gforge.inria.fr/tutorials" title="Tutorials"/>
     <tab type="user" url="https://gforge.inria.fr/projects/simgrid" title="Forge"/>
     <tab type="user" url="http://simgrid.gforge.inria.fr/" title="Website"/>
diff --git a/doc/amok_bw_sat.png b/doc/amok_bw_sat.png
deleted file mode 100644 (file)
index 0c25340..0000000
Binary files a/doc/amok_bw_sat.png and /dev/null differ
diff --git a/doc/amok_bw_test.png b/doc/amok_bw_test.png
deleted file mode 100644 (file)
index e5635d7..0000000
Binary files a/doc/amok_bw_test.png and /dev/null differ
index e1c17c6..aa58101 100644 (file)
@@ -29,7 +29,7 @@ DOXYFILE_ENCODING      = UTF-8
 # identify the project. Note that if you do not use Doxywizard you need
 # to put quotes around the project name if it contains spaces.
 
-PROJECT_NAME           = "SimGrid Developer Guide"
+PROJECT_NAME           = SimGrid
 
 # The PROJECT_NUMBER tag can be used to enter a project or revision number.
 # This could be handy for archiving the generated documentation or
@@ -661,8 +661,9 @@ WARN_LOGFILE           =
 INPUT                  = index.doc \
                          simgrid.doc \
                          xps.doc \
-                         cmake.doc                      
-
+                         cmake.doc \
+                        release.doc
+                         
 ###################################################
 ##  PLEASE DON'T MESS WITH THE ORDER OF EXAMPLES ## (unless you know what you are doing, of course)
 ###################################################
@@ -727,12 +728,7 @@ EXCLUDE_SYMBOLS        =
 # directories that contain example code fragments that are included (see
 # the \include command).
 
-EXAMPLE_PATH           = ./ \
-                         @top_srcdir@/doc/gtut-files \
-                         @top_srcdir@/src/surf/ \
-                         @top_srcdir@/src/xbt/ \
-                         @top_srcdir@/examples \
-                         @top_srcdir@/testsuite
+EXAMPLE_PATH           = ./
 
 # If the value of the EXAMPLE_PATH tag contains directories, you can use the
 # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
@@ -1565,12 +1561,12 @@ SKIP_FUNCTION_MACROS   = YES
 # NOT include the path). If a tag file is not located in the directory in which
 # doxygen is run, you must also specify the path to the tagfile here.
 
-TAGFILES               = ../../shared/doxygen/simgriddevguide.tag=../../dev_guide/html/
+TAGFILES               =
 
 # When a file name is specified after GENERATE_TAGFILE, doxygen will create
 # a tag file that is based on the input files it reads.
 
-GENERATE_TAGFILE       = ../../shared/doxygen/simgriddevguide.tag
+GENERATE_TAGFILE       = @CMAKE_HOME_DIRECTORY@/doc/shared/doxygen/simgriddevguide.tag
 
 # If the ALLEXTERNALS tag is set to YES all external classes will be listed
 # in the class index. If set to NO only the inherited external classes
index 13f80d9..8b706ce 100644 (file)
@@ -2,7 +2,122 @@
 \page cmake SimGrid Developer Guide - Cmake
 
 \section cmake_dev_guide_src How to add sources?
+
+If you want modified, add or delete source files from a library you have to edit <project/directory>/buildtools/Cmake/DefinePackages.cmake.
+Chose the section you are interested in and modifie it.
+
+\verbatim
+set(SMPI_SRC
+  src/smpi/smpi_base.c
+  src/smpi/smpi_bench.c
+  src/smpi/smpi_c99.c
+  src/smpi/smpi_coll.c
+  src/smpi/smpi_comm.c
+  src/smpi/smpi_global.c
+  src/smpi/smpi_group.c
+  src/smpi/smpi_mpi.c
+  src/smpi/smpi_mpi_dt.c
+  src/smpi/smpi_pmpi.c
+  src/smpi/smpi_replay.c
+  )
+\endverbatim
+
+If source file are a part of an option library (like fortran smpi source) you have to had it in the compiled sources 
+or in the EXTRA_DIST files package which is only copy in the dist. 
+\verbatim
+### If f2c is installed compiled source other-whise source is only copy in the dist 
+if(SMPI_F2C)
+  set(SMPI_SRC
+    ${SMPI_SRC}
+    src/smpi/smpi_f77.c
+    )
+else()
+  set(EXTRA_DIST
+    ${EXTRA_DIST}
+    src/smpi/smpi_f77.c
+  )
+endif()
+\endverbatim
+
 \section cmake_dev_guide_ex How to add examples?
+
+If you want make an example you have to create a CMakeList.txt to the src directory.
+You must specified where to create the executable, source list, dependencies and the name of the binary.
+
+\verbatim
+cmake_minimum_required(VERSION 2.6)
+
+set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
+
+add_executable(Hello Hello.c)
+
+### Add definitions for compile
+target_link_libraries(Hello simgrid)
+
+### You have to put all new files in the apropriated section 
+### If they are not there, they can't be on the dist package. 
+set(tesh_files
+  ${tesh_files}
+  PARENT_SCOPE
+  )
+set(xml_files
+  ${xml_files}
+  PARENT_SCOPE
+  )
+set(examples_src
+  ${examples_src}
+  ${CMAKE_CURRENT_SOURCE_DIR}/Hello.c
+  PARENT_SCOPE
+  )
+set(bin_files
+  ${bin_files}
+  PARENT_SCOPE
+  )
+set(txt_files
+  ${txt_files}
+  PARENT_SCOPE
+  )
+\endverbatim
+
+Then you have to modified :
+\li<project/directory>/buildtools/Cmake/MakeExeLib.cmake and add line:
+\verbatim
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/<path_where_is_CMakeList.txt>)
+\endverbatim
+
+\li <project/directory>/buildtools/Cmake/DefinePackages.cmake to add your CMakeLists to CMAKE_SOURCE_FILES:
+\verbatim
+set(CMAKE_SOURCE_FILES
+  CMakeLists.txt
+  ....
+  <path_where_is_CMakeList.txt>
+  )
+\endverbatim
+
 \section cmake_dev_guide_test How to add tests?
+To add a test in simgrid you have to modify source <project/directory>/buildtools/Cmake/AddTests.cmake. Create a new test with adding this line:
+\li With tesh
+\verbatim
+#  ADD_TEST(test-name ${CMAKE_BINARY_DIR}/bin/tesh <options> <tesh-file>)
+#  option --setenv bindir set the directory containing the binary
+#         --setenv srcdir set the directory containing the source file
+#         --cd set the working directory
+ADD_TEST(my-test-name ${CMAKE_BINARY_DIR}/bin/tesh 
+         --setenv bindir=${CMAKE_BINARY_DIR}/examples/my-test/
+         --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/my-test/
+         --cd ${CMAKE_HOME_DIRECTORY}/examples/my-test/
+         ${CMAKE_HOME_DIRECTORY}/examples/msg/io/io.tesh
+)
+\endverbatim             
 
+\li Without tesh
+\verbatim
+# ADD_TEST(NAME <name>]
+#          [WORKING_DIRECTORY dir]
+#          COMMAND <command> [arg1 [arg2 ...]])
+ADD_TEST(NAME my-test-name 
+         WORKING_DIRECTORY  ${CMAKE_BINARY_DIR}/examples/my-test/
+         COMMAND Hello
+)
+\endverbatim 
 */
index 4aaa6d1..6b601d8 100644 (file)
@@ -53,7 +53,7 @@ $mathjax
       <li><a href="../../ref_guide/html/index.html"><span>Reference&nbsp;Manual</span></a></li>
       <li><a href="../../user_guide/html/index.html"><span>User&nbsp;Guide</span></a></li>
       <li class="current"><a href="index.html"><span>Developer&nbsp;Guide</span></a></li>
-      <li><a href="http://simgrid.gforge.inria.fr/tutorials"><span>Tutorials</span></a></li>
+      <li><a href="http://simgrid.gforge.inria.fr/tutorials.html"><span>Tutorials</span></a></li>
       <li><a href="https://gforge.inria.fr/projects/simgrid"><span>Forge</span></a></li>
       <li><a href="http://simgrid.gforge.inria.fr/"><span>Website</span></a></li>
       <li>$searchbox</li>
index fe5f938..6ad77e3 100644 (file)
@@ -1,5 +1,6 @@
 /*!
-@mainpage SimGrid Developer Guide - Welcome
+@mainpage SimGrid Developer Guide
+
 <center>
 \htmlonly
 <table width="100%">
@@ -20,7 +21,7 @@ Welcome to the SimGrid developer guide.
 
 <br>
 The SimGrid software package can be downloaded from
-<a href="http://simgrid.gforge.inria.fr/download.php">here</a>.<br>
+<a href="http://simgrid.gforge.inria.fr/download.html">here</a>.<br>
 
 If you are interested in the history of SimGrid and in current and planned development,
 you can find out more <a href="http://simgrid.gforge.inria.fr/history.html">here</a>.
diff --git a/doc/dev_guide/doxygen/output.goal.pdf b/doc/dev_guide/doxygen/output.goal.pdf
new file mode 100644 (file)
index 0000000..06e6302
Binary files /dev/null and b/doc/dev_guide/doxygen/output.goal.pdf differ
diff --git a/doc/dev_guide/doxygen/release.doc b/doc/dev_guide/doxygen/release.doc
new file mode 100644 (file)
index 0000000..f228061
--- /dev/null
@@ -0,0 +1,102 @@
+/*! 
+\page release SimGrid Developer Guide - Releasing
+
+\section release_c Releasing the main library
+
+\subsection release_c_preconditions Before releasing
+
+Please apply the following checklist before releasing.
+
+- Sources
+  - The version number is correctly marked in CMakeList.txt, in macros
+    SIMGRID_VERSION_MAJOR and friends. Please also update the
+    comments right before these macros so that we keep a track of the
+    version numbers that were used.
+  - The" make distcheck" target works (testing that every files needed
+    to build and install are included in the archive)
+- Tests
+  - All tests pass on a reasonable amount of platforms (typically,
+    everything on cdash)
+  - You also tested to build and install the content of the source
+    archive on a reasonable amount of platforms (typically, 2 or 3).
+- ChangeLog file
+  - Every changes are documented
+  - The release date is indicated below the changes
+  - The release is marked as stable above the changes
+  - The release dub name matches the one given in NEWS file
+- NEWS
+  - The most notable changes of the version are documented
+  - The release date is indicated right below the version name
+  - The release dub name matches the one given in ChangeLog file
+
+\subsection release_c_source Building the source archive
+
+First, clean up your git repository. Some files are included through
+globbing, you must ensure that your tree contains no cruft. You can
+either checkout a new tree or remove anything from your current tree:
+\verbatim
+$ cd simgrid
+$ git reset --hard master
+$ git clean -dfx
+\endverbatim
+
+You can then build the archive. This gives you your archive in the
+build dir, named 'SimGrid-${release_version}.tar.gz'.
+
+\verbatim
+$ mkdir build
+$ cd build
+$ cmake ..
+$ make dist
+\endverbatim
+
+\subsection release_c_win32 Binary distribution under Win32
+
+You have to install nsis tool first. Download it 
+<a href="http://nsis.sourceforge.net/Download">here</a>.
+
+Then be sure having wget.exe in your path to get the online documentation. You can download it 
+<a href="http://users.ugent.be/~bpuype/wget/">here</a>.
+
+You can finally make the win installer.
+\verbatim
+$ cd simgrid
+$ mkdir build
+$ cd build
+$ cmake ..
+$ make nsis
+\endverbatim
+
+\subsection release_c_postchecks Check list after releasing
+
+- Tag the git repository (don't forget to push the tags to the main
+  repo)
+- Push the archive files on gforge
+- Update the link ff-scm-v4-prod:/home/groups/simgrid/htdocs/simgrid/latest
+- Announce the release
+ - Mail the simgrid-user mailing list
+    - the NEWS chunk in the mail;
+    - the ChangeLog chunk as attachment
+ - Also mail some other lists (G5K users), with only the NEWS chunk
+   and the link to the download section
+
+\section release_bindings Releasing the bindings
+
+Please apply the above checklists before and after releasing the bindings.
+
+Then, clean your git repository and build the archive. It will give
+you an archive file in the build dir:
+'SimGrid-Java-${release_version}.tar.gz' or
+'SimGrid-Ruby-${release_version}.tar.gz'. 
+
+\verbatim
+$ cd simgrid-java (or simgrid-ruby)
+$ git reset --hard master
+$ git clean -dfx
+$ mkdir build
+$ cd build
+$ cmake ..
+$ make dist
+\endverbatim
+
+*/
index a458206..adb6cf3 100644 (file)
@@ -1,7 +1,56 @@
-/*! \page simgrid SimGrid Developer Guide - SimGrid
+/*! 
+\page simgrid SimGrid Developer Guide - SimGrid
+
+We start to put TAGS in simgrid source code for having tutorials to see where is the important parts ans steps to create:
+\li a new MSG functions or a new API.
+\li a new model in surf.
+\li new tags in xml files
 
 \section simgrid_dev_guide_api How to add a new MSG function?
+Search for expression \"TUTORIAL: New API\".
+\verbatim
+user@caraja:~/workspace/simgrid/src$ cg "TUTORIAL: New API"
+ 0 msg/msg_new_api.c             15 /* TUTORIAL: New API*/
+ 1 simix/smx_smurf.c            582 /* TUTORIAL: New API*/
+ 2 simix/smx_smurf.c            616 /* TUTORIAL: New API*/
+ 3 simix/smx_smurf_private.h    102 /* TUTORIAL: New API*/
+ 4 simix/smx_smurf_private.h    629 /* TUTORIAL: New API*/
+ 5 simix/smx_private.h           28 /* TUTORIAL: New API*/
+ 6 simix/smx_private.h          101 /* TUTORIAL: New API*/
+ 7 simix/smx_private.h          182 /* TUTORIAL: New API*/
+ 8 simix/smx_global.c           454 /* TUTORIAL: New API*/
+ 9 simix/smx_new_api.c            8 /* TUTORIAL: New API*/
+10 simix/smx_user.c            1684 /* TUTORIAL: New API*/
+11 simix/smx_new_api_private.h    8 /* TUTORIAL: New API*/
+12 simix/smx_process.c          338 /* TUTORIAL: New API*/
+\endverbatim
+
 \section simgrid_dev_guide_model How to add a new model in surf?
-\section simgrid_dev_guide_tag What is How to add a new tag for xml files?
+Search for expression \"TUTORIAL: New model\".
+\verbatim
+user@caraja:~/workspace/simgrid/src$ cg "TUTORIAL: New model"
+0 surf/new_model_private.h   2 /* TUTORIAL: New model
+1 surf/surf.c              213 /* TUTORIAL: New model*/
+2 surf/surf_config.c       380 /* TUTORIAL: New model*/
+3 surf/surf_config.c       746 /* TUTORIAL: New model*/
+4 surf/new_model.c           8 /* TUTORIAL: New model*/
+5 include/surf/surf.h      157 /* TUTORIAL: New model*/
+6 include/surf/surf.h      345 /* TUTORIAL: New model*/
+7 include/surf/surf.h      661 /* TUTORIAL: New model*/
+\endverbatim
 
+\section simgrid_dev_guide_tag What is How to add a new tag for xml files?
+Search for expression \"TUTORIAL: New TAG\".
+\verbatim
+user@caraja:~/workspace/simgrid/src$ cg "TUTORIAL: New TAG"
+0 surf/sg_platf.c                    43 /* TUTORIAL: New TAG*/
+1 surf/sg_platf.c                    89 /* TUTORIAL: New TAG*/
+2 surf/sg_platf.c                   124 /* TUTORIAL: New TAG*/
+3 surf/sg_platf.c                   337 /* TUTORIAL: New TAG*/
+4 surf/surfxml_parse.c              769 /* TUTORIAL: New TAG*/
+5 surf/surf_private.h               205 /* TUTORIAL: New TAG*/
+6 surf/surfxml_parseplatf.c          64 /* TUTORIAL: New TAG*/
+7 surf/surfxml_parseplatf.c          85 /* TUTORIAL: New TAG*/
+8 include/simgrid/platf_interface.h  42 /* TUTORIAL: New TAG*/
+\endverbatim
 */
index 3d7c7ce..46061d2 100644 (file)
@@ -2,6 +2,273 @@
 \page xps SimGrid Developer Guide - XPs
 
 \section xps_dev_guide_pipol How to run test in pipol?
+
+In order to use PIPOL you have to create your account here: http://pipol.inria.fr/
+
+\subsection xps_dev_guide_pipol_general What is PIPOL?
+
+The PIPOL platform is a porting, testing and compilation cluster. It hosts several hardware and software
+architectures to perform its work. An user can reserve a resource (a specific hardware, an operating system...)
+to be used interactively or automatically (with a "Nightly Builds" system) for software testing.
+
+\subsection xps_dev_guide_pipol_frontend From PIPOL frontend
+
+You first need to be connected into pipol ssh.
+\verbatim
+user@caraja:~$ ssh pipol.inria.fr
+Linux pipol-server 2.6.26-2-amd64 #1 SMP Thu Nov 5 02:23:12 UTC 2009 x86_64
+***************************************************************************
+*           You are just logged-on the PIPOL platform server              *
+*   You can find some documentation about porting works on the platform   *
+*         on the PIPOL's web site: http://pipol.inria.fr/docs/            *
+*   To report bugs you can write to: pipol-sysadm@lists.gforge.inria.fr   *
+***************************************************************************
+
+
+user@pipol:~$
+\endverbatim
+Then you can see pipol images availables for deployment
+
+\verbatim
+user@pipol:~$ pipol-sub si
+    amd64_2010-linux-centos-5.dd.gz
+    amd64_2010-linux-debian-squeeze.dd.gz
+    amd64_2010-linux-debian-testing.dd.gz
+    amd64_2010-linux-fedora-core13.dd.gz
+    amd64_2010-linux-fedora-core14.dd.gz
+    amd64_2010-linux-fedora-core16.dd.gz
+    amd64_2010-linux-ubuntu-lucid.dd.gz
+    amd64_2010-linux-ubuntu-maverick.dd.gz
+    amd64_2010-linux-ubuntu-natty.dd.gz
+    amd64_kvm-linux-debian-lenny
+    amd64_kvm-linux-debian-testing
+    amd64_kvm-windows-7
+    amd64-linux-centos-5.dd.gz
+    amd64-linux-debian-etch.dd.gz
+    amd64-linux-debian-lenny.dd.gz
+....
+    i386-linux-ubuntu-lucid.dd.gz
+    i386-linux-ubuntu-maverick.dd.gz
+    i386-linux-ubuntu-natty.dd.gz
+    i386-linux-ubuntu-precise.dd.gz
+    i386_mac-mac-osx-server-leopard.dd.gz
+    i386-unix-freebsd-7.dd.gz
+    i386-unix-opensolaris-10.dd.gz
+    i386-unix-opensolaris-11.dd.gz
+    i386-unix-solaris-10.dd.gz
+    ia64-linux-debian-lenny.dd
+    ia64-linux-debian-squeeze.dd
+    ia64-linux-fedora-core9.dd
+    ia64-linux-redhatEL-5.0.dd
+    x86_64_mac-mac-osx-server-snow-leopard.dd.gz
+    x86_mac-mac-osx-server-snow-leopard.dd.gz
+\endverbatim
+
+You can also see available architectures on host name:
+\verbatim
+navarro@pipol:~$ pipol-sub sa    
+=================================================================
+                    Availables architectures:         
+=================================================================
+
+pipol18
+:i386_2010:amd64_2010:
+pipol19
+:i386_2010:amd64_2010:
+pipol20
+:i386_2010:amd64_2010:
+pipol1
+:i386:amd64:
+pipol2
+:i386:amd64:
+pipol3
+:i386:amd64:
+pipol4
+:i386:amd64:
+pipol5
+:i386:amd64:
+pipol6
+:i386:amd64:
+pipol7
+:i386:amd64:
+pipol8
+:i386:amd64:
+pipol14
+:i386_kvm:amd64_kvm:
+pipol15
+:i386_kvm:amd64_kvm:
+pipol16
+:i386_kvm:amd64_kvm:
+pipol17
+:i386_kvm:amd64_kvm:
+pipol11
+:i386_mac:x86_mac:
+pipol10
+:ia64:
+pipol9
+:ia64:
+pipol12
+:x86_64_mac:
+\endverbatim
+
+When you have choose your image and host (not necessary) you deploy with command line:
+
+pipol-sub esn \<image name\> \<host-name\> \<deployment-time\>
+\verbatim
+user@pipol:~$pipol-sub esn amd64_2010-linux-ubuntu-maverick.dd.gz pipol20 02:00
+user@pipol:~$ssh pipol20
+\endverbatim
+
+You can now make all your tests.
+
+\subsection xps_dev_guide_pipol_home From a computer
+
+You have to renseign to simgrid configuration your pipol login.
+\verbatim
+$ cmake -Dpipol_user=user .
+\endverbatim
+
+Then you have two kind of command:
+\li make \<image-name\>
+\verbatim
+$ make amd64_2010-linux-ubuntu-maverick
+\endverbatim
+This command copy your local simgrid directory to pipol and execute a configure, make and ctest.
+
+\li make \<image_name\>_experimental
+\verbatim
+$ make amd64_2010-linux-ubuntu-maverick_experimental
+\endverbatim
+Same as previous but report into cdash
+
+You can also see all available images from pipol
+\verbatim
+$ make pipol_test_list_images
+\endverbatim
+
+\section xps_dev_guide_pipol_nightly How to use nightly builds?
+
+All the pipol scripts are located in \"<project/directory>/buildtools/pipol/\".
+If you modifie them you have to update the pipol home directory by using this command: make sync-pipl.
+
+It will copy those files:
+\verbatim
+simgrid@caraja:~/workspace/simgrid/build$ make sync-pipol 
+Update pipol script for user: simgrid
+rc.debian                                       100% 1338     1.3KB/s   00:00    
+rc.fedora                                       100% 1433     1.4KB/s   00:00    
+rc.mac                                          100% 1129     1.1KB/s   00:00    
+rc.ubuntu                                       100% 1875     1.8KB/s   00:00    
+rc.windows                                      100%  494     0.5KB/s   00:00    
+Nightly_simgrid.sh                              100% 4004     3.9KB/s   00:00    
+Experimental_bindings.sh                        100% 1794     1.8KB/s   00:00
+\endverbatim 
+
+\section xps_dev_guide_cdash How to report tests in cdash?
+
+Reporting experiment in cdash is very easy because it is done by ctest.
+
+The easier way is to execute command line "ctest -D Experiemntal" in build directory. More option is available by ctest:
+\verbatim
+  ctest -D Continuous
+  ctest -D Continuous(Start|Update|Configure|Build)
+  ctest -D Continuous(Test|Coverage|MemCheck|Submit)
+  ctest -D Experimental
+  ctest -D Experimental(Start|Update|Configure|Build)
+  ctest -D Experimental(Test|Coverage|MemCheck|Submit)
+  ctest -D Nightly
+  ctest -D Nightly(Start|Update|Configure|Build)
+  ctest -D Nightly(Test|Coverage|MemCheck|Submit)
+  ctest -D NightlyMemoryCheck
+\endverbatim
+
+If you want to have a code coverage, please add option on simgrid.
+\verbatim
+$ cmake -Denable_coverage=ON .
+$ ctest -D ExperimentalStart
+$ ctest -D ExperimentalConfigure
+$ ctest -D ExperimentalBuild
+$ ctest -D ExperimentalTest
+$ ctest -D ExperimentalCoverage
+$ ctest -D ExperimentalSubmit
+\endverbatim
+
 \section xps_dev_guide_g5k How to run simgrid scalability xps?
 
+\subsection xps_dev_guide_g5k_campaign How to execute g5k campaign?
+
+Quick steps deployment for rennes:
+
+\li 1/ Create a G5K account
+
+\li 2/ SSH to a frontend (must be rennes, nancy or toulouse for git protocol)
+
+\li 3/ Install g5k-campaign
+\verbatim
+$ gem install g5k-campaign --source http://g5k-campaign.gforge.inria.fr/pkg -p http://proxy:3128 --no-ri --no-rdoc --user-install
+\endverbatim  
+  
+\li 4/ Configure the API
+\verbatim
+$  mkdir ~/.restfully
+$  echo 'base_uri: https://api.grid5000.fr/stable/grid5000' > ~/.restfully/api.grid5000.fr.yml
+$  chmod 0600 ~/.restfully/api.grid5000.fr.yml
+\endverbatim
+
+\li 5/ Git clone the SimGrid Scalability project
+\verbatim
+$  git clone git://scm.gforge.inria.fr/simgrid/simgrid-scalability-XPs.git
+\endverbatim
+
+\li 6/ Copy the run script into your home
+\verbatim
+$  cp simgrid-scalability-XPs/script-sh/run-g5k-scalab.sh ~/
+\endverbatim
+
+\li 7/ Create the result log directory (must be ~/log/)
+\verbatim
+$  mkdir ~/log
+\endverbatim
+
+\li 8/ Execute the g5k campaign on a revision "rev"
+\verbatim
+$  sh run-g5k-scalab.sh "rev"
+\endverbatim
+
+You can also have more parameters
+
+\li 1/ -> 5/ Same as before
+
+\li 6/ Open simgrid-scalability-XPs
+
+\li 7/ Execute SGXP.pl to see parameters
+\verbatim
+$  perl SGXP.pl --help
+\endverbatim
+
+\li 8/ Execute SGXP.pl with your parameters like
+\verbatim
+$  ./SGXP.pl --site=nancy --cluster=graphene --test=chord,goal --rev="09bbc8de,3ca7b9a13"
+\endverbatim
+
+\subsection xps_dev_guide_g5k_log How to analyze logs?
+
+To analyze log from g5k-campaign you must install R tool.
+
+\li 0/ You can copy logs from g5k to your computer (recommanded)
+
+\li 1/ Open ~/log/
+
+\li 2/ Execute the perl analyzer for goal log
+\verbatim
+$  ~/simgrid-scalability-XPs/libperl/analyzer.pl goal.log.* > goal.csv
+\endverbatim
+
+\li 3/ Execute the R analyer for goal log
+\verbatim
+$  ~/simgrid-scalability-XPs/script-R/goal.R goal.csv output.goal.pdf
+\endverbatim
+
+Example of generated pdf <a href="./output.goal.pdf">here</a>.
+
 */
diff --git a/doc/gras_comm.png b/doc/gras_comm.png
deleted file mode 100644 (file)
index 00d54a1..0000000
Binary files a/doc/gras_comm.png and /dev/null differ
diff --git a/doc/gtut-files/01-bones.c b/doc/gtut-files/01-bones.c
deleted file mode 100644 (file)
index 97fea93..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (c) 2006, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <gras.h>
-
-int client(int argc, char *argv[])
-{
-  gras_init(&argc, argv);
-
-  /* Your own code for the client process */
-
-  gras_exit();
-  return 0;
-}
-
-int server(int argc, char *argv[])
-{
-  gras_init(&argc, argv);
-
-  /* Your own code for the server process */
-
-  gras_exit();
-  return 0;
-}
diff --git a/doc/gtut-files/01-bones.output b/doc/gtut-files/01-bones.output
deleted file mode 100644 (file)
index 1257295..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-$ ./test_client
-[arthur:client:(28729) 0.000011] [gras/INFO] Exiting GRAS
-$ ./test_server
-[arthur:server:(28733) 0.000012] [gras/INFO] Exiting GRAS
-$
-$ ./test_simulator platform.xml test.xml
-[Jacquelin:server:(1) 0.000000] [gras/INFO] Exiting GRAS
-[Boivin:client:(2) 0.000000] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/02-simple.c b/doc/gtut-files/02-simple.c
deleted file mode 100644 (file)
index 269414c..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Copyright (c) 2006, 2007, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdio.h>
-#include <gras.h>
-
-int server(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  gras_socket_t toclient;       /* socket used to write to the client */
-
-  gras_init(&argc, argv);
-
-  gras_msgtype_declare("hello", NULL);
-  mysock = gras_socket_server(12345);
-
-  gras_msg_wait(60, "hello", &toclient, NULL /* no payload */ );
-
-  fprintf(stderr, "Cool, we received the message from %s:%d.\n",
-          gras_socket_peer_name(toclient),
-          gras_socket_peer_port(toclient));
-
-  gras_exit();
-  return 0;
-}
-
-int client(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  gras_socket_t toserver;       /* socket used to write to the server */
-
-  gras_init(&argc, argv);
-
-  gras_msgtype_declare("hello", NULL);
-  mysock = gras_socket_server_range(1024, 10000, 0, 0);
-
-  fprintf(stderr, "Client ready; listening on %d\n",
-          gras_socket_my_port(mysock));
-
-  gras_os_sleep(1.5);           /* sleep 1 second and half */
-  toserver = gras_socket_client("Jacquelin", 12345);
-
-  gras_msg_send(toserver, "hello", NULL);
-  fprintf(stderr, "That's it, we sent the data to the server\n");
-
-  gras_exit();
-  return 0;
-}
diff --git a/doc/gtut-files/02-simple.output b/doc/gtut-files/02-simple.output
deleted file mode 100644 (file)
index 7b961ea..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-$ ./test_simulator platform.xml test.xml
-Client ready; listening on 1024
-That's it, we sent the data to the server
-[Boivin:client:(2) 0.000000] [gras/INFO] Exiting GRAS
-Cool, we received the message from Boivin:1024.
-[Jacquelin:server:(1) 0.000000] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/03-args.c b/doc/gtut-files/03-args.c
deleted file mode 100644 (file)
index 06d6f1a..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Copyright (c) 2006, 2007, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdio.h>
-#include <gras.h>
-
-int server(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  gras_socket_t toclient;       /* socket used to write to the client */
-
-  gras_init(&argc, argv);
-
-  gras_msgtype_declare("hello", NULL);
-  mysock = gras_socket_server(atoi(argv[1]));
-
-  gras_msg_wait(60, "hello", &toclient, NULL /* no payload */ );
-
-  fprintf(stderr, "Cool, we received the message from %s:%d.\n",
-          gras_socket_peer_name(toclient),
-          gras_socket_peer_port(toclient));
-
-  gras_exit();
-  return 0;
-}
-
-int client(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  gras_socket_t toserver;       /* socket used to write to the server */
-
-  gras_init(&argc, argv);
-
-  gras_msgtype_declare("hello", NULL);
-  mysock = gras_socket_server_range(1024, 10000, 0, 0);
-
-  fprintf(stderr, "Client ready; listening on %d\n",
-          gras_socket_my_port(mysock));
-
-  gras_os_sleep(1.5);           /* sleep 1 second and half */
-  toserver = gras_socket_client(argv[1], atoi(argv[2]));
-
-  gras_msg_send(toserver, "hello", NULL);
-  fprintf(stderr, "That's it, we sent the data to the server on %s\n",
-          gras_socket_peer_name(toserver));
-
-  gras_exit();
-  return 0;
-}
diff --git a/doc/gtut-files/03-args.output b/doc/gtut-files/03-args.output
deleted file mode 100644 (file)
index 498ea45..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-$ ./test_server 12345 & ./test_client 127.0.0.1 12345
-Client ready; listening on 1024
-That's it, we sent the data to the server on 127.0.0.1
-[arthur:client:(27443) 0.000018] [gras/INFO] Exiting GRAS
-Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27441) 0.000012] [gras/INFO] Exiting GRAS
-$
-$ ./test_simulator platform.xml test.xml
-Client ready; listening on 1024
-That's it, we sent the data to the server on Jacquelin
-[Boivin:client:(2) 0.000000] [gras/INFO] Exiting GRAS
-Cool, we received the message from Boivin:1024.
-[Jacquelin:server:(1) 0.000000] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/03-args.xml b/doc/gtut-files/03-args.xml
deleted file mode 100644 (file)
index b8ad263..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Jacquelin" function="server">
-    <argument value="12345"/>
-  </process>
-  <process host="Boivin" function="client">
-    <argument value="Jacquelin"/>
-    <argument value="12345"/>
-  </process>
-</platform>
-
diff --git a/doc/gtut-files/04-callback.c b/doc/gtut-files/04-callback.c
deleted file mode 100644 (file)
index 1e4c45f..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Copyright (c) 2006, 2007, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdio.h>
-#include <gras.h>
-
-int server_hello_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  gras_socket_t client = gras_msg_cb_ctx_from(ctx);
-
-  fprintf(stderr, "Cool, we received the message from %s:%d.\n",
-          gras_socket_peer_name(client), gras_socket_peer_port(client));
-
-  return 0;
-}                               /* end_of_callback */
-
-int server(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-
-  gras_init(&argc, argv);
-
-  gras_msgtype_declare("hello", NULL);
-  mysock = gras_socket_server(atoi(argv[1]));
-
-  gras_cb_register("hello", &server_hello_cb);
-  gras_msg_handle(60);
-
-  gras_exit();
-  return 0;
-}
-
-int client(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  gras_socket_t toserver;       /* socket used to write to the server */
-
-  gras_init(&argc, argv);
-
-  gras_msgtype_declare("hello", NULL);
-  mysock = gras_socket_server_range(1024, 10000, 0, 0);
-
-  fprintf(stderr, "Client ready; listening on %d\n",
-          gras_socket_my_port(mysock));
-
-  gras_os_sleep(1.5);           /* sleep 1 second and half */
-  toserver = gras_socket_client(argv[1], atoi(argv[2]));
-
-  gras_msg_send(toserver, "hello", NULL);
-  fprintf(stderr, "That's it, we sent the data to the server on %s\n",
-          gras_socket_peer_name(toserver));
-
-  gras_exit();
-  return 0;
-}
diff --git a/doc/gtut-files/04-callback.output b/doc/gtut-files/04-callback.output
deleted file mode 100644 (file)
index 880ab77..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-$ ./test_server 23451 & ./test_client 127.0.0.1 23451
-Client ready; listening on 1024
-That's it, we sent the data to the server on 127.0.0.1
-[arthur:client:(27507) 0.000019] [gras/INFO] Exiting GRAS
-Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27505) 0.000013] [gras/INFO] Exiting GRAS
-$
-$ ./test_simulator platform.xml test.xml
-Client ready; listening on 1024
-That's it, we sent the data to the server on Jacquelin
-[Boivin:client:(2) 0.000000] [gras/INFO] Exiting GRAS
-Cool, we received the message from Boivin:1024.
-[Jacquelin:server:(1) 0.000000] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/05-globals.c b/doc/gtut-files/05-globals.c
deleted file mode 100644 (file)
index 4751176..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdio.h>
-#include <gras.h>
-
-typedef struct {
-  int killed;
-} server_data_t;
-
-
-int server_kill_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  gras_socket_t client = gras_msg_cb_ctx_from(ctx);
-  server_data_t *globals = (server_data_t *) gras_userdata_get();
-
-  fprintf(stderr, "Argh, killed by %s:%d! Bye folks...\n",
-          gras_socket_peer_name(client), gras_socket_peer_port(client));
-
-  globals->killed = 1;
-
-  return 0;
-}                               /* end_of_kill_callback */
-
-int server_hello_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  gras_socket_t client = gras_msg_cb_ctx_from(ctx);
-
-  fprintf(stderr, "Cool, we received the message from %s:%d.\n",
-          gras_socket_peer_name(client), gras_socket_peer_port(client));
-
-  return 0;
-}                               /* end_of_hello_callback */
-
-int server(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  server_data_t *globals;
-
-  gras_init(&argc, argv);
-
-  globals = gras_userdata_new(server_data_t);
-  globals->killed = 0;
-
-  gras_msgtype_declare("hello", NULL);
-  gras_msgtype_declare("kill", NULL);
-  mysock = gras_socket_server(atoi(argv[1]));
-
-  gras_cb_register("hello", &server_hello_cb);
-  gras_cb_register("kill", &server_kill_cb);
-
-  while (!globals->killed) {
-    gras_msg_handle(-1);        /* blocking */
-  }
-
-  gras_exit();
-  return 0;
-}
-
-int client(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  gras_socket_t toserver;       /* socket used to write to the server */
-
-  gras_init(&argc, argv);
-
-  gras_msgtype_declare("hello", NULL);
-  gras_msgtype_declare("kill", NULL);
-  mysock = gras_socket_server_range(1024, 10000, 0, 0);
-
-  fprintf(stderr, "Client ready; listening on %d\n",
-          gras_socket_my_port(mysock));
-
-  gras_os_sleep(1.5);           /* sleep 1 second and half */
-  toserver = gras_socket_client(argv[1], atoi(argv[2]));
-
-  gras_msg_send(toserver, "hello", NULL);
-  fprintf(stderr,
-          "we sent the data to the server on %s. Let's do it again for fun\n",
-          gras_socket_peer_name(toserver));
-  gras_msg_send(toserver, "hello", NULL);
-
-  fprintf(stderr, "Ok. Enough. Have a rest, and then kill the server\n");
-  gras_os_sleep(5);             /* sleep 1 second and half */
-  gras_msg_send(toserver, "kill", NULL);
-
-  gras_exit();
-  return 0;
-}
diff --git a/doc/gtut-files/05-globals.output b/doc/gtut-files/05-globals.output
deleted file mode 100644 (file)
index 6ed9de7..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-$ ./test_server 12345 & ./test_client 127.0.0.1 12345
-Client ready; listening on 1024
-we sent the data to the server on 127.0.0.1. Let's do it again for fun
-Ok. Enough. Have a rest, and then kill the server
-Cool, we received the message from 127.0.0.1:1024.
-Cool, we received the message from 127.0.0.1:1024.
-[arthur:client:(28822) 0.000027] [gras/INFO] Exiting GRAS
-Argh, killed by 127.0.0.1:1024! Bye folks...
-[arthur:server:(28820) 0.000013] [gras/INFO] Exiting GRAS
-$
-$ ./test_simulator platform.xml test.xml
-Client ready; listening on 1024
-we sent the data to the server on Jacquelin. Let's do it again for fun
-Cool, we received the message from Boivin:1024.
-Ok. Enough. Have a rest, and then kill the server
-Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 0.000000] [gras/INFO] Exiting GRAS
-Argh, killed by Boivin:1024! Bye folks...
-[Jacquelin:server:(1) 0.000000] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/06-logs.c b/doc/gtut-files/06-logs.c
deleted file mode 100644 (file)
index 6de6602..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Copyright (c) 2006, 2007, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <gras.h>
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(test, "My little example");
-
-typedef struct {
-  int killed;
-} server_data_t;
-
-
-int server_kill_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  gras_socket_t client = gras_msg_cb_ctx_from(ctx);
-  server_data_t *globals = (server_data_t *) gras_userdata_get();
-
-  XBT_CRITICAL("Argh, killed by %s:%d! Bye folks...",
-            gras_socket_peer_name(client), gras_socket_peer_port(client));
-
-  globals->killed = 1;
-
-  return 0;
-}                               /* end_of_kill_callback */
-
-int server_hello_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  gras_socket_t client = gras_msg_cb_ctx_from(ctx);
-
-  XBT_INFO("Cool, we received the message from %s:%d.",
-        gras_socket_peer_name(client), gras_socket_peer_port(client));
-
-  return 0;
-}                               /* end_of_hello_callback */
-
-int server(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  server_data_t *globals;
-
-  gras_init(&argc, argv);
-
-  globals = gras_userdata_new(server_data_t *);
-  globals->killed = 0;
-
-  gras_msgtype_declare("hello", NULL);
-  gras_msgtype_declare("kill", NULL);
-  mysock = gras_socket_server(atoi(argv[1]));
-
-  gras_cb_register("hello", &server_hello_cb);
-  gras_cb_register("kill", &server_kill_cb);
-
-  while (!globals->killed) {
-    gras_msg_handle(-1);        /* blocking */
-  }
-
-  gras_exit();
-  return 0;
-}
-
-int client(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  gras_socket_t toserver;       /* socket used to write to the server */
-
-  gras_init(&argc, argv);
-
-  gras_msgtype_declare("hello", NULL);
-  gras_msgtype_declare("kill", NULL);
-  mysock = gras_socket_server_range(1024, 10000, 0, 0);
-
-  XBT_VERB("Client ready; listening on %d", gras_socket_my_port(mysock));
-
-  gras_os_sleep(1.5);           /* sleep 1 second and half */
-  toserver = gras_socket_client(argv[1], atoi(argv[2]));
-
-  gras_msg_send(toserver, "hello", NULL);
-  XBT_INFO("we sent the data to the server on %s. Let's do it again for fun",
-        gras_socket_peer_name(toserver));
-  gras_msg_send(toserver, "hello", NULL);
-
-  XBT_INFO("Ok. Enough. Have a rest, and then kill the server");
-  gras_os_sleep(5);             /* sleep 1 second and half */
-  gras_msg_send(toserver, "kill", NULL);
-
-  gras_exit();
-  return 0;
-}
diff --git a/doc/gtut-files/06-logs.output b/doc/gtut-files/06-logs.output
deleted file mode 100644 (file)
index 97565d1..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-$ ./test_server 12345 & ./test_client 127.0.0.1 12345
-[arthur:client:(27755) 0.000016] [test/INFO] we sent the data to the server on 127.0.0.1. Let's do it again for fun
-[arthur:client:(27755) 0.000148] [test/INFO] Ok. Enough. Have a rest, and then kill the server
-[arthur:client:(27755) 5.000415] [gras/INFO] Exiting GRAS
-[arthur:server:(27752) 0.000010] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27752) 0.000409] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27752) 5.001363] test.c:15: [test/CRITICAL] Argh, killed by 127.0.0.1:1024! Bye folks...
-[arthur:server:(27752) 5.001409] [gras/INFO] Exiting GRAS
-$
-$ ./test_simulator platform.xml test.xml
-[Boivin:client:(2) 0.000000] [test/INFO] we sent the data to the server on Jacquelin. Let's do it again for fun
-[Jacquelin:server:(1) 0.000000] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 0.000537] [test/INFO] Ok. Enough. Have a rest, and then kill the server
-[Jacquelin:server:(1) 0.000537] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 5.001074] [gras/INFO] Exiting GRAS
-[Jacquelin:server:(1) 5.001074] test.c:15: [test/CRITICAL] Argh, killed by Boivin:1024! Bye folks...
-[Jacquelin:server:(1) 5.001074] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/06-logs.output.error b/doc/gtut-files/06-logs.output.error
deleted file mode 100644 (file)
index 3052af8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-$ ./test_server 12345 --log=root.thres:error & ./test_client 127.0.0.1 12345 --log=root.thres:error
-[arthur:server:(27705) 0.000024] test.c:15: [test/CRITICAL] Argh, killed by 127.0.0.1:1024! Bye folks...
-$
-$ ./test_simulator platform.xml test.xml --log=root.thres:error
-[Jacquelin:server:(1) 0.000000] test.c:15: [test/CRITICAL] Argh, killed by Boivin:1024! Bye folks...
-$
diff --git a/doc/gtut-files/06-logs.output.fmt b/doc/gtut-files/06-logs.output.fmt
deleted file mode 100644 (file)
index 712efb2..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-$ ./test_server 12345 --log=test.fmt:%m%n & ./test_client 127.0.0.1 12345 --log=test.fmt:%m%n
-Cool, we received the message from 127.0.0.1:1024.
-nCool, we received the message from 127.0.0.1:1024.
-nArgh, killed by 127.0.0.1:1024! Bye folks...
-n[arthur:server:(27630) 0.000011] [gras/INFO] Exiting GRAS
-we sent the data to the server on 127.0.0.1. Let's do it again for fun
-Ok. Enough. Have a rest, and then kill the server
-[arthur:client:(27634) 0.000019] [gras/INFO] Exiting GRAS
-$
-$ ./test_simulator platform.xml test.xml --log=test.fmt:%m%n
-we sent the data to the server on Jacquelin. Let's do it again for fun
-Cool, we received the message from Boivin:1024.
-Ok. Enough. Have a rest, and then kill the server
-Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 0.000000] [gras/INFO] Exiting GRAS
-Argh, killed by Boivin:1024! Bye folks...
-[Jacquelin:server:(1) 0.000000] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/06-logs.output.fmt-bt b/doc/gtut-files/06-logs.output.fmt-bt
deleted file mode 100644 (file)
index cebafc3..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-$ ./test_server 12345 --log=test.fmt:"[%r] %m%n%b%n%n" & ./test_client 127.0.0.1 12345 --log=test.fmt:"[%r] %m%n%b%n%n"
-$
-$ ./test_simulator platform.xml test.xml --log=test.fmt:[%r]%m%n%b%n%n
-$
diff --git a/doc/gtut-files/06-logs.output.verbose b/doc/gtut-files/06-logs.output.verbose
deleted file mode 100644 (file)
index 42a8db8..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-$ ./test_server 12345 --log=test.thres:verbose & ./test_client 127.0.0.1 12345 --log=test.thres:verbose
-[arthur:client:(27681) 0.000012] test.c:65: [test/VERBOSE] Client ready; listening on 1024
-[arthur:client:(27681) 1.500865] [test/INFO] we sent the data to the server on 127.0.0.1. Let's do it again for fun
-[arthur:client:(27681) 1.500972] [test/INFO] Ok. Enough. Have a rest, and then kill the server
-[arthur:client:(27681) 6.501225] [gras/INFO] Exiting GRAS
-[arthur:server:(27677) 0.000015] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27677) 0.000144] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27677) 5.000244] test.c:15: [test/CRITICAL] Argh, killed by 127.0.0.1:1024! Bye folks...
-[arthur:server:(27677) 5.000296] [gras/INFO] Exiting GRAS
-$
-$ ./test_simulator platform.xml test.xml --log=test.thres:verbose
-[Boivin:client:(2) 0.000000] test.c:65: [test/VERBOSE] Client ready; listening on 1024
-[Boivin:client:(2) 1.500552] [test/INFO] we sent the data to the server on Jacquelin. Let's do it again for fun
-[Jacquelin:server:(1) 1.500552] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 1.501089] [test/INFO] Ok. Enough. Have a rest, and then kill the server
-[Jacquelin:server:(1) 1.501089] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 6.501626] [gras/INFO] Exiting GRAS
-[Jacquelin:server:(1) 6.501626] test.c:15: [test/CRITICAL] Argh, killed by Boivin:1024! Bye folks...
-[Jacquelin:server:(1) 6.501626] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/07-timers.c b/doc/gtut-files/07-timers.c
deleted file mode 100644 (file)
index 202f76c..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <gras.h>
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(test, "My little example");
-
-/* *********************** Server *********************** */
-typedef struct {
-  int killed;
-} server_data_t;
-
-int server_kill_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  gras_socket_t client = gras_msg_cb_ctx_from(ctx);
-  server_data_t *globals = (server_data_t *) gras_userdata_get();
-
-  XBT_CRITICAL("Argh, killed by %s:%d! Bye folks...",
-            gras_socket_peer_name(client), gras_socket_peer_port(client));
-
-  globals->killed = 1;
-
-  return 0;
-}                               /* end_of_kill_callback */
-
-int server_hello_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  gras_socket_t client = gras_msg_cb_ctx_from(ctx);
-
-  XBT_INFO("Cool, we received the message from %s:%d.",
-        gras_socket_peer_name(client), gras_socket_peer_port(client));
-
-  return 0;
-}                               /* end_of_hello_callback */
-
-int server(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  server_data_t *globals;
-
-  gras_init(&argc, argv);
-
-  globals = gras_userdata_new(server_data_t *);
-  globals->killed = 0;
-
-  gras_msgtype_declare("hello", NULL);
-  gras_msgtype_declare("kill", NULL);
-  mysock = gras_socket_server(atoi(argv[1]));
-
-  gras_cb_register("hello", &server_hello_cb);
-  gras_cb_register("kill", &server_kill_cb);
-
-  while (!globals->killed) {
-    gras_msg_handle(60);
-  }
-
-  gras_exit();
-  return 0;
-}
-
-/* *********************** Client *********************** */
-/* client_data */
-typedef struct {
-  gras_socket_t toserver;
-  int done;
-} client_data_t;
-
-
-void client_do_hello(void)
-{
-  client_data_t *globals = (client_data_t *) gras_userdata_get();
-
-  gras_msg_send(globals->toserver, "hello", NULL);
-  XBT_INFO("Hello sent to server");
-}                               /* end_of_client_do_hello */
-
-void client_do_stop(void)
-{
-  client_data_t *globals = (client_data_t *) gras_userdata_get();
-
-  gras_msg_send(globals->toserver, "kill", NULL);
-  XBT_INFO("Kill sent to server");
-
-  gras_timer_cancel_repeat(0.5, client_do_hello);
-
-  globals->done = 1;
-  XBT_INFO("Break the client's while loop");
-}                               /* end_of_client_do_stop */
-
-int client(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  client_data_t *globals;
-
-  gras_init(&argc, argv);
-
-  gras_msgtype_declare("hello", NULL);
-  gras_msgtype_declare("kill", NULL);
-  mysock = gras_socket_server_range(1024, 10000, 0, 0);
-
-  XBT_VERB("Client ready; listening on %d", gras_socket_my_port(mysock));
-
-  globals = gras_userdata_new(client_data_t *);
-  globals->done = 0;
-
-  gras_os_sleep(1.5);           /* sleep 1 second and half */
-  globals->toserver = gras_socket_client(argv[1], atoi(argv[2]));
-
-  XBT_INFO("Programming the repetitive action with a frequency of 0.5 sec");
-  gras_timer_repeat(0.5, client_do_hello);
-
-  XBT_INFO("Programming the delayed action in 5 secs");
-  gras_timer_delay(5, client_do_stop);
-
-  while (!globals->done) {
-    gras_msg_handle(60);
-  }
-
-  gras_exit();
-  return 0;
-}
diff --git a/doc/gtut-files/07-timers.output b/doc/gtut-files/07-timers.output
deleted file mode 100644 (file)
index d71db4c..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-$ ./test_server 12345 & ./test_client 127.0.0.1 12345
-[arthur:client:(27825) 0.000016] [test/INFO] Programming the repetitive action with a frequency of 0.5 sec
-[arthur:client:(27825) 0.000125] [test/INFO] Programming the delayed action in 5 secs
-[arthur:client:(27825) 0.500685] [test/INFO] Hello sent to server
-[arthur:client:(27825) 1.000855] [test/INFO] Hello sent to server
-[arthur:client:(27825) 1.501094] [test/INFO] Hello sent to server
-[arthur:client:(27825) 2.001261] [test/INFO] Hello sent to server
-[arthur:client:(27825) 2.501446] [test/INFO] Hello sent to server
-[arthur:client:(27825) 3.001591] [test/INFO] Hello sent to server
-[arthur:client:(27825) 3.501798] [test/INFO] Hello sent to server
-[arthur:client:(27825) 4.002111] [test/INFO] Hello sent to server
-[arthur:client:(27825) 4.502264] [test/INFO] Hello sent to server
-[arthur:client:(27825) 5.000513] [test/INFO] Kill sent to server
-[arthur:client:(27825) 5.000562] [test/INFO] Break the client's while loop
-[arthur:client:(27825) 5.000594] [gras/INFO] Exiting GRAS
-[arthur:server:(27821) 0.000014] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27821) 0.500134] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27821) 1.000349] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27821) 1.500519] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27821) 2.000788] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27821) 2.500996] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27821) 3.001083] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27821) 3.501370] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27821) 4.001514] [test/INFO] Cool, we received the message from 127.0.0.1:1024.
-[arthur:server:(27821) 4.499772] test.c:15: [test/CRITICAL] Argh, killed by 127.0.0.1:1024! Bye folks...
-[arthur:server:(27821) 4.499823] [gras/INFO] Exiting GRAS
-$
-$ ./test_simulator platform.xml test.xml
-[Boivin:client:(2) 0.000000] [test/INFO] Programming the repetitive action with a frequency of 0.5 sec
-[Boivin:client:(2) 0.000000] [test/INFO] Programming the delayed action in 5 secs
-[Boivin:client:(2) 0.500537] [test/INFO] Hello sent to server
-[Jacquelin:server:(1) 0.500537] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 1.000537] [test/INFO] Hello sent to server
-[Jacquelin:server:(1) 1.000537] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 1.500537] [test/INFO] Hello sent to server
-[Jacquelin:server:(1) 1.500537] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 2.000537] [test/INFO] Hello sent to server
-[Jacquelin:server:(1) 2.000537] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 2.500537] [test/INFO] Hello sent to server
-[Jacquelin:server:(1) 2.500537] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 3.000537] [test/INFO] Hello sent to server
-[Jacquelin:server:(1) 3.000537] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 3.500537] [test/INFO] Hello sent to server
-[Jacquelin:server:(1) 3.500537] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 4.000537] [test/INFO] Hello sent to server
-[Jacquelin:server:(1) 4.000537] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 4.500537] [test/INFO] Hello sent to server
-[Jacquelin:server:(1) 4.500537] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 5.000537] [test/INFO] Hello sent to server
-[Jacquelin:server:(1) 5.000537] [test/INFO] Cool, we received the message from Boivin:1024.
-[Boivin:client:(2) 5.001074] [test/INFO] Kill sent to server
-[Boivin:client:(2) 5.001074] [test/INFO] Break the client's while loop
-[Boivin:client:(2) 5.001074] [gras/INFO] Exiting GRAS
-[Jacquelin:server:(1) 5.001074] test.c:15: [test/CRITICAL] Argh, killed by Boivin:1024! Bye folks...
-[Jacquelin:server:(1) 5.001074] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/08-exceptions.c b/doc/gtut-files/08-exceptions.c
deleted file mode 100644 (file)
index d419342..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/* Copyright (c) 2006, 2007, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <gras.h>
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(test, "My little example");
-
-typedef struct {
-  int killed;
-} server_data_t;
-
-
-int server_kill_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  gras_socket_t client = gras_msg_cb_ctx_from(ctx);
-  server_data_t *globals = (server_data_t *) gras_userdata_get();
-
-  XBT_CRITICAL("Argh, killed by %s:%d! Bye folks, I'm out of here...",
-            gras_socket_peer_name(client), gras_socket_peer_port(client));
-
-  globals->killed = 1;
-
-  return 0;
-}                               /* end_of_kill_callback */
-
-int server(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  server_data_t *globals;
-
-  gras_init(&argc, argv);
-
-  globals = gras_userdata_new(server_data_t *);
-  globals->killed = 0;
-
-  gras_msgtype_declare("kill", NULL);
-  gras_cb_register("kill", &server_kill_cb);
-
-  if (argc > 1 && !strcmp(argv[1], "--cheat")) {
-    mysock = gras_socket_server(9999);
-    XBT_INFO("Hi! hi! I'm not in the search range, but in 9999...");
-  } else {
-    mysock = gras_socket_server((rand() % 10) + 3000);
-    XBT_INFO("Ok, I'm hidden on port %d. Hope for the best.",
-          gras_socket_my_port(mysock));
-  }
-
-  while (!globals->killed) {
-    gras_msg_handle(-1);        /* blocking */
-  }
-
-  gras_exit();
-  return 0;
-}
-
-int client(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  gras_socket_t toserver;       /* socket used to write to the server */
-  int found;                    /* whether we found peer */
-  int port;                     /* where we think that the server is */
-  xbt_ex_t e;
-
-  gras_init(&argc, argv);
-
-  gras_msgtype_declare("kill", NULL);
-  mysock = gras_socket_server_range(1024, 10000, 0, 0);
-
-  XBT_VERB("Run little server, run. I'll get you. (sleep 1.5 sec)");
-  gras_os_sleep(1.5);
-
-  for (port = 3000, found = 0; port < 3010 && !found; port++) {
-    TRY {
-      toserver = gras_socket_client(argv[1], port);
-      gras_msg_send(toserver, "kill", NULL);
-      gras_socket_close(toserver);
-      found = 1;
-      XBT_INFO("Yeah! I found the server on %d! It's eradicated by now.",
-            port);
-    }
-    CATCH(e) {
-      xbt_ex_free(e);
-    }
-    if (!found)
-      XBT_INFO("Damn, the server is not on %d", port);
-  }                             /* end_of_loop */
-
-  if (!found)
-    THROWF(not_found_error, 0,
-           "Damn, I failed to find the server! I cannot survive this humilliation.");
-
-
-  gras_exit();
-  return 0;
-}
diff --git a/doc/gtut-files/08-exceptions.output b/doc/gtut-files/08-exceptions.output
deleted file mode 100644 (file)
index 3da7114..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-$ ./test_server & ./test_client 127.0.0.1 
-[arthur:client:(27889) 0.000013] [test/INFO] Damn, the server is not on 3000
-[arthur:client:(27889) 0.000729] [test/INFO] Yeah! I found the server on 3001! It's eradicated by now.
-[arthur:client:(27889) 0.000767] [gras/INFO] Exiting GRAS
-[arthur:server:(27886) 0.000013] [test/INFO] Ok, I'm hidden on port 3001. Hope for the best.
-[arthur:server:(27886) 1.500772] test.c:15: [test/CRITICAL] Argh, killed by 127.0.0.1:1024! Bye folks, I'm out of here...
-[arthur:server:(27886) 1.500819] [gras/INFO] Exiting GRAS
-$
-$ ./test_server --cheat & ./test_client 127.0.0.1 
-[arthur:client:(27901) 0.000014] [test/INFO] Damn, the server is not on 3000
-[arthur:client:(27901) 0.000240] [test/INFO] Damn, the server is not on 3001
-[arthur:client:(27901) 0.000386] [test/INFO] Damn, the server is not on 3002
-[arthur:client:(27901) 0.000532] [test/INFO] Damn, the server is not on 3003
-[arthur:client:(27901) 0.000671] [test/INFO] Damn, the server is not on 3004
-[arthur:client:(27901) 0.000815] [test/INFO] Damn, the server is not on 3005
-[arthur:client:(27901) 0.000960] [test/INFO] Damn, the server is not on 3006
-[arthur:client:(27901) 0.001100] [test/INFO] Damn, the server is not on 3007
-[arthur:client:(27901) 0.001257] [test/INFO] Damn, the server is not on 3008
-[arthur:client:(27901) 0.001396] [test/INFO] Damn, the server is not on 3009
-** SimGrid: UNCAUGHT EXCEPTION received on arthur(27901): category: not found; value: 0
-** Damn, I failed to find the server! I cannot survive this humilliation.
-** Thrown by client() in this process
-[arthur:client:(27901) 0.001475] xbt/ex.c:113: [xbt_ex/CRITICAL] Damn, I failed to find the server! I cannot survive this humilliation.
-
-**   In client() at /home/mquinson/Code/simgrid-git/doc/gtut-files/test.c:80
-$ killall test_server
-[arthur:server:(27897) 0.000014] [test/INFO] Hi! hi! I'm not in the search range, but in 9999...
-$
-$ ./test_simulator platform.xml test.xml
-[Jacquelin:server:(1) 0.000000] [test/INFO] Ok, I'm hidden on port 3000. Hope for the best.
-[Boivin:client:(2) 1.500552] [test/INFO] Yeah! I found the server on 3000! It's eradicated by now.
-[Boivin:client:(2) 1.500552] [gras/INFO] Exiting GRAS
-[Jacquelin:server:(1) 1.500552] test.c:15: [test/CRITICAL] Argh, killed by Boivin:1024! Bye folks, I'm out of here...
-[Jacquelin:server:(1) 1.500552] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/09-datatype-dump.c b/doc/gtut-files/09-datatype-dump.c
deleted file mode 100644 (file)
index 8124064..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright (c) 2006, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <gras.h>
-#include <stdio.h>
-
-/* We must set this to make logging mecanism happy */
-extern const char *_gras_procname;
-
-/* This is a private data of gras/Datadesc we want to explore */
-xbt_set_t gras_datadesc_set_local = NULL;
-
-int main(int argc, char *argv[])
-{
-  xbt_set_elm_t elm;
-  xbt_set_cursor_t cursor;
-  gras_init(&argc, argv);
-
-  xbt_set_foreach(gras_datadesc_set_local, cursor, elm) {
-    printf("%s\n", elm->name);
-  }
-
-
-  gras_exit();
-  return 0;
-}
diff --git a/doc/gtut-files/09-simpledata.c b/doc/gtut-files/09-simpledata.c
deleted file mode 100644 (file)
index 29c24c0..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/* Copyright (c) 2006, 2007, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <gras.h>
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(test, "My little example");
-
-typedef struct {
-  int killed;
-} server_data_t;
-
-
-int server_kill_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  double delay = *(double *) payload;
-  gras_socket_t client = gras_msg_cb_ctx_from(ctx);
-  server_data_t *globals = (server_data_t *) gras_userdata_get();
-
-  XBT_CRITICAL("Argh, %s:%d gave me %.2f seconds before suicide!",
-            gras_socket_peer_name(client), gras_socket_peer_port(client),
-            delay);
-  gras_os_sleep(delay);
-  XBT_CRITICAL("Bye folks...");
-
-
-  globals->killed = 1;
-
-  return 0;
-}                               /* end_of_kill_callback */
-
-int server_hello_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  char *msg = *(char **) payload;
-  gras_socket_t client = gras_msg_cb_ctx_from(ctx);
-
-  XBT_INFO("Cool, we received a message from %s:%d. Here it is: \"%s\"",
-        gras_socket_peer_name(client), gras_socket_peer_port(client), msg);
-
-  return 0;
-}                               /* end_of_hello_callback */
-
-void message_declaration(void)
-{
-  gras_msgtype_declare("kill", gras_datadesc_by_name("double"));
-  gras_msgtype_declare("hello", gras_datadesc_by_name("string"));
-}
-
-
-int server(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  server_data_t *globals;
-
-  gras_init(&argc, argv);
-
-  globals = gras_userdata_new(server_data_t *);
-  globals->killed = 0;
-
-  message_declaration();
-  mysock = gras_socket_server(atoi(argv[1]));
-
-  gras_cb_register("hello", &server_hello_cb);
-  gras_cb_register("kill", &server_kill_cb);
-
-  while (!globals->killed) {
-    gras_msg_handle(-1);        /* blocking */
-  }
-
-  gras_exit();
-  return 0;
-}
-
-int client(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  gras_socket_t toserver;       /* socket used to write to the server */
-
-  gras_init(&argc, argv);
-
-  message_declaration();
-  mysock = gras_socket_server_range(1024, 10000, 0, 0);
-
-  XBT_VERB("Client ready; listening on %d", gras_socket_my_port(mysock));
-
-  gras_os_sleep(1.5);           /* sleep 1 second and half */
-  toserver = gras_socket_client(argv[1], atoi(argv[2]));
-
-  char *hello_payload = "Nice to meet you";
-  gras_msg_send(toserver, "hello", &hello_payload);
-  XBT_INFO("we sent the hello to the server on %s.",
-        gras_socket_peer_name(toserver));
-
-  double kill_payload = 0.5;
-  gras_msg_send(toserver, "kill", &kill_payload);
-  XBT_INFO("Gave the server more 0.5 second to live");
-
-  gras_exit();
-  return 0;
-}
diff --git a/doc/gtut-files/09-simpledata.output b/doc/gtut-files/09-simpledata.output
deleted file mode 100644 (file)
index 2465493..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-$ ./test_server 12345 & ./test_client 127.0.0.1 12345
-[arthur:client:(27970) 0.000025] [test/INFO] we sent the hello to the server on 127.0.0.1.
-[arthur:client:(27970) 0.000124] [test/INFO] Gave the server more 0.5 second to live
-[arthur:client:(27970) 0.000152] [gras/INFO] Exiting GRAS
-[arthur:server:(27967) 0.000013] [test/INFO] Cool, we received a message from 127.0.0.1:1024. Here it is: "Nice to meet you"
-[arthur:server:(27967) 0.000105] test.c:16: [test/CRITICAL] Argh, 127.0.0.1:1024 gave me 0.50 seconds before suicide!
-[arthur:server:(27967) 0.500236] test.c:18: [test/CRITICAL] Bye folks...
-[arthur:server:(27967) 0.500303] [gras/INFO] Exiting GRAS
-$
-$ ./test_simulator platform.xml test.xml
-[Boivin:client:(2) 0.000000] [test/INFO] we sent the hello to the server on Jacquelin.
-[Jacquelin:server:(1) 0.000000] [test/INFO] Cool, we received a message from Boivin:1024. Here it is: "Nice to meet you"
-[Boivin:client:(2) 0.000539] [test/INFO] Gave the server more 0.5 second to live
-[Boivin:client:(2) 0.000539] [gras/INFO] Exiting GRAS
-[Jacquelin:server:(1) 0.000539] test.c:16: [test/CRITICAL] Argh, Boivin:1024 gave me 0.50 seconds before suicide!
-[Jacquelin:server:(1) 0.500539] test.c:18: [test/CRITICAL] Bye folks...
-[Jacquelin:server:(1) 0.500539] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/10-rpc.c b/doc/gtut-files/10-rpc.c
deleted file mode 100644 (file)
index bc01cbf..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdlib.h>
-#include <gras.h>
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(test, "My little example");
-
-typedef struct {
-  int done;
-} server_data_t;
-int server_done_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  server_data_t *globals = (server_data_t *) gras_userdata_get();
-  globals->done = 1;
-  XBT_INFO("Server done");
-
-  return 0;
-}                               /* end_of_done_callback */
-
-void message_declaration(void)
-{
-  gras_msgtype_declare_rpc("convert a2i", gras_datadesc_by_name("string"),
-                           gras_datadesc_by_name("long"));
-  gras_msgtype_declare_rpc("convert i2a", gras_datadesc_by_name("long"),
-                           gras_datadesc_by_name("string"));
-
-  /* the other message allowing the client to stop the server after use */
-  gras_msgtype_declare("done", NULL);
-}
-
-int server_convert_i2a_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  long data = *(long *) payload;
-  char *result;
-  char *p;
-
-  XBT_INFO("Convert %ld to string", data);
-  result = bprintf("%ld", data);
-  XBT_INFO("%ld converted to string: %s", data, result);
-
-  gras_msg_rpcreturn(60, ctx, &result);
-  free(result);
-  return 0;
-}                               /* end_of_convert_callback */
-
-int server_convert_a2i_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  char *string = *(char **) payload;
-  long result;
-  char *p;
-
-  XBT_INFO("Convert %s to long", string);
-  result = strtol(string, &p, 10);
-
-  if (*p != '\0')
-    THROWF(arg_error, 0,
-           "Error while converting %s: this does not seem to be a valid number (problem at '%s')",
-           string, p);
-
-  gras_msg_rpcreturn(60, ctx, &result);
-  return 0;
-}                               /* end_of_convert_callback */
-
-
-int server(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  server_data_t *globals;
-
-  gras_init(&argc, argv);
-
-  globals = gras_userdata_new(server_data_t *);
-  globals->done = 0;
-
-  message_declaration();
-  mysock = gras_socket_server(atoi(argv[1]));
-
-  gras_cb_register("convert a2i", &server_convert_a2i_cb);
-  gras_cb_register("convert i2a", &server_convert_i2a_cb);
-  gras_cb_register("done", &server_done_cb);
-
-  while (!globals->done) {
-    gras_msg_handle(-1);        /* blocking */
-  }
-
-  gras_exit();
-  return 0;
-}
-
-int client(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  gras_socket_t toserver;       /* socket used to write to the server */
-
-  gras_init(&argc, argv);
-
-  message_declaration();
-  mysock = gras_socket_server_range(1024, 10000, 0, 0);
-
-  XBT_VERB("Client ready; listening on %d", gras_socket_my_port(mysock));
-
-  gras_os_sleep(1.5);           /* sleep 1 second and half */
-  toserver = gras_socket_client(argv[1], atoi(argv[2]));
-
-  long long_to_convert = 4321;
-  char *string_result;
-  XBT_INFO("Ask to convert %ld", long_to_convert);
-  gras_msg_rpccall(toserver, 60, "convert i2a", &long_to_convert,
-                   &string_result);
-  XBT_INFO("The server says that %ld is equal to \"%s\".", long_to_convert,
-        string_result);
-  free(string_result);
-
-  char *string_to_convert = "1234";
-  long long_result;
-  XBT_INFO("Ask to convert %s", string_to_convert);
-  gras_msg_rpccall(toserver, 60, "convert a2i", &string_to_convert,
-                   &long_result);
-  XBT_INFO("The server says that \"%s\" is equal to %d.", string_to_convert,
-        long_result);
-
-  xbt_ex_t e;
-  string_to_convert = "azerty";
-  TRY {
-    gras_msg_rpccall(toserver, 60, "convert a2i", &string_to_convert,
-                     &long_result);
-  }
-  CATCH(e) {
-    XBT_INFO
-        ("The server refuses to convert %s. Here is the received exception:",
-         string_to_convert);
-    xbt_ex_display(&e);
-    xbt_ex_free(e);
-    XBT_INFO("Again, previous exception was excepted");
-  }
-
-  gras_msg_send(toserver, "done", NULL);
-  XBT_INFO("Stopped the server");
-
-  gras_exit();
-  return 0;
-}
diff --git a/doc/gtut-files/10-rpc.output b/doc/gtut-files/10-rpc.output
deleted file mode 100644 (file)
index e77826b..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-$ ./test_server & ./test_client 127.0.0.1 
-[arthur:server:(12832) 0.000013] [test/INFO] Convert 4321 to string
-[arthur:server:(12832) 0.000128] [test/INFO] 4321 converted to string: 4321
-[arthur:server:(12832) 0.003889] [test/INFO] Convert 1234 to long
-[arthur:server:(12832) 0.008356] [test/INFO] Convert azerty to long
-[arthur:server:(12832) 0.053995] [gras_msg/INFO] Propagate local exception ('Error while converting azerty: this does not seem to be a valid number (problem at 'azerty')') from 'convert a2i' RPC cb back to 127.0.0.1:1024
-** SimGrid: UNCAUGHT EXCEPTION received on arthur(12832): category: invalid_arg; value: 0
-** Error while converting azerty: this does not seem to be a valid number (problem at 'azerty')
-** Thrown by server() in this process
-[arthur:server:(12832) 0.054088] xbt/ex.c:113: [xbt_ex/CRITICAL] Error while converting azerty: this does not seem to be a valid number (problem at 'azerty')
-
-**   In server_convert_a2i_cb() at /home/mquinson/Code/simgrid-git/doc/gtut-files/test.c:48
-**   In gras_msg_handle() at /home/mquinson/Code/simgrid-git/src/gras/Msg/gras_msg_exchange.c:400
-**   In server() at /home/mquinson/Code/simgrid-git/doc/gtut-files/test.c:71
-[arthur:server:(12832) 0.055022] [test/INFO] Server done
-[arthur:server:(12832) 0.055063] [gras/INFO] Exiting GRAS
-[arthur:client:(12837) 0.000025] [test/INFO] Ask to convert 4321
-[arthur:client:(12837) 0.004416] [test/INFO] The server says that 4321 is equal to "4321".
-[arthur:client:(12837) 0.004468] [test/INFO] Ask to convert 1234
-[arthur:client:(12837) 0.008930] [test/INFO] The server says that "1234" is equal to 1234.
-[arthur:client:(12837) 0.055412] [test/INFO] The server refuses to convert azerty. Here is the received exception:
-** SimGrid: UNCAUGHT EXCEPTION received on arthur(12837): category: invalid_arg; value: 0
-** Error while converting azerty: this does not seem to be a valid number (problem at 'azerty')
-** Thrown by server() on host arthur(12832)
-[arthur:client:(12837) 0.055505] xbt/ex.c:113: [xbt_ex/CRITICAL] Error while converting azerty: this does not seem to be a valid number (problem at 'azerty')
-
-**   In server_convert_a2i_cb() at /home/mquinson/Code/simgrid-git/doc/gtut-files/test.c:48
-**   In gras_msg_handle() at /home/mquinson/Code/simgrid-git/src/gras/Msg/gras_msg_exchange.c:400
-**   In server() at /home/mquinson/Code/simgrid-git/doc/gtut-files/test.c:71
-[arthur:client:(12837) 0.055564] [test/INFO] Again, previous exception was excepted
-[arthur:client:(12837) 0.056367] [test/INFO] Stopped the server
-[arthur:client:(12837) 0.056404] [gras/INFO] Exiting GRAS
-$
-$ killall test_server
-$
-$ ./test_simulator platform.xml test.xml
-[Boivin:client:(2) 0.000000] [test/INFO] Ask to convert 4321
-[Jacquelin:server:(1) 0.000538] [test/INFO] Convert 4321 to string
-[Jacquelin:server:(1) 0.000538] [test/INFO] 4321 converted to string: 4321
-[Boivin:client:(2) 0.001077] [test/INFO] The server says that 4321 is equal to "4321".
-[Boivin:client:(2) 0.001077] [test/INFO] Ask to convert 1234
-[Jacquelin:server:(1) 0.001615] [test/INFO] Convert 1234 to long
-[Boivin:client:(2) 0.002153] [test/INFO] The server says that "1234" is equal to 1234.
-[Jacquelin:server:(1) 0.002692] [test/INFO] Convert azerty to long
-[Jacquelin:server:(1) 0.002692] [gras_msg/INFO] Propagate local exception ('Error while converting azerty: this does not seem to be a valid number (problem at 'azerty')') from 'convert a2i' RPC cb back to Boivin:1024
-** SimGrid: UNCAUGHT EXCEPTION received on Jacquelin(1): category: invalid_arg; value: 0
-** Error while converting azerty: this does not seem to be a valid number (problem at 'azerty')
-** Thrown by server() in this process
-[Jacquelin:server:(1) 0.002692] xbt/ex.c:113: [xbt_ex/CRITICAL] Error while converting azerty: this does not seem to be a valid number (problem at 'azerty')
-
-**   In server_convert_a2i_cb() at /home/mquinson/Code/simgrid-git/doc/gtut-files/test.c:48
-**   In gras_msg_handle() at /home/mquinson/Code/simgrid-git/src/gras/Msg/gras_msg_exchange.c:400
-**   In server() at /home/mquinson/Code/simgrid-git/doc/gtut-files/test.c:71
-**   In xbt_ctx_sysv_stop() at /home/mquinson/Code/simgrid-git/src/xbt/xbt_context_sysv.c:257
-**   In makecontext() at ??:0
-**   In update_actions_state() at /home/mquinson/Code/simgrid-git/src/surf/surf_timer.c:108
-**   In surf_solve() at /home/mquinson/Code/simgrid-git/src/surf/surf.c:543
-**   In SIMIX_solve() at /home/mquinson/Code/simgrid-git/src/simix/smx_global.c:347
-**   In gras_main() at /home/mquinson/Code/simgrid-git/src/gras/Virtu/sg_process.c:222
-[Boivin:client:(2) 0.003490] [test/INFO] The server refuses to convert azerty. Here is the received exception:
-** SimGrid: UNCAUGHT EXCEPTION received on Boivin(2): category: invalid_arg; value: 0
-** Error while converting azerty: this does not seem to be a valid number (problem at 'azerty')
-** Thrown by server() on host Jacquelin(1)
-[Boivin:client:(2) 0.003490] xbt/ex.c:113: [xbt_ex/CRITICAL] Error while converting azerty: this does not seem to be a valid number (problem at 'azerty')
-
-**   In server_convert_a2i_cb() at /home/mquinson/Code/simgrid-git/doc/gtut-files/test.c:48
-**   In gras_msg_handle() at /home/mquinson/Code/simgrid-git/src/gras/Msg/gras_msg_exchange.c:400
-**   In server() at /home/mquinson/Code/simgrid-git/doc/gtut-files/test.c:71
-**   In xbt_ctx_sysv_stop() at /home/mquinson/Code/simgrid-git/src/xbt/xbt_context_sysv.c:257
-**   In makecontext() at ??:0
-**   In update_actions_state() at /home/mquinson/Code/simgrid-git/src/surf/surf_timer.c:108
-**   In surf_solve() at /home/mquinson/Code/simgrid-git/src/surf/surf.c:543
-**   In SIMIX_solve() at /home/mquinson/Code/simgrid-git/src/simix/smx_global.c:347
-**   In gras_main() at /home/mquinson/Code/simgrid-git/src/gras/Virtu/sg_process.c:222
-[Boivin:client:(2) 0.003490] [test/INFO] Again, previous exception was excepted
-[Boivin:client:(2) 0.004027] [test/INFO] Stopped the server
-[Boivin:client:(2) 0.004027] [gras/INFO] Exiting GRAS
-[Jacquelin:server:(1) 0.004027] [test/INFO] Server done
-[Jacquelin:server:(1) 0.004027] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/11-explicitwait.c b/doc/gtut-files/11-explicitwait.c
deleted file mode 100644 (file)
index f13c7e9..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/* Copyright (c) 2007, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdlib.h>
-#include <gras.h>
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(test, "My little example");
-
-void message_declaration(void)
-{
-  gras_msgtype_declare("request", NULL);
-  gras_msgtype_declare("grant", NULL);
-  gras_msgtype_declare("release", NULL);
-}
-
-typedef struct {
-  int process_in_CS;
-  xbt_dynar_t waiting_queue;
-} server_data_t;
-
-int server_request_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  server_data_t *globals = (server_data_t *) gras_userdata_get();
-  gras_socket_t s = gras_msg_cb_ctx_from(ctx);
-
-  if (globals->process_in_CS) {
-    xbt_dynar_push(globals->waiting_queue, &s);
-    XBT_INFO("put %s:%d in waiting queue", gras_socket_peer_name(s),
-          gras_socket_peer_port(s));
-  } else {
-    globals->process_in_CS = 1;
-    XBT_INFO("grant %s:%d since nobody wanted it", gras_socket_peer_name(s),
-          gras_socket_peer_port(s));
-    gras_msg_send(s, "grant", NULL);
-  }
-  return 0;
-}                               /* end_of_request_callback */
-
-int server_release_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  server_data_t *globals = (server_data_t *) gras_userdata_get();
-
-  if (!xbt_dynar_is_empty(globals->waiting_queue)) {
-    gras_socket_t s;
-    xbt_dynar_pop(globals->waiting_queue, &s);
-
-    XBT_INFO("grant %s:%d since token released", gras_socket_peer_name(s),
-          gras_socket_peer_port(s));
-    gras_msg_send(s, "grant", NULL);
-  } else {
-    globals->process_in_CS = 0;
-  }
-
-  return 0;
-}                               /* end_of_release_callback */
-
-int server(int argc, char *argv[])
-{
-  gras_socket_t mysock;         /* socket on which I listen */
-  server_data_t *globals;
-  int i;
-
-  gras_init(&argc, argv);
-  mysock = gras_socket_server(atoi(argv[1]));
-
-  globals = gras_userdata_new(server_data_t);
-  globals->process_in_CS = 0;
-  globals->waiting_queue =
-      xbt_dynar_new(sizeof(gras_socket_t),
-                    NULL /* not closing sockets */ );
-
-  message_declaration();
-  gras_cb_register("request", &server_request_cb);
-  gras_cb_register("release", &server_release_cb);
-
-  for (i = 0; i < 20; i++)      /* 5 requests of each process, 2 processes, 2 messages per request */
-    gras_msg_handle(-1);
-
-  gras_exit();
-  return 0;
-}                               /* end_of_server */
-
-void lock(gras_socket_t toserver)
-{
-  gras_msg_send(toserver, "request", NULL);
-  gras_msg_wait(-1, "grant", NULL, NULL);
-  XBT_INFO("Granted by server");
-}                               /* end_of_lock */
-
-void unlock(gras_socket_t toserver)
-{
-  XBT_INFO("Release the token");
-  gras_msg_send(toserver, "release", NULL);
-}                               /* end_of_unlock */
-
-int client(int argc, char *argv[])
-{
-  int i;
-  gras_socket_t mysock;         /* socket on which I listen */
-  gras_socket_t toserver;       /* socket used to write to the server */
-
-  gras_init(&argc, argv);
-
-  mysock = gras_socket_server_range(1024, 10000, 0, 0);
-
-  XBT_VERB("Client ready; listening on %d", gras_socket_my_port(mysock));
-
-  gras_os_sleep(1.5);           /* sleep 1 second and half */
-  message_declaration();
-  toserver = gras_socket_client(argv[1], atoi(argv[2]));
-
-  for (i = 0; i < 5; i++) {
-    gras_os_sleep(0.1);
-    lock(toserver);
-    gras_os_sleep(0.1);
-    unlock(toserver);
-  }
-  gras_exit();
-  return 0;
-}
diff --git a/doc/gtut-files/11-explicitwait.output b/doc/gtut-files/11-explicitwait.output
deleted file mode 100644 (file)
index 5f24d07..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-$ ./test_server & ./test_client 127.0.0.1 12345 & ./test_client 127.0.0.1 12345 
-[arthur:server:(28159) 0.000023] [test/INFO] grant 127.0.0.1:1024 since nobody wanted it
-[arthur:client:(28160) 0.000013] [test/INFO] Granted by server
-[arthur:server:(28159) 0.014750] [test/INFO] put 127.0.0.1:1025 in waiting queue
-[arthur:client:(28160) 0.100254] [test/INFO] Release the token
-[arthur:server:(28159) 0.100950] [test/INFO] grant 127.0.0.1:1025 since token released
-[arthur:client:(28162) 0.000014] [test/INFO] Granted by server
-[arthur:server:(28159) 0.201146] [test/INFO] put 127.0.0.1:1024 in waiting queue
-[arthur:client:(28162) 0.100169] [test/INFO] Release the token
-[arthur:server:(28159) 0.201593] [test/INFO] grant 127.0.0.1:1024 since token released
-[arthur:client:(28160) 0.201472] [test/INFO] Granted by server
-[arthur:client:(28160) 0.301560] [test/INFO] Release the token
-[arthur:server:(28159) 0.302114] [test/INFO] put 127.0.0.1:1025 in waiting queue
-[arthur:server:(28159) 0.302172] [test/INFO] grant 127.0.0.1:1025 since token released
-[arthur:client:(28162) 0.201166] [test/INFO] Granted by server
-[arthur:server:(28159) 0.402342] [test/INFO] put 127.0.0.1:1024 in waiting queue
-[arthur:client:(28162) 0.301265] [test/INFO] Release the token
-[arthur:server:(28159) 0.402687] [test/INFO] grant 127.0.0.1:1024 since token released
-[arthur:client:(28160) 0.402605] [test/INFO] Granted by server
-[arthur:server:(28159) 0.503013] [test/INFO] put 127.0.0.1:1025 in waiting queue
-[arthur:client:(28160) 0.502739] [test/INFO] Release the token
-[arthur:server:(28159) 0.503260] [test/INFO] grant 127.0.0.1:1025 since token released
-[arthur:client:(28162) 0.402236] [test/INFO] Granted by server
-[arthur:server:(28159) 0.603517] [test/INFO] put 127.0.0.1:1024 in waiting queue
-[arthur:client:(28162) 0.502304] [test/INFO] Release the token
-[arthur:server:(28159) 0.603699] [test/INFO] grant 127.0.0.1:1024 since token released
-[arthur:client:(28160) 0.603564] [test/INFO] Granted by server
-[arthur:client:(28160) 0.703651] [test/INFO] Release the token
-[arthur:server:(28159) 0.704098] [test/INFO] put 127.0.0.1:1025 in waiting queue
-[arthur:server:(28159) 0.704146] [test/INFO] grant 127.0.0.1:1025 since token released
-[arthur:client:(28162) 0.603133] [test/INFO] Granted by server
-[arthur:server:(28159) 0.804385] [test/INFO] put 127.0.0.1:1024 in waiting queue
-[arthur:client:(28162) 0.703226] [test/INFO] Release the token
-[arthur:server:(28159) 0.804647] [test/INFO] grant 127.0.0.1:1024 since token released
-[arthur:client:(28160) 0.804530] [test/INFO] Granted by server
-[arthur:client:(28160) 0.904608] [test/INFO] Release the token
-[arthur:server:(28159) 0.905011] [test/INFO] put 127.0.0.1:1025 in waiting queue
-[arthur:client:(28160) 0.904749] [gras/INFO] Exiting GRAS
-[arthur:server:(28159) 0.905159] [test/INFO] grant 127.0.0.1:1025 since token released
-[arthur:client:(28162) 0.804870] [test/INFO] Granted by server
-[arthur:client:(28162) 0.905010] [test/INFO] Release the token
-[arthur:client:(28162) 0.905181] [gras/INFO] Exiting GRAS
-[arthur:server:(28159) 1.007620] [gras/INFO] Exiting GRAS
-$
-$
-$ ./test_simulator platform-3nodes.xml test.xml
-[Jacquelin:server:(1) 0.000000] [test/INFO] grant Boivin:1024 since nobody wanted it
-[Jacquelin:server:(1) 0.000537] [test/INFO] put Geoff:1024 in waiting queue
-[Boivin:client:(2) 0.000537] [test/INFO] Granted by server
-[Boivin:client:(2) 0.100537] [test/INFO] Release the token
-[Jacquelin:server:(1) 0.101074] [test/INFO] grant Geoff:1024 since token released
-[Geoff:client:(3) 0.101264] [test/INFO] Granted by server
-[Geoff:client:(3) 0.201264] [test/INFO] Release the token
-[Jacquelin:server:(1) 0.201611] [test/INFO] put Boivin:1024 in waiting queue
-[Jacquelin:server:(1) 0.201801] [test/INFO] grant Boivin:1024 since token released
-[Boivin:client:(2) 0.202338] [test/INFO] Granted by server
-[Jacquelin:server:(1) 0.301991] [test/INFO] put Geoff:1024 in waiting queue
-[Boivin:client:(2) 0.302338] [test/INFO] Release the token
-[Jacquelin:server:(1) 0.302875] [test/INFO] grant Geoff:1024 since token released
-[Geoff:client:(3) 0.303065] [test/INFO] Granted by server
-[Geoff:client:(3) 0.403065] [test/INFO] Release the token
-[Jacquelin:server:(1) 0.403412] [test/INFO] put Boivin:1024 in waiting queue
-[Jacquelin:server:(1) 0.403602] [test/INFO] grant Boivin:1024 since token released
-[Boivin:client:(2) 0.404139] [test/INFO] Granted by server
-[Jacquelin:server:(1) 0.503792] [test/INFO] put Geoff:1024 in waiting queue
-[Boivin:client:(2) 0.504139] [test/INFO] Release the token
-[Jacquelin:server:(1) 0.504675] [test/INFO] grant Geoff:1024 since token released
-[Geoff:client:(3) 0.504865] [test/INFO] Granted by server
-[Geoff:client:(3) 0.604865] [test/INFO] Release the token
-[Jacquelin:server:(1) 0.605212] [test/INFO] put Boivin:1024 in waiting queue
-[Jacquelin:server:(1) 0.605402] [test/INFO] grant Boivin:1024 since token released
-[Boivin:client:(2) 0.605939] [test/INFO] Granted by server
-[Jacquelin:server:(1) 0.705592] [test/INFO] put Geoff:1024 in waiting queue
-[Boivin:client:(2) 0.705939] [test/INFO] Release the token
-[Jacquelin:server:(1) 0.706476] [test/INFO] grant Geoff:1024 since token released
-[Geoff:client:(3) 0.706666] [test/INFO] Granted by server
-[Geoff:client:(3) 0.806666] [test/INFO] Release the token
-[Jacquelin:server:(1) 0.807013] [test/INFO] put Boivin:1024 in waiting queue
-[Jacquelin:server:(1) 0.807203] [test/INFO] grant Boivin:1024 since token released
-[Boivin:client:(2) 0.807740] [test/INFO] Granted by server
-[Jacquelin:server:(1) 0.907393] [test/INFO] put Geoff:1024 in waiting queue
-[Boivin:client:(2) 0.907740] [test/INFO] Release the token
-[Boivin:client:(2) 0.908277] [gras/INFO] Exiting GRAS
-[Jacquelin:server:(1) 0.908277] [test/INFO] grant Geoff:1024 since token released
-[Geoff:client:(3) 0.908467] [test/INFO] Granted by server
-[Geoff:client:(3) 1.008467] [test/INFO] Release the token
-[Geoff:client:(3) 1.008657] [gras/INFO] Exiting GRAS
-[Jacquelin:server:(1) 1.008657] [gras/INFO] Exiting GRAS
-$
diff --git a/doc/gtut-files/11-explicitwait.xml b/doc/gtut-files/11-explicitwait.xml
deleted file mode 100644 (file)
index bb94d69..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Jacquelin" function="server">
-    <argument value="12345"/>
-  </process>
-  <process host="Boivin" function="client">
-    <argument value="Jacquelin"/>
-    <argument value="12345"/>
-  </process>
-  <process host="Geoff" function="client">
-    <argument value="Jacquelin"/>
-    <argument value="12345"/>
-  </process>
-</platform>
-
diff --git a/doc/gtut-files/Makefile b/doc/gtut-files/Makefile
deleted file mode 100644 (file)
index 6b602ef..0000000
+++ /dev/null
@@ -1,331 +0,0 @@
-# This works mainly on my box for now
-export LD_LIBRARY_PATH=$(GRAS_ROOT)/lib
-GRAS_STUB_GENERATOR=$(GRAS_ROOT)/bin/gras_stub_generator
-
-all: 01-bones.output 02-simple.output 03-args.output 04-callback.output \
-     05-globals.output 06-logs.output 07-timers.output 08-exceptions.output \
-     09-simpledata.output 10-rpc.output 11-explicitwait.output
-
-veryclean: clean
-       rm *.output*
-
-# Lesson 01: simple bones of project
-########################################
-
-01-bones.output: 01-bones_client 01-bones_server 01-bones_simulator
-       echo '$$ ./test_client'                           > $@ 
-       ./01-bones_client                                 >> $@ 2>&1
-       echo '$$ ./test_server'                          >> $@
-       ./01-bones_server                                 >> $@ 2>&1
-       echo '$$'                                        >> $@ 
-       echo '$$ ./test_simulator platform.xml test.xml' >> $@ 
-       ./01-bones_simulator gtut-platform.xml test.xml   >> $@ 2>&1
-       echo '$$'                                        >> $@ 
-
-01-bones_client 01-bones_server 01-bones_simulator: _01-bones_client.c _01-bones_server.c _01-bones_simulator.c
-       make -f 01-bones.mk
-
-_01-bones_client.c _01-bones_server.c _01-bones_simulator.c: 01-bones.c test.xml
-       $(GRAS_STUB_GENERATOR) 01-bones test.xml >/dev/null
-
-clean::
-       if [ -e 01-bones.mk ] ; then make -f 01-bones.mk clean; fi
-       rm -f _01-bones_client.c _01-bones_server.c _01-bones_simulator.c 01-bones.trace 01-bones.mk
-
-# Lesson 02: simple message exchange
-########################################
-
-02-simple.output: 02-simple_client 02-simple_server 02-simple_simulator
-       echo '$$ ./test_simulator platform.xml test.xml'  > $@
-       ./02-simple_simulator gtut-platform.xml test.xml  >> $@ 2>&1
-       echo '$$'                                        >> $@ 
-
-02-simple_client 02-simple_server 02-simple_simulator: _02-simple_client.c _02-simple_server.c _02-simple_simulator.c
-       make -f 02-simple.mk
-
-_02-simple_client.c _02-simple_server.c _02-simple_simulator.c: 02-simple.c test.xml
-       $(GRAS_STUB_GENERATOR) 02-simple test.xml >/dev/null
-
-clean::
-       if [ -e 02-simple.mk ] ; then make -f 02-simple.mk clean; fi
-       rm -f _02-simple_client.c _02-simple_server.c _02-simple_simulator.c 02-simple.trace 02-simple.mk
-
-# Lesson 03: passing args to processes
-########################################
-
-03-args.output: 03-args_client 03-args_server 03-args_simulator
-       echo '$$ ./test_server 12345 & ./test_client 127.0.0.1 12345'  > $@ 
-       ./03-args_server 12345                                         >> $@ 2>&1&
-       ./03-args_client 127.0.0.1 12345                               >> $@ 2>&1
-       sleep 1
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform.xml test.xml'              >> $@
-       ./03-args_simulator gtut-platform.xml 03-args.xml               >> $@ 2>&1
-       echo '$$'                                                     >> $@ 
-       killall 03-args_server 03-args_client 2>/dev/null || true
-
-03-args_client 03-args_server 03-args_simulator: _03-args_client.c _03-args_server.c _03-args_simulator.c
-       make -f 03-args.mk
-
-_03-args_client.c _03-args_server.c _03-args_simulator.c: 03-args.c 03-args.xml
-       $(GRAS_STUB_GENERATOR) 03-args 03-args.xml >/dev/null
-
-clean::
-       if [ -e 03-args.mk ] ; then make -f 03-args.mk clean; fi
-       rm -f _03-args_client.c _03-args_server.c _03-args_simulator.c 03-args.trace 03-args.mk
-
-# Lesson 4: callbacks
-########################################
-
-04-callback.output: 04-callback_client 04-callback_server 04-callback_simulator
-       echo '$$ ./test_server 23451 & ./test_client 127.0.0.1 23451'  > $@ 
-       ./04-callback_server 23451                                     >> $@ 2>&1&
-       ./04-callback_client 127.0.0.1 23451                           >> $@ 2>&1
-       sleep 1
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform.xml test.xml'              >> $@
-       ./04-callback_simulator gtut-platform.xml 03-args.xml           >> $@ 2>&1
-       echo '$$'                                                     >> $@
-       killall 04-callback_server 04-callback_client 2>/dev/null || true
-
-04-callback_client 04-callback_server 04-callback_simulator: _04-callback_client.c _04-callback_server.c _04-callback_simulator.c
-       make -f 04-callback.mk
-
-_04-callback_client.c _04-callback_server.c _04-callback_simulator.c: 04-callback.c 03-args.xml
-       $(GRAS_STUB_GENERATOR) 04-callback 03-args.xml >/dev/null
-
-clean::
-       if [ -e 04-callback.mk ] ; then make -f 04-callback.mk clean; fi
-       rm -f _04-callback_client.c _04-callback_server.c _04-callback_simulator.c 04-callback.trace 04-callback.mk
-
-# Lesson 5: globals
-########################################
-
-05-globals.output: 05-globals_client 05-globals_server 05-globals_simulator
-       echo '$$ ./test_server 12345 & ./test_client 127.0.0.1 12345'  > $@ 
-       ./05-globals_server 12345                                      >> $@ 2>&1&
-       ./05-globals_client 127.0.0.1 12345                            >> $@ 2>&1
-       sleep 1
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform.xml test.xml'              >> $@
-       ./05-globals_simulator gtut-platform.xml 03-args.xml            >> $@ 2>&1
-       echo '$$'                                                     >> $@ 
-       killall 05-globals_server 05-globals_client 2>/dev/null || true
-
-05-globals_client 05-globals_server 05-globals_simulator: _05-globals_client.c _05-globals_server.c _05-globals_simulator.c
-       make -f 05-globals.mk
-
-_05-globals_client.c _05-globals_server.c _05-globals_simulator.c: 05-globals.c 03-args.xml
-       $(GRAS_STUB_GENERATOR) 05-globals 03-args.xml >/dev/null
-
-clean::
-       if [ -e 05-globals.mk ] ; then make -f 05-globals.mk clean; fi
-       rm -f _05-globals_client.c _05-globals_server.c _05-globals_simulator.c 05-globals.trace 05-globals.mk
-
-# Lesson 6: logs
-########################################
-
-06-logs.output: 06-logs_client 06-logs_server 06-logs_simulator \
-        06-logs.output.fmt 06-logs.output.fmt-bt 06-logs.output.verbose 06-logs.output.error
-       echo '$$ ./test_server 12345 & ./test_client 127.0.0.1 12345'  > $@ 
-       ./06-logs_server 12345                             2>&1 |sed s/06-logs/test/  >> $@ 2>&1&
-       ./06-logs_client 127.0.0.1 12345                   2>&1 |sed s/06-logs/test/  >> $@ 2>&1
-       sleep 1
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform.xml test.xml'              >> $@
-       ./06-logs_simulator gtut-platform.xml 03-args.xml   2>&1 |sed s/06-logs/test/  >> $@ 2>&1
-       echo '$$'                                                     >> $@ 
-       killall 06-logs_server 06-logs_client 2>/dev/null || true
-
-06-logs.output.fmt: 06-logs_client 06-logs_server 06-logs_simulator 
-       echo '$$ ./test_server 12345 --log=test.fmt:%m%n & ./test_client 127.0.0.1 12345 --log=test.fmt:%m%n'  > $@
-       ./06-logs_server 12345  --log=test.fmt:%m%nn          2>&1 |sed s/06-logs/test/  >> $@ 2>&1&
-       ./06-logs_client 127.0.0.1 12345 --log=test.fmt:%m%n 2>&1 |sed s/06-logs/test/  >> $@ 2>&1
-       sleep 1
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform.xml test.xml --log=test.fmt:%m%n'              >> $@
-       ./06-logs_simulator gtut-platform.xml 03-args.xml  --log=test.fmt:%m%n 2>&1 |sed s/06-logs/test/  >> $@ 2>&1
-       echo '$$'                                                     >> $@ 
-       killall 06-logs_server 06-logs_client 2>/dev/null || true
-
-06-logs.output.fmt-bt: 06-logs_client 06-logs_server 06-logs_simulator 
-       echo '$$ ./test_server 12345 --log=test.fmt:"[%r] %m%n%b%n%n" & ./test_client 127.0.0.1 12345 --log=test.fmt:"[%r] %m%n%b%n%n"'  > $@
-       ./06-logs_server 12345  --log=test.fmt:[%r]%m%n%b%n%n          2>&1 |sed s/06-logs/test/  >> $@ 2>&1&
-       ./06-logs_client 127.0.0.1 12345 --log=test.fmt:[%r]%m%n%b%n%n 2>&1 |sed s/06-logs/test/  >> $@ 2>&1
-       sleep 1
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform.xml test.xml --log=test.fmt:[%r]%m%n%b%n%n'              >> $@
-       ./06-logs_simulator gtut-platform.xml 03-args.xml  --log=test.fmt:[%r]%m%n%b%n%n 2>&1 |sed s/06-logs/test/  >> $@ 2>&1
-       echo '$$'                                                     >> $@ 
-       killall 06-logs_server 06-logs_client 2>/dev/null || true
-
-06-logs.output.verbose: 06-logs_client 06-logs_server 06-logs_simulator
-       echo '$$ ./test_server 12345 --log=test.thres:verbose & ./test_client 127.0.0.1 12345 --log=test.thres:verbose'  > $@
-       ./06-logs_server 12345 --log=test.thres:verbose                            2>&1 |sed s/06-logs/test/  >> $@ 2>&1&
-       ./06-logs_client 127.0.0.1 12345 --log=test.thres:verbose                  2>&1 |sed s/06-logs/test/  >> $@ 2>&1
-       sleep 1
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform.xml test.xml --log=test.thres:verbose'              >> $@
-       ./06-logs_simulator gtut-platform.xml 03-args.xml --log=test.thres:verbose  2>&1 |sed s/06-logs/test/  >> $@ 2>&1
-       echo '$$'                                                     >> $@ 
-       killall 06-logs_server 06-logs_client 2>/dev/null || true
-
-06-logs.output.error: 06-logs_client 06-logs_server 06-logs_simulator
-       echo '$$ ./test_server 12345 --log=root.thres:error & ./test_client 127.0.0.1 12345 --log=root.thres:error'  > $@
-       ./06-logs_server 12345 --log=root.thres:error                            2>&1 |sed s/06-logs/test/  >> $@ 2>&1&
-       ./06-logs_client 127.0.0.1 12345 --log=root.thres:error                  2>&1 |sed s/06-logs/test/  >> $@ 2>&1
-       sleep 1
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform.xml test.xml --log=root.thres:error'              >> $@
-       ./06-logs_simulator gtut-platform.xml 03-args.xml --log=root.thres:error  2>&1 |sed s/06-logs/test/  >> $@ 2>&1
-       echo '$$'                                                     >> $@ 
-       killall 06-logs_server 06-logs_client 2>/dev/null || true
-
-
-06-logs_client 06-logs_server 06-logs_simulator: _06-logs_client.c _06-logs_server.c _06-logs_simulator.c
-       make -f 06-logs.mk
-
-_06-logs_client.c _06-logs_server.c _06-logs_simulator.c: 06-logs.c 03-args.xml
-       $(GRAS_STUB_GENERATOR) 06-logs 03-args.xml >/dev/null
-
-clean::
-       if [ -e 06-logs.mk ] ; then make -f 06-logs.mk clean; fi
-       rm -f _06-logs_client.c _06-logs_server.c _06-logs_simulator.c 06-logs.trace 06-logs.mk
-
-
-# Lesson 7: timers
-########################################
-
-07-timers.output: 07-timers_client 07-timers_server 07-timers_simulator
-       echo '$$ ./test_server 12345 & ./test_client 127.0.0.1 12345'  > $@ 
-       ./07-timers_server 12345                             2>&1 |sed s/07-timers/test/  >> $@ 2>&1&
-       ./07-timers_client 127.0.0.1 12345                   2>&1 |sed s/07-timers/test/  >> $@ 2>&1
-       sleep 1
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform.xml test.xml'              >> $@
-       ./07-timers_simulator gtut-platform.xml 03-args.xml   2>&1 |sed s/07-timers/test/  >> $@ 2>&1
-       echo '$$'                                                     >> $@ 
-       killall 07-timers_server 07-timers_client 2>/dev/null || true
-
-07-timers_client 07-timers_server 07-timers_simulator: _07-timers_client.c _07-timers_server.c _07-timers_simulator.c
-       make -f 07-timers.mk
-
-_07-timers_client.c _07-timers_server.c _07-timers_simulator.c: 07-timers.c 03-args.xml
-       $(GRAS_STUB_GENERATOR) 07-timers 03-args.xml >/dev/null
-
-clean::
-       if [ -e 07-timers.mk ] ; then make -f 07-timers.mk clean; fi
-       rm -f _07-timers_client.c _07-timers_server.c _07-timers_simulator.c 07-timers.trace 07-timers.mk
-
-# Lesson 8: exceptions
-########################################
-
-08-exceptions.output: 08-exceptions_client 08-exceptions_server 08-exceptions_simulator
-       echo '$$ ./test_server & ./test_client 127.0.0.1 '             > $@
-       ./08-exceptions_server                                   2>&1 |sed s/08-exceptions/test/  >> $@ 2>&1&
-       ./08-exceptions_client 127.0.0.1                         2>&1 |sed s/08-exceptions/test/  >> $@ 2>&1
-       sleep 1
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_server --cheat & ./test_client 127.0.0.1 '    >> $@
-       ./08-exceptions_server --cheat                           2>&1 |sed s/08-exceptions/test/  >> $@ 2>&1&
-       ./08-exceptions_client 127.0.0.1                         2>&1 |sed s/08-exceptions/test/  >> $@ 2>&1
-       sleep 1
-       echo '$$ killall test_server'                                 >> $@
-       killall 08-exceptions_server 08-exceptions_client 2>/dev/null || true
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform.xml test.xml'              >> $@
-       ./08-exceptions_simulator gtut-platform.xml 03-args.xml   2>&1 |sed s/08-exceptions/test/  >> $@ 2>&1
-       echo '$$'                                                     >> $@ 
-
-08-exceptions_client 08-exceptions_server 08-exceptions_simulator: _08-exceptions_client.c _08-exceptions_server.c _08-exceptions_simulator.c
-       make -f 08-exceptions.mk
-
-_08-exceptions_client.c _08-exceptions_server.c _08-exceptions_simulator.c: 08-exceptions.c 03-args.xml
-       $(GRAS_STUB_GENERATOR) 08-exceptions 03-args.xml >/dev/null
-
-clean::
-       if [ -e 08-exceptions.mk ] ; then make -f 08-exceptions.mk clean; fi
-       rm -f _08-exceptions_client.c _08-exceptions_server.c _08-exceptions_simulator.c 08-exceptions.trace 08-exceptions.mk 08-exceptions.output
-
-# Lesson 9: simple data exchange
-########################################
-09-datatype-dump: 09-datatype-dump.c
-       gcc -I$(GRAS_ROOT)/include -lgras -L$(GRAS_ROOT)/lib $^ -o $@ 
-
-clean::
-       rm -f 09-datatype-dump.o 09-datatype-dump
-
-09-simpledata.output: 09-simpledata_client 09-simpledata_server 09-simpledata_simulator
-       echo '$$ ./test_server 12345 & ./test_client 127.0.0.1 12345'  > $@ 
-       ./09-simpledata_server 12345                             2>&1 |sed s/09-simpledata/test/  >> $@ 2>&1&
-       ./09-simpledata_client 127.0.0.1 12345                   2>&1 |sed s/09-simpledata/test/  >> $@ 2>&1
-       sleep 1
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform.xml test.xml'              >> $@
-       ./09-simpledata_simulator gtut-platform.xml 03-args.xml   2>&1 |sed s/09-simpledata/test/  >> $@ 2>&1
-       echo '$$'                                                     >> $@ 
-       killall 09-simpledata_server 09-simpledata_client 2>/dev/null || true
-
-09-simpledata_client 09-simpledata_server 09-simpledata_simulator: _09-simpledata_client.c _09-simpledata_server.c _09-simpledata_simulator.c
-       make -f 09-simpledata.mk
-
-_09-simpledata_client.c _09-simpledata_server.c _09-simpledata_simulator.c: 09-simpledata.c 03-args.xml
-       $(GRAS_STUB_GENERATOR) 09-simpledata 03-args.xml >/dev/null
-
-clean::
-       if [ -e 09-simpledata.mk ] ; then make -f 09-simpledata.mk clean; fi
-       rm -f _09-simpledata_client.c _09-simpledata_server.c _09-simpledata_simulator.c 09-simpledata.trace 09-simpledata.mk
-
-# Lesson 10: RPC
-########################################
-10-rpc.output: 10-rpc_client 10-rpc_server 10-rpc_simulator
-       echo '$$ ./test_server & ./test_client 127.0.0.1 '             > $@
-       ./10-rpc_server 12345                             2>&1 |sed s/10-rpc/test/  >> $@ 2>&1&
-       ./10-rpc_client 127.0.0.1 12345                   2>&1 |sed s/10-rpc/test/  >> $@ 2>&1
-       sleep 1
-       echo '$$'                                                     >> $@
-       echo '$$ killall test_server'                                 >> $@
-       killall 10-rpc_server 10-rpc_client 2>/dev/null || true
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform.xml test.xml'              >> $@
-       ./10-rpc_simulator gtut-platform.xml 03-args.xml   2>&1 |sed s/10-rpc/test/  >> $@ 2>&1
-       echo '$$'                                                     >> $@ 
-
-10-rpc_client 10-rpc_server 10-rpc_simulator: _10-rpc_client.c _10-rpc_server.c _10-rpc_simulator.c
-       make -f 10-rpc.mk
-
-_10-rpc_client.c _10-rpc_server.c _10-rpc_simulator.c: 10-rpc.c 03-args.xml
-       $(GRAS_STUB_GENERATOR) 10-rpc 03-args.xml >/dev/null
-
-clean::
-       if [ -e 10-rpc.mk ] ; then make -f 10-rpc.mk clean; fi
-       rm -f _10-rpc_client.c _10-rpc_server.c _10-rpc_simulator.c 10-rpc.trace 10-rpc.mk
-
-
-# Lesson 11: Explicit wait
-########################################
-11-explicitwait.output: 11-explicitwait_client 11-explicitwait_server 11-explicitwait_simulator
-       (echo '$$ ./test_server & ./test_client 127.0.0.1 12345 & ./test_client 127.0.0.1 12345 '; \
-        ./11-explicitwait_client 127.0.0.1 12345            & \
-        ./11-explicitwait_client 127.0.0.1 12345            & \
-        ./11-explicitwait_server 12345                        \
-       ) 2>&1 | sed s/11-explicitwait/test/ > $@
-       sleep 1
-       echo '$$'                                                     >> $@
-       killall 11-explicitwait_server 11-explicitwait_client 2>/dev/null || true
-       echo '$$'                                                     >> $@
-       echo '$$ ./test_simulator platform-3nodes.xml test.xml'              >> $@
-       ./11-explicitwait_simulator gtut-platform-3nodes.xml 11-explicitwait.xml   2>&1 |sed s/11-explicitwait/test/  >> $@ 2>&1
-       echo '$$'                                                     >> $@ 
-
-11-explicitwait_client 11-explicitwait_server 11-explicitwait_simulator: _11-explicitwait_client.c _11-explicitwait_server.c _11-explicitwait_simulator.c
-       make -f 11-explicitwait.mk
-
-_11-explicitwait_client.c _11-explicitwait_server.c _11-explicitwait_simulator.c: 11-explicitwait.c 03-args.xml
-       $(GRAS_STUB_GENERATOR) 11-explicitwait 03-args.xml >/dev/null
-
-clean::
-       if [ -e 11-explicitwait.mk ] ; then make -f 11-explicitwait.mk clean; fi
-       rm -f _11-explicitwait_client.c _11-explicitwait_server.c _11-explicitwait_simulator.c 11-explicitwait.trace 11-explicitwait.mk
-
-
diff --git a/doc/gtut-files/README b/doc/gtut-files/README
deleted file mode 100644 (file)
index df4eff4..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-You shouldn't muck with these files unless you know what you are doing. They
-are used for the GRAS tutorial.
-
-Mt.
diff --git a/doc/gtut-files/gtut-platform-3nodes.xml b/doc/gtut-files/gtut-platform-3nodes.xml
deleted file mode 100644 (file)
index ccc44c5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version='1.0'?>
- <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
- <platform version="3">
- <AS  id="AS0"  routing="Full">
-   <host id="Jacquelin" power="137333000"/>
-   <host id="Boivin"    power="98095000"/>
-   <host id="Geoff"     power="42917000"/>
-   
-   <link id="1" bandwidth="3430125"  latency="0.000536941"/>
-   <link id="2" bandwidth="11618875" latency="0.00018998"/>
-   <link id="3" bandwidth="10314625" latency="0.006932556"/>
-     
-   <route src="Jacquelin" dst="Boivin">   <link_ctn id="1"/></route>
-   <route src="Boivin"    dst="Jacquelin"><link_ctn id="1"/></route>
-   <route src="Jacquelin" dst="Geoff">    <link_ctn id="2"/></route>
-   <route src="Geoff"     dst="Jacquelin"><link_ctn id="2"/></route>
-   <route src="Geoff"  dst="Boivin">      <link_ctn id="3"/></route>
-   <route src="Boivin" dst="Geoff">       <link_ctn id="3"/></route>
- </AS>
- </platform>
diff --git a/doc/gtut-files/gtut-platform.xml b/doc/gtut-files/gtut-platform.xml
deleted file mode 100644 (file)
index 7164bbb..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version='1.0'?>
- <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
- <platform version="3">
- <AS  id="AS0"  routing="Full">
-   <host id="Jacquelin" power="137333000"/>
-   <host id="Boivin" power="98095000"/>
-   <link id="1" bandwidth="3430125" latency="0.000536941"/>
-   <route src="Jacquelin" dst="Boivin"><link_ctn id="1"/></route>
-   <route src="Boivin" dst="Jacquelin"><link_ctn id="1"/></route>
- </AS>
- </platform>
diff --git a/doc/gtut-files/test.xml b/doc/gtut-files/test.xml
deleted file mode 100644 (file)
index 2aaa6f8..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Jacquelin" function="server" />
-  <process host="Boivin" function="client" />
-</platform>
-
index 8b1414a..36d553e 100644 (file)
@@ -17,6 +17,7 @@ Currently, the documentation contains 3 main sections:
 <ul>
   <li><h2><a href="../user_guide/html/index.html">SimGrid User Guide</a></h2></li>
   <li><h2><a href="../ref_guide/html/index.html">SimGrid Reference Manual</a>.</h2></li>
+  <li><h2><a href="../dev_guide/html/index.html">SimGrid Developer Manual</a>.</h2></li>
   <li><h2>You can also retrieve tutorials from <a href="http://simgrid.gforge.inria.fr/faq.html">here</a>.</h2></li> 
 </ul>
 \endhtmlonly
@@ -25,7 +26,7 @@ Other information sources:
   - The Frequently Asked Questions are <a href="http://simgrid.gforge.inria.fr/faq.html">here</a>.
   - The development webpage is <a href="https://gforge.inria.fr/projects/simgrid//">gforge.inria.fr/projects/simgrid</a>.
   - The user mailing list is <simgrid-user@lists.gforge.inria.fr>
-  - The SimGrid software package can be downloaded from <a href="http://simgrid.gforge.inria.fr/download.php">here</a>.
+  - The SimGrid software package can be downloaded from <a href="http://simgrid.gforge.inria.fr/download.html">here</a>.
 
 \htmlonly
 <center>
index eb95cf3..4bc54db 100644 (file)
@@ -662,34 +662,22 @@ INPUT                  = main.doc \
                          modules.doc \
                          module-xbt.doc \
                          module-msg.doc \
-                         module-gras.doc \
-                         module-amok.doc \
                          module-sd.doc \
                          module-surf.doc \
                          module-simix.doc \
                          module-trace.doc \
-                        index-API.doc \
+                         index-API.doc \
                          @top_srcdir@/doc/ref_guide/doxygen/logcategories.doc \
                          @top_srcdir@/src/instr/ \
                          @top_srcdir@/include/ \
                          @top_srcdir@/include/msg \
-                         @top_srcdir@/include/gras \
-                         @top_srcdir@/include/amok \
                          @top_srcdir@/include/xbt \
                          @top_srcdir@/include/simdag \
                          @top_srcdir@/include/simgrid \
                          @top_srcdir@/src/include/surf \
                          @top_srcdir@/src/xbt/ \
-                         @top_srcdir@/src/xbt/datadesc \
                          @top_srcdir@/src/surf/ \
                          @top_srcdir@/src/msg/ \
-                         @top_srcdir@/src/gras \
-                         @top_srcdir@/src/gras/Msg \
-                         @top_srcdir@/src/gras/Transport \
-                         @top_srcdir@/src/gras/Virtu \
-                         @top_srcdir@/src/amok \
-                         @top_srcdir@/src/amok/Bandwidth \
-                         @top_srcdir@/src/amok/PeerManagement \
                          @top_srcdir@/src/simdag \
                          @top_srcdir@/src/simix
 
@@ -757,7 +745,6 @@ EXCLUDE_SYMBOLS        =
 # the \include command).
 
 EXAMPLE_PATH           = ./ \
-                         @top_srcdir@/doc/gtut-files \
                          @top_srcdir@/src/surf/ \
                          @top_srcdir@/src/xbt/ \
                          @top_srcdir@/examples \
index 8773d3f..127f41d 100644 (file)
@@ -52,7 +52,8 @@ $mathjax
       <li><a href="../../doc/index.html"><span>Home</span></a></li>
       <li class="current"><a href="index.html"><span>Reference&nbsp;Manual</span></a></li>
       <li><a href="../../user_guide/html/index.html"><span>User&nbsp;Guide</span></a></li>
-      <li><a href="http://simgrid.gforge.inria.fr/tutorials"><span>Tutorials</span></a></li>
+      <li><a href="../../dev_guide/html/index.html"><span>Developer&nbsp;Guide</span></a></li>
+      <li><a href="http://simgrid.gforge.inria.fr/tutorials.html"><span>Tutorials</span></a></li>
       <li><a href="https://gforge.inria.fr/projects/simgrid"><span>Forge</span></a></li>
       <li><a href="http://simgrid.gforge.inria.fr/"><span>Website</span></a></li>
       <li>$searchbox</li>
index 7a44cce..d6e0e6a 100644 (file)
@@ -36,7 +36,7 @@ Grids.
   - The Frequently Asked Questions are <a href="http://simgrid.gforge.inria.fr/faq.html">here</a>.
   - The development webpage is <a href="https://gforge.inria.fr/projects/simgrid//">gforge.inria.fr/projects/simgrid</a>.
   - The user mailing list is <simgrid-user@lists.gforge.inria.fr>
-  - The SimGrid software package can be downloaded from <a href="http://simgrid.gforge.inria.fr/download.php">here</a>.
+  - The SimGrid software package can be downloaded from <a href="http://simgrid.gforge.inria.fr/download.html">here</a>.
 <br>
 
 <hr>
@@ -78,22 +78,6 @@ your work.
    MPI) programming environment. Unfortunately, this work is still underway.
    Check the \ref SMPI_API section for more information.
 
- - If you want to develop a real distributed application, then you may find
-   <b>\ref GRAS_API</b> (Grid Reality And Simulation) useful. This is an API
-   for the realization of distributed applications.
-   \n\n
-   Moreover, there is two implementations of this API: one on top of the
-   SURF (allowing to develop and test your application within the comfort of
-   the simulator) and another suited for deployment on real platforms
-   (allowing the resulting application to be highly portable and extremely
-   efficient).
-   \n\n
-   Even if you do not plan to run your code for real, you may want to switch
-   to GRAS if you intend to use MSG in a very intensive way (e.g. for
-   simulating a peer-to-peer environment).
-   \n\n
-   See the \ref GRAS_API section for more details.
-
 If your favorite programming environment/model is not there (BSP,
 components, OpenMP, etc.) is not represented in the SimGrid toolkit yet, you may
 consider adding it. You should contact us first on the
@@ -132,7 +116,7 @@ Finally, a transversal module allows you to trace your simulation. More document
 \htmlonly
 <br>
 The SimGrid software package can be downloaded from
-<a href="http://simgrid.gforge.inria.fr/download.php">here</a>.<br>
+<a href="http://simgrid.gforge.inria.fr/download.html">here</a>.<br>
 
 If you are interested in the history of SimGrid and in current and planned development,
 you can find out more <a href="http://simgrid.gforge.inria.fr/history.html">here</a>.
diff --git a/doc/ref_guide/doxygen/module-amok.doc b/doc/ref_guide/doxygen/module-amok.doc
deleted file mode 100644 (file)
index 946ed57..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#####################################################################
-###########################  CORE ###################################
-#####################################################################
-
-/** \addtogroup AMOK_API
- *
- *  @{ */
-
-       /** \defgroup AMOK_bw      Bandwidth        */
-       /** \defgroup AMOK_pm      Peer Management  */
-
-/** @} */
-
-#####################################################################
-#########################  EXTRA PAGES ##############################
-#####################################################################
-
-#####################################################################
-#########################  EXAMPLES #################################
-#####################################################################
diff --git a/doc/ref_guide/doxygen/module-gras.doc b/doc/ref_guide/doxygen/module-gras.doc
deleted file mode 100644 (file)
index 7b8d028..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/** \addtogroup GRAS_API
-
-    \section GRAS_funct GRAS offers the following functionnalities
-     - <b>\ref GRAS_comm</b>: Exchanging messages between peers
-       - \ref GRAS_dd : any data which may transit on the network must be
-         described beforehand so that GRAS can handle the platform
-         heterogeneity and convert them if needed.
-       - \ref GRAS_sock : this is how to open a communication channel to
-         other processes, and retrive information about them.
-       - \ref GRAS_msg : communications are message oriented. You have to
-         describe all possible messages and their payload beforehand, and
-         can then attach callbacks to the arrival of a given kind of message.
-       - \ref GRAS_timer : this is how to program repetitive and delayed
-         tasks, not unlike cron(8) and at(1). This cannot be used to timeout
-         a function (like setitimer(2) or signal(2) games could do).
-     - <b>\ref GRAS_run</b>: Running both on top of the simulator and on
-       top of real platforms, and portability support.
-       - \ref GRAS_virtu : You naturally don't want to call the
-          gettimeofday(2) function in simulation mode since it would give
-          you the time on the host running the simulation, not the time in
-          the simulated world (you are belonging to).\n
-         This a system call virtualization layer, which also acts as a
-          portability layer.
-       - \ref GRAS_globals : The use of globals is forbidden since the
-         "processes" are threads in simulation mode. \n
-        This is how to let GRAS handle your globals properly.
-       - \ref GRAS_emul : Support to emulate code excution (ie, reporting
-         execution time into the simulator and having code sections specific
-         to simulation or to real mode).
-
-
-    @{ */
-       /** @defgroup GRAS_comm    Communication facilities */
-       /** @defgroup GRAS_run     Virtualization */
-
-/** @} */
-#####################################################################
-/** @addtogroup GRAS_comm
-
-   Here are the communication facilities. GRAS allows you to exchange
-   <i>messages</i> on <i>sockets</i> (which can be seen as pipes between
-   processes). On reception, messages start <i>callbacks</i> (that's the
-   default communication mode, not the only one). All messages of a given
-   type convey the same kind of data, and you have to describe it
-   beforehand.
-
-   Timers are also seen as a mean of communication (with yourself). It
-   allows you to run a repetitive task ("do this every N second until I tell
-   you to stop"), or to deffer a treatment ("do this in 3 sec").
-
-    @{ */
-       /** @defgroup GRAS_dd      Data description      */
-       /** @defgroup GRAS_sock    Sockets               */
-       /** @defgroup GRAS_msg     Messages              */
-       /** @defgroup GRAS_timer   Timers                */
-
-/** @} */
-#####################################################################
-/** @addtogroup GRAS_run
-
-   Virtualization facilities allow your code to run both on top of the simulator or in real setting.
-
-    @{ */
-
-       /** @defgroup GRAS_globals Globals               */
-       /** @defgroup GRAS_emul    Emulation support */
-       /** @defgroup GRAS_virtu   Syscalls              */
-
-/** @} */
-
-
index d32230c..b6de29e 100644 (file)
@@ -17,6 +17,7 @@
    - \ref m_process_management
    - \ref m_host_management
    - \ref m_task_management
+   - \ref msg_mailbox_management
    - \ref msg_file_management
    - \ref msg_task_usage
    - \ref msg_VMs
@@ -44,8 +45,6 @@ details).
     #MSG_function_register (and maybe #MSG_function_register_default)
  -# Launch your processes from a deployment file with #MSG_launch_application
  -# Run the simulation with #MSG_main
- -# Cleanup the library with #MSG_clean before ending your program
-    (optional).
 
 @htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Simulation Control" --> @endhtmlonly
 */
@@ -70,6 +69,14 @@ details).
  * \htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Tasks" --> \endhtmlonly
  */
 
+/** @defgroup msg_mailbox_management Mailbox Management Functions
+ *  @ingroup MSG_API
+ *  @brief This section describes the mailbox structure of MSG
+ *         (#msg_mailbox_t) and the functions for managing it.
+ *
+ * \htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Mailbox" --> \endhtmlonly
+ */
+
 /** @defgroup msg_task_usage Task Actions
  *  @ingroup MSG_API
  *  @brief This section describes the functions that can be used
index 8fdd0e5..2d9b8ea 100644 (file)
@@ -99,7 +99,7 @@
   *
   *  You shouldn't use it directly since it is merely intended to ease the
   *  implementation of the several programmation environment of the
-  *  SimGrid toolkit (namely, \ref MSG_API, \ref GRAS_API and \ref SMPI_API).
+  *  SimGrid toolkit (namely, \ref MSG_API and \ref SMPI_API).
   *
   *  You should use those environments instead.
   */
index 54ff191..415bc82 100644 (file)
@@ -17,8 +17,7 @@
       given problem you don't really want to implement.
       If you want to use DAGs, have a look at the \ref SD_API programming
       environment.
-      If you want to get a real (but experimental) implementation of your solution, have a look
-      at the \ref GRAS_API one. If you want to study an existing MPI program,
+      If you want to study an existing MPI program,
       have a look at the \ref SMPI_API one. If none of those programming
       environments fits your needs, you may consider implementing your own
       directly on top of \ref SURF_API (but you probably want to contact us
 */
 
 
-/** \defgroup GRAS_API      GRAS
-    \brief Realistic programming environment (Grid Reality And Simulation)
-
-    GRAS provides a complete API to implement distributed application on top
-    of heterogeneous plateforms. In addition to the SimGrid implementation
-    of this interface (allowing you to work on your application within the
-    comfort of the simulator), an implementation suited to real platforms is
-    also provided (allowing you to really use your application once you're
-    done with developing it). It may still contain rought corners as
-    GRAS is not the most used part of SimGrid, however.
-
-    GRAS thus constitute a complete grid application developement framework,
-    encompassing both developer helping tools (the simulator and associated
-    tools) and an efficient while portable execution runtime.
-
-    \section GRAS_who Who should use this (and who shouldn't)
-
-    You should use this programming environment if you want to develop real
-    applications, ie if the final result of your work is a program which
-    may eventually be distributed. Rember however that GRAS is
-    considered as experimental at this point. Help would be welcomed
-    to improve this sorry situation...
-
-    If you just want to study some heuristics for a given problem you don't
-    want to implement really (ie, if your result would be a theorem), have a
-    look at the \ref MSG_API one, or the \ref SD_API one if you need to use DAGs.
-    If you want to study an existing MPI program, have a look at the
-    \ref SMPI_API one.
-    If none of those programming environments fits your needs, you may
-    consider implementing your own directly on top of \ref SURF_API (but you
-    probably want to contact us before).
-*/
-
-/** \defgroup AMOK_API AMOK
-    \brief Distributed toolkit built over \ref GRAS_API (Advanced Metacomputing Overlay Kit)
-
-    AMOK provides several tools useful to most applications built on top of GRAS,
-    but yet not belonging to GRAS itself. It is planned that those modules will be
-    changed to real plugins one day, allowing users to load only the needed parts at
-    run time. For now, they live in another library against which you should link your
-    programs explicitly.
-*/
-
 /** \defgroup SMPI_API      SMPI
     \brief Programming environment for the simulation of MPI applications
 
@@ -89,15 +45,13 @@ detailed below.
 \section SMPI_who Who should use SMPI (and who shouldn't)
 
 You should use this programming environment of the SimGrid suite if
-you want to study existing MPI applications. If you want to create a
-distributed application, you may be interested in the \ref GRAS_API
-environment instead (but note that GRAS is not very actively
-maintained nowadays). If you want to study some heuristics for a given
-problem (and if your goal is to produce theorems and publications, not
-code), have a look at the \ref MSG_API environment, or the \ref SD_API
-one if you need to use DAGs. If none of those programming environments
-fits your needs, you may consider implementing your own directly on
-top of \ref SURF_API (but you probably want to contact us before).
+you want to study existing MPI applications.  If you want to study
+some heuristics for a given problem (and if your goal is to produce
+theorems and publications, not code), have a look at the \ref MSG_API
+environment, or the \ref SD_API one if you need to use DAGs. If none
+of those programming environments fits your needs, you may consider
+implementing your own directly on top of \ref SURF_API (but you
+probably want to contact us before).
 
 \section SMPI_what What can run within SMPI?
 
@@ -195,8 +149,6 @@ smpirun -help
     to study algorithms and heuristics with DAGs of parallel tasks.
     If you don't need to use DAGs for your simulation, have a look at the
     \ref MSG_API programming environment.
-    If you want to implement a real distributed application, have a look at the
-    \ref GRAS_API programming environment.
     If you want to study an existing MPI program, have a look at the
     \ref SMPI_API one.
     If none of those programming environments fits your needs, you may
index eb9e845..e3b9102 100644 (file)
@@ -14,72 +14,57 @@ Single
 0 36 #a4a5a4
 0 37 #fe9600
 6 -360 2340 1305 3105
-4 1 0 50 -1 4 14 0.0000 2 135 270 472 2520 MSG\001
-4 1 0 50 -1 4 12 0.0000 2 165 1710 472 2835 Simple application-\001
-4 1 0 50 -1 4 12 0.0000 2 135 1350 472 3105 level simulator\001
+4 1 0 50 -1 4 14 0.0000 2 180 555 472 2520 MSG\001
+4 1 0 50 -1 4 12 0.0000 2 195 1650 472 2835 Simple application-\001
+4 1 0 50 -1 4 12 0.0000 2 150 1260 472 3105 level simulator\001
 -6
-6 1845 2295 3915 3240
-4 1 0 50 -1 4 14 0.0000 2 135 360 2430 2475 GRAS\001
-4 1 0 50 -1 4 12 0.0000 2 135 810 2430 2745 Framework\001
-4 1 0 50 -1 4 12 0.0000 2 165 990 2430 2970 to  develop\001
-4 1 0 50 -1 4 12 0.0000 2 165 2250 2880 3195  distributed applications\001
+6 1755 2205 6570 3375
+6 4365 2340 6390 3150
+4 1 0 50 -1 4 14 0.0000 2 225 870 5377 2520 SimDag\001
+4 1 0 50 -1 4 12 0.0000 2 150 1245 5377 2835 Framework for\001
+4 1 0 50 -1 4 12 0.0000 2 195 1965 5377 3105 DAGs of parallel tasks\001
 -6
-6 3060 2205 4095 2835
-# href="group__AMOK__API.html" ALT="AMOK"
-2 2 0 1 0 27 60 -1 20 0.000 0 0 -1 0 0 5
-        3082 2205 4072 2205 4072 2835 3082 2835 3082 2205
-4 1 0 50 -1 4 12 0.0000 2 135 630 3577 2745 toolbox\001
-4 1 0 50 -1 4 14 0.0000 2 135 360 3577 2475 AMOK\001
--6
-6 -675 3510 9045 4365
-6 3082 3645 5287 4185
-4 1 0 50 -1 4 12 0.0000 2 165 2340 4184 4102 virtual platform simulator\001
-4 1 0 50 -1 4 14 0.0000 2 135 360 4184 3847 SURF\001
--6
-# href="group__SURF__API.html" ALT="SMPI"
-2 2 0 1 0 34 60 -1 20 0.000 0 0 -1 0 0 5
-        -675 3510 9045 3510 9045 4365 -675 4365 -675 3510
--6
-6 6840 2340 8865 3150
-4 1 0 50 -1 4 14 0.0000 2 165 540 7852 2520 SimDag\001
-4 1 0 50 -1 4 12 0.0000 2 135 1170 7852 2835 Framework for\001
-4 1 0 50 -1 4 12 0.0000 2 165 1980 7852 3105 DAGs of parallel tasks\001
+# href="../../ref_guide/html/group__SMPI__API.html" ALT="SMPI"
+2 2 0 1 0 36 60 -1 20 0.000 0 0 -1 0 0 5
+        1755 2205 4095 2205 4095 3375 1755 3375 1755 2205
+# href="../../ref_guide/html/group__SD__API.html" ALT="SimDag"
+2 2 0 1 0 23 60 -1 30 0.000 0 0 -1 0 0 5
+        4230 2205 6570 2205 6570 3375 4230 3375 4230 2205
+4 1 0 50 -1 4 12 0.0000 2 195 1860 2925 2955 applications on top of\001
+4 1 0 50 -1 4 12 0.0000 2 150 1815 2925 3210 a virtual environment\001
+4 1 0 50 -1 4 12 0.0000 2 195 1560 2925 2745 Library to run MPI\001
+4 1 0 50 -1 4 14 0.0000 2 180 585 2925 2520 SMPI\001
 -6
-6 -158 4590 7987 5085
-4 1 0 50 -1 4 12 0.0000 2 180 8910 3914 5025 Grounding features (logging, etc.), usual data structures (lists, sets, etc.) and portability layer\001
-4 1 0 50 -1 4 14 0.0000 2 135 270 3914 4770 XBT\001
+6 1822 3645 4027 4185
+4 1 0 50 -1 4 12 0.0000 2 195 2145 2924 4102 virtual platform simulator\001
+4 1 0 50 -1 4 14 0.0000 2 180 675 2924 3847 SURF\001
 -6
-6 5435 1305 8318 1800
+6 3375 1305 6258 1800
 # href="/contrib.html" ALT="Contrib"
 2 2 0 1 0 37 55 -1 20 0.000 0 0 -1 0 0 5
-        5435 1800 8318 1800 8318 1305 5435 1305 5435 1800
-4 1 0 50 -1 4 15 0.0000 2 135 630 6876 1635 Contrib\001
+        3375 1800 6258 1800 6258 1305 3375 1305 3375 1800
+4 1 0 50 -1 4 15 0.0000 2 180 780 4816 1635 Contrib\001
 -6
-# href="group__MSG__API.html" ALT="MSG"
+6 -278 4560 6307 5040
+4 1 0 50 -1 4 12 0.0000 2 195 6585 3014 4995 Grounding features (logging, etc.), data structures (lists, etc.) and portability\001
+4 1 0 50 -1 4 14 0.0000 2 180 480 3014 4740 XBT\001
+-6
+6 6840 2115 7380 5220
+# href="../../ref_guide/html/group__TRACE__API.html" ALT="TRACE"
+2 2 0 1 0 3 50 -1 30 0.000 0 0 -1 0 0 5
+        6840 2115 7380 2115 7380 5220 6840 5220 6840 2115
+4 0 0 50 -1 4 15 1.5708 2 180 840 7200 5083 TRACE\001
+4 0 0 50 -1 4 12 1.5708 2 195 1590 7155 4033 Tracing simulation\001
+-6
+# href="../../ref_guide/html/group__XBT__API.html" ALT="XBT"
+2 3 0 1 0 33 80 -1 20 0.000 0 0 -1 0 0 5
+        -810 2115 -810 5220 6705 5220 6705 2115 -810 2115
+# href="../../ref_guide/html/group__SURF__API.html" ALT="SMPI"
+2 2 0 1 0 34 60 -1 20 0.000 0 0 -1 0 0 5
+        -675 3510 6570 3510 6570 4365 -675 4365 -675 3510
+# href="../../ref_guide/html/group__MSG__API.html" ALT="MSG"
 2 2 0 1 0 32 60 -1 20 0.000 0 0 -1 0 0 5
         -675 2205 1620 2205 1620 3375 -675 3375 -675 2205
-# href="group__GRAS__API.html" ALT="GRAS"
-2 3 0 1 0 35 60 -1 20 0.000 0 0 -1 0 0 7
-        4095 3375 4095 2925 3015 2925 3015 2205 1755 2205 1755 3375
-        4095 3375
-# href="group__SMPI__API.html" ALT="SMPI"
-2 2 0 1 0 36 60 -1 20 0.000 0 0 -1 0 0 5
-        4230 2205 6570 2205 6570 3375 4230 3375 4230 2205
 2 2 0 1 0 31 70 -1 20 0.000 0 0 -1 0 0 5
-        -810 1935 9855 1935 9855 1215 -810 1215 -810 1935
-# href="group__XBT__API.html" ALT="XBT"
-2 3 0 1 0 33 80 -1 20 0.000 0 0 -1 0 0 5
-        -810 2160 -810 5220 9135 5220 9135 2160 -810 2160
-# href="group__SD__API.html" ALT="SimDag"
-2 2 0 1 0 23 60 -1 30 0.000 0 0 -1 0 0 5
-        6705 2205 9045 2205 9045 3375 6705 3375 6705 2205
-# href="group__TRACE__API.html" ALT="TRACE"
-2 2 0 1 0 3 50 -1 30 0.000 0 0 -1 0 0 5
-        9270 2160 9810 2160 9810 5220 9270 5220 9270 2160
-4 1 0 50 -1 4 12 0.0000 2 165 1980 5400 2955 applications on top of\001
-4 1 0 50 -1 4 12 0.0000 2 135 1890 5400 3210 a virtual environment\001
-4 1 0 50 -1 4 12 0.0000 2 165 1620 5400 2745 Library to run MPI\001
-4 1 0 50 -1 4 15 0.0000 2 135 810 3560 1650 User Code\001
-4 0 0 50 -1 4 15 1.5708 2 135 450 9630 5085 TRACE\001
-4 1 0 50 -1 4 14 0.0000 2 135 360 5400 2520 SMPI\001
-4 0 0 50 -1 4 12 1.5708 2 165 1620 9585 4050 Tracing simulation\001
+        -810 1935 7380 1935 7380 1215 -810 1215 -810 1935
+4 1 0 50 -1 4 15 0.0000 2 180 1170 1620 1650 User Code\001
diff --git a/doc/shared/fig/simgrid_modules.png b/doc/shared/fig/simgrid_modules.png
deleted file mode 100644 (file)
index 89166b5..0000000
Binary files a/doc/shared/fig/simgrid_modules.png and /dev/null differ
index 50f6f12..16e0dd4 100644 (file)
@@ -1,4 +1,4 @@
-#FIG 3.2  Produced by xfig version 3.2.5-alpha5
+#FIG 3.2  Produced by xfig version 3.2.5b
 Landscape
 Center
 Metric
@@ -14,7 +14,7 @@ Single
 0 36 #a5a6a5
 0 37 #ff9700
 6 -158 4680 7987 5175
-4 1 0 50 -1 4 12 0.0000 2 210 8595 3914 5115 Grounding features (logging, etc.), usual data structures (lists, sets, etc.) and portability layer\001
+4 1 0 50 -1 4 12 0.0000 2 195 8085 3914 5115 Grounding features (logging, etc.), usual data structures (lists, sets, etc.) and portability layer\001
 4 1 0 50 -1 4 14 0.0000 2 180 480 3914 4860 XBT\001
 -6
 6 -1215 -900 9045 -180
@@ -23,58 +23,24 @@ Single
 # href="/contrib.html" ALT="Contrib"
 2 2 0 1 0 37 55 -1 20 0.000 0 0 -1 0 0 5
         5670 -315 8370 -315 8370 -810 5670 -810 5670 -315
-4 1 0 50 -1 4 14 0.0000 2 180 1170 3914 -465 User Code\001
+4 1 0 50 -1 4 14 0.0000 2 180 1155 3914 -465 User Code\001
 4 1 0 50 -1 4 14 0.0000 2 180 780 7020 -480 Contrib\001
 -6
-6 5490 0 6525 630
-# href="group__AMOK__API.html" ALT="AMOK"
-2 2 0 1 0 27 60 -1 20 0.000 0 0 -1 0 0 5
-        5512 0 6502 0 6502 630 5512 630 5512 0
-4 1 0 50 -1 4 12 0.0000 2 165 675 6007 540 toolbox\001
-4 1 0 50 -1 4 14 0.0000 2 180 720 6007 270 AMOK\001
--6
-6 4185 90 6435 1035
-4 1 0 50 -1 4 14 0.0000 2 180 705 4860 270 GRAS\001
-4 1 0 50 -1 4 12 0.0000 2 165 1050 4860 540 Framework\001
-4 1 0 50 -1 4 12 0.0000 2 210 1050 4860 765 to  develop\001
-4 1 0 50 -1 4 12 0.0000 2 210 2205 5310 990  distributed applications\001
--6
-6 1800 0 4050 2070
-6 2002 652 3847 1417
-4 1 0 50 -1 4 14 0.0000 2 180 555 2924 832 MSG\001
-4 1 0 50 -1 4 12 0.0000 2 210 1770 2924 1147 Simple application-\001
-4 1 0 50 -1 4 12 0.0000 2 165 1335 2924 1417 level simulator\001
--6
-# href="group__MSG__API.html" ALT="MSG"
-2 2 0 1 0 23 60 -1 23 0.000 0 0 -1 0 0 5
-        1800 0 4050 0 4050 2070 1800 2070 1800 0
--6
 6 -675 0 1665 3375
 6 -518 1282 1507 2092
-4 1 0 50 -1 4 14 0.0000 2 240 870 494 1462 SimDag\001
-4 1 0 50 -1 4 12 0.0000 2 165 1365 494 1777 Framework for\001
-4 1 0 50 -1 4 12 0.0000 2 210 2100 494 2047 DAGs of parallel tasks\001
+4 1 0 50 -1 4 14 0.0000 2 225 870 494 1462 SimDag\001
+4 1 0 50 -1 4 12 0.0000 2 150 1245 494 1777 Framework for\001
+4 1 0 50 -1 4 12 0.0000 2 195 1965 494 2047 DAGs of parallel tasks\001
 -6
 # href="group__SD__API.html" ALT="SimDag"
 2 2 0 1 0 23 60 -1 30 0.000 0 0 -1 0 0 5
         -675 0 1665 0 1665 3375 -675 3375 -675 0
 -6
-6 6660 0 9045 1170
-6 6817 135 8887 1035
-4 1 0 50 -1 4 12 0.0000 2 210 2025 7852 750 applications on top of\001
-4 1 0 50 -1 4 12 0.0000 2 165 1965 7852 1005 a virtual environment\001
-4 1 0 50 -1 4 12 0.0000 2 210 1680 7852 540 Library to run MPI\001
-4 1 0 50 -1 4 14 0.0000 2 180 585 7852 315 SMPI\001
--6
-# href="group__SMPI__API.html" ALT="SMPI"
-2 2 0 1 0 36 60 -1 20 0.000 0 0 -1 0 0 5
-        6660 0 9045 0 9045 1170 6660 1170 6660 0
--6
 6 4815 1305 9045 2070
 6 5332 1440 8527 1935
 6 6952 1440 8527 1935
-4 1 0 50 -1 4 12 0.0000 2 210 1545 7739 1620 SIMIX-like Proxy\001
-4 1 0 50 -1 4 12 0.0000 2 210 1305 7739 1890 (sockets/MPI)\001
+4 1 0 50 -1 4 12 0.0000 2 195 1485 7739 1620 SIMIX-like Proxy\001
+4 1 0 50 -1 4 12 0.0000 2 180 1230 7739 1890 (sockets/MPI)\001
 -6
 4 1 0 50 -1 4 14 0.0000 2 180 870 5782 1777 SMURF\001
 -6
@@ -84,7 +50,7 @@ Single
 -6
 6 -675 3510 7200 4365
 6 2159 3667 4364 4207
-4 1 0 50 -1 4 12 0.0000 2 210 2280 3261 4124 virtual platform simulator\001
+4 1 0 50 -1 4 12 0.0000 2 195 2145 3261 4124 virtual platform simulator\001
 4 1 0 50 -1 4 14 0.0000 2 180 675 3261 3869 SURF\001
 -6
 # href="group__SURF__API.html" ALT="SMPI"
@@ -93,9 +59,9 @@ Single
 -6
 6 1800 2205 7200 3375
 6 3554 2385 5444 3195
-4 1 0 50 -1 4 12 0.0000 2 210 1860 4498 3150 on a virtual platform\001
+4 1 0 50 -1 4 12 0.0000 2 195 1725 4498 3150 on a virtual platform\001
 4 1 0 50 -1 4 14 0.0000 2 180 645 4498 2565 SimIX\001
-4 1 0 50 -1 4 12 0.0000 2 165 1410 4498 2880 "UNIX-like" API\001
+4 1 0 50 -1 4 12 0.0000 2 150 1365 4498 2880 "UNIX-like" API\001
 -6
 # href="group__SD__API.html" ALT="SimDag"
 2 2 0 1 0 10 60 -1 28 0.000 0 0 -1 0 0 5
@@ -104,17 +70,30 @@ Single
 6 7335 2205 9045 4365
 6 7470 3015 8955 3555
 4 1 0 50 -1 4 14 0.0000 2 180 375 8211 3217 MC\001
-4 1 0 50 -1 4 12 0.0000 2 165 1440 8211 3532 Model Checker\001
+4 1 0 50 -1 4 12 0.0000 2 150 1305 8211 3532 Model Checker\001
 -6
 # href="group__MSG__API.html" ALT="MSG"
 2 2 0 1 0 20 60 -1 23 0.000 0 0 -1 0 0 5
         7335 2205 9045 2205 9045 4365 7335 4365 7335 2205
 -6
+6 2317 652 4162 1417
+4 1 0 50 -1 4 14 0.0000 2 180 555 3239 832 MSG\001
+4 1 0 50 -1 4 12 0.0000 2 195 1650 3239 1147 Simple application-\001
+4 1 0 50 -1 4 12 0.0000 2 150 1260 3239 1417 level simulator\001
+-6
+6 5895 135 7965 1035
+4 1 0 50 -1 4 12 0.0000 2 195 1860 6930 750 applications on top of\001
+4 1 0 50 -1 4 12 0.0000 2 150 1815 6930 1005 a virtual environment\001
+4 1 0 50 -1 4 12 0.0000 2 195 1560 6930 540 Library to run MPI\001
+4 1 0 50 -1 4 14 0.0000 2 180 585 6930 315 SMPI\001
+-6
 # href="group__XBT__API.html" ALT="XBT"
 2 3 0 1 0 33 60 -1 20 0.000 0 0 -1 0 0 7
         -765 0 -1215 0 -1215 5400 9045 5400 9045 4500 -765 4500
         -765 0
-# href="group__GRAS__API.html" ALT="GRAS"
-2 3 0 1 0 35 60 -1 20 0.000 0 0 -1 0 0 9
-        6525 720 5445 720 5445 0 4185 0 4185 2070 4680 2070
-        4680 1170 6525 1170 6525 720
+# href="group__MSG__API.html" ALT="MSG"
+2 2 0 1 0 23 60 -1 23 0.000 0 0 -1 0 0 5
+        1800 0 4680 0 4680 2070 1800 2070 1800 0
+# href="group__SMPI__API.html" ALT="SMPI"
+2 2 0 1 0 36 60 -1 20 0.000 0 0 -1 0 0 5
+        4815 0 9045 0 9045 1170 4815 1170 4815 0
diff --git a/doc/shared/fig/simgrid_modules2.png b/doc/shared/fig/simgrid_modules2.png
deleted file mode 100644 (file)
index 918c36a..0000000
Binary files a/doc/shared/fig/simgrid_modules2.png and /dev/null differ
index 9ecd8e7..1d8c816 100644 (file)
@@ -761,7 +761,6 @@ EXCLUDE_SYMBOLS        =
 # the \include command).
 
 EXAMPLE_PATH           = ./ \
-                         @top_srcdir@/doc/gtut-files \
                          @top_srcdir@/src/surf/ \
                          @top_srcdir@/src/xbt/ \
                          @top_srcdir@/examples \
index 7206402..aec7344 100644 (file)
@@ -2,10 +2,10 @@
 
 
 \section bindings_binding_Java Java Binding
-Check online for our specific <a href="http://simgrid.gforge.inria.fr/documentation.php">Simgrid-Java documentation</a>.
+Check online for our specific <a href="http://simgrid.gforge.inria.fr/documentation.html">Simgrid-Java documentation</a>.
 
 \section bindings_binding_Ruby Ruby Binding
-Check online for our specific <a href="http://simgrid.gforge.inria.fr/documentation.php">Simgrid-Ruby documentation</a>.
+Check online for our specific <a href="http://simgrid.gforge.inria.fr/documentation.html">Simgrid-Ruby documentation</a>.
 
 \section bindings_binding_lua Lua Binding
 
diff --git a/doc/user_guide/doxygen/footer.html b/doc/user_guide/doxygen/footer.html
new file mode 100644 (file)
index 0000000..80222ad
--- /dev/null
@@ -0,0 +1,20 @@
+<!-- start footer part -->
+<!--BEGIN GENERATE_TREEVIEW-->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    $navpath
+    <li class="footer">$generatedby
+    <a href="http://www.doxygen.org/index.html">
+    <img class="footer" src="$relpath$doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
+  </ul>
+</div>
+<!--END GENERATE_TREEVIEW-->
+<!--BEGIN !GENERATE_TREEVIEW-->
+<hr class="footer"/><address class="footer"><small>
+$generatedby &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="$relpath$doxygen.png" alt="doxygen"/>
+</a> $doxygenversion
+</small></address>
+<!--END !GENERATE_TREEVIEW-->
+</body>
+</html>
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-howto-design.doc b/doc/user_guide/doxygen/gtut-files/gtut-howto-design.doc
deleted file mode 100644 (file)
index 715d850..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-/** @defgroup GRAS_howto_design HOWTO design a GRAS application
-    @ingroup GRAS_howto HOWTOs
-
-This page tries to give some hints on how to design a GRAS application. The
-provided model and functionnalities are somehow different from the other
-existing solutions (nammly, MPI), and this page tries to give you the feeling
-of the GRAS philosophy. You may also want to (re)read the \ref GRAS_tut_intro.
-
-As an example, you may have a look at \ref GRAS_tut_tour_explicitwait_use,
-which somehow follows the guidelines given here.
-
-\section GRAS_howto_design_toc Table of content
-  - \ref GRAS_howto_design_what
-  - \ref GRAS_howto_design_design
-    - \ref GRAS_howto_design_design_api
-    - \ref GRAS_howto_design_design_processes
-    - \ref GRAS_howto_design_design_protocol
-      - \ref GRAS_howto_design_design_protocol_msg
-      - \ref GRAS_howto_design_design_protocol_cb
-  - \ref GRAS_howto_design_implem
-    - \ref GRAS_howto_design_implem_cb
-    - \ref GRAS_howto_design_implem_api
-    - \ref GRAS_howto_design_implem_init
-  - \ref GRAS_howto_design_test
-    - \ref GRAS_howto_design_test_sim
-    - \ref GRAS_howto_design_test_local
-    - \ref GRAS_howto_design_test_dist
-
-\section GRAS_howto_design_what What is a GRAS application
-
-As explained in \ref GRAS_tut_intro, you should see a GRAS application as a
-distributed service. There is two main parts:
- - a user API, composed of regular functions offering services to the users
- - a set of nodes (or processes, or agents, name them as you want)
-   collaborating and exchanging messages to achieve the requested service on
-   behalf of the user.
-
-It is naturally possible to not follow this split, and let the users of your
-service directly sending messages by themselves. Nevertheless, this
-encapsulation is a good thing because distributed computing is a bit hard to
-achieve. You may thus not want to force your users to go into this tricky
-part. Instead, shield them with a regular C API.
-
-If you are the only user of the code you develop, I'd advice you to still
-follow this approach. But do as you prefer, of course.
-
-\section GRAS_howto_design_design The design phase
-
-\subsection GRAS_howto_design_design_api Specify the user API
-
-These will be the entry points of your system, and you should think twice
-about their syntax and semantic.
-
-\subsection GRAS_howto_design_design_processes Identify the types of processes in your application
-
-Note that we are not speaking about the amount of processes in your
-application, but rather on the type of processes. The amount of distinct
-roles.
-
-Depending on your application, there may be only one type (for example in a
-peer-to-peer system), two types of processes (for example in a client/server
-system), three types of processes (for example if you add a forwarder to a
-client/server system), or maybe much more.
-
-\subsection GRAS_howto_design_design_protocol Design an application-level protocol
-
-During this phase, you should try to sketch your application before
-implementing it.  You should sketch temporal execution of the application. I
-personnaly prefer to do so graphically on a blackboard, drawing comic strips
-of the several steps of the algorithm under specific conditions. Ask
-yourself questions as "What gets exchanged between who when the user request
-this?", "How to react when this condition occures?" and "What is the initial
-state of the system?"
-
-Here are some important points to identify in your future application during
-the design phase:
-
-\subsubsection GRAS_howto_design_design_protocol_msg Message types
-
-The most important point to design a GRAS protocol is to identify the
-different type of messages that can be exchanged in your system, and the
-datatype of their payload. Doing so, remember that GRAS messages are
-strongly typed. They are formed by a so-called message type (identified by
-its name) and a type description describing what kind of data you can
-include in the message. The message type is a qualitative information
-"someone asked you to run that function" while the payload is the
-quantitative information (the arguments to the function).
-
-A rule of thumb: <b>A given message type have only one semantic meaning, and
-one syntaxic payload datatype</b>. If you don't do so, you have a problem.
-
-   - If the same message type may have two semantic value depending on some
-     fields of the payload, I'd say that you used MPI too much before. You
-     should use the full power of the GRAS messaging functions by using
-     several message types. It will simplify your code and yield better
-     performance.
-
-   - You shouldn't have a given message type with differing payload
-     datatypes. It is possible to do so (using gras_datadesc_ref_generic()),
-     but it's quite painful, and is rarely what you really want. Are you
-     sure you don't want to split these messages in two separate types?
-
-\subsubsection GRAS_howto_design_design_protocol_cb Message callbacks
-
-Also sketch what your processes should do when they get the given message.
-These action will constitute the message callbacks during the
-implementation. But you should first go through a design phase of the
-application level-protocol, were these action remain simplistic. Also
-identify the process-wide globals needed to write the callbacks (even if it
-can be later).
-
-
-\section GRAS_howto_design_implem The implementation phase
-
-\subsection GRAS_howto_design_implem_cb Write your callbacks
-
-Most of the time, you will find tons of specific cases you didn't thought
-about in the design phase, and going from a code sketch to an actual
-implementation is often quite difficult.
-
-You will probably need some process-wide globals to store some state of your
-processes. See \ref GRAS_tut_tour_globals on need.
-
-\subsection GRAS_howto_design_implem_api Implement your user-API
-
-If your protocol was wisely designed, writting the user API should be quite
-easy.
-
-\subsection GRAS_howto_design_implem_init Implement the initialization code
-
-You must write some initialization code for all the process kinds of your
-application.
-
-You may want to turn your code into a clean GRAS library by using the adhoc
-mecanism, but unfortunately, it's not documented yet. Worse, there is two
-such systems for now, one of them being deprecated. Check the \ref AMOK_pm
-implementation to see how to use the new system. Naturally, this is only
-optional.
-
-\section GRAS_howto_design_test The test phase
-
-Testing software is important to check that it works. But in a distributed
-setting, this is mandatory.
-
-\subsection GRAS_howto_design_test_sim Test it on the simulator
-
-In addition to all the good old bugs you find in a classical C program
-(memory corruption, logical errors, etc), distributed computing introduce
-subtil ways to get things wrong. Actually, this is why I wrote GRAS: to get
-able to test my code on simulator before using it in distributed settings.
-
-The simulator is a nicely controled environment. You can rerun the same code
-in the exact same condition as often as you want to reproduce a bug. You can
-run the simulator in a debugger such as valgrind or gdb to debug all
-processes at once. You can cheat and have global variables (to check global
-invariants or such). You can test your code on platform you don't have
-access to in the real life, or in condition which almost never occur (such
-as having 80% of the nodes stopping at the same time).
-
-Use all these possibilities, and test your code throughfully in the
-simulator. You may find it boring, but when you'll go to the next steps,
-you'll dream of going back into the comfort of the simulator.
-
-\subsection GRAS_howto_design_test_local Test it locally
-
-Once it works in the simulator, test it in real-life, but will all processes
-on the same host. Even if the GRAS API is made to make the simulator as
-close to the real life as possible, you often discover new and exciting bugs
-when going outside of the simulator. Fix'em all before going further.
-
-If you find you've found a discrepency between both implementation of GRAS,
-please drop us a mail. That would be a bug.
-
-\subsection GRAS_howto_design_test_dist Test it in a distributed setting
-
-You are now ready for the big jump...
-
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-howto.doc b/doc/user_guide/doxygen/gtut-files/gtut-howto.doc
deleted file mode 100644 (file)
index f849375..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/** @defgroup GRAS_howto HOWTOs
-    @ingroup GRAS_tut
-
-This page tries to explain how to use the GRAS framework. It does not focus
-on specific functionalities (which are detailed in the initiatic tour), but
-rather on global aspects. Here is the list of existing howtos for now:
-
- - \ref GRAS_howto_design
- - I plan to write a document on how to debug a GRAS application, one day.
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-introduction.doc b/doc/user_guide/doxygen/gtut-files/gtut-introduction.doc
deleted file mode 100644 (file)
index 6659aaf..0000000
+++ /dev/null
@@ -1,403 +0,0 @@
-/** @defgroup GRAS_tut_intro What is GRAS
-    @ingroup GRAS_tut
-
-\htmlinclude .gtut-introduction.doc.toc
-
-\section GRAS_tut_intro_toc What will you find here
-
- - The section \ref GRAS_tut_intro_what explains what the GRAS framework and how it
-   relates to other existing solutions.
- - The section \ref GRAS_tut_intro_model presents somehow formaly the programmation
-   model used in GRAS.
-
-\section GRAS_tut_intro_further Further readings
-
-After this page, you may find these one interesting:
-\ref GRAS_howto_design. If you're new to GRAS, you may want to read the
-initiatic tour first, begining with \ref GRAS_tut_tour_install or
-\ref GRAS_tut_tour_setup.
-
-<hr>
-
-\section GRAS_tut_intro_what What is GRAS
-
-GRAS is a framework to implement and study distributed algorithms. It
-provides a simple communication API to allow several processes to
-interoperate through the exchange of messages. This is quite classical, and
-GRAS differs from the other existing messaging API by several points:
-
-  - \ref GRAS_tut_intro_what_2ways
-  - \ref GRAS_tut_intro_what_dist
-  - \ref GRAS_tut_intro_what_grid
-  - \ref GRAS_tut_intro_what_target
-  - \ref GRAS_tut_intro_what_simple
-
-We now detail each of these points.
-
-\subsection GRAS_tut_intro_what_2ways GRAS allows you to run both in simulation mode and on real platforms
-
-We wrote two implementations of the interface: the first one is built on top
-of the SimGrid simulator, allowing you to run your application in a
-controled environment, which reveals precious to debug and study algorithms.
-Everyone who tried to run even simple tests on more than 100 real machines
-will consider a simulator as a nirvana.
-
-The experiments can be reproduced in the exact same conditions (which is
-somehow hard in real settings), allowing for example to reproduce a bug as
-many times as you want while debugging. You can also test your algorithm
-under experimental conditions which you couldn't achieve on a real platform
-(like a network topology and/or size you do don't have access to). Under
-some conditions, SimGrid simulations are also much faster than real
-executions, allowing you to run more experiments in less time.
-
-Once you assessed the quality of your algorithm in the simulator, you can
-deploy it on real platforms using the second implementation of the library.
-Usually, taking an algorithm out of a simulator implies an almost complete
-rewrite. There is no need to modify your program for this in GRAS. You don't
-even need to recompile it, but simply to relink your program it against the
-right library.
-
-GRAS applications running on real hardware deliver high performance.
-The sequential parts of your code are not mediated by GRAS or slowed down
-anyhow. The communications use advanced data exchange and conversion
-mecanism ensuring that you are likely to get performance at least comparable
-to other communication solutions (FIXME: cite the paper once it gets
-accepted).
-
-GRAS applications are portable on several operating systems (Linux, MacOS X,
-Solaris, IRIX, AIX and soon Windows) and several processor architectures
-(x86, amd64, ppc, sparc, etc). Moreover, GRAS processes can interoperate
-efficiently even when deployed on differing material. You can for example
-have a process deployed on ppc/MacOS X interacting transparently with
-another one deployed on alpha/Linux.
-
-The simulation mode of GRAS is called usually SG (for SimGrid) while the in
-situ execution mode is called RL (for Real Life).
-
-\subsection GRAS_tut_intro_what_dist GRAS was designed for distributed computing, not parallel computing
-
-In GRAS, you build your algorithm as a set of independent processes
-interacting through messages. This is the well known MPMD model (multiple
-program, multiple data). It contrasts to the SPMD model (simple program,
-multiple data) and communications solutions such as MPI or PVM, where you
-build an uniq program with conditionnals here and there specifying what each
-processes should do (something like "If I'm process number 0, then send data
-to the others, else get the data sent to me").
-
-None of these models are inherently better than the other, and there is a
-plenty of algorithms betterly expressed in the SPMD paradigm. If your
-program falls into that category, then GRAS may not be the right tool for
-you. We think however that most non-sequential algorithms can be expressed
-gracefully in a MPMD way where some are really difficult to express in a
-SPMD way.
-
-There is no parallelism in GRAS, and it is discouraged to introduce threads
-in GRAS (althrough it should be possible in some months). This is an explict
-choice since threads are so hard to use (see the section \ref
-GRAS_tut_intro_what_simple below). The framework itself do use threads to
-achieve good performances, but I don't want to impose this to users (FIXME:
-actually, GRAS is not multi-threaded yet internally, but I plan to do so
-really soon).
-
-\subsection GRAS_tut_intro_what_grid GRAS was designed for large scale computing
-
-Another difference to the MPI communication libraries is that GRAS was not
-designed for static small-sized platforms such as clusters, but to dynamic
-larger-scale platforms such as grids. That is why GRAS do include static
-membership solutions such as the MPI channels. Support for fault-tolerance
-is also provided through the timeouts on communication primitives and
-through an exception mecanism.
-
-GRAS also comes with a sister library called AMOK containing several usefull
-building block for large scale network aware applications. The most
-proheminent one allows to assess the network availabilities through active
-testing, just like the classical NWS tool in the grid research community. We
-are actively working on a network topology discovery mecanism and a
-distributed locking solution. Some other modules are planned, such as
-reliable broacasting in open environments.
-
-\subsection GRAS_tut_intro_what_target GRAS targets at applicative overlay rather than end-user application
-
-The application class targeted by GRAS is constituted of so called overlays.
-They do not constitute a complete application by themselves, but can be seen
-as a "distributed library", a thing offering offering a service to another
-application through a set of physically distributed entities. An example of
-such overlay could be a monitoring system allowing you to retrieve the
-available bandwidth between two remote hosts. It could be used in a
-network-aware parallel matrix multiplication library assigning more work to
-well interconnected nodes. I wouldn't advice to build a physical or
-biological compututation program on top of GRAS, even if it would be
-possible in theory.
-
-In other words, GRAS is not a grid middleware in the common understanding of
-the world, but rather a tool to constitute the building bricks of such a
-middleware. GRAS is thus a sort of "underware" ;)
-
-\subsection GRAS_tut_intro_what_simple GRAS tries to remain simple to use
-
-A lot of effort was put into the framework so that it remains simple to the
-users. For example, you can exchange structured data (any kind of C data
-structure) just by passing its address, and the framework will create the
-exact same structure on the receiver side.
-
-There is no threads like the pthread ones in GRAS, and it is not planned to
-introduce this in the future. This is an explicit choice since I consider
-multi-threading as too complicated for usual users. There is too much
-non-determinism, too many race conditions, and too few language-level
-constructs to keep yourself from screwing up. This idea is well expressed
-by John Ousterhout in <i>Why Threads Are a Bad Idea (for most purposes)</i>,
-published at USENIX'96. See section \ref GRAS_tut_intro_what_dist for
-platform performance consideration.
-
-For the user code, I plan to allow the co-existance of several "gras
-processes" within the same regular unix process. The communication semantic
-will still be message-oriented, even if implemented using the shared memory
-for efficiency.
-
-Likewise, there is no interuption mecanism in GRAS which could break the
-user code execution flow. When you write a function, you can be absolutely
-sure that nothing will happen between each lines of it. This assumption
-considerably simplify the code written in GRAS. The main use of of
-interruptions in a distributed application is to timeout communications when
-they fail. GRAS communication calls allow to setup a timeout value, and
-handle it internally (see below).
-
-The only interruption mecanism used is constituted by exceptions, just like
-in C++ or Java (but implemented directly in C). They are propagated from the
-point where they are raised to a point where they will be trapped, if any,
-or abort the execution when not trapped. You can still be certain that
-nothing will happen between two lines of your code, but the second line may
-never be executed if the first one raises an exception ;)
-
-This exception mecanism was introduced because without it, user code has to
-be loaded by tons of non-functional code to check whether an operation was
-properly performed or whether you have to pass the error condition to your
-caller.
-
-<hr>
-
-\section GRAS_tut_intro_model The model provided by GRAS
-
-From a more formal point of view, GRAS overlays (=applications) can be seen
-as a set of state machines mainly interacting with messages. Because of the
-distributed setting of overlays, the internal state of each process cannot
-be accessed or modified directly by other processes. Even when it would be
-possible pratically (like in SG), it is forbidden by the model. This makes
-it difficult to gain a complete knowledge on the global system state. This
-global system state can still be defined by agregating the states of each
-processes, but this remains theoretical and impratical because of the
-probable combinatorial explosion.
-
- - \ref GRAS_tut_intro_model_events
- - \ref GRAS_tut_intro_model_commmodel
- - \ref GRAS_tut_intro_model_timing_policy
- - \ref GRAS_tut_intro_model_exception
- - \ref GRAS_tut_intro_model_rpc
-
-\subsection GRAS_tut_intro_model_events Event types
-
-Two main types of events may change the internal state of a given process:
-
- - <b>Incomming messages</b>. Messages are somehow strongly typed: a message
-   type is described by its name (a string), and the C datatype of its
-   payload. Any message of the same type will convey the same datatype, but
-   of course the actual content of the payload may change from message to
-   message of the same type.\n
-   \n
-   Processes may attach <b>callback functions</b> to the arrival of messages
-   of a given type. They describe the action to achieve to handle the
-   messages during the transition associated to this event.\n
-   \n
-   Incoming messages are not handled as soon as they arrive, but only when
-   the process declares to be ready to accept incoming events (using \ref
-   gras_msg_handle or related functions). It ensures that the treatment of a
-   given message won't run in parallel to any other callback, so that
-   process globals (its state) can be accessed and modified without
-   locking.\n
-   \n
-   Messages received when the process is not ready to consume them are
-   queued, and will be processed in order in the subsequent calls to \ref
-   gras_msg_handle.\n
-   \n
-   Processes can also wait explicitely for incoming messages matching some
-   given criterions (using \ref gras_msg_wait). Any messages received before the
-   one matching the criterions will be added to the incoming messages'
-   queue for further use. This may breaks the message delivery order.
-   Moreover, there is no restriction on when this can be done. So, a
-   callback to a given message can consume messages of other types. There is
-   also no restriction on the criterion: you can specify a function in charge
-   of examinating the messages either incoming or already in the queue and
-   decide based on their meta-data (sender and message type) or their actual
-   content whether they match your criterions.\n
-   \n
-   It is even possible to program processes so that they only explicitely
-   wait for messages without using \ref gras_msg_handle to accept messages
-   and start the callbacks associated to them. GRAS thus supports both the
-   pure event-based programming model and the more classical message passing
-   model.\n
-
- - <b>Internal timers</b>. There is two types of timers: delayed actions and
-   repetitive actions. The former happen only once when the delay expires
-   while the second happen regularly each time that a period expires.\n
-   \n
-   Like incoming messages, timer treatments are not prehemptive. Ie, the
-   function attached to a given timer will not start as soon as the period
-   expires, but only when the process declares to be ready to accept
-   incoming events. This also done in the \ref gras_msg_handle function, and
-   expired timers are prioritaire with regard to incoming messages.
-
-Messages are sent using the \ref gras_msg_send function. You should specify
-the receiver, the message type and the actual payload. This operation can
-happen at any time of your program. Message sending is not considered as a
-process state change, but rather as a reaction to an incoming event. It
-changes the state of another process, though. Trying to send messages to
-yourself will deadlock (althrough it may change in the future).
-
-\subsection GRAS_tut_intro_model_commmodel Communication model
-
-Send operations are <b>as synchronous as possible pratically</b>. They block
-the process until the message actually gets delivered to the receiving
-process. An acknoledgment is awaited in SG, and we consider the fact that RL
-does not the same as a bug to be fixed one day. We thus have an <b>1-port model
-in emission</b>. This limitation allows the framework to signal error condition
-to the user code in the section which asked for the transmission, without
-having to rely on an interuption mecanism to signal errors asynchronously.
-This communication model is not completely synchronous in that sense that the
-receiver cannot be sure that the acknoledgment has been delivered (this is the
-classical byzantin generals problem). Pratically, the acknoledgment is so small
-that there is a good probability that the message where delivered. If you need
-more guaranty, you will need to implement better solutions in the user space.
-
-As in SimGrid v3.3, receive operations are done in a separated thread, but they
-are done sequentially by this thread. The model is thus <b>1-port in
-reception</b>, but something like 2-port in general. Moreover, the messages not
-matching the criterion in explicite receive (see for example \ref
-gras_msg_wait) are queued for further use. Thanks to this specific
-thread, the emission and reception are completely decorelated. Ie, the
-main thread can perfectly send a message while the listener is
-receiving something. We thus have a classical <b>1-port model</b>.
-
-Here is a graphical representation of a scenario involving two processes A and
-B.  Both are naturally composed of two threads: the one running user code, and
-the listener in charge of listening incoming messages from the network. Both
-processes also have a queue for the communication between the two threads, even
-if only the queue of process B is depicted in the graph.
-
-The experimental scenario is as follows: <ul>
-
-<li>Process A sends a first message (depicted in red) with gras_msg_send(), do
-    some more computation, and then send another message (depicted in
-    yellow). Then, this process handles any incoming message with
-    gras_msg_handle(). Since no message is already queued in process A at this
-    point, this is a blocking call until the third message (depicted in
-    magenta) arrives from the other process.</li>
-
-<li>On its side, the process B explicitely wait for the second message with
-    gras_msg_wait(), do some computation with it, and then call
-    gras_msg_handle() to handle any incoming message. This will pop the red
-    message from the queue, and start the callback attached to that kind of
-    messages. This callback sends back a new message (depicted in magenta) back
-    to process A.</li>
-</ul>
-
-<img src="gras_comm.png">
-
-This figure is a bit dense, and there is several point to detail here:<ul>
-
-<li>The timings associated to a given data exchange are detailed for the first
-message. The time (1) corresponds to the network latency. That is the time to
-reach the machine on which B is running from the machine running on A. The time
-(2) is mainly given by the network bandwidth. This is the time for all bytes of
-the messages to travel from one machine to the other. Please note that the
-models used by SimGrid are a bit more complicated to keep realistic, as
-explained in <a href="http://www.loria.fr/~quinson/blog/2010/06/28/Tutorial_at_HPCS/">the
-slides of the HPCS'10</a>, but this not that important here. The time (3) is mainly
-found in the SG version and not in RL (and that's a bug). This is the time to
-make sure that message were received on machine B. In real life, some buffering
-at system and network level may give the illusion to machine A that the message
-were already received before it's actually delivered to the listener of machine
-B (this would reduce the time (3)). To circumvent this, machine B should send a
-little acknoledgment message when it's done, but this is not implemented yet.</li>
-
-<li>As you can see on the figure, sending is blocking until the message is
-received by the listener on the other side, but the main thread of the receiver
-side is not involved in this operation. Sender will get released from its send
-even if the main thread of receiver is occuped elsewhere.</li>
-
-<li>Incomming messages not matching the expectations of a gras_msg_wait() (such
-as the red one) are queued for further use. The next message receiving
-operation will explore this queue in order, and if empty, block on the
-network. The order of unexpected messages and subsequent ones is thus preserved
-from the receiver point of view.</li>
-
-<li>gras_msg_wait() and gras_msg_handle() accept timeouts as argument to
-specify how long you are willing to wait at most for incoming messages. These
-were ignored here to not complexify the example any further. It is worth
-mentionning that the send operation cannot be timeouted. The existance of the
-listener should make it useless.</li>
-
-</ul>
-
-\subsection GRAS_tut_intro_model_timing_policy Timing policy
-
-All communication primitives allow 3 timout policies: one can only poll for
-incoming events (using timeout=0), wait endlessly for the communication to
-be performed (using timeout<0) or specify a maximal delay to wait for the
-communication to proceed (using timeout>0, being a number of seconds).
-
-Again, this describes the targeted model. The current implementation does
-not allow to specify a delay for the outgoing communication. In SG, the
-delay is then hardcoded to 60 seconds while outgoing communication wait for
-ever to proceed in RL.
-
-Another timing policy we plan to implement in the future is "adaptative
-timeouts", where the timeout is computed automatically by the framework
-according to performance of previous communications. This was demonstrated
-for example in the NWS tool.
-
-\subsection GRAS_tut_intro_model_exception Error handling through exceptions
-
-As explained in section \ref GRAS_tut_intro_what_simple, any function may
-raise exceptions breaking their execution. No support is provided by the
-framework to ensure that the internal state remains consistent when
-exceptions are raised. Changing this would imply that we are able to
-checkpoint the internal state to provide a transaction service, which seems
-quite difficult to achieve efficiently.
-
-\subsection GRAS_tut_intro_model_rpc RPC messaging
-
-In addition to the one-way messages described above, GRAS supports RPC
-communication. Using this, a client process asks for the execution of a
-callback on a server process. RPC types are close to regular message types:
-they are described by a type (a string), a payload type for the request, but
-in addition, they also have a payload type for the answer from the server to
-the client.
-
-RPC can be either synchronous (the function blocks until an answer is
-received) or asynchronous (you send the request and wait later for the
-anwer). They accept the same timing policies than regular messages.
-
-If the callback raises an exception on the server side, this exception will
-be trapped by the framework on the server side, sent back to the client
-side, and revived on the client side. So, if the client calls a RPC which
-raises an error, it will have to deal with the exception itself. No
-provision is given concerning the state consistency on the server side when
-an exception arise. The <tt>host</tt> fields of the exception structure
-indicates the name of the host on which it was raised.
-
-The callback performing the treatment associated to a RPC can perform any
-kind of communication itself, including RPC. In the case where A calls a RPC
-on B, leading to B calling a RPC on C (ie, A->B->C), if an exception is
-raised on C, it will be forwarded back to A. The <tt>host</tt> field will
-indicate C.
-
-<hr>
-
-\section GRAS_tut_intro_next What's next?
-
-Now that you know what GRAS is and the communication model used, it is time
-to move to the \ref GRAS_tut_tour section. There, you will build
-incrementally a full-featured GRAS application demonstrating most of the
-aspects of the framework.
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-main.doc b/doc/user_guide/doxygen/gtut-files/gtut-main.doc
deleted file mode 100644 (file)
index c916ece..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
-@addtogroup GRAS_tut
-
-This section constitutes a tutorial to the GRAS programming environment.
-
- - \ref GRAS_tut_intro :\n
-   This section details what GRAS is, and what are the target application
-   class. It also formalize somehow the communication model used in GRAS.\n
-   If you are new to the system and want to start using the tool as quickly
-   as possible and learn by trying things out instead of reading a lenghty
-   manual, you might want to start from next section directly.
-   - \ref GRAS_tut_intro_what
-   - \ref GRAS_tut_intro_model
-
- - \ref GRAS_tut_tour :\n
-   This section aims at turning new-comers into GRAS power user. It briefly
-   explains how to install the framework and setup your own projects. Then,
-   an example distributed application is builded incrementaly to show the
-   several aspects of the framework.
-   - Part 1: Bases
-     - \ref GRAS_tut_tour_install
-     - \ref GRAS_tut_tour_setup
-   - Part 2: Message passing
-     - \ref GRAS_tut_tour_simpleexchange
-     - \ref GRAS_tut_tour_args
-     - \ref GRAS_tut_tour_callbacks
-     - \ref GRAS_tut_tour_globals
-     - \ref GRAS_tut_tour_logs
-     - \ref GRAS_tut_tour_timers
-     - \ref GRAS_tut_tour_exceptions
-     - \ref GRAS_tut_tour_simpledata
-     - \ref GRAS_tut_tour_rpc
-     - \ref GRAS_tut_tour_explicitwait
-     - \ref GRAS_tut_tour_message_recaping
-   - Part 3: Data description
-     - \ref GRAS_tut_tour_staticstruct
-     - \ref GRAS_tut_tour_pointers
-     - \ref GRAS_tut_tour_dynar
-     - \ref GRAS_tut_tour_manualdatadef
-     - \ref GRAS_tut_tour_exchangecb
-   - Part 4: Advanced topics (TODO)
-
- - \ref GRAS_howto :\n
-   This section contains some self-contained document explaining one
-   aspect of the framework which would be hard to integrate in the
-   suite of lessons composing the tutorial.
-    - \ref GRAS_howto_design
-
-*/
-
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-00-install.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-00-install.doc
deleted file mode 100644 (file)
index 675fc3d..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-
-/**
-@page GRAS_tut_tour_install Lesson 0: Installing GRAS
-
-Since GRAS is technically part of the SimGrid project, you have to install
-SimGrid to install GRAS. Doing so is explained in the relevant FAQ section
-(\ref install).
-
-Newcommers should install the stable release from the tarball, since the
-snapshots may suffer from (additionnal;) stability issues. Only go for the
-git if you really need features not present in the stable releases yet (or
-if you plan to help us improving the tool, what is always welcomed).
-
-Proceed to \ref GRAS_tut_tour_setup.
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-01-bones.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-01-bones.doc
deleted file mode 100644 (file)
index 04963f3..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-
-/**
-@page GRAS_tut_tour_setup Lesson 1: Setting up your own project
-
-\section GRAS_tut_tour_setup_toc Table of Contents
- - \ref GRAS_tut_tour_setup_C
- - \ref GRAS_tut_tour_setup_plat
- - \ref GRAS_tut_tour_setup_deploy
- - \ref GRAS_tut_tour_setup_glue
- - \ref GRAS_tut_tour_setup_make
- - \ref GRAS_tut_tour_setup_start
-
-<hr>
-
-Any GRAS project should be constituted of at least 3 files, and possibly
-much more.
-
-  - <tt>&lt;project&gt;.c</tt>: A source file providing the source code of your
-    processes.
-
-  - <tt>&lt;platform&gt;.xml</tt>: A platform description file. It describes
-    the virtual platform you want to run your application onto following the
-    SurfXML formatting so that the simulator can parse it. This file is only
-    needed in SG, and you don't need any to run on real platforms (of
-    course). The simplest is to use one of the pre-existing one.
-
-  - <tt>&lt;project&gt;.xml</tt>: A deployment file. It describes which of
-    your processes to start, on which machine and with which arguments.
-
-  - A makefile is often needed, too, even if it's not mandatory.
-
-If we start a project called <tt>test</tt>, we have to write 3 files:
-<tt>test.c</tt>, <tt>platform.xml</tt> and <tt>test.xml</tt>
-
-\section GRAS_tut_tour_setup_C The C source file
-
-Let's look at the C source file first. It should contain one main function
-for each type of processes in your overlay. Let's assume that you want to
-code a simple client/server communication. For this, the source file should
-read as:
-
-\verbatim #include <gras.h>
-
-int client(int argc, char *argv[]) {
-  ...
-}
-
-int server(int argc, char *argv[]) {
-  ...
-}
-\endverbatim
-
-Note that each of the processes's main function have the exact same
-prototype of the classical <tt>main()</tt> function in C.
-
-This is on purpose, each of them can assume this role when running in RL.
-But you shouldn't write a main() function yourself since all processes will
-run as threads within the same regular process in simulation mode. That is
-why the real <tt>main</tt> function of GRAS programs are generated
-automatically. This will be detailled in time (section \ref
-GRAS_tut_tour_setup_glue), but for now just note the similarity between the
-"main" functions you have to write for each processes and a "real main"
-function.
-
-Then, each process must initialize the GRAS framework at the beginning (with
-\ref gras_init) and should finalize it at the end (with \ref gras_exit).
-
-You should pass to \ref gras_init the <tt>argc</tt> and <tt>argv</tt> you
-received in your "main" function so that the users of your application can
-pass some configuration flags to the framework.
-
-It is not enough to have one of the processes initializing the framework
-since in RL, each of them will run on a different host. If you use some AMOK
-modules, you have to initialize them in each process too.
-
-The source file then reads: \include 01-bones.c
-
-That's it. You have a working GRAS application with two processes. They
-don't do anything useful, but that's a beginning. Let's see how to bring
-them to life.
-
-\section GRAS_tut_tour_setup_plat The platform file
-
-The platform file is used by the simulator to know about the existing hosts
-and their interactions. Its exact syntax is at the same time very simple and
-a bit beyond the topic of this document. Here is a very simple example
-describin two hosts named <i>Jacquelin</i> and <i>Boivin</i> and how they
-are interconnected.
-
-\include gtut-platform.xml
-
-At this point, you should not try to write your own platform file, but use
-one of the existing ones. There is a few of them in the examples/msg
-directory of the project. The only information we need from those files are
-the names of the existing hosts. It will be mandatory to write the
-deployment file.
-
-\section GRAS_tut_tour_setup_deploy The deployment file
-
-This file explains which of your processes should be started on the
-different hosts. It is mainly used in simulation. In real life, you will
-have to start your processes manually (see below). We we dream of a system
-able to apply a deployment file in real life and TakTuk may be the right
-tool for this, but this is still to be done.
-
-Here is an example of such file, describing that a <tt>server</tt> process
-must be started onto the <tt>Jacquelin</tt> host and a <tt>client</tt>
-process must be started on the <tt>Boivin</tt> host.
-
-\include test.xml
-
-Actually, you should write such a file also if you only plan to use GRAS in
-RL since this file is also used to glue your code to GRAS, as explained in
-the next section.
-
-\section GRAS_tut_tour_setup_glue Glueing things together
-
-As explained above, you shouldn't write any real <tt>main</tt> function
-since its content depends on whether you run in RL ou in SG. Instead, you
-use a tool <tt>gras_stub_generator</tt> to get the proper glue around your
-code generated. If you installed SimGrid in a regular place, this program is
-now in your path. Its source resides in the tools/gras/ directory of the
-archive, if you wonder.
-
-Here is the calling syntax:
-\verbatim gras_stub_generator <project_name> <deployment_file.xml>\endverbatim
-
-It parses the deployment file (called <tt>test.xml</tt> in our example),
-searching for all the kind of processes you have in your project. It
-then generates the following C files:
-
- - a <tt>_&lt;project_name&gt;_&lt;process_kind&gt;.c</tt> file for each process kind you
-   have.\n
-   They are used to launch your project in real life. They
-   contain a main() in charge of initializing the GRAS infrastructure and
-   launching your code afterward.
- - a <tt>_&lt;project_name&gt;_simulator.c</tt> file.\n
-   This file is suited to the simulation mode. It contains a main()
-   function initializing the simulator and launching your project within.
- - a <tt>&lt;project_name&gt;.mk</tt> file.\n
-   This is a makefile to regenerate any files on need. See next section.
-
-In our example, we will thus obtain <tt>_test_server.c</tt>,
-<tt>_test_client.c</tt>, <tt>_test_simulator.c</tt> and <tt>test.mk</tt>.
-
-There is a pitfall: no verification is made on your actual source code, so
-if you have a typo on the process name in the deployment file, the generated
-code will be wrong, and the linker will spit error messages at you. Also
-remember that those names are in fact C function names, so they are
-case-sensitive.
-
-\section GRAS_tut_tour_setup_make A typical Makefile
-
-Now, we want to compile all the source files to build the actual binaries.
-It can be done manually, but it is much more convenient to use a makefile.
-Fortunately, gras_stub_generator generates a makefile for you under the name
-<tt>&lt;project&gt;.mk</tt>. This file is sufficient for now. To compile our test
-application, just type:
-\verbatim make -f test.mk \endverbatim
-
-You may want to rename this file to Makefile so that typing <tt>make</tt>
-without argument becomes sufficient. In any case, do not edit this file
-without renaming it, or your changes will get overwritten at the next glue
-generation.
-
-If you already have a Makefile (or a Makefile.am for automake users), you
-can also add the following chunk at the end of your file:
-\verbatim NAME=your_project_name
- PROCESSES=list of processes type in your project
-
- $(foreach proc, $(PROCESSES), _$(NAME)_$(proc).c) _$(NAME)_simulator.c: $(NAME).c $(NAME)_deployment.xml
-        path/to/gras_stub_generator $(NAME) $(NAME)_deployment.xml >/dev/null
-\endverbatim
-
-A simpler solution in our example would be to add:
-\verbatim _test_client.c _test_server.c _test_simulator.c: test.c test.xml
-        path/to/gras_stub_generator test test.xml >/dev/null
-\endverbatim
-
-\section GRAS_tut_tour_setup_start Actually running the processes
-
-There is nothing to know to start your processes in RL. Simply call the
-generated binaries, and that's it. To start the simulation, simply call:
-\verbatim ./<project>_simulator platform.xml deployment.xml\endverbatim
-
-If you have an error message similar to
-\verbatim
-./<project>_simulator: error while loading shared libraries: libsimgrid.so.2: cannot open shared object file: No such file or directory
-\endverbatim
-it simply means that the dynamic linker of you system fails to find
-the simgrid library. The easiest way to solve this is to declare a
-LD_LIBRARY_PATH shell variable pointing to the directory where your
-library lives (that's /opt/simgrid/lib on my machine because I passed
---prefix=/opt/simgrid to the configure script).
-
-Here is an example of execution: \include 01-bones.output
-
-That's it. You are done with this lesson and can now write, build and
-execute GRAS applications as long as they don't do anything ;) Move
-to the next lessons to add some flesh on these bones.
-
-Go to \ref GRAS_tut_tour_simpleexchange
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-02-simple.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-02-simple.doc
deleted file mode 100644 (file)
index 16cfee8..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-
-/**
-@page GRAS_tut_tour_simpleexchange Lesson 2: Exchanging simple messages
-
-\section GRAS_tut_tour_simpleexchange_toc Table of Contents
- - \ref GRAS_tut_tour_simpleexchange_msgtype
- - \ref GRAS_tut_tour_simpleexchange_socks
- - \ref GRAS_tut_tour_simpleexchange_exchange
- - \ref GRAS_tut_tour_simpleexchange_recaping
-
-<hr>
-
-\section GRAS_tut_tour_simpleexchange_msgtype Declaring the messages to be exchanged
-
-We will now see how to exchange messages between hosts. As explained in
-section \ref GRAS_tut_intro_model, every GRAS message is (strongly) typed. A
-message type is described by its name and the datatype of the data it can
-convey. Each process which may exchange a given type of message should
-declare it before sending or receiving it. If the description used by the
-sender doesn't match the one used by the receiver, you'll get into trouble.
-Fortunately, such discrepency will be detected in SG.
-
-We won't convey any payload in this lesson, so we just have to give the name
-of message to declare them:
-\dontinclude 02-simple.c
-\skip gras_msgtype_declare
-\until gras_msgtype_declare
-
-Remember that all processes should declare the message types they use.
-
-\section GRAS_tut_tour_simpleexchange_socks Identifying peers you want to communicate with
-
-Then, you need to specify with who you want to communicate. This is done
-by opening sockets. GRAS sockets are loosely inspirated by the regular BSD
-sockets, but with several simplifications.
-
-If you want to eventually receive messages, you have to open a so-called
-<i>server socket</i>. Actually, any GRAS process should open a server socket
-since it will allows to identify it uniquely in the system. A socket is
-defined by an host name and a port number (just like with BSD sockets).
-
-Since server socket are on the current host, opening a socket to receive
-messages on the port 12345 is as easy as:
-\skip gras_socket_server
-\until gras_socket_server
-
-Hardcoding port numbers that way may lead to difficulties on RL (at least)
-since at most one process can listen on a given port. So, if you can, prefer
-the \ref gras_socket_server_range, which picks a working port from a range
-of value. Of course, if you want your processes to find each others, at
-least one port must be hardcoded in the system. Then, any other processes
-contact the one listening on that port, which acts as a coordinator.
-
-Our client should also open a server socket, but the picked port don't
-matter, so we use:
-\skip gras_socket_server
-\until gras_socket_server
-
-It will select a port between 1024 (ports below 1024 are reserved under
-UNIX) and 10000. You can safely ignore the two last arguments for now and
-pass 0.
-
-So, you now know how to create sockets allowing to receive messages. To send
-messages, you have to create a so-called <i>client socket</i>. For this, use
-\ref gras_socket_client with the hostname and the port of the process you
-want to contact as arguments. Our client should simply do:
-
-\dontinclude 02-simple.c
-\skip socket_client
-\until socket_client
-
-The corresponding server socket must be opened before any client socket can
-connect to it. It is thus safe to add a little delay before creating the
-client socket. But you cannot use the classical sleep() function for this,
-or you will delay the simulator in SG, not your processes. Use \ref
-gras_os_sleep instead.
-
-\section GRAS_tut_tour_simpleexchange_exchange Actually exchanging messages
-
-GRAS offers a plenty of ways to communicate. The simple one is to use \ref
-gras_msg_send on the sender side, and \ref gras_msg_wait on the receiver side.
-
-\ref gras_msg_send expects 3 arguments: the socket on which to send the
-message, the message type (described by its name), and a pointer to the actual content of the
-message. Since we don't have any payload, this becomes:
-
-\dontinclude 02-simple.c
-\skip msg_send
-\until msg_send
-
-\ref gras_msg_wait accepts 4 arguments. The first one is the delay you are
-disposed to wait for messages, while the the type of message you are
-expecting. Then come output arguments. The third argument should be the
-address of a gras_socket_t variable which will indicate who wrote the
-message you received while the last argument is where to put the payload.
-
-Since our server is willing to wait up to 60 seconds for a message, the
-following will do it:
-\dontinclude 02-simple.c
-\skip msg_wait
-\until msg_wait
-
-\section GRAS_tut_tour_simpleexchange_recaping Recaping everything together
-
-Here is the complete code of this example. Note the use of the functions
-\ref xbt_socket_my_port, \ref xbt_socket_peer_name and \ref
-xbt_socket_peer_port to retrieve information about who you are connected to.
-
-\include 02-simple.c
-
-Here is the output of the simulator. Note that \ref xbt_socket_peer_port
-actually returns the port number of the <i>server</i> of the peer. This may
-sound a bit strange to BSD experts, but it is actually really useful: you
-can store this value, and contact your peer afterward passing this number to
-\ref gras_socket_client .
-\include 02-simple.output
-
-Here we are, you now know how to exchange messages between peers. There is
-still a large room for improvement, such as adding payload to messages. But
-there some little things you should know before we speak of payloads.
-
-Go to \ref GRAS_tut_tour_args
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-03-args.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-03-args.doc
deleted file mode 100644 (file)
index 3e13e0d..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-
-/**
-@page GRAS_tut_tour_args Lesson 3: Passing arguments to the processes (in SG)
-
-\section GRAS_tut_tour_args_toc Table of Contents
- - \ref GRAS_tut_tour_args_use
- - \ref GRAS_tut_tour_args_sg
- - \ref GRAS_tut_tour_args_recap
-
-<hr>
-
-The most problematic issue with the code of previous lesson is that it does
-not work in RL since we hardcoded the server hostname in the client code. We
-will thus learn you how to pass arguments to your processes to overcome this
-situation.
-
-\section GRAS_tut_tour_args_use Using command line arguments from user code
-
-In RL, the situation is quite simple: we just have to use the command line
-arguments as we would do in a usual C program. In the server, only change
-concern the opennong of the master socket:
-\dontinclude 03-args.c
-\skip gras_socket_server
-\until gras_socket_server
-
-In the client, we only need to change the way we open the client socket:
-\skip gras_socket_client
-\until gras_socket_client
-
-The rest of the program remains inchanged.
-
-\section GRAS_tut_tour_args_sg Passing command line arguments in deployment files
-
-At this point, the problem is to pass arguments to the processes in SG.
-Fortunately, it is quite simple. You just have to edit your deployment file
-so that it reads: \include 03-args.xml
-The syntax should be self-explanatory at this point.
-
-\section GRAS_tut_tour_args_recap Recaping everything together
-
-The whole program now reads:
-\include 03-args.c
-
-And here is the output:
-\include 03-args.output
-
-Go to \ref GRAS_tut_tour_callbacks
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-04-callback.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-04-callback.doc
deleted file mode 100644 (file)
index c217ff5..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-
-/**
-@page GRAS_tut_tour_callbacks Lesson 4: Attaching callbacks to messages
-
-\section GRAS_tut_tour_callbacks_toc Table of Contents
- - \ref GRAS_tut_tour_callbacks_declare
- - \ref GRAS_tut_tour_callbacks_attach
- - \ref GRAS_tut_tour_callbacks_handle
- - \ref GRAS_tut_tour_callback_recap
-
-<hr>
-
-Our program is well and good, but if we had to write a longer program,
-explicitely waiting for messages of a given type would not be really
-practical. To add some more dynamism, what we want to do is to attach
-callbacks to the several messages types, and tell GRAS that we are ready to
-deal with new messages. That's what we will do now.
-
-\section GRAS_tut_tour_callbacks_declare Declaring callbacks
-
-First of all, we define the callback we want to attach to the arrival of the
-"hello" message on the server. Its signature is fixed: it accepts two
-arguments of relative types <tt>gras_msg_cb_ctx_t ctx</tt> and <tt>void
-*</tt>. The first one is a working context we should pass to GRAS when
-speaking about the message we are handling while the second is the payload.
-The callback returns an integer being its error code, just like the "main()"
-function. Here is the actual code of our callback:
-
-\dontinclude 04-callback.c
-\skip gras_msg_cb_ctx_t
-\until end_of_callback
-
-\section GRAS_tut_tour_callbacks_attach Attaching callbacks
-
-Then, we have to change the server code to use this callback instead of
-gras_msg_wait. This simply done by a construct like the following:
-
-\skip cb_register
-\until cb_register
-
-\section GRAS_tut_tour_callbacks_handle Handling incoming messages
-
-Once the callback is declared and attached, the server simply has to call
-\ref gras_msg_handle to tell GRAS it's ready to handle for incoming
-messages. The only argument is the maximum delay we are disposed to wait for
-a message. If the delay is negative, the process will block until a message
-arrives. With delay=0, the process just polls for already arrived messages,
-but do not wait at all if none arrived yet. If the delay is greater than 0,
-the process will wait for at most that amount of seconds. If a message
-arrives in the meanwhile, it won't even wait that long.
-
-Sometimes, you want to handle all messages arriving in a given period
-without really knowing how much messages will come (this is often the case
-during the initialization phase of an algorithm). In that case, use \ref
-gras_msg_handleall . It has the same prototype than \ref gras_msg_handle,
-but waits exactly the passed delay, dealing with all the messages arriving
-in the meanwhile.
-
-We have no such needs in our example, so the code simply reads:
-\skip handle
-\until handle
-
-\section GRAS_tut_tour_callback_recap Recaping everything together
-
-The whole program now reads:
-\include 04-callback.c
-
-And here is the output (unchanged wrt previous version):
-\include 04-callback.output
-
-Our little example turns slowly to a quite advanced GRAS program. It entails
-most of the mecanism most program will use.
-
-There is one last thing you should know about callbacks: you can stack them,
-ie attach several callbacks to the same message. GRAS will pass it to the
-lastly attached first, and if the returned error code is not 0, it will pass
-it also to the next one, and so on. I'm not sure there is any sensible use
-of this feature, but it's possible ;)
-
-Go to \ref GRAS_tut_tour_globals
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-05-globals.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-05-globals.doc
deleted file mode 100644 (file)
index da702fd..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
-@page GRAS_tut_tour_globals Lesson 5: Using globals in processes
-
-\section GRAS_tut_tour_globals_toc Table of Contents
- - \ref GRAS_tut_tour_globals_intro
- - \ref GRAS_tut_tour_globals_use
- - \ref GRAS_tut_tour_callback_pitfall
- - \ref GRAS_tut_tour_callback_recap
-
-<hr>
-
-\section GRAS_tut_tour_globals_intro Introduction
-
-Callbacks are great to express your processes as state machines, but they
-pose another problem: callbacks don't have acces to the variable declared
-within the scope of the process' main function (of course). You should
-however resist to the temptation to declare globals outside of the scope of
-the functions, or you won't be able to use more than one process of each
-type in the simulation. Remember, all gras processes run as thread
-within the same naming space in SG so your globals will be shared between
-the several instances of your process, leading to bad problems.
-
-Instead, you you have to put all globals in a structure, and let GRAS handle
-it with the gras_userdata_* functions (there is only 3 of them ;).
-
-\section GRAS_tut_tour_globals_use Putting globals into action
-
-We will now modify the example to add a "kill" message, and let the server
-loop on incoming messages until it gets such a message. We only need a
-boolean, so the structure is quite simple:
-\dontinclude 05-globals.c
-\skip struct
-\until server_data
-
-Then, we need to create this structure in the process main function. We
-could use either gras_userdata_new() or gras_userdata_set(). The former is an
-helper macro mallocing the space needed by the structure and passing it to
-gras using the latter function. If you go for gras_userdata_set(), you
-should pass it a pointer to your data you want to retrieve afterward.
-
-\dontinclude 05-globals.c
-\skip userdata_new
-\until userdata_new
-
-BEWARE, the gras_userdata_new expects the pointed type, not the
-pointer type. As you can see, in our example, you should pass
-server_data_t to the macro, even if the global variable is later
-defined as being of type server_data_t*.
-
-Once you declared a global that way, retriving this (for example in a
-callback) is really easy:
-\dontinclude 05-globals.c
-\skip userdata_get
-\until userdata_get
-
-We can now write the callback, which simply retrive the globals and change
-the value of the <tt>kileld</tt> field.
-\dontinclude 05-globals.c
-\skip kill_cb
-\until end_of_kill_callback
-
-And we replace the single gras_msg_handle() of the server main function by a
-loop:
-\skip while
-\until }
-
-Please note that in our example, only one process creates a global
-structure. But this is naturally completely ok to have several
-processes creating their globals this way. Each of these globals will
-be separated, so process A cannot access globals defined by process B.
-Maybe this implies that the name "globals" is a bit misleading. It
-should be "process state" or something similar.
-
-\section GRAS_tut_tour_callback_pitfall Common pitfall of globals
-
-There is an error that I do myself every other day using globals in GRAS.
-This is to write something like:
-\verbatim int server(int argc, char *argv[]) {
-  server_data_t globals=gras_user_new(server_data_t);
-  /* other variable definition */
-
-  gras_init(&argc, argv);
-
-  /* rest of the code */
-}\endverbatim
-
-The problem is that you call gras_userdata_new() before gras_init(). Doing so,
-embarass GRAS since it does not have its internal buffer initialized yet,
-and cannot store your data anywhere. That is why doing so triggers an error
-at run time.
-
-Also, as noted above, the gras_userdata_new expects the pointed type,
-not the pointer type. As you can see, in our example, you should pass
-server_data_t to the macro, even if the global variable is later
-defined as being of type server_data_t*.
-
-
-\section GRAS_tut_tour_callback_recap Recaping everything together
-
-The whole program now reads:
-\include 05-globals.c
-
-And here is the output (unchanged wrt previous version):
-\include 05-globals.output
-
-That's it, we're done. We have a server able to handle any number of
-messages, which the client can stop remotely properly. That's already
-something, hu?
-
-Go to \ref GRAS_tut_tour_logs
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-06-logs.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-06-logs.doc
deleted file mode 100644 (file)
index f8b72a9..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
-@page GRAS_tut_tour_logs Lesson 6: Logging informations properly
-
-\section GRAS_tut_tour_logs_toc Table of Contents
- - \ref GRAS_tut_tour_logs_intro
- - \ref GRAS_tut_tour_logs_practice
- - \ref GRAS_tut_tour_logs_recap
- - \ref GRAS_tut_tour_logs_config
-   - \ref GRAS_tut_tour_logs_config_prio
-   - \ref GRAS_tut_tour_logs_config_layout
-
-<hr>
-
-\section GRAS_tut_tour_logs_intro Introduction
-
-Let's have another look at the output of the program we came up with in
-lesson 5:
-\include 05-globals.output
-
-It is a bit difficult to read, isn't it? Indeed, it is hard to identify
-which process printed which line. It would be possible to add [server] in
-any messages comming from the server and do the same for every process
-running. Idealy, we would also add the location at which the message was
-generated (using __FILE__ and __LINE__) to help debuging, as well as a
-timestamping so that we can still reorder the messages in RL when they get
-intermixed (yeah, it happen, and there is not much to do against it).
-At the end, each time we would like to print a little "hello" debugging
-message, we would have to write 3 lines of arguments to fprintf, which is
-not that practical.
-
-That is why there is a support for proper logging in GRAS. Technically
-speaking, it is not part of GRAS but of XBT, which is the toolbox on which
-the whole SimGrid library is built, but that's the same for us.
-
-This logging library follows the spirit of another one called log4j, which
-is more or less the reference in the domain. The original version is for
-Java, as the name implies, and there was reimplementation for Python
-(log4py), C/C++ (log4c) and so on. Since one of the credo of the GRAS
-framework is that we don't want any external dependency to ease the
-deployment in grid settings, we reimplemented a version of our own.
-
-One of the strong idea of log4j is that log events get structured to give
-the user a fine control at run time of what gets displayed and what don't.
-For that, <i>log event</i> are produced into <i>log channels</i> at a given
-<i>log priority</i>. Then, you can select the minimal priority an event
-should have on a given channel to get displayed.
-
-Then, to keep things managable even when the number of channels increase,
-the channels form a tree and properties get inherited from parent channel to
-childs. Have a look at the existing channels in SimGrid: \ref XBT_log_cats.
-You see that for example, the <tt>gras</tt> channel have 5 subchannels (at
-time of writing): <tt>gras_ddt</tt>, <tt>gras_msg</tt>, <tt>gras_timer</tt>,
-<tt>gras_trp</tt> and <tt>gras_virtu</tt>. If you open or close the
-<tt>gras</tt> channel, it automatically affects all those subchannels (and
-their respective subchannels too). Finally, channels are not just open or
-closed, but filter messages below a given priority (as we said). The
-priorities are defined by type #e_xbt_log_priority_t.
-
-That is all you really need to know about the logs before diving into
-practice. If you want more information on that topic, refer to the \ref
-XBT_log section, which contains much more information than this page.
-
-\section GRAS_tut_tour_logs_practice Putting logs into action
-
-Enough with theory, let's change our example so that it uses proper
-loggings. The first thing to do is to add a new channel in the existing
-hierarchy. There is 4 macros to create log channels, depending on the kind
-of channel we want:
-- XBT_LOG_NEW_CATEGORY(MyCat,desc); Create a new root
-- XBT_LOG_NEW_SUBCATEGORY(MyCat, ParentCat,desc); Create a new category being child of the category ParentCat
-- XBT_LOG_NEW_DEFAULT_CATEGORY(MyCat,desc); Like XBT_LOG_NEW_CATEGORY, but the new category is the default one in this file
-- XBT_LOG_NEW_DEFAULT_SUBCATEGORY(MyCat, ParentCat,desc); Like XBT_LOG_NEW_SUBCATEGORY, but the new category is the default one in this file
-
-What we want here is a root category (it does not belong to any existing
-channel, for sure), and we want it to be the default one in our file (of
-course, it's the only one).
-\dontinclude 06-logs.c
-\skip XBT_LOG
-\until XBT_LOG
-
-Then, we change any call to fprintf to one of the logging macros. There is a
-plenty of them, called &lt;priority&gt;&lt;nb args&gt;, such as #XBT_DEBUG,
-which produces a debuging log event onto the default category. Here is a
-list of the existing macros: #XBT_DEBUG, #XBT_VERB, #XBT_INFO, #XBT_WARN,
-#XBT_ERROR and #XBT_CRITICAL.
-
-Note also that there is no need to add a '\\n' at the end of your format
-line, it gets automatically added.
-
-\section GRAS_tut_tour_logs_recap Recapping everything together
-
-Once we changed any fprintf of our code to some of these macros, the program
-may read:
-\include 06-logs.c
-
-And the output now looks better:
-\include 06-logs.output
-
-\section GRAS_tut_tour_logs_config The user side: configuring logs at run time
-
-\subsection GRAS_tut_tour_logs_config_prio Choosing what gets displayed
-
-Once we changed our program to use proper logging, it is naturally possible
-to choose at run time what we want to see. For example, if we want more
-details about our code, we should pass <tt>--log=test.thres:verbose</tt>
-on the command line of our programs to change the <tt>thres</tt>old.
-Note that a VERBOSE line appears on client side:
-\include 06-logs.output.verbose
-
-On the contrary, if we want to reduce the amount of logging, we may want to
-do pass <tt>--log=test.thres:error</tt>:
-
-\subsection GRAS_tut_tour_logs_config_layout Choosing how things get displayed
-
-As with SimGrid 3.3, it is also possible to change how each and every
-message get displayed from the command line without even recompiling
-your code. This is done by changing the <tt>fmt</tt> field of the
-category you want to change. The value of this field is somehow
-similar to printf's format strings, with several existing specifiers.
-
-For example, if you just want the message you passed to the macro
-without any decoration about the host which raised it, its pid and
-everything, just pass <tt>--log=test.fmt:%m</tt>:
-\include 06-logs.output.fmt
-
-For debuging purpose, you can even ask to get the backtrace at each
-execution point:
-\include 06-logs.output.fmt-bt
-
-
-Again, you should refer to the \ref XBT_log section for more information on
-how to configure the logs. Or you can proceed with the next lesson, of
-course.
-
-Go to \ref GRAS_tut_tour_timers
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-07-timers.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-07-timers.doc
deleted file mode 100644 (file)
index 7d45e04..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
-@page GRAS_tut_tour_timers Lesson 7: Using internal timers
-
-\section GRAS_tut_tour_timers_toc Table of Contents
- - \ref GRAS_tut_tour_timers_intro
- - \ref GRAS_tut_tour_timers_use
- - \ref GRAS_tut_tour_timers_recap
-
-<hr>
-
-\section GRAS_tut_tour_timers_intro Introduction
-
-The messaging primitives we saw until now allow the processes to react to
-external events. This is good, but sometimes, you want the same action to be
-done periodically. Think of a system based on a group of processes. If you
-want to give some adaptability to this system, you shouldn't hardcode the
-memberships but have the members send a message to a coordinator to register
-to the system.
-
-This add some dynamism to your system since new members can join at any
-time. To have a process leaving the system, you can imagine an "unregister"
-message symetric to the "register" one. But how will you deal with failures?
-What if a process leaves without being given the ability to inform the
-coordinator?
-
-One solution is to have the members re-register periodically, so that the
-coordinator can detect the processes which didn't do so since a while, and
-dismiss them.
-
-To implement this in GRAS, we need some more functions: gras_timer_repeat()
-allows to specify a periodic action and gras_timer_delay() allows to get an
-action done once a given delay expires. gras_timer_cancel_delay() and
-gras_timer_cancel_repeat() allow to remove already declared timers. Actions
-must be function without argument nor result (<tt>void my_action(void){
-... }</tt>).
-
-It is important to note that timers are not prehemptive. They will not start
-as soon as they are ready. Instead, they get served when you go into
-gras_msg_handle() (and they are served before incoming messages). This is
-because allowing timers to run in parallel to the callbacks would add
-parallelism to the user code, which would have to protect data with mutexes.
-This is a level of complexity I really don't want for user code. If you
-really need several running entities, simply run several processes (see \ref
-GRAS_tut_intro_model for more details).
-
-\section GRAS_tut_tour_timers_use Putting timers into action
-
-We will change the client of our example so that it send an hello message
-every half second to the server. Then we will add a delayed action scheduled
-5 seconds later in charge of stopping every processes. For this to work, we
-first need to add a global to the server too, containing the socket binded
-onto the server (to send messages) and a boolean indicating whether we are
-done or not, just like we did on the server side in \ref
-GRAS_tut_tour_globals. Here is the resulting global structure:
-\dontinclude 07-timers.c
-\skip client_data
-\until client_data_t
-
-Then, we define the repetitive action in charge of sending messages to the
-server:
-
-\skip client_do_hello
-\until end_of_client_do_hello
-
-This timer is installed the following way. You simply tell the action to
-schedule and its periodicity.
-\skip gras_timer_repeat
-\until gras_timer_repeat
-
-Desinstalling this is not harder. You tell the action to unschedule, and the
-periodicity at which it was desinstalled (so that the same action can be
-scheduled at different intervals, and each of them be desinstallable
-separately).
-\dontinclude 07-timers.c
-\skip gras_timer_cancel_repeat
-\until gras_timer_cancel_repeat
-
-Then comes the delayed action in charge of stopping everything, which should
-be self-explanatory at this point. It could be cancelled before its
-expiration using gras_timer_cancel_delay(), which accepts exactly the same
-kind of arguments than gras_timer_cancel_repeat().
-\dontinclude 07-timers.c
-\skip client_do_stop
-\until end_of_client_do_stop
-
-Finally, we should change the client main function to adapt to these
-modifications, as you can see in the recapping below.
-
-\section GRAS_tut_tour_timers_recap Recapping everything together
-
-The program now reads:
-\include 07-timers.c
-
-Which produces the expected output:
-\include 07-timers.output
-
-Go to \ref GRAS_tut_tour_exceptions
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-08-exceptions.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-08-exceptions.doc
deleted file mode 100644 (file)
index d330b00..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
-@page GRAS_tut_tour_exceptions Lesson 8: Handling errors through exceptions
-
-\section GRAS_tut_tour_exceptions_toc Table of Contents
- - \ref GRAS_tut_tour_exceptions_intro
- - \ref GRAS_tut_tour_exceptions_use
- - \ref GRAS_tut_tour_exceptions_recap
-
-<hr>
-
-\section GRAS_tut_tour_exceptions_intro Introduction
-
-Exceptions are a great mecanism to deal with error exception, everyone knows
-that.
-
-Without exceptions, you have to rely on returning a value indicating whether
-the function call were right or not, and check the return values of every
-single function you call. If there is one point in the calling sequence
-where your forgot this check, the chain is broken and caller won't notice
-the issue. In practice, dealing with error without exceptions loads user
-code with *tons* of those stupid checks and you loose your functional code
-in the middle of that miasm.
-
-With them, you simply write your code. If you want to deal with errors (ie,
-you actually know how to react to errors at this point of your code), you
-write a catching block. If you don't, you don't. And exceptions flow through
-from trowing point to catching point without bothering you.
-
-At this point, you may be a bit surprised by the previous paragraphs.
-SimGrid and GRAS are written in C, and everybody knows that there is no
-exception in C but only in C++, Java and such. This is true, exceptions are
-not part of the C language, but this is such a great tool that we
-implemented an exception mecanism as part of the SimGrid library (with
-setjmp and longjmp, for the curious).
-
-Being "home-grown" make our exception mecanic both stronger and weaker at
-the same time. First it is weaker because, well, we are more limitated
-within the library as we are than if we could change the compiler itself to
-add some extra checks here and specific treatment there. But it is also a
-advantage for us, since the exception mecanism is perfectly fitted to the
-distributed settings of GRAS processes. They can easily propagate on the
-net, as we will see in the next lesson (\ref GRAS_tut_tour_rpc) and contain
-information about the host on which they were thrown (#xbt_ex_t) along with
-the thrown point in the source code.
-
-The syntax of XBT exceptions should not sound unfamilliar to most of you.
-You throw them using the #THROW and #THROWF macros. They take 2 arguments:
-an error category (of type #xbt_errcat_t) and an error "value" (an integer;
-pratically, this is often left to 0 in my own code). #THROWF also takes a
-message string as extra argument which is a printf-like format string with
-its own arguments. So, you may have something like the following:
-\verbatim THROWF(system_error, 0, "Cannot connect to %s:%d because of %s", hostname, port, reason);\endverbatim
-
-Then, you simply add a #TRY/#CATCH block around your code:
-\verbatim TRY{
-  /* your code */
-}
-CATCH(e) {
-  /* error handling code */
-} \endverbatim
-
-Another strange thing is that you should actually free the memory allocated
-to the exception with xbt_ex_fres() if you manage to deal with them. There
-is a bit more than this on the picture (#TRY_CLEANUP blocks, for example), and
-you should check the section \ref XBT_ex for more details.
-
-You should be <b>very carfull</b> when using the exceptions. They work great
-when used correctly, but there is a few golden rules you should never break.
-Moreover, the error messages and symptom can get <b>really crude</b> when
-misusing the exceptions.
-
- - <b>Do not move out of a TRY block with a return, a break or any other
-   kind of jump. NEVER. EVER.</b>. This is the most tempting error, and this
-   drives the system nuts. You will probably segfault in the next exception
-   raising, far away from where you incidentally typed <tt>return</tt>
-   (this is because there is some cleanups to do at the end of a TRY block,
-   you cannot just leave it).
- - <b>Play safe with variables modified in the TRY block</b>. You may want
-   to mark them as <tt>volatile</tt>, which is a modifier (just like
-   <tt>const</tt>) indicating that the value of the denoted variable may get
-   changed by external parts of the program during the run. This is the case
-   when your data gets modified by an exception raising function, I guess.
-
-So, as you can see, you don't want to include large sections of your program
-in TRY blocks. If you do so, it's quite sure that one day, you'll do a break
-or a return within this block. And believe me, finding such typos is a real
-pain.
-
-If you are suspecting this kind of error, I made a little script for you:
-check <tt>tools/xbt_exception_checker</tt> from the CVS. Given a set of C
-files, it extracts the TRY blocks and display them on the standard output so
-that you can grep for <tt>return</tt>, <tt>break</tt> and such forbidden
-words.
-
-\section GRAS_tut_tour_exceptions_use Putting exceptions into action
-
-Okay. I hope those little warnings didn't discourage you from using the
-exceptions, because they really are a nice mecanism. We will now change a
-bit our program to take advantage of them. The only issue is that when a
-program run properly, it usually don't raise any exception. We could protect
-the calls we already have with exception handling, but it wouldn't be really
-exciting since we know this code does not throw any exception under the
-condition we use (actually, most of the GRAS functions may throw exception
-on problem).
-
-Instead, we will code a little game between the client and the server. We
-won't tell the client the exact port on which the server listen, and it will
-have to find from itself. For this, it will try to open socket and send the
-kill message to each ports of the search range. If it manage to close the
-socket after sending the message without being interrupted by an exception,
-it can assume that it killed the server and stop searching.
-\dontinclude 08-exceptions.c
-\skip port=3000
-\until end_of_loop
-
-To make the game a bit more fun (and to show you what an exception actually
-look like when it's not catched), we add a potential command line argument
-to the server, asking it to cheat and to not open its port within the search
-range but elsewhere:
-\dontinclude 08-exceptions.c
-\skip strcmp
-\until gras_socket_my_port
-\until }
-
-Then, when the client detects that it didn't manage to find&destroy the
-server, it throws a suicide exception (sorry for the bad jokes):
-\skip if(!found)
-\until THROW
-
-\section GRAS_tut_tour_exceptions_recap Recapping everything together
-
-Here is the output produced by this new program. Note that when the program
-bails out because of an uncatched exception, it displays its backtrace just
-like a JVM would do (ok, it'a a bit cruder than the one of the JVM, but
-anyway). For each function frame of the calling stack, it displays the
-function name and its location in the source files (if it manage to retrieve
-it). Don't be jalous, you can display such stacks wherever you want with
-xbt_backtrace_display() ;)
-
-Unfortunately, this feature is only offered under Linux for now since I have
-no idea of how to retrieve the call stack of the current process under the
-other operating systems. But help is always welcome in this area too ;)
-
-\include 08-exceptions.output
-
-The complete program reads:
-\include 08-exceptions.c
-
-
-Go to \ref GRAS_tut_tour_simpledata
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-09-simpledata.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-09-simpledata.doc
deleted file mode 100644 (file)
index 7a39aec..0000000
+++ /dev/null
@@ -1,265 +0,0 @@
-/**
-@page GRAS_tut_tour_simpledata Lesson 9: Exchanging simple data
-
-\section GRAS_tut_tour_simpledata_toc Table of Contents
- - \ref GRAS_tut_tour_simpledata_intro
-   - \ref GRAS_tut_tour_simpledata_intro_conv
-   - \ref GRAS_tut_tour_simpledata_intro_gras
-   - \ref GRAS_tut_tour_simpledata_use
- - \ref GRAS_tut_tour_simpledata_example
- - \ref GRAS_tut_tour_simpledata_recap
-
-<hr>
-
-\section GRAS_tut_tour_simpledata_intro Introduction
-
-Until now, we only exchanged "empty" messages, ie messages with no data
-attached. Simply receiving the message was a sufficient information for the
-receiver to proceed. There is a similarity between them and procedures not
-accepting any argument in the sequential setting. For example, our "kill"
-message can be seen as a distributed version of the <tt>exit()</tt> system
-call, simply stopping the process receiving this call.
-
-Of course, this is not enough for most applications and it is now time to
-see how to attach some arbitrary data to our messages. In the GRAS parlance,
-we will add a <i>payload</i> to the messages. Reusing the similarity between
-message exchanges and procedure calls, we will now add arguments to our
-calls.
-
-Passing arguments in a distributed setting such as GRAS is a bit more
-complicated than when performing a local call.  The messaging layer must be
-aware of the type of data you want to send and be able to actually send them
-remotely, serializing them on sender side and deserializing them on the
-other side. Of course, GRAS can do so for you.
-
-\subsection GRAS_tut_tour_simpledata_intro_conv Data conversion issues on heterogeneous platforms
-
-The platforms targeted by GRAS complicate the data transfers since the
-machines may well be heterogeneous. You may want to exchange data between a
-regular x86 machine (Intel and assimilated) and amd64 machine or even a ppc
-machine (Mac).
-
-The first problem comes from the fact that C datatypes are not always of the
-same size depending on the processor. On 32 bits machines (such as x86 and
-some ppc), they are stored on 4 bytes where they are stored on 8 bytes on 64
-bits machines (such as amd64).
-
-Then, a second problem comes from the fact that datatypes are not
-represented the same way on these architectures. amd64 and x86 are called
-little-endian architectures (as opposed to big-endian architectures like
-ppc) because they store the bytes of a given integer in a right-to-left way.
-For example, the number 16909060 is written Ox01020304 in hexadecimal base.
-On big endian machines, it will be stored as for bytes ordered that way:
-01.02.03.04. On little-endian machines, it will be stored as 04.03.02.01, ie
-bytes are in reverse order.
-
-A third problem comes from the so-called padding bytes. They come from the
-fact that it is for example much more efficient for the processor to load a
-4-bytes long data (such as an float) if it is aligned on a 4-bytes boundary,
-ie if its first byte is placed in a region of the memory which address is a
-multiple of 4. If it is not the case, the bus needs 2 cycles to retrieve the
-data.  That is why the compiler makes sure that any data declared in your
-program are aligned in memory. When manipulating structures, it means that
-the compiler may introduce some "spaces" between your fields to make sure
-that each of them is aligned on the right boundary. Then, the boundaries
-vary according to the aligned data. Most of the time, the alignment for a
-data type is the data size (2 bytes for shorts which are 2-bytes long and so
-on), but not always ;) And this all this was too easy, those values are not
-only processor dependent, but also compiler and OS dependent. For example,
-doubles (eight bytes) are 8-byte aligned on Windows and 4-byte aligned on
-Linux... Let's take an example:
-
-\verbatim struct MixedData{
-   char    data_1;
-   short   data_2;
-   char    data_3;
-   int     data_4;
-};\endverbatim
-
-One would say that the size of this structure should be 8 bytes long on x86
-(1+2+1+4), but in fact, it is 12 bytes long. To ensure that data_2 is
-2-aligned, one unused byte is added between data_1 and data_2 and 3 bytes
-are wasted between data_3 and data_4 to make sure that this integer is
-4-bytes aligned. Those bytes added by the compiler are called padding bytes.
-Some of them may be added at the end of the structure to make sure that the
-total size fulfill some criterions. On ARM machines, any structure size must
-be a multiple of 4, leading a structure containing two chars to be 4 bytes
-long instead of 2.
-
-\subsection GRAS_tut_tour_simpledata_intro_gras Dealing with hardware heterogeneity in GRAS
-
-All this certainly sounds scary and getting the things right can easily turn
-into a nightmare if you want to do so yourself. Lukily, GRAS converts your
-data seamlessly in heterogeneous exchanges. This is not really a revolution
-since most high-level data exchange solution do so. For this, most solutions
-convert any data to be exchanged from the sender representation into their
-own format on the sender side and convert it to the receiver representation
-on the other side. Sun RPC (used in NFS file systems) for example use the
-XDR representation for this.  When exchanging data between homogeneous
-hosts, this is a clear waste of time since no conversion at all is needed,
-but it is easier to implement. To deal with N kind of hardware architecture,
-you only have to implement 2*N conversion schema (from any arch into the
-exchange format, and from the exchange format into any arch).
-
-In GRAS, we prefered performance over ease of implementation, and data won't
-get converted when it's not needed. Instead, data are sent in the sender
-representation and it is then the responsability of the receiver process to
-convert it on need. To deal with N architectures, there is N^2 conversion
-schema (from any arch to any arch). Nevertheless, GRAS known 9 different
-architectures, allowing it to run on almost any existing computer: Linux
-(x86, ia64, amd64, alpha, sparc, hppa and PPC), Solaris (Sparc and x86), Mac
-OSX, IRIX and AIX. The conversion mecanism also work with the Windows
-conventions, but other issues are still to be solved on this arch.
-
-This approach, along with careful optimization, allows GRAS to offer very
-competitive performance. It is faster than CORBA, not speaking from web
-services which suffer badly from their textual data representation (XML).
-
-\subsection GRAS_tut_tour_simpledata_use Actually exchanging data in GRAS messages
-
-As stated above, all this conversion issues are dealed automatically by GRAS
-and there is very few thing you should do yourself to get it working.
-Simply, when you declare a message type with gras_msgtype_declare(), you
-should provide a description of the payload data type as last argument. GRAS
-will serialize the data, send it on the socket, convert it on need and
-deserialize it for you automatically.
-
-That means that any given message type can only convey a payload of a
-predefined type. You cannot have a message type sometimes conveying an
-integer and sometimes conveying a double.  But in practice, this limitation
-is not very hard to live with. Comparing message exchanges to procedure
-calls again, you cannot have the same procedure accepting arbitrary argument
-types. What you have in Java, for example, is several functions of the same
-name accepting differing argument types, which is a bit different. In C, you
-can also trick the limitation by using <tt>void*</tt> arguments. And
-actually, you can do the same kind of tricks in GRAS, but this is really
-premature at this point of the tutorial. It is the subject of \ref
-GRAS_tut_tour_exchangecb.
-
-Another limitation is that you can only convey one argument per message in
-GRAS. We when that way in GRAS mainly because otherwise, gras_msg_send() and
-the like would have to accept a variating number of parameters. It is
-possible in C, but this reveals rather cumbersome since the compiler do not
-check the number of arguments in any way, and the symptom on error is often
-a segfault. Try passing too few parameters to printf with regard to the
-format string if you want an example. Moreover, since you can convey
-structures, it is easy to overcome this limitation: if you want several
-arguments, simply pack them into a structure before doing so.
-
-There is absolutely no limitation on the type of data you can exchange in
-GRAS. If you can build a C representation of your data, you can exchange it
-with GRAS. More precisely, you can exchange scalars, structures,
-enumerations, arrays (both static and dynamic), pointers, and even things
-like chained list of structures. It is even possible to exchange graphs of
-structures containing cycles between members.
-
-Actually, the main difficulty is to describe the data to be exchanged to
-GRAS. This will be addressed in subsequent tutorial lessons, and we will
-focus on exchanging data that GRAS already knows. Here is a list of such
-data:
-
- - char
- - short int
- - int
- - long int
- - long long int
-
-For all these types, there is three variant: signed, unsigned and the
-version where it is not specified. For example, "signed char", "char" and
-"unsigned char" are all GRAS predefined datatype. The use of the unqualified
-variant ("char") is not encouraged since you may gain some trouble
-sometimes. On hppa, chars are unsigned by default where they are signed by
-default on most archs. Use unqualified variant at your own risk ;)
-
- - float
- - double
- - data and function pointers (on some arch, both types are not of the same
-   size)
-
-You also have some more advanced types:
-
- - string (which are null-terminated char*, as usual in the libc)
- - #xbt_ex_t (the exception types in GRAS, which can get automatically exchanged
-   over the network and are thus predefined)
- - #xbt_peer_t (a datatype describing a peer. There is a plenty of situation
-   in which you want to exchange data of this type, so this is also predefined)
-
-\section GRAS_tut_tour_simpledata_example Back to our example
-
-We will now modify our example to add some data to the "hello" and the
-"kill" messages. "hello" will convey a string being displayed in the logs
-while "kill" will convey an double indicating the number of seconds to wait
-before dying.
-
-The first thing is to modify the message declarations to specify that they
-convey a payload. Of course, all nodes have to agree on message definitions,
-and it would be very bad if the sender and the receiver would not agree on
-the payload data type. GRAS checks for such discrepencies in the simulator
-and dies loudly when something goes wrong. But in RL, GRAS do not check for
-such things, and you are likely to get a segfault rather painful to debug.
-To avoid such mistakes, it is a good habit to declare a function common to
-any nodes declaring the message types involved in your application. Most of
-the time, callbacks can't get declared in the same function since they
-differ from node types to node types (the server attach 2 callbacks where
-the client don't attach any). Here is the message declaring function in our
-case:
-
-\dontinclude 09-simpledata.c
-\skip message_declaration(void)
-\until }
-
-It is very similar to what we had previously, we simply retrieve the
-#xbt_datadesc_type_t definitions of double and string and use them as payload
-type of our messages.
-
-The next step is to change our calls to gras_msg_send() to pass the data to
-send. The rule is that you should put the data into a variable and then pass
-the address of this variable. It makes no difference whether the type
-happens to be a pointer (as char*) or a scalar (as double). Just give
-gras_msg_send the address of the variable, it will do the things right.
-
-\skip hello_payload
-\until Gave
-
-Then, we have to retrieve the sent data from the callbacks. The syntax for
-this is a bit crude, but at least it is very systematic so you don't have to
-think too much about this. The <tt>payload</tt> argument of callbacks is
-declared as <tt>void*</tt> and you can consider that it is the address of
-the variable passed during the send. Ok, it got serialized, exchanged over
-the network, converted and deserialized, but really, you can consider that
-it's the exact copy of your variable. So, to retrieve the content, you have
-to cast the <tt>void*</tt> pointer to a pointer on your datatype, and then
-derefence it.
-
-So, it you want to retrieve a double, you have to cast the pointer using
-<tt>(double*)</tt>, and then dereference the obtained pointer by adding a
-star before the cast. This is what we do here:
-
-\dontinclude 09-simpledata.c
-\skip server_kill_cb
-\until delay
-
-Again, it makes no difference whether the type happens to be a pointer or a
-scalar. You simply end up with more stars in the cast for pointers:
-
-\skip server_hello_cb
-\until char**
-
-That's it, you know how to exchange data between nodes. It's really simple
-with GRAS, even if it's a nightmare to do so portably without it...
-
-\section GRAS_tut_tour_simpledata_recap Recapping everything together
-
-The program now reads:
-\include 09-simpledata.c
-
-Which produces the following output:
-\include 09-simpledata.output
-
-Now that you know how to exchange simple data along with messages, you can
-proceed to the last lesson of the message exchanging part (\ref
-GRAS_tut_tour_rpc) or jump to \ref GRAS_tut_tour_staticstruct to learn more
-on data definition and see how to attach more complicated payloads to your
-messages.
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-10-rpc.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-10-rpc.doc
deleted file mode 100644 (file)
index 46c962b..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/**
-@page GRAS_tut_tour_rpc Lesson 10: Remote Procedure Calling (RPC)
-
-\section GRAS_tut_tour_rpc_toc Table of Contents
- - \ref GRAS_tut_tour_rpc_intro
- - \ref GRAS_tut_tour_rpc_use
-   - \ref GRAS_tut_tour_rpc_use_declare
-   - \ref GRAS_tut_tour_rpc_use_i2a_cb
-   - \ref GRAS_tut_tour_rpc_use_a2i_cb
-   - \ref GRAS_tut_tour_rpc_use_rest
- - \ref GRAS_tut_tour_rpc_recap
-
-<hr>
-
-\section GRAS_tut_tour_rpc_intro Introduction
-
-So far, we saw how to send messages from one host to another, but quite
-often, we need a two-way message exchange: a "client" sends a request to a
-"server", and the server returns a result after doing some sort of
-computation. This design is often refered to as "Remote Procedure Call" or
-RPC for short.
-
-It is naturally possible to build RPC exchanges using only one-way messages,
-as the ones we used in GRAS so far, but it's a bit awkward (specially when
-the server wants to return a value to the client in a remote function call).
-That is why GRAS provide a support for RPC, as we will now detail.
-
-\section GRAS_tut_tour_rpc_use Putting rpc into action
-
-We will build a simple RPC where clients use a remote server to convert
-strings into numbers and vice-versa (ie, changing between "1234" and 1234).
-To achieve its duty, the server will simply use the strtol function in one
-direction. In the other direction, we will use bprintf(). This is a sprintf()
-version allocating the needed room before doing the conversion. Its
-portability is discutable, but SimGrid declares this function when it cannot
-be found on the host architecture, so you can use it peacefully.
-
-\subsection GRAS_tut_tour_rpc_use_declare Declaring the RPC
-
-To declare a RPC message, we should simply use gras_msgtype_declare_rpc().
-Compared to gras_msgtype_declare() that we use to declare one-way messages,
-this function accepts one extra argument: the datatype of the answer
-message. In our example, we accept one string in input, and a long in
-output for the a2i conversion (a=char 2=to i=integer), and the contrary in
-the other direction.
-
-\dontinclude 10-rpc.c
-\skip gras_msgtype_declare_rpc
-\until long
-\until string
-
-\subsection GRAS_tut_tour_rpc_use_i2a_cb Declaring a simple RPC callback: the integer to string conversion
-
-RPC callbacks are very close to "regular" ones. The only difference is that
-they must call gras_msg_rpcreturn() at some point to return their result to
-the caller. This function accepts 3 arguments: First the timeout to use when
-sending back the result (we must use callbacks when doing network
-communication to avoid deadlocks and such issues). The second argument is
-the callback context that the callback got as first argument. It denotes how
-to reach the caller and such. The last argument is a pointer to a variable
-containing the result to pass to the caller.
-
-Having the callee explicitly returning data to the caller allows to free
-data that were allocated to do the job asked by the client, as in this
-example.
-
-\skip server_convert_i2a_cb
-\until end_of_convert_callback
-
-\subsection GRAS_tut_tour_rpc_use_a2i_cb RPC and exceptions: the string to integer conversion
-
-When converting strings into integer, we must deal with the possibility that
-the provided string is not a number. This is done very easily by raising an
-exception in the RPC callback. This exception will get captured by the
-middleware running the callback on the server side, sent accross the network
-to the client side, and revived here. In short, exceptions raised on callee
-side get passed automagically to the caller.
-
-\skip server_convert_a2i_cb
-\until end_of_convert_callback
-
-\subsection GRAS_tut_tour_rpc_use_rest The rest of the story
-
-The rest of the story is not really exciting. The server and the client are
-very classical compared to what we saw so far. We simply have a specific
-message "done" to stop the server when the client is done using it.
-
-This may also be the first time you see the xbt_ex_display() function, which
-allows to display an exception as if it were not catched without killing the
-process.
-
-\section GRAS_tut_tour_rpc_recap Recapping everything together
-
-The program now reads:
-\include 10-rpc.c
-
-Which produces the expected output:
-\include 10-rpc.output
-
-Now, you know how to send messages, attach callbacks and do RPCs. The next
-lesson will learn you the last missing part of the messaging library:
-\ref GRAS_tut_tour_explicitwait
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-11-explicitwait.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-11-explicitwait.doc
deleted file mode 100644 (file)
index 3960164..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
-@page GRAS_tut_tour_explicitwait Lesson 11: Explicitely waiting for messages
-
-\section GRAS_tut_tour_explicitwait_toc Table of Contents
- - \ref GRAS_tut_tour_explicitwait_intro
- - \ref GRAS_tut_tour_explicitwait_use
-   - \ref GRAS_tut_tour_explicitwait_algo
-   - \ref GRAS_tut_tour_explicitwait_code
-     - \ref GRAS_tut_tour_explicitwait_code_msg
-     - \ref GRAS_tut_tour_explicitwait_code_cb
-     - \ref GRAS_tut_tour_explicitwait_code_api
-     - \ref GRAS_tut_tour_explicitwait_code_smain
-     - \ref GRAS_tut_tour_explicitwait_code_cmain
- - \ref GRAS_tut_tour_explicitwait_recap
-
-<hr>
-
-\section GRAS_tut_tour_explicitwait_intro Introduction
-
-The messaging primitive we have seen so far are somehow limited on the
-receiver side. You have to attach a callback to a message type, and then go
-into an infinite loop. Sometimes, you want to block your execution until a
-message of a given type arrives. This often occures when you want to deal
-with synchronization problems.
-
-As an example, we will study a simple centralized algorithm for mutual
-exclusion. In short, when the client wants to enter the critical section
-(CS), it sends a specific message to the server, and waits for the server to
-answer back with another message. While the client is "locked" waiting for
-the message, nothing else should occure for it (no callback or timer should
-be served).
-
-The simplest interface to explicit message waiting allows you to specify the
-message type you are willing to accept (using gras_msg_wait()). But you can
-also specify a list of accepted message types (using gras_msg_wait_or()), or
-even provide your own message filters to decide precisly the kind of message
-you are waiting for (for example depending on message content -- this is
-done using gras_msg_wait_ext()).
-
-Any message received not matching your expectation will be queued for
-further use. Ie, they will be stored in memory and are candidates for the
-next gras_msg_handle() or gras_msg_wait().
-
-\section GRAS_tut_tour_explicitwait_use Example: mutual exclusion with centralized coordinator
-
-\subsection GRAS_tut_tour_explicitwait_algo GRAS modelization of the algorithm
-
-This section naturally provides an example of how to use gras_msg_wait(),
-but it can also be seen as an example of the guidelines provided in
-\ref GRAS_howto_design.
-
-So, here are the caracteristics of our example:
-
-There is two types of processes:
- - several <i>clients</i> which want to enter a critical section
- - a <i>server</i>, which grants clients to enter the CS when no other
-   process is already in it.
-
-There is three kind of messages in the system:
- - <i>request</i> (from clients to server) to ask for the permission to enter the CS
- - <i>release</i> (from clients to server) to express that they exited the CS
- - <i>grant</i> (from server to clients) to allow the given process to enter the CS
-
-The server has 2 callbacks attached:
- - When it gets a <i>request</i>, it checks whether their is already a process in
-   the CS. If yes, it adds the requester into a FIFO list. If not, it sends
-   a <i>grant</i> message to the asking client.
- - When it gets a <i>release</i>, it checks whether there is some waiting
-   processes in the waiting queue. If yes, it dequeues the first one and
-   send a <i>grant</i> message to it. If no, it notes that the CS is free.
-
-The server has two private data (for the callbacks to work):
- - a boolean indicating whether there is a process in the CS already
- - a waiting queue (#xbt_dynar_t is quite natural to code this).
-
-The client interface is composed of two functions:
- - lock(), which tries to get the grant from the server to enter the CS.
-   This is where explicit waiting comes into the game. This function sends a
-   <i>request</i> to the server, and blocks until the server issues a
-   <i>grant</i> back.
- - unlock(), which informs the server that we exited the CS (by sending a
-   <i>release</i> message)
-
-\subsection GRAS_tut_tour_explicitwait_code The code step-by-step
-
-\subsubsection GRAS_tut_tour_explicitwait_code_msg a) Messages declaration
-
-First of all, we should have a function declaring all used messages. As said
-before, this should be in a separate function so that it can be shared
-between all process kinds and avoid code dupplication which may result in
-definition discrepency.
-
-Here, there is no payload attached to the messages.
-
-\dontinclude 11-explicitwait.c
-\skip message_declaration
-\until }
-
-\subsubsection GRAS_tut_tour_explicitwait_code_cb b) Defining private data and callbacks of the server
-
-Then, we define the callbacks that should be invoqued on the server side
-when some messages are received, as previously. For this, we also have to
-declare a structure for the private data of the server.
-
-\skip typedef
-\until end_of_release_callback
-
-\subsubsection GRAS_tut_tour_explicitwait_code_api c) Client-side API
-
-Now, we define the functions that the client must call to use the service.
-Note that this is where the explicit wait feature is used.
-
-\skip lock
-\until end_of_unlock
-
-\subsubsection GRAS_tut_tour_explicitwait_code_smain d) Server-side initialization
-
-The core of our distributed service is implemented (protocol, actions on
-server side, and accessing function on client side). We should now
-initialize the server and let it wait for incoming messages.
-
-Defining when to stop the server can become tricky. The simplest solution is
-to never let the server stop. It simply runs forever. But the simulator will
-raise an error at the end, so I won't do so here to keep the output clean.
-Another solution would be to deal with client membership properly: clients
-registers, use the service and quit afterward. When no client use the
-service, the server stops. This would be a bit difficult to implement
-(actually, there is an AMOK module to do so simply: \ref AMOK_pm).
-Here, we will just hardcode that the clients ask 5 times for the token, and
-that there is two clients. This clearly simplify the problem.
-
-\dontinclude 11-explicitwait.c
-\skip gras_userdata_new
-\until gras_msg_handle
-
-\subsubsection GRAS_tut_tour_explicitwait_code_cmain e) Client-side use
-
-And now, the client is <b>really</b> simple to write:
-
-\skip message_declaration
-\until }
-
-\section GRAS_tut_tour_explicitwait_recap Recapping everything together
-
-The program now reads:
-\include 11-explicitwait.c
-
-Which produces the expected output:
-\include 11-explicitwait.output
-
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-12-staticstruct.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-12-staticstruct.doc
deleted file mode 100644 (file)
index 1327b78..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
-@page GRAS_tut_tour_staticstruct Lesson 12: Defining static structures (TODO)
-
-\section GRAS_tut_tour_staticstruct_toc Table of Contents
- - \ref GRAS_tut_tour_staticstruct_intro
- - \ref GRAS_tut_tour_staticstruct_use
- - \ref GRAS_tut_tour_staticstruct_recap
-
-<hr>
-
-\section GRAS_tut_tour_staticstruct_intro Introduction
-
-
-\section GRAS_tut_tour_staticstruct_use Defining static structure to GRAS
-
-
-\section GRAS_tut_tour_staticstruct_recap Recapping everything together
-
-The program now reads:
-include 11-staticstruct.c
-
-Which produces the expected output:
-include 11-staticstruct.output
-
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-13-pointers.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-13-pointers.doc
deleted file mode 100644 (file)
index d58f5e6..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
-@page GRAS_tut_tour_pointers Lesson 13: Defining structure containing pointers (TODO)
-
-This lesson is a bit different from the other ones. It aims at explaining
-several features of the automatic datadesc parsing. Since it would be a bit
-long otherwise, the lesson is organized as a FAQ, with little examples of
-how to do things.
-
-\section GRAS_tut_tour_pointers_toc Table of Contents
- - \ref GRAS_tut_tour_pointers_intro
- - \ref GRAS_tut_tour_pointers_use
- - \ref GRAS_tut_tour_pointers_recap
- - \ref GRAS_tut_tour_pointers_cste
-
-<hr>
-\section GRAS_tut_tour_pointers_intro Introduction to pointers in datadesc
-\section GRAS_tut_tour_pointers_use Using pointers in datadesc
-\section GRAS_tut_tour_pointers_recap Recapping everything
-
-
-\section GRAS_tut_tour_pointers_cste How to have constants in parsed structures?
-
-You can use gras_datadesc_set_const() to explain GRAS about the value of
-your \#define'd constants.
-
-\verbatim
-#define SIZE 12
-GRAS_DEFINE_TYPE(array,struct array {
-  int data[SIZE];
-};);
-
-void declare_ddt() {
-  gras_datadesc_type_t ddt;
-
-  gras_datadesc_set_const("SIZE",SIZE); /* Set it before */
-  gras_datadesc_by_symbol(array);
-}
-\endverbatim
-
-
-*/
-
-    and the this example do use structures as payload,
-    so we have to declare it to GRAS. Hopefully, this can be done easily by enclosing
-    the structure declaration within a \ref GRAS_DEFINE_TYPE macro call. It will then copy this
-    declaration into an hidden string variable, which can be automatically parsed at
-    run time. Of course, the declaration is also copied unmodified by this macro, so that it
-    gets parsed by the compiler also.
-
-    There is some semantic that GRAS cannot guess alone and you need to  <i>annotate</i>
-    your declaration to add some. For example, the ctn pointer can be a reference to an
-    object or a whole array (in which case you also has to specify its size). This is done
-    with the GRAS_ANNOTE call. It is removed from the text passed to the compiler, but it helps
-    GRAS getting some information about the semantic of your data. Here, it says that \a ctn is an
-    array, which size is the result of the operation \a rows * \a cols (with \a rows and \a cols
-    being the other fields of the structure).
-
-    Please note that this annotation mechanism is not as robust and cool as this example seems to
-    imply. If you want to use it yourself, you'd better use the exact right syntax, which is
-    detailed in the \ref GRAS_dd section.
-
-    \skip GRAS_DEFINE_TYPE
-    \until matrix_t
-
-
-
-#define COLS 16
-#define MAX_ROUTESET 10
-#define MAX_LEAFSET COLS
-
-GRAS_DEFINE_TYPE(gras_row_t,
-struct gras_row_t {
-  int which_row;
-  int row[COLS][MAX_ROUTESET];
-};)
-
-typedef struct gras_row_t gras_row_t;
-
-GRAS_DEFINE_TYPE(gras_welcome_msg_t,
-struct gras_welcome_msg_t {
-  int id;
-  double time_sent;
-
-  int row_count;
-  gras_row_t *rows GRAS_ANNOTE(size,row_count);
-
-  int leaves[MAX_LEAFSET];
-};)
-
-void declare_ddt(void) {
-  gras_datadesc_type_t ddt;
-
-  gras_datadesc_set_const("COLS",COLS);
-  gras_datadesc_set_const("MAX_ROUTESET",MAX_ROUTESET);
-  gras_datadesc_set_const("MAX_LEAFSET",MAX_LEAFSET);
-
-  gras_datadesc_by_symbol(gras_row_t); /* Parse it before */
-  ddt=gras_datadesc_ref("welcome_msg_t*",gras_datadesc_by_symbol(gras_welcome_msg_t));
-  gras_msgtype_declare("welcome",ddt);
-}
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-14-dynar.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-14-dynar.doc
deleted file mode 100644 (file)
index 2c6c97d..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
-@page GRAS_tut_tour_dynar Lesson 14: Exchanging aggregate datatypes such as dynar (TODO)
-
-\section GRAS_tut_tour_dynar_toc Table of Contents
- - \ref GRAS_tut_tour_dynar_intro
- - \ref GRAS_tut_tour_dynar_use
- - \ref GRAS_tut_tour_dynar_recap
-
-<hr>
-
-\section GRAS_tut_tour_dynar_intro Introduction
-
-
-\section GRAS_tut_tour_dynar_use Defining structure containing dynars
-
-
-\section GRAS_tut_tour_dynar_recap Recapping everything together
-
-The program now reads:
-include 13-dynar.c
-
-Which produces the expected output:
-include 13-dynar.output
-
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-15-manualdatadef.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-15-manualdatadef.doc
deleted file mode 100644 (file)
index 7a685b5..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
-@page GRAS_tut_tour_manualdatadef Lesson 15: Manual data definition (TODO)
-
-\section GRAS_tut_tour_manualdatadef_toc Table of Contents
- - \ref GRAS_tut_tour_manualdatadef_intro
- - \ref GRAS_tut_tour_manualdatadef_use
- - \ref GRAS_tut_tour_manualdatadef_recap
-
-<hr>
-
-\section GRAS_tut_tour_manualdatadef_intro Introduction
-
-
-\section GRAS_tut_tour_manualdatadef_use Defining data manually
-
-
-\section GRAS_tut_tour_manualdatadef_recap Recapping everything together
-
-The program now reads:
-include 14-manualdatadef.c
-
-Which produces the expected output:
-include 14-manualdatadef.output
-
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-16-exchangecb.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-16-exchangecb.doc
deleted file mode 100644 (file)
index 5f3801b..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
-@page GRAS_tut_tour_exchangecb Lesson 16: Advanced topics on data definition (TODO)
-
-\section GRAS_tut_tour_exchangecb_toc Table of Contents
- - \ref GRAS_tut_tour_exchangecb_intro
- - \ref GRAS_tut_tour_exchangecb_use
- - \ref GRAS_tut_tour_exchangecb_recap
-
-<hr>
-
-\section GRAS_tut_tour_exchangecb_intro Introduction
-
-
-\section GRAS_tut_tour_exchangecb_use Using exchange callbacks
-
-
-\section GRAS_tut_tour_exchangecb_recap Recapping everything together
-
-The program now reads:
-include 15-exchangecb.c
-
-Which produces the expected output:
-include 15-exchangecb.output
-
-
-*/
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour-recap-messages.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour-recap-messages.doc
deleted file mode 100644 (file)
index 0794ddc..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
-@page GRAS_tut_tour_message_recaping Recaping the GRAS messaging system (ongoing)
-
-\section GRAS_tut_tour_message_recaping_toc Table of Contents
- - \ref GRAS_tut_tour_message_recaping_intro
- - \ref GRAS_tut_tour_message_recaping_rpc
-   - \ref GRAS_tut_tour_message_recaping_rpc1
-   - \ref GRAS_tut_tour_message_recaping_rpc2
-   - \ref GRAS_tut_tour_message_recaping_rpc3
-   - \ref GRAS_tut_tour_message_recaping_rpc4
-   - \ref GRAS_tut_tour_message_recaping_rpc5
-   - \ref GRAS_tut_tour_message_recaping_rpc_aside1
-   - \ref GRAS_tut_tour_message_recaping_rpc_aside2
-   - \ref GRAS_tut_tour_message_recaping_rpc_aside3
- - \ref GRAS_tut_tour_message_recaping_sync
-
-<hr>
-
-This is the end of the first big part of this tutorial. At this point, you
-know pretty much everything about message passing in GRAS. In second big
-part, you will learn how to describe data to the middleware in order to
-convey your own structures in messages instead of the predefined scalar
-types. But for now, it is time to recap what we have seen so far.
-
-\section GRAS_tut_tour_message_recaping_intro Message passing compared to procedure call
-
-In GRAS, you pass message to get remote component to achieve some work for
-you. In some sense, this is very similar to the good old procedure
-abstraction: you call some procedure to get <i>it</i> doing some work for
-you. Looking closer at this good old abstraction, we notice 4 call semantics:
-
- - <tt>void procedure(void)</tt> this is a procedure accepting no argument
-   and returning no result (<b>type 1</b>).
- - <tt>void procedure2(int i)</tt> this is a procedure accepting an
-   argument, but returning no result (<b>type 2</b>).
- - <tt>int function(void)</tt> this is a function accepting no argument, but
-   returning a result (<b>type 3</b>).
- - <tt>int function(int i)</tt> this is a function accepting an argument,
-   and returning a result (<b>type 4</b>).
-
-The whole story of the GRAS message passing subsystem is to allow to
-reproduce these call semantics in a distributed setting. That being said, We
-must also note that some messages exchanged using GRAS do not intend to
-mimic these semantics, but instead to help the syncronisation between
-distributed processes. When exchanged from peer A to peer B, they don't mean
-that A requests a service from B, but rather that A gives an information (a
-signal) to B. It could be for example that A reached a specific point of its
-computation, and that B can proceed with its own (this syncronisation schema
-being a simple rendez-vous). These messages are covered in the next part of
-this recapping (\ref GRAS_tut_tour_message_recaping_sync).
-
-To return on the call semantics described above, there is a big difference
-between the types T1 and T2 on one side and the types T3 and T4 on the other
-side. In the second case, the caller do wait for an answer from the callee
-side. In a distributed setting, you have to exchange one extra message in
-that case. That is why T1;T2 (sometimes refered as <i>one-way messages</i>)
-are treated quite differently in GRAS from T3;T4.
-
-\section GRAS_tut_tour_message_recaping_rpc Remote Procedure Call in GRAS
-
-Mimicing the same call semantic in a distributed setting is the goal of the
-RPC systems. To do so in GRAS, you must do the following actions:
-
-\subsection GRAS_tut_tour_message_recaping_rpc1 1. Declaring a datatype
-
-If you want that your messages convey complex datatypes and not only scalar,
-you have to do it first. Learning how to do so is the subject of the second
-part of this tutorial. For now, simply observe that this is the same thing
-than doing a <tt>typedef</tt> in your code before using this type:
-\verbatim typedef struct {
-  int a;
-  char b;
-} *mytype;\endverbatim
-
-\subsection GRAS_tut_tour_message_recaping_rpc2 2. Declaring a message type
-
-This is very similar to forward procedure declarations in your sequential
-code:
-\verbatim int myfunction(mytype myarg);\endverbatim
-More formally it comes down to associating a data type to a given
-symbol name. For example, in \ref GRAS_tut_tour_simpledata, we specified
-that the message <tt>"kill"</tt> conveyed a double as payload.
-
-Doing so depends on whether you have a one-way message (ie, type 1 or 2) or
-not. One-way messages are declared with gras_msgtype_declare() while RPC
-messages are declared with gras_msgtype_declare_rpc()
-
-\subsection GRAS_tut_tour_message_recaping_rpc3 3. Declaring message callbacks
-
-If the message is intended to be a work request one (and not a
-syncronization one as detailed below), you then want to attach some code to
-execute when a process receives the given request. In other words, you want
-to attach a callback to the message. Of course, you usualy don't want to do
-so on every nodes, but only on "servers" or "workers" or such. First of all,
-you need to declare the callback itself. This function that will be executed
-on request incoming must follow a very specific prototype (the same
-regardless of the call semantic):
-
-\verbatim
-int callback_name(gras_msg_cb_ctx_t context, void *payload) \endverbatim
-
-The first argument (of type #gras_msg_cb_ctx_t) is an opaque structure
-describing the callback context: who sent you the message (which you can
-find back using gras_msg_cb_ctx_from()), whether it's a one-way call or not,
-and so on. GRAS functions altering the call (such as gras_msg_rpcreturn(),
-used to return the result to the caller) require this context as argument.
-
-The second argument is a pointer to where the message payload is stored. In
-the T1 and T3 semantics (ie, when the message had no payload), this second
-argument is NULL. If not, the first line of your callback will probably
-retrieve the payload and store it in a variable of yours. The semantic for
-this is very systematic, if not elegant: If your payload is of type TOTO,
-<tt>payload</tt> is a pointer to a TOTO variable. So, cast it properly (add
-<tt>(TOTO*)</tt> in front of it), and dereference it (add a star right
-before the cast). For example:
-
-\verbatim
-TOTO myvariable = *(TOTO*) payload; \endverbatim
-
-This becomes even uglier if the conveyed type is a pointer itself, but you
-must stick to the rule anyway:
-
-\verbatim
-int **myvariable = *(int ** *) payload; \endverbatim
-
-If your message is of semantic T3 or T4 (ie, it returns a value to the
-caller), then you must use the function gras_msg_rpcreturn() to do so. It
-takes three arguments:
-  - a timeout to use (so that the server don't get frozen if the client is
-    unresponsive)
-  - the message context (the variable ctx of type #gras_msg_cb_ctx_t you got
-    as argument of the callback)
-  - a pointer to the data to send back.
-After it returned the result this way, you should free any data you
-mallocated in your callback (including the data you returned to the caller:
-GRAS made a copy of it during the call to gras_msg_rpcreturn()).
-
-The callback is expected to return 0 if ok, as detailed in
-\ref GRAS_tut_tour_message_recaping_rpc_aside1.
-
-\subsection GRAS_tut_tour_message_recaping_rpc4 4. Attaching callbacks to the messages
-
-To attach a given callback to a given message, you simply use
-gras_cb_register(). If you even want to de-register a callback, use
-gras_cb_unregister().
-
-\subsection GRAS_tut_tour_message_recaping_rpc5 5. Send your message from the client
-
-Again, sending messages depend on the semantic call. If you have a one-way
-message, you should call gras_msg_send() while RPC calls are sent with
-gras_msg_rpccall(). The main difference between them is that you have an
-extra argument for RPC, to specify where to store the result.
-
-It is also possible to call RPC asyncronously: you send the request (using
-gras_msg_rpc_async_call()), do some other computation. And then later, you
-wait for the answer of your RPC (using gras_msg_rpc_async_wait()).
-
-\subsection GRAS_tut_tour_message_recaping_rpc_aside1 Aside: stacking callbacks
-
-The callback is expected to return 0 if everything went well, which is the
-same semantic than the "main()" function. You can also build stacks of
-callbacks. It is perfectly valid to register several callbacks to a given
-message. When a message arrives, it is passed to the firstly-registered
-callback. If the callback returns 0, it means that it consumed the message,
-which is discarded. If the callback returns 1 (or any other "true" value),
-the message is passed to the next callback of the stack, and so on. At the
-end, if no callback returned 0, an exception is raised.
-
-This mecanism can for example be used to introduce dupplication and replay.
-You add a callback simply in charge of storing the message in a database,
-and since it returns 1, the message is then passed to the "real" callback.
-To be perfectly honest, I never had use of this functionnality myself, but I
-feel it could be useful in some cases...
-
-\subsection GRAS_tut_tour_message_recaping_rpc_aside2 Aside: Exceptions and callbacks
-
-One of the parts I'm the most proud of in GRAS is this one: imagine you have
-a rpc callback executing on a remote server. If this callback raises an
-exception, it will be propagated on the network back to the client, and
-revived there. So, the client will get automatically any exception raised by
-the server. Cool, isn't it? Afterward, simply refer to the <tt>host</tt>
-field of the #xbt_ex_t to retrieve the machine on which it was initialy
-raised.
-
-In case you wonder about the exceptions I'm speaking about (after all,
-SimGrid is in C ANSI, and there is usually no exception mecanism in C ANSI),
-you may want to refer to the section \ref XBT_ex. Note that exception can be
-troublesome to use (mainly because the compiler won't catch your mistakes on
-this).
-
-\subsection GRAS_tut_tour_message_recaping_rpc_aside3 Aside: Symbol versionning (TODO)
-
-This section covers a point not explicited elsewhere in the documentation.
-It may be seen as a bit hardcore, and you should probably skip it the first
-time you read the tutorial.
-
-\section GRAS_tut_tour_message_recaping_sync Syncronization messages in GRAS (TODO)
-
-*/
-
diff --git a/doc/user_guide/doxygen/gtut-files/gtut-tour.doc b/doc/user_guide/doxygen/gtut-files/gtut-tour.doc
deleted file mode 100644 (file)
index 949d8ea..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-/** @defgroup GRAS_tut_tour Initiatic tour
-    @ingroup GRAS_tut
-
-During this tour, you will learn all you need to write your own GRAS
-applications, from the installation of the framework to the use of (almost)
-all features available in GRAS.
-
-    \htmlonly <!--
-      DOXYGEN_NAVBAR_CHILD "0: Installing"=GRAS_tut_tour_install.html
-      DOXYGEN_NAVBAR_CHILD "1: Setup a project"=GRAS_tut_tour_setup.html
-      DOXYGEN_NAVBAR_CHILD "2: Simple messaging"=GRAS_tut_tour_simpleexchange.html
-      DOXYGEN_NAVBAR_CHILD "3: Process args"=GRAS_tut_tour_args.html
-      DOXYGEN_NAVBAR_CHILD "4: Callbacks"=GRAS_tut_tour_callbacks.html
-      DOXYGEN_NAVBAR_CHILD "5: Globals"=GRAS_tut_tour_globals.html
-      DOXYGEN_NAVBAR_CHILD "6: Logs"=GRAS_tut_tour_logs.html
-      DOXYGEN_NAVBAR_CHILD "7: Timers"=GRAS_tut_tour_timers.html
-      DOXYGEN_NAVBAR_CHILD "8: Exceptions"=GRAS_tut_tour_exceptions.html
-      DOXYGEN_NAVBAR_CHILD "9: Data exchange"=GRAS_tut_tour_simpledata.html
-      DOXYGEN_NAVBAR_CHILD "10: RPC"=GRAS_tut_tour_rpc.html
-      DOXYGEN_NAVBAR_CHILD "11: Explicit wait"=GRAS_tut_tour_explicitwait.html
-      DOXYGEN_NAVBAR_CHILD "Recapping part 1"=GRAS_tut_tour_message_recaping.html
-      DOXYGEN_NAVBAR_CHILD "12: Static data definition"=GRAS_tut_tour_staticstruct.html
-      DOXYGEN_NAVBAR_CHILD "13: Pointers definition"=GRAS_tut_tour_pointers.html
-      DOXYGEN_NAVBAR_CHILD "14: Dynars definition"=GRAS_tut_tour_dynar.html
-      DOXYGEN_NAVBAR_CHILD "15: Manual data definition"=GRAS_tut_tour_manualdatadef.html
-      DOXYGEN_NAVBAR_CHILD "16: Advanced data definition"=GRAS_tut_tour_exchangecb.html
-    --> \endhtmlonly
-
-<b>Part 1: Bases</b>
-
- - \ref GRAS_tut_tour_install
-
- - \ref GRAS_tut_tour_setup
-    - \ref GRAS_tut_tour_setup_C
-    - \ref GRAS_tut_tour_setup_plat
-    - \ref GRAS_tut_tour_setup_deploy
-    - \ref GRAS_tut_tour_setup_glue
-    - \ref GRAS_tut_tour_setup_make
-    - \ref GRAS_tut_tour_setup_start
-
-<b>Part 2: Message passing</b>
-
- - \ref GRAS_tut_tour_simpleexchange
-    - \ref GRAS_tut_tour_simpleexchange_msgtype
-    - \ref GRAS_tut_tour_simpleexchange_socks
-    - \ref GRAS_tut_tour_simpleexchange_exchange
-    - \ref GRAS_tut_tour_simpleexchange_recaping
-
- - \ref GRAS_tut_tour_args
-    - \ref GRAS_tut_tour_args_use
-    - \ref GRAS_tut_tour_args_sg
-    - \ref GRAS_tut_tour_args_recap
-
- - \ref GRAS_tut_tour_callbacks
-    - \ref GRAS_tut_tour_callbacks_declare
-    - \ref GRAS_tut_tour_callbacks_attach
-    - \ref GRAS_tut_tour_callbacks_handle
-    - \ref GRAS_tut_tour_callback_recap
-
- - \ref GRAS_tut_tour_globals
-    - \ref GRAS_tut_tour_globals_intro
-    - \ref GRAS_tut_tour_globals_use
-    - \ref GRAS_tut_tour_callback_pitfall
-    - \ref GRAS_tut_tour_callback_recap
-
- - \ref GRAS_tut_tour_logs
-    - \ref GRAS_tut_tour_logs_intro
-    - \ref GRAS_tut_tour_logs_practice
-    - \ref GRAS_tut_tour_logs_recap
-    - \ref GRAS_tut_tour_logs_config
-      - \ref GRAS_tut_tour_logs_config_prio
-      - \ref GRAS_tut_tour_logs_config_layout
-
- - \ref GRAS_tut_tour_timers
-    - \ref GRAS_tut_tour_timers_intro
-    - \ref GRAS_tut_tour_timers_use
-    - \ref GRAS_tut_tour_timers_recap
-
- - \ref GRAS_tut_tour_exceptions
-    - \ref GRAS_tut_tour_exceptions_intro
-    - \ref GRAS_tut_tour_exceptions_use
-    - \ref GRAS_tut_tour_exceptions_recap
-
- - \ref GRAS_tut_tour_simpledata
-    - \ref GRAS_tut_tour_simpledata_intro
-      - \ref GRAS_tut_tour_simpledata_intro_conv
-      - \ref GRAS_tut_tour_simpledata_intro_gras
-      - \ref GRAS_tut_tour_simpledata_use
-    - \ref GRAS_tut_tour_simpledata_example
-    - \ref GRAS_tut_tour_simpledata_recap
-
- - \ref GRAS_tut_tour_rpc
-    - \ref GRAS_tut_tour_rpc_intro
-    - \ref GRAS_tut_tour_rpc_use
-      - \ref GRAS_tut_tour_rpc_use_declare
-      - \ref GRAS_tut_tour_rpc_use_i2a_cb
-      - \ref GRAS_tut_tour_rpc_use_a2i_cb
-      - \ref GRAS_tut_tour_rpc_use_rest
-    - \ref GRAS_tut_tour_rpc_recap
-
- - \ref GRAS_tut_tour_explicitwait
-    - \ref GRAS_tut_tour_explicitwait_intro
-    - \ref GRAS_tut_tour_explicitwait_use
-      - \ref GRAS_tut_tour_explicitwait_algo
-      - \ref GRAS_tut_tour_explicitwait_code
-        - \ref GRAS_tut_tour_explicitwait_code_msg
-        - \ref GRAS_tut_tour_explicitwait_code_cb
-        - \ref GRAS_tut_tour_explicitwait_code_api
-        - \ref GRAS_tut_tour_explicitwait_code_smain
-        - \ref GRAS_tut_tour_explicitwait_code_cmain
-    - \ref GRAS_tut_tour_explicitwait_recap
-
- - \ref GRAS_tut_tour_message_recaping
-    - \ref GRAS_tut_tour_message_recaping_intro
-    - \ref GRAS_tut_tour_message_recaping_rpc
-      - \ref GRAS_tut_tour_message_recaping_rpc1
-      - \ref GRAS_tut_tour_message_recaping_rpc2
-      - \ref GRAS_tut_tour_message_recaping_rpc3
-      - \ref GRAS_tut_tour_message_recaping_rpc4
-      - \ref GRAS_tut_tour_message_recaping_rpc5
-      - \ref GRAS_tut_tour_message_recaping_rpc_aside1
-      - \ref GRAS_tut_tour_message_recaping_rpc_aside2
-      - \ref GRAS_tut_tour_message_recaping_rpc_aside3
-    - \ref GRAS_tut_tour_message_recaping_sync
-
-<b>Part 3: Data description</b>
-
- - \ref GRAS_tut_tour_staticstruct
-    - \ref GRAS_tut_tour_staticstruct_intro
-    - \ref GRAS_tut_tour_staticstruct_use
-    - \ref GRAS_tut_tour_staticstruct_recap
-
- - \ref GRAS_tut_tour_pointers
-    - \ref GRAS_tut_tour_pointers_intro
-    - \ref GRAS_tut_tour_pointers_use
-    - \ref GRAS_tut_tour_pointers_recap
-    - \ref GRAS_tut_tour_pointers_cste
-
- - \ref GRAS_tut_tour_dynar
-    - \ref GRAS_tut_tour_dynar_intro
-    - \ref GRAS_tut_tour_dynar_use
-    - \ref GRAS_tut_tour_dynar_recap
-
- - \ref GRAS_tut_tour_manualdatadef
-    - \ref GRAS_tut_tour_manualdatadef_intro
-    - \ref GRAS_tut_tour_manualdatadef_use
-    - \ref GRAS_tut_tour_manualdatadef_recap
-
- - \ref GRAS_tut_tour_exchangecb
-    - \ref GRAS_tut_tour_exchangecb_intro
-    - \ref GRAS_tut_tour_exchangecb_use
-    - \ref GRAS_tut_tour_exchangecb_recap
-
-<b>Part 4: Advanced topics</b>
-
-Unfortunately, the tour is not terminated yet, but I already know the kind
-of missi^W lessons I want to add:
-
-   - Computation virtualization
-   - Splitting in several files (logs, datadesc)
-   - Debugging GRAS programs
-   - Doing proper GRAS modules
-
-<hr>
-
-
-
-*/
diff --git a/doc/user_guide/doxygen/header.html b/doc/user_guide/doxygen/header.html
new file mode 100644 (file)
index 0000000..446c929
--- /dev/null
@@ -0,0 +1,62 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
+<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
+<link href="$relpath$tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="$relpath$jquery.js"></script>
+<script type="text/javascript" src="$relpath$dynsections.js"></script>
+$treeview
+$search
+$mathjax
+<link href="stylesheet.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+
+<!--BEGIN TITLEAREA-->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <!--BEGIN PROJECT_LOGO-->
+  <td id="projectlogo"><img alt="Logo" src="$relpath$$projectlogo"/></td>
+  <!--END PROJECT_LOGO-->
+  <!--BEGIN PROJECT_NAME-->
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">$projectname
+   <!--BEGIN PROJECT_NUMBER-->&#160;<span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER-->
+   </div>
+   <!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
+  </td>
+  <!--END PROJECT_NAME-->
+  <!--BEGIN !PROJECT_NAME-->
+   <!--BEGIN PROJECT_BRIEF-->
+    <td style="padding-left: 0.5em;">
+    <div id="projectbrief">$projectbrief</div>
+    </td>
+   <!--END PROJECT_BRIEF-->
+  <!--END !PROJECT_NAME-->
+  <!--BEGIN DISABLE_INDEX-->
+  <!--END DISABLE_INDEX-->
+ </tr>
+ </tbody>
+</table>
+</div>
+<!--END TITLEAREA-->
+
+<div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="../../doc/index.html"><span>Home</span></a></li>
+      <li><a href="../../ref_guide/html/index.html"><span>Reference&nbsp;Manual</span></a></li>
+      <li class="current"><a href="../../user_guide/html/index.html"><span>User&nbsp;Guide</span></a></li>
+      <li><a href="../../dev_guide/html/index.html"><span>Developer&nbsp;Guide</span></a></li>
+      <li><a href="http://simgrid.gforge.inria.fr/tutorials.html"><span>Tutorials</span></a></li>
+      <li><a href="https://gforge.inria.fr/projects/simgrid"><span>Forge</span></a></li>
+      <li><a href="http://simgrid.gforge.inria.fr/"><span>Website</span></a></li>
+      <li>$searchbox</li>
+    </ul>
+  </div>
+<!-- end header part -->
index 892b77c..883fc8d 100644 (file)
@@ -31,7 +31,7 @@ Grids.
   - The Frequently Asked Questions are <a href="http://simgrid.gforge.inria.fr/faq.html">here</a>.
   - The development webpage is <a href="https://gforge.inria.fr/projects/simgrid//">gforge.inria.fr/projects/simgrid</a>.
   - The user mailing list is <simgrid-user@lists.gforge.inria.fr>
-  - The SimGrid software package can be downloaded from <a href="http://simgrid.gforge.inria.fr/download.php">here</a>.
+  - The SimGrid software package can be downloaded from <a href="http://simgrid.gforge.inria.fr/download.html">here</a>.
 <br>
 
 <hr>
@@ -73,22 +73,6 @@ your work.
    MPI) programming environment. Unfortunately, this work is still underway.
    Check the \ref SMPI_API section for more information.
 
- - If you want to develop a real distributed application, then you may find
-   <b>\ref GRAS_API</b> (Grid Reality And Simulation) useful. This is an API
-   for the realization of distributed applications.
-   \n\n
-   Moreover, there is two implementations of this API: one on top of the
-   SURF (allowing to develop and test your application within the comfort of
-   the simulator) and another suited for deployment on real platforms
-   (allowing the resulting application to be highly portable and extremely
-   efficient).
-   \n\n
-   Even if you do not plan to run your code for real, you may want to switch
-   to GRAS if you intend to use MSG in a very intensive way (e.g. for
-   simulating a peer-to-peer environment).
-   \n\n
-   See the \ref GRAS_API section for more details.
-
 If your favorite programming environment/model is not there (BSP,
 components, OpenMP, etc.) is not represented in the SimGrid toolkit yet, you may
 consider adding it. You should contact us first on the
@@ -127,7 +111,7 @@ Finally, a transversal module allows you to trace your simulation. More document
 
 <br>
 The SimGrid software package can be downloaded from
-<a href="http://simgrid.gforge.inria.fr/download.php">here</a>.<br>
+<a href="http://simgrid.gforge.inria.fr/download.html">here</a>.<br>
 
 If you are interested in the history of SimGrid and in current and planned development,
 you can find out more <a href="http://simgrid.gforge.inria.fr/history.html">here</a>.
index 9269988..cfa4526 100644 (file)
@@ -259,55 +259,6 @@ make
 make install
 \endverbatim
 
-
-\subsection install_cmakehowto How to modified sources files for developers
-
-\subsubsection install_cmakehowto1 Add an executable or examples.
-
-If you want make an executable you have to create a CMakeList.txt to the src directory.
-You must specified where to create the executable, source list, dependencies and the name of the binary.
-
-\verbatim
-cmake_minimum_required(VERSION 2.6)
-
-set(EXECUTABLE_OUTPUT_PATH "./")
-set(LIBRARY_OUTPUT_PATH "${CMAKE_HOME_DIRECTORY}/lib")
-
-#add_executable(<name_of_target> <src list>)
-add_executable(get_sender get_sender.c)
-
-### Add definitions for compile
-#target_link_libraries(<name_of_targe> <dependencies>)
-target_link_libraries(get_sender simgrid m pthread) 
-\endverbatim
-
-Then you have to modified <project/directory>/buildtools/Cmake/MakeExeLib.cmake and add
-this line :
-\verbatim
-add_subdirectory(${CMAKE_HOME_DIRECTORY}/<path_where_is_CMakeList.txt>)
-\endverbatim
-
-\subsubsection install_cmakehowto2 Delete/add sources to lib.
-
-If you want modified, add or delete source files from a library you have to edit <project/directory>/buildtools/Cmake/DefinePackages.cmake
-
-\verbatim
-set(JMSG_JAVA_SRC
-       ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/MsgException.java
-       ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/JniException.java
-       ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/NativeException.java
-       ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/HostNotFoundException.java
-       ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/ProcessNotFoundException.java
-       ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Msg.java
-       ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Process.java
-       ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Host.java
-       ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Task.java
-       ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/MsgNative.java
-       ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/ApplicationHandler.java
-       ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Sem.java
-)
-\endverbatim
-
 \section install_Win Installing the SimGrid framework on Windows
 
 \subsection install_Win_install Installing SimGrid with the automatic installer
index 4fb36d4..1901e91 100644 (file)
@@ -234,6 +234,18 @@ the same network card through the \b network/sender_gap item. This
 is still under investigation as of writting, and the default value is
 to wait 0 seconds between emissions (no gap applied).
 
+\subsubsection options_model_network_asyncsend Simulating asyncronous send
+
+(this configuration item is experimental and may change or disapear)
+
+It is possible to specify that messages below a certain size will be sent 
+as soon as the call to MPI_Send is issued, without waiting for the 
+correspondant receive. This threshold can be configured through the 
+\b smpi/async_small_thres item. The default value is 0. This behavior can also be 
+manually set for MSG mailboxes, by setting the receiving mode of the mailbox 
+with a call to \ref MSG_mailbox_set_async . For MSG, all messages sent to this 
+mailbox will have this behavior, so consider using two mailboxes if needed. 
+
 \subsubsection options_pls Configuring packet-level pseudo-models
 
 When using the packet-level pseudo-models, several specific
@@ -345,21 +357,19 @@ should be the most effcient one (please report bugs if the
 auto-detection fails for you). They are sorted here from the slowest
 to the most effient:
  - \b thread: very slow factory using full featured threads (either
-   ptheads or windows native threads)
+   pthreads or windows native threads)
  - \b ucontext: fast factory using System V contexts (or a portability
    layer of our own on top of Windows fibers)
  - \b raw: amazingly fast factory using a context switching mecanism
    of our own, directly implemented in assembly (only available for x86
    and amd64 platforms for now)
 
-The only reason to change this setting is when the debuging tools get
+The only reason to change this setting is when the debugging tools get
 fooled by the optimized context factories. Threads are the most
 debugging-friendly contextes.
 
 \subsection options_virt_stacksize Adapting the used stack size
 
-(this only works if you use ucontexts or raw context factories)
-
 Each virtualized used process is executed using a specific system
 stack. The size of this stack has a huge impact on the simulation
 scalability, but its default value is rather large. This is because
@@ -370,7 +380,9 @@ stacks), leading to segfaults with corrupted stack traces.
 If you want to push the scalability limits of your code, you really
 want to reduce the \b contexts/stack_size item. Its default value
 is 128 (in Kib), while our Chord simulation works with stacks as small
-as 16 Kib, for example.
+as 16 Kib, for example. For the thread factory, the default value 
+is the one of the system, if it is too large/small, it has to be set 
+with this parameter.
 
 \subsection options_virt_parallel Running user code in parallel
 
@@ -571,6 +583,7 @@ It can be done by using XBT. Go to \ref XBT_log for more details.
 - \c smpi/running_power: \ref options_smpi_bench
 - \c smpi/display_timing: \ref options_smpi_timing
 - \c smpi/cpu_threshold: \ref options_smpi_bench
+- \c smpi/async_small_thres: \ref options_model_network_asyncsend
 
 - \c path: \ref options_generic_path
 - \c verbose-exit: \ref options_generic_exit
index a893f9c..adf9661 100644 (file)
@@ -206,7 +206,6 @@ Configuration of package `simgrid' on arch (=4):
         Graphviz mode  :
 
        Simgrid dependencies:   -lm -lpcre -lpthread -lns3 -lrt
-       Gras dependencies   :   -lm -lpthread -lrt
        Smpi dependencies   :
 
        INSTALL_PREFIX:         /usr/local
diff --git a/doc/user_guide/doxygen/stylesheet.css b/doc/user_guide/doxygen/stylesheet.css
new file mode 100644 (file)
index 0000000..0c559a0
--- /dev/null
@@ -0,0 +1,1163 @@
+/* The standard CSS for doxygen */
+
+body, table, div, p, dl {
+       font: 400 14px/19px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1 {
+       font-size: 150%;
+}
+
+.title {
+       font-size: 150%;
+       font-weight: bold;
+       margin: 10px 2px;
+}
+
+h2 {
+       border-bottom: 1px solid #879ECB;
+       color: #354C7B;
+       font-size: 150%;
+       font-weight: normal;
+       margin-top: 1.75em;
+       padding-top: 8px;
+       padding-bottom: 4px;
+       width: 100%;
+}
+
+h3 {
+       font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+       -webkit-transition: text-shadow 0.5s linear;
+       -moz-transition: text-shadow 0.5s linear;
+       -ms-transition: text-shadow 0.5s linear;
+       -o-transition: text-shadow 0.5s linear;
+       transition: text-shadow 0.5s linear;
+       margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+       text-shadow: 0 0 15px cyan;
+}
+
+dt {
+       font-weight: bold;
+}
+
+div.multicol {
+       -moz-column-gap: 1em;
+       -webkit-column-gap: 1em;
+       -moz-column-count: 3;
+       -webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+       margin-top: 2px;
+}
+
+p.endli {
+       margin-bottom: 0px;
+}
+
+p.enddd {
+       margin-bottom: 4px;
+}
+
+p.endtd {
+       margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+       font-weight: bold;
+}
+
+span.legend {
+        font-size: 70%;
+        text-align: center;
+}
+
+h3.version {
+        font-size: 90%;
+        text-align: center;
+}
+
+div.qindex, div.navtab{
+       background-color: #EBEFF6;
+       border: 1px solid #A3B4D7;
+       text-align: center;
+}
+
+div.qindex, div.navpath {
+       width: 100%;
+       line-height: 140%;
+}
+
+div.navtab {
+       margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+       color: #3D578C;
+       font-weight: normal;
+       text-decoration: none;
+}
+
+.contents a:visited {
+       color: #4665A2;
+}
+
+a:hover {
+       text-decoration: underline;
+}
+
+a.qindex {
+       font-weight: bold;
+}
+
+a.qindexHL {
+       font-weight: bold;
+       background-color: #9CAFD4;
+       color: #ffffff;
+       border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+        color: #ffffff;
+}
+
+a.el {
+       font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited {
+       color: #4665A2; 
+}
+
+a.codeRef, a.codeRef:visited {
+       color: #4665A2; 
+}
+
+/* @end */
+
+dl.el {
+       margin-left: -1cm;
+}
+
+pre.fragment {
+        border: 1px solid #C4CFE5;
+        background-color: #FBFCFD;
+        padding: 4px 6px;
+        margin: 4px 8px 4px 2px;
+        overflow: auto;
+        word-wrap: break-word;
+        font-size:  9pt;
+        line-height: 125%;
+        font-family: monospace, fixed;
+        font-size: 105%;
+}
+
+div.fragment {
+        padding: 4px;
+        margin: 4px;
+       background-color: #FBFCFD;
+       border: 1px solid #C4CFE5;
+}
+
+div.line {
+       font-family: monospace, fixed;
+        font-size: 13px;
+       min-height: 13px;
+       line-height: 1.0;
+       text-wrap: unrestricted;
+       white-space: -moz-pre-wrap; /* Moz */
+       white-space: -pre-wrap;     /* Opera 4-6 */
+       white-space: -o-pre-wrap;   /* Opera 7 */
+       white-space: pre-wrap;      /* CSS3  */
+       word-wrap: break-word;      /* IE 5.5+ */
+       text-indent: -53px;
+       padding-left: 53px;
+       padding-bottom: 0px;
+       margin: 0px;
+       -webkit-transition-property: background-color, box-shadow;
+       -webkit-transition-duration: 0.5s;
+       -moz-transition-property: background-color, box-shadow;
+       -moz-transition-duration: 0.5s;
+       -ms-transition-property: background-color, box-shadow;
+       -ms-transition-duration: 0.5s;
+       -o-transition-property: background-color, box-shadow;
+       -o-transition-duration: 0.5s;
+       transition-property: background-color, box-shadow;
+       transition-duration: 0.5s;
+}
+
+div.line.glow {
+       background-color: cyan;
+       box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+       padding-right: 4px;
+       text-align: right;
+       border-right: 2px solid #0F0;
+       background-color: #E8E8E8;
+        white-space: pre;
+}
+span.lineno a {
+       background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+       background-color: #C8C8C8;
+}
+
+div.ah {
+       background-color: black;
+       font-weight: bold;
+       color: #ffffff;
+       margin-bottom: 3px;
+       margin-top: 3px;
+       padding: 0.2em;
+       border: solid thin #333;
+       border-radius: 0.5em;
+       -webkit-border-radius: .5em;
+       -moz-border-radius: .5em;
+       box-shadow: 2px 2px 3px #999;
+       -webkit-box-shadow: 2px 2px 3px #999;
+       -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+       background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+       background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+       margin-left: 16px;
+       margin-top: 12px;
+       font-weight: bold;
+}
+
+div.groupText {
+       margin-left: 16px;
+       font-style: italic;
+}
+
+body {
+       background-color: white;
+       color: black;
+        margin: 0;
+}
+
+div.contents {
+       margin-top: 10px;
+       margin-left: 12px;
+       margin-right: 8px;
+}
+
+td.indexkey {
+       background-color: #EBEFF6;
+       font-weight: bold;
+       border: 1px solid #C4CFE5;
+       margin: 2px 0px 2px 0;
+       padding: 2px 10px;
+        white-space: nowrap;
+        vertical-align: top;
+}
+
+td.indexvalue {
+       background-color: #EBEFF6;
+       border: 1px solid #C4CFE5;
+       padding: 2px 10px;
+       margin: 2px 0px;
+}
+
+tr.memlist {
+       background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+       text-align: center;
+}
+
+img.formulaDsp {
+       
+}
+
+img.formulaInl {
+       vertical-align: middle;
+}
+
+div.center {
+       text-align: center;
+        margin-top: 0px;
+        margin-bottom: 0px;
+        padding: 0px;
+}
+
+div.center img {
+       border: 0px;
+}
+
+address.footer {
+       text-align: right;
+       padding-right: 12px;
+}
+
+img.footer {
+       border: 0px;
+       vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+       color: #008000
+}
+
+span.keywordtype {
+       color: #604020
+}
+
+span.keywordflow {
+       color: #e08000
+}
+
+span.comment {
+       color: #800000
+}
+
+span.preprocessor {
+       color: #806020
+}
+
+span.stringliteral {
+       color: #002080
+}
+
+span.charliteral {
+       color: #008080
+}
+
+span.vhdldigit { 
+       color: #ff00ff 
+}
+
+span.vhdlchar { 
+       color: #000000 
+}
+
+span.vhdlkeyword { 
+       color: #700070 
+}
+
+span.vhdllogic { 
+       color: #ff0000 
+}
+
+blockquote {
+        background-color: #F7F8FB;
+        border-left: 2px solid #9CAFD4;
+        margin: 0 24px 0 4px;
+        padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+       color: #003399;
+       font-weight: bold;
+}
+
+form.search {
+       margin-bottom: 0px;
+       margin-top: 0px;
+}
+
+input.search {
+       font-size: 75%;
+       color: #000080;
+       font-weight: normal;
+       background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+       font-size: 75%;
+}
+
+.dirtab {
+       padding: 4px;
+       border-collapse: collapse;
+       border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+       background: #EBEFF6;
+       font-weight: bold;
+}
+
+hr {
+       height: 0px;
+       border: none;
+       border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+       height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+       border-spacing: 0px;
+       padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+       -webkit-transition-property: background-color, box-shadow;
+       -webkit-transition-duration: 0.5s;
+       -moz-transition-property: background-color, box-shadow;
+       -moz-transition-duration: 0.5s;
+       -ms-transition-property: background-color, box-shadow;
+       -ms-transition-duration: 0.5s;
+       -o-transition-property: background-color, box-shadow;
+       -o-transition-duration: 0.5s;
+       transition-property: background-color, box-shadow;
+       transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+       background-color: cyan;
+       box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+       background-color: #F9FAFC;
+       border: none;
+       margin: 4px;
+       padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+       padding: 0px 8px 4px 8px;
+       color: #555;
+}
+
+.memItemLeft, .memItemRight, .memTemplParams {
+       border-bottom: 1px solid #DEE4F0;
+}
+
+.memItemLeft, .memTemplItemLeft {
+        white-space: nowrap;
+}
+
+.memItemRight {
+       width: 100%;
+}
+
+.memTemplParams {
+       color: #4665A2;
+        white-space: nowrap;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+       font-size: 80%;
+       color: #4665A2;
+       font-weight: normal;
+       margin-left: 9px;
+}
+
+.memnav {
+       background-color: #EBEFF6;
+       border: 1px solid #A3B4D7;
+       text-align: center;
+       margin: 2px;
+       margin-right: 15px;
+       padding: 2px;
+}
+
+.mempage {
+       width: 100%;
+}
+
+.memitem {
+       padding: 0;
+       margin-bottom: 10px;
+       margin-right: 5px;
+        -webkit-transition: box-shadow 0.5s linear;
+        -moz-transition: box-shadow 0.5s linear;
+        -ms-transition: box-shadow 0.5s linear;
+        -o-transition: box-shadow 0.5s linear;
+        transition: box-shadow 0.5s linear;
+        display: table !important;
+        width: 100%;
+}
+
+.memitem.glow {
+         box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+        font-weight: bold;
+        margin-left: 6px;
+}
+
+.memname td {
+       vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+        border-top: 1px solid #A8B8D9;
+        border-left: 1px solid #A8B8D9;
+        border-right: 1px solid #A8B8D9;
+        padding: 6px 0px 6px 0px;
+        color: #253555;
+        font-weight: bold;
+        text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: #E2E8F2;
+        /* opera specific markup */
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        border-top-right-radius: 4px;
+        border-top-left-radius: 4px;
+        /* firefox specific markup */
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        -moz-border-radius-topright: 4px;
+        -moz-border-radius-topleft: 4px;
+        /* webkit specific markup */
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        -webkit-border-top-right-radius: 4px;
+        -webkit-border-top-left-radius: 4px;
+
+}
+
+.memdoc, dl.reflist dd {
+        border-bottom: 1px solid #A8B8D9;      
+        border-left: 1px solid #A8B8D9;      
+        border-right: 1px solid #A8B8D9; 
+        padding: 6px 10px 2px 10px;
+        background-color: #FBFCFD;
+        border-top-width: 0;
+        background-image:url('nav_g.png');
+        background-repeat:repeat-x;
+        background-color: #FFFFFF;
+        /* opera specific markup */
+        border-bottom-left-radius: 4px;
+        border-bottom-right-radius: 4px;
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        /* firefox specific markup */
+        -moz-border-radius-bottomleft: 4px;
+        -moz-border-radius-bottomright: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        /* webkit specific markup */
+        -webkit-border-bottom-left-radius: 4px;
+        -webkit-border-bottom-right-radius: 4px;
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+        padding: 5px;
+}
+
+dl.reflist dd {
+        margin: 0px 0px 10px 0px;
+        padding: 5px;
+}
+
+.paramkey {
+       text-align: right;
+}
+
+.paramtype {
+       white-space: nowrap;
+}
+
+.paramname {
+       color: #602020;
+       white-space: nowrap;
+}
+.paramname em {
+       font-style: normal;
+}
+.paramname code {
+        line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+        margin-left: 0px;
+        padding-left: 0px;
+}       
+
+.params .paramname, .retval .paramname {
+        font-weight: bold;
+        vertical-align: top;
+}
+        
+.params .paramtype {
+        font-style: italic;
+        vertical-align: top;
+}       
+        
+.params .paramdir {
+        font-family: "courier new",courier,monospace;
+        vertical-align: top;
+}
+
+table.mlabels {
+       border-spacing: 0px;
+}
+
+td.mlabels-left {
+       width: 100%;
+       padding: 0px;
+}
+
+td.mlabels-right {
+       vertical-align: bottom;
+       padding: 0px;
+       white-space: nowrap;
+}
+
+span.mlabels {
+        margin-left: 8px;
+}
+
+span.mlabel {
+        background-color: #728DC1;
+        border-top:1px solid #5373B4;
+        border-left:1px solid #5373B4;
+        border-right:1px solid #C4CFE5;
+        border-bottom:1px solid #C4CFE5;
+       text-shadow: none;
+        color: white;
+        margin-right: 4px;
+        padding: 2px 3px;
+        border-radius: 3px;
+        font-size: 7pt;
+       white-space: nowrap;
+}
+
+
+
+/* @end */
+
+/* these are for tree view when not used as main index */
+
+div.directory {
+        margin: 10px 0px;
+        border-top: 1px solid #A8B8D9;
+        border-bottom: 1px solid #A8B8D9;
+        width: 100%;
+}
+
+.directory table {
+        border-collapse:collapse;
+}
+
+.directory td {
+        margin: 0px;
+        padding: 0px;
+       vertical-align: top;
+}
+
+.directory td.entry {
+        white-space: nowrap;
+        padding-right: 6px;
+}
+
+.directory td.entry a {
+        outline:none;
+}
+
+.directory td.entry a img {
+        border: none;
+}
+
+.directory td.desc {
+        width: 100%;
+        padding-left: 6px;
+       padding-right: 6px;
+       padding-top: 3px;
+       border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+       padding-left: 6px;
+       background-color: #F7F8FB;
+}
+
+.directory img {
+       vertical-align: -30%;
+}
+
+.directory .levels {
+        white-space: nowrap;
+        width: 100%;
+        text-align: right;
+        font-size: 9pt;
+}
+
+.directory .levels span {
+        cursor: pointer;
+        padding-left: 2px;
+        padding-right: 2px;
+       color: #3D578C;
+}
+
+div.dynheader {
+        margin-top: 8px;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+       -khtml-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+address {
+       font-style: normal;
+       color: #2A3D61;
+}
+
+table.doxtable {
+       border-collapse:collapse;
+        margin-top: 4px;
+        margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+       border: 1px solid #2D4068;
+       padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+       background-color: #374F7F;
+       color: #FFFFFF;
+       font-size: 110%;
+       padding-bottom: 4px;
+       padding-top: 5px;
+}
+
+table.fieldtable {
+        width: 100%;
+        margin-bottom: 10px;
+        border: 1px solid #A8B8D9;
+        border-spacing: 0px;
+        -moz-border-radius: 4px;
+        -webkit-border-radius: 4px;
+        border-radius: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+        -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+        box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+        padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+        white-space: nowrap;
+        border-right: 1px solid #A8B8D9;
+        border-bottom: 1px solid #A8B8D9;
+        vertical-align: top;
+}
+
+.fieldtable td.fielddoc {
+        border-bottom: 1px solid #A8B8D9;
+        width: 100%;
+}
+
+.fieldtable tr:last-child td {
+        border-bottom: none;
+}
+
+.fieldtable th {
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: #E2E8F2;
+        font-size: 90%;
+        color: #253555;
+        padding-bottom: 4px;
+        padding-top: 5px;
+        text-align:left;
+        -moz-border-radius-topleft: 4px;
+        -moz-border-radius-topright: 4px;
+        -webkit-border-top-left-radius: 4px;
+        -webkit-border-top-right-radius: 4px;
+        border-top-left-radius: 4px;
+        border-top-right-radius: 4px;
+        border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+       top: 0px;
+       left: 10px;
+       height: 36px;
+       background-image: url('tab_b.png');
+       z-index: 101;
+       overflow: hidden;
+       font-size: 13px;
+}
+
+.navpath ul
+{
+       font-size: 11px;
+       background-image:url('tab_b.png');
+       background-repeat:repeat-x;
+       height:30px;
+       line-height:30px;
+       color:#8AA0CC;
+       border:solid 1px #C2CDE4;
+       overflow:hidden;
+       margin:0px;
+       padding:0px;
+}
+
+.navpath li
+{
+       list-style-type:none;
+       float:left;
+       padding-left:10px;
+       padding-right:15px;
+       background-image:url('bc_s.png');
+       background-repeat:no-repeat;
+       background-position:right;
+       color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+       height:32px;
+       display:block;
+       text-decoration: none;
+       outline: none;
+       font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+.navpath li.navelem a:hover
+{
+       color:#6884BD;
+}
+
+.navpath li.footer
+{
+        list-style-type:none;
+        float:right;
+        padding-left:10px;
+        padding-right:15px;
+        background-image:none;
+        background-repeat:no-repeat;
+        background-position:right;
+        color:#364D7C;
+        font-size: 8pt;
+}
+
+
+div.summary
+{
+       float: right;
+       font-size: 8pt;
+       padding-right: 5px;
+       width: 50%;
+       text-align: right;
+}       
+
+div.summary a
+{
+       white-space: nowrap;
+}
+
+div.ingroups
+{
+       font-size: 8pt;
+       width: 50%;
+       text-align: left;
+}
+
+div.ingroups a
+{
+       white-space: nowrap;
+}
+
+div.header
+{
+        background-image:url('nav_h.png');
+        background-repeat:repeat-x;
+       background-color: #F9FAFC;
+       margin:  0px;
+       border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+       padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+        padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+       margin-left: 0px;
+       padding-left: 0px;
+}
+
+dl.note
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #00D000;
+}
+
+dl.deprecated
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #505050;
+}
+
+dl.todo
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #00C0E0;
+}
+
+dl.test
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #3030E0;
+}
+
+dl.bug
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #C08050;
+}
+
+dl.section dd {
+       margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+       text-align: center;
+       vertical-align: bottom;
+       border-collapse: separate;
+}
+#projectlogo img
+{ 
+       border: 0px none;
+}
+#projectname
+{
+       font: 300% Tahoma, Arial,sans-serif;
+       margin: 0px;
+       padding: 2px 0px;
+}
+    
+#projectbrief
+{
+       font: 120% Tahoma, Arial,sans-serif;
+       margin: 0px;
+       padding: 0px;
+}
+
+#projectnumber
+{
+       font: 50% Tahoma, Arial,sans-serif;
+       margin: 0px;
+       padding: 0px;
+}
+
+#titlearea
+{
+       padding: 0px;
+       margin: 0px;
+       width: 100%;
+       border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+        text-align: center;
+}
+
+.dotgraph
+{
+        text-align: center;
+}
+
+.mscgraph
+{
+        text-align: center;
+}
+
+.caption
+{
+       font-weight: bold;
+}
+
+div.zoom
+{
+       border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+        margin-bottom:50px;
+}
+
+dl.citelist dt {
+        color:#334975;
+        float:left;
+        font-weight:bold;
+        margin-right:10px;
+        padding:5px;
+}
+
+dl.citelist dd {
+        margin:2px 0;
+        padding:5px 0;
+}
+
+div.toc {
+        padding: 14px 25px;
+        background-color: #F4F6FA;
+        border: 1px solid #D8DFEE;
+        border-radius: 7px 7px 7px 7px;
+        float: right;
+        height: auto;
+        margin: 0 20px 10px 10px;
+        width: 200px;
+}
+
+div.toc li {
+        background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+        font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+        margin-top: 5px;
+        padding-left: 10px;
+        padding-top: 2px;
+}
+
+div.toc h3 {
+        font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+       color: #4665A2;
+        border-bottom: 0 none;
+        margin: 0;
+}
+
+div.toc ul {
+        list-style: none outside none;
+        border: medium none;
+        padding: 0px;
+}       
+
+div.toc li.level1 {
+        margin-left: 0px;
+}
+
+div.toc li.level2 {
+        margin-left: 15px;
+}
+
+div.toc li.level3 {
+        margin-left: 30px;
+}
+
+div.toc li.level4 {
+        margin-left: 45px;
+}
+
+.inherit_header {
+        font-weight: bold;
+        color: gray;
+        cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+       -khtml-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+.inherit_header td {
+        padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+        display: none;
+}
+
+tr.heading h2 {
+        margin-top: 12px;
+        margin-bottom: 4px;
+}
+
+@media print
+{
+  #top { display: none; }
+  #side-nav { display: none; }
+  #nav-path { display: none; }
+  body { overflow:visible; }
+  h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+  .summary { display: none; }
+  .memitem { page-break-inside: avoid; }
+  #doc-content
+  {
+    margin-left:0 !important;
+    height:auto !important;
+    width:auto !important;
+    overflow:inherit;
+    display:inline;
+  }
+}
+
index c7455fe..f5bbdc0 100644 (file)
@@ -3,13 +3,13 @@
 SimGrid comes with many examples provided in the examples/ directory. Those examples are described in section \ref MSG_examples . Those examples are commented and should be easy to understand. for a first step into SimGrid we also provide some more detailed examples in the sections below. 
 
 \htmlonly
-You should also check our online <a href="http://simgrid.gforge.inria.fr/tutorials/"> tutorial section</a> that contains a generic tutorial about using SimGrid. 
+You should also check our online <a href="http://simgrid.gforge.inria.fr/tutorials.html"> tutorial section</a> that contains a generic tutorial about using SimGrid. 
 \endhtmlonly
 
 
 \section using_msg Using MSG
 \htmlonly
-You should also check our online <a href="http://simgrid.gforge.inria.fr/tutorials/"> tutorial section</a> that contains a dedicated tutorial. 
+You should also check our online <a href="http://simgrid.gforge.inria.fr/tutorials.html"> tutorial section</a> that contains a dedicated tutorial. 
 \endhtmlonly
 
 
@@ -229,394 +229,22 @@ This initializes MSG, runs a simulation, and free all data-structures created by
 
 \include msg/small_platform.xml
 
-\section using_gras Using GRAS
-
-Here are some examples on how to use GRAS.
-\htmlonly
-You should also check our online <a href="http://simgrid.gforge.inria.fr/tutorials/"> tutorial section</a> that contains a dedicated tutorial. 
-\endhtmlonly
-
-There is for now rather few examples of GRAS, but it's better than
-nothing, isn't it?
-
-- \ref GRAS_ex_ping
-- \ref GRAS_ex_mmrpc
-- \ref GRAS_ex_token
-- \ref GRAS_ex_timer
-
-
-\subsection GRAS_ex_ping Ping-Pong
-
-This example implements the very classical ping-pong in GRAS. It
-involves a client (initiating the ping-pong) and a server (answering to
-client's requests).
-
-It works the following way:
-- Both the client and the server register all needed messages
-- The server registers a callback to the ping message, which sends pong
-  to the expeditor
-- The client sends the ping message to the server, and waits for the
-  pong message as an answer.
-
-This example resides in the <b>examples/gras/ping/ping.c</b> file. Yes, both
-the code of the client and of the server is placed in the same file. 
-
-\subsubsection GRAS_ex_ping_toc Table of contents of the ping example
-      - \ref GRAS_ex_ping_common
-        - \ref GRAS_ex_ping_initial
-        - \ref GRAS_ex_ping_register
-      - \ref GRAS_ex_ping_server
-        - \ref GRAS_ex_ping_serdata
-       - \ref GRAS_ex_ping_sercb
-       - \ref GRAS_ex_ping_sermain
-      - \ref GRAS_ex_ping_client
-       - \ref GRAS_ex_ping_climain
-
-    <hr>
-
-    \dontinclude gras/ping/ping_common.c
-
-    \subsubsection GRAS_ex_ping_common 1) Common code to the client and the server
-
-    \paragraph GRAS_ex_ping_initial 1.a) Initial settings
-
-    Let's first load the module header and declare a logging category (see
-    \ref XBT_log for more info on logging).
-
-    \skip include
-    \until XBT_LOG
-
-    The module header <tt>ping.h</tt> reads:
-
-    \dontinclude gras/ping/ping.h
-    \skip include
-    \until argv
-    \until argv
-
-    \paragraph GRAS_ex_ping_register 1.b) Register the messages
-
-    This function, called by both the client and the server is in charge of
-    declaring the existing messages to GRAS. Since the payload does not
-    involve any newly created types but only int, this is quite easy.
-    (to exchange more complicated types, see \ref GRAS_dd or
-    \ref GRAS_ex_mmrpc for an example).
-
-    \dontinclude gras/ping/ping_common.c
-    \skip register_messages
-    \until }
-
-    [Back to \ref GRAS_ex_ping_toc]
-
-    \subsubsection GRAS_ex_ping_server 2) Server's code
-
-    \paragraph GRAS_ex_ping_serdata 2.a) The server's globals
-
-    In order to ensure the communication between the "main" and the callback
-    of the server, we need to declare some globals. We have to put them in a
-    struct definition so that they can be handled properly in GRAS.
-
-    \dontinclude gras/ping/ping_server.c
-    \skip typedef struct
-    \until }
-
-    \paragraph GRAS_ex_ping_sercb 2.b) The callback to the ping message
-
-    Here is the callback run when the server receives any ping message (this
-    will be registered later by the server).
-
-    \skip server_cb_ping_handler
-    \until end_of_server_cb_ping_handler
-
-    \paragraph GRAS_ex_ping_sermain 2.c) The "main" of the server
-
-    This is the "main" of the server. You must not write any main()
-    function yourself. Instead, you just have to write a regular function
-    like this one which will act as a main.
-
-    \skip server
-    \until end_of_server
-
-    [Back to \ref GRAS_ex_ping_toc]
-
-    \subsubsection GRAS_ex_ping_client 3) Client's code
-
-    \paragraph GRAS_ex_ping_climain 3.a) Client's "main" function
-
-    This function is quite straightforward, and the inlined comments should
-    be enough to understand it.
-
-    \dontinclude gras/ping/ping_client.c
-    \skip client
-    \until end_of_client
-
-    [Back to \ref GRAS_ex_ping_toc]
-
-\subsection GRAS_ex_token Token Ring example
-
-   This example implements the token ring algorithm. It involves several
-   nodes arranged in a ring (each of them have a left and a right neighbour)
-   and exchanging a "token". This algorithm is one of the solution to ensure
-   the mutual exclusion between distributed processes. There is only one
-   token at any time, so the process in its possession is ensured to be the
-   only one having it. So, if there is an action you want all processes to
-   do alternativly, but you cannot afford to have two processes doing it at
-   the same time, let the process having the token doing it.
-
-   Actually, there is a lot of different token ring algorithms in the
-   litterature, so this example implements one of them: the simplest one.
-   The ring is static (no new node can join it, and you'll get trouble if
-   one node dies or leaves), and nothing is done for the case in which the
-   token is lost.
-
-   - \ref GRAS_ex_stoken_deploy
-   - \ref GRAS_ex_stoken_global
-   - \ref GRAS_ex_stoken_callback
-   - \ref GRAS_ex_stoken_main
-
-   \subsection GRAS_ex_stoken_deploy 1) Deployment file
-
-   Here is the deployment file:
-   \include examples/gras/mutual_exclusion/simple_token/simple_token.xml
-
-   The neighbour of each node is given at startup as command line argument.
-   Moreover, one of the nodes is instructed by a specific argument (the one
-   on Tremblay here) to create the token at the begining of the algorithm.
-
-   \subsection GRAS_ex_stoken_global 2) Global definition
-
-   The token is incarned by a specific message, which circulates from node
-   to node (the payload is an integer incremented at each hop). So, the most
-   important part of the code is the message callback, which forwards the
-   message to the next node. That is why we have to store all variable in a
-   global, as explained in the \ref GRAS_globals section.
-
-   \dontinclude examples/gras/mutual_exclusion/simple_token/simple_token.c
-   \skip typedef
-   \until }
-
-   \subsection GRAS_ex_stoken_callback 3) The callback
-
-   Even if this is the core of this algorithm, this function is quite
-   straightforward.
-
-   \skip node_cb_stoken_handler
-   \until end_of_node_cb_stoken_handler
-
-   \subsection GRAS_ex_stoken_main 4) The main function
-
-   This function is splited in two parts: The first one performs all the
-   needed initialisations (points 1-7) while the end (point 8. below) calls
-   gras_msg_handle() as long as the planned amount of ring loops are not
-   performed.
-
-   \skip node
-   \until end_of_node
-
-\subsection GRAS_ex_mmrpc A simple RPC for matrix multiplication
-
-This example implements a remote matrix multiplication. It involves a client
-(creating the matrices and sending the multiplications requests) and a server
-(computing the multiplication on client's behalf).
-
-This example also constitutes a more advanced example of data description
-mechanisms, since the message payload type is a bit more complicated than in
-other examples such as the ping one (\ref GRAS_ex_ping).
-
-It works the following way (not very different from the ping example):
-- Both the client and the server register all needed messages and datatypes
-- The server registers a callback to the "request" message, which computes
-  what needs to be and returns the result to the expeditor.
-- The client creates two matrices, ask for their multiplication and check
-  the server's answer.
-
-This example resides in the <b>examples/gras/mmrpc/mmrpc.c</b> file. 
-
-\subsubsection GRAS_ex_mmrpc_toc Table of contents of the mmrpc example
-      - \ref GRAS_ex_mmrpc_common
-        - \ref GRAS_ex_mmrpc_header
-        - \ref GRAS_ex_mmrpc_dataregister
-        - \ref GRAS_ex_mmrpc_logdef
-        - \ref GRAS_ex_mmrpc_msgregister
-      - \ref GRAS_ex_mmrpc_server
-       - \ref GRAS_ex_mmrpc_serinc
-       - \ref GRAS_ex_mmrpc_sercb
-       - \ref GRAS_ex_mmrpc_sermain
-      - \ref GRAS_ex_mmrpc_client
-       - \ref GRAS_ex_mmrpc_cliinc
-       - \ref GRAS_ex_mmrpc_climain
-
-    <hr>
-
-
-    \subsubsection GRAS_ex_mmrpc_common 1) Common code to the client and the server (mmrpc_common.c and mmrpc.h)
-
-
-    \paragraph GRAS_ex_mmrpc_header 1.a) Module header (mmrpc.h)
-
-    This loads the gras header and declare the function's prototypes as well
-    as the matrix size.
-
-    \dontinclude gras/mmrpc/mmrpc.h
-    \skip include
-    \until argv
-    \until argv
-
-    \paragraph GRAS_ex_mmrpc_dataregister 1.b) Register the data types (mmrpc.h)
-
-    The messages involved in a matrix of double. This type is automatically
-    known by the GRAS mecanism, using the gras_datadesc_matrix() function of the
-    xbt/matrix module.
-
-    \paragraph GRAS_ex_mmrpc_logdef 1.c) Logging category definition (mmrpc_common.c)
-
-    Let's first load the module header and declare a logging category (see
-    \ref XBT_log for more info on logging). This logging category does live
-    in this file (ie the required symbols are defined here and declared as
-    "extern" in any other file using them). That is why we use
-    \ref XBT_LOG_NEW_DEFAULT_CATEGORY here and
-    \ref XBT_LOG_EXTERNAL_DEFAULT_CATEGORY in mmrpc_client.c and mmrpc_server.c.
-
-    \dontinclude gras/mmrpc/mmrpc_common.c
-    \skip include
-    \until XBT_LOG
-
-    \paragraph GRAS_ex_mmrpc_msgregister 1.d) Register the messages (mmrpc_common.c)
-
-    This function, called by both the client and the server is in charge of
-    declaring the existing messages to GRAS.
-
-    The datatype description builded that way can then be used to build an array datatype or
-    to declare messages.
-
-    \skip register_messages
-    \until }
-
-    [Back to \ref GRAS_ex_mmrpc_toc]
-
-    \subsubsection GRAS_ex_mmrpc_server 2) Server's code (mmrpc_server.c)
-
-    \paragraph GRAS_ex_mmrpc_serinc 2.a) Server intial settings
-
-    All module symbols live in the mmrpc_common.c file. We thus have to
-    define \ref XBT_DEFINE_TYPE_EXTERN to the preprocessor so that the
-    \ref XBT_DEFINE_TYPE symbols don't get included here. Likewise, we use
-    \ref XBT_LOG_EXTERNAL_DEFAULT_CATEGORY to get the log category in here.
-
-    \dontinclude gras/mmrpc/mmrpc_server.c
-    \skip define
-    \until XBT_LOG
-
-    \paragraph GRAS_ex_mmrpc_sercb 2.b) The callback to the mmrpc message
-
-    Here is the callback run when the server receives any mmrpc message (this
-    will be registered later by the server). Note the way we get the message
-    payload. In the ping example, there was one additional level of pointer
-    indirection (see \ref GRAS_ex_ping_sercb). This is because the payload is
-    an array here (ie a pointer) whereas it is a scalar in the ping example.
-
-    \skip server_cb_request_handler
-    \until end_of_server_cb_request_handler
-
-    \paragraph GRAS_ex_mmrpc_sermain 2.c) The "main" of the server
-
-    This is the "main" of the server. You must not write any main()
-    function yourself. Instead, you just have to write a regular function
-    like this one which will act as a main.
-
-    \skip server
-    \until end_of_server
-
-    [Back to \ref GRAS_ex_mmrpc_toc]
-
-    \subsubsection GRAS_ex_mmrpc_client 3) Client's code (mmrpc_client.c)
-
-    \paragraph GRAS_ex_mmrpc_cliinc 2.a) Server intial settings
-
-    As for the server, some extra love is needed to make sure that automatic
-    datatype parsing and log categories do work even if we are using several
-    files.
-
-    \dontinclude gras/mmrpc/mmrpc_client.c
-    \skip define
-    \until XBT_LOG
-
-    \paragraph GRAS_ex_mmrpc_climain 3.b) Client's "main" function
-
-    This function is quite straightforward, and the inlined comments should
-    be enough to understand it.
-
-    \dontinclude gras/mmrpc/mmrpc_client.c
-    \skip argv
-    \until end_of_client
-
-    [Back to \ref GRAS_ex_mmrpc_toc]
-
-\subsection GRAS_ex_timer Some timer games
-
-This example fools around with the GRAS timers (\ref GRAS_timer). It is
-mainly a regression test, since it uses almost all timer features.
-
-The main program registers a repetititive task and a delayed one, and
-then loops until the <tt>still_to_do</tt> variables of its globals reach
-0. The delayed task set it to 5, and the repetititive one decrease it
-each time. Here is an example of output:
-\verbatim Initialize GRAS
- Initialize XBT
- [1108335471] Programming the repetitive_action with a frequency of 1.000000 sec
- [1108335471] Programming the delayed_action for after 2.000000 sec
- [1108335471] Have a rest
- [1108335472] Canceling the delayed_action.
- [1108335472] Re-programming the delayed_action for after 2.000000 sec
- [1108335472] Repetitive_action has nothing to do yet
- [1108335473] Repetitive_action has nothing to do yet
- [1108335473] delayed_action setting globals->still_to_do to 5
- [1108335474] repetitive_action decrementing globals->still_to_do. New value: 4
- [1108335475] repetitive_action decrementing globals->still_to_do. New value: 3
- [1108335476] repetitive_action decrementing globals->still_to_do. New value: 2
- [1108335477] repetitive_action decrementing globals->still_to_do. New value: 1
- [1108335478] repetitive_action decrementing globals->still_to_do. New value: 0
- Exiting GRAS\endverbatim
-
-    Source code:
-     - \ref GRAS_ex_timer_decl
-     - \ref GRAS_ex_timer_delay
-     - \ref GRAS_ex_timer_repeat
-     - \ref GRAS_ex_timer_main
-
-    \dontinclude timer.c
-
-    \subsubsection GRAS_ex_timer_decl   1. Declarations and headers
-    \skip include
-    \until my_globals
-
-    \subsubsection GRAS_ex_timer_delay  2. Source code of the delayed action
-    \skip repetitive_action
-    \until end_of_repetitive_action
-
-    \subsubsection GRAS_ex_timer_repeat 3. Source code of the repetitive action
-    \skip delayed_action
-    \until end_of_delayed_action
-
-    \subsubsection GRAS_ex_timer_main   4. Source code of main function
-    \skip client
-    \until end_of_client
-
 \section using_smpi Using SMPI
-You should check our online <a href="http://simgrid.gforge.inria.fr/tutorials/"> tutorial section</a> that contains a dedicated tutorial. 
+You should check our online <a href="http://simgrid.gforge.inria.fr/tutorials.html"> tutorial section</a> that contains a dedicated tutorial. 
 
 \section using_MC Using Model Checking
-You should check our online <a href="http://simgrid.gforge.inria.fr/tutorials/"> tutorial section</a> that contains a dedicated tutorial. 
+You should check our online <a href="http://simgrid.gforge.inria.fr/tutorials.html"> tutorial section</a> that contains a dedicated tutorial. 
 
 \section using_trace Using Trace
 Check out the \ref tracing section.
 
-You should check our online <a href="http://simgrid.gforge.inria.fr/tutorials/"> tutorial section</a> that contains a dedicated tutorial. 
+You should check our online <a href="http://simgrid.gforge.inria.fr/tutorials.html"> tutorial section</a> that contains a dedicated tutorial. 
 
 \section using_simdag Using SimDag
-You should check our online <a href="http://simgrid.gforge.inria.fr/tutorials/"> tutorial section</a> that contains a dedicated tutorial. 
+You should check our online <a href="http://simgrid.gforge.inria.fr/tutorials.html"> tutorial section</a> that contains a dedicated tutorial. 
 
 \section using_simix Using SIMIX
-You should check our online <a href="http://simgrid.gforge.inria.fr/tutorials/"> tutorial section</a> that contains a dedicated tutorial. 
+You should check our online <a href="http://simgrid.gforge.inria.fr/tutorials.html"> tutorial section</a> that contains a dedicated tutorial. 
 
 */
 
diff --git a/doc/user_guide/fig/amok_bw_sat.fig b/doc/user_guide/fig/amok_bw_sat.fig
deleted file mode 100644 (file)
index 9def103..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#FIG 3.2  Produced by xfig version 3.2.5-alpha5
-Landscape
-Center
-Metric
-A4      
-100.00
-Single
--2
-1200 2
-2 1 0 1 14 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        2700 2070 2700 2250
-2 1 0 1 14 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        2700 2520 2700 3870
-2 1 0 2 4 7 55 -1 -1 0.000 0 0 -1 0 0 2
-        2700 2250 2700 2520
-2 1 0 1 14 7 55 -1 -1 0.000 0 0 -1 0 0 2
-        5715 2070 5715 2880
-2 1 0 2 4 7 55 -1 -1 0.000 0 0 -1 0 0 2
-        5715 2880 5715 4500
-2 1 0 1 14 7 55 -1 -1 0.000 0 0 -1 0 0 2
-        5715 4500 5715 4770
-2 1 0 1 14 7 55 -1 -1 0.000 0 0 -1 0 0 2
-        4140 2070 4140 2430
-2 1 0 1 14 7 55 -1 -1 0.000 0 0 -1 0 0 2
-        4140 4050 4140 4770
-2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        4230 2340 4140 2430
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
-        2700 2250 4095 2430 2700 2520
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
-        2699 3856 4094 4036 2699 4126
-2 1 0 2 4 7 55 -1 -1 0.000 0 0 -1 0 0 2
-        2700 3870 2700 4140
-2 1 0 1 14 7 55 -1 -1 0.000 0 0 -1 0 0 2
-        2700 4140 2700 4770
-2 1 0 2 4 7 55 -1 -1 0.000 0 0 -1 0 0 2
-        4140 2430 4140 4050
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        4185 3375 5670 3825 5670 3960 4185 3510 4185 3375
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        4185 3510 5670 3960 5670 4095 4185 3645 4185 3510
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        4185 3645 5670 4095 5670 4230 4185 3780 4185 3645
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        4185 3780 5670 4230 5670 4365 4185 3915 4185 3780
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        4185 3915 5670 4365 5670 4500 4185 4050 4185 3915
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        4185 3240 5670 3690 5670 3825 4185 3375 4185 3240
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        4185 2565 5670 3015 5670 3150 4185 2700 4185 2565
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        4185 2700 5670 3150 5670 3285 4185 2835 4185 2700
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        4185 2835 5670 3285 5670 3420 4185 2970 4185 2835
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        4185 2970 5670 3420 5670 3555 4185 3105 4185 2970
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        4185 3105 5670 3555 5670 3690 4185 3240 4185 3105
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        4185 2430 5670 2880 5670 3015 4185 2565 4185 2430
-4 1 0 50 -1 0 12 0.0000 4 180 780 2700 1980 process A\001
-4 2 1 50 -1 0 12 0.0000 4 165 2100 2655 2295 amok_bw_saturate_start()\001
-4 0 1 50 -1 0 12 0.0000 4 180 2220 4275 2340 amok_bw_saturate_begin()\001
-4 2 1 50 -1 0 12 0.0000 4 180 2100 2655 3915 amok_bw_saturate_stop()\001
-4 1 0 50 -1 0 12 0.0000 4 180 780 4140 1980 process B\001
-4 1 0 50 -1 0 12 0.0000 4 180 780 5715 1980 process C\001
diff --git a/doc/user_guide/fig/amok_bw_test.fig b/doc/user_guide/fig/amok_bw_test.fig
deleted file mode 100644 (file)
index 2df4fd2..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#FIG 3.2  Produced by xfig version 3.2.5-alpha5
-Landscape
-Center
-Metric
-A4      
-100.00
-Single
--2
-1200 2
-5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 2677.500 2317.500 2700 2250 2610 2295 2700 2385
-5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 3870.000 2722.500 2700 2250 2610 2655 2700 3195
-5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3637.500 3645.000 4320 3195 4455 3645 4320 4095
-5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2880.000 3172.500 4320 2250 4590 3150 4320 4095
-6 4725 2925 5625 3240
-4 0 0 50 -1 0 12 0.0000 4 135 870 4725 3240 bandwidth\001
-4 0 0 50 -1 0 12 0.0000 4 180 750 4725 3060 Reported\001
--6
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        2700 2250 4185 2700 4185 2835 2700 2385 2700 2250
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        2700 2385 4185 2835 4185 2970 2700 2520 2700 2385
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        2700 2520 4185 2970 4185 3105 2700 2655 2700 2520
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        2700 2655 4185 3105 4185 3240 2700 2790 2700 2655
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        2700 2790 4185 3240 4185 3375 2700 2925 2700 2790
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        2700 2925 4185 3375 4185 3510 2700 3060 2700 2925
-2 3 0 1 0 31 400 -1 24 0.000 0 0 -1 0 0 5
-        2700 3060 4185 3510 4185 3645 2700 3195 2700 3060
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        2604 2317 2469 2317
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        2610 2700 2475 2700
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        2699 4098 4184 3648
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        2700 2070 2700 4230
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        4185 2070 4185 4230
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        2475 4095 2700 4095
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-        2700 4095 4500 4095
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-        2700 3195 4590 3195
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-        2700 2250 4500 2250
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        4455 3690 4680 3690
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        4590 3195 4725 3195
-4 2 0 50 -1 0 12 0.0000 4 180 750 2430 2385 msg_size\001
-4 2 0 50 -1 0 12 0.0000 4 180 720 2430 2745 exp_size\001
-4 1 0 50 -1 0 12 0.0000 4 180 780 4185 1980 process B\001
-4 1 0 50 -1 0 12 0.0000 4 180 780 2700 1980 process A\001
-4 2 0 50 -1 0 12 0.0000 4 180 510 2430 4140 1 byte\001
-4 0 0 50 -1 0 12 0.0000 4 180 660 4725 3735 Latency\001
-4 0 0 50 -1 0 10 0.0000 4 105 405 4815 3915 size=1\001
-4 0 0 50 -1 0 10 0.0000 4 105 390 4905 3375 size>1\001
diff --git a/doc/user_guide/fig/gras_comm.fig b/doc/user_guide/fig/gras_comm.fig
deleted file mode 100644 (file)
index be11d86..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-#FIG 3.2  Produced by xfig version 3.2.5
-Landscape
-Center
-Metric
-A4      
-100.00
-Single
--2
-1200 2
-5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3330.000 2475.000 3510 2340 3555 2475 3510 2610
-5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6165.000 2250.000 5985 2115 5940 2250 5985 2385
-5 1 0 1 0 7 50 -1 -1 0.000 0 1 0 0 6052.500 2475.000 5985 2385 5940 2475 5985 2565
-6 2340 2250 3105 2475
-2 2 0 1 0 4 50 -1 20 0.000 0 0 -1 0 0 5
-        2925 2250 3015 2250 3015 2475 2925 2475 2925 2250
-4 2 0 50 -1 0 12 0.0000 4 195 735 3105 2430 send (   )\001
--6
-1 3 0 1 0 7 40 -1 20 0.000 1 0.0000 5805 2250 90 90 5805 2250 5895 2250
-1 3 0 1 0 7 40 -1 20 0.000 1 0.0000 5805 2475 90 90 5805 2475 5895 2475
-1 3 0 1 0 7 40 -1 20 0.000 1 0.0000 3690 2475 90 90 3690 2475 3780 2475
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        6030 2025 6030 4455
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        3375 2025 3375 4455
-2 2 0 1 0 1 50 -1 32 0.000 0 0 -1 0 0 5
-        3285 2115 3465 2115 3465 2610 3285 2610 3285 2115
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        6030 2610 6345 2610
-2 2 0 1 0 5 50 -1 32 0.000 0 0 -1 0 0 5
-        3285 2610 3465 2610 3465 2880 3285 2880 3285 2610
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        6030 3375 6345 3375
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        6435 3420 6705 3375
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        6795 2025 6795 4455
-2 2 0 1 0 2 50 -1 32 0.000 0 0 -1 0 0 5
-        6705 2070 6885 2070 6885 3375 6705 3375 6705 2070
-2 2 0 1 0 31 50 -1 20 0.000 0 0 -1 0 0 5
-        7605 2160 7695 2160 7695 2385 7605 2385 7605 2160
-2 2 0 1 0 31 50 -1 20 0.000 0 0 -1 0 0 5
-        6390 3375 6435 3375 6435 3510 6390 3510 6390 3375
-2 2 0 1 0 4 50 -1 20 0.000 0 0 -1 0 0 5
-        6345 3375 6390 3375 6390 3510 6345 3510 6345 3375
-2 2 0 1 0 5 50 -1 32 0.000 0 0 -1 0 0 5
-        6705 3375 6885 3375 6885 3510 6705 3510 6705 3375
-2 2 0 1 0 5 50 -1 32 0.000 0 0 -1 0 0 5
-        6705 3510 6885 3510 6885 3690 6705 3690 6705 3510
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        6439 3577 6709 3532
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        3465 2115 6030 2385
-2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
-        3465 2115 6030 2115
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        3465 2338 6030 2608
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        3465 2340 4815 2475
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        3465 2115 4815 2250
-2 2 0 1 0 1 50 -1 32 0.000 0 0 -1 0 0 5
-        3285 2880 3465 2880 3465 3375 3285 3375 3285 2880
-2 2 0 1 0 31 50 -1 20 0.000 0 0 -1 0 0 5
-        2925 3015 3015 3015 3015 3240 2925 3240 2925 3015
-2 2 0 1 0 1 50 -1 32 0.000 0 0 -1 0 0 5
-        6705 3690 6885 3690 6885 4185 6705 4185 6705 3690
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
-        7110 4545 7110 1710 5760 1710 5760 4545 7110 4545
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
-        6480 4410 6480 2160 6300 2160 6300 4410 6480 4410
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
-        4365 4545 4365 1755 3150 1755 3150 4545 4365 4545
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
-        3870 4410 3870 2160 3690 2160 3690 4410 3870 4410
-2 2 0 1 0 23 50 -1 20 0.000 0 0 -1 0 0 5
-        3735 4050 3825 4050 3825 4275 3735 4275 3735 4050
-2 2 0 1 0 2 50 -1 32 0.000 0 0 -1 0 0 5
-        3285 3375 3465 3375 3465 4185 3285 4185 3285 3375
-2 2 0 1 0 5 50 -1 32 0.000 0 0 -1 0 0 5
-        3285 4185 3465 4185 3465 4365 3285 4365 3285 4185
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        4140 4185 3825 4185
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        3735 4185 3465 4185
-2 2 0 1 0 23 50 -1 20 0.000 0 0 -1 0 0 5
-        2970 4140 3060 4140 3060 4365 2970 4365 2970 4140
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        6705 3690 4140 3960
-2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
-        4140 4185 6705 4185
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        6705 3913 4140 4183
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        6705 3915 5355 4050
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        6705 3690 5355 3825
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
-        4140 2025 4140 4455
-2 2 0 1 0 31 50 -1 20 0.000 0 0 -1 0 0 5
-        8145 3240 8235 3240 8235 3465 8145 3465 8145 3240
-2 2 0 1 0 23 50 -1 20 0.000 0 0 -1 0 0 5
-        8415 3825 8505 3825 8505 4050 8415 4050 8415 3825
-2 2 0 1 0 23 50 -1 20 0.000 0 0 -1 0 0 5
-        5265 3825 5355 3825 5355 4050 5265 4050 5265 3825
-2 2 0 1 0 31 50 -1 20 0.000 0 0 -1 0 0 5
-        4815 3015 4905 3015 4905 3240 4815 3240 4815 3015
-2 2 0 1 0 4 50 -1 20 0.000 0 0 -1 0 0 5
-        4815 2250 4905 2250 4905 2475 4815 2475 4815 2250
-2 2 0 1 0 4 50 -1 20 0.000 0 0 -1 0 0 5
-        8820 3510 8910 3510 8910 3735 8820 3735 8820 3510
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        3465 2880 6030 3150
-2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
-        6030 3375 3465 3375
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        3465 3103 6030 3373
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        3465 3105 4815 3240
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-       1 1 1.00 45.00 45.00
-        3465 2880 4815 3015
-2 1 1 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-        6030 2610 3465 2610
-2 2 0 1 0 4 50 -1 20 0.000 0 0 -1 0 0 5
-        6390 2610 6435 2610 6435 3375 6390 3375 6390 2610
-2 2 0 1 0 4 50 -1 20 0.000 0 0 -1 0 0 5
-        6390 3510 6435 3510 6435 3690 6390 3690 6390 3510
-4 1 0 50 -1 0 12 0.0000 4 150 870 6345 1665 Process B\001
-4 1 0 50 -1 0 10 0.0000 4 105 480 6030 1935 listener\001
-4 1 0 50 -1 0 12 0.0000 4 150 900 3690 1665 Process A\001
-4 1 0 50 -1 0 10 0.0000 4 105 480 4095 1935 listener\001
-4 1 0 50 -1 0 10 0.0000 4 105 300 3375 1935 main\001
-4 2 0 50 -1 0 12 0.0000 4 165 750 3105 2790 compute\001
-4 1 0 50 -1 0 10 0.0000 4 105 300 6795 1935 main\001
-4 0 0 50 -1 0 12 0.0000 4 195 705 7155 2340 wait (   )\001
-4 1 0 30 -1 -1 10 0.0000 4 105 75 5804 2527 2\001
-4 1 0 30 -1 -1 10 0.0000 4 105 75 5804 2302 1\001
-4 1 0 30 -1 -1 10 0.0000 4 105 75 3689 2527 3\001
-4 0 0 50 -1 0 12 0.0000 4 195 1515 7200 4005             => send(   )\001
-4 2 0 50 -1 0 12 0.0000 4 195 735 3105 3195 send (   )\001
-4 1 0 50 -1 1 10 0.0000 4 120 375 6390 2070 queue\001
-4 1 0 50 -1 1 10 0.0000 4 120 375 3780 2070 queue\001
-4 0 0 50 -1 0 12 0.0000 4 165 1050 7200 3465 compute on \001
-4 2 0 50 -1 0 12 0.0000 4 150 1395 3105 4320 => callback of    \001
-4 2 0 50 -1 0 12 0.0000 4 195 1635 2745 3870 handle => wait any\001
-4 0 0 50 -1 0 12 0.0000 4 150 1875 7200 3690 handle => callback of \001
diff --git a/examples/amok/alnem/alnem.c b/examples/amok/alnem/alnem.c
deleted file mode 100644 (file)
index 9bcb87f..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-/* ALNeM itself                                                             */
-
-/* Copyright (c) 2005, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <time.h>
-
-#include <gras.h>
-
-#include <tbx_graph.h>          /* alvin's graph toolbox (+ reconstruction algorithm) */
-
-/* **********************************************************************
- * Sensor code
- * **********************************************************************/
-
-/* Global private data */
-typedef struct {
-  gras_sock_t *sock;
-} sensor_data_t;
-
-/* Function prototypes */
-int sensor(int argc, char *argv[]);
-
-int sensor(int argc, char *argv[])
-{
-  xbt_error_t errcode;
-  sensor_data_t *g = gras_userdata_new(sensor_data_t);
-
-  if ((errcode = gras_sock_server_open(4000, 4000, &(g->sock)))) {
-    fprintf(stderr,
-            "Sensor: Error %s encountered while opening the server socket\n",
-            xbt_error_name(errcode));
-    return 1;
-  }
-
-  if (grasbw_register_messages()) {
-    gras_sock_close(g->sock);
-    return 1;
-  }
-
-  while (1) {
-    if ((errcode = gras_msg_handle(3600.0)) && errcode != timeout_error) {
-      fprintf(stderr, "Sensor: Error '%s' while handling message\n",
-              xbt_error_name(errcode));
-    }
-  }
-
-  gras_sleep(5, 0);
-  return gras_sock_close(g->sock);
-}
-
-/* **********************************************************************
- * Maestro code
- * **********************************************************************/
-
-/* Global private data */
-typedef struct {
-  gras_sock_t *sock;
-} maestro_data_t;
-
-/* Function prototypes */
-int maestro(int argc, char *argv[]);
-
-#define MAXHOSTS 100
-
-#define INTERF(graph,table,a,u,b,v) INTERFERENCE(table,\
-                                                TBX_Graph_nodeSearch(graph,a),\
-                                                TBX_Graph_nodeSearch(graph,u),\
-                                                TBX_Graph_nodeSearch(graph,b),\
-                                                TBX_Graph_nodeSearch(graph,v))
-
-int maestro(int argc, char *argv[])
-{
-  int bufSize = 32 * 1024;
-  int expSize = 1024 * 1024;
-  int msgSize = expSize;
-  int satSize = msgSize * 100;
-  double dummy, beginSim;
-  xbt_error_t errcode;
-  maestro_data_t *g = gras_userdata_new(maestro_data_t);
-
-  double bw[MAXHOSTS][MAXHOSTS];
-  double bw_sat[MAXHOSTS][MAXHOSTS];
-
-  int a, b, c, d, begin;
-
-  TBX_Graph_t graph = TBX_Graph_newGraph("Essai", 0, NULL);     /* a dummy graph containing all hosts */
-  TBX_FIFO_t host_fifo = TBX_FIFO_newFIFO();
-  TBX_InterfTable_t interf = NULL;      /* the measured interferences */
-  TBX_Graph_t builded_graph = NULL;     /* the graph builded from the interferences */
-
-  /* basics setups */
-  if (argc > MAXHOSTS) {
-    fprintf(stderr,
-            "You gave more than %d sensors for this experiment. Increase the MAX HOSTS constant in alnem code to be bigger than this number.\n",
-            argc);
-    return 1;
-  }
-
-  if ((errcode = gras_sock_server_open(4000, 5000, &(g->sock)))) {
-    fprintf(stderr,
-            "MAESTRO: Error %s encountered while opening the server socket\n",
-            xbt_error_name(errcode));
-    return 1;
-  }
-
-  if (grasbw_register_messages()) {
-    gras_sock_close(g->sock);
-    return 1;
-  }
-
-  for (a = 1; a < argc; a++) {
-    TBX_FIFO_insert(host_fifo, TBX_Graph_newNode(graph, argv[a], NULL));
-  }
-  TBX_Graph_fixNodeNumbering(graph);
-  interf = TBX_Graph_newInterfTable(host_fifo);
-  TBX_Graph_graphInterfTableInit(graph, interf);
-
-  /* measure the bandwidths */
-  begin = time(NULL);
-  beginSim = gras_time();
-  for (a = 1; a < argc; a++) {
-    for (b = 1; b < argc; b++) {
-      int test = 0;
-
-      if (a == b)
-        continue;
-      fprintf(stderr, "BW XP(%s %s)=", argv[a], argv[b]);
-      while ((errcode =
-              grasbw_request(argv[a], 4000, argv[b], 4000, bufSize,
-                             expSize, msgSize, &dummy, &(bw[a][b])))
-             && (errcode == timeout_error)) {
-        test++;
-        if (test == 10) {
-          fprintf(stderr, "MAESTRO: 10 Timeouts; giving up\n");
-          return 1;
-        }
-      }
-      if (errcode) {
-        fprintf(stderr,
-                "MAESTRO: Error %s encountered while doing the test\n",
-                xbt_error_name(errcode));
-        return 1;
-      }
-      fprintf(stderr, "%f Mb/s in %f sec\n", bw[a][b], dummy);
-    }
-  }
-  fprintf(stderr, "Did all BW tests in %ld sec (%.2f simulated sec)\n",
-          time(NULL) - begin, gras_time() - beginSim);
-
-  /* saturation tests */
-  for (a = 1; a < argc; a++) {
-    for (b = 1; b < argc; b++) {
-      for (c = 1; c < argc; c++) {
-        INTERF(graph, interf, argv[a], argv[c], argv[b], argv[c]) = 1;
-      }
-    }
-  }
-
-  for (a = 1; a < argc; a++) {
-    for (b = 1; b < argc; b++) {
-      if (a == b)
-        continue;
-
-      if ((errcode =
-           grasbw_saturate_start(argv[a], 4000, argv[b], 4000, satSize,
-                                 360000000))) {
-        fprintf(stderr,
-                "MAESTRO: Error %s encountered while starting saturation\n",
-                xbt_error_name(errcode));
-        return -1;
-      }
-      gras_sleep(1, 0);
-
-      begin = time(NULL);
-      beginSim = gras_time();
-      for (c = 1; c < argc; c++) {
-        if (a == c || b == c)
-          continue;
-
-        for (d = 1; d < argc; d++) {
-          if (a == d || b == d || c == d)
-            continue;
-
-          if ((errcode =
-               grasbw_request(argv[c], 4000, argv[d], 4000, bufSize,
-                              expSize, msgSize, &dummy,
-                              &(bw_sat[c][d])))) {
-            fprintf(stderr, "MAESTRO: Error %s encountered in test\n",
-                    xbt_error_name(errcode));
-            return 1;
-          }
-          fprintf(stderr,
-                  "MAESTRO[%.2f sec]: SATURATED BW XP(%s %s // %s %s) => %f (%f vs %f)%s\n",
-                  gras_time(), argv[c], argv[d], argv[a], argv[b],
-                  bw_sat[c][d] / bw[c][d], bw[c][d], bw_sat[c][d],
-                  (bw_sat[c][d] / bw[c][d] <
-                   0.75) ? " THERE IS SOME INTERFERENCE !!!" : "");
-          INTERF(graph, interf, argv[c], argv[d], argv[a], argv[b]) =
-              (bw_sat[c][d] / bw[c][d] < 0.75) ? 1 : 0;
-        }
-      }
-
-      if ((errcode = grasbw_saturate_stop(argv[a], 4000, argv[b], 4000))) {
-        fprintf(stderr,
-                "MAESTRO: Error %s encountered while stopping saturation\n",
-                xbt_error_name(errcode));
-        return -1;
-      }
-      fprintf(stderr,
-              "Did an iteration on saturation pair in %ld sec (%.2f simulated sec)\n",
-              time(NULL) - begin, gras_time() - beginSim);
-    }
-  }
-
-  /* reconstruct the graph */
-  TBX_Graph_interferenceTableDump(interf);
-  TBX_Graph_interferenceTableSave(interf, "interference.dat");
-  begin = time(NULL);
-  fprintf(stderr, "MAESTRO: Reconstruct the graph... ");
-  builded_graph = TBX_Graph_exploreInterference(interf);
-  TBX_Graph_exportToGraphViz(builded_graph, "toto.dot");
-  fprintf(stderr, "done (took %d sec)", (int) time(NULL));
-
-  /* end */
-  TBX_Graph_freeGraph(graph, NULL, NULL, NULL);
-  TBX_Graph_freeGraph(builded_graph, NULL, NULL, NULL);
-  TBX_Graph_freeInterfTable(interf);
-
-  gras_sleep(5, 0);
-  exit(0);                      /* FIXME: There is a bug in MSG preventing me from terminating this server properly */
-  return gras_sock_close(g->sock);
-}
diff --git a/examples/amok/alnem/alnem_builder.c b/examples/amok/alnem/alnem_builder.c
deleted file mode 100644 (file)
index 26341f1..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* ALNeM builder. Take an interference matrix as argument,                  */
-/*  and reconstruct the corresponding graph itself                          */
-
-/* Copyright (c) 2005, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <tbx_graph.h>          /* alvin's graph toolbox (+ reconstruction algorithm) */
-
-int main(int argc, char *argv[])
-{
-  TBX_Graph_t graph;            /* a dummy graph containing all hosts */
-  TBX_FIFO_t host_fifo;
-  TBX_InterfTable_t interf;     /* the measured interferences */
-  TBX_Graph_t builded_graph;    /* the graph builded from the interferences */
-
-  if (argc != 2) {
-    fprintf(stderr, "alnem_builder: USAGE:\n");
-    fprintf(stderr, "  alnem_builder interference_file\n");
-    exit(1);
-  }
-
-  if (TBX_Graph_interferenceTableRead
-      (argv[1], &graph, &interf, &host_fifo)) {
-    fprintf(stderr, "Can't read the interference data, aborting\n");
-    exit(1);
-  }
-
-  builded_graph = TBX_Graph_exploreInterference(interf);
-  TBX_Graph_exportToGraphViz(builded_graph, "toto.dot");
-  return 0;
-}
diff --git a/examples/amok/alnem/alnem_deployment.txt b/examples/amok/alnem/alnem_deployment.txt
deleted file mode 100644 (file)
index 963935a..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-A sensor
-B sensor
-C sensor
-D sensor
-Master maestro A B C D
diff --git a/examples/amok/alnem/deploy_WAN3.txt b/examples/amok/alnem/deploy_WAN3.txt
deleted file mode 100644 (file)
index 6a88ba6..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-61 sensor
-62 sensor
-63 sensor
-69 sensor
-70 sensor
-77 sensor
-81 sensor
-83 sensor
-85 sensor
-87 sensor
-88 sensor
-95 sensor
-98 sensor
-107 sensor
-109 sensor
-111 sensor
-112 sensor
-121 sensor
-124 sensor
-125 sensor
-131 sensor
-145 sensor
-150 sensor
-156 sensor
-157 sensor
-162 sensor
-165 sensor
-168 sensor
-169 sensor
-170 sensor
-175 sensor
-177 sensor
-178 sensor
-109 maestro 61 62 63 69 70 77 81 83 85 98 107 109 111 112 121 124 125 131 145 150 156 157 162 165 168 169 170 175 177 178
diff --git a/examples/amok/alnem/interference.dat b/examples/amok/alnem/interference.dat
deleted file mode 100644 (file)
index c2fdc05..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-INTERFERENCE GRAPH DUMPED TO FILE. DO NOT EDIT, EVEN TO ADD OR REMOVE A SPACE !!
-4
-A
-B
-C
-D
-1 1 
-1 1 
-1 0 
-1 1 
-1 0 
-1 1 
-1 1 
-1 1 
-1 0 
-1 1 
-1 0 
-1 1 
-1 1 
-0 1 
-1 1 
-0 1 
-1 1 
-1 1 
-1 1 
-0 1 
-1 1 
-0 1 
-1 1 
-1 1 
diff --git a/examples/amok/bandwidth/CMakeLists.txt b/examples/amok/bandwidth/CMakeLists.txt
deleted file mode 100644 (file)
index 9ce7683..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_bandwidth_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_bandwidth_maestro.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_bandwidth_sensor.c
-  PROPERTIES GENERATED true
-  )
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-add_executable(bandwidth_simulator ${CMAKE_CURRENT_BINARY_DIR}/_bandwidth_simulator.c ${CMAKE_CURRENT_SOURCE_DIR}/bandwidth.c)
-add_executable(bandwidth_maestro   ${CMAKE_CURRENT_BINARY_DIR}/_bandwidth_maestro.c ${CMAKE_CURRENT_SOURCE_DIR}/bandwidth.c)
-add_executable(bandwidth_sensor    ${CMAKE_CURRENT_BINARY_DIR}/_bandwidth_sensor.c ${CMAKE_CURRENT_SOURCE_DIR}/bandwidth.c)
-
-add_custom_command(
-  OUTPUT       ${CMAKE_CURRENT_BINARY_DIR}/_bandwidth_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_bandwidth_maestro.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_bandwidth_sensor.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/bandwidth.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator bandwidth ${CMAKE_CURRENT_SOURCE_DIR}/bandwidth.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(bandwidth_simulator simgrid pthread m)
-  target_link_libraries(bandwidth_maestro gras pthread m)
-  target_link_libraries(bandwidth_sensor gras pthread m)
-else(NOT WIN32)
-  target_link_libraries(bandwidth_simulator simgrid)
-  target_link_libraries(bandwidth_maestro gras)
-  target_link_libraries(bandwidth_sensor gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/bandwidth_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/bandwidth_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/bandwidth_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/bandwidth.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/bandwidth.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
diff --git a/examples/amok/bandwidth/bandwidth.c b/examples/amok/bandwidth/bandwidth.c
deleted file mode 100644 (file)
index 8df320a..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-/* bandwidth - bandwidth test demo of GRAS features                         */
-
-/* Copyright (c) 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-
-#include "gras.h"
-#include "amok/bandwidth.h"
-#include "amok/peermanagement.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(Bandwidth,
-                             "Messages specific to this example");
-
-/* **********************************************************************
- * Sensor code
- * **********************************************************************/
-
-static xbt_socket_t try_gras_socket_client_from_string(const char *host)
-{
-  volatile xbt_socket_t sock = NULL;
-  xbt_ex_t e;
-  TRY {
-    sock = gras_socket_client_from_string(host);
-  }
-  CATCH(e) {
-    xbt_ex_free(e);
-  }
-  return sock;
-}
-
-/* Function prototypes */
-int sensor(int argc, char *argv[]);
-
-int sensor(int argc, char *argv[])
-{
-  xbt_socket_t mysock;
-  xbt_socket_t master = NULL;
-  int connection_try = 10;
-
-  gras_init(&argc, argv);
-  amok_bw_init();
-  amok_pm_init();
-
-  mysock = gras_socket_server_range(3000, 9999, 0, 0);
-  XBT_INFO("Sensor starting (on port %d)", gras_os_myport());
-  while (connection_try > 0 &&
-         !(master = try_gras_socket_client_from_string(argv[1]))) {
-    connection_try--;
-    gras_os_sleep(0.5);       /* let the master get ready */
-  }
-
-  amok_pm_group_join(master, "bandwidth");
-  amok_pm_mainloop(60);
-
-  gras_socket_close(mysock);
-  gras_socket_close(master);
-  gras_exit();
-  return 0;
-}
-
-/* **********************************************************************
- * Maestro code
- * **********************************************************************/
-
-/* Function prototypes */
-int maestro(int argc, char *argv[]);
-
-int maestro(int argc, char *argv[])
-{
-  double sec, bw;
-  int buf_size = 32 * 1024;
-  int msg_size = 512 * 1024;
-  int msg_amount = 1;
-  double min_duration = 1;
-
-  xbt_socket_t peer;
-  xbt_socket_t mysock;
-  xbt_peer_t h1, h2, h_temp;
-  xbt_dynar_t group;
-
-  gras_init(&argc, argv);
-  amok_bw_init();
-  amok_pm_init();
-
-  XBT_INFO("Maestro starting");
-  if (argc != 2) {
-    XBT_ERROR("Usage: maestro port\n");
-    return 1;
-  }
-  mysock = gras_socket_server(atoi(argv[1]));
-  group = amok_pm_group_new("bandwidth");
-  XBT_INFO("Wait for peers for 5 sec");
-  gras_msg_handleall(5);        /* friends, we're ready. Come and play */
-
-  if (xbt_dynar_length(group) < 2) {
-    amok_pm_group_shutdown("bandwidth");
-    xbt_die("Not enough peers arrived. Expected 2 got %ld",
-            xbt_dynar_length(group));
-  }
-  h1 = *(xbt_peer_t *) xbt_dynar_get_ptr(group, 0);
-  h2 = *(xbt_peer_t *) xbt_dynar_get_ptr(group, 1);
-  /* sort peers in right order to keep output right */
-  if (strcmp(h1->name, h2->name) < 0 || h1->port > h2->port) {
-    h_temp = h1;
-    h1 = h2;
-    h2 = h_temp;
-  }
-
-  XBT_INFO("Contact %s:%d", h1->name, h1->port);
-  peer = gras_socket_client(h1->name, h1->port);
-
-  XBT_INFO("Test the BW between me and one of the sensors");
-  amok_bw_test(peer, buf_size, msg_size, msg_amount, min_duration, &sec,
-               &bw);
-  XBT_INFO
-      ("Experience between me and %s:%d (initially %d msgs of %d bytes, maybe modified to fill the pipe at least %.1fs) took %f sec, achieving %f kb/s",
-       h1->name, h1->port, msg_amount, msg_size, min_duration, sec,
-       ((double) bw) / 1024.0);
-
-  XBT_INFO("Test the BW between %s:%d and %s:%d", h1->name, h1->port,
-        h2->name, h2->port);
-  amok_bw_request(h1->name, h1->port, h2->name, h2->port, buf_size,
-                  msg_size, msg_amount, min_duration, &sec, &bw);
-  XBT_INFO
-      ("Experience between %s:%d and %s:%d took took %f sec, achieving %f kb/s",
-       h1->name, h1->port, h2->name, h2->port, sec,
-       ((double) bw) / 1024.0);
-
-  /* Game is over, friends */
-  amok_pm_group_shutdown("bandwidth");
-
-  gras_socket_close(mysock);
-  gras_exit();
-  return 0;
-}
diff --git a/examples/amok/bandwidth/bandwidth.xml b/examples/amok/bandwidth/bandwidth.xml
deleted file mode 100644 (file)
index 777aa91..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Tremblay" function="sensor">
-     <argument value="Ginette:4000"/>       <!-- maestro -->
-  </process>
-  <process host="Jupiter" function="sensor">
-     <argument value="Ginette:4000"/>       <!-- maestro -->
-  </process>
-  <process host="Ginette" function="maestro">
-     <argument value="4000"/>   <!-- my port -->
-  </process>
-</platform>
diff --git a/examples/amok/bandwidth/bandwidth_rl.tesh b/examples/amok/bandwidth/bandwidth_rl.tesh
deleted file mode 100755 (executable)
index 34bb825..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-! timeout 20
-& $SG_TEST_ENV bandwidth/bandwidth_sensor$EXEEXT 127.0.0.1:6000 "--log=root.fmt=%P:%t%e%m%n"
-> sensor:main Sensor starting (on port 3000)
-
-! timeout 20
-& $SG_TEST_ENV bandwidth/bandwidth_sensor$EXEEXT 127.0.0.1:6000 "--log=root.fmt=%P:%t%e%m%n"
-> sensor:main Sensor starting (on port 3001)
-
-! timeout 20
-& $SG_TEST_ENV bandwidth/bandwidth_maestro$EXEEXT 6000 "--log=root.fmt=%P:%t%e%m%n"
-> maestro:main Maestro starting
-> maestro:main Wait for peers for 5 sec
-> maestro:main Contact 127.0.0.1:3000
-> maestro:main Test the BW between me and one of the sensors
diff --git a/examples/amok/bandwidth/bandwidth_sg_32.tesh b/examples/amok/bandwidth/bandwidth_sg_32.tesh
deleted file mode 100644 (file)
index 4f06b3f..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-$ $SG_TEST_EXENV bandwidth/bandwidth_simulator${EXEEXT} ${srcdir:=.}/../msg/small_platform.xml ${srcdir:=.}/bandwidth/bandwidth.xml
-> [Ginette:maestro:(3) 0.000000] [Bandwidth/INFO] Maestro starting
-> [Tremblay:sensor:(1) 0.000156] [Bandwidth/INFO] Sensor starting (on port 3000)
-> [Ginette:maestro:(3) 0.000156] [Bandwidth/INFO] Wait for peers for 5 sec
-> [Jupiter:sensor:(2) 0.000156] [Bandwidth/INFO] Sensor starting (on port 3000)
-> [Ginette:maestro:(3) 5.000156] [Bandwidth/INFO] Contact Tremblay:3000
-> [Ginette:maestro:(3) 5.000312] [Bandwidth/INFO] Test the BW between me and one of the sensors
-> [Ginette:maestro:(3) 7.091301] [Bandwidth/INFO] Experience between me and Tremblay:3000 (initially 1 msgs of 524288 bytes, maybe modified to fill the pipe at least 1.0s) took 1.090703 sec, achieving 7489.460506 kb/s
-> [Ginette:maestro:(3) 7.091301] [Bandwidth/INFO] Test the BW between Tremblay:3000 and Jupiter:3000
-> [Ginette:maestro:(3) 9.249120] [Bandwidth/INFO] Experience between Tremblay:3000 and Jupiter:3000 took took 1.089859 sec, achieving 6296.831079 kb/s
-> [Ginette:maestro:(3) 9.291095] [gras/INFO] Exiting GRAS
-> [Jupiter:sensor:(2) 9.291095] [gras/INFO] Exiting GRAS
-> [Tremblay:sensor:(1) 10.249120] [gras/INFO] Exiting GRAS
diff --git a/examples/amok/bandwidth/bandwidth_sg_64.tesh b/examples/amok/bandwidth/bandwidth_sg_64.tesh
deleted file mode 100644 (file)
index 15b1bab..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-$ $SG_TEST_EXENV bandwidth/bandwidth_simulator${EXEEXT} ${srcdir:=.}/../msg/small_platform.xml ${srcdir:=.}/bandwidth/bandwidth.xml
-> [Ginette:maestro:(3) 0.000000] [Bandwidth/INFO] Maestro starting
-> [Tremblay:sensor:(1) 0.000156] [Bandwidth/INFO] Sensor starting (on port 3000)
-> [Ginette:maestro:(3) 0.000156] [Bandwidth/INFO] Wait for peers for 5 sec
-> [Jupiter:sensor:(2) 0.000156] [Bandwidth/INFO] Sensor starting (on port 3000)
-> [Ginette:maestro:(3) 5.000156] [Bandwidth/INFO] Contact Tremblay:3000
-> [Ginette:maestro:(3) 5.000312] [Bandwidth/INFO] Test the BW between me and one of the sensors
-> [Ginette:maestro:(3) 7.091307] [Bandwidth/INFO] Experience between me and Tremblay:3000 (initially 1 msgs of 524288 bytes, maybe modified to fill the pipe at least 1.0s) took 1.090703 sec, achieving 7489.460506 kb/s
-> [Ginette:maestro:(3) 7.091307] [Bandwidth/INFO] Test the BW between Tremblay:3000 and Jupiter:3000
-> [Ginette:maestro:(3) 9.249135] [Bandwidth/INFO] Experience between Tremblay:3000 and Jupiter:3000 took took 1.089859 sec, achieving 6296.831079 kb/s
-> [Ginette:maestro:(3) 9.291110] [gras/INFO] Exiting GRAS
-> [Jupiter:sensor:(2) 9.291110] [gras/INFO] Exiting GRAS
-> [Tremblay:sensor:(1) 10.249135] [gras/INFO] Exiting GRAS
diff --git a/examples/amok/saturate/CMakeLists.txt b/examples/amok/saturate/CMakeLists.txt
deleted file mode 100644 (file)
index cd87c37..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_saturate_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_saturate_maestro.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_saturate_sensor.c
-  PROPERTIES GENERATED true
-  )
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-add_executable(saturate_simulator ${CMAKE_CURRENT_BINARY_DIR}/_saturate_simulator.c ${CMAKE_CURRENT_SOURCE_DIR}/saturate.c)
-add_executable(saturate_maestro   ${CMAKE_CURRENT_BINARY_DIR}/_saturate_maestro.c ${CMAKE_CURRENT_SOURCE_DIR}/saturate.c)
-add_executable(saturate_sensor    ${CMAKE_CURRENT_BINARY_DIR}/_saturate_sensor.c ${CMAKE_CURRENT_SOURCE_DIR}/saturate.c)
-
-add_custom_command(
-  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_saturate_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_saturate_maestro.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_saturate_sensor.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/saturate.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator saturate ${CMAKE_CURRENT_SOURCE_DIR}/saturate.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(saturate_simulator simgrid pthread m)
-  target_link_libraries(saturate_maestro gras pthread m)
-  target_link_libraries(saturate_sensor gras pthread m)
-else(NOT WIN32)
-  target_link_libraries(saturate_simulator simgrid)
-  target_link_libraries(saturate_maestro gras)
-  target_link_libraries(saturate_sensor gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/saturate_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/saturate_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/saturate_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/saturate.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/env.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/saturate.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
diff --git a/examples/amok/saturate/env.c b/examples/amok/saturate/env.c
deleted file mode 100644 (file)
index fc87222..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/* saturate - link saturation demo of AMOK features                         */
-
-/* Copyright (c) 2006, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <time.h>
-
-#include "gras.h"
-#include "amok/bandwidth.h"
-#include "amok/hostmanagement.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(saturate,
-                             "Messages specific to this example");
-
-static void env_hosttohost_bw(int argc, char *argv[])
-{
-
-  /* where are the sensors */
-  xbt_dynar_t hosts = xbt_dynar_new(sizeof(xbt_host_t), &free_host);
-  int nb_hosts;
-
-  /* results */
-  double sec, bw;
-
-  /* iterators */
-  int i;
-  xbt_host_t h1;
-
-  xbt_socket_t peer;           /* socket to sensor */
-
-  /* wait to ensure that all server sockets are there before starting the experiment */
-  gras_os_sleep(0.5);
-
-  /* Get the sensor location from argc/argv */
-  for (i = 1; i < argc - 1; i += 2) {
-    xbt_host_t host = xbt_new(s_xbt_host_t, 1);
-    host->name = strdup(argv[i]);
-    host->port = atoi(argv[i + 1]);
-    XBT_INFO("New sensor: %s:%d", host->name, host->port);
-    xbt_dynar_push(hosts, &host);
-  }
-  nb_hosts = xbt_dynar_length(hosts);
-
-  XBT_INFO(">>> start Test1: ENV end to end mesurements");
-
-  xbt_dynar_foreach(hosts, i, h1) {
-    peer = gras_socket_client(h1->name, h1->port);
-    amok_bw_test(peer, buf_size, exp_size, msg_size, min_duration, &sec,
-                 &bw);
-    XBT_INFO
-        ("Bandwidth between me and %s:%d (%d bytes in msgs of %d bytes) took %f sec, achieving %.3f kb/s",
-         h1->name, h1->port, exp_size, msg_size, sec,
-         ((double) bw) / 1024.0);
-  }
-
-  xbt_dynar_map(hosts, kill_buddy_dynar);
-  xbt_dynar_free(&hosts);
-
-}
-
-/********************************************************************************************/
-static void env_Pairwisehost_bw(int argc, char *argv[])
-{
-  /* where are the sensors */
-  xbt_dynar_t hosts = xbt_dynar_new(sizeof(xbt_host_t), &free_host);
-  int nb_hosts;
-
-  /* getting the name of maestro for the saturation and the concurrent bandwidth measurements  */
-  char *host_test = argv[0];
-
-  /* results */
-  double sec, bw;
-
-  /* iterators */
-  int i, j;
-  xbt_host_t h1, h2;
-
-  /* socket to sensor */
-  xbt_socket_t peer;
-
-  /* wait to ensure that all server sockets are there before starting the experiment */
-  gras_os_sleep(0.5);
-
-  XBT_INFO(">>>>>< le maestro est: %s ", argv[0]);
-  /* Get the sensor location from argc/argv */
-  for (i = 1; i < argc - 1; i += 2) {
-    xbt_host_t host = xbt_new(s_xbt_host_t, 1);
-    host->name = strdup(argv[i]);
-    host->port = atoi(argv[i + 1]);
-    XBT_INFO("New sensor: %s:%d", host->name, host->port);
-    xbt_dynar_push(hosts, &host);
-  }
-  nb_hosts = xbt_dynar_length(hosts);
-
-  XBT_INFO(">>> start Test2: ENV pairwise host bandwidth mesurements");
-  xbt_dynar_foreach(hosts, i, h1) {
-
-    TRY {
-      amok_bw_saturate_start(h1->name, h1->port, host_test, h1->port,   //"Ginette"
-                             msg_size, 120);    // sturation of the link with msg_size to compute a concurent bandwidth MA //MB
-    }
-    CATCH_ANONYMOUS {
-      RETHROWF("Cannot ask hosts to saturate the link: %s");
-    }
-    // gras_os_sleep(1.0);
-
-    xbt_dynar_foreach(hosts, j, h2) {
-      if (i == j)
-        continue;
-
-      peer = gras_socket_client(h2->name, h2->port);
-      amok_bw_test(peer, buf_size, exp_size, msg_size, min_duration, &sec,
-                   &bw);
-      XBT_INFO
-          ("Bandwidth between me and %s // measurement between me and %s (%d bytes in msgs of %d bytes) took %f sec, achieving %.3f kb/s",
-           h2->name, h1->name, exp_size, msg_size, sec,
-           ((double) bw) / 1024.0);
-
-    }
-    amok_bw_saturate_stop(h1->name, h1->port, NULL, NULL);
-  }
-  xbt_dynar_map(hosts, kill_buddy_dynar);
-  xbt_dynar_free(&hosts);
-
-}
-
-int maestro(int argc, char *argv[])
-{
-
-  gras_init(&argc, argv);
-  amok_bw_init();
-  amok_hm_init();
-
-  gras_socket_server(3333);     /* only so that messages from the transport layer in gras identify us */
-
-  //env_Pairwisehost_bw(argc,argv);
-  //env_hosttohost_bw(argc,argv);
-
-  gras_exit();
-  return 0;
-
-}
diff --git a/examples/amok/saturate/medium_deployment.xml b/examples/amok/saturate/medium_deployment.xml
deleted file mode 100644 (file)
index 7c1146b..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Apple" function="maestro">
-     <argument value="Anne_Marie:4000"/>
-     <argument value="Audy:4000"/>
-     <argument value="Verville:4000"/>
-     <argument value="St_Jean:4000"/>
-     <argument value="PERL:4000"/>
-     <argument value="Charron:4000"/>
-     <argument value="April:4000"/>
-     <argument value="Jocelyne:4000"/>
-     <argument value="Gosselin:4000"/>
-     <argument value="Raymond:4000"/>
-     <argument value="Owen:4000"/>
-     <argument value="St_Antoine:4000"/>
-     <argument value="Gregory:4000"/>
-     <argument value="SunOS:4000"/>
-     <argument value="Laurendeau:4000"/>
-     <argument value="Nelligan:4000"/>
-     <argument value="Lepage:4000"/>
-     <argument value="Jacques_Cartier:4000"/>
-     <argument value="Domey:4000"/>
-     <argument value="Olivier:4000"/>
-     <argument value="Jeannine:4000"/>
-  </process>
-  <process host="Anne_Marie" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Audy" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Verville" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="St_Jean" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="PERL" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Charron" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="April" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Jocelyne" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Gosselin" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Raymond" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Owen" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="St_Antoine" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Gregory" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="SunOS" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Laurendeau" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Nelligan" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Lepage" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Jacques_Cartier" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Domey" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Olivier" function="sensor">
-     <argument value="4000"/>
-  </process>
-  <process host="Jeannine" function="sensor">
-     <argument value="4000"/>
-  </process>
-</platform>
diff --git a/examples/amok/saturate/saturate.c b/examples/amok/saturate/saturate.c
deleted file mode 100644 (file)
index fde8bfc..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-/* saturate - link saturation demo of AMOK features                         */
-
-/* Copyright (c) 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <time.h>
-
-#include "xbt/peer.h"
-#include "gras.h"
-#include "amok/bandwidth.h"
-#include "amok/peermanagement.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(saturate,
-                             "Messages specific to this example");
-
-/* **********************************************************************
- * Sensor code
- * **********************************************************************/
-
-/* Function prototypes */
-int sensor(int argc, char *argv[]);
-
-int sensor(int argc, char *argv[])
-{
-  xbt_socket_t mysock;
-  xbt_socket_t master;
-
-  gras_init(&argc, argv);
-  amok_bw_init();
-  amok_pm_init();
-
-  mysock = gras_socket_server_range(3000, 9999, 0, 0);
-  XBT_INFO("Sensor starting (on port %d)", gras_os_myport());
-  gras_os_sleep(2);             /* let the master get ready */
-  master = gras_socket_client_from_string(argv[1]);
-
-  amok_pm_group_join(master, "saturate");
-  amok_pm_mainloop(600);
-
-  gras_socket_close(mysock);
-  gras_socket_close(master);
-  gras_exit();
-  return 0;
-}
-
-/* **********************************************************************
- * Maestro code
- * **********************************************************************/
-
-/* Function prototypes */
-int maestro(int argc, char *argv[]);
-
-/* XP setups */
-const int buf_size = 0;
-const int msg_size = 50 * 1024;
-const int msg_amount = 2;
-const int sat_size = 1024 * 1024 * 10;
-const double min_duration = 1;
-
-static double XP(const char *bw1, const char *bw2,
-                 const char *sat1, const char *sat2)
-{
-
-  double sec, bw, sec_sat, bw_sat;
-
-  gras_os_sleep(5.0);           /* wait for the sensors to show up */
-  /* Test BW without saturation */
-  amok_bw_request(bw1, 4000, bw2, 4000,
-                  buf_size, msg_size, msg_amount, min_duration, &sec, &bw);
-  XBT_INFO("BW(%s,%s) => %f sec, achieving %f Mb/s",
-        bw1, bw2, sec, (bw / 1024.0 / 1024.0));
-
-
-  /* Test BW with saturation */
-  amok_bw_saturate_start(sat1, 4000, sat2, 4000, sat_size, 60);
-  gras_os_sleep(1.0);           /* let it start */
-
-  amok_bw_request(bw1, 4000, bw2, 4000,
-                  buf_size, msg_size, msg_amount, min_duration, &sec_sat,
-                  &bw_sat);
-  XBT_INFO("BW(%s,%s//%s,%s) => %f sec, achieving %f Mb/s", bw1, bw2, sat1,
-        sat2, sec, bw / 1024.0 / 1024.0);
-
-  amok_bw_saturate_stop(sat1, 4000, NULL, NULL);
-
-  if (bw_sat / bw < 0.7) {
-    XBT_INFO("THERE IS SOME INTERFERENCE !!!");
-  }
-  if (bw / bw_sat < 0.7) {
-    XBT_INFO("THERE IS SOME INTERFERENCE (and I'm an idiot) !!!");
-  }
-  return bw_sat / bw;
-}
-
-static void kill_buddy(char *name, int port)
-{
-  xbt_socket_t sock = gras_socket_client(name, port);
-  gras_msg_send(sock, "kill", NULL);
-  gras_socket_close(sock);
-}
-
-static void kill_buddy_dynar(void *b)
-{
-  xbt_peer_t buddy = *(xbt_peer_t *) b;
-  kill_buddy(buddy->name, buddy->port);
-}
-
-static void free_peer(void *d)
-{
-  xbt_peer_t h = *(xbt_peer_t *) d;
-  free(h->name);
-  free(h);
-}
-
-static void simple_saturation(int argc, char *argv[])
-{
-  xbt_ex_t e;
-
-  /* where are the sensors */
-  xbt_dynar_t peers;
-  xbt_peer_t h1, h2;
-  /* results */
-  double duration, bw;
-
-  /* Init the group */
-  peers = amok_pm_group_new("saturate");
-  /* wait for dudes */
-  gras_msg_handleall(5);
-
-  /* Stop all sensors but two of them */
-  while (xbt_dynar_length(peers) > 2) {
-    xbt_dynar_pop(peers, &h1);
-    amok_pm_kill_hp(h1->name, h1->port);
-    xbt_peer_free(h1);
-  }
-
-  /* get 2 friends */
-  xbt_dynar_get_cpy(peers, 0, &h1);
-  xbt_dynar_get_cpy(peers, 1, &h2);
-
-  /* Start saturation */
-  XBT_INFO("Start saturation between %s:%d and %s:%d",
-        h1->name, h1->port, h2->name, h2->port);
-
-  amok_bw_saturate_start(h1->name, h1->port, h2->name, h2->port, 0,     /* Be a nice boy, compute msg_size yourself */
-                         30 /* 5 sec timeout */ );
-
-  /* Stop it after a while */
-  XBT_INFO("Have a rest");
-  gras_os_sleep(1);
-  TRY {
-    XBT_INFO("Stop the saturation");
-    amok_bw_saturate_stop(h1->name, h1->port, &duration, &bw);
-  }
-  CATCH(e) {
-    XBT_INFO("Ooops, stoping the saturation raised an exception");
-    xbt_ex_free(e);
-  }
-  XBT_INFO("Saturation took %.2fsec, achieving %fb/s", duration, bw);
-
-  /* Game is over, friends */
-  amok_pm_group_shutdown("saturate");
-}
-
-/********************************************************************************************/
-static void full_fledged_saturation(int argc, char *argv[])
-{
-  double time1 = 5.0, bw1 = 5.0;        // 0.5 for test
-  /* timers */
-  double begin_simulated;
-  int begin;
-
-  /* where are the sensors */
-  xbt_dynar_t peers;
-  int nb_peers;
-
-  /* results */
-  double *bw;
-  double *bw_sat;
-
-  /* iterators */
-  unsigned int i, j, k, l;
-  xbt_peer_t h1, h2, h3, h4;
-
-  /* Init the group */
-  peers = amok_pm_group_new("saturate");
-  /* wait 4 dudes */
-  gras_msg_handle(60);
-  gras_msg_handle(60);
-  gras_msg_handle(60);
-  gras_msg_handle(60);
-  nb_peers = xbt_dynar_length(peers);
-
-  XBT_INFO("Let's go for the bw_matrix");
-
-  /* Do the test without saturation */
-  begin = time(NULL);
-  begin_simulated = gras_os_time();
-
-  bw = amok_bw_matrix(peers, buf_size, msg_size, msg_amount, min_duration);
-
-  XBT_INFO("Did all BW tests in %ld sec (%.2f simulated(?) sec)",
-        (long int) (time(NULL) - begin), gras_os_time() - begin_simulated);
-
-  /* Do the test with saturation */
-  bw_sat = xbt_new(double, nb_peers * nb_peers);
-  xbt_dynar_foreach(peers, i, h1) {
-    xbt_dynar_foreach(peers, j, h2) {
-      if (i == j)
-        continue;
-
-      TRY {
-        amok_bw_saturate_start(h1->name, h1->port, h2->name, h2->port, 0,       /* Be nice, compute msg_size yourself */
-                               0 /* no timeout */ );
-      }
-      CATCH_ANONYMOUS {
-        RETHROWF("Cannot ask peers to saturate the link: %s");
-      }
-      gras_os_sleep(5);
-
-      begin = time(NULL);
-      begin_simulated = gras_os_time();
-      xbt_dynar_foreach(peers, k, h3) {
-        if (i == k || j == k)
-          continue;
-
-        xbt_dynar_foreach(peers, l, h4) {
-          double ratio;
-          if (i == l || j == l || k == l)
-            continue;
-
-          XBT_VERB("TEST %s %s // %s %s",
-                h1->name, h2->name, h3->name, h4->name);
-          amok_bw_request(h3->name, h3->port, h4->name, h4->port,
-                          buf_size, msg_size, msg_amount, min_duration,
-                          NULL, &(bw_sat[k * nb_peers + l]));
-
-          ratio = bw_sat[k * nb_peers + l] / bw[k * nb_peers + l];
-          XBT_INFO("SATURATED BW XP(%s %s // %s %s) => %f (%f vs %f)%s",
-                h1->name, h2->name, h3->name, h4->name,
-                ratio,
-                bw[k * nb_peers + l], bw_sat[k * nb_peers + l],
-                ratio < 0.7 ? " THERE IS SOME INTERFERENCE !!!" : "");
-        }
-      }
-      amok_bw_saturate_stop(h1->name, h1->port, &time1, &bw1);
-
-      XBT_INFO
-          ("Did an iteration on saturation pair in %ld sec (%.2f simulated sec)",
-           (long int) (time(NULL) - begin),
-           gras_os_time() - begin_simulated);
-      XBT_INFO
-          ("the duration of the experiment >>>>> %.3f sec (%.3f bandwidth)",
-           time1, bw1);
-    }
-  }
-  free(bw_sat);
-  free(bw);
-  /* Game is over, friends */
-  amok_pm_group_shutdown("saturate");
-}
-
-
-int maestro(int argc, char *argv[])
-{
-
-  gras_init(&argc, argv);
-  amok_bw_init();
-  amok_pm_init();
-
-  gras_socket_server(atoi(argv[1]));
-
-  simple_saturation(argc, argv);
-  //full_fledged_saturation(argc, argv);  
-
-  gras_exit();
-  return 0;
-
-}
diff --git a/examples/amok/saturate/saturate.xml b/examples/amok/saturate/saturate.xml
deleted file mode 100644 (file)
index 965663e..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-
-  <process host="Tremblay" function="sensor">  <argument value="Bourassa:4000"/> </process>
-  <process host="Jupiter"  function="sensor">  <argument value="Bourassa:4000"/> </process>
-  <process host="Fafard"   function="sensor">  <argument value="Bourassa:4000"/> </process>
-  <process host="Ginette"  function="sensor">  <argument value="Bourassa:4000"/> </process>
-
-  <process host="Bourassa" function="maestro"> <argument value="4000"/>          </process>
-
-</platform>
diff --git a/examples/amok/saturate/saturate_rl.tesh b/examples/amok/saturate/saturate_rl.tesh
deleted file mode 100755 (executable)
index f9d57d2..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-! timeout 20
-& $SG_TEST_ENV saturate/saturate_sensor$EXEEXT 127.0.0.1:3333 "--log=root.fmt=%P:%t%e%m%n"
-
-! timeout 20
-& $SG_TEST_ENV saturate/saturate_sensor$EXEEXT 127.0.0.1:3333 "--log=root.fmt=%P:%t%e%m%n"
-
-! timeout 20
-& $SG_TEST_ENV saturate/saturate_sensor$EXEEXT 127.0.0.1:3333 "--log=root.fmt=%P:%t%e%m%n"
-
-! timeout 20
-& $SG_TEST_ENV saturate/saturate_sensor$EXEEXT 127.0.0.1:3333 "--log=root.fmt=%P:%t%e%m%n"
-
-! timeout 20
-& $SG_TEST_ENV saturate/saturate_maestro$EXEEXT 3333 "--log=root.fmt=%P:%t%e%m%n"
diff --git a/examples/amok/saturate/saturate_sg_32.tesh b/examples/amok/saturate/saturate_sg_32.tesh
deleted file mode 100644 (file)
index df0b549..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-$ $SG_TEST_EXENV saturate/saturate_simulator${EXEEXT} ${srcdir:=.}/../msg/small_platform.xml ${srcdir:=.}/saturate/saturate.xml
-> [Tremblay:sensor:(1) 0.000156] [saturate/INFO] Sensor starting (on port 3000)
-> [Ginette:sensor:(4) 0.000156] [saturate/INFO] Sensor starting (on port 3000)
-> [Fafard:sensor:(3) 0.000156] [saturate/INFO] Sensor starting (on port 3000)
-> [Jupiter:sensor:(2) 0.000156] [saturate/INFO] Sensor starting (on port 3000)
-> [Jupiter:sensor:(2) 5.035848] [gras/INFO] Exiting GRAS
-> [Bourassa:maestro:(5) 5.041416] [saturate/INFO] Start saturation between Tremblay:3000 and Ginette:3000
-> [Fafard:sensor:(3) 5.041416] [gras/INFO] Exiting GRAS
-> [Bourassa:maestro:(5) 5.082248] [saturate/INFO] Have a rest
-> [Bourassa:maestro:(5) 6.082248] [saturate/INFO] Stop the saturation
-> [Tremblay:sensor:(1) 7.200171] [amok_bw_sat/INFO] Saturation(Tremblay:3000->Ginette:3000) started
-> [Tremblay:sensor:(1) 13.188984] [amok_bw_sat/INFO] Saturation from Tremblay:3000 to Ginette:3000 stopped by Bourassa:4000
-> [Bourassa:maestro:(5) 13.209324] [saturate/INFO] Saturation took 5.99sec, achieving 1280588.867148b/s
-> [Tremblay:sensor:(1) 13.229816] [gras/INFO] Exiting GRAS
-> [Bourassa:maestro:(5) 13.242860] [gras/INFO] Exiting GRAS
-> [Ginette:sensor:(4) 73.188984] [amok_bw_sat/INFO] Saturation comming from Tremblay:3000 stopped on Ginette:3000
-> [Ginette:sensor:(4) 73.188984] [gras/INFO] Exiting GRAS
diff --git a/examples/amok/saturate/saturate_sg_64.tesh b/examples/amok/saturate/saturate_sg_64.tesh
deleted file mode 100644 (file)
index ea4ee30..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-$ $SG_TEST_EXENV saturate/saturate_simulator${EXEEXT} ${srcdir:=.}/../msg/small_platform.xml ${srcdir:=.}/saturate/saturate.xml
-> [Tremblay:sensor:(1) 0.000156] [saturate/INFO] Sensor starting (on port 3000)
-> [Ginette:sensor:(4) 0.000156] [saturate/INFO] Sensor starting (on port 3000)
-> [Fafard:sensor:(3) 0.000156] [saturate/INFO] Sensor starting (on port 3000)
-> [Jupiter:sensor:(2) 0.000156] [saturate/INFO] Sensor starting (on port 3000)
-> [Jupiter:sensor:(2) 5.035848] [gras/INFO] Exiting GRAS
-> [Bourassa:maestro:(5) 5.041416] [saturate/INFO] Start saturation between Tremblay:3000 and Ginette:3000
-> [Fafard:sensor:(3) 5.041416] [gras/INFO] Exiting GRAS
-> [Bourassa:maestro:(5) 5.082248] [saturate/INFO] Have a rest
-> [Bourassa:maestro:(5) 6.082248] [saturate/INFO] Stop the saturation
-> [Tremblay:sensor:(1) 7.200177] [amok_bw_sat/INFO] Saturation(Tremblay:3000->Ginette:3000) started
-> [Tremblay:sensor:(1) 13.188990] [amok_bw_sat/INFO] Saturation from Tremblay:3000 to Ginette:3000 stopped by Bourassa:4000
-> [Bourassa:maestro:(5) 13.209330] [saturate/INFO] Saturation took 5.99sec, achieving 1280588.867148b/s
-> [Tremblay:sensor:(1) 13.229822] [gras/INFO] Exiting GRAS
-> [Bourassa:maestro:(5) 13.242866] [gras/INFO] Exiting GRAS
-> [Ginette:sensor:(4) 73.188990] [amok_bw_sat/INFO] Saturation comming from Tremblay:3000 stopped on Ginette:3000
-> [Ginette:sensor:(4) 73.188990] [gras/INFO] Exiting GRAS
diff --git a/examples/gras/all2all/CMakeLists.txt b/examples/gras/all2all/CMakeLists.txt
deleted file mode 100644 (file)
index 82b7c2f..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_all2all_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_all2all_sender.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_all2all_receiver.c
-  PROPERTIES GENERATED true
-  )
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-add_executable(all2all_simulator ${CMAKE_CURRENT_BINARY_DIR}/_all2all_simulator.c ${CMAKE_CURRENT_SOURCE_DIR}/all2all.c)
-add_executable(all2all_sender    ${CMAKE_CURRENT_BINARY_DIR}/_all2all_sender.c ${CMAKE_CURRENT_SOURCE_DIR}/all2all.c)
-add_executable(all2all_receiver  ${CMAKE_CURRENT_BINARY_DIR}/_all2all_receiver.c ${CMAKE_CURRENT_SOURCE_DIR}/all2all.c)
-
-add_custom_command(
-  OUTPUT       ${CMAKE_CURRENT_BINARY_DIR}/_all2all_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_all2all_sender.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_all2all_receiver.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/all2all.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator all2all ${CMAKE_CURRENT_SOURCE_DIR}/all2all.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(all2all_simulator simgrid pthread m)
-  target_link_libraries(all2all_sender gras pthread m)
-  target_link_libraries(all2all_receiver gras pthread m)
-else(NOT WIN32)
-  target_link_libraries(all2all_simulator simgrid)
-  target_link_libraries(all2all_sender gras)
-  target_link_libraries(all2all_receiver gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/all2all.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/all2all.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/make_deployment.pl
-  ${CMAKE_CURRENT_SOURCE_DIR}/run.sh
-  PARENT_SCOPE
-  )
diff --git a/examples/gras/all2all/all2all.c b/examples/gras/all2all/all2all.c
deleted file mode 100644 (file)
index 7872303..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-/* ALL2ALL - all2all of GRAS features                                       */
-
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
- /* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
-#include "xbt/ex.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(all2all, "Messages specific to this example");
-
-/* register data which may be sent (common to client and server) */
-static void register_messages(void)
-{
-}
-
-/* Function prototypes */
-int receiver(int argc, char *argv[]);
-int sender(int argc, char *argv[]);
-
-
-/* **********************************************************************
- * Receiver code
- * **********************************************************************/
-int receiver(int argc, char *argv[])
-{
-
-  int myport;                   /* port on which I receive stuff */
-  int todo;                     /* amount of messages I should get */
-  char *data;                   /* message content */
-
-  xbt_socket_t mysock;         /* socket on which other people contact me */
-  xbt_socket_t expeditor;      /* to notice who wrote me */
-
-  /* Init the GRAS infrastructure and declare my globals */
-  gras_init(&argc, argv);
-
-  /* Get my settings from the command line */
-  myport = atoi(argv[1]);
-  todo = atoi(argv[2]);
-
-  /* Register the known messages */
-  gras_msgtype_declare("data", xbt_datadesc_by_name("string"));
-
-  /* Create my master socket */
-  mysock = gras_socket_server(myport);
-
-  /* Get the data */
-  XBT_INFO("Listening on port %d (expecting %d messages)",
-        xbt_socket_my_port(mysock), todo);
-  while (todo > 0) {
-    gras_msg_wait(60 /* wait up to one minute */ ,
-                  "data", &expeditor, &data);
-    todo--;
-    free(data);
-
-    XBT_INFO("Got Data from %s:%d (still %d to go)",
-          xbt_socket_peer_name(expeditor),
-          xbt_socket_peer_port(expeditor), todo);
-
-  }
-
-  /* Free the allocated resources, and shut GRAS down */
-  gras_socket_close(mysock);
-
-  gras_exit();
-  return 0;
-}                               /* end_of_receiver */
-
-/* **********************************************************************
- * Sender code
- * **********************************************************************/
-
-int sender(int argc, char *argv[])
-{
-
-  unsigned int iter;            /* iterator */
-  char *data;                   /* data exchanged */
-  int datasize;                 /* size of message */
-  xbt_peer_t h;                 /* iterator */
-  int connected = 0;
-
-  volatile xbt_socket_t peer = NULL;    /* socket to node */
-
-
-  /* xbt_dynar for peers */
-  xbt_dynar_t peers =
-      xbt_dynar_new(sizeof(xbt_peer_t), &xbt_peer_free_voidp);
-
-  /* Init the GRAS infrastructure and declare my globals */
-  gras_init(&argc, argv);
-
-  /* Get the node location from argc/argv */
-  for (iter = 1; iter < argc - 1; iter++) {
-    xbt_peer_t peer = xbt_peer_from_string(argv[iter]);
-    xbt_dynar_push(peers, &peer);
-  }
-
-  datasize = atoi(argv[argc - 1]);
-
-  data = (char *) malloc(datasize + 1); // allocation of datasize octets
-  memset(data, 32, datasize);
-  data[datasize] = '\0';
-
-  XBT_INFO("Launch current node");
-
-  /* Register the known messages */
-  gras_msgtype_declare("data", xbt_datadesc_by_name("string"));
-
-
-  /* write to the receivers */
-  xbt_dynar_foreach(peers, iter, h) {
-    connected = 0;
-    while (!connected) {
-      xbt_ex_t e;
-      TRY {
-        peer = gras_socket_client(h->name, h->port);
-        connected = 1;
-      }
-      CATCH(e) {
-        if (e.category != system_error  /*in RL */
-            && e.category != mismatch_error /*in SG */ )
-          RETHROW;
-        xbt_ex_free(e);
-        gras_os_sleep(0.01);
-      }
-    }
-    gras_msg_send(peer, "data", &data);
-    if (gras_if_SG()) {
-      XBT_INFO("  Sent Data from %s to %s", gras_os_myname(), h->name);
-    } else {
-      XBT_INFO("  Sent Data");
-    }
-
-    gras_socket_close(peer);
-  }
-
-  /* Free the allocated resources, and shut GRAS down */
-  free(data);
-  xbt_dynar_free(&peers);
-
-  gras_exit();
-  return 0;
-}                               /* end_of_sender */
diff --git a/examples/gras/all2all/all2all.xml b/examples/gras/all2all/all2all.xml
deleted file mode 100644 (file)
index 0eed86f..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <!-- For each host, we have a sender and a receiver (because we use a
-       1-port model and still don't want any deadlocks neither synchronization
-       delays).
-       Sender arguments = receiver peer + Message size as last argument (in byte)
-       Receiver arguments: amount of incoming messages expected -->
-
-
-  <process host="Tremblay" function="sender">
-     <argument value="Jupiter:4000"/>
-     <argument value="Fafard:4000"/> 
-     <argument value="Ginette:4000"/> 
-     <argument value="Bourassa:4000"/> 
-     <argument value="512"/>
-  </process>
-  <process host="Tremblay" function="receiver">
-     <argument value="4000"/>
-     <argument value="4"/>  
-  </process>
-
-
-  <process host="Jupiter" function="sender">
-     <argument value="Tremblay:4000"/> 
-     <argument value="Fafard:4000"/> 
-     <argument value="Ginette:4000"/> 
-     <argument value="Bourassa:4000"/> 
-     <argument value="512"/>
-  </process>
-  <process host="Jupiter" function="receiver">
-     <argument value="4000"/>
-     <argument value="4"/>
-  </process>
-
-
-  <process host="Fafard" function="sender">
-     <argument value="Tremblay:4000"/> 
-     <argument value="Jupiter:4000"/>  
-     <argument value="Ginette:4000"/> 
-     <argument value="Bourassa:4000"/> 
-     <argument value="512"/>
-  </process>
-  <process host="Fafard" function="receiver">
-     <argument value="4000"/>
-     <argument value="4"/> 
-  </process>
-  <process host="Ginette" function="sender">
-     <argument value="Tremblay:4000"/> 
-     <argument value="Jupiter:4000"/>  
-     <argument value="Fafard:4000"/> 
-     <argument value="Bourassa:4000"/> 
-     <argument value="512"/>
-  </process>
-  <process host="Ginette" function="receiver">
-     <argument value="4000"/>
-     <argument value="4"/>
-  </process>
-
-
-  <process host="Bourassa" function="sender">
-     <argument value="Tremblay:4000"/> 
-     <argument value="Jupiter:4000"/>  
-     <argument value="Fafard:4000"/> 
-     <argument value="Ginette:4000"/> 
-     <argument value="512"/>
-  </process>
-  <process host="Bourassa" function="receiver">
-     <argument value="4000"/>
-     <argument value="4"/>
-  </process>
-</platform>
diff --git a/examples/gras/all2all/make_deployment.pl b/examples/gras/all2all/make_deployment.pl
deleted file mode 100755 (executable)
index 3220e86..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-#! /usr/bin/perl
-
-use strict;
-
-sub usage {
-    print STDERR <<EOH
-Usage: all2all_make_deployment.pl platform_file.xml nb_host size_msg (bcast source?)
-  
-This script generates a deployment file for the all2all program. It takes 
-a SimGrid platform file as first argument and the number of wanted peers as 
-second argument. If the amount of peers exceeds the amount of available 
-hosts in the deployment file, several peers will be placed on the same host.
-
-The third argument is a size of the message to send ( octets )  
-
-If a fourth argument is passed, this is the source of the broadcast
-(given as a number between 0 and nb_host-1).
-EOH
-      ;
-    die "\n";
-}
-
-my $input    = shift @ARGV || usage();
-my $size_msg = shift @ARGV || usage();
-my $source   = shift @ARGV || "";
-my $nb_hosts = shift @ARGV || 0;
-
-my @host;
-
-open IN,$input || die "Cannot open $input: $!\n";
-
-while (<IN>) {
-  next unless /<host id="([^"]*)"/; # "
-  
-  push @host, $1;
-}
-
-# map { print "$_\n" } @host;
-
-die "No host found in $input. Is it really a SimGrid platform file?\nCheck that you didn't pass a deployment file, for example.\n"
-  unless (scalar @host);
-
-if (! $nb_hosts) {
-    $nb_hosts = scalar @host;
-}
-
-
-# 
-# Build the receiver string
-
-my @receivers;    # strings containing sender argument describing all receivers.
-
-my $it_host=0;    # iterator
-my $it_port=4000; # iterator, in case we have so much processes to add that we must change it
-
-for (my $i=0; $i<$nb_hosts; $i++) {
-  push (@receivers, "$host[$it_host]:$it_port");
-  $it_host ++;
-  if ($it_host == scalar @host) {
-    $it_host=0;
-    $it_port++;
-  }
-}
-
-#
-# and now, really generate the file. Receiver first.
-
-print "<?xml version='1.0'?>\n";
-print "<!DOCTYPE platform SYSTEM \"simgrid.dtd\">\n";
-print "<platform version=\"2\">\n\n";
-
-for my $r (@receivers) {
-    my ($h, $p) = split(':', $r);
-    print "  <process host=\"".$h."\" function=\"receiver\">\n";
-    print "    <argument value=\"$p\"/><argument value=\"".(length($source)?1:$nb_hosts)."\"/>\n";
-    print "  </process>\n\n";
-}
-
-#
-# Here come the sender(s)
-
-if(length($source)) {
-    print "  <process host=\"".$host[$source % (scalar @host)].
-       "\" function=\"sender\">\n";
-    for my $r (@receivers) {
-       print "    <argument value=\"$r\"/>\n"; 
-    }
-    print "    <argument value=\"$size_msg\"/>\n"; 
-    print "  </process>\n";
-} else {
-    my $i = 0; 
-    for my $r (@receivers) {
-       my ($h, $p) = split(":", $r); 
-        print "  <process host=\"".$h."\" function=\"sender\">\n";
-        for (my $j = 0; $j < $nb_hosts; $j++) {
-           my $r2 = $receivers[($i + $j) % ($nb_hosts)]; 
-           print "    <argument value=\"$r2\"/>\n"; 
-        }
-        print "    <argument value=\"$size_msg\"/>\n"; 
-        print "  </process>\n";
-        $i++;
-    }
-}
-
-print "</platform>\n";
-
-# print "source='$source' nb_hosts=$nb_hosts\n";
diff --git a/examples/gras/all2all/run.sh b/examples/gras/all2all/run.sh
deleted file mode 100755 (executable)
index 36d5147..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#! /bin/bash
-
-#
-# USAGE: run.sh  plaform  nb_host (broadcast source?)
-#
-# This script takes a platform file and a number of hosts as argument.
-#  if a third argument is passed, this is the source of the broadcast 
-#  (given as a number between 0 and nb_host-1).
-#
-# It generates the right deployment platform and run the experiment, 
-#  only showing the last line of the run, showing the resulting time.
-
-plat=$1
-nb_host=$2
-bcast=$3
-set -e
-
-if [ -z $plat -o -z $nb_host ] ; then
-  # invalid argument. Display the comment at the script begining & exit
-  grep '^#\(\([^!]\)\|$\)' $0 | sed 's/# *//' >&2
-  exit 1
-fi
-if ! [ -e $plat ] ; then
-  echo "Platform file not found" >&2
-  exit 1
-fi
-
-echo "Generating the deployment"
-./make_deployment.pl $plat $nb_host $bcast > tmp_deployment_$nb_host
-echo "Running the experiment"
-./all2all_simulator $plat tmp_deployment_$nb_host 2>&1 |tee run.log|grep "Congrat"
-rm tmp_deployment_$nb_host
diff --git a/examples/gras/all2all/test_rl.tesh b/examples/gras/all2all/test_rl.tesh
deleted file mode 100755 (executable)
index c7ffc41..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-# The receivers, waiting for 5 messages
-! timeout 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./all2all_receiver$EXEEXT 4400 5 --log=root.fmt:%m%n
-> Listening on port 4400 (expecting 5 messages)
-> Got Data from 127.0.0.1:5005 (still 4 to go)
-> Got Data from 127.0.0.1:5005 (still 3 to go)
-> Got Data from 127.0.0.1:5005 (still 2 to go)
-> Got Data from 127.0.0.1:5005 (still 1 to go)
-> Got Data from 127.0.0.1:5005 (still 0 to go)
-> Exiting GRAS
-
-! timeout 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./all2all_receiver$EXEEXT 4401 5 --log=root.fmt:%m%n
-> Listening on port 4401 (expecting 5 messages)
-> Got Data from 127.0.0.1:5005 (still 4 to go)
-> Got Data from 127.0.0.1:5005 (still 3 to go)
-> Got Data from 127.0.0.1:5005 (still 2 to go)
-> Got Data from 127.0.0.1:5005 (still 1 to go)
-> Got Data from 127.0.0.1:5005 (still 0 to go)
-> Exiting GRAS
-
-! timeout 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./all2all_receiver$EXEEXT 4402 5 --log=root.fmt:%m%n
-> Listening on port 4402 (expecting 5 messages)
-> Got Data from 127.0.0.1:5005 (still 4 to go)
-> Got Data from 127.0.0.1:5005 (still 3 to go)
-> Got Data from 127.0.0.1:5005 (still 2 to go)
-> Got Data from 127.0.0.1:5005 (still 1 to go)
-> Got Data from 127.0.0.1:5005 (still 0 to go)
-> Exiting GRAS
-
-! timeout 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./all2all_receiver$EXEEXT 4403 5 --log=root.fmt:%m%n
-> Listening on port 4403 (expecting 5 messages)
-> Got Data from 127.0.0.1:5005 (still 4 to go)
-> Got Data from 127.0.0.1:5005 (still 3 to go)
-> Got Data from 127.0.0.1:5005 (still 2 to go)
-> Got Data from 127.0.0.1:5005 (still 1 to go)
-> Got Data from 127.0.0.1:5005 (still 0 to go)
-> Exiting GRAS
-
-! timeout 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./all2all_receiver$EXEEXT 4404 5 --log=root.fmt:%m%n
-> Listening on port 4404 (expecting 5 messages)
-> Got Data from 127.0.0.1:5005 (still 4 to go)
-> Got Data from 127.0.0.1:5005 (still 3 to go)
-> Got Data from 127.0.0.1:5005 (still 2 to go)
-> Got Data from 127.0.0.1:5005 (still 1 to go)
-> Got Data from 127.0.0.1:5005 (still 0 to go)
-> Exiting GRAS
-
-# give the receivers a chance to acquire the expected port numbers
-$ $SG_TEST_EXENV sleep 1
-
-# Five time a sender
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./all2all_sender$EXEEXT 127.0.0.1:4400 127.0.0.1:4401 127.0.0.1:4402 127.0.0.1:4403 127.0.0.1:4404 512 --log=root.fmt:%m%n
-> Launch current node
->   Sent Data
->   Sent Data
->   Sent Data
->   Sent Data
->   Sent Data
-> Exiting GRAS
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./all2all_sender$EXEEXT 127.0.0.1:4400 127.0.0.1:4401 127.0.0.1:4402 127.0.0.1:4403 127.0.0.1:4404 512 --log=root.fmt:%m%n
-> Launch current node
->   Sent Data
->   Sent Data
->   Sent Data
->   Sent Data
->   Sent Data
-> Exiting GRAS
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./all2all_sender$EXEEXT 127.0.0.1:4400 127.0.0.1:4401 127.0.0.1:4402 127.0.0.1:4403 127.0.0.1:4404 512 --log=root.fmt:%m%n
-> Launch current node
->   Sent Data
->   Sent Data
->   Sent Data
->   Sent Data
->   Sent Data
-> Exiting GRAS
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./all2all_sender$EXEEXT 127.0.0.1:4400 127.0.0.1:4401 127.0.0.1:4402 127.0.0.1:4403 127.0.0.1:4404 512 --log=root.fmt:%m%n
-> Launch current node
->   Sent Data
->   Sent Data
->   Sent Data
->   Sent Data
->   Sent Data
-> Exiting GRAS
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./all2all_sender$EXEEXT 127.0.0.1:4400 127.0.0.1:4401 127.0.0.1:4402 127.0.0.1:4403 127.0.0.1:4404 512 --log=root.fmt:%m%n
-> Launch current node
->   Sent Data
->   Sent Data
->   Sent Data
->   Sent Data
->   Sent Data
-> Exiting GRAS
diff --git a/examples/gras/all2all/test_sg_32.tesh b/examples/gras/all2all/test_sg_32.tesh
deleted file mode 100644 (file)
index 6d522da..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#! ./tesh
-
-! output sort
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./all2all_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/all2all.xml --cfg=network/crosstraffic:0 "--log=root.fmt:[%10.6r]%e(%.2i:%P@%h)%e%m%n"
-> [  0.000000] (00:@) Configuration change: Set 'network/crosstraffic' to '0'
-> [  0.000000] (01:sender@Tremblay) Launch current node
-> [  0.000000] (03:sender@Jupiter) Launch current node
-> [  0.000000] (05:sender@Fafard) Launch current node
-> [  0.000000] (07:sender@Ginette) Launch current node
-> [  0.000000] (09:sender@Bourassa) Launch current node
-> [  0.000195] (02:receiver@Tremblay) Listening on port 4000 (expecting 4 messages)
-> [  0.000195] (04:receiver@Jupiter) Listening on port 4000 (expecting 4 messages)
-> [  0.000195] (06:receiver@Fafard) Listening on port 4000 (expecting 4 messages)
-> [  0.000195] (08:receiver@Ginette) Listening on port 4000 (expecting 4 messages)
-> [  0.000195] (10:receiver@Bourassa) Listening on port 4000 (expecting 4 messages)
-> [  0.019284] (01:sender@Tremblay)   Sent Data from Tremblay to Jupiter
-> [  0.019284] (04:receiver@Jupiter) Got Data from Tremblay:5000 (still 3 to go)
-> [  0.025735] (02:receiver@Tremblay) Got Data from Bourassa:5000 (still 3 to go)
-> [  0.025735] (09:sender@Bourassa)   Sent Data from Bourassa to Tremblay
-> [  0.042352] (02:receiver@Tremblay) Got Data from Ginette:5000 (still 2 to go)
-> [  0.042352] (07:sender@Ginette)   Sent Data from Ginette to Tremblay
-> [  0.045289] (01:sender@Tremblay)   Sent Data from Tremblay to Fafard
-> [  0.045289] (06:receiver@Fafard) Got Data from Tremblay:5000 (still 3 to go)
-> [  0.062102] (01:sender@Tremblay)   Sent Data from Tremblay to Ginette
-> [  0.062102] (08:receiver@Ginette) Got Data from Tremblay:5000 (still 3 to go)
-> [  0.068162] (02:receiver@Tremblay) Got Data from Fafard:5000 (still 1 to go)
-> [  0.068162] (05:sender@Fafard)   Sent Data from Fafard to Tremblay
-> [  0.070559] (04:receiver@Jupiter) Got Data from Bourassa:5000 (still 2 to go)
-> [  0.070559] (09:sender@Bourassa)   Sent Data from Bourassa to Jupiter
-> [  0.077590] (06:receiver@Fafard) Got Data from Bourassa:5000 (still 2 to go)
-> [  0.077590] (09:sender@Bourassa)   Sent Data from Bourassa to Fafard
-> [  0.087251] (02:receiver@Tremblay) Got Data from Jupiter:5000 (still 0 to go)
-> [  0.087251] (02:receiver@Tremblay) Exiting GRAS
-> [  0.087251] (03:sender@Jupiter)   Sent Data from Jupiter to Tremblay
-> [  0.087837] (01:sender@Tremblay)   Sent Data from Tremblay to Bourassa
-> [  0.087837] (01:sender@Tremblay) Exiting GRAS
-> [  0.087837] (10:receiver@Bourassa) Got Data from Tremblay:5000 (still 3 to go)
-> [  0.093971] (08:receiver@Ginette) Got Data from Bourassa:5000 (still 2 to go)
-> [  0.093971] (09:sender@Bourassa)   Sent Data from Bourassa to Ginette
-> [  0.093971] (09:sender@Bourassa) Exiting GRAS
-> [  0.106266] (04:receiver@Jupiter) Got Data from Ginette:5000 (still 1 to go)
-> [  0.106266] (07:sender@Ginette)   Sent Data from Ginette to Jupiter
-> [  0.132345] (03:sender@Jupiter)   Sent Data from Jupiter to Fafard
-> [  0.132345] (06:receiver@Fafard) Got Data from Jupiter:5000 (still 1 to go)
-> [  0.148801] (06:receiver@Fafard) Got Data from Ginette:5000 (still 0 to go)
-> [  0.148801] (06:receiver@Fafard) Exiting GRAS
-> [  0.148801] (07:sender@Ginette)   Sent Data from Ginette to Fafard
-> [  0.151165] (04:receiver@Jupiter) Got Data from Fafard:5000 (still 0 to go)
-> [  0.151165] (04:receiver@Jupiter) Exiting GRAS
-> [  0.151165] (05:sender@Fafard)   Sent Data from Fafard to Jupiter
-> [  0.165182] (07:sender@Ginette)   Sent Data from Ginette to Bourassa
-> [  0.165182] (07:sender@Ginette) Exiting GRAS
-> [  0.165182] (10:receiver@Bourassa) Got Data from Ginette:5000 (still 2 to go)
-> [  0.168247] (03:sender@Jupiter)   Sent Data from Jupiter to Ginette
-> [  0.168247] (08:receiver@Ginette) Got Data from Jupiter:5000 (still 1 to go)
-> [  0.184703] (05:sender@Fafard)   Sent Data from Fafard to Ginette
-> [  0.184703] (08:receiver@Ginette) Got Data from Fafard:5000 (still 0 to go)
-> [  0.184703] (08:receiver@Ginette) Exiting GRAS
-> [  0.213071] (03:sender@Jupiter)   Sent Data from Jupiter to Bourassa
-> [  0.213071] (03:sender@Jupiter) Exiting GRAS
-> [  0.213071] (10:receiver@Bourassa) Got Data from Jupiter:5000 (still 1 to go)
-> [  0.219907] (05:sender@Fafard)   Sent Data from Fafard to Bourassa
-> [  0.219907] (05:sender@Fafard) Exiting GRAS
-> [  0.219907] (10:receiver@Bourassa) Got Data from Fafard:5000 (still 0 to go)
-> [  0.219907] (10:receiver@Bourassa) Exiting GRAS
diff --git a/examples/gras/all2all/test_sg_64.tesh b/examples/gras/all2all/test_sg_64.tesh
deleted file mode 100644 (file)
index 5150816..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-#! ./tesh
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./all2all_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/all2all.xml --cfg=network/crosstraffic:0 "--log=root.fmt:[%10.6r]%e(%.2i:%P@%h)%e%m%n"
-> [  0.000000] (00:@) Configuration change: Set 'network/crosstraffic' to '0'
-> [  0.000000] (01:sender@Tremblay) Launch current node
-> [  0.000000] (03:sender@Jupiter) Launch current node
-> [  0.000000] (05:sender@Fafard) Launch current node
-> [  0.000000] (07:sender@Ginette) Launch current node
-> [  0.000000] (09:sender@Bourassa) Launch current node
-> [  0.000195] (04:receiver@Jupiter) Listening on port 4000 (expecting 4 messages)
-> [  0.000195] (02:receiver@Tremblay) Listening on port 4000 (expecting 4 messages)
-> [  0.000195] (10:receiver@Bourassa) Listening on port 4000 (expecting 4 messages)
-> [  0.000195] (08:receiver@Ginette) Listening on port 4000 (expecting 4 messages)
-> [  0.000195] (06:receiver@Fafard) Listening on port 4000 (expecting 4 messages)
-> [  0.019284] (01:sender@Tremblay)   Sent Data from Tremblay to Jupiter
-> [  0.019284] (04:receiver@Jupiter) Got Data from Tremblay:5000 (still 3 to go)
-> [  0.025735] (09:sender@Bourassa)   Sent Data from Bourassa to Tremblay
-> [  0.025735] (02:receiver@Tremblay) Got Data from Bourassa:5000 (still 3 to go)
-> [  0.042352] (07:sender@Ginette)   Sent Data from Ginette to Tremblay
-> [  0.042352] (02:receiver@Tremblay) Got Data from Ginette:5000 (still 2 to go)
-> [  0.045289] (01:sender@Tremblay)   Sent Data from Tremblay to Fafard
-> [  0.045289] (06:receiver@Fafard) Got Data from Tremblay:5000 (still 3 to go)
-> [  0.062102] (01:sender@Tremblay)   Sent Data from Tremblay to Ginette
-> [  0.062102] (08:receiver@Ginette) Got Data from Tremblay:5000 (still 3 to go)
-> [  0.068162] (05:sender@Fafard)   Sent Data from Fafard to Tremblay
-> [  0.068162] (02:receiver@Tremblay) Got Data from Fafard:5000 (still 1 to go)
-> [  0.070559] (09:sender@Bourassa)   Sent Data from Bourassa to Jupiter
-> [  0.070559] (04:receiver@Jupiter) Got Data from Bourassa:5000 (still 2 to go)
-> [  0.077590] (09:sender@Bourassa)   Sent Data from Bourassa to Fafard
-> [  0.077590] (06:receiver@Fafard) Got Data from Bourassa:5000 (still 2 to go)
-> [  0.087251] (03:sender@Jupiter)   Sent Data from Jupiter to Tremblay
-> [  0.087251] (02:receiver@Tremblay) Got Data from Jupiter:5000 (still 0 to go)
-> [  0.087251] (02:receiver@Tremblay) Exiting GRAS
-> [  0.087837] (01:sender@Tremblay)   Sent Data from Tremblay to Bourassa
-> [  0.087837] (01:sender@Tremblay) Exiting GRAS
-> [  0.087837] (10:receiver@Bourassa) Got Data from Tremblay:5000 (still 3 to go)
-> [  0.093971] (09:sender@Bourassa)   Sent Data from Bourassa to Ginette
-> [  0.093971] (09:sender@Bourassa) Exiting GRAS
-> [  0.093971] (08:receiver@Ginette) Got Data from Bourassa:5000 (still 2 to go)
-> [  0.106266] (07:sender@Ginette)   Sent Data from Ginette to Jupiter
-> [  0.106266] (04:receiver@Jupiter) Got Data from Ginette:5000 (still 1 to go)
-> [  0.132345] (03:sender@Jupiter)   Sent Data from Jupiter to Fafard
-> [  0.132345] (06:receiver@Fafard) Got Data from Jupiter:5000 (still 1 to go)
-> [  0.148801] (07:sender@Ginette)   Sent Data from Ginette to Fafard
-> [  0.148801] (06:receiver@Fafard) Got Data from Ginette:5000 (still 0 to go)
-> [  0.148801] (06:receiver@Fafard) Exiting GRAS
-> [  0.151165] (05:sender@Fafard)   Sent Data from Fafard to Jupiter
-> [  0.151165] (04:receiver@Jupiter) Got Data from Fafard:5000 (still 0 to go)
-> [  0.151165] (04:receiver@Jupiter) Exiting GRAS
-> [  0.165182] (07:sender@Ginette)   Sent Data from Ginette to Bourassa
-> [  0.165182] (07:sender@Ginette) Exiting GRAS
-> [  0.165182] (10:receiver@Bourassa) Got Data from Ginette:5000 (still 2 to go)
-> [  0.168247] (03:sender@Jupiter)   Sent Data from Jupiter to Ginette
-> [  0.168247] (08:receiver@Ginette) Got Data from Jupiter:5000 (still 1 to go)
-> [  0.184703] (05:sender@Fafard)   Sent Data from Fafard to Ginette
-> [  0.184703] (08:receiver@Ginette) Got Data from Fafard:5000 (still 0 to go)
-> [  0.184703] (08:receiver@Ginette) Exiting GRAS
-> [  0.213071] (03:sender@Jupiter)   Sent Data from Jupiter to Bourassa
-> [  0.213071] (03:sender@Jupiter) Exiting GRAS
-> [  0.213071] (10:receiver@Bourassa) Got Data from Jupiter:5000 (still 1 to go)
-> [  0.219907] (05:sender@Fafard)   Sent Data from Fafard to Bourassa
-> [  0.219907] (05:sender@Fafard) Exiting GRAS
-> [  0.219907] (10:receiver@Bourassa) Got Data from Fafard:5000 (still 0 to go)
-> [  0.219907] (10:receiver@Bourassa) Exiting GRAS
diff --git a/examples/gras/chrono/CMakeLists.txt b/examples/gras/chrono/CMakeLists.txt
deleted file mode 100644 (file)
index 06d094b..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_chrono_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_chrono_multiplier.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-add_executable(chrono_simulator  ${CMAKE_CURRENT_BINARY_DIR}/_chrono_simulator.c ${CMAKE_CURRENT_SOURCE_DIR}/chrono.c)
-add_executable(chrono_multiplier ${CMAKE_CURRENT_BINARY_DIR}/_chrono_multiplier.c ${CMAKE_CURRENT_SOURCE_DIR}/chrono.c)
-
-add_custom_command(
-  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_chrono_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_chrono_multiplier.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/chrono.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator chrono ${CMAKE_CURRENT_SOURCE_DIR}/chrono.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(chrono_simulator simgrid pthread m )
-  target_link_libraries(chrono_multiplier gras pthread m )
-else(NOT WIN32)
-  target_link_libraries(chrono_simulator simgrid)
-  target_link_libraries(chrono_multiplier gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/chrono.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/chrono.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/chrono2.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
diff --git a/examples/gras/chrono/chrono.c b/examples/gras/chrono/chrono.c
deleted file mode 100644 (file)
index 8dba577..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/* chrono - demo of GRAS benchmarking features                              */
-
-/* Copyright (c) 2005, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
-#include "xbt/log.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(Chrono, "Messages specific to this example");
-
-
-/* Function prototypes */
-int multiplier(int argc, char *argv[]);
-
-int multiplier(int argc, char *argv[])
-{
-  int i, j, k, l;
-  double *A, *B, *C;
-  int n = 100;
-  double start = 0.0;
-  double now = 0.0;
-
-  gras_init(&argc, argv);
-
-  A = malloc(n * n * sizeof(double));
-  B = malloc(n * n * sizeof(double));
-  C = malloc(n * n * sizeof(double));
-
-  start = now = gras_os_time();
-
-  XBT_INFO("Begin matrix multiplication loop (time: %g)", start);
-
-  for (l = 0; l < 4; l++) {
-    now = gras_os_time();
-    GRAS_BENCH_ONCE_RUN_ONCE_BEGIN();
-    for (i = 0; i < n; i++)
-      for (j = 0; j < n; j++) {
-        A[i * n + j] = 2 / n;
-        B[i * n + j] = 1 / n;
-        C[i * n + j] = 0.0;
-      }
-
-    for (i = 0; i < n; i++)
-      for (j = 0; j < n; j++)
-        for (k = 0; k < n; k++)
-          C[i * n + j] += A[i * n + k] * B[k * n + j];
-
-    GRAS_BENCH_ONCE_RUN_ONCE_END();
-    now = gras_os_time() - now;
-    XBT_INFO("Iteration %d : %g ", l, now);
-  }
-
-  now = gras_os_time() - start;
-  XBT_INFO("End matrix multiplication loop (time: %g; Duration: %g)",
-        gras_os_time(), now);
-
-  start = now = gras_os_time();
-  XBT_INFO("Begin malloc loop (time: %g)", start);
-  for (l = 0; l < 4; l++) {
-    now = gras_os_time();
-    GRAS_BENCH_ONCE_RUN_ONCE_BEGIN();
-    free(A);
-    A = malloc(n * n * sizeof(double));
-    GRAS_BENCH_ONCE_RUN_ONCE_END();
-    now = gras_os_time() - now;
-    XBT_INFO("Iteration %d : %g ", l, now);
-  }
-
-  start = now = gras_os_time();
-  XBT_INFO("Begin integer incrementation loop (time: %g)", start);
-  for (l = 0; l < 4; l++) {
-    GRAS_BENCH_ONCE_RUN_ONCE_BEGIN();
-    j++;
-    GRAS_BENCH_ONCE_RUN_ONCE_END();
-  }
-  free(A);
-  free(B);
-  free(C);
-
-  gras_exit();
-  return 0;
-}
diff --git a/examples/gras/chrono/chrono.xml b/examples/gras/chrono/chrono.xml
deleted file mode 100644 (file)
index 780ea23..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Tremblay" function="multiplier"/>
-</platform>
diff --git a/examples/gras/chrono/chrono2.c b/examples/gras/chrono/chrono2.c
deleted file mode 100644 (file)
index a64936a..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/* chrono - demo of GRAS benchmarking features                              */
-
-/* Copyright (c) 2005, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
-#include "xbt/log.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(Chrono, "Messages specific to this example");
-
-#include <cblas.h>
-void cblas_dgemm(const enum CBLAS_ORDER Order,
-                 const enum CBLAS_TRANSPOSE TransA,
-                 const enum CBLAS_TRANSPOSE TransB, const int M,
-                 const int N, const int K, const double alpha,
-                 const double *A, const int lda, const double *B,
-                 const int ldb, const double beta, double *C,
-                 const int ldc);
-
-
-/* Function prototypes */
-static int mat_mult(int n)
-{
-  int i, j, k, l;
-  double *A, *B, *C;
-  double start = 0.0;
-  double now = 0.0;
-
-  A = malloc(n * n * sizeof(double));
-  B = malloc(n * n * sizeof(double));
-  C = malloc(n * n * sizeof(double));
-
-  start = now = gras_os_time();
-
-  XBT_INFO("Matrix size: %d", n);
-/*   XBT_INFO("Before computation: %lg", start); */
-
-  for (l = 0; l < 40; l++) {
-    now = gras_os_time();
-    GRAS_BENCH_ONCE_RUN_ONCE_BEGIN();
-    for (i = 0; i < n; i++)
-      for (j = 0; j < n; j++) {
-        A[i * n + j] = 2 / n;
-        B[i * n + j] = 1 / n;
-        C[i * n + j] = 0.0;
-      }
-
-    cblas_dgemm(CblasRowMajor,
-                CblasNoTrans, CblasNoTrans, n, n, n,
-                1.0, A, n, B, n, 0.0, C, n);
-    GRAS_BENCH_ONCE_RUN_ONCE_END();
-    now = gras_os_time() - now;
-/*     XBT_INFO("Iteration %d : %lg ", l, now); */
-  }
-
-  now = gras_os_time() - start;
-  XBT_INFO("Duration: %lg ", now);
-
-  free(A);
-  free(B);
-  free(C);
-}
-
-int multiplier(int argc, char *argv[])
-{
-  gras_init(&argc, argv);
-
-  mat_mult(10);
-  mat_mult(20);
-  mat_mult(30);
-  mat_mult(40);
-  mat_mult(50);
-  mat_mult(75);
-  mat_mult(100);
-  mat_mult(300);
-  mat_mult(500);
-  mat_mult(750);
-  mat_mult(1000);
-
-  return 0;
-}
diff --git a/examples/gras/chrono/test_rl.tesh b/examples/gras/chrono/test_rl.tesh
deleted file mode 100755 (executable)
index 16aa7b0..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-
-! output display
-$ $SG_TEST_EXENV ./chrono_multiplier$EXEEXT --log=root.fmt:%m%n $@
diff --git a/examples/gras/chrono/test_sg_32.tesh b/examples/gras/chrono/test_sg_32.tesh
deleted file mode 100755 (executable)
index 3e0f53b..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-
-! output display
-$ $SG_TEST_EXENV ./chrono_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/chrono.xml
diff --git a/examples/gras/chrono/test_sg_64.tesh b/examples/gras/chrono/test_sg_64.tesh
deleted file mode 100755 (executable)
index 3e0f53b..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-
-! output display
-$ $SG_TEST_EXENV ./chrono_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/chrono.xml
diff --git a/examples/gras/console/CMakeLists.txt b/examples/gras/console/CMakeLists.txt
deleted file mode 100644 (file)
index f8989af..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-if(HAVE_LUA)
-  cmake_minimum_required(VERSION 2.6)
-
-  set_source_files_properties(
-    ${CMAKE_CURRENT_BINARY_DIR}/_ping_simulator.c
-    ${CMAKE_CURRENT_BINARY_DIR}/_ping_client.c
-    ${CMAKE_CURRENT_BINARY_DIR}/_ping_server.c
-    PROPERTIES GENERATED true)
-
-  set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-  add_executable(ping_simulator_console
-    ${CMAKE_CURRENT_BINARY_DIR}/_ping_simulator.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/ping_server.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/ping_client.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/ping_common.c)
-
-  add_executable(ping_client_console
-    ${CMAKE_CURRENT_BINARY_DIR}/_ping_client.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/ping_client.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/ping_common.c)
-
-  add_executable(ping_server_console
-    ${CMAKE_CURRENT_BINARY_DIR}/_ping_server.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/ping_server.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/ping_common.c)
-
-  add_custom_command(
-    OUTPUT
-    ${CMAKE_CURRENT_BINARY_DIR}/_ping_simulator.c
-    ${CMAKE_CURRENT_BINARY_DIR}/_ping_client.c
-    ${CMAKE_CURRENT_BINARY_DIR}/_ping_server.c
-    ${CMAKE_CURRENT_BINARY_DIR}/simgrid.${LIB_EXE}
-    COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_BINARY_DIR}/lib/libsimgrid.${LIB_EXE} ${CMAKE_CURRENT_BINARY_DIR}/simgrid.${LIB_EXE}
-    COMMAND lua ${CMAKE_CURRENT_SOURCE_DIR}/ping_generator.lua
-    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} #needed to find simgrid.so. By default CMAKE_CURRENT_BINARY_DIR
-    )
-
-  ### Add definitions for compile
-  target_link_libraries(ping_simulator_console simgrid pthread m)
-  target_link_libraries(ping_client_console gras simgrid pthread m)
-  target_link_libraries(ping_server_console gras simgrid pthread m)
-endif(HAVE_LUA)
-
-set(tesh_files
-  ${tesh_files}
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_client.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_common.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_server.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping.h
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/gras_platform_script.lua
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_generator.lua
-  PARENT_SCOPE
-  )
diff --git a/examples/gras/console/gras_platform_script.lua b/examples/gras/console/gras_platform_script.lua
deleted file mode 100644 (file)
index 1884b05..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-require "simgrid"
-
-  simgrid.AS.new{id="AS0",mode="Full"};
-
-  simgrid.host.new{id="Tremblay",power=98095000};
-  simgrid.host.new{id="Jupiter",power=76296000};
-  simgrid.host.new{id="Fafard",power=76296000};
-  simgrid.host.new{id="Ginette",power=48492000};
-  simgrid.host.new{id="Bourassa",power=48492000};
-
-    -- create Links
-  for i=10,0,-1 do
-    simgrid.link.new{id=i,bandwidth=252750+ i*768,latency=0.000270544+i*0.087};   
-  end
-  -- simgrid.route.new(src_id,des_id,links_nb,links_list)
-   simgrid.route.new("Tremblay","Jupiter",{"1"});
-   simgrid.route.new("Tremblay","Fafard",{"0","1","2","3","4","8"});
-   simgrid.route.new("Tremblay","Ginette",{"3","4","5"});
-   simgrid.route.new("Tremblay","Bourassa",{"0","1","3","2","4","6","7"});
-
-   simgrid.route.new("Jupiter","Tremblay",{"1"});
-   simgrid.route.new("Jupiter","Fafard",{"0","1","2","3","4","8","9"});
-   simgrid.route.new("Jupiter","Ginette",{"3","4","5","9"});
-   simgrid.route.new("Jupiter","Bourassa",{"0","1","2","3","4","6","7","9"});
-   simgrid.route.new("Fafard","Tremblay",{"0","1","2","3","4","8"});
-   simgrid.route.new("Fafard","Jupiter",{"0","1","2","3","4","8","9"});
-   simgrid.route.new("Fafard","Ginette",{"0","1","2","5","8"});
-   simgrid.route.new("Fafard","Bourassa",{"6","7","8"});
-  
-   simgrid.route.new("Ginette","Tremblay",{"3","4","5"});
-   simgrid.route.new("Ginette","Jupiter",{"3","4","5","9"});
-   simgrid.route.new("Ginette","Fafard",{"0","1","2","5","8"});
-   simgrid.route.new("Ginette","Bourassa",{"0","1","2","5","6","7"});
-
-   simgrid.route.new("Bourassa","Tremblay",{"0","1","3","2","4","6","7"});
-   simgrid.route.new("Bourassa","Jupiter",{"0","1","2","3","4","6","7","9"});
-   simgrid.route.new("Bourassa","Fafard",{"6","7","8"});
-   simgrid.route.new("Bourassa","Ginette",{"0","1","2","5","6","7"});
-  
-   --Save Platform
-   simgrid.gras_register_platform();
-
-  --Set Application
-   simgrid.host.set_function{host="Tremblay",fct="server",args="4000"};
-   simgrid.host.set_function{host="Fafard",fct="client",args="Tremblay,4000"};
-
-  --Save Application 
-   simgrid.gras_register_application(); 
-
-
diff --git a/examples/gras/console/ping.h b/examples/gras/console/ping.h
deleted file mode 100644 (file)
index ffd57cf..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* ping - ping/pong demo of GRAS features                                   */
-
-/* Copyright (c) 2006, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef PING_COMMON_H
-#define PING_COMMON_H
-
-#include "gras.h"
-
-/* register messages which may be sent (common to client and server) */
-void ping_register_messages(void);
-
-/* Function prototypes */
-int server(int argc, char *argv[]);
-int client(int argc, char *argv[]);
-
-#endif
diff --git a/examples/gras/console/ping_client.c b/examples/gras/console/ping_client.c
deleted file mode 100644 (file)
index d0af525..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ping - ping/pong demo of GRAS features                                   */
-
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "ping.h"
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(Ping);
-
-static xbt_socket_t try_gras_socket_client(const char *host, int port)
-{
-  volatile xbt_socket_t sock = NULL;
-  xbt_ex_t e;
-  TRY {
-    sock = gras_socket_client(host, port);
-  }
-  CATCH(e) {
-    if (e.category != system_error)
-      /* dunno what happened, let the exception go through */
-      RETHROWF("Unable to connect to the server: %s");
-    xbt_ex_free(e);
-  }
-  return sock;
-}
-
-int client(int argc, char *argv[])
-{
-  xbt_socket_t toserver = NULL;        /* peer */
-
-  xbt_socket_t from;
-  int ping, pong;
-
-  const char *host = "127.0.0.1";
-  int port = 4000;
-
-  /* 1. Init the GRAS's infrastructure */
-  gras_init(&argc, argv);
-
-  /* 2. Get the server's address. The command line override defaults when specified */
-  if (argc == 3) {
-    host = argv[1];
-    port = atoi(argv[2]);
-  }
-
-  XBT_INFO("Launch client (server on %s:%d)", host, port);
-
-  /* 3. Create a socket to speak to the server */
-  while (!(toserver = try_gras_socket_client(host, port)))
-    gras_os_sleep(0.05);
-
-  XBT_INFO("Connected to %s:%d.", host, port);
-
-  /* 4. Register the messages.
-     See, it doesn't have to be done completely at the beginning, only before use */
-  ping_register_messages();
-
-  /* 5. Keep the user informed of what's going on */
-  XBT_INFO(">>>>>>>> Connected to server which is on %s:%d <<<<<<<<",
-        xbt_socket_peer_name(toserver), xbt_socket_peer_port(toserver));
-
-  /* 6. Prepare and send the ping message to the server */
-  ping = 1234;
-  TRY {
-    gras_msg_send(toserver, "ping", &ping);
-  }
-  CATCH_ANONYMOUS {
-    gras_socket_close(toserver);
-    RETHROWF("Failed to send PING to server: %s");
-  }
-  XBT_INFO(">>>>>>>> Message PING(%d) sent to %s:%d <<<<<<<<",
-        ping,
-        xbt_socket_peer_name(toserver), xbt_socket_peer_port(toserver));
-
-  /* 7. Wait for the answer from the server, and deal with issues */
-  TRY {
-    gras_msg_wait(6000, "pong", &from, &pong);
-  }
-  CATCH_ANONYMOUS {
-    gras_socket_close(toserver);
-    RETHROWF("Why can't I get my PONG message like everyone else: %s");
-  }
-
-  /* 8. Keep the user informed of what's going on, again */
-  XBT_INFO(">>>>>>>> Got PONG(%d) from %s:%d <<<<<<<<",
-        pong, xbt_socket_peer_name(from), xbt_socket_peer_port(from));
-
-  /* 9. Free the allocated resources, and shut GRAS down */
-  gras_socket_close(toserver);
-  XBT_INFO("Done.");
-  gras_exit();
-  return 0;
-}                               /* end_of_client */
diff --git a/examples/gras/console/ping_common.c b/examples/gras/console/ping_common.c
deleted file mode 100644 (file)
index f0b6e49..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* ping - ping/pong demo of GRAS features                                   */
-
-/* Copyright (c) 2006, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "ping.h"
-XBT_LOG_NEW_DEFAULT_CATEGORY(Ping, "Messages specific to this example");
-
-/* register messages which may be sent (common to client and server) */
-void ping_register_messages(void)
-{
-  gras_msgtype_declare("ping", xbt_datadesc_by_name("int"));
-  gras_msgtype_declare("pong", xbt_datadesc_by_name("int"));
-  XBT_INFO("Messages registered");
-}
diff --git a/examples/gras/console/ping_generator.lua b/examples/gras/console/ping_generator.lua
deleted file mode 100644 (file)
index edca5a9..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-require "simgrid"
-
-  --Set Application
-   simgrid.gras_set_process_function("Fafard","client",{"Tremblay","4000"});
-   simgrid.gras_set_process_function("Tremblay","server",{"4000"});
-  --Save Application 
-   simgrid.gras_generate("ping"); 
-
-
diff --git a/examples/gras/console/ping_server.c b/examples/gras/console/ping_server.c
deleted file mode 100644 (file)
index f1324b1..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/* ping - ping/pong demo of GRAS features                                   */
-
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "ping.h"
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(Ping);
-
-/* Global private data */
-typedef struct {
-  xbt_socket_t sock;
-  int endcondition;
-} server_data_t;
-
-
-static int server_cb_ping_handler(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  /* 1. Get the payload into the msg variable, and retrieve my caller */
-  int msg = *(int *) payload;
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-
-  /* 2. Retrieve the server's state (globals) */
-
-  server_data_t *globals = (server_data_t *) gras_userdata_get();
-  globals->endcondition = 0;
-
-  /* 3. Log which client connected */
-  XBT_INFO(">>>>>>>> Got message PING(%d) from %s:%d <<<<<<<<",
-        msg,
-        xbt_socket_peer_name(expeditor),
-        xbt_socket_peer_port(expeditor));
-
-  /* 4. Change the value of the msg variable */
-  msg = 4321;
-  /* 5. Send it back as payload of a pong message to the expeditor */
-  TRY {
-    gras_msg_send(expeditor, "pong", &msg);
-
-    /* 6. Deal with errors: add some details to the exception */
-  }
-  CATCH_ANONYMOUS {
-    gras_socket_close(globals->sock);
-    RETHROWF("Unable answer with PONG: %s");
-  }
-
-  XBT_INFO(">>>>>>>> Answered with PONG(4321) <<<<<<<<");
-
-  /* 7. Set the endcondition boolean to true (and make sure the server stops after receiving it). */
-  globals->endcondition = 1;
-
-  /* 8. Tell GRAS that we consummed this message */
-  return 0;
-}                               /* end_of_server_cb_ping_handler */
-
-int server(int argc, char *argv[])
-{
-  server_data_t *globals;
-
-  int port = 4000;
-
-  /* 1. Init the GRAS infrastructure and declare my globals */
-  gras_init(&argc, argv);
-  globals = gras_userdata_new(server_data_t);
-
-  /* 2. Get the port I should listen on from the command line, if specified */
-  if (argc == 2) {
-    port = atoi(argv[1]);
-  }
-
-  XBT_INFO("Launch server (port=%d)", port);
-
-  /* 3. Create my master socket */
-  globals->sock = gras_socket_server(port);
-
-  /* 4. Register the known messages. This function is called twice here, but it's because
-     this file also acts as regression test, no need to do so yourself of course. */
-  ping_register_messages();
-  ping_register_messages();     /* just to make sure it works ;) */
-
-  /* 5. Register my callback */
-  gras_cb_register("ping", &server_cb_ping_handler);
-
-  XBT_INFO(">>>>>>>> Listening on port %d <<<<<<<<",
-        xbt_socket_my_port(globals->sock));
-  globals->endcondition = 0;
-
-  /* 6. Wait up to 20 minutes for an incoming message to handle */
-  gras_msg_handle(20.0);
-
-  /* 7. Housekeeping */
-  if (!globals->endcondition)
-    XBT_WARN
-        ("An error occured, the endcondition was not set by the callback");
-
-  /* 8. Free the allocated resources, and shut GRAS down */
-  gras_socket_close(globals->sock);
-  free(globals);
-  XBT_INFO("Done.");
-  gras_exit();
-
-  return 0;
-}                               /* end_of_server */
diff --git a/examples/gras/mmrpc/CMakeLists.txt b/examples/gras/mmrpc/CMakeLists.txt
deleted file mode 100644 (file)
index e8b2bc8..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_mmrpc_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_mmrpc_client.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_mmrpc_server.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-add_executable(mmrpc_simulator
-  ${CMAKE_CURRENT_BINARY_DIR}/_mmrpc_simulator.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc_common.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc_client.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc_server.c)
-add_executable(mmrpc_client
-  ${CMAKE_CURRENT_BINARY_DIR}/_mmrpc_client.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc_common.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc_client.c)
-add_executable(mmrpc_server
-  ${CMAKE_CURRENT_BINARY_DIR}/_mmrpc_server.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc_common.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc_server.c)
-
-add_custom_command(
-  OUTPUT
-  ${CMAKE_CURRENT_BINARY_DIR}/_mmrpc_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_mmrpc_client.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_mmrpc_server.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator mmrpc ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(mmrpc_simulator simgrid pthread m )
-  target_link_libraries(mmrpc_client gras pthread m )
-  target_link_libraries(mmrpc_server gras pthread m )
-else(NOT WIN32)
-  target_link_libraries(mmrpc_simulator simgrid)
-  target_link_libraries(mmrpc_client gras)
-  target_link_libraries(mmrpc_server gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc_client.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc_common.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc_server.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/mmrpc.h
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
diff --git a/examples/gras/mmrpc/mmrpc.c b/examples/gras/mmrpc/mmrpc.c
deleted file mode 100644 (file)
index fa9de31..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-/* GridRPC - Fake Grid RPC thingy doing matrix multiplications (as expected)*/
-
-/* Copyright (c) 2005, 2006, 2007, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#define XBT_DEFINE_TYPE_EXTERN
-#include "xbt/matrix.h"
-#include "mmrpc.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(MatMult, "Messages specific to this example");
-
-/* register messages which may be sent and their payload
-   (common to client and server) */
-void mmrpc_register_messages(void)
-{
-  xbt_datadesc_type_t matrix_type, request_type;
-
-  matrix_type = xbt_datadesc_matrix(xbt_datadesc_by_name("double"),
-                                     NULL);
-  request_type =
-      xbt_datadesc_array_fixed("s_matrix_t(double)[2]", matrix_type, 2);
-
-  gras_msgtype_declare("answer", matrix_type);
-  gras_msgtype_declare("request", request_type);
-}
-
-typedef xbt_matrix_t request_t[2];
-static int server_cb_request_handler(gras_msg_cb_ctx_t ctx,
-                                     void *payload_data)
-{
-
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-
-  /* 1. Get the payload into the data variable */
-  xbt_matrix_t *request = (xbt_matrix_t *) payload_data;
-  xbt_matrix_t result;
-
-  /* 2. Do the computation */
-  result = xbt_matrix_double_new_mult(request[0], request[1]);
-
-  /* 3. Send it back as payload of a pong message to the expeditor */
-  gras_msg_send(expeditor, "answer", &result);
-
-  /* 4. Cleanups */
-  xbt_matrix_free(request[0]);
-  xbt_matrix_free(request[1]);
-  xbt_matrix_free(result);
-  gras_socket_close(expeditor);
-
-  return 0;
-}                               /* end_of_server_cb_request_handler */
-
-int server(int argc, char *argv[])
-{
-  xbt_socket_t sock = NULL;
-  int port = 4000;
-
-  /* 1. Init the GRAS infrastructure */
-  gras_init(&argc, argv);
-
-  /* 2. Get the port I should listen on from the command line, if specified */
-  if (argc == 2) {
-    port = atoi(argv[1]);
-  }
-
-  /* 3. Create my master socket */
-  XBT_INFO("Launch server (port=%d)", port);
-  TRY {
-    sock = gras_socket_server(port);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Unable to establish a server socket: %s");
-  }
-
-  /* 4. Register the known messages and payloads. */
-  mmrpc_register_messages();
-
-  /* 5. Register my callback */
-  gras_cb_register("request", &server_cb_request_handler);
-
-  /* 6. Wait up to 10 minutes for an incoming message to handle */
-  gras_msg_handle(600.0);
-
-  /* 7. Free the allocated resources, and shut GRAS down */
-  gras_socket_close(sock);
-  gras_exit();
-
-  XBT_INFO("Done.");
-  return 0;
-}                               /* end_of_server */
-
-
-int client(int argc, char *argv[])
-{
-  xbt_socket_t toserver = NULL;        /* peer */
-
-  xbt_socket_t from;
-  xbt_matrix_t request[2], answer;
-
-  int i, j;
-
-  const char *host = "127.0.0.1";
-  int port = 4000;
-
-  /* 1. Init the GRAS's infrastructure */
-  gras_init(&argc, argv);
-
-  /* 2. Get the server's address. The command line override defaults when specified */
-  if (argc == 3) {
-    host = argv[1];
-    port = atoi(argv[2]);
-  }
-
-  XBT_INFO("Launch client (server on %s:%d)", host, port);
-
-  /* 3. Wait for the server startup */
-  gras_os_sleep(1);
-
-  /* 4. Create a socket to speak to the server */
-  TRY {
-    toserver = gras_socket_client(host, port);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Unable to connect to the server: %s");
-  }
-  XBT_INFO("Connected to %s:%d.", host, port);
-
-
-  /* 5. Register the messages (before use) */
-  mmrpc_register_messages();
-
-  /* 6. Keep the user informed of what's going on */
-  XBT_INFO(">>>>>>>> Connected to server which is on %s:%d <<<<<<<<",
-        xbt_socket_peer_name(toserver), xbt_socket_peer_port(toserver));
-
-  /* 7. Prepare and send the request to the server */
-
-  request[0] = xbt_matrix_double_new_id(MATSIZE, MATSIZE);
-  request[1] = xbt_matrix_double_new_rand(MATSIZE, MATSIZE);
-
-  /*
-     xbt_matrix_dump(request[0],"C:sent0",0,xbt_matrix_dump_display_double);
-     xbt_matrix_dump(request[1],"C:sent1",0,xbt_matrix_dump_display_double);
-   */
-
-  gras_msg_send(toserver, "request", &request);
-
-  xbt_matrix_free(request[0]);
-
-  XBT_INFO(">>>>>>>> Request sent to %s:%d <<<<<<<<",
-        xbt_socket_peer_name(toserver), xbt_socket_peer_port(toserver));
-
-  /* 8. Wait for the answer from the server, and deal with issues */
-  gras_msg_wait(6000, "answer", &from, &answer);
-
-  /*
-     xbt_matrix_dump(answer,"C:answer",0,xbt_matrix_dump_display_double);
-   */
-  for (i = 0; i < MATSIZE; i++)
-    for (j = 0; i < MATSIZE; i++)
-      xbt_assert(xbt_matrix_get_as(answer, i, j, double) ==
-                  xbt_matrix_get_as(request[1], i, j, double),
-                  "Answer does not match expectations. Found %f at cell %d,%d instead of %f",
-                  xbt_matrix_get_as(answer, i, j, double), i, j,
-                  xbt_matrix_get_as(request[1], i, j, double));
-
-  /* 9. Keep the user informed of what's going on, again */
-  XBT_INFO(">>>>>>>> Got answer from %s:%d (values are right) <<<<<<<<",
-        xbt_socket_peer_name(from), xbt_socket_peer_port(from));
-
-  /* 10. Free the allocated resources, and shut GRAS down */
-  xbt_matrix_free(request[1]);
-  xbt_matrix_free(answer);
-  gras_socket_close(toserver);
-  gras_exit();
-  XBT_INFO("Done.");
-  return 0;
-}                               /* end_of_client */
diff --git a/examples/gras/mmrpc/mmrpc.h b/examples/gras/mmrpc/mmrpc.h
deleted file mode 100644 (file)
index 3f08bc8..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/* GridRPC - Fake Grid RPC thingy doing matrix multiplications (as expected)*/
-
-/* Copyright (c) 2006, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef MMRPC_H
-#define MMRPC_H
-
-#include "gras.h"
-
-#define MATSIZE 128
-
-/* register messages which may be sent and their payload
-   (common to client and server) */
-void mmrpc_register_messages(void);
-
-/* Function prototypes */
-int server(int argc, char *argv[]);
-int client(int argc, char *argv[]);
-
-#endif                          /* MMRPC_H */
diff --git a/examples/gras/mmrpc/mmrpc.xml b/examples/gras/mmrpc/mmrpc.xml
deleted file mode 100644 (file)
index e74a853..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Tremblay" function="server">
-     <argument value="4000"/>       <!-- port number -->
-  </process>
-  <process host="Fafard" function="client">
-     <argument value="Tremblay"/>   <!-- server host -->
-     <argument value="4000"/>       <!-- port number -->
-  </process>
-</platform>
diff --git a/examples/gras/mmrpc/mmrpc_client.c b/examples/gras/mmrpc/mmrpc_client.c
deleted file mode 100644 (file)
index 6472af0..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-/* GridRPC - Fake Grid RPC thingy doing matrix multiplications (as expected)*/
-
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#define XBT_DEFINE_TYPE_EXTERN
-#include "xbt/matrix.h"
-#include "mmrpc.h"
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(MatMult);
-
-static xbt_socket_t try_gras_socket_client(const char *host, int port)
-{
-  volatile xbt_socket_t sock = NULL;
-  xbt_ex_t e;
-  TRY {
-    sock = gras_socket_client(host, port);
-  }
-  CATCH(e) {
-    if (e.category != system_error)
-      RETHROWF("Unable to connect to the server: %s");
-    xbt_ex_free(e);
-  }
-  return sock;
-}
-
-int client(int argc, char *argv[])
-{
-  xbt_socket_t toserver = NULL;        /* peer */
-
-  xbt_socket_t from;
-  xbt_matrix_t request[2], answer;
-
-  int i;
-  _XBT_GNUC_UNUSED int j;
-
-  const char *host = "127.0.0.1";
-  int port = 4000;
-
-  /* 1. Init the GRAS's infrastructure */
-  gras_init(&argc, argv);
-
-  /* 2. Get the server's address. The command line override defaults when specified */
-  if (argc == 3) {
-    host = argv[1];
-    port = atoi(argv[2]);
-  }
-
-  XBT_INFO("Launch client (server on %s:%d)", host, port);
-
-  /* 3. Register the messages (before use) */
-  mmrpc_register_messages();
-
-  /* 4. Create a socket to speak to the server */
-  while (!(toserver = try_gras_socket_client(host, port)))
-    gras_os_sleep(0.05);
-  XBT_INFO("Connected to %s:%d.", host, port);
-
-  /* 5. Keep the user informed of what's going on */
-  XBT_INFO(">>>>>>>> Connected to server which is on %s:%d <<<<<<<<",
-        xbt_socket_peer_name(toserver), xbt_socket_peer_port(toserver));
-
-  /* 6. Prepare and send the request to the server */
-
-  request[0] = xbt_matrix_double_new_id(MATSIZE, MATSIZE);
-  request[1] = xbt_matrix_double_new_rand(MATSIZE, MATSIZE);
-
-  /*
-     xbt_matrix_dump(request[0],"C:sent0",0,xbt_matrix_dump_display_double);
-     xbt_matrix_dump(request[1],"C:sent1",0,xbt_matrix_dump_display_double);
-   */
-
-  gras_msg_send(toserver, "request", &request);
-
-  xbt_matrix_free(request[0]);
-
-  XBT_INFO(">>>>>>>> Request sent to %s:%d <<<<<<<<",
-        xbt_socket_peer_name(toserver), xbt_socket_peer_port(toserver));
-
-  /* 7. Wait for the answer from the server, and deal with issues */
-  gras_msg_wait(6000, "answer", &from, &answer);
-
-  /*
-     xbt_matrix_dump(answer,"C:answer",0,xbt_matrix_dump_display_double);
-   */
-  for (i = 0; i < MATSIZE; i++)
-    for (j = 0; i < MATSIZE; i++)
-      xbt_assert(xbt_matrix_get_as(answer, i, j, double) ==
-                  xbt_matrix_get_as(request[1], i, j, double),
-                  "Answer does not match expectations. Found %f at cell %d,%d instead of %f",
-                  xbt_matrix_get_as(answer, i, j, double), i, j,
-                  xbt_matrix_get_as(request[1], i, j, double));
-
-  /* 8. Keep the user informed of what's going on, again */
-  XBT_INFO(">>>>>>>> Got answer from %s:%d (values are right) <<<<<<<<",
-        xbt_socket_peer_name(from), xbt_socket_peer_port(from));
-
-  /* 9. Free the allocated resources, and shut GRAS down */
-  xbt_matrix_free(request[1]);
-  xbt_matrix_free(answer);
-  gras_socket_close(toserver);
-  gras_exit();
-  return 0;
-}                               /* end_of_client */
diff --git a/examples/gras/mmrpc/mmrpc_common.c b/examples/gras/mmrpc/mmrpc_common.c
deleted file mode 100644 (file)
index 62da601..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/* GridRPC - Fake Grid RPC thingy doing matrix multiplications (as expected)*/
-
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "mmrpc.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(MatMult, "Messages specific to this example");
-
-/* register messages which may be sent and their payload
-   (common to client and server) */
-void mmrpc_register_messages(void)
-{
-  xbt_datadesc_type_t matrix_type, request_type;
-
-  matrix_type =
-      xbt_datadesc_matrix(xbt_datadesc_by_name("double"), NULL);
-  request_type =
-      xbt_datadesc_array_fixed("s_matrix_t(double)[2]", matrix_type, 2);
-
-  gras_msgtype_declare("answer", matrix_type);
-  gras_msgtype_declare("request", request_type);
-}
diff --git a/examples/gras/mmrpc/mmrpc_server.c b/examples/gras/mmrpc/mmrpc_server.c
deleted file mode 100644 (file)
index d1585f5..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/* GridRPC - Fake Grid RPC thingy doing matrix multiplications (as expected)*/
-
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#define XBT_DEFINE_TYPE_EXTERN
-#include "xbt/matrix.h"
-#include "mmrpc.h"
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(MatMult);
-
-
-typedef xbt_matrix_t request_t[2];
-static int server_cb_request_handler(gras_msg_cb_ctx_t ctx,
-                                     void *payload_data)
-{
-
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-
-  /* 1. Get the payload into the data variable */
-  xbt_matrix_t *request = (xbt_matrix_t *) payload_data;
-  xbt_matrix_t result;
-
-  /* 2. Do the computation */
-  result = xbt_matrix_double_new_mult(request[0], request[1]);
-
-  /* 3. Send it back as payload of a pong message to the expeditor */
-  gras_msg_send(expeditor, "answer", &result);
-
-  /* 4. Cleanups */
-  xbt_matrix_free(request[0]);
-  xbt_matrix_free(request[1]);
-  xbt_matrix_free(result);
-
-  return 0;
-}                               /* end_of_server_cb_request_handler */
-
-static xbt_socket_t try_gras_socket_server(int port)
-{
-  volatile xbt_socket_t sock = NULL;
-  TRY {
-    sock = gras_socket_server(port);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Unable to establish a server socket: %s");
-  }
-  return sock;
-}
-
-int server(int argc, char *argv[])
-{
-  xbt_socket_t sock = NULL;
-  int port = 4002;
-
-  /* 1. Init the GRAS infrastructure */
-  gras_init(&argc, argv);
-
-  /* 2. Get the port I should listen on from the command line, if specified */
-  if (argc == 2) {
-    port = atoi(argv[1]);
-  }
-
-  /* 3. Register the known messages and payloads. */
-  mmrpc_register_messages();
-
-  /* 4. Register my callback */
-  gras_cb_register("request", &server_cb_request_handler);
-
-  /* 5. Create my master socket */
-  XBT_INFO("Launch server (port=%d)", port);
-  sock = try_gras_socket_server(port);
-
-  /* 6. Wait up to 10 minutes for an incoming message to handle */
-  gras_msg_handle(600.0);
-
-  /* 7. Free the allocated resources, and shut GRAS down */
-  gras_socket_close(sock);
-  gras_exit();
-
-  return 0;
-}                               /* end_of_server */
diff --git a/examples/gras/mmrpc/test_rl.tesh b/examples/gras/mmrpc/test_rl.tesh
deleted file mode 100755 (executable)
index 35534b2..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./mmrpc_server$EXEEXT 4502 --log=root.fmt:%m%n
-> Launch server (port=4502)
-> Exiting GRAS
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./mmrpc_client$EXEEXT 127.0.0.1 4502 --log=root.fmt:%m%n
-> Launch client (server on 127.0.0.1:4502)
-> Connected to 127.0.0.1:4502.
-> >>>>>>>> Connected to server which is on 127.0.0.1:4502 <<<<<<<<
-> >>>>>>>> Request sent to 127.0.0.1:4502 <<<<<<<<
-> >>>>>>>> Got answer from 127.0.0.1:4502 (values are right) <<<<<<<<
-> Exiting GRAS
diff --git a/examples/gras/mmrpc/test_sg_32.tesh b/examples/gras/mmrpc/test_sg_32.tesh
deleted file mode 100644 (file)
index a3018a6..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-! output sort
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./mmrpc_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/mmrpc.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (1:server@Tremblay) Launch server (port=4000)
-> [  0.000000] (2:client@Fafard) Launch client (server on Tremblay:4000)
-> [  0.000195] (2:client@Fafard) Connected to Tremblay:4000.
-> [  0.000195] (2:client@Fafard) >>>>>>>> Connected to server which is on Tremblay:4000 <<<<<<<<
-> [  0.077710] (2:client@Fafard) >>>>>>>> Request sent to Tremblay:4000 <<<<<<<<
-> [  0.129321] (1:server@Tremblay) Exiting GRAS
-> [  0.129321] (2:client@Fafard) >>>>>>>> Got answer from Tremblay:4000 (values are right) <<<<<<<<
-> [  0.129321] (2:client@Fafard) Exiting GRAS
diff --git a/examples/gras/mmrpc/test_sg_64.tesh b/examples/gras/mmrpc/test_sg_64.tesh
deleted file mode 100644 (file)
index 27fadc7..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-! output sort
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./mmrpc_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/mmrpc.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (1:server@Tremblay) Launch server (port=4000)
-> [  0.000000] (2:client@Fafard) Launch client (server on Tremblay:4000)
-> [  0.000195] (2:client@Fafard) Connected to Tremblay:4000.
-> [  0.000195] (2:client@Fafard) >>>>>>>> Connected to server which is on Tremblay:4000 <<<<<<<<
-> [  0.077713] (2:client@Fafard) >>>>>>>> Request sent to Tremblay:4000 <<<<<<<<
-> [  0.129326] (1:server@Tremblay) Exiting GRAS
-> [  0.129326] (2:client@Fafard) >>>>>>>> Got answer from Tremblay:4000 (values are right) <<<<<<<<
-> [  0.129326] (2:client@Fafard) Exiting GRAS
\ No newline at end of file
diff --git a/examples/gras/mutual_exclusion/simple_token/CMakeLists.txt b/examples/gras/mutual_exclusion/simple_token/CMakeLists.txt
deleted file mode 100644 (file)
index c1e24c0..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_simple_token_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_simple_token_node.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-add_executable(simple_token_simulator ${CMAKE_CURRENT_BINARY_DIR}/_simple_token_simulator.c ${CMAKE_CURRENT_SOURCE_DIR}/simple_token.c)
-add_executable(simple_token_node      ${CMAKE_CURRENT_BINARY_DIR}/_simple_token_node.c ${CMAKE_CURRENT_SOURCE_DIR}/simple_token.c)
-
-add_custom_command(
-  OUTPUT
-  ${CMAKE_CURRENT_BINARY_DIR}/_simple_token_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_simple_token_node.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/simple_token.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator simple_token ${CMAKE_CURRENT_SOURCE_DIR}/simple_token.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(simple_token_simulator simgrid pthread m )
-  target_link_libraries(simple_token_node gras pthread m )
-else(NOT WIN32)
-  target_link_libraries(simple_token_simulator simgrid)
-  target_link_libraries(simple_token_node gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/simple_token.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/simple_token.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/run.sh
-  ${CMAKE_CURRENT_SOURCE_DIR}/make_deployment.pl
-  PARENT_SCOPE
-  )
diff --git a/examples/gras/mutual_exclusion/simple_token/make_deployment.pl b/examples/gras/mutual_exclusion/simple_token/make_deployment.pl
deleted file mode 100755 (executable)
index 2fba770..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#! /usr/bin/perl
-
-use strict;
-
-my $input    = shift @ARGV || die "Usage: $ARGV[0] platform_file.xml nb_host\n";
-my $nb_hosts = shift @ARGV || 0;
-
-my @host;
-
-open IN,$input || die "Cannot open $input: $!\n";
-
-while (<IN>) {
-  next unless /<host id="([^"]*)"/; # "
-  
-  push @host, $1;
-}
-
-die "No host found in $input. Is it really a SimGrid platform file?\nCheck that you didn't pass a deployment file, for example.\n"
-  unless (scalar @host);
-
-if (! $nb_hosts) {
-    $nb_hosts = scalar @host;
-}
-
-# map { print "$_\n" } @host;
-
-print "<?xml version='1.0'?>\n";
-print "<!DOCTYPE platform SYSTEM \"simgrid.dtd\">\n";
-print "<platform version=\"2\">\n\n";
-
-
-my $it_port=4000;
-my $it_host=0;
-
-for (my $i=0; $i<$nb_hosts -1; $i++) {
-
-  print "  <process host=\"".$host[$it_host]."\" function=\"node\">\n";
-  print "    <argument value=\"". $it_port ."\"/>     <!-- port on which I am listening -->\n";
-  $it_host ++;
-  if ($it_host == scalar @host) {
-    $it_host=0;
-    $it_port++;
-  }
-  print "    <argument value=\"". $host[ $it_host ]."\"/>   <!-- peer (successor) host -->\n";
-  print "    <argument value=\"".($it_port)."\"/>     <!-- port on which peer is listening -->\n";
-  print "  </process>\n\n";
-                
-}
-
-print "  <process host=\"".$host[$it_host]."\" function=\"node\">\n";
-print "    <argument value=\"". $it_port ."\"/>     <!-- port on which I am listening -->\n";
-print "    <argument value=\"". $host[ 0 ]."\"/>   <!-- peer (successor) host -->\n";
-print "    <argument value=\"4000\"/>     <!-- port on which peer is listening -->\n";
-print "    <argument value=\"--create-token\"/>   <!-- I'm first client, ie I have to create the token -->\n";
-print "  </process>\n\n";
-
-print "</platform>\n";
diff --git a/examples/gras/mutual_exclusion/simple_token/run.sh b/examples/gras/mutual_exclusion/simple_token/run.sh
deleted file mode 100755 (executable)
index f8aa0bd..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#! /bin/bash
-
-#
-# USAGE: run.sh  plaform  nb_host 
-#
-# This script takes a platform file and a number of hosts as argument.
-#
-# It generates the right deployment platform and run the experiment, 
-#  only showing the last line of the run, showing the resulting time.
-
-plat=$1
-nb_host=$2
-
-set -e
-
-if [ -z $plat -o -z $nb_host ] ; then
-  # invalid argument. Display the comment at the script begining & exit
-  grep '^#\(\([^!]\)\|$\)' $0 | sed 's/# *//' >&2
-  exit 1
-fi
-if ! [ -e $plat ] ; then
-  echo "Platform file not found" >&2
-  exit 1
-fi
-
-echo "Generating the deployment"
-./make_deployment.pl $plat $nb_host > tmp_deployment_$nb_host
-echo "Running the experiment"
-./tokenS_simulator $plat tmp_deployment_$nb_host 2>&1 |tee run.log|grep "Congrat"
-rm tmp_deployment_$nb_host
diff --git a/examples/gras/mutual_exclusion/simple_token/simple_token.c b/examples/gras/mutual_exclusion/simple_token/simple_token.c
deleted file mode 100644 (file)
index ef80458..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-/* stoken - simple/static token ring                                        */
-
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
-
-#define NBLOOPS 3
-/*#define NBLOOPS 30000*/
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(SimpleToken,
-                             "Messages specific to this example");
-
-/* Function prototypes */
-int node(int argc, char *argv[]);
-
-
-/* **********************************************************************
- * Node code
- * **********************************************************************/
-
-/* Global private data */
-typedef struct {
-  xbt_socket_t sock;           /* server socket on which I hear */
-  int remaining_loop;           /* number of loops to do until done */
-  int create;                   /* whether I have to create the token */
-  xbt_socket_t tosuccessor;    /* how to connect to the successor on ring */
-  double start_time;            /* to measure the elapsed time. Only used by the 
-                                   node that creates the token */
-} node_data_t;
-
-
-/* Callback function */
-static int node_cb_stoken_handler(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  /* 1. Get the payload into the msg variable, and retrieve my caller */
-  int msg = *(int *) payload;
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-
-
-  /* 2. Retrieve the node's state (globals) */
-  node_data_t *globals = (node_data_t *) gras_userdata_get();
-
-  /* 3. Log which predecessor connected */
-  int supersteps = 1;           /* only log every superstep loop */
-  if (NBLOOPS >= 1000) {
-    supersteps = 100;
-  } else if (NBLOOPS >= 100) {
-    supersteps = 10;
-  } else if (NBLOOPS <= 10) {
-    supersteps = 1;
-  }
-  if (globals->create && (!(globals->remaining_loop % supersteps))) {
-    XBT_INFO("Begin a new loop. Still to do: %d", globals->remaining_loop);
-  } else if (!(globals->remaining_loop % supersteps)) {
-    XBT_VERB("Got token(%d) from %s remaining_loop=%d",
-          msg, xbt_socket_peer_name(expeditor), globals->remaining_loop);
-  }
-
-  /* 4. If the right shouldn't be stopped yet */
-  if (globals->remaining_loop > 0) {
-    msg += 1;
-
-    XBT_DEBUG("Send token(%d) to %s:%d", msg,
-           xbt_socket_peer_name(globals->tosuccessor),
-           xbt_socket_peer_port(globals->tosuccessor));
-
-    /* 5. Send the token as payload of a stoken message to the successor */
-    TRY {
-      gras_msg_send(globals->tosuccessor, "stoken", &msg);
-
-      /* 6. Deal with errors */
-    }
-    CATCH_ANONYMOUS {
-      gras_socket_close(globals->sock);
-      RETHROWF("Unable to forward token: %s");
-    }
-
-  }
-
-  /* DO NOT CLOSE THE expeditor SOCKET since the client socket is
-     reused by our predecessor.
-     Closing this side would thus create troubles */
-
-  /* 7. Decrease the remaining_loop integer. */
-  globals->remaining_loop -= 1;
-
-  /* 8. Repport the hop number to the user at the end */
-  if (globals->remaining_loop == -1 && globals->create) {
-    double elapsed = gras_os_time() - globals->start_time;
-    XBT_INFO("Shut down the token-ring. There was %d hops.", msg);
-    XBT_VERB("Elapsed time: %g", elapsed);
-  }
-
-  /* 9. Tell GRAS that we consummed this message */
-  return 0;
-}                               /* end_of_node_cb_stoken_handler */
-
-int node(int argc, char *argv[])
-{
-  node_data_t *globals;
-
-  const char *host;
-  int myport;
-  int peerport;
-
-  /* 1. Init the GRAS infrastructure and declare my globals */
-  gras_init(&argc, argv);
-  globals = gras_userdata_new(node_data_t);
-
-
-  /* 2. Get the successor's address. The command line overrides
-     defaults when specified */
-  host = "127.0.0.1";
-  myport = 4000;
-  peerport = 4000;
-  if (argc >= 4) {
-    myport = atoi(argv[1]);
-    host = argv[2];
-    peerport = atoi(argv[3]);
-  }
-
-  /* 3. Save successor's address in global var */
-  globals->remaining_loop = NBLOOPS;
-  globals->create = 0;
-  globals->tosuccessor = NULL;
-
-  if (!gras_os_getpid() % 100 || gras_if_RL())
-    XBT_INFO("Launch node listening on %d (successor on %s:%d)",
-          myport, host, peerport);
-
-  /* 4. Register the known messages.  */
-  gras_msgtype_declare("stoken", xbt_datadesc_by_name("int"));
-
-  /* 5. Create my master socket for listening */
-  globals->sock = gras_socket_server(myport);
-  gras_os_sleep(1.0);           /* Make sure all server sockets are created */
-
-  /* 6. Create socket to the successor on the ring */
-  XBT_DEBUG("Connect to my successor on %s:%d", host, peerport);
-
-  globals->tosuccessor = gras_socket_client(host, peerport);
-
-  /* 7. Register my callback */
-  gras_cb_register("stoken", &node_cb_stoken_handler);
-
-  /* 8. One node has to create the token at startup. 
-     It's specified by a command line argument */
-  if (argc >= 5
-      && !strncmp("--create-token", argv[4], strlen("--create-token")))
-    globals->create = 1;
-
-  if (globals->create) {
-    int token = 0;
-
-    globals->start_time = gras_os_time();
-
-    globals->remaining_loop = NBLOOPS - 1;
-
-    XBT_INFO("Create the token (with value %d) and send it to %s:%d",
-          token, host, peerport);
-
-    TRY {
-      gras_msg_send(globals->tosuccessor, "stoken", &token);
-    }
-    CATCH_ANONYMOUS {
-      RETHROWF("Unable to send the freshly created token: %s");
-    }
-  }
-
-  /* 8. Wait up to 10 seconds for an incoming message to handle */
-  while (globals->remaining_loop > (globals->create ? -1 : 0)) {
-    gras_msg_handle(-1);
-
-    XBT_DEBUG("looping (remaining_loop=%d)", globals->remaining_loop);
-  }
-
-  gras_os_sleep(1.0);           /* FIXME: if the sender quited, receive fail */
-
-  /* 9. Free the allocated resources, and shut GRAS down */
-  gras_socket_close(globals->sock);
-  gras_socket_close(globals->tosuccessor);
-  free(globals);
-  gras_exit();
-
-  return 0;
-}                               /* end_of_node */
diff --git a/examples/gras/mutual_exclusion/simple_token/simple_token.xml b/examples/gras/mutual_exclusion/simple_token/simple_token.xml
deleted file mode 100644 (file)
index d45a60a..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-
- <process host="Tremblay" function="node">
-  <argument value="4000"/>                           <!-- port on which I am listening -->
-  <argument value="Fafard"/><argument value="4000"/> <!-- peer (successor) host id and port-->
-  <argument value="--create-token"/>                 <!-- I'm first client, ie I have to create the token -->
- </process>
- <process host="Fafard" function="node">
-  <argument value="4000"/>                           <!-- port on which I am listening -->
-  <argument value="Jupiter"/><argument value="4000"/><!-- peer (successor) host id and port-->
- </process>
- <process host="Jupiter" function="node">
-  <argument value="4000"/>                            <!-- port on which I am listening -->
-  <argument value="Ginette"/><argument value="4000"/> <!-- peer (successor) host id and port-->
- </process>
- <process host="Ginette" function="node">
-  <argument value="4000"/>                            <!-- port on which I am listening -->
-  <argument value="Bourassa"/><argument value="4000"/><!-- peer (successor) host id and port-->
- </process>
- <process host="Bourassa" function="node">
-  <argument value="4000"/>                            <!-- port on which I am listening -->
-  <argument value="Tremblay"/><argument value="4000"/><!-- peer (successor) host id and port-->
- </process>
-</platform>
diff --git a/examples/gras/mutual_exclusion/simple_token/test_rl.tesh b/examples/gras/mutual_exclusion/simple_token/test_rl.tesh
deleted file mode 100755 (executable)
index 6911513..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./simple_token_node$EXEEXT 4100 127.0.0.1 4110 --create-token --log=root.fmt:%m%n $@
-> Launch node listening on 4100 (successor on 127.0.0.1:4110)
-> Create the token (with value 0) and send it to 127.0.0.1:4110
-> Begin a new loop. Still to do: 2
-> Begin a new loop. Still to do: 1
-> Begin a new loop. Still to do: 0
-> Shut down the token-ring. There was 17 hops.
-> Exiting GRAS
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./simple_token_node$EXEEXT 4110 127.0.0.1 4120 --log=root.fmt:%m%n $@
-> Launch node listening on 4110 (successor on 127.0.0.1:4120)
-> Exiting GRAS
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./simple_token_node$EXEEXT 4120 127.0.0.1 4130 --log=root.fmt:%m%n $@
-> Launch node listening on 4120 (successor on 127.0.0.1:4130)
-> Exiting GRAS
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./simple_token_node$EXEEXT 4130 127.0.0.1 4141 --log=root.fmt:%m%n $@
-> Launch node listening on 4130 (successor on 127.0.0.1:4141)
-> Exiting GRAS
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./simple_token_node$EXEEXT 4141 127.0.0.1 4150 --log=root.fmt:%m%n $@
-> Launch node listening on 4141 (successor on 127.0.0.1:4150)
-> Exiting GRAS
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./simple_token_node$EXEEXT 4150 127.0.0.1 4100 --log=root.fmt:%m%n $@
-> Launch node listening on 4150 (successor on 127.0.0.1:4100)
-> Exiting GRAS
diff --git a/examples/gras/mutual_exclusion/simple_token/test_sg_32.tesh b/examples/gras/mutual_exclusion/simple_token/test_sg_32.tesh
deleted file mode 100644 (file)
index 1e8c49e..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-! output sort
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./simple_token_simulator$EXEEXT ${srcdir:=.}/../../../msg/small_platform.xml ${srcdir:=.}/simple_token.xml  "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  1.000390] (1:node@Tremblay) Create the token (with value 0) and send it to Fafard:4000
-> [  1.147954] (1:node@Tremblay) Begin a new loop. Still to do: 2
-> [  1.295517] (1:node@Tremblay) Begin a new loop. Still to do: 1
-> [  1.443080] (1:node@Tremblay) Begin a new loop. Still to do: 0
-> [  1.443080] (1:node@Tremblay) Shut down the token-ring. There was 14 hops.
-> [  2.365949] (2:node@Fafard) Exiting GRAS
-> [  2.401517] (3:node@Jupiter) Exiting GRAS
-> [  2.417640] (4:node@Ginette) Exiting GRAS
-> [  2.443080] (1:node@Tremblay) Exiting GRAS
-> [  2.443080] (5:node@Bourassa) Exiting GRAS
diff --git a/examples/gras/mutual_exclusion/simple_token/test_sg_64.tesh b/examples/gras/mutual_exclusion/simple_token/test_sg_64.tesh
deleted file mode 100644 (file)
index 7a96a43..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-! output sort
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./simple_token_simulator$EXEEXT ${srcdir:=.}/../../../msg/small_platform.xml ${srcdir:=.}/simple_token.xml  "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  1.000390] (1:node@Tremblay) Create the token (with value 0) and send it to Fafard:4000
-> [  1.147954] (1:node@Tremblay) Begin a new loop. Still to do: 2
-> [  1.295517] (1:node@Tremblay) Begin a new loop. Still to do: 1
-> [  1.443080] (1:node@Tremblay) Begin a new loop. Still to do: 0
-> [  1.443080] (1:node@Tremblay) Shut down the token-ring. There was 14 hops.
-> [  2.365949] (2:node@Fafard) Exiting GRAS
-> [  2.401517] (3:node@Jupiter) Exiting GRAS
-> [  2.417640] (4:node@Ginette) Exiting GRAS
-> [  2.443080] (1:node@Tremblay) Exiting GRAS
-> [  2.443080] (5:node@Bourassa) Exiting GRAS
\ No newline at end of file
diff --git a/examples/gras/p2p/can/can.c b/examples/gras/p2p/can/can.c
deleted file mode 100644 (file)
index c6755a0..0000000
+++ /dev/null
@@ -1,323 +0,0 @@
-/* Broken Peer-To-Peer CAN simulator                                        */
-
-/* Copyright (c) 2006, 2007. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdio.h>
-#include "xbt/sysdep.h"
-#include "gras.h"
-
-#include "can_tests.c"
-//#include "types.h" // header alone containing the typedef struct of a node // include can_tests.c must be OFF.
-
-//XBT_LOG_NEW_DEFAULT_CATEGORY(can,"Messages specific to this example"); // include can_tests.c must be OFF.
-
-//extern char *_gras_this_type_symbol_does_not_exist__s_nuke;
-int node_nuke_handler(gras_msg_cb_ctx_t ctx, void *payload_data);
-
-// struct of a "get_successor" message, when a node look after the area in which he want to be.
-XBT_DEFINE_TYPE(s_get_suc, struct s_get_suc {
-                 int xId; int yId; char host[1024]; int port;};);
-
-typedef struct s_get_suc get_suc_t;
-
-// struct of a "response_successor" message, hen a node receive the information of his new area.
-XBT_DEFINE_TYPE(s_rep_suc, struct s_rep_suc {
-                 int x1;        // Xmin
-                 int x2;        // Xmax
-                 int y1;        // Ymin
-                 int y2;        // Ymax
-                 char north_host[1024];
-                 int north_port;
-                 char south_host[1024];
-                 int south_port;
-                 char east_host[1024];
-                 int east_port; char west_host[1024]; int west_port;};);
-typedef struct s_rep_suc rep_suc_t;
-
-int node(int argc, char **argv);
-
-// registering messages types
-static void register_messages()
-{
-  gras_msgtype_declare("can_get_suc", xbt_datadesc_by_symbol(s_get_suc));
-  gras_msgtype_declare("can_rep_suc", xbt_datadesc_by_symbol(s_rep_suc));
-  gras_msgtype_declare("can_nuke", xbt_datadesc_by_symbol(s_nuke));    // can_test.c message // include can_tests.c must be ON.
-}
-
-
-// a forwarding function for a "get_suc" message.
-static void forward_get_suc(get_suc_t msg, char host[1024], int port)
-{
-  xbt_socket_t temp_sock = NULL;
-  //XBT_INFO("Transmiting message to %s:%d",host,port);
-  TRY {
-    temp_sock = gras_socket_client(host, port);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Unable to connect!: %s");
-  }
-  TRY {
-    gras_msg_send(temp_sock, "can_get_suc", &msg);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Unable to send!: %s");
-  }
-  XBT_INFO("Forwarding a get_successor message to %s for (%d;%d)", host,
-        msg.xId, msg.yId);
-  gras_socket_close(temp_sock);
-}
-
-// the handling function of a "get_suc" message (what do a node when he receive a "get_suc" message.
-static int node_get_suc_handler(gras_msg_cb_ctx_t ctx, void *payload_data)
-{
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-  get_suc_t *incoming = (get_suc_t *) payload_data;
-  xbt_ex_t e;                   // the error variable used in TRY.. CATCH tokens.
-  node_data_t *globals = (node_data_t *) gras_userdata_get();
-  xbt_socket_t temp_sock = NULL;
-  XBT_INFO("Received a get_successor message from %s for (%d;%d)",
-        xbt_socket_peer_name(expeditor), incoming->xId, incoming->yId);
-  //XBT_INFO("My area is [%d;%d;%d;%d]",globals->x1,globals->x2,globals->y1,globals->y2);
-  if (incoming->xId < globals->x1)      // test if the message must be forwarded to a neighbour.
-    forward_get_suc(*incoming, globals->west_host, globals->west_port);
-  else if (incoming->xId > globals->x2)
-    forward_get_suc(*incoming, globals->east_host, globals->east_port);
-  else if (incoming->yId < globals->y1)
-    forward_get_suc(*incoming, globals->south_host, globals->south_port);
-  else if (incoming->yId > globals->y2)
-    forward_get_suc(*incoming, globals->north_host, globals->north_port);
-  else {                        // if the message must not be forwarded, then the area is splitted in half and one half is assignated to the new node.
-    rep_suc_t outgoing;
-    int validate = 0;
-    XBT_INFO
-        ("Spliting my area between me (%d;%d) and the inserting node (%d;%d)!",
-         globals->xId, globals->yId, incoming->xId, incoming->yId);
-    if ((globals->x2 - globals->x1) > (globals->y2 - globals->y1)) {    // the height of the area is smaller than its width.
-      if (incoming->xId < globals->xId) {       // the new node is west from the actual node.
-        outgoing.x1 = globals->x1;
-        outgoing.x2 = (incoming->xId + globals->xId) / 2;
-        outgoing.y1 = globals->y1;
-        outgoing.y2 = globals->y2;
-        strcpy(outgoing.north_host, globals->north_host);
-        outgoing.north_port = globals->north_port;
-        strcpy(outgoing.south_host, globals->south_host);
-        outgoing.south_port = globals->south_port;
-        strcpy(outgoing.east_host, globals->host);
-        outgoing.east_port = globals->port;
-        strcpy(outgoing.west_host, globals->west_host);
-        outgoing.west_port = globals->west_port;
-
-        globals->x1 = (incoming->xId + globals->xId) / 2;
-        strcpy(globals->west_host, incoming->host);
-        globals->west_port = incoming->port;
-        validate = 1;
-      } else if (incoming->xId > globals->xId) {        // the new node is east from the actual node.
-        outgoing.x1 = (incoming->xId + globals->xId) / 2;
-        outgoing.x2 = globals->x2;
-        outgoing.y1 = globals->y1;
-        outgoing.y2 = globals->y2;
-        strcpy(outgoing.north_host, globals->north_host);
-        outgoing.north_port = globals->north_port;
-        strcpy(outgoing.south_host, globals->south_host);
-        outgoing.south_port = globals->south_port;
-        strcpy(outgoing.east_host, globals->east_host);
-        outgoing.east_port = globals->east_port;
-        strcpy(outgoing.west_host, globals->host);
-        outgoing.west_port = globals->port;
-
-        globals->x2 = (incoming->xId + globals->xId) / 2;
-        strcpy(globals->east_host, incoming->host);
-        globals->east_port = incoming->port;
-        validate = 1;
-      }
-    } else {
-      if (incoming->yId < globals->yId) {       // the new node is south from the actual node.
-        outgoing.y1 = globals->y1;
-        outgoing.y2 = (incoming->yId + globals->yId) / 2;
-        outgoing.y1 = globals->y1;
-        outgoing.x2 = globals->x2;
-        strcpy(outgoing.east_host, globals->east_host);
-        outgoing.east_port = globals->east_port;
-        strcpy(outgoing.west_host, globals->west_host);
-        outgoing.west_port = globals->west_port;
-        strcpy(outgoing.north_host, globals->host);
-        outgoing.north_port = globals->port;
-        strcpy(outgoing.south_host, globals->south_host);
-        outgoing.south_port = globals->south_port;
-
-        globals->y1 = (incoming->yId + globals->yId) / 2;
-        strcpy(globals->south_host, incoming->host);
-        globals->south_port = incoming->port;
-        validate = 1;
-      } else if (incoming->yId > globals->yId) {        // the new node is north from the actual node.
-        outgoing.y1 = (incoming->yId + globals->yId) / 2;
-        outgoing.y2 = globals->y2;
-        outgoing.x1 = globals->x1;
-        outgoing.x2 = globals->x2;
-        strcpy(outgoing.east_host, globals->east_host);
-        outgoing.east_port = globals->east_port;
-        strcpy(outgoing.west_host, globals->west_host);
-        outgoing.west_port = globals->west_port;
-        strcpy(outgoing.north_host, globals->north_host);
-        outgoing.north_port = globals->north_port;
-        strcpy(outgoing.south_host, globals->host);
-        outgoing.south_port = globals->port;
-
-        globals->y2 = (incoming->yId + globals->yId) / 2;
-        strcpy(globals->north_host, incoming->host);
-        globals->north_port = incoming->port;
-        validate = 1;
-      }
-    }
-    if (validate == 1) {        // the area for the new node has been defined, then send theses informations to the new node.
-      XBT_INFO("Sending environment informations to node %s:%d",
-            incoming->host, incoming->port);
-
-      TRY {
-        temp_sock = gras_socket_client(incoming->host, incoming->port);
-      }
-      CATCH_ANONYMOUS {
-        RETHROWF
-            ("Unable to connect to the node wich has requested for an area!: %s");
-      }
-      TRY {
-        gras_msg_send(temp_sock, "can_rep_suc", &outgoing);
-        XBT_INFO("Environment informations sent!");
-      }
-      CATCH_ANONYMOUS {
-        RETHROWF("%s:Timeout sending environment informations to %s: %s",
-                 globals->host, xbt_socket_peer_name(expeditor));
-      }
-      gras_socket_close(temp_sock);
-    } else                      // we have a problem!
-      XBT_INFO("An error occurded!!!!!!!!!!!!!");
-
-  }
-  gras_socket_close(expeditor); // spare
-  TRY {
-    gras_msg_handle(10000.0);   // wait a bit in case of someone want to ask me for something.
-  }
-  CATCH(e) {
-    XBT_INFO("My area is [%d;%d;%d;%d]", globals->x1, globals->x2,
-          globals->y1, globals->y2);
-    //XBT_INFO("Closing node, all has been done!");
-    xbt_ex_free(e);
-  }
-  return 0;
-}
-
-
-
-
-
-int node(int argc, char **argv)
-{
-  node_data_t *globals = NULL;
-  xbt_ex_t e;                   // the error variable used in TRY.. CATCH tokens.
-  xbt_socket_t temp_sock = NULL;
-
-  rep_suc_t rep_suc_msg;
-
-  get_suc_t get_suc_msg;        // building the "get_suc" message.
-  xbt_socket_t temp_sock2 = NULL;
-
-  XBT_INFO("Starting");
-
-  /* 1. Init the GRAS infrastructure and declare my globals */
-  gras_init(&argc, argv);
-  gras_os_sleep((15 - gras_os_getpid()) * 20);  // wait a bit.
-
-  globals = gras_userdata_new(node_data_t);
-
-  globals->xId = atoi(argv[1]); // x coordinate of the node.
-  globals->yId = atoi(argv[2]); // y coordinate of the node.
-  globals->port = atoi(argv[3]);        // node port
-  globals->sock = gras_socket_server(globals->port);    // node socket.
-  snprintf(globals->host, 1024, gras_os_myname());      // node name.
-  globals->version = 0;         // node version (used for fun)
-
-  /* 2. Inserting the Node */
-  XBT_INFO("Inserting node %s:%d", globals->host, globals->port);
-  if (argc == 4) {              // the node is a server, then he has the whole area.
-    globals->x1 = 0;
-    globals->x2 = 1000;
-    globals->y1 = 0;
-    globals->y2 = 1000;
-  } else {                      // asking for an area.
-    XBT_INFO("Contacting %s so as to request for an area", argv[4]);
-
-    TRY {
-      temp_sock = gras_socket_client(argv[4], atoi(argv[5]));
-    }
-    CATCH_ANONYMOUS {
-      RETHROWF("Unable to connect known host to request for an area!: %s");
-    }
-
-
-    get_suc_msg.xId = globals->xId;
-    get_suc_msg.yId = globals->yId;
-    strcpy(get_suc_msg.host, globals->host);
-    get_suc_msg.port = globals->port;
-    TRY {                       // asking.
-      gras_msg_send(temp_sock, "can_get_suc", &get_suc_msg);
-    }
-    CATCH_ANONYMOUS {
-      gras_socket_close(temp_sock);
-      RETHROWF("Unable to contact known host to get an area!: %s");
-    }
-    gras_socket_close(temp_sock);
-
-
-
-    TRY {                       // waiting for a reply.
-      XBT_INFO("Waiting for reply!");
-      gras_msg_wait(6000, "can_rep_suc", &temp_sock2, &rep_suc_msg);
-    }
-    CATCH_ANONYMOUS {
-      RETHROWF("%s: Error waiting for an area:%s", globals->host);
-    }
-
-    // retreiving the data of the response.
-    globals->x1 = rep_suc_msg.x1;
-    globals->x2 = rep_suc_msg.x2;
-    globals->y1 = rep_suc_msg.y1;
-    globals->y2 = rep_suc_msg.y2;
-    strcpy(globals->north_host, rep_suc_msg.north_host);
-    globals->north_port = rep_suc_msg.north_port;
-    strcpy(globals->south_host, rep_suc_msg.south_host);
-    globals->south_port = rep_suc_msg.south_port;
-    strcpy(globals->east_host, rep_suc_msg.east_host);
-    globals->east_port = rep_suc_msg.east_port;
-    strcpy(globals->west_host, rep_suc_msg.west_host);
-    globals->west_port = rep_suc_msg.west_port;
-
-    gras_socket_close(temp_sock);       // spare
-  }
-  XBT_INFO("Node %s:%d inserted", globals->host, globals->port);
-
-  // associating messages to handlers.
-  register_messages();
-  gras_cb_register("can_get_suc", &node_get_suc_handler);
-  gras_cb_register("can_nuke", &node_nuke_handler);     // can_test.c handler // include can_tests.c must be ON.
-
-  TRY {
-    gras_msg_handle(10000.0);   // waiting.. in case of someone has something to say.
-  }
-  CATCH(e) {
-    XBT_INFO("My area is [%d;%d;%d;%d]", globals->x1, globals->x2,
-          globals->y1, globals->y2);
-    //XBT_INFO("Closing node, all has been done!");
-    xbt_ex_free(e);
-  }
-
-  gras_socket_close(globals->sock);     // spare.
-  free(globals);                // spare.
-  //gras_exit();
-  return (0);
-}
-
-// END
diff --git a/examples/gras/p2p/can/can.xml b/examples/gras/p2p/can/can.xml
deleted file mode 100644 (file)
index 4f63ff4..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-
-
-
-
-  <process host="Tremblay" function="start_war">
-    <argument value="4000"/>           <!-- my port -->
-    <argument value="1"/>            <!-- my nuke version -->
-  </process>
-
-  <process host="Jacquelin" function="node">
-    <argument value="100"/>            <!-- my xId -->
-    <argument value="900"/>            <!-- my yId -->
-    <argument value="4000"/>         <!-- my port -->
-    <argument value="Tremblay"/>     <!-- my hostname -->
-    <argument value="4000"/>         <!-- my hostport -->
-  </process>
-
-  <process host="Bourassa" function="node">
-    <argument value="800"/>            <!-- my xId -->
-    <argument value="200"/>            <!-- my yId -->
-    <argument value="4000"/>         <!-- my port -->
-    <argument value="Tremblay"/>     <!-- my hostname -->
-    <argument value="4000"/>         <!-- my hostport -->
-  </process>
-
-  <process host="Fafard" function="node">
-    <argument value="500"/>            <!-- my xId -->
-    <argument value="600"/>            <!-- my yId -->
-    <argument value="4000"/>         <!-- my port -->
-    <argument value="Tremblay"/>     <!-- my hostname -->
-    <argument value="4000"/>         <!-- my hostport -->
-  </process>
-
-  <process host="Tremblay" function="node">
-    <argument value="10"/>            <!-- my xId -->
-    <argument value="20"/>            <!-- my yId -->
-    <argument value="4000"/>         <!-- my port -->
-  </process>
-
-</platform>
-
diff --git a/examples/gras/p2p/can/can_tests.c b/examples/gras/p2p/can/can_tests.c
deleted file mode 100644 (file)
index 994eea6..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-/* Broken Peer-To-Peer CAN simulator                                        */
-
-/* Copyright (c) 2006, 2007, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <time.h>
-//#include "gras.h"
-#include "types.h"              // header containing the typedef struct of a node
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(can, "Messages specific to this example");
-
-// struct of a "nuke" message, when a node send a nuke to (xId;yId).
-XBT_DEFINE_TYPE(s_nuke, struct s_nuke {
-                 int xId; int yId; char host[1024];     // original expeditor..
-                 int port;      // ..and his port.
-                 int version;   // fun.
-                 };);
-
-typedef struct s_nuke nuke_t;
-
-// the function that start the **** War of the Nodes ****
-int start_war(int argc, char **argv);
-int start_war(int argc, char **argv)
-{
-  xbt_socket_t temp_sock = NULL;
-  nuke_t nuke_msg;
-  //return 0; // in order to inhibit the War of the Nodes 
-  gras_init(&argc, argv);
-  gras_os_sleep((15 - gras_os_getpid()) * 20 + 200);    // wait a bit.
-
-
-  TRY {                         // contacting the bad guy that will launch the War.
-    temp_sock = gras_socket_client(gras_os_myname(), atoi(argv[1]));
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Unable to connect known host so as to declare WAR!: %s");
-  }
-
-
-  nuke_msg.xId = -1;
-  nuke_msg.yId = -1;
-  nuke_msg.version = atoi(argv[2]);
-  strcpy(nuke_msg.host, gras_os_myname());
-  nuke_msg.port = atoi(argv[1]);
-
-  TRY {
-    gras_msg_send(temp_sock, "can_nuke", &nuke_msg);
-  }
-  CATCH_ANONYMOUS {
-    gras_socket_close(temp_sock);
-    RETHROWF
-        ("Unable to contact known host so as to declare WAR!!!!!!!!!!!!!!!!!!!!!: %s");
-  }
-  gras_socket_close(temp_sock); // spare.
-  gras_exit();                  // spare.
-  return 0;
-}
-
-// the function thaht send the nuke "msg" on (xId;yId), if it's not on me :p.
-static int send_nuke(nuke_t * msg, int xId, int yId)
-{
-  node_data_t *globals = (node_data_t *) gras_userdata_get();
-  xbt_socket_t temp_sock = NULL;
-
-  if (xId >= globals->x1 && xId <= globals->x2 && yId >= globals->y1
-      && yId <= globals->y2) {
-    XBT_INFO("Nuclear launch missed");
-    return 0;
-  } else {
-    char host[1024];
-    int port = 0;
-
-    if (xId < globals->x1) {
-      strcpy(host, globals->west_host);
-      port = globals->west_port;
-    } else if (xId > globals->x2) {
-      strcpy(host, globals->east_host);
-      port = globals->east_port;
-    } else if (yId < globals->y1) {
-      strcpy(host, globals->south_host);
-      port = globals->south_port;
-    } else if (yId > globals->y2) {
-      strcpy(host, globals->north_host);
-      port = globals->north_port;
-    }
-
-    msg->xId = xId;
-    msg->yId = yId;
-
-
-
-    TRY {                       // sending the nuke.
-      temp_sock = gras_socket_client(host, port);
-    }
-    CATCH_ANONYMOUS {
-      RETHROWF("Unable to connect the nuke!: %s");
-    }
-    //XBT_INFO("%s ON %s %d %d <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<",globals->host,host,xId,yId);
-    TRY {
-      gras_msg_send(temp_sock, "can_nuke", msg);
-    }
-    CATCH_ANONYMOUS {
-      RETHROWF("Unable to send the nuke!: %s");
-    }
-    gras_socket_close(temp_sock);
-    XBT_INFO("Nuke launched by %s to %s for (%d;%d)", globals->host, host,
-          msg->xId, msg->yId);
-    return 1;
-  }
-}
-
-
-static int node_nuke_handler(gras_msg_cb_ctx_t ctx, void *payload_data)
-{
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-  nuke_t *incoming = (nuke_t *) payload_data;
-  node_data_t *globals = (node_data_t *) gras_userdata_get();
-
-  int x;
-  int y;
-  nuke_t nuke_msg;              // writing my name one the nuke.
-  xbt_socket_t temp_sock = NULL;
-  xbt_ex_t e;                   // the error variable used in TRY.. CATCH tokens.
-
-
-  if (incoming->xId == -1) {    // i must start the War
-    XBT_INFO("%s:%d declare the WAR!!!!!!!!!!!!!!!!!", globals->host,
-          globals->port);
-    srand((unsigned int) time((time_t *) NULL));
-
-    do {
-      x = (int) (1000.0 * rand() / (RAND_MAX + 1.0));
-      y = (int) (1000.0 * rand() / (RAND_MAX + 1.0));
-    }
-    while (send_nuke(incoming, x, y) == 0);
-
-  } else if (incoming->xId >= globals->x1 && incoming->xId <= globals->x2 && incoming->yId >= globals->y1 && incoming->yId <= globals->y2) {    // the nuke crash on my area..
-    if (globals->version == incoming->version)  // ..but i'm dead.
-      XBT_INFO("I'm already dead :p");
-    else if ((incoming->xId - globals->xId) / 60 == 0 && (incoming->yId - globals->yId) / 60 == 0) {    // ..and it's on me, so i die :X.
-      globals->version = incoming->version;
-      XBT_INFO("Euuuaarrrgghhhh...   %s killed %s !!!!!!!!!!!!!!!!!",
-            incoming->host, globals->host);
-    } else {                    // and it miss me, i angry and i send my own nuke!
-      XBT_INFO("%s was missed, and counteract!", globals->host);
-      /*int x1=(int)(1000.0*rand()/(RAND_MAX+1.0));
-         int y1=(int)(1000.0*rand()/(RAND_MAX+1.0));
-         int x2=(int)(1000.0*rand()/(RAND_MAX+1.0));
-         int y2=(int)(1000.0*rand()/(RAND_MAX+1.0));
-         int x3=(int)(1000.0*rand()/(RAND_MAX+1.0));
-         int y3=(int)(1000.0*rand()/(RAND_MAX+1.0));
-         int x4=(int)(1000.0*rand()/(RAND_MAX+1.0));
-         int y4=(int)(1000.0*rand()/(RAND_MAX+1.0)); */
-
-
-      nuke_msg.version = incoming->version;
-      strcpy(nuke_msg.host, globals->host);
-      nuke_msg.port = globals->port;
-
-
-      do {
-        x = (int) (1000.0 * rand() / (RAND_MAX + 1.0));
-        y = (int) (1000.0 * rand() / (RAND_MAX + 1.0));
-      }
-      while (send_nuke(&nuke_msg, x, y) == 0);  // and sending if it's not on me.
-    }
-  } else {                      // the nuke isn't for me, so i forward her.
-    char host[1024];
-    int port = 0;
-
-    if (incoming->xId < globals->x1) {
-      strcpy(host, globals->west_host);
-      port = globals->west_port;
-    } else if (incoming->xId > globals->x2) {
-      strcpy(host, globals->east_host);
-      port = globals->east_port;
-    } else if (incoming->yId < globals->y1) {
-      strcpy(host, globals->south_host);
-      port = globals->south_port;
-    } else if (incoming->yId > globals->y2) {
-      strcpy(host, globals->north_host);
-      port = globals->north_port;
-    }
-
-
-
-    TRY {
-      temp_sock = gras_socket_client(host, port);
-    }
-    CATCH_ANONYMOUS {
-      RETHROWF("Unable to connect the nuke!: %s");
-    }
-    TRY {
-      gras_msg_send(temp_sock, "can_nuke", incoming);
-    }
-    CATCH_ANONYMOUS {
-      RETHROWF("Unable to send the nuke!: %s");
-    }
-    XBT_INFO("Nuke re-aimed by %s to %s for (%d;%d)", globals->host, host,
-          incoming->xId, incoming->yId);
-    gras_socket_close(temp_sock);
-  }
-  gras_socket_close(expeditor); // spare.
-
-  TRY {
-    gras_msg_handle(10000.0);   // wait a bit, in case of..
-  }
-  CATCH(e) {
-    XBT_INFO("My area is [%d;%d;%d;%d]", globals->x1, globals->x2,
-          globals->y1, globals->y2);
-    //XBT_INFO("Closing node, all has been done!");
-    xbt_ex_free(e);
-  }
-  return 0;
-}
-
-// END
diff --git a/examples/gras/p2p/can/test_rl.in b/examples/gras/p2p/can/test_rl.in
deleted file mode 100755 (executable)
index 929f1df..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#! @BASH@ -e
-if [ x@EXEEXT@ = x ] ; then 
-#  exenv="libtool --mode=execute valgrind --show-reachable=yes --run-libc-freeres=no "
-  exenv=$SG_TEST_EXENV
-else
-  exenv=wine
-fi
-    
-$exenv ./can_node@EXEEXT@ 4002 $@ &
-sleep 1
-$exenv ./can_node@EXEEXT@ 127.0.0.1 4002 $@
diff --git a/examples/gras/p2p/can/test_sg.in b/examples/gras/p2p/can/test_sg.in
deleted file mode 100755 (executable)
index 5d3d33e..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-if [ x@EXEEXT@ = x ] ; then 
-  exenv=$SG_TEST_EXENV
-else
-  exenv=wine
-fi
-
-exec $exenv ./can_simulator @top_srcdir@/examples/msg/msg_platform.xml @srcdir@/can_deployment.xml $@
diff --git a/examples/gras/p2p/can/types.h b/examples/gras/p2p/can/types.h
deleted file mode 100644 (file)
index ddeb68f..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright (c) 2006, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
-
-/* Global private data */
-typedef struct {
-  gras_socket_t sock;           /* server socket on which I'm listening */
-  int xId;
-  int yId;
-  char host[1024];              /* my host name */
-  int port;                     /* port on which I'm listening FIXME */
-
-  int x1;                       // Xmin
-  int x2;                       // Xmax
-  int y1;                       // Ymin
-  int y2;                       // Ymax
-
-  char north_host[1024];
-  int north_port;
-  char south_host[1024];
-  int south_port;
-  char east_host[1024];
-  int east_port;
-  char west_host[1024];
-  int west_port;
-
-  int version;
-} node_data_t;
diff --git a/examples/gras/p2p/chord/chord.c b/examples/gras/p2p/chord/chord.c
deleted file mode 100644 (file)
index 528db0c..0000000
+++ /dev/null
@@ -1,407 +0,0 @@
-/* Copyright (c) 2006, 2007, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdio.h>
-#include "xbt/sysdep.h"
-#include "gras.h"
-
-static int closest_preceding_node(int id);
-static void check_predecessor(void);
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(chord, "Messages specific to this example");
-
-typedef enum msg_typus {
-  PING,
-  PONG,
-  GET_PRE,
-  REP_PRE,
-  GET_SUC,
-  REP_SUC,
-  STD,
-} msg_typus;
-
-/*XBT_DEFINE_TYPE(s_pbio,
-  struct s_pbio{
-    msg_typus type;
-    int dest;
-    char msg[1024];
-  };
-);
-typedef struct s_pbio pbio_t;*/
-
-/*XBT_DEFINE_TYPE(s_ping,*/
-struct s_ping {
-  int id;
-};
-/*);*/
-typedef struct s_ping ping_t;
-
-/*XBT_DEFINE_TYPE(s_pong,*/
-struct s_pong {
-  int id;
-  int failed;
-};
-/*);*/
-typedef struct s_pong pong_t;
-
-XBT_DEFINE_TYPE(s_notify, struct s_notify {
-                 int id; char host[1024]; int port;};);
-
-typedef struct s_notify notify_t;
-
-XBT_DEFINE_TYPE(s_get_suc, struct s_get_suc {
-                 int id;};);
-
-typedef struct s_get_suc get_suc_t;
-
-XBT_DEFINE_TYPE(s_rep_suc, struct s_rep_suc {
-                 int id; char host[1024]; int port;};);
-
-typedef struct s_rep_suc rep_suc_t;
-
-typedef struct finger_elem {
-  int id;
-  char host[1024];
-  int port;
-} finger_elem;
-
-
-
-static void register_messages()
-{
-/*  gras_msgtype_declare("chord",xbt_datadesc_by_symbol(s_pbio));*/
-  gras_msgtype_declare("chord_get_suc",
-                       xbt_datadesc_by_symbol(s_get_suc));
-  gras_msgtype_declare("chord_rep_suc",
-                       xbt_datadesc_by_symbol(s_rep_suc));
-  gras_msgtype_declare("chord_notify", xbt_datadesc_by_symbol(s_notify));
-}
-
-/* Global private data */
-typedef struct {
-  xbt_socket_t sock;           /* server socket on which I'm listening */
-  int id;                       /* my id number */
-  char host[1024];              /* my host name */
-  int port;                     /* port on which I'm listening FIXME */
-  int fingers;                  /* how many fingers */
-  finger_elem *finger;          /* finger table */
-  int next_to_fix;              /* next in the finger list to be checked */
-  int pre_id;                   /* predecessor id */
-  char pre_host[1024];          /* predecessor host */
-  int pre_port;                 /* predecessor port */
-} node_data_t;
-
-
-int node(int argc, char **argv);
-
-/*static int node_cb_chord_handler(xbt_socket_t expeditor,void *payload_data){
-  xbt_ex_t e;
-  pbio_t pbio_i=*(pbio_t*)payload_data;
-
-  node_data_t *globals=(node_data_t*)gras_userdata_get();
-
-  XBT_INFO(">>> %d : received %d message from %s to %d <<<",globals->id,pbio_i.type,xbt_socket_peer_name(expeditor),pbio_i.dest);
-
-
-
-}*/
-
-static int node_cb_get_suc_handler(gras_msg_cb_ctx_t ctx,
-                                   void *payload_data)
-{
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-  get_suc_t incoming = *(get_suc_t *) payload_data;
-  rep_suc_t outgoing;
-  node_data_t *globals = (node_data_t *) gras_userdata_get();
-  XBT_INFO("Received a get_successor message from %s for %d",
-        xbt_socket_peer_name(expeditor), incoming.id);
-  if ((globals->id == globals->finger[0].id) ||
-      (incoming.id > globals->id
-       && incoming.id <= globals->finger[0].id)) {
-    outgoing.id = globals->finger[0].id;
-    snprintf(outgoing.host, 1024, globals->finger[0].host);
-    outgoing.port = globals->finger[0].port;
-    XBT_INFO("My successor is his successor!");
-  } else {
-    xbt_socket_t temp_sock;
-    int contact = closest_preceding_node(incoming.id);
-    if (contact == -1) {
-      outgoing.id = globals->finger[0].id;
-      snprintf(outgoing.host, 1024, globals->finger[0].host);
-      outgoing.port = globals->finger[0].port;
-      XBT_INFO("My successor is his successor!");
-    } else {
-      get_suc_t asking;
-      asking.id = incoming.id;
-      TRY {
-        temp_sock = gras_socket_client(globals->finger[contact].host,
-                                       globals->finger[contact].port);
-      }
-      CATCH_ANONYMOUS {
-        RETHROWF("Unable to connect!: %s");
-      }
-      TRY {
-        gras_msg_send(temp_sock, "chord_get_suc", &asking);
-      }
-      CATCH_ANONYMOUS {
-        RETHROWF("Unable to ask!: %s");
-      }
-      gras_msg_wait(10., "chord_rep_suc", &temp_sock, &outgoing);
-    }
-  }
-
-  TRY {
-    gras_msg_send(expeditor, "chord_rep_suc", &outgoing);
-    XBT_INFO("Successor information sent!");
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("%s:Timeout sending successor information to %s: %s",
-             globals->host, xbt_socket_peer_name(expeditor));
-  }
-  gras_socket_close(expeditor);
-  return 0;
-}
-
-static int closest_preceding_node(int id)
-{
-  node_data_t *globals = (node_data_t *) gras_userdata_get();
-  int i;
-  for (i = globals->fingers - 1; i >= 0; i--) {
-    if (globals->finger[i].id > globals->id && globals->finger[i].id < id) {
-      return (i);
-    }
-  }
-
-  return i;
-}
-
-static int node_cb_notify_handler(gras_msg_cb_ctx_t ctx,
-                                  void *payload_data)
-{
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-  /*xbt_ex_t e; */
-  notify_t incoming = *(notify_t *) payload_data;
-  node_data_t *globals = (node_data_t *) gras_userdata_get();
-  XBT_INFO("Received a notifying message from %s as %d",
-        xbt_socket_peer_name(expeditor), incoming.id);
-  if (globals->pre_id == -1 ||
-      (incoming.id > globals->pre_id && incoming.id < globals->id)) {
-    globals->pre_id = incoming.id;
-    snprintf(globals->pre_host, 1024, incoming.host);
-    globals->pre_port = incoming.port;
-    XBT_INFO("Set as my new predecessor!");
-  }
-  return 0;
-}
-
-static void fix_fingers()
-{
-  get_suc_t get_suc_msg;
-  xbt_socket_t temp_sock = NULL;
-  xbt_socket_t temp_sock2 = NULL;
-  rep_suc_t rep_suc_msg;
-  node_data_t *globals = (node_data_t *) gras_userdata_get();
-
-  TRY {
-    temp_sock = gras_socket_client(globals->host, globals->port);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Unable to contact known host: %s");
-  }
-
-  get_suc_msg.id = globals->id;
-  TRY {
-    gras_msg_send(temp_sock, "chord_get_suc", &get_suc_msg);
-  }
-  CATCH_ANONYMOUS {
-    gras_socket_close(temp_sock);
-    RETHROWF("Unable to contact known host to get successor!: %s");
-  }
-
-  TRY {
-    XBT_INFO("Waiting for reply!");
-    gras_msg_wait(6000, "chord_rep_suc", &temp_sock2, &rep_suc_msg);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("%s: Error waiting for successor:%s", globals->host);
-  }
-  globals->finger[0].id = rep_suc_msg.id;
-  snprintf(globals->finger[0].host, 1024, rep_suc_msg.host);
-  globals->finger[0].port = rep_suc_msg.port;
-  XBT_INFO("→ Finger %d fixed!", globals->next_to_fix);
-  gras_socket_close(temp_sock);
-
-  globals->next_to_fix = (++globals->next_to_fix == globals->fingers) ?
-      0 : globals->next_to_fix;
-}
-
-static void check_predecessor()
-{
-  node_data_t *globals = (node_data_t *) gras_userdata_get();
-  xbt_socket_t temp_sock;
-  ping_t ping;
-  pong_t pong;
-  xbt_ex_t e;
-  if (globals->pre_id == -1) {
-    return;
-  }
-  TRY {
-    temp_sock = gras_socket_client(globals->pre_host, globals->pre_port);
-  }
-  CATCH(e) {
-    globals->pre_id = -1;
-    globals->pre_host[0] = 0;
-    globals->pre_port = 0;
-    xbt_ex_free(e);
-  }
-
-  ping.id = 0;
-  TRY {
-    gras_msg_send(temp_sock, "chord_ping", &ping);
-  }
-  CATCH(e) {
-    globals->pre_id = -1;
-    globals->pre_host[0] = 0;
-    globals->pre_port = 0;
-    xbt_ex_free(e);
-  }
-  TRY {
-    gras_msg_wait(60, "chord_pong", &temp_sock, &pong);
-  }
-  CATCH(e) {
-    globals->pre_id = -1;
-    globals->pre_host[0] = 0;
-    globals->pre_port = 0;
-    xbt_ex_free(e);
-  }
-  gras_socket_close(temp_sock);
-}
-
-int node(int argc, char **argv)
-{
-  node_data_t *globals = NULL;
-  xbt_socket_t temp_sock = NULL;
-  xbt_socket_t temp_sock2 = NULL;
-  get_suc_t get_suc_msg;
-  rep_suc_t rep_suc_msg;
-
-  xbt_ex_t e;
-
-  int create = 0;
-  int other_port = -1;
-  char *other_host;
-  notify_t notify_msg;
-  int l;
-
-  /* 1. Init the GRAS infrastructure and declare my globals */
-  gras_init(&argc, argv);
-
-  gras_os_sleep((15 - gras_os_getpid()) * 20);
-
-  globals = gras_userdata_new(node_data_t);
-
-  globals->id = atoi(argv[1]);
-  globals->port = atoi(argv[2]);
-  globals->fingers = 0;
-  globals->finger = NULL;
-  globals->pre_id = -1;
-  globals->pre_host[0] = 0;
-  globals->pre_port = -1;
-
-  snprintf(globals->host, 1024, gras_os_myname());
-
-  if (argc == 3) {
-    create = 1;
-  } else {
-    other_host = xbt_strdup(argv[3]);
-    other_port = atoi(argv[4]);
-  }
-
-  globals->sock = gras_socket_server(globals->port);
-  gras_os_sleep(1.0);
-
-  register_messages();
-
-  globals->finger = (finger_elem *) calloc(1, sizeof(finger_elem));
-  XBT_INFO("Launching node %s:%d", globals->host, globals->port);
-  if (create) {
-    XBT_INFO("→Creating ring");
-    globals->finger[0].id = globals->id;
-    snprintf(globals->finger[0].host, 1024, globals->host);
-    globals->finger[0].port = globals->port;
-  } else {
-    XBT_INFO("→Known node %s:%d", other_host, other_port);
-    XBT_INFO("→Contacting to determine successor");
-    TRY {
-      temp_sock = gras_socket_client(other_host, other_port);
-    }
-    CATCH_ANONYMOUS {
-      RETHROWF("Unable to contact known host: %s");
-    }
-
-    get_suc_msg.id = globals->id;
-    TRY {
-      gras_msg_send(temp_sock, "chord_get_suc", &get_suc_msg);
-    }
-    CATCH_ANONYMOUS {
-      gras_socket_close(temp_sock);
-      RETHROWF("Unable to contact known host to get successor!: %s");
-    }
-
-    TRY {
-      XBT_INFO("Waiting for reply!");
-      gras_msg_wait(10., "chord_rep_suc", &temp_sock2, &rep_suc_msg);
-    }
-    CATCH_ANONYMOUS {
-      RETHROWF("%s: Error waiting for successor:%s", globals->host);
-    }
-    globals->finger[0].id = rep_suc_msg.id;
-    snprintf(globals->finger[0].host, 1024, rep_suc_msg.host);
-    globals->finger[0].port = rep_suc_msg.port;
-    XBT_INFO("→Got successor : %d-%s:%d", globals->finger[0].id,
-          globals->finger[0].host, globals->finger[0].port);
-    gras_socket_close(temp_sock);
-    TRY {
-      temp_sock = gras_socket_client(globals->finger[0].host,
-                                     globals->finger[0].port);
-    }
-    CATCH_ANONYMOUS {
-      RETHROWF("Unable to contact successor: %s");
-    }
-
-    notify_msg.id = globals->id;
-    snprintf(notify_msg.host, 1024, globals->host);
-    notify_msg.port = globals->port;
-    TRY {
-      gras_msg_send(temp_sock, "chord_notify", &notify_msg);
-    }
-    CATCH_ANONYMOUS {
-      RETHROWF("Unable to notify successor! %s");
-    }
-  }
-
-  gras_cb_register("chord_get_suc", &node_cb_get_suc_handler);
-  gras_cb_register("chord_notify", &node_cb_notify_handler);
-  /*gras_cb_register("chord_ping",&node_cb_ping_handler); */
-  /* gras_timer_repeat(600.,fix_fingers); */
-  /*while(1){ */
-
-  for (l = 0; l < 50; l++) {
-    TRY {
-      gras_msg_handle(6000000.0);
-    }
-    CATCH(e) {
-      xbt_ex_free(e);
-    }
-  }
-  /*} */
-
-  gras_socket_close(globals->sock);
-  free(globals);
-  gras_exit();
-  XBT_INFO("Done");
-  return (0);
-}
diff --git a/examples/gras/p2p/chord/chord.xml b/examples/gras/p2p/chord/chord.xml
deleted file mode 100644 (file)
index a56db93..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-
-  <process host="Gatien" function="node">
-    <argument value="48"/>           <!-- my id -->
-    <argument value="4000"/>         <!-- my port -->
-    <argument value="Boivin"/>       <!-- known host -->
-    <argument value="4000"/>         <!-- known port -->
-<!--    <argument value="McGee"/>         known host -->
-<!--    <argument value="4000"/>          known port -->
-    <argument value="56"/>           <!-- +1 host number -->
-    <argument value="Laroche"/>      <!-- +1 host id -->
-    <argument value="56"/>           <!-- +2 host number -->
-    <argument value="Laroche"/>      <!-- +2 host id -->
-    <argument value="56"/>           <!-- +4 host number -->
-    <argument value="Laroche"/>      <!-- +4 host id -->
-<!--    <argument value="56"/>            +8 host number -->
-<!--    <argument value="Laroche"/>       +8 host id -->
-<!--    <argument value="56"/>            +16 host number -->
-<!--    <argument value="Laroche"/>       +16 host id -->
-<!--    <argument value="56"/>            +32 host number -->
-<!--    <argument value="Laroche"/>       +32 host id -->
-  </process>
-
-  <process host="McGee" function="node">
-    <argument value="42"/>           <!-- my id -->
-    <argument value="4000"/>         <!-- my port -->
-    <argument value="iRMX"/>        <!-- known host -->
-    <argument value="4000"/>         <!-- known port -->
-    <argument value="51"/>           <!-- +1 host number -->
-    <argument value="Gatien"/>       <!-- +1 host id -->
-    <argument value="51"/>           <!-- +2 host number -->
-    <argument value="Gatien"/>       <!-- +2 host id -->
-    <argument value="56"/>           <!-- +4 host number -->
-    <argument value="Laroche"/>      <!-- +4 host id -->
-    <argument value="56"/>           <!-- +8 host number -->
-    <argument value="Laroche"/>      <!-- +8 host id -->
-<!--    <argument value="56"/>            +16 host number -->
-<!--    <argument value="Laroche"/>       +16 host id -->
-<!--    <argument value="56"/>            +32 host number -->
-<!--    <argument value="Laroche"/>       +32 host id -->
-  </process>
-
-  <process host="iRMX" function="node">
-    <argument value="38"/>       <!-- my id -->
-    <argument value="4000"/>         <!-- my port -->
-    <argument value="Geoff"/>               <!-- known host -->
-    <argument value="4000"/>         <!-- known port -->
-    <argument value="48"/>           <!-- +1 host number -->
-    <argument value="McGee"/>        <!-- +1 host id -->
-    <argument value="48"/>           <!-- +2 host number -->
-    <argument value="McGee"/>        <!-- +2 host id -->
-    <argument value="48"/>           <!-- +4 host number -->
-    <argument value="McGee"/>        <!-- +4 host id -->
-    <argument value="51"/>           <!-- +8 host number -->
-    <argument value="Gatien"/>       <!-- +8 host id -->
-    <argument value="56"/>           <!-- +16 host number -->
-    <argument value="Laroche"/>      <!-- +16 host id -->
-<!--    <argument value="56"/>            +32 host number -->
-<!--    <argument value="Laroche"/>       +32 host id -->
-  </process>
-
-  <process host="Geoff" function="node">
-    <argument value="32"/>           <!-- my id -->
-    <argument value="4000"/>         <!-- my port -->
-    <argument value="TeX"/>         <!-- known host -->
-    <argument value="4000"/>         <!-- known port -->
-    <argument value="38"/>           <!-- +1 host number -->
-    <argument value="Disney"/>       <!-- +1 host id -->
-    <argument value="38"/>           <!-- +2 host number -->
-    <argument value="Disney"/>       <!-- +2 host id -->
-    <argument value="38"/>           <!-- +4 host number -->
-    <argument value="Disney"/>       <!-- +4 host id -->
-    <argument value="42"/>           <!-- +8 host number -->
-    <argument value="iRMX"/>         <!-- +8 host id -->
-    <argument value="48"/>           <!-- +16 host number -->
-    <argument value="McGee"/>        <!-- +16 host id -->
-<!--    <argument value="56"/>            +32 host number -->
-<!--    <argument value="Laroche"/>       +32 host id -->
-  </process>
-
-  <process host="TeX" function="node">
-    <argument value="21"/>           <!-- my id -->
-    <argument value="4000"/>         <!-- my port -->
-    <argument value="Boivin"/>    <!-- known host -->
-    <argument value="4000"/>         <!-- known port -->
-    <argument value="32"/>           <!-- +1 host number -->
-    <argument value="Geoff"/>        <!-- +1 host id -->
-    <argument value="32"/>           <!-- +2 host number -->
-    <argument value="Geoff"/>        <!-- +2 host id -->
-    <argument value="32"/>           <!-- +4 host number -->
-    <argument value="Geoff"/>        <!-- +4 host id -->
-    <argument value="32"/>           <!-- +8 host number -->
-    <argument value="Geoff"/>        <!-- +8 host id -->
-    <argument value="38"/>           <!-- +16 host number -->
-    <argument value="Disney"/>       <!-- +16 host id -->
-    <argument value="56"/>           <!-- +32 host number -->
-    <argument value="Laroche"/>      <!-- +32 host id -->
-  </process>
-
-  <process host="Jean_Yves" function="node">
-    <argument value="14"/>           <!-- my id -->
-    <argument value="4000"/>         <!-- my port -->
-    <argument value="Boivin"/>       <!-- known host -->
-    <argument value="4000"/>         <!-- known port -->
-    <argument value="21"/>           <!-- +1 host number -->
-    <argument value="TeX"/>          <!-- +1 host id -->
-    <argument value="21"/>           <!-- +2 host number -->
-    <argument value="TeX"/>          <!-- +2 host id -->
-    <argument value="21"/>           <!-- +4 host number -->
-    <argument value="TeX"/>          <!-- +4 host id -->
-    <argument value="32"/>           <!-- +8 host number -->
-    <argument value="Geoff"/>        <!-- +8 host id -->
-    <argument value="32"/>           <!-- +16 host number -->
-    <argument value="Geoff"/>        <!-- +16 host id -->
-    <argument value="48"/>           <!-- +32 host number -->
-    <argument value="McGee"/>        <!-- +32 host id -->
-  </process>
-
-  <process host="Boivin" function="node">
-    <argument value="8"/>            <!-- my id -->
-    <argument value="4000"/>         <!-- my port -->
-    <argument value="Jacquelin"/>    <!-- known host -->
-    <argument value="4000"/>         <!-- known port -->
-    <argument value="14"/>           <!-- +1 host number -->
-    <argument value="Jean_Yves"/>    <!-- +1 host id -->
-    <argument value="14"/>           <!-- +2 host number -->
-    <argument value="Jean_Yves"/>    <!-- +2 host id -->
-    <argument value="14"/>           <!-- +4 host number -->
-    <argument value="Jean_Yves"/>    <!-- +4 host id -->
-    <argument value="21"/>           <!-- +8 host number -->
-    <argument value="TeX"/>          <!-- +8 host id -->
-    <argument value="32"/>           <!-- +16 host number -->
-    <argument value="Geoff"/>        <!-- +16 host id -->
-    <argument value="42"/>           <!-- +32 host number -->
-    <argument value="iRMX"/>         <!-- +32 host id -->
-  </process>
-
-  <process host="Jacquelin" function="node">
-    <argument value="1"/>            <!-- my id -->
-    <argument value="4000"/>         <!-- my port -->
-  </process>
-
-</platform>
diff --git a/examples/gras/p2p/chord/test_rl.in b/examples/gras/p2p/chord/test_rl.in
deleted file mode 100755 (executable)
index 572f16d..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#! @BASH@ -e
-if [ x@EXEEXT@ = x ] ; then 
-#  exenv="libtool --mode=execute valgrind --show-reachable=yes --run-libc-freeres=no "
-  exenv=$SG_TEST_EXENV
-else
-  exenv=wine
-fi
-    
-$exenv ./chord_node@EXEEXT@ 4002 $@ &
-sleep 1
-$exenv ./chord_node@EXEEXT@ 127.0.0.1 4002 $@
diff --git a/examples/gras/p2p/chord/test_sg.in b/examples/gras/p2p/chord/test_sg.in
deleted file mode 100755 (executable)
index c54aa51..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-if [ x@EXEEXT@ = x ] ; then 
-  exenv=$SG_TEST_EXENV
-else
-  exenv=wine
-fi
-
-exec $exenv ./chord_simulator @top_srcdir@/examples/msg/msg_platform.xml @srcdir@/chord_deployment.xml $@
diff --git a/examples/gras/ping/CMakeLists.txt b/examples/gras/ping/CMakeLists.txt
deleted file mode 100644 (file)
index e2caa08..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_ping_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_ping_client.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_ping_server.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-add_executable(ping_simulator
-  ${CMAKE_CURRENT_BINARY_DIR}/_ping_simulator.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_server.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_client.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_common.c)
-add_executable(ping_client
-  ${CMAKE_CURRENT_BINARY_DIR}/_ping_client.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_client.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_common.c)
-add_executable(ping_server
-  ${CMAKE_CURRENT_BINARY_DIR}/_ping_server.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_server.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_common.c)
-
-add_custom_command(
-  OUTPUT
-  ${CMAKE_CURRENT_BINARY_DIR}/_ping_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_ping_client.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_ping_server.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/ping.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator ping ${CMAKE_CURRENT_SOURCE_DIR}/ping.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(ping_simulator simgrid pthread m )
-  target_link_libraries(ping_client gras pthread m )
-  target_link_libraries(ping_server gras pthread m )
-else(NOT WIN32)
-  target_link_libraries(ping_simulator simgrid)
-  target_link_libraries(ping_client gras)
-  target_link_libraries(ping_server gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_client.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_common.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping_server.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/ping.h
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
diff --git a/examples/gras/ping/ping.h b/examples/gras/ping/ping.h
deleted file mode 100644 (file)
index ffd57cf..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* ping - ping/pong demo of GRAS features                                   */
-
-/* Copyright (c) 2006, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef PING_COMMON_H
-#define PING_COMMON_H
-
-#include "gras.h"
-
-/* register messages which may be sent (common to client and server) */
-void ping_register_messages(void);
-
-/* Function prototypes */
-int server(int argc, char *argv[]);
-int client(int argc, char *argv[]);
-
-#endif
diff --git a/examples/gras/ping/ping.xml b/examples/gras/ping/ping.xml
deleted file mode 100644 (file)
index e74a853..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Tremblay" function="server">
-     <argument value="4000"/>       <!-- port number -->
-  </process>
-  <process host="Fafard" function="client">
-     <argument value="Tremblay"/>   <!-- server host -->
-     <argument value="4000"/>       <!-- port number -->
-  </process>
-</platform>
diff --git a/examples/gras/ping/ping_client.c b/examples/gras/ping/ping_client.c
deleted file mode 100644 (file)
index c60456d..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/* ping - ping/pong demo of GRAS features                                   */
-
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "ping.h"
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(Ping);
-
-static xbt_socket_t try_gras_socket_client(const char *host, int port)
-{
-  volatile xbt_socket_t sock = NULL;
-  xbt_ex_t e;
-  TRY {
-    sock = gras_socket_client(host, port);
-  }
-  CATCH(e) {
-    if (e.category != system_error)
-      /* dunno what happened, let the exception go through */
-      RETHROWF("Unable to connect to the server: %s");
-    xbt_ex_free(e);
-  }
-  return sock;
-}
-
-int client(int argc, char *argv[])
-{
-  xbt_socket_t toserver = NULL;        /* peer */
-
-  xbt_socket_t from;
-  int ping, pong;
-
-  const char *host = "127.0.0.1";
-  int port = 4000;
-
-  /* 1. Init the GRAS's infrastructure */
-  gras_init(&argc, argv);
-
-  /* 2. Get the server's address. The command line override defaults when specified */
-  if (argc == 3) {
-    host = argv[1];
-    port = atoi(argv[2]);
-  }
-
-  XBT_INFO("Launch client (server on %s:%d)", host, port);
-
-  /* 3. Create a socket to speak to the server */
-  while (!(toserver = try_gras_socket_client(host, port)))
-    gras_os_sleep(0.05);
-
-  XBT_INFO("Connected to %s:%d.", host, port);
-
-  /* 4. Register the messages.
-     See, it doesn't have to be done completely at the beginning, only before use */
-  ping_register_messages();
-
-  /* 5. Keep the user informed of what's going on */
-  XBT_INFO(">>>>>>>> Connected to server which is on %s:%d <<<<<<<<",
-        xbt_socket_peer_name(toserver), xbt_socket_peer_port(toserver));
-
-  /* 6. Prepare and send the ping message to the server */
-  ping = 1234;
-  TRY {
-    gras_msg_send(toserver, "ping", &ping);
-  }
-  CATCH_ANONYMOUS {
-    gras_socket_close(toserver);
-    RETHROWF("Failed to send PING to server: %s");
-  }
-  XBT_INFO(">>>>>>>> Message PING(%d) sent to %s:%d <<<<<<<<",
-        ping, xbt_socket_peer_name(toserver), xbt_socket_peer_port(toserver));
-
-  /* 7. Wait for the answer from the server, and deal with issues */
-  TRY {
-    gras_msg_wait(6000, "pong", &from, &pong);
-  }
-  CATCH_ANONYMOUS {
-    gras_socket_close(toserver);
-    RETHROWF("Why can't I get my PONG message like everyone else: %s");
-  }
-
-  /* 8. Keep the user informed of what's going on, again */
-  XBT_INFO(">>>>>>>> Got PONG(%d) from %s:%d <<<<<<<<",
-        pong, xbt_socket_peer_name(from), xbt_socket_peer_port(from));
-
-  /* 9. Free the allocated resources, and shut GRAS down */
-  gras_socket_close(toserver);
-  XBT_INFO("Done.");
-  gras_exit();
-  return 0;
-}                               /* end_of_client */
diff --git a/examples/gras/ping/ping_common.c b/examples/gras/ping/ping_common.c
deleted file mode 100644 (file)
index f0b6e49..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* ping - ping/pong demo of GRAS features                                   */
-
-/* Copyright (c) 2006, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "ping.h"
-XBT_LOG_NEW_DEFAULT_CATEGORY(Ping, "Messages specific to this example");
-
-/* register messages which may be sent (common to client and server) */
-void ping_register_messages(void)
-{
-  gras_msgtype_declare("ping", xbt_datadesc_by_name("int"));
-  gras_msgtype_declare("pong", xbt_datadesc_by_name("int"));
-  XBT_INFO("Messages registered");
-}
diff --git a/examples/gras/ping/ping_server.c b/examples/gras/ping/ping_server.c
deleted file mode 100644 (file)
index ccb590c..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/* ping - ping/pong demo of GRAS features                                   */
-
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "ping.h"
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(Ping);
-
-/* Global private data */
-typedef struct {
-  xbt_socket_t sock;
-  int endcondition;
-} server_data_t;
-
-
-static int server_cb_ping_handler(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  /* 1. Get the payload into the msg variable, and retrieve my caller */
-  int msg = *(int *) payload;
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-
-  /* 2. Retrieve the server's state (globals) */
-
-  server_data_t *globals = (server_data_t *) gras_userdata_get();
-  globals->endcondition = 0;
-
-  /* 3. Log which client connected */
-  XBT_INFO(">>>>>>>> Got message PING(%d) from %s:%d <<<<<<<<",
-        msg,
-        xbt_socket_peer_name(expeditor),
-        xbt_socket_peer_port(expeditor));
-
-  /* 4. Change the value of the msg variable */
-  msg = 4321;
-  /* 5. Send it back as payload of a pong message to the expeditor */
-  TRY {
-    gras_msg_send(expeditor, "pong", &msg);
-
-    /* 6. Deal with errors: add some details to the exception */
-  }
-  CATCH_ANONYMOUS {
-    gras_socket_close(globals->sock);
-    RETHROWF("Unable answer with PONG: %s");
-  }
-
-  XBT_INFO(">>>>>>>> Answered with PONG(4321) <<<<<<<<");
-
-  /* 7. Set the endcondition boolean to true (and make sure the server stops after receiving it). */
-  globals->endcondition = 1;
-
-  /* 8. Tell GRAS that we consummed this message */
-  return 0;
-}                               /* end_of_server_cb_ping_handler */
-
-int server(int argc, char *argv[])
-{
-  server_data_t *globals;
-
-  int port = 4000;
-
-  /* 1. Init the GRAS infrastructure and declare my globals */
-  gras_init(&argc, argv);
-  globals = gras_userdata_new(server_data_t);
-
-  /* 2. Get the port I should listen on from the command line, if specified */
-  if (argc == 2) {
-    port = atoi(argv[1]);
-  }
-
-  XBT_INFO("Launch server (port=%d)", port);
-
-  /* 3. Create my master socket */
-  globals->sock = gras_socket_server(port);
-
-  /* 4. Register the known messages. This function is called twice here, but it's because
-     this file also acts as regression test, no need to do so yourself of course. */
-  ping_register_messages();
-  ping_register_messages();     /* just to make sure it works ;) */
-
-  /* 5. Register my callback */
-  gras_cb_register("ping", &server_cb_ping_handler);
-
-  XBT_INFO(">>>>>>>> Listening on port %d <<<<<<<<",
-        xbt_socket_my_port(globals->sock));
-  globals->endcondition = 0;
-
-  /* 6. Wait up to 10 minutes for an incoming message to handle */
-  gras_msg_handle(10.0);
-
-  /* 7. Housekeeping */
-  if (!globals->endcondition)
-    XBT_WARN
-        ("An error occured, the endcondition was not set by the callback");
-
-  /* 8. Free the allocated resources, and shut GRAS down */
-  gras_socket_close(globals->sock);
-  free(globals);
-  XBT_INFO("Done.");
-  gras_exit();
-
-  return 0;
-}                               /* end_of_server */
diff --git a/examples/gras/ping/test_rl.tesh b/examples/gras/ping/test_rl.tesh
deleted file mode 100755 (executable)
index 859ba97..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-
-! timeout 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_ENV ./ping_server$EXEEXT 4302 --log=root.fmt=%P:%t%e%m%n
-> server:main Launch server (port=4302)
-> server:main Messages registered
-> server:main Messages registered
-> server:main >>>>>>>> Listening on port 4302 <<<<<<<<
-> server:main >>>>>>>> Got message PING(1234) from 127.0.0.1:5001 <<<<<<<<
-> server:main >>>>>>>> Answered with PONG(4321) <<<<<<<<
-> server:main Done.
-> server:main Exiting GRAS
-
-# give the server a chance to acquire the expected port number
-$ $SG_TEST_ENV sleep 1
-
-! timeout 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_ENV ./ping_client$EXEEXT 127.0.0.1 4302 --log=root.fmt=%P:%t%e%m%n
-> client:main Launch client (server on 127.0.0.1:4302)
-> client:main Connected to 127.0.0.1:4302.
-> client:main Messages registered
-> client:main >>>>>>>> Connected to server which is on 127.0.0.1:4302 <<<<<<<<
-> client:main >>>>>>>> Message PING(1234) sent to 127.0.0.1:4302 <<<<<<<<
-> client:main >>>>>>>> Got PONG(4321) from 127.0.0.1:4302 <<<<<<<<
-> client:main Done.
-> client:main Exiting GRAS
diff --git a/examples/gras/ping/test_sg_32.tesh b/examples/gras/ping/test_sg_32.tesh
deleted file mode 100644 (file)
index ff401a3..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-p Runs the 'ping' test within the simulator (simulation times valid for 32bits architectures)
-
-! output sort
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./ping_simulator${EXEEXT:=} ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/ping.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (1:server@Tremblay) Launch server (port=4000)
-> [  0.000000] (2:client@Fafard) Launch client (server on Tremblay:4000)
-> [  0.000195] (1:server@Tremblay) Messages registered
-> [  0.000195] (1:server@Tremblay) Messages registered
-> [  0.000195] (1:server@Tremblay) >>>>>>>> Listening on port 4000 <<<<<<<<
-> [  0.000195] (2:client@Fafard) Connected to Tremblay:4000.
-> [  0.000195] (2:client@Fafard) Messages registered
-> [  0.000195] (2:client@Fafard) >>>>>>>> Connected to server which is on Tremblay:4000 <<<<<<<<
-> [  0.025904] (1:server@Tremblay) >>>>>>>> Got message PING(1234) from Fafard:5000 <<<<<<<<
-> [  0.025904] (2:client@Fafard) >>>>>>>> Message PING(1234) sent to Tremblay:4000 <<<<<<<<
-> [  0.051613] (1:server@Tremblay) >>>>>>>> Answered with PONG(4321) <<<<<<<<
-> [  0.051613] (1:server@Tremblay) Done.
-> [  0.051613] (1:server@Tremblay) Exiting GRAS
-> [  0.051613] (2:client@Fafard) >>>>>>>> Got PONG(4321) from Tremblay:4000 <<<<<<<<
-> [  0.051613] (2:client@Fafard) Done.
-> [  0.051613] (2:client@Fafard) Exiting GRAS
diff --git a/examples/gras/ping/test_sg_64.tesh b/examples/gras/ping/test_sg_64.tesh
deleted file mode 100644 (file)
index bbc4c68..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-p Runs the 'ping' test within the simulator (simulation times valid for 64bits architectures)
-
-! output sort
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./ping_simulator${EXEEXT:=} ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/ping.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (1:server@Tremblay) Launch server (port=4000)
-> [  0.000000] (2:client@Fafard) Launch client (server on Tremblay:4000)
-> [  0.000195] (1:server@Tremblay) Messages registered
-> [  0.000195] (1:server@Tremblay) Messages registered
-> [  0.000195] (1:server@Tremblay) >>>>>>>> Listening on port 4000 <<<<<<<<
-> [  0.000195] (2:client@Fafard) Connected to Tremblay:4000.
-> [  0.000195] (2:client@Fafard) Messages registered
-> [  0.000195] (2:client@Fafard) >>>>>>>> Connected to server which is on Tremblay:4000 <<<<<<<<
-> [  0.025904] (1:server@Tremblay) >>>>>>>> Got message PING(1234) from Fafard:5000 <<<<<<<<
-> [  0.025904] (2:client@Fafard) >>>>>>>> Message PING(1234) sent to Tremblay:4000 <<<<<<<<
-> [  0.051613] (1:server@Tremblay) >>>>>>>> Answered with PONG(4321) <<<<<<<<
-> [  0.051613] (1:server@Tremblay) Done.
-> [  0.051613] (1:server@Tremblay) Exiting GRAS
-> [  0.051613] (2:client@Fafard) >>>>>>>> Got PONG(4321) from Tremblay:4000 <<<<<<<<
-> [  0.051613] (2:client@Fafard) Done.
-> [  0.051613] (2:client@Fafard) Exiting GRAS
diff --git a/examples/gras/pmm/CMakeLists.txt b/examples/gras/pmm/CMakeLists.txt
deleted file mode 100644 (file)
index c894a0d..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_pmm_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_pmm_slave.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_pmm_master.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-add_executable(pmm_simulator ${CMAKE_CURRENT_BINARY_DIR}/_pmm_simulator.c ${CMAKE_CURRENT_SOURCE_DIR}/pmm.c)
-add_executable(pmm_slave     ${CMAKE_CURRENT_BINARY_DIR}/_pmm_slave.c ${CMAKE_CURRENT_SOURCE_DIR}/pmm.c)
-add_executable(pmm_master    ${CMAKE_CURRENT_BINARY_DIR}/_pmm_master.c ${CMAKE_CURRENT_SOURCE_DIR}/pmm.c)
-
-add_custom_command(
-  OUTPUT
-  ${CMAKE_CURRENT_BINARY_DIR}/_pmm_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_pmm_slave.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_pmm_master.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/pmm.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator pmm ${CMAKE_CURRENT_SOURCE_DIR}/pmm.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(pmm_simulator simgrid pthread m )
-  target_link_libraries(pmm_slave gras pthread m )
-  target_link_libraries(pmm_master gras pthread m )
-else(NOT WIN32)
-  target_link_libraries(pmm_simulator simgrid)
-  target_link_libraries(pmm_slave gras)
-  target_link_libraries(pmm_master gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/pmm.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/pmm.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/make_deployment.pl
-  PARENT_SCOPE
-  )
diff --git a/examples/gras/pmm/make_deployment.pl b/examples/gras/pmm/make_deployment.pl
deleted file mode 100755 (executable)
index 6d8fe8e..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#! /usr/bin/perl
-
-use strict;
-
-sub usage {
-    print STDERR <<EOH
-Usage: make_deployment.pl platform_file.xml nb_host 
-  
-This script generates a deployment file for the PMM program. It takes 
-a SimGrid platform file as first argument and the number of wanted peers as 
-second (optional) argument. If the amount of peers exceeds the amount of 
-available hosts in the deployment file, several peers will be placed on the
-same host.
-      
-EOH
-      ;
-    die "\n";
-}
-
-my $input    = shift @ARGV || usage();
-my $nb_slaves = shift @ARGV || "";
-# my $source   = shift || "";
-
-my @host;
-
-open IN,$input || die "Cannot open $input: $!\n";
-
-while (<IN>) {
-  next unless /<host id="([^"]*)"/; # "
-  
-  push @host, $1;
-}
-
-# map { print "$_\n" } @host;
-
-die "No host found in $input. Is it really a SimGrid platform file?\nCheck that you didn't pass a deployment file, for example.\n"
-  unless (scalar @host);
-
-if (! $nb_slaves) {
-    $nb_slaves = (scalar @host) - 1;
-}
-
-#
-# generate the file. Master first (quite logical, indeed)
-
-my $port_num = 4000;
-my $master = $host[0];
-
-print "<?xml version='1.0'?>\n";
-print "<!DOCTYPE platform SYSTEM \"simgrid.dtd\">\n";
-print "<platform version=\"2\">\n\n";
-print "  <!-- The master, argument :: port number -->\n";
-print "  <process host=\"$master\" function=\"master\">\n";
-print "    <argument value=\"$port_num\"/>\n";
-print "  </process>\n";
-
-# Start the slaves also
-# reset iterators
-my $it_host=1;
-
-for (my $i=0; $i<$nb_slaves; $i++) {
-  print "  <process host=\"".$host[$it_host]."\" function=\"slave\"><argument value=\"$master:$port_num\"/></process>\n";
-    
-  $it_host ++;
-  if ($it_host == scalar @host) {
-    $it_host = 0;
-  }
-}
-
-
-print "</platform>\n";
-
diff --git a/examples/gras/pmm/pmm.c b/examples/gras/pmm/pmm.c
deleted file mode 100644 (file)
index 38c834c..0000000
+++ /dev/null
@@ -1,434 +0,0 @@
-/* pmm - parallel matrix multiplication "double diffusion"                  */
-
-/* Copyright (c) 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
-#include "xbt/matrix.h"
-#include "amok/peermanagement.h"
-
-#define PROC_MATRIX_SIZE 3
-#define NEIGHBOR_COUNT PROC_MATRIX_SIZE - 1
-#define SLAVE_COUNT (PROC_MATRIX_SIZE*PROC_MATRIX_SIZE)
-
-#define DATA_MATRIX_SIZE 18
-const int submatrix_size = DATA_MATRIX_SIZE / PROC_MATRIX_SIZE;
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(pmm, "Parallel Matrix Multiplication");
-
-/* struct for recovering results */
-XBT_DEFINE_TYPE(s_result, struct s_result {
-                 int linepos; int rowpos;
-                 xbt_matrix_t C XBT_ANNOTE(subtype, double);
-                 });
-
-typedef struct s_result result_t;
-
-/* struct to send initial data to slave */
-XBT_DEFINE_TYPE(s_pmm_assignment, struct s_pmm_assignment {
-                 int linepos;
-                 int rowpos;
-                 xbt_peer_t line[NEIGHBOR_COUNT];
-                 xbt_peer_t row[NEIGHBOR_COUNT];
-                 xbt_matrix_t A XBT_ANNOTE(subtype, double);
-                 xbt_matrix_t B XBT_ANNOTE(subtype, double);
-                 });
-
-typedef struct s_pmm_assignment s_pmm_assignment_t;
-
-/* register messages which may be sent (common to client and server) */
-static void register_messages(void)
-{
-  xbt_datadesc_type_t result_type;
-  xbt_datadesc_type_t pmm_assignment_type;
-
-  xbt_datadesc_set_const("NEIGHBOR_COUNT", NEIGHBOR_COUNT);
-  result_type = xbt_datadesc_by_symbol(s_result);
-  pmm_assignment_type = xbt_datadesc_by_symbol(s_pmm_assignment);
-
-  /* receive a final result from slave */
-  gras_msgtype_declare("result", result_type);
-
-  /* send from master to slave to assign a position and some data */
-  gras_msgtype_declare("pmm_slave", pmm_assignment_type);
-
-  /* send data between slaves */
-  gras_msgtype_declare("dataA",
-                       xbt_datadesc_matrix(xbt_datadesc_by_name
-                                            ("double"), NULL));
-  gras_msgtype_declare("dataB",
-                       xbt_datadesc_matrix(xbt_datadesc_by_name
-                                            ("double"), NULL));
-
-  /* synchronization message */
-  gras_msgtype_declare("pmm_sync", 0);
-}
-
-static xbt_socket_t try_gras_socket_client_from_string(const char *host)
-{
-  volatile xbt_socket_t sock = NULL;
-  xbt_ex_t e;
-  TRY {
-    sock = gras_socket_client_from_string(host);
-  }
-  CATCH(e) {
-    if (e.category != system_error)
-      /* dunno what happened, let the exception go through */
-      RETHROWF("Unable to connect to the server: %s");
-    xbt_ex_free(e);
-  }
-  return sock;
-}
-
-static void my_gras_msg_wait(double timeout, const char* msgt_want,
-                             xbt_socket_t* expeditor, void *payload,
-                             const char *error_msg)
-{
-  TRY {
-    gras_msg_wait(timeout, msgt_want, expeditor, payload);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("%s: %s", error_msg);
-  }
-}
-
-/* Function prototypes */
-int slave(int argc, char *argv[]);
-int master(int argc, char *argv[]);
-
-
-/* **********************************************************************
- * master code
- * **********************************************************************/
-
-/* Global private data */
-typedef struct {
-  int nbr_row, nbr_line;
-  int remaining_step;
-  int remaining_ack;
-} master_data_t;
-
-int master(int argc, char *argv[])
-{
-
-  int i;
-
-  xbt_matrix_t A, B, C;
-  result_t result;
-
-  xbt_socket_t from;
-
-  xbt_dynar_t peers;            /* group of slaves */
-  xbt_peer_t grid[SLAVE_COUNT]; /* The slaves as an array */
-  xbt_socket_t socket[SLAVE_COUNT];    /* sockets for brodcast to slaves */
-
-  /* Init the GRAS's infrastructure */
-  gras_init(&argc, argv);
-  amok_pm_init();
-  register_messages();
-
-  /* Initialize data matrices */
-  A = xbt_matrix_double_new_id(DATA_MATRIX_SIZE, DATA_MATRIX_SIZE);
-  B = xbt_matrix_double_new_seq(DATA_MATRIX_SIZE, DATA_MATRIX_SIZE);
-  C = xbt_matrix_double_new_zeros(DATA_MATRIX_SIZE, DATA_MATRIX_SIZE);
-
-  /* Create the connexions */
-  xbt_assert(argc > 1, "Usage: master <port>");
-  gras_socket_server(atoi(argv[1]));
-  peers = amok_pm_group_new("pmm");
-
-  /* friends, we're ready. Come and play */
-  XBT_INFO("Wait for peers for 2 sec");
-  gras_msg_handleall(2);
-  while (xbt_dynar_length(peers) < SLAVE_COUNT) {
-    XBT_INFO("Got only %ld pals (of %d). Wait 2 more seconds",
-        xbt_dynar_length(peers),SLAVE_COUNT);
-    gras_msg_handleall(2);
-  }
-  XBT_INFO("Good. Got %ld pals", xbt_dynar_length(peers));
-
-  for (i = 0; i < xbt_dynar_length(peers) && i < SLAVE_COUNT; i++) {
-    xbt_dynar_get_cpy(peers, i, &grid[i]);
-    socket[i] = gras_socket_client(grid[i]->name, grid[i]->port);
-  }
-  xbt_assert(i == SLAVE_COUNT,
-              "Not enough slaves for this setting (got %d of %d). Change the deployment file",
-              i, SLAVE_COUNT);
-
-  /* Kill surnumerous slaves */
-  for (i = SLAVE_COUNT; i < xbt_dynar_length(peers);) {
-    xbt_peer_t h;
-
-    xbt_dynar_remove_at(peers, i, &h);
-    XBT_INFO("Too much slaves. Killing %s:%d", h->name, h->port);
-    amok_pm_kill_hp(h->name, h->port);
-    free(h);
-  }
-
-
-  /* Assign job to slaves */
-  int row = 0, line = 0;
-  XBT_INFO("XXXXXXXXXXXXXXXXXXXXXX begin Multiplication");
-  for (i = 0; i < SLAVE_COUNT; i++) {
-    s_pmm_assignment_t assignment;
-    int j, k;
-
-    assignment.linepos = line;  // assigned line
-    assignment.rowpos = row;    // assigned row
-
-    /* Neiborhood */
-    for (j = 0, k = 0; j < PROC_MATRIX_SIZE; j++) {
-      if (i != j * PROC_MATRIX_SIZE + (row)) {
-        assignment.row[k] = grid[j * PROC_MATRIX_SIZE + (row)];
-        k++;
-      }
-    }
-    for (j = 0, k = 0; j < PROC_MATRIX_SIZE; j++) {
-      if (i != (line) * PROC_MATRIX_SIZE + j) {
-        assignment.line[k] = grid[(line) * PROC_MATRIX_SIZE + j];
-        k++;
-      }
-    }
-
-    assignment.A = xbt_matrix_new_sub(A,
-                                      submatrix_size, submatrix_size,
-                                      submatrix_size * line,
-                                      submatrix_size * row, NULL);
-    assignment.B =
-        xbt_matrix_new_sub(B, submatrix_size, submatrix_size,
-                           submatrix_size * line, submatrix_size * row,
-                           NULL);
-    row++;
-    if (row >= PROC_MATRIX_SIZE) {
-      row = 0;
-      line++;
-    }
-
-    gras_msg_send(socket[i], "pmm_slave", &assignment);
-    xbt_matrix_free(assignment.A);
-    xbt_matrix_free(assignment.B);
-  }
-
-  /* synchronize slaves */
-  for (i = 0; i < PROC_MATRIX_SIZE; i++) {
-    int j;
-    for (j = 0; j < SLAVE_COUNT; j++)
-      gras_msg_wait(600, "pmm_sync", NULL, NULL);
-    for (j = 0; j < SLAVE_COUNT; j++)
-      gras_msg_send(socket[j], "pmm_sync", NULL);
-  }
-
-  /* Retrieve the results */
-  for (i = 0; i < SLAVE_COUNT; i++) {
-    gras_msg_wait(6000, "result", &from, &result);
-    XBT_VERB("%d slaves are done already. Waiting for %d", i + 1,
-          SLAVE_COUNT);
-    xbt_matrix_copy_values(C, result.C, submatrix_size, submatrix_size,
-                           submatrix_size * result.linepos,
-                           submatrix_size * result.rowpos, 0, 0, NULL);
-    xbt_matrix_free(result.C);
-  }
-  /*    end of gather   */
-
-  if (xbt_matrix_double_is_seq(C))
-    XBT_INFO("XXXXXXXXXXXXXXXXXXXXXX Ok, the result matches expectations");
-  else {
-    XBT_WARN("the result seems wrong");
-    if (DATA_MATRIX_SIZE < 30) {
-      XBT_INFO("The Result of Multiplication is :");
-      xbt_matrix_dump(C, "C:res", 0, xbt_matrix_dump_display_double);
-    } else {
-      XBT_INFO("Matrix size too big (%d>30) to be displayed here",
-            DATA_MATRIX_SIZE);
-    }
-  }
-
-  amok_pm_group_shutdown("pmm");        /* Ok, we're out of here */
-
-  for (i = 0; i < SLAVE_COUNT; i++)
-    gras_socket_close(socket[i]);
-
-  xbt_matrix_free(A);
-  xbt_matrix_free(B);
-  xbt_matrix_free(C);
-  gras_exit();
-  return 0;
-}                               /* end_of_master */
-
-/* **********************************************************************
- * slave code
- * **********************************************************************/
-
-static int pmm_worker_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  /* Recover my initialized Data and My Position */
-  s_pmm_assignment_t assignment = *(s_pmm_assignment_t *) payload;
-  xbt_socket_t master = gras_msg_cb_ctx_from(ctx);
-
-  int step, l;
-  xbt_matrix_t bA = xbt_matrix_new(submatrix_size, submatrix_size,
-                                   sizeof(double), NULL);
-  xbt_matrix_t bB = xbt_matrix_new(submatrix_size, submatrix_size,
-                                   sizeof(double), NULL);
-
-  int myline, myrow;
-  xbt_matrix_t mydataA, mydataB;
-  xbt_matrix_t bC =
-      xbt_matrix_double_new_zeros(submatrix_size, submatrix_size);
-
-  result_t result;
-
-  xbt_socket_t from;           /* to exchange data with my neighbor */
-
-  /* sockets for brodcast to other slave */
-  xbt_socket_t socket_line[PROC_MATRIX_SIZE - 1];
-  xbt_socket_t socket_row[PROC_MATRIX_SIZE - 1];
-  memset(socket_line, 0, sizeof(socket_line));
-  memset(socket_row, 0, sizeof(socket_row));
-
-  int i;
-
-  gras_os_sleep(1);             /* wait for my pals */
-
-  myline = assignment.linepos;
-  myrow = assignment.rowpos;
-  mydataA = assignment.A;
-  mydataB = assignment.B;
-
-  if (gras_if_RL())
-    XBT_INFO("Receive my pos and assignment");
-  else
-    XBT_INFO("Receive my pos (%d,%d) and assignment", myline, myrow);
-
-  /* Get my neighborhood from the assignment message (skipping myself) */
-  for (i = 0; i < PROC_MATRIX_SIZE - 1; i++) {
-    socket_line[i] = gras_socket_client(assignment.line[i]->name,
-                                        assignment.line[i]->port);
-    xbt_peer_free(assignment.line[i]);
-  }
-  for (i = 0; i < PROC_MATRIX_SIZE - 1; i++) {
-    socket_row[i] = gras_socket_client(assignment.row[i]->name,
-                                       assignment.row[i]->port);
-    xbt_peer_free(assignment.row[i]);
-  }
-
-  for (step = 0; step < PROC_MATRIX_SIZE; step++) {
-    gras_msg_send(master, "pmm_sync", NULL);
-    gras_msg_wait(600, "pmm_sync", NULL, NULL);
-
-    /* a line brodcast */
-    if (myline == step) {
-      XBT_VERB("LINE: step(%d) = Myline(%d). Broadcast my data.", step,
-            myline);
-      for (l = 0; l < PROC_MATRIX_SIZE - 1; l++) {
-        XBT_VERB("LINE:   Send to %s", xbt_socket_peer_name(socket_row[l]));
-        gras_msg_send(socket_row[l], "dataB", &mydataB);
-      }
-
-
-      xbt_matrix_free(bB);
-      bB = xbt_matrix_new_sub(mydataB,
-                              submatrix_size, submatrix_size, 0, 0, NULL);
-    } else {
-      xbt_matrix_free(bB);
-      my_gras_msg_wait(600, "dataB", &from, &bB,
-                       "Can't get a data message from line");
-      XBT_VERB("LINE: step(%d) <> Myline(%d). Receive data from %s", step,
-            myline, xbt_socket_peer_name(from));
-    }
-
-    /* a row brodcast */
-    if (myrow == step) {
-      XBT_VERB("ROW: step(%d)=myrow(%d). Broadcast my data.", step, myrow);
-      for (l = 1; l < PROC_MATRIX_SIZE; l++) {
-        XBT_VERB("ROW:   Send to %s",
-              xbt_socket_peer_name(socket_line[l - 1]));
-        gras_msg_send(socket_line[l - 1], "dataA", &mydataA);
-      }
-      xbt_matrix_free(bA);
-      bA = xbt_matrix_new_sub(mydataA,
-                              submatrix_size, submatrix_size, 0, 0, NULL);
-    } else {
-      xbt_matrix_free(bA);
-      my_gras_msg_wait(1200, "dataA", &from, &bA,
-                       "Can't get a data message from row");
-      XBT_VERB("ROW: step(%d)<>myrow(%d). Receive data from %s", step, myrow,
-            xbt_socket_peer_name(from));
-    }
-    xbt_matrix_double_addmult(bA, bB, bC);
-
-  }
-
-  /* send Result to master */
-  result.C = bC;
-  result.linepos = myline;
-  result.rowpos = myrow;
-
-  TRY {
-    gras_msg_send(master, "result", &result);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Failed to send answer to server: %s");
-  }
-  XBT_VERB(">>>>>>>> Result sent to %s:%d <<<<<<<<",
-        xbt_socket_peer_name(master), xbt_socket_peer_port(master));
-  /*  Free the allocated resources, and shut GRAS down */
-
-  xbt_matrix_free(bA);
-  xbt_matrix_free(bB);
-  xbt_matrix_free(bC);
-
-  xbt_matrix_free(mydataA);
-  xbt_matrix_free(mydataB);
-  /* FIXME: some are said to be unknown 
-     gras_socket_close(master);
-     gras_socket_close(from);
-     for (l=0; l < PROC_MATRIX_SIZE-1; l++) {
-     if (socket_line[l])
-     gras_socket_close(socket_line[l]);
-     if (socket_row[l])
-     gras_socket_close(socket_row[l]); 
-     } */
-
-  return 0;
-}
-
-int slave(int argc, char *argv[])
-{
-  xbt_socket_t mysock;
-  xbt_socket_t master = NULL;
-  int rank;
-
-  /* Init the GRAS's infrastructure */
-  gras_init(&argc, argv);
-  amok_pm_init();
-  if (argc != 3 && argc != 2)
-    xbt_die("Usage: slave masterhost:masterport [rank]");
-  if (argc == 2)
-    rank = -1;
-  else
-    rank = atoi(argv[2]);
-
-  /*  Register the known messages and my callback */
-  register_messages();
-  gras_cb_register("pmm_slave", pmm_worker_cb);
-
-  /* Create the connexions */
-  mysock = gras_socket_server_range(3000, 9999, 0, 0);
-  XBT_INFO("Sensor %d starting", rank);
-  while (!(master = try_gras_socket_client_from_string(argv[1])))
-    gras_os_sleep(0.5);
-
-  /* Join and run the group */
-  rank = amok_pm_group_join(master, "pmm");
-  amok_pm_mainloop(600);
-
-  /* housekeeping */
-  gras_socket_close(mysock);
-  //  gras_socket_close(master); Unknown
-  gras_exit();
-  return 0;
-}                               /* end_of_slave */
diff --git a/examples/gras/pmm/pmm.xml b/examples/gras/pmm/pmm.xml
deleted file mode 100644 (file)
index 7cb191a..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-
-  <process host="Jacquelin" function="master">
-     <argument value="4242"/>
-  </process>
-  
-  <process host="Boivin"    function="slave"><argument value="Jacquelin:4242"/><argument value="0"/></process>
-  <process host="Jean_Yves" function="slave"><argument value="Jacquelin:4242"/><argument value="1"/></process>
-  <process host="TeX"       function="slave"><argument value="Jacquelin:4242"/><argument value="2"/></process>
-  <process host="Geoff"     function="slave"><argument value="Jacquelin:4242"/><argument value="3"/></process>
-  <process host="Disney"    function="slave"><argument value="Jacquelin:4242"/><argument value="4"/></process>
-  <process host="iRMX"      function="slave"><argument value="Jacquelin:4242"/><argument value="5"/></process>
-  <process host="McGee"     function="slave"><argument value="Jacquelin:4242"/><argument value="6"/></process>
-  <process host="Gatien"    function="slave"><argument value="Jacquelin:4242"/><argument value="7"/></process>
-  <process host="Laroche"   function="slave"><argument value="Jacquelin:4242"/><argument value="8"/></process>
-</platform>
diff --git a/examples/gras/pmm/test_rl.tesh b/examples/gras/pmm/test_rl.tesh
deleted file mode 100755 (executable)
index ccd65ad..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-# Ignore the output of slaves since it depends on the order of connexion
-
-! timeout no
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./pmm_slave$EXEEXT 127.0.0.1:4242 0 --log=root.fmt:%m%n
-> Sensor 0 starting
-> Receive my pos and assignment
-> Exiting GRAS
-
-! timeout no
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./pmm_slave$EXEEXT 127.0.0.1:4242 1 --log=root.fmt:%m%n
-> Sensor 1 starting
-> Receive my pos and assignment
-> Exiting GRAS
-
-! timeout no
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./pmm_slave$EXEEXT 127.0.0.1:4242 2 --log=root.fmt:%m%n
-> Sensor 2 starting
-> Receive my pos and assignment
-> Exiting GRAS
-
-! timeout no
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./pmm_slave$EXEEXT 127.0.0.1:4242 3 --log=root.fmt:%m%n
-> Sensor 3 starting
-> Receive my pos and assignment
-> Exiting GRAS
-
-! timeout no
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./pmm_slave$EXEEXT 127.0.0.1:4242 4 --log=root.fmt:%m%n
-> Sensor 4 starting
-> Receive my pos and assignment
-> Exiting GRAS
-
-! timeout no
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./pmm_slave$EXEEXT 127.0.0.1:4242 5 --log=root.fmt:%m%n
-> Sensor 5 starting
-> Receive my pos and assignment
-> Exiting GRAS
-
-! timeout no
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./pmm_slave$EXEEXT 127.0.0.1:4242 6 --log=root.fmt:%m%n
-> Sensor 6 starting
-> Receive my pos and assignment
-> Exiting GRAS
-
-! timeout no
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./pmm_slave$EXEEXT 127.0.0.1:4242 7 --log=root.fmt:%m%n
-> Sensor 7 starting
-> Receive my pos and assignment
-> Exiting GRAS
-
-! timeout no
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./pmm_slave$EXEEXT 127.0.0.1:4242 8 --log=root.fmt:%m%n
-> Sensor 8 starting
-> Receive my pos and assignment
-> Exiting GRAS
-
-! timeout no
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./pmm_master$EXEEXT 4242 --log=root.fmt:%m%n
-> Wait for peers for 2 sec
-> Good. Got 9 pals
-> XXXXXXXXXXXXXXXXXXXXXX begin Multiplication
-> XXXXXXXXXXXXXXXXXXXXXX Ok, the result matches expectations
-> Exiting GRAS
diff --git a/examples/gras/pmm/test_sg_32.tesh b/examples/gras/pmm/test_sg_32.tesh
deleted file mode 100644 (file)
index 61f1d78..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-! output sort 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./pmm_simulator$EXEEXT ${srcdir:=.}/../../msg/msg_platform.xml ${srcdir:=.}/pmm.xml --cfg=network/crosstraffic:0 "--log=root.fmt:[%10.6r]%e(%2i:%P@%h)%e%m%n"
-> [  0.000000] ( 0:@) Configuration change: Set 'network/crosstraffic' to '0'
-> [  0.000195] ( 1:master@Jacquelin) Wait for peers for 2 sec
-> [  0.000195] ( 2:slave@Boivin) Sensor 0 starting
-> [  0.000195] ( 3:slave@Jean_Yves) Sensor 1 starting
-> [  0.000195] ( 4:slave@TeX) Sensor 2 starting
-> [  0.000195] ( 5:slave@Geoff) Sensor 3 starting
-> [  0.000195] ( 6:slave@Disney) Sensor 4 starting
-> [  0.000195] ( 7:slave@iRMX) Sensor 5 starting
-> [  0.000195] ( 8:slave@McGee) Sensor 6 starting
-> [  0.000195] ( 9:slave@Gatien) Sensor 7 starting
-> [  0.000195] (10:slave@Laroche) Sensor 8 starting
-> [  3.601779] ( 1:master@Jacquelin) Got only 1 pals (of 9). Wait 2 more seconds
-> [  7.400400] ( 1:master@Jacquelin) Got only 4 pals (of 9). Wait 2 more seconds
-> [  9.400410] ( 1:master@Jacquelin) Got only 6 pals (of 9). Wait 2 more seconds
-> [ 13.504195] ( 1:master@Jacquelin) Got only 7 pals (of 9). Wait 2 more seconds
-> [ 15.667050] ( 1:master@Jacquelin) Good. Got 9 pals
-> [ 15.668806] ( 1:master@Jacquelin) XXXXXXXXXXXXXXXXXXXXXX begin Multiplication
-> [ 18.478552] (10:slave@Laroche) Receive my pos (0,0) and assignment
-> [ 19.532770] ( 2:slave@Boivin) Receive my pos (0,1) and assignment
-> [ 20.462558] ( 3:slave@Jean_Yves) Receive my pos (0,2) and assignment
-> [ 22.284313] ( 4:slave@TeX) Receive my pos (1,0) and assignment
-> [ 22.289915] ( 5:slave@Geoff) Receive my pos (1,1) and assignment
-> [ 24.122689] ( 6:slave@Disney) Receive my pos (1,2) and assignment
-> [ 27.181717] ( 7:slave@iRMX) Receive my pos (2,0) and assignment
-> [ 28.074555] ( 8:slave@McGee) Receive my pos (2,1) and assignment
-> [ 29.355457] ( 9:slave@Gatien) Receive my pos (2,2) and assignment
-> [ 91.389749] ( 1:master@Jacquelin) XXXXXXXXXXXXXXXXXXXXXX Ok, the result matches expectations
-> [ 93.190583] (10:slave@Laroche) Exiting GRAS
-> [ 94.239660] ( 2:slave@Boivin) Exiting GRAS
-> [ 95.164943] ( 3:slave@Jean_Yves) Exiting GRAS
-> [ 96.977725] ( 4:slave@TeX) Exiting GRAS
-> [ 96.983260] ( 5:slave@Geoff) Exiting GRAS
-> [ 98.806993] ( 6:slave@Disney) Exiting GRAS
-> [101.850845] ( 7:slave@iRMX) Exiting GRAS
-> [102.739392] ( 8:slave@McGee) Exiting GRAS
-> [104.014024] ( 1:master@Jacquelin) Exiting GRAS
-> [104.014024] ( 9:slave@Gatien) Exiting GRAS
diff --git a/examples/gras/pmm/test_sg_64.tesh b/examples/gras/pmm/test_sg_64.tesh
deleted file mode 100644 (file)
index ae06089..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-#! ./tesh
-
-! output sort 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./pmm_simulator$EXEEXT ${srcdir:=.}/../../msg/msg_platform.xml ${srcdir:=.}/pmm.xml --cfg=network/crosstraffic:0 "--log=root.fmt:[%10.6r]%e(%2i:%P@%h)%e%m%n"
-> [  0.000000] ( 0:@) Configuration change: Set 'network/crosstraffic' to '0'
-> [  0.000195] ( 1:master@Jacquelin) Wait for peers for 2 sec
-> [  0.000195] ( 2:slave@Boivin) Sensor 0 starting
-> [  0.000195] ( 3:slave@Jean_Yves) Sensor 1 starting
-> [  0.000195] ( 4:slave@TeX) Sensor 2 starting
-> [  0.000195] ( 5:slave@Geoff) Sensor 3 starting
-> [  0.000195] ( 6:slave@Disney) Sensor 4 starting
-> [  0.000195] ( 7:slave@iRMX) Sensor 5 starting
-> [  0.000195] ( 8:slave@McGee) Sensor 6 starting
-> [  0.000195] ( 9:slave@Gatien) Sensor 7 starting
-> [  0.000195] (10:slave@Laroche) Sensor 8 starting
-> [  3.601779] ( 1:master@Jacquelin) Got only 1 pals (of 9). Wait 2 more seconds
-> [  7.400400] ( 1:master@Jacquelin) Got only 4 pals (of 9). Wait 2 more seconds
-> [  9.400410] ( 1:master@Jacquelin) Got only 6 pals (of 9). Wait 2 more seconds
-> [ 13.504195] ( 1:master@Jacquelin) Got only 7 pals (of 9). Wait 2 more seconds
-> [ 15.667050] ( 1:master@Jacquelin) Good. Got 9 pals
-> [ 15.668806] ( 1:master@Jacquelin) XXXXXXXXXXXXXXXXXXXXXX begin Multiplication
-> [ 18.478773] (10:slave@Laroche) Receive my pos (0,0) and assignment
-> [ 19.533121] ( 2:slave@Boivin) Receive my pos (0,1) and assignment
-> [ 20.463023] ( 3:slave@Jean_Yves) Receive my pos (0,2) and assignment
-> [ 22.285000] ( 4:slave@TeX) Receive my pos (1,0) and assignment
-> [ 22.290608] ( 5:slave@Geoff) Receive my pos (1,1) and assignment
-> [ 24.123607] ( 6:slave@Disney) Receive my pos (1,2) and assignment
-> [ 27.183009] ( 7:slave@iRMX) Receive my pos (2,0) and assignment
-> [ 28.075956] ( 8:slave@McGee) Receive my pos (2,1) and assignment
-> [ 29.357015] ( 9:slave@Gatien) Receive my pos (2,2) and assignment
-> [ 91.392661] ( 1:master@Jacquelin) XXXXXXXXXXXXXXXXXXXXXX Ok, the result matches expectations
-> [ 93.193495] (10:slave@Laroche) Exiting GRAS
-> [ 94.242571] ( 2:slave@Boivin) Exiting GRAS
-> [ 95.167854] ( 3:slave@Jean_Yves) Exiting GRAS
-> [ 96.980636] ( 4:slave@TeX) Exiting GRAS
-> [ 96.986171] ( 5:slave@Geoff) Exiting GRAS
-> [ 98.809904] ( 6:slave@Disney) Exiting GRAS
-> [101.853757] ( 7:slave@iRMX) Exiting GRAS
-> [102.742304] ( 8:slave@McGee) Exiting GRAS
-> [104.016936] ( 1:master@Jacquelin) Exiting GRAS
-> [104.016936] ( 9:slave@Gatien) Exiting GRAS
\ No newline at end of file
diff --git a/examples/gras/properties/CMakeLists.txt b/examples/gras/properties/CMakeLists.txt
deleted file mode 100644 (file)
index 90debfd..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_properties_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_properties_alice.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_properties_bob.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-
-add_executable(properties_simulator ${CMAKE_CURRENT_BINARY_DIR}/_properties_simulator.c ${CMAKE_CURRENT_SOURCE_DIR}/properties.c)
-add_executable(properties_alice     ${CMAKE_CURRENT_BINARY_DIR}/_properties_alice.c ${CMAKE_CURRENT_SOURCE_DIR}/properties.c)
-add_executable(properties_bob       ${CMAKE_CURRENT_BINARY_DIR}/_properties_bob.c ${CMAKE_CURRENT_SOURCE_DIR}/properties.c)
-add_custom_command(
-  OUTPUT
-  ${CMAKE_CURRENT_BINARY_DIR}/_properties_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_properties_alice.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_properties_bob.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/properties.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator properties ${CMAKE_CURRENT_SOURCE_DIR}/properties.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(properties_simulator simgrid pthread m )
-  target_link_libraries(properties_alice gras pthread m )
-  target_link_libraries(properties_bob gras pthread m )
-else(NOT WIN32)
-  target_link_libraries(properties_simulator simgrid)
-  target_link_libraries(properties_alice gras)
-  target_link_libraries(properties_bob gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/properties.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/properties.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
diff --git a/examples/gras/properties/properties.c b/examples/gras/properties/properties.c
deleted file mode 100644 (file)
index 9921498..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(test, "Simple Property example");
-
-int alice(int argc, char *argv[]);
-int bob(int argc, char *argv[]);
-
-int alice(int argc, char *argv[])
-{
-  gras_init(&argc, argv);
-
-  /* Get the properties */
-  xbt_dict_t process_props = gras_process_properties();
-  xbt_dict_t host_props = gras_os_host_properties();
-
-  xbt_dict_cursor_t cursor = NULL;
-  char *key, *data;
-  _XBT_GNUC_UNUSED const char *value;
-
-  /* Let the other process change the host props */
-  gras_os_sleep(1);
-
-  XBT_INFO("== Dump all the properties of current host");
-  xbt_dict_foreach(host_props, cursor, key, data)
-      XBT_INFO("  Host property: '%s' has value: '%s'", key, data);
-
-  XBT_INFO("== Dump all the properties of alice");
-  xbt_dict_foreach(process_props, cursor, key, data)
-      if (!strncmp(key, "SG_TEST_", 8))
-    XBT_INFO("  Process property: '%s' has value: '%s'", key, data);
-
-  XBT_INFO("== Try to get a process property that does not exist");
-  value = gras_process_property_value("Nonexisting");
-  xbt_assert(!value, "nonexisting property exists!!");
-
-  /* Modify an existing property. First check it exists */
-  XBT_INFO("== Trying to modify a process property");
-  value = gras_process_property_value("new prop");
-  xbt_assert(!value, "Property 'new prop' exists before I add it!");
-  xbt_dict_set(process_props, "new prop", xbt_strdup("new value"), NULL);
-
-  /* Test if we have changed the value */
-  value = gras_process_property_value("new prop");
-  xbt_assert(!strcmp(value, "new value"),
-              "New property does have the value I've set ('%s' != 'new value')",
-              value);
-
-  gras_exit();
-  return 0;
-}
-
-int bob(int argc, char *argv[])
-{
-  gras_init(&argc, argv);
-
-  /* Get the properties */
-  xbt_dict_t host_props = gras_os_host_properties();
-  xbt_dict_cursor_t cursor = NULL;
-  char *key, *data;
-  _XBT_GNUC_UNUSED const char *value;
-
-  XBT_INFO("== Dump all the properties of host1");
-  xbt_dict_foreach(host_props, cursor, key, data)
-      XBT_INFO("  Host property: '%s' has value: '%s'", key, data);
-
-  XBT_INFO("== Try to get a property that does not exist");
-  value = gras_os_host_property_value("non existing key");
-  xbt_assert(value == NULL,
-              "The key 'non existing key' exists (with value '%s')!!",
-              value);
-
-  XBT_INFO
-      ("== Set a host property that alice will try to retrieve in SG (from bob->hello)");
-  xbt_dict_set(host_props, "from bob", xbt_strdup("hello"), NULL);
-
-  XBT_INFO("== Dump all the properties of host1 again to check the addition");
-  xbt_dict_foreach(host_props, cursor, key, data)
-      XBT_INFO("  Host property: '%s' has value: '%s'", key, data);
-
-  gras_os_sleep(1);             /* KILLME once bug on empty main is solved */
-  gras_exit();
-  return 0;
-}
diff --git a/examples/gras/properties/properties.xml b/examples/gras/properties/properties.xml
deleted file mode 100644 (file)
index 8edb595..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="host1" function="alice">
-    <prop id="SG_TEST_blah" value="blah"/>
-  </process>
-
-  <process host="host1" function="bob"  />
-</platform>
diff --git a/examples/gras/properties/test_rl.tesh b/examples/gras/properties/test_rl.tesh
deleted file mode 100755 (executable)
index 8f0a9a0..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-
-! setenv SG_TEST_blah=blah
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_ENV ./properties_alice --log=root.fmt=%P:%t%e%m%n
-> alice:main == Dump all the properties of current host
-> alice:main == Dump all the properties of alice
-> alice:main   Process property: 'SG_TEST_blah' has value: 'blah'
-> alice:main == Try to get a process property that does not exist
-> alice:main == Trying to modify a process property
-> alice:main Exiting GRAS
-
-! setenv SG_TEST_blah=blah
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_ENV ./properties_bob --log=root.fmt=%P:%t%e%m%n
-> bob:main == Dump all the properties of host1
-> bob:main == Try to get a property that does not exist
-> bob:main == Set a host property that alice will try to retrieve in SG (from bob->hello)
-> bob:main == Dump all the properties of host1 again to check the addition
-> bob:main   Host property: 'from bob' has value: 'hello'
-> bob:main Exiting GRAS
diff --git a/examples/gras/properties/test_sg.tesh b/examples/gras/properties/test_sg.tesh
deleted file mode 100644 (file)
index 43b0fc6..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-p Runs the 'properties' test within the simulator (simulation times valid for 32bits architectures)
-
-! output sort
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./properties_simulator${EXEEXT:=} ${srcdir:=.}/../../platforms/prop.xml ${srcdir:=.}/properties.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (2:bob@host1) == Dump all the properties of host1
-> [  0.000000] (2:bob@host1)   Host property: 'SG_TEST_Hdd' has value: '180'
-> [  0.000000] (2:bob@host1)   Host property: 'SG_TEST_mem' has value: '4'
-> [  0.000000] (2:bob@host1) == Try to get a property that does not exist
-> [  0.000000] (2:bob@host1) == Set a host property that alice will try to retrieve in SG (from bob->hello)
-> [  0.000000] (2:bob@host1) == Dump all the properties of host1 again to check the addition
-> [  0.000000] (2:bob@host1)   Host property: 'from bob' has value: 'hello'
-> [  0.000000] (2:bob@host1)   Host property: 'SG_TEST_Hdd' has value: '180'
-> [  0.000000] (2:bob@host1)   Host property: 'SG_TEST_mem' has value: '4'
-> [  1.000000] (1:alice@host1) == Dump all the properties of current host
-> [  1.000000] (1:alice@host1)   Host property: 'from bob' has value: 'hello'
-> [  1.000000] (1:alice@host1)   Host property: 'SG_TEST_Hdd' has value: '180'
-> [  1.000000] (1:alice@host1)   Host property: 'SG_TEST_mem' has value: '4'
-> [  1.000000] (1:alice@host1) == Dump all the properties of alice
-> [  1.000000] (1:alice@host1)   Process property: 'SG_TEST_blah' has value: 'blah'
-> [  1.000000] (1:alice@host1) == Try to get a process property that does not exist
-> [  1.000000] (1:alice@host1) == Trying to modify a process property
-> [  1.000000] (1:alice@host1) Exiting GRAS
-> [  1.000000] (2:bob@host1) Exiting GRAS
diff --git a/examples/gras/replay/do_simulation.pl b/examples/gras/replay/do_simulation.pl
deleted file mode 100755 (executable)
index 5d8301a..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-#! /usr/bin/perl
-
-use strict;
-
-my $platfile = $ARGV[0] || die "Usage: $0 platfile daxfile\n";
-my $daxfile = $ARGV[1] || die "Usage: $0 platfile daxfile\n";
-
-sub title {
-    my $l = "XXXX $0: $_[0] XXXX";
-    my $l2 = $l;
-    $l2 =~ s/./X/g;
-    print STDERR "\n\n$l2\n$l\n$l2\n";
-}
-
-title("relaunching make");
-system qw(make -C ../../../src libsimgrid.la) and die "XXXX $0: make library failed: $?\n";  
-system qw(make -C ../../simdag dax/dax_test) and die "XXXX $0: make dax_test failed.\n";
-system qw(make replay_simulator) and die "XXXX $0: make replay_simulator failed.\n";
-
-###################################################
-my $tracefile = "$daxfile";
-$tracefile =~ s/\.xml$//;
-$tracefile .= ".trace";
-title("Regenerating the trace '$tracefile'");
-my @args = ("../../simdag/dax/dax_test", "$platfile", "$daxfile","$tracefile");
-system @args and die "XXXX $0: cannot regenerate the trace '$tracefile': $?\n";
-
-
-###################################################
-my $deployfile = "deploy_$platfile";
-$deployfile =~ s/\.xml$//;
-$deployfile .= "_".$daxfile;
-title("Generate a deployment file '$deployfile'");
-my %hosts;
-
-print STDERR  "$0: parsing the trace file '$tracefile'\n";
-open TRACE,"$tracefile" || die "$0: cannot open tracefile $tracefile: $!\n";
-while (<TRACE>) {
-    #    print "Seen $_";
-    next unless /compute/;
-    m/^\[.*?\] ([^ ]*) .*$/ || die "unparsable line: $_";
-    if (defined $hosts{$1}) {
-       $hosts{$1}+=1;
-    } else {
-       $hosts{$1}++;
-    }
-} 
-close TRACE;
-my @hostnames = sort keys %hosts;
-my $master = $hostnames[0];
-
-foreach my $host (@hostnames) {
-    if ($host ne $master && $hosts{$host} > 1) {
-       print STDERR "$host computes $hosts{$host} times!\n";
-    }
-}
-
-print STDERR  "$0: Generating the xml deployment file\n";
-open DEPLOY,">$deployfile";
-print DEPLOY "<?xml version='1.0'?>\n";
-print DEPLOY "<!DOCTYPE platform SYSTEM \"simgrid.dtd\">\n\n";
-print DEPLOY "<!-- File generated by \"$0 $tracefile\" at ".(localtime())." -->\n\n";
-print DEPLOY "<platform version=\"2\">\n";
-
-print DEPLOY "  <process host=\"$master\" function=\"master\">\n";
-print DEPLOY "    <argument value=\"$tracefile\" /> <!-- trace file -->\n";
-print DEPLOY "    <argument value=\"4500\"/>            <!-- port number -->\n";
-print DEPLOY "  </process>\n";
-
-foreach my $host (@hostnames) {
-    print DEPLOY "  <process host=\"$host\" function=\"worker\">";
-    print DEPLOY "<argument value=\"$master:4500\" />";
-    print DEPLOY "</process>\n";
-}
-
-print DEPLOY "</platform>\n";
-close DEPLOY;
-print STDERR  "$0: Xml deployment file generated\n";
-
-###################################################
-title("Replay this trace onto the simulator");
-system ("./replay_simulator","$platfile","$deployfile")
-  and die "Cannot replay the trace. Command was:\n./replay_simulator $platfile $deployfile\n";
-
-
-# 
\ No newline at end of file
diff --git a/examples/gras/replay/replay.c b/examples/gras/replay/replay.c
deleted file mode 100644 (file)
index 7509e4f..0000000
+++ /dev/null
@@ -1,287 +0,0 @@
-/* Copyright (c) 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-/* This example replays a trace as produced by examples/simdag/dax, or other means
- * This is mainly interesting when run on real platforms, to validate the results
- * given in the simulator when running SimDag.
- */
-
-#include "xbt/ex.h"
-#include "xbt/log.h"
-#include "xbt/str.h"
-#include "xbt/dynar.h"
-#include "xbt/synchro.h"
-#include "workload.h"
-#include "gras.h"
-#include "amok/peermanagement.h"
-#include <stdio.h>
-
-#include "simix/simix.h"
-
-int master(int argc, char *argv[]);
-int worker(int argc, char *argv[]);
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(replay, "Messages specific to this example");
-
-static void declare_msg()
-{
-  amok_pm_init();
-  xbt_workload_declare_datadesc();
-  gras_msgtype_declare("go", NULL);
-  gras_msgtype_declare("commands",
-                       xbt_datadesc_dynar(xbt_datadesc_by_name
-                                           ("xbt_workload_elm_t"),
-                                           xbt_workload_elm_free_voidp));
-  gras_msgtype_declare("chunk",
-                       xbt_datadesc_by_name("xbt_workload_data_chunk_t"));
-}
-
-int master(int argc, char *argv[])
-{
-
-  gras_init(&argc, argv);
-  declare_msg();
-
-
-  xbt_assert(argc == 3, "usage: replay_master tracefile port");
-  gras_socket_server(atoi(argv[2]));    /* open my master socket, even if I don't use it */
-  xbt_dynar_t peers = amok_pm_group_new("replay");      /* group of slaves */
-  xbt_peer_t peer;
-  xbt_dynar_t cmds = xbt_workload_parse_file(argv[1]);
-  xbt_workload_sort_who_date(cmds);
-  unsigned int cursor;
-  xbt_workload_elm_t cmd;
-  xbt_dict_cursor_t dict_cursor;
-
-  xbt_dict_t pals_int = xbt_dict_new_homogeneous(NULL);
-  xbt_dynar_foreach(cmds, cursor, cmd) {
-    int *p = xbt_dict_get_or_null(pals_int, cmd->who);
-    if (!p) {
-      p = (int *) 0xBEAF;
-      xbt_dict_set(pals_int, cmd->who, &p, NULL);
-    }
-  }
-
-  /* friends, we're ready. Come and play */
-  XBT_INFO("Wait for peers for a while. I need %d peers",
-        xbt_dict_length(pals_int));
-  while (xbt_dynar_length(peers) < xbt_dict_length(pals_int)) {
-    TRY {
-      gras_msg_handle(20);
-    }
-    CATCH_ANONYMOUS {
-      xbt_dynar_foreach(peers, cursor, peer) {
-        xbt_dict_remove(pals_int, peer->name);
-      }
-      char *peer_name;
-      void *data;
-      xbt_dict_foreach(pals_int, dict_cursor, peer_name, data) {
-        XBT_INFO("Peer %s didn't showed up", peer_name);
-      }
-      RETHROW;
-    }
-  }
-  XBT_INFO("Got my %ld peers", xbt_dynar_length(peers));
-  xbt_dict_free(&pals_int);
-
-  /* Check who came */
-  xbt_dict_t pals = xbt_dict_new_homogeneous(NULL);
-  xbt_socket_t pal;
-  xbt_dynar_foreach(peers, cursor, peer) {
-    //XBT_INFO("%s is here",peer->name);
-    xbt_socket_t sock = gras_socket_client(peer->name, peer->port);
-    xbt_dict_set(pals, peer->name, sock, NULL);
-  }
-  /* check that we have a dude for every element of the trace */
-  xbt_dynar_foreach(cmds, cursor, cmd) {
-    pal = xbt_dict_get_or_null(pals, cmd->who);
-    if (!pal) {
-      XBT_CRITICAL("Process %s didn't came! Abording!", cmd->who);
-      amok_pm_group_shutdown("replay");
-      xbt_dynar_free(&cmds);
-      gras_exit();
-      abort();
-    }
-  }
-  /* Send the commands to every pal */
-  char *pal_name;
-  xbt_dict_foreach(pals, dict_cursor, pal_name, pal) {
-    gras_msg_send(pal, "commands", &cmds);
-  }
-  XBT_INFO("Sent commands to every processes. Let them start now");
-  xbt_dict_cursor_t dict_it;
-  xbt_dict_foreach(pals, dict_it, pal_name, pal) {
-    gras_msg_send(pal, "go", NULL);
-  }
-  XBT_INFO("They should be started by now. Wait for their completion.");
-
-  for (cursor = 0; cursor < xbt_dynar_length(peers); cursor++) {
-    gras_msg_wait(-1, "go", NULL, NULL);
-  }
-
-  /* Done, exiting */
-  //amok_pm_group_shutdown("replay");
-  xbt_dynar_free(&cmds);
-  gras_exit();
-  return 0;
-}
-
-typedef struct {
-  xbt_dynar_t commands;
-  xbt_dict_t peers;
-  xbt_socket_t mysock;
-} s_worker_data_t, *worker_data_t;
-
-
-static xbt_socket_t get_peer_sock(char *peer)
-{
-  worker_data_t g = gras_userdata_get();
-  xbt_socket_t peer_sock = xbt_dict_get_or_null(g->peers, peer);
-  if (!peer_sock) {
-    XBT_INFO("Create a socket to %s", peer);
-    peer_sock = gras_socket_client(peer, 4000);
-    xbt_dict_set(g->peers, peer, peer_sock, NULL);      //gras_socket_close_voidp);
-  }
-  return peer_sock;
-}
-
-static int worker_commands_cb(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  worker_data_t g = gras_userdata_get();
-  g->commands = *(xbt_dynar_t *) payload;
-  return 0;
-}
-
-static void do_command(int rank, void *c)
-{
-  xbt_workload_elm_t cmd = *(xbt_workload_elm_t *) c;
-  xbt_workload_data_chunk_t chunk;
-
-  if (cmd->action == XBT_WORKLOAD_SEND) {
-    xbt_socket_t sock = get_peer_sock(cmd->str_arg);
-    chunk = xbt_workload_data_chunk_new((int) (cmd->d_arg));
-    XBT_INFO("Send %.f bytes to %s %s:%d", cmd->d_arg, cmd->str_arg,
-          xbt_socket_peer_name(sock), xbt_socket_peer_port(sock));
-    gras_msg_send_(sock, gras_msgtype_by_name("chunk"), &chunk);
-    XBT_INFO("Done sending %.f bytes to %s", cmd->d_arg, cmd->str_arg);
-
-  } else if (cmd->action == XBT_WORKLOAD_RECV) {
-    XBT_INFO("Recv %.f bytes from %s", cmd->d_arg, cmd->str_arg);
-    TRY {
-      gras_msg_wait(1000000, "chunk", NULL, &chunk);
-    }
-    CATCH_ANONYMOUS {
-      SIMIX_display_process_status();
-      RETHROWF("Exception while waiting for %f bytes from %s: %s",
-               cmd->d_arg, cmd->str_arg);
-    }
-    xbt_workload_data_chunk_free(chunk);
-    XBT_INFO("Done receiving %.f bytes from %s", cmd->d_arg, cmd->str_arg);
-
-  } else {
-    xbt_die("unknown command: %s", xbt_workload_elm_to_string(cmd));
-  }
-}
-
-int worker(int argc, char *argv[])
-{
-  xbt_ex_t e;
-  worker_data_t globals;
-  gras_init(&argc, argv);
-  declare_msg();
-  globals = gras_userdata_new(s_worker_data_t);
-  /* Create the connexions */
-  globals->mysock = gras_socket_server(4000);   /* FIXME: shouldn't be hardcoded */
-  xbt_socket_t master = NULL;
-  int connected = 0;
-
-  gras_cb_register("commands", worker_commands_cb);
-  globals->peers = xbt_dict_new_homogeneous(NULL);
-
-  if (gras_if_RL())
-    XBT_INFO("Sensor %s starting. Connecting to master on %s",
-          gras_os_myname(), argv[1]);
-  while (!connected) {
-    xbt_ex_t e;
-    TRY {
-      master = gras_socket_client_from_string(argv[1]);
-      connected = 1;
-    }
-    CATCH(e) {
-      if (e.category != system_error)
-        RETHROW;
-      xbt_ex_free(e);
-      XBT_INFO("Failed to connect. Retry in 0.5 second");
-      gras_os_sleep(0.5);
-    }
-  }
-  /* Join and run the group */
-  amok_pm_group_join(master, "replay", -1);
-  gras_msg_handle(60);          // command message
-  gras_msg_wait(60, "go", NULL, NULL);
-  {
-    worker_data_t g = gras_userdata_get();
-    unsigned int cursor;
-    xbt_workload_elm_t cmd;
-    const char *myname = gras_os_myname();
-    xbt_dynar_t cmd_to_go =
-        xbt_dynar_new(sizeof(xbt_workload_elm_t), NULL);
-
-    xbt_dynar_foreach(g->commands, cursor, cmd) {
-      if (!strcmp(cmd->who, myname)) {
-        char *c = xbt_workload_elm_to_string(cmd);
-        //      XBT_INFO("TODO: %s",c);
-        free(c);
-
-        switch (cmd->action) {
-        case XBT_WORKLOAD_COMPUTE:
-          /* If any communication were queued, do them in parallel */
-          if (!xbt_dynar_is_empty(cmd_to_go)) {
-            TRY {
-              xbt_dynar_dopar(cmd_to_go, do_command);
-              xbt_dynar_reset(cmd_to_go);
-            }
-            CATCH(e) {
-              SIMIX_display_process_status();
-              xbt_ex_free(e);
-            }
-            XBT_INFO("Communications all done");
-            xbt_dynar_reset(cmd_to_go);
-          }
-          XBT_INFO("Compute %.f flops", cmd->d_arg);
-          gras_cpu_burn(cmd->d_arg);
-          XBT_INFO("Done computing %.f flops", cmd->d_arg);
-          break;
-        case XBT_WORKLOAD_SEND:
-          /* Create the socket from main thread since it seems to fails when done from dopar thread */
-          get_peer_sock(cmd->str_arg);
-        case XBT_WORKLOAD_RECV:
-          /* queue communications for later realization in parallel */
-          xbt_dynar_push(cmd_to_go, &cmd);
-          break;
-        }
-      }
-    }
-    /* do in parallel any communication still queued */
-    XBT_INFO("Do %ld pending communications after end of TODO list",
-          xbt_dynar_length(cmd_to_go));
-    if (!xbt_dynar_is_empty(cmd_to_go)) {
-      xbt_dynar_dopar(cmd_to_go, do_command);
-      xbt_dynar_reset(cmd_to_go);
-    }
-  }
-
-  gras_msg_send(master, "go", NULL);
-//  amok_pm_group_leave(master, "replay");
-
-  gras_socket_close(globals->mysock);
-  xbt_dynar_free(&(globals->commands));
-  xbt_dict_free(&(globals->peers));
-  free(globals);
-
-  gras_exit();
-  return 0;
-}
diff --git a/examples/gras/replay/replay.xml b/examples/gras/replay/replay.xml
deleted file mode 100644 (file)
index 948461b..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Dodge" function="master">
-     <argument value="Montage_25.trace" /> <!-- trace file -->
-     <argument value="4500"/>            <!-- port number -->
-  </process>
-  <process host="Bescherelle" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Browne" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Croteau" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Dodge" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Ethernet" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Fafard" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Fernand" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Gaston" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Intel" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Jackson" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Jacquelin" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Jacques" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Jean_Yves" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Jill" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Jocelyne" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Juneau" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Kuenning" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Laroche" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Mathematica" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Monique" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Olivier" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Papineau" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Pronovost" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Provost" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="Stephen" function="worker"><argument value="Dodge:4500"/></process>
-  <process host="TeX" function="worker"><argument value="Dodge:4500"/></process>
-</platform>
diff --git a/examples/gras/replay/workload.h b/examples/gras/replay/workload.h
deleted file mode 100644 (file)
index 2d4372d..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Copyright (c) 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-/* This datatype stores a a trace as produced by examples/simdag/dax, or other means
- * It can be replayed in simulation with examples/msg/actions or on a real platform with
- * examples/gras/replay.
- */
-
-#ifndef XBT_WORKLOAD_H_
-#define XBT_WORKLOAD_H_
-
-#include "xbt/misc.h"
-#include "xbt/dynar.h"
-
-/* kind of elements */
-#define XBT_WORKLOAD_COMPUTE 0
-#define XBT_WORKLOAD_SEND 1
-#define XBT_WORKLOAD_RECV 2
-
-/* one command to do */
-typedef struct {
-  /* keep it in sync with function xbt_workload_declare_datadesc() */
-
-  char *who;                    /* the slave who should do it */
-  char *comment;                /* a comment placed at the end of the line, if any */
-  int action;                   /* 0: compute(darg flops); 1: send darg bytes to strarg; 2: recv darg bytes from strarg */
-  double date;                  /* when it occured when the trace was captured */
-  double d_arg;                 /* double argument, if any */
-  char *str_arg;                /* string argument, if any */
-} s_xbt_workload_elm_t, *xbt_workload_elm_t;
-
-XBT_PUBLIC(xbt_workload_elm_t) xbt_workload_elm_parse(char *line);
-XBT_PUBLIC(void) xbt_workload_elm_free(xbt_workload_elm_t cmd);
-XBT_PUBLIC(void) xbt_workload_elm_free_voidp(void *cmd);
-XBT_PUBLIC(char *) xbt_workload_elm_to_string(xbt_workload_elm_t cmd);
-XBT_PUBLIC(int) xbt_workload_elm_cmp_who_date(const void *_c1,
-                                              const void *_c2);
-XBT_PUBLIC(void) xbt_workload_sort_who_date(xbt_dynar_t c);
-XBT_PUBLIC(xbt_dynar_t) xbt_workload_parse_file(char *filename);
-
-XBT_PUBLIC(void) xbt_workload_declare_datadesc(void);
-
-
-typedef struct {
-  int size;
-  char *chunk;
-} s_xbt_workload_data_chunk_t, *xbt_workload_data_chunk_t;
-XBT_PUBLIC(xbt_workload_data_chunk_t) xbt_workload_data_chunk_new(int
-                                                                  size);
-XBT_PUBLIC(void) xbt_workload_data_chunk_free(xbt_workload_data_chunk_t c);
-
-#endif                          /* XBT_WORKLOAD_H_ */
diff --git a/examples/gras/replay/xbt_workload.c b/examples/gras/replay/xbt_workload.c
deleted file mode 100644 (file)
index f0ba47a..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-/* Copyright (c) 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-/* This datatype stores a a trace as produced by examples/simdag/dax, or other means
- * It can be replayed in simulation with examples/msg/actions or on a real platform with
- * examples/gras/replay.
- */
-
-#include "xbt/log.h"
-#include "xbt/sysdep.h"
-#include "xbt/str.h"
-#include "workload.h"
-#include "gras/datadesc.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_workload, xbt,
-                                "Workload characterisation mecanisms");
-
-
-xbt_workload_elm_t xbt_workload_elm_parse(char *line)
-{
-  xbt_workload_elm_t res = xbt_new(s_xbt_workload_elm_t, 1);
-  res->date = -1;
-  res->comment = NULL;          /* it's not enough to memset for valgrind, apparently */
-  res->who = NULL;
-  res->str_arg = NULL;
-
-  xbt_dynar_t w = xbt_str_split(line, " ");
-
-  if (xbt_dynar_is_empty(w)) {
-    free(res);
-    xbt_dynar_free(&w);
-    return NULL;
-  }
-
-  char **words = xbt_dynar_get_ptr(w, 0);
-  int i = 0;
-  if (words[i][0] == '[') {
-    sscanf(words[i] + 1, "%lg", &(res->date));
-    i++;
-  }
-  res->who = xbt_strdup(words[i++]);
-  if (!strcmp(words[i], "recv")) {
-    res->action = XBT_WORKLOAD_RECV;
-    res->str_arg = xbt_strdup(words[++i]);
-    sscanf(words[++i], "%lg", &(res->d_arg));
-
-  } else if (!strcmp(words[i], "send")) {
-    res->action = XBT_WORKLOAD_SEND;
-    res->str_arg = xbt_strdup(words[++i]);
-    sscanf(words[++i], "%lg", &(res->d_arg));
-
-  } else if (!strcmp(words[i], "compute")) {
-    res->action = XBT_WORKLOAD_COMPUTE;
-    sscanf(words[++i], "%lg", &(res->d_arg));
-  } else {
-    xbt_die("Unparsable command: %s (in %s)", words[i], line);
-  }
-  i++;
-  if (words[i] && words[i][0] == '#') {
-    res->comment = xbt_strdup(strchr(line, '#') + 1);
-  }
-
-  xbt_dynar_free(&w);
-  return res;
-}
-
-void xbt_workload_elm_free(xbt_workload_elm_t cmd)
-{
-  if (!cmd)
-    return;
-  free(cmd->who);
-  free(cmd->comment);
-  free(cmd->str_arg);
-  free(cmd);
-}
-
-void xbt_workload_elm_free_voidp(void *cmd)
-{
-  xbt_workload_elm_free(*(xbt_workload_elm_t *) cmd);
-}
-
-char *xbt_workload_elm_to_string(xbt_workload_elm_t cmd)
-{
-  char res[2048];
-  char *addon;
-  res[0] = '\0';
-  if (cmd == NULL)
-    return xbt_strdup("(null command)");
-  if (cmd->date != -1) {
-    addon = bprintf("[%f] ", cmd->date);
-    strcat(res, addon);
-    free(addon);
-  }
-  addon = bprintf("'%s' ", cmd->who);
-  strcat(res, addon);
-  free(addon);
-
-  switch (cmd->action) {
-  case XBT_WORKLOAD_COMPUTE:
-    addon = bprintf("computed %f flops", cmd->d_arg);
-    strcat(res, addon);
-    free(addon);
-    break;
-  case XBT_WORKLOAD_SEND:
-    addon = bprintf("sent %f bytes to '%s'", cmd->d_arg, cmd->str_arg);
-    strcat(res, addon);
-    free(addon);
-    break;
-  case XBT_WORKLOAD_RECV:
-    addon =
-        bprintf("received %f bytes from '%s'", cmd->d_arg, cmd->str_arg);
-    strcat(res, addon);
-    free(addon);
-    break;
-  default:
-    xbt_die("Unknown command %d in '%s...'", cmd->action, res);
-  }
-  if (cmd->comment) {
-    addon = bprintf(" (comment: %s)", cmd->comment);
-    strcat(res, addon);
-    free(addon);
-  }
-  return xbt_strdup(res);
-}
-
-int xbt_workload_elm_cmp_who_date(const void *_c1, const void *_c2)
-{
-  xbt_workload_elm_t c1 = *(xbt_workload_elm_t *) _c1;
-  xbt_workload_elm_t c2 = *(xbt_workload_elm_t *) _c2;
-  if (!c1 || !c1->who)
-    return -1;
-  if (!c2 || !c2->who)
-    return 1;
-  int r = strcmp(c1->who, c2->who);
-  if (r)
-    return r;
-  if (c1->date == c2->date)
-    return 0;
-  if (c1->date < c2->date)
-    return -1;
-  return 1;
-}
-
-void xbt_workload_sort_who_date(xbt_dynar_t c)
-{
-  qsort(xbt_dynar_get_ptr(c, 0), xbt_dynar_length(c),
-        sizeof(xbt_workload_elm_t), xbt_workload_elm_cmp_who_date);
-}
-
-xbt_dynar_t xbt_workload_parse_file(char *filename)
-{
-  FILE *file_in;
-  file_in = fopen(filename, "r");
-  xbt_assert(file_in, "cannot open tracefile '%s'", filename);
-  char *str_in = xbt_str_from_file(file_in);
-  fclose(file_in);
-  xbt_dynar_t in = xbt_str_split(str_in, "\n");
-  free(str_in);
-  xbt_dynar_t cmds =
-      xbt_dynar_new(sizeof(xbt_workload_elm_t),
-                    xbt_workload_elm_free_voidp);
-
-  unsigned int cursor;
-  char *line;
-  xbt_dynar_foreach(in, cursor, line) {
-    xbt_workload_elm_t cmd = xbt_workload_elm_parse(line);
-    if (cmd)
-      xbt_dynar_push(cmds, &cmd);
-  }
-  xbt_dynar_shrink(cmds, 0);
-  xbt_dynar_free(&in);
-  return cmds;
-}
-
-
-void xbt_workload_declare_datadesc(void)
-{
-  xbt_datadesc_type_t ddt;
-
-  ddt = xbt_datadesc_struct("s_xbt_workload_elm_t");
-  xbt_datadesc_struct_append(ddt, "who", xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_append(ddt, "comment",
-                              xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_append(ddt, "action", xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_append(ddt, "date",
-                              xbt_datadesc_by_name("double"));
-  xbt_datadesc_struct_append(ddt, "d_arg",
-                              xbt_datadesc_by_name("double"));
-  xbt_datadesc_struct_append(ddt, "str_arg",
-                              xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_close(ddt);
-
-  xbt_datadesc_ref("xbt_workload_elm_t", ddt);
-
-  ddt = xbt_datadesc_struct("s_xbt_workload_data_chunk_t");
-  xbt_datadesc_struct_append(ddt, "size", xbt_datadesc_by_name("int"));
-  xbt_datadesc_cb_field_push(ddt, "size");
-  xbt_datadesc_struct_append(ddt, "chunk",
-                              xbt_datadesc_ref_pop_arr
-                              (xbt_datadesc_by_name("char")));
-  xbt_datadesc_struct_close(ddt);
-
-  xbt_datadesc_ref("xbt_workload_data_chunk_t", ddt);
-}
-
-
-
-xbt_workload_data_chunk_t xbt_workload_data_chunk_new(int size)
-{
-  xbt_workload_data_chunk_t res = xbt_new0(s_xbt_workload_data_chunk_t, 1);
-  res->size = size - sizeof(res) - sizeof(int);
-  res->chunk = xbt_new(char, res->size);
-  return res;
-}
-
-void xbt_workload_data_chunk_free(xbt_workload_data_chunk_t c)
-{
-  free(c->chunk);
-  free(c);
-}
diff --git a/examples/gras/rpc/CMakeLists.txt b/examples/gras/rpc/CMakeLists.txt
deleted file mode 100644 (file)
index 42c9aaa..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_rpc_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_rpc_client.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_rpc_forwarder.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_rpc_server.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-add_executable(rpc_simulator ${CMAKE_CURRENT_BINARY_DIR}/_rpc_simulator.c rpc.c)
-add_executable(rpc_client    ${CMAKE_CURRENT_BINARY_DIR}/_rpc_client.c    rpc.c)
-add_executable(rpc_forwarder ${CMAKE_CURRENT_BINARY_DIR}/_rpc_forwarder.c rpc.c)
-add_executable(rpc_server    ${CMAKE_CURRENT_BINARY_DIR}/_rpc_server.c    rpc.c)
-
-add_custom_command(
-  OUTPUT
-  ${CMAKE_CURRENT_BINARY_DIR}/_rpc_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_rpc_client.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_rpc_server.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_rpc_forwarder.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/rpc.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator rpc ${CMAKE_CURRENT_SOURCE_DIR}/rpc.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(rpc_simulator simgrid pthread m )
-  target_link_libraries(rpc_client gras pthread m )
-  target_link_libraries(rpc_forwarder gras pthread m )
-  target_link_libraries(rpc_server gras pthread m )
-else(NOT WIN32)
-  target_link_libraries(rpc_simulator simgrid)
-  target_link_libraries(rpc_client gras)
-  target_link_libraries(rpc_forwarder gras)
-  target_link_libraries(rpc_server gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/rpc.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/rpc.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
diff --git a/examples/gras/rpc/rpc.c b/examples/gras/rpc/rpc.c
deleted file mode 100644 (file)
index a12da53..0000000
+++ /dev/null
@@ -1,411 +0,0 @@
-/* rpc - demo of the RPC features in GRAS                                   */
-
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(Rpc, "Messages specific to this example");
-
-/* register messages which may be sent (common to client and server) */
-static void register_messages(void)
-{
-  gras_msgtype_declare_rpc("plain ping",
-                           xbt_datadesc_by_name("int"),
-                           xbt_datadesc_by_name("int"));
-
-  gras_msgtype_declare_rpc("raise exception", NULL, NULL);
-  gras_msgtype_declare_rpc("forward exception", NULL, NULL);
-  gras_msgtype_declare("kill", NULL);
-}
-
-/* Function prototypes */
-int server(int argc, char *argv[]);
-int forwarder(int argc, char *argv[]);
-int client(int argc, char *argv[]);
-
-#define exception_msg       "Error for the client"
-#define exception_raising() THROWF(unknown_error,42,exception_msg)
-
-static void exception_catching(void)
-{
-  int gotit = 0, i;
-  xbt_ex_t e;
-
-  for (i = 0; i < 5; i++) {
-    gotit = 0;
-    TRY {
-      exception_raising();
-    }
-    CATCH(e) {
-      gotit = 1;
-      xbt_assert(e.category == unknown_error,
-                 "Got wrong category: %d (instead of %d)", e.category,
-                 unknown_error);
-      xbt_assert(e.value == 42, "Got wrong value: %d (!=42)", e.value);
-      xbt_assert(!strncmp(e.msg, exception_msg, strlen(exception_msg)),
-                 "Got wrong message: %s", e.msg);
-      xbt_ex_free(e);
-    }
-    if (!gotit) {
-      THROWF(unknown_error, 0, "Didn't got the remote exception!");
-    }
-  }
-}
-
-/* **********************************************************************
- * Client code
- * **********************************************************************/
-
-static void client_create_sockets(xbt_socket_t *toserver,
-                                  xbt_socket_t *toforwarder,
-                                  const char *srv_host, int srv_port,
-                                  const char *fwd_host, int fwd_port)
-{
-  TRY {
-    exception_catching();
-    *toserver = gras_socket_client(srv_host, srv_port);
-    *toforwarder = gras_socket_client(fwd_host, fwd_port);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Unable to connect to the server: %s");
-  }
-}
-
-int client(int argc, char *argv[])
-{
-  xbt_ex_t e;
-  xbt_socket_t toserver = NULL;        /* peer */
-  xbt_socket_t toforwarder = NULL;     /* peer */
-
-  int ping, pong, i;
-  volatile int gotit = 0;
-
-
-  const char *host = "127.0.0.1";
-  int port = 4001;
-
-  memset(&e, 0, sizeof(xbt_ex_t));
-
-  /* 1. Init the GRAS's infrastructure */
-  gras_init(&argc, argv);
-
-  /* 2. Get the server's address. The command line override defaults when specified */
-  if (argc == 5) {
-    host = argv[1];
-    port = atoi(argv[2]);
-  }
-  XBT_INFO("Launch client (server on %s:%d)", host, port);
-
-  exception_catching();
-
-  /* 3. Wait for the server & forwarder startup */
-  gras_os_sleep(2);
-
-  /* 4. Create a socket to speak to the server */
-  client_create_sockets(&toserver, &toforwarder,
-                        host, port, argv[3], atoi(argv[4]));
-  XBT_INFO("Connected to %s:%d.", host, port);
-
-
-  /* 5. Register the messages.
-     See, it doesn't have to be done completely at the beginning,
-     but only before use */
-  exception_catching();
-  register_messages();
-
-  /* 6. Keep the user informed of what's going on */
-  XBT_INFO("Connected to server which is on %s:%d",
-        xbt_socket_peer_name(toserver), xbt_socket_peer_port(toserver));
-
-  /* 7. Prepare and send the ping message to the server */
-  ping = 1234;
-  TRY {
-    exception_catching();
-    gras_msg_rpccall(toserver, 6000.0, "plain ping", &ping, &pong);
-  }
-  CATCH_ANONYMOUS {
-    gras_socket_close(toserver);
-    RETHROWF("Failed to execute a PING rpc on the server: %s");
-  }
-  exception_catching();
-
-  /* 8. Keep the user informed of what's going on, again */
-  XBT_INFO("The answer to PING(%d) on %s:%d is PONG(%d)",
-        ping,
-        xbt_socket_peer_name(toserver), xbt_socket_peer_port(toserver),
-        pong);
-
-  /* 9. Call a RPC which raises an exception (to test exception propagation) */
-  XBT_INFO("Call the exception raising RPC");
-  TRY {
-    gras_msg_rpccall(toserver, 6000.0, "raise exception", NULL, NULL);
-  }
-  CATCH(e) {
-    gotit = 1;
-    xbt_assert(e.category == unknown_error,
-                "Got wrong category: %d (instead of %d)",
-                e.category, unknown_error);
-    xbt_assert(e.value == 42, "Got wrong value: %d (!=42)", e.value);
-    xbt_assert(!strncmp(e.msg, exception_msg, strlen(exception_msg)),
-                "Got wrong message: %s", e.msg);
-    XBT_INFO
-        ("Got the expected exception when calling the exception raising RPC");
-    xbt_ex_free(e);
-  }
-
-  if (!gotit)
-    THROWF(unknown_error, 0, "Didn't got the remote exception!");
-
-  XBT_INFO("Called the exception raising RPC");
-  exception_catching();
-
-  /* doxygen_ignore */
-  for (i = 0; i < 5; i++) {
-
-    XBT_INFO("Call the exception raising RPC (i=%d)", i);
-    TRY {
-      gras_msg_rpccall(toserver, 6000.0, "raise exception", NULL, NULL);
-    }
-    CATCH(e) {
-      gotit = 1;
-      xbt_ex_free(e);
-    }
-    if (!gotit) {
-      THROWF(unknown_error, 0, "Didn't got the remote exception!");
-    }
-  }
-  /* doxygen_resume */
-
-  /* 9. Call a RPC which raises an exception (to test that exception propagation works) */
-  for (i = 0; i < 5; i++) {
-    XBT_INFO("Call the exception raising RPC on the forwarder (i=%d)", i);
-    TRY {
-      gras_msg_rpccall(toforwarder, 6000.0, "forward exception", NULL,
-                       NULL);
-    }
-    CATCH(e) {
-      gotit = 1;
-      xbt_assert(e.value == 42, "Got wrong value: %d (!=42)", e.value);
-      xbt_assert(!strncmp(e.msg, exception_msg, strlen(exception_msg)),
-                 "Got wrong message: %s", e.msg);
-      xbt_assert(e.category == unknown_error,
-                 "Got wrong category: %d (instead of %d)",
-                 e.category, unknown_error);
-      XBT_INFO
-        ("Got the expected exception when calling the exception raising RPC");
-      xbt_ex_free(e);
-    }
-    if (!gotit) {
-      THROWF(unknown_error, 0, "Didn't got the remote exception!");
-    }
-    exception_catching();
-  }
-
-  XBT_INFO("Ask %s:%d to die", xbt_socket_peer_name(toforwarder),
-        xbt_socket_peer_port(toforwarder));
-  gras_msg_send(toforwarder, "kill", NULL);
-  XBT_INFO("Ask %s:%d to die", xbt_socket_peer_name(toserver),
-        xbt_socket_peer_port(toserver));
-  gras_msg_send(toserver, "kill", NULL);
-
-  /* 11. Cleanup the place before leaving */
-  gras_socket_close(toserver);
-  gras_socket_close(toforwarder);
-  XBT_INFO("Done.");
-  gras_exit();
-  return 0;
-}                               /* end_of_client */
-
-
-/* **********************************************************************
- * Forwarder code
- * **********************************************************************/
-typedef struct {
-  xbt_socket_t server;
-  int done;
-} s_forward_data_t, *forward_data_t;
-
-static int forwarder_cb_kill(gras_msg_cb_ctx_t ctx, void *payload_data)
-{
-  forward_data_t fdata;
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-  XBT_INFO("Asked to die by %s:%d", xbt_socket_peer_name(expeditor),
-        xbt_socket_peer_port(expeditor));
-  fdata = gras_userdata_get();
-  fdata->done = 1;
-  return 0;
-}
-
-static int forwarder_cb_forward_ex(gras_msg_cb_ctx_t ctx,
-                                   void *payload_data)
-{
-  forward_data_t fdata = gras_userdata_get();
-
-  XBT_INFO("Forward a request");
-  gras_msg_rpccall(fdata->server, 60, "raise exception", NULL, NULL);
-  return 0;
-}
-
-int forwarder(int argc, char *argv[])
-{
-  xbt_socket_t mysock;
-  int port;
-  forward_data_t fdata;
-
-  gras_init(&argc, argv);
-
-  xbt_assert(argc == 4);
-
-  fdata = gras_userdata_new(s_forward_data_t);
-  fdata->done = 0;
-  port = atoi(argv[1]);
-
-  XBT_INFO("Launch forwarder (port=%d)", port);
-  mysock = gras_socket_server(port);
-
-  gras_os_sleep(1);             /* wait for the server to be ready */
-  fdata->server = gras_socket_client(argv[2], atoi(argv[3]));
-
-  register_messages();
-  gras_cb_register("forward exception", &forwarder_cb_forward_ex);
-  gras_cb_register("kill", &forwarder_cb_kill);
-
-  while (!fdata->done) {
-    gras_msg_handle(600.0);
-  }
-
-  gras_socket_close(mysock);
-  gras_socket_close(fdata->server);
-  free(fdata);
-  XBT_INFO("Done.");
-  gras_exit();
-  return 0;
-}
-
-/* **********************************************************************
- * Server code
- * **********************************************************************/
-typedef struct {
-  xbt_socket_t server;
-  int done;
-} s_server_data_t, *server_data_t;
-
-static int server_cb_kill(gras_msg_cb_ctx_t ctx, void *payload_data)
-{
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-  server_data_t sdata;
-
-  XBT_INFO("Asked to die by %s:%d", xbt_socket_peer_name(expeditor),
-        xbt_socket_peer_port(expeditor));
-
-  sdata = gras_userdata_get();
-  sdata->done = 1;
-  return 0;
-}
-
-static int server_cb_raise_ex(gras_msg_cb_ctx_t ctx, void *payload_data)
-{
-  exception_raising();
-  return 0;
-}
-
-static int server_cb_ping(gras_msg_cb_ctx_t ctx, void *payload_data)
-{
-
-  /* 1. Get the payload into the msg variable, and retrieve who called us */
-  int msg = *(int *) payload_data;
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-
-  /* 2. Log which client connected */
-  XBT_INFO("Got message PING(%d) from %s:%d",
-        msg,
-        xbt_socket_peer_name(expeditor),
-        xbt_socket_peer_port(expeditor));
-
-  /* 4. Change the value of the msg variable */
-  msg = 4321;
-
-  /* 5. Return as result */
-  gras_msg_rpcreturn(6000, ctx, &msg);
-  XBT_INFO("Answered with PONG(4321)");
-
-  /* 6. Cleanups, if any */
-
-  /* 7. Tell GRAS that we consummed this message */
-  return 0;
-}                               /* end_of_server_cb_ping */
-
-
-int server(int argc, char *argv[])
-{
-  xbt_socket_t mysock;
-  server_data_t sdata;
-
-  int port = 4001;
-
-  /* 1. Init the GRAS infrastructure */
-  gras_init(&argc, argv);
-
-  /* 2. Get the port I should listen on from the command line, if specified */
-  if (argc == 2)
-    port = atoi(argv[1]);
-
-  sdata = gras_userdata_new(s_server_data_t);
-  sdata->done = 0;
-
-  XBT_INFO("Launch server (port=%d)", port);
-
-  /* 3. Create my master socket */
-  mysock = gras_socket_server(port);
-
-  /* 4. Register the known messages and register my callback */
-  register_messages();
-  gras_cb_register("plain ping", &server_cb_ping);
-  gras_cb_register("raise exception", &server_cb_raise_ex);
-  gras_cb_register("kill", &server_cb_kill);
-
-  XBT_INFO("Listening on port %d", xbt_socket_my_port(mysock));
-
-  /* 5. Wait for the ping incoming messages */
-
-  /** \bug if the server is gone before the forwarder tries to connect,
-     it dies awfully with the following message. The problem stands somewhere
-     at the interface between the xbt_socket_t and the msg mess. There is thus
-     no way for me to dive into this before this interface is rewritten
-==15875== Invalid read of size 4
-==15875==    at 0x408B805: find_port (transport_plugin_sg.c:68)
-==15875==    by 0x408BD64: gras_trp_sg_socket_client (transport_plugin_sg.c:115)
-==15875==    by 0x404A38B: gras_socket_client_ext (transport.c:255)
-==15875==    by 0x404A605: gras_socket_client (transport.c:288)
-==15875==    by 0x804B49D: forwarder (rpc.c:245)
-==15875==    by 0x80491FB: launch_forwarder (_rpc_simulator.c:52)
-==15875==    by 0x406780B: __context_wrapper (context.c:164)
-==15875==    by 0x41A6CB3: pthread_start_thread (manager.c:310)
-==15875==    by 0x42AA549: clone (clone.S:119)
-==15875==  Address 0x433B49C is 44 bytes inside a block of size 48 free'd
-==15875==    at 0x401CF46: free (vg_replace_malloc.c:235)
-==15875==    by 0x408F1FA: gras_process_exit (sg_process.c:117)
-==15875==    by 0x4049386: gras_exit (gras.c:64)
-==15875==    by 0x804B936: server (rpc.c:345)
-==15875==    by 0x80492B1: launch_server (_rpc_simulator.c:69)
-==15875==    by 0x406780B: __context_wrapper (context.c:164)
-==15875==    by 0x41A6CB3: pthread_start_thread (manager.c:310)
-==15875==    by 0x42AA549: clone (clone.S:119)
-  */
-  while (!sdata->done) {
-    gras_msg_handle(600.0);
-    exception_catching();
-  }
-
-  /* 8. Free the allocated resources, and shut GRAS down */
-  free(sdata);
-  gras_socket_close(mysock);
-  XBT_INFO("Done.");
-  gras_exit();
-
-  return 0;
-}                               /* end_of_server */
diff --git a/examples/gras/rpc/rpc.xml b/examples/gras/rpc/rpc.xml
deleted file mode 100644 (file)
index bb4a0cd..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Tremblay" function="server">
-     <argument value="4000"/>       <!-- port number -->
-  </process>
-
-  <process host="Ginette" function="forwarder">
-     <argument value="4000"/>       <!-- self port number -->
-     <argument value="Tremblay"/>   <!-- server host -->
-     <argument value="4000"/>       <!-- server port number -->
-  </process>
-
-  <process host="Fafard" function="client">
-     <argument value="Tremblay"/>   <!-- server host -->
-     <argument value="4000"/>       <!-- server port number -->
-     <argument value="Ginette"/>   <!-- forwarder host -->
-     <argument value="4000"/>       <!-- forwarder port number -->
-  </process>
-</platform>
diff --git a/examples/gras/rpc/test_rl.tesh b/examples/gras/rpc/test_rl.tesh
deleted file mode 100755 (executable)
index 394c8fd..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-! timeout 10
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./rpc_server$EXEEXT 4202 --log=root.fmt:%m%n $@
-> Launch server (port=4202)
-> Listening on port 4202
-> Got message PING(1234) from 127.0.0.1:5002
-> Answered with PONG(4321)
-> Asked to die by 127.0.0.1:5002
-> Done.
-> Exiting GRAS
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./rpc_forwarder$EXEEXT 4203 127.0.0.1 4202 --log=root.fmt:%m%n $@
-> Launch forwarder (port=4203)
-> Forward a request
-> Forward a request
-> Forward a request
-> Forward a request
-> Forward a request
-> Asked to die by 127.0.0.1:5002
-> Done.
-> Exiting GRAS
-
-# give the server and the forwarder  a chance to acquire the expected port numbers
-$ $SG_TEST_EXENV sleep 1
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_EXENV ./rpc_client$EXEEXT 127.0.0.1 4202 127.0.0.1 4203 --log=root.fmt:%m%n $@
-> Launch client (server on 127.0.0.1:4202)
-> Connected to 127.0.0.1:4202.
-> Connected to server which is on 127.0.0.1:4202
-> The answer to PING(1234) on 127.0.0.1:4202 is PONG(4321)
-> Call the exception raising RPC
-> Got the expected exception when calling the exception raising RPC
-> Called the exception raising RPC
-> Call the exception raising RPC (i=0)
-> Call the exception raising RPC (i=1)
-> Call the exception raising RPC (i=2)
-> Call the exception raising RPC (i=3)
-> Call the exception raising RPC (i=4)
-> Call the exception raising RPC on the forwarder (i=0)
-> Got the expected exception when calling the exception raising RPC
-> Call the exception raising RPC on the forwarder (i=1)
-> Got the expected exception when calling the exception raising RPC
-> Call the exception raising RPC on the forwarder (i=2)
-> Got the expected exception when calling the exception raising RPC
-> Call the exception raising RPC on the forwarder (i=3)
-> Got the expected exception when calling the exception raising RPC
-> Call the exception raising RPC on the forwarder (i=4)
-> Got the expected exception when calling the exception raising RPC
-> Ask 127.0.0.1:4203 to die
-> Ask 127.0.0.1:4202 to die
-> Done.
-> Exiting GRAS
diff --git a/examples/gras/rpc/test_sg_32.tesh b/examples/gras/rpc/test_sg_32.tesh
deleted file mode 100644 (file)
index 4de2b24..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-#! ./tesh
-
-# There is no timestamp in this test, because we exchange exceptions,
-# which contain not only the filename (which could change in case of
-# VPATH builds), but also the function name (which changes with the
-# optimization level: if inlining, gcc changes it).
-
-! timeout 10
-! output sort
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./rpc_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/rpc.xml "--log=root.fmt:[0]%e(%i:%P@%h)%e%m%n"
-> [0] (1:server@Tremblay) Launch server (port=4000)
-> [0] (1:server@Tremblay) Listening on port 4000
-> [0] (1:server@Tremblay) Got message PING(1234) from Fafard:5000
-> [0] (1:server@Tremblay) Answered with PONG(4321)
-> [0] (1:server@Tremblay) Asked to die by Fafard:5000
-> [0] (1:server@Tremblay) Done.
-> [0] (1:server@Tremblay) Exiting GRAS
-> [0] (2:forwarder@Ginette) Launch forwarder (port=4000)
-> [0] (2:forwarder@Ginette) Forward a request
-> [0] (2:forwarder@Ginette) Forward a request
-> [0] (2:forwarder@Ginette) Forward a request
-> [0] (2:forwarder@Ginette) Forward a request
-> [0] (2:forwarder@Ginette) Forward a request
-> [0] (2:forwarder@Ginette) Asked to die by Fafard:5000
-> [0] (2:forwarder@Ginette) Done.
-> [0] (2:forwarder@Ginette) Exiting GRAS
-> [0] (3:client@Fafard) Launch client (server on Tremblay:4000)
-> [0] (3:client@Fafard) Connected to Tremblay:4000.
-> [0] (3:client@Fafard) Connected to server which is on Tremblay:4000
-> [0] (3:client@Fafard) The answer to PING(1234) on Tremblay:4000 is PONG(4321)
-> [0] (3:client@Fafard) Call the exception raising RPC
-> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC
-> [0] (3:client@Fafard) Called the exception raising RPC
-> [0] (3:client@Fafard) Call the exception raising RPC (i=0)
-> [0] (3:client@Fafard) Call the exception raising RPC (i=1)
-> [0] (3:client@Fafard) Call the exception raising RPC (i=2)
-> [0] (3:client@Fafard) Call the exception raising RPC (i=3)
-> [0] (3:client@Fafard) Call the exception raising RPC (i=4)
-> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=0)
-> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC
-> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=1)
-> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC
-> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=2)
-> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC
-> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=3)
-> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC
-> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=4)
-> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC
-> [0] (3:client@Fafard) Ask Ginette:4000 to die
-> [0] (3:client@Fafard) Ask Tremblay:4000 to die
-> [0] (3:client@Fafard) Done.
-> [0] (3:client@Fafard) Exiting GRAS
diff --git a/examples/gras/rpc/test_sg_64.tesh b/examples/gras/rpc/test_sg_64.tesh
deleted file mode 100755 (executable)
index 4de2b24..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-#! ./tesh
-
-# There is no timestamp in this test, because we exchange exceptions,
-# which contain not only the filename (which could change in case of
-# VPATH builds), but also the function name (which changes with the
-# optimization level: if inlining, gcc changes it).
-
-! timeout 10
-! output sort
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./rpc_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/rpc.xml "--log=root.fmt:[0]%e(%i:%P@%h)%e%m%n"
-> [0] (1:server@Tremblay) Launch server (port=4000)
-> [0] (1:server@Tremblay) Listening on port 4000
-> [0] (1:server@Tremblay) Got message PING(1234) from Fafard:5000
-> [0] (1:server@Tremblay) Answered with PONG(4321)
-> [0] (1:server@Tremblay) Asked to die by Fafard:5000
-> [0] (1:server@Tremblay) Done.
-> [0] (1:server@Tremblay) Exiting GRAS
-> [0] (2:forwarder@Ginette) Launch forwarder (port=4000)
-> [0] (2:forwarder@Ginette) Forward a request
-> [0] (2:forwarder@Ginette) Forward a request
-> [0] (2:forwarder@Ginette) Forward a request
-> [0] (2:forwarder@Ginette) Forward a request
-> [0] (2:forwarder@Ginette) Forward a request
-> [0] (2:forwarder@Ginette) Asked to die by Fafard:5000
-> [0] (2:forwarder@Ginette) Done.
-> [0] (2:forwarder@Ginette) Exiting GRAS
-> [0] (3:client@Fafard) Launch client (server on Tremblay:4000)
-> [0] (3:client@Fafard) Connected to Tremblay:4000.
-> [0] (3:client@Fafard) Connected to server which is on Tremblay:4000
-> [0] (3:client@Fafard) The answer to PING(1234) on Tremblay:4000 is PONG(4321)
-> [0] (3:client@Fafard) Call the exception raising RPC
-> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC
-> [0] (3:client@Fafard) Called the exception raising RPC
-> [0] (3:client@Fafard) Call the exception raising RPC (i=0)
-> [0] (3:client@Fafard) Call the exception raising RPC (i=1)
-> [0] (3:client@Fafard) Call the exception raising RPC (i=2)
-> [0] (3:client@Fafard) Call the exception raising RPC (i=3)
-> [0] (3:client@Fafard) Call the exception raising RPC (i=4)
-> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=0)
-> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC
-> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=1)
-> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC
-> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=2)
-> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC
-> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=3)
-> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC
-> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=4)
-> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC
-> [0] (3:client@Fafard) Ask Ginette:4000 to die
-> [0] (3:client@Fafard) Ask Tremblay:4000 to die
-> [0] (3:client@Fafard) Done.
-> [0] (3:client@Fafard) Exiting GRAS
diff --git a/examples/gras/spawn/CMakeLists.txt b/examples/gras/spawn/CMakeLists.txt
deleted file mode 100644 (file)
index d711cd8..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_spawn_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_spawn_server.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-add_executable(spawn_simulator ${CMAKE_CURRENT_BINARY_DIR}/_spawn_simulator.c ${CMAKE_CURRENT_SOURCE_DIR}/spawn.c)
-add_executable(spawn_server    ${CMAKE_CURRENT_BINARY_DIR}/_spawn_server.c ${CMAKE_CURRENT_SOURCE_DIR}/spawn.c)
-
-add_custom_command(
-  OUTPUT
-  ${CMAKE_CURRENT_BINARY_DIR}/_spawn_server.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_spawn_simulator.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/spawn.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator spawn ${CMAKE_CURRENT_SOURCE_DIR}/spawn.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(spawn_simulator simgrid pthread m )
-  target_link_libraries(spawn_server gras pthread m )
-else(NOT WIN32)
-  target_link_libraries(spawn_simulator simgrid)
-  target_link_libraries(spawn_server gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/spawn.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/spawn.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/spawn.h
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
diff --git a/examples/gras/spawn/spawn.c b/examples/gras/spawn/spawn.c
deleted file mode 100644 (file)
index f2d74b1..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-/* spawn - demo of the gras_agent_spawn function                            */
-
-/* The server process wants to compute all prime numbers between 0 and maxint.
-   For that, it spawns amount of child processes and communicate with them
-    through 2 queues (one for the things to do, and another for the things done).
-   Beware, using sockets to speak between main thread and spawned agent
-     is unreliable because they share the same incoming listener thread. */
-
-/* Copyright (c) 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/log.h"
-#include "xbt/strbuff.h"
-#include "gras.h"
-XBT_LOG_NEW_DEFAULT_CATEGORY(Spawn, "Messages specific to this example");
-
-/* defines an interval to be searched */
-typedef struct {
-  int min, max;
-  xbt_dynar_t primes;
-} s_work_chunk_t,*work_chunk_t;
-xbt_queue_t todo; /* The queue in which the server puts the work to do */
-xbt_queue_t done; /* the queue in which the workers puts the result of their work; */
-
-int worker(int argc, char *argv[]);
-int worker(int argc, char *argv[]) {
-  work_chunk_t chunk;
-  int moretodo = 1;
-  while (moretodo) {
-    xbt_ex_t e;
-    TRY {
-      xbt_queue_shift_timed(todo,&chunk,0);
-    }
-    CATCH(e) {
-      if (e.category != timeout_error) {
-        RETHROW;
-      }
-      moretodo = 0;
-    }
-    if (!moretodo)
-      break; // Do not break from within the CATCH, exceptions don't like it.
-
-    XBT_INFO("Got [%d;%d] to do",chunk->min,chunk->max);
-    GRAS_BENCH_ALWAYS_BEGIN();
-    int i;
-    for (i=chunk->min;i<chunk->max;i++) {
-      int j;
-      for (j=2;j<i;j++) {
-        if (i%j == 0) // not prime: j divides i perfectly
-          break;
-      }
-      if (j==i) // no divisor found: that's prime
-        xbt_dynar_push(chunk->primes,&i);
-    }
-    GRAS_BENCH_ALWAYS_END();
-    xbt_queue_push(done,&chunk);
-  }
-  XBT_INFO("No more work for me; bailing out");
-
-  return 0;
-}
-
-/* ********************************************************************** */
-/*  The server */
-/* ********************************************************************** */
-int server(int argc, char *argv[]);
-int server(int argc, char *argv[])
-{
-  int maxint = 1000;
-  int perchunk = 50;
-  int child_amount = 5;
-  char **worker_args;
-  int i;
-  work_chunk_t chunk;
-
-  gras_init(&argc, argv);
-
-  todo = xbt_queue_new(-1,sizeof(work_chunk_t));
-  done = xbt_queue_new(-1,sizeof(work_chunk_t));
-
-
-  XBT_INFO("Prepare some work");
-  for (i=0;i<maxint/perchunk;i++) {
-    chunk = xbt_new0(s_work_chunk_t,1);
-    chunk->min = i*perchunk;
-    chunk->max = (i+1)*perchunk;
-    chunk->primes = xbt_dynar_new(sizeof(int),NULL);
-    xbt_queue_push(todo,&chunk);
-  }
-
-  XBT_INFO("Spawn the kids");
-  for (i = 0; i < child_amount; i++) {
-    char *name = bprintf("child%d",i);
-    worker_args = xbt_new0(char *, 2);
-    worker_args[0] = xbt_strdup("child");
-    worker_args[1] = NULL;
-    gras_agent_spawn(name, worker, 1, worker_args, NULL);
-    free(name);
-  }
-
-  XBT_INFO("Fetch their answers");
-  for (i=0;i<maxint/perchunk;i++) {
-    work_chunk_t chunk;
-    xbt_strbuff_t buff = xbt_strbuff_new();
-    int first=1;
-    unsigned int cursor;
-    int data;
-    xbt_queue_pop(done,&chunk);
-    xbt_dynar_foreach(chunk->primes,cursor,data) {
-      char number[100];
-      sprintf(number,"%d",data);
-      if (first)
-        first = 0;
-      else
-        xbt_strbuff_append(buff,",");
-      xbt_strbuff_append(buff,number);
-    }
-    XBT_INFO("Primes in [%d,%d]: %s",chunk->min,chunk->max,buff->data);
-    xbt_strbuff_free(buff);
-  }
-  gras_os_sleep(.1);/* Let the childs detect that there is nothing more to do */
-  xbt_queue_free(&todo);
-  xbt_queue_free(&done);
-
-  gras_exit();
-
-  return 0;
-}
diff --git a/examples/gras/spawn/spawn.h b/examples/gras/spawn/spawn.h
deleted file mode 100644 (file)
index e08d91a..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* spawn - demo of the gras_actor_spawn function                            */
-
-/* Copyright (c) 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef SPAWN_COMMON_H
-#define SPAWN_COMMON_H
-
-#include "gras.h"
-
-/* register messages which may be sent (common to client and server) */
-void spawn_register_messages(void);
-
-/* Function prototypes */
-int father(int argc, char *argv[]);
-int child(int argc, char *argv[]);
-
-#endif
diff --git a/examples/gras/spawn/spawn.xml b/examples/gras/spawn/spawn.xml
deleted file mode 100644 (file)
index dca9e59..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Tremblay" function="server">
-     <argument value="100"/>        <!-- end of the search interval -->
-     <argument value="5"/>          <!-- number of childs -->
-  </process>
-</platform>
diff --git a/examples/gras/spawn/test_rl.tesh b/examples/gras/spawn/test_rl.tesh
deleted file mode 100755 (executable)
index d5a1a90..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-
-! output ignore
-$ $SG_TEST_ENV ./spawn_server$EXEEXT --log=root.fmt=%m%n
diff --git a/examples/gras/spawn/test_sg_32.tesh b/examples/gras/spawn/test_sg_32.tesh
deleted file mode 100755 (executable)
index adea079..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-p Runs the 'spawn' test within the simulator (simulation times valid for 32bits architectures)
-
-! output ignore
-$ $SG_TEST_EXENV ./spawn_simulator${EXEEXT:=} ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/spawn.xml
diff --git a/examples/gras/spawn/test_sg_64.tesh b/examples/gras/spawn/test_sg_64.tesh
deleted file mode 100755 (executable)
index ae99f98..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-p Runs the 'spawn' test within the simulator (simulation times valid for 64bits architectures)
-
-! output ignore
-$ $SG_TEST_EXENV ./spawn_simulator${EXEEXT:=} ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/spawn.xml
diff --git a/examples/gras/synchro/CMakeLists.txt b/examples/gras/synchro/CMakeLists.txt
deleted file mode 100644 (file)
index 3490e46..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_synchro_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_synchro_philosopher.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-add_executable(synchro_simulator   ${CMAKE_CURRENT_BINARY_DIR}/_synchro_simulator.c ${CMAKE_CURRENT_SOURCE_DIR}/philosopher.c)
-add_executable(synchro_philosopher ${CMAKE_CURRENT_BINARY_DIR}/_synchro_philosopher.c ${CMAKE_CURRENT_SOURCE_DIR}/philosopher.c)
-
-add_custom_command(
-  OUTPUT
-  ${CMAKE_CURRENT_BINARY_DIR}/_synchro_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_synchro_philosopher.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/synchro.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator synchro ${CMAKE_CURRENT_SOURCE_DIR}/synchro.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(synchro_simulator simgrid pthread m )
-  target_link_libraries(synchro_philosopher gras pthread m )
-else(NOT WIN32)
-  target_link_libraries(synchro_simulator simgrid)
-  target_link_libraries(synchro_philosopher gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/synchro.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/philosopher.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
diff --git a/examples/gras/synchro/philosopher.c b/examples/gras/synchro/philosopher.c
deleted file mode 100644 (file)
index 726f6b5..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-/* philosopher - classical dinning philosopher as a demo xbt syncro stuff   */
-
-/* Copyright (c) 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
-#include "xbt/synchro.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(philo, "Logs of this example");
-
-
-/** Philosopher logic **/
-int lunch_amount = 10;
-int philosopher_amount;
-
-xbt_mutex_t mutex;
-xbt_cond_t *forks;
-
-#define THINKING 0
-#define EATING 1
-int *state;
-
-int *id;                        /* to pass a pointer to the threads without race condition */
-
-static void pickup(int id, int lunch)
-{
-  XBT_INFO("Thread %d gets hungry (lunch #%d)", id, lunch);
-  xbt_mutex_acquire(mutex);
-  while (state[(id + (philosopher_amount - 1)) % philosopher_amount] ==
-         EATING || state[(id + 1) % philosopher_amount] == EATING) {
-    xbt_cond_wait(forks[id], mutex);
-  }
-
-  state[id] = EATING;
-  xbt_assert(state[(id + (philosopher_amount - 1)) % philosopher_amount]
-              == THINKING
-              && state[(id + 1) % philosopher_amount] == THINKING,
-              "Philosopher %d eats at the same time that one of its neighbors!!!",
-              id);
-
-  xbt_mutex_release(mutex);
-  XBT_INFO("Thread %d eats", id);
-}
-
-static void putdown(int id)
-{
-  XBT_INFO("Thread %d is full", id);
-  xbt_mutex_acquire(mutex);
-  state[id] = THINKING;
-  xbt_cond_signal(forks
-                  [(id + (philosopher_amount - 1)) % philosopher_amount]);
-  xbt_cond_signal(forks[(id + 1) % philosopher_amount]);
-
-  xbt_mutex_release(mutex);
-  XBT_INFO("Thread %d thinks", id);
-}
-
-/*
- * Some additionnal code to let the father wait the childs
- */
-xbt_mutex_t mut_end;
-xbt_cond_t cond_end;
-int running_threads;
-
-xbt_mutex_t dead_end;
-
-/* Code ran by each thread */
-static void philo_thread(void *arg)
-{
-  int id = *(int *) arg;
-  int i;
-
-  for (i = 0; i < lunch_amount; i++) {
-    pickup(id, i);
-    gras_os_sleep(id / 100.0);  /* each philosopher sleeps and eat a time related to its ID */
-    putdown(id);
-    gras_os_sleep(id / 100.0);
-  }
-
-  xbt_mutex_acquire(mut_end);
-  running_threads--;
-  xbt_cond_signal(cond_end);
-  xbt_mutex_release(mut_end);
-
-  /* Enter an endless loop to test the killing facilities */
-  XBT_INFO
-      ("Thread %d tries to enter the dead-end; hopefully, the master will cancel it",
-       id);
-  xbt_mutex_acquire(dead_end);
-  XBT_INFO("Oops, thread %d reached the dead-end. Cancelation failed", id);
-}
-
-int philosopher(int argc, char *argv[]);
-int philosopher(int argc, char *argv[])
-{
-  int i;
-  xbt_thread_t *philosophers;
-
-  gras_init(&argc, argv);
-  xbt_assert(argc >= 2,
-              "This program expects one argument (the amount of philosophers)");
-
-  /* initializations of the philosopher mecanisms */
-  philosopher_amount = atoi(argv[1]);
-  state = xbt_new0(int, philosopher_amount);
-  id = xbt_new0(int, philosopher_amount);
-  forks = xbt_new(xbt_cond_t, philosopher_amount);
-  philosophers = xbt_new(xbt_thread_t, philosopher_amount);
-
-  mutex = xbt_mutex_init();
-  for (i = 0; i < philosopher_amount; i++) {
-    state[i] = THINKING;
-    id[i] = i;
-    forks[i] = xbt_cond_init();
-  }
-
-  /* setup the ending mecanism */
-  running_threads = philosopher_amount;
-  cond_end = xbt_cond_init();
-  mut_end = xbt_mutex_init();
-  dead_end = xbt_mutex_init();
-  xbt_mutex_acquire(dead_end);
-
-  XBT_INFO("Spawn the %d threads (%d lunches scheduled)", philosopher_amount,
-        lunch_amount);
-  /* spawn threads */
-  for (i = 0; i < philosopher_amount; i++) {
-    char *name = bprintf("thread %d", i);
-    philosophers[i] =
-        xbt_thread_create(name, philo_thread, &id[i],
-                          0 /*not joinable */ );
-    free(name);
-  }
-
-  /* wait for them */
-  xbt_mutex_acquire(mut_end);
-  while (running_threads)
-    xbt_cond_wait(cond_end, mut_end);
-  xbt_mutex_release(mut_end);
-
-  XBT_INFO("Cancel all childs");
-  /* nuke them threads */
-  for (i = 0; i < philosopher_amount; i++) {
-    xbt_thread_cancel(philosophers[i]);
-  }
-
-  xbt_mutex_release(dead_end);
-  gras_exit();
-  return 0;
-}
diff --git a/examples/gras/synchro/synchro.xml b/examples/gras/synchro/synchro.xml
deleted file mode 100644 (file)
index ea9ac4f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Tremblay" function="philosopher">
-     <argument value="5"/>          <!-- amount of pals to create -->
-  </process>
-</platform>
diff --git a/examples/gras/synchro/test_rl.tesh b/examples/gras/synchro/test_rl.tesh
deleted file mode 100755 (executable)
index 8805e7b..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-
-! output display
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_ENV ./synchro_philosopher${EXEEXT:=} 4 --log=root.fmt=%m%n
diff --git a/examples/gras/synchro/test_sg_32.tesh b/examples/gras/synchro/test_sg_32.tesh
deleted file mode 100644 (file)
index 993d90a..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-#! ./tesh
-p Runs the 'philosopher' test within the simulator
-
-! output sort 28
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./synchro_simulator${EXEEXT:=} ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/synchro.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (1:philosopher@Tremblay) Spawn the 5 threads (10 lunches scheduled)
-> [  0.000000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #0)
-> [  0.000000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.000000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.000000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.000000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #1)
-> [  0.000000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #0)
-> [  0.000000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #0)
-> [  0.000000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.000000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #0)
-> [  0.000000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #0)
-> [  0.000000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.020000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.020000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.020000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.030000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.030000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #2)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #3)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #4)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #5)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #6)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #7)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #8)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #9)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 tries to enter the dead-end; hopefully, the master will cancel it
-> [  0.040000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #1)
-> [  0.040000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #1)
-> [  0.040000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.040000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.040000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.060000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.060000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.060000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.060000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.070000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.070000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.080000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #2)
-> [  0.080000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.080000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #2)
-> [  0.080000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #1)
-> [  0.090000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.090000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.090000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.090000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.090000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.090000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.100000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #3)
-> [  0.110000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.110000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.110000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.120000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.120000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.120000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #1)
-> [  0.130000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #4)
-> [  0.130000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.130000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #3)
-> [  0.130000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.130000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.130000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.140000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.140000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.150000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #5)
-> [  0.150000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.160000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.160000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.160000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.160000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.160000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.170000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #6)
-> [  0.170000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #2)
-> [  0.170000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.180000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.180000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.180000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.190000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.190000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.190000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #2)
-> [  0.200000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #7)
-> [  0.200000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #4)
-> [  0.200000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.210000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.210000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.220000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.220000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.220000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.220000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.230000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.230000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.240000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #8)
-> [  0.240000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.240000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #5)
-> [  0.250000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.250000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.250000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.250000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.250000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.250000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #3)
-> [  0.250000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.260000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #9)
-> [  0.270000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.270000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.270000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.280000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.280000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.280000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #3)
-> [  0.290000] (1:thread 1@Tremblay) Thread 1 tries to enter the dead-end; hopefully, the master will cancel it
-> [  0.290000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #6)
-> [  0.290000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.290000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.290000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.310000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.310000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.310000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.330000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #7)
-> [  0.330000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #4)
-> [  0.340000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.340000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.340000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.340000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.360000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.360000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.370000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #4)
-> [  0.380000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #8)
-> [  0.380000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.380000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.380000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.400000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.400000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.400000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.420000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #9)
-> [  0.420000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #5)
-> [  0.430000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.430000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.430000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.430000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.450000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.450000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.460000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #5)
-> [  0.470000] (1:thread 2@Tremblay) Thread 2 tries to enter the dead-end; hopefully, the master will cancel it
-> [  0.470000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.470000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.470000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.500000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.500000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.510000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #6)
-> [  0.510000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.530000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #6)
-> [  0.550000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.550000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.550000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.580000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.580000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.590000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #7)
-> [  0.590000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.610000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #7)
-> [  0.630000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.630000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.630000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.660000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.660000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.670000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #8)
-> [  0.670000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.690000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #8)
-> [  0.710000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.710000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.710000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.740000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.740000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.750000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #9)
-> [  0.750000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.770000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #9)
-> [  0.790000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.790000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.790000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.820000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.820000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.830000] (1:thread 4@Tremblay) Thread 4 tries to enter the dead-end; hopefully, the master will cancel it
-> [  0.850000] (1:philosopher@Tremblay) Cancel all childs
-> [  0.850000] (1:philosopher@Tremblay) Exiting GRAS
-> [  0.850000] (1:thread 3@Tremblay) Thread 3 tries to enter the dead-end; hopefully, the master will cancel it
diff --git a/examples/gras/synchro/test_sg_64.tesh b/examples/gras/synchro/test_sg_64.tesh
deleted file mode 100755 (executable)
index 993d90a..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-#! ./tesh
-p Runs the 'philosopher' test within the simulator
-
-! output sort 28
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./synchro_simulator${EXEEXT:=} ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/synchro.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (1:philosopher@Tremblay) Spawn the 5 threads (10 lunches scheduled)
-> [  0.000000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #0)
-> [  0.000000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.000000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.000000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.000000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #1)
-> [  0.000000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #0)
-> [  0.000000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #0)
-> [  0.000000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.000000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #0)
-> [  0.000000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #0)
-> [  0.000000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.020000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.020000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.020000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.030000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.030000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #2)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #3)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #4)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #5)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #6)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #7)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #8)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 gets hungry (lunch #9)
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 eats
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 is full
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 thinks
-> [  0.040000] (1:thread 0@Tremblay) Thread 0 tries to enter the dead-end; hopefully, the master will cancel it
-> [  0.040000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #1)
-> [  0.040000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #1)
-> [  0.040000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.040000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.040000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.060000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.060000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.060000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.060000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.070000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.070000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.080000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #2)
-> [  0.080000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.080000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #2)
-> [  0.080000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #1)
-> [  0.090000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.090000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.090000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.090000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.090000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.090000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.100000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #3)
-> [  0.110000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.110000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.110000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.120000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.120000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.120000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #1)
-> [  0.130000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #4)
-> [  0.130000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.130000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #3)
-> [  0.130000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.130000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.130000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.140000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.140000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.150000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #5)
-> [  0.150000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.160000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.160000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.160000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.160000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.160000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.170000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #6)
-> [  0.170000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #2)
-> [  0.170000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.180000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.180000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.180000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.190000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.190000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.190000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #2)
-> [  0.200000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #7)
-> [  0.200000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #4)
-> [  0.200000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.210000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.210000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.220000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.220000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.220000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.220000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.230000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.230000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.240000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #8)
-> [  0.240000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.240000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #5)
-> [  0.250000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.250000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.250000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.250000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.250000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.250000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #3)
-> [  0.250000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.260000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #9)
-> [  0.270000] (1:thread 1@Tremblay) Thread 1 eats
-> [  0.270000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.270000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.280000] (1:thread 1@Tremblay) Thread 1 is full
-> [  0.280000] (1:thread 1@Tremblay) Thread 1 thinks
-> [  0.280000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #3)
-> [  0.290000] (1:thread 1@Tremblay) Thread 1 tries to enter the dead-end; hopefully, the master will cancel it
-> [  0.290000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #6)
-> [  0.290000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.290000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.290000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.310000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.310000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.310000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.330000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #7)
-> [  0.330000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #4)
-> [  0.340000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.340000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.340000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.340000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.360000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.360000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.370000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #4)
-> [  0.380000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #8)
-> [  0.380000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.380000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.380000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.400000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.400000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.400000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.420000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #9)
-> [  0.420000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #5)
-> [  0.430000] (1:thread 2@Tremblay) Thread 2 eats
-> [  0.430000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.430000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.430000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.450000] (1:thread 2@Tremblay) Thread 2 is full
-> [  0.450000] (1:thread 2@Tremblay) Thread 2 thinks
-> [  0.460000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #5)
-> [  0.470000] (1:thread 2@Tremblay) Thread 2 tries to enter the dead-end; hopefully, the master will cancel it
-> [  0.470000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.470000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.470000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.500000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.500000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.510000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #6)
-> [  0.510000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.530000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #6)
-> [  0.550000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.550000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.550000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.580000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.580000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.590000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #7)
-> [  0.590000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.610000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #7)
-> [  0.630000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.630000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.630000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.660000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.660000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.670000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #8)
-> [  0.670000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.690000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #8)
-> [  0.710000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.710000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.710000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.740000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.740000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.750000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #9)
-> [  0.750000] (1:thread 4@Tremblay) Thread 4 eats
-> [  0.770000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #9)
-> [  0.790000] (1:thread 3@Tremblay) Thread 3 eats
-> [  0.790000] (1:thread 4@Tremblay) Thread 4 is full
-> [  0.790000] (1:thread 4@Tremblay) Thread 4 thinks
-> [  0.820000] (1:thread 3@Tremblay) Thread 3 is full
-> [  0.820000] (1:thread 3@Tremblay) Thread 3 thinks
-> [  0.830000] (1:thread 4@Tremblay) Thread 4 tries to enter the dead-end; hopefully, the master will cancel it
-> [  0.850000] (1:philosopher@Tremblay) Cancel all childs
-> [  0.850000] (1:philosopher@Tremblay) Exiting GRAS
-> [  0.850000] (1:thread 3@Tremblay) Thread 3 tries to enter the dead-end; hopefully, the master will cancel it
diff --git a/examples/gras/tests.mk b/examples/gras/tests.mk
deleted file mode 100644 (file)
index 9a9bbc4..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-# This file factorize all the testing infrastructure for the GRAS examples
-#
-# it's made complicated by the facts that:
-#  - we use tesh, we need to find it back
-#  - we don't want to generate the test_* files with configure, so we
-#    have to declare some variables in front of the shell command
-#    running the test
-#  - we want to fully test the surf on the way. So, we have to ask for
-#    full precision timestamps in the tests. On the other hand,
-#    message size differ when we are on 32bits and when we are on
-#    64bits (obviously), so we have to maintain 2 tests per directory
-#    and pick the right one here.
-
-if GRAS_ARCH_32_BITS
-  TESTS= test_sg_32 test_rl
-test-sg: 
-       $(TESTS_ENVIRONMENT) test_sg_32
-else
-  TESTS= test_sg_64 test_rl
-test-sg: 
-       $(TESTS_ENVIRONMENT) test_sg_64
-endif
-
-test-rl: force
-       $(TESTS_ENVIRONMENT) test_rl
-TESTS_ENVIRONMENT=srcdir=$(srcdir) EXEEXT=$(EXEEXT) @top_builddir@/tools/tesh/tesh
-
-force:
-
-EXTRA_DIST+=test_rl test_sg_32 test_sg_64
-
-.PHONY: test_sg_32 test_SG_64 test_rl 
diff --git a/examples/gras/timer/CMakeLists.txt b/examples/gras/timer/CMakeLists.txt
deleted file mode 100644 (file)
index 86c42b7..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(
-  ${CMAKE_CURRENT_BINARY_DIR}/_timer_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_timer_client.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-add_executable(timer_simulator ${CMAKE_CURRENT_BINARY_DIR}/_timer_simulator.c ${CMAKE_CURRENT_SOURCE_DIR}/timer.c)
-add_executable(timer_client    ${CMAKE_CURRENT_BINARY_DIR}/_timer_client.c ${CMAKE_CURRENT_SOURCE_DIR}/timer.c)
-
-add_custom_command(
-  OUTPUT
-  ${CMAKE_CURRENT_BINARY_DIR}/_timer_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_timer_client.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/timer.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator timer ${CMAKE_CURRENT_SOURCE_DIR}/timer.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(timer_simulator simgrid pthread m )
-  target_link_libraries(timer_client gras pthread m )
-else(NOT WIN32)
-  target_link_libraries(timer_simulator simgrid)
-  target_link_libraries(timer_client gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/timer.xml
-  PARENT_SCOPE
-  )
-set(examples_src
-  ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/timer.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
diff --git a/examples/gras/timer/test_rl.tesh b/examples/gras/timer/test_rl.tesh
deleted file mode 100755 (executable)
index 0ba3d6e..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-
-p This test is a bit long to run, since it setups timers and wait for them. Don't worry, that's expected
-
-! timeout 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./timer_client$EXEEXT --log=root.fmt:%m%n
-> Programming the repetitive_action with a frequency of 1.000000 sec
-> Programming the delayed_action for after 2.000000 sec
-> Have a rest
-> Canceling the delayed_action.
-> Re-programming the delayed_action for after 2.000000 sec
-> Repetitive_action has nothing to do yet
-> Repetitive_action has nothing to do yet
-> delayed_action setting globals->still_to_do to 5
-> repetitive_action decrementing globals->still_to_do. New value: 4
-> repetitive_action decrementing globals->still_to_do. New value: 3
-> repetitive_action decrementing globals->still_to_do. New value: 2
-> repetitive_action decrementing globals->still_to_do. New value: 1
-> repetitive_action decrementing globals->still_to_do. New value: 0
-> Exiting GRAS
diff --git a/examples/gras/timer/test_sg_32.tesh b/examples/gras/timer/test_sg_32.tesh
deleted file mode 100755 (executable)
index b71348a..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./timer_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/timer.xml
-> [Fafard:client:(1) 0.000000] [test/INFO] Programming the repetitive_action with a frequency of 1.000000 sec
-> [Fafard:client:(1) 0.000000] [test/INFO] Programming the delayed_action for after 2.000000 sec
-> [Fafard:client:(1) 0.000000] [test/INFO] Have a rest
-> [Fafard:client:(1) 1.000000] [test/INFO] Canceling the delayed_action.
-> [Fafard:client:(1) 1.000000] [test/INFO] Re-programming the delayed_action for after 2.000000 sec
-> [Fafard:client:(1) 1.000000] [test/INFO] Repetitive_action has nothing to do yet
-> [Fafard:client:(1) 2.000000] [test/INFO] Repetitive_action has nothing to do yet
-> [Fafard:client:(1) 2.000000] [test/INFO] delayed_action setting globals->still_to_do to 5
-> [Fafard:client:(1) 3.000000] [test/INFO] repetitive_action decrementing globals->still_to_do. New value: 4
-> [Fafard:client:(1) 4.000000] [test/INFO] repetitive_action decrementing globals->still_to_do. New value: 3
-> [Fafard:client:(1) 5.000000] [test/INFO] repetitive_action decrementing globals->still_to_do. New value: 2
-> [Fafard:client:(1) 6.000000] [test/INFO] repetitive_action decrementing globals->still_to_do. New value: 1
-> [Fafard:client:(1) 7.000000] [test/INFO] repetitive_action decrementing globals->still_to_do. New value: 0
-> [Fafard:client:(1) 7.000000] [gras/INFO] Exiting GRAS
diff --git a/examples/gras/timer/test_sg_64.tesh b/examples/gras/timer/test_sg_64.tesh
deleted file mode 100755 (executable)
index b71348a..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ./timer_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/timer.xml
-> [Fafard:client:(1) 0.000000] [test/INFO] Programming the repetitive_action with a frequency of 1.000000 sec
-> [Fafard:client:(1) 0.000000] [test/INFO] Programming the delayed_action for after 2.000000 sec
-> [Fafard:client:(1) 0.000000] [test/INFO] Have a rest
-> [Fafard:client:(1) 1.000000] [test/INFO] Canceling the delayed_action.
-> [Fafard:client:(1) 1.000000] [test/INFO] Re-programming the delayed_action for after 2.000000 sec
-> [Fafard:client:(1) 1.000000] [test/INFO] Repetitive_action has nothing to do yet
-> [Fafard:client:(1) 2.000000] [test/INFO] Repetitive_action has nothing to do yet
-> [Fafard:client:(1) 2.000000] [test/INFO] delayed_action setting globals->still_to_do to 5
-> [Fafard:client:(1) 3.000000] [test/INFO] repetitive_action decrementing globals->still_to_do. New value: 4
-> [Fafard:client:(1) 4.000000] [test/INFO] repetitive_action decrementing globals->still_to_do. New value: 3
-> [Fafard:client:(1) 5.000000] [test/INFO] repetitive_action decrementing globals->still_to_do. New value: 2
-> [Fafard:client:(1) 6.000000] [test/INFO] repetitive_action decrementing globals->still_to_do. New value: 1
-> [Fafard:client:(1) 7.000000] [test/INFO] repetitive_action decrementing globals->still_to_do. New value: 0
-> [Fafard:client:(1) 7.000000] [gras/INFO] Exiting GRAS
diff --git a/examples/gras/timer/timer.c b/examples/gras/timer/timer.c
deleted file mode 100644 (file)
index c2c16d2..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/* timer: repetitive and delayed actions                                    */
-
-/* Copyright (c) 2005, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-int client(int argc, char *argv[]);     /* Placed here to not bother doxygen inclusion */
-
-#include "gras.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(test, "Logging specific to this test");
-
-#define REPEAT_INTERVAL 1.0
-#define DELAY_INTERVAL 2.0
-#define LOOP_COUNT 5
-
-typedef struct {
-  int still_to_do;
-} my_globals;
-
-static void repetitive_action(void)
-{
-  my_globals *globals = (my_globals *) gras_userdata_get();
-
-  /* Stop if nothing to do yet */
-  if (globals->still_to_do <= 0) {
-    XBT_INFO("Repetitive_action has nothing to do yet");
-    return;
-  }
-
-  if (globals->still_to_do == 1) {
-    /* Unregister myself if I'm done */
-    gras_timer_cancel_repeat(REPEAT_INTERVAL, repetitive_action);
-  }
-
-  XBT_INFO
-      ("repetitive_action decrementing globals->still_to_do. New value: %d",
-       globals->still_to_do - 1);
-
-  globals->still_to_do--;       /* should be the last line of the action since value=0 stops the program */
-}                               /* end_of_repetitive_action */
-
-static void delayed_action(void)
-{
-  my_globals *globals = (my_globals *) gras_userdata_get();
-
-  XBT_INFO("delayed_action setting globals->still_to_do to %d", LOOP_COUNT);
-
-  globals->still_to_do = LOOP_COUNT;
-}                               /* end_of_delayed_action */
-
-int client(int argc, char *argv[])
-{
-  my_globals *globals;
-
-  gras_init(&argc, argv);
-  globals = gras_userdata_new(my_globals);
-  globals->still_to_do = -1;
-
-  XBT_INFO("Programming the repetitive_action with a frequency of %f sec",
-        REPEAT_INTERVAL);
-  gras_timer_repeat(REPEAT_INTERVAL, repetitive_action);
-
-  XBT_INFO("Programming the delayed_action for after %f sec", DELAY_INTERVAL);
-  gras_timer_delay(REPEAT_INTERVAL, delayed_action);
-
-  XBT_INFO("Have a rest");
-  gras_os_sleep(DELAY_INTERVAL / 2.0);
-
-  XBT_INFO("Canceling the delayed_action.");
-  gras_timer_cancel_delay(REPEAT_INTERVAL, delayed_action);
-
-  XBT_INFO("Re-programming the delayed_action for after %f sec",
-        DELAY_INTERVAL);
-  gras_timer_delay(REPEAT_INTERVAL, delayed_action);
-
-  while (globals->still_to_do == -1 ||  /* Before delayed action runs */
-         globals->still_to_do >
-         0 /* after delayed_action, and not enough repetitive_action */ ) {
-
-    XBT_DEBUG("Prepare to handle messages for 5 sec (still_to_do=%d)",
-           globals->still_to_do);
-    gras_msg_handle(5.0);
-  }
-  gras_exit();
-  xbt_free(globals);
-  return 0;
-}                               /* end_of_client */
diff --git a/examples/gras/timer/timer.xml b/examples/gras/timer/timer.xml
deleted file mode 100644 (file)
index 67a2e9f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Fafard" function="client"></process>
-</platform>
index 4578fab..3dc1ddd 100644 (file)
@@ -7,29 +7,29 @@ $ lua bittorrent.lua
 > [Disney:peer:(6) 0.000000] [lua/INFO] Hi, I'm joining the network with id 6
 > [iRMX:peer:(7) 0.000000] [lua/INFO] Hi, I'm joining the network with id 7
 > [McGee:peer:(8) 0.000000] [lua/INFO] Hi, I'm joining the network with id 8
-> [Boivin:peer:(2) 3.048890] [lua/INFO] Received an answer from the tracker with 0 peers inside
-> [Jean_Yves:peer:(3) 3.925095] [lua/INFO] Received an answer from the tracker with 1 peers inside
-> [Jean_Yves:peer:(3) 3.925095] [lua/INFO] Start downloading.
+> [Boivin:peer:(2) 3.048882] [lua/INFO] Received an answer from the tracker with 0 peers inside
+> [Jean_Yves:peer:(3) 3.925092] [lua/INFO] Received an answer from the tracker with 1 peers inside
+> [Jean_Yves:peer:(3) 3.925092] [lua/INFO] Start downloading.
 > [Geoff:peer:(5) 6.005341] [lua/INFO] Received an answer from the tracker with 3 peers inside
-> [TeX:peer:(4) 6.812601] [lua/INFO] Received an answer from the tracker with 2 peers inside
-> [TeX:peer:(4) 6.812601] [lua/INFO] Start downloading.
-> [Jean_Yves:peer:(3) 6.925095] [lua/INFO] Starting main leech loop
-> [TeX:peer:(4) 8.619861] [lua/INFO] Starting main leech loop
-> [Disney:peer:(6) 9.823552] [lua/INFO] Received an answer from the tracker with 4 peers inside
-> [Disney:peer:(6) 9.823552] [lua/INFO] Start downloading.
-> [Disney:peer:(6) 10.644366] [lua/INFO] Starting main leech loop
-> [McGee:peer:(8) 13.888359] [lua/INFO] Received an answer from the tracker with 6 peers inside
-> [McGee:peer:(8) 13.888359] [lua/INFO] Start downloading.
-> [iRMX:peer:(7) 15.043681] [lua/INFO] Received an answer from the tracker with 5 peers inside
-> [iRMX:peer:(7) 15.043681] [lua/INFO] Start downloading.
-> [McGee:peer:(8) 16.609446] [lua/INFO] Starting main leech loop
-> [iRMX:peer:(7) 24.873536] [lua/INFO] Starting main leech loop
+> [TeX:peer:(4) 6.812588] [lua/INFO] Received an answer from the tracker with 2 peers inside
+> [TeX:peer:(4) 6.812588] [lua/INFO] Start downloading.
+> [Jean_Yves:peer:(3) 6.925093] [lua/INFO] Starting main leech loop
+> [TeX:peer:(4) 8.619837] [lua/INFO] Starting main leech loop
+> [Disney:peer:(6) 9.823538] [lua/INFO] Received an answer from the tracker with 4 peers inside
+> [Disney:peer:(6) 9.823538] [lua/INFO] Start downloading.
+> [Disney:peer:(6) 10.644341] [lua/INFO] Starting main leech loop
+> [McGee:peer:(8) 13.888352] [lua/INFO] Received an answer from the tracker with 6 peers inside
+> [McGee:peer:(8) 13.888352] [lua/INFO] Start downloading.
+> [iRMX:peer:(7) 15.043659] [lua/INFO] Received an answer from the tracker with 5 peers inside
+> [iRMX:peer:(7) 15.043659] [lua/INFO] Start downloading.
+> [McGee:peer:(8) 16.609414] [lua/INFO] Starting main leech loop
+> [iRMX:peer:(7) 24.873510] [lua/INFO] Starting main leech loop
 > [Jacquelin:tracker:(1) 3000.000000] [lua/INFO] Tracker is leaving
 > [Geoff:peer:(5) 5000.005341] [lua/INFO] My status is now 1111111111
 > [Boivin:peer:(2) 5000.048882] [lua/INFO] My status is now 1111111111
-> [McGee:peer:(8) 5000.609438] [lua/INFO] My status is now 1111111111
-> [TeX:peer:(4) 5000.619861] [lua/INFO] My status is now 1111111111
-> [Disney:peer:(6) 5000.644364] [lua/INFO] My status is now 1111111111
-> [iRMX:peer:(7) 5000.873536] [lua/INFO] My status is now 1111111111
+> [McGee:peer:(8) 5000.609414] [lua/INFO] My status is now 1111111111
+> [TeX:peer:(4) 5000.619837] [lua/INFO] My status is now 1111111111
+> [Disney:peer:(6) 5000.644339] [lua/INFO] My status is now 1111111111
+> [iRMX:peer:(7) 5000.873506] [lua/INFO] My status is now 1111111111
 > [Jean_Yves:peer:(3) 5000.925088] [lua/INFO] My status is now 1111111111
 
index 56df505..f6ba517 100644 (file)
@@ -13,1122 +13,1074 @@ $ lua chord.lua ../../msg/msg_platform.xml ../../msg/chord/chord.xml
 > [Jean_Yves:node:(6) 0.000000] [lua/INFO] Sending a 'find successor' request to 1 for id 14
 > [Boivin:node:(7) 0.000000] [lua/INFO] Joining the ring with id 8, knowing node 1
 > [Boivin:node:(7) 0.000000] [lua/INFO] Sending a 'find successor' request to 1 for id 8
-> [Gatien:node:(1) 1.274535] [lua/INFO] Sent the 'find successor' request to 1 for id 48, waiting for the answer
+> [Gatien:node:(1) 1.274448] [lua/INFO] Sent the 'find successor' request to 1 for id 48, waiting for the answer
 > [Jacquelin:node:(8) 5.000000] [lua/INFO] Received a 'find successor' request from 48 for id 48
 > [Jacquelin:node:(8) 5.000000] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 48 is 1
-> [McGee:node:(2) 5.888420] [lua/INFO] Sent the 'find successor' request to 1 for id 42, waiting for the answer
-> [Gatien:node:(1) 6.274535] [lua/INFO] Received the answer to my 'find successor' request for id 48: the successor is 1
+> [McGee:node:(2) 5.888356] [lua/INFO] Sent the 'find successor' request to 1 for id 42, waiting for the answer
+> [Gatien:node:(1) 6.274448] [lua/INFO] Received the answer to my 'find successor' request for id 48: the successor is 1
 > [Jacquelin:node:(8) 10.000000] [lua/INFO] Received a 'find successor' request from 42 for id 42
 > [Jacquelin:node:(8) 10.000000] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 42 is 1
-> [McGee:node:(2) 10.888420] [lua/INFO] Received the answer to my 'find successor' request for id 42: the successor is 1
-> [iRMX:node:(3) 13.043892] [lua/INFO] Sent the 'find successor' request to 1 for id 38, waiting for the answer
+> [McGee:node:(2) 10.888356] [lua/INFO] Received the answer to my 'find successor' request for id 42: the successor is 1
+> [iRMX:node:(3) 13.043675] [lua/INFO] Sent the 'find successor' request to 1 for id 38, waiting for the answer
 > [Jacquelin:node:(8) 15.000000] [lua/INFO] Received a 'find successor' request from 38 for id 38
 > [Jacquelin:node:(8) 15.000000] [lua/INFO] Sending back a 'find successor answer' to 38: the successor of 38 is 1
 > [Geoff:node:(4) 15.005344] [lua/INFO] Sent the 'find successor' request to 1 for id 32, waiting for the answer
-> [Gatien:node:(1) 16.274535] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [iRMX:node:(3) 18.043892] [lua/INFO] Received the answer to my 'find successor' request for id 38: the successor is 1
+> [Gatien:node:(1) 16.274448] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [iRMX:node:(3) 18.043675] [lua/INFO] Received the answer to my 'find successor' request for id 38: the successor is 1
 > [Jacquelin:node:(8) 20.000000] [lua/INFO] Received a 'find successor' request from 32 for id 32
 > [Jacquelin:node:(8) 20.000000] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 32 is 1
 > [Geoff:node:(4) 20.005344] [lua/INFO] Received the answer to my 'find successor' request for id 32: the successor is 1
-> [McGee:node:(2) 20.888420] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [TeX:node:(5) 21.812726] [lua/INFO] Sent the 'find successor' request to 1 for id 21, waiting for the answer
+> [McGee:node:(2) 20.888356] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [TeX:node:(5) 21.812602] [lua/INFO] Sent the 'find successor' request to 1 for id 21, waiting for the answer
 > [Jacquelin:node:(8) 25.000000] [lua/INFO] Received a 'find successor' request from 21 for id 21
 > [Jacquelin:node:(8) 25.000000] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 21 is 1
-> [Jean_Yves:node:(6) 25.925159] [lua/INFO] Sent the 'find successor' request to 1 for id 14, waiting for the answer
-> [TeX:node:(5) 26.812726] [lua/INFO] Received the answer to my 'find successor' request for id 21: the successor is 1
+> [Jean_Yves:node:(6) 25.925131] [lua/INFO] Sent the 'find successor' request to 1 for id 14, waiting for the answer
+> [TeX:node:(5) 26.812602] [lua/INFO] Received the answer to my 'find successor' request for id 21: the successor is 1
 > [Jacquelin:node:(8) 30.000000] [lua/INFO] Received a 'find successor' request from 14 for id 14
 > [Jacquelin:node:(8) 30.000000] [lua/INFO] Sending back a 'find successor answer' to 14: the successor of 14 is 1
-> [Jean_Yves:node:(6) 30.925159] [lua/INFO] Received the answer to my 'find successor' request for id 14: the successor is 1
-> [Boivin:node:(7) 31.048962] [lua/INFO] Sent the 'find successor' request to 1 for id 8, waiting for the answer
+> [Jean_Yves:node:(6) 30.925131] [lua/INFO] Received the answer to my 'find successor' request for id 14: the successor is 1
+> [Boivin:node:(7) 31.048886] [lua/INFO] Sent the 'find successor' request to 1 for id 8, waiting for the answer
 > [Jacquelin:node:(8) 35.000000] [lua/INFO] Received a 'find successor' request from 8 for id 8
 > [Jacquelin:node:(8) 35.000000] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 8 is 1
-> [Boivin:node:(7) 36.048962] [lua/INFO] Received the answer to my 'find successor' request for id 8: the successor is 1
-> [Gatien:node:(1) 36.274535] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [TeX:node:(5) 36.812726] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [Boivin:node:(7) 36.048886] [lua/INFO] Received the answer to my 'find successor' request for id 8: the successor is 1
+> [Gatien:node:(1) 36.274448] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [TeX:node:(5) 36.812602] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
 > [Jacquelin:node:(8) 40.000000] [lua/INFO] Received a 'find successor' request from 48 for id 1337
 > [Jacquelin:node:(8) 40.000000] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 1
-> [McGee:node:(2) 40.888420] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [Gatien:node:(1) 41.274535] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 1
+> [McGee:node:(2) 40.888356] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [Gatien:node:(1) 41.274448] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 1
 > [Jacquelin:node:(8) 45.000000] [lua/INFO] Received a 'find successor' request from 42 for id 1337
 > [Jacquelin:node:(8) 45.000000] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 1
-> [McGee:node:(2) 45.888420] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 1
-> [TeX:node:(5) 46.812726] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [McGee:node:(2) 45.888356] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 1
+> [TeX:node:(5) 46.812602] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
 > [Jacquelin:node:(8) 50.000000] [lua/INFO] Received a 'find successor' request from 21 for id 1337
 > [Jacquelin:node:(8) 50.000000] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 1
-> [TeX:node:(5) 51.812726] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 1
-> [Gatien:node:(1) 66.274535] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [McGee:node:(2) 70.888420] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [TeX:node:(5) 81.812726] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [Gatien:node:(1) 101.274535] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [TeX:node:(5) 51.812602] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 1
+> [Gatien:node:(1) 66.274448] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [McGee:node:(2) 70.888356] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [TeX:node:(5) 81.812602] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [Gatien:node:(1) 101.274448] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
 > [Jacquelin:node:(8) 105.000000] [lua/INFO] Received a 'find successor' request from 48 for id 1337
 > [Jacquelin:node:(8) 105.000000] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 48
-> [Gatien:node:(1) 106.274535] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [McGee:node:(2) 110.888420] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [Gatien:node:(1) 106.274448] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [McGee:node:(2) 110.888356] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
 > [Jacquelin:node:(8) 115.000000] [lua/INFO] Received a 'find successor' request from 42 for id 1337
 > [Jacquelin:node:(8) 115.000000] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
-> [McGee:node:(2) 115.888420] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [TeX:node:(5) 126.674688] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [Jacquelin:node:(8) 126.674688] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Jacquelin:node:(8) 126.674688] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
-> [TeX:node:(5) 128.487414] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [McGee:node:(2) 132.749146] [lua/INFO] Sending a 'find successor' request to 21 for id 1337
-> [McGee:node:(2) 133.703343] [lua/INFO] Sent the 'find successor' request to 21 for id 1337, waiting for the answer
-> [TeX:node:(5) 136.722688] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [TeX:node:(5) 136.722688] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 138.535414] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [McGee:node:(2) 143.937660] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 145.703819] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 148.273145] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 152.643869] [lua/INFO] Received another request of type notify
-> [Jacquelin:node:(8) 154.971344] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Jacquelin:node:(8) 154.971344] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
-> [McGee:node:(2) 155.859764] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [TeX:node:(5) 161.784070] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [Jacquelin:node:(8) 161.784070] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Jacquelin:node:(8) 161.784070] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
-> [TeX:node:(5) 161.784070] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 162.912195] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 164.252506] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 165.206703] [lua/INFO] Received another request of type get predecessor
-> [Geoff:node:(4) 166.586899] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 166.658016] [lua/INFO] Sending a 'find successor' request to 21 for id 1337
-> [TeX:node:(5) 167.019429] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Geoff:node:(4) 169.625450] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 170.458507] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 170.458507] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 173.497058] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 174.798416] [lua/INFO] Sent the 'find successor' request to 21 for id 1337, waiting for the answer
-> [TeX:node:(5) 174.798416] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [TeX:node:(5) 174.798416] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [McGee:node:(2) 174.798416] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 176.983778] [lua/INFO] Received another request of type get predecessor
-> [Jacquelin:node:(8) 180.527041] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Jacquelin:node:(8) 180.527041] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
-> [McGee:node:(2) 181.354502] [lua/INFO] Received another request of type notify
-> [TeX:node:(5) 181.611142] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [McGee:node:(2) 182.242922] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Geoff:node:(4) 183.497058] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Geoff:node:(4) 186.535609] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [TeX:node:(5) 187.339767] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [Jacquelin:node:(8) 187.339767] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Jacquelin:node:(8) 187.339767] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
-> [TeX:node:(5) 187.339767] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 189.169140] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 189.169140] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [TeX:node:(5) 190.057323] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 191.397634] [lua/INFO] Received another request of type get predecessor
-> [Geoff:node:(4) 192.207691] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 192.351831] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 193.306027] [lua/INFO] Sending a 'find successor' request to 21 for id 1337
-> [TeX:node:(5) 194.164557] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Geoff:node:(4) 202.207691] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 205.603232] [lua/INFO] Sent the 'find successor' request to 21 for id 1337, waiting for the answer
-> [TeX:node:(5) 205.603232] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [TeX:node:(5) 205.603232] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [McGee:node:(2) 205.603232] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 207.415958] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [Jacquelin:node:(8) 207.672168] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Jacquelin:node:(8) 207.672168] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
-> [Geoff:node:(4) 208.284793] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 208.284793] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 208.284793] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [McGee:node:(2) 208.560589] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Geoff:node:(4) 211.323344] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Boivin:node:(7) 213.665399] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [TeX:node:(5) 214.484895] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [Jacquelin:node:(8) 214.484895] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Jacquelin:node:(8) 214.484895] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
-> [TeX:node:(5) 214.514785] [lua/INFO] Received another request of type get predecessor
-> [Boivin:node:(7) 216.024689] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [TeX:node:(5) 216.327511] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Gatien:node:(1) 216.544953] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 218.997708] [lua/INFO] Sending a 'find successor' request to 21 for id 1337
-> [iRMX:node:(3) 220.470155] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 220.470155] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Geoff:node:(4) 221.323344] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 222.281708] [lua/INFO] Sent the 'find successor' request to 21 for id 1337, waiting for the answer
-> [McGee:node:(2) 222.281708] [lua/INFO] Received another request of type notify
-> [Boivin:node:(7) 222.829446] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 223.041632] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Gatien:node:(1) 223.041632] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 224.074958] [lua/INFO] Received another request of type notify
-> [iRMX:node:(3) 225.470155] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 225.470155] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [TeX:node:(5) 226.327511] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [TeX:node:(5) 226.327511] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 226.327511] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [Gatien:node:(1) 228.041632] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Geoff:node:(4) 228.508706] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 230.470155] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 230.470155] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Jacquelin:node:(8) 232.419986] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Jacquelin:node:(8) 232.419986] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
-> [McGee:node:(2) 232.655517] [lua/INFO] Received another request of type get predecessor
-> [Boivin:node:(7) 232.829446] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Geoff:node:(4) 233.508706] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 233.543937] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [TeX:node:(5) 234.232713] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [Boivin:node:(7) 237.200170] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Jacquelin:node:(8) 237.419986] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Jacquelin:node:(8) 237.419986] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
-> [TeX:node:(5) 239.232713] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [iRMX:node:(3) 239.840879] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 239.840879] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Boivin:node:(7) 242.200170] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Geoff:node:(4) 247.879430] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 248.812362] [lua/INFO] Sending a 'find successor' request to 21 for id 1337
-> [Gatien:node:(1) 252.532902] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [TeX:node:(5) 252.858165] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [Gatien:node:(1) 253.802096] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [McGee:node:(2) 253.812362] [lua/INFO] Sent the 'find successor' request to 21 for id 1337, waiting for the answer
-> [TeX:node:(5) 254.670891] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [TeX:node:(5) 254.670891] [lua/INFO] Received another request of type find successor
-> [TeX:node:(5) 254.670891] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [TeX:node:(5) 254.670891] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [McGee:node:(2) 257.026241] [lua/INFO] Received another request of type get predecessor
-> [Boivin:node:(7) 257.200170] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Jacquelin:node:(8) 258.686890] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Jacquelin:node:(8) 258.686890] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
-> [TeX:node:(5) 260.499617] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Geoff:node:(4) 260.917981] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 260.917981] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 260.917981] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 260.917981] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 260.917981] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 260.917981] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Jacquelin:node:(8) 263.686890] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Jacquelin:node:(8) 263.686890] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
-> [Geoff:node:(4) 263.956532] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 264.575311] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [McGee:node:(2) 264.575311] [lua/INFO] Sending a 'find successor' request to 21 for id 46
-> [McGee:node:(2) 265.529507] [lua/INFO] Sent the 'find successor' request to 21 for id 46, waiting for the answer
-> [McGee:node:(2) 267.130436] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 267.312343] [lua/INFO] Received a 'find successor' request from 42 for id 46
-> [TeX:node:(5) 267.312343] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 46 is 1
-> [McGee:node:(2) 269.315798] [lua/INFO] Received another request of type notify
-> [Gatien:node:(1) 269.961425] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 270.269995] [lua/INFO] Received the answer to my 'find successor' request for id 46: the successor is 1
-> [TeX:node:(5) 270.499617] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [Gatien:node:(1) 272.510494] [lua/INFO] Received another request of type notify
-> [Boivin:node:(7) 273.034111] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 275.674820] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 275.674820] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Boivin:node:(7) 278.034111] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 278.048686] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [TeX:node:(5) 278.048686] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 279.002883] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [TeX:node:(5) 279.957079] [lua/INFO] Received another request of type notify
-> [iRMX:node:(3) 280.674820] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 280.674820] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [Jacquelin:node:(8) 281.235960] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Jacquelin:node:(8) 281.235960] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
-> [McGee:node:(2) 282.124380] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [TeX:node:(5) 283.048686] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Gatien:node:(1) 283.246297] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Jacquelin:node:(8) 286.235960] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Jacquelin:node:(8) 286.235960] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
-> [McGee:node:(2) 287.860182] [lua/INFO] Received another request of type get predecessor
-> [Geoff:node:(4) 288.713371] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 288.748602] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Boivin:node:(7) 290.393401] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Gatien:node:(1) 295.784685] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [TeX:node:(5) 296.674138] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [Geoff:node:(4) 298.258024] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Geoff:node:(4) 298.258024] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 298.748602] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [Gatien:node:(1) 299.527218] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 299.527218] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 299.527218] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 299.527218] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 299.527218] [lua/INFO] Received another request of type notify
-> [iRMX:node:(3) 300.219473] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 300.219473] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 303.258024] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 303.871946] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [Jacquelin:node:(8) 307.059219] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Jacquelin:node:(8) 307.059219] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
-> [Boivin:node:(7) 307.578763] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [McGee:node:(2) 307.947640] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [McGee:node:(2) 307.947640] [lua/INFO] Received another request of type notify
-> [TeX:node:(5) 308.871946] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [iRMX:node:(3) 310.219473] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 310.219473] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Jacquelin:node:(8) 312.059219] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Jacquelin:node:(8) 312.059219] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
-> [McGee:node:(2) 312.404835] [lua/INFO] Received another request of type get predecessor
-> [Boivin:node:(7) 312.578763] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 313.258024] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 313.258024] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [McGee:node:(2) 313.293255] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Gatien:node:(1) 315.829500] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Boivin:node:(7) 322.802676] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 325.376194] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [McGee:node:(2) 326.264614] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [TeX:node:(5) 326.421015] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [Geoff:node:(4) 329.058876] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Jacquelin:node:(8) 329.608289] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Jacquelin:node:(8) 329.608289] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
-> [Gatien:node:(1) 329.751131] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [McGee:node:(2) 330.496709] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Gatien:node:(1) 331.020325] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Boivin:node:(7) 332.802676] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 335.443386] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 335.443386] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [TeX:node:(5) 336.421015] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [Boivin:node:(7) 337.802676] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Jacquelin:node:(8) 339.608289] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Jacquelin:node:(8) 339.608289] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
-> [Gatien:node:(1) 340.882823] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 341.421015] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Geoff:node:(4) 341.520488] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 341.520488] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 341.520488] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 341.520488] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 341.520488] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 341.520488] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 343.431893] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 344.559039] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 348.638658] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [iRMX:node:(3) 348.705850] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 348.705850] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [Gatien:node:(1) 351.277327] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 353.045778] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [TeX:node:(5) 353.970084] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [Boivin:node:(7) 356.065141] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Jacquelin:node:(8) 357.157358] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Jacquelin:node:(8) 357.157358] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
-> [McGee:node:(2) 358.045778] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Geoff:node:(4) 362.321340] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Gatien:node:(1) 363.013595] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [TeX:node:(5) 363.970084] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [Jacquelin:node:(8) 363.970084] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Jacquelin:node:(8) 363.970084] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
-> [Gatien:node:(1) 364.282789] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Gatien:node:(1) 364.282789] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 365.782810] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Boivin:node:(7) 366.065141] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 366.065141] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 366.065141] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Gatien:node:(1) 366.831858] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 368.045778] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [Boivin:node:(7) 368.424431] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 368.934198] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [McGee:node:(2) 369.839028] [lua/INFO] Received another request of type get predecessor
-> [Jacquelin:node:(8) 370.557324] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Jacquelin:node:(8) 370.557324] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
-> [McGee:node:(2) 371.445744] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [Geoff:node:(4) 372.142243] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 372.142243] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 372.142243] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 372.142243] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 372.142243] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 372.142243] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Geoff:node:(4) 375.180793] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 379.327605] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 379.327605] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [Gatien:node:(1) 381.899081] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 382.370050] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [McGee:node:(2) 382.467164] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [Boivin:node:(7) 386.686895] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [TeX:node:(5) 387.370050] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [Jacquelin:node:(8) 387.724522] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Jacquelin:node:(8) 387.724522] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
-> [McGee:node:(2) 388.612942] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [Jacquelin:node:(8) 388.612942] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Jacquelin:node:(8) 388.612942] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
-> [iRMX:node:(3) 389.327605] [lua/INFO] Sending a 'find successor' request to 42 for id 46
-> [McGee:node:(2) 389.501363] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [TeX:node:(5) 389.537248] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [iRMX:node:(3) 391.686725] [lua/INFO] Sent the 'find successor' request to 42 for id 46, waiting for the answer
-> [iRMX:node:(3) 391.686895] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 392.366156] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Boivin:node:(7) 394.046186] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 394.046186] [lua/INFO] Received another request of type find successor
-> [iRMX:node:(3) 394.046186] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 394.046186] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [McGee:node:(2) 394.501363] [lua/INFO] Received a 'find successor' request from 38 for id 46
-> [McGee:node:(2) 394.501363] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [McGee:node:(2) 394.501363] [lua/INFO] Sending a 'find successor' request to 1 for id 50
-> [McGee:node:(2) 395.389783] [lua/INFO] Sent the 'find successor' request to 1 for id 50, waiting for the answer
-> [McGee:node:(2) 396.294612] [lua/INFO] Received another request of type get predecessor
-> [Boivin:node:(7) 396.405476] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 396.449988] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [iRMX:node:(3) 397.084737] [lua/INFO] Received another request of type notify
-> [Gatien:node:(1) 397.719182] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Jacquelin:node:(8) 397.724522] [lua/INFO] Received a 'find successor' request from 42 for id 50
-> [Jacquelin:node:(8) 397.724522] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 50 is 48
-> [McGee:node:(2) 398.612942] [lua/INFO] Received the answer to my 'find successor' request for id 50: the successor is 48
-> [TeX:node:(5) 399.537248] [lua/INFO] Received a 'find successor' request from 38 for id 46
-> [TeX:node:(5) 399.537248] [lua/INFO] Sending back a 'find successor answer' to 38: the successor of 46 is 1
-> [TeX:node:(5) 399.537248] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
-> [Geoff:node:(4) 400.123288] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 400.123288] [lua/INFO] Received another request of type find successor
-> [iRMX:node:(3) 400.123288] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 400.123288] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 400.123288] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 400.123288] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 400.123288] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 401.349975] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
-> [TeX:node:(5) 401.349975] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 402.304171] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
-> [McGee:node:(2) 402.703672] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
-> [Gatien:node:(1) 402.703672] [lua/INFO] Received another request of type find successor
-> [Gatien:node:(1) 402.703672] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Gatien:node:(1) 402.703672] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Jacquelin:node:(8) 402.724522] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Jacquelin:node:(8) 402.724522] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
-> [Geoff:node:(4) 403.161839] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 403.258368] [lua/INFO] Received another request of type notify
-> [iRMX:node:(3) 403.316021] [lua/INFO] Received the answer to my 'find successor' request for id 46: the successor is 1
-> [TeX:node:(5) 405.071094] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
-> [McGee:node:(2) 405.501383] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 406.354572] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 406.354572] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [Boivin:node:(7) 406.405476] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Geoff:node:(4) 408.161839] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Geoff:node:(4) 408.161839] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 408.926048] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 410.725296] [lua/INFO] Received another request of type notify
-> [Boivin:node:(7) 410.899225] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 413.539934] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 413.539934] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Boivin:node:(7) 415.899225] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 418.539934] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 418.539934] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [TeX:node:(5) 419.537248] [lua/INFO] Sending a 'find successor' request to 1 for id 29
-> [McGee:node:(2) 419.881111] [lua/INFO] Received another request of type get predecessor
-> [Gatien:node:(1) 420.268251] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [TeX:node:(5) 421.349975] [lua/INFO] Sent the 'find successor' request to 1 for id 29, waiting for the answer
-> [Jean_Yves:node:(6) 421.674360] [lua/INFO] Sending a 'find successor' request to 42 for id 22
-> [McGee:node:(2) 422.066473] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 422.847679] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 422.847679] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 422.847679] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Jacquelin:node:(8) 425.273592] [lua/INFO] Received a 'find successor' request from 21 for id 29
-> [Jacquelin:node:(8) 425.273592] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 29 is 48
-> [Geoff:node:(4) 426.578485] [lua/INFO] Sending a 'find successor' request to 38 for id 40
-> [TeX:node:(5) 427.086318] [lua/INFO] Received the answer to my 'find successor' request for id 29: the successor is 48
-> [TeX:node:(5) 427.086318] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
-> [TeX:node:(5) 428.426629] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
-> [Gatien:node:(1) 428.426629] [lua/INFO] Received another request of type find successor
-> [Gatien:node:(1) 428.426629] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Gatien:node:(1) 428.426629] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 428.426629] [lua/INFO] Received another request of type get predecessor
-> [Jean_Yves:node:(6) 428.859722] [lua/INFO] Sent the 'find successor' request to 42 for id 22, waiting for the answer
-> [McGee:node:(2) 428.859722] [lua/INFO] Received a 'find successor' request from 14 for id 22
-> [McGee:node:(2) 428.859722] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 429.813919] [lua/INFO] Received another request of type find successor
-> [TeX:node:(5) 429.813919] [lua/INFO] Received a 'find successor' request from 14 for id 22
-> [TeX:node:(5) 429.813919] [lua/INFO] Sending back a 'find successor answer' to 14: the successor of 22 is 1
-> [TeX:node:(5) 430.768116] [lua/INFO] Received another request of type notify
-> [Boivin:node:(7) 430.899225] [lua/INFO] Sending a 'find successor' request to 38 for id 16
-> [iRMX:node:(3) 431.999281] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 431.999281] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [Jean_Yves:node:(6) 432.531475] [lua/INFO] Received the answer to my 'find successor' request for id 22: the successor is 1
-> [Gatien:node:(1) 434.570758] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 434.813919] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
-> [McGee:node:(2) 435.213420] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
-> [Geoff:node:(4) 438.076383] [lua/INFO] Sent the 'find successor' request to 38 for id 40, waiting for the answer
-> [iRMX:node:(3) 438.076383] [lua/INFO] Received a 'find successor' request from 32 for id 40
-> [iRMX:node:(3) 438.076383] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 40 is 42
-> [Geoff:node:(4) 438.076383] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 438.076383] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Geoff:node:(4) 438.076383] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 439.570758] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Gatien:node:(1) 439.570758] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Geoff:node:(4) 441.114934] [lua/INFO] Received the answer to my 'find successor' request for id 40: the successor is 42
-> [Geoff:node:(4) 441.114934] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Boivin:node:(7) 442.794965] [lua/INFO] Sent the 'find successor' request to 38 for id 16, waiting for the answer
-> [iRMX:node:(3) 442.794965] [lua/INFO] Received a 'find successor' request from 8 for id 16
-> [iRMX:node:(3) 442.794965] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 16 is 42
-> [McGee:node:(2) 444.324724] [lua/INFO] Received another request of type get predecessor
-> [Boivin:node:(7) 445.154255] [lua/INFO] Received the answer to my 'find successor' request for id 16: the successor is 42
-> [Boivin:node:(7) 445.154255] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 447.165689] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 448.958938] [lua/INFO] Received another request of type notify
-> [iRMX:node:(3) 449.980327] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 449.980327] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [Geoff:node:(4) 453.018878] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Geoff:node:(4) 453.018878] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 453.018878] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Geoff:node:(4) 453.018878] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 453.173060] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Geoff:node:(4) 454.288072] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 454.980327] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 454.980327] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Gatien:node:(1) 455.557266] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Boivin:node:(7) 457.339617] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Geoff:node:(4) 458.018878] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 459.980327] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 459.980327] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Boivin:node:(7) 462.339617] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 464.980327] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 464.980327] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [TeX:node:(5) 466.798512] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
-> [McGee:node:(2) 467.165689] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 469.288072] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 469.288072] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 469.288072] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 469.288072] [lua/INFO] Received another request of type notify
-> [TeX:node:(5) 470.628383] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
-> [Gatien:node:(1) 470.628383] [lua/INFO] Received another request of type find successor
-> [Gatien:node:(1) 470.628383] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Gatien:node:(1) 470.628383] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 470.628383] [lua/INFO] Received another request of type get predecessor
-> [Geoff:node:(4) 472.389602] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [TeX:node:(5) 473.052694] [lua/INFO] Received another request of type notify
-> [Boivin:node:(7) 474.069632] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [iRMX:node:(3) 474.748893] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 474.748893] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [Gatien:node:(1) 477.320369] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 482.098497] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
-> [Geoff:node:(4) 484.972806] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Geoff:node:(4) 484.972806] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 484.972806] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Geoff:node:(4) 484.972806] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Geoff:node:(4) 486.242000] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 486.641501] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
-> [Gatien:node:(1) 486.641501] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Gatien:node:(1) 486.641501] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [iRMX:node:(3) 486.934255] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 486.934255] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 487.910695] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 487.910695] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Geoff:node:(4) 487.910695] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 487.910695] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Geoff:node:(4) 490.949246] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Boivin:node:(7) 494.293545] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [McGee:node:(2) 494.730799] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 496.934255] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 496.934255] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Gatien:node:(1) 497.218440] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Gatien:node:(1) 497.218440] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 498.317298] [lua/INFO] Received another request of type notify
-> [Boivin:node:(7) 499.293545] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 500.502660] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 500.502660] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 500.502660] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [iRMX:node:(3) 503.541211] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 503.541211] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [TeX:node:(5) 503.695393] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 505.726573] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Geoff:node:(4) 506.579762] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 506.579762] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 508.791069] [lua/INFO] Received another request of type get predecessor
-> [Geoff:node:(4) 509.618313] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Boivin:node:(7) 511.298344] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Gatien:node:(1) 511.340138] [lua/INFO] Received another request of type notify
-> [TeX:node:(5) 514.329261] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
-> [TeX:node:(5) 515.669572] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
-> [Gatien:node:(1) 515.669572] [lua/INFO] Received another request of type find successor
-> [Gatien:node:(1) 515.669572] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Gatien:node:(1) 515.669572] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [iRMX:node:(3) 516.124415] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 516.124415] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [McGee:node:(2) 517.634967] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
-> [Gatien:node:(1) 518.695892] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 519.095393] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
-> [McGee:node:(2) 519.428216] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 523.014715] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 524.162966] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Geoff:node:(4) 524.162966] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 524.162966] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Geoff:node:(4) 524.162966] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Geoff:node:(4) 525.432160] [lua/INFO] Received another request of type get predecessor
-> [Gatien:node:(1) 525.432160] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Gatien:node:(1) 525.432160] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [iRMX:node:(3) 526.124415] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 526.124415] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [iRMX:node:(3) 526.124415] [lua/INFO] Sending a 'find successor' request to 1 for id 54
-> [Geoff:node:(4) 526.701354] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 526.701354] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Geoff:node:(4) 526.701354] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 526.701354] [lua/INFO] Sending a 'find successor' request to 32 for id 64
-> [iRMX:node:(3) 529.168307] [lua/INFO] Sent the 'find successor' request to 1 for id 54, waiting for the answer
-> [iRMX:node:(3) 529.168307] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 529.739905] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Jacquelin:node:(8) 530.065604] [lua/INFO] Received a 'find successor' request from 38 for id 54
-> [Jacquelin:node:(8) 530.065604] [lua/INFO] Sending back a 'find successor answer' to 38: the successor of 54 is 48
-> [Boivin:node:(7) 531.527597] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 531.527597] [lua/INFO] Received another request of type find successor
-> [iRMX:node:(3) 531.527597] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 531.527597] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Boivin:node:(7) 533.886888] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 534.566148] [lua/INFO] Received another request of type find successor
-> [iRMX:node:(3) 534.566148] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 534.566148] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [iRMX:node:(3) 537.604699] [lua/INFO] Received another request of type find successor
-> [iRMX:node:(3) 537.604699] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 537.604699] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [TeX:node:(5) 537.758881] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 539.790061] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 540.643250] [lua/INFO] Received another request of type get predecessor
-> [Gatien:node:(1) 541.912444] [lua/INFO] Sent the 'find successor' request to 32 for id 64, waiting for the answer
-> [Geoff:node:(4) 541.912444] [lua/INFO] Received a 'find successor' request from 48 for id 64
-> [Geoff:node:(4) 541.912444] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 541.912444] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 543.687142] [lua/INFO] Received the answer to my 'find successor' request for id 54: the successor is 48
-> [Geoff:node:(4) 544.950995] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Gatien:node:(1) 545.746129] [lua/INFO] Received another request of type notify
-> [Boivin:node:(7) 548.405723] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 548.619950] [lua/INFO] Sending a 'find successor' request to 48 for id 58
-> [McGee:node:(2) 549.019451] [lua/INFO] Sent the 'find successor' request to 48 for id 58, waiting for the answer
-> [Gatien:node:(1) 549.019451] [lua/INFO] Received another request of type find successor
-> [Gatien:node:(1) 549.019451] [lua/INFO] Received a 'find successor' request from 42 for id 58
-> [Gatien:node:(1) 549.019451] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [iRMX:node:(3) 549.084983] [lua/INFO] Received a 'find successor' request from 48 for id 64
-> [iRMX:node:(3) 549.084983] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 64 is 42
-> [TeX:node:(5) 551.384333] [lua/INFO] Sending a 'find successor' request to 48 for id 37
-> [Gatien:node:(1) 551.656460] [lua/INFO] Received the answer to my 'find successor' request for id 64: the successor is 42
-> [TeX:node:(5) 552.996771] [lua/INFO] Sent the 'find successor' request to 48 for id 37, waiting for the answer
-> [Jean_Yves:node:(6) 554.807965] [lua/INFO] Sending a 'find successor' request to 1 for id 30
-> [Geoff:node:(4) 555.162085] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 555.162085] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 555.162085] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 555.162085] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 555.162085] [lua/INFO] Received a 'find successor' request from 42 for id 58
-> [Geoff:node:(4) 555.162085] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 58 is 38
-> [Jean_Yves:node:(6) 555.733124] [lua/INFO] Sent the 'find successor' request to 1 for id 30, waiting for the answer
-> [McGee:node:(2) 556.045165] [lua/INFO] Received the answer to my 'find successor' request for id 58: the successor is 38
-> [McGee:node:(2) 556.045165] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Geoff:node:(4) 556.431279] [lua/INFO] Received another request of type get predecessor
-> [Gatien:node:(1) 556.431279] [lua/INFO] Received a 'find successor' request from 21 for id 37
-> [Gatien:node:(1) 556.431279] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 557.700473] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Geoff:node:(4) 559.469830] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Jacquelin:node:(8) 559.471594] [lua/INFO] Received a 'find successor' request from 14 for id 30
-> [Jacquelin:node:(8) 559.471594] [lua/INFO] Sending back a 'find successor answer' to 14: the successor of 30 is 48
-> [Jean_Yves:node:(6) 560.396753] [lua/INFO] Received the answer to my 'find successor' request for id 30: the successor is 48
-> [Geoff:node:(4) 564.469830] [lua/INFO] Received a 'find successor' request from 21 for id 37
-> [Geoff:node:(4) 564.469830] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 37 is 38
-> [Geoff:node:(4) 564.469830] [lua/INFO] Sending a 'find successor' request to 42 for id 48
-> [Boivin:node:(7) 564.706738] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [TeX:node:(5) 566.277216] [lua/INFO] Received the answer to my 'find successor' request for id 37: the successor is 38
-> [iRMX:node:(3) 567.347447] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 567.347447] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [McGee:node:(2) 569.532809] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [McGee:node:(2) 569.532809] [lua/INFO] Received another request of type notify
-> [Boivin:node:(7) 569.706738] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 569.902668] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Geoff:node:(4) 570.415889] [lua/INFO] Sent the 'find successor' request to 42 for id 48, waiting for the answer
-> [McGee:node:(2) 570.415889] [lua/INFO] Received another request of type find successor
-> [McGee:node:(2) 570.415889] [lua/INFO] Received a 'find successor' request from 32 for id 48
-> [McGee:node:(2) 570.415889] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Geoff:node:(4) 570.415889] [lua/INFO] Received another request of type notify
-> [Gatien:node:(1) 571.685083] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 571.685083] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 571.685083] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 571.685083] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 571.685083] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 572.209139] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 572.347447] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 572.347447] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [Gatien:node:(1) 574.264464] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 574.532809] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Boivin:node:(7) 579.706738] [lua/INFO] Sending a 'find successor' request to 42 for id 24
-> [TeX:node:(5) 580.540180] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [TeX:node:(5) 580.540180] [lua/INFO] Received another request of type find successor
-> [TeX:node:(5) 580.540180] [lua/INFO] Received a 'find successor' request from 32 for id 48
-> [TeX:node:(5) 580.540180] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 48 is 1
-> [TeX:node:(5) 581.494377] [lua/INFO] Received another request of type get predecessor
-> [Geoff:node:(4) 582.347566] [lua/INFO] Received the answer to my 'find successor' request for id 48: the successor is 1
-> [iRMX:node:(3) 583.679739] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 583.679739] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [Boivin:node:(7) 583.784549] [lua/INFO] Sent the 'find successor' request to 42 for id 24, waiting for the answer
-> [McGee:node:(2) 583.784549] [lua/INFO] Received a 'find successor' request from 8 for id 24
-> [McGee:node:(2) 583.784549] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [McGee:node:(2) 584.738746] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [iRMX:node:(3) 586.718290] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 586.718290] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [TeX:node:(5) 586.872472] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 589.289767] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 591.872472] [lua/INFO] Received a 'find successor' request from 8 for id 24
-> [TeX:node:(5) 591.872472] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 24 is 1
-> [Boivin:node:(7) 593.000598] [lua/INFO] Received the answer to my 'find successor' request for id 24: the successor is 1
-> [Boivin:node:(7) 593.000598] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Geoff:node:(4) 595.154683] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 596.486856] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [McGee:node:(2) 596.486856] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 598.672218] [lua/INFO] Received another request of type notify
-> [iRMX:node:(3) 599.301494] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 599.301494] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [McGee:node:(2) 600.465468] [lua/INFO] Received another request of type notify
-> [TeX:node:(5) 601.472587] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Boivin:node:(7) 601.660785] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [McGee:node:(2) 602.650830] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 603.385326] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [iRMX:node:(3) 604.301494] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 604.301494] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Boivin:node:(7) 606.660785] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Geoff:node:(4) 612.340045] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Geoff:node:(4) 612.340045] [lua/INFO] Received another request of type notify
-> [Gatien:node:(1) 613.609239] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 613.609239] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 613.609239] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 613.609239] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [iRMX:node:(3) 614.301494] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 614.301494] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 617.340045] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 617.494227] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 617.494227] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 617.494227] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [TeX:node:(5) 617.494227] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 618.448424] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [TeX:node:(5) 620.686960] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 620.934395] [lua/INFO] Received another request of type get predecessor
-> [Boivin:node:(7) 622.212808] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [iRMX:node:(3) 622.892069] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 622.892069] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [Gatien:node:(1) 625.463545] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 632.262793] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [McGee:node:(2) 632.262793] [lua/INFO] Received another request of type get predecessor
-> [Geoff:node:(4) 633.692921] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [TeX:node:(5) 634.312412] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 634.448155] [lua/INFO] Received another request of type notify
-> [iRMX:node:(3) 635.077431] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 635.077431] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [McGee:node:(2) 636.241404] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 638.426767] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 639.385176] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Gatien:node:(1) 640.654370] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Boivin:node:(7) 642.436721] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Gatien:node:(1) 645.048755] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 645.077431] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 645.077431] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Boivin:node:(7) 647.436721] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 647.597825] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 651.154533] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 651.154533] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 651.154533] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 651.154533] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 651.154533] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 651.154533] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Geoff:node:(4) 654.193084] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 654.347266] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 654.347266] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 654.347266] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [TeX:node:(5) 654.347266] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 656.803489] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [TeX:node:(5) 657.539999] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Boivin:node:(7) 663.891919] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [iRMX:node:(3) 666.532628] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 666.532628] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [iRMX:node:(3) 666.532628] [lua/INFO] Sending a 'find successor' request to 42 for id 70
-> [Gatien:node:(1) 667.597825] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 668.136016] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Gatien:node:(1) 670.169301] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 682.713030] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Gatien:node:(1) 683.982224] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 683.982224] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 683.982224] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 690.146894] [lua/INFO] Received another request of type get predecessor
-> [Gatien:node:(1) 692.695963] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 706.803489] [lua/INFO] Failed to send the 'find successor' request to 38 for id 1337
-> [iRMX:node:(3) 710.782100] [lua/INFO] Sent the 'find successor' request to 42 for id 70, waiting for the answer
-> [McGee:node:(2) 710.782100] [lua/INFO] Received a 'find successor' request from 38 for id 70
-> [McGee:node:(2) 710.782100] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [iRMX:node:(3) 710.782100] [lua/INFO] Received another request of type get predecessor
-> [Gatien:node:(1) 712.695963] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 713.141391] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 713.820651] [lua/INFO] Sending a 'find successor' request to 38 for id 64
-> [Boivin:node:(7) 713.891919] [lua/INFO] Failed to send the 'find successor' request to 38 for id 1337
-> [iRMX:node:(3) 713.891919] [lua/INFO] Failed to receive the answer to my 'find successor' request
-> [Jean_Yves:node:(6) 714.368599] [lua/INFO] Sending a 'find successor' request to 42 for id 46
-> [Gatien:node:(1) 715.245033] [lua/INFO] Received another request of type notify
-> [TeX:node:(5) 717.084652] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 717.084652] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 717.084652] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [TeX:node:(5) 717.084652] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 718.038848] [lua/INFO] Received another request of type find successor
-> [TeX:node:(5) 718.038848] [lua/INFO] Received a 'find successor' request from 38 for id 70
-> [TeX:node:(5) 718.038848] [lua/INFO] Sending back a 'find successor answer' to 38: the successor of 70 is 1
-> [Jean_Yves:node:(6) 719.663780] [lua/INFO] Sent the 'find successor' request to 42 for id 46, waiting for the answer
-> [McGee:node:(2) 719.663780] [lua/INFO] Received a 'find successor' request from 14 for id 46
-> [McGee:node:(2) 719.663780] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [iRMX:node:(3) 720.123203] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 720.123203] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [McGee:node:(2) 720.617976] [lua/INFO] Sending a 'find successor' request to 48 for id 74
-> [TeX:node:(5) 721.231581] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 722.694679] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 723.044307] [lua/INFO] Received a 'find successor' request from 14 for id 46
-> [TeX:node:(5) 723.044307] [lua/INFO] Sending back a 'find successor answer' to 14: the successor of 46 is 1
-> [McGee:node:(2) 723.094180] [lua/INFO] Sent the 'find successor' request to 48 for id 74, waiting for the answer
-> [Gatien:node:(1) 723.963873] [lua/INFO] Received a 'find successor' request from 42 for id 74
-> [Gatien:node:(1) 723.963873] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 74 is 32
-> [McGee:node:(2) 724.363374] [lua/INFO] Received the answer to my 'find successor' request for id 74: the successor is 32
-> [McGee:node:(2) 724.363374] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Jean_Yves:node:(6) 725.761863] [lua/INFO] Received the answer to my 'find successor' request for id 46: the successor is 1
-> [TeX:node:(5) 725.811230] [lua/INFO] Sending a 'find successor' request to 48 for id 53
-> [Geoff:node:(4) 726.200304] [lua/INFO] Sent the 'find successor' request to 38 for id 64, waiting for the answer
-> [iRMX:node:(3) 726.200304] [lua/INFO] Received a 'find successor' request from 32 for id 64
-> [iRMX:node:(3) 726.200304] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 64 is 42
-> [Geoff:node:(4) 726.200304] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 727.083384] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 727.083384] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 727.083384] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Geoff:node:(4) 727.083384] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 727.151542] [lua/INFO] Sent the 'find successor' request to 48 for id 53, waiting for the answer
-> [Gatien:node:(1) 727.151542] [lua/INFO] Received a 'find successor' request from 21 for id 53
-> [Gatien:node:(1) 727.151542] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 53 is 32
-> [TeX:node:(5) 728.491853] [lua/INFO] Received the answer to my 'find successor' request for id 53: the successor is 32
-> [Geoff:node:(4) 730.121935] [lua/INFO] Received the answer to my 'find successor' request for id 64: the successor is 42
-> [Geoff:node:(4) 730.121935] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Boivin:node:(7) 730.918886] [lua/INFO] Sending a 'find successor' request to 38 for id 40
-> [McGee:node:(2) 732.930319] [lua/INFO] Received another request of type notify
-> [Gatien:node:(1) 733.420736] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [TeX:node:(5) 733.491853] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [McGee:node:(2) 737.555112] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 740.744957] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 740.744957] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [McGee:node:(2) 741.141611] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 743.326973] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Geoff:node:(4) 743.783508] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Geoff:node:(4) 743.783508] [lua/INFO] Received another request of type notify
-> [Gatien:node:(1) 745.052702] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 745.052702] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 745.052702] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 745.052702] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 745.052702] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 745.744957] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 745.744957] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [TeX:node:(5) 746.860088] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 746.860088] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 746.860088] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Geoff:node:(4) 746.860088] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 746.860088] [lua/INFO] Received another request of type get predecessor
-> [Gatien:node:(1) 747.601772] [lua/INFO] Received another request of type notify
-> [TeX:node:(5) 748.768481] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 749.898639] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Boivin:node:(7) 753.104248] [lua/INFO] Sent the 'find successor' request to 38 for id 40, waiting for the answer
-> [iRMX:node:(3) 753.104248] [lua/INFO] Received a 'find successor' request from 8 for id 40
-> [iRMX:node:(3) 753.104248] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 40 is 42
-> [Boivin:node:(7) 755.463538] [lua/INFO] Received the answer to my 'find successor' request for id 40: the successor is 42
-> [iRMX:node:(3) 756.142799] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 756.142799] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [McGee:node:(2) 757.814285] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [McGee:node:(2) 758.697364] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Gatien:node:(1) 758.714275] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 759.181350] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 759.181350] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [McGee:node:(2) 761.141611] [lua/INFO] Received another request of type get predecessor
-> [Geoff:node:(4) 762.219901] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Geoff:node:(4) 762.219901] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 762.374083] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 764.728110] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 766.527646] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Boivin:node:(7) 766.938482] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 768.949916] [lua/INFO] Received another request of type notify
-> [Gatien:node:(1) 769.758289] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [iRMX:node:(3) 771.764554] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 771.764554] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [TeX:node:(5) 773.139963] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [McGee:node:(2) 773.949916] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Geoff:node:(4) 779.803105] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Geoff:node:(4) 779.803105] [lua/INFO] Received another request of type notify
-> [Gatien:node:(1) 781.072299] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 781.072299] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 781.072299] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 781.072299] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 781.072299] [lua/INFO] Received another request of type notify
-> [iRMX:node:(3) 781.764554] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 781.764554] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [TeX:node:(5) 782.879684] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 782.879684] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 782.879684] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Geoff:node:(4) 782.879684] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 782.879684] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 784.788078] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 785.918235] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 788.833881] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Boivin:node:(7) 789.123844] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [McGee:node:(2) 789.716961] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 790.918235] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Geoff:node:(4) 790.918235] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [McGee:node:(2) 791.019243] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 791.019243] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 791.019243] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Gatien:node:(1) 792.501759] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 792.812493] [lua/INFO] Received another request of type notify
-> [Boivin:node:(7) 793.378534] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 794.057794] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 794.057794] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [Gatien:node:(1) 795.050828] [lua/INFO] Received another request of type notify
-> [iRMX:node:(3) 797.096345] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 797.096345] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [Gatien:node:(1) 797.622305] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 800.134896] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 800.134896] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [TeX:node:(5) 800.289078] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 802.320258] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 804.442641] [lua/INFO] Sending a 'find successor' request to 32 for id 112
-> [Geoff:node:(4) 806.211998] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [TeX:node:(5) 810.589019] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Boivin:node:(7) 812.718100] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 816.543216] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Geoff:node:(4) 818.397360] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Geoff:node:(4) 818.397360] [lua/INFO] Received another request of type notify
-> [Gatien:node:(1) 819.666554] [lua/INFO] Sent the 'find successor' request to 32 for id 112, waiting for the answer
-> [Geoff:node:(4) 819.666554] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 819.666554] [lua/INFO] Received a 'find successor' request from 48 for id 112
-> [Geoff:node:(4) 819.666554] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 819.666554] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 820.358809] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 820.358809] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [TeX:node:(5) 821.473940] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 821.473940] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 821.473940] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Geoff:node:(4) 821.473940] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 821.473940] [lua/INFO] Received another request of type notify
-> [Gatien:node:(1) 822.215624] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 822.357020] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 822.357020] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 822.357020] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [Geoff:node:(4) 822.357020] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [McGee:node:(2) 822.357020] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 825.395571] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 827.544171] [lua/INFO] Received another request of type get predecessor
-> [Boivin:node:(7) 827.718100] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 827.718100] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 827.718100] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Boivin:node:(7) 830.077390] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 830.756651] [lua/INFO] Received a 'find successor' request from 48 for id 112
-> [iRMX:node:(3) 830.756651] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 112 is 42
-> [Gatien:node:(1) 833.328127] [lua/INFO] Received the answer to my 'find successor' request for id 112: the successor is 42
-> [iRMX:node:(3) 833.795202] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 833.795202] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [iRMX:node:(3) 836.833753] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 836.833753] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [TeX:node:(5) 836.987935] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 839.019115] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 839.019115] [lua/INFO] Sending a 'find successor' request to 42 for id 70
-> [Gatien:node:(1) 843.484818] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [iRMX:node:(3) 845.183089] [lua/INFO] Sent the 'find successor' request to 42 for id 70, waiting for the answer
-> [McGee:node:(2) 845.183089] [lua/INFO] Received a 'find successor' request from 38 for id 70
-> [McGee:node:(2) 845.183089] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [iRMX:node:(3) 845.183089] [lua/INFO] Received another request of type get predecessor
-> [Gatien:node:(1) 846.023206] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 846.023206] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 846.023206] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 846.023206] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 846.137285] [lua/INFO] Sending a 'find successor' request to 32 for id 106
-> [iRMX:node:(3) 847.542379] [lua/INFO] Received another request of type get predecessor
-> [Jean_Yves:node:(6) 847.605614] [lua/INFO] Sending a 'find successor' request to 1 for id 78
-> [TeX:node:(5) 847.753815] [lua/INFO] Received a 'find successor' request from 38 for id 70
-> [TeX:node:(5) 847.753815] [lua/INFO] Sending back a 'find successor answer' to 38: the successor of 70 is 1
-> [TeX:node:(5) 847.753815] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Geoff:node:(4) 849.061757] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Jean_Yves:node:(6) 849.415317] [lua/INFO] Sent the 'find successor' request to 1 for id 78, waiting for the answer
-> [Boivin:node:(7) 849.901670] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 849.944837] [lua/INFO] Sent the 'find successor' request to 32 for id 106, waiting for the answer
-> [McGee:node:(2) 849.944837] [lua/INFO] Received another request of type notify
-> [iRMX:node:(3) 850.580930] [lua/INFO] Received another request of type find successor
-> [iRMX:node:(3) 850.580930] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 850.580930] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [Gatien:node:(1) 853.152407] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Jacquelin:node:(8) 853.490158] [lua/INFO] Received a 'find successor' request from 14 for id 78
-> [Jacquelin:node:(8) 853.490158] [lua/INFO] Sending back a 'find successor answer' to 14: the successor of 78 is 48
-> [iRMX:node:(3) 853.773663] [lua/INFO] Received the answer to my 'find successor' request for id 70: the successor is 1
-> [Jean_Yves:node:(6) 854.415317] [lua/INFO] Received the answer to my 'find successor' request for id 78: the successor is 48
-> [Geoff:node:(4) 861.812214] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [Geoff:node:(4) 861.812214] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 861.812214] [lua/INFO] Received a 'find successor' request from 42 for id 106
-> [Geoff:node:(4) 861.812214] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 106 is 38
-> [McGee:node:(2) 862.695294] [lua/INFO] Received the answer to my 'find successor' request for id 106: the successor is 38
-> [McGee:node:(2) 862.695294] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Gatien:node:(1) 863.152407] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [TeX:node:(5) 863.619600] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 863.619600] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 863.619600] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [Geoff:node:(4) 863.619600] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [TeX:node:(5) 863.619600] [lua/INFO] Received another request of type notify
-> [iRMX:node:(3) 863.773663] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 863.773663] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Gatien:node:(1) 864.888794] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 864.888794] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 864.888794] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 864.888794] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 864.888794] [lua/INFO] Received another request of type get predecessor
-> [Gatien:node:(1) 867.437863] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 867.927345] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Geoff:node:(4) 867.927345] [lua/INFO] Sending a 'find successor' request to 42 for id 96
-> [Boivin:node:(7) 868.492245] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 868.492245] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 868.492245] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [McGee:node:(2) 870.677607] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 870.677607] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 870.677607] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [McGee:node:(2) 870.677607] [lua/INFO] Received another request of type get predecessor
-> [Boivin:node:(7) 870.851535] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 872.470856] [lua/INFO] Received another request of type get predecessor
-> [Geoff:node:(4) 873.353936] [lua/INFO] Sent the 'find successor' request to 42 for id 96, waiting for the answer
-> [McGee:node:(2) 873.353936] [lua/INFO] Received another request of type find successor
-> [McGee:node:(2) 873.353936] [lua/INFO] Received a 'find successor' request from 32 for id 96
-> [McGee:node:(2) 873.353936] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [iRMX:node:(3) 873.716158] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 873.716158] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [TeX:node:(5) 874.308133] [lua/INFO] Received another request of type find successor
-> [TeX:node:(5) 874.308133] [lua/INFO] Received a 'find successor' request from 32 for id 96
-> [TeX:node:(5) 874.308133] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 96 is 1
-> [McGee:node:(2) 875.539298] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Geoff:node:(4) 876.115518] [lua/INFO] Received the answer to my 'find successor' request for id 96: the successor is 1
-> [iRMX:node:(3) 876.754709] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 876.754709] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [TeX:node:(5) 877.500866] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 879.326185] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 882.976055] [lua/INFO] Sending a 'find successor' request to 32 for id 85
-> [Boivin:node:(7) 886.299361] [lua/INFO] Sending a 'find successor' request to 42 for id 72
-> [Boivin:node:(7) 886.404172] [lua/INFO] Sent the 'find successor' request to 42 for id 72, waiting for the answer
-> [McGee:node:(2) 887.079630] [lua/INFO] Received a 'find successor' request from 8 for id 72
-> [McGee:node:(2) 887.079630] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [McGee:node:(2) 887.079630] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [TeX:node:(5) 888.786007] [lua/INFO] Sent the 'find successor' request to 32 for id 85, waiting for the answer
-> [Geoff:node:(4) 888.786007] [lua/INFO] Received a 'find successor' request from 21 for id 85
-> [Geoff:node:(4) 888.786007] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 85 is 38
-> [TeX:node:(5) 888.786007] [lua/INFO] Received another request of type notify
-> [TeX:node:(5) 889.740204] [lua/INFO] Received another request of type find successor
-> [TeX:node:(5) 889.740204] [lua/INFO] Received a 'find successor' request from 8 for id 72
-> [TeX:node:(5) 889.740204] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 72 is 1
-> [Boivin:node:(7) 890.868329] [lua/INFO] Received the answer to my 'find successor' request for id 72: the successor is 1
-> [Boivin:node:(7) 890.868329] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [TeX:node:(5) 891.547590] [lua/INFO] Received the answer to my 'find successor' request for id 85: the successor is 38
-> [TeX:node:(5) 891.547590] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Geoff:node:(4) 893.093752] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Gatien:node:(1) 893.707057] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Gatien:node:(1) 894.976252] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [McGee:node:(2) 896.125433] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [McGee:node:(2) 896.125433] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 898.940071] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 898.940071] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [McGee:node:(2) 899.711932] [lua/INFO] Received another request of type notify
-> [Boivin:node:(7) 901.299361] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [McGee:node:(2) 901.897294] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 904.082656] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 904.082656] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Boivin:node:(7) 906.441947] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 907.275389] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 907.275389] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 907.275389] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [TeX:node:(5) 907.851491] [lua/INFO] Received another request of type get predecessor
-> [Gatien:node:(1) 909.986933] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 911.044224] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Gatien:node:(1) 912.536002] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 913.352491] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 913.352491] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 913.352491] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 913.352491] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 913.352491] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 913.352491] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [McGee:node:(2) 913.805687] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Geoff:node:(4) 916.391042] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Boivin:node:(7) 918.071072] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [iRMX:node:(3) 922.897144] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 922.897144] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [TeX:node:(5) 923.074193] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 925.082506] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [McGee:node:(2) 925.082506] [lua/INFO] Received another request of type notify
-> [Gatien:node:(1) 925.468620] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 926.875755] [lua/INFO] Received another request of type get predecessor
-> [iRMX:node:(3) 927.897144] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 927.897144] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [McGee:node:(2) 930.082506] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Geoff:node:(4) 936.512634] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Gatien:node:(1) 937.204889] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Gatien:node:(1) 938.474083] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Gatien:node:(1) 939.753958] [lua/INFO] Received another request of type notify
-> [Boivin:node:(7) 940.256434] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 940.256434] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 940.256434] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Boivin:node:(7) 942.615725] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 943.449167] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 943.449167] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 943.449167] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [TeX:node:(5) 943.449167] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 944.403364] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [TeX:node:(5) 946.641901] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Geoff:node:(4) 949.526269] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 949.526269] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 949.526269] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 949.526269] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 949.526269] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 949.526269] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Geoff:node:(4) 952.564820] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 958.896994] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [McGee:node:(2) 958.896994] [lua/INFO] Received another request of type get predecessor
-> [Boivin:node:(7) 959.070922] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Gatien:node:(1) 959.753958] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 960.292150] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [McGee:node:(2) 961.082356] [lua/INFO] Received another request of type notify
-> [iRMX:node:(3) 961.711632] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 961.711632] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [Gatien:node:(1) 962.303028] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 962.875605] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 965.060967] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 966.711632] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [iRMX:node:(3) 966.711632] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
-> [Gatien:node:(1) 969.283108] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [Geoff:node:(4) 974.750183] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [Jean_Yves:node:(6) 975.690243] [lua/INFO] Sending a 'find successor' request to 42 for id 142
-> [Boivin:node:(7) 976.430213] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 976.430213] [lua/INFO] Received a 'find successor' request from 8 for id 1337
-> [iRMX:node:(3) 976.430213] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
-> [Jean_Yves:node:(6) 977.483493] [lua/INFO] Sent the 'find successor' request to 42 for id 142, waiting for the answer
-> [McGee:node:(2) 977.483493] [lua/INFO] Received a 'find successor' request from 14 for id 142
-> [McGee:node:(2) 977.483493] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Boivin:node:(7) 978.789503] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [TeX:node:(5) 979.622946] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 979.622946] [lua/INFO] Received a 'find successor' request from 21 for id 1337
-> [iRMX:node:(3) 979.622946] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
-> [TeX:node:(5) 979.622946] [lua/INFO] Received another request of type get predecessor
-> [TeX:node:(5) 980.577143] [lua/INFO] Received another request of type find successor
-> [TeX:node:(5) 980.577143] [lua/INFO] Received a 'find successor' request from 14 for id 142
-> [TeX:node:(5) 980.577143] [lua/INFO] Sending back a 'find successor answer' to 14: the successor of 142 is 1
-> [McGee:node:(2) 980.577143] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [iRMX:node:(3) 981.808308] [lua/INFO] Sending a 'find successor' request to 1 for id 102
-> [Gatien:node:(1) 981.821496] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
-> [Jean_Yves:node:(6) 983.294698] [lua/INFO] Received the answer to my 'find successor' request for id 142: the successor is 1
-> [TeX:node:(5) 983.769876] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 984.852200] [lua/INFO] Sent the 'find successor' request to 1 for id 102, waiting for the answer
-> [Jacquelin:node:(8) 984.852200] [lua/INFO] Received a 'find successor' request from 38 for id 102
-> [Jacquelin:node:(8) 984.852200] [lua/INFO] Sending back a 'find successor answer' to 38: the successor of 102 is 48
-> [iRMX:node:(3) 984.852200] [lua/INFO] Received another request of type notify
-> [Geoff:node:(4) 987.890751] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 987.890751] [lua/INFO] Received another request of type find successor
-> [iRMX:node:(3) 987.890751] [lua/INFO] Received a 'find successor' request from 32 for id 1337
-> [iRMX:node:(3) 987.890751] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
-> [Geoff:node:(4) 987.890751] [lua/INFO] Received another request of type notify
-> [Gatien:node:(1) 989.159945] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
-> [Geoff:node:(4) 989.159945] [lua/INFO] Received another request of type find successor
-> [Geoff:node:(4) 989.159945] [lua/INFO] Received a 'find successor' request from 48 for id 1337
-> [Geoff:node:(4) 989.159945] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
-> [Gatien:node:(1) 989.159945] [lua/INFO] Received another request of type get predecessor
-> [McGee:node:(2) 990.076113] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
-> [iRMX:node:(3) 990.076113] [lua/INFO] Received another request of type find successor
-> [iRMX:node:(3) 990.076113] [lua/INFO] Received a 'find successor' request from 42 for id 1337
-> [iRMX:node:(3) 990.076113] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
-> [McGee:node:(2) 990.076113] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 991.869362] [lua/INFO] Received another request of type get predecessor
-> [Geoff:node:(4) 992.198496] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [iRMX:node:(3) 992.435403] [lua/INFO] Received another request of type get predecessor
-> [Gatien:node:(1) 992.839447] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 994.054724] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
-> [McGee:node:(2) 994.054724] [lua/INFO] Sending a 'find successor' request to 48 for id 170
-> [McGee:node:(2) 994.454225] [lua/INFO] Sent the 'find successor' request to 48 for id 170, waiting for the answer
-> [Gatien:node:(1) 994.454225] [lua/INFO] Received another request of type find successor
-> [Gatien:node:(1) 994.454225] [lua/INFO] Received a 'find successor' request from 42 for id 170
-> [Gatien:node:(1) 994.454225] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 170 is 32
-> [Boivin:node:(7) 994.794694] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [iRMX:node:(3) 995.479295] [lua/INFO] Received the answer to my 'find successor' request for id 102: the successor is 48
-> [McGee:node:(2) 995.847974] [lua/INFO] Received another request of type notify
-> [McGee:node:(2) 996.247475] [lua/INFO] Received the answer to my 'find successor' request for id 170: the successor is 32
-> [TeX:node:(5) 998.477652] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
-> [iRMX:node:(3) 1000.479295] [lua/INFO] Leaving the ring
-> [McGee:node:(2) 1001.247475] [lua/INFO] Leaving the ring
-> [Jacquelin:node:(8) 1001.564913] [lua/INFO] Leaving the ring
-> [Jean_Yves:node:(6) 1003.662612] [lua/INFO] Leaving the ring
-> [Gatien:node:(1) 1044.454225] [lua/INFO] Failed to receive the answer to my 'find successor' request
-> [Gatien:node:(1) 1044.454225] [lua/INFO] Leaving the ring
-> [Boivin:node:(7) 1044.794694] [lua/INFO] Failed to send the 'find successor' request to 38 for id 1337
-> [Boivin:node:(7) 1044.794694] [lua/INFO] Leaving the ring
-> [Geoff:node:(4) 1047.198496] [lua/INFO] Leaving the ring
-> [TeX:node:(5) 1048.477652] [lua/INFO] Failed to send the 'find successor' request to 38 for id 1337
-> [TeX:node:(5) 1048.477652] [lua/INFO] Leaving the ring
+> [McGee:node:(2) 115.888356] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [TeX:node:(5) 126.674223] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [Jacquelin:node:(8) 126.674223] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Jacquelin:node:(8) 126.674223] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
+> [TeX:node:(5) 128.486825] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [McGee:node:(2) 132.748286] [lua/INFO] Sending a 'find successor' request to 21 for id 1337
+> [McGee:node:(2) 133.702424] [lua/INFO] Sent the 'find successor' request to 21 for id 1337, waiting for the answer
+> [TeX:node:(5) 136.721551] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [TeX:node:(5) 136.721551] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 138.534153] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [McGee:node:(2) 143.937377] [lua/INFO] Received another request of type get predecessor
+> [McGee:node:(2) 145.703402] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 148.272563] [lua/INFO] Received another request of type get predecessor
+> [McGee:node:(2) 152.642987] [lua/INFO] Received another request of type notify
+> [Jacquelin:node:(8) 154.970016] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Jacquelin:node:(8) 154.970016] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
+> [McGee:node:(2) 155.858372] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [TeX:node:(5) 161.782618] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [Jacquelin:node:(8) 161.782618] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Jacquelin:node:(8) 161.782618] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
+> [TeX:node:(5) 161.782618] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 162.910671] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 164.250895] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 165.205033] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 166.586415] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 166.657541] [lua/INFO] Sending a 'find successor' request to 21 for id 1337
+> [TeX:node:(5) 167.017635] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Geoff:node:(4) 169.624750] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 170.457775] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 170.457775] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 173.496110] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 174.796126] [lua/INFO] Sent the 'find successor' request to 21 for id 1337, waiting for the answer
+> [TeX:node:(5) 174.796126] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [TeX:node:(5) 174.796126] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 174.796126] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 176.981338] [lua/INFO] Received another request of type get predecessor
+> [Jacquelin:node:(8) 180.525343] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Jacquelin:node:(8) 180.525343] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
+> [McGee:node:(2) 181.351762] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 181.608743] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [McGee:node:(2) 182.240118] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Geoff:node:(4) 183.496110] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Geoff:node:(4) 186.534446] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [TeX:node:(5) 187.337945] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [Jacquelin:node:(8) 187.337945] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Jacquelin:node:(8) 187.337945] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
+> [TeX:node:(5) 187.337945] [lua/INFO] Received another request of type get predecessor
+> [iRMX:node:(3) 189.166550] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 189.166550] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [TeX:node:(5) 190.055334] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 191.395557] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 192.204885] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 192.349696] [lua/INFO] Received another request of type get predecessor
+> [McGee:node:(2) 193.303834] [lua/INFO] Sending a 'find successor' request to 21 for id 1337
+> [TeX:node:(5) 194.162298] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Geoff:node:(4) 202.204885] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 205.600566] [lua/INFO] Sent the 'find successor' request to 21 for id 1337, waiting for the answer
+> [TeX:node:(5) 205.600566] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [TeX:node:(5) 205.600566] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 205.600566] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 207.413182] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [Jacquelin:node:(8) 207.670006] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Jacquelin:node:(8) 207.670006] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
+> [Geoff:node:(4) 208.281556] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 208.281556] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 208.281556] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [McGee:node:(2) 208.558362] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Geoff:node:(4) 211.319892] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Boivin:node:(7) 213.663165] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [TeX:node:(5) 214.482607] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [Jacquelin:node:(8) 214.482607] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Jacquelin:node:(8) 214.482607] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
+> [TeX:node:(5) 214.512500] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 216.022292] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [TeX:node:(5) 216.325102] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Gatien:node:(1) 216.542538] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 218.995152] [lua/INFO] Sending a 'find successor' request to 21 for id 1337
+> [iRMX:node:(3) 220.466768] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 220.466768] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Geoff:node:(4) 221.319892] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 222.279240] [lua/INFO] Sent the 'find successor' request to 21 for id 1337, waiting for the answer
+> [McGee:node:(2) 222.279240] [lua/INFO] Received another request of type notify
+> [Boivin:node:(7) 222.825895] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 223.038065] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [Gatien:node:(1) 223.038065] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 224.072395] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 225.466768] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 225.466768] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [TeX:node:(5) 226.325102] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [TeX:node:(5) 226.325102] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 226.325102] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [Gatien:node:(1) 228.038065] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 228.505104] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 230.466768] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 230.466768] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Jacquelin:node:(8) 232.417504] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Jacquelin:node:(8) 232.417504] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
+> [McGee:node:(2) 232.651980] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 232.825895] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Geoff:node:(4) 233.505104] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 233.540336] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [TeX:node:(5) 234.230106] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [Boivin:node:(7) 237.196320] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [Jacquelin:node:(8) 237.417504] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Jacquelin:node:(8) 237.417504] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
+> [TeX:node:(5) 239.230106] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [iRMX:node:(3) 239.837192] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 239.837192] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Boivin:node:(7) 242.196320] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 247.875528] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 248.809448] [lua/INFO] Sending a 'find successor' request to 21 for id 1337
+> [Gatien:node:(1) 252.528683] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [TeX:node:(5) 252.855310] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [Gatien:node:(1) 253.797791] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [McGee:node:(2) 253.809448] [lua/INFO] Sent the 'find successor' request to 21 for id 1337, waiting for the answer
+> [TeX:node:(5) 254.667911] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [TeX:node:(5) 254.667911] [lua/INFO] Received another request of type find successor
+> [TeX:node:(5) 254.667911] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [TeX:node:(5) 254.667911] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 257.022404] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 257.196320] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Jacquelin:node:(8) 258.682938] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Jacquelin:node:(8) 258.682938] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
+> [TeX:node:(5) 260.495554] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Geoff:node:(4) 260.913863] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 260.913863] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 260.913863] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 260.913863] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 260.913863] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 260.913863] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Jacquelin:node:(8) 263.682938] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Jacquelin:node:(8) 263.682938] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
+> [Geoff:node:(4) 263.952198] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 264.571294] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [McGee:node:(2) 264.571294] [lua/INFO] Sending a 'find successor' request to 21 for id 46
+> [McGee:node:(2) 265.525432] [lua/INFO] Sent the 'find successor' request to 21 for id 46, waiting for the answer
+> [McGee:node:(2) 267.126645] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 267.308156] [lua/INFO] Received a 'find successor' request from 42 for id 46
+> [TeX:node:(5) 267.308156] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 46 is 1
+> [McGee:node:(2) 269.311857] [lua/INFO] Received another request of type notify
+> [Gatien:node:(1) 269.957386] [lua/INFO] Received another request of type get predecessor
+> [McGee:node:(2) 270.265996] [lua/INFO] Received the answer to my 'find successor' request for id 46: the successor is 1
+> [Gatien:node:(1) 272.506283] [lua/INFO] Received another request of type notify
+> [Boivin:node:(7) 273.029499] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [TeX:node:(5) 275.495539] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [iRMX:node:(3) 275.670372] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 275.670372] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [McGee:node:(2) 276.449678] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [Boivin:node:(7) 278.029499] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 278.044436] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [TeX:node:(5) 278.044436] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 280.670372] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 280.670372] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [Jacquelin:node:(8) 281.231834] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Jacquelin:node:(8) 281.231834] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
+> [McGee:node:(2) 282.120190] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [TeX:node:(5) 283.044436] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Gatien:node:(1) 283.241669] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Jacquelin:node:(8) 286.231834] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Jacquelin:node:(8) 286.231834] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
+> [McGee:node:(2) 287.855584] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 288.708707] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 288.743940] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Boivin:node:(7) 290.388626] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Gatien:node:(1) 295.779885] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [TeX:node:(5) 296.669640] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [Geoff:node:(4) 298.253047] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [Geoff:node:(4) 298.253047] [lua/INFO] Received another request of type notify
+> [Gatien:node:(1) 299.522155] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Geoff:node:(4) 299.522155] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 299.522155] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 299.522155] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 299.522155] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 300.214711] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 300.214711] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 303.253047] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 303.866936] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [TeX:node:(5) 303.866936] [lua/INFO] Received another request of type get predecessor
+> [McGee:node:(2) 304.821074] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [TeX:node:(5) 305.775212] [lua/INFO] Received another request of type notify
+> [Jacquelin:node:(8) 307.054334] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Jacquelin:node:(8) 307.054334] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
+> [Boivin:node:(7) 307.573838] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [McGee:node:(2) 307.942690] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [TeX:node:(5) 308.866936] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [iRMX:node:(3) 310.214711] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 310.214711] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Jacquelin:node:(8) 312.054334] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Jacquelin:node:(8) 312.054334] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
+> [McGee:node:(2) 312.399923] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 312.573838] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [iRMX:node:(3) 313.253047] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 313.253047] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [McGee:node:(2) 313.288279] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Gatien:node:(1) 315.824343] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Boivin:node:(7) 322.797386] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 323.288279] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [McGee:node:(2) 325.491587] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [TeX:node:(5) 326.415832] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [McGee:node:(2) 326.874588] [lua/INFO] Received another request of type notify
+> [Geoff:node:(4) 329.053146] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Jacquelin:node:(8) 329.603231] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Jacquelin:node:(8) 329.603231] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
+> [Gatien:node:(1) 329.745702] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [McGee:node:(2) 330.491587] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Gatien:node:(1) 331.014811] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Boivin:node:(7) 332.797386] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 335.438259] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 335.438259] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [TeX:node:(5) 336.415832] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [TeX:node:(5) 336.415832] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 337.797386] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 339.531748] [lua/INFO] Received another request of type notify
+> [Jacquelin:node:(8) 339.603231] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Jacquelin:node:(8) 339.603231] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
+> [Gatien:node:(1) 340.877679] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 341.415832] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Geoff:node:(4) 341.514929] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 341.514929] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 341.514929] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 341.514929] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 341.514929] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 341.514929] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 343.426576] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 343.577609] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [McGee:node:(2) 344.465965] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [Geoff:node:(4) 344.553265] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 345.885354] [lua/INFO] Received another request of type notify
+> [Jacquelin:node:(8) 347.152127] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Jacquelin:node:(8) 347.152127] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
+> [McGee:node:(2) 347.678508] [lua/INFO] Received another request of type get predecessor
+> [McGee:node:(2) 348.566864] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [iRMX:node:(3) 348.700141] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 348.700141] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [Gatien:node:(1) 351.271438] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 353.964729] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [Boivin:node:(7) 356.059269] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 358.566864] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [TeX:node:(5) 358.964729] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [Jacquelin:node:(8) 362.152127] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Jacquelin:node:(8) 362.152127] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
+> [Geoff:node:(4) 362.315029] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Gatien:node:(1) 363.007585] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [McGee:node:(2) 363.040483] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [Jacquelin:node:(8) 363.426576] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Jacquelin:node:(8) 363.426576] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
+> [TeX:node:(5) 363.964729] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Gatien:node:(1) 364.276693] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Gatien:node:(1) 364.276693] [lua/INFO] Received another request of type get predecessor
+> [McGee:node:(2) 364.314932] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Boivin:node:(7) 366.059269] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 366.500144] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 366.500144] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Gatien:node:(1) 366.825590] [lua/INFO] Received another request of type notify
+> [Boivin:node:(7) 368.859271] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 372.576814] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 372.576814] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 372.576814] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 372.576814] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 372.576814] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 372.576814] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 374.918868] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [Geoff:node:(4) 375.615150] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [iRMX:node:(3) 379.762027] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 379.762027] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [McGee:node:(2) 381.439498] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [McGee:node:(2) 381.439498] [lua/INFO] Received another request of type notify
+> [Gatien:node:(1) 382.333323] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 382.363743] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [McGee:node:(2) 383.232652] [lua/INFO] Received another request of type notify
+> [Jacquelin:node:(8) 385.551142] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Jacquelin:node:(8) 385.551142] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 48
+> [McGee:node:(2) 386.439498] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Boivin:node:(7) 387.121154] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [TeX:node:(5) 389.176345] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [Jacquelin:node:(8) 389.176345] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Jacquelin:node:(8) 389.176345] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
+> [iRMX:node:(3) 389.762027] [lua/INFO] Sending a 'find successor' request to 42 for id 46
+> [TeX:node:(5) 390.988947] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [iRMX:node:(3) 391.947239] [lua/INFO] Sent the 'find successor' request to 42 for id 46, waiting for the answer
+> [iRMX:node:(3) 392.121154] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 392.393636] [lua/INFO] Received a 'find successor' request from 38 for id 46
+> [McGee:node:(2) 392.393636] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Geoff:node:(4) 392.800362] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Gatien:node:(1) 393.094698] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [Gatien:node:(1) 394.363807] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Boivin:node:(7) 394.480281] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 394.480281] [lua/INFO] Received another request of type find successor
+> [iRMX:node:(3) 394.480281] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 394.480281] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Boivin:node:(7) 396.839408] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 396.943101] [lua/INFO] Sending a 'find successor' request to 1 for id 50
+> [iRMX:node:(3) 397.518616] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 397.831457] [lua/INFO] Sent the 'find successor' request to 1 for id 50, waiting for the answer
+> [McGee:node:(2) 398.736255] [lua/INFO] Received another request of type get predecessor
+> [Jacquelin:node:(8) 400.450794] [lua/INFO] Received a 'find successor' request from 42 for id 50
+> [Jacquelin:node:(8) 400.450794] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 50 is 48
+> [Geoff:node:(4) 400.556952] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 400.556952] [lua/INFO] Received another request of type find successor
+> [iRMX:node:(3) 400.556952] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 400.556952] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 400.556952] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 400.556952] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 400.556952] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 400.988947] [lua/INFO] Received a 'find successor' request from 38 for id 46
+> [TeX:node:(5) 400.988947] [lua/INFO] Sending back a 'find successor answer' to 38: the successor of 46 is 1
+> [TeX:node:(5) 400.988947] [lua/INFO] Sending a 'find successor' request to 1 for id 1337
+> [McGee:node:(2) 401.339150] [lua/INFO] Received the answer to my 'find successor' request for id 50: the successor is 48
+> [McGee:node:(2) 401.339150] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
+> [McGee:node:(2) 401.738632] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
+> [Gatien:node:(1) 401.738632] [lua/INFO] Received another request of type find successor
+> [Gatien:node:(1) 401.738632] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Gatien:node:(1) 401.738632] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 402.801549] [lua/INFO] Sent the 'find successor' request to 1 for id 1337, waiting for the answer
+> [TeX:node:(5) 402.801549] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 403.132304] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 403.595305] [lua/INFO] Received another request of type find successor
+> [iRMX:node:(3) 403.595305] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 403.595305] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [Geoff:node:(4) 403.595305] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Jacquelin:node:(8) 405.450794] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Jacquelin:node:(8) 405.450794] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 48
+> [Gatien:node:(1) 406.166602] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [iRMX:node:(3) 406.787810] [lua/INFO] Received the answer to my 'find successor' request for id 46: the successor is 1
+> [Boivin:node:(7) 406.839408] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [TeX:node:(5) 407.263395] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 48
+> [Geoff:node:(4) 408.595305] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Geoff:node:(4) 408.595305] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 408.973022] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 409.198535] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 409.198535] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 409.198535] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Boivin:node:(7) 411.557662] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [iRMX:node:(3) 412.236871] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 412.236871] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [McGee:node:(2) 414.422101] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 417.263395] [lua/INFO] Sending a 'find successor' request to 1 for id 29
+> [TeX:node:(5) 419.075997] [lua/INFO] Sent the 'find successor' request to 1 for id 29, waiting for the answer
+> [Gatien:node:(1) 419.864413] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [Jacquelin:node:(8) 420.350446] [lua/INFO] Received a 'find successor' request from 21 for id 29
+> [Jacquelin:node:(8) 420.350446] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 29 is 48
+> [TeX:node:(5) 420.376239] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 421.781228] [lua/INFO] Sending a 'find successor' request to 38 for id 16
+> [TeX:node:(5) 422.188841] [lua/INFO] Received the answer to my 'find successor' request for id 29: the successor is 48
+> [TeX:node:(5) 422.188841] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
+> [TeX:node:(5) 423.529064] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
+> [TeX:node:(5) 423.529064] [lua/INFO] Received another request of type notify
+> [Gatien:node:(1) 423.729544] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Geoff:node:(4) 423.729544] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 423.729544] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 423.729544] [lua/INFO] Received another request of type find successor
+> [Gatien:node:(1) 423.729544] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Gatien:node:(1) 423.729544] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Geoff:node:(4) 424.998652] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Geoff:node:(4) 424.998652] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 426.330377] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
+> [McGee:node:(2) 426.729859] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
+> [Gatien:node:(1) 426.729859] [lua/INFO] Received another request of type find successor
+> [Gatien:node:(1) 426.729859] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Gatien:node:(1) 426.729859] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Geoff:node:(4) 428.036988] [lua/INFO] Sending a 'find successor' request to 38 for id 40
+> [Jean_Yves:node:(6) 428.123532] [lua/INFO] Sending a 'find successor' request to 42 for id 22
+> [McGee:node:(2) 429.916686] [lua/INFO] Received another request of type notify
+> [Jean_Yves:node:(6) 431.709841] [lua/INFO] Sent the 'find successor' request to 42 for id 22, waiting for the answer
+> [McGee:node:(2) 431.709841] [lua/INFO] Received another request of type find successor
+> [McGee:node:(2) 431.709841] [lua/INFO] Received a 'find successor' request from 14 for id 22
+> [McGee:node:(2) 431.709841] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Boivin:node:(7) 431.781228] [lua/INFO] Sent the 'find successor' request to 38 for id 16, waiting for the answer
+> [TeX:node:(5) 432.663979] [lua/INFO] Received another request of type find successor
+> [TeX:node:(5) 432.663979] [lua/INFO] Received a 'find successor' request from 14 for id 22
+> [TeX:node:(5) 432.663979] [lua/INFO] Sending back a 'find successor answer' to 14: the successor of 22 is 1
+> [iRMX:node:(3) 434.422101] [lua/INFO] Received a 'find successor' request from 8 for id 16
+> [iRMX:node:(3) 434.422101] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 16 is 42
+> [Jean_Yves:node:(6) 435.381368] [lua/INFO] Received the answer to my 'find successor' request for id 22: the successor is 1
+> [McGee:node:(2) 436.607313] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 436.624894] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 436.781228] [lua/INFO] Received the answer to my 'find successor' request for id 16: the successor is 42
+> [Boivin:node:(7) 436.781228] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [iRMX:node:(3) 437.460436] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 437.460436] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [Gatien:node:(1) 440.031733] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [iRMX:node:(3) 440.498771] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 440.498771] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [TeX:node:(5) 443.691277] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 446.575442] [lua/INFO] Sent the 'find successor' request to 38 for id 40, waiting for the answer
+> [iRMX:node:(3) 446.575442] [lua/INFO] Received a 'find successor' request from 32 for id 40
+> [iRMX:node:(3) 446.575442] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 40 is 42
+> [Geoff:node:(4) 446.575442] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 446.575442] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Geoff:node:(4) 446.575442] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Geoff:node:(4) 447.844550] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 450.882886] [lua/INFO] Received the answer to my 'find successor' request for id 40: the successor is 42
+> [McGee:node:(2) 450.945866] [lua/INFO] Received another request of type notify
+> [Boivin:node:(7) 451.119781] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [McGee:node:(2) 452.739020] [lua/INFO] Received another request of type get predecessor
+> [iRMX:node:(3) 453.760654] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 453.760654] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Gatien:node:(1) 454.113658] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [TeX:node:(5) 454.711944] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
+> [TeX:node:(5) 456.052167] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
+> [Boivin:node:(7) 456.119781] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 456.325329] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 458.760654] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 458.760654] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [McGee:node:(2) 460.945866] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 461.900004] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 463.068098] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Geoff:node:(4) 463.068098] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 463.068098] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 463.068098] [lua/INFO] Received another request of type find successor
+> [Gatien:node:(1) 463.068098] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Gatien:node:(1) 463.068098] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 463.808281] [lua/INFO] Received another request of type notify
+> [Geoff:node:(4) 464.337206] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Geoff:node:(4) 464.337206] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 464.342546] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 466.891443] [lua/INFO] Received another request of type notify
+> [Geoff:node:(4) 467.375541] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Boivin:node:(7) 471.119781] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [iRMX:node:(3) 471.798989] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 471.798989] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [McGee:node:(2) 472.854143] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
+> [Gatien:node:(1) 474.370286] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 474.769768] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
+> [iRMX:node:(3) 474.837325] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 474.837325] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [Gatien:node:(1) 475.639394] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Gatien:node:(1) 475.639394] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 476.325329] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 478.029830] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 479.911638] [lua/INFO] Received another request of type notify
+> [Geoff:node:(4) 480.913995] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 480.913995] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 480.913995] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 480.913995] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 482.183115] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 482.183115] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Geoff:node:(4) 482.183115] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Geoff:node:(4) 485.221451] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Boivin:node:(7) 485.632250] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 485.632250] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 485.632250] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Gatien:node:(1) 487.183115] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [Boivin:node:(7) 487.991377] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 490.002674] [lua/INFO] Received another request of type notify
+> [Gatien:node:(1) 491.490559] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Gatien:node:(1) 491.490559] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 492.429596] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
+> [iRMX:node:(3) 492.817462] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 492.817462] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [TeX:node:(5) 493.769819] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
+> [Gatien:node:(1) 493.769819] [lua/INFO] Received another request of type find successor
+> [Gatien:node:(1) 493.769819] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Gatien:node:(1) 493.769819] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 495.002674] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 495.855797] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 495.855797] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 495.956812] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 497.124905] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Geoff:node:(4) 497.124905] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 497.865089] [lua/INFO] Received another request of type notify
+> [Geoff:node:(4) 500.855797] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Boivin:node:(7) 505.176589] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 506.910951] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
+> [McGee:node:(2) 507.310433] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
+> [Gatien:node:(1) 507.310433] [lua/INFO] Received another request of type find successor
+> [Gatien:node:(1) 507.310433] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Gatien:node:(1) 507.310433] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [iRMX:node:(3) 507.817462] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 507.817462] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [McGee:node:(2) 510.002674] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 510.388759] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [iRMX:node:(3) 510.855797] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 510.855797] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [TeX:node:(5) 514.048303] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 516.932468] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 516.932468] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 516.932468] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 516.932468] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 516.932468] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Geoff:node:(4) 516.932468] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Geoff:node:(4) 518.201576] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 519.470684] [lua/INFO] Sending a 'find successor' request to 32 for id 64
+> [Geoff:node:(4) 521.239911] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Boivin:node:(7) 521.650722] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 521.650722] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 521.650722] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Boivin:node:(7) 524.009849] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 525.497259] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 527.673506] [lua/INFO] Sending a 'find successor' request to 48 for id 1337
+> [McGee:node:(2) 527.682472] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 528.835934] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 528.835934] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [iRMX:node:(3) 528.835934] [lua/INFO] Sending a 'find successor' request to 1 for id 54
+> [McGee:node:(2) 529.475626] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 531.660838] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [iRMX:node:(3) 531.879610] [lua/INFO] Sent the 'find successor' request to 1 for id 54, waiting for the answer
+> [iRMX:node:(3) 531.879610] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 533.143378] [lua/INFO] Sent the 'find successor' request to 32 for id 64, waiting for the answer
+> [Geoff:node:(4) 533.143378] [lua/INFO] Received a 'find successor' request from 48 for id 64
+> [Geoff:node:(4) 533.143378] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 533.143378] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 534.238737] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 534.483601] [lua/INFO] Sent the 'find successor' request to 48 for id 1337, waiting for the answer
+> [Gatien:node:(1) 534.483601] [lua/INFO] Received another request of type find successor
+> [Gatien:node:(1) 534.483601] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Gatien:node:(1) 534.483601] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 534.483601] [lua/INFO] Received another request of type get predecessor
+> [McGee:node:(2) 535.437739] [lua/INFO] Sending a 'find successor' request to 48 for id 58
+> [Jacquelin:node:(8) 535.760556] [lua/INFO] Received a 'find successor' request from 38 for id 54
+> [Jacquelin:node:(8) 535.760556] [lua/INFO] Sending back a 'find successor answer' to 38: the successor of 54 is 48
+> [McGee:node:(2) 535.837222] [lua/INFO] Sent the 'find successor' request to 48 for id 58, waiting for the answer
+> [Gatien:node:(1) 535.837222] [lua/INFO] Received another request of type find successor
+> [Gatien:node:(1) 535.837222] [lua/INFO] Received a 'find successor' request from 42 for id 58
+> [Gatien:node:(1) 535.837222] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Geoff:node:(4) 536.181713] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [TeX:node:(5) 536.391878] [lua/INFO] Received another request of type notify
+> [Boivin:node:(7) 536.597864] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [iRMX:node:(3) 537.277072] [lua/INFO] Received another request of type find successor
+> [iRMX:node:(3) 537.277072] [lua/INFO] Received a 'find successor' request from 48 for id 64
+> [iRMX:node:(3) 537.277072] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 64 is 42
+> [Gatien:node:(1) 539.848369] [lua/INFO] Received the answer to my 'find successor' request for id 64: the successor is 42
+> [iRMX:node:(3) 540.320748] [lua/INFO] Received the answer to my 'find successor' request for id 54: the successor is 48
+> [McGee:node:(2) 547.505960] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 548.359083] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 548.359083] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 548.359083] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 548.359083] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 548.359083] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Geoff:node:(4) 548.359083] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 549.299114] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 549.628191] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 549.628191] [lua/INFO] Received a 'find successor' request from 42 for id 58
+> [Geoff:node:(4) 549.628191] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 58 is 38
+> [McGee:node:(2) 550.511204] [lua/INFO] Received the answer to my 'find successor' request for id 58: the successor is 38
+> [McGee:node:(2) 550.511204] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Geoff:node:(4) 550.897300] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 552.166408] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [Boivin:node:(7) 553.077337] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 553.077337] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 553.077337] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Geoff:node:(4) 553.935635] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Boivin:node:(7) 555.436465] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Jean_Yves:node:(6) 556.092268] [lua/INFO] Sending a 'find successor' request to 1 for id 30
+> [Jean_Yves:node:(6) 557.017399] [lua/INFO] Sent the 'find successor' request to 1 for id 30, waiting for the answer
+> [Jacquelin:node:(8) 557.171748] [lua/INFO] Received a 'find successor' request from 14 for id 30
+> [Jacquelin:node:(8) 557.171748] [lua/INFO] Sending back a 'find successor answer' to 14: the successor of 30 is 48
+> [Jean_Yves:node:(6) 558.096879] [lua/INFO] Received the answer to my 'find successor' request for id 30: the successor is 48
+> [Gatien:node:(1) 560.204743] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Gatien:node:(1) 560.204743] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 560.262549] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 560.262549] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [McGee:node:(2) 562.447761] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [McGee:node:(2) 562.447761] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 563.455055] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 564.632974] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 565.262549] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 565.262549] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [McGee:node:(2) 567.447761] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 568.300885] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 568.300885] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 568.984350] [lua/INFO] Sending a 'find successor' request to 48 for id 37
+> [TeX:node:(5) 570.324573] [lua/INFO] Sent the 'find successor' request to 48 for id 37, waiting for the answer
+> [Gatien:node:(1) 570.324573] [lua/INFO] Received another request of type find successor
+> [Gatien:node:(1) 570.324573] [lua/INFO] Received a 'find successor' request from 21 for id 37
+> [Gatien:node:(1) 570.324573] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 570.324573] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 572.232850] [lua/INFO] Received another request of type notify
+> [Geoff:node:(4) 573.300885] [lua/INFO] Sending a 'find successor' request to 42 for id 48
+> [Gatien:node:(1) 573.446196] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 575.995093] [lua/INFO] Received another request of type notify
+> [Geoff:node:(4) 577.161724] [lua/INFO] Sent the 'find successor' request to 42 for id 48, waiting for the answer
+> [Geoff:node:(4) 577.161724] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 577.161724] [lua/INFO] Received a 'find successor' request from 21 for id 37
+> [Geoff:node:(4) 577.161724] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 37 is 38
+> [Boivin:node:(7) 577.621677] [lua/INFO] Sending a 'find successor' request to 42 for id 24
+> [TeX:node:(5) 578.968986] [lua/INFO] Received the answer to my 'find successor' request for id 37: the successor is 38
+> [TeX:node:(5) 578.968986] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 581.278711] [lua/INFO] Received a 'find successor' request from 32 for id 48
+> [McGee:node:(2) 581.278711] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 581.278711] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [iRMX:node:(3) 583.463923] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 583.463923] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [Gatien:node:(1) 586.035220] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 587.304329] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 589.842545] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 592.053891] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 592.053891] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 592.053891] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [TeX:node:(5) 592.053891] [lua/INFO] Received another request of type find successor
+> [TeX:node:(5) 592.053891] [lua/INFO] Received a 'find successor' request from 32 for id 48
+> [TeX:node:(5) 592.053891] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 48 is 1
+> [Geoff:node:(4) 593.861153] [lua/INFO] Received the answer to my 'find successor' request for id 48: the successor is 1
+> [McGee:node:(2) 594.239104] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 594.239104] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 594.239104] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [McGee:node:(2) 594.239104] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 594.343907] [lua/INFO] Sent the 'find successor' request to 42 for id 24, waiting for the answer
+> [McGee:node:(2) 594.343907] [lua/INFO] Received another request of type find successor
+> [McGee:node:(2) 594.343907] [lua/INFO] Received a 'find successor' request from 8 for id 24
+> [McGee:node:(2) 594.343907] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 595.246397] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 596.137061] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 597.058999] [lua/INFO] Received a 'find successor' request from 8 for id 24
+> [TeX:node:(5) 597.058999] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 24 is 1
+> [Boivin:node:(7) 598.187052] [lua/INFO] Received the answer to my 'find successor' request for id 24: the successor is 1
+> [McGee:node:(2) 598.322273] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 598.573437] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [Geoff:node:(4) 600.315774] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Gatien:node:(1) 601.584882] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Gatien:node:(1) 601.584882] [lua/INFO] Received another request of type notify
+> [Boivin:node:(7) 606.821778] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [TeX:node:(5) 608.871601] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 610.047933] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Geoff:node:(4) 612.500986] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [Geoff:node:(4) 612.500986] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 612.500986] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 612.500986] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [iRMX:node:(3) 614.462651] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 614.462651] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 617.500986] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 621.122334] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 621.821778] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 621.821778] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 621.821778] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Gatien:node:(1) 623.671230] [lua/INFO] Received another request of type notify
+> [Boivin:node:(7) 624.180905] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 625.014284] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 625.014284] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 625.014284] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [McGee:node:(2) 627.199496] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 627.199496] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 627.199496] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [McGee:node:(2) 627.199496] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 628.206789] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 628.992650] [lua/INFO] Received another request of type get predecessor
+> [iRMX:node:(3) 630.237831] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 630.237831] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [McGee:node:(2) 631.177862] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 632.809128] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 637.116572] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [TeX:node:(5) 639.209384] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Boivin:node:(7) 642.820506] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 643.925155] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Gatien:node:(1) 645.347344] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [Geoff:node:(4) 648.499714] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [Geoff:node:(4) 648.499714] [lua/INFO] Received another request of type notify
+> [Gatien:node:(1) 649.768822] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Geoff:node:(4) 649.768822] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 649.768822] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 649.768822] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 649.768822] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 650.461378] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 650.461378] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 653.499714] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 653.653884] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 655.461378] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 655.461378] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [TeX:node:(5) 658.653884] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 667.896241] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 670.445138] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 673.434395] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Gatien:node:(1) 690.445138] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 692.820506] [lua/INFO] Failed to send the 'find successor' request to 38 for id 1337
+> [Gatien:node:(1) 692.994035] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 693.925155] [lua/INFO] Failed to send the 'find successor' request to 38 for id 1337
+> [Jean_Yves:node:(6) 695.718309] [lua/INFO] Sending a 'find successor' request to 42 for id 46
+> [iRMX:node:(3) 699.148702] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 699.148702] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [Jean_Yves:node:(6) 699.696676] [lua/INFO] Sent the 'find successor' request to 42 for id 46, waiting for the answer
+> [McGee:node:(2) 699.696676] [lua/INFO] Received a 'find successor' request from 14 for id 46
+> [McGee:node:(2) 699.696676] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 701.719999] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 705.379543] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 705.379543] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 705.379543] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [TeX:node:(5) 705.379543] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 706.027443] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [TeX:node:(5) 706.333697] [lua/INFO] Received another request of type find successor
+> [TeX:node:(5) 706.333697] [lua/INFO] Received a 'find successor' request from 14 for id 46
+> [TeX:node:(5) 706.333697] [lua/INFO] Sending back a 'find successor answer' to 14: the successor of 46 is 1
+> [McGee:node:(2) 706.333697] [lua/INFO] Sending a 'find successor' request to 48 for id 74
+> [McGee:node:(2) 706.733179] [lua/INFO] Sent the 'find successor' request to 48 for id 74, waiting for the answer
+> [Jean_Yves:node:(6) 709.051086] [lua/INFO] Received the answer to my 'find successor' request for id 46: the successor is 1
+> [Gatien:node:(1) 709.258216] [lua/INFO] Received a 'find successor' request from 42 for id 74
+> [Gatien:node:(1) 709.258216] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 74 is 32
+> [TeX:node:(5) 709.526202] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 709.657698] [lua/INFO] Received the answer to my 'find successor' request for id 74: the successor is 32
+> [McGee:node:(2) 709.657698] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [iRMX:node:(3) 709.923883] [lua/INFO] Sending a 'find successor' request to 42 for id 70
+> [Boivin:node:(7) 710.097798] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [TeX:node:(5) 713.532188] [lua/INFO] Sending a 'find successor' request to 48 for id 53
+> [Gatien:node:(1) 714.258216] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [TeX:node:(5) 715.598439] [lua/INFO] Sent the 'find successor' request to 48 for id 53, waiting for the answer
+> [Geoff:node:(4) 756.027443] [lua/INFO] Failed to send the 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 756.910456] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [McGee:node:(2) 756.910456] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 759.095668] [lua/INFO] Sent the 'find successor' request to 42 for id 70, waiting for the answer
+> [McGee:node:(2) 759.095668] [lua/INFO] Received another request of type find successor
+> [McGee:node:(2) 759.095668] [lua/INFO] Received a 'find successor' request from 38 for id 70
+> [McGee:node:(2) 759.095668] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [iRMX:node:(3) 759.095668] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 760.049806] [lua/INFO] Received another request of type find successor
+> [TeX:node:(5) 760.049806] [lua/INFO] Received a 'find successor' request from 38 for id 70
+> [TeX:node:(5) 760.049806] [lua/INFO] Sending back a 'find successor answer' to 38: the successor of 70 is 1
+> [Boivin:node:(7) 760.097798] [lua/INFO] Failed to send the 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 760.888822] [lua/INFO] Received another request of type get predecessor
+> [iRMX:node:(3) 761.454795] [lua/INFO] Received another request of type notify
+> [Gatien:node:(1) 764.258216] [lua/INFO] Failed to send the 'find successor' request to 32 for id 1337
+> [Gatien:node:(1) 764.258216] [lua/INFO] Received a 'find successor' request from 21 for id 53
+> [Gatien:node:(1) 764.258216] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 53 is 32
+> [McGee:node:(2) 764.475131] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 764.493130] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 764.493130] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Geoff:node:(4) 764.493130] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 765.598439] [lua/INFO] Received the answer to my 'find successor' request for id 53: the successor is 32
+> [iRMX:node:(3) 767.685636] [lua/INFO] Received the answer to my 'find successor' request for id 70: the successor is 1
+> [Geoff:node:(4) 768.800574] [lua/INFO] Sending a 'find successor' request to 38 for id 64
+> [TeX:node:(5) 769.223643] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [McGee:node:(2) 769.870848] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 772.403890] [lua/INFO] Sending a 'find successor' request to 38 for id 40
+> [iRMX:node:(3) 773.083098] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 773.083098] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [McGee:node:(2) 775.268310] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 778.305795] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [Geoff:node:(4) 779.159769] [lua/INFO] Sent the 'find successor' request to 38 for id 64, waiting for the answer
+> [iRMX:node:(3) 779.159769] [lua/INFO] Received a 'find successor' request from 32 for id 64
+> [iRMX:node:(3) 779.159769] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 64 is 42
+> [Geoff:node:(4) 779.159769] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 780.967031] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Geoff:node:(4) 780.967031] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 780.967031] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Geoff:node:(4) 780.967031] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 780.967031] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 782.236139] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Geoff:node:(4) 782.236139] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 782.236139] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 782.236139] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 782.875307] [lua/INFO] Received another request of type notify
+> [Geoff:node:(4) 785.274474] [lua/INFO] Received the answer to my 'find successor' request for id 64: the successor is 42
+> [Geoff:node:(4) 785.274474] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 786.921169] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [McGee:node:(2) 787.804182] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Boivin:node:(7) 788.704108] [lua/INFO] Sent the 'find successor' request to 38 for id 40, waiting for the answer
+> [McGee:node:(2) 788.714323] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 789.959938] [lua/INFO] Received another request of type get predecessor
+> [iRMX:node:(3) 791.344981] [lua/INFO] Received a 'find successor' request from 8 for id 40
+> [iRMX:node:(3) 791.344981] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 40 is 42
+> [McGee:node:(2) 792.300632] [lua/INFO] Received another request of type notify
+> [Gatien:node:(1) 792.508834] [lua/INFO] Received another request of type notify
+> [Boivin:node:(7) 793.704108] [lua/INFO] Received the answer to my 'find successor' request for id 40: the successor is 42
+> [iRMX:node:(3) 796.344981] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 796.344981] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [TeX:node:(5) 799.537486] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [iRMX:node:(3) 801.344981] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 801.344981] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [McGee:node:(2) 803.530193] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 803.916278] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 804.383316] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 804.383316] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 804.383316] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 804.383316] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 804.383316] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [Geoff:node:(4) 804.383316] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Geoff:node:(4) 805.652425] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 808.690760] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Boivin:node:(7) 809.101571] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 811.112868] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 812.906022] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 813.046988] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [iRMX:node:(3) 813.927656] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 813.927656] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [McGee:node:(2) 816.112868] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 816.921533] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [TeX:node:(5) 818.773253] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Geoff:node:(4) 818.773253] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Geoff:node:(4) 818.773253] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [TeX:node:(5) 818.773253] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 820.042361] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Geoff:node:(4) 820.042361] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 820.042361] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 820.042361] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 820.681529] [lua/INFO] Received another request of type notify
+> [Geoff:node:(4) 823.080696] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Boivin:node:(7) 826.286783] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 828.927656] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 828.927656] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Jean_Yves:node:(6) 829.699176] [lua/INFO] Sending a 'find successor' request to 1 for id 78
+> [McGee:node:(2) 829.727391] [lua/INFO] Sending a 'find successor' request to 32 for id 106
+> [McGee:node:(2) 830.610404] [lua/INFO] Sent the 'find successor' request to 32 for id 106, waiting for the answer
+> [Jean_Yves:node:(6) 830.624307] [lua/INFO] Sent the 'find successor' request to 1 for id 78, waiting for the answer
+> [McGee:node:(2) 831.112868] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 831.286783] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [iRMX:node:(3) 831.965991] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 831.965991] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [Jacquelin:node:(8) 833.195981] [lua/INFO] Received a 'find successor' request from 14 for id 78
+> [Jacquelin:node:(8) 833.195981] [lua/INFO] Sending back a 'find successor answer' to 14: the successor of 78 is 48
+> [Jean_Yves:node:(6) 834.121112] [lua/INFO] Received the answer to my 'find successor' request for id 78: the successor is 48
+> [iRMX:node:(3) 835.004326] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 835.004326] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [TeX:node:(5) 835.158496] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 837.575623] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 840.914266] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 841.080997] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 841.080997] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 841.080997] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 841.080997] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 841.080997] [lua/INFO] Received a 'find successor' request from 42 for id 106
+> [Geoff:node:(4) 841.080997] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 106 is 38
+> [McGee:node:(2) 841.964010] [lua/INFO] Received the answer to my 'find successor' request for id 106: the successor is 38
+> [Geoff:node:(4) 842.350105] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 843.619213] [lua/INFO] Sending a 'find successor' request to 32 for id 112
+> [Geoff:node:(4) 845.388440] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 847.639925] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [TeX:node:(5) 850.008583] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [Boivin:node:(7) 850.625336] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Gatien:node:(1) 852.573653] [lua/INFO] Sent the 'find successor' request to 32 for id 112, waiting for the answer
+> [Geoff:node:(4) 852.573653] [lua/INFO] Received a 'find successor' request from 48 for id 112
+> [Geoff:node:(4) 852.573653] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 852.573653] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 854.380914] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Geoff:node:(4) 854.380914] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [Geoff:node:(4) 854.380914] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 855.451421] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [Geoff:node:(4) 857.419250] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [iRMX:node:(3) 858.266209] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 858.266209] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [McGee:node:(2) 860.451421] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 864.899002] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 865.625336] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [Gatien:node:(1) 867.447899] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 867.636633] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 867.636633] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Boivin:node:(7) 869.995760] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [iRMX:node:(3) 870.674968] [lua/INFO] Received a 'find successor' request from 48 for id 112
+> [iRMX:node:(3) 870.674968] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 112 is 42
+> [TeX:node:(5) 871.405559] [lua/INFO] Received another request of type get predecessor
+> [McGee:node:(2) 873.198714] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Gatien:node:(1) 873.246265] [lua/INFO] Received the answer to my 'find successor' request for id 112: the successor is 42
+> [iRMX:node:(3) 873.713304] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 873.713304] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [TeX:node:(5) 874.152852] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 877.345358] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 879.789974] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 879.789974] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 879.789974] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 879.789974] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 881.059083] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [Geoff:node:(4) 882.828310] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 884.160416] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [McGee:node:(2) 884.160416] [lua/INFO] Received another request of type notify
+> [iRMX:node:(3) 886.975187] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 886.975187] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [TeX:node:(5) 887.986052] [lua/INFO] Sending a 'find successor' request to 32 for id 85
+> [McGee:node:(2) 889.160399] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [iRMX:node:(3) 891.975187] [lua/INFO] Sending a 'find successor' request to 1 for id 102
+> [Boivin:node:(7) 894.334314] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [iRMX:node:(3) 895.018862] [lua/INFO] Sent the 'find successor' request to 1 for id 102, waiting for the answer
+> [Jacquelin:node:(8) 895.018862] [lua/INFO] Received a 'find successor' request from 38 for id 102
+> [Jacquelin:node:(8) 895.018862] [lua/INFO] Sending back a 'find successor answer' to 38: the successor of 102 is 48
+> [iRMX:node:(3) 895.018862] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 896.282630] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Geoff:node:(4) 896.282630] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 896.282630] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 896.282630] [lua/INFO] Received another request of type get predecessor
+> [iRMX:node:(3) 897.377989] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 898.089892] [lua/INFO] Sent the 'find successor' request to 32 for id 85, waiting for the answer
+> [Geoff:node:(4) 898.089892] [lua/INFO] Received a 'find successor' request from 21 for id 85
+> [Geoff:node:(4) 898.089892] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 85 is 38
+> [TeX:node:(5) 898.089892] [lua/INFO] Received another request of type get predecessor
+> [Gatien:node:(1) 898.831527] [lua/INFO] Received another request of type notify
+> [Boivin:node:(7) 899.737116] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 899.737116] [lua/INFO] Received another request of type find successor
+> [iRMX:node:(3) 899.737116] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 899.737116] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [TeX:node:(5) 899.897153] [lua/INFO] Received the answer to my 'find successor' request for id 85: the successor is 38
+> [TeX:node:(5) 899.897153] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Geoff:node:(4) 901.128227] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Boivin:node:(7) 902.096243] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [iRMX:node:(3) 902.780792] [lua/INFO] Received the answer to my 'find successor' request for id 102: the successor is 48
+> [McGee:node:(2) 904.044030] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [iRMX:node:(3) 905.819127] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 905.819127] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [Gatien:node:(1) 908.390424] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 909.011633] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 909.011633] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 909.011633] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [TeX:node:(5) 909.011633] [lua/INFO] Received another request of type notify
+> [Boivin:node:(7) 912.096243] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [TeX:node:(5) 912.204138] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 915.088303] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 915.088303] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 915.088303] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Geoff:node:(4) 915.088303] [lua/INFO] Received another request of type get predecessor
+> [McGee:node:(2) 917.273515] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 917.273515] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 917.273515] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [McGee:node:(2) 917.273515] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 918.126639] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 918.126639] [lua/INFO] Sending a 'find successor' request to 42 for id 96
+> [McGee:node:(2) 919.066670] [lua/INFO] Received another request of type get predecessor
+> [Boivin:node:(7) 919.632643] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 919.632643] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 919.632643] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [McGee:node:(2) 921.251882] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 921.357412] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [Boivin:node:(7) 921.991770] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Geoff:node:(4) 922.134895] [lua/INFO] Sent the 'find successor' request to 42 for id 96, waiting for the answer
+> [Geoff:node:(4) 922.134895] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 922.206020] [lua/INFO] Received a 'find successor' request from 32 for id 96
+> [McGee:node:(2) 922.206020] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 923.404003] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Geoff:node:(4) 923.404003] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 923.404003] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 923.404003] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [Gatien:node:(1) 923.906308] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 924.369680] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Boivin:node:(7) 929.176982] [lua/INFO] Sending a 'find successor' request to 42 for id 72
+> [Boivin:node:(7) 929.281785] [lua/INFO] Sent the 'find successor' request to 42 for id 72, waiting for the answer
+> [iRMX:node:(3) 931.817855] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 931.817855] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [McGee:node:(2) 932.138525] [lua/INFO] Received a 'find successor' request from 8 for id 72
+> [McGee:node:(2) 932.138525] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 932.138525] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Gatien:node:(1) 934.389152] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 935.010360] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [TeX:node:(5) 935.010360] [lua/INFO] Received another request of type find successor
+> [TeX:node:(5) 935.010360] [lua/INFO] Received a 'find successor' request from 32 for id 96
+> [TeX:node:(5) 935.010360] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 96 is 1
+> [TeX:node:(5) 935.964499] [lua/INFO] Received another request of type notify
+> [Geoff:node:(4) 936.817622] [lua/INFO] Received the answer to my 'find successor' request for id 96: the successor is 1
+> [iRMX:node:(3) 936.817855] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 936.817855] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [TeX:node:(5) 936.918637] [lua/INFO] Received another request of type find successor
+> [TeX:node:(5) 936.918637] [lua/INFO] Received a 'find successor' request from 8 for id 72
+> [TeX:node:(5) 936.918637] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 72 is 1
+> [Boivin:node:(7) 938.046691] [lua/INFO] Received the answer to my 'find successor' request for id 72: the successor is 1
+> [Boivin:node:(7) 938.046691] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [TeX:node:(5) 940.111143] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 944.003067] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [McGee:node:(2) 944.003067] [lua/INFO] Received another request of type get predecessor
+> [McGee:node:(2) 946.188279] [lua/INFO] Received another request of type get predecessor
+> [iRMX:node:(3) 946.188279] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 946.188279] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [McGee:node:(2) 947.981433] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 950.166645] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 950.495722] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [Boivin:node:(7) 951.585741] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 951.585741] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 951.585741] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Geoff:node:(4) 952.264949] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Boivin:node:(7) 953.944868] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 954.444462] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Jean_Yves:node:(6) 955.796221] [lua/INFO] Sending a 'find successor' request to 42 for id 142
+> [Jean_Yves:node:(6) 958.703458] [lua/INFO] Sent the 'find successor' request to 42 for id 142, waiting for the answer
+> [Geoff:node:(4) 961.809289] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [Geoff:node:(4) 961.809289] [lua/INFO] Received another request of type notify
+> [McGee:node:(2) 961.910304] [lua/INFO] Received a 'find successor' request from 14 for id 142
+> [McGee:node:(2) 961.910304] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [McGee:node:(2) 961.910304] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Gatien:node:(1) 963.078397] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [Geoff:node:(4) 963.078397] [lua/INFO] Received another request of type find successor
+> [Geoff:node:(4) 963.078397] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [Geoff:node:(4) 963.078397] [lua/INFO] Forwarding the 'find successor' request to my closest preceding finger
+> [iRMX:node:(3) 963.770953] [lua/INFO] Received a 'find successor' request from 32 for id 1337
+> [iRMX:node:(3) 963.770953] [lua/INFO] Sending back a 'find successor answer' to 32: the successor of 1337 is 42
+> [Gatien:node:(1) 966.455205] [lua/INFO] Received another request of type get predecessor
+> [Geoff:node:(4) 966.809289] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 969.004102] [lua/INFO] Received another request of type notify
+> [Boivin:node:(7) 971.130081] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [TeX:node:(5) 971.963459] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [TeX:node:(5) 971.963459] [lua/INFO] Received another request of type notify
+> [TeX:node:(5) 972.917597] [lua/INFO] Received another request of type find successor
+> [TeX:node:(5) 972.917597] [lua/INFO] Received a 'find successor' request from 14 for id 142
+> [TeX:node:(5) 972.917597] [lua/INFO] Sending back a 'find successor answer' to 14: the successor of 142 is 1
+> [iRMX:node:(3) 973.770953] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 973.770953] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [Jean_Yves:node:(6) 975.634987] [lua/INFO] Received the answer to my 'find successor' request for id 142: the successor is 1
+> [McGee:node:(2) 975.956183] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 975.956183] [lua/INFO] Received a 'find successor' request from 42 for id 1337
+> [iRMX:node:(3) 975.956183] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 1337 is 42
+> [McGee:node:(2) 975.956183] [lua/INFO] Received another request of type get predecessor
+> [TeX:node:(5) 976.963459] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 977.749338] [lua/INFO] Received another request of type get predecessor
+> [iRMX:node:(3) 978.994519] [lua/INFO] Received a 'find successor' request from 48 for id 1337
+> [iRMX:node:(3) 978.994519] [lua/INFO] Sending back a 'find successor answer' to 48: the successor of 1337 is 42
+> [McGee:node:(2) 979.934550] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Gatien:node:(1) 981.565816] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [McGee:node:(2) 982.681843] [lua/INFO] Sending a 'find successor' request to 48 for id 170
+> [McGee:node:(2) 983.081325] [lua/INFO] Sent the 'find successor' request to 48 for id 170, waiting for the answer
+> [Gatien:node:(1) 983.081325] [lua/INFO] Received a 'find successor' request from 42 for id 170
+> [Gatien:node:(1) 983.081325] [lua/INFO] Sending back a 'find successor answer' to 42: the successor of 170 is 32
+> [McGee:node:(2) 983.480807] [lua/INFO] Received the answer to my 'find successor' request for id 170: the successor is 32
+> [Boivin:node:(7) 983.712773] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [iRMX:node:(3) 983.712773] [lua/INFO] Received a 'find successor' request from 8 for id 1337
+> [iRMX:node:(3) 983.712773] [lua/INFO] Sending back a 'find successor answer' to 8: the successor of 1337 is 42
+> [Boivin:node:(7) 986.071900] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [TeX:node:(5) 990.448583] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [McGee:node:(2) 993.480807] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [TeX:node:(5) 994.090491] [lua/INFO] Sent the 'find successor' request to 38 for id 1337, waiting for the answer
+> [Geoff:node:(4) 994.580654] [lua/INFO] Sending a 'find successor' request to 38 for id 1337
+> [Gatien:node:(1) 995.273210] [lua/INFO] Sending a 'find successor' request to 32 for id 1337
+> [McGee:node:(2) 995.463666] [lua/INFO] Sent the 'find successor' request to 32 for id 1337, waiting for the answer
+> [iRMX:node:(3) 995.897985] [lua/INFO] Received a 'find successor' request from 21 for id 1337
+> [iRMX:node:(3) 995.897985] [lua/INFO] Sending back a 'find successor answer' to 21: the successor of 1337 is 42
+> [TeX:node:(5) 999.090491] [lua/INFO] Received the answer to my 'find successor' request for id 1337: the successor is 42
+> [Jacquelin:node:(8) 1000.278550] [lua/INFO] Leaving the ring
+> [iRMX:node:(3) 1000.897985] [lua/INFO] Leaving the ring
+> [McGee:node:(2) 1001.335646] [lua/INFO] Received another request of type get predecessor
+> [Jean_Yves:node:(6) 1003.128801] [lua/INFO] Leaving the ring
+> [TeX:node:(5) 1004.090491] [lua/INFO] Leaving the ring
+> [McGee:node:(2) 1004.090491] [lua/INFO] Failed to receive the answer to my 'find successor' request
+> [McGee:node:(2) 1004.090491] [lua/INFO] Leaving the ring
+> [Geoff:node:(4) 1044.580654] [lua/INFO] Failed to send the 'find successor' request to 38 for id 1337
+> [Geoff:node:(4) 1044.580654] [lua/INFO] Leaving the ring
+> [Gatien:node:(1) 1045.273210] [lua/INFO] Failed to send the 'find successor' request to 32 for id 1337
+> [Gatien:node:(1) 1045.273210] [lua/INFO] Leaving the ring
+> [Boivin:node:(7) 1046.071900] [lua/INFO] Leaving the ring
index cad469a..b32cfa9 100644 (file)
@@ -12,94 +12,94 @@ $ lua master_slave.lua ../../msg/small_platform.xml ../deploy.xml
 > [Jupiter:Slave:(3) 0.169155] [lua/INFO] Received task 'Task 1' on mailbox 'slave 1'
 > [Tremblay:Master:(1) 0.169155] [lua/INFO] Done sending 'Task 1' to 'slave 1'
 > [Tremblay:Master:(1) 0.169155] [lua/INFO] Sending  'Task 2' to 'slave 2'
-> [Fafard:Slave:(4) 0.392465] [lua/INFO] Received task 'Task 2' on mailbox 'slave 2'
-> [Tremblay:Master:(1) 0.392465] [lua/INFO] Done sending 'Task 2' to 'slave 2'
-> [Tremblay:Master:(1) 0.392465] [lua/INFO] Sending  'Task 3' to 'slave 3'
-> [Ginette:Slave:(5) 0.536245] [lua/INFO] Received task 'Task 3' on mailbox 'slave 3'
-> [Tremblay:Master:(1) 0.536245] [lua/INFO] Done sending 'Task 3' to 'slave 3'
-> [Tremblay:Master:(1) 0.536245] [lua/INFO] Sending  'Task 4' to 'slave 0'
-> [Bourassa:Slave:(2) 0.757221] [lua/INFO] Received task 'Task 4' on mailbox 'slave 0'
-> [Tremblay:Master:(1) 0.757221] [lua/INFO] Done sending 'Task 4' to 'slave 0'
-> [Tremblay:Master:(1) 0.757221] [lua/INFO] Sending  'Task 5' to 'slave 1'
+> [Fafard:Slave:(4) 0.327551] [lua/INFO] Received task 'Task 2' on mailbox 'slave 2'
+> [Tremblay:Master:(1) 0.327551] [lua/INFO] Done sending 'Task 2' to 'slave 2'
+> [Tremblay:Master:(1) 0.327551] [lua/INFO] Sending  'Task 3' to 'slave 3'
+> [Ginette:Slave:(5) 0.451283] [lua/INFO] Received task 'Task 3' on mailbox 'slave 3'
+> [Tremblay:Master:(1) 0.451283] [lua/INFO] Done sending 'Task 3' to 'slave 3'
+> [Tremblay:Master:(1) 0.451283] [lua/INFO] Sending  'Task 4' to 'slave 0'
+> [Bourassa:Slave:(2) 0.583902] [lua/INFO] Received task 'Task 4' on mailbox 'slave 0'
+> [Tremblay:Master:(1) 0.583902] [lua/INFO] Done sending 'Task 4' to 'slave 0'
+> [Tremblay:Master:(1) 0.583902] [lua/INFO] Sending  'Task 5' to 'slave 1'
 > [Jupiter:Slave:(3) 0.824497] [lua/INFO] Task 'Task 1' is done
+> [Fafard:Slave:(4) 0.982894] [lua/INFO] Task 'Task 2' is done
 > [Tremblay:Master:(1) 0.993652] [lua/INFO] Done sending 'Task 5' to 'slave 1'
 > [Tremblay:Master:(1) 0.993652] [lua/INFO] Sending  'Task 6' to 'slave 2'
 > [Jupiter:Slave:(3) 0.993652] [lua/INFO] Received task 'Task 5' on mailbox 'slave 1'
-> [Fafard:Slave:(4) 1.047808] [lua/INFO] Task 'Task 2' is done
-> [Tremblay:Master:(1) 1.271118] [lua/INFO] Done sending 'Task 6' to 'slave 2'
-> [Tremblay:Master:(1) 1.271118] [lua/INFO] Sending  'Task 7' to 'slave 3'
-> [Fafard:Slave:(4) 1.271118] [lua/INFO] Received task 'Task 6' on mailbox 'slave 2'
-> [Ginette:Slave:(5) 1.567343] [lua/INFO] Task 'Task 3' is done
+> [Fafard:Slave:(4) 1.152048] [lua/INFO] Received task 'Task 6' on mailbox 'slave 2'
+> [Tremblay:Master:(1) 1.152048] [lua/INFO] Done sending 'Task 6' to 'slave 2'
+> [Tremblay:Master:(1) 1.152048] [lua/INFO] Sending  'Task 7' to 'slave 3'
+> [Ginette:Slave:(5) 1.482381] [lua/INFO] Task 'Task 3' is done
+> [Tremblay:Master:(1) 1.606113] [lua/INFO] Done sending 'Task 7' to 'slave 3'
+> [Tremblay:Master:(1) 1.606113] [lua/INFO] Sending  'Task 8' to 'slave 0'
+> [Ginette:Slave:(5) 1.606113] [lua/INFO] Received task 'Task 7' on mailbox 'slave 3'
+> [Bourassa:Slave:(2) 1.615000] [lua/INFO] Task 'Task 4' is done
 > [Jupiter:Slave:(3) 1.648994] [lua/INFO] Task 'Task 5' is done
-> [Tremblay:Master:(1) 1.711124] [lua/INFO] Done sending 'Task 7' to 'slave 3'
-> [Tremblay:Master:(1) 1.711124] [lua/INFO] Sending  'Task 8' to 'slave 0'
-> [Ginette:Slave:(5) 1.711124] [lua/INFO] Received task 'Task 7' on mailbox 'slave 3'
-> [Bourassa:Slave:(2) 1.788319] [lua/INFO] Task 'Task 4' is done
-> [Fafard:Slave:(4) 1.926461] [lua/INFO] Task 'Task 6' is done
-> [Tremblay:Master:(1) 2.009295] [lua/INFO] Done sending 'Task 8' to 'slave 0'
-> [Tremblay:Master:(1) 2.009295] [lua/INFO] Sending  'Task 9' to 'slave 1'
-> [Bourassa:Slave:(2) 2.009295] [lua/INFO] Received task 'Task 8' on mailbox 'slave 0'
-> [Jupiter:Slave:(3) 2.178450] [lua/INFO] Received task 'Task 9' on mailbox 'slave 1'
-> [Tremblay:Master:(1) 2.178450] [lua/INFO] Done sending 'Task 9' to 'slave 1'
-> [Tremblay:Master:(1) 2.178450] [lua/INFO] Sending  'Task 10' to 'slave 2'
-> [Fafard:Slave:(4) 2.401760] [lua/INFO] Received task 'Task 10' on mailbox 'slave 2'
-> [Tremblay:Master:(1) 2.401760] [lua/INFO] Done sending 'Task 10' to 'slave 2'
-> [Tremblay:Master:(1) 2.401760] [lua/INFO] Sending  'Task 11' to 'slave 3'
-> [Ginette:Slave:(5) 2.742222] [lua/INFO] Task 'Task 7' is done
-> [Jupiter:Slave:(3) 2.833792] [lua/INFO] Task 'Task 9' is done
-> [Tremblay:Master:(1) 2.886002] [lua/INFO] Done sending 'Task 11' to 'slave 3'
-> [Tremblay:Master:(1) 2.886002] [lua/INFO] Sending  'Task 12' to 'slave 0'
-> [Ginette:Slave:(5) 2.886002] [lua/INFO] Received task 'Task 11' on mailbox 'slave 3'
-> [Bourassa:Slave:(2) 3.040393] [lua/INFO] Task 'Task 8' is done
-> [Fafard:Slave:(4) 3.057103] [lua/INFO] Task 'Task 10' is done
-> [Tremblay:Master:(1) 3.261369] [lua/INFO] Done sending 'Task 12' to 'slave 0'
-> [Tremblay:Master:(1) 3.261369] [lua/INFO] Sending  'Task 13' to 'slave 1'
-> [Bourassa:Slave:(2) 3.261369] [lua/INFO] Received task 'Task 12' on mailbox 'slave 0'
-> [Jupiter:Slave:(3) 3.430523] [lua/INFO] Received task 'Task 13' on mailbox 'slave 1'
-> [Tremblay:Master:(1) 3.430523] [lua/INFO] Done sending 'Task 13' to 'slave 1'
-> [Tremblay:Master:(1) 3.430523] [lua/INFO] Sending  'Task 14' to 'slave 2'
-> [Fafard:Slave:(4) 3.653834] [lua/INFO] Received task 'Task 14' on mailbox 'slave 2'
-> [Tremblay:Master:(1) 3.653834] [lua/INFO] Done sending 'Task 14' to 'slave 2'
-> [Tremblay:Master:(1) 3.653834] [lua/INFO] Sending  'Task 15' to 'slave 3'
-> [Ginette:Slave:(5) 3.917100] [lua/INFO] Task 'Task 11' is done
-> [Tremblay:Master:(1) 4.060880] [lua/INFO] Done sending 'Task 15' to 'slave 3'
-> [Tremblay:Master:(1) 4.060880] [lua/INFO] Sending  'Task 16' to 'slave 0'
-> [Ginette:Slave:(5) 4.060880] [lua/INFO] Received task 'Task 15' on mailbox 'slave 3'
-> [Jupiter:Slave:(3) 4.085866] [lua/INFO] Task 'Task 13' is done
-> [Bourassa:Slave:(2) 4.292467] [lua/INFO] Task 'Task 12' is done
-> [Fafard:Slave:(4) 4.309176] [lua/INFO] Task 'Task 14' is done
-> [Tremblay:Master:(1) 4.513442] [lua/INFO] Done sending 'Task 16' to 'slave 0'
-> [Tremblay:Master:(1) 4.513442] [lua/INFO] Sending  'Task 17' to 'slave 1'
-> [Bourassa:Slave:(2) 4.513442] [lua/INFO] Received task 'Task 16' on mailbox 'slave 0'
-> [Jupiter:Slave:(3) 4.682597] [lua/INFO] Received task 'Task 17' on mailbox 'slave 1'
-> [Tremblay:Master:(1) 4.682597] [lua/INFO] Done sending 'Task 17' to 'slave 1'
-> [Tremblay:Master:(1) 4.682597] [lua/INFO] Sending  'Task 18' to 'slave 2'
-> [Fafard:Slave:(4) 4.905908] [lua/INFO] Received task 'Task 18' on mailbox 'slave 2'
-> [Tremblay:Master:(1) 4.905908] [lua/INFO] Done sending 'Task 18' to 'slave 2'
-> [Tremblay:Master:(1) 4.905908] [lua/INFO] Sending  'Task 19' to 'slave 3'
-> [Ginette:Slave:(5) 5.091978] [lua/INFO] Task 'Task 15' is done
-> [Tremblay:Master:(1) 5.235758] [lua/INFO] Done sending 'Task 19' to 'slave 3'
-> [Tremblay:Master:(1) 5.235758] [lua/INFO] Sending  'Task 20' to 'slave 0'
-> [Ginette:Slave:(5) 5.235758] [lua/INFO] Received task 'Task 19' on mailbox 'slave 3'
-> [Jupiter:Slave:(3) 5.337939] [lua/INFO] Task 'Task 17' is done
-> [Bourassa:Slave:(2) 5.544540] [lua/INFO] Task 'Task 16' is done
-> [Fafard:Slave:(4) 5.561250] [lua/INFO] Task 'Task 18' is done
-> [Tremblay:Master:(1) 5.765516] [lua/INFO] Done sending 'Task 20' to 'slave 0'
-> [Tremblay:Master:(1) 5.765516] [lua/INFO] All tasks have been dispatched. Let's tell everybody the computation is over.
-> [Tremblay:Master:(1) 5.765516] [lua/INFO] Sending finalize to 'slave 0'
-> [Bourassa:Slave:(2) 5.765516] [lua/INFO] Received task 'Task 20' on mailbox 'slave 0'
-> [Ginette:Slave:(5) 6.266856] [lua/INFO] Task 'Task 19' is done
-> [Bourassa:Slave:(2) 6.796614] [lua/INFO] Task 'Task 20' is done
-> [Tremblay:Master:(1) 7.017590] [lua/INFO] Sending finalize to 'slave 1'
-> [Bourassa:Slave:(2) 7.017590] [lua/INFO] Got finalize message
-> [Bourassa:Slave:(2) 7.017590] [lua/INFO] I'm done. See you!
-> [Jupiter:Slave:(3) 7.186745] [lua/INFO] Got finalize message
-> [Jupiter:Slave:(3) 7.186745] [lua/INFO] I'm done. See you!
-> [Tremblay:Master:(1) 7.186745] [lua/INFO] Sending finalize to 'slave 2'
-> [Fafard:Slave:(4) 7.410055] [lua/INFO] Got finalize message
-> [Fafard:Slave:(4) 7.410055] [lua/INFO] I'm done. See you!
-> [Tremblay:Master:(1) 7.410055] [lua/INFO] Sending finalize to 'slave 3'
-> [Ginette:Slave:(5) 7.553835] [lua/INFO] Got finalize message
-> [Ginette:Slave:(5) 7.553835] [lua/INFO] I'm done. See you!
-> [Tremblay:Master:(1) 7.553835] [lua/INFO] Everything's done.
-> [7.553835] [lua/INFO] Simulation's over. See you.
+> [Tremblay:Master:(1) 1.747619] [lua/INFO] Done sending 'Task 8' to 'slave 0'
+> [Tremblay:Master:(1) 1.747619] [lua/INFO] Sending  'Task 9' to 'slave 1'
+> [Bourassa:Slave:(2) 1.747619] [lua/INFO] Received task 'Task 8' on mailbox 'slave 0'
+> [Fafard:Slave:(4) 1.807391] [lua/INFO] Task 'Task 6' is done
+> [Jupiter:Slave:(3) 1.916774] [lua/INFO] Received task 'Task 9' on mailbox 'slave 1'
+> [Tremblay:Master:(1) 1.916774] [lua/INFO] Done sending 'Task 9' to 'slave 1'
+> [Tremblay:Master:(1) 1.916774] [lua/INFO] Sending  'Task 10' to 'slave 2'
+> [Fafard:Slave:(4) 2.075171] [lua/INFO] Received task 'Task 10' on mailbox 'slave 2'
+> [Tremblay:Master:(1) 2.075171] [lua/INFO] Done sending 'Task 10' to 'slave 2'
+> [Tremblay:Master:(1) 2.075171] [lua/INFO] Sending  'Task 11' to 'slave 3'
+> [Jupiter:Slave:(3) 2.572116] [lua/INFO] Task 'Task 9' is done
+> [Ginette:Slave:(5) 2.637211] [lua/INFO] Task 'Task 7' is done
+> [Fafard:Slave:(4) 2.730513] [lua/INFO] Task 'Task 10' is done
+> [Tremblay:Master:(1) 2.760943] [lua/INFO] Done sending 'Task 11' to 'slave 3'
+> [Tremblay:Master:(1) 2.760943] [lua/INFO] Sending  'Task 12' to 'slave 0'
+> [Ginette:Slave:(5) 2.760943] [lua/INFO] Received task 'Task 11' on mailbox 'slave 3'
+> [Bourassa:Slave:(2) 2.778717] [lua/INFO] Task 'Task 8' is done
+> [Tremblay:Master:(1) 2.911336] [lua/INFO] Done sending 'Task 12' to 'slave 0'
+> [Tremblay:Master:(1) 2.911336] [lua/INFO] Sending  'Task 13' to 'slave 1'
+> [Bourassa:Slave:(2) 2.911336] [lua/INFO] Received task 'Task 12' on mailbox 'slave 0'
+> [Jupiter:Slave:(3) 3.080491] [lua/INFO] Received task 'Task 13' on mailbox 'slave 1'
+> [Tremblay:Master:(1) 3.080491] [lua/INFO] Done sending 'Task 13' to 'slave 1'
+> [Tremblay:Master:(1) 3.080491] [lua/INFO] Sending  'Task 14' to 'slave 2'
+> [Fafard:Slave:(4) 3.238888] [lua/INFO] Received task 'Task 14' on mailbox 'slave 2'
+> [Tremblay:Master:(1) 3.238888] [lua/INFO] Done sending 'Task 14' to 'slave 2'
+> [Tremblay:Master:(1) 3.238888] [lua/INFO] Sending  'Task 15' to 'slave 3'
+> [Jupiter:Slave:(3) 3.735833] [lua/INFO] Task 'Task 13' is done
+> [Ginette:Slave:(5) 3.792041] [lua/INFO] Task 'Task 11' is done
+> [Fafard:Slave:(4) 3.894230] [lua/INFO] Task 'Task 14' is done
+> [Tremblay:Master:(1) 3.915773] [lua/INFO] Done sending 'Task 15' to 'slave 3'
+> [Tremblay:Master:(1) 3.915773] [lua/INFO] Sending  'Task 16' to 'slave 0'
+> [Ginette:Slave:(5) 3.915773] [lua/INFO] Received task 'Task 15' on mailbox 'slave 3'
+> [Bourassa:Slave:(2) 3.942434] [lua/INFO] Task 'Task 12' is done
+> [Tremblay:Master:(1) 4.075053] [lua/INFO] Done sending 'Task 16' to 'slave 0'
+> [Tremblay:Master:(1) 4.075053] [lua/INFO] Sending  'Task 17' to 'slave 1'
+> [Bourassa:Slave:(2) 4.075053] [lua/INFO] Received task 'Task 16' on mailbox 'slave 0'
+> [Jupiter:Slave:(3) 4.244208] [lua/INFO] Received task 'Task 17' on mailbox 'slave 1'
+> [Tremblay:Master:(1) 4.244208] [lua/INFO] Done sending 'Task 17' to 'slave 1'
+> [Tremblay:Master:(1) 4.244208] [lua/INFO] Sending  'Task 18' to 'slave 2'
+> [Fafard:Slave:(4) 4.402604] [lua/INFO] Received task 'Task 18' on mailbox 'slave 2'
+> [Tremblay:Master:(1) 4.402604] [lua/INFO] Done sending 'Task 18' to 'slave 2'
+> [Tremblay:Master:(1) 4.402604] [lua/INFO] Sending  'Task 19' to 'slave 3'
+> [Jupiter:Slave:(3) 4.899550] [lua/INFO] Task 'Task 17' is done
+> [Ginette:Slave:(5) 4.946871] [lua/INFO] Task 'Task 15' is done
+> [Fafard:Slave:(4) 5.057947] [lua/INFO] Task 'Task 18' is done
+> [Tremblay:Master:(1) 5.070603] [lua/INFO] Done sending 'Task 19' to 'slave 3'
+> [Tremblay:Master:(1) 5.070603] [lua/INFO] Sending  'Task 20' to 'slave 0'
+> [Ginette:Slave:(5) 5.070603] [lua/INFO] Received task 'Task 19' on mailbox 'slave 3'
+> [Bourassa:Slave:(2) 5.106151] [lua/INFO] Task 'Task 16' is done
+> [Tremblay:Master:(1) 5.238770] [lua/INFO] Done sending 'Task 20' to 'slave 0'
+> [Tremblay:Master:(1) 5.238770] [lua/INFO] All tasks have been dispatched. Let's tell everybody the computation is over.
+> [Tremblay:Master:(1) 5.238770] [lua/INFO] Sending finalize to 'slave 0'
+> [Bourassa:Slave:(2) 5.238770] [lua/INFO] Received task 'Task 20' on mailbox 'slave 0'
+> [Ginette:Slave:(5) 6.101701] [lua/INFO] Task 'Task 19' is done
+> [Bourassa:Slave:(2) 6.269868] [lua/INFO] Task 'Task 20' is done
+> [Tremblay:Master:(1) 6.402487] [lua/INFO] Sending finalize to 'slave 1'
+> [Bourassa:Slave:(2) 6.402487] [lua/INFO] Got finalize message
+> [Bourassa:Slave:(2) 6.402487] [lua/INFO] I'm done. See you!
+> [Jupiter:Slave:(3) 6.571641] [lua/INFO] Got finalize message
+> [Jupiter:Slave:(3) 6.571641] [lua/INFO] I'm done. See you!
+> [Tremblay:Master:(1) 6.571641] [lua/INFO] Sending finalize to 'slave 2'
+> [Fafard:Slave:(4) 6.730038] [lua/INFO] Got finalize message
+> [Fafard:Slave:(4) 6.730038] [lua/INFO] I'm done. See you!
+> [Tremblay:Master:(1) 6.730038] [lua/INFO] Sending finalize to 'slave 3'
+> [Ginette:Slave:(5) 6.853770] [lua/INFO] Got finalize message
+> [Ginette:Slave:(5) 6.853770] [lua/INFO] I'm done. See you!
+> [Tremblay:Master:(1) 6.853770] [lua/INFO] Everything's done.
+> [6.853770] [lua/INFO] Simulation's over. See you.
index 22e5961..746afe2 100644 (file)
@@ -482,7 +482,11 @@ static void action_allReduce(const char *const *action) {
     XBT_DEBUG("%s: %s has received", allreduce_identifier, process_name);
   }
 
-  XBT_VERB("%s %f", xbt_str_join_array(action, " "), MSG_get_clock() - clock);
+  if (XBT_LOG_ISENABLED(actions,xbt_log_priority_verbose)) {
+    char *a =  xbt_str_join_array(action, " ");
+    XBT_VERB("%s %f", a, MSG_get_clock() - clock);
+    free(a);
+  }
   free(allreduce_identifier);
 }
 
index 4361c9c..cf77252 100644 (file)
@@ -2,78 +2,78 @@
 
 ! output sort
 $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment_split.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [500.006505] (1:p0@host0) p0 recv p1 500.006505
-> [500.006505] (2:p1@host1) p1 send p0 1e10 500.006505
-> [500.006506] (1:p0@host0) p0 compute 12 0.000001
-> [512.006505] (0:@) Simulation time 512.007
-> [512.006505] (2:p1@host1) p1 sleep 12 12.000000
+> [ 10.831247] (1:p0@host0) p0 recv p1 10.831247
+> [ 10.831247] (2:p1@host1) p1 send p0 1e10 10.831247
+> [ 10.831248] (1:p0@host0) p0 compute 12 0.000001
+> [ 22.831247] (0:@) Simulation time 22.8312
+> [ 22.831247] (2:p1@host1) p1 sleep 12 12.000000
 
 ! output sort
 $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_allReduce.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (1:p0@host0) p0 comm_size 3 0.000000
-> [100.013010] (1:p0@host0) p0 allReduce 5e8 5e8 100.013010
-> [100.013010] (2:p1@host1) p1 allReduce 5e8 5e8 100.013010
-> [100.013010] (3:p2@host2) p2 allReduce 5e8 5e8 100.013010
-> [150.013010] (0:@) Simulation time 150.013
-> [150.013010] (1:p0@host0) p0 compute 5e8 50.000000
-> [150.013010] (2:p1@host1) p1 compute 5e8 50.000000
-> [150.013010] (3:p2@host2) p2 compute 5e8 50.000000
+> [ 51.095484] (1:p0@host0) p0 allReduce 5e8 5e8 51.095484
+> [ 51.095484] (2:p1@host1) p1 allReduce 5e8 5e8 51.095484
+> [ 51.095484] (3:p2@host2) p2 allReduce 5e8 5e8 51.095484
+> [101.095484] (0:@) Simulation time 101.095
+> [101.095484] (1:p0@host0) p0 compute 5e8 50.000000
+> [101.095484] (2:p1@host1) p1 compute 5e8 50.000000
+> [101.095484] (3:p2@host2) p2 compute 5e8 50.000000
 
 ! output sort
 $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_barrier.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (1:p0@host0) p0 comm_size 3 0.000000
 > [  0.000000] (2:p1@host1) p1 comm_size 3 0.000000
 > [  0.000000] (3:p2@host2) p2 comm_size 3 0.000000
-> [  0.506505] (1:p0@host0) p0 send p1 1E7 0.506505
-> [  0.506505] (2:p1@host1) p1 recv p0 0.506505
-> [  0.906505] (2:p1@host1) p1 compute 4E6 0.400000
-> [  0.906505] (3:p2@host2) p2 compute 4E6 0.400000
-> [  0.956505] (0:@) Simulation time 0.956505
-> [  0.956505] (1:p0@host0) p0 compute 4.5E6 0.450000
+> [  0.017330] (1:p0@host0) p0 send p1 1E7 0.017330
+> [  0.017330] (2:p1@host1) p1 recv p0 0.017330
+> [  0.417330] (2:p1@host1) p1 compute 4E6 0.400000
+> [  0.417330] (3:p2@host2) p2 compute 4E6 0.400000
+> [  0.467330] (0:@) Simulation time 0.46733
+> [  0.467330] (1:p0@host0) p0 compute 4.5E6 0.450000
 
 ! output sort
 $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_bcast.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (1:p0@host0) p0 comm_size 3 0.000000
-> [ 25.006505] (1:p0@host0) p0 bcast 5e8 25.006505
-> [ 25.006505] (2:p1@host1) p1 bcast 5e8 25.006505
-> [ 25.006505] (3:p2@host2) p2 bcast 5e8 25.006505
-> [ 45.006505] (2:p1@host1) p1 compute 2e8 20.000000
-> [ 75.006505] (1:p0@host0) p0 compute 5e8 50.000000
-> [ 75.006505] (3:p2@host2) p2 compute 5e8 50.000000
-> [100.013010] (1:p0@host0) p0 bcast 5e8 25.006505
-> [100.013010] (2:p1@host1) p1 bcast 5e8 55.006505
-> [100.013010] (3:p2@host2) p2 bcast 5e8 25.006505
-> [120.013010] (2:p1@host1) p1 compute 2e8 20.000000
-> [150.013010] (1:p0@host0) p0 compute 5e8 50.000000
-> [150.013010] (3:p2@host2) p2 compute 5e8 50.000000
-> [175.019515] (2:p1@host1) p1 reduce 5e8 5e8 55.006505
-> [175.019515] (3:p2@host2) p2 reduce 5e8 5e8 25.006505
-> [225.019515] (0:@) Simulation time 225.02
-> [225.019515] (1:p0@host0) p0 reduce 5e8 5e8 75.006505
+> [  0.547742] (1:p0@host0) p0 bcast 5e8 0.547742
+> [  0.547742] (2:p1@host1) p1 bcast 5e8 0.547742
+> [  0.547742] (3:p2@host2) p2 bcast 5e8 0.547742
+> [ 20.547742] (2:p1@host1) p1 compute 2e8 20.000000
+> [ 50.547742] (1:p0@host0) p0 compute 5e8 50.000000
+> [ 50.547742] (3:p2@host2) p2 compute 5e8 50.000000
+> [ 51.095484] (1:p0@host0) p0 bcast 5e8 0.547742
+> [ 51.095484] (2:p1@host1) p1 bcast 5e8 30.547742
+> [ 51.095484] (3:p2@host2) p2 bcast 5e8 0.547742
+> [ 71.095484] (2:p1@host1) p1 compute 2e8 20.000000
+> [101.095484] (1:p0@host0) p0 compute 5e8 50.000000
+> [101.095484] (3:p2@host2) p2 compute 5e8 50.000000
+> [101.643226] (2:p1@host1) p1 reduce 5e8 5e8 30.547742
+> [101.643226] (3:p2@host2) p2 reduce 5e8 5e8 0.547742
+> [151.643226] (0:@) Simulation time 151.643
+> [151.643226] (1:p0@host0) p0 reduce 5e8 5e8 50.547742
 
 ! output sort
 $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_reduce.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (1:p0@host0) p0 comm_size 3 0.000000
-> [ 25.006505] (2:p1@host1) p1 reduce 5e8 5e8 25.006505
-> [ 25.006505] (3:p2@host2) p2 reduce 5e8 5e8 25.006505
-> [ 75.006505] (1:p0@host0) p0 reduce 5e8 5e8 75.006505
-> [ 75.006505] (2:p1@host1) p1 compute 5e8 50.000000
-> [ 75.006505] (3:p2@host2) p2 compute 5e8 50.000000
-> [125.006505] (0:@) Simulation time 125.007
-> [125.006505] (1:p0@host0) p0 compute 5e8 50.000000
+> [  0.547742] (2:p1@host1) p1 reduce 5e8 5e8 0.547742
+> [  0.547742] (3:p2@host2) p2 reduce 5e8 5e8 0.547742
+> [ 50.547742] (1:p0@host0) p0 reduce 5e8 5e8 50.547742
+> [ 50.547742] (2:p1@host1) p1 compute 5e8 50.000000
+> [ 50.547742] (3:p2@host2) p2 compute 5e8 50.000000
+> [100.547742] (0:@) Simulation time 100.548
+> [100.547742] (1:p0@host0) p0 compute 5e8 50.000000
 
 ! output sort
 $ ${bindir:=.}/actions --log=actions.thres=verbose homogeneous_3_hosts.xml deployment.xml actions_with_isend.txt "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (2:p1@host1) p1 Irecv p0 0.000000
 > [  0.000000] (3:p2@host2) p2 Irecv p1 0.000000
+> [  1.088979] (1:p0@host0) p0 send p1 1e9 1.088979
 > [ 50.000000] (3:p2@host2) p2 compute 5e8 50.000000
-> [ 50.006505] (1:p0@host0) p0 send p1 1e9 50.006505
 > [100.000000] (2:p1@host1) p1 compute 1e9 100.000000
 > [100.000000] (2:p1@host1) p1 wait 0.000000
-> [150.006505] (1:p0@host0) p0 compute 1e9 100.000000
-> [150.006505] (2:p1@host1) p1 send p2 1e9 50.006505
-> [150.006505] (3:p2@host2) p2 wait 100.006505
-> [150.006505] (3:p2@host2) p2 Isend p0 1e9 0.000000
-> [200.006505] (0:@) Simulation time 200.007
-> [200.006505] (1:p0@host0) p0 recv p2 50.000000
-> [200.006505] (3:p2@host2) p2 compute 5e8 50.000000
+> [101.088979] (1:p0@host0) p0 compute 1e9 100.000000
+> [101.088979] (2:p1@host1) p1 send p2 1e9 1.088979
+> [101.088979] (3:p2@host2) p2 wait 51.088979
+> [101.088979] (3:p2@host2) p2 Isend p0 1e9 0.000000
+> [102.177958] (1:p0@host0) p0 recv p2 1.088979
+> [151.088979] (0:@) Simulation time 151.089
+> [151.088979] (3:p2@host2) p2 compute 5e8 50.000000
index a94ad65..d5a8a9a 100644 (file)
@@ -15,9 +15,9 @@ $ $SG_TEST_EXENV ${bindir:=.}/bittorrent ${srcdir:=.}/../msg_platform.xml ${srcd
 > [    0.000000] (8:peer@McGee) Hi, I'm joining the network with id 8
 > [ 3000.000000] (1:tracker@Jacquelin) Tracker is leaving
 > [ 5000.005340] (5:peer@Geoff) Here is my current status: 1111111111
-> [ 5000.012389] (7:peer@iRMX) Here is my current status: 1111111111
+> [ 5000.012657] (7:peer@iRMX) Here is my current status: 1111111111
 > [ 5000.048881] (2:peer@Boivin) Here is my current status: 1111111111
-> [ 5000.827195] (8:peer@McGee) Here is my current status: 1111111111
-> [ 5000.832370] (3:peer@Jean_Yves) Here is my current status: 1111111111
-> [ 5000.897047] (4:peer@TeX) Here is my current status: 1111111111
-> [ 5000.897047] (6:peer@Disney) Here is my current status: 1111111111
+> [ 5000.827441] (8:peer@McGee) Here is my current status: 1111111111
+> [ 5000.832977] (3:peer@Jean_Yves) Here is my current status: 1111111111
+> [ 5000.897268] (4:peer@TeX) Here is my current status: 1111111111
+> [ 5000.897268] (6:peer@Disney) Here is my current status: 1111111111
index 8eac54f..b5ecc88 100644 (file)
@@ -8,7 +8,6 @@
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_messages, "Messages specific for the message factory");
 
-#define BYTES_TO_MB(x) ((long double)x/1048576.0)
 #define BITS_TO_BYTES(x) ((x / 8) + (x % 8) ? 1 : 0)
 
 /**
@@ -22,14 +21,13 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_messages, "Messages specific for the message fa
 msg_task_t task_message_new(e_message_type type, const char *issuer_host_name,
                             const char *mailbox, int peer_id, int size)
 {
-  long double size_mb = BYTES_TO_MB(size);
   message_t message = xbt_new(s_message_t, 1);
   message->issuer_host_name = issuer_host_name;
   message->peer_id = peer_id;
   message->mailbox = mailbox;
   message->type = type;
-  msg_task_t task = MSG_task_create(NULL, 0, size_mb, message);
-  XBT_DEBUG("type: %d size: %.20Lg (%d)", type, size_mb, size);
+  msg_task_t task = MSG_task_create(NULL, 0, size, message);
+  XBT_DEBUG("type: %d size: %d", (int)type, size);
   return task;
 }
 
@@ -110,6 +108,7 @@ int task_message_size(e_message_type type)
     case MESSAGE_BITFIELD: size = MESSAGE_BITFIELD_SIZE; break;
     case MESSAGE_REQUEST: size = MESSAGE_REQUEST_SIZE; break;
     case MESSAGE_PIECE: size = MESSAGE_PIECE_SIZE; break;
+    case MESSAGE_CANCEL: size = MESSAGE_CANCEL_SIZE; break;
   }
   return size;
 }
index 2a87b7c..8e29f04 100644 (file)
@@ -10,6 +10,8 @@
 
 /**
  * Message sizes
+ * Sizes based on report by A. Legout et al, Understanding BitTorrent: An Experimental Perspective
+ * http://hal.inria.fr/inria-00000156/en
  */
 #define MESSAGE_HANDSHAKE_SIZE 68
 #define MESSAGE_CHOKE_SIZE 5
@@ -34,7 +36,8 @@ typedef enum {
   MESSAGE_HAVE,
   MESSAGE_BITFIELD,
   MESSAGE_REQUEST,
-  MESSAGE_PIECE
+  MESSAGE_PIECE,
+  MESSAGE_CANCEL
 } e_message_type;
 
 /**
index baa8bc1..026be29 100644 (file)
@@ -99,6 +99,7 @@ void leech_loop(peer_t peer, double deadline)
         handle_message(peer, peer->task_received);
       }
     } else {
+      handle_pending_sends(peer);
       if (peer->current_piece != -1) {
         send_interested_to_peers(peer);
       } else {
@@ -242,6 +243,8 @@ void peer_init(peer_t peer, int id, int seed)
   peer->comm_received = NULL;
 
   peer->round = 0;
+
+  peer->pending_sends = xbt_dynar_new(sizeof(msg_comm_t), NULL);
 }
 
 /**
@@ -258,6 +261,7 @@ void peer_free(peer_t peer)
   xbt_dict_free(&peer->peers);
   xbt_dict_free(&peer->active_peers);
   xbt_dynar_free(&peer->current_pieces);
+  xbt_dynar_free(&peer->pending_sends);
   xbt_free(peer->pieces_count);
   xbt_free(peer->bitfield);
   xbt_free(peer->bitfield_blocks);
@@ -274,6 +278,29 @@ int has_finished(char *bitfield)
   return ((memchr(bitfield, '0', sizeof(char) * FILE_PIECES) == NULL) ? 1 : 0);
 }
 
+/**
+ * Handle pending sends and remove those which are done
+ * @param peer Peer data
+ */
+void handle_pending_sends(peer_t peer)
+{
+  int index;
+
+  while ((index = MSG_comm_testany(peer->pending_sends)) != -1) {
+    msg_comm_t comm_send = xbt_dynar_get_as(peer->pending_sends, index, msg_comm_t);
+    int status = MSG_comm_get_status(comm_send);
+    xbt_dynar_remove_at(peer->pending_sends, index, &comm_send);
+    XBT_DEBUG("Communication %p is finished with status %d, dynar size is now %lu", comm_send, status, xbt_dynar_length(peer->pending_sends));
+
+    msg_task_t task = MSG_comm_get_task(comm_send);
+    MSG_comm_destroy(comm_send);
+
+    if (status != MSG_OK) {
+      task_message_free(task);
+    }
+  }
+}
+
 /**
  * Handle a received message sent by another peer
  * @param peer Peer data
@@ -428,6 +455,8 @@ void handle_message(peer_t peer, msg_task_t task)
       }
     }
     break;
+  case MESSAGE_CANCEL:
+    break;
   }
   //Update the peer speed.
   if (remote_peer) {
@@ -851,7 +880,9 @@ void send_bitfield(peer_t peer, const char *mailbox)
   msg_task_t task =
       task_message_bitfield_new(peer->hostname, peer->mailbox, peer->id,
                                 peer->bitfield, FILE_PIECES);
-  MSG_task_dsend(task, mailbox, task_message_free);
+  //Async send and append to pending sends
+  msg_comm_t comm = MSG_task_isend(task, mailbox);
+  xbt_dynar_push(peer->pending_sends, &comm);
 }
 
 /**
index 8fd1997..b468774 100644 (file)
@@ -42,6 +42,8 @@ typedef struct s_peer {
   RngStream stream;             //RngStream for
 
   double begin_receive_time;    //time when the receiving communication has begun, useful for calculating host speed.
+
+  xbt_dynar_t pending_sends;    // list of sends being delivered
 } s_peer_t, *peer_t;
 
 /**
@@ -58,6 +60,7 @@ void peer_free(peer_t peer);
 
 int has_finished(char *bitfield);
 
+void handle_pending_sends(peer_t peer);
 void handle_message(peer_t peer, msg_task_t task);
 
 void wait_for_pieces(peer_t peer, double deadline);
index b982c46..32f0192 100644 (file)
@@ -3,11 +3,9 @@ cmake_minimum_required(VERSION 2.6)
 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
 
 add_executable(chord chord.c)
-add_executable(chord_before_dsend chord_before_dsend.c)
 
 ### Add definitions for compile
 target_link_libraries(chord simgrid )
-target_link_libraries(chord_before_dsend simgrid )
 
 set(tesh_files
   ${tesh_files}
@@ -26,7 +24,6 @@ set(xml_files
 set(examples_src
   ${examples_src}
   ${CMAKE_CURRENT_SOURCE_DIR}/chord.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/chord_before_dsend.c
   PARENT_SCOPE
   )
 set(bin_files
index c3fe12c..14af6d0 100644 (file)
@@ -356,7 +356,7 @@ int node(int argc, char *argv[])
           MSG_process_sleep(5);
         }
       } else {
-        // a transfer has occured
+        // a transfer has occurred
 
         msg_error_t status = MSG_comm_get_status(node.comm_receive);
 
@@ -633,16 +633,19 @@ static int remote_find_successor(node_t node, int ask_to, int id)
         XBT_DEBUG("Received a task (%p)", task_received);
         task_data_t ans_data = MSG_task_get_data(task_received);
 
-        if (MC_is_active()) {
-          // the model-checker is expected to find a counter-example here. 
-         // 
-         // As you can see in the test right below, task_received is not always equal to task_sent 
-         // (as messages from differing round can interleave). But the previous version of this code 
-         // wrongly assumed that, leading to problems. But this only occured on large platforms,
-         // leading to hardly usable traces. So we used the model-checker to track down the issue, 
-         // and we came down to this test, that explained the bug in a snap.
-          MC_assert(task_received == task_sent);
-        }
+       // Once upon a time, our code assumed that here, task_received != task_sent all the time
+       // 
+       // This assumption is wrong (as messages from differing round can interleave), leading to a bug in our code.
+       // We failed to find this bug directly, as it only occured on large platforms, leading to hardly usable traces.
+       // Instead, we used the model-checker to track down the issue by adding the following test here in the code:
+       //   if (MC_is_active()) {
+       //      MC_assert(task_received == task_sent);
+        //   }
+       // That explained the bug in a snap, with a very cool example and everything.
+       // 
+       // This MC_assert is now desactivated as the case is now properly handled in our code and we don't want the
+       //   MC to fail any further under that condition, but this comment is here to as a memorial for this first 
+       //   brillant victory of the model-checking in the SimGrid community :)
 
         if (task_received != task_sent) {
           // this is not the expected answer
index 3de194d..d266b29 100644 (file)
@@ -21,33 +21,33 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platfo
 > [  0.000000] (8:node@Jacquelin)   17  |   1 
 > [  0.000000] (8:node@Jacquelin)   33  |   1 
 > [  0.000000] (8:node@Jacquelin) Predecessor: -1
-> [  6.274535] (1:node@Gatien) My finger table:
-> [  6.274535] (1:node@Gatien) Start | Succ 
-> [  6.274535] (1:node@Gatien)   49  |   1 
-> [  6.274535] (1:node@Gatien)   50  |  48 
-> [  6.274535] (1:node@Gatien)   52  |  48 
-> [  6.274535] (1:node@Gatien)   56  |  48 
-> [  6.274535] (1:node@Gatien)    0  |  48 
-> [  6.274535] (1:node@Gatien)   16  |  48 
-> [  6.274535] (1:node@Gatien) Predecessor: -1
-> [ 10.888420] (2:node@McGee) My finger table:
-> [ 10.888420] (2:node@McGee) Start | Succ 
-> [ 10.888420] (2:node@McGee)   43  |   1 
-> [ 10.888420] (2:node@McGee)   44  |  42 
-> [ 10.888420] (2:node@McGee)   46  |  42 
-> [ 10.888420] (2:node@McGee)   50  |  42 
-> [ 10.888420] (2:node@McGee)   58  |  42 
-> [ 10.888420] (2:node@McGee)   10  |  42 
-> [ 10.888420] (2:node@McGee) Predecessor: -1
-> [ 18.043892] (3:node@iRMX) My finger table:
-> [ 18.043892] (3:node@iRMX) Start | Succ 
-> [ 18.043892] (3:node@iRMX)   39  |   1 
-> [ 18.043892] (3:node@iRMX)   40  |  38 
-> [ 18.043892] (3:node@iRMX)   42  |  38 
-> [ 18.043892] (3:node@iRMX)   46  |  38 
-> [ 18.043892] (3:node@iRMX)   54  |  38 
-> [ 18.043892] (3:node@iRMX)    6  |  38 
-> [ 18.043892] (3:node@iRMX) Predecessor: -1
+> [  6.274448] (1:node@Gatien) My finger table:
+> [  6.274448] (1:node@Gatien) Start | Succ 
+> [  6.274448] (1:node@Gatien)   49  |   1 
+> [  6.274448] (1:node@Gatien)   50  |  48 
+> [  6.274448] (1:node@Gatien)   52  |  48 
+> [  6.274448] (1:node@Gatien)   56  |  48 
+> [  6.274448] (1:node@Gatien)    0  |  48 
+> [  6.274448] (1:node@Gatien)   16  |  48 
+> [  6.274448] (1:node@Gatien) Predecessor: -1
+> [ 10.888356] (2:node@McGee) My finger table:
+> [ 10.888356] (2:node@McGee) Start | Succ 
+> [ 10.888356] (2:node@McGee)   43  |   1 
+> [ 10.888356] (2:node@McGee)   44  |  42 
+> [ 10.888356] (2:node@McGee)   46  |  42 
+> [ 10.888356] (2:node@McGee)   50  |  42 
+> [ 10.888356] (2:node@McGee)   58  |  42 
+> [ 10.888356] (2:node@McGee)   10  |  42 
+> [ 10.888356] (2:node@McGee) Predecessor: -1
+> [ 18.043675] (3:node@iRMX) My finger table:
+> [ 18.043675] (3:node@iRMX) Start | Succ 
+> [ 18.043675] (3:node@iRMX)   39  |   1 
+> [ 18.043675] (3:node@iRMX)   40  |  38 
+> [ 18.043675] (3:node@iRMX)   42  |  38 
+> [ 18.043675] (3:node@iRMX)   46  |  38 
+> [ 18.043675] (3:node@iRMX)   54  |  38 
+> [ 18.043675] (3:node@iRMX)    6  |  38 
+> [ 18.043675] (3:node@iRMX) Predecessor: -1
 > [ 20.005344] (4:node@Geoff) My finger table:
 > [ 20.005344] (4:node@Geoff) Start | Succ 
 > [ 20.005344] (4:node@Geoff)   33  |   1 
@@ -57,33 +57,33 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platfo
 > [ 20.005344] (4:node@Geoff)   48  |  32 
 > [ 20.005344] (4:node@Geoff)    0  |  32 
 > [ 20.005344] (4:node@Geoff) Predecessor: -1
-> [ 26.812726] (5:node@TeX) My finger table:
-> [ 26.812726] (5:node@TeX) Start | Succ 
-> [ 26.812726] (5:node@TeX)   22  |   1 
-> [ 26.812726] (5:node@TeX)   23  |  21 
-> [ 26.812726] (5:node@TeX)   25  |  21 
-> [ 26.812726] (5:node@TeX)   29  |  21 
-> [ 26.812726] (5:node@TeX)   37  |  21 
-> [ 26.812726] (5:node@TeX)   53  |  21 
-> [ 26.812726] (5:node@TeX) Predecessor: -1
-> [ 30.925159] (6:node@Jean_Yves) My finger table:
-> [ 30.925159] (6:node@Jean_Yves) Start | Succ 
-> [ 30.925159] (6:node@Jean_Yves)   15  |   1 
-> [ 30.925159] (6:node@Jean_Yves)   16  |  14 
-> [ 30.925159] (6:node@Jean_Yves)   18  |  14 
-> [ 30.925159] (6:node@Jean_Yves)   22  |  14 
-> [ 30.925159] (6:node@Jean_Yves)   30  |  14 
-> [ 30.925159] (6:node@Jean_Yves)   46  |  14 
-> [ 30.925159] (6:node@Jean_Yves) Predecessor: -1
-> [ 36.048962] (7:node@Boivin) My finger table:
-> [ 36.048962] (7:node@Boivin) Start | Succ 
-> [ 36.048962] (7:node@Boivin)    9  |   1 
-> [ 36.048962] (7:node@Boivin)   10  |   8 
-> [ 36.048962] (7:node@Boivin)   12  |   8 
-> [ 36.048962] (7:node@Boivin)   16  |   8 
-> [ 36.048962] (7:node@Boivin)   24  |   8 
-> [ 36.048962] (7:node@Boivin)   40  |   8 
-> [ 36.048962] (7:node@Boivin) Predecessor: -1
+> [ 26.812601] (5:node@TeX) My finger table:
+> [ 26.812601] (5:node@TeX) Start | Succ 
+> [ 26.812601] (5:node@TeX)   22  |   1 
+> [ 26.812601] (5:node@TeX)   23  |  21 
+> [ 26.812601] (5:node@TeX)   25  |  21 
+> [ 26.812601] (5:node@TeX)   29  |  21 
+> [ 26.812601] (5:node@TeX)   37  |  21 
+> [ 26.812601] (5:node@TeX)   53  |  21 
+> [ 26.812601] (5:node@TeX) Predecessor: -1
+> [ 30.925129] (6:node@Jean_Yves) My finger table:
+> [ 30.925129] (6:node@Jean_Yves) Start | Succ 
+> [ 30.925129] (6:node@Jean_Yves)   15  |   1 
+> [ 30.925129] (6:node@Jean_Yves)   16  |  14 
+> [ 30.925129] (6:node@Jean_Yves)   18  |  14 
+> [ 30.925129] (6:node@Jean_Yves)   22  |  14 
+> [ 30.925129] (6:node@Jean_Yves)   30  |  14 
+> [ 30.925129] (6:node@Jean_Yves)   46  |  14 
+> [ 30.925129] (6:node@Jean_Yves) Predecessor: -1
+> [ 36.048885] (7:node@Boivin) My finger table:
+> [ 36.048885] (7:node@Boivin) Start | Succ 
+> [ 36.048885] (7:node@Boivin)    9  |   1 
+> [ 36.048885] (7:node@Boivin)   10  |   8 
+> [ 36.048885] (7:node@Boivin)   12  |   8 
+> [ 36.048885] (7:node@Boivin)   16  |   8 
+> [ 36.048885] (7:node@Boivin)   24  |   8 
+> [ 36.048885] (7:node@Boivin)   40  |   8 
+> [ 36.048885] (7:node@Boivin) Predecessor: -1
 > [ 75.000000] (8:node@Jacquelin) My finger table:
 > [ 75.000000] (8:node@Jacquelin) Start | Succ 
 > [ 75.000000] (8:node@Jacquelin)    2  |   1 
@@ -102,341 +102,341 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platfo
 > [ 80.000000] (8:node@Jacquelin)   17  |   1 
 > [ 80.000000] (8:node@Jacquelin)   33  |   1 
 > [ 80.000000] (8:node@Jacquelin) Predecessor: 42
-> [ 81.274535] (8:node@Jacquelin) My finger table:
-> [ 81.274535] (8:node@Jacquelin) Start | Succ 
-> [ 81.274535] (8:node@Jacquelin)    2  |  42 
-> [ 81.274535] (8:node@Jacquelin)    3  |   1 
-> [ 81.274535] (8:node@Jacquelin)    5  |   1 
-> [ 81.274535] (8:node@Jacquelin)    9  |   1 
-> [ 81.274535] (8:node@Jacquelin)   17  |   1 
-> [ 81.274535] (8:node@Jacquelin)   33  |   1 
-> [ 81.274535] (8:node@Jacquelin) Predecessor: 48
-> [116.656297] (2:node@McGee) My finger table:
-> [116.656297] (2:node@McGee) Start | Succ 
-> [116.656297] (2:node@McGee)   43  |  48 
-> [116.656297] (2:node@McGee)   44  |  42 
-> [116.656297] (2:node@McGee)   46  |  42 
-> [116.656297] (2:node@McGee)   50  |  42 
-> [116.656297] (2:node@McGee)   58  |  42 
-> [116.656297] (2:node@McGee)   10  |  42 
-> [116.656297] (2:node@McGee) Predecessor: 1
-> [141.384730] (1:node@Gatien) My finger table:
-> [141.384730] (1:node@Gatien) Start | Succ 
-> [141.384730] (1:node@Gatien)   49  |   1 
-> [141.384730] (1:node@Gatien)   50  |  48 
-> [141.384730] (1:node@Gatien)   52  |  48 
-> [141.384730] (1:node@Gatien)   56  |  48 
-> [141.384730] (1:node@Gatien)    0  |  48 
-> [141.384730] (1:node@Gatien)   16  |  48 
-> [141.384730] (1:node@Gatien) Predecessor: 42
-> [187.433548] (2:node@McGee) My finger table:
-> [187.433548] (2:node@McGee) Start | Succ 
-> [187.433548] (2:node@McGee)   43  |  48 
-> [187.433548] (2:node@McGee)   44  |  42 
-> [187.433548] (2:node@McGee)   46  |  42 
-> [187.433548] (2:node@McGee)   50  |  42 
-> [187.433548] (2:node@McGee)   58  |  42 
-> [187.433548] (2:node@McGee)   10  |  42 
-> [187.433548] (2:node@McGee) Predecessor: 8
-> [224.184103] (2:node@McGee) My finger table:
-> [224.184103] (2:node@McGee) Start | Succ 
-> [224.184103] (2:node@McGee)   43  |  48 
-> [224.184103] (2:node@McGee)   44  |  42 
-> [224.184103] (2:node@McGee)   46  |  42 
-> [224.184103] (2:node@McGee)   50  |  42 
-> [224.184103] (2:node@McGee)   58  |  42 
-> [224.184103] (2:node@McGee)   10  |  42 
-> [224.184103] (2:node@McGee) Predecessor: 38
-> [238.101252] (7:node@Boivin) My finger table:
-> [238.101252] (7:node@Boivin) Start | Succ 
-> [238.101252] (7:node@Boivin)    9  |  38 
-> [238.101252] (7:node@Boivin)   10  |   8 
-> [238.101252] (7:node@Boivin)   12  |   8 
-> [238.101252] (7:node@Boivin)   16  |   8 
-> [238.101252] (7:node@Boivin)   24  |   8 
-> [238.101252] (7:node@Boivin)   40  |   8 
-> [238.101252] (7:node@Boivin) Predecessor: 1
-> [244.547810] (1:node@Gatien) My finger table:
-> [244.547810] (1:node@Gatien) Start | Succ 
-> [244.547810] (1:node@Gatien)   49  |   1 
-> [244.547810] (1:node@Gatien)   50  |   1 
-> [244.547810] (1:node@Gatien)   52  |  48 
-> [244.547810] (1:node@Gatien)   56  |  48 
-> [244.547810] (1:node@Gatien)    0  |  48 
-> [244.547810] (1:node@Gatien)   16  |  48 
-> [244.547810] (1:node@Gatien) Predecessor: 42
-> [251.313269] (7:node@Boivin) My finger table:
-> [251.313269] (7:node@Boivin) Start | Succ 
-> [251.313269] (7:node@Boivin)    9  |  38 
-> [251.313269] (7:node@Boivin)   10  |  38 
-> [251.313269] (7:node@Boivin)   12  |   8 
-> [251.313269] (7:node@Boivin)   16  |   8 
-> [251.313269] (7:node@Boivin)   24  |   8 
-> [251.313269] (7:node@Boivin)   40  |   8 
-> [251.313269] (7:node@Boivin) Predecessor: 1
-> [252.823597] (2:node@McGee) My finger table:
-> [252.823597] (2:node@McGee) Start | Succ 
-> [252.823597] (2:node@McGee)   43  |  48 
-> [252.823597] (2:node@McGee)   44  |  48 
-> [252.823597] (2:node@McGee)   46  |  42 
-> [252.823597] (2:node@McGee)   50  |  42 
-> [252.823597] (2:node@McGee)   58  |  42 
-> [252.823597] (2:node@McGee)   10  |  42 
-> [252.823597] (2:node@McGee) Predecessor: 38
-> [268.912112] (6:node@Jean_Yves) My finger table:
-> [268.912112] (6:node@Jean_Yves) Start | Succ 
-> [268.912112] (6:node@Jean_Yves)   15  |  38 
-> [268.912112] (6:node@Jean_Yves)   16  |  38 
-> [268.912112] (6:node@Jean_Yves)   18  |  14 
-> [268.912112] (6:node@Jean_Yves)   22  |  14 
-> [268.912112] (6:node@Jean_Yves)   30  |  14 
-> [268.912112] (6:node@Jean_Yves)   46  |  14 
-> [268.912112] (6:node@Jean_Yves) Predecessor: -1
-> [272.591527] (3:node@iRMX) My finger table:
-> [272.591527] (3:node@iRMX) Start | Succ 
-> [272.591527] (3:node@iRMX)   39  |  42 
-> [272.591527] (3:node@iRMX)   40  |  38 
-> [272.591527] (3:node@iRMX)   42  |  38 
-> [272.591527] (3:node@iRMX)   46  |  38 
-> [272.591527] (3:node@iRMX)   54  |  38 
-> [272.591527] (3:node@iRMX)    6  |  38 
-> [272.591527] (3:node@iRMX) Predecessor: 8
-> [275.999779] (8:node@Jacquelin) My finger table:
-> [275.999779] (8:node@Jacquelin) Start | Succ 
-> [275.999779] (8:node@Jacquelin)    2  |   8 
-> [275.999779] (8:node@Jacquelin)    3  |   8 
-> [275.999779] (8:node@Jacquelin)    5  |   1 
-> [275.999779] (8:node@Jacquelin)    9  |   1 
-> [275.999779] (8:node@Jacquelin)   17  |   1 
-> [275.999779] (8:node@Jacquelin)   33  |   1 
-> [275.999779] (8:node@Jacquelin) Predecessor: 48
-> [278.899538] (3:node@iRMX) My finger table:
-> [278.899538] (3:node@iRMX) Start | Succ 
-> [278.899538] (3:node@iRMX)   39  |  42 
-> [278.899538] (3:node@iRMX)   40  |  38 
-> [278.899538] (3:node@iRMX)   42  |  38 
-> [278.899538] (3:node@iRMX)   46  |  38 
-> [278.899538] (3:node@iRMX)   54  |  38 
-> [278.899538] (3:node@iRMX)    6  |  38 
-> [278.899538] (3:node@iRMX) Predecessor: 14
-> [285.033621] (3:node@iRMX) My finger table:
-> [285.033621] (3:node@iRMX) Start | Succ 
-> [285.033621] (3:node@iRMX)   39  |  42 
-> [285.033621] (3:node@iRMX)   40  |  42 
-> [285.033621] (3:node@iRMX)   42  |  38 
-> [285.033621] (3:node@iRMX)   46  |  38 
-> [285.033621] (3:node@iRMX)   54  |  38 
-> [285.033621] (3:node@iRMX)    6  |  38 
-> [285.033621] (3:node@iRMX) Predecessor: 14
-> [299.128761] (4:node@Geoff) My finger table:
-> [299.128761] (4:node@Geoff) Start | Succ 
-> [299.128761] (4:node@Geoff)   33  |  38 
-> [299.128761] (4:node@Geoff)   34  |  38 
-> [299.128761] (4:node@Geoff)   36  |  32 
-> [299.128761] (4:node@Geoff)   40  |  32 
-> [299.128761] (4:node@Geoff)   48  |  32 
-> [299.128761] (4:node@Geoff)    0  |  32 
-> [299.128761] (4:node@Geoff) Predecessor: -1
-> [302.475676] (5:node@TeX) My finger table:
-> [302.475676] (5:node@TeX) Start | Succ 
-> [302.475676] (5:node@TeX)   22  |  38 
-> [302.475676] (5:node@TeX)   23  |  38 
-> [302.475676] (5:node@TeX)   25  |  21 
-> [302.475676] (5:node@TeX)   29  |  21 
-> [302.475676] (5:node@TeX)   37  |  21 
-> [302.475676] (5:node@TeX)   53  |  21 
-> [302.475676] (5:node@TeX) Predecessor: -1
-> [309.611552] (3:node@iRMX) My finger table:
-> [309.611552] (3:node@iRMX) Start | Succ 
-> [309.611552] (3:node@iRMX)   39  |  42 
-> [309.611552] (3:node@iRMX)   40  |  42 
-> [309.611552] (3:node@iRMX)   42  |  38 
-> [309.611552] (3:node@iRMX)   46  |  38 
-> [309.611552] (3:node@iRMX)   54  |  38 
-> [309.611552] (3:node@iRMX)    6  |  38 
-> [309.611552] (3:node@iRMX) Predecessor: 32
-> [352.258791] (6:node@Jean_Yves) My finger table:
-> [352.258791] (6:node@Jean_Yves) Start | Succ 
-> [352.258791] (6:node@Jean_Yves)   15  |  32 
-> [352.258791] (6:node@Jean_Yves)   16  |  38 
-> [352.258791] (6:node@Jean_Yves)   18  |  14 
-> [352.258791] (6:node@Jean_Yves)   22  |  14 
-> [352.258791] (6:node@Jean_Yves)   30  |  14 
-> [352.258791] (6:node@Jean_Yves)   46  |  14 
-> [352.258791] (6:node@Jean_Yves) Predecessor: 8
-> [367.429998] (4:node@Geoff) My finger table:
-> [367.429998] (4:node@Geoff) Start | Succ 
-> [367.429998] (4:node@Geoff)   33  |  38 
-> [367.429998] (4:node@Geoff)   34  |  38 
-> [367.429998] (4:node@Geoff)   36  |  32 
-> [367.429998] (4:node@Geoff)   40  |  32 
-> [367.429998] (4:node@Geoff)   48  |  32 
-> [367.429998] (4:node@Geoff)    0  |  32 
-> [367.429998] (4:node@Geoff) Predecessor: 14
-> [368.589798] (1:node@Gatien) My finger table:
-> [368.589798] (1:node@Gatien) Start | Succ 
-> [368.589798] (1:node@Gatien)   49  |   1 
-> [368.589798] (1:node@Gatien)   50  |   1 
-> [368.589798] (1:node@Gatien)   52  |   1 
-> [368.589798] (1:node@Gatien)   56  |  48 
-> [368.589798] (1:node@Gatien)    0  |  48 
-> [368.589798] (1:node@Gatien)   16  |  48 
-> [368.589798] (1:node@Gatien) Predecessor: 42
-> [374.900127] (2:node@McGee) My finger table:
-> [374.900127] (2:node@McGee) Start | Succ 
-> [374.900127] (2:node@McGee)   43  |  48 
-> [374.900127] (2:node@McGee)   44  |  48 
-> [374.900127] (2:node@McGee)   46  |  48 
-> [374.900127] (2:node@McGee)   50  |  42 
-> [374.900127] (2:node@McGee)   58  |  42 
-> [374.900127] (2:node@McGee)   10  |  42 
-> [374.900127] (2:node@McGee) Predecessor: 38
-> [392.077174] (7:node@Boivin) My finger table:
-> [392.077174] (7:node@Boivin) Start | Succ 
-> [392.077174] (7:node@Boivin)    9  |  14 
-> [392.077174] (7:node@Boivin)   10  |  38 
-> [392.077174] (7:node@Boivin)   12  |  14 
-> [392.077174] (7:node@Boivin)   16  |   8 
-> [392.077174] (7:node@Boivin)   24  |   8 
-> [392.077174] (7:node@Boivin)   40  |   8 
-> [392.077174] (7:node@Boivin) Predecessor: 1
-> [398.559775] (4:node@Geoff) My finger table:
-> [398.559775] (4:node@Geoff) Start | Succ 
-> [398.559775] (4:node@Geoff)   33  |  38 
-> [398.559775] (4:node@Geoff)   34  |  38 
-> [398.559775] (4:node@Geoff)   36  |  32 
-> [398.559775] (4:node@Geoff)   40  |  32 
-> [398.559775] (4:node@Geoff)   48  |  32 
-> [398.559775] (4:node@Geoff)    0  |  32 
-> [398.559775] (4:node@Geoff) Predecessor: 21
-> [400.956871] (6:node@Jean_Yves) My finger table:
-> [400.956871] (6:node@Jean_Yves) Start | Succ 
-> [400.956871] (6:node@Jean_Yves)   15  |  21 
-> [400.956871] (6:node@Jean_Yves)   16  |  38 
-> [400.956871] (6:node@Jean_Yves)   18  |  21 
-> [400.956871] (6:node@Jean_Yves)   22  |  14 
-> [400.956871] (6:node@Jean_Yves)   30  |  14 
-> [400.956871] (6:node@Jean_Yves)   46  |  14 
-> [400.956871] (6:node@Jean_Yves) Predecessor: 8
-> [405.310329] (8:node@Jacquelin) My finger table:
-> [405.310329] (8:node@Jacquelin) Start | Succ 
-> [405.310329] (8:node@Jacquelin)    2  |   8 
-> [405.310329] (8:node@Jacquelin)    3  |   8 
-> [405.310329] (8:node@Jacquelin)    5  |   8 
-> [405.310329] (8:node@Jacquelin)    9  |   1 
-> [405.310329] (8:node@Jacquelin)   17  |   1 
-> [405.310329] (8:node@Jacquelin)   33  |   1 
-> [405.310329] (8:node@Jacquelin) Predecessor: 48
-> [410.458067] (3:node@iRMX) My finger table:
-> [410.458067] (3:node@iRMX) Start | Succ 
-> [410.458067] (3:node@iRMX)   39  |  42 
-> [410.458067] (3:node@iRMX)   40  |  42 
-> [410.458067] (3:node@iRMX)   42  |  42 
-> [410.458067] (3:node@iRMX)   46  |  38 
-> [410.458067] (3:node@iRMX)   54  |  38 
-> [410.458067] (3:node@iRMX)    6  |  38 
-> [410.458067] (3:node@iRMX) Predecessor: 32
-> [420.681981] (4:node@Geoff) My finger table:
-> [420.681981] (4:node@Geoff) Start | Succ 
-> [420.681981] (4:node@Geoff)   33  |  38 
-> [420.681981] (4:node@Geoff)   34  |  38 
-> [420.681981] (4:node@Geoff)   36  |  38 
-> [420.681981] (4:node@Geoff)   40  |  32 
-> [420.681981] (4:node@Geoff)   48  |  32 
-> [420.681981] (4:node@Geoff)    0  |  32 
-> [420.681981] (4:node@Geoff) Predecessor: 21
-> [423.629508] (5:node@TeX) My finger table:
-> [423.629508] (5:node@TeX) Start | Succ 
-> [423.629508] (5:node@TeX)   22  |  32 
-> [423.629508] (5:node@TeX)   23  |  38 
-> [423.629508] (5:node@TeX)   25  |  32 
-> [423.629508] (5:node@TeX)   29  |  21 
-> [423.629508] (5:node@TeX)   37  |  21 
-> [423.629508] (5:node@TeX)   53  |  21 
-> [423.629508] (5:node@TeX) Predecessor: -1
-> [437.098026] (5:node@TeX) My finger table:
-> [437.098026] (5:node@TeX) Start | Succ 
-> [437.098026] (5:node@TeX)   22  |  32 
-> [437.098026] (5:node@TeX)   23  |  38 
-> [437.098026] (5:node@TeX)   25  |  32 
-> [437.098026] (5:node@TeX)   29  |  21 
-> [437.098026] (5:node@TeX)   37  |  21 
-> [437.098026] (5:node@TeX)   53  |  21 
-> [437.098026] (5:node@TeX) Predecessor: 14
-> [492.685244] (1:node@Gatien) My finger table:
-> [492.685244] (1:node@Gatien) Start | Succ 
-> [492.685244] (1:node@Gatien)   49  |   1 
-> [492.685244] (1:node@Gatien)   50  |   1 
-> [492.685244] (1:node@Gatien)   52  |   1 
-> [492.685244] (1:node@Gatien)   56  |   1 
-> [492.685244] (1:node@Gatien)    0  |  48 
-> [492.685244] (1:node@Gatien)   16  |  48 
-> [492.685244] (1:node@Gatien) Predecessor: 42
-> [518.549995] (7:node@Boivin) My finger table:
-> [518.549995] (7:node@Boivin) Start | Succ 
-> [518.549995] (7:node@Boivin)    9  |  14 
-> [518.549995] (7:node@Boivin)   10  |  38 
-> [518.549995] (7:node@Boivin)   12  |  14 
-> [518.549995] (7:node@Boivin)   16  |  21 
-> [518.549995] (7:node@Boivin)   24  |   8 
-> [518.549995] (7:node@Boivin)   40  |   8 
-> [518.549995] (7:node@Boivin) Predecessor: 1
-> [535.767747] (2:node@McGee) My finger table:
-> [535.767747] (2:node@McGee) Start | Succ 
-> [535.767747] (2:node@McGee)   43  |  48 
-> [535.767747] (2:node@McGee)   44  |  48 
-> [535.767747] (2:node@McGee)   46  |  48 
-> [535.767747] (2:node@McGee)   50  |   1 
-> [535.767747] (2:node@McGee)   58  |  42 
-> [535.767747] (2:node@McGee)   10  |  42 
-> [535.767747] (2:node@McGee) Predecessor: 38
-> [536.979231] (8:node@Jacquelin) My finger table:
-> [536.979231] (8:node@Jacquelin) Start | Succ 
-> [536.979231] (8:node@Jacquelin)    2  |   8 
-> [536.979231] (8:node@Jacquelin)    3  |   8 
-> [536.979231] (8:node@Jacquelin)    5  |   8 
-> [536.979231] (8:node@Jacquelin)    9  |  14 
-> [536.979231] (8:node@Jacquelin)   17  |   1 
-> [536.979231] (8:node@Jacquelin)   33  |   1 
-> [536.979231] (8:node@Jacquelin) Predecessor: 48
-> [549.052867] (3:node@iRMX) My finger table:
-> [549.052867] (3:node@iRMX) Start | Succ 
-> [549.052867] (3:node@iRMX)   39  |  42 
-> [549.052867] (3:node@iRMX)   40  |  42 
-> [549.052867] (3:node@iRMX)   42  |  42 
-> [549.052867] (3:node@iRMX)   46  |  48 
-> [549.052867] (3:node@iRMX)   54  |  38 
-> [549.052867] (3:node@iRMX)    6  |  38 
-> [549.052867] (3:node@iRMX) Predecessor: 32
-> [555.224559] (6:node@Jean_Yves) My finger table:
-> [555.224559] (6:node@Jean_Yves) Start | Succ 
-> [555.224559] (6:node@Jean_Yves)   15  |  21 
-> [555.224559] (6:node@Jean_Yves)   16  |  38 
-> [555.224559] (6:node@Jean_Yves)   18  |  21 
-> [555.224559] (6:node@Jean_Yves)   22  |  32 
-> [555.224559] (6:node@Jean_Yves)   30  |  14 
-> [555.224559] (6:node@Jean_Yves)   46  |  14 
-> [555.224559] (6:node@Jean_Yves) Predecessor: 8
-> [560.043242] (5:node@TeX) My finger table:
-> [560.043242] (5:node@TeX) Start | Succ 
-> [560.043242] (5:node@TeX)   22  |  32 
-> [560.043242] (5:node@TeX)   23  |  38 
-> [560.043242] (5:node@TeX)   25  |  32 
-> [560.043242] (5:node@TeX)   29  |  32 
-> [560.043242] (5:node@TeX)   37  |  21 
-> [560.043242] (5:node@TeX)   53  |  21 
-> [560.043242] (5:node@TeX) Predecessor: 14
-> [577.875047] (4:node@Geoff) My finger table:
-> [577.875047] (4:node@Geoff) Start | Succ 
-> [577.875047] (4:node@Geoff)   33  |  38 
-> [577.875047] (4:node@Geoff)   34  |  38 
-> [577.875047] (4:node@Geoff)   36  |  38 
-> [577.875047] (4:node@Geoff)   40  |  42 
-> [577.875047] (4:node@Geoff)   48  |  32 
-> [577.875047] (4:node@Geoff)    0  |  32 
-> [577.875047] (4:node@Geoff) Predecessor: 21
-> [803.676610] (0:@) Messages created: 768
-> [803.676610] (0:@) Simulated time: 803.677
+> [ 81.274448] (8:node@Jacquelin) My finger table:
+> [ 81.274448] (8:node@Jacquelin) Start | Succ 
+> [ 81.274448] (8:node@Jacquelin)    2  |  42 
+> [ 81.274448] (8:node@Jacquelin)    3  |   1 
+> [ 81.274448] (8:node@Jacquelin)    5  |   1 
+> [ 81.274448] (8:node@Jacquelin)    9  |   1 
+> [ 81.274448] (8:node@Jacquelin)   17  |   1 
+> [ 81.274448] (8:node@Jacquelin)   33  |   1 
+> [ 81.274448] (8:node@Jacquelin) Predecessor: 48
+> [116.655198] (2:node@McGee) My finger table:
+> [116.655198] (2:node@McGee) Start | Succ 
+> [116.655198] (2:node@McGee)   43  |  48 
+> [116.655198] (2:node@McGee)   44  |  42 
+> [116.655198] (2:node@McGee)   46  |  42 
+> [116.655198] (2:node@McGee)   50  |  42 
+> [116.655198] (2:node@McGee)   58  |  42 
+> [116.655198] (2:node@McGee)   10  |  42 
+> [116.655198] (2:node@McGee) Predecessor: 1
+> [141.383330] (1:node@Gatien) My finger table:
+> [141.383330] (1:node@Gatien) Start | Succ 
+> [141.383330] (1:node@Gatien)   49  |   1 
+> [141.383330] (1:node@Gatien)   50  |  48 
+> [141.383330] (1:node@Gatien)   52  |  48 
+> [141.383330] (1:node@Gatien)   56  |  48 
+> [141.383330] (1:node@Gatien)    0  |  48 
+> [141.383330] (1:node@Gatien)   16  |  48 
+> [141.383330] (1:node@Gatien) Predecessor: 42
+> [187.430809] (2:node@McGee) My finger table:
+> [187.430809] (2:node@McGee) Start | Succ 
+> [187.430809] (2:node@McGee)   43  |  48 
+> [187.430809] (2:node@McGee)   44  |  42 
+> [187.430809] (2:node@McGee)   46  |  42 
+> [187.430809] (2:node@McGee)   50  |  42 
+> [187.430809] (2:node@McGee)   58  |  42 
+> [187.430809] (2:node@McGee)   10  |  42 
+> [187.430809] (2:node@McGee) Predecessor: 8
+> [224.180932] (2:node@McGee) My finger table:
+> [224.180932] (2:node@McGee) Start | Succ 
+> [224.180932] (2:node@McGee)   43  |  48 
+> [224.180932] (2:node@McGee)   44  |  42 
+> [224.180932] (2:node@McGee)   46  |  42 
+> [224.180932] (2:node@McGee)   50  |  42 
+> [224.180932] (2:node@McGee)   58  |  42 
+> [224.180932] (2:node@McGee)   10  |  42 
+> [224.180932] (2:node@McGee) Predecessor: 38
+> [238.097182] (7:node@Boivin) My finger table:
+> [238.097182] (7:node@Boivin) Start | Succ 
+> [238.097182] (7:node@Boivin)    9  |  38 
+> [238.097182] (7:node@Boivin)   10  |   8 
+> [238.097182] (7:node@Boivin)   12  |   8 
+> [238.097182] (7:node@Boivin)   16  |   8 
+> [238.097182] (7:node@Boivin)   24  |   8 
+> [238.097182] (7:node@Boivin)   40  |   8 
+> [238.097182] (7:node@Boivin) Predecessor: 1
+> [244.544616] (1:node@Gatien) My finger table:
+> [244.544616] (1:node@Gatien) Start | Succ 
+> [244.544616] (1:node@Gatien)   49  |   1 
+> [244.544616] (1:node@Gatien)   50  |   1 
+> [244.544616] (1:node@Gatien)   52  |  48 
+> [244.544616] (1:node@Gatien)   56  |  48 
+> [244.544616] (1:node@Gatien)    0  |  48 
+> [244.544616] (1:node@Gatien)   16  |  48 
+> [244.544616] (1:node@Gatien) Predecessor: 42
+> [251.309962] (7:node@Boivin) My finger table:
+> [251.309962] (7:node@Boivin) Start | Succ 
+> [251.309962] (7:node@Boivin)    9  |  38 
+> [251.309962] (7:node@Boivin)   10  |  38 
+> [251.309962] (7:node@Boivin)   12  |   8 
+> [251.309962] (7:node@Boivin)   16  |   8 
+> [251.309962] (7:node@Boivin)   24  |   8 
+> [251.309962] (7:node@Boivin)   40  |   8 
+> [251.309962] (7:node@Boivin) Predecessor: 1
+> [252.819541] (2:node@McGee) My finger table:
+> [252.819541] (2:node@McGee) Start | Succ 
+> [252.819541] (2:node@McGee)   43  |  48 
+> [252.819541] (2:node@McGee)   44  |  48 
+> [252.819541] (2:node@McGee)   46  |  42 
+> [252.819541] (2:node@McGee)   50  |  42 
+> [252.819541] (2:node@McGee)   58  |  42 
+> [252.819541] (2:node@McGee)   10  |  42 
+> [252.819541] (2:node@McGee) Predecessor: 38
+> [268.906930] (6:node@Jean_Yves) My finger table:
+> [268.906930] (6:node@Jean_Yves) Start | Succ 
+> [268.906930] (6:node@Jean_Yves)   15  |  38 
+> [268.906930] (6:node@Jean_Yves)   16  |  38 
+> [268.906930] (6:node@Jean_Yves)   18  |  14 
+> [268.906930] (6:node@Jean_Yves)   22  |  14 
+> [268.906930] (6:node@Jean_Yves)   30  |  14 
+> [268.906930] (6:node@Jean_Yves)   46  |  14 
+> [268.906930] (6:node@Jean_Yves) Predecessor: -1
+> [272.587457] (3:node@iRMX) My finger table:
+> [272.587457] (3:node@iRMX) Start | Succ 
+> [272.587457] (3:node@iRMX)   39  |  42 
+> [272.587457] (3:node@iRMX)   40  |  38 
+> [272.587457] (3:node@iRMX)   42  |  38 
+> [272.587457] (3:node@iRMX)   46  |  38 
+> [272.587457] (3:node@iRMX)   54  |  38 
+> [272.587457] (3:node@iRMX)    6  |  38 
+> [272.587457] (3:node@iRMX) Predecessor: 8
+> [275.995469] (8:node@Jacquelin) My finger table:
+> [275.995469] (8:node@Jacquelin) Start | Succ 
+> [275.995469] (8:node@Jacquelin)    2  |   8 
+> [275.995469] (8:node@Jacquelin)    3  |   8 
+> [275.995469] (8:node@Jacquelin)    5  |   1 
+> [275.995469] (8:node@Jacquelin)    9  |   1 
+> [275.995469] (8:node@Jacquelin)   17  |   1 
+> [275.995469] (8:node@Jacquelin)   33  |   1 
+> [275.995469] (8:node@Jacquelin) Predecessor: 48
+> [278.895042] (3:node@iRMX) My finger table:
+> [278.895042] (3:node@iRMX) Start | Succ 
+> [278.895042] (3:node@iRMX)   39  |  42 
+> [278.895042] (3:node@iRMX)   40  |  38 
+> [278.895042] (3:node@iRMX)   42  |  38 
+> [278.895042] (3:node@iRMX)   46  |  38 
+> [278.895042] (3:node@iRMX)   54  |  38 
+> [278.895042] (3:node@iRMX)    6  |  38 
+> [278.895042] (3:node@iRMX) Predecessor: 14
+> [285.028728] (3:node@iRMX) My finger table:
+> [285.028728] (3:node@iRMX) Start | Succ 
+> [285.028728] (3:node@iRMX)   39  |  42 
+> [285.028728] (3:node@iRMX)   40  |  42 
+> [285.028728] (3:node@iRMX)   42  |  38 
+> [285.028728] (3:node@iRMX)   46  |  38 
+> [285.028728] (3:node@iRMX)   54  |  38 
+> [285.028728] (3:node@iRMX)    6  |  38 
+> [285.028728] (3:node@iRMX) Predecessor: 14
+> [299.124575] (4:node@Geoff) My finger table:
+> [299.124575] (4:node@Geoff) Start | Succ 
+> [299.124575] (4:node@Geoff)   33  |  38 
+> [299.124575] (4:node@Geoff)   34  |  38 
+> [299.124575] (4:node@Geoff)   36  |  32 
+> [299.124575] (4:node@Geoff)   40  |  32 
+> [299.124575] (4:node@Geoff)   48  |  32 
+> [299.124575] (4:node@Geoff)    0  |  32 
+> [299.124575] (4:node@Geoff) Predecessor: -1
+> [302.471250] (5:node@TeX) My finger table:
+> [302.471250] (5:node@TeX) Start | Succ 
+> [302.471250] (5:node@TeX)   22  |  38 
+> [302.471250] (5:node@TeX)   23  |  38 
+> [302.471250] (5:node@TeX)   25  |  21 
+> [302.471250] (5:node@TeX)   29  |  21 
+> [302.471250] (5:node@TeX)   37  |  21 
+> [302.471250] (5:node@TeX)   53  |  21 
+> [302.471250] (5:node@TeX) Predecessor: -1
+> [309.606629] (3:node@iRMX) My finger table:
+> [309.606629] (3:node@iRMX) Start | Succ 
+> [309.606629] (3:node@iRMX)   39  |  42 
+> [309.606629] (3:node@iRMX)   40  |  42 
+> [309.606629] (3:node@iRMX)   42  |  38 
+> [309.606629] (3:node@iRMX)   46  |  38 
+> [309.606629] (3:node@iRMX)   54  |  38 
+> [309.606629] (3:node@iRMX)    6  |  38 
+> [309.606629] (3:node@iRMX) Predecessor: 32
+> [352.254124] (6:node@Jean_Yves) My finger table:
+> [352.254124] (6:node@Jean_Yves) Start | Succ 
+> [352.254124] (6:node@Jean_Yves)   15  |  32 
+> [352.254124] (6:node@Jean_Yves)   16  |  38 
+> [352.254124] (6:node@Jean_Yves)   18  |  14 
+> [352.254124] (6:node@Jean_Yves)   22  |  14 
+> [352.254124] (6:node@Jean_Yves)   30  |  14 
+> [352.254124] (6:node@Jean_Yves)   46  |  14 
+> [352.254124] (6:node@Jean_Yves) Predecessor: 8
+> [367.424268] (4:node@Geoff) My finger table:
+> [367.424268] (4:node@Geoff) Start | Succ 
+> [367.424268] (4:node@Geoff)   33  |  38 
+> [367.424268] (4:node@Geoff)   34  |  38 
+> [367.424268] (4:node@Geoff)   36  |  32 
+> [367.424268] (4:node@Geoff)   40  |  32 
+> [367.424268] (4:node@Geoff)   48  |  32 
+> [367.424268] (4:node@Geoff)    0  |  32 
+> [367.424268] (4:node@Geoff) Predecessor: 14
+> [368.585330] (1:node@Gatien) My finger table:
+> [368.585330] (1:node@Gatien) Start | Succ 
+> [368.585330] (1:node@Gatien)   49  |   1 
+> [368.585330] (1:node@Gatien)   50  |   1 
+> [368.585330] (1:node@Gatien)   52  |   1 
+> [368.585330] (1:node@Gatien)   56  |  48 
+> [368.585330] (1:node@Gatien)    0  |  48 
+> [368.585330] (1:node@Gatien)   16  |  48 
+> [368.585330] (1:node@Gatien) Predecessor: 42
+> [374.895586] (2:node@McGee) My finger table:
+> [374.895586] (2:node@McGee) Start | Succ 
+> [374.895586] (2:node@McGee)   43  |  48 
+> [374.895586] (2:node@McGee)   44  |  48 
+> [374.895586] (2:node@McGee)   46  |  48 
+> [374.895586] (2:node@McGee)   50  |  42 
+> [374.895586] (2:node@McGee)   58  |  42 
+> [374.895586] (2:node@McGee)   10  |  42 
+> [374.895586] (2:node@McGee) Predecessor: 38
+> [392.072163] (7:node@Boivin) My finger table:
+> [392.072163] (7:node@Boivin) Start | Succ 
+> [392.072163] (7:node@Boivin)    9  |  14 
+> [392.072163] (7:node@Boivin)   10  |  38 
+> [392.072163] (7:node@Boivin)   12  |  14 
+> [392.072163] (7:node@Boivin)   16  |   8 
+> [392.072163] (7:node@Boivin)   24  |   8 
+> [392.072163] (7:node@Boivin)   40  |   8 
+> [392.072163] (7:node@Boivin) Predecessor: 1
+> [398.554276] (4:node@Geoff) My finger table:
+> [398.554276] (4:node@Geoff) Start | Succ 
+> [398.554276] (4:node@Geoff)   33  |  38 
+> [398.554276] (4:node@Geoff)   34  |  38 
+> [398.554276] (4:node@Geoff)   36  |  32 
+> [398.554276] (4:node@Geoff)   40  |  32 
+> [398.554276] (4:node@Geoff)   48  |  32 
+> [398.554276] (4:node@Geoff)    0  |  32 
+> [398.554276] (4:node@Geoff) Predecessor: 21
+> [400.952003] (6:node@Jean_Yves) My finger table:
+> [400.952003] (6:node@Jean_Yves) Start | Succ 
+> [400.952003] (6:node@Jean_Yves)   15  |  21 
+> [400.952003] (6:node@Jean_Yves)   16  |  38 
+> [400.952003] (6:node@Jean_Yves)   18  |  21 
+> [400.952003] (6:node@Jean_Yves)   22  |  14 
+> [400.952003] (6:node@Jean_Yves)   30  |  14 
+> [400.952003] (6:node@Jean_Yves)   46  |  14 
+> [400.952003] (6:node@Jean_Yves) Predecessor: 8
+> [405.305407] (8:node@Jacquelin) My finger table:
+> [405.305407] (8:node@Jacquelin) Start | Succ 
+> [405.305407] (8:node@Jacquelin)    2  |   8 
+> [405.305407] (8:node@Jacquelin)    3  |   8 
+> [405.305407] (8:node@Jacquelin)    5  |   8 
+> [405.305407] (8:node@Jacquelin)    9  |   1 
+> [405.305407] (8:node@Jacquelin)   17  |   1 
+> [405.305407] (8:node@Jacquelin)   33  |   1 
+> [405.305407] (8:node@Jacquelin) Predecessor: 48
+> [410.451746] (3:node@iRMX) My finger table:
+> [410.451746] (3:node@iRMX) Start | Succ 
+> [410.451746] (3:node@iRMX)   39  |  42 
+> [410.451746] (3:node@iRMX)   40  |  42 
+> [410.451746] (3:node@iRMX)   42  |  42 
+> [410.451746] (3:node@iRMX)   46  |  38 
+> [410.451746] (3:node@iRMX)   54  |  38 
+> [410.451746] (3:node@iRMX)    6  |  38 
+> [410.451746] (3:node@iRMX) Predecessor: 32
+> [420.675292] (4:node@Geoff) My finger table:
+> [420.675292] (4:node@Geoff) Start | Succ 
+> [420.675292] (4:node@Geoff)   33  |  38 
+> [420.675292] (4:node@Geoff)   34  |  38 
+> [420.675292] (4:node@Geoff)   36  |  38 
+> [420.675292] (4:node@Geoff)   40  |  32 
+> [420.675292] (4:node@Geoff)   48  |  32 
+> [420.675292] (4:node@Geoff)    0  |  32 
+> [420.675292] (4:node@Geoff) Predecessor: 21
+> [423.624135] (5:node@TeX) My finger table:
+> [423.624135] (5:node@TeX) Start | Succ 
+> [423.624135] (5:node@TeX)   22  |  32 
+> [423.624135] (5:node@TeX)   23  |  38 
+> [423.624135] (5:node@TeX)   25  |  32 
+> [423.624135] (5:node@TeX)   29  |  21 
+> [423.624135] (5:node@TeX)   37  |  21 
+> [423.624135] (5:node@TeX)   53  |  21 
+> [423.624135] (5:node@TeX) Predecessor: -1
+> [437.092117] (5:node@TeX) My finger table:
+> [437.092117] (5:node@TeX) Start | Succ 
+> [437.092117] (5:node@TeX)   22  |  32 
+> [437.092117] (5:node@TeX)   23  |  38 
+> [437.092117] (5:node@TeX)   25  |  32 
+> [437.092117] (5:node@TeX)   29  |  21 
+> [437.092117] (5:node@TeX)   37  |  21 
+> [437.092117] (5:node@TeX)   53  |  21 
+> [437.092117] (5:node@TeX) Predecessor: 14
+> [492.679220] (1:node@Gatien) My finger table:
+> [492.679220] (1:node@Gatien) Start | Succ 
+> [492.679220] (1:node@Gatien)   49  |   1 
+> [492.679220] (1:node@Gatien)   50  |   1 
+> [492.679220] (1:node@Gatien)   52  |   1 
+> [492.679220] (1:node@Gatien)   56  |   1 
+> [492.679220] (1:node@Gatien)    0  |  48 
+> [492.679220] (1:node@Gatien)   16  |  48 
+> [492.679220] (1:node@Gatien) Predecessor: 42
+> [518.542734] (7:node@Boivin) My finger table:
+> [518.542734] (7:node@Boivin) Start | Succ 
+> [518.542734] (7:node@Boivin)    9  |  14 
+> [518.542734] (7:node@Boivin)   10  |  38 
+> [518.542734] (7:node@Boivin)   12  |  14 
+> [518.542734] (7:node@Boivin)   16  |  21 
+> [518.542734] (7:node@Boivin)   24  |   8 
+> [518.542734] (7:node@Boivin)   40  |   8 
+> [518.542734] (7:node@Boivin) Predecessor: 1
+> [535.761185] (2:node@McGee) My finger table:
+> [535.761185] (2:node@McGee) Start | Succ 
+> [535.761185] (2:node@McGee)   43  |  48 
+> [535.761185] (2:node@McGee)   44  |  48 
+> [535.761185] (2:node@McGee)   46  |  48 
+> [535.761185] (2:node@McGee)   50  |   1 
+> [535.761185] (2:node@McGee)   58  |  42 
+> [535.761185] (2:node@McGee)   10  |  42 
+> [535.761185] (2:node@McGee) Predecessor: 38
+> [536.972553] (8:node@Jacquelin) My finger table:
+> [536.972553] (8:node@Jacquelin) Start | Succ 
+> [536.972553] (8:node@Jacquelin)    2  |   8 
+> [536.972553] (8:node@Jacquelin)    3  |   8 
+> [536.972553] (8:node@Jacquelin)    5  |   8 
+> [536.972553] (8:node@Jacquelin)    9  |  14 
+> [536.972553] (8:node@Jacquelin)   17  |   1 
+> [536.972553] (8:node@Jacquelin)   33  |   1 
+> [536.972553] (8:node@Jacquelin) Predecessor: 48
+> [549.045384] (3:node@iRMX) My finger table:
+> [549.045384] (3:node@iRMX) Start | Succ 
+> [549.045384] (3:node@iRMX)   39  |  42 
+> [549.045384] (3:node@iRMX)   40  |  42 
+> [549.045384] (3:node@iRMX)   42  |  42 
+> [549.045384] (3:node@iRMX)   46  |  48 
+> [549.045384] (3:node@iRMX)   54  |  38 
+> [549.045384] (3:node@iRMX)    6  |  38 
+> [549.045384] (3:node@iRMX) Predecessor: 32
+> [555.217155] (6:node@Jean_Yves) My finger table:
+> [555.217155] (6:node@Jean_Yves) Start | Succ 
+> [555.217155] (6:node@Jean_Yves)   15  |  21 
+> [555.217155] (6:node@Jean_Yves)   16  |  38 
+> [555.217155] (6:node@Jean_Yves)   18  |  21 
+> [555.217155] (6:node@Jean_Yves)   22  |  32 
+> [555.217155] (6:node@Jean_Yves)   30  |  14 
+> [555.217155] (6:node@Jean_Yves)   46  |  14 
+> [555.217155] (6:node@Jean_Yves) Predecessor: 8
+> [560.036388] (5:node@TeX) My finger table:
+> [560.036388] (5:node@TeX) Start | Succ 
+> [560.036388] (5:node@TeX)   22  |  32 
+> [560.036388] (5:node@TeX)   23  |  38 
+> [560.036388] (5:node@TeX)   25  |  32 
+> [560.036388] (5:node@TeX)   29  |  32 
+> [560.036388] (5:node@TeX)   37  |  21 
+> [560.036388] (5:node@TeX)   53  |  21 
+> [560.036388] (5:node@TeX) Predecessor: 14
+> [577.866928] (4:node@Geoff) My finger table:
+> [577.866928] (4:node@Geoff) Start | Succ 
+> [577.866928] (4:node@Geoff)   33  |  38 
+> [577.866928] (4:node@Geoff)   34  |  38 
+> [577.866928] (4:node@Geoff)   36  |  38 
+> [577.866928] (4:node@Geoff)   40  |  42 
+> [577.866928] (4:node@Geoff)   48  |  32 
+> [577.866928] (4:node@Geoff)    0  |  32 
+> [577.866928] (4:node@Geoff) Predecessor: 21
+> [803.668927] (0:@) Messages created: 768
+> [803.668927] (0:@) Simulated time: 803.669
 
 ! output sort
 $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.xml ${srcdir:=.}/chord10.xml --cfg=network/crosstraffic:0 --log=msg_chord.thres:verbose "--log=root.fmt:[%11.6r]%e(%i:%P@%h)%e%m%n" --cfg=network/model:Constant
index bf80a92..dce7b71 100644 (file)
@@ -20,33 +20,33 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platfo
 > [  0.000000] (8:node@Jacquelin)   17  |   1 
 > [  0.000000] (8:node@Jacquelin)   33  |   1 
 > [  0.000000] (8:node@Jacquelin) Predecessor: -1
-> [  6.274535] (1:node@Gatien) My finger table:
-> [  6.274535] (1:node@Gatien) Start | Succ 
-> [  6.274535] (1:node@Gatien)   49  |   1 
-> [  6.274535] (1:node@Gatien)   50  |  48 
-> [  6.274535] (1:node@Gatien)   52  |  48 
-> [  6.274535] (1:node@Gatien)   56  |  48 
-> [  6.274535] (1:node@Gatien)    0  |  48 
-> [  6.274535] (1:node@Gatien)   16  |  48 
-> [  6.274535] (1:node@Gatien) Predecessor: -1
-> [ 10.888420] (2:node@McGee) My finger table:
-> [ 10.888420] (2:node@McGee) Start | Succ 
-> [ 10.888420] (2:node@McGee)   43  |   1 
-> [ 10.888420] (2:node@McGee)   44  |  42 
-> [ 10.888420] (2:node@McGee)   46  |  42 
-> [ 10.888420] (2:node@McGee)   50  |  42 
-> [ 10.888420] (2:node@McGee)   58  |  42 
-> [ 10.888420] (2:node@McGee)   10  |  42 
-> [ 10.888420] (2:node@McGee) Predecessor: -1
-> [ 18.043892] (3:node@iRMX) My finger table:
-> [ 18.043892] (3:node@iRMX) Start | Succ 
-> [ 18.043892] (3:node@iRMX)   39  |   1 
-> [ 18.043892] (3:node@iRMX)   40  |  38 
-> [ 18.043892] (3:node@iRMX)   42  |  38 
-> [ 18.043892] (3:node@iRMX)   46  |  38 
-> [ 18.043892] (3:node@iRMX)   54  |  38 
-> [ 18.043892] (3:node@iRMX)    6  |  38 
-> [ 18.043892] (3:node@iRMX) Predecessor: -1
+> [  6.274448] (1:node@Gatien) My finger table:
+> [  6.274448] (1:node@Gatien) Start | Succ 
+> [  6.274448] (1:node@Gatien)   49  |   1 
+> [  6.274448] (1:node@Gatien)   50  |  48 
+> [  6.274448] (1:node@Gatien)   52  |  48 
+> [  6.274448] (1:node@Gatien)   56  |  48 
+> [  6.274448] (1:node@Gatien)    0  |  48 
+> [  6.274448] (1:node@Gatien)   16  |  48 
+> [  6.274448] (1:node@Gatien) Predecessor: -1
+> [ 10.888356] (2:node@McGee) My finger table:
+> [ 10.888356] (2:node@McGee) Start | Succ 
+> [ 10.888356] (2:node@McGee)   43  |   1 
+> [ 10.888356] (2:node@McGee)   44  |  42 
+> [ 10.888356] (2:node@McGee)   46  |  42 
+> [ 10.888356] (2:node@McGee)   50  |  42 
+> [ 10.888356] (2:node@McGee)   58  |  42 
+> [ 10.888356] (2:node@McGee)   10  |  42 
+> [ 10.888356] (2:node@McGee) Predecessor: -1
+> [ 18.043675] (3:node@iRMX) My finger table:
+> [ 18.043675] (3:node@iRMX) Start | Succ 
+> [ 18.043675] (3:node@iRMX)   39  |   1 
+> [ 18.043675] (3:node@iRMX)   40  |  38 
+> [ 18.043675] (3:node@iRMX)   42  |  38 
+> [ 18.043675] (3:node@iRMX)   46  |  38 
+> [ 18.043675] (3:node@iRMX)   54  |  38 
+> [ 18.043675] (3:node@iRMX)    6  |  38 
+> [ 18.043675] (3:node@iRMX) Predecessor: -1
 > [ 20.005344] (4:node@Geoff) My finger table:
 > [ 20.005344] (4:node@Geoff) Start | Succ 
 > [ 20.005344] (4:node@Geoff)   33  |   1 
@@ -56,33 +56,33 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platfo
 > [ 20.005344] (4:node@Geoff)   48  |  32 
 > [ 20.005344] (4:node@Geoff)    0  |  32 
 > [ 20.005344] (4:node@Geoff) Predecessor: -1
-> [ 26.812726] (5:node@TeX) My finger table:
-> [ 26.812726] (5:node@TeX) Start | Succ 
-> [ 26.812726] (5:node@TeX)   22  |   1 
-> [ 26.812726] (5:node@TeX)   23  |  21 
-> [ 26.812726] (5:node@TeX)   25  |  21 
-> [ 26.812726] (5:node@TeX)   29  |  21 
-> [ 26.812726] (5:node@TeX)   37  |  21 
-> [ 26.812726] (5:node@TeX)   53  |  21 
-> [ 26.812726] (5:node@TeX) Predecessor: -1
-> [ 30.925159] (6:node@Jean_Yves) My finger table:
-> [ 30.925159] (6:node@Jean_Yves) Start | Succ 
-> [ 30.925159] (6:node@Jean_Yves)   15  |   1 
-> [ 30.925159] (6:node@Jean_Yves)   16  |  14 
-> [ 30.925159] (6:node@Jean_Yves)   18  |  14 
-> [ 30.925159] (6:node@Jean_Yves)   22  |  14 
-> [ 30.925159] (6:node@Jean_Yves)   30  |  14 
-> [ 30.925159] (6:node@Jean_Yves)   46  |  14 
-> [ 30.925159] (6:node@Jean_Yves) Predecessor: -1
-> [ 36.048962] (7:node@Boivin) My finger table:
-> [ 36.048962] (7:node@Boivin) Start | Succ 
-> [ 36.048962] (7:node@Boivin)    9  |   1 
-> [ 36.048962] (7:node@Boivin)   10  |   8 
-> [ 36.048962] (7:node@Boivin)   12  |   8 
-> [ 36.048962] (7:node@Boivin)   16  |   8 
-> [ 36.048962] (7:node@Boivin)   24  |   8 
-> [ 36.048962] (7:node@Boivin)   40  |   8 
-> [ 36.048962] (7:node@Boivin) Predecessor: -1
+> [ 26.812602] (5:node@TeX) My finger table:
+> [ 26.812602] (5:node@TeX) Start | Succ 
+> [ 26.812602] (5:node@TeX)   22  |   1 
+> [ 26.812602] (5:node@TeX)   23  |  21 
+> [ 26.812602] (5:node@TeX)   25  |  21 
+> [ 26.812602] (5:node@TeX)   29  |  21 
+> [ 26.812602] (5:node@TeX)   37  |  21 
+> [ 26.812602] (5:node@TeX)   53  |  21 
+> [ 26.812602] (5:node@TeX) Predecessor: -1
+> [ 30.925131] (6:node@Jean_Yves) My finger table:
+> [ 30.925131] (6:node@Jean_Yves) Start | Succ 
+> [ 30.925131] (6:node@Jean_Yves)   15  |   1 
+> [ 30.925131] (6:node@Jean_Yves)   16  |  14 
+> [ 30.925131] (6:node@Jean_Yves)   18  |  14 
+> [ 30.925131] (6:node@Jean_Yves)   22  |  14 
+> [ 30.925131] (6:node@Jean_Yves)   30  |  14 
+> [ 30.925131] (6:node@Jean_Yves)   46  |  14 
+> [ 30.925131] (6:node@Jean_Yves) Predecessor: -1
+> [ 36.048886] (7:node@Boivin) My finger table:
+> [ 36.048886] (7:node@Boivin) Start | Succ 
+> [ 36.048886] (7:node@Boivin)    9  |   1 
+> [ 36.048886] (7:node@Boivin)   10  |   8 
+> [ 36.048886] (7:node@Boivin)   12  |   8 
+> [ 36.048886] (7:node@Boivin)   16  |   8 
+> [ 36.048886] (7:node@Boivin)   24  |   8 
+> [ 36.048886] (7:node@Boivin)   40  |   8 
+> [ 36.048886] (7:node@Boivin) Predecessor: -1
 > [ 75.000000] (8:node@Jacquelin) My finger table:
 > [ 75.000000] (8:node@Jacquelin) Start | Succ 
 > [ 75.000000] (8:node@Jacquelin)    2  |   1 
@@ -101,341 +101,341 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platfo
 > [ 80.000000] (8:node@Jacquelin)   17  |   1 
 > [ 80.000000] (8:node@Jacquelin)   33  |   1 
 > [ 80.000000] (8:node@Jacquelin) Predecessor: 42
-> [ 81.274535] (8:node@Jacquelin) My finger table:
-> [ 81.274535] (8:node@Jacquelin) Start | Succ 
-> [ 81.274535] (8:node@Jacquelin)    2  |  42 
-> [ 81.274535] (8:node@Jacquelin)    3  |   1 
-> [ 81.274535] (8:node@Jacquelin)    5  |   1 
-> [ 81.274535] (8:node@Jacquelin)    9  |   1 
-> [ 81.274535] (8:node@Jacquelin)   17  |   1 
-> [ 81.274535] (8:node@Jacquelin)   33  |   1 
-> [ 81.274535] (8:node@Jacquelin) Predecessor: 48
-> [116.656297] (2:node@McGee) My finger table:
-> [116.656297] (2:node@McGee) Start | Succ 
-> [116.656297] (2:node@McGee)   43  |  48 
-> [116.656297] (2:node@McGee)   44  |  42 
-> [116.656297] (2:node@McGee)   46  |  42 
-> [116.656297] (2:node@McGee)   50  |  42 
-> [116.656297] (2:node@McGee)   58  |  42 
-> [116.656297] (2:node@McGee)   10  |  42 
-> [116.656297] (2:node@McGee) Predecessor: 1
-> [141.384731] (1:node@Gatien) My finger table:
-> [141.384731] (1:node@Gatien) Start | Succ 
-> [141.384731] (1:node@Gatien)   49  |   1 
-> [141.384731] (1:node@Gatien)   50  |  48 
-> [141.384731] (1:node@Gatien)   52  |  48 
-> [141.384731] (1:node@Gatien)   56  |  48 
-> [141.384731] (1:node@Gatien)    0  |  48 
-> [141.384731] (1:node@Gatien)   16  |  48 
-> [141.384731] (1:node@Gatien) Predecessor: 42
-> [187.433548] (2:node@McGee) My finger table:
-> [187.433548] (2:node@McGee) Start | Succ 
-> [187.433548] (2:node@McGee)   43  |  48 
-> [187.433548] (2:node@McGee)   44  |  42 
-> [187.433548] (2:node@McGee)   46  |  42 
-> [187.433548] (2:node@McGee)   50  |  42 
-> [187.433548] (2:node@McGee)   58  |  42 
-> [187.433548] (2:node@McGee)   10  |  42 
-> [187.433548] (2:node@McGee) Predecessor: 8
-> [224.184103] (2:node@McGee) My finger table:
-> [224.184103] (2:node@McGee) Start | Succ 
-> [224.184103] (2:node@McGee)   43  |  48 
-> [224.184103] (2:node@McGee)   44  |  42 
-> [224.184103] (2:node@McGee)   46  |  42 
-> [224.184103] (2:node@McGee)   50  |  42 
-> [224.184103] (2:node@McGee)   58  |  42 
-> [224.184103] (2:node@McGee)   10  |  42 
-> [224.184103] (2:node@McGee) Predecessor: 38
-> [238.101252] (7:node@Boivin) My finger table:
-> [238.101252] (7:node@Boivin) Start | Succ 
-> [238.101252] (7:node@Boivin)    9  |  38 
-> [238.101252] (7:node@Boivin)   10  |   8 
-> [238.101252] (7:node@Boivin)   12  |   8 
-> [238.101252] (7:node@Boivin)   16  |   8 
-> [238.101252] (7:node@Boivin)   24  |   8 
-> [238.101252] (7:node@Boivin)   40  |   8 
-> [238.101252] (7:node@Boivin) Predecessor: 1
-> [244.547810] (1:node@Gatien) My finger table:
-> [244.547810] (1:node@Gatien) Start | Succ 
-> [244.547810] (1:node@Gatien)   49  |   1 
-> [244.547810] (1:node@Gatien)   50  |   1 
-> [244.547810] (1:node@Gatien)   52  |  48 
-> [244.547810] (1:node@Gatien)   56  |  48 
-> [244.547810] (1:node@Gatien)    0  |  48 
-> [244.547810] (1:node@Gatien)   16  |  48 
-> [244.547810] (1:node@Gatien) Predecessor: 42
-> [251.313269] (7:node@Boivin) My finger table:
-> [251.313269] (7:node@Boivin) Start | Succ 
-> [251.313269] (7:node@Boivin)    9  |  38 
-> [251.313269] (7:node@Boivin)   10  |  38 
-> [251.313269] (7:node@Boivin)   12  |   8 
-> [251.313269] (7:node@Boivin)   16  |   8 
-> [251.313269] (7:node@Boivin)   24  |   8 
-> [251.313269] (7:node@Boivin)   40  |   8 
-> [251.313269] (7:node@Boivin) Predecessor: 1
-> [252.823597] (2:node@McGee) My finger table:
-> [252.823597] (2:node@McGee) Start | Succ 
-> [252.823597] (2:node@McGee)   43  |  48 
-> [252.823597] (2:node@McGee)   44  |  48 
-> [252.823597] (2:node@McGee)   46  |  42 
-> [252.823597] (2:node@McGee)   50  |  42 
-> [252.823597] (2:node@McGee)   58  |  42 
-> [252.823597] (2:node@McGee)   10  |  42 
-> [252.823597] (2:node@McGee) Predecessor: 38
-> [268.912112] (6:node@Jean_Yves) My finger table:
-> [268.912112] (6:node@Jean_Yves) Start | Succ 
-> [268.912112] (6:node@Jean_Yves)   15  |  38 
-> [268.912112] (6:node@Jean_Yves)   16  |  38 
-> [268.912112] (6:node@Jean_Yves)   18  |  14 
-> [268.912112] (6:node@Jean_Yves)   22  |  14 
-> [268.912112] (6:node@Jean_Yves)   30  |  14 
-> [268.912112] (6:node@Jean_Yves)   46  |  14 
-> [268.912112] (6:node@Jean_Yves) Predecessor: -1
-> [272.591527] (3:node@iRMX) My finger table:
-> [272.591527] (3:node@iRMX) Start | Succ 
-> [272.591527] (3:node@iRMX)   39  |  42 
-> [272.591527] (3:node@iRMX)   40  |  38 
-> [272.591527] (3:node@iRMX)   42  |  38 
-> [272.591527] (3:node@iRMX)   46  |  38 
-> [272.591527] (3:node@iRMX)   54  |  38 
-> [272.591527] (3:node@iRMX)    6  |  38 
-> [272.591527] (3:node@iRMX) Predecessor: 8
-> [275.999780] (8:node@Jacquelin) My finger table:
-> [275.999780] (8:node@Jacquelin) Start | Succ 
-> [275.999780] (8:node@Jacquelin)    2  |   8 
-> [275.999780] (8:node@Jacquelin)    3  |   8 
-> [275.999780] (8:node@Jacquelin)    5  |   1 
-> [275.999780] (8:node@Jacquelin)    9  |   1 
-> [275.999780] (8:node@Jacquelin)   17  |   1 
-> [275.999780] (8:node@Jacquelin)   33  |   1 
-> [275.999780] (8:node@Jacquelin) Predecessor: 48
-> [278.899538] (3:node@iRMX) My finger table:
-> [278.899538] (3:node@iRMX) Start | Succ 
-> [278.899538] (3:node@iRMX)   39  |  42 
-> [278.899538] (3:node@iRMX)   40  |  38 
-> [278.899538] (3:node@iRMX)   42  |  38 
-> [278.899538] (3:node@iRMX)   46  |  38 
-> [278.899538] (3:node@iRMX)   54  |  38 
-> [278.899538] (3:node@iRMX)    6  |  38 
-> [278.899538] (3:node@iRMX) Predecessor: 14
-> [285.033621] (3:node@iRMX) My finger table:
-> [285.033621] (3:node@iRMX) Start | Succ 
-> [285.033621] (3:node@iRMX)   39  |  42 
-> [285.033621] (3:node@iRMX)   40  |  42 
-> [285.033621] (3:node@iRMX)   42  |  38 
-> [285.033621] (3:node@iRMX)   46  |  38 
-> [285.033621] (3:node@iRMX)   54  |  38 
-> [285.033621] (3:node@iRMX)    6  |  38 
-> [285.033621] (3:node@iRMX) Predecessor: 14
-> [299.128761] (4:node@Geoff) My finger table:
-> [299.128761] (4:node@Geoff) Start | Succ 
-> [299.128761] (4:node@Geoff)   33  |  38 
-> [299.128761] (4:node@Geoff)   34  |  38 
-> [299.128761] (4:node@Geoff)   36  |  32 
-> [299.128761] (4:node@Geoff)   40  |  32 
-> [299.128761] (4:node@Geoff)   48  |  32 
-> [299.128761] (4:node@Geoff)    0  |  32 
-> [299.128761] (4:node@Geoff) Predecessor: -1
-> [302.475676] (5:node@TeX) My finger table:
-> [302.475676] (5:node@TeX) Start | Succ 
-> [302.475676] (5:node@TeX)   22  |  38 
-> [302.475676] (5:node@TeX)   23  |  38 
-> [302.475676] (5:node@TeX)   25  |  21 
-> [302.475676] (5:node@TeX)   29  |  21 
-> [302.475676] (5:node@TeX)   37  |  21 
-> [302.475676] (5:node@TeX)   53  |  21 
-> [302.475676] (5:node@TeX) Predecessor: -1
-> [309.611552] (3:node@iRMX) My finger table:
-> [309.611552] (3:node@iRMX) Start | Succ 
-> [309.611552] (3:node@iRMX)   39  |  42 
-> [309.611552] (3:node@iRMX)   40  |  42 
-> [309.611552] (3:node@iRMX)   42  |  38 
-> [309.611552] (3:node@iRMX)   46  |  38 
-> [309.611552] (3:node@iRMX)   54  |  38 
-> [309.611552] (3:node@iRMX)    6  |  38 
-> [309.611552] (3:node@iRMX) Predecessor: 32
-> [352.258791] (6:node@Jean_Yves) My finger table:
-> [352.258791] (6:node@Jean_Yves) Start | Succ 
-> [352.258791] (6:node@Jean_Yves)   15  |  32 
-> [352.258791] (6:node@Jean_Yves)   16  |  38 
-> [352.258791] (6:node@Jean_Yves)   18  |  14 
-> [352.258791] (6:node@Jean_Yves)   22  |  14 
-> [352.258791] (6:node@Jean_Yves)   30  |  14 
-> [352.258791] (6:node@Jean_Yves)   46  |  14 
-> [352.258791] (6:node@Jean_Yves) Predecessor: 8
-> [367.429998] (4:node@Geoff) My finger table:
-> [367.429998] (4:node@Geoff) Start | Succ 
-> [367.429998] (4:node@Geoff)   33  |  38 
-> [367.429998] (4:node@Geoff)   34  |  38 
-> [367.429998] (4:node@Geoff)   36  |  32 
-> [367.429998] (4:node@Geoff)   40  |  32 
-> [367.429998] (4:node@Geoff)   48  |  32 
-> [367.429998] (4:node@Geoff)    0  |  32 
-> [367.429998] (4:node@Geoff) Predecessor: 14
-> [368.589798] (1:node@Gatien) My finger table:
-> [368.589798] (1:node@Gatien) Start | Succ 
-> [368.589798] (1:node@Gatien)   49  |   1 
-> [368.589798] (1:node@Gatien)   50  |   1 
-> [368.589798] (1:node@Gatien)   52  |   1 
-> [368.589798] (1:node@Gatien)   56  |  48 
-> [368.589798] (1:node@Gatien)    0  |  48 
-> [368.589798] (1:node@Gatien)   16  |  48 
-> [368.589798] (1:node@Gatien) Predecessor: 42
-> [374.900127] (2:node@McGee) My finger table:
-> [374.900127] (2:node@McGee) Start | Succ 
-> [374.900127] (2:node@McGee)   43  |  48 
-> [374.900127] (2:node@McGee)   44  |  48 
-> [374.900127] (2:node@McGee)   46  |  48 
-> [374.900127] (2:node@McGee)   50  |  42 
-> [374.900127] (2:node@McGee)   58  |  42 
-> [374.900127] (2:node@McGee)   10  |  42 
-> [374.900127] (2:node@McGee) Predecessor: 38
-> [392.077174] (7:node@Boivin) My finger table:
-> [392.077174] (7:node@Boivin) Start | Succ 
-> [392.077174] (7:node@Boivin)    9  |  14 
-> [392.077174] (7:node@Boivin)   10  |  38 
-> [392.077174] (7:node@Boivin)   12  |  14 
-> [392.077174] (7:node@Boivin)   16  |   8 
-> [392.077174] (7:node@Boivin)   24  |   8 
-> [392.077174] (7:node@Boivin)   40  |   8 
-> [392.077174] (7:node@Boivin) Predecessor: 1
-> [398.559775] (4:node@Geoff) My finger table:
-> [398.559775] (4:node@Geoff) Start | Succ 
-> [398.559775] (4:node@Geoff)   33  |  38 
-> [398.559775] (4:node@Geoff)   34  |  38 
-> [398.559775] (4:node@Geoff)   36  |  32 
-> [398.559775] (4:node@Geoff)   40  |  32 
-> [398.559775] (4:node@Geoff)   48  |  32 
-> [398.559775] (4:node@Geoff)    0  |  32 
-> [398.559775] (4:node@Geoff) Predecessor: 21
-> [400.956871] (6:node@Jean_Yves) My finger table:
-> [400.956871] (6:node@Jean_Yves) Start | Succ 
-> [400.956871] (6:node@Jean_Yves)   15  |  21 
-> [400.956871] (6:node@Jean_Yves)   16  |  38 
-> [400.956871] (6:node@Jean_Yves)   18  |  21 
-> [400.956871] (6:node@Jean_Yves)   22  |  14 
-> [400.956871] (6:node@Jean_Yves)   30  |  14 
-> [400.956871] (6:node@Jean_Yves)   46  |  14 
-> [400.956871] (6:node@Jean_Yves) Predecessor: 8
-> [405.310329] (8:node@Jacquelin) My finger table:
-> [405.310329] (8:node@Jacquelin) Start | Succ 
-> [405.310329] (8:node@Jacquelin)    2  |   8 
-> [405.310329] (8:node@Jacquelin)    3  |   8 
-> [405.310329] (8:node@Jacquelin)    5  |   8 
-> [405.310329] (8:node@Jacquelin)    9  |   1 
-> [405.310329] (8:node@Jacquelin)   17  |   1 
-> [405.310329] (8:node@Jacquelin)   33  |   1 
-> [405.310329] (8:node@Jacquelin) Predecessor: 48
-> [410.458068] (3:node@iRMX) My finger table:
-> [410.458068] (3:node@iRMX) Start | Succ 
-> [410.458068] (3:node@iRMX)   39  |  42 
-> [410.458068] (3:node@iRMX)   40  |  42 
-> [410.458068] (3:node@iRMX)   42  |  42 
-> [410.458068] (3:node@iRMX)   46  |  38 
-> [410.458068] (3:node@iRMX)   54  |  38 
-> [410.458068] (3:node@iRMX)    6  |  38 
-> [410.458068] (3:node@iRMX) Predecessor: 32
-> [420.681981] (4:node@Geoff) My finger table:
-> [420.681981] (4:node@Geoff) Start | Succ 
-> [420.681981] (4:node@Geoff)   33  |  38 
-> [420.681981] (4:node@Geoff)   34  |  38 
-> [420.681981] (4:node@Geoff)   36  |  38 
-> [420.681981] (4:node@Geoff)   40  |  32 
-> [420.681981] (4:node@Geoff)   48  |  32 
-> [420.681981] (4:node@Geoff)    0  |  32 
-> [420.681981] (4:node@Geoff) Predecessor: 21
-> [423.629509] (5:node@TeX) My finger table:
-> [423.629509] (5:node@TeX) Start | Succ 
-> [423.629509] (5:node@TeX)   22  |  32 
-> [423.629509] (5:node@TeX)   23  |  38 
-> [423.629509] (5:node@TeX)   25  |  32 
-> [423.629509] (5:node@TeX)   29  |  21 
-> [423.629509] (5:node@TeX)   37  |  21 
-> [423.629509] (5:node@TeX)   53  |  21 
-> [423.629509] (5:node@TeX) Predecessor: -1
-> [437.098026] (5:node@TeX) My finger table:
-> [437.098026] (5:node@TeX) Start | Succ 
-> [437.098026] (5:node@TeX)   22  |  32 
-> [437.098026] (5:node@TeX)   23  |  38 
-> [437.098026] (5:node@TeX)   25  |  32 
-> [437.098026] (5:node@TeX)   29  |  21 
-> [437.098026] (5:node@TeX)   37  |  21 
-> [437.098026] (5:node@TeX)   53  |  21 
-> [437.098026] (5:node@TeX) Predecessor: 14
-> [492.685244] (1:node@Gatien) My finger table:
-> [492.685244] (1:node@Gatien) Start | Succ 
-> [492.685244] (1:node@Gatien)   49  |   1 
-> [492.685244] (1:node@Gatien)   50  |   1 
-> [492.685244] (1:node@Gatien)   52  |   1 
-> [492.685244] (1:node@Gatien)   56  |   1 
-> [492.685244] (1:node@Gatien)    0  |  48 
-> [492.685244] (1:node@Gatien)   16  |  48 
-> [492.685244] (1:node@Gatien) Predecessor: 42
-> [518.549995] (7:node@Boivin) My finger table:
-> [518.549995] (7:node@Boivin) Start | Succ 
-> [518.549995] (7:node@Boivin)    9  |  14 
-> [518.549995] (7:node@Boivin)   10  |  38 
-> [518.549995] (7:node@Boivin)   12  |  14 
-> [518.549995] (7:node@Boivin)   16  |  21 
-> [518.549995] (7:node@Boivin)   24  |   8 
-> [518.549995] (7:node@Boivin)   40  |   8 
-> [518.549995] (7:node@Boivin) Predecessor: 1
-> [535.767747] (2:node@McGee) My finger table:
-> [535.767747] (2:node@McGee) Start | Succ 
-> [535.767747] (2:node@McGee)   43  |  48 
-> [535.767747] (2:node@McGee)   44  |  48 
-> [535.767747] (2:node@McGee)   46  |  48 
-> [535.767747] (2:node@McGee)   50  |   1 
-> [535.767747] (2:node@McGee)   58  |  42 
-> [535.767747] (2:node@McGee)   10  |  42 
-> [535.767747] (2:node@McGee) Predecessor: 38
-> [536.979231] (8:node@Jacquelin) My finger table:
-> [536.979231] (8:node@Jacquelin) Start | Succ 
-> [536.979231] (8:node@Jacquelin)    2  |   8 
-> [536.979231] (8:node@Jacquelin)    3  |   8 
-> [536.979231] (8:node@Jacquelin)    5  |   8 
-> [536.979231] (8:node@Jacquelin)    9  |  14 
-> [536.979231] (8:node@Jacquelin)   17  |   1 
-> [536.979231] (8:node@Jacquelin)   33  |   1 
-> [536.979231] (8:node@Jacquelin) Predecessor: 48
-> [549.052867] (3:node@iRMX) My finger table:
-> [549.052867] (3:node@iRMX) Start | Succ 
-> [549.052867] (3:node@iRMX)   39  |  42 
-> [549.052867] (3:node@iRMX)   40  |  42 
-> [549.052867] (3:node@iRMX)   42  |  42 
-> [549.052867] (3:node@iRMX)   46  |  48 
-> [549.052867] (3:node@iRMX)   54  |  38 
-> [549.052867] (3:node@iRMX)    6  |  38 
-> [549.052867] (3:node@iRMX) Predecessor: 32
-> [555.224559] (6:node@Jean_Yves) My finger table:
-> [555.224559] (6:node@Jean_Yves) Start | Succ 
-> [555.224559] (6:node@Jean_Yves)   15  |  21 
-> [555.224559] (6:node@Jean_Yves)   16  |  38 
-> [555.224559] (6:node@Jean_Yves)   18  |  21 
-> [555.224559] (6:node@Jean_Yves)   22  |  32 
-> [555.224559] (6:node@Jean_Yves)   30  |  14 
-> [555.224559] (6:node@Jean_Yves)   46  |  14 
-> [555.224559] (6:node@Jean_Yves) Predecessor: 8
-> [560.043242] (5:node@TeX) My finger table:
-> [560.043242] (5:node@TeX) Start | Succ 
-> [560.043242] (5:node@TeX)   22  |  32 
-> [560.043242] (5:node@TeX)   23  |  38 
-> [560.043242] (5:node@TeX)   25  |  32 
-> [560.043242] (5:node@TeX)   29  |  32 
-> [560.043242] (5:node@TeX)   37  |  21 
-> [560.043242] (5:node@TeX)   53  |  21 
-> [560.043242] (5:node@TeX) Predecessor: 14
-> [577.875047] (4:node@Geoff) My finger table:
-> [577.875047] (4:node@Geoff) Start | Succ 
-> [577.875047] (4:node@Geoff)   33  |  38 
-> [577.875047] (4:node@Geoff)   34  |  38 
-> [577.875047] (4:node@Geoff)   36  |  38 
-> [577.875047] (4:node@Geoff)   40  |  42 
-> [577.875047] (4:node@Geoff)   48  |  32 
-> [577.875047] (4:node@Geoff)    0  |  32 
-> [577.875047] (4:node@Geoff) Predecessor: 21
-> [803.676610] (0:@) Messages created: 768
-> [803.676610] (0:@) Simulated time: 803.677
+> [ 81.274448] (8:node@Jacquelin) My finger table:
+> [ 81.274448] (8:node@Jacquelin) Start | Succ 
+> [ 81.274448] (8:node@Jacquelin)    2  |  42 
+> [ 81.274448] (8:node@Jacquelin)    3  |   1 
+> [ 81.274448] (8:node@Jacquelin)    5  |   1 
+> [ 81.274448] (8:node@Jacquelin)    9  |   1 
+> [ 81.274448] (8:node@Jacquelin)   17  |   1 
+> [ 81.274448] (8:node@Jacquelin)   33  |   1 
+> [ 81.274448] (8:node@Jacquelin) Predecessor: 48
+> [116.655207] (2:node@McGee) My finger table:
+> [116.655207] (2:node@McGee) Start | Succ 
+> [116.655207] (2:node@McGee)   43  |  48 
+> [116.655207] (2:node@McGee)   44  |  42 
+> [116.655207] (2:node@McGee)   46  |  42 
+> [116.655207] (2:node@McGee)   50  |  42 
+> [116.655207] (2:node@McGee)   58  |  42 
+> [116.655207] (2:node@McGee)   10  |  42 
+> [116.655207] (2:node@McGee) Predecessor: 1
+> [141.383343] (1:node@Gatien) My finger table:
+> [141.383343] (1:node@Gatien) Start | Succ 
+> [141.383343] (1:node@Gatien)   49  |   1 
+> [141.383343] (1:node@Gatien)   50  |  48 
+> [141.383343] (1:node@Gatien)   52  |  48 
+> [141.383343] (1:node@Gatien)   56  |  48 
+> [141.383343] (1:node@Gatien)    0  |  48 
+> [141.383343] (1:node@Gatien)   16  |  48 
+> [141.383343] (1:node@Gatien) Predecessor: 42
+> [187.430835] (2:node@McGee) My finger table:
+> [187.430835] (2:node@McGee) Start | Succ 
+> [187.430835] (2:node@McGee)   43  |  48 
+> [187.430835] (2:node@McGee)   44  |  42 
+> [187.430835] (2:node@McGee)   46  |  42 
+> [187.430835] (2:node@McGee)   50  |  42 
+> [187.430835] (2:node@McGee)   58  |  42 
+> [187.430835] (2:node@McGee)   10  |  42 
+> [187.430835] (2:node@McGee) Predecessor: 8
+> [224.180962] (2:node@McGee) My finger table:
+> [224.180962] (2:node@McGee) Start | Succ 
+> [224.180962] (2:node@McGee)   43  |  48 
+> [224.180962] (2:node@McGee)   44  |  42 
+> [224.180962] (2:node@McGee)   46  |  42 
+> [224.180962] (2:node@McGee)   50  |  42 
+> [224.180962] (2:node@McGee)   58  |  42 
+> [224.180962] (2:node@McGee)   10  |  42 
+> [224.180962] (2:node@McGee) Predecessor: 38
+> [238.097222] (7:node@Boivin) My finger table:
+> [238.097222] (7:node@Boivin) Start | Succ 
+> [238.097222] (7:node@Boivin)    9  |  38 
+> [238.097222] (7:node@Boivin)   10  |   8 
+> [238.097222] (7:node@Boivin)   12  |   8 
+> [238.097222] (7:node@Boivin)   16  |   8 
+> [238.097222] (7:node@Boivin)   24  |   8 
+> [238.097222] (7:node@Boivin)   40  |   8 
+> [238.097222] (7:node@Boivin) Predecessor: 1
+> [244.544647] (1:node@Gatien) My finger table:
+> [244.544647] (1:node@Gatien) Start | Succ 
+> [244.544647] (1:node@Gatien)   49  |   1 
+> [244.544647] (1:node@Gatien)   50  |   1 
+> [244.544647] (1:node@Gatien)   52  |  48 
+> [244.544647] (1:node@Gatien)   56  |  48 
+> [244.544647] (1:node@Gatien)    0  |  48 
+> [244.544647] (1:node@Gatien)   16  |  48 
+> [244.544647] (1:node@Gatien) Predecessor: 42
+> [251.309994] (7:node@Boivin) My finger table:
+> [251.309994] (7:node@Boivin) Start | Succ 
+> [251.309994] (7:node@Boivin)    9  |  38 
+> [251.309994] (7:node@Boivin)   10  |  38 
+> [251.309994] (7:node@Boivin)   12  |   8 
+> [251.309994] (7:node@Boivin)   16  |   8 
+> [251.309994] (7:node@Boivin)   24  |   8 
+> [251.309994] (7:node@Boivin)   40  |   8 
+> [251.309994] (7:node@Boivin) Predecessor: 1
+> [252.819580] (2:node@McGee) My finger table:
+> [252.819580] (2:node@McGee) Start | Succ 
+> [252.819580] (2:node@McGee)   43  |  48 
+> [252.819580] (2:node@McGee)   44  |  48 
+> [252.819580] (2:node@McGee)   46  |  42 
+> [252.819580] (2:node@McGee)   50  |  42 
+> [252.819580] (2:node@McGee)   58  |  42 
+> [252.819580] (2:node@McGee)   10  |  42 
+> [252.819580] (2:node@McGee) Predecessor: 38
+> [268.906974] (6:node@Jean_Yves) My finger table:
+> [268.906974] (6:node@Jean_Yves) Start | Succ 
+> [268.906974] (6:node@Jean_Yves)   15  |  38 
+> [268.906974] (6:node@Jean_Yves)   16  |  38 
+> [268.906974] (6:node@Jean_Yves)   18  |  14 
+> [268.906974] (6:node@Jean_Yves)   22  |  14 
+> [268.906974] (6:node@Jean_Yves)   30  |  14 
+> [268.906974] (6:node@Jean_Yves)   46  |  14 
+> [268.906974] (6:node@Jean_Yves) Predecessor: -1
+> [272.587495] (3:node@iRMX) My finger table:
+> [272.587495] (3:node@iRMX) Start | Succ 
+> [272.587495] (3:node@iRMX)   39  |  42 
+> [272.587495] (3:node@iRMX)   40  |  38 
+> [272.587495] (3:node@iRMX)   42  |  38 
+> [272.587495] (3:node@iRMX)   46  |  38 
+> [272.587495] (3:node@iRMX)   54  |  38 
+> [272.587495] (3:node@iRMX)    6  |  38 
+> [272.587495] (3:node@iRMX) Predecessor: 8
+> [275.995507] (8:node@Jacquelin) My finger table:
+> [275.995507] (8:node@Jacquelin) Start | Succ 
+> [275.995507] (8:node@Jacquelin)    2  |   8 
+> [275.995507] (8:node@Jacquelin)    3  |   8 
+> [275.995507] (8:node@Jacquelin)    5  |   1 
+> [275.995507] (8:node@Jacquelin)    9  |   1 
+> [275.995507] (8:node@Jacquelin)   17  |   1 
+> [275.995507] (8:node@Jacquelin)   33  |   1 
+> [275.995507] (8:node@Jacquelin) Predecessor: 48
+> [278.895082] (3:node@iRMX) My finger table:
+> [278.895082] (3:node@iRMX) Start | Succ 
+> [278.895082] (3:node@iRMX)   39  |  42 
+> [278.895082] (3:node@iRMX)   40  |  38 
+> [278.895082] (3:node@iRMX)   42  |  38 
+> [278.895082] (3:node@iRMX)   46  |  38 
+> [278.895082] (3:node@iRMX)   54  |  38 
+> [278.895082] (3:node@iRMX)    6  |  38 
+> [278.895082] (3:node@iRMX) Predecessor: 14
+> [285.028772] (3:node@iRMX) My finger table:
+> [285.028772] (3:node@iRMX) Start | Succ 
+> [285.028772] (3:node@iRMX)   39  |  42 
+> [285.028772] (3:node@iRMX)   40  |  42 
+> [285.028772] (3:node@iRMX)   42  |  38 
+> [285.028772] (3:node@iRMX)   46  |  38 
+> [285.028772] (3:node@iRMX)   54  |  38 
+> [285.028772] (3:node@iRMX)    6  |  38 
+> [285.028772] (3:node@iRMX) Predecessor: 14
+> [299.124613] (4:node@Geoff) My finger table:
+> [299.124613] (4:node@Geoff) Start | Succ 
+> [299.124613] (4:node@Geoff)   33  |  38 
+> [299.124613] (4:node@Geoff)   34  |  38 
+> [299.124613] (4:node@Geoff)   36  |  32 
+> [299.124613] (4:node@Geoff)   40  |  32 
+> [299.124613] (4:node@Geoff)   48  |  32 
+> [299.124613] (4:node@Geoff)    0  |  32 
+> [299.124613] (4:node@Geoff) Predecessor: -1
+> [302.471288] (5:node@TeX) My finger table:
+> [302.471288] (5:node@TeX) Start | Succ 
+> [302.471288] (5:node@TeX)   22  |  38 
+> [302.471288] (5:node@TeX)   23  |  38 
+> [302.471288] (5:node@TeX)   25  |  21 
+> [302.471288] (5:node@TeX)   29  |  21 
+> [302.471288] (5:node@TeX)   37  |  21 
+> [302.471288] (5:node@TeX)   53  |  21 
+> [302.471288] (5:node@TeX) Predecessor: -1
+> [309.606669] (3:node@iRMX) My finger table:
+> [309.606669] (3:node@iRMX) Start | Succ 
+> [309.606669] (3:node@iRMX)   39  |  42 
+> [309.606669] (3:node@iRMX)   40  |  42 
+> [309.606669] (3:node@iRMX)   42  |  38 
+> [309.606669] (3:node@iRMX)   46  |  38 
+> [309.606669] (3:node@iRMX)   54  |  38 
+> [309.606669] (3:node@iRMX)    6  |  38 
+> [309.606669] (3:node@iRMX) Predecessor: 32
+> [352.254169] (6:node@Jean_Yves) My finger table:
+> [352.254169] (6:node@Jean_Yves) Start | Succ 
+> [352.254169] (6:node@Jean_Yves)   15  |  32 
+> [352.254169] (6:node@Jean_Yves)   16  |  38 
+> [352.254169] (6:node@Jean_Yves)   18  |  14 
+> [352.254169] (6:node@Jean_Yves)   22  |  14 
+> [352.254169] (6:node@Jean_Yves)   30  |  14 
+> [352.254169] (6:node@Jean_Yves)   46  |  14 
+> [352.254169] (6:node@Jean_Yves) Predecessor: 8
+> [367.424317] (4:node@Geoff) My finger table:
+> [367.424317] (4:node@Geoff) Start | Succ 
+> [367.424317] (4:node@Geoff)   33  |  38 
+> [367.424317] (4:node@Geoff)   34  |  38 
+> [367.424317] (4:node@Geoff)   36  |  32 
+> [367.424317] (4:node@Geoff)   40  |  32 
+> [367.424317] (4:node@Geoff)   48  |  32 
+> [367.424317] (4:node@Geoff)    0  |  32 
+> [367.424317] (4:node@Geoff) Predecessor: 14
+> [368.585370] (1:node@Gatien) My finger table:
+> [368.585370] (1:node@Gatien) Start | Succ 
+> [368.585370] (1:node@Gatien)   49  |   1 
+> [368.585370] (1:node@Gatien)   50  |   1 
+> [368.585370] (1:node@Gatien)   52  |   1 
+> [368.585370] (1:node@Gatien)   56  |  48 
+> [368.585370] (1:node@Gatien)    0  |  48 
+> [368.585370] (1:node@Gatien)   16  |  48 
+> [368.585370] (1:node@Gatien) Predecessor: 42
+> [374.895628] (2:node@McGee) My finger table:
+> [374.895628] (2:node@McGee) Start | Succ 
+> [374.895628] (2:node@McGee)   43  |  48 
+> [374.895628] (2:node@McGee)   44  |  48 
+> [374.895628] (2:node@McGee)   46  |  48 
+> [374.895628] (2:node@McGee)   50  |  42 
+> [374.895628] (2:node@McGee)   58  |  42 
+> [374.895628] (2:node@McGee)   10  |  42 
+> [374.895628] (2:node@McGee) Predecessor: 38
+> [392.072209] (7:node@Boivin) My finger table:
+> [392.072209] (7:node@Boivin) Start | Succ 
+> [392.072209] (7:node@Boivin)    9  |  14 
+> [392.072209] (7:node@Boivin)   10  |  38 
+> [392.072209] (7:node@Boivin)   12  |  14 
+> [392.072209] (7:node@Boivin)   16  |   8 
+> [392.072209] (7:node@Boivin)   24  |   8 
+> [392.072209] (7:node@Boivin)   40  |   8 
+> [392.072209] (7:node@Boivin) Predecessor: 1
+> [398.554322] (4:node@Geoff) My finger table:
+> [398.554322] (4:node@Geoff) Start | Succ 
+> [398.554322] (4:node@Geoff)   33  |  38 
+> [398.554322] (4:node@Geoff)   34  |  38 
+> [398.554322] (4:node@Geoff)   36  |  32 
+> [398.554322] (4:node@Geoff)   40  |  32 
+> [398.554322] (4:node@Geoff)   48  |  32 
+> [398.554322] (4:node@Geoff)    0  |  32 
+> [398.554322] (4:node@Geoff) Predecessor: 21
+> [400.952052] (6:node@Jean_Yves) My finger table:
+> [400.952052] (6:node@Jean_Yves) Start | Succ 
+> [400.952052] (6:node@Jean_Yves)   15  |  21 
+> [400.952052] (6:node@Jean_Yves)   16  |  38 
+> [400.952052] (6:node@Jean_Yves)   18  |  21 
+> [400.952052] (6:node@Jean_Yves)   22  |  14 
+> [400.952052] (6:node@Jean_Yves)   30  |  14 
+> [400.952052] (6:node@Jean_Yves)   46  |  14 
+> [400.952052] (6:node@Jean_Yves) Predecessor: 8
+> [405.305451] (8:node@Jacquelin) My finger table:
+> [405.305451] (8:node@Jacquelin) Start | Succ 
+> [405.305451] (8:node@Jacquelin)    2  |   8 
+> [405.305451] (8:node@Jacquelin)    3  |   8 
+> [405.305451] (8:node@Jacquelin)    5  |   8 
+> [405.305451] (8:node@Jacquelin)    9  |   1 
+> [405.305451] (8:node@Jacquelin)   17  |   1 
+> [405.305451] (8:node@Jacquelin)   33  |   1 
+> [405.305451] (8:node@Jacquelin) Predecessor: 48
+> [410.451797] (3:node@iRMX) My finger table:
+> [410.451797] (3:node@iRMX) Start | Succ 
+> [410.451797] (3:node@iRMX)   39  |  42 
+> [410.451797] (3:node@iRMX)   40  |  42 
+> [410.451797] (3:node@iRMX)   42  |  42 
+> [410.451797] (3:node@iRMX)   46  |  38 
+> [410.451797] (3:node@iRMX)   54  |  38 
+> [410.451797] (3:node@iRMX)    6  |  38 
+> [410.451797] (3:node@iRMX) Predecessor: 32
+> [420.675344] (4:node@Geoff) My finger table:
+> [420.675344] (4:node@Geoff) Start | Succ 
+> [420.675344] (4:node@Geoff)   33  |  38 
+> [420.675344] (4:node@Geoff)   34  |  38 
+> [420.675344] (4:node@Geoff)   36  |  38 
+> [420.675344] (4:node@Geoff)   40  |  32 
+> [420.675344] (4:node@Geoff)   48  |  32 
+> [420.675344] (4:node@Geoff)    0  |  32 
+> [420.675344] (4:node@Geoff) Predecessor: 21
+> [423.624187] (5:node@TeX) My finger table:
+> [423.624187] (5:node@TeX) Start | Succ 
+> [423.624187] (5:node@TeX)   22  |  32 
+> [423.624187] (5:node@TeX)   23  |  38 
+> [423.624187] (5:node@TeX)   25  |  32 
+> [423.624187] (5:node@TeX)   29  |  21 
+> [423.624187] (5:node@TeX)   37  |  21 
+> [423.624187] (5:node@TeX)   53  |  21 
+> [423.624187] (5:node@TeX) Predecessor: -1
+> [437.092176] (5:node@TeX) My finger table:
+> [437.092176] (5:node@TeX) Start | Succ 
+> [437.092176] (5:node@TeX)   22  |  32 
+> [437.092176] (5:node@TeX)   23  |  38 
+> [437.092176] (5:node@TeX)   25  |  32 
+> [437.092176] (5:node@TeX)   29  |  21 
+> [437.092176] (5:node@TeX)   37  |  21 
+> [437.092176] (5:node@TeX)   53  |  21 
+> [437.092176] (5:node@TeX) Predecessor: 14
+> [492.679275] (1:node@Gatien) My finger table:
+> [492.679275] (1:node@Gatien) Start | Succ 
+> [492.679275] (1:node@Gatien)   49  |   1 
+> [492.679275] (1:node@Gatien)   50  |   1 
+> [492.679275] (1:node@Gatien)   52  |   1 
+> [492.679275] (1:node@Gatien)   56  |   1 
+> [492.679275] (1:node@Gatien)    0  |  48 
+> [492.679275] (1:node@Gatien)   16  |  48 
+> [492.679275] (1:node@Gatien) Predecessor: 42
+> [518.542807] (7:node@Boivin) My finger table:
+> [518.542807] (7:node@Boivin) Start | Succ 
+> [518.542807] (7:node@Boivin)    9  |  14 
+> [518.542807] (7:node@Boivin)   10  |  38 
+> [518.542807] (7:node@Boivin)   12  |  14 
+> [518.542807] (7:node@Boivin)   16  |  21 
+> [518.542807] (7:node@Boivin)   24  |   8 
+> [518.542807] (7:node@Boivin)   40  |   8 
+> [518.542807] (7:node@Boivin) Predecessor: 1
+> [535.761245] (2:node@McGee) My finger table:
+> [535.761245] (2:node@McGee) Start | Succ 
+> [535.761245] (2:node@McGee)   43  |  48 
+> [535.761245] (2:node@McGee)   44  |  48 
+> [535.761245] (2:node@McGee)   46  |  48 
+> [535.761245] (2:node@McGee)   50  |   1 
+> [535.761245] (2:node@McGee)   58  |  42 
+> [535.761245] (2:node@McGee)   10  |  42 
+> [535.761245] (2:node@McGee) Predecessor: 38
+> [536.972611] (8:node@Jacquelin) My finger table:
+> [536.972611] (8:node@Jacquelin) Start | Succ 
+> [536.972611] (8:node@Jacquelin)    2  |   8 
+> [536.972611] (8:node@Jacquelin)    3  |   8 
+> [536.972611] (8:node@Jacquelin)    5  |   8 
+> [536.972611] (8:node@Jacquelin)    9  |  14 
+> [536.972611] (8:node@Jacquelin)   17  |   1 
+> [536.972611] (8:node@Jacquelin)   33  |   1 
+> [536.972611] (8:node@Jacquelin) Predecessor: 48
+> [549.045448] (3:node@iRMX) My finger table:
+> [549.045448] (3:node@iRMX) Start | Succ 
+> [549.045448] (3:node@iRMX)   39  |  42 
+> [549.045448] (3:node@iRMX)   40  |  42 
+> [549.045448] (3:node@iRMX)   42  |  42 
+> [549.045448] (3:node@iRMX)   46  |  48 
+> [549.045448] (3:node@iRMX)   54  |  38 
+> [549.045448] (3:node@iRMX)    6  |  38 
+> [549.045448] (3:node@iRMX) Predecessor: 32
+> [555.217227] (6:node@Jean_Yves) My finger table:
+> [555.217227] (6:node@Jean_Yves) Start | Succ 
+> [555.217227] (6:node@Jean_Yves)   15  |  21 
+> [555.217227] (6:node@Jean_Yves)   16  |  38 
+> [555.217227] (6:node@Jean_Yves)   18  |  21 
+> [555.217227] (6:node@Jean_Yves)   22  |  32 
+> [555.217227] (6:node@Jean_Yves)   30  |  14 
+> [555.217227] (6:node@Jean_Yves)   46  |  14 
+> [555.217227] (6:node@Jean_Yves) Predecessor: 8
+> [560.036449] (5:node@TeX) My finger table:
+> [560.036449] (5:node@TeX) Start | Succ 
+> [560.036449] (5:node@TeX)   22  |  32 
+> [560.036449] (5:node@TeX)   23  |  38 
+> [560.036449] (5:node@TeX)   25  |  32 
+> [560.036449] (5:node@TeX)   29  |  32 
+> [560.036449] (5:node@TeX)   37  |  21 
+> [560.036449] (5:node@TeX)   53  |  21 
+> [560.036449] (5:node@TeX) Predecessor: 14
+> [577.866994] (4:node@Geoff) My finger table:
+> [577.866994] (4:node@Geoff) Start | Succ 
+> [577.866994] (4:node@Geoff)   33  |  38 
+> [577.866994] (4:node@Geoff)   34  |  38 
+> [577.866994] (4:node@Geoff)   36  |  38 
+> [577.866994] (4:node@Geoff)   40  |  42 
+> [577.866994] (4:node@Geoff)   48  |  32 
+> [577.866994] (4:node@Geoff)    0  |  32 
+> [577.866994] (4:node@Geoff) Predecessor: 21
+> [803.668999] (0:@) Messages created: 768
+> [803.668999] (0:@) Simulated time: 803.669
 
 ! output sort
 $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.xml ${srcdir:=.}/chord10.xml --log=msg_chord.thres:verbose "--log=root.fmt:[%11.6r]%e(%i:%P@%h)%e%m%n" --cfg=network/model:Constant
index 8372f45..c06ebfa 100644 (file)
@@ -7,9 +7,9 @@ add_executable(masterslave_virtual_machines "masterslave_virtual_machines.c")
 ### Add definitions for compile
 if(WIN32)
   target_link_libraries(masterslave_virtual_machines simgrid )
-else(WIN32)
+else()
   target_link_libraries(masterslave_virtual_machines simgrid m)
-endif(WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index 1681317..f8376d2 100644 (file)
@@ -20,36 +20,36 @@ $ $SG_TEST_EXENV ${bindir:=.}/cloud/masterslave_virtual_machines$EXEEXT ${srcdir
 > [    0.020275] (1:master@Jacquelin) Sending "Task_1" to "Slave_1"
 > [    0.020275] (2:Slave 0@Jacquelin) Received "Task_0" from mailbox Slave_0
 > [    0.093091] (2:Slave 0@Jacquelin) "Task_0" done
-> [   71.553756] (1:master@Jacquelin) Sending "Task_2" to "Slave_2"
-> [   71.553756] (3:Slave 1@Intel) Received "Task_1" from mailbox Slave_1
-> [   71.626572] (3:Slave 1@Intel) "Task_1" done
-> [  217.911039] (1:master@Jacquelin) Sending "Task_3" to "Slave_3"
-> [  217.911039] (4:Slave 2@Provost) Received "Task_2" from mailbox Slave_2
-> [  217.983855] (4:Slave 2@Provost) "Task_2" done
-> [  360.063805] (1:master@Jacquelin) Sending "Task_4" to "Slave_4"
-> [  360.063805] (5:Slave 3@Fernand) Received "Task_3" from mailbox Slave_3
-> [  360.515251] (5:Slave 3@Fernand) "Task_3" done
-> [  427.243795] (1:master@Jacquelin) Sending "Task_5" to "Slave_5"
-> [  427.243795] (6:Slave 4@Bescherelle) Received "Task_4" from mailbox Slave_4
-> [  427.316611] (6:Slave 4@Bescherelle) "Task_4" done
-> [  509.794890] (1:master@Jacquelin) Sending "Task_6" to "Slave_6"
-> [  509.794890] (7:Slave 5@Ethernet) Received "Task_5" from mailbox Slave_5
-> [  509.896832] (7:Slave 5@Ethernet) "Task_5" done
-> [  576.548296] (1:master@Jacquelin) Sending "Task_7" to "Slave_7"
-> [  576.548296] (8:Slave 6@Kuenning) Received "Task_6" from mailbox Slave_6
-> [  576.664802] (8:Slave 6@Kuenning) "Task_6" done
-> [  685.569407] (1:master@Jacquelin) Sending "Task_8" to "Slave_8"
-> [  685.569407] (9:Slave 7@Dodge) Received "Task_7" from mailbox Slave_7
-> [  685.656786] (9:Slave 7@Dodge) "Task_7" done
-> [  757.600403] (10:Slave 8@Jean_Yves) Received "Task_8" from mailbox Slave_8
-> [  757.600403] (1:master@Jacquelin) Sending "Task_9" to "Slave_9"
-> [  757.702345] (10:Slave 8@Jean_Yves) "Task_8" done
-> [  912.133629] (11:Slave 9@Fafard) Received "Task_9" from mailbox Slave_9
-> [  912.133629] (1:master@Jacquelin) Now suspend all VMs, just for fun
-> [  912.133629] (1:master@Jacquelin) Wait a while
-> [  914.133629] (1:master@Jacquelin) Enough. Let's resume everybody.
-> [  914.133629] (1:master@Jacquelin) Sleep long enough for everyone to be done with previous batch of work
-> [  914.206445] (11:Slave 9@Fafard) "Task_9" done
+> [   23.866678] (1:master@Jacquelin) Sending "Task_2" to "Slave_2"
+> [   23.866678] (3:Slave 1@Intel) Received "Task_1" from mailbox Slave_1
+> [   23.939494] (3:Slave 1@Intel) "Task_1" done
+> [   48.674036] (1:master@Jacquelin) Sending "Task_3" to "Slave_3"
+> [   48.674036] (4:Slave 2@Provost) Received "Task_2" from mailbox Slave_2
+> [   48.746852] (4:Slave 2@Provost) "Task_2" done
+> [   56.325710] (1:master@Jacquelin) Sending "Task_4" to "Slave_4"
+> [   56.325710] (5:Slave 3@Fernand) Received "Task_3" from mailbox Slave_3
+> [   56.777157] (5:Slave 3@Fernand) "Task_3" done
+> [   64.574878] (1:master@Jacquelin) Sending "Task_5" to "Slave_5"
+> [   64.574878] (6:Slave 4@Bescherelle) Received "Task_4" from mailbox Slave_4
+> [   64.647694] (6:Slave 4@Bescherelle) "Task_4" done
+> [   73.010762] (1:master@Jacquelin) Sending "Task_6" to "Slave_6"
+> [   73.010762] (7:Slave 5@Ethernet) Received "Task_5" from mailbox Slave_5
+> [   73.112704] (7:Slave 5@Ethernet) "Task_5" done
+> [   81.730603] (1:master@Jacquelin) Sending "Task_7" to "Slave_7"
+> [   81.730603] (8:Slave 6@Kuenning) Received "Task_6" from mailbox Slave_6
+> [   81.847108] (8:Slave 6@Kuenning) "Task_6" done
+> [  126.150095] (1:master@Jacquelin) Sending "Task_8" to "Slave_8"
+> [  126.150095] (9:Slave 7@Dodge) Received "Task_7" from mailbox Slave_7
+> [  126.237474] (9:Slave 7@Dodge) "Task_7" done
+> [  169.839597] (10:Slave 8@Jean_Yves) Received "Task_8" from mailbox Slave_8
+> [  169.839597] (1:master@Jacquelin) Sending "Task_9" to "Slave_9"
+> [  169.941539] (10:Slave 8@Jean_Yves) "Task_8" done
+> [  176.014409] (11:Slave 9@Fafard) Received "Task_9" from mailbox Slave_9
+> [  176.014409] (1:master@Jacquelin) Now suspend all VMs, just for fun
+> [  176.014409] (1:master@Jacquelin) Wait a while
+> [  178.014409] (1:master@Jacquelin) Enough. Let's resume everybody.
+> [  178.014409] (1:master@Jacquelin) Sleep long enough for everyone to be done with previous batch of work
+> [  178.087225] (11:Slave 9@Fafard) "Task_9" done
 > [ 1000.000000] (12:Slave 10@Jacquelin) Slave listenning on 10
 > [ 1000.000000] (13:Slave 11@Intel) Slave listenning on 11
 > [ 1000.000000] (14:Slave 12@Provost) Slave listenning on 12
@@ -76,75 +76,74 @@ $ $SG_TEST_EXENV ${bindir:=.}/cloud/masterslave_virtual_machines$EXEEXT ${srcdir
 > [ 1000.020275] (1:master@Jacquelin) Sending "Task_1" to "Slave_1"
 > [ 1000.020275] (22:Slave 0@Jacquelin) Received "Task_0" from mailbox Slave_0
 > [ 1000.093091] (22:Slave 0@Jacquelin) "Task_0" done
-> [ 1071.553756] (1:master@Jacquelin) Sending "Task_2" to "Slave_2"
-> [ 1071.553756] (23:Slave 1@Intel) Received "Task_1" from mailbox Slave_1
-> [ 1071.626572] (23:Slave 1@Intel) "Task_1" done
-> [ 1217.911039] (1:master@Jacquelin) Sending "Task_3" to "Slave_3"
-> [ 1217.911039] (24:Slave 2@Provost) Received "Task_2" from mailbox Slave_2
-> [ 1217.983855] (24:Slave 2@Provost) "Task_2" done
-> [ 1360.063805] (1:master@Jacquelin) Sending "Task_4" to "Slave_4"
-> [ 1360.063805] (25:Slave 3@Fernand) Received "Task_3" from mailbox Slave_3
-> [ 1360.515251] (25:Slave 3@Fernand) "Task_3" done
-> [ 1427.243795] (1:master@Jacquelin) Sending "Task_5" to "Slave_5"
-> [ 1427.243795] (26:Slave 4@Bescherelle) Received "Task_4" from mailbox Slave_4
-> [ 1427.316611] (26:Slave 4@Bescherelle) "Task_4" done
-> [ 1509.794890] (1:master@Jacquelin) Sending "Task_6" to "Slave_6"
-> [ 1509.794890] (27:Slave 5@Ethernet) Received "Task_5" from mailbox Slave_5
-> [ 1509.896832] (27:Slave 5@Ethernet) "Task_5" done
-> [ 1576.548296] (1:master@Jacquelin) Sending "Task_7" to "Slave_7"
-> [ 1576.548296] (28:Slave 6@Kuenning) Received "Task_6" from mailbox Slave_6
-> [ 1576.664802] (28:Slave 6@Kuenning) "Task_6" done
-> [ 1685.569407] (1:master@Jacquelin) Sending "Task_8" to "Slave_8"
-> [ 1685.569407] (29:Slave 7@Dodge) Received "Task_7" from mailbox Slave_7
-> [ 1685.656786] (29:Slave 7@Dodge) "Task_7" done
-> [ 1757.600403] (1:master@Jacquelin) Sending "Task_9" to "Slave_9"
-> [ 1757.600403] (30:Slave 8@Jean_Yves) Received "Task_8" from mailbox Slave_8
-> [ 1757.702345] (30:Slave 8@Jean_Yves) "Task_8" done
-> [ 1912.133629] (1:master@Jacquelin) Sending "Task_10" to "Slave_10"
-> [ 1912.133629] (31:Slave 9@Fafard) Received "Task_9" from mailbox Slave_9
-> [ 1912.153904] (12:Slave 10@Jacquelin) Received "Task_10" from mailbox Slave_10
-> [ 1912.153904] (1:master@Jacquelin) Sending "Task_11" to "Slave_11"
-> [ 1912.206445] (31:Slave 9@Fafard) "Task_9" done
-> [ 1912.226720] (12:Slave 10@Jacquelin) "Task_10" done
-> [ 1983.687385] (13:Slave 11@Intel) Received "Task_11" from mailbox Slave_11
-> [ 1983.687385] (1:master@Jacquelin) Sending "Task_12" to "Slave_12"
-> [ 1983.760201] (13:Slave 11@Intel) "Task_11" done
-> [ 2130.044668] (14:Slave 12@Provost) Received "Task_12" from mailbox Slave_12
-> [ 2130.044668] (1:master@Jacquelin) Sending "Task_13" to "Slave_13"
-> [ 2130.117484] (14:Slave 12@Provost) "Task_12" done
-> [ 2272.197433] (15:Slave 13@Fernand) Received "Task_13" from mailbox Slave_13
-> [ 2272.197433] (1:master@Jacquelin) Sending "Task_14" to "Slave_14"
-> [ 2272.648880] (15:Slave 13@Fernand) "Task_13" done
-> [ 2339.377424] (16:Slave 14@Bescherelle) Received "Task_14" from mailbox Slave_14
-> [ 2339.377424] (1:master@Jacquelin) Sending "Task_15" to "Slave_15"
-> [ 2339.450240] (16:Slave 14@Bescherelle) "Task_14" done
-> [ 2421.928519] (17:Slave 15@Ethernet) Received "Task_15" from mailbox Slave_15
-> [ 2421.928519] (1:master@Jacquelin) Sending "Task_16" to "Slave_16"
-> [ 2422.030461] (17:Slave 15@Ethernet) "Task_15" done
-> [ 2488.681925] (18:Slave 16@Kuenning) Received "Task_16" from mailbox Slave_16
-> [ 2488.681925] (1:master@Jacquelin) Sending "Task_17" to "Slave_17"
-> [ 2488.798430] (18:Slave 16@Kuenning) "Task_16" done
-> [ 2597.703036] (19:Slave 17@Dodge) Received "Task_17" from mailbox Slave_17
-> [ 2597.703036] (1:master@Jacquelin) Sending "Task_18" to "Slave_18"
-> [ 2597.790415] (19:Slave 17@Dodge) "Task_17" done
-> [ 2669.734032] (1:master@Jacquelin) Sending "Task_19" to "Slave_19"
-> [ 2669.734032] (20:Slave 18@Jean_Yves) Received "Task_18" from mailbox Slave_18
-> [ 2669.835974] (20:Slave 18@Jean_Yves) "Task_18" done
-> [ 2824.267258] (1:master@Jacquelin) Migrate everyone to the second host.
-> [ 2824.267258] (1:master@Jacquelin) Suspend everyone, move them to the third host, and resume them.
-> [ 2824.267258] (1:master@Jacquelin) Let's shut down the simulation. 10 first processes will be shut down cleanly while the second half will forcefully get killed
-> [ 2824.267258] (21:Slave 19@Fafard) Received "Task_19" from mailbox Slave_19
-> [ 2824.267453] (22:Slave 0@Provost) Received "finalize" from mailbox Slave_0
-> [ 2824.340073] (21:Slave 19@Provost) "Task_19" done
-> [ 2825.186151] (23:Slave 1@Provost) Received "finalize" from mailbox Slave_1
-> [ 2827.065805] (24:Slave 2@Provost) Received "finalize" from mailbox Slave_2
-> [ 2828.891461] (25:Slave 3@Provost) Received "finalize" from mailbox Slave_3
-> [ 2829.754248] (26:Slave 4@Provost) Received "finalize" from mailbox Slave_4
-> [ 2830.814444] (27:Slave 5@Provost) Received "finalize" from mailbox Slave_5
-> [ 2831.671752] (28:Slave 6@Provost) Received "finalize" from mailbox Slave_6
-> [ 2833.071901] (29:Slave 7@Provost) Received "finalize" from mailbox Slave_7
-> [ 2833.996989] (30:Slave 8@Provost) Received "finalize" from mailbox Slave_8
-> [ 2835.981646] (0:@) Simulation time 2835.98
-> [ 2835.981646] (1:master@Jacquelin) Goodbye now!
-> [ 2835.981646] (31:Slave 9@Provost) Received "finalize" from mailbox Slave_9
-
+> [ 1023.866678] (1:master@Jacquelin) Sending "Task_2" to "Slave_2"
+> [ 1023.866678] (23:Slave 1@Intel) Received "Task_1" from mailbox Slave_1
+> [ 1023.939494] (23:Slave 1@Intel) "Task_1" done
+> [ 1048.674036] (1:master@Jacquelin) Sending "Task_3" to "Slave_3"
+> [ 1048.674036] (24:Slave 2@Provost) Received "Task_2" from mailbox Slave_2
+> [ 1048.746852] (24:Slave 2@Provost) "Task_2" done
+> [ 1056.325710] (1:master@Jacquelin) Sending "Task_4" to "Slave_4"
+> [ 1056.325710] (25:Slave 3@Fernand) Received "Task_3" from mailbox Slave_3
+> [ 1056.777157] (25:Slave 3@Fernand) "Task_3" done
+> [ 1064.574878] (1:master@Jacquelin) Sending "Task_5" to "Slave_5"
+> [ 1064.574878] (26:Slave 4@Bescherelle) Received "Task_4" from mailbox Slave_4
+> [ 1064.647694] (26:Slave 4@Bescherelle) "Task_4" done
+> [ 1073.010762] (1:master@Jacquelin) Sending "Task_6" to "Slave_6"
+> [ 1073.010762] (27:Slave 5@Ethernet) Received "Task_5" from mailbox Slave_5
+> [ 1073.112704] (27:Slave 5@Ethernet) "Task_5" done
+> [ 1081.730603] (1:master@Jacquelin) Sending "Task_7" to "Slave_7"
+> [ 1081.730603] (28:Slave 6@Kuenning) Received "Task_6" from mailbox Slave_6
+> [ 1081.847108] (28:Slave 6@Kuenning) "Task_6" done
+> [ 1126.150095] (1:master@Jacquelin) Sending "Task_8" to "Slave_8"
+> [ 1126.150095] (29:Slave 7@Dodge) Received "Task_7" from mailbox Slave_7
+> [ 1126.237474] (29:Slave 7@Dodge) "Task_7" done
+> [ 1169.839597] (1:master@Jacquelin) Sending "Task_9" to "Slave_9"
+> [ 1169.839597] (30:Slave 8@Jean_Yves) Received "Task_8" from mailbox Slave_8
+> [ 1169.941539] (30:Slave 8@Jean_Yves) "Task_8" done
+> [ 1176.014409] (1:master@Jacquelin) Sending "Task_10" to "Slave_10"
+> [ 1176.014409] (31:Slave 9@Fafard) Received "Task_9" from mailbox Slave_9
+> [ 1176.034684] (12:Slave 10@Jacquelin) Received "Task_10" from mailbox Slave_10
+> [ 1176.034684] (1:master@Jacquelin) Sending "Task_11" to "Slave_11"
+> [ 1176.087225] (31:Slave 9@Fafard) "Task_9" done
+> [ 1176.107500] (12:Slave 10@Jacquelin) "Task_10" done
+> [ 1199.881087] (13:Slave 11@Intel) Received "Task_11" from mailbox Slave_11
+> [ 1199.881087] (1:master@Jacquelin) Sending "Task_12" to "Slave_12"
+> [ 1199.953902] (13:Slave 11@Intel) "Task_11" done
+> [ 1224.688445] (14:Slave 12@Provost) Received "Task_12" from mailbox Slave_12
+> [ 1224.688445] (1:master@Jacquelin) Sending "Task_13" to "Slave_13"
+> [ 1224.761260] (14:Slave 12@Provost) "Task_12" done
+> [ 1232.340119] (15:Slave 13@Fernand) Received "Task_13" from mailbox Slave_13
+> [ 1232.340119] (1:master@Jacquelin) Sending "Task_14" to "Slave_14"
+> [ 1232.791566] (15:Slave 13@Fernand) "Task_13" done
+> [ 1240.589287] (16:Slave 14@Bescherelle) Received "Task_14" from mailbox Slave_14
+> [ 1240.589287] (1:master@Jacquelin) Sending "Task_15" to "Slave_15"
+> [ 1240.662103] (16:Slave 14@Bescherelle) "Task_14" done
+> [ 1249.025171] (17:Slave 15@Ethernet) Received "Task_15" from mailbox Slave_15
+> [ 1249.025171] (1:master@Jacquelin) Sending "Task_16" to "Slave_16"
+> [ 1249.127113] (17:Slave 15@Ethernet) "Task_15" done
+> [ 1257.745012] (18:Slave 16@Kuenning) Received "Task_16" from mailbox Slave_16
+> [ 1257.745012] (1:master@Jacquelin) Sending "Task_17" to "Slave_17"
+> [ 1257.861517] (18:Slave 16@Kuenning) "Task_16" done
+> [ 1302.164504] (19:Slave 17@Dodge) Received "Task_17" from mailbox Slave_17
+> [ 1302.164504] (1:master@Jacquelin) Sending "Task_18" to "Slave_18"
+> [ 1302.251883] (19:Slave 17@Dodge) "Task_17" done
+> [ 1345.854006] (1:master@Jacquelin) Sending "Task_19" to "Slave_19"
+> [ 1345.854006] (20:Slave 18@Jean_Yves) Received "Task_18" from mailbox Slave_18
+> [ 1345.955948] (20:Slave 18@Jean_Yves) "Task_18" done
+> [ 1352.028818] (1:master@Jacquelin) Migrate everyone to the second host.
+> [ 1352.028818] (1:master@Jacquelin) Suspend everyone, move them to the third host, and resume them.
+> [ 1352.028818] (1:master@Jacquelin) Let's shut down the simulation. 10 first processes will be shut down cleanly while the second half will forcefully get killed
+> [ 1352.028818] (21:Slave 19@Fafard) Received "Task_19" from mailbox Slave_19
+> [ 1352.029013] (22:Slave 0@Provost) Received "finalize" from mailbox Slave_0
+> [ 1352.101633] (21:Slave 19@Provost) "Task_19" done
+> [ 1352.947711] (23:Slave 1@Provost) Received "finalize" from mailbox Slave_1
+> [ 1354.827365] (24:Slave 2@Provost) Received "finalize" from mailbox Slave_2
+> [ 1356.653021] (25:Slave 3@Provost) Received "finalize" from mailbox Slave_3
+> [ 1357.515808] (26:Slave 4@Provost) Received "finalize" from mailbox Slave_4
+> [ 1358.576004] (27:Slave 5@Provost) Received "finalize" from mailbox Slave_5
+> [ 1359.433313] (28:Slave 6@Provost) Received "finalize" from mailbox Slave_6
+> [ 1360.833461] (29:Slave 7@Provost) Received "finalize" from mailbox Slave_7
+> [ 1361.758549] (30:Slave 8@Provost) Received "finalize" from mailbox Slave_8
+> [ 1363.743206] (0:@) Simulation time 1363.74
+> [ 1363.743206] (1:master@Jacquelin) Goodbye now!
+> [ 1363.743206] (31:Slave 9@Provost) Received "finalize" from mailbox Slave_9
index e2e9e5c..1a5c24a 100644 (file)
@@ -64,25 +64,26 @@ $ ./peer ${srcdir:=.}/small_platform.xml ${srcdir:=.}/deployment_peer03.xml "--l
 > [  0.000000] (2:receiver@Ruby) sleep_start_time : 1.000000 , sleep_test_time : 0.000000
 > [  1.000000] (2:receiver@Ruby) Wait to receive a task
 > [  5.000000] (1:sender@Tremblay) Send to receiver-0 Task_0
-> [  5.016951] (1:sender@Tremblay) Send to receiver-0 Task_1
-> [  5.016951] (2:receiver@Ruby) Received "Task_0"
-> [  5.016951] (2:receiver@Ruby) Processing "Task_0"
-> [  5.526661] (2:receiver@Ruby) "Task_0" done
-> [  5.526661] (2:receiver@Ruby) Wait to receive a task
-> [  5.543613] (1:sender@Tremblay) Send to receiver-0 Task_2
-> [  5.543613] (2:receiver@Ruby) Received "Task_1"
-> [  5.543613] (2:receiver@Ruby) Processing "Task_1"
-> [  6.053323] (2:receiver@Ruby) "Task_1" done
-> [  6.053323] (2:receiver@Ruby) Wait to receive a task
-> [  6.070274] (1:sender@Tremblay) Send to receiver-0 finalize
-> [  6.070274] (2:receiver@Ruby) Received "Task_2"
-> [  6.070274] (2:receiver@Ruby) Processing "Task_2"
-> [  6.579984] (2:receiver@Ruby) "Task_2" done
-> [  6.579984] (2:receiver@Ruby) Wait to receive a task
-> [  6.581936] (0:@) Simulation time 6.58194
-> [  6.581936] (1:sender@Tremblay) Goodbye now!
-> [  6.581936] (2:receiver@Ruby) Received "finalize"
-> [  6.581936] (2:receiver@Ruby) I'm done. See you!
+> [  5.004022] (1:sender@Tremblay) Send to receiver-0 Task_1
+> [  5.004022] (2:receiver@Ruby) Received "Task_0"
+> [  5.004022] (2:receiver@Ruby) Processing "Task_0"
+> [  5.513732] (2:receiver@Ruby) "Task_0" done
+> [  5.513732] (2:receiver@Ruby) Wait to receive a task
+> [  5.517753] (1:sender@Tremblay) Send to receiver-0 Task_2
+> [  5.517753] (2:receiver@Ruby) Received "Task_1"
+> [  5.517753] (2:receiver@Ruby) Processing "Task_1"
+> [  6.027463] (2:receiver@Ruby) "Task_1" done
+> [  6.027463] (2:receiver@Ruby) Wait to receive a task
+> [  6.031485] (1:sender@Tremblay) Send to receiver-0 finalize
+> [  6.031485] (2:receiver@Ruby) Received "Task_2"
+> [  6.031485] (2:receiver@Ruby) Processing "Task_2"
+> [  6.541195] (2:receiver@Ruby) "Task_2" done
+> [  6.541195] (2:receiver@Ruby) Wait to receive a task
+> [  6.543146] (0:@) Simulation time 6.54315
+> [  6.543146] (1:sender@Tremblay) Goodbye now!
+> [  6.543146] (2:receiver@Ruby) Received "finalize"
+> [  6.543146] (2:receiver@Ruby) I'm done. See you!
+
 
 p Test2 MSG_comm_wait() with Sleep_sender < Sleep_receiver
 
@@ -92,25 +93,25 @@ $ ./peer ${srcdir:=.}/small_platform.xml ${srcdir:=.}/deployment_peer04.xml "--l
 > [  0.000000] (2:receiver@Ruby) sleep_start_time : 5.000000 , sleep_test_time : 0.000000
 > [  1.000000] (1:sender@Tremblay) Send to receiver-0 Task_0
 > [  5.000000] (2:receiver@Ruby) Wait to receive a task
-> [  5.016951] (1:sender@Tremblay) Send to receiver-0 Task_1
-> [  5.016951] (2:receiver@Ruby) Received "Task_0"
-> [  5.016951] (2:receiver@Ruby) Processing "Task_0"
-> [  5.526661] (2:receiver@Ruby) "Task_0" done
-> [  5.526661] (2:receiver@Ruby) Wait to receive a task
-> [  5.543613] (1:sender@Tremblay) Send to receiver-0 Task_2
-> [  5.543613] (2:receiver@Ruby) Received "Task_1"
-> [  5.543613] (2:receiver@Ruby) Processing "Task_1"
-> [  6.053323] (2:receiver@Ruby) "Task_1" done
-> [  6.053323] (2:receiver@Ruby) Wait to receive a task
-> [  6.070274] (1:sender@Tremblay) Send to receiver-0 finalize
-> [  6.070274] (2:receiver@Ruby) Received "Task_2"
-> [  6.070274] (2:receiver@Ruby) Processing "Task_2"
-> [  6.579984] (2:receiver@Ruby) "Task_2" done
-> [  6.579984] (2:receiver@Ruby) Wait to receive a task
-> [  6.581936] (0:@) Simulation time 6.58194
-> [  6.581936] (1:sender@Tremblay) Goodbye now!
-> [  6.581936] (2:receiver@Ruby) Received "finalize"
-> [  6.581936] (2:receiver@Ruby) I'm done. See you!
+> [  5.004022] (1:sender@Tremblay) Send to receiver-0 Task_1
+> [  5.004022] (2:receiver@Ruby) Received "Task_0"
+> [  5.004022] (2:receiver@Ruby) Processing "Task_0"
+> [  5.513732] (2:receiver@Ruby) "Task_0" done
+> [  5.513732] (2:receiver@Ruby) Wait to receive a task
+> [  5.517753] (1:sender@Tremblay) Send to receiver-0 Task_2
+> [  5.517753] (2:receiver@Ruby) Received "Task_1"
+> [  5.517753] (2:receiver@Ruby) Processing "Task_1"
+> [  6.027463] (2:receiver@Ruby) "Task_1" done
+> [  6.027463] (2:receiver@Ruby) Wait to receive a task
+> [  6.031485] (1:sender@Tremblay) Send to receiver-0 finalize
+> [  6.031485] (2:receiver@Ruby) Received "Task_2"
+> [  6.031485] (2:receiver@Ruby) Processing "Task_2"
+> [  6.541195] (2:receiver@Ruby) "Task_2" done
+> [  6.541195] (2:receiver@Ruby) Wait to receive a task
+> [  6.543146] (0:@) Simulation time 6.54315
+> [  6.543146] (1:sender@Tremblay) Goodbye now!
+> [  6.543146] (2:receiver@Ruby) Received "finalize"
+> [  6.543146] (2:receiver@Ruby) I'm done. See you!
 
 p Test1 MSG_comm_waitall() for sender
 
@@ -121,19 +122,19 @@ $ ./peer2 ${srcdir:=.}/small_platform.xml ${srcdir:=.}/deployment_peer.xml "--lo
 > [  0.000000] (1:sender@Tremblay) Send to receiver-0 Task_2
 > [  0.000000] (1:sender@Tremblay) Send to receiver-0 finalize
 > [ 10.000000] (2:receiver@Ruby) Wait to receive a task
-> [ 10.016952] (2:receiver@Ruby) Received "Task_0"
-> [ 10.016952] (2:receiver@Ruby) Processing "Task_0"
-> [ 10.526661] (2:receiver@Ruby) "Task_0" done
-> [ 10.526661] (2:receiver@Ruby) Wait to receive a task
-> [ 10.543613] (2:receiver@Ruby) Received "Task_1"
-> [ 10.543613] (2:receiver@Ruby) Processing "Task_1"
-> [ 11.053323] (2:receiver@Ruby) "Task_1" done
-> [ 11.053323] (2:receiver@Ruby) Wait to receive a task
-> [ 11.070274] (2:receiver@Ruby) Received "Task_2"
-> [ 11.070274] (2:receiver@Ruby) Processing "Task_2"
-> [ 11.579984] (2:receiver@Ruby) "Task_2" done
-> [ 11.579984] (2:receiver@Ruby) Wait to receive a task
-> [ 11.581936] (0:@) Simulation time 11.5819
-> [ 11.581936] (1:sender@Tremblay) Goodbye now!
-> [ 11.581936] (2:receiver@Ruby) Received "finalize"
-> [ 11.581936] (2:receiver@Ruby) I'm done. See you!
+> [ 10.004022] (2:receiver@Ruby) Received "Task_0"
+> [ 10.004022] (2:receiver@Ruby) Processing "Task_0"
+> [ 10.513732] (2:receiver@Ruby) "Task_0" done
+> [ 10.513732] (2:receiver@Ruby) Wait to receive a task
+> [ 10.517753] (2:receiver@Ruby) Received "Task_1"
+> [ 10.517753] (2:receiver@Ruby) Processing "Task_1"
+> [ 11.027463] (2:receiver@Ruby) "Task_1" done
+> [ 11.027463] (2:receiver@Ruby) Wait to receive a task
+> [ 11.031485] (2:receiver@Ruby) Received "Task_2"
+> [ 11.031485] (2:receiver@Ruby) Processing "Task_2"
+> [ 11.541195] (2:receiver@Ruby) "Task_2" done
+> [ 11.541195] (2:receiver@Ruby) Wait to receive a task
+> [ 11.543146] (0:@) Simulation time 11.5431
+> [ 11.543146] (1:sender@Tremblay) Goodbye now!
+> [ 11.543146] (2:receiver@Ruby) Received "finalize"
+> [ 11.543146] (2:receiver@Ruby) I'm done. See you!
index 7036f56..d3f612e 100644 (file)
@@ -9,10 +9,10 @@ add_executable(file_unlink file_unlink.c)
 if(NOT WIN32)
   target_link_libraries(file simgrid m pthread)
   target_link_libraries(file_unlink simgrid m pthread)
-else(NOT WIN32)
+else()
   target_link_libraries(file simgrid)
   target_link_libraries(file_unlink simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index b6b693d..db69e3c 100644 (file)
@@ -17,7 +17,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/kademlia ${srcdir:=.}/../msg_platform.xml ${srcdir
 > [  0.000000] (11:node@Tanguay) Hi, I'm going to join the network with id 000003ff
 > [  0.000000] (12:node@Morin) Hi, I'm going to join the network with id 000007ff
 > [  0.000000] (13:node@Ethernet) Hi, I'm going to join the network with id 00000fff
-> [900.000000] ( 0:@) Messages created: 1046
+> [900.000000] ( 0:@) Messages created: 1277
 > [900.000000] ( 0:@) Simulated time: 900
 > [900.000000] ( 1:node@Jacquelin) 8/8 FIND_NODE have succeeded
 > [900.000000] ( 2:node@Boivin) 7/7 FIND_NODE have succeeded
index 274a3d2..2db9a51 100644 (file)
@@ -31,7 +31,7 @@ typedef struct s_node {
   msg_comm_t receive_comm;      //current receiving communication.
   msg_task_t task_received;     //current task being received
 
-  char mailbox[MAILBOX_NAME_SIZE];      //node mailbox
+  char mailbox[MAILBOX_NAME_SIZE+1];      //node mailbox
   unsigned int find_node_success;       //Number of find_node which have succeeded.
   unsigned int find_node_failed;        //Number of find_node which have failed.
 
index e68e0da..b062bf8 100644 (file)
@@ -24,7 +24,7 @@ if(WIN32)
   target_link_libraries(masterslave_arg simgrid )
   target_link_libraries(masterslave_platfgen simgrid )
   target_link_libraries(masterslave_failure_platfgen simgrid )
-else(WIN32)
+else()
   target_link_libraries(masterslave_forwarder simgrid m )
   target_link_libraries(masterslave_failure simgrid m )
   target_link_libraries(masterslave_mailbox simgrid m )
@@ -34,7 +34,7 @@ else(WIN32)
   target_link_libraries(masterslave_arg simgrid m )
   target_link_libraries(masterslave_platfgen simgrid m )
   target_link_libraries(masterslave_failure_platfgen simgrid m )
-endif(WIN32)
+endif()
 target_link_libraries(masterslave_cluster simgrid)
 
 set(tesh_files
index f92722a..ba27e57 100644 (file)
@@ -7,119 +7,119 @@ $ $SG_TEST_EXENV masterslave/masterslave_forwarder$EXEEXT ${srcdir:=.}/small_pla
 > [  0.000000] (0:@) Configuration change: Set 'network/crosstraffic' to '0'
 > [  0.000000] (1:master@Tremblay) Got 5 slaves and 20 tasks to process
 > [  0.000000] (1:master@Tremblay) Sending "Task_0" to "Jupiter"
-> [  0.165166] (1:master@Tremblay) Sent
-> [  0.165166] (1:master@Tremblay) Sending "Task_1" to "Fafard"
-> [  0.165166] (3:slave@Jupiter) Received "Task_0"
-> [  0.165166] (3:slave@Jupiter) Processing "Task_0"
-> [  0.388477] (1:master@Tremblay) Sent
-> [  0.388477] (1:master@Tremblay) Sending "Task_2" to "Ginette"
-> [  0.388477] (4:slave@Fafard) Received "Task_1"
-> [  0.388477] (4:slave@Fafard) Processing "Task_1"
-> [  0.532257] (1:master@Tremblay) Sent
-> [  0.532257] (1:master@Tremblay) Sending "Task_3" to "Bourassa"
-> [  0.532257] (5:slave@Ginette) Received "Task_2"
-> [  0.532257] (5:slave@Ginette) Processing "Task_2"
-> [  0.753233] (1:master@Tremblay) Sent
-> [  0.753233] (1:master@Tremblay) Sending "Task_4" to "Tremblay"
-> [  0.753233] (1:master@Tremblay) Hey ! It's me ! :)
-> [  0.753233] (6:slave@Bourassa) Received "Task_3"
-> [  0.753233] (6:slave@Bourassa) Processing "Task_3"
-> [  0.755498] (1:master@Tremblay) Sent
-> [  0.755498] (1:master@Tremblay) Sending "Task_5" to "Jupiter"
-> [  0.755498] (2:slave@Tremblay) Received "Task_4"
-> [  0.755498] (2:slave@Tremblay) Processing "Task_4"
-> [  0.820508] (3:slave@Jupiter) "Task_0" done
-> [  0.985674] (1:master@Tremblay) Sent
-> [  0.985674] (1:master@Tremblay) Sending "Task_6" to "Fafard"
-> [  0.985674] (3:slave@Jupiter) Received "Task_5"
-> [  0.985674] (3:slave@Jupiter) Processing "Task_5"
-> [  1.043819] (4:slave@Fafard) "Task_1" done
-> [  1.265208] (2:slave@Tremblay) "Task_4" done
-> [  1.267130] (1:master@Tremblay) Sent
-> [  1.267130] (1:master@Tremblay) Sending "Task_7" to "Ginette"
-> [  1.267130] (4:slave@Fafard) Received "Task_6"
-> [  1.267130] (4:slave@Fafard) Processing "Task_6"
-> [  1.563355] (5:slave@Ginette) "Task_2" done
-> [  1.641017] (3:slave@Jupiter) "Task_5" done
-> [  1.707135] (1:master@Tremblay) Sent
-> [  1.707135] (1:master@Tremblay) Sending "Task_8" to "Bourassa"
-> [  1.707135] (5:slave@Ginette) Received "Task_7"
-> [  1.707135] (5:slave@Ginette) Processing "Task_7"
-> [  1.784331] (6:slave@Bourassa) "Task_3" done
-> [  1.922472] (4:slave@Fafard) "Task_6" done
-> [  2.005306] (1:master@Tremblay) Sent
-> [  2.005306] (1:master@Tremblay) Sending "Task_9" to "Tremblay"
-> [  2.005306] (1:master@Tremblay) Hey ! It's me ! :)
-> [  2.005306] (6:slave@Bourassa) Received "Task_8"
-> [  2.005306] (6:slave@Bourassa) Processing "Task_8"
-> [  2.007572] (1:master@Tremblay) Sent
-> [  2.007572] (1:master@Tremblay) Sending "Task_10" to "Jupiter"
-> [  2.007572] (2:slave@Tremblay) Received "Task_9"
-> [  2.007572] (2:slave@Tremblay) Processing "Task_9"
-> [  2.172738] (1:master@Tremblay) Sent
-> [  2.172738] (1:master@Tremblay) Sending "Task_11" to "Fafard"
-> [  2.172738] (3:slave@Jupiter) Received "Task_10"
-> [  2.172738] (3:slave@Jupiter) Processing "Task_10"
-> [  2.396048] (1:master@Tremblay) Sent
-> [  2.396048] (1:master@Tremblay) Sending "Task_12" to "Ginette"
-> [  2.396048] (4:slave@Fafard) Received "Task_11"
-> [  2.396048] (4:slave@Fafard) Processing "Task_11"
-> [  2.517282] (2:slave@Tremblay) "Task_9" done
-> [  2.738233] (5:slave@Ginette) "Task_7" done
-> [  2.828080] (3:slave@Jupiter) "Task_10" done
-> [  2.882013] (1:master@Tremblay) Sent
-> [  2.882013] (1:master@Tremblay) Sending "Task_13" to "Bourassa"
-> [  2.882013] (5:slave@Ginette) Received "Task_12"
-> [  2.882013] (5:slave@Ginette) Processing "Task_12"
-> [  3.036404] (6:slave@Bourassa) "Task_8" done
-> [  3.051391] (4:slave@Fafard) "Task_11" done
-> [  3.257380] (1:master@Tremblay) Sent
-> [  3.257380] (1:master@Tremblay) Sending "Task_14" to "Tremblay"
-> [  3.257380] (1:master@Tremblay) Hey ! It's me ! :)
-> [  3.257380] (6:slave@Bourassa) Received "Task_13"
-> [  3.257380] (6:slave@Bourassa) Processing "Task_13"
-> [  3.259645] (1:master@Tremblay) Sent
-> [  3.259645] (1:master@Tremblay) Sending "Task_15" to "Jupiter"
-> [  3.259645] (2:slave@Tremblay) Received "Task_14"
-> [  3.259645] (2:slave@Tremblay) Processing "Task_14"
-> [  3.424811] (1:master@Tremblay) Sent
-> [  3.424811] (1:master@Tremblay) Sending "Task_16" to "Fafard"
-> [  3.424811] (3:slave@Jupiter) Received "Task_15"
-> [  3.424811] (3:slave@Jupiter) Processing "Task_15"
-> [  3.648122] (1:master@Tremblay) Sent
-> [  3.648122] (1:master@Tremblay) Sending "Task_17" to "Ginette"
-> [  3.648122] (4:slave@Fafard) Received "Task_16"
-> [  3.648122] (4:slave@Fafard) Processing "Task_16"
-> [  3.769355] (2:slave@Tremblay) "Task_14" done
-> [  3.913111] (5:slave@Ginette) "Task_12" done
-> [  4.056891] (1:master@Tremblay) Sent
-> [  4.056891] (1:master@Tremblay) Sending "Task_18" to "Bourassa"
-> [  4.056891] (5:slave@Ginette) Received "Task_17"
-> [  4.056891] (5:slave@Ginette) Processing "Task_17"
-> [  4.080154] (3:slave@Jupiter) "Task_15" done
-> [  4.288478] (6:slave@Bourassa) "Task_13" done
-> [  4.303464] (4:slave@Fafard) "Task_16" done
-> [  4.509454] (1:master@Tremblay) Sent
-> [  4.509454] (1:master@Tremblay) Sending "Task_19" to "Tremblay"
-> [  4.509454] (1:master@Tremblay) Hey ! It's me ! :)
-> [  4.509454] (6:slave@Bourassa) Received "Task_18"
-> [  4.509454] (6:slave@Bourassa) Processing "Task_18"
-> [  4.511719] (1:master@Tremblay) Sent
-> [  4.511719] (1:master@Tremblay) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [  4.511719] (2:slave@Tremblay) Received "Task_19"
-> [  4.511719] (2:slave@Tremblay) Processing "Task_19"
-> [  4.530733] (3:slave@Jupiter) Received "finalize"
-> [  4.530733] (3:slave@Jupiter) I'm done. See you!
-> [  4.556442] (4:slave@Fafard) Received "finalize"
-> [  4.556442] (4:slave@Fafard) I'm done. See you!
-> [  5.021429] (2:slave@Tremblay) "Task_19" done
-> [  5.087989] (5:slave@Ginette) "Task_17" done
-> [  5.104542] (5:slave@Ginette) Received "finalize"
-> [  5.104542] (5:slave@Ginette) I'm done. See you!
-> [  5.540552] (6:slave@Bourassa) "Task_18" done
-> [  5.565991] (6:slave@Bourassa) Received "finalize"
-> [  5.565991] (6:slave@Bourassa) I'm done. See you!
-> [  5.566186] (0:@) Simulation time 5.56619
-> [  5.566186] (1:master@Tremblay) Goodbye now!
-> [  5.566186] (2:slave@Tremblay) Received "finalize"
-> [  5.566186] (2:slave@Tremblay) I'm done. See you!
+> [  0.162005] (1:master@Tremblay) Sent
+> [  0.162005] (1:master@Tremblay) Sending "Task_1" to "Fafard"
+> [  0.162005] (3:slave@Jupiter) Received "Task_0"
+> [  0.162005] (3:slave@Jupiter) Processing "Task_0"
+> [  0.314083] (1:master@Tremblay) Sent
+> [  0.314083] (1:master@Tremblay) Sending "Task_2" to "Ginette"
+> [  0.314083] (4:slave@Fafard) Received "Task_1"
+> [  0.314083] (4:slave@Fafard) Processing "Task_1"
+> [  0.432712] (1:master@Tremblay) Sent
+> [  0.432712] (1:master@Tremblay) Sending "Task_3" to "Bourassa"
+> [  0.432712] (5:slave@Ginette) Received "Task_2"
+> [  0.432712] (5:slave@Ginette) Processing "Task_2"
+> [  0.560227] (1:master@Tremblay) Sent
+> [  0.560227] (1:master@Tremblay) Sending "Task_4" to "Tremblay"
+> [  0.560227] (1:master@Tremblay) Hey ! It's me ! :)
+> [  0.560227] (6:slave@Bourassa) Received "Task_3"
+> [  0.560227] (6:slave@Bourassa) Processing "Task_3"
+> [  0.562492] (1:master@Tremblay) Sent
+> [  0.562492] (1:master@Tremblay) Sending "Task_5" to "Jupiter"
+> [  0.562492] (2:slave@Tremblay) Received "Task_4"
+> [  0.562492] (2:slave@Tremblay) Processing "Task_4"
+> [  0.817347] (3:slave@Jupiter) "Task_0" done
+> [  0.969426] (4:slave@Fafard) "Task_1" done
+> [  0.979353] (1:master@Tremblay) Sent
+> [  0.979353] (1:master@Tremblay) Sending "Task_6" to "Fafard"
+> [  0.979353] (3:slave@Jupiter) Received "Task_5"
+> [  0.979353] (3:slave@Jupiter) Processing "Task_5"
+> [  1.072202] (2:slave@Tremblay) "Task_4" done
+> [  1.131431] (1:master@Tremblay) Sent
+> [  1.131431] (1:master@Tremblay) Sending "Task_7" to "Ginette"
+> [  1.131431] (4:slave@Fafard) Received "Task_6"
+> [  1.131431] (4:slave@Fafard) Processing "Task_6"
+> [  1.463809] (5:slave@Ginette) "Task_2" done
+> [  1.582438] (1:master@Tremblay) Sent
+> [  1.582438] (1:master@Tremblay) Sending "Task_8" to "Bourassa"
+> [  1.582438] (5:slave@Ginette) Received "Task_7"
+> [  1.582438] (5:slave@Ginette) Processing "Task_7"
+> [  1.591325] (6:slave@Bourassa) "Task_3" done
+> [  1.634695] (3:slave@Jupiter) "Task_5" done
+> [  1.718840] (1:master@Tremblay) Sent
+> [  1.718840] (1:master@Tremblay) Sending "Task_9" to "Tremblay"
+> [  1.718840] (1:master@Tremblay) Hey ! It's me ! :)
+> [  1.718840] (6:slave@Bourassa) Received "Task_8"
+> [  1.718840] (6:slave@Bourassa) Processing "Task_8"
+> [  1.721105] (1:master@Tremblay) Sent
+> [  1.721105] (1:master@Tremblay) Sending "Task_10" to "Jupiter"
+> [  1.721105] (2:slave@Tremblay) Received "Task_9"
+> [  1.721105] (2:slave@Tremblay) Processing "Task_9"
+> [  1.786773] (4:slave@Fafard) "Task_6" done
+> [  1.883110] (1:master@Tremblay) Sent
+> [  1.883110] (1:master@Tremblay) Sending "Task_11" to "Fafard"
+> [  1.883110] (3:slave@Jupiter) Received "Task_10"
+> [  1.883110] (3:slave@Jupiter) Processing "Task_10"
+> [  2.035188] (1:master@Tremblay) Sent
+> [  2.035188] (1:master@Tremblay) Sending "Task_12" to "Ginette"
+> [  2.035188] (4:slave@Fafard) Received "Task_11"
+> [  2.035188] (4:slave@Fafard) Processing "Task_11"
+> [  2.230815] (2:slave@Tremblay) "Task_9" done
+> [  2.538453] (3:slave@Jupiter) "Task_10" done
+> [  2.613536] (5:slave@Ginette) "Task_7" done
+> [  2.690531] (4:slave@Fafard) "Task_11" done
+> [  2.732164] (1:master@Tremblay) Sent
+> [  2.732164] (1:master@Tremblay) Sending "Task_13" to "Bourassa"
+> [  2.732164] (5:slave@Ginette) Received "Task_12"
+> [  2.732164] (5:slave@Ginette) Processing "Task_12"
+> [  2.749938] (6:slave@Bourassa) "Task_8" done
+> [  2.877453] (1:master@Tremblay) Sent
+> [  2.877453] (1:master@Tremblay) Sending "Task_14" to "Tremblay"
+> [  2.877453] (1:master@Tremblay) Hey ! It's me ! :)
+> [  2.877453] (6:slave@Bourassa) Received "Task_13"
+> [  2.877453] (6:slave@Bourassa) Processing "Task_13"
+> [  2.879718] (1:master@Tremblay) Sent
+> [  2.879718] (1:master@Tremblay) Sending "Task_15" to "Jupiter"
+> [  2.879718] (2:slave@Tremblay) Received "Task_14"
+> [  2.879718] (2:slave@Tremblay) Processing "Task_14"
+> [  3.041723] (1:master@Tremblay) Sent
+> [  3.041723] (1:master@Tremblay) Sending "Task_16" to "Fafard"
+> [  3.041723] (3:slave@Jupiter) Received "Task_15"
+> [  3.041723] (3:slave@Jupiter) Processing "Task_15"
+> [  3.193802] (1:master@Tremblay) Sent
+> [  3.193802] (1:master@Tremblay) Sending "Task_17" to "Ginette"
+> [  3.193802] (4:slave@Fafard) Received "Task_16"
+> [  3.193802] (4:slave@Fafard) Processing "Task_16"
+> [  3.389428] (2:slave@Tremblay) "Task_14" done
+> [  3.697066] (3:slave@Jupiter) "Task_15" done
+> [  3.763262] (5:slave@Ginette) "Task_12" done
+> [  3.849144] (4:slave@Fafard) "Task_16" done
+> [  3.881890] (1:master@Tremblay) Sent
+> [  3.881890] (1:master@Tremblay) Sending "Task_18" to "Bourassa"
+> [  3.881890] (5:slave@Ginette) Received "Task_17"
+> [  3.881890] (5:slave@Ginette) Processing "Task_17"
+> [  3.908551] (6:slave@Bourassa) "Task_13" done
+> [  4.036066] (1:master@Tremblay) Sent
+> [  4.036066] (1:master@Tremblay) Sending "Task_19" to "Tremblay"
+> [  4.036066] (1:master@Tremblay) Hey ! It's me ! :)
+> [  4.036066] (6:slave@Bourassa) Received "Task_18"
+> [  4.036066] (6:slave@Bourassa) Processing "Task_18"
+> [  4.038331] (1:master@Tremblay) Sent
+> [  4.038331] (1:master@Tremblay) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [  4.038331] (2:slave@Tremblay) Received "Task_19"
+> [  4.038331] (2:slave@Tremblay) Processing "Task_19"
+> [  4.057346] (3:slave@Jupiter) Received "finalize"
+> [  4.057346] (3:slave@Jupiter) I'm done. See you!
+> [  4.083054] (4:slave@Fafard) Received "finalize"
+> [  4.083054] (4:slave@Fafard) I'm done. See you!
+> [  4.548041] (2:slave@Tremblay) "Task_19" done
+> [  4.912988] (5:slave@Ginette) "Task_17" done
+> [  4.929540] (5:slave@Ginette) Received "finalize"
+> [  4.929540] (5:slave@Ginette) I'm done. See you!
+> [  5.067164] (6:slave@Bourassa) "Task_18" done
+> [  5.092603] (6:slave@Bourassa) Received "finalize"
+> [  5.092603] (6:slave@Bourassa) I'm done. See you!
+> [  5.092798] (0:@) Simulation time 5.0928
+> [  5.092798] (1:master@Tremblay) Goodbye now!
+> [  5.092798] (2:slave@Tremblay) Received "finalize"
+> [  5.092798] (2:slave@Tremblay) I'm done. See you!
index 89f8b56..5385d75 100644 (file)
@@ -29,107 +29,107 @@ $ $SG_TEST_EXENV masterslave/masterslave_bypass --log=no_loc  "--log=root.fmt:[%
 > [  0.000000] (1:master@host A)       "Task_19"
 > [  0.000000] (1:master@host A) Sending "Task_0" to "host B"
 > [  0.000000] (2:slave@host B) I'm a slave
-> [  4.602000] (1:master@host A) Send completed
-> [  4.602000] (1:master@host A) Sending "Task_1" to "host B"
-> [  4.602000] (2:slave@host B) Received "Task_0" 
-> [  4.602000] (2:slave@host B) Processing "Task_0" 
-> [  4.652000] (2:slave@host B) "Task_0" done 
-> [  9.254000] (1:master@host A) Send completed
-> [  9.254000] (1:master@host A) Sending "Task_2" to "host B"
-> [  9.254000] (2:slave@host B) Received "Task_1" 
-> [  9.254000] (2:slave@host B) Processing "Task_1" 
-> [  9.304000] (2:slave@host B) "Task_1" done 
-> [ 13.906000] (1:master@host A) Send completed
-> [ 13.906000] (1:master@host A) Sending "Task_3" to "host B"
-> [ 13.906000] (2:slave@host B) Received "Task_2" 
-> [ 13.906000] (2:slave@host B) Processing "Task_2" 
-> [ 13.956000] (2:slave@host B) "Task_2" done 
-> [ 18.558000] (1:master@host A) Send completed
-> [ 18.558000] (1:master@host A) Sending "Task_4" to "host B"
-> [ 18.558000] (2:slave@host B) Received "Task_3" 
-> [ 18.558000] (2:slave@host B) Processing "Task_3" 
-> [ 18.608000] (2:slave@host B) "Task_3" done 
-> [ 23.210000] (1:master@host A) Send completed
-> [ 23.210000] (1:master@host A) Sending "Task_5" to "host B"
-> [ 23.210000] (2:slave@host B) Received "Task_4" 
-> [ 23.210000] (2:slave@host B) Processing "Task_4" 
-> [ 23.260000] (2:slave@host B) "Task_4" done 
-> [ 27.862000] (1:master@host A) Send completed
-> [ 27.862000] (1:master@host A) Sending "Task_6" to "host B"
-> [ 27.862000] (2:slave@host B) Received "Task_5" 
-> [ 27.862000] (2:slave@host B) Processing "Task_5" 
-> [ 27.912000] (2:slave@host B) "Task_5" done 
-> [ 32.514000] (1:master@host A) Send completed
-> [ 32.514000] (1:master@host A) Sending "Task_7" to "host B"
-> [ 32.514000] (2:slave@host B) Received "Task_6" 
-> [ 32.514000] (2:slave@host B) Processing "Task_6" 
-> [ 32.564000] (2:slave@host B) "Task_6" done 
-> [ 37.166000] (1:master@host A) Send completed
-> [ 37.166000] (1:master@host A) Sending "Task_8" to "host B"
-> [ 37.166000] (2:slave@host B) Received "Task_7" 
-> [ 37.166000] (2:slave@host B) Processing "Task_7" 
-> [ 37.216000] (2:slave@host B) "Task_7" done 
-> [ 41.818000] (1:master@host A) Send completed
-> [ 41.818000] (1:master@host A) Sending "Task_9" to "host B"
-> [ 41.818000] (2:slave@host B) Received "Task_8" 
-> [ 41.818000] (2:slave@host B) Processing "Task_8" 
-> [ 41.868000] (2:slave@host B) "Task_8" done 
-> [ 46.470000] (1:master@host A) Send completed
-> [ 46.470000] (1:master@host A) Sending "Task_10" to "host B"
-> [ 46.470000] (2:slave@host B) Received "Task_9" 
-> [ 46.470000] (2:slave@host B) Processing "Task_9" 
-> [ 46.520000] (2:slave@host B) "Task_9" done 
-> [ 51.122000] (1:master@host A) Send completed
-> [ 51.122000] (1:master@host A) Sending "Task_11" to "host B"
-> [ 51.122000] (2:slave@host B) Received "Task_10" 
-> [ 51.122000] (2:slave@host B) Processing "Task_10" 
-> [ 51.172000] (2:slave@host B) "Task_10" done 
-> [ 55.774000] (1:master@host A) Send completed
-> [ 55.774000] (1:master@host A) Sending "Task_12" to "host B"
-> [ 55.774000] (2:slave@host B) Received "Task_11" 
-> [ 55.774000] (2:slave@host B) Processing "Task_11" 
-> [ 55.824000] (2:slave@host B) "Task_11" done 
-> [ 60.426000] (1:master@host A) Send completed
-> [ 60.426000] (1:master@host A) Sending "Task_13" to "host B"
-> [ 60.426000] (2:slave@host B) Received "Task_12" 
-> [ 60.426000] (2:slave@host B) Processing "Task_12" 
-> [ 60.476000] (2:slave@host B) "Task_12" done 
-> [ 65.078000] (1:master@host A) Send completed
-> [ 65.078000] (1:master@host A) Sending "Task_14" to "host B"
-> [ 65.078000] (2:slave@host B) Received "Task_13" 
-> [ 65.078000] (2:slave@host B) Processing "Task_13" 
-> [ 65.128000] (2:slave@host B) "Task_13" done 
-> [ 69.730000] (1:master@host A) Send completed
-> [ 69.730000] (1:master@host A) Sending "Task_15" to "host B"
-> [ 69.730000] (2:slave@host B) Received "Task_14" 
-> [ 69.730000] (2:slave@host B) Processing "Task_14" 
-> [ 69.780000] (2:slave@host B) "Task_14" done 
-> [ 74.382000] (1:master@host A) Send completed
-> [ 74.382000] (1:master@host A) Sending "Task_16" to "host B"
-> [ 74.382000] (2:slave@host B) Received "Task_15" 
-> [ 74.382000] (2:slave@host B) Processing "Task_15" 
-> [ 74.432000] (2:slave@host B) "Task_15" done 
-> [ 79.034000] (1:master@host A) Send completed
-> [ 79.034000] (1:master@host A) Sending "Task_17" to "host B"
-> [ 79.034000] (2:slave@host B) Received "Task_16" 
-> [ 79.034000] (2:slave@host B) Processing "Task_16" 
-> [ 79.084000] (2:slave@host B) "Task_16" done 
-> [ 83.686000] (1:master@host A) Send completed
-> [ 83.686000] (1:master@host A) Sending "Task_18" to "host B"
-> [ 83.686000] (2:slave@host B) Received "Task_17" 
-> [ 83.686000] (2:slave@host B) Processing "Task_17" 
-> [ 83.736000] (2:slave@host B) "Task_17" done 
-> [ 88.338000] (1:master@host A) Send completed
-> [ 88.338000] (1:master@host A) Sending "Task_19" to "host B"
-> [ 88.338000] (2:slave@host B) Received "Task_18" 
-> [ 88.338000] (2:slave@host B) Processing "Task_18" 
-> [ 88.388000] (2:slave@host B) "Task_18" done 
-> [ 92.990000] (1:master@host A) Send completed
-> [ 92.990000] (1:master@host A) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [ 92.990000] (2:slave@host B) Received "Task_19" 
-> [ 92.990000] (2:slave@host B) Processing "Task_19" 
-> [ 93.040000] (2:slave@host B) "Task_19" done 
-> [ 95.642000] (0:@) Simulation time 95.642
-> [ 95.642000] (1:master@host A) Goodbye now!
-> [ 95.642000] (2:slave@host B) Received "finalize" 
-> [ 95.642000] (2:slave@host B) I'm done. See you!
+> [  2.612825] (1:master@host A) Send completed
+> [  2.612825] (1:master@host A) Sending "Task_1" to "host B"
+> [  2.612825] (2:slave@host B) Received "Task_0" 
+> [  2.612825] (2:slave@host B) Processing "Task_0" 
+> [  2.662825] (2:slave@host B) "Task_0" done 
+> [  5.275649] (1:master@host A) Send completed
+> [  5.275649] (1:master@host A) Sending "Task_2" to "host B"
+> [  5.275649] (2:slave@host B) Received "Task_1" 
+> [  5.275649] (2:slave@host B) Processing "Task_1" 
+> [  5.325649] (2:slave@host B) "Task_1" done 
+> [  7.938474] (1:master@host A) Send completed
+> [  7.938474] (1:master@host A) Sending "Task_3" to "host B"
+> [  7.938474] (2:slave@host B) Received "Task_2" 
+> [  7.938474] (2:slave@host B) Processing "Task_2" 
+> [  7.988474] (2:slave@host B) "Task_2" done 
+> [ 10.601299] (1:master@host A) Send completed
+> [ 10.601299] (1:master@host A) Sending "Task_4" to "host B"
+> [ 10.601299] (2:slave@host B) Received "Task_3" 
+> [ 10.601299] (2:slave@host B) Processing "Task_3" 
+> [ 10.651299] (2:slave@host B) "Task_3" done 
+> [ 13.264124] (1:master@host A) Send completed
+> [ 13.264124] (1:master@host A) Sending "Task_5" to "host B"
+> [ 13.264124] (2:slave@host B) Received "Task_4" 
+> [ 13.264124] (2:slave@host B) Processing "Task_4" 
+> [ 13.314124] (2:slave@host B) "Task_4" done 
+> [ 15.926948] (1:master@host A) Send completed
+> [ 15.926948] (1:master@host A) Sending "Task_6" to "host B"
+> [ 15.926948] (2:slave@host B) Received "Task_5" 
+> [ 15.926948] (2:slave@host B) Processing "Task_5" 
+> [ 15.976948] (2:slave@host B) "Task_5" done 
+> [ 18.589773] (1:master@host A) Send completed
+> [ 18.589773] (1:master@host A) Sending "Task_7" to "host B"
+> [ 18.589773] (2:slave@host B) Received "Task_6" 
+> [ 18.589773] (2:slave@host B) Processing "Task_6" 
+> [ 18.639773] (2:slave@host B) "Task_6" done 
+> [ 21.252598] (1:master@host A) Send completed
+> [ 21.252598] (1:master@host A) Sending "Task_8" to "host B"
+> [ 21.252598] (2:slave@host B) Received "Task_7" 
+> [ 21.252598] (2:slave@host B) Processing "Task_7" 
+> [ 21.302598] (2:slave@host B) "Task_7" done 
+> [ 23.915423] (1:master@host A) Send completed
+> [ 23.915423] (1:master@host A) Sending "Task_9" to "host B"
+> [ 23.915423] (2:slave@host B) Received "Task_8" 
+> [ 23.915423] (2:slave@host B) Processing "Task_8" 
+> [ 23.965423] (2:slave@host B) "Task_8" done 
+> [ 26.578247] (1:master@host A) Send completed
+> [ 26.578247] (1:master@host A) Sending "Task_10" to "host B"
+> [ 26.578247] (2:slave@host B) Received "Task_9" 
+> [ 26.578247] (2:slave@host B) Processing "Task_9" 
+> [ 26.628247] (2:slave@host B) "Task_9" done 
+> [ 29.241072] (1:master@host A) Send completed
+> [ 29.241072] (1:master@host A) Sending "Task_11" to "host B"
+> [ 29.241072] (2:slave@host B) Received "Task_10" 
+> [ 29.241072] (2:slave@host B) Processing "Task_10" 
+> [ 29.291072] (2:slave@host B) "Task_10" done 
+> [ 31.903897] (1:master@host A) Send completed
+> [ 31.903897] (1:master@host A) Sending "Task_12" to "host B"
+> [ 31.903897] (2:slave@host B) Received "Task_11" 
+> [ 31.903897] (2:slave@host B) Processing "Task_11" 
+> [ 31.953897] (2:slave@host B) "Task_11" done 
+> [ 34.566722] (1:master@host A) Send completed
+> [ 34.566722] (1:master@host A) Sending "Task_13" to "host B"
+> [ 34.566722] (2:slave@host B) Received "Task_12" 
+> [ 34.566722] (2:slave@host B) Processing "Task_12" 
+> [ 34.616722] (2:slave@host B) "Task_12" done 
+> [ 37.229546] (1:master@host A) Send completed
+> [ 37.229546] (1:master@host A) Sending "Task_14" to "host B"
+> [ 37.229546] (2:slave@host B) Received "Task_13" 
+> [ 37.229546] (2:slave@host B) Processing "Task_13" 
+> [ 37.279546] (2:slave@host B) "Task_13" done 
+> [ 39.892371] (1:master@host A) Send completed
+> [ 39.892371] (1:master@host A) Sending "Task_15" to "host B"
+> [ 39.892371] (2:slave@host B) Received "Task_14" 
+> [ 39.892371] (2:slave@host B) Processing "Task_14" 
+> [ 39.942371] (2:slave@host B) "Task_14" done 
+> [ 42.555196] (1:master@host A) Send completed
+> [ 42.555196] (1:master@host A) Sending "Task_16" to "host B"
+> [ 42.555196] (2:slave@host B) Received "Task_15" 
+> [ 42.555196] (2:slave@host B) Processing "Task_15" 
+> [ 42.605196] (2:slave@host B) "Task_15" done 
+> [ 45.218021] (1:master@host A) Send completed
+> [ 45.218021] (1:master@host A) Sending "Task_17" to "host B"
+> [ 45.218021] (2:slave@host B) Received "Task_16" 
+> [ 45.218021] (2:slave@host B) Processing "Task_16" 
+> [ 45.268021] (2:slave@host B) "Task_16" done 
+> [ 47.880845] (1:master@host A) Send completed
+> [ 47.880845] (1:master@host A) Sending "Task_18" to "host B"
+> [ 47.880845] (2:slave@host B) Received "Task_17" 
+> [ 47.880845] (2:slave@host B) Processing "Task_17" 
+> [ 47.930845] (2:slave@host B) "Task_17" done 
+> [ 50.543670] (1:master@host A) Send completed
+> [ 50.543670] (1:master@host A) Sending "Task_19" to "host B"
+> [ 50.543670] (2:slave@host B) Received "Task_18" 
+> [ 50.543670] (2:slave@host B) Processing "Task_18" 
+> [ 50.593670] (2:slave@host B) "Task_18" done 
+> [ 53.206495] (1:master@host A) Send completed
+> [ 53.206495] (1:master@host A) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [ 53.206495] (2:slave@host B) Received "Task_19" 
+> [ 53.206495] (2:slave@host B) Processing "Task_19" 
+> [ 53.256495] (2:slave@host B) "Task_19" done 
+> [ 55.858495] (0:@) Simulation time 55.8585
+> [ 55.858495] (1:master@host A) Goodbye now!
+> [ 55.858495] (2:slave@host B) Received "finalize" 
+> [ 55.858495] (2:slave@host B) I'm done. See you!
index 6c01b7d..9ff571d 100644 (file)
@@ -11,118 +11,119 @@ $ $SG_TEST_EXENV ${bindir:=.}/masterslave_forwarder$EXEEXT small_platform.xml ma
 > [  0.169155] (1:master@Tremblay) Sending "Task_1" to "Fafard"
 > [  0.169155] (3:slave@Jupiter) Received "Task_0"
 > [  0.169155] (3:slave@Jupiter) Processing "Task_0"
-> [  0.392465] (1:master@Tremblay) Sent
-> [  0.392465] (1:master@Tremblay) Sending "Task_2" to "Ginette"
-> [  0.392465] (4:slave@Fafard) Received "Task_1"
-> [  0.392465] (4:slave@Fafard) Processing "Task_1"
-> [  0.536245] (1:master@Tremblay) Sent
-> [  0.536245] (1:master@Tremblay) Sending "Task_3" to "Bourassa"
-> [  0.536245] (5:slave@Ginette) Received "Task_2"
-> [  0.536245] (5:slave@Ginette) Processing "Task_2"
-> [  0.757221] (1:master@Tremblay) Sent
-> [  0.757221] (1:master@Tremblay) Sending "Task_4" to "Tremblay"
-> [  0.757221] (1:master@Tremblay) Hey ! It's me ! :)
-> [  0.757221] (6:slave@Bourassa) Received "Task_3"
-> [  0.757221] (6:slave@Bourassa) Processing "Task_3"
-> [  0.759487] (1:master@Tremblay) Sent
-> [  0.759487] (1:master@Tremblay) Sending "Task_5" to "Jupiter"
-> [  0.759487] (2:slave@Tremblay) Received "Task_4"
-> [  0.759487] (2:slave@Tremblay) Processing "Task_4"
+> [  0.327551] (1:master@Tremblay) Sent
+> [  0.327551] (1:master@Tremblay) Sending "Task_2" to "Ginette"
+> [  0.327551] (4:slave@Fafard) Received "Task_1"
+> [  0.327551] (4:slave@Fafard) Processing "Task_1"
+> [  0.451283] (1:master@Tremblay) Sent
+> [  0.451283] (1:master@Tremblay) Sending "Task_3" to "Bourassa"
+> [  0.451283] (5:slave@Ginette) Received "Task_2"
+> [  0.451283] (5:slave@Ginette) Processing "Task_2"
+> [  0.583902] (1:master@Tremblay) Sent
+> [  0.583902] (1:master@Tremblay) Sending "Task_4" to "Tremblay"
+> [  0.583902] (1:master@Tremblay) Hey ! It's me ! :)
+> [  0.583902] (6:slave@Bourassa) Received "Task_3"
+> [  0.583902] (6:slave@Bourassa) Processing "Task_3"
+> [  0.586168] (1:master@Tremblay) Sent
+> [  0.586168] (1:master@Tremblay) Sending "Task_5" to "Jupiter"
+> [  0.586168] (2:slave@Tremblay) Received "Task_4"
+> [  0.586168] (2:slave@Tremblay) Processing "Task_4"
 > [  0.824497] (3:slave@Jupiter) "Task_0" done
+> [  0.982894] (4:slave@Fafard) "Task_1" done
 > [  0.993652] (1:master@Tremblay) Sent
 > [  0.993652] (1:master@Tremblay) Sending "Task_6" to "Fafard"
 > [  0.993652] (3:slave@Jupiter) Received "Task_5"
 > [  0.993652] (3:slave@Jupiter) Processing "Task_5"
-> [  1.047808] (4:slave@Fafard) "Task_1" done
-> [  1.269197] (2:slave@Tremblay) "Task_4" done
-> [  1.271118] (1:master@Tremblay) Sent
-> [  1.271118] (1:master@Tremblay) Sending "Task_7" to "Ginette"
-> [  1.271118] (4:slave@Fafard) Received "Task_6"
-> [  1.271118] (4:slave@Fafard) Processing "Task_6"
-> [  1.567343] (5:slave@Ginette) "Task_2" done
+> [  1.095878] (2:slave@Tremblay) "Task_4" done
+> [  1.152048] (1:master@Tremblay) Sent
+> [  1.152048] (1:master@Tremblay) Sending "Task_7" to "Ginette"
+> [  1.152048] (4:slave@Fafard) Received "Task_6"
+> [  1.152048] (4:slave@Fafard) Processing "Task_6"
+> [  1.482381] (5:slave@Ginette) "Task_2" done
+> [  1.606113] (1:master@Tremblay) Sent
+> [  1.606113] (1:master@Tremblay) Sending "Task_8" to "Bourassa"
+> [  1.606113] (5:slave@Ginette) Received "Task_7"
+> [  1.606113] (5:slave@Ginette) Processing "Task_7"
+> [  1.615000] (6:slave@Bourassa) "Task_3" done
 > [  1.648994] (3:slave@Jupiter) "Task_5" done
-> [  1.711124] (1:master@Tremblay) Sent
-> [  1.711124] (1:master@Tremblay) Sending "Task_8" to "Bourassa"
-> [  1.711124] (5:slave@Ginette) Received "Task_7"
-> [  1.711124] (5:slave@Ginette) Processing "Task_7"
-> [  1.788319] (6:slave@Bourassa) "Task_3" done
-> [  1.926461] (4:slave@Fafard) "Task_6" done
-> [  2.009295] (1:master@Tremblay) Sent
-> [  2.009295] (1:master@Tremblay) Sending "Task_9" to "Tremblay"
-> [  2.009295] (1:master@Tremblay) Hey ! It's me ! :)
-> [  2.009295] (6:slave@Bourassa) Received "Task_8"
-> [  2.009295] (6:slave@Bourassa) Processing "Task_8"
-> [  2.011560] (1:master@Tremblay) Sent
-> [  2.011560] (1:master@Tremblay) Sending "Task_10" to "Jupiter"
-> [  2.011560] (2:slave@Tremblay) Received "Task_9"
-> [  2.011560] (2:slave@Tremblay) Processing "Task_9"
-> [  2.180715] (1:master@Tremblay) Sent
-> [  2.180715] (1:master@Tremblay) Sending "Task_11" to "Fafard"
-> [  2.180715] (3:slave@Jupiter) Received "Task_10"
-> [  2.180715] (3:slave@Jupiter) Processing "Task_10"
-> [  2.404026] (1:master@Tremblay) Sent
-> [  2.404026] (1:master@Tremblay) Sending "Task_12" to "Ginette"
-> [  2.404026] (4:slave@Fafard) Received "Task_11"
-> [  2.404026] (4:slave@Fafard) Processing "Task_11"
-> [  2.521270] (2:slave@Tremblay) "Task_9" done
-> [  2.742222] (5:slave@Ginette) "Task_7" done
-> [  2.836057] (3:slave@Jupiter) "Task_10" done
-> [  2.886002] (1:master@Tremblay) Sent
-> [  2.886002] (1:master@Tremblay) Sending "Task_13" to "Bourassa"
-> [  2.886002] (5:slave@Ginette) Received "Task_12"
-> [  2.886002] (5:slave@Ginette) Processing "Task_12"
-> [  3.040393] (6:slave@Bourassa) "Task_8" done
-> [  3.059368] (4:slave@Fafard) "Task_11" done
-> [  3.261369] (1:master@Tremblay) Sent
-> [  3.261369] (1:master@Tremblay) Sending "Task_14" to "Tremblay"
-> [  3.261369] (1:master@Tremblay) Hey ! It's me ! :)
-> [  3.261369] (6:slave@Bourassa) Received "Task_13"
-> [  3.261369] (6:slave@Bourassa) Processing "Task_13"
-> [  3.263634] (1:master@Tremblay) Sent
-> [  3.263634] (1:master@Tremblay) Sending "Task_15" to "Jupiter"
-> [  3.263634] (2:slave@Tremblay) Received "Task_14"
-> [  3.263634] (2:slave@Tremblay) Processing "Task_14"
-> [  3.432789] (1:master@Tremblay) Sent
-> [  3.432789] (1:master@Tremblay) Sending "Task_16" to "Fafard"
-> [  3.432789] (3:slave@Jupiter) Received "Task_15"
-> [  3.432789] (3:slave@Jupiter) Processing "Task_15"
-> [  3.656099] (1:master@Tremblay) Sent
-> [  3.656099] (1:master@Tremblay) Sending "Task_17" to "Ginette"
-> [  3.656099] (4:slave@Fafard) Received "Task_16"
-> [  3.656099] (4:slave@Fafard) Processing "Task_16"
-> [  3.773344] (2:slave@Tremblay) "Task_14" done
-> [  3.917100] (5:slave@Ginette) "Task_12" done
-> [  4.060880] (1:master@Tremblay) Sent
-> [  4.060880] (1:master@Tremblay) Sending "Task_18" to "Bourassa"
-> [  4.060880] (5:slave@Ginette) Received "Task_17"
-> [  4.060880] (5:slave@Ginette) Processing "Task_17"
-> [  4.088131] (3:slave@Jupiter) "Task_15" done
-> [  4.292467] (6:slave@Bourassa) "Task_13" done
-> [  4.311442] (4:slave@Fafard) "Task_16" done
-> [  4.513442] (1:master@Tremblay) Sent
-> [  4.513442] (1:master@Tremblay) Sending "Task_19" to "Tremblay"
-> [  4.513442] (1:master@Tremblay) Hey ! It's me ! :)
-> [  4.513442] (6:slave@Bourassa) Received "Task_18"
-> [  4.513442] (6:slave@Bourassa) Processing "Task_18"
-> [  4.515708] (1:master@Tremblay) Sent
-> [  4.515708] (1:master@Tremblay) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [  4.515708] (2:slave@Tremblay) Received "Task_19"
-> [  4.515708] (2:slave@Tremblay) Processing "Task_19"
-> [  4.534722] (3:slave@Jupiter) Received "finalize"
-> [  4.534722] (3:slave@Jupiter) I'm done. See you!
-> [  4.560430] (4:slave@Fafard) Received "finalize"
-> [  4.560430] (4:slave@Fafard) I'm done. See you!
-> [  5.025418] (2:slave@Tremblay) "Task_19" done
-> [  5.091978] (5:slave@Ginette) "Task_17" done
-> [  5.108530] (5:slave@Ginette) Received "finalize"
-> [  5.108530] (5:slave@Ginette) I'm done. See you!
-> [  5.544540] (6:slave@Bourassa) "Task_18" done
-> [  5.569980] (6:slave@Bourassa) Received "finalize"
-> [  5.569980] (6:slave@Bourassa) I'm done. See you!
-> [  5.570175] (0:@) Simulation time 5.57017
-> [  5.570175] (1:master@Tremblay) Goodbye now!
-> [  5.570175] (2:slave@Tremblay) Received "finalize"
-> [  5.570175] (2:slave@Tremblay) I'm done. See you!
+> [  1.747619] (1:master@Tremblay) Sent
+> [  1.747619] (1:master@Tremblay) Sending "Task_9" to "Tremblay"
+> [  1.747619] (1:master@Tremblay) Hey ! It's me ! :)
+> [  1.747619] (6:slave@Bourassa) Received "Task_8"
+> [  1.747619] (6:slave@Bourassa) Processing "Task_8"
+> [  1.749885] (1:master@Tremblay) Sent
+> [  1.749885] (1:master@Tremblay) Sending "Task_10" to "Jupiter"
+> [  1.749885] (2:slave@Tremblay) Received "Task_9"
+> [  1.749885] (2:slave@Tremblay) Processing "Task_9"
+> [  1.807391] (4:slave@Fafard) "Task_6" done
+> [  1.919039] (1:master@Tremblay) Sent
+> [  1.919039] (1:master@Tremblay) Sending "Task_11" to "Fafard"
+> [  1.919039] (3:slave@Jupiter) Received "Task_10"
+> [  1.919039] (3:slave@Jupiter) Processing "Task_10"
+> [  2.077436] (1:master@Tremblay) Sent
+> [  2.077436] (1:master@Tremblay) Sending "Task_12" to "Ginette"
+> [  2.077436] (4:slave@Fafard) Received "Task_11"
+> [  2.077436] (4:slave@Fafard) Processing "Task_11"
+> [  2.259594] (2:slave@Tremblay) "Task_9" done
+> [  2.574382] (3:slave@Jupiter) "Task_10" done
+> [  2.637211] (5:slave@Ginette) "Task_7" done
+> [  2.732778] (4:slave@Fafard) "Task_11" done
+> [  2.760943] (1:master@Tremblay) Sent
+> [  2.760943] (1:master@Tremblay) Sending "Task_13" to "Bourassa"
+> [  2.760943] (5:slave@Ginette) Received "Task_12"
+> [  2.760943] (5:slave@Ginette) Processing "Task_12"
+> [  2.778717] (6:slave@Bourassa) "Task_8" done
+> [  2.911336] (1:master@Tremblay) Sent
+> [  2.911336] (1:master@Tremblay) Sending "Task_14" to "Tremblay"
+> [  2.911336] (1:master@Tremblay) Hey ! It's me ! :)
+> [  2.911336] (6:slave@Bourassa) Received "Task_13"
+> [  2.911336] (6:slave@Bourassa) Processing "Task_13"
+> [  2.913601] (1:master@Tremblay) Sent
+> [  2.913601] (1:master@Tremblay) Sending "Task_15" to "Jupiter"
+> [  2.913601] (2:slave@Tremblay) Received "Task_14"
+> [  2.913601] (2:slave@Tremblay) Processing "Task_14"
+> [  3.082756] (1:master@Tremblay) Sent
+> [  3.082756] (1:master@Tremblay) Sending "Task_16" to "Fafard"
+> [  3.082756] (3:slave@Jupiter) Received "Task_15"
+> [  3.082756] (3:slave@Jupiter) Processing "Task_15"
+> [  3.241153] (1:master@Tremblay) Sent
+> [  3.241153] (1:master@Tremblay) Sending "Task_17" to "Ginette"
+> [  3.241153] (4:slave@Fafard) Received "Task_16"
+> [  3.241153] (4:slave@Fafard) Processing "Task_16"
+> [  3.423311] (2:slave@Tremblay) "Task_14" done
+> [  3.738098] (3:slave@Jupiter) "Task_15" done
+> [  3.792041] (5:slave@Ginette) "Task_12" done
+> [  3.896495] (4:slave@Fafard) "Task_16" done
+> [  3.915773] (1:master@Tremblay) Sent
+> [  3.915773] (1:master@Tremblay) Sending "Task_18" to "Bourassa"
+> [  3.915773] (5:slave@Ginette) Received "Task_17"
+> [  3.915773] (5:slave@Ginette) Processing "Task_17"
+> [  3.942434] (6:slave@Bourassa) "Task_13" done
+> [  4.075053] (1:master@Tremblay) Sent
+> [  4.075053] (1:master@Tremblay) Sending "Task_19" to "Tremblay"
+> [  4.075053] (1:master@Tremblay) Hey ! It's me ! :)
+> [  4.075053] (6:slave@Bourassa) Received "Task_18"
+> [  4.075053] (6:slave@Bourassa) Processing "Task_18"
+> [  4.077318] (1:master@Tremblay) Sent
+> [  4.077318] (1:master@Tremblay) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [  4.077318] (2:slave@Tremblay) Received "Task_19"
+> [  4.077318] (2:slave@Tremblay) Processing "Task_19"
+> [  4.096333] (3:slave@Jupiter) Received "finalize"
+> [  4.096333] (3:slave@Jupiter) I'm done. See you!
+> [  4.122041] (4:slave@Fafard) Received "finalize"
+> [  4.122041] (4:slave@Fafard) I'm done. See you!
+> [  4.587028] (2:slave@Tremblay) "Task_19" done
+> [  4.946871] (5:slave@Ginette) "Task_17" done
+> [  4.963423] (5:slave@Ginette) Received "finalize"
+> [  4.963423] (5:slave@Ginette) I'm done. See you!
+> [  5.106151] (6:slave@Bourassa) "Task_18" done
+> [  5.131590] (6:slave@Bourassa) Received "finalize"
+> [  5.131590] (6:slave@Bourassa) I'm done. See you!
+> [  5.131785] (0:@) Simulation time 5.13179
+> [  5.131785] (1:master@Tremblay) Goodbye now!
+> [  5.131785] (2:slave@Tremblay) Received "finalize"
+> [  5.131785] (2:slave@Tremblay) I'm done. See you!
+
 
 p Testing a master/slave example application with a forwarder module
 
@@ -131,148 +132,149 @@ $ $SG_TEST_EXENV ${bindir:=.}/masterslave_forwarder$EXEEXT msg_platform.xml mast
 > [  0.000000] (0:@) Configuration change: Set 'cpu/optim' to 'TI'
 > [  0.000000] (1:master@Jacquelin) Got 5 slaves and 20 tasks to process
 > [  0.000000] (1:master@Jacquelin) Sending "Task_0" to "iRMX"
-> [  5.383133] (1:master@Jacquelin) Sent
-> [  5.383133] (1:master@Jacquelin) Sending "Task_1" to "Casavant"
-> [  5.383133] (4:slave@iRMX) Received "Task_0"
-> [  5.383133] (4:slave@iRMX) Processing "Task_0"
-> [  5.455948] (4:slave@iRMX) "Task_0" done
-> [  7.783190] (1:master@Jacquelin) Sent
-> [  7.783190] (1:master@Jacquelin) Sending "Task_2" to "Bousquet"
-> [  7.783190] (3:forwarder@Casavant) Received "Task_1"
-> [  7.783190] (3:forwarder@Casavant) Sending "Task_1" to "Robert"
-> [  9.577790] (1:master@Jacquelin) Sent
-> [  9.577790] (1:master@Jacquelin) Sending "Task_3" to "Soucy"
-> [  9.577790] (5:slave@Bousquet) Received "Task_2"
-> [  9.577790] (5:slave@Bousquet) Processing "Task_2"
-> [  9.694294] (5:slave@Bousquet) "Task_2" done
-> [ 10.445354] (10:slave@Robert) Received "Task_1"
-> [ 10.445354] (10:slave@Robert) Processing "Task_1"
-> [ 10.481762] (10:slave@Robert) "Task_1" done
-> [ 12.131151] (1:master@Jacquelin) Sent
-> [ 12.131151] (1:master@Jacquelin) Sending "Task_4" to "Jackson"
-> [ 12.131151] (6:slave@Soucy) Received "Task_3"
-> [ 12.131151] (6:slave@Soucy) Processing "Task_3"
-> [ 12.167558] (6:slave@Soucy) "Task_3" done
-> [ 13.637082] (1:master@Jacquelin) Sent
-> [ 13.637082] (1:master@Jacquelin) Sending "Task_5" to "iRMX"
-> [ 13.637082] (2:forwarder@Jackson) Received "Task_4"
-> [ 13.637082] (2:forwarder@Jackson) Sending "Task_4" to "Kuenning"
-> [ 13.721552] (7:slave@Kuenning) Received "Task_4"
-> [ 13.721552] (7:slave@Kuenning) Processing "Task_4"
-> [ 13.779805] (7:slave@Kuenning) "Task_4" done
-> [ 19.020215] (1:master@Jacquelin) Sent
-> [ 19.020215] (1:master@Jacquelin) Sending "Task_6" to "Casavant"
-> [ 19.020215] (4:slave@iRMX) Received "Task_5"
-> [ 19.020215] (4:slave@iRMX) Processing "Task_5"
-> [ 19.093030] (4:slave@iRMX) "Task_5" done
-> [ 21.420272] (1:master@Jacquelin) Sent
-> [ 21.420272] (1:master@Jacquelin) Sending "Task_7" to "Bousquet"
-> [ 21.420272] (3:forwarder@Casavant) Received "Task_6"
-> [ 21.420272] (3:forwarder@Casavant) Sending "Task_6" to "Sirois"
-> [ 22.325670] (11:slave@Sirois) Received "Task_6"
-> [ 22.325670] (11:slave@Sirois) Processing "Task_6"
-> [ 22.369360] (11:slave@Sirois) "Task_6" done
-> [ 23.214872] (1:master@Jacquelin) Sent
-> [ 23.214872] (1:master@Jacquelin) Sending "Task_8" to "Soucy"
-> [ 23.214872] (5:slave@Bousquet) Received "Task_7"
-> [ 23.214872] (5:slave@Bousquet) Processing "Task_7"
-> [ 23.331376] (5:slave@Bousquet) "Task_7" done
-> [ 25.768233] (1:master@Jacquelin) Sent
-> [ 25.768233] (1:master@Jacquelin) Sending "Task_9" to "Jackson"
-> [ 25.768233] (6:slave@Soucy) Received "Task_8"
-> [ 25.768233] (6:slave@Soucy) Processing "Task_8"
-> [ 25.804640] (6:slave@Soucy) "Task_8" done
-> [ 27.274164] (1:master@Jacquelin) Sent
-> [ 27.274164] (1:master@Jacquelin) Sending "Task_10" to "iRMX"
-> [ 27.274164] (2:forwarder@Jackson) Received "Task_9"
-> [ 27.274164] (2:forwarder@Jackson) Sending "Task_9" to "Browne"
-> [ 30.465613] (8:slave@Browne) Received "Task_9"
-> [ 30.465613] (8:slave@Browne) Processing "Task_9"
-> [ 30.502021] (8:slave@Browne) "Task_9" done
-> [ 32.657297] (1:master@Jacquelin) Sent
-> [ 32.657297] (1:master@Jacquelin) Sending "Task_11" to "Casavant"
-> [ 32.657297] (4:slave@iRMX) Received "Task_10"
-> [ 32.657297] (4:slave@iRMX) Processing "Task_10"
-> [ 32.730112] (4:slave@iRMX) "Task_10" done
-> [ 35.057354] (1:master@Jacquelin) Sent
-> [ 35.057354] (1:master@Jacquelin) Sending "Task_12" to "Bousquet"
-> [ 35.057354] (3:forwarder@Casavant) Received "Task_11"
-> [ 35.057354] (3:forwarder@Casavant) Sending "Task_11" to "Monique"
-> [ 36.626996] (12:slave@Monique) Received "Task_11"
-> [ 36.626996] (12:slave@Monique) Processing "Task_11"
-> [ 36.670685] (12:slave@Monique) "Task_11" done
-> [ 36.851954] (1:master@Jacquelin) Sent
-> [ 36.851954] (1:master@Jacquelin) Sending "Task_13" to "Soucy"
-> [ 36.851954] (5:slave@Bousquet) Received "Task_12"
-> [ 36.851954] (5:slave@Bousquet) Processing "Task_12"
-> [ 36.968458] (5:slave@Bousquet) "Task_12" done
-> [ 39.405315] (1:master@Jacquelin) Sent
-> [ 39.405315] (1:master@Jacquelin) Sending "Task_14" to "Jackson"
-> [ 39.405315] (6:slave@Soucy) Received "Task_13"
-> [ 39.405315] (6:slave@Soucy) Processing "Task_13"
-> [ 39.441723] (6:slave@Soucy) "Task_13" done
-> [ 40.911246] (1:master@Jacquelin) Sent
-> [ 40.911246] (1:master@Jacquelin) Sending "Task_15" to "iRMX"
-> [ 40.911246] (2:forwarder@Jackson) Received "Task_14"
-> [ 40.911246] (2:forwarder@Jackson) Sending "Task_14" to "Stephen"
-> [ 45.690949] (9:slave@Stephen) Received "Task_14"
-> [ 45.690949] (9:slave@Stephen) Processing "Task_14"
-> [ 45.763764] (9:slave@Stephen) "Task_14" done
-> [ 46.294379] (1:master@Jacquelin) Sent
-> [ 46.294379] (1:master@Jacquelin) Sending "Task_16" to "Casavant"
-> [ 46.294379] (4:slave@iRMX) Received "Task_15"
-> [ 46.294379] (4:slave@iRMX) Processing "Task_15"
-> [ 46.367194] (4:slave@iRMX) "Task_15" done
-> [ 48.694436] (1:master@Jacquelin) Sent
-> [ 48.694436] (1:master@Jacquelin) Sending "Task_17" to "Bousquet"
-> [ 48.694436] (3:forwarder@Casavant) Received "Task_16"
-> [ 48.694436] (3:forwarder@Casavant) Sending "Task_16" to "Robert"
-> [ 50.489036] (1:master@Jacquelin) Sent
-> [ 50.489036] (1:master@Jacquelin) Sending "Task_18" to "Soucy"
-> [ 50.489036] (5:slave@Bousquet) Received "Task_17"
-> [ 50.489036] (5:slave@Bousquet) Processing "Task_17"
-> [ 50.605540] (5:slave@Bousquet) "Task_17" done
-> [ 51.356600] (10:slave@Robert) Received "Task_16"
-> [ 51.356600] (10:slave@Robert) Processing "Task_16"
-> [ 51.393008] (10:slave@Robert) "Task_16" done
-> [ 53.042397] (1:master@Jacquelin) Sent
-> [ 53.042397] (1:master@Jacquelin) Sending "Task_19" to "Jackson"
-> [ 53.042397] (6:slave@Soucy) Received "Task_18"
-> [ 53.042397] (6:slave@Soucy) Processing "Task_18"
-> [ 53.078805] (6:slave@Soucy) "Task_18" done
-> [ 54.548328] (1:master@Jacquelin) Sent
-> [ 54.548328] (1:master@Jacquelin) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [ 54.548328] (2:forwarder@Jackson) Received "Task_19"
-> [ 54.548328] (2:forwarder@Jackson) Sending "Task_19" to "Kuenning"
-> [ 54.632799] (7:slave@Kuenning) Received "Task_19"
-> [ 54.632799] (7:slave@Kuenning) Processing "Task_19"
-> [ 54.691051] (7:slave@Kuenning) "Task_19" done
-> [ 57.591986] (4:slave@iRMX) Received "finalize"
-> [ 57.591986] (4:slave@iRMX) I'm done. See you!
-> [ 58.948993] (3:forwarder@Casavant) Received "finalize"
-> [ 58.948993] (3:forwarder@Casavant) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [ 59.963672] (5:slave@Bousquet) Received "finalize"
-> [ 59.963672] (5:slave@Bousquet) I'm done. See you!
-> [ 60.454198] (10:slave@Robert) Received "finalize"
-> [ 60.454198] (10:slave@Robert) I'm done. See you!
-> [ 60.966116] (11:slave@Sirois) Received "finalize"
-> [ 60.966116] (11:slave@Sirois) I'm done. See you!
-> [ 61.407358] (6:slave@Soucy) Received "finalize"
-> [ 61.407358] (6:slave@Soucy) I'm done. See you!
-> [ 61.853601] (12:slave@Monique) Received "finalize"
-> [ 61.853601] (12:slave@Monique) I'm done. See you!
-> [ 61.853601] (3:forwarder@Casavant) I'm done. See you!
-> [ 62.258821] (1:master@Jacquelin) Goodbye now!
-> [ 62.258821] (2:forwarder@Jackson) Received "finalize"
-> [ 62.258821] (2:forwarder@Jackson) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [ 62.264666] (7:slave@Kuenning) Received "finalize"
-> [ 62.264666] (7:slave@Kuenning) I'm done. See you!
-> [ 64.069131] (8:slave@Browne) Received "finalize"
-> [ 64.069131] (8:slave@Browne) I'm done. See you!
-> [ 66.771606] (0:@) Simulation time 66.7716
-> [ 66.771606] (2:forwarder@Jackson) I'm done. See you!
-> [ 66.771606] (9:slave@Stephen) Received "finalize"
-> [ 66.771606] (9:slave@Stephen) I'm done. See you!
+> [  3.222579] (1:master@Jacquelin) Sent
+> [  3.222579] (1:master@Jacquelin) Sending "Task_1" to "Casavant"
+> [  3.222579] (4:slave@iRMX) Received "Task_0"
+> [  3.222579] (4:slave@iRMX) Processing "Task_0"
+> [  3.295394] (4:slave@iRMX) "Task_0" done
+> [  4.648793] (1:master@Jacquelin) Sent
+> [  4.648793] (1:master@Jacquelin) Sending "Task_2" to "Bousquet"
+> [  4.648793] (3:forwarder@Casavant) Received "Task_1"
+> [  4.648793] (3:forwarder@Casavant) Sending "Task_1" to "Robert"
+> [  5.858161] (1:master@Jacquelin) Sent
+> [  5.858161] (1:master@Jacquelin) Sending "Task_3" to "Soucy"
+> [  5.858161] (5:slave@Bousquet) Received "Task_2"
+> [  5.858161] (5:slave@Bousquet) Processing "Task_2"
+> [  5.974665] (5:slave@Bousquet) "Task_2" done
+> [  6.227754] (10:slave@Robert) Received "Task_1"
+> [  6.227754] (10:slave@Robert) Processing "Task_1"
+> [  6.264162] (10:slave@Robert) "Task_1" done
+> [  7.375604] (1:master@Jacquelin) Sent
+> [  7.375604] (1:master@Jacquelin) Sending "Task_4" to "Jackson"
+> [  7.375604] (6:slave@Soucy) Received "Task_3"
+> [  7.375604] (6:slave@Soucy) Processing "Task_3"
+> [  7.412012] (6:slave@Soucy) "Task_3" done
+> [  8.268969] (1:master@Jacquelin) Sent
+> [  8.268969] (1:master@Jacquelin) Sending "Task_5" to "iRMX"
+> [  8.268969] (2:forwarder@Jackson) Received "Task_4"
+> [  8.268969] (2:forwarder@Jackson) Sending "Task_4" to "Kuenning"
+> [  8.353439] (7:slave@Kuenning) Received "Task_4"
+> [  8.353439] (7:slave@Kuenning) Processing "Task_4"
+> [  8.411691] (7:slave@Kuenning) "Task_4" done
+> [ 11.491547] (1:master@Jacquelin) Sent
+> [ 11.491547] (1:master@Jacquelin) Sending "Task_6" to "Casavant"
+> [ 11.491547] (4:slave@iRMX) Received "Task_5"
+> [ 11.491547] (4:slave@iRMX) Processing "Task_5"
+> [ 11.564363] (4:slave@iRMX) "Task_5" done
+> [ 12.917761] (1:master@Jacquelin) Sent
+> [ 12.917761] (1:master@Jacquelin) Sending "Task_7" to "Bousquet"
+> [ 12.917761] (3:forwarder@Casavant) Received "Task_6"
+> [ 12.917761] (3:forwarder@Casavant) Sending "Task_6" to "Sirois"
+> [ 13.503436] (11:slave@Sirois) Received "Task_6"
+> [ 13.503436] (11:slave@Sirois) Processing "Task_6"
+> [ 13.547126] (11:slave@Sirois) "Task_6" done
+> [ 14.127129] (1:master@Jacquelin) Sent
+> [ 14.127129] (1:master@Jacquelin) Sending "Task_8" to "Soucy"
+> [ 14.127129] (5:slave@Bousquet) Received "Task_7"
+> [ 14.127129] (5:slave@Bousquet) Processing "Task_7"
+> [ 14.243633] (5:slave@Bousquet) "Task_7" done
+> [ 15.644572] (1:master@Jacquelin) Sent
+> [ 15.644572] (1:master@Jacquelin) Sending "Task_9" to "Jackson"
+> [ 15.644572] (6:slave@Soucy) Received "Task_8"
+> [ 15.644572] (6:slave@Soucy) Processing "Task_8"
+> [ 15.680980] (6:slave@Soucy) "Task_8" done
+> [ 16.537937] (1:master@Jacquelin) Sent
+> [ 16.537937] (1:master@Jacquelin) Sending "Task_10" to "iRMX"
+> [ 16.537937] (2:forwarder@Jackson) Received "Task_9"
+> [ 16.537937] (2:forwarder@Jackson) Sending "Task_9" to "Browne"
+> [ 18.357416] (8:slave@Browne) Received "Task_9"
+> [ 18.357416] (8:slave@Browne) Processing "Task_9"
+> [ 18.393824] (8:slave@Browne) "Task_9" done
+> [ 19.760516] (1:master@Jacquelin) Sent
+> [ 19.760516] (1:master@Jacquelin) Sending "Task_11" to "Casavant"
+> [ 19.760516] (4:slave@iRMX) Received "Task_10"
+> [ 19.760516] (4:slave@iRMX) Processing "Task_10"
+> [ 19.833331] (4:slave@iRMX) "Task_10" done
+> [ 21.186730] (1:master@Jacquelin) Sent
+> [ 21.186730] (1:master@Jacquelin) Sending "Task_12" to "Bousquet"
+> [ 21.186730] (3:forwarder@Casavant) Received "Task_11"
+> [ 21.186730] (3:forwarder@Casavant) Sending "Task_11" to "Monique"
+> [ 22.143422] (12:slave@Monique) Received "Task_11"
+> [ 22.143422] (12:slave@Monique) Processing "Task_11"
+> [ 22.187111] (12:slave@Monique) "Task_11" done
+> [ 22.396098] (1:master@Jacquelin) Sent
+> [ 22.396098] (1:master@Jacquelin) Sending "Task_13" to "Soucy"
+> [ 22.396098] (5:slave@Bousquet) Received "Task_12"
+> [ 22.396098] (5:slave@Bousquet) Processing "Task_12"
+> [ 22.512602] (5:slave@Bousquet) "Task_12" done
+> [ 23.913541] (1:master@Jacquelin) Sent
+> [ 23.913541] (1:master@Jacquelin) Sending "Task_14" to "Jackson"
+> [ 23.913541] (6:slave@Soucy) Received "Task_13"
+> [ 23.913541] (6:slave@Soucy) Processing "Task_13"
+> [ 23.949949] (6:slave@Soucy) "Task_13" done
+> [ 24.806906] (1:master@Jacquelin) Sent
+> [ 24.806906] (1:master@Jacquelin) Sending "Task_15" to "iRMX"
+> [ 24.806906] (2:forwarder@Jackson) Received "Task_14"
+> [ 24.806906] (2:forwarder@Jackson) Sending "Task_14" to "Stephen"
+> [ 27.882486] (9:slave@Stephen) Received "Task_14"
+> [ 27.882486] (9:slave@Stephen) Processing "Task_14"
+> [ 27.955301] (9:slave@Stephen) "Task_14" done
+> [ 28.029484] (1:master@Jacquelin) Sent
+> [ 28.029484] (1:master@Jacquelin) Sending "Task_16" to "Casavant"
+> [ 28.029484] (4:slave@iRMX) Received "Task_15"
+> [ 28.029484] (4:slave@iRMX) Processing "Task_15"
+> [ 28.102300] (4:slave@iRMX) "Task_15" done
+> [ 29.455698] (1:master@Jacquelin) Sent
+> [ 29.455698] (1:master@Jacquelin) Sending "Task_17" to "Bousquet"
+> [ 29.455698] (3:forwarder@Casavant) Received "Task_16"
+> [ 29.455698] (3:forwarder@Casavant) Sending "Task_16" to "Robert"
+> [ 30.665066] (1:master@Jacquelin) Sent
+> [ 30.665066] (1:master@Jacquelin) Sending "Task_18" to "Soucy"
+> [ 30.665066] (5:slave@Bousquet) Received "Task_17"
+> [ 30.665066] (5:slave@Bousquet) Processing "Task_17"
+> [ 30.781570] (5:slave@Bousquet) "Task_17" done
+> [ 31.034660] (10:slave@Robert) Received "Task_16"
+> [ 31.034660] (10:slave@Robert) Processing "Task_16"
+> [ 31.071067] (10:slave@Robert) "Task_16" done
+> [ 32.182509] (1:master@Jacquelin) Sent
+> [ 32.182509] (1:master@Jacquelin) Sending "Task_19" to "Jackson"
+> [ 32.182509] (6:slave@Soucy) Received "Task_18"
+> [ 32.182509] (6:slave@Soucy) Processing "Task_18"
+> [ 32.218917] (6:slave@Soucy) "Task_18" done
+> [ 33.075874] (1:master@Jacquelin) Sent
+> [ 33.075874] (1:master@Jacquelin) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [ 33.075874] (2:forwarder@Jackson) Received "Task_19"
+> [ 33.075874] (2:forwarder@Jackson) Sending "Task_19" to "Kuenning"
+> [ 33.160344] (7:slave@Kuenning) Received "Task_19"
+> [ 33.160344] (7:slave@Kuenning) Processing "Task_19"
+> [ 33.218597] (7:slave@Kuenning) "Task_19" done
+> [ 36.119532] (4:slave@iRMX) Received "finalize"
+> [ 36.119532] (4:slave@iRMX) I'm done. See you!
+> [ 37.476539] (3:forwarder@Casavant) Received "finalize"
+> [ 37.476539] (3:forwarder@Casavant) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [ 38.491217] (5:slave@Bousquet) Received "finalize"
+> [ 38.491217] (5:slave@Bousquet) I'm done. See you!
+> [ 38.981743] (10:slave@Robert) Received "finalize"
+> [ 38.981743] (10:slave@Robert) I'm done. See you!
+> [ 39.493662] (11:slave@Sirois) Received "finalize"
+> [ 39.493662] (11:slave@Sirois) I'm done. See you!
+> [ 39.934903] (6:slave@Soucy) Received "finalize"
+> [ 39.934903] (6:slave@Soucy) I'm done. See you!
+> [ 40.381147] (12:slave@Monique) Received "finalize"
+> [ 40.381147] (12:slave@Monique) I'm done. See you!
+> [ 40.381147] (3:forwarder@Casavant) I'm done. See you!
+> [ 40.786367] (1:master@Jacquelin) Goodbye now!
+> [ 40.786367] (2:forwarder@Jackson) Received "finalize"
+> [ 40.786367] (2:forwarder@Jackson) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [ 40.792212] (7:slave@Kuenning) Received "finalize"
+> [ 40.792212] (7:slave@Kuenning) I'm done. See you!
+> [ 42.596677] (8:slave@Browne) Received "finalize"
+> [ 42.596677] (8:slave@Browne) I'm done. See you!
+> [ 45.299152] (0:@) Simulation time 45.2992
+> [ 45.299152] (2:forwarder@Jackson) I'm done. See you!
+> [ 45.299152] (9:slave@Stephen) Received "finalize"
+> [ 45.299152] (9:slave@Stephen) I'm done. See you!
+
 
 p Testing a simple master/slave example application handling failures
 
@@ -403,107 +405,107 @@ $ $SG_TEST_EXENV ${bindir:=.}/masterslave_bypass --log=no_loc --cfg=cpu/optim:TI
 > [  0.000000] (1:master@host A)       "Task_19"
 > [  0.000000] (1:master@host A) Sending "Task_0" to "host B"
 > [  0.000000] (2:slave@host B) I'm a slave
-> [  4.602000] (1:master@host A) Send completed
-> [  4.602000] (1:master@host A) Sending "Task_1" to "host B"
-> [  4.602000] (2:slave@host B) Received "Task_0" 
-> [  4.602000] (2:slave@host B) Processing "Task_0" 
-> [  4.652000] (2:slave@host B) "Task_0" done 
-> [  9.254000] (1:master@host A) Send completed
-> [  9.254000] (1:master@host A) Sending "Task_2" to "host B"
-> [  9.254000] (2:slave@host B) Received "Task_1" 
-> [  9.254000] (2:slave@host B) Processing "Task_1" 
-> [  9.304000] (2:slave@host B) "Task_1" done 
-> [ 13.906000] (1:master@host A) Send completed
-> [ 13.906000] (1:master@host A) Sending "Task_3" to "host B"
-> [ 13.906000] (2:slave@host B) Received "Task_2" 
-> [ 13.906000] (2:slave@host B) Processing "Task_2" 
-> [ 13.956000] (2:slave@host B) "Task_2" done 
-> [ 18.558000] (1:master@host A) Send completed
-> [ 18.558000] (1:master@host A) Sending "Task_4" to "host B"
-> [ 18.558000] (2:slave@host B) Received "Task_3" 
-> [ 18.558000] (2:slave@host B) Processing "Task_3" 
-> [ 18.608000] (2:slave@host B) "Task_3" done 
-> [ 23.210000] (1:master@host A) Send completed
-> [ 23.210000] (1:master@host A) Sending "Task_5" to "host B"
-> [ 23.210000] (2:slave@host B) Received "Task_4" 
-> [ 23.210000] (2:slave@host B) Processing "Task_4" 
-> [ 23.260000] (2:slave@host B) "Task_4" done 
-> [ 27.862000] (1:master@host A) Send completed
-> [ 27.862000] (1:master@host A) Sending "Task_6" to "host B"
-> [ 27.862000] (2:slave@host B) Received "Task_5" 
-> [ 27.862000] (2:slave@host B) Processing "Task_5" 
-> [ 27.912000] (2:slave@host B) "Task_5" done 
-> [ 32.514000] (1:master@host A) Send completed
-> [ 32.514000] (1:master@host A) Sending "Task_7" to "host B"
-> [ 32.514000] (2:slave@host B) Received "Task_6" 
-> [ 32.514000] (2:slave@host B) Processing "Task_6" 
-> [ 32.564000] (2:slave@host B) "Task_6" done 
-> [ 37.166000] (1:master@host A) Send completed
-> [ 37.166000] (1:master@host A) Sending "Task_8" to "host B"
-> [ 37.166000] (2:slave@host B) Received "Task_7" 
-> [ 37.166000] (2:slave@host B) Processing "Task_7" 
-> [ 37.216000] (2:slave@host B) "Task_7" done 
-> [ 41.818000] (1:master@host A) Send completed
-> [ 41.818000] (1:master@host A) Sending "Task_9" to "host B"
-> [ 41.818000] (2:slave@host B) Received "Task_8" 
-> [ 41.818000] (2:slave@host B) Processing "Task_8" 
-> [ 41.868000] (2:slave@host B) "Task_8" done 
-> [ 46.470000] (1:master@host A) Send completed
-> [ 46.470000] (1:master@host A) Sending "Task_10" to "host B"
-> [ 46.470000] (2:slave@host B) Received "Task_9" 
-> [ 46.470000] (2:slave@host B) Processing "Task_9" 
-> [ 46.520000] (2:slave@host B) "Task_9" done 
-> [ 51.122000] (1:master@host A) Send completed
-> [ 51.122000] (1:master@host A) Sending "Task_11" to "host B"
-> [ 51.122000] (2:slave@host B) Received "Task_10" 
-> [ 51.122000] (2:slave@host B) Processing "Task_10" 
-> [ 51.172000] (2:slave@host B) "Task_10" done 
-> [ 55.774000] (1:master@host A) Send completed
-> [ 55.774000] (1:master@host A) Sending "Task_12" to "host B"
-> [ 55.774000] (2:slave@host B) Received "Task_11" 
-> [ 55.774000] (2:slave@host B) Processing "Task_11" 
-> [ 55.824000] (2:slave@host B) "Task_11" done 
-> [ 60.426000] (1:master@host A) Send completed
-> [ 60.426000] (1:master@host A) Sending "Task_13" to "host B"
-> [ 60.426000] (2:slave@host B) Received "Task_12" 
-> [ 60.426000] (2:slave@host B) Processing "Task_12" 
-> [ 60.476000] (2:slave@host B) "Task_12" done 
-> [ 65.078000] (1:master@host A) Send completed
-> [ 65.078000] (1:master@host A) Sending "Task_14" to "host B"
-> [ 65.078000] (2:slave@host B) Received "Task_13" 
-> [ 65.078000] (2:slave@host B) Processing "Task_13" 
-> [ 65.128000] (2:slave@host B) "Task_13" done 
-> [ 69.730000] (1:master@host A) Send completed
-> [ 69.730000] (1:master@host A) Sending "Task_15" to "host B"
-> [ 69.730000] (2:slave@host B) Received "Task_14" 
-> [ 69.730000] (2:slave@host B) Processing "Task_14" 
-> [ 69.780000] (2:slave@host B) "Task_14" done 
-> [ 74.382000] (1:master@host A) Send completed
-> [ 74.382000] (1:master@host A) Sending "Task_16" to "host B"
-> [ 74.382000] (2:slave@host B) Received "Task_15" 
-> [ 74.382000] (2:slave@host B) Processing "Task_15" 
-> [ 74.432000] (2:slave@host B) "Task_15" done 
-> [ 79.034000] (1:master@host A) Send completed
-> [ 79.034000] (1:master@host A) Sending "Task_17" to "host B"
-> [ 79.034000] (2:slave@host B) Received "Task_16" 
-> [ 79.034000] (2:slave@host B) Processing "Task_16" 
-> [ 79.084000] (2:slave@host B) "Task_16" done 
-> [ 83.686000] (1:master@host A) Send completed
-> [ 83.686000] (1:master@host A) Sending "Task_18" to "host B"
-> [ 83.686000] (2:slave@host B) Received "Task_17" 
-> [ 83.686000] (2:slave@host B) Processing "Task_17" 
-> [ 83.736000] (2:slave@host B) "Task_17" done 
-> [ 88.338000] (1:master@host A) Send completed
-> [ 88.338000] (1:master@host A) Sending "Task_19" to "host B"
-> [ 88.338000] (2:slave@host B) Received "Task_18" 
-> [ 88.338000] (2:slave@host B) Processing "Task_18" 
-> [ 88.388000] (2:slave@host B) "Task_18" done 
-> [ 92.990000] (1:master@host A) Send completed
-> [ 92.990000] (1:master@host A) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [ 92.990000] (2:slave@host B) Received "Task_19" 
-> [ 92.990000] (2:slave@host B) Processing "Task_19" 
-> [ 93.040000] (2:slave@host B) "Task_19" done 
-> [ 95.642000] (0:@) Simulation time 95.642
-> [ 95.642000] (1:master@host A) Goodbye now!
-> [ 95.642000] (2:slave@host B) Received "finalize" 
-> [ 95.642000] (2:slave@host B) I'm done. See you!
+> [  2.612825] (1:master@host A) Send completed
+> [  2.612825] (1:master@host A) Sending "Task_1" to "host B"
+> [  2.612825] (2:slave@host B) Received "Task_0" 
+> [  2.612825] (2:slave@host B) Processing "Task_0" 
+> [  2.662825] (2:slave@host B) "Task_0" done 
+> [  5.275649] (1:master@host A) Send completed
+> [  5.275649] (1:master@host A) Sending "Task_2" to "host B"
+> [  5.275649] (2:slave@host B) Received "Task_1" 
+> [  5.275649] (2:slave@host B) Processing "Task_1" 
+> [  5.325649] (2:slave@host B) "Task_1" done 
+> [  7.938474] (1:master@host A) Send completed
+> [  7.938474] (1:master@host A) Sending "Task_3" to "host B"
+> [  7.938474] (2:slave@host B) Received "Task_2" 
+> [  7.938474] (2:slave@host B) Processing "Task_2" 
+> [  7.988474] (2:slave@host B) "Task_2" done 
+> [ 10.601299] (1:master@host A) Send completed
+> [ 10.601299] (1:master@host A) Sending "Task_4" to "host B"
+> [ 10.601299] (2:slave@host B) Received "Task_3" 
+> [ 10.601299] (2:slave@host B) Processing "Task_3" 
+> [ 10.651299] (2:slave@host B) "Task_3" done 
+> [ 13.264124] (1:master@host A) Send completed
+> [ 13.264124] (1:master@host A) Sending "Task_5" to "host B"
+> [ 13.264124] (2:slave@host B) Received "Task_4" 
+> [ 13.264124] (2:slave@host B) Processing "Task_4" 
+> [ 13.314124] (2:slave@host B) "Task_4" done 
+> [ 15.926948] (1:master@host A) Send completed
+> [ 15.926948] (1:master@host A) Sending "Task_6" to "host B"
+> [ 15.926948] (2:slave@host B) Received "Task_5" 
+> [ 15.926948] (2:slave@host B) Processing "Task_5" 
+> [ 15.976948] (2:slave@host B) "Task_5" done 
+> [ 18.589773] (1:master@host A) Send completed
+> [ 18.589773] (1:master@host A) Sending "Task_7" to "host B"
+> [ 18.589773] (2:slave@host B) Received "Task_6" 
+> [ 18.589773] (2:slave@host B) Processing "Task_6" 
+> [ 18.639773] (2:slave@host B) "Task_6" done 
+> [ 21.252598] (1:master@host A) Send completed
+> [ 21.252598] (1:master@host A) Sending "Task_8" to "host B"
+> [ 21.252598] (2:slave@host B) Received "Task_7" 
+> [ 21.252598] (2:slave@host B) Processing "Task_7" 
+> [ 21.302598] (2:slave@host B) "Task_7" done 
+> [ 23.915423] (1:master@host A) Send completed
+> [ 23.915423] (1:master@host A) Sending "Task_9" to "host B"
+> [ 23.915423] (2:slave@host B) Received "Task_8" 
+> [ 23.915423] (2:slave@host B) Processing "Task_8" 
+> [ 23.965423] (2:slave@host B) "Task_8" done 
+> [ 26.578247] (1:master@host A) Send completed
+> [ 26.578247] (1:master@host A) Sending "Task_10" to "host B"
+> [ 26.578247] (2:slave@host B) Received "Task_9" 
+> [ 26.578247] (2:slave@host B) Processing "Task_9" 
+> [ 26.628247] (2:slave@host B) "Task_9" done 
+> [ 29.241072] (1:master@host A) Send completed
+> [ 29.241072] (1:master@host A) Sending "Task_11" to "host B"
+> [ 29.241072] (2:slave@host B) Received "Task_10" 
+> [ 29.241072] (2:slave@host B) Processing "Task_10" 
+> [ 29.291072] (2:slave@host B) "Task_10" done 
+> [ 31.903897] (1:master@host A) Send completed
+> [ 31.903897] (1:master@host A) Sending "Task_12" to "host B"
+> [ 31.903897] (2:slave@host B) Received "Task_11" 
+> [ 31.903897] (2:slave@host B) Processing "Task_11" 
+> [ 31.953897] (2:slave@host B) "Task_11" done 
+> [ 34.566722] (1:master@host A) Send completed
+> [ 34.566722] (1:master@host A) Sending "Task_13" to "host B"
+> [ 34.566722] (2:slave@host B) Received "Task_12" 
+> [ 34.566722] (2:slave@host B) Processing "Task_12" 
+> [ 34.616722] (2:slave@host B) "Task_12" done 
+> [ 37.229546] (1:master@host A) Send completed
+> [ 37.229546] (1:master@host A) Sending "Task_14" to "host B"
+> [ 37.229546] (2:slave@host B) Received "Task_13" 
+> [ 37.229546] (2:slave@host B) Processing "Task_13" 
+> [ 37.279546] (2:slave@host B) "Task_13" done 
+> [ 39.892371] (1:master@host A) Send completed
+> [ 39.892371] (1:master@host A) Sending "Task_15" to "host B"
+> [ 39.892371] (2:slave@host B) Received "Task_14" 
+> [ 39.892371] (2:slave@host B) Processing "Task_14" 
+> [ 39.942371] (2:slave@host B) "Task_14" done 
+> [ 42.555196] (1:master@host A) Send completed
+> [ 42.555196] (1:master@host A) Sending "Task_16" to "host B"
+> [ 42.555196] (2:slave@host B) Received "Task_15" 
+> [ 42.555196] (2:slave@host B) Processing "Task_15" 
+> [ 42.605196] (2:slave@host B) "Task_15" done 
+> [ 45.218021] (1:master@host A) Send completed
+> [ 45.218021] (1:master@host A) Sending "Task_17" to "host B"
+> [ 45.218021] (2:slave@host B) Received "Task_16" 
+> [ 45.218021] (2:slave@host B) Processing "Task_16" 
+> [ 45.268021] (2:slave@host B) "Task_16" done 
+> [ 47.880845] (1:master@host A) Send completed
+> [ 47.880845] (1:master@host A) Sending "Task_18" to "host B"
+> [ 47.880845] (2:slave@host B) Received "Task_17" 
+> [ 47.880845] (2:slave@host B) Processing "Task_17" 
+> [ 47.930845] (2:slave@host B) "Task_17" done 
+> [ 50.543670] (1:master@host A) Send completed
+> [ 50.543670] (1:master@host A) Sending "Task_19" to "host B"
+> [ 50.543670] (2:slave@host B) Received "Task_18" 
+> [ 50.543670] (2:slave@host B) Processing "Task_18" 
+> [ 50.593670] (2:slave@host B) "Task_18" done 
+> [ 53.206495] (1:master@host A) Send completed
+> [ 53.206495] (1:master@host A) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [ 53.206495] (2:slave@host B) Received "Task_19" 
+> [ 53.206495] (2:slave@host B) Processing "Task_19" 
+> [ 53.256495] (2:slave@host B) "Task_19" done 
+> [ 55.858495] (0:@) Simulation time 55.8585
+> [ 55.858495] (1:master@host A) Goodbye now!
+> [ 55.858495] (2:slave@host B) Received "finalize" 
+> [ 55.858495] (2:slave@host B) I'm done. See you!
index 2e786c5..60f9067 100644 (file)
@@ -9,115 +9,115 @@ $ $SG_TEST_EXENV masterslave/masterslave_forwarder$EXEEXT ${srcdir:=.}/small_pla
 > [  0.169155] (3:slave@Jupiter) Processing "Task_0"
 > [  0.169155] (1:master@Tremblay) Sent
 > [  0.169155] (1:master@Tremblay) Sending "Task_1" to "Fafard"
-> [  0.392465] (4:slave@Fafard) Received "Task_1"
-> [  0.392465] (4:slave@Fafard) Processing "Task_1"
-> [  0.392465] (1:master@Tremblay) Sent
-> [  0.392465] (1:master@Tremblay) Sending "Task_2" to "Ginette"
-> [  0.536245] (5:slave@Ginette) Received "Task_2"
-> [  0.536245] (5:slave@Ginette) Processing "Task_2"
-> [  0.536245] (1:master@Tremblay) Sent
-> [  0.536245] (1:master@Tremblay) Sending "Task_3" to "Bourassa"
-> [  0.757221] (6:slave@Bourassa) Received "Task_3"
-> [  0.757221] (6:slave@Bourassa) Processing "Task_3"
-> [  0.757221] (1:master@Tremblay) Sent
-> [  0.757221] (1:master@Tremblay) Sending "Task_4" to "Tremblay"
-> [  0.757221] (1:master@Tremblay) Hey ! It's me ! :)
-> [  0.759487] (2:slave@Tremblay) Received "Task_4"
-> [  0.759487] (2:slave@Tremblay) Processing "Task_4"
-> [  0.759487] (1:master@Tremblay) Sent
-> [  0.759487] (1:master@Tremblay) Sending "Task_5" to "Jupiter"
+> [  0.327551] (4:slave@Fafard) Received "Task_1"
+> [  0.327551] (4:slave@Fafard) Processing "Task_1"
+> [  0.327551] (1:master@Tremblay) Sent
+> [  0.327551] (1:master@Tremblay) Sending "Task_2" to "Ginette"
+> [  0.451283] (5:slave@Ginette) Received "Task_2"
+> [  0.451283] (5:slave@Ginette) Processing "Task_2"
+> [  0.451283] (1:master@Tremblay) Sent
+> [  0.451283] (1:master@Tremblay) Sending "Task_3" to "Bourassa"
+> [  0.583902] (6:slave@Bourassa) Received "Task_3"
+> [  0.583902] (6:slave@Bourassa) Processing "Task_3"
+> [  0.583902] (1:master@Tremblay) Sent
+> [  0.583902] (1:master@Tremblay) Sending "Task_4" to "Tremblay"
+> [  0.583902] (1:master@Tremblay) Hey ! It's me ! :)
+> [  0.586168] (2:slave@Tremblay) Received "Task_4"
+> [  0.586168] (2:slave@Tremblay) Processing "Task_4"
+> [  0.586168] (1:master@Tremblay) Sent
+> [  0.586168] (1:master@Tremblay) Sending "Task_5" to "Jupiter"
 > [  0.824497] (3:slave@Jupiter) "Task_0" done
+> [  0.982894] (4:slave@Fafard) "Task_1" done
 > [  0.993652] (1:master@Tremblay) Sent
 > [  0.993652] (1:master@Tremblay) Sending "Task_6" to "Fafard"
 > [  0.993652] (3:slave@Jupiter) Received "Task_5"
 > [  0.993652] (3:slave@Jupiter) Processing "Task_5"
-> [  1.047808] (4:slave@Fafard) "Task_1" done
-> [  1.269197] (2:slave@Tremblay) "Task_4" done
-> [  1.271118] (1:master@Tremblay) Sent
-> [  1.271118] (1:master@Tremblay) Sending "Task_7" to "Ginette"
-> [  1.271118] (4:slave@Fafard) Received "Task_6"
-> [  1.271118] (4:slave@Fafard) Processing "Task_6"
-> [  1.567343] (5:slave@Ginette) "Task_2" done
+> [  1.095878] (2:slave@Tremblay) "Task_4" done
+> [  1.152048] (4:slave@Fafard) Received "Task_6"
+> [  1.152048] (4:slave@Fafard) Processing "Task_6"
+> [  1.152048] (1:master@Tremblay) Sent
+> [  1.152048] (1:master@Tremblay) Sending "Task_7" to "Ginette"
+> [  1.482381] (5:slave@Ginette) "Task_2" done
+> [  1.606113] (1:master@Tremblay) Sent
+> [  1.606113] (1:master@Tremblay) Sending "Task_8" to "Bourassa"
+> [  1.606113] (5:slave@Ginette) Received "Task_7"
+> [  1.606113] (5:slave@Ginette) Processing "Task_7"
+> [  1.615000] (6:slave@Bourassa) "Task_3" done
 > [  1.648994] (3:slave@Jupiter) "Task_5" done
-> [  1.711124] (1:master@Tremblay) Sent
-> [  1.711124] (1:master@Tremblay) Sending "Task_8" to "Bourassa"
-> [  1.711124] (5:slave@Ginette) Received "Task_7"
-> [  1.711124] (5:slave@Ginette) Processing "Task_7"
-> [  1.788319] (6:slave@Bourassa) "Task_3" done
-> [  1.926461] (4:slave@Fafard) "Task_6" done
-> [  2.009295] (1:master@Tremblay) Sent
-> [  2.009295] (1:master@Tremblay) Sending "Task_9" to "Tremblay"
-> [  2.009295] (1:master@Tremblay) Hey ! It's me ! :)
-> [  2.009295] (6:slave@Bourassa) Received "Task_8"
-> [  2.009295] (6:slave@Bourassa) Processing "Task_8"
-> [  2.011560] (2:slave@Tremblay) Received "Task_9"
-> [  2.011560] (2:slave@Tremblay) Processing "Task_9"
-> [  2.011560] (1:master@Tremblay) Sent
-> [  2.011560] (1:master@Tremblay) Sending "Task_10" to "Jupiter"
-> [  2.180715] (3:slave@Jupiter) Received "Task_10"
-> [  2.180715] (3:slave@Jupiter) Processing "Task_10"
-> [  2.180715] (1:master@Tremblay) Sent
-> [  2.180715] (1:master@Tremblay) Sending "Task_11" to "Fafard"
-> [  2.404026] (4:slave@Fafard) Received "Task_11"
-> [  2.404026] (4:slave@Fafard) Processing "Task_11"
-> [  2.404026] (1:master@Tremblay) Sent
-> [  2.404026] (1:master@Tremblay) Sending "Task_12" to "Ginette"
-> [  2.521270] (2:slave@Tremblay) "Task_9" done
-> [  2.742222] (5:slave@Ginette) "Task_7" done
-> [  2.836057] (3:slave@Jupiter) "Task_10" done
-> [  2.886002] (1:master@Tremblay) Sent
-> [  2.886002] (1:master@Tremblay) Sending "Task_13" to "Bourassa"
-> [  2.886002] (5:slave@Ginette) Received "Task_12"
-> [  2.886002] (5:slave@Ginette) Processing "Task_12"
-> [  3.040393] (6:slave@Bourassa) "Task_8" done
-> [  3.059368] (4:slave@Fafard) "Task_11" done
-> [  3.261369] (1:master@Tremblay) Sent
-> [  3.261369] (1:master@Tremblay) Sending "Task_14" to "Tremblay"
-> [  3.261369] (1:master@Tremblay) Hey ! It's me ! :)
-> [  3.261369] (6:slave@Bourassa) Received "Task_13"
-> [  3.261369] (6:slave@Bourassa) Processing "Task_13"
-> [  3.263634] (2:slave@Tremblay) Received "Task_14"
-> [  3.263634] (2:slave@Tremblay) Processing "Task_14"
-> [  3.263634] (1:master@Tremblay) Sent
-> [  3.263634] (1:master@Tremblay) Sending "Task_15" to "Jupiter"
-> [  3.432789] (3:slave@Jupiter) Received "Task_15"
-> [  3.432789] (3:slave@Jupiter) Processing "Task_15"
-> [  3.432789] (1:master@Tremblay) Sent
-> [  3.432789] (1:master@Tremblay) Sending "Task_16" to "Fafard"
-> [  3.656099] (4:slave@Fafard) Received "Task_16"
-> [  3.656099] (4:slave@Fafard) Processing "Task_16"
-> [  3.656099] (1:master@Tremblay) Sent
-> [  3.656099] (1:master@Tremblay) Sending "Task_17" to "Ginette"
-> [  3.773344] (2:slave@Tremblay) "Task_14" done
-> [  3.917100] (5:slave@Ginette) "Task_12" done
-> [  4.060880] (1:master@Tremblay) Sent
-> [  4.060880] (1:master@Tremblay) Sending "Task_18" to "Bourassa"
-> [  4.060880] (5:slave@Ginette) Received "Task_17"
-> [  4.060880] (5:slave@Ginette) Processing "Task_17"
-> [  4.088131] (3:slave@Jupiter) "Task_15" done
-> [  4.292467] (6:slave@Bourassa) "Task_13" done
-> [  4.311442] (4:slave@Fafard) "Task_16" done
-> [  4.513442] (1:master@Tremblay) Sent
-> [  4.513442] (1:master@Tremblay) Sending "Task_19" to "Tremblay"
-> [  4.513442] (1:master@Tremblay) Hey ! It's me ! :)
-> [  4.513442] (6:slave@Bourassa) Received "Task_18"
-> [  4.513442] (6:slave@Bourassa) Processing "Task_18"
-> [  4.515708] (2:slave@Tremblay) Received "Task_19"
-> [  4.515708] (2:slave@Tremblay) Processing "Task_19"
-> [  4.515708] (1:master@Tremblay) Sent
-> [  4.515708] (1:master@Tremblay) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [  4.534722] (3:slave@Jupiter) Received "finalize"
-> [  4.534722] (3:slave@Jupiter) I'm done. See you!
-> [  4.560430] (4:slave@Fafard) Received "finalize"
-> [  4.560430] (4:slave@Fafard) I'm done. See you!
-> [  5.025418] (2:slave@Tremblay) "Task_19" done
-> [  5.091978] (5:slave@Ginette) "Task_17" done
-> [  5.108530] (5:slave@Ginette) Received "finalize"
-> [  5.108530] (5:slave@Ginette) I'm done. See you!
-> [  5.544540] (6:slave@Bourassa) "Task_18" done
-> [  5.569980] (6:slave@Bourassa) Received "finalize"
-> [  5.569980] (6:slave@Bourassa) I'm done. See you!
-> [  5.570175] (2:slave@Tremblay) Received "finalize"
-> [  5.570175] (2:slave@Tremblay) I'm done. See you!
-> [  5.570175] (1:master@Tremblay) Goodbye now!
-> [  5.570175] (0:@) Simulation time 5.57017
+> [  1.747619] (1:master@Tremblay) Sent
+> [  1.747619] (1:master@Tremblay) Sending "Task_9" to "Tremblay"
+> [  1.747619] (1:master@Tremblay) Hey ! It's me ! :)
+> [  1.747619] (6:slave@Bourassa) Received "Task_8"
+> [  1.747619] (6:slave@Bourassa) Processing "Task_8"
+> [  1.749885] (2:slave@Tremblay) Received "Task_9"
+> [  1.749885] (2:slave@Tremblay) Processing "Task_9"
+> [  1.749885] (1:master@Tremblay) Sent
+> [  1.749885] (1:master@Tremblay) Sending "Task_10" to "Jupiter"
+> [  1.807391] (4:slave@Fafard) "Task_6" done
+> [  1.919039] (3:slave@Jupiter) Received "Task_10"
+> [  1.919039] (3:slave@Jupiter) Processing "Task_10"
+> [  1.919039] (1:master@Tremblay) Sent
+> [  1.919039] (1:master@Tremblay) Sending "Task_11" to "Fafard"
+> [  2.077436] (4:slave@Fafard) Received "Task_11"
+> [  2.077436] (4:slave@Fafard) Processing "Task_11"
+> [  2.077436] (1:master@Tremblay) Sent
+> [  2.077436] (1:master@Tremblay) Sending "Task_12" to "Ginette"
+> [  2.259594] (2:slave@Tremblay) "Task_9" done
+> [  2.574382] (3:slave@Jupiter) "Task_10" done
+> [  2.637211] (5:slave@Ginette) "Task_7" done
+> [  2.732778] (4:slave@Fafard) "Task_11" done
+> [  2.760943] (1:master@Tremblay) Sent
+> [  2.760943] (1:master@Tremblay) Sending "Task_13" to "Bourassa"
+> [  2.760943] (5:slave@Ginette) Received "Task_12"
+> [  2.760943] (5:slave@Ginette) Processing "Task_12"
+> [  2.778717] (6:slave@Bourassa) "Task_8" done
+> [  2.911336] (1:master@Tremblay) Sent
+> [  2.911336] (1:master@Tremblay) Sending "Task_14" to "Tremblay"
+> [  2.911336] (1:master@Tremblay) Hey ! It's me ! :)
+> [  2.911336] (6:slave@Bourassa) Received "Task_13"
+> [  2.911336] (6:slave@Bourassa) Processing "Task_13"
+> [  2.913601] (2:slave@Tremblay) Received "Task_14"
+> [  2.913601] (2:slave@Tremblay) Processing "Task_14"
+> [  2.913601] (1:master@Tremblay) Sent
+> [  2.913601] (1:master@Tremblay) Sending "Task_15" to "Jupiter"
+> [  3.082756] (3:slave@Jupiter) Received "Task_15"
+> [  3.082756] (3:slave@Jupiter) Processing "Task_15"
+> [  3.082756] (1:master@Tremblay) Sent
+> [  3.082756] (1:master@Tremblay) Sending "Task_16" to "Fafard"
+> [  3.241153] (4:slave@Fafard) Received "Task_16"
+> [  3.241153] (4:slave@Fafard) Processing "Task_16"
+> [  3.241153] (1:master@Tremblay) Sent
+> [  3.241153] (1:master@Tremblay) Sending "Task_17" to "Ginette"
+> [  3.423311] (2:slave@Tremblay) "Task_14" done
+> [  3.738098] (3:slave@Jupiter) "Task_15" done
+> [  3.792041] (5:slave@Ginette) "Task_12" done
+> [  3.896495] (4:slave@Fafard) "Task_16" done
+> [  3.915773] (1:master@Tremblay) Sent
+> [  3.915773] (1:master@Tremblay) Sending "Task_18" to "Bourassa"
+> [  3.915773] (5:slave@Ginette) Received "Task_17"
+> [  3.915773] (5:slave@Ginette) Processing "Task_17"
+> [  3.942434] (6:slave@Bourassa) "Task_13" done
+> [  4.075053] (1:master@Tremblay) Sent
+> [  4.075053] (1:master@Tremblay) Sending "Task_19" to "Tremblay"
+> [  4.075053] (1:master@Tremblay) Hey ! It's me ! :)
+> [  4.075053] (6:slave@Bourassa) Received "Task_18"
+> [  4.075053] (6:slave@Bourassa) Processing "Task_18"
+> [  4.077318] (2:slave@Tremblay) Received "Task_19"
+> [  4.077318] (2:slave@Tremblay) Processing "Task_19"
+> [  4.077318] (1:master@Tremblay) Sent
+> [  4.077318] (1:master@Tremblay) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [  4.096333] (3:slave@Jupiter) Received "finalize"
+> [  4.096333] (3:slave@Jupiter) I'm done. See you!
+> [  4.122041] (4:slave@Fafard) Received "finalize"
+> [  4.122041] (4:slave@Fafard) I'm done. See you!
+> [  4.587028] (2:slave@Tremblay) "Task_19" done
+> [  4.946871] (5:slave@Ginette) "Task_17" done
+> [  4.963423] (5:slave@Ginette) Received "finalize"
+> [  4.963423] (5:slave@Ginette) I'm done. See you!
+> [  5.106151] (6:slave@Bourassa) "Task_18" done
+> [  5.131590] (6:slave@Bourassa) Received "finalize"
+> [  5.131590] (6:slave@Bourassa) I'm done. See you!
+> [  5.131785] (2:slave@Tremblay) Received "finalize"
+> [  5.131785] (2:slave@Tremblay) I'm done. See you!
+> [  5.131785] (1:master@Tremblay) Goodbye now!
+> [  5.131785] (0:@) Simulation time 5.13179
index 09dbfbd..e75633c 100644 (file)
@@ -7,145 +7,145 @@ $ $SG_TEST_EXENV masterslave/masterslave_forwarder$EXEEXT ${srcdir:=.}/msg_platf
 > [  0.000000] (0:@) Configuration change: Set 'network/crosstraffic' to '0'
 > [  0.000000] (1:master@Jacquelin) Got 5 slaves and 20 tasks to process
 > [  0.000000] (1:master@Jacquelin) Sending "Task_0" to "iRMX"
-> [  5.383133] (1:master@Jacquelin) Sent
-> [  5.383133] (1:master@Jacquelin) Sending "Task_1" to "Casavant"
-> [  5.383133] (4:slave@iRMX) Received "Task_0"
-> [  5.383133] (4:slave@iRMX) Processing "Task_0"
-> [  5.455948] (4:slave@iRMX) "Task_0" done
-> [  7.783190] (1:master@Jacquelin) Sent
-> [  7.783190] (1:master@Jacquelin) Sending "Task_2" to "Bousquet"
-> [  7.783190] (3:forwarder@Casavant) Received "Task_1"
-> [  7.783190] (3:forwarder@Casavant) Sending "Task_1" to "Robert"
-> [  9.577790] (1:master@Jacquelin) Sent
-> [  9.577790] (1:master@Jacquelin) Sending "Task_3" to "Soucy"
-> [  9.577790] (5:slave@Bousquet) Received "Task_2"
-> [  9.577790] (5:slave@Bousquet) Processing "Task_2"
-> [  9.694294] (5:slave@Bousquet) "Task_2" done
-> [ 10.445354] (10:slave@Robert) Received "Task_1"
-> [ 10.445354] (10:slave@Robert) Processing "Task_1"
-> [ 10.481762] (10:slave@Robert) "Task_1" done
-> [ 12.131151] (1:master@Jacquelin) Sent
-> [ 12.131151] (1:master@Jacquelin) Sending "Task_4" to "Jackson"
-> [ 12.131151] (6:slave@Soucy) Received "Task_3"
-> [ 12.131151] (6:slave@Soucy) Processing "Task_3"
-> [ 12.167558] (6:slave@Soucy) "Task_3" done
-> [ 13.637082] (1:master@Jacquelin) Sent
-> [ 13.637082] (1:master@Jacquelin) Sending "Task_5" to "iRMX"
-> [ 13.637082] (2:forwarder@Jackson) Received "Task_4"
-> [ 13.637082] (2:forwarder@Jackson) Sending "Task_4" to "Kuenning"
-> [ 13.717808] (7:slave@Kuenning) Received "Task_4"
-> [ 13.717808] (7:slave@Kuenning) Processing "Task_4"
-> [ 13.776061] (7:slave@Kuenning) "Task_4" done
-> [ 19.020215] (1:master@Jacquelin) Sent
-> [ 19.020215] (1:master@Jacquelin) Sending "Task_6" to "Casavant"
-> [ 19.020215] (4:slave@iRMX) Received "Task_5"
-> [ 19.020215] (4:slave@iRMX) Processing "Task_5"
-> [ 19.093030] (4:slave@iRMX) "Task_5" done
-> [ 21.420272] (1:master@Jacquelin) Sent
-> [ 21.420272] (1:master@Jacquelin) Sending "Task_7" to "Bousquet"
-> [ 21.420272] (3:forwarder@Casavant) Received "Task_6"
-> [ 21.420272] (3:forwarder@Casavant) Sending "Task_6" to "Sirois"
-> [ 22.325670] (11:slave@Sirois) Received "Task_6"
-> [ 22.325670] (11:slave@Sirois) Processing "Task_6"
-> [ 22.369360] (11:slave@Sirois) "Task_6" done
-> [ 23.214872] (1:master@Jacquelin) Sent
-> [ 23.214872] (1:master@Jacquelin) Sending "Task_8" to "Soucy"
-> [ 23.214872] (5:slave@Bousquet) Received "Task_7"
-> [ 23.214872] (5:slave@Bousquet) Processing "Task_7"
-> [ 23.331376] (5:slave@Bousquet) "Task_7" done
-> [ 25.768233] (1:master@Jacquelin) Sent
-> [ 25.768233] (1:master@Jacquelin) Sending "Task_9" to "Jackson"
-> [ 25.768233] (6:slave@Soucy) Received "Task_8"
-> [ 25.768233] (6:slave@Soucy) Processing "Task_8"
-> [ 25.804640] (6:slave@Soucy) "Task_8" done
-> [ 27.274164] (1:master@Jacquelin) Sent
-> [ 27.274164] (1:master@Jacquelin) Sending "Task_10" to "iRMX"
-> [ 27.274164] (2:forwarder@Jackson) Received "Task_9"
-> [ 27.274164] (2:forwarder@Jackson) Sending "Task_9" to "Browne"
-> [ 30.465613] (8:slave@Browne) Received "Task_9"
-> [ 30.465613] (8:slave@Browne) Processing "Task_9"
-> [ 30.502021] (8:slave@Browne) "Task_9" done
-> [ 32.657297] (1:master@Jacquelin) Sent
-> [ 32.657297] (1:master@Jacquelin) Sending "Task_11" to "Casavant"
-> [ 32.657297] (4:slave@iRMX) Received "Task_10"
-> [ 32.657297] (4:slave@iRMX) Processing "Task_10"
-> [ 32.730112] (4:slave@iRMX) "Task_10" done
-> [ 35.057354] (1:master@Jacquelin) Sent
-> [ 35.057354] (1:master@Jacquelin) Sending "Task_12" to "Bousquet"
-> [ 35.057354] (3:forwarder@Casavant) Received "Task_11"
-> [ 35.057354] (3:forwarder@Casavant) Sending "Task_11" to "Monique"
-> [ 36.626996] (12:slave@Monique) Received "Task_11"
-> [ 36.626996] (12:slave@Monique) Processing "Task_11"
-> [ 36.670685] (12:slave@Monique) "Task_11" done
-> [ 36.851954] (1:master@Jacquelin) Sent
-> [ 36.851954] (1:master@Jacquelin) Sending "Task_13" to "Soucy"
-> [ 36.851954] (5:slave@Bousquet) Received "Task_12"
-> [ 36.851954] (5:slave@Bousquet) Processing "Task_12"
-> [ 36.968458] (5:slave@Bousquet) "Task_12" done
-> [ 39.405315] (1:master@Jacquelin) Sent
-> [ 39.405315] (1:master@Jacquelin) Sending "Task_14" to "Jackson"
-> [ 39.405315] (6:slave@Soucy) Received "Task_13"
-> [ 39.405315] (6:slave@Soucy) Processing "Task_13"
-> [ 39.441723] (6:slave@Soucy) "Task_13" done
-> [ 40.911246] (1:master@Jacquelin) Sent
-> [ 40.911246] (1:master@Jacquelin) Sending "Task_15" to "iRMX"
-> [ 40.911246] (2:forwarder@Jackson) Received "Task_14"
-> [ 40.911246] (2:forwarder@Jackson) Sending "Task_14" to "Stephen"
-> [ 45.690949] (9:slave@Stephen) Received "Task_14"
-> [ 45.690949] (9:slave@Stephen) Processing "Task_14"
-> [ 45.763764] (9:slave@Stephen) "Task_14" done
-> [ 46.294379] (1:master@Jacquelin) Sent
-> [ 46.294379] (1:master@Jacquelin) Sending "Task_16" to "Casavant"
-> [ 46.294379] (4:slave@iRMX) Received "Task_15"
-> [ 46.294379] (4:slave@iRMX) Processing "Task_15"
-> [ 46.367194] (4:slave@iRMX) "Task_15" done
-> [ 48.694436] (1:master@Jacquelin) Sent
-> [ 48.694436] (1:master@Jacquelin) Sending "Task_17" to "Bousquet"
-> [ 48.694436] (3:forwarder@Casavant) Received "Task_16"
-> [ 48.694436] (3:forwarder@Casavant) Sending "Task_16" to "Robert"
-> [ 50.489036] (1:master@Jacquelin) Sent
-> [ 50.489036] (1:master@Jacquelin) Sending "Task_18" to "Soucy"
-> [ 50.489036] (5:slave@Bousquet) Received "Task_17"
-> [ 50.489036] (5:slave@Bousquet) Processing "Task_17"
-> [ 50.605540] (5:slave@Bousquet) "Task_17" done
-> [ 51.356600] (10:slave@Robert) Received "Task_16"
-> [ 51.356600] (10:slave@Robert) Processing "Task_16"
-> [ 51.393008] (10:slave@Robert) "Task_16" done
-> [ 53.042397] (1:master@Jacquelin) Sent
-> [ 53.042397] (1:master@Jacquelin) Sending "Task_19" to "Jackson"
-> [ 53.042397] (6:slave@Soucy) Received "Task_18"
-> [ 53.042397] (6:slave@Soucy) Processing "Task_18"
-> [ 53.078805] (6:slave@Soucy) "Task_18" done
-> [ 54.548328] (1:master@Jacquelin) Sent
-> [ 54.548328] (1:master@Jacquelin) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [ 54.548328] (2:forwarder@Jackson) Received "Task_19"
-> [ 54.548328] (2:forwarder@Jackson) Sending "Task_19" to "Kuenning"
-> [ 54.629055] (7:slave@Kuenning) Received "Task_19"
-> [ 54.629055] (7:slave@Kuenning) Processing "Task_19"
-> [ 54.687307] (7:slave@Kuenning) "Task_19" done
-> [ 57.591986] (4:slave@iRMX) Received "finalize"
-> [ 57.591986] (4:slave@iRMX) I'm done. See you!
-> [ 58.948993] (3:forwarder@Casavant) Received "finalize"
-> [ 58.948993] (3:forwarder@Casavant) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [ 59.963672] (5:slave@Bousquet) Received "finalize"
-> [ 59.963672] (5:slave@Bousquet) I'm done. See you!
-> [ 60.454198] (10:slave@Robert) Received "finalize"
-> [ 60.454198] (10:slave@Robert) I'm done. See you!
-> [ 60.966116] (11:slave@Sirois) Received "finalize"
-> [ 60.966116] (11:slave@Sirois) I'm done. See you!
-> [ 61.407358] (6:slave@Soucy) Received "finalize"
-> [ 61.407358] (6:slave@Soucy) I'm done. See you!
-> [ 61.853601] (12:slave@Monique) Received "finalize"
-> [ 61.853601] (12:slave@Monique) I'm done. See you!
-> [ 61.853601] (3:forwarder@Casavant) I'm done. See you!
-> [ 62.258821] (1:master@Jacquelin) Goodbye now!
-> [ 62.258821] (2:forwarder@Jackson) Received "finalize"
-> [ 62.258821] (2:forwarder@Jackson) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [ 62.264666] (7:slave@Kuenning) Received "finalize"
-> [ 62.264666] (7:slave@Kuenning) I'm done. See you!
-> [ 64.069131] (8:slave@Browne) Received "finalize"
-> [ 64.069131] (8:slave@Browne) I'm done. See you!
-> [ 66.771606] (0:@) Simulation time 66.7716
-> [ 66.771606] (2:forwarder@Jackson) I'm done. See you!
-> [ 66.771606] (9:slave@Stephen) Received "finalize"
-> [ 66.771606] (9:slave@Stephen) I'm done. See you!
+> [  3.214059] (1:master@Jacquelin) Sent
+> [  3.214059] (1:master@Jacquelin) Sending "Task_1" to "Casavant"
+> [  3.214059] (4:slave@iRMX) Received "Task_0"
+> [  3.214059] (4:slave@iRMX) Processing "Task_0"
+> [  3.286874] (4:slave@iRMX) "Task_0" done
+> [  4.636977] (1:master@Jacquelin) Sent
+> [  4.636977] (1:master@Jacquelin) Sending "Task_2" to "Bousquet"
+> [  4.636977] (3:forwarder@Casavant) Received "Task_1"
+> [  4.636977] (3:forwarder@Casavant) Sending "Task_1" to "Robert"
+> [  5.837074] (1:master@Jacquelin) Sent
+> [  5.837074] (1:master@Jacquelin) Sending "Task_3" to "Soucy"
+> [  5.837074] (5:slave@Bousquet) Received "Task_2"
+> [  5.837074] (5:slave@Bousquet) Processing "Task_2"
+> [  5.953578] (5:slave@Bousquet) "Task_2" done
+> [  6.212426] (10:slave@Robert) Received "Task_1"
+> [  6.212426] (10:slave@Robert) Processing "Task_1"
+> [  6.248834] (10:slave@Robert) "Task_1" done
+> [  7.351005] (1:master@Jacquelin) Sent
+> [  7.351005] (1:master@Jacquelin) Sending "Task_4" to "Jackson"
+> [  7.351005] (6:slave@Soucy) Received "Task_3"
+> [  7.351005] (6:slave@Soucy) Processing "Task_3"
+> [  7.387413] (6:slave@Soucy) "Task_3" done
+> [  8.242374] (1:master@Jacquelin) Sent
+> [  8.242374] (1:master@Jacquelin) Sending "Task_5" to "iRMX"
+> [  8.242374] (2:forwarder@Jackson) Received "Task_4"
+> [  8.242374] (2:forwarder@Jackson) Sending "Task_4" to "Kuenning"
+> [  8.323101] (7:slave@Kuenning) Received "Task_4"
+> [  8.323101] (7:slave@Kuenning) Processing "Task_4"
+> [  8.381353] (7:slave@Kuenning) "Task_4" done
+> [ 11.456433] (1:master@Jacquelin) Sent
+> [ 11.456433] (1:master@Jacquelin) Sending "Task_6" to "Casavant"
+> [ 11.456433] (4:slave@iRMX) Received "Task_5"
+> [ 11.456433] (4:slave@iRMX) Processing "Task_5"
+> [ 11.529248] (4:slave@iRMX) "Task_5" done
+> [ 12.879351] (1:master@Jacquelin) Sent
+> [ 12.879351] (1:master@Jacquelin) Sending "Task_7" to "Bousquet"
+> [ 12.879351] (3:forwarder@Casavant) Received "Task_6"
+> [ 12.879351] (3:forwarder@Casavant) Sending "Task_6" to "Sirois"
+> [ 13.461514] (11:slave@Sirois) Received "Task_6"
+> [ 13.461514] (11:slave@Sirois) Processing "Task_6"
+> [ 13.505204] (11:slave@Sirois) "Task_6" done
+> [ 14.079449] (1:master@Jacquelin) Sent
+> [ 14.079449] (1:master@Jacquelin) Sending "Task_8" to "Soucy"
+> [ 14.079449] (5:slave@Bousquet) Received "Task_7"
+> [ 14.079449] (5:slave@Bousquet) Processing "Task_7"
+> [ 14.195953] (5:slave@Bousquet) "Task_7" done
+> [ 15.593379] (1:master@Jacquelin) Sent
+> [ 15.593379] (1:master@Jacquelin) Sending "Task_9" to "Jackson"
+> [ 15.593379] (6:slave@Soucy) Received "Task_8"
+> [ 15.593379] (6:slave@Soucy) Processing "Task_8"
+> [ 15.629787] (6:slave@Soucy) "Task_8" done
+> [ 16.484749] (1:master@Jacquelin) Sent
+> [ 16.484749] (1:master@Jacquelin) Sending "Task_10" to "iRMX"
+> [ 16.484749] (2:forwarder@Jackson) Received "Task_9"
+> [ 16.484749] (2:forwarder@Jackson) Sending "Task_9" to "Browne"
+> [ 18.303513] (8:slave@Browne) Received "Task_9"
+> [ 18.303513] (8:slave@Browne) Processing "Task_9"
+> [ 18.339921] (8:slave@Browne) "Task_9" done
+> [ 19.698808] (1:master@Jacquelin) Sent
+> [ 19.698808] (1:master@Jacquelin) Sending "Task_11" to "Casavant"
+> [ 19.698808] (4:slave@iRMX) Received "Task_10"
+> [ 19.698808] (4:slave@iRMX) Processing "Task_10"
+> [ 19.771623] (4:slave@iRMX) "Task_10" done
+> [ 21.121726] (1:master@Jacquelin) Sent
+> [ 21.121726] (1:master@Jacquelin) Sending "Task_12" to "Bousquet"
+> [ 21.121726] (3:forwarder@Casavant) Received "Task_11"
+> [ 21.121726] (3:forwarder@Casavant) Sending "Task_11" to "Monique"
+> [ 22.075122] (12:slave@Monique) Received "Task_11"
+> [ 22.075122] (12:slave@Monique) Processing "Task_11"
+> [ 22.118812] (12:slave@Monique) "Task_11" done
+> [ 22.321823] (1:master@Jacquelin) Sent
+> [ 22.321823] (1:master@Jacquelin) Sending "Task_13" to "Soucy"
+> [ 22.321823] (5:slave@Bousquet) Received "Task_12"
+> [ 22.321823] (5:slave@Bousquet) Processing "Task_12"
+> [ 22.438327] (5:slave@Bousquet) "Task_12" done
+> [ 23.835754] (1:master@Jacquelin) Sent
+> [ 23.835754] (1:master@Jacquelin) Sending "Task_14" to "Jackson"
+> [ 23.835754] (6:slave@Soucy) Received "Task_13"
+> [ 23.835754] (6:slave@Soucy) Processing "Task_13"
+> [ 23.872162] (6:slave@Soucy) "Task_13" done
+> [ 24.727123] (1:master@Jacquelin) Sent
+> [ 24.727123] (1:master@Jacquelin) Sending "Task_15" to "iRMX"
+> [ 24.727123] (2:forwarder@Jackson) Received "Task_14"
+> [ 24.727123] (2:forwarder@Jackson) Sending "Task_14" to "Stephen"
+> [ 27.784937] (9:slave@Stephen) Received "Task_14"
+> [ 27.784937] (9:slave@Stephen) Processing "Task_14"
+> [ 27.857752] (9:slave@Stephen) "Task_14" done
+> [ 27.941182] (1:master@Jacquelin) Sent
+> [ 27.941182] (1:master@Jacquelin) Sending "Task_16" to "Casavant"
+> [ 27.941182] (4:slave@iRMX) Received "Task_15"
+> [ 27.941182] (4:slave@iRMX) Processing "Task_15"
+> [ 28.013997] (4:slave@iRMX) "Task_15" done
+> [ 29.364100] (1:master@Jacquelin) Sent
+> [ 29.364100] (1:master@Jacquelin) Sending "Task_17" to "Bousquet"
+> [ 29.364100] (3:forwarder@Casavant) Received "Task_16"
+> [ 29.364100] (3:forwarder@Casavant) Sending "Task_16" to "Robert"
+> [ 30.564197] (1:master@Jacquelin) Sent
+> [ 30.564197] (1:master@Jacquelin) Sending "Task_18" to "Soucy"
+> [ 30.564197] (5:slave@Bousquet) Received "Task_17"
+> [ 30.564197] (5:slave@Bousquet) Processing "Task_17"
+> [ 30.680701] (5:slave@Bousquet) "Task_17" done
+> [ 30.939549] (10:slave@Robert) Received "Task_16"
+> [ 30.939549] (10:slave@Robert) Processing "Task_16"
+> [ 30.975957] (10:slave@Robert) "Task_16" done
+> [ 32.078128] (1:master@Jacquelin) Sent
+> [ 32.078128] (1:master@Jacquelin) Sending "Task_19" to "Jackson"
+> [ 32.078128] (6:slave@Soucy) Received "Task_18"
+> [ 32.078128] (6:slave@Soucy) Processing "Task_18"
+> [ 32.114536] (6:slave@Soucy) "Task_18" done
+> [ 32.969498] (1:master@Jacquelin) Sent
+> [ 32.969498] (1:master@Jacquelin) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [ 32.969498] (2:forwarder@Jackson) Received "Task_19"
+> [ 32.969498] (2:forwarder@Jackson) Sending "Task_19" to "Kuenning"
+> [ 33.050224] (7:slave@Kuenning) Received "Task_19"
+> [ 33.050224] (7:slave@Kuenning) Processing "Task_19"
+> [ 33.108477] (7:slave@Kuenning) "Task_19" done
+> [ 36.013155] (4:slave@iRMX) Received "finalize"
+> [ 36.013155] (4:slave@iRMX) I'm done. See you!
+> [ 37.370163] (3:forwarder@Casavant) Received "finalize"
+> [ 37.370163] (3:forwarder@Casavant) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [ 38.384841] (5:slave@Bousquet) Received "finalize"
+> [ 38.384841] (5:slave@Bousquet) I'm done. See you!
+> [ 38.875367] (10:slave@Robert) Received "finalize"
+> [ 38.875367] (10:slave@Robert) I'm done. See you!
+> [ 39.387285] (11:slave@Sirois) Received "finalize"
+> [ 39.387285] (11:slave@Sirois) I'm done. See you!
+> [ 39.828527] (6:slave@Soucy) Received "finalize"
+> [ 39.828527] (6:slave@Soucy) I'm done. See you!
+> [ 40.274771] (12:slave@Monique) Received "finalize"
+> [ 40.274771] (12:slave@Monique) I'm done. See you!
+> [ 40.274771] (3:forwarder@Casavant) I'm done. See you!
+> [ 40.679990] (1:master@Jacquelin) Goodbye now!
+> [ 40.679990] (2:forwarder@Jackson) Received "finalize"
+> [ 40.679990] (2:forwarder@Jackson) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [ 40.685835] (7:slave@Kuenning) Received "finalize"
+> [ 40.685835] (7:slave@Kuenning) I'm done. See you!
+> [ 42.490301] (8:slave@Browne) Received "finalize"
+> [ 42.490301] (8:slave@Browne) I'm done. See you!
+> [ 45.192775] (0:@) Simulation time 45.1928
+> [ 45.192775] (2:forwarder@Jackson) I'm done. See you!
+> [ 45.192775] (9:slave@Stephen) Received "finalize"
+> [ 45.192775] (9:slave@Stephen) I'm done. See you!
index c53d822..a36ab7a 100644 (file)
@@ -5,145 +5,145 @@ p Testing a master/slave example application with a forwarder module
 $ $SG_TEST_EXENV masterslave/masterslave_forwarder$EXEEXT ${srcdir:=.}/msg_platform.xml ${srcdir:=.}/masterslave/deployment_masterslave_forwarder.xml  "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (1:master@Jacquelin) Got 5 slaves and 20 tasks to process
 > [  0.000000] (1:master@Jacquelin) Sending "Task_0" to "iRMX"
-> [  5.383133] (4:slave@iRMX) Received "Task_0"
-> [  5.383133] (4:slave@iRMX) Processing "Task_0"
-> [  5.383133] (1:master@Jacquelin) Sent
-> [  5.383133] (1:master@Jacquelin) Sending "Task_1" to "Casavant"
-> [  5.455948] (4:slave@iRMX) "Task_0" done
-> [  7.783190] (3:forwarder@Casavant) Received "Task_1"
-> [  7.783190] (3:forwarder@Casavant) Sending "Task_1" to "Robert"
-> [  7.783190] (1:master@Jacquelin) Sent
-> [  7.783190] (1:master@Jacquelin) Sending "Task_2" to "Bousquet"
-> [  9.577790] (5:slave@Bousquet) Received "Task_2"
-> [  9.577790] (5:slave@Bousquet) Processing "Task_2"
-> [  9.577790] (1:master@Jacquelin) Sent
-> [  9.577790] (1:master@Jacquelin) Sending "Task_3" to "Soucy"
-> [  9.694294] (5:slave@Bousquet) "Task_2" done
-> [ 10.445354] (10:slave@Robert) Received "Task_1"
-> [ 10.445354] (10:slave@Robert) Processing "Task_1"
-> [ 10.481762] (10:slave@Robert) "Task_1" done
-> [ 12.131151] (6:slave@Soucy) Received "Task_3"
-> [ 12.131151] (6:slave@Soucy) Processing "Task_3"
-> [ 12.131151] (1:master@Jacquelin) Sent
-> [ 12.131151] (1:master@Jacquelin) Sending "Task_4" to "Jackson"
-> [ 12.167558] (6:slave@Soucy) "Task_3" done
-> [ 13.637082] (2:forwarder@Jackson) Received "Task_4"
-> [ 13.637082] (2:forwarder@Jackson) Sending "Task_4" to "Kuenning"
-> [ 13.637082] (1:master@Jacquelin) Sent
-> [ 13.637082] (1:master@Jacquelin) Sending "Task_5" to "iRMX"
-> [ 13.721552] (7:slave@Kuenning) Received "Task_4"
-> [ 13.721552] (7:slave@Kuenning) Processing "Task_4"
-> [ 13.779805] (7:slave@Kuenning) "Task_4" done
-> [ 19.020215] (4:slave@iRMX) Received "Task_5"
-> [ 19.020215] (4:slave@iRMX) Processing "Task_5"
-> [ 19.020215] (1:master@Jacquelin) Sent
-> [ 19.020215] (1:master@Jacquelin) Sending "Task_6" to "Casavant"
-> [ 19.093030] (4:slave@iRMX) "Task_5" done
-> [ 21.420272] (3:forwarder@Casavant) Received "Task_6"
-> [ 21.420272] (3:forwarder@Casavant) Sending "Task_6" to "Sirois"
-> [ 21.420272] (1:master@Jacquelin) Sent
-> [ 21.420272] (1:master@Jacquelin) Sending "Task_7" to "Bousquet"
-> [ 22.325670] (11:slave@Sirois) Received "Task_6"
-> [ 22.325670] (11:slave@Sirois) Processing "Task_6"
-> [ 22.369360] (11:slave@Sirois) "Task_6" done
-> [ 23.214872] (5:slave@Bousquet) Received "Task_7"
-> [ 23.214872] (5:slave@Bousquet) Processing "Task_7"
-> [ 23.214872] (1:master@Jacquelin) Sent
-> [ 23.214872] (1:master@Jacquelin) Sending "Task_8" to "Soucy"
-> [ 23.331376] (5:slave@Bousquet) "Task_7" done
-> [ 25.768233] (6:slave@Soucy) Received "Task_8"
-> [ 25.768233] (6:slave@Soucy) Processing "Task_8"
-> [ 25.768233] (1:master@Jacquelin) Sent
-> [ 25.768233] (1:master@Jacquelin) Sending "Task_9" to "Jackson"
-> [ 25.804640] (6:slave@Soucy) "Task_8" done
-> [ 27.274164] (2:forwarder@Jackson) Received "Task_9"
-> [ 27.274164] (2:forwarder@Jackson) Sending "Task_9" to "Browne"
-> [ 27.274164] (1:master@Jacquelin) Sent
-> [ 27.274164] (1:master@Jacquelin) Sending "Task_10" to "iRMX"
-> [ 30.465613] (8:slave@Browne) Received "Task_9"
-> [ 30.465613] (8:slave@Browne) Processing "Task_9"
-> [ 30.502021] (8:slave@Browne) "Task_9" done
-> [ 32.657297] (4:slave@iRMX) Received "Task_10"
-> [ 32.657297] (4:slave@iRMX) Processing "Task_10"
-> [ 32.657297] (1:master@Jacquelin) Sent
-> [ 32.657297] (1:master@Jacquelin) Sending "Task_11" to "Casavant"
-> [ 32.730112] (4:slave@iRMX) "Task_10" done
-> [ 35.057354] (3:forwarder@Casavant) Received "Task_11"
-> [ 35.057354] (3:forwarder@Casavant) Sending "Task_11" to "Monique"
-> [ 35.057354] (1:master@Jacquelin) Sent
-> [ 35.057354] (1:master@Jacquelin) Sending "Task_12" to "Bousquet"
-> [ 36.626996] (12:slave@Monique) Received "Task_11"
-> [ 36.626996] (12:slave@Monique) Processing "Task_11"
-> [ 36.670685] (12:slave@Monique) "Task_11" done
-> [ 36.851954] (5:slave@Bousquet) Received "Task_12"
-> [ 36.851954] (5:slave@Bousquet) Processing "Task_12"
-> [ 36.851954] (1:master@Jacquelin) Sent
-> [ 36.851954] (1:master@Jacquelin) Sending "Task_13" to "Soucy"
-> [ 36.968458] (5:slave@Bousquet) "Task_12" done
-> [ 39.405315] (6:slave@Soucy) Received "Task_13"
-> [ 39.405315] (6:slave@Soucy) Processing "Task_13"
-> [ 39.405315] (1:master@Jacquelin) Sent
-> [ 39.405315] (1:master@Jacquelin) Sending "Task_14" to "Jackson"
-> [ 39.441723] (6:slave@Soucy) "Task_13" done
-> [ 40.911246] (2:forwarder@Jackson) Received "Task_14"
-> [ 40.911246] (2:forwarder@Jackson) Sending "Task_14" to "Stephen"
-> [ 40.911246] (1:master@Jacquelin) Sent
-> [ 40.911246] (1:master@Jacquelin) Sending "Task_15" to "iRMX"
-> [ 45.690949] (9:slave@Stephen) Received "Task_14"
-> [ 45.690949] (9:slave@Stephen) Processing "Task_14"
-> [ 45.763764] (9:slave@Stephen) "Task_14" done
-> [ 46.294379] (4:slave@iRMX) Received "Task_15"
-> [ 46.294379] (4:slave@iRMX) Processing "Task_15"
-> [ 46.294379] (1:master@Jacquelin) Sent
-> [ 46.294379] (1:master@Jacquelin) Sending "Task_16" to "Casavant"
-> [ 46.367194] (4:slave@iRMX) "Task_15" done
-> [ 48.694436] (3:forwarder@Casavant) Received "Task_16"
-> [ 48.694436] (3:forwarder@Casavant) Sending "Task_16" to "Robert"
-> [ 48.694436] (1:master@Jacquelin) Sent
-> [ 48.694436] (1:master@Jacquelin) Sending "Task_17" to "Bousquet"
-> [ 50.489036] (5:slave@Bousquet) Received "Task_17"
-> [ 50.489036] (5:slave@Bousquet) Processing "Task_17"
-> [ 50.489036] (1:master@Jacquelin) Sent
-> [ 50.489036] (1:master@Jacquelin) Sending "Task_18" to "Soucy"
-> [ 50.605540] (5:slave@Bousquet) "Task_17" done
-> [ 51.356600] (10:slave@Robert) Received "Task_16"
-> [ 51.356600] (10:slave@Robert) Processing "Task_16"
-> [ 51.393008] (10:slave@Robert) "Task_16" done
-> [ 53.042397] (6:slave@Soucy) Received "Task_18"
-> [ 53.042397] (6:slave@Soucy) Processing "Task_18"
-> [ 53.042397] (1:master@Jacquelin) Sent
-> [ 53.042397] (1:master@Jacquelin) Sending "Task_19" to "Jackson"
-> [ 53.078805] (6:slave@Soucy) "Task_18" done
-> [ 54.548328] (2:forwarder@Jackson) Received "Task_19"
-> [ 54.548328] (2:forwarder@Jackson) Sending "Task_19" to "Kuenning"
-> [ 54.548328] (1:master@Jacquelin) Sent
-> [ 54.548328] (1:master@Jacquelin) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [ 54.632799] (7:slave@Kuenning) Received "Task_19"
-> [ 54.632799] (7:slave@Kuenning) Processing "Task_19"
-> [ 54.691051] (7:slave@Kuenning) "Task_19" done
-> [ 57.591986] (4:slave@iRMX) Received "finalize"
-> [ 57.591986] (4:slave@iRMX) I'm done. See you!
-> [ 58.948993] (3:forwarder@Casavant) Received "finalize"
-> [ 58.948993] (3:forwarder@Casavant) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [ 59.963672] (5:slave@Bousquet) Received "finalize"
-> [ 59.963672] (5:slave@Bousquet) I'm done. See you!
-> [ 60.454198] (10:slave@Robert) Received "finalize"
-> [ 60.454198] (10:slave@Robert) I'm done. See you!
-> [ 60.966116] (11:slave@Sirois) Received "finalize"
-> [ 60.966116] (11:slave@Sirois) I'm done. See you!
-> [ 61.407358] (6:slave@Soucy) Received "finalize"
-> [ 61.407358] (6:slave@Soucy) I'm done. See you!
-> [ 61.853601] (12:slave@Monique) Received "finalize"
-> [ 61.853601] (12:slave@Monique) I'm done. See you!
-> [ 61.853601] (3:forwarder@Casavant) I'm done. See you!
-> [ 62.258821] (2:forwarder@Jackson) Received "finalize"
-> [ 62.258821] (2:forwarder@Jackson) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [ 62.258821] (1:master@Jacquelin) Goodbye now!
-> [ 62.264666] (7:slave@Kuenning) Received "finalize"
-> [ 62.264666] (7:slave@Kuenning) I'm done. See you!
-> [ 64.069131] (8:slave@Browne) Received "finalize"
-> [ 64.069131] (8:slave@Browne) I'm done. See you!
-> [ 66.771606] (9:slave@Stephen) Received "finalize"
-> [ 66.771606] (9:slave@Stephen) I'm done. See you!
-> [ 66.771606] (2:forwarder@Jackson) I'm done. See you!
-> [ 66.771606] (0:@) Simulation time 66.7716
+> [  3.222579] (4:slave@iRMX) Received "Task_0"
+> [  3.222579] (4:slave@iRMX) Processing "Task_0"
+> [  3.222579] (1:master@Jacquelin) Sent
+> [  3.222579] (1:master@Jacquelin) Sending "Task_1" to "Casavant"
+> [  3.295394] (4:slave@iRMX) "Task_0" done
+> [  4.648793] (3:forwarder@Casavant) Received "Task_1"
+> [  4.648793] (3:forwarder@Casavant) Sending "Task_1" to "Robert"
+> [  4.648793] (1:master@Jacquelin) Sent
+> [  4.648793] (1:master@Jacquelin) Sending "Task_2" to "Bousquet"
+> [  5.858161] (5:slave@Bousquet) Received "Task_2"
+> [  5.858161] (5:slave@Bousquet) Processing "Task_2"
+> [  5.858161] (1:master@Jacquelin) Sent
+> [  5.858161] (1:master@Jacquelin) Sending "Task_3" to "Soucy"
+> [  5.974665] (5:slave@Bousquet) "Task_2" done
+> [  6.227754] (10:slave@Robert) Received "Task_1"
+> [  6.227754] (10:slave@Robert) Processing "Task_1"
+> [  6.264162] (10:slave@Robert) "Task_1" done
+> [  7.375604] (6:slave@Soucy) Received "Task_3"
+> [  7.375604] (6:slave@Soucy) Processing "Task_3"
+> [  7.375604] (1:master@Jacquelin) Sent
+> [  7.375604] (1:master@Jacquelin) Sending "Task_4" to "Jackson"
+> [  7.412012] (6:slave@Soucy) "Task_3" done
+> [  8.268969] (2:forwarder@Jackson) Received "Task_4"
+> [  8.268969] (2:forwarder@Jackson) Sending "Task_4" to "Kuenning"
+> [  8.268969] (1:master@Jacquelin) Sent
+> [  8.268969] (1:master@Jacquelin) Sending "Task_5" to "iRMX"
+> [  8.353439] (7:slave@Kuenning) Received "Task_4"
+> [  8.353439] (7:slave@Kuenning) Processing "Task_4"
+> [  8.411691] (7:slave@Kuenning) "Task_4" done
+> [ 11.491547] (4:slave@iRMX) Received "Task_5"
+> [ 11.491547] (4:slave@iRMX) Processing "Task_5"
+> [ 11.491547] (1:master@Jacquelin) Sent
+> [ 11.491547] (1:master@Jacquelin) Sending "Task_6" to "Casavant"
+> [ 11.564363] (4:slave@iRMX) "Task_5" done
+> [ 12.917761] (3:forwarder@Casavant) Received "Task_6"
+> [ 12.917761] (3:forwarder@Casavant) Sending "Task_6" to "Sirois"
+> [ 12.917761] (1:master@Jacquelin) Sent
+> [ 12.917761] (1:master@Jacquelin) Sending "Task_7" to "Bousquet"
+> [ 13.503436] (11:slave@Sirois) Received "Task_6"
+> [ 13.503436] (11:slave@Sirois) Processing "Task_6"
+> [ 13.547126] (11:slave@Sirois) "Task_6" done
+> [ 14.127129] (5:slave@Bousquet) Received "Task_7"
+> [ 14.127129] (5:slave@Bousquet) Processing "Task_7"
+> [ 14.127129] (1:master@Jacquelin) Sent
+> [ 14.127129] (1:master@Jacquelin) Sending "Task_8" to "Soucy"
+> [ 14.243633] (5:slave@Bousquet) "Task_7" done
+> [ 15.644572] (6:slave@Soucy) Received "Task_8"
+> [ 15.644572] (6:slave@Soucy) Processing "Task_8"
+> [ 15.644572] (1:master@Jacquelin) Sent
+> [ 15.644572] (1:master@Jacquelin) Sending "Task_9" to "Jackson"
+> [ 15.680980] (6:slave@Soucy) "Task_8" done
+> [ 16.537937] (2:forwarder@Jackson) Received "Task_9"
+> [ 16.537937] (2:forwarder@Jackson) Sending "Task_9" to "Browne"
+> [ 16.537937] (1:master@Jacquelin) Sent
+> [ 16.537937] (1:master@Jacquelin) Sending "Task_10" to "iRMX"
+> [ 18.357416] (8:slave@Browne) Received "Task_9"
+> [ 18.357416] (8:slave@Browne) Processing "Task_9"
+> [ 18.393824] (8:slave@Browne) "Task_9" done
+> [ 19.760516] (4:slave@iRMX) Received "Task_10"
+> [ 19.760516] (4:slave@iRMX) Processing "Task_10"
+> [ 19.760516] (1:master@Jacquelin) Sent
+> [ 19.760516] (1:master@Jacquelin) Sending "Task_11" to "Casavant"
+> [ 19.833331] (4:slave@iRMX) "Task_10" done
+> [ 21.186730] (3:forwarder@Casavant) Received "Task_11"
+> [ 21.186730] (3:forwarder@Casavant) Sending "Task_11" to "Monique"
+> [ 21.186730] (1:master@Jacquelin) Sent
+> [ 21.186730] (1:master@Jacquelin) Sending "Task_12" to "Bousquet"
+> [ 22.143422] (12:slave@Monique) Received "Task_11"
+> [ 22.143422] (12:slave@Monique) Processing "Task_11"
+> [ 22.187111] (12:slave@Monique) "Task_11" done
+> [ 22.396098] (5:slave@Bousquet) Received "Task_12"
+> [ 22.396098] (5:slave@Bousquet) Processing "Task_12"
+> [ 22.396098] (1:master@Jacquelin) Sent
+> [ 22.396098] (1:master@Jacquelin) Sending "Task_13" to "Soucy"
+> [ 22.512602] (5:slave@Bousquet) "Task_12" done
+> [ 23.913541] (6:slave@Soucy) Received "Task_13"
+> [ 23.913541] (6:slave@Soucy) Processing "Task_13"
+> [ 23.913541] (1:master@Jacquelin) Sent
+> [ 23.913541] (1:master@Jacquelin) Sending "Task_14" to "Jackson"
+> [ 23.949949] (6:slave@Soucy) "Task_13" done
+> [ 24.806906] (2:forwarder@Jackson) Received "Task_14"
+> [ 24.806906] (2:forwarder@Jackson) Sending "Task_14" to "Stephen"
+> [ 24.806906] (1:master@Jacquelin) Sent
+> [ 24.806906] (1:master@Jacquelin) Sending "Task_15" to "iRMX"
+> [ 27.882486] (9:slave@Stephen) Received "Task_14"
+> [ 27.882486] (9:slave@Stephen) Processing "Task_14"
+> [ 27.955301] (9:slave@Stephen) "Task_14" done
+> [ 28.029484] (4:slave@iRMX) Received "Task_15"
+> [ 28.029484] (4:slave@iRMX) Processing "Task_15"
+> [ 28.029484] (1:master@Jacquelin) Sent
+> [ 28.029484] (1:master@Jacquelin) Sending "Task_16" to "Casavant"
+> [ 28.102300] (4:slave@iRMX) "Task_15" done
+> [ 29.455698] (3:forwarder@Casavant) Received "Task_16"
+> [ 29.455698] (3:forwarder@Casavant) Sending "Task_16" to "Robert"
+> [ 29.455698] (1:master@Jacquelin) Sent
+> [ 29.455698] (1:master@Jacquelin) Sending "Task_17" to "Bousquet"
+> [ 30.665066] (5:slave@Bousquet) Received "Task_17"
+> [ 30.665066] (5:slave@Bousquet) Processing "Task_17"
+> [ 30.665066] (1:master@Jacquelin) Sent
+> [ 30.665066] (1:master@Jacquelin) Sending "Task_18" to "Soucy"
+> [ 30.781570] (5:slave@Bousquet) "Task_17" done
+> [ 31.034660] (10:slave@Robert) Received "Task_16"
+> [ 31.034660] (10:slave@Robert) Processing "Task_16"
+> [ 31.071067] (10:slave@Robert) "Task_16" done
+> [ 32.182509] (6:slave@Soucy) Received "Task_18"
+> [ 32.182509] (6:slave@Soucy) Processing "Task_18"
+> [ 32.182509] (1:master@Jacquelin) Sent
+> [ 32.182509] (1:master@Jacquelin) Sending "Task_19" to "Jackson"
+> [ 32.218917] (6:slave@Soucy) "Task_18" done
+> [ 33.075874] (2:forwarder@Jackson) Received "Task_19"
+> [ 33.075874] (2:forwarder@Jackson) Sending "Task_19" to "Kuenning"
+> [ 33.075874] (1:master@Jacquelin) Sent
+> [ 33.075874] (1:master@Jacquelin) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [ 33.160344] (7:slave@Kuenning) Received "Task_19"
+> [ 33.160344] (7:slave@Kuenning) Processing "Task_19"
+> [ 33.218597] (7:slave@Kuenning) "Task_19" done
+> [ 36.119532] (4:slave@iRMX) Received "finalize"
+> [ 36.119532] (4:slave@iRMX) I'm done. See you!
+> [ 37.476539] (3:forwarder@Casavant) Received "finalize"
+> [ 37.476539] (3:forwarder@Casavant) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [ 38.491217] (5:slave@Bousquet) Received "finalize"
+> [ 38.491217] (5:slave@Bousquet) I'm done. See you!
+> [ 38.981743] (10:slave@Robert) Received "finalize"
+> [ 38.981743] (10:slave@Robert) I'm done. See you!
+> [ 39.493662] (11:slave@Sirois) Received "finalize"
+> [ 39.493662] (11:slave@Sirois) I'm done. See you!
+> [ 39.934903] (6:slave@Soucy) Received "finalize"
+> [ 39.934903] (6:slave@Soucy) I'm done. See you!
+> [ 40.381147] (12:slave@Monique) Received "finalize"
+> [ 40.381147] (12:slave@Monique) I'm done. See you!
+> [ 40.381147] (3:forwarder@Casavant) I'm done. See you!
+> [ 40.786367] (2:forwarder@Jackson) Received "finalize"
+> [ 40.786367] (2:forwarder@Jackson) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [ 40.786367] (1:master@Jacquelin) Goodbye now!
+> [ 40.792212] (7:slave@Kuenning) Received "finalize"
+> [ 40.792212] (7:slave@Kuenning) I'm done. See you!
+> [ 42.596677] (8:slave@Browne) Received "finalize"
+> [ 42.596677] (8:slave@Browne) I'm done. See you!
+> [ 45.299152] (9:slave@Stephen) Received "finalize"
+> [ 45.299152] (9:slave@Stephen) I'm done. See you!
+> [ 45.299152] (2:forwarder@Jackson) I'm done. See you!
+> [ 45.299152] (0:@) Simulation time 45.2992
index 7dc2d64..e6538fb 100644 (file)
@@ -8,28 +8,28 @@ $ $SG_TEST_EXENV masterslave/masterslave_mailbox$EXEEXT ${srcdir:=.}/small_platf
 > [  0.000000] (1:master@Tremblay) Got 5 slaves and 20 tasks to process
 > [  0.000000] (1:master@Tremblay) Sending "Task_0" (of 20) to mailbox "slave-0"
 > [  0.002265] (1:master@Tremblay) Sending "Task_1" (of 20) to mailbox "slave-1"
-> [  0.167431] (1:master@Tremblay) Sending "Task_2" (of 20) to mailbox "slave-2"
-> [  0.390742] (1:master@Tremblay) Sending "Task_3" (of 20) to mailbox "slave-3"
-> [  0.534522] (1:master@Tremblay) Sending "Task_4" (of 20) to mailbox "slave-4"
-> [  0.755498] (1:master@Tremblay) Sending "Task_5" (of 20) to mailbox "slave-0"
-> [  0.757763] (1:master@Tremblay) Sending "Task_6" (of 20) to mailbox "slave-1"
-> [  0.987940] (1:master@Tremblay) Sending "Task_7" (of 20) to mailbox "slave-2"
-> [  1.269395] (1:master@Tremblay) Sending "Task_8" (of 20) to mailbox "slave-3"
-> [  1.709400] (1:master@Tremblay) Sending "Task_9" (of 20) to mailbox "slave-4"
-> [  2.007572] (1:master@Tremblay) Sending "Task_10" (of 20) to mailbox "slave-0"
-> [  2.009837] (1:master@Tremblay) Sending "Task_11" (of 20) to mailbox "slave-1"
-> [  2.175003] (1:master@Tremblay) Sending "Task_12" (of 20) to mailbox "slave-2"
-> [  2.398314] (1:master@Tremblay) Sending "Task_13" (of 20) to mailbox "slave-3"
-> [  2.884278] (1:master@Tremblay) Sending "Task_14" (of 20) to mailbox "slave-4"
-> [  3.259645] (1:master@Tremblay) Sending "Task_15" (of 20) to mailbox "slave-0"
-> [  3.261911] (1:master@Tremblay) Sending "Task_16" (of 20) to mailbox "slave-1"
-> [  3.427077] (1:master@Tremblay) Sending "Task_17" (of 20) to mailbox "slave-2"
-> [  3.650387] (1:master@Tremblay) Sending "Task_18" (of 20) to mailbox "slave-3"
-> [  4.059157] (1:master@Tremblay) Sending "Task_19" (of 20) to mailbox "slave-4"
-> [  4.511719] (1:master@Tremblay) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [  4.511914] (2:slave@Tremblay) I'm done. See you!
-> [  4.530929] (3:slave@Jupiter) I'm done. See you!
-> [  4.556637] (4:slave@Fafard) I'm done. See you!
-> [  5.106807] (5:slave@Ginette) I'm done. See you!
-> [  5.568256] (0:@) Simulation time 5.56826
-> [  5.568256] (6:slave@Bourassa) I'm done. See you!
\ No newline at end of file
+> [  0.164270] (1:master@Tremblay) Sending "Task_2" (of 20) to mailbox "slave-2"
+> [  0.316349] (1:master@Tremblay) Sending "Task_3" (of 20) to mailbox "slave-3"
+> [  0.434977] (1:master@Tremblay) Sending "Task_4" (of 20) to mailbox "slave-4"
+> [  0.562492] (1:master@Tremblay) Sending "Task_5" (of 20) to mailbox "slave-0"
+> [  0.564757] (1:master@Tremblay) Sending "Task_6" (of 20) to mailbox "slave-1"
+> [  0.981618] (1:master@Tremblay) Sending "Task_7" (of 20) to mailbox "slave-2"
+> [  1.133696] (1:master@Tremblay) Sending "Task_8" (of 20) to mailbox "slave-3"
+> [  1.584703] (1:master@Tremblay) Sending "Task_9" (of 20) to mailbox "slave-4"
+> [  1.721105] (1:master@Tremblay) Sending "Task_10" (of 20) to mailbox "slave-0"
+> [  1.723370] (1:master@Tremblay) Sending "Task_11" (of 20) to mailbox "slave-1"
+> [  1.885375] (1:master@Tremblay) Sending "Task_12" (of 20) to mailbox "slave-2"
+> [  2.037454] (1:master@Tremblay) Sending "Task_13" (of 20) to mailbox "slave-3"
+> [  2.734429] (1:master@Tremblay) Sending "Task_14" (of 20) to mailbox "slave-4"
+> [  2.879718] (1:master@Tremblay) Sending "Task_15" (of 20) to mailbox "slave-0"
+> [  2.881983] (1:master@Tremblay) Sending "Task_16" (of 20) to mailbox "slave-1"
+> [  3.043989] (1:master@Tremblay) Sending "Task_17" (of 20) to mailbox "slave-2"
+> [  3.196067] (1:master@Tremblay) Sending "Task_18" (of 20) to mailbox "slave-3"
+> [  3.884155] (1:master@Tremblay) Sending "Task_19" (of 20) to mailbox "slave-4"
+> [  4.038331] (1:master@Tremblay) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [  4.038526] (2:slave@Tremblay) I'm done. See you!
+> [  4.057541] (3:slave@Jupiter) I'm done. See you!
+> [  4.083249] (4:slave@Fafard) I'm done. See you!
+> [  4.931805] (5:slave@Ginette) I'm done. See you!
+> [  5.094868] (0:@) Simulation time 5.09487
+> [  5.094868] (6:slave@Bourassa) I'm done. See you!
index 43f6a67..40313db 100644 (file)
@@ -7,27 +7,27 @@ $ $SG_TEST_EXENV masterslave/masterslave_mailbox$EXEEXT ${srcdir:=.}/small_platf
 > [  0.000000] (1:master@Tremblay) Sending "Task_0" (of 20) to mailbox "slave-0"
 > [  0.002265] (1:master@Tremblay) Sending "Task_1" (of 20) to mailbox "slave-1"
 > [  0.171420] (1:master@Tremblay) Sending "Task_2" (of 20) to mailbox "slave-2"
-> [  0.394731] (1:master@Tremblay) Sending "Task_3" (of 20) to mailbox "slave-3"
-> [  0.538511] (1:master@Tremblay) Sending "Task_4" (of 20) to mailbox "slave-4"
-> [  0.759487] (1:master@Tremblay) Sending "Task_5" (of 20) to mailbox "slave-0"
-> [  0.761752] (1:master@Tremblay) Sending "Task_6" (of 20) to mailbox "slave-1"
+> [  0.329817] (1:master@Tremblay) Sending "Task_3" (of 20) to mailbox "slave-3"
+> [  0.453549] (1:master@Tremblay) Sending "Task_4" (of 20) to mailbox "slave-4"
+> [  0.586168] (1:master@Tremblay) Sending "Task_5" (of 20) to mailbox "slave-0"
+> [  0.588433] (1:master@Tremblay) Sending "Task_6" (of 20) to mailbox "slave-1"
 > [  0.995917] (1:master@Tremblay) Sending "Task_7" (of 20) to mailbox "slave-2"
-> [  1.273383] (1:master@Tremblay) Sending "Task_8" (of 20) to mailbox "slave-3"
-> [  1.713389] (1:master@Tremblay) Sending "Task_9" (of 20) to mailbox "slave-4"
-> [  2.011560] (1:master@Tremblay) Sending "Task_10" (of 20) to mailbox "slave-0"
-> [  2.013826] (1:master@Tremblay) Sending "Task_11" (of 20) to mailbox "slave-1"
-> [  2.182980] (1:master@Tremblay) Sending "Task_12" (of 20) to mailbox "slave-2"
-> [  2.406291] (1:master@Tremblay) Sending "Task_13" (of 20) to mailbox "slave-3"
-> [  2.888267] (1:master@Tremblay) Sending "Task_14" (of 20) to mailbox "slave-4"
-> [  3.263634] (1:master@Tremblay) Sending "Task_15" (of 20) to mailbox "slave-0"
-> [  3.265899] (1:master@Tremblay) Sending "Task_16" (of 20) to mailbox "slave-1"
-> [  3.435054] (1:master@Tremblay) Sending "Task_17" (of 20) to mailbox "slave-2"
-> [  3.658365] (1:master@Tremblay) Sending "Task_18" (of 20) to mailbox "slave-3"
-> [  4.063145] (1:master@Tremblay) Sending "Task_19" (of 20) to mailbox "slave-4"
-> [  4.515708] (1:master@Tremblay) All tasks have been dispatched. Let's tell everybody the computation is over.
-> [  4.515903] (2:slave@Tremblay) I'm done. See you!
-> [  4.534917] (3:slave@Jupiter) I'm done. See you!
-> [  4.560625] (4:slave@Fafard) I'm done. See you!
-> [  5.110796] (5:slave@Ginette) I'm done. See you!
-> [  5.572245] (6:slave@Bourassa) I'm done. See you!
-> [  5.572245] (0:@) Simulation time 5.57224
\ No newline at end of file
+> [  1.154314] (1:master@Tremblay) Sending "Task_8" (of 20) to mailbox "slave-3"
+> [  1.608379] (1:master@Tremblay) Sending "Task_9" (of 20) to mailbox "slave-4"
+> [  1.749885] (1:master@Tremblay) Sending "Task_10" (of 20) to mailbox "slave-0"
+> [  1.752150] (1:master@Tremblay) Sending "Task_11" (of 20) to mailbox "slave-1"
+> [  1.921304] (1:master@Tremblay) Sending "Task_12" (of 20) to mailbox "slave-2"
+> [  2.079701] (1:master@Tremblay) Sending "Task_13" (of 20) to mailbox "slave-3"
+> [  2.763209] (1:master@Tremblay) Sending "Task_14" (of 20) to mailbox "slave-4"
+> [  2.913601] (1:master@Tremblay) Sending "Task_15" (of 20) to mailbox "slave-0"
+> [  2.915867] (1:master@Tremblay) Sending "Task_16" (of 20) to mailbox "slave-1"
+> [  3.085021] (1:master@Tremblay) Sending "Task_17" (of 20) to mailbox "slave-2"
+> [  3.243418] (1:master@Tremblay) Sending "Task_18" (of 20) to mailbox "slave-3"
+> [  3.918038] (1:master@Tremblay) Sending "Task_19" (of 20) to mailbox "slave-4"
+> [  4.077318] (1:master@Tremblay) All tasks have been dispatched. Let's tell everybody the computation is over.
+> [  4.077513] (2:slave@Tremblay) I'm done. See you!
+> [  4.096528] (3:slave@Jupiter) I'm done. See you!
+> [  4.122236] (4:slave@Fafard) I'm done. See you!
+> [  4.965689] (5:slave@Ginette) I'm done. See you!
+> [  5.133855] (6:slave@Bourassa) I'm done. See you!
+> [  5.133855] (0:@) Simulation time 5.13386
index 47fce16..9a246b7 100644 (file)
@@ -4,6 +4,7 @@ if(HAVE_MC)
   set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
 
   file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test/")
+  file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/chord/")
 
   add_executable(centralized centralized_mutex.c)
   add_executable(bugged1     bugged1.c)
@@ -12,7 +13,12 @@ if(HAVE_MC)
   add_executable(random_test random_test.c)
   add_executable(bugged1_liveness bugged1_liveness.c)
   add_executable(bugged2_liveness bugged2_liveness.c)
-  add_executable(test/test_heap_comparison test/test_heap_comparison.c)
+  add_executable(chord/chord_liveness chord/chord_liveness.c)
+  add_executable(test/snapshot_comparison1 test/snapshot_comparison1.c)
+  add_executable(test/snapshot_comparison2 test/snapshot_comparison2.c)
+  add_executable(test/snapshot_comparison3 test/snapshot_comparison3.c)
+  add_executable(test/snapshot_comparison4 test/snapshot_comparison4.c)
+  add_executable(test/snapshot_comparison5 test/snapshot_comparison5.c)
 
   target_link_libraries(centralized simgrid m )
   target_link_libraries(bugged1     simgrid m )
@@ -21,9 +27,14 @@ if(HAVE_MC)
   target_link_libraries(random_test     simgrid m )
   target_link_libraries(bugged1_liveness     simgrid m )
   target_link_libraries(bugged2_liveness     simgrid m )
-  target_link_libraries(test/test_heap_comparison     simgrid m )
+  target_link_libraries(chord/chord_liveness     simgrid m )
+  target_link_libraries(test/snapshot_comparison1     simgrid m )
+  target_link_libraries(test/snapshot_comparison2     simgrid m )
+  target_link_libraries(test/snapshot_comparison3     simgrid m )
+  target_link_libraries(test/snapshot_comparison4     simgrid m )
+  target_link_libraries(test/snapshot_comparison5     simgrid m )
 
-endif(HAVE_MC)
+endif()
 
 set(tesh_files
   ${tesh_files}
@@ -42,6 +53,8 @@ set(xml_files
   ${CMAKE_CURRENT_SOURCE_DIR}/deploy_mutex.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/deploy_random_test.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/platform.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/chord/deploy_chord_liveness.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/test/deploy_snapshot_comparison.xml
   PARENT_SCOPE
   )
 set(examples_src
@@ -55,7 +68,13 @@ set(examples_src
   ${CMAKE_CURRENT_SOURCE_DIR}/random_test.c
   ${CMAKE_CURRENT_SOURCE_DIR}/bugged1_liveness.h
   ${CMAKE_CURRENT_SOURCE_DIR}/bugged2_liveness.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/test/test_heap_comparison.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/chord/chord_liveness.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/chord/chord_liveness.h
+  ${CMAKE_CURRENT_SOURCE_DIR}/test/snapshot_comparison1.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/test/snapshot_comparison2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/test/snapshot_comparison3.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/test/snapshot_comparison4.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/test/snapshot_comparison5.c
   PARENT_SCOPE
   )
 set(bin_files
@@ -63,6 +82,8 @@ set(bin_files
   ${CMAKE_CURRENT_SOURCE_DIR}/parse_dwarf
   ${CMAKE_CURRENT_SOURCE_DIR}/promela_bugged1_liveness
   ${CMAKE_CURRENT_SOURCE_DIR}/promela_bugged2_liveness
+  ${CMAKE_CURRENT_SOURCE_DIR}/chord/promela_chord_liveness
+  ${CMAKE_CURRENT_SOURCE_DIR}/test/promela
   PARENT_SCOPE
   )
 set(txt_files
index 37a287c..b646d82 100644 (file)
@@ -31,12 +31,9 @@ int coordinator(int argc, char *argv[])
 
   while (1) {
     MSG_task_receive(&task, "coordinator");
-    XBT_INFO("task coordinator : %p", task);
     const char *kind = MSG_task_get_name(task); 
-    XBT_INFO("kind coordinator : %p", kind);
     if (!strcmp(kind, "request")) {    
       char *req = MSG_task_get_data(task);
-      XBT_INFO("req coordinator : %p", req);
       if (CS_used) {           
         XBT_INFO("CS already used.");
       } else {               
@@ -44,7 +41,6 @@ int coordinator(int argc, char *argv[])
           XBT_INFO("CS idle. Grant immediatly");
           MC_compare();
           answer = MSG_task_create("grant", 0, 1000, NULL);
-          XBT_INFO("answer coordinator : %p", answer);
           MSG_task_send(answer, req);
           CS_used = 1;
           answer = NULL;
@@ -67,7 +63,6 @@ int client(int argc, char *argv[])
   int my_pid = MSG_process_get_PID(MSG_process_self());
 
   char *my_mailbox = bprintf("%s", argv[1]);
-  XBT_INFO("my mailbox client : %p", my_mailbox);
   msg_task_t grant = NULL, release = NULL;
 
 
@@ -83,9 +78,7 @@ int client(int argc, char *argv[])
     }
 
     MSG_task_receive(&grant, my_mailbox);
-    XBT_INFO("grant client : %p", grant);
     const char *kind = MSG_task_get_name(grant);
-    XBT_INFO("kind client : %p", kind);
 
     if((strcmp(my_mailbox, "1") == 0) && (strcmp("grant", kind) == 0)){
       cs = 1;
@@ -102,7 +95,6 @@ int client(int argc, char *argv[])
     MSG_process_sleep(1);
 
     release = MSG_task_create("release", 0, 1000, NULL);
-    XBT_INFO("release coordinator : %p", release);
     MSG_task_send(release, "coordinator");
 
     release = NULL;
diff --git a/examples/msg/mc/bugged1_liveness.tesh b/examples/msg/mc/bugged1_liveness.tesh
new file mode 100644 (file)
index 0000000..5f1d3da
--- /dev/null
@@ -0,0 +1,60 @@
+#! ./tesh
+
+! expect signal SIGABRT
+! timeout 60
+$ ${bindir:=.}/bugged1_liveness --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
+> [  0.000000] (0:@) type in variable = 2
+> [  0.000000] (0:@) Check the liveness property promela_bugged1_liveness
+> [  0.000000] (2:client@Fafard) Ask the request
+> [  0.000000] (3:client@Boivin) Ask the request
+> [  0.000000] (2:client@Fafard) Propositions changed : r=1, cs=0
+> [  0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly
+> [  0.000000] (3:client@Boivin) 2 got the answer. Sleep a bit and release it
+> [  0.000000] (1:coordinator@Tremblay) CS release. resource now idle
+> [  4.000000] (3:client@Boivin) Ask the request
+> [  0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly
+> [  4.000000] (3:client@Boivin) 2 got the answer. Sleep a bit and release it
+> [  0.000000] (1:coordinator@Tremblay) CS release. resource now idle
+> [  8.000000] (3:client@Boivin) Ask the request
+> [  0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly
+> [  0.000000] (0:@) Next pair (depth = 33, 2 interleave) already reached !
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) |             ACCEPTANCE CYCLE            |
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) Counter-example that violates formula :
+> [  0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)client] iSend (src=client, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(2)client -> (1)coordinator])
+> [  0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)client] Wait (comm=(verbose only) [(2)client -> (1)coordinator])
+> [  0.000000] (0:@) [(2)client] iRecv (dst=client, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
+> [  0.000000] (0:@) [(1)coordinator] iSend (src=coordinator, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)client] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
+> [  0.000000] (0:@) [(3)client] iRecv (dst=client, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(1)coordinator -> (3)client])
+> [  0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)client] Wait (comm=(verbose only) [(1)coordinator -> (3)client])
+> [  0.000000] (0:@) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
+> [  0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)client] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
+> [  0.000000] (0:@) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
+> [  0.000000] (0:@) [(1)coordinator] iSend (src=coordinator, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)client] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
+> [  0.000000] (0:@) [(3)client] iRecv (dst=client, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(1)coordinator -> (3)client])
+> [  0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)client] Wait (comm=(verbose only) [(1)coordinator -> (3)client])
+> [  0.000000] (0:@) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
+> [  0.000000] (0:@) [(1)coordinator] iRecv (dst=coordinator, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)client] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
+> [  0.000000] (0:@) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)coordinator] Wait (comm=(verbose only) [(3)client -> (1)coordinator])
+> [  0.000000] (0:@) Expanded pairs = 34
+> [  0.000000] (0:@) Visited pairs = 32
+> [  0.000000] (0:@) Expanded / Visited = 0.941176
similarity index 77%
rename from examples/msg/chord/chord_before_dsend.c
rename to examples/msg/mc/chord/chord_liveness.c
index e70a6d1..4856395 100644 (file)
 #include "xbt/log.h"
 #include "xbt/asserts.h"
 #include "simgrid/modelchecker.h"
+#include "chord_liveness.h"
+#include "mc/mc.h"
 
-XBT_LOG_NEW_DEFAULT_CATEGORY(msg_chord,
-                             "Messages specific for this msg example");
+/** @addtogroup MSG_examples
+ *
+ *  - <b>chord/chord.c: Classical Chord P2P protocol</b>
+ *    This example implements the well known Chord P2P protocol. Its
+ *    main advantage is that it constitute a fully working non-trivial
+ *    example. In addition, its implementation is rather efficient, as 
+ *    demonstrated in http://hal.inria.fr/inria-00602216/
+ */
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(chord_liveness,
+                             "Messages specific for this example");
 
 #define COMM_SIZE 10
 #define COMP_SIZE 0
@@ -27,18 +39,20 @@ static int periodic_fix_fingers_delay = 120;
 static int periodic_check_predecessor_delay = 120;
 static int periodic_lookup_delay = 10;
 
-/**
+//extern long int smx_total_comms;
+
+/*
  * Finger element.
  */
-typedef struct finger {
+typedef struct s_finger {
   int id;
   char mailbox[MAILBOX_NAME_SIZE]; // string representation of the id
 } s_finger_t, *finger_t;
 
-/**
+/*
  * Node data.
  */
-typedef struct node {
+typedef struct s_node {
   int id;                                 // my id
   char mailbox[MAILBOX_NAME_SIZE];        // my mailbox name (string representation of the id)
   s_finger_t *fingers;                    // finger table, of size nb_bits (fingers[0] is my successor)
@@ -46,7 +60,6 @@ typedef struct node {
   char pred_mailbox[MAILBOX_NAME_SIZE];   // predecessor's mailbox name
   int next_finger_to_fix;                 // index of the next finger to fix in fix_fingers()
   msg_comm_t comm_receive;                // current communication to receive
-  xbt_dynar_t comms;                      // current communications being sent
   double last_change_date;                // last time I changed a finger or my predecessor
 } s_node_t, *node_t;
 
@@ -63,10 +76,10 @@ typedef enum {
   TASK_PREDECESSOR_LEAVING
 } e_task_type_t;
 
-/**
+/*
  * Data attached with the tasks sent and received
  */
-typedef struct task_data {
+typedef struct s_task_data {
   e_task_type_t type;                     // type of task
   int request_id;                         // id paramater (used by some types of tasks)
   int request_finger;                     // finger parameter (used by some types of tasks)
@@ -79,10 +92,11 @@ static int *powers2;
 
 // utility functions
 static void chord_initialize(void);
+static void chord_exit(void);
 static int normalize(int id);
 static int is_in_interval(int id, int start, int end);
 static void get_mailbox(int host_id, char* mailbox);
-static void task_data_destroy(task_data_t task_data);
+static void task_free(void* task);
 static void print_finger_table(node_t node);
 static void set_finger(node_t node, int finger_index, int id);
 static void set_predecessor(node_t node, int predecessor_id);
@@ -105,7 +119,10 @@ static void remote_notify(node_t node, int notify_to, int predecessor_candidate_
 static void fix_fingers(node_t node);
 static void check_predecessor(node_t node);
 static void random_lookup(node_t);
-static void quit_notify(node_t node, int to);
+static void quit_notify(node_t node);
+
+/* Global variable corresponding to atomic proposition */
+int node_join = 0;
 
 /**
  * \brief Global initialization of the Chord simulation.
@@ -124,6 +141,11 @@ static void chord_initialize(void)
   XBT_DEBUG("Sets nb_keys to %d", nb_keys);
 }
 
+static void chord_exit(void)
+{
+  xbt_free(powers2);
+}
+
 /**
  * \brief Turns an id into an equivalent id in [0, nb_keys).
  * \param id an id
@@ -136,7 +158,7 @@ static int normalize(int id)
 }
 
 /**
- * \brief Returns whether a id belongs to the interval [start, end].
+ * \brief Returns whether an id belongs to the interval [start, end].
  *
  * The parameters are noramlized to make sure they are between 0 and nb_keys - 1).
  * 1 belongs to [62, 3]
@@ -181,12 +203,15 @@ static void get_mailbox(int node_id, char* mailbox)
 }
 
 /**
- * \brief Frees the memory used by some task data.
- * \param task_data the task data to destroy
+ * \brief Frees the memory used by a task.
+ * \param task the MSG task to destroy
  */
-static void task_data_destroy(task_data_t task_data)
+static void task_free(void* task)
 {
-  xbt_free(task_data);
+  // TODO add a parameter data_free_function to MSG_task_create?
+  xbt_free(MSG_task_get_data(task));
+  MSG_task_destroy(task);
+  task = NULL;
 }
 
 /**
@@ -195,7 +220,7 @@ static void task_data_destroy(task_data_t task_data)
  */
 static void print_finger_table(node_t node)
 {
-  if (XBT_LOG_ISENABLED(msg_chord, xbt_log_priority_verbose)) {
+  if (XBT_LOG_ISENABLED(chord_liveness, xbt_log_priority_verbose)) {
     int i;
     XBT_VERB("My finger table:");
     XBT_VERB("Start | Succ ");
@@ -259,9 +284,7 @@ int node(int argc, char *argv[])
 
   double init_time = MSG_get_clock();
   msg_task_t task_received = NULL;
-  msg_comm_t comm_send = NULL;
   int i;
-  int index;
   int join_success = 0;
   double deadline;
   double next_stabilize_date = init_time + periodic_stabilize_delay;
@@ -276,7 +299,6 @@ int node(int argc, char *argv[])
   node.id = atoi(argv[1]);
   get_mailbox(node.id, node.mailbox);
   node.next_finger_to_fix = 0;
-  node.comms = xbt_dynar_new(sizeof(msg_comm_t), NULL);
   node.fingers = xbt_new0(s_finger_t, nb_bits);
   node.last_change_date = init_time;
 
@@ -303,12 +325,19 @@ int node(int argc, char *argv[])
     XBT_DEBUG("Hey! Let's join the system.");
 
     join_success = join(&node, known_id);
+
+    if(join_success){
+      XBT_INFO("Node %d joined the ring", node.id);
+      node_join = 1; 
+      //MC_compare();
+    }
   }
 
   if (join_success) {
+
     while (MSG_get_clock() < init_time + deadline
-//     && MSG_get_clock() < node.last_change_date + 1000
-       && MSG_get_clock() < max_simulation_time) {
+//      && MSG_get_clock() < node.last_change_date + 1000
+        && MSG_get_clock() < max_simulation_time) {
 
       if (node.comm_receive == NULL) {
         task_received = NULL;
@@ -331,65 +360,52 @@ int node(int argc, char *argv[])
           check_predecessor(&node);
           next_check_predecessor_date = MSG_get_clock() + periodic_check_predecessor_delay;
         }
-       else if (MSG_get_clock() >= next_lookup_date) {
-         random_lookup(&node);
-         next_lookup_date = MSG_get_clock() + periodic_lookup_delay;
-       }
+        else if (MSG_get_clock() >= next_lookup_date) {
+          random_lookup(&node);
+          next_lookup_date = MSG_get_clock() + periodic_lookup_delay;
+        }
         else {
           // nothing to do: sleep for a while
           MSG_process_sleep(5);
         }
-      }
-      else {
-        // a transfer has occured
+      }else{
 
-        msg_error_t status = MSG_comm_get_status(node.comm_receive);
+        if (node.comm_receive) {
 
-        if (status != MSG_OK) {
-          XBT_DEBUG("Failed to receive a task. Nevermind.");
-          node.comm_receive = NULL;
-        }
-        else {
-          // the task was successfully received
-          MSG_comm_destroy(node.comm_receive);
-          node.comm_receive = NULL;
-          handle_task(&node, task_received);
-        }
-      }
+          XBT_INFO("A transfer has occured");
+
+          //MC_compare();
+
+          // a transfer has occured
+
+          msg_error_t status = MSG_comm_get_status(node.comm_receive);
 
-      // see if some communications are finished
-      while ((index = MSG_comm_testany(node.comms)) != -1) {
-        comm_send = xbt_dynar_get_as(node.comms, index, msg_comm_t);
-        msg_error_t status = MSG_comm_get_status(comm_send);
-        xbt_dynar_remove_at(node.comms, index, &comm_send);
-        XBT_DEBUG("Communication %p is finished with status %d, dynar size is now %lu",
-            comm_send, status, xbt_dynar_length(node.comms));
-       msg_task_t task = MSG_comm_get_task(comm_send);
-        MSG_comm_destroy(comm_send);
-       if (status != MSG_OK) {
-         task_data_destroy(MSG_task_get_data(task));
-         MSG_task_destroy(task);
-       }
+          if (status != MSG_OK) {
+            XBT_INFO("Failed to receive a task. Nevermind.");
+            MSG_comm_destroy(node.comm_receive);
+            node.comm_receive = NULL;
+          }
+          else {
+            // the task was successfully received
+            XBT_INFO("The task was successfully received by node %d", node.id);
+            MSG_comm_destroy(node.comm_receive);
+            node.comm_receive = NULL;
+            handle_task(&node, task_received);
+          }
+        }
       }
     }
 
-    // clean unfinished comms sent
-   /* unsigned int cursor;
-    xbt_dynar_foreach(node.comms, cursor, comm_send) {
-      msg_task_t task = MSG_comm_get_task(comm_send);
-      MSG_task_cancel(task);
-      task_data_destroy(MSG_task_get_data(task));
-      MSG_task_destroy(task);
-      MSG_comm_destroy(comm_send);
-      // FIXME: the task is actually not destroyed because MSG thinks that the other side (whose process is dead) is still using it
-    }*/
+    if (node.comm_receive) {
+      MSG_comm_destroy(node.comm_receive);
+      node.comm_receive = NULL;
+    }
 
     // leave the ring
     leave(&node);
   }
 
   // stop the simulation
-  xbt_dynar_free(&node.comms);
   xbt_free(node.fingers);
   return 0;
 }
@@ -403,7 +419,6 @@ int node(int argc, char *argv[])
 static void handle_task(node_t node, msg_task_t task) {
 
   XBT_DEBUG("Handling task %p", task);
-  msg_comm_t comm = NULL;
   char mailbox[MAILBOX_NAME_SIZE];
   task_data_t task_data = (task_data_t) MSG_task_get_data(task);
   e_task_type_t type = task_data->type;
@@ -419,10 +434,9 @@ static void handle_task(node_t node, msg_task_t task) {
         task_data->answer_id = node->fingers[0].id;
         XBT_DEBUG("Sending back a 'Find Successor Answer' to %s (mailbox %s): the successor of %d is %d",
             task_data->issuer_host_name,
-           task_data->answer_to,
+            task_data->answer_to,
             task_data->request_id, task_data->answer_id);
-        comm = MSG_task_isend(task, task_data->answer_to);
-        xbt_dynar_push(node->comms, &comm);
+        MSG_task_dsend(task, task_data->answer_to, task_free);
       }
       else {
         // otherwise, forward the request to the closest preceding finger in my table
@@ -430,8 +444,7 @@ static void handle_task(node_t node, msg_task_t task) {
         XBT_DEBUG("Forwarding the 'Find Successor' request for id %d to my closest preceding finger %d",
             task_data->request_id, closest);
         get_mailbox(closest, mailbox);
-        comm = MSG_task_isend(task, mailbox);
-        xbt_dynar_push(node->comms, &comm);
+        MSG_task_dsend(task, mailbox, task_free);
       }
       break;
 
@@ -442,16 +455,14 @@ static void handle_task(node_t node, msg_task_t task) {
       XBT_DEBUG("Sending back a 'Get Predecessor Answer' to %s via mailbox '%s': my predecessor is %d",
           task_data->issuer_host_name,
           task_data->answer_to, task_data->answer_id);
-      comm = MSG_task_isend(task, task_data->answer_to);
-      xbt_dynar_push(node->comms, &comm);
+      MSG_task_dsend(task, task_data->answer_to, task_free);
       break;
 
     case TASK_NOTIFY:
       // someone is telling me that he may be my new predecessor
       XBT_DEBUG("Receiving a 'Notify' request from %s", task_data->issuer_host_name);
       notify(node, task_data->request_id);
-      task_data_destroy(task_data);
-      MSG_task_destroy(task);
+      task_free(task);
       break;
 
     case TASK_PREDECESSOR_LEAVING:
@@ -459,8 +470,7 @@ static void handle_task(node_t node, msg_task_t task) {
       XBT_DEBUG("Receiving a 'Predecessor Leaving' message from %s", task_data->issuer_host_name);
       // modify my predecessor
       set_predecessor(node, task_data->request_id);
-      task_data_destroy(task_data);
-      MSG_task_destroy(task);
+      task_free(task);
       /*TODO :
       >> notify my new predecessor
       >> send a notify_predecessors !!
@@ -472,8 +482,7 @@ static void handle_task(node_t node, msg_task_t task) {
       XBT_DEBUG("Receiving a 'Successor Leaving' message from %s", task_data->issuer_host_name);
       // modify my successor FIXME : this should be implicit ?
       set_finger(node, 0, task_data->request_id);
-      task_data_destroy(task_data);
-      MSG_task_destroy(task);
+      task_free(task);
       /* TODO
       >> notify my new successor
       >> update my table & predecessors table */
@@ -481,9 +490,8 @@ static void handle_task(node_t node, msg_task_t task) {
 
     case TASK_FIND_SUCCESSOR_ANSWER:
     case TASK_GET_PREDECESSOR_ANSWER:
-      XBT_DEBUG("Ignoring unexpected task of type %d (%p)", type, task);
-      task_data_destroy(task_data);
-      MSG_task_destroy(task);
+      XBT_DEBUG("Ignoring unexpected task of type %d (%p)", (int)type, task);
+      task_free(task);
       break;
   }
 }
@@ -511,6 +519,13 @@ static int join(node_t node, int known_id)
   XBT_INFO("Joining the ring with id %d, knowing node %d", node->id, known_id);
   set_predecessor(node, -1); // no predecessor (yet)
 
+  /*
+  int i;
+  for (i = 0; i < nb_bits; i++) {
+    set_finger(node, i, known_id);
+  }
+  */
+
   int successor_id = remote_find_successor(node, known_id, node->id);
   if (successor_id == -1) {
     XBT_INFO("Cannot join the ring.");
@@ -530,51 +545,41 @@ static int join(node_t node, int known_id)
 static void leave(node_t node)
 {
   XBT_DEBUG("Well Guys! I Think it's time for me to quit ;)");
-  quit_notify(node, 1);  // notify to my successor ( >>> 1 );
-  quit_notify(node, -1); // notify my predecessor  ( >>> -1);
-  // TODO ...
+  quit_notify(node);
 }
 
 /*
- * \brief Notifies the successor or the predecessor of the current node
+ * \brief Notifies the successor and the predecessor of the current node
  * of the departure
  * \param node the current node
- * \param to 1 to notify the successor, -1 to notify the predecessor
- * FIXME: notify both nodes with only one call
  */
-static void quit_notify(node_t node, int to)
+static void quit_notify(node_t node)
 {
-  /* TODO
-  task_data_t req_data = xbt_new0(s_task_data_t, 1);
-  req_data->request_id = node->id;
-  req_data->successor_id = node->fingers[0].id;
-  req_data->pred_id = node->pred_id;
+  char mailbox[MAILBOX_NAME_SIZE];
+  //send the PREDECESSOR_LEAVING to our successor
+  task_data_t req_data = xbt_new0(s_task_data_t,1);
+  req_data->type = TASK_PREDECESSOR_LEAVING;
+  req_data->request_id = node->pred_id;
+  get_mailbox(node->id, req_data->answer_to);
   req_data->issuer_host_name = MSG_host_get_name(MSG_host_self());
-  req_data->answer_to = NULL;
-  const char* task_name = NULL;
-  const char* to_mailbox = NULL;
-  if (to == 1) {    // notify my successor
-    to_mailbox = node->fingers[0].mailbox;
-    INFO2("Telling my Successor %d about my departure via mailbox %s",
-         node->fingers[0].id, to_mailbox);
-    req_data->type = TASK_PREDECESSOR_LEAVING;
-  }
-  else if (to == -1) {    // notify my predecessor
 
-    if (node->pred_id == -1) {
-      return;
-    }
+  msg_task_t task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data);
+  XBT_DEBUG("Sending a 'PREDECESSOR_LEAVING' to my successor %d",node->fingers[0].id);
+  MSG_task_send_with_timeout(task_sent, node->fingers[0].mailbox, timeout);
+
+  //send the SUCCESSOR_LEAVING to our predecessor
+  get_mailbox(node->pred_id, mailbox);
+  task_data_t req_data_s = xbt_new0(s_task_data_t,1);
+  req_data_s->type = TASK_SUCCESSOR_LEAVING;
+  req_data_s->request_id = node->fingers[0].id;
+  req_data_s->request_id = node->pred_id;
+  get_mailbox(node->id, req_data_s->answer_to);
+  req_data_s->issuer_host_name = MSG_host_get_name(MSG_host_self());
+
+  msg_task_t task_sent_s = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data_s);
+  XBT_DEBUG("Sending a 'SUCCESSOR_LEAVING' to my predecessor %d",node->pred_id);
+  MSG_task_send_with_timeout(task_sent_s, mailbox, timeout);
 
-    to_mailbox = node->pred_mailbox;
-    INFO2("Telling my Predecessor %d about my departure via mailbox %s",
-         node->pred_id, to_mailbox);
-    req_data->type = TASK_SUCCESSOR_LEAVING;
-  }
-  msg_task_t task = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data);
-  //char* mailbox = get_mailbox(to_mailbox);
-  msg_comm_t comm = MSG_task_isend(task, to_mailbox);
-  xbt_dynar_push(node->comms, &comm);
-  */
 }
 
 /**
@@ -622,8 +627,7 @@ static int remote_find_successor(node_t node, int ask_to, int id)
   if (res != MSG_OK) {
     XBT_DEBUG("Failed to send the 'Find Successor' request (task %p) to %d for id %d",
         task_sent, ask_to, id);
-    MSG_task_destroy(task_sent);
-    task_data_destroy(req_data);
+    task_free(task_sent);
   }
   else {
 
@@ -641,24 +645,31 @@ static int remote_find_successor(node_t node, int ask_to, int id)
 
       if (res != MSG_OK) {
         XBT_DEBUG("Failed to receive the answer to my 'Find Successor' request (task %p): %d",
-            task_sent, res);
+                  task_sent, (int)res);
         stop = 1;
-       MSG_comm_destroy(node->comm_receive);
-       node->comm_receive = NULL;
+        MSG_comm_destroy(node->comm_receive);
+        node->comm_receive = NULL;
       }
       else {
         msg_task_t task_received = MSG_comm_get_task(node->comm_receive);
         XBT_DEBUG("Received a task (%p)", task_received);
         task_data_t ans_data = MSG_task_get_data(task_received);
 
-       if (MC_is_active()) {
-         MC_assert(task_received == task_sent);
-       }
+        if (MC_is_active()) {
+          // the model-checker is expected to find a counter-example here. 
+         // 
+         // As you can see in the test right below, task_received is not always equal to task_sent 
+         // (as messages from differing round can interleave). But the previous version of this code 
+         // wrongly assumed that, leading to problems. But this only occured on large platforms,
+         // leading to hardly usable traces. So we used the model-checker to track down the issue, 
+         // and we came down to this test, that explained the bug in a snap.
+          //MC_assert(task_received == task_sent);
+        }
 
         if (task_received != task_sent) {
           // this is not the expected answer
-         MSG_comm_destroy(node->comm_receive);
-         node->comm_receive = NULL;
+          MSG_comm_destroy(node->comm_receive);
+          node->comm_receive = NULL;
           handle_task(node, task_received);
         }
         else {
@@ -667,10 +678,9 @@ static int remote_find_successor(node_t node, int ask_to, int id)
               ans_data->request_id, task_received, id, ans_data->answer_id);
           successor = ans_data->answer_id;
           stop = 1;
-         MSG_comm_destroy(node->comm_receive);
-         node->comm_receive = NULL;
-          MSG_task_destroy(task_received);
-          task_data_destroy(req_data);
+          MSG_comm_destroy(node->comm_receive);
+          node->comm_receive = NULL;
+          task_free(task_received);
         }
       }
     } while (!stop);
@@ -705,8 +715,7 @@ static int remote_get_predecessor(node_t node, int ask_to)
   if (res != MSG_OK) {
     XBT_DEBUG("Failed to send the 'Get Predecessor' request (task %p) to %d",
         task_sent, ask_to);
-    MSG_task_destroy(task_sent);
-    task_data_destroy(req_data);
+    task_free(task_sent);
   }
   else {
 
@@ -724,22 +733,22 @@ static int remote_get_predecessor(node_t node, int ask_to)
 
       if (res != MSG_OK) {
         XBT_DEBUG("Failed to receive the answer to my 'Get Predecessor' request (task %p): %d",
-            task_sent, res);
+            task_sent, (int)res);
         stop = 1;
-       MSG_comm_destroy(node->comm_receive);
-       node->comm_receive = NULL;
+        MSG_comm_destroy(node->comm_receive);
+        node->comm_receive = NULL;
       }
       else {
         msg_task_t task_received = MSG_comm_get_task(node->comm_receive);
         task_data_t ans_data = MSG_task_get_data(task_received);
 
-       if (MC_is_active()) {
-         MC_assert(task_received == task_sent);
-       }
+        /*if (MC_is_active()) {
+          MC_assert(task_received == task_sent);
+         }*/
 
         if (task_received != task_sent) {
-         MSG_comm_destroy(node->comm_receive);
-         node->comm_receive = NULL;
+          MSG_comm_destroy(node->comm_receive);
+          node->comm_receive = NULL;
           handle_task(node, task_received);
         }
         else {
@@ -747,10 +756,9 @@ static int remote_get_predecessor(node_t node, int ask_to)
               task_received, ask_to, ans_data->answer_id);
           predecessor_id = ans_data->answer_id;
           stop = 1;
-         MSG_comm_destroy(node->comm_receive);
-         node->comm_receive = NULL;
-          MSG_task_destroy(task_received);
-          task_data_destroy(req_data);
+          MSG_comm_destroy(node->comm_receive);
+          node->comm_receive = NULL;
+          task_free(task_received);
         }
       }
     } while (!stop);
@@ -832,19 +840,18 @@ static void notify(node_t node, int predecessor_candidate_id) {
  */
 static void remote_notify(node_t node, int notify_id, int predecessor_candidate_id) {
 
-  task_data_t req_data = xbt_new0(s_task_data_t, 1);
-  req_data->type = TASK_NOTIFY;
-  req_data->request_id = predecessor_candidate_id;
-  req_data->issuer_host_name = MSG_host_get_name(MSG_host_self());
-
-  // send a "Notify" request to notify_id
-  msg_task_t task = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data);
-  XBT_DEBUG("Sending a 'Notify' request (task %p) to %d", task, notify_id);
-  char mailbox[MAILBOX_NAME_SIZE];
-  get_mailbox(notify_id, mailbox);
-  msg_comm_t comm = MSG_task_isend(task, mailbox);
-  xbt_dynar_push(node->comms, &comm);
-}
+      task_data_t req_data = xbt_new0(s_task_data_t, 1);
+      req_data->type = TASK_NOTIFY;
+      req_data->request_id = predecessor_candidate_id;
+      req_data->issuer_host_name = MSG_host_get_name(MSG_host_self());
+
+      // send a "Notify" request to notify_id
+      msg_task_t task = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data);
+      XBT_DEBUG("Sending a 'Notify' request (task %p) to %d", task, notify_id);
+      char mailbox[MAILBOX_NAME_SIZE];
+      get_mailbox(notify_id, mailbox);
+      MSG_task_dsend(task, mailbox, task_free);
+    }
 
 /**
  * \brief This function is called periodically.
@@ -888,20 +895,24 @@ static void random_lookup(node_t node)
   find_successor(node, id);
 }
 
+int predJoin(void){
+  return node_join;
+}
+
+
 /**
  * \brief Main function.
  */
 int main(int argc, char *argv[])
 {
-  if (argc < 3) {
+  MSG_init(&argc, argv);
+  /*if (argc < 3) {
     printf("Usage: %s [-nb_bits=n] [-timeout=t] platform_file deployment_file\n", argv[0]);
     printf("example: %s ../msg_platform.xml chord.xml\n", argv[0]);
     exit(1);
-  }
-
-  MSG_init(&argc, argv);
+    }*/
 
-  char **options = &argv[1];
+  char **options = &argv[0];
   while (!strncmp(options[0], "-", 1)) {
 
     int length = strlen("-nb_bits=");
@@ -913,29 +924,34 @@ int main(int argc, char *argv[])
 
       length = strlen("-timeout=");
       if (!strncmp(options[0], "-timeout=", length) && strlen(options[0]) > length) {
-       timeout = atoi(options[0] + length);
-       XBT_DEBUG("Set timeout to %d", timeout);
+        timeout = atoi(options[0] + length);
+        XBT_DEBUG("Set timeout to %d", timeout);
       }
       else {
-       xbt_assert(0, "Invalid chord option '%s'", options[0]);
+        xbt_die("Invalid chord option '%s'", options[0]);
       }
     }
     options++;
   }
 
-  const char* platform_file = options[0];
-  const char* application_file = options[1];
+  //const char* platform_file = options[0];
+  //const char* application_file = options[1];
 
   chord_initialize();
 
-  MSG_create_environment(platform_file);
+  MSG_config("model-check/property","promela_chord_liveness");
+  MC_automaton_new_propositional_symbol("join", &predJoin);
+
+  MSG_create_environment("../../msg_platform.xml");
 
   MSG_function_register("node", node);
-  MSG_launch_application(application_file);
+  MSG_launch_application("deploy_chord_liveness.xml");
 
   msg_error_t res = MSG_main();
-  XBT_INFO("Simulation time: %g", MSG_get_clock());
+  //XBT_CRITICAL("Messages created: %ld", smx_total_comms);
+  XBT_INFO("Simulated time: %g", MSG_get_clock());
 
+  chord_exit();
 
   if (res == MSG_OK)
     return 0;
diff --git a/examples/msg/mc/chord/chord_liveness.h b/examples/msg/mc/chord/chord_liveness.h
new file mode 100644 (file)
index 0000000..e522b77
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _CHORD_LIVENESS_H
+#define _CHORD_LIVENESS_H
+
+int predJoin(void);
+
+#endif
diff --git a/examples/msg/mc/chord/chord_neverjoin.tesh b/examples/msg/mc/chord/chord_neverjoin.tesh
new file mode 100644 (file)
index 0000000..5e64854
--- /dev/null
@@ -0,0 +1,31 @@
+#! ./tesh
+
+! expect signal SIGABRT
+! timeout 120
+$ ${bindir:=.}/chord_liveness --cfg=model-check:1 --cfg=contexts/factory:ucontext "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
+> [  0.000000] (0:@) type in variable = 2
+> [  0.000000] (0:@) Check the liveness property promela_chord_liveness
+> [  0.000000] (1:node@Jean_Yves) Joining the ring with id 14, knowing node 1
+> [  0.000000] (2:node@Boivin) Joining the ring with id 8, knowing node 1
+> [  0.000000] (3:node@Jacquelin) A transfer has occured
+> [  0.000000] (3:node@Jacquelin) The task was successfully received by node 1
+> [  0.000000] (1:node@Jean_Yves) Node 14 joined the ring
+> [  0.000000] (0:@) Next pair (depth = 11, 2 interleave) already reached !
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) |             ACCEPTANCE CYCLE            |
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) Counter-example that violates formula :
+> [  0.000000] (0:@) [(1)node] iSend (src=node, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)node] iSend (src=node, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)node] iRecv (dst=node, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)node] Wait (comm=(verbose only) [(1)node -> (3)node])
+> [  0.000000] (0:@) [(1)node] iRecv (dst=node, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)node] Test TRUE (comm=(verbose only) [(1)node -> (3)node])
+> [  0.000000] (0:@) [(3)node] iSend (src=node, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)node] Wait (comm=(verbose only) [(3)node -> (1)node])
+> [  0.000000] (0:@) [(1)node] iRecv (dst=node, buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)node] Test FALSE (comm=(verbose only))
+> [  0.000000] (0:@) Expanded pairs = 14
+> [  0.000000] (0:@) Visited pairs = 10
+> [  0.000000] (0:@) Expanded / Visited = 0.714286
\ No newline at end of file
diff --git a/examples/msg/mc/chord/deploy_chord_before_dsend_liveness.xml b/examples/msg/mc/chord/deploy_chord_before_dsend_liveness.xml
new file mode 100644 (file)
index 0000000..40b8ed9
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+
+  <process host="Gatien" function="node">
+    <argument value="48"/>        <!-- my id -->
+    <argument value="1"/>         <!-- known id -->
+    <argument value="4"/>        <!-- time to sleep before it starts-->
+    <argument value ="60"/>            <!-- deadline -->
+  </process>
+
+  <process host="McGee" function="node">
+    <argument value="42"/>        <!-- my id -->
+    <argument value="1"/>         <!-- known id -->
+    <argument value="3"/>        <!-- time to sleep before it starts-->
+    <argument value ="60"/>            <!-- deadline -->
+  </process>
+
+  <process host="Geoff" function="node">
+    <argument value="32"/>        <!-- my id -->
+    <argument value="1"/>         <!-- known id -->
+    <argument value="10"/>         <!-- time to sleep before it starts-->
+    <argument value ="60"/>            <!-- deadline -->
+  </process>
+  
+   <process host="Jacquelin" function="node">
+    <argument value="1"/>         <!-- my id -->
+    <argument value ="60"/>             <!-- deadline -->
+   </process>
+
+</platform>
diff --git a/examples/msg/mc/chord/deploy_chord_liveness.xml b/examples/msg/mc/chord/deploy_chord_liveness.xml
new file mode 100644 (file)
index 0000000..2f87049
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+  <process host="Jean_Yves" function="node">
+    <argument value="14"/>        <!-- my id -->
+    <argument value="1"/>         <!-- known id -->
+    <argument value="400"/>        <!-- time to sleep before it starts-->
+    <argument value ="600"/>           <!-- deadline -->
+  </process>
+  
+  <process host="Boivin" function="node">
+    <argument value="8"/>         <!-- my id -->
+    <argument value="1"/>         <!-- known id -->
+    <argument value="300"/>         <!-- time to sleep before it starts-->
+    <argument value ="600"/>           <!-- deadline -->
+  </process>
+
+  <process host="Jacquelin" function="node">
+    <argument value="1"/>         <!-- my id -->
+    <argument value ="600"/>             <!-- deadline -->
+  </process>
+
+</platform>
diff --git a/examples/msg/mc/chord/promela_chord_liveness b/examples/msg/mc/chord/promela_chord_liveness
new file mode 100644 (file)
index 0000000..0e9dd9d
--- /dev/null
@@ -0,0 +1,12 @@
+never { /* !(!(GFjoin)) */
+T0_init :    /* init */
+       if
+       :: (join) -> goto accept_S1
+       :: (1) -> goto T0_init
+       fi;
+accept_S1 :    /* 1 */
+       if
+       :: (join) -> goto accept_S1
+       :: (1) -> goto T0_init
+       fi;
+}
\ No newline at end of file
@@ -1,5 +1,5 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
 <platform version="3">
-  <process host="Tremblay" function="function" />
-</platform>
+  <process host="HostA" function="test"/>
+</platform>
\ No newline at end of file
diff --git a/examples/msg/mc/test/promela b/examples/msg/mc/test/promela
new file mode 100644 (file)
index 0000000..54b9747
--- /dev/null
@@ -0,0 +1,10 @@
+never { 
+T0_init :    /* init */
+       if
+       :: (1) -> goto accept_S2
+       fi;
+accept_S2 :    /* 1 */
+       if
+  :: (1) -> goto accept_S2
+  fi;      
+}
\ No newline at end of file
diff --git a/examples/msg/mc/test/snapshot_comparison1.c b/examples/msg/mc/test/snapshot_comparison1.c
new file mode 100644 (file)
index 0000000..982b146
--- /dev/null
@@ -0,0 +1,55 @@
+/* Copyright (c) 2012. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <msg/msg.h>
+#include <simgrid/modelchecker.h>
+#include "mc/mc.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(snapshot_comparison_liveness1, "Debug information for snasphot comparison liveness1 test example");
+
+int test(int argc, char **argv);
+
+int test(int argc, char **argv){
+
+  MSG_process_sleep(1);
+
+  XBT_INFO("**** Start test ****");
+  XBT_INFO("Take two successive snapshots (No modification)");
+
+  void *snap1 = MC_snapshot();
+
+  XBT_INFO("First snapshot");
+
+  MSG_process_sleep(1);
+  
+  void *snap2 = MC_snapshot();
+
+  MSG_process_sleep(1);
+
+  XBT_INFO("Second snapshot");
+
+  XBT_INFO("Test result : %d (0 = state equality, 1 = different states)", MC_compare_snapshots(snap1, snap2));
+  
+  XBT_INFO("**** End test ****");
+
+  return 0;
+}
+
+int main(int argc, char **argv){
+  MSG_init(&argc, argv);
+
+  MSG_config("model-check/property","promela");
+
+  MSG_create_environment("snapshot_comparison_platform.xml");
+
+  MSG_function_register("test", test);
+
+  MSG_launch_application("deploy_snapshot_comparison.xml");
+
+  MSG_main();
+
+  return 0;
+}
diff --git a/examples/msg/mc/test/snapshot_comparison1.tesh b/examples/msg/mc/test/snapshot_comparison1.tesh
new file mode 100644 (file)
index 0000000..1e50d31
--- /dev/null
@@ -0,0 +1,26 @@
+#! ./tesh
+
+! expect signal SIGABRT
+! timeout 120
+$ ${bindir:=.}/snapshot_comparison1 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
+> [  0.000000] (0:@) type in variable = 2
+> [  0.000000] (0:@) Check the liveness property promela
+> [  1.000000] (1:test@HostA) **** Start test ****
+> [  1.000000] (1:test@HostA) Take two successive snapshots (No modification)
+> [  1.000000] (1:test@HostA) First snapshot
+> [  3.000000] (1:test@HostA) Second snapshot
+> [  3.000000] (1:test@HostA) Test result : 0 (0 = state equality, 1 = different states)
+> [  3.000000] (1:test@HostA) **** End test ****
+> [  0.000000] (0:@) Next pair (depth = 5) already reached !
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) |             ACCEPTANCE CYCLE            |
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) Counter-example that violates formula :
+> [  0.000000] (0:@) [(1)test] MC_SNAPSHOT ((null))
+> [  0.000000] (0:@) [(1)test] MC_SNAPSHOT ((null))
+> [  0.000000] (0:@) [(1)test] MC_COMPARE_SNAPSHOTS ((null))
+> [  0.000000] (0:@) End of system requests but evolution in Büchi automaton
+> [  0.000000] (0:@) Expanded pairs = 5
+> [  0.000000] (0:@) Visited pairs = 4
+> [  0.000000] (0:@) Expanded / Visited = 0.800000
diff --git a/examples/msg/mc/test/snapshot_comparison2.c b/examples/msg/mc/test/snapshot_comparison2.c
new file mode 100644 (file)
index 0000000..e3b04b0
--- /dev/null
@@ -0,0 +1,60 @@
+/* Copyright (c) 2012. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <msg/msg.h>
+#include <simgrid/modelchecker.h>
+#include "mc/mc.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(snapshot_comparison_liveness2, "Debug information for snasphot comparison liveness2 test example");
+
+int test(int argc, char **argv);
+
+int test(int argc, char **argv){
+
+  MSG_process_sleep(1);
+
+  XBT_INFO("**** Start test ****");
+  XBT_INFO("Malloc after first snapshot");
+
+  void *snap1 = MC_snapshot();
+
+  MSG_process_sleep(1);
+
+  XBT_INFO("First snapshot");
+
+  char *toto = xbt_malloc(5);
+  XBT_INFO("Toto allocated");
+
+  void *snap2 = MC_snapshot();
+
+  MSG_process_sleep(1);
+
+  XBT_INFO("Second snapshot");
+
+  XBT_INFO("Test result : %d (0 = state equality, 1 = different states)", MC_compare_snapshots(snap1, snap2));
+  
+  XBT_INFO("**** End test ****");
+
+  xbt_free(toto);
+
+  return 0;
+}
+
+int main(int argc, char **argv){
+  MSG_init(&argc, argv);
+
+  MSG_config("model-check/property","promela");
+
+  MSG_create_environment("snapshot_comparison_platform.xml");
+
+  MSG_function_register("test", test);
+
+  MSG_launch_application("deploy_snapshot_comparison.xml");
+
+  MSG_main();
+
+  return 0;
+}
diff --git a/examples/msg/mc/test/snapshot_comparison2.tesh b/examples/msg/mc/test/snapshot_comparison2.tesh
new file mode 100644 (file)
index 0000000..bb14f75
--- /dev/null
@@ -0,0 +1,27 @@
+#! ./tesh
+
+! expect signal SIGABRT
+! timeout 120
+$ ${bindir:=.}/snapshot_comparison2 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
+> [  0.000000] (0:@) type in variable = 2
+> [  0.000000] (0:@) Check the liveness property promela
+> [  1.000000] (1:test@HostA) **** Start test ****
+> [  1.000000] (1:test@HostA) Malloc after first snapshot
+> [  2.000000] (1:test@HostA) First snapshot
+> [  2.000000] (1:test@HostA) Toto allocated
+> [  3.000000] (1:test@HostA) Second snapshot
+> [  3.000000] (1:test@HostA) Test result : 1 (0 = state equality, 1 = different states)
+> [  3.000000] (1:test@HostA) **** End test ****
+> [  0.000000] (0:@) Next pair (depth = 5) already reached !
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) |             ACCEPTANCE CYCLE            |
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) Counter-example that violates formula :
+> [  0.000000] (0:@) [(1)test] MC_SNAPSHOT ((null))
+> [  0.000000] (0:@) [(1)test] MC_SNAPSHOT ((null))
+> [  0.000000] (0:@) [(1)test] MC_COMPARE_SNAPSHOTS ((null))
+> [  0.000000] (0:@) End of system requests but evolution in Büchi automaton
+> [  0.000000] (0:@) Expanded pairs = 5
+> [  0.000000] (0:@) Visited pairs = 4
+> [  0.000000] (0:@) Expanded / Visited = 0.800000
diff --git a/examples/msg/mc/test/snapshot_comparison3.c b/examples/msg/mc/test/snapshot_comparison3.c
new file mode 100644 (file)
index 0000000..8c3efd3
--- /dev/null
@@ -0,0 +1,66 @@
+/* Copyright (c) 2012. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <msg/msg.h>
+#include <simgrid/modelchecker.h>
+#include "mc/mc.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(snapshot_comparison_liveness3, "Debug information for snasphot comparison liveness3 test example");
+
+int test(int argc, char **argv);
+
+int test(int argc, char **argv){
+
+  MSG_process_sleep(1);
+
+  XBT_INFO("**** Start test ****");
+  XBT_INFO("Malloc and free after first snapshot");
+
+  char *toto = NULL;
+
+  void *snap1 = MC_snapshot();
+
+  MSG_process_sleep(1);
+
+  XBT_INFO("First snapshot");
+
+  toto = xbt_malloc(5);
+  XBT_INFO("Toto allocated");
+  xbt_free(toto);
+  toto = NULL;
+  XBT_INFO("Toto free");
+
+  MSG_process_sleep(1);
+
+  void *snap2 = MC_snapshot();
+
+  XBT_INFO("Second snapshot");
+
+  MC_ignore_stack("snap2", "test");   
+  MC_ignore_stack("snap1", "test");
+
+  XBT_INFO("Test result : %d (0 = state equality, 1 = different states)", MC_compare_snapshots(snap1, snap2));
+  
+  XBT_INFO("**** End test ****");
+
+  return 0;
+}
+
+int main(int argc, char **argv){
+  MSG_init(&argc, argv);
+  
+  MSG_config("model-check/property","promela");
+
+  MSG_create_environment("snapshot_comparison_platform.xml");
+
+  MSG_function_register("test", test);
+
+  MSG_launch_application("deploy_snapshot_comparison.xml");
+
+  MSG_main();
+
+  return 0;
+}
diff --git a/examples/msg/mc/test/snapshot_comparison3.tesh b/examples/msg/mc/test/snapshot_comparison3.tesh
new file mode 100644 (file)
index 0000000..d6cb549
--- /dev/null
@@ -0,0 +1,28 @@
+#! ./tesh
+
+! expect signal SIGABRT
+! timeout 120
+$ ${bindir:=.}/snapshot_comparison3 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
+> [  0.000000] (0:@) type in variable = 2
+> [  0.000000] (0:@) Check the liveness property promela
+> [  1.000000] (1:test@HostA) **** Start test ****
+> [  1.000000] (1:test@HostA) Malloc and free after first snapshot
+> [  2.000000] (1:test@HostA) First snapshot
+> [  2.000000] (1:test@HostA) Toto allocated
+> [  2.000000] (1:test@HostA) Toto free
+> [  3.000000] (1:test@HostA) Second snapshot
+> [  3.000000] (1:test@HostA) Test result : 0 (0 = state equality, 1 = different states)
+> [  3.000000] (1:test@HostA) **** End test ****
+> [  0.000000] (0:@) Next pair (depth = 5) already reached !
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) |             ACCEPTANCE CYCLE            |
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) Counter-example that violates formula :
+> [  0.000000] (0:@) [(1)test] MC_SNAPSHOT ((null))
+> [  0.000000] (0:@) [(1)test] MC_SNAPSHOT ((null))
+> [  0.000000] (0:@) [(1)test] MC_COMPARE_SNAPSHOTS ((null))
+> [  0.000000] (0:@) End of system requests but evolution in Büchi automaton
+> [  0.000000] (0:@) Expanded pairs = 5
+> [  0.000000] (0:@) Visited pairs = 4
+> [  0.000000] (0:@) Expanded / Visited = 0.800000
diff --git a/examples/msg/mc/test/snapshot_comparison4.c b/examples/msg/mc/test/snapshot_comparison4.c
new file mode 100644 (file)
index 0000000..e87c65c
--- /dev/null
@@ -0,0 +1,64 @@
+/* Copyright (c) 2012. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <msg/msg.h>
+#include <simgrid/modelchecker.h>
+#include "mc/mc.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(snapshot_comparison_liveness4, "Debug information for snasphot comparison liveness4 test example");
+
+int test(int argc, char **argv);
+
+int test(int argc, char **argv){
+
+  MSG_process_sleep(1);
+
+  XBT_INFO("**** Start test ****");
+  XBT_INFO("Free after first snapshot");
+  
+  char *toto = xbt_malloc(5);
+  XBT_INFO("Toto allocated");
+
+  void *snap1 = MC_snapshot();
+
+  MSG_process_sleep(1);
+
+  XBT_INFO("First snapshot");
+
+  xbt_free(toto);
+  XBT_INFO("Toto free");
+
+  void *snap2 = MC_snapshot();
+
+  XBT_INFO("Second snapshot");
+
+  MSG_process_sleep(1);
+  
+  MC_ignore_stack("snap2", "test");   
+  MC_ignore_stack("snap1", "test");
+
+  XBT_INFO("Test result : %d (0 = state equality, 1 = different states)", MC_compare_snapshots(snap1, snap2));
+  
+  XBT_INFO("**** End test ****");
+
+  return 0;
+}
+
+int main(int argc, char **argv){
+  MSG_init(&argc, argv);
+  
+  MSG_config("model-check/property","promela");
+
+  MSG_create_environment("snapshot_comparison_platform.xml");
+
+  MSG_function_register("test", test);
+
+  MSG_launch_application("deploy_snapshot_comparison.xml");
+
+  MSG_main();
+
+  return 0;
+}
diff --git a/examples/msg/mc/test/snapshot_comparison4.tesh b/examples/msg/mc/test/snapshot_comparison4.tesh
new file mode 100644 (file)
index 0000000..146d2b8
--- /dev/null
@@ -0,0 +1,28 @@
+#! ./tesh
+
+! expect signal SIGABRT
+! timeout 120
+$ ${bindir:=.}/snapshot_comparison4 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
+> [  0.000000] (0:@) type in variable = 2
+> [  0.000000] (0:@) Check the liveness property promela
+> [  1.000000] (1:test@HostA) **** Start test ****
+> [  1.000000] (1:test@HostA) Free after first snapshot
+> [  1.000000] (1:test@HostA) Toto allocated
+> [  2.000000] (1:test@HostA) First snapshot
+> [  2.000000] (1:test@HostA) Toto free
+> [  2.000000] (1:test@HostA) Second snapshot
+> [  3.000000] (1:test@HostA) Test result : 1 (0 = state equality, 1 = different states)
+> [  3.000000] (1:test@HostA) **** End test ****
+> [  0.000000] (0:@) Next pair (depth = 5) already reached !
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) |             ACCEPTANCE CYCLE            |
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) Counter-example that violates formula :
+> [  0.000000] (0:@) [(1)test] MC_SNAPSHOT ((null))
+> [  0.000000] (0:@) [(1)test] MC_SNAPSHOT ((null))
+> [  0.000000] (0:@) [(1)test] MC_COMPARE_SNAPSHOTS ((null))
+> [  0.000000] (0:@) End of system requests but evolution in Büchi automaton
+> [  0.000000] (0:@) Expanded pairs = 5
+> [  0.000000] (0:@) Visited pairs = 4
+> [  0.000000] (0:@) Expanded / Visited = 0.800000
\ No newline at end of file
diff --git a/examples/msg/mc/test/snapshot_comparison5.c b/examples/msg/mc/test/snapshot_comparison5.c
new file mode 100644 (file)
index 0000000..eef83c8
--- /dev/null
@@ -0,0 +1,64 @@
+/* Copyright (c) 2012. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <msg/msg.h>
+#include <simgrid/modelchecker.h>
+#include "mc/mc.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(snapshot_comparison_liveness5, "Debug information for snasphot comparison liveness5 test example");
+
+int test(int argc, char **argv);
+
+int test(int argc, char **argv){
+
+  MSG_process_sleep(1);
+
+  XBT_INFO("**** Start test ****");
+  XBT_INFO("Increment local variable");
+
+  int j = 0;
+  XBT_INFO("j = %d", j);
+
+  void *snap1 = MC_snapshot();
+
+  MSG_process_sleep(1);
+
+  XBT_INFO("First snapshot");
+
+  j = 1;
+  XBT_INFO("j = %d", j);
+  void *snap2 = MC_snapshot();
+
+  MSG_process_sleep(1);
+
+  XBT_INFO("Second snapshot");
+
+  MC_ignore_stack("snap2", "test");   
+  MC_ignore_stack("snap1", "test");
+
+  XBT_INFO("Test result : %d (0 = state equality, 1 = different states)", MC_compare_snapshots(snap1, snap2));
+  
+  XBT_INFO("**** End test ****");
+
+  return 0;
+}
+
+int main(int argc, char **argv){
+  MSG_init(&argc, argv);
+
+  MSG_config("model-check/property","promela");
+
+  MSG_create_environment("snapshot_comparison_platform.xml");
+
+  MSG_function_register("test", test);
+
+  MSG_launch_application("deploy_snapshot_comparison.xml");
+
+  MSG_main();
+
+  return 0;
+}
diff --git a/examples/msg/mc/test/snapshot_comparison5.tesh b/examples/msg/mc/test/snapshot_comparison5.tesh
new file mode 100644 (file)
index 0000000..8df68da
--- /dev/null
@@ -0,0 +1,28 @@
+#! ./tesh
+
+! expect signal SIGABRT
+! timeout 120
+$ ${bindir:=.}/snapshot_comparison5 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
+> [  0.000000] (0:@) type in variable = 2
+> [  0.000000] (0:@) Check the liveness property promela
+> [  1.000000] (1:test@HostA) **** Start test ****
+> [  1.000000] (1:test@HostA) Increment local variable
+> [  1.000000] (1:test@HostA) j = 0
+> [  2.000000] (1:test@HostA) First snapshot
+> [  2.000000] (1:test@HostA) j = 1
+> [  3.000000] (1:test@HostA) Second snapshot
+> [  3.000000] (1:test@HostA) Test result : 1 (0 = state equality, 1 = different states)
+> [  3.000000] (1:test@HostA) **** End test ****
+> [  0.000000] (0:@) Next pair (depth = 5) already reached !
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) |             ACCEPTANCE CYCLE            |
+> [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+> [  0.000000] (0:@) Counter-example that violates formula :
+> [  0.000000] (0:@) [(1)test] MC_SNAPSHOT ((null))
+> [  0.000000] (0:@) [(1)test] MC_SNAPSHOT ((null))
+> [  0.000000] (0:@) [(1)test] MC_COMPARE_SNAPSHOTS ((null))
+> [  0.000000] (0:@) End of system requests but evolution in Büchi automaton
+> [  0.000000] (0:@) Expanded pairs = 5
+> [  0.000000] (0:@) Visited pairs = 4
+> [  0.000000] (0:@) Expanded / Visited = 0.800000
diff --git a/examples/msg/mc/test/snapshot_comparison_platform.xml b/examples/msg/mc/test/snapshot_comparison_platform.xml
new file mode 100644 (file)
index 0000000..a62a6e0
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version='1.0'?>
+ <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+ <platform version="3">
+ <AS  id="AS0"  routing="Full">
+   <host id="HostA" power="137333000"/>
+   <host id="HostB" power="98095000"/>
+   <host id="HostC" power="98095000"/>
+   <host id="HostD" power="98095000"/>
+   <link id="1" bandwidth="3430125" latency="0.000536941"/>
+   <link id="2" bandwidth="3430125" latency="0.000536941"/>
+   <link id="3" bandwidth="3430125" latency="0.000536941"/>
+   <route src="HostA" dst="HostB"><link_ctn id="1"/></route>
+   <route src="HostA" dst="HostC"><link_ctn id="2"/></route>
+   <route src="HostA" dst="HostD"><link_ctn id="3"/></route>
+ </AS>
+ </platform>
\ No newline at end of file
diff --git a/examples/msg/mc/test/test_heap_comparison.c b/examples/msg/mc/test/test_heap_comparison.c
deleted file mode 100644 (file)
index c094f46..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#include "mc/mc.h"
-#include "msg/msg.h"
-
-int main (int argc, char **argv){
-  MSG_init(&argc, argv);
-  MC_test_heap_comparison();
-  return 0;
-}
index 6b8fa30..a32eb65 100644 (file)
@@ -7,7 +7,7 @@ if(HAVE_NS3)
 
   ### Add definitions for compile
   target_link_libraries(ns3 simgrid m )
-endif(HAVE_NS3)
+endif()
 
 set(tesh_files
   ${tesh_files}
index ad275da..df3485e 100644 (file)
@@ -46,53 +46,53 @@ $ ./pmm/msg_pmm --log=msg_pmm.thres:verbose --log=no_loc ${srcdir:=.}/../platfor
 > [c-0.me:node:(1) 0.007813] [msg_pmm/VERBOSE] Broadcast sA(0,0) to row 0
 > [c-0.me:node:(1) 0.007813] [msg_pmm/VERBOSE] Broadcast sB(0,0) to col 0
 > [c-0.me:node:(1) 0.007813] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-6.me:node:(7) 0.015625] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-3.me:node:(4) 0.015625] [msg_pmm/VERBOSE] Broadcast sB(1,0) to col 0
-> [c-2.me:node:(3) 0.015625] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-1.me:node:(2) 0.015625] [msg_pmm/VERBOSE] Broadcast sA(0,1) to row 0
-> [c-8.me:node:(9) 0.015625] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-4.me:node:(5) 0.015625] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-5.me:node:(6) 0.015625] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-7.me:node:(8) 0.015625] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-3.me:node:(4) 0.015625] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-1.me:node:(2) 0.015625] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-4.me:node:(5) 0.023437] [msg_pmm/VERBOSE] Broadcast sA(1,1) to row 1
-> [c-2.me:node:(3) 0.023437] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-7.me:node:(8) 0.023437] [msg_pmm/VERBOSE] Broadcast sA(2,1) to row 2
-> [c-8.me:node:(9) 0.023437] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-0.me:node:(1) 0.023437] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-6.me:node:(7) 0.023437] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-5.me:node:(6) 0.023437] [msg_pmm/VERBOSE] Broadcast sB(1,2) to col 2
-> [c-4.me:node:(5) 0.023437] [msg_pmm/VERBOSE] Broadcast sB(1,1) to col 1
-> [c-7.me:node:(8) 0.023437] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-5.me:node:(6) 0.023437] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-4.me:node:(5) 0.023437] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-1.me:node:(2) 0.031249] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-8.me:node:(9) 0.031249] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-2.me:node:(3) 0.031249] [msg_pmm/VERBOSE] Broadcast sA(0,2) to row 0
-> [c-6.me:node:(7) 0.031249] [msg_pmm/VERBOSE] Broadcast sB(2,0) to col 0
-> [c-0.me:node:(1) 0.031249] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-3.me:node:(4) 0.031249] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-7.me:node:(8) 0.031249] [msg_pmm/VERBOSE] Broadcast sB(2,1) to col 1
-> [c-5.me:node:(6) 0.031249] [msg_pmm/VERBOSE] Broadcast sA(1,2) to row 1
-> [c-2.me:node:(3) 0.031249] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-6.me:node:(7) 0.031249] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-7.me:node:(8) 0.031249] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-5.me:node:(6) 0.031249] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-3.me:node:(4) 0.039061] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-4.me:node:(5) 0.039061] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-1.me:node:(2) 0.039061] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-0.me:node:(1) 0.039061] [msg_pmm/VERBOSE] Get sub-matrix
-> [c-8.me:node:(9) 0.039061] [msg_pmm/VERBOSE] Broadcast sA(2,2) to row 2
-> [c-8.me:node:(9) 0.039061] [msg_pmm/VERBOSE] Broadcast sB(2,2) to col 2
-> [c-8.me:node:(9) 0.039061] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
-> [c-0.me:node:(1) 0.046873] [msg_pmm/VERBOSE] Multiplication done.
-> [c-0.me:node:(1) 0.046873] [msg_pmm/VERBOSE] Receive Results.
-> [c-5.me:node:(6) 0.046873] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
-> [c-2.me:node:(3) 0.046873] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
-> [c-7.me:node:(8) 0.046873] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
-> [c-1.me:node:(2) 0.046873] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
-> [c-4.me:node:(5) 0.046873] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
-> [c-3.me:node:(4) 0.046873] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
-> [c-6.me:node:(7) 0.046873] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
-> [0.054685] [msg_pmm/CRITICAL] Simulated time: 0.0546852
+> [c-7.me:node:(8) 0.015619] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-4.me:node:(5) 0.015619] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-8.me:node:(9) 0.015619] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-5.me:node:(6) 0.015619] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-6.me:node:(7) 0.015619] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-2.me:node:(3) 0.015619] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-3.me:node:(4) 0.015619] [msg_pmm/VERBOSE] Broadcast sB(1,0) to col 0
+> [c-1.me:node:(2) 0.015619] [msg_pmm/VERBOSE] Broadcast sA(0,1) to row 0
+> [c-3.me:node:(4) 0.015619] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-1.me:node:(2) 0.015619] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-8.me:node:(9) 0.023426] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-2.me:node:(3) 0.023426] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-7.me:node:(8) 0.023426] [msg_pmm/VERBOSE] Broadcast sA(2,1) to row 2
+> [c-5.me:node:(6) 0.023426] [msg_pmm/VERBOSE] Broadcast sB(1,2) to col 2
+> [c-6.me:node:(7) 0.023426] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-4.me:node:(5) 0.023426] [msg_pmm/VERBOSE] Broadcast sA(1,1) to row 1
+> [c-0.me:node:(1) 0.023426] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-7.me:node:(8) 0.023426] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-5.me:node:(6) 0.023426] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-4.me:node:(5) 0.023426] [msg_pmm/VERBOSE] Broadcast sB(1,1) to col 1
+> [c-4.me:node:(5) 0.023426] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-2.me:node:(3) 0.031233] [msg_pmm/VERBOSE] Broadcast sA(0,2) to row 0
+> [c-0.me:node:(1) 0.031233] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-6.me:node:(7) 0.031233] [msg_pmm/VERBOSE] Broadcast sB(2,0) to col 0
+> [c-8.me:node:(9) 0.031233] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-5.me:node:(6) 0.031233] [msg_pmm/VERBOSE] Broadcast sA(1,2) to row 1
+> [c-3.me:node:(4) 0.031233] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-1.me:node:(2) 0.031233] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-7.me:node:(8) 0.031233] [msg_pmm/VERBOSE] Broadcast sB(2,1) to col 1
+> [c-2.me:node:(3) 0.031233] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-6.me:node:(7) 0.031233] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-5.me:node:(6) 0.031233] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-7.me:node:(8) 0.031233] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-0.me:node:(1) 0.039040] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-1.me:node:(2) 0.039040] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-8.me:node:(9) 0.039040] [msg_pmm/VERBOSE] Broadcast sA(2,2) to row 2
+> [c-3.me:node:(4) 0.039040] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-4.me:node:(5) 0.039040] [msg_pmm/VERBOSE] Get sub-matrix
+> [c-8.me:node:(9) 0.039040] [msg_pmm/VERBOSE] Broadcast sB(2,2) to col 2
+> [c-8.me:node:(9) 0.039040] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
+> [c-1.me:node:(2) 0.046847] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
+> [c-4.me:node:(5) 0.046847] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
+> [c-3.me:node:(4) 0.046847] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
+> [c-0.me:node:(1) 0.046847] [msg_pmm/VERBOSE] Multiplication done.
+> [c-0.me:node:(1) 0.046847] [msg_pmm/VERBOSE] Receive Results.
+> [c-6.me:node:(7) 0.046847] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
+> [c-2.me:node:(3) 0.046847] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
+> [c-5.me:node:(6) 0.046847] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
+> [c-7.me:node:(8) 0.046847] [msg_pmm/VERBOSE] Multiplication done. Send the sub-result.
+> [0.054659] [msg_pmm/CRITICAL] Simulated time: 0.0546594
index 2347d0c..242a8fa 100644 (file)
@@ -43,7 +43,7 @@ static void test_host(const char*hostname)
   char *key, *data;
   const char *noexist = "Unknown";
   const char *value;
-  char exist[] = "SG_TEST_Hdd";
+  char exist[] = "Hdd";
 
   XBT_INFO("== Print the properties of the host");
   xbt_dict_foreach(props, cursor, key, data)
@@ -63,7 +63,7 @@ static void test_host(const char*hostname)
   XBT_INFO("   Property: %s old value: %s", exist, value);
 
   XBT_INFO("== Trying to modify a host property");
-  xbt_dict_set(props, exist, xbt_strdup("250"), NULL);
+  MSG_host_set_property_value(thehost, exist, xbt_strdup("250"), NULL);
 
   /* Test if we have changed the value */
   value = MSG_host_get_property_value(thehost, exist);
@@ -74,7 +74,7 @@ static void test_host(const char*hostname)
   XBT_INFO("   Property: %s old value: %s", exist, value);
    
   /* Restore the value for the next test */
-  xbt_dict_set(props, exist, xbt_strdup("180"), NULL);
+  MSG_host_set_property_value(thehost, exist, xbt_strdup("180"), NULL);
 }
 
 int alice(int argc, char *argv[]) { /* Dump what we have on the current host */
@@ -112,11 +112,26 @@ int bob(int argc, char *argv[])
 msg_error_t test_all(const char *platform_file,
                      const char *application_file)
 {
+  int host_number;
+  unsigned int i;
+  xbt_dynar_t hosts;
+  msg_host_t host;
   MSG_function_register("alice", alice);
   MSG_function_register("bob", bob);
   MSG_function_register("carole", carole);
 
   MSG_create_environment(platform_file);
+
+  host_number = MSG_get_host_number();
+  XBT_INFO("There are %d hosts in the environment", host_number);
+
+  hosts = MSG_hosts_as_dynar();
+
+  xbt_dynar_foreach(hosts, i, host){
+    XBT_INFO("Host '%s' runs at %.0f flops/s",MSG_host_get_name(host),
+       MSG_get_host_speed(host));
+  }
+
   MSG_launch_application(application_file);
 
   return MSG_main();
index 826705b..d6bb370 100644 (file)
@@ -4,22 +4,25 @@ p Testing a MSG application with properties in the XML for Hosts, Links and Proc
 
 ! output sort
 $ $SG_TEST_EXENV properties/msg_prop$EXEEXT ${srcdir:=.}/../platforms/prop.xml ${srcdir:=.}/properties/deployment_properties.xml  "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) There are 2 hosts in the environment
+> [  0.000000] (0:@) Host 'host1' runs at 1000000000 flops/s
+> [  0.000000] (0:@) Host 'host2' runs at 1000000000 flops/s
 > [  0.000000] (1:alice@host1) == Print the properties of the host
-> [  0.000000] (1:alice@host1)   Host property: 'SG_TEST_Hdd' -> '180'
-> [  0.000000] (1:alice@host1)   Host property: 'SG_TEST_mem' -> '4'
+> [  0.000000] (1:alice@host1)   Host property: 'mem' -> '4'
+> [  0.000000] (1:alice@host1)   Host property: 'Hdd' -> '180'
 > [  0.000000] (1:alice@host1) == Try to get a host property that does not exist
 > [  0.000000] (1:alice@host1) == Try to get a host property that does exist
-> [  0.000000] (1:alice@host1)    Property: SG_TEST_Hdd old value: 180
+> [  0.000000] (1:alice@host1)    Property: Hdd old value: 180
 > [  0.000000] (1:alice@host1) == Trying to modify a host property
-> [  0.000000] (1:alice@host1)    Property: SG_TEST_Hdd old value: 250
+> [  0.000000] (1:alice@host1)    Property: Hdd old value: 250
 > [  0.000000] (2:bob@host1) == Print the properties of the process
 > [  0.000000] (2:bob@host1)    Process property: SomeProp -> SomeValue
 > [  0.000000] (2:bob@host1) == Try to get a process property that does not exist
 > [  1.000000] (3:carole@host2) == Print the properties of the host
-> [  1.000000] (3:carole@host2)   Host property: 'SG_TEST_Hdd' -> '180'
-> [  1.000000] (3:carole@host2)   Host property: 'SG_TEST_mem' -> '4'
+> [  1.000000] (3:carole@host2)   Host property: 'mem' -> '4'
+> [  1.000000] (3:carole@host2)   Host property: 'Hdd' -> '180'
 > [  1.000000] (3:carole@host2) == Try to get a host property that does not exist
 > [  1.000000] (3:carole@host2) == Try to get a host property that does exist
-> [  1.000000] (3:carole@host2)    Property: SG_TEST_Hdd old value: 180
+> [  1.000000] (3:carole@host2)    Property: Hdd old value: 180
 > [  1.000000] (3:carole@host2) == Trying to modify a host property
-> [  1.000000] (3:carole@host2)    Property: SG_TEST_Hdd old value: 250
+> [  1.000000] (3:carole@host2)    Property: Hdd old value: 250
index a5832ef..1855048 100644 (file)
@@ -12,11 +12,11 @@ $ $SG_TEST_EXENV sendrecv/sendrecv$EXEEXT ${srcdir:=.}/sendrecv/platform_sendrec
 > [  0.000000] (1:sender@Inmos) host = Bellevue
 > [  0.000000] (1:sender@Inmos) task_la->data = 0.000000e+00
 > [  0.000000] (2:receiver@Bellevue) receiver
-> [  0.100100] (1:sender@Inmos) task_bw->data = 1.001000e-01
-> [  0.100100] (2:receiver@Bellevue) Task received : latency task
-> [  0.100100] (2:receiver@Bellevue) Communic. time 1.001000e-01
-> [  0.100100] (2:receiver@Bellevue) --- la 0.100100 ----
-> [10000.200100] (0:@) Total simulation time: 1.000020e+04
-> [10000.200100] (2:receiver@Bellevue) Task received : bandwidth task
-> [10000.200100] (2:receiver@Bellevue) Communic. time 1.000010e+04
-> [10000.200100] (2:receiver@Bellevue) --- bw 99999.000010 ----
\ No newline at end of file
+> [  0.100010] (1:sender@Inmos) task_bw->data = 1.000100e-01
+> [  0.100010] (2:receiver@Bellevue) Task received : latency task
+> [  0.100010] (2:receiver@Bellevue) Communic. time 1.000100e-01
+> [  0.100010] (2:receiver@Bellevue) --- la 0.100010 ----
+> [1000.200010] (0:@) Total simulation time: 1.000200e+03
+> [1000.200010] (2:receiver@Bellevue) Task received : bandwidth task
+> [1000.200010] (2:receiver@Bellevue) Communic. time 1.000100e+03
+> [1000.200010] (2:receiver@Bellevue) --- bw 999900.009999 ----
\ No newline at end of file
index e4eb2bb..bcbf65b 100644 (file)
@@ -12,11 +12,11 @@ $ $SG_TEST_EXENV sendrecv/sendrecv$EXEEXT ${srcdir:=.}/sendrecv/platform_sendrec
 > [  0.000000] (1:sender@Inmos) host = Bellevue
 > [  0.000000] (1:sender@Inmos) task_la->data = 0.000000e+00
 > [  0.000000] (2:receiver@Bellevue) receiver
-> [  1.040100] (1:sender@Inmos) task_bw->data = 1.040100e+00
-> [  1.040100] (2:receiver@Bellevue) Task received : latency task
-> [  1.040100] (2:receiver@Bellevue) Communic. time 1.040100e+00
-> [  1.040100] (2:receiver@Bellevue) --- la 1.040100 ----
-> [10002.080100] (0:@) Total simulation time: 1.000208e+04
-> [10002.080100] (2:receiver@Bellevue) Task received : bandwidth task
-> [10002.080100] (2:receiver@Bellevue) Communic. time 1.000104e+04
-> [10002.080100] (2:receiver@Bellevue) --- bw 99989.601081 ----
+> [  1.040011] (1:sender@Inmos) task_bw->data = 1.040011e+00
+> [  1.040011] (2:receiver@Bellevue) Task received : latency task
+> [  1.040011] (2:receiver@Bellevue) Communic. time 1.040011e+00
+> [  1.040011] (2:receiver@Bellevue) --- la 1.040011 ----
+> [1089.036533] (0:@) Total simulation time: 1.089037e+03
+> [1089.036533] (2:receiver@Bellevue) Task received : bandwidth task
+> [1089.036533] (2:receiver@Bellevue) Communic. time 1.087997e+03
+> [1089.036533] (2:receiver@Bellevue) --- bw 919120.585424 ----
index b742fa4..058ce43 100644 (file)
@@ -12,11 +12,11 @@ $ $SG_TEST_EXENV sendrecv/sendrecv$EXEEXT ${srcdir:=.}/sendrecv/platform_sendrec
 > [  0.000000] (1:sender@Inmos) host = Bellevue
 > [  0.000000] (1:sender@Inmos) task_la->data = 0.000000e+00
 > [  0.000000] (2:receiver@Bellevue) receiver
-> [  1.040100] (1:sender@Inmos) task_bw->data = 1.040100e+00
-> [  1.040100] (2:receiver@Bellevue) Task received : latency task
-> [  1.040100] (2:receiver@Bellevue) Communic. time 1.040100e+00
-> [  1.040100] (2:receiver@Bellevue) --- la 1.040100 ----
-> [10002.080100] (0:@) Total simulation time: 1.000208e+04
-> [10002.080100] (2:receiver@Bellevue) Task received : bandwidth task
-> [10002.080100] (2:receiver@Bellevue) Communic. time 1.000104e+04
-> [10002.080100] (2:receiver@Bellevue) --- bw 99989.601081 ----
+> [  1.040011] (1:sender@Inmos) task_bw->data = 1.040011e+00
+> [  1.040011] (2:receiver@Bellevue) Task received : latency task
+> [  1.040011] (2:receiver@Bellevue) Communic. time 1.040011e+00
+> [  1.040011] (2:receiver@Bellevue) --- la 1.040011 ----
+> [1089.036533] (0:@) Total simulation time: 1.089037e+03
+> [1089.036533] (2:receiver@Bellevue) Task received : bandwidth task
+> [1089.036533] (2:receiver@Bellevue) Communic. time 1.087997e+03
+> [1089.036533] (2:receiver@Bellevue) --- bw 919120.585424 ----
index 8c8ce6a..7f291d0 100644 (file)
@@ -7,9 +7,9 @@ add_executable(sk_time "sk_time.c")
 ### Add definitions for compile
 if(WIN32)
   target_link_libraries(sk_time simgrid )
-else(WIN32)
+else()
   target_link_libraries(sk_time simgrid m )
-endif(WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index c87894e..f3e07d4 100644 (file)
@@ -9,10 +9,10 @@ add_executable(token_bypass token_bypass.c)
 if(NOT WIN32)
   target_link_libraries(token_ring simgrid m pthread )
   target_link_libraries(token_bypass simgrid m pthread )
-else(NOT WIN32)
+else()
   target_link_libraries(token_ring simgrid)
   target_link_libraries(token_bypass simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index 3d7f2dd..170145e 100644 (file)
 $ $SG_TEST_EXENV ${bindir:=.}/token_ring ${srcdir:=.}/examples/platforms/routing_cluster.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (0:@) Number of host '6'
 > [  0.000000] (1:0@host1) Host "0" send 'Token' to Host "1"
-> [  0.079107] (2:1@host2) Host "1" received "Token"
-> [  0.079107] (2:1@host2) Host "1" send 'Token' to Host "2"
-> [  0.158214] (3:2@host3) Host "2" received "Token"
-> [  0.158214] (3:2@host3) Host "2" send 'Token' to Host "3"
-> [  0.350331] (4:3@host4) Host "3" received "Token"
-> [  0.350331] (4:3@host4) Host "3" send 'Token' to Host "4"
-> [  0.429438] (5:4@host5) Host "4" received "Token"
-> [  0.429438] (5:4@host5) Host "4" send 'Token' to Host "5"
-> [  0.508545] (6:5@host6) Host "5" received "Token"
-> [  0.508545] (6:5@host6) Host "5" send 'Token' to Host "0"
-> [  0.700662] (1:0@host1) Host "0" received "Token"
-> [  0.700662] (0:@) Simulation time 0.700662
+> [  0.017354] (2:1@host2) Host "1" received "Token"
+> [  0.017354] (2:1@host2) Host "1" send 'Token' to Host "2"
+> [  0.035121] (3:2@host3) Host "2" received "Token"
+> [  0.035121] (3:2@host3) Host "2" send 'Token' to Host "3"
+> [  0.065898] (4:3@host4) Host "3" received "Token"
+> [  0.065898] (4:3@host4) Host "3" send 'Token' to Host "4"
+> [  0.083252] (5:4@host5) Host "4" received "Token"
+> [  0.083252] (5:4@host5) Host "4" send 'Token' to Host "5"
+> [  0.101019] (6:5@host6) Host "5" received "Token"
+> [  0.101019] (6:5@host6) Host "5" send 'Token' to Host "0"
+> [  0.131796] (1:0@host1) Host "0" received "Token"
+> [  0.131796] (0:@) Simulation time 0.131796
 
 $ $SG_TEST_EXENV ${bindir:=.}/token_ring ${srcdir:=.}/examples/platforms/two_peers.xml --cfg=network/coordinates:yes "--log=root.fmt:[%12.6r]%e(%i:%P@%h)%e%m%n"
 > [    0.000000] (0:@) Configuration change: Set 'network/coordinates' to 'yes'
 > [    0.000000] (0:@) Number of host '2'
 > [    0.000000] (1:0@peer_100030591) Host "0" send 'Token' to Host "1"
-> [    5.345228] (2:1@peer_100036570) Host "1" received "Token"
-> [    5.345228] (2:1@peer_100036570) Host "1" send 'Token' to Host "0"
-> [   10.690456] (1:0@peer_100030591) Host "0" received "Token"
-> [   10.690456] (0:@) Simulation time 10.6905
+> [    0.637910] (2:1@peer_100036570) Host "1" received "Token"
+> [    0.637910] (2:1@peer_100036570) Host "1" send 'Token' to Host "0"
+> [    1.275820] (1:0@peer_100030591) Host "0" received "Token"
+> [    1.275820] (0:@) Simulation time 1.27582
 
 $ $SG_TEST_EXENV ${bindir:=.}/token_ring ${srcdir:=.}/examples/platforms/meta_cluster.xml --log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n
 > [  0.000000] (0:@) Number of host '60'
 > [  0.000000] (1:0@host-2.cluster1) Host "0" send 'Token' to Host "1"
-> [  0.192117] (2:1@host-2.cluster2) Host "1" received "Token"
-> [  0.192117] (2:1@host-2.cluster2) Host "1" send 'Token' to Host "2"
-> [  0.384234] (3:2@host-6.cluster1) Host "2" received "Token"
-> [  0.384234] (3:2@host-6.cluster1) Host "2" send 'Token' to Host "3"
-> [  0.576351] (4:3@host-6.cluster2) Host "3" received "Token"
-> [  0.576351] (4:3@host-6.cluster2) Host "3" send 'Token' to Host "4"
-> [  0.768468] (5:4@host-21.cluster1) Host "4" received "Token"
-> [  0.768468] (5:4@host-21.cluster1) Host "4" send 'Token' to Host "5"
-> [  0.847575] (6:5@host-13.cluster1) Host "5" received "Token"
-> [  0.847575] (6:5@host-13.cluster1) Host "5" send 'Token' to Host "6"
-> [  1.039692] (7:6@host-21.cluster2) Host "6" received "Token"
-> [  1.039692] (7:6@host-21.cluster2) Host "6" send 'Token' to Host "7"
-> [  1.118799] (8:7@host-13.cluster2) Host "7" received "Token"
-> [  1.118799] (8:7@host-13.cluster2) Host "7" send 'Token' to Host "8"
-> [  1.310916] (9:8@host-25.cluster1) Host "8" received "Token"
-> [  1.310916] (9:8@host-25.cluster1) Host "8" send 'Token' to Host "9"
-> [  1.390023] (10:9@host-17.cluster1) Host "9" received "Token"
-> [  1.390023] (10:9@host-17.cluster1) Host "9" send 'Token' to Host "10"
-> [  1.582140] (11:10@host-25.cluster2) Host "10" received "Token"
-> [  1.582140] (11:10@host-25.cluster2) Host "10" send 'Token' to Host "11"
-> [  1.661247] (12:11@host-17.cluster2) Host "11" received "Token"
-> [  1.661247] (12:11@host-17.cluster2) Host "11" send 'Token' to Host "12"
-> [  1.853364] (13:12@host-29.cluster1) Host "12" received "Token"
-> [  1.853364] (13:12@host-29.cluster1) Host "12" send 'Token' to Host "13"
-> [  2.045481] (14:13@host-29.cluster2) Host "13" received "Token"
-> [  2.045481] (14:13@host-29.cluster2) Host "13" send 'Token' to Host "14"
-> [  2.237598] (15:14@host-3.cluster1) Host "14" received "Token"
-> [  2.237598] (15:14@host-3.cluster1) Host "14" send 'Token' to Host "15"
-> [  2.429715] (16:15@host-3.cluster2) Host "15" received "Token"
-> [  2.429715] (16:15@host-3.cluster2) Host "15" send 'Token' to Host "16"
-> [  2.621832] (17:16@host-7.cluster1) Host "16" received "Token"
-> [  2.621832] (17:16@host-7.cluster1) Host "16" send 'Token' to Host "17"
-> [  2.813949] (18:17@host-7.cluster2) Host "17" received "Token"
-> [  2.813949] (18:17@host-7.cluster2) Host "17" send 'Token' to Host "18"
-> [  3.006066] (19:18@host-10.cluster1) Host "18" received "Token"
-> [  3.006066] (19:18@host-10.cluster1) Host "18" send 'Token' to Host "19"
-> [  3.198183] (20:19@host-10.cluster2) Host "19" received "Token"
-> [  3.198183] (20:19@host-10.cluster2) Host "19" send 'Token' to Host "20"
-> [  3.390300] (21:20@host-30.cluster1) Host "20" received "Token"
-> [  3.390300] (21:20@host-30.cluster1) Host "20" send 'Token' to Host "21"
-> [  3.469407] (22:21@host-22.cluster1) Host "21" received "Token"
-> [  3.469407] (22:21@host-22.cluster1) Host "21" send 'Token' to Host "22"
-> [  3.661524] (23:22@host-30.cluster2) Host "22" received "Token"
-> [  3.661524] (23:22@host-30.cluster2) Host "22" send 'Token' to Host "23"
-> [  3.853641] (24:23@host-14.cluster1) Host "23" received "Token"
-> [  3.853641] (24:23@host-14.cluster1) Host "23" send 'Token' to Host "24"
-> [  4.045758] (25:24@host-22.cluster2) Host "24" received "Token"
-> [  4.045758] (25:24@host-22.cluster2) Host "24" send 'Token' to Host "25"
-> [  4.124865] (26:25@host-14.cluster2) Host "25" received "Token"
-> [  4.124865] (26:25@host-14.cluster2) Host "25" send 'Token' to Host "26"
-> [  4.316982] (27:26@host-26.cluster1) Host "26" received "Token"
-> [  4.316982] (27:26@host-26.cluster1) Host "26" send 'Token' to Host "27"
-> [  4.396089] (28:27@host-18.cluster1) Host "27" received "Token"
-> [  4.396089] (28:27@host-18.cluster1) Host "27" send 'Token' to Host "28"
-> [  4.588206] (29:28@host-26.cluster2) Host "28" received "Token"
-> [  4.588206] (29:28@host-26.cluster2) Host "28" send 'Token' to Host "29"
-> [  4.667313] (30:29@host-18.cluster2) Host "29" received "Token"
-> [  4.667313] (30:29@host-18.cluster2) Host "29" send 'Token' to Host "30"
-> [  4.859430] (31:30@host-4.cluster1) Host "30" received "Token"
-> [  4.859430] (31:30@host-4.cluster1) Host "30" send 'Token' to Host "31"
-> [  5.051547] (32:31@host-4.cluster2) Host "31" received "Token"
-> [  5.051547] (32:31@host-4.cluster2) Host "31" send 'Token' to Host "32"
-> [  5.243664] (33:32@host-8.cluster1) Host "32" received "Token"
-> [  5.243664] (33:32@host-8.cluster1) Host "32" send 'Token' to Host "33"
-> [  5.435781] (34:33@host-8.cluster2) Host "33" received "Token"
-> [  5.435781] (34:33@host-8.cluster2) Host "33" send 'Token' to Host "34"
-> [  5.627898] (35:34@host-11.cluster1) Host "34" received "Token"
-> [  5.627898] (35:34@host-11.cluster1) Host "34" send 'Token' to Host "35"
-> [  5.820015] (36:35@host-11.cluster2) Host "35" received "Token"
-> [  5.820015] (36:35@host-11.cluster2) Host "35" send 'Token' to Host "36"
-> [  6.012132] (37:36@host-23.cluster1) Host "36" received "Token"
-> [  6.012132] (37:36@host-23.cluster1) Host "36" send 'Token' to Host "37"
-> [  6.091239] (38:37@host-15.cluster1) Host "37" received "Token"
-> [  6.091239] (38:37@host-15.cluster1) Host "37" send 'Token' to Host "38"
-> [  6.283356] (39:38@host-23.cluster2) Host "38" received "Token"
-> [  6.283356] (39:38@host-23.cluster2) Host "38" send 'Token' to Host "39"
-> [  6.362463] (40:39@host-15.cluster2) Host "39" received "Token"
-> [  6.362463] (40:39@host-15.cluster2) Host "39" send 'Token' to Host "40"
-> [  6.554580] (41:40@host-27.cluster1) Host "40" received "Token"
-> [  6.554580] (41:40@host-27.cluster1) Host "40" send 'Token' to Host "41"
-> [  6.633687] (42:41@host-19.cluster1) Host "41" received "Token"
-> [  6.633687] (42:41@host-19.cluster1) Host "41" send 'Token' to Host "42"
-> [  6.825804] (43:42@host-27.cluster2) Host "42" received "Token"
-> [  6.825804] (43:42@host-27.cluster2) Host "42" send 'Token' to Host "43"
-> [  6.904911] (44:43@host-19.cluster2) Host "43" received "Token"
-> [  6.904911] (44:43@host-19.cluster2) Host "43" send 'Token' to Host "44"
-> [  7.097028] (45:44@host-1.cluster1) Host "44" received "Token"
-> [  7.097028] (45:44@host-1.cluster1) Host "44" send 'Token' to Host "45"
-> [  7.289145] (46:45@host-1.cluster2) Host "45" received "Token"
-> [  7.289145] (46:45@host-1.cluster2) Host "45" send 'Token' to Host "46"
-> [  7.481262] (47:46@host-5.cluster1) Host "46" received "Token"
-> [  7.481262] (47:46@host-5.cluster1) Host "46" send 'Token' to Host "47"
-> [  7.673379] (48:47@host-5.cluster2) Host "47" received "Token"
-> [  7.673379] (48:47@host-5.cluster2) Host "47" send 'Token' to Host "48"
-> [  7.865496] (49:48@host-9.cluster1) Host "48" received "Token"
-> [  7.865496] (49:48@host-9.cluster1) Host "48" send 'Token' to Host "49"
-> [  8.057613] (50:49@host-9.cluster2) Host "49" received "Token"
-> [  8.057613] (50:49@host-9.cluster2) Host "49" send 'Token' to Host "50"
-> [  8.249730] (51:50@host-20.cluster1) Host "50" received "Token"
-> [  8.249730] (51:50@host-20.cluster1) Host "50" send 'Token' to Host "51"
-> [  8.328837] (52:51@host-12.cluster1) Host "51" received "Token"
-> [  8.328837] (52:51@host-12.cluster1) Host "51" send 'Token' to Host "52"
-> [  8.520954] (53:52@host-20.cluster2) Host "52" received "Token"
-> [  8.520954] (53:52@host-20.cluster2) Host "52" send 'Token' to Host "53"
-> [  8.600061] (54:53@host-12.cluster2) Host "53" received "Token"
-> [  8.600061] (54:53@host-12.cluster2) Host "53" send 'Token' to Host "54"
-> [  8.792178] (55:54@host-24.cluster1) Host "54" received "Token"
-> [  8.792178] (55:54@host-24.cluster1) Host "54" send 'Token' to Host "55"
-> [  8.871285] (56:55@host-16.cluster1) Host "55" received "Token"
-> [  8.871285] (56:55@host-16.cluster1) Host "55" send 'Token' to Host "56"
-> [  9.063402] (57:56@host-24.cluster2) Host "56" received "Token"
-> [  9.063402] (57:56@host-24.cluster2) Host "56" send 'Token' to Host "57"
-> [  9.142509] (58:57@host-16.cluster2) Host "57" received "Token"
-> [  9.142509] (58:57@host-16.cluster2) Host "57" send 'Token' to Host "58"
-> [  9.334626] (59:58@host-28.cluster1) Host "58" received "Token"
-> [  9.334626] (59:58@host-28.cluster1) Host "58" send 'Token' to Host "59"
-> [  9.526743] (60:59@host-28.cluster2) Host "59" received "Token"
-> [  9.526743] (60:59@host-28.cluster2) Host "59" send 'Token' to Host "0"
-> [  9.718860] (1:0@host-2.cluster1) Host "0" received "Token"
-> [  9.718860] (0:@) Simulation time 9.71886
\ No newline at end of file
+> [  0.030364] (2:1@host-2.cluster2) Host "1" received "Token"
+> [  0.030364] (2:1@host-2.cluster2) Host "1" send 'Token' to Host "2"
+> [  0.060729] (3:2@host-6.cluster1) Host "2" received "Token"
+> [  0.060729] (3:2@host-6.cluster1) Host "2" send 'Token' to Host "3"
+> [  0.091093] (4:3@host-6.cluster2) Host "3" received "Token"
+> [  0.091093] (4:3@host-6.cluster2) Host "3" send 'Token' to Host "4"
+> [  0.121458] (5:4@host-21.cluster1) Host "4" received "Token"
+> [  0.121458] (5:4@host-21.cluster1) Host "4" send 'Token' to Host "5"
+> [  0.138812] (6:5@host-13.cluster1) Host "5" received "Token"
+> [  0.138812] (6:5@host-13.cluster1) Host "5" send 'Token' to Host "6"
+> [  0.169177] (7:6@host-21.cluster2) Host "6" received "Token"
+> [  0.169177] (7:6@host-21.cluster2) Host "6" send 'Token' to Host "7"
+> [  0.186531] (8:7@host-13.cluster2) Host "7" received "Token"
+> [  0.186531] (8:7@host-13.cluster2) Host "7" send 'Token' to Host "8"
+> [  0.216895] (9:8@host-25.cluster1) Host "8" received "Token"
+> [  0.216895] (9:8@host-25.cluster1) Host "8" send 'Token' to Host "9"
+> [  0.234250] (10:9@host-17.cluster1) Host "9" received "Token"
+> [  0.234250] (10:9@host-17.cluster1) Host "9" send 'Token' to Host "10"
+> [  0.264614] (11:10@host-25.cluster2) Host "10" received "Token"
+> [  0.264614] (11:10@host-25.cluster2) Host "10" send 'Token' to Host "11"
+> [  0.281969] (12:11@host-17.cluster2) Host "11" received "Token"
+> [  0.281969] (12:11@host-17.cluster2) Host "11" send 'Token' to Host "12"
+> [  0.312333] (13:12@host-29.cluster1) Host "12" received "Token"
+> [  0.312333] (13:12@host-29.cluster1) Host "12" send 'Token' to Host "13"
+> [  0.342697] (14:13@host-29.cluster2) Host "13" received "Token"
+> [  0.342697] (14:13@host-29.cluster2) Host "13" send 'Token' to Host "14"
+> [  0.373062] (15:14@host-3.cluster1) Host "14" received "Token"
+> [  0.373062] (15:14@host-3.cluster1) Host "14" send 'Token' to Host "15"
+> [  0.403426] (16:15@host-3.cluster2) Host "15" received "Token"
+> [  0.403426] (16:15@host-3.cluster2) Host "15" send 'Token' to Host "16"
+> [  0.433791] (17:16@host-7.cluster1) Host "16" received "Token"
+> [  0.433791] (17:16@host-7.cluster1) Host "16" send 'Token' to Host "17"
+> [  0.464155] (18:17@host-7.cluster2) Host "17" received "Token"
+> [  0.464155] (18:17@host-7.cluster2) Host "17" send 'Token' to Host "18"
+> [  0.494520] (19:18@host-10.cluster1) Host "18" received "Token"
+> [  0.494520] (19:18@host-10.cluster1) Host "18" send 'Token' to Host "19"
+> [  0.524884] (20:19@host-10.cluster2) Host "19" received "Token"
+> [  0.524884] (20:19@host-10.cluster2) Host "19" send 'Token' to Host "20"
+> [  0.555248] (21:20@host-30.cluster1) Host "20" received "Token"
+> [  0.555248] (21:20@host-30.cluster1) Host "20" send 'Token' to Host "21"
+> [  0.572603] (22:21@host-22.cluster1) Host "21" received "Token"
+> [  0.572603] (22:21@host-22.cluster1) Host "21" send 'Token' to Host "22"
+> [  0.602967] (23:22@host-30.cluster2) Host "22" received "Token"
+> [  0.602967] (23:22@host-30.cluster2) Host "22" send 'Token' to Host "23"
+> [  0.633332] (24:23@host-14.cluster1) Host "23" received "Token"
+> [  0.633332] (24:23@host-14.cluster1) Host "23" send 'Token' to Host "24"
+> [  0.663696] (25:24@host-22.cluster2) Host "24" received "Token"
+> [  0.663696] (25:24@host-22.cluster2) Host "24" send 'Token' to Host "25"
+> [  0.681051] (26:25@host-14.cluster2) Host "25" received "Token"
+> [  0.681051] (26:25@host-14.cluster2) Host "25" send 'Token' to Host "26"
+> [  0.711415] (27:26@host-26.cluster1) Host "26" received "Token"
+> [  0.711415] (27:26@host-26.cluster1) Host "26" send 'Token' to Host "27"
+> [  0.728769] (28:27@host-18.cluster1) Host "27" received "Token"
+> [  0.728769] (28:27@host-18.cluster1) Host "27" send 'Token' to Host "28"
+> [  0.759134] (29:28@host-26.cluster2) Host "28" received "Token"
+> [  0.759134] (29:28@host-26.cluster2) Host "28" send 'Token' to Host "29"
+> [  0.776488] (30:29@host-18.cluster2) Host "29" received "Token"
+> [  0.776488] (30:29@host-18.cluster2) Host "29" send 'Token' to Host "30"
+> [  0.806853] (31:30@host-4.cluster1) Host "30" received "Token"
+> [  0.806853] (31:30@host-4.cluster1) Host "30" send 'Token' to Host "31"
+> [  0.837217] (32:31@host-4.cluster2) Host "31" received "Token"
+> [  0.837217] (32:31@host-4.cluster2) Host "31" send 'Token' to Host "32"
+> [  0.867582] (33:32@host-8.cluster1) Host "32" received "Token"
+> [  0.867582] (33:32@host-8.cluster1) Host "32" send 'Token' to Host "33"
+> [  0.897946] (34:33@host-8.cluster2) Host "33" received "Token"
+> [  0.897946] (34:33@host-8.cluster2) Host "33" send 'Token' to Host "34"
+> [  0.928310] (35:34@host-11.cluster1) Host "34" received "Token"
+> [  0.928310] (35:34@host-11.cluster1) Host "34" send 'Token' to Host "35"
+> [  0.958675] (36:35@host-11.cluster2) Host "35" received "Token"
+> [  0.958675] (36:35@host-11.cluster2) Host "35" send 'Token' to Host "36"
+> [  0.989039] (37:36@host-23.cluster1) Host "36" received "Token"
+> [  0.989039] (37:36@host-23.cluster1) Host "36" send 'Token' to Host "37"
+> [  1.006394] (38:37@host-15.cluster1) Host "37" received "Token"
+> [  1.006394] (38:37@host-15.cluster1) Host "37" send 'Token' to Host "38"
+> [  1.036758] (39:38@host-23.cluster2) Host "38" received "Token"
+> [  1.036758] (39:38@host-23.cluster2) Host "38" send 'Token' to Host "39"
+> [  1.054112] (40:39@host-15.cluster2) Host "39" received "Token"
+> [  1.054112] (40:39@host-15.cluster2) Host "39" send 'Token' to Host "40"
+> [  1.084477] (41:40@host-27.cluster1) Host "40" received "Token"
+> [  1.084477] (41:40@host-27.cluster1) Host "40" send 'Token' to Host "41"
+> [  1.101831] (42:41@host-19.cluster1) Host "41" received "Token"
+> [  1.101831] (42:41@host-19.cluster1) Host "41" send 'Token' to Host "42"
+> [  1.132196] (43:42@host-27.cluster2) Host "42" received "Token"
+> [  1.132196] (43:42@host-27.cluster2) Host "42" send 'Token' to Host "43"
+> [  1.149550] (44:43@host-19.cluster2) Host "43" received "Token"
+> [  1.149550] (44:43@host-19.cluster2) Host "43" send 'Token' to Host "44"
+> [  1.179915] (45:44@host-1.cluster1) Host "44" received "Token"
+> [  1.179915] (45:44@host-1.cluster1) Host "44" send 'Token' to Host "45"
+> [  1.210279] (46:45@host-1.cluster2) Host "45" received "Token"
+> [  1.210279] (46:45@host-1.cluster2) Host "45" send 'Token' to Host "46"
+> [  1.240643] (47:46@host-5.cluster1) Host "46" received "Token"
+> [  1.240643] (47:46@host-5.cluster1) Host "46" send 'Token' to Host "47"
+> [  1.271008] (48:47@host-5.cluster2) Host "47" received "Token"
+> [  1.271008] (48:47@host-5.cluster2) Host "47" send 'Token' to Host "48"
+> [  1.301372] (49:48@host-9.cluster1) Host "48" received "Token"
+> [  1.301372] (49:48@host-9.cluster1) Host "48" send 'Token' to Host "49"
+> [  1.331737] (50:49@host-9.cluster2) Host "49" received "Token"
+> [  1.331737] (50:49@host-9.cluster2) Host "49" send 'Token' to Host "50"
+> [  1.362101] (51:50@host-20.cluster1) Host "50" received "Token"
+> [  1.362101] (51:50@host-20.cluster1) Host "50" send 'Token' to Host "51"
+> [  1.379456] (52:51@host-12.cluster1) Host "51" received "Token"
+> [  1.379456] (52:51@host-12.cluster1) Host "51" send 'Token' to Host "52"
+> [  1.409820] (53:52@host-20.cluster2) Host "52" received "Token"
+> [  1.409820] (53:52@host-20.cluster2) Host "52" send 'Token' to Host "53"
+> [  1.427174] (54:53@host-12.cluster2) Host "53" received "Token"
+> [  1.427174] (54:53@host-12.cluster2) Host "53" send 'Token' to Host "54"
+> [  1.457539] (55:54@host-24.cluster1) Host "54" received "Token"
+> [  1.457539] (55:54@host-24.cluster1) Host "54" send 'Token' to Host "55"
+> [  1.474893] (56:55@host-16.cluster1) Host "55" received "Token"
+> [  1.474893] (56:55@host-16.cluster1) Host "55" send 'Token' to Host "56"
+> [  1.505258] (57:56@host-24.cluster2) Host "56" received "Token"
+> [  1.505258] (57:56@host-24.cluster2) Host "56" send 'Token' to Host "57"
+> [  1.522612] (58:57@host-16.cluster2) Host "57" received "Token"
+> [  1.522612] (58:57@host-16.cluster2) Host "57" send 'Token' to Host "58"
+> [  1.552977] (59:58@host-28.cluster1) Host "58" received "Token"
+> [  1.552977] (59:58@host-28.cluster1) Host "58" send 'Token' to Host "59"
+> [  1.583341] (60:59@host-28.cluster2) Host "59" received "Token"
+> [  1.583341] (60:59@host-28.cluster2) Host "59" send 'Token' to Host "0"
+> [  1.613705] (1:0@host-2.cluster1) Host "0" received "Token"
+> [  1.613705] (0:@) Simulation time 1.61371
index 99c0449..f177544 100644 (file)
@@ -29,7 +29,7 @@ if(HAVE_TRACING)
     PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
     "${extra_clean_files};${CMAKE_CURRENT_BINARY_DIR}/ms.cat.plist;${CMAKE_CURRENT_BINARY_DIR}/ms.trace;${CMAKE_CURRENT_BINARY_DIR}/ms.uncat.plist;"
     )
-endif(HAVE_TRACING)
+endif()
 
 set(tesh_files
   ${tesh_files}
index 19d993c..bb6d765 100644 (file)
@@ -15,8 +15,8 @@
  * --cfg=tracing:1
  * --cfg=tracing/categorized:1
  * --cfg=tracing/uncategorized:1
- * --cfg=triva/categorized:triva_cat.plist
- * --cfg=triva/uncategorized:triva_uncat.plist
+ * --cfg=viva/categorized:viva_cat.plist
+ * --cfg=viva/uncategorized:viva_uncat.plist
  * (See \ref tracing_tracing_options for details)
  */
 
index 74468ad..58da1df 100644 (file)
@@ -2,17 +2,16 @@
 
 p Tracing multiple categories master/slave application
 
-$ $SG_TEST_EXENV ${bindir:=.}/tracing/categories$EXEEXT --cfg=tracing:1 --cfg=tracing/buffer:1 --cfg=tracing/filename:tracing/categories.trace --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1 --cfg=triva/categorized:tracing/categories.cat.plist --cfg=triva/uncategorized:tracing/categories.uncat.plist ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml
+$ $SG_TEST_EXENV ${bindir:=.}/tracing/categories$EXEEXT --cfg=tracing:1 --cfg=tracing/buffer:1 --cfg=tracing/filename:tracing/categories.trace --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1 --cfg=viva/categorized:tracing/categories.cat.plist --cfg=viva/uncategorized:tracing/categories.uncat.plist ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to '1'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/buffer' to '1'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'tracing/categories.trace'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/categorized' to '1'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/uncategorized' to '1'
-> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'triva/categorized' to 'tracing/categories.cat.plist'
-> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'triva/uncategorized' to 'tracing/categories.uncat.plist'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/categorized' to 'tracing/categories.cat.plist'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/uncategorized' to 'tracing/categories.uncat.plist'
 
 $ $SG_TEST_EXENV cat tracing/categories.cat.plist
-> {
 >   node = ("HOST","LINK");
 >   edge = ("0-LINK4-LINK4","0-HOST1-LINK4","0-LINK4-HOST1");
 > 
@@ -26,10 +25,8 @@ $ $SG_TEST_EXENV cat tracing/categories.cat.plist
 >     size = "bandwidth";
 >     values = ("bdata","bcompute","bfinalize","brequest");
 >   };
-> }
 
 $ $SG_TEST_EXENV cat tracing/categories.uncat.plist
-> {
 >   node = ("HOST","LINK");
 >   edge = ("0-LINK4-LINK4","0-HOST1-LINK4","0-LINK4-HOST1");
 > 
@@ -43,6 +40,5 @@ $ $SG_TEST_EXENV cat tracing/categories.uncat.plist
 >     size = "bandwidth";
 >     values = ("bandwidth_used");
 >   };
-> }
 
 $ rm -rf tracing/categories.trace tracing/categories.cat.plist tracing/categories.uncat.plist
index 69fe71b..8b6d5ce 100644 (file)
@@ -14,8 +14,8 @@
  * You might want to run this program with the following parameters:
  * --cfg=tracing/categorized:1
  * --cfg=tracing/uncategorized:1
- * --cfg=triva/categorized:triva_cat.plist
- * --cfg=triva/uncategorized:triva_uncat.plist
+ * --cfg=viva/categorized:viva_cat.plist
+ * --cfg=viva/uncategorized:viva_uncat.plist
  * (See \ref tracing_tracing_options for details)
  */
 
index 482883f..717dcc7 100644 (file)
@@ -1,45 +1,44 @@
 #! ./tesh
 
 p Tracing master/slave application
-$ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/buffer:1 --cfg=tracing/filename:tracing/ms.trace --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1 --cfg=triva/categorized:tracing/ms.cat.plist --cfg=triva/uncategorized:tracing/ms.uncat.plist ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml
+$ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/buffer:1 --cfg=tracing/filename:tracing/ms.trace --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1 --cfg=viva/categorized:tracing/ms.cat.plist --cfg=viva/uncategorized:tracing/ms.uncat.plist ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to '1'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/buffer' to '1'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'tracing/ms.trace'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/categorized' to '1'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/uncategorized' to '1'
-> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'triva/categorized' to 'tracing/ms.cat.plist'
-> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'triva/uncategorized' to 'tracing/ms.uncat.plist'
-> [4.485137] [msg_test/INFO] Declared tracing categories:
-> [4.485137] [msg_test/INFO] request
-> [4.485137] [msg_test/INFO] finalize
-> [4.485137] [msg_test/INFO] report
-> [4.485137] [msg_test/INFO] compute
-> [4.485137] [msg_test/INFO] Declared marks:
-> [4.485137] [msg_test/INFO] msmark
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/categorized' to 'tracing/ms.cat.plist'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/uncategorized' to 'tracing/ms.uncat.plist'
+> [4.214759] [msg_test/INFO] Declared tracing categories:
+> [4.214759] [msg_test/INFO] request
+> [4.214759] [msg_test/INFO] finalize
+> [4.214759] [msg_test/INFO] report
+> [4.214759] [msg_test/INFO] compute
+> [4.214759] [msg_test/INFO] Declared marks:
+> [4.214759] [msg_test/INFO] msmark
 
 p Not tracing master/slave application
 $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml
 
 p Testing tracing by process
-$ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/msg/process:1 --cfg=tracing/buffer:1 --cfg=tracing/filename:tracing/ms.trace --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1 --cfg=triva/categorized:tracing/ms.cat.plist --cfg=triva/uncategorized:tracing/ms.uncat.plist ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml
+$ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/msg/process:1 --cfg=tracing/buffer:1 --cfg=tracing/filename:tracing/ms.trace --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1 --cfg=viva/categorized:tracing/ms.cat.plist --cfg=viva/uncategorized:tracing/ms.uncat.plist ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to '1'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/msg/process' to '1'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/buffer' to '1'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'tracing/ms.trace'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/categorized' to '1'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/uncategorized' to '1'
-> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'triva/categorized' to 'tracing/ms.cat.plist'
-> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'triva/uncategorized' to 'tracing/ms.uncat.plist'
-> [4.485137] [msg_test/INFO] Declared tracing categories:
-> [4.485137] [msg_test/INFO] request
-> [4.485137] [msg_test/INFO] finalize
-> [4.485137] [msg_test/INFO] report
-> [4.485137] [msg_test/INFO] compute
-> [4.485137] [msg_test/INFO] Declared marks:
-> [4.485137] [msg_test/INFO] msmark
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/categorized' to 'tracing/ms.cat.plist'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/uncategorized' to 'tracing/ms.uncat.plist'
+> [4.214759] [msg_test/INFO] Declared tracing categories:
+> [4.214759] [msg_test/INFO] request
+> [4.214759] [msg_test/INFO] finalize
+> [4.214759] [msg_test/INFO] report
+> [4.214759] [msg_test/INFO] compute
+> [4.214759] [msg_test/INFO] Declared marks:
+> [4.214759] [msg_test/INFO] msmark
 
 $ $SG_TEST_EXENV cat tracing/ms.uncat.plist
-> {
 >   node = ("HOST","LINK");
 >   edge = ("0-LINK13-LINK13","0-LINK13-HOST1","0-HOST1-LINK13");
 > 
@@ -53,10 +52,8 @@ $ $SG_TEST_EXENV cat tracing/ms.uncat.plist
 >     size = "bandwidth";
 >     values = ("bandwidth_used");
 >   };
-> }
 
 $ $SG_TEST_EXENV cat tracing/ms.cat.plist
-> {
 >   node = ("HOST","LINK");
 >   edge = ("0-LINK13-LINK13","0-LINK13-HOST1","0-HOST1-LINK13");
 > 
@@ -70,6 +67,5 @@ $ $SG_TEST_EXENV cat tracing/ms.cat.plist
 >     size = "bandwidth";
 >     values = ("bcompute","breport","bfinalize","brequest");
 >   };
-> }
 
 $ rm -rf tracing/ms.trace tracing/ms.cat.plist tracing/ms.uncat.plist
index c6e442c..4af8c32 100644 (file)
@@ -162,40 +162,40 @@ $ tail -n +3 simgrid.trace
 > 8 0 5 14 0.000060
 > 8 0 4 15 27946250.000000
 > 8 0 5 15 0.000278
-> 15 0 6 0 G 3 0
-> 16 0 6 0 G 11 0
-> 15 0 7 0 G 11 1
-> 16 0 7 0 G 12 1
-> 15 0 7 0 G 12 2
-> 16 0 7 0 G 14 2
-> 15 0 7 0 G 14 3
-> 16 0 7 0 G 10 3
-> 15 0 7 0 G 10 4
-> 16 0 7 0 G 7 4
-> 15 0 7 0 G 7 5
-> 16 0 7 0 G 13 5
-> 15 0 8 0 G 13 6
-> 16 0 8 0 G 1 6
-> 15 0 7 0 G 11 7
-> 16 0 7 0 G 6 7
-> 15 0 7 0 G 6 8
-> 16 0 7 0 G 8 8
-> 15 0 8 0 G 8 9
-> 16 0 8 0 G 5 9
-> 15 0 7 0 G 13 10
-> 16 0 7 0 G 9 10
-> 15 0 8 0 G 9 11
-> 16 0 8 0 G 2 11
-> 15 0 7 0 G 10 12
-> 16 0 7 0 G 15 12
-> 15 0 8 0 G 15 13
-> 16 0 8 0 G 4 13
-> 15 0 7 0 G 12 14
-> 16 0 7 0 G 6 14
-> 15 0 6 0 G 1 15
-> 16 0 6 0 G 9 15
-> 15 0 7 0 G 7 16
-> 16 0 7 0 G 15 16
+> 15 0 6 0 topology 3 0
+> 16 0 6 0 topology 11 0
+> 15 0 7 0 topology 11 1
+> 16 0 7 0 topology 12 1
+> 15 0 7 0 topology 12 2
+> 16 0 7 0 topology 14 2
+> 15 0 7 0 topology 14 3
+> 16 0 7 0 topology 10 3
+> 15 0 7 0 topology 10 4
+> 16 0 7 0 topology 7 4
+> 15 0 7 0 topology 7 5
+> 16 0 7 0 topology 13 5
+> 15 0 8 0 topology 13 6
+> 16 0 8 0 topology 1 6
+> 15 0 7 0 topology 11 7
+> 16 0 7 0 topology 6 7
+> 15 0 7 0 topology 6 8
+> 16 0 7 0 topology 8 8
+> 15 0 8 0 topology 8 9
+> 16 0 8 0 topology 5 9
+> 15 0 7 0 topology 13 10
+> 16 0 7 0 topology 9 10
+> 15 0 8 0 topology 9 11
+> 16 0 8 0 topology 2 11
+> 15 0 7 0 topology 10 12
+> 16 0 7 0 topology 15 12
+> 15 0 8 0 topology 15 13
+> 16 0 8 0 topology 4 13
+> 15 0 7 0 topology 12 14
+> 16 0 7 0 topology 6 14
+> 15 0 6 0 topology 1 15
+> 16 0 6 0 topology 9 15
+> 15 0 7 0 topology 7 16
+> 16 0 7 0 topology 15 16
 > 7 0 1 3
 > 7 0 1 1
 > 7 0 3 14
@@ -12973,12634 +12973,12634 @@ $ tail -n +3 simgrid.trace
 > 8 0 5 4794 0.000100
 > 8 0 4 4797 1250000000.000000
 > 8 0 5 4797 0.000100
-> 15 0 20 1 G 9 0
-> 16 0 20 1 G 18 0
-> 15 0 21 1 G 18 1
-> 16 0 21 1 G 15 1
-> 15 0 21 1 G 15 2
-> 16 0 21 1 G 12 2
-> 15 0 22 1 G 12 3
-> 16 0 22 1 G 2 3
-> 15 0 20 1 G 9 4
-> 16 0 20 1 G 20 4
-> 15 0 22 1 G 20 5
-> 16 0 22 1 G 10 5
-> 15 0 21 1 G 18 6
-> 16 0 21 1 G 17 6
-> 15 0 22 1 G 17 7
-> 16 0 22 1 G 8 7
-> 15 0 22 1 G 15 8
-> 16 0 22 1 G 3 8
-> 15 0 20 1 G 9 9
-> 16 0 20 1 G 19 9
-> 15 0 22 1 G 19 10
-> 16 0 22 1 G 11 10
-> 15 0 21 1 G 18 11
-> 16 0 21 1 G 16 11
-> 15 0 22 1 G 16 12
-> 16 0 22 1 G 7 12
-> 15 0 22 1 G 18 13
-> 16 0 22 1 G 6 13
-> 15 0 21 1 G 15 14
-> 16 0 21 1 G 14 14
-> 15 0 22 1 G 14 15
-> 16 0 22 1 G 5 15
-> 15 0 21 1 G 15 16
-> 16 0 21 1 G 13 16
-> 15 0 22 1 G 13 17
-> 16 0 22 1 G 4 17
-> 15 0 21 1 G 18 18
-> 16 0 21 1 G 20 18
-> 15 0 21 1 G 15 19
-> 16 0 21 1 G 17 19
-> 15 0 22 1 G 12 20
-> 16 0 22 1 G 3 20
-> 15 0 21 1 G 18 21
-> 16 0 21 1 G 19 21
-> 15 0 21 1 G 15 22
-> 16 0 21 1 G 16 22
-> 15 0 22 1 G 15 23
-> 16 0 22 1 G 6 23
-> 15 0 21 1 G 12 24
-> 16 0 21 1 G 14 24
-> 15 0 21 1 G 12 25
-> 16 0 21 1 G 13 25
-> 15 0 21 1 G 20 26
-> 16 0 21 1 G 19 26
-> 15 0 21 1 G 17 27
-> 16 0 21 1 G 16 27
-> 15 0 22 1 G 17 28
-> 16 0 22 1 G 6 28
-> 15 0 20 1 G 3 29
-> 16 0 20 1 G 14 29
-> 15 0 20 1 G 3 30
-> 16 0 20 1 G 13 30
-> 15 0 22 1 G 16 31
-> 16 0 22 1 G 6 31
-> 15 0 21 1 G 14 32
-> 16 0 21 1 G 13 32
-> 15 0 23 4635 G 4648 33
-> 16 0 23 4635 G 4649 33
-> 15 0 24 4635 G 4649 34
-> 16 0 24 4635 G 4793 34
-> 15 0 24 4635 G 4793 35
-> 16 0 24 4635 G 4662 35
-> 15 0 25 4635 G 4662 36
-> 16 0 25 4635 G 4660 36
-> 15 0 24 4635 G 4793 37
-> 16 0 24 4635 G 4665 37
-> 15 0 25 4635 G 4665 38
-> 16 0 25 4635 G 4663 38
-> 15 0 24 4635 G 4793 39
-> 16 0 24 4635 G 4725 39
-> 15 0 25 4635 G 4725 40
-> 16 0 25 4635 G 4723 40
-> 15 0 24 4635 G 4793 41
-> 16 0 24 4635 G 4701 41
-> 15 0 25 4635 G 4701 42
-> 16 0 25 4635 G 4699 42
-> 15 0 24 4635 G 4793 43
-> 16 0 24 4635 G 4677 43
-> 15 0 25 4635 G 4677 44
-> 16 0 25 4635 G 4675 44
-> 15 0 24 4635 G 4793 45
-> 16 0 24 4635 G 4785 45
-> 15 0 25 4635 G 4785 46
-> 16 0 25 4635 G 4783 46
-> 15 0 24 4635 G 4793 47
-> 16 0 24 4635 G 4761 47
-> 15 0 25 4635 G 4761 48
-> 16 0 25 4635 G 4759 48
-> 15 0 24 4635 G 4793 49
-> 16 0 24 4635 G 4737 49
-> 15 0 25 4635 G 4737 50
-> 16 0 25 4635 G 4735 50
-> 15 0 24 4635 G 4793 51
-> 16 0 24 4635 G 4713 51
-> 15 0 25 4635 G 4713 52
-> 16 0 25 4635 G 4711 52
-> 15 0 24 4635 G 4793 53
-> 16 0 24 4635 G 4689 53
-> 15 0 25 4635 G 4689 54
-> 16 0 25 4635 G 4687 54
-> 15 0 24 4635 G 4793 55
-> 16 0 24 4635 G 4773 55
-> 15 0 25 4635 G 4773 56
-> 16 0 25 4635 G 4771 56
-> 15 0 24 4635 G 4793 57
-> 16 0 24 4635 G 4749 57
-> 15 0 25 4635 G 4749 58
-> 16 0 25 4635 G 4747 58
-> 15 0 24 4635 G 4793 59
-> 16 0 24 4635 G 4641 59
-> 15 0 25 4635 G 4641 60
-> 16 0 25 4635 G 4639 60
-> 15 0 24 4635 G 4793 61
-> 16 0 24 4635 G 4653 61
-> 15 0 25 4635 G 4653 62
-> 16 0 25 4635 G 4651 62
-> 15 0 26 4635 G 4793 63
-> 16 0 26 4635 G 4792 63
-> 15 0 24 4635 G 4793 64
-> 16 0 24 4635 G 4668 64
-> 15 0 25 4635 G 4668 65
-> 16 0 25 4635 G 4666 65
-> 15 0 24 4635 G 4793 66
-> 16 0 24 4635 G 4728 66
-> 15 0 25 4635 G 4728 67
-> 16 0 25 4635 G 4726 67
-> 15 0 24 4635 G 4793 68
-> 16 0 24 4635 G 4704 68
-> 15 0 25 4635 G 4704 69
-> 16 0 25 4635 G 4702 69
-> 15 0 24 4635 G 4793 70
-> 16 0 24 4635 G 4680 70
-> 15 0 25 4635 G 4680 71
-> 16 0 25 4635 G 4678 71
-> 15 0 24 4635 G 4793 72
-> 16 0 24 4635 G 4788 72
-> 15 0 25 4635 G 4788 73
-> 16 0 25 4635 G 4786 73
-> 15 0 24 4635 G 4793 74
-> 16 0 24 4635 G 4764 74
-> 15 0 25 4635 G 4764 75
-> 16 0 25 4635 G 4762 75
-> 15 0 24 4635 G 4793 76
-> 16 0 24 4635 G 4740 76
-> 15 0 25 4635 G 4740 77
-> 16 0 25 4635 G 4738 77
-> 15 0 24 4635 G 4793 78
-> 16 0 24 4635 G 4716 78
-> 15 0 25 4635 G 4716 79
-> 16 0 25 4635 G 4714 79
-> 15 0 24 4635 G 4793 80
-> 16 0 24 4635 G 4692 80
-> 15 0 25 4635 G 4692 81
-> 16 0 25 4635 G 4690 81
-> 15 0 24 4635 G 4793 82
-> 16 0 24 4635 G 4776 82
-> 15 0 25 4635 G 4776 83
-> 16 0 25 4635 G 4774 83
-> 15 0 24 4635 G 4793 84
-> 16 0 24 4635 G 4752 84
-> 15 0 25 4635 G 4752 85
-> 16 0 25 4635 G 4750 85
-> 15 0 24 4635 G 4793 86
-> 16 0 24 4635 G 4644 86
-> 15 0 25 4635 G 4644 87
-> 16 0 25 4635 G 4642 87
-> 15 0 24 4635 G 4793 88
-> 16 0 24 4635 G 4656 88
-> 15 0 25 4635 G 4656 89
-> 16 0 25 4635 G 4654 89
-> 15 0 24 4635 G 4793 90
-> 16 0 24 4635 G 4695 90
-> 15 0 25 4635 G 4695 91
-> 16 0 25 4635 G 4693 91
-> 15 0 24 4635 G 4793 92
-> 16 0 24 4635 G 4671 92
-> 15 0 25 4635 G 4671 93
-> 16 0 25 4635 G 4669 93
-> 15 0 24 4635 G 4793 94
-> 16 0 24 4635 G 4755 94
-> 15 0 25 4635 G 4755 95
-> 16 0 25 4635 G 4753 95
-> 15 0 24 4635 G 4793 96
-> 16 0 24 4635 G 4731 96
-> 15 0 25 4635 G 4731 97
-> 16 0 25 4635 G 4729 97
-> 15 0 24 4635 G 4793 98
-> 16 0 24 4635 G 4707 98
-> 15 0 25 4635 G 4707 99
-> 16 0 25 4635 G 4705 99
-> 15 0 24 4635 G 4793 100
-> 16 0 24 4635 G 4683 100
-> 15 0 25 4635 G 4683 101
-> 16 0 25 4635 G 4681 101
-> 15 0 24 4635 G 4793 102
-> 16 0 24 4635 G 4791 102
-> 15 0 25 4635 G 4791 103
-> 16 0 25 4635 G 4789 103
-> 15 0 24 4635 G 4793 104
-> 16 0 24 4635 G 4767 104
-> 15 0 25 4635 G 4767 105
-> 16 0 25 4635 G 4765 105
-> 15 0 24 4635 G 4793 106
-> 16 0 24 4635 G 4743 106
-> 15 0 25 4635 G 4743 107
-> 16 0 25 4635 G 4741 107
-> 15 0 24 4635 G 4793 108
-> 16 0 24 4635 G 4719 108
-> 15 0 25 4635 G 4719 109
-> 16 0 25 4635 G 4717 109
-> 15 0 24 4635 G 4793 110
-> 16 0 24 4635 G 4779 110
-> 15 0 25 4635 G 4779 111
-> 16 0 25 4635 G 4777 111
-> 15 0 24 4635 G 4793 112
-> 16 0 24 4635 G 4647 112
-> 15 0 25 4635 G 4647 113
-> 16 0 25 4635 G 4645 113
-> 15 0 24 4635 G 4793 114
-> 16 0 24 4635 G 4659 114
-> 15 0 25 4635 G 4659 115
-> 16 0 25 4635 G 4657 115
-> 15 0 24 4635 G 4793 116
-> 16 0 24 4635 G 4698 116
-> 15 0 25 4635 G 4698 117
-> 16 0 25 4635 G 4696 117
-> 15 0 24 4635 G 4793 118
-> 16 0 24 4635 G 4674 118
-> 15 0 25 4635 G 4674 119
-> 16 0 25 4635 G 4672 119
-> 15 0 24 4635 G 4793 120
-> 16 0 24 4635 G 4758 120
-> 15 0 25 4635 G 4758 121
-> 16 0 25 4635 G 4756 121
-> 15 0 24 4635 G 4793 122
-> 16 0 24 4635 G 4734 122
-> 15 0 25 4635 G 4734 123
-> 16 0 25 4635 G 4732 123
-> 15 0 24 4635 G 4793 124
-> 16 0 24 4635 G 4710 124
-> 15 0 25 4635 G 4710 125
-> 16 0 25 4635 G 4708 125
-> 15 0 24 4635 G 4793 126
-> 16 0 24 4635 G 4686 126
-> 15 0 25 4635 G 4686 127
-> 16 0 25 4635 G 4684 127
-> 15 0 24 4635 G 4793 128
-> 16 0 24 4635 G 4770 128
-> 15 0 25 4635 G 4770 129
-> 16 0 25 4635 G 4768 129
-> 15 0 24 4635 G 4793 130
-> 16 0 24 4635 G 4746 130
-> 15 0 25 4635 G 4746 131
-> 16 0 25 4635 G 4744 131
-> 15 0 24 4635 G 4793 132
-> 16 0 24 4635 G 4722 132
-> 15 0 25 4635 G 4722 133
-> 16 0 25 4635 G 4720 133
-> 15 0 24 4635 G 4793 134
-> 16 0 24 4635 G 4782 134
-> 15 0 25 4635 G 4782 135
-> 16 0 25 4635 G 4780 135
-> 15 0 24 4635 G 4793 136
-> 16 0 24 4635 G 4638 136
-> 15 0 25 4635 G 4638 137
-> 16 0 25 4635 G 4636 137
-> 15 0 23 4635 G 4660 138
-> 16 0 23 4635 G 4661 138
-> 15 0 24 4635 G 4661 139
-> 16 0 24 4635 G 4793 139
-> 15 0 24 4635 G 4793 140
-> 16 0 24 4635 G 4650 140
-> 15 0 25 4635 G 4650 141
-> 16 0 25 4635 G 4648 141
-> 15 0 23 4635 G 4663 142
-> 16 0 23 4635 G 4664 142
-> 15 0 24 4635 G 4664 143
-> 16 0 24 4635 G 4793 143
-> 15 0 23 4635 G 4723 144
-> 16 0 23 4635 G 4724 144
-> 15 0 24 4635 G 4724 145
-> 16 0 24 4635 G 4793 145
-> 15 0 23 4635 G 4699 146
-> 16 0 23 4635 G 4700 146
-> 15 0 24 4635 G 4700 147
-> 16 0 24 4635 G 4793 147
-> 15 0 23 4635 G 4675 148
-> 16 0 23 4635 G 4676 148
-> 15 0 24 4635 G 4676 149
-> 16 0 24 4635 G 4793 149
-> 15 0 23 4635 G 4783 150
-> 16 0 23 4635 G 4784 150
-> 15 0 24 4635 G 4784 151
-> 16 0 24 4635 G 4793 151
-> 15 0 23 4635 G 4759 152
-> 16 0 23 4635 G 4760 152
-> 15 0 24 4635 G 4760 153
-> 16 0 24 4635 G 4793 153
-> 15 0 23 4635 G 4735 154
-> 16 0 23 4635 G 4736 154
-> 15 0 24 4635 G 4736 155
-> 16 0 24 4635 G 4793 155
-> 15 0 23 4635 G 4711 156
-> 16 0 23 4635 G 4712 156
-> 15 0 24 4635 G 4712 157
-> 16 0 24 4635 G 4793 157
-> 15 0 23 4635 G 4687 158
-> 16 0 23 4635 G 4688 158
-> 15 0 24 4635 G 4688 159
-> 16 0 24 4635 G 4793 159
-> 15 0 23 4635 G 4771 160
-> 16 0 23 4635 G 4772 160
-> 15 0 24 4635 G 4772 161
-> 16 0 24 4635 G 4793 161
-> 15 0 23 4635 G 4747 162
-> 16 0 23 4635 G 4748 162
-> 15 0 24 4635 G 4748 163
-> 16 0 24 4635 G 4793 163
-> 15 0 23 4635 G 4639 164
-> 16 0 23 4635 G 4640 164
-> 15 0 24 4635 G 4640 165
-> 16 0 24 4635 G 4793 165
-> 15 0 23 4635 G 4651 166
-> 16 0 23 4635 G 4652 166
-> 15 0 24 4635 G 4652 167
-> 16 0 24 4635 G 4793 167
-> 15 0 23 4635 G 4666 168
-> 16 0 23 4635 G 4667 168
-> 15 0 24 4635 G 4667 169
-> 16 0 24 4635 G 4793 169
-> 15 0 23 4635 G 4726 170
-> 16 0 23 4635 G 4727 170
-> 15 0 24 4635 G 4727 171
-> 16 0 24 4635 G 4793 171
-> 15 0 23 4635 G 4702 172
-> 16 0 23 4635 G 4703 172
-> 15 0 24 4635 G 4703 173
-> 16 0 24 4635 G 4793 173
-> 15 0 23 4635 G 4678 174
-> 16 0 23 4635 G 4679 174
-> 15 0 24 4635 G 4679 175
-> 16 0 24 4635 G 4793 175
-> 15 0 23 4635 G 4786 176
-> 16 0 23 4635 G 4787 176
-> 15 0 24 4635 G 4787 177
-> 16 0 24 4635 G 4793 177
-> 15 0 23 4635 G 4762 178
-> 16 0 23 4635 G 4763 178
-> 15 0 24 4635 G 4763 179
-> 16 0 24 4635 G 4793 179
-> 15 0 23 4635 G 4738 180
-> 16 0 23 4635 G 4739 180
-> 15 0 24 4635 G 4739 181
-> 16 0 24 4635 G 4793 181
-> 15 0 23 4635 G 4714 182
-> 16 0 23 4635 G 4715 182
-> 15 0 24 4635 G 4715 183
-> 16 0 24 4635 G 4793 183
-> 15 0 23 4635 G 4690 184
-> 16 0 23 4635 G 4691 184
-> 15 0 24 4635 G 4691 185
-> 16 0 24 4635 G 4793 185
-> 15 0 23 4635 G 4774 186
-> 16 0 23 4635 G 4775 186
-> 15 0 24 4635 G 4775 187
-> 16 0 24 4635 G 4793 187
-> 15 0 23 4635 G 4750 188
-> 16 0 23 4635 G 4751 188
-> 15 0 24 4635 G 4751 189
-> 16 0 24 4635 G 4793 189
-> 15 0 23 4635 G 4642 190
-> 16 0 23 4635 G 4643 190
-> 15 0 24 4635 G 4643 191
-> 16 0 24 4635 G 4793 191
-> 15 0 23 4635 G 4654 192
-> 16 0 23 4635 G 4655 192
-> 15 0 24 4635 G 4655 193
-> 16 0 24 4635 G 4793 193
-> 15 0 23 4635 G 4693 194
-> 16 0 23 4635 G 4694 194
-> 15 0 24 4635 G 4694 195
-> 16 0 24 4635 G 4793 195
-> 15 0 23 4635 G 4669 196
-> 16 0 23 4635 G 4670 196
-> 15 0 24 4635 G 4670 197
-> 16 0 24 4635 G 4793 197
-> 15 0 23 4635 G 4753 198
-> 16 0 23 4635 G 4754 198
-> 15 0 24 4635 G 4754 199
-> 16 0 24 4635 G 4793 199
-> 15 0 23 4635 G 4729 200
-> 16 0 23 4635 G 4730 200
-> 15 0 24 4635 G 4730 201
-> 16 0 24 4635 G 4793 201
-> 15 0 23 4635 G 4705 202
-> 16 0 23 4635 G 4706 202
-> 15 0 24 4635 G 4706 203
-> 16 0 24 4635 G 4793 203
-> 15 0 23 4635 G 4681 204
-> 16 0 23 4635 G 4682 204
-> 15 0 24 4635 G 4682 205
-> 16 0 24 4635 G 4793 205
-> 15 0 23 4635 G 4789 206
-> 16 0 23 4635 G 4790 206
-> 15 0 24 4635 G 4790 207
-> 16 0 24 4635 G 4793 207
-> 15 0 23 4635 G 4765 208
-> 16 0 23 4635 G 4766 208
-> 15 0 24 4635 G 4766 209
-> 16 0 24 4635 G 4793 209
-> 15 0 23 4635 G 4741 210
-> 16 0 23 4635 G 4742 210
-> 15 0 24 4635 G 4742 211
-> 16 0 24 4635 G 4793 211
-> 15 0 23 4635 G 4717 212
-> 16 0 23 4635 G 4718 212
-> 15 0 24 4635 G 4718 213
-> 16 0 24 4635 G 4793 213
-> 15 0 23 4635 G 4777 214
-> 16 0 23 4635 G 4778 214
-> 15 0 24 4635 G 4778 215
-> 16 0 24 4635 G 4793 215
-> 15 0 23 4635 G 4645 216
-> 16 0 23 4635 G 4646 216
-> 15 0 24 4635 G 4646 217
-> 16 0 24 4635 G 4793 217
-> 15 0 23 4635 G 4657 218
-> 16 0 23 4635 G 4658 218
-> 15 0 24 4635 G 4658 219
-> 16 0 24 4635 G 4793 219
-> 15 0 23 4635 G 4696 220
-> 16 0 23 4635 G 4697 220
-> 15 0 24 4635 G 4697 221
-> 16 0 24 4635 G 4793 221
-> 15 0 23 4635 G 4672 222
-> 16 0 23 4635 G 4673 222
-> 15 0 24 4635 G 4673 223
-> 16 0 24 4635 G 4793 223
-> 15 0 23 4635 G 4756 224
-> 16 0 23 4635 G 4757 224
-> 15 0 24 4635 G 4757 225
-> 16 0 24 4635 G 4793 225
-> 15 0 23 4635 G 4732 226
-> 16 0 23 4635 G 4733 226
-> 15 0 24 4635 G 4733 227
-> 16 0 24 4635 G 4793 227
-> 15 0 23 4635 G 4708 228
-> 16 0 23 4635 G 4709 228
-> 15 0 24 4635 G 4709 229
-> 16 0 24 4635 G 4793 229
-> 15 0 23 4635 G 4684 230
-> 16 0 23 4635 G 4685 230
-> 15 0 24 4635 G 4685 231
-> 16 0 24 4635 G 4793 231
-> 15 0 23 4635 G 4768 232
-> 16 0 23 4635 G 4769 232
-> 15 0 24 4635 G 4769 233
-> 16 0 24 4635 G 4793 233
-> 15 0 23 4635 G 4744 234
-> 16 0 23 4635 G 4745 234
-> 15 0 24 4635 G 4745 235
-> 16 0 24 4635 G 4793 235
-> 15 0 23 4635 G 4720 236
-> 16 0 23 4635 G 4721 236
-> 15 0 24 4635 G 4721 237
-> 16 0 24 4635 G 4793 237
-> 15 0 23 4635 G 4780 238
-> 16 0 23 4635 G 4781 238
-> 15 0 24 4635 G 4781 239
-> 16 0 24 4635 G 4793 239
-> 15 0 23 4635 G 4636 240
-> 16 0 23 4635 G 4637 240
-> 15 0 24 4635 G 4637 241
-> 16 0 24 4635 G 4793 241
-> 15 0 23 4391 G 4422 242
-> 16 0 23 4391 G 4423 242
-> 15 0 24 4391 G 4423 243
-> 16 0 24 4391 G 4633 243
-> 15 0 24 4391 G 4633 244
-> 16 0 24 4391 G 4460 244
-> 15 0 25 4391 G 4460 245
-> 16 0 25 4391 G 4458 245
-> 15 0 24 4391 G 4633 246
-> 16 0 24 4391 G 4544 246
-> 15 0 25 4391 G 4544 247
-> 16 0 25 4391 G 4542 247
-> 15 0 24 4391 G 4633 248
-> 16 0 24 4391 G 4496 248
-> 15 0 25 4391 G 4496 249
-> 16 0 25 4391 G 4494 249
-> 15 0 24 4391 G 4633 250
-> 16 0 24 4391 G 4580 250
-> 15 0 25 4391 G 4580 251
-> 16 0 25 4391 G 4578 251
-> 15 0 24 4391 G 4633 252
-> 16 0 24 4391 G 4448 252
-> 15 0 25 4391 G 4448 253
-> 16 0 25 4391 G 4446 253
-> 15 0 24 4391 G 4633 254
-> 16 0 24 4391 G 4532 254
-> 15 0 25 4391 G 4532 255
-> 16 0 25 4391 G 4530 255
-> 15 0 24 4391 G 4633 256
-> 16 0 24 4391 G 4616 256
-> 15 0 25 4391 G 4616 257
-> 16 0 25 4391 G 4614 257
-> 15 0 24 4391 G 4633 258
-> 16 0 24 4391 G 4568 258
-> 15 0 25 4391 G 4568 259
-> 16 0 25 4391 G 4566 259
-> 15 0 24 4391 G 4633 260
-> 16 0 24 4391 G 4415 260
-> 15 0 25 4391 G 4415 261
-> 16 0 25 4391 G 4413 261
-> 15 0 24 4391 G 4633 262
-> 16 0 24 4391 G 4451 262
-> 15 0 25 4391 G 4451 263
-> 16 0 25 4391 G 4449 263
-> 15 0 24 4391 G 4633 264
-> 16 0 24 4391 G 4487 264
-> 15 0 25 4391 G 4487 265
-> 16 0 25 4391 G 4485 265
-> 15 0 24 4391 G 4633 266
-> 16 0 24 4391 G 4571 266
-> 15 0 25 4391 G 4571 267
-> 16 0 25 4391 G 4569 267
-> 15 0 24 4391 G 4633 268
-> 16 0 24 4391 G 4439 268
-> 15 0 25 4391 G 4439 269
-> 16 0 25 4391 G 4437 269
-> 15 0 24 4391 G 4633 270
-> 16 0 24 4391 G 4523 270
-> 15 0 25 4391 G 4523 271
-> 16 0 25 4391 G 4521 271
-> 15 0 24 4391 G 4633 272
-> 16 0 24 4391 G 4607 272
-> 15 0 25 4391 G 4607 273
-> 16 0 25 4391 G 4605 273
-> 15 0 24 4391 G 4633 274
-> 16 0 24 4391 G 4475 274
-> 15 0 25 4391 G 4475 275
-> 16 0 25 4391 G 4473 275
-> 15 0 24 4391 G 4633 276
-> 16 0 24 4391 G 4559 276
-> 15 0 25 4391 G 4559 277
-> 16 0 25 4391 G 4557 277
-> 15 0 24 4391 G 4633 278
-> 16 0 24 4391 G 4595 278
-> 15 0 25 4391 G 4595 279
-> 16 0 25 4391 G 4593 279
-> 15 0 24 4391 G 4633 280
-> 16 0 24 4391 G 4406 280
-> 15 0 25 4391 G 4406 281
-> 16 0 25 4391 G 4404 281
-> 15 0 24 4391 G 4633 282
-> 16 0 24 4391 G 4430 282
-> 15 0 25 4391 G 4430 283
-> 16 0 25 4391 G 4428 283
-> 15 0 24 4391 G 4633 284
-> 16 0 24 4391 G 4514 284
-> 15 0 25 4391 G 4514 285
-> 16 0 25 4391 G 4512 285
-> 15 0 24 4391 G 4633 286
-> 16 0 24 4391 G 4466 286
-> 15 0 25 4391 G 4466 287
-> 16 0 25 4391 G 4464 287
-> 15 0 24 4391 G 4633 288
-> 16 0 24 4391 G 4550 288
-> 15 0 25 4391 G 4550 289
-> 16 0 25 4391 G 4548 289
-> 15 0 24 4391 G 4633 290
-> 16 0 24 4391 G 4502 290
-> 15 0 25 4391 G 4502 291
-> 16 0 25 4391 G 4500 291
-> 15 0 24 4391 G 4633 292
-> 16 0 24 4391 G 4586 292
-> 15 0 25 4391 G 4586 293
-> 16 0 25 4391 G 4584 293
-> 15 0 24 4391 G 4633 294
-> 16 0 24 4391 G 4538 294
-> 15 0 25 4391 G 4538 295
-> 16 0 25 4391 G 4536 295
-> 15 0 24 4391 G 4633 296
-> 16 0 24 4391 G 4622 296
-> 15 0 25 4391 G 4622 297
-> 16 0 25 4391 G 4620 297
-> 15 0 24 4391 G 4633 298
-> 16 0 24 4391 G 4397 298
-> 15 0 25 4391 G 4397 299
-> 16 0 25 4391 G 4395 299
-> 15 0 24 4391 G 4633 300
-> 16 0 24 4391 G 4421 300
-> 15 0 25 4391 G 4421 301
-> 16 0 25 4391 G 4419 301
-> 15 0 24 4391 G 4633 302
-> 16 0 24 4391 G 4457 302
-> 15 0 25 4391 G 4457 303
-> 16 0 25 4391 G 4455 303
-> 15 0 24 4391 G 4633 304
-> 16 0 24 4391 G 4541 304
-> 15 0 25 4391 G 4541 305
-> 16 0 25 4391 G 4539 305
-> 15 0 24 4391 G 4633 306
-> 16 0 24 4391 G 4493 306
-> 15 0 25 4391 G 4493 307
-> 16 0 25 4391 G 4491 307
-> 15 0 24 4391 G 4633 308
-> 16 0 24 4391 G 4577 308
-> 15 0 25 4391 G 4577 309
-> 16 0 25 4391 G 4575 309
-> 15 0 24 4391 G 4633 310
-> 16 0 24 4391 G 4445 310
-> 15 0 25 4391 G 4445 311
-> 16 0 25 4391 G 4443 311
-> 15 0 24 4391 G 4633 312
-> 16 0 24 4391 G 4529 312
-> 15 0 25 4391 G 4529 313
-> 16 0 25 4391 G 4527 313
-> 15 0 24 4391 G 4633 314
-> 16 0 24 4391 G 4613 314
-> 15 0 25 4391 G 4613 315
-> 16 0 25 4391 G 4611 315
-> 15 0 24 4391 G 4633 316
-> 16 0 24 4391 G 4565 316
-> 15 0 25 4391 G 4565 317
-> 16 0 25 4391 G 4563 317
-> 15 0 24 4391 G 4633 318
-> 16 0 24 4391 G 4412 318
-> 15 0 25 4391 G 4412 319
-> 16 0 25 4391 G 4410 319
-> 15 0 24 4391 G 4633 320
-> 16 0 24 4391 G 4484 320
-> 15 0 25 4391 G 4484 321
-> 16 0 25 4391 G 4482 321
-> 15 0 24 4391 G 4633 322
-> 16 0 24 4391 G 4436 322
-> 15 0 25 4391 G 4436 323
-> 16 0 25 4391 G 4434 323
-> 15 0 24 4391 G 4633 324
-> 16 0 24 4391 G 4520 324
-> 15 0 25 4391 G 4520 325
-> 16 0 25 4391 G 4518 325
-> 15 0 24 4391 G 4633 326
-> 16 0 24 4391 G 4604 326
-> 15 0 25 4391 G 4604 327
-> 16 0 25 4391 G 4602 327
-> 15 0 24 4391 G 4633 328
-> 16 0 24 4391 G 4472 328
-> 15 0 25 4391 G 4472 329
-> 16 0 25 4391 G 4470 329
-> 15 0 24 4391 G 4633 330
-> 16 0 24 4391 G 4556 330
-> 15 0 25 4391 G 4556 331
-> 16 0 25 4391 G 4554 331
-> 15 0 24 4391 G 4633 332
-> 16 0 24 4391 G 4508 332
-> 15 0 25 4391 G 4508 333
-> 16 0 25 4391 G 4506 333
-> 15 0 24 4391 G 4633 334
-> 16 0 24 4391 G 4592 334
-> 15 0 25 4391 G 4592 335
-> 16 0 25 4391 G 4590 335
-> 15 0 24 4391 G 4633 336
-> 16 0 24 4391 G 4628 336
-> 15 0 25 4391 G 4628 337
-> 16 0 25 4391 G 4626 337
-> 15 0 24 4391 G 4633 338
-> 16 0 24 4391 G 4403 338
-> 15 0 25 4391 G 4403 339
-> 16 0 25 4391 G 4401 339
-> 15 0 26 4391 G 4633 340
-> 16 0 26 4391 G 4632 340
-> 15 0 24 4391 G 4633 341
-> 16 0 24 4391 G 4427 341
-> 15 0 25 4391 G 4427 342
-> 16 0 25 4391 G 4425 342
-> 15 0 24 4391 G 4633 343
-> 16 0 24 4391 G 4511 343
-> 15 0 25 4391 G 4511 344
-> 16 0 25 4391 G 4509 344
-> 15 0 24 4391 G 4633 345
-> 16 0 24 4391 G 4463 345
-> 15 0 25 4391 G 4463 346
-> 16 0 25 4391 G 4461 346
-> 15 0 24 4391 G 4633 347
-> 16 0 24 4391 G 4547 347
-> 15 0 25 4391 G 4547 348
-> 16 0 25 4391 G 4545 348
-> 15 0 24 4391 G 4633 349
-> 16 0 24 4391 G 4631 349
-> 15 0 25 4391 G 4631 350
-> 16 0 25 4391 G 4629 350
-> 15 0 24 4391 G 4633 351
-> 16 0 24 4391 G 4499 351
-> 15 0 25 4391 G 4499 352
-> 16 0 25 4391 G 4497 352
-> 15 0 24 4391 G 4633 353
-> 16 0 24 4391 G 4583 353
-> 15 0 25 4391 G 4583 354
-> 16 0 25 4391 G 4581 354
-> 15 0 24 4391 G 4633 355
-> 16 0 24 4391 G 4535 355
-> 15 0 25 4391 G 4535 356
-> 16 0 25 4391 G 4533 356
-> 15 0 24 4391 G 4633 357
-> 16 0 24 4391 G 4619 357
-> 15 0 25 4391 G 4619 358
-> 16 0 25 4391 G 4617 358
-> 15 0 24 4391 G 4633 359
-> 16 0 24 4391 G 4394 359
-> 15 0 25 4391 G 4394 360
-> 16 0 25 4391 G 4392 360
-> 15 0 24 4391 G 4633 361
-> 16 0 24 4391 G 4418 361
-> 15 0 25 4391 G 4418 362
-> 16 0 25 4391 G 4416 362
-> 15 0 24 4391 G 4633 363
-> 16 0 24 4391 G 4454 363
-> 15 0 25 4391 G 4454 364
-> 16 0 25 4391 G 4452 364
-> 15 0 24 4391 G 4633 365
-> 16 0 24 4391 G 4490 365
-> 15 0 25 4391 G 4490 366
-> 16 0 25 4391 G 4488 366
-> 15 0 24 4391 G 4633 367
-> 16 0 24 4391 G 4574 367
-> 15 0 25 4391 G 4574 368
-> 16 0 25 4391 G 4572 368
-> 15 0 24 4391 G 4633 369
-> 16 0 24 4391 G 4442 369
-> 15 0 25 4391 G 4442 370
-> 16 0 25 4391 G 4440 370
-> 15 0 24 4391 G 4633 371
-> 16 0 24 4391 G 4526 371
-> 15 0 25 4391 G 4526 372
-> 16 0 25 4391 G 4524 372
-> 15 0 24 4391 G 4633 373
-> 16 0 24 4391 G 4610 373
-> 15 0 25 4391 G 4610 374
-> 16 0 25 4391 G 4608 374
-> 15 0 24 4391 G 4633 375
-> 16 0 24 4391 G 4478 375
-> 15 0 25 4391 G 4478 376
-> 16 0 25 4391 G 4476 376
-> 15 0 24 4391 G 4633 377
-> 16 0 24 4391 G 4562 377
-> 15 0 25 4391 G 4562 378
-> 16 0 25 4391 G 4560 378
-> 15 0 24 4391 G 4633 379
-> 16 0 24 4391 G 4598 379
-> 15 0 25 4391 G 4598 380
-> 16 0 25 4391 G 4596 380
-> 15 0 24 4391 G 4633 381
-> 16 0 24 4391 G 4409 381
-> 15 0 25 4391 G 4409 382
-> 16 0 25 4391 G 4407 382
-> 15 0 24 4391 G 4633 383
-> 16 0 24 4391 G 4481 383
-> 15 0 25 4391 G 4481 384
-> 16 0 25 4391 G 4479 384
-> 15 0 24 4391 G 4633 385
-> 16 0 24 4391 G 4433 385
-> 15 0 25 4391 G 4433 386
-> 16 0 25 4391 G 4431 386
-> 15 0 24 4391 G 4633 387
-> 16 0 24 4391 G 4517 387
-> 15 0 25 4391 G 4517 388
-> 16 0 25 4391 G 4515 388
-> 15 0 24 4391 G 4633 389
-> 16 0 24 4391 G 4601 389
-> 15 0 25 4391 G 4601 390
-> 16 0 25 4391 G 4599 390
-> 15 0 24 4391 G 4633 391
-> 16 0 24 4391 G 4469 391
-> 15 0 25 4391 G 4469 392
-> 16 0 25 4391 G 4467 392
-> 15 0 24 4391 G 4633 393
-> 16 0 24 4391 G 4553 393
-> 15 0 25 4391 G 4553 394
-> 16 0 25 4391 G 4551 394
-> 15 0 24 4391 G 4633 395
-> 16 0 24 4391 G 4505 395
-> 15 0 25 4391 G 4505 396
-> 16 0 25 4391 G 4503 396
-> 15 0 24 4391 G 4633 397
-> 16 0 24 4391 G 4589 397
-> 15 0 25 4391 G 4589 398
-> 16 0 25 4391 G 4587 398
-> 15 0 24 4391 G 4633 399
-> 16 0 24 4391 G 4625 399
-> 15 0 25 4391 G 4625 400
-> 16 0 25 4391 G 4623 400
-> 15 0 24 4391 G 4633 401
-> 16 0 24 4391 G 4400 401
-> 15 0 25 4391 G 4400 402
-> 16 0 25 4391 G 4398 402
-> 15 0 23 4391 G 4458 403
-> 16 0 23 4391 G 4459 403
-> 15 0 24 4391 G 4459 404
-> 16 0 24 4391 G 4633 404
-> 15 0 24 4391 G 4633 405
-> 16 0 24 4391 G 4424 405
-> 15 0 25 4391 G 4424 406
-> 16 0 25 4391 G 4422 406
-> 15 0 23 4391 G 4542 407
-> 16 0 23 4391 G 4543 407
-> 15 0 24 4391 G 4543 408
-> 16 0 24 4391 G 4633 408
-> 15 0 23 4391 G 4494 409
-> 16 0 23 4391 G 4495 409
-> 15 0 24 4391 G 4495 410
-> 16 0 24 4391 G 4633 410
-> 15 0 23 4391 G 4578 411
-> 16 0 23 4391 G 4579 411
-> 15 0 24 4391 G 4579 412
-> 16 0 24 4391 G 4633 412
-> 15 0 23 4391 G 4446 413
-> 16 0 23 4391 G 4447 413
-> 15 0 24 4391 G 4447 414
-> 16 0 24 4391 G 4633 414
-> 15 0 23 4391 G 4530 415
-> 16 0 23 4391 G 4531 415
-> 15 0 24 4391 G 4531 416
-> 16 0 24 4391 G 4633 416
-> 15 0 23 4391 G 4614 417
-> 16 0 23 4391 G 4615 417
-> 15 0 24 4391 G 4615 418
-> 16 0 24 4391 G 4633 418
-> 15 0 23 4391 G 4566 419
-> 16 0 23 4391 G 4567 419
-> 15 0 24 4391 G 4567 420
-> 16 0 24 4391 G 4633 420
-> 15 0 23 4391 G 4413 421
-> 16 0 23 4391 G 4414 421
-> 15 0 24 4391 G 4414 422
-> 16 0 24 4391 G 4633 422
-> 15 0 23 4391 G 4449 423
-> 16 0 23 4391 G 4450 423
-> 15 0 24 4391 G 4450 424
-> 16 0 24 4391 G 4633 424
-> 15 0 23 4391 G 4485 425
-> 16 0 23 4391 G 4486 425
-> 15 0 24 4391 G 4486 426
-> 16 0 24 4391 G 4633 426
-> 15 0 23 4391 G 4569 427
-> 16 0 23 4391 G 4570 427
-> 15 0 24 4391 G 4570 428
-> 16 0 24 4391 G 4633 428
-> 15 0 23 4391 G 4437 429
-> 16 0 23 4391 G 4438 429
-> 15 0 24 4391 G 4438 430
-> 16 0 24 4391 G 4633 430
-> 15 0 23 4391 G 4521 431
-> 16 0 23 4391 G 4522 431
-> 15 0 24 4391 G 4522 432
-> 16 0 24 4391 G 4633 432
-> 15 0 23 4391 G 4605 433
-> 16 0 23 4391 G 4606 433
-> 15 0 24 4391 G 4606 434
-> 16 0 24 4391 G 4633 434
-> 15 0 23 4391 G 4473 435
-> 16 0 23 4391 G 4474 435
-> 15 0 24 4391 G 4474 436
-> 16 0 24 4391 G 4633 436
-> 15 0 23 4391 G 4557 437
-> 16 0 23 4391 G 4558 437
-> 15 0 24 4391 G 4558 438
-> 16 0 24 4391 G 4633 438
-> 15 0 23 4391 G 4593 439
-> 16 0 23 4391 G 4594 439
-> 15 0 24 4391 G 4594 440
-> 16 0 24 4391 G 4633 440
-> 15 0 23 4391 G 4404 441
-> 16 0 23 4391 G 4405 441
-> 15 0 24 4391 G 4405 442
-> 16 0 24 4391 G 4633 442
-> 15 0 23 4391 G 4428 443
-> 16 0 23 4391 G 4429 443
-> 15 0 24 4391 G 4429 444
-> 16 0 24 4391 G 4633 444
-> 15 0 23 4391 G 4512 445
-> 16 0 23 4391 G 4513 445
-> 15 0 24 4391 G 4513 446
-> 16 0 24 4391 G 4633 446
-> 15 0 23 4391 G 4464 447
-> 16 0 23 4391 G 4465 447
-> 15 0 24 4391 G 4465 448
-> 16 0 24 4391 G 4633 448
-> 15 0 23 4391 G 4548 449
-> 16 0 23 4391 G 4549 449
-> 15 0 24 4391 G 4549 450
-> 16 0 24 4391 G 4633 450
-> 15 0 23 4391 G 4500 451
-> 16 0 23 4391 G 4501 451
-> 15 0 24 4391 G 4501 452
-> 16 0 24 4391 G 4633 452
-> 15 0 23 4391 G 4584 453
-> 16 0 23 4391 G 4585 453
-> 15 0 24 4391 G 4585 454
-> 16 0 24 4391 G 4633 454
-> 15 0 23 4391 G 4536 455
-> 16 0 23 4391 G 4537 455
-> 15 0 24 4391 G 4537 456
-> 16 0 24 4391 G 4633 456
-> 15 0 23 4391 G 4620 457
-> 16 0 23 4391 G 4621 457
-> 15 0 24 4391 G 4621 458
-> 16 0 24 4391 G 4633 458
-> 15 0 23 4391 G 4395 459
-> 16 0 23 4391 G 4396 459
-> 15 0 24 4391 G 4396 460
-> 16 0 24 4391 G 4633 460
-> 15 0 23 4391 G 4419 461
-> 16 0 23 4391 G 4420 461
-> 15 0 24 4391 G 4420 462
-> 16 0 24 4391 G 4633 462
-> 15 0 23 4391 G 4455 463
-> 16 0 23 4391 G 4456 463
-> 15 0 24 4391 G 4456 464
-> 16 0 24 4391 G 4633 464
-> 15 0 23 4391 G 4539 465
-> 16 0 23 4391 G 4540 465
-> 15 0 24 4391 G 4540 466
-> 16 0 24 4391 G 4633 466
-> 15 0 23 4391 G 4491 467
-> 16 0 23 4391 G 4492 467
-> 15 0 24 4391 G 4492 468
-> 16 0 24 4391 G 4633 468
-> 15 0 23 4391 G 4575 469
-> 16 0 23 4391 G 4576 469
-> 15 0 24 4391 G 4576 470
-> 16 0 24 4391 G 4633 470
-> 15 0 23 4391 G 4443 471
-> 16 0 23 4391 G 4444 471
-> 15 0 24 4391 G 4444 472
-> 16 0 24 4391 G 4633 472
-> 15 0 23 4391 G 4527 473
-> 16 0 23 4391 G 4528 473
-> 15 0 24 4391 G 4528 474
-> 16 0 24 4391 G 4633 474
-> 15 0 23 4391 G 4611 475
-> 16 0 23 4391 G 4612 475
-> 15 0 24 4391 G 4612 476
-> 16 0 24 4391 G 4633 476
-> 15 0 23 4391 G 4563 477
-> 16 0 23 4391 G 4564 477
-> 15 0 24 4391 G 4564 478
-> 16 0 24 4391 G 4633 478
-> 15 0 23 4391 G 4410 479
-> 16 0 23 4391 G 4411 479
-> 15 0 24 4391 G 4411 480
-> 16 0 24 4391 G 4633 480
-> 15 0 23 4391 G 4482 481
-> 16 0 23 4391 G 4483 481
-> 15 0 24 4391 G 4483 482
-> 16 0 24 4391 G 4633 482
-> 15 0 23 4391 G 4434 483
-> 16 0 23 4391 G 4435 483
-> 15 0 24 4391 G 4435 484
-> 16 0 24 4391 G 4633 484
-> 15 0 23 4391 G 4518 485
-> 16 0 23 4391 G 4519 485
-> 15 0 24 4391 G 4519 486
-> 16 0 24 4391 G 4633 486
-> 15 0 23 4391 G 4602 487
-> 16 0 23 4391 G 4603 487
-> 15 0 24 4391 G 4603 488
-> 16 0 24 4391 G 4633 488
-> 15 0 23 4391 G 4470 489
-> 16 0 23 4391 G 4471 489
-> 15 0 24 4391 G 4471 490
-> 16 0 24 4391 G 4633 490
-> 15 0 23 4391 G 4554 491
-> 16 0 23 4391 G 4555 491
-> 15 0 24 4391 G 4555 492
-> 16 0 24 4391 G 4633 492
-> 15 0 23 4391 G 4506 493
-> 16 0 23 4391 G 4507 493
-> 15 0 24 4391 G 4507 494
-> 16 0 24 4391 G 4633 494
-> 15 0 23 4391 G 4590 495
-> 16 0 23 4391 G 4591 495
-> 15 0 24 4391 G 4591 496
-> 16 0 24 4391 G 4633 496
-> 15 0 23 4391 G 4626 497
-> 16 0 23 4391 G 4627 497
-> 15 0 24 4391 G 4627 498
-> 16 0 24 4391 G 4633 498
-> 15 0 23 4391 G 4401 499
-> 16 0 23 4391 G 4402 499
-> 15 0 24 4391 G 4402 500
-> 16 0 24 4391 G 4633 500
-> 15 0 23 4391 G 4425 501
-> 16 0 23 4391 G 4426 501
-> 15 0 24 4391 G 4426 502
-> 16 0 24 4391 G 4633 502
-> 15 0 23 4391 G 4509 503
-> 16 0 23 4391 G 4510 503
-> 15 0 24 4391 G 4510 504
-> 16 0 24 4391 G 4633 504
-> 15 0 23 4391 G 4461 505
-> 16 0 23 4391 G 4462 505
-> 15 0 24 4391 G 4462 506
-> 16 0 24 4391 G 4633 506
-> 15 0 23 4391 G 4545 507
-> 16 0 23 4391 G 4546 507
-> 15 0 24 4391 G 4546 508
-> 16 0 24 4391 G 4633 508
-> 15 0 23 4391 G 4629 509
-> 16 0 23 4391 G 4630 509
-> 15 0 24 4391 G 4630 510
-> 16 0 24 4391 G 4633 510
-> 15 0 23 4391 G 4497 511
-> 16 0 23 4391 G 4498 511
-> 15 0 24 4391 G 4498 512
-> 16 0 24 4391 G 4633 512
-> 15 0 23 4391 G 4581 513
-> 16 0 23 4391 G 4582 513
-> 15 0 24 4391 G 4582 514
-> 16 0 24 4391 G 4633 514
-> 15 0 23 4391 G 4533 515
-> 16 0 23 4391 G 4534 515
-> 15 0 24 4391 G 4534 516
-> 16 0 24 4391 G 4633 516
-> 15 0 23 4391 G 4617 517
-> 16 0 23 4391 G 4618 517
-> 15 0 24 4391 G 4618 518
-> 16 0 24 4391 G 4633 518
-> 15 0 23 4391 G 4392 519
-> 16 0 23 4391 G 4393 519
-> 15 0 24 4391 G 4393 520
-> 16 0 24 4391 G 4633 520
-> 15 0 23 4391 G 4416 521
-> 16 0 23 4391 G 4417 521
-> 15 0 24 4391 G 4417 522
-> 16 0 24 4391 G 4633 522
-> 15 0 23 4391 G 4452 523
-> 16 0 23 4391 G 4453 523
-> 15 0 24 4391 G 4453 524
-> 16 0 24 4391 G 4633 524
-> 15 0 23 4391 G 4488 525
-> 16 0 23 4391 G 4489 525
-> 15 0 24 4391 G 4489 526
-> 16 0 24 4391 G 4633 526
-> 15 0 23 4391 G 4572 527
-> 16 0 23 4391 G 4573 527
-> 15 0 24 4391 G 4573 528
-> 16 0 24 4391 G 4633 528
-> 15 0 23 4391 G 4440 529
-> 16 0 23 4391 G 4441 529
-> 15 0 24 4391 G 4441 530
-> 16 0 24 4391 G 4633 530
-> 15 0 23 4391 G 4524 531
-> 16 0 23 4391 G 4525 531
-> 15 0 24 4391 G 4525 532
-> 16 0 24 4391 G 4633 532
-> 15 0 23 4391 G 4608 533
-> 16 0 23 4391 G 4609 533
-> 15 0 24 4391 G 4609 534
-> 16 0 24 4391 G 4633 534
-> 15 0 23 4391 G 4476 535
-> 16 0 23 4391 G 4477 535
-> 15 0 24 4391 G 4477 536
-> 16 0 24 4391 G 4633 536
-> 15 0 23 4391 G 4560 537
-> 16 0 23 4391 G 4561 537
-> 15 0 24 4391 G 4561 538
-> 16 0 24 4391 G 4633 538
-> 15 0 23 4391 G 4596 539
-> 16 0 23 4391 G 4597 539
-> 15 0 24 4391 G 4597 540
-> 16 0 24 4391 G 4633 540
-> 15 0 23 4391 G 4407 541
-> 16 0 23 4391 G 4408 541
-> 15 0 24 4391 G 4408 542
-> 16 0 24 4391 G 4633 542
-> 15 0 23 4391 G 4479 543
-> 16 0 23 4391 G 4480 543
-> 15 0 24 4391 G 4480 544
-> 16 0 24 4391 G 4633 544
-> 15 0 23 4391 G 4431 545
-> 16 0 23 4391 G 4432 545
-> 15 0 24 4391 G 4432 546
-> 16 0 24 4391 G 4633 546
-> 15 0 23 4391 G 4515 547
-> 16 0 23 4391 G 4516 547
-> 15 0 24 4391 G 4516 548
-> 16 0 24 4391 G 4633 548
-> 15 0 23 4391 G 4599 549
-> 16 0 23 4391 G 4600 549
-> 15 0 24 4391 G 4600 550
-> 16 0 24 4391 G 4633 550
-> 15 0 23 4391 G 4467 551
-> 16 0 23 4391 G 4468 551
-> 15 0 24 4391 G 4468 552
-> 16 0 24 4391 G 4633 552
-> 15 0 23 4391 G 4551 553
-> 16 0 23 4391 G 4552 553
-> 15 0 24 4391 G 4552 554
-> 16 0 24 4391 G 4633 554
-> 15 0 23 4391 G 4503 555
-> 16 0 23 4391 G 4504 555
-> 15 0 24 4391 G 4504 556
-> 16 0 24 4391 G 4633 556
-> 15 0 23 4391 G 4587 557
-> 16 0 23 4391 G 4588 557
-> 15 0 24 4391 G 4588 558
-> 16 0 24 4391 G 4633 558
-> 15 0 23 4391 G 4623 559
-> 16 0 23 4391 G 4624 559
-> 15 0 24 4391 G 4624 560
-> 16 0 24 4391 G 4633 560
-> 15 0 23 4391 G 4398 561
-> 16 0 23 4391 G 4399 561
-> 15 0 24 4391 G 4399 562
-> 16 0 24 4391 G 4633 562
-> 15 0 27 4390 G 4792 563
-> 16 0 27 4390 G 4794 563
-> 15 0 28 4390 G 4794 564
-> 16 0 28 4390 G 4796 564
-> 15 0 21 4390 G 4794 565
-> 16 0 21 4390 G 4634 565
-> 15 0 28 4390 G 4634 566
-> 16 0 28 4390 G 4632 566
-> 15 0 27 4390 G 4796 567
-> 16 0 27 4390 G 4634 567
-> 15 0 23 3794 G 3801 568
-> 16 0 23 3794 G 3802 568
-> 15 0 24 3794 G 3802 569
-> 16 0 24 3794 G 3916 569
-> 15 0 26 3794 G 3916 570
-> 16 0 26 3794 G 3915 570
-> 15 0 24 3794 G 3916 571
-> 16 0 24 3794 G 3815 571
-> 15 0 25 3794 G 3815 572
-> 16 0 25 3794 G 3813 572
-> 15 0 24 3794 G 3916 573
-> 16 0 24 3794 G 3827 573
-> 15 0 25 3794 G 3827 574
-> 16 0 25 3794 G 3825 574
-> 15 0 24 3794 G 3916 575
-> 16 0 24 3794 G 3857 575
-> 15 0 25 3794 G 3857 576
-> 16 0 25 3794 G 3855 576
-> 15 0 24 3794 G 3916 577
-> 16 0 24 3794 G 3887 577
-> 15 0 25 3794 G 3887 578
-> 16 0 25 3794 G 3885 578
-> 15 0 24 3794 G 3916 579
-> 16 0 24 3794 G 3839 579
-> 15 0 25 3794 G 3839 580
-> 16 0 25 3794 G 3837 580
-> 15 0 24 3794 G 3916 581
-> 16 0 24 3794 G 3869 581
-> 15 0 25 3794 G 3869 582
-> 16 0 25 3794 G 3867 582
-> 15 0 24 3794 G 3916 583
-> 16 0 24 3794 G 3899 583
-> 15 0 25 3794 G 3899 584
-> 16 0 25 3794 G 3897 584
-> 15 0 24 3794 G 3916 585
-> 16 0 24 3794 G 3851 585
-> 15 0 25 3794 G 3851 586
-> 16 0 25 3794 G 3849 586
-> 15 0 24 3794 G 3916 587
-> 16 0 24 3794 G 3881 587
-> 15 0 25 3794 G 3881 588
-> 16 0 25 3794 G 3879 588
-> 15 0 24 3794 G 3916 589
-> 16 0 24 3794 G 3911 589
-> 15 0 25 3794 G 3911 590
-> 16 0 25 3794 G 3909 590
-> 15 0 24 3794 G 3916 591
-> 16 0 24 3794 G 3800 591
-> 15 0 25 3794 G 3800 592
-> 16 0 25 3794 G 3798 592
-> 15 0 24 3794 G 3916 593
-> 16 0 24 3794 G 3812 593
-> 15 0 25 3794 G 3812 594
-> 16 0 25 3794 G 3810 594
-> 15 0 24 3794 G 3916 595
-> 16 0 24 3794 G 3824 595
-> 15 0 25 3794 G 3824 596
-> 16 0 25 3794 G 3822 596
-> 15 0 24 3794 G 3916 597
-> 16 0 24 3794 G 3854 597
-> 15 0 25 3794 G 3854 598
-> 16 0 25 3794 G 3852 598
-> 15 0 24 3794 G 3916 599
-> 16 0 24 3794 G 3884 599
-> 15 0 25 3794 G 3884 600
-> 16 0 25 3794 G 3882 600
-> 15 0 24 3794 G 3916 601
-> 16 0 24 3794 G 3914 601
-> 15 0 25 3794 G 3914 602
-> 16 0 25 3794 G 3912 602
-> 15 0 24 3794 G 3916 603
-> 16 0 24 3794 G 3836 603
-> 15 0 25 3794 G 3836 604
-> 16 0 25 3794 G 3834 604
-> 15 0 24 3794 G 3916 605
-> 16 0 24 3794 G 3866 605
-> 15 0 25 3794 G 3866 606
-> 16 0 25 3794 G 3864 606
-> 15 0 24 3794 G 3916 607
-> 16 0 24 3794 G 3896 607
-> 15 0 25 3794 G 3896 608
-> 16 0 25 3794 G 3894 608
-> 15 0 24 3794 G 3916 609
-> 16 0 24 3794 G 3848 609
-> 15 0 25 3794 G 3848 610
-> 16 0 25 3794 G 3846 610
-> 15 0 24 3794 G 3916 611
-> 16 0 24 3794 G 3878 611
-> 15 0 25 3794 G 3878 612
-> 16 0 25 3794 G 3876 612
-> 15 0 24 3794 G 3916 613
-> 16 0 24 3794 G 3908 613
-> 15 0 25 3794 G 3908 614
-> 16 0 25 3794 G 3906 614
-> 15 0 24 3794 G 3916 615
-> 16 0 24 3794 G 3797 615
-> 15 0 25 3794 G 3797 616
-> 16 0 25 3794 G 3795 616
-> 15 0 24 3794 G 3916 617
-> 16 0 24 3794 G 3809 617
-> 15 0 25 3794 G 3809 618
-> 16 0 25 3794 G 3807 618
-> 15 0 24 3794 G 3916 619
-> 16 0 24 3794 G 3821 619
-> 15 0 25 3794 G 3821 620
-> 16 0 25 3794 G 3819 620
-> 15 0 24 3794 G 3916 621
-> 16 0 24 3794 G 3833 621
-> 15 0 25 3794 G 3833 622
-> 16 0 25 3794 G 3831 622
-> 15 0 24 3794 G 3916 623
-> 16 0 24 3794 G 3863 623
-> 15 0 25 3794 G 3863 624
-> 16 0 25 3794 G 3861 624
-> 15 0 24 3794 G 3916 625
-> 16 0 24 3794 G 3893 625
-> 15 0 25 3794 G 3893 626
-> 16 0 25 3794 G 3891 626
-> 15 0 24 3794 G 3916 627
-> 16 0 24 3794 G 3845 627
-> 15 0 25 3794 G 3845 628
-> 16 0 25 3794 G 3843 628
-> 15 0 24 3794 G 3916 629
-> 16 0 24 3794 G 3875 629
-> 15 0 25 3794 G 3875 630
-> 16 0 25 3794 G 3873 630
-> 15 0 24 3794 G 3916 631
-> 16 0 24 3794 G 3905 631
-> 15 0 25 3794 G 3905 632
-> 16 0 25 3794 G 3903 632
-> 15 0 24 3794 G 3916 633
-> 16 0 24 3794 G 3806 633
-> 15 0 25 3794 G 3806 634
-> 16 0 25 3794 G 3804 634
-> 15 0 24 3794 G 3916 635
-> 16 0 24 3794 G 3818 635
-> 15 0 25 3794 G 3818 636
-> 16 0 25 3794 G 3816 636
-> 15 0 24 3794 G 3916 637
-> 16 0 24 3794 G 3830 637
-> 15 0 25 3794 G 3830 638
-> 16 0 25 3794 G 3828 638
-> 15 0 24 3794 G 3916 639
-> 16 0 24 3794 G 3860 639
-> 15 0 25 3794 G 3860 640
-> 16 0 25 3794 G 3858 640
-> 15 0 24 3794 G 3916 641
-> 16 0 24 3794 G 3890 641
-> 15 0 25 3794 G 3890 642
-> 16 0 25 3794 G 3888 642
-> 15 0 24 3794 G 3916 643
-> 16 0 24 3794 G 3842 643
-> 15 0 25 3794 G 3842 644
-> 16 0 25 3794 G 3840 644
-> 15 0 24 3794 G 3916 645
-> 16 0 24 3794 G 3872 645
-> 15 0 25 3794 G 3872 646
-> 16 0 25 3794 G 3870 646
-> 15 0 24 3794 G 3916 647
-> 16 0 24 3794 G 3902 647
-> 15 0 25 3794 G 3902 648
-> 16 0 25 3794 G 3900 648
-> 15 0 24 3794 G 3916 649
-> 16 0 24 3794 G 3803 649
-> 15 0 25 3794 G 3803 650
-> 16 0 25 3794 G 3801 650
-> 15 0 23 3794 G 3813 651
-> 16 0 23 3794 G 3814 651
-> 15 0 24 3794 G 3814 652
-> 16 0 24 3794 G 3916 652
-> 15 0 23 3794 G 3825 653
-> 16 0 23 3794 G 3826 653
-> 15 0 24 3794 G 3826 654
-> 16 0 24 3794 G 3916 654
-> 15 0 23 3794 G 3855 655
-> 16 0 23 3794 G 3856 655
-> 15 0 24 3794 G 3856 656
-> 16 0 24 3794 G 3916 656
-> 15 0 23 3794 G 3885 657
-> 16 0 23 3794 G 3886 657
-> 15 0 24 3794 G 3886 658
-> 16 0 24 3794 G 3916 658
-> 15 0 23 3794 G 3837 659
-> 16 0 23 3794 G 3838 659
-> 15 0 24 3794 G 3838 660
-> 16 0 24 3794 G 3916 660
-> 15 0 23 3794 G 3867 661
-> 16 0 23 3794 G 3868 661
-> 15 0 24 3794 G 3868 662
-> 16 0 24 3794 G 3916 662
-> 15 0 23 3794 G 3897 663
-> 16 0 23 3794 G 3898 663
-> 15 0 24 3794 G 3898 664
-> 16 0 24 3794 G 3916 664
-> 15 0 23 3794 G 3849 665
-> 16 0 23 3794 G 3850 665
-> 15 0 24 3794 G 3850 666
-> 16 0 24 3794 G 3916 666
-> 15 0 23 3794 G 3879 667
-> 16 0 23 3794 G 3880 667
-> 15 0 24 3794 G 3880 668
-> 16 0 24 3794 G 3916 668
-> 15 0 23 3794 G 3909 669
-> 16 0 23 3794 G 3910 669
-> 15 0 24 3794 G 3910 670
-> 16 0 24 3794 G 3916 670
-> 15 0 23 3794 G 3798 671
-> 16 0 23 3794 G 3799 671
-> 15 0 24 3794 G 3799 672
-> 16 0 24 3794 G 3916 672
-> 15 0 23 3794 G 3810 673
-> 16 0 23 3794 G 3811 673
-> 15 0 24 3794 G 3811 674
-> 16 0 24 3794 G 3916 674
-> 15 0 23 3794 G 3822 675
-> 16 0 23 3794 G 3823 675
-> 15 0 24 3794 G 3823 676
-> 16 0 24 3794 G 3916 676
-> 15 0 23 3794 G 3852 677
-> 16 0 23 3794 G 3853 677
-> 15 0 24 3794 G 3853 678
-> 16 0 24 3794 G 3916 678
-> 15 0 23 3794 G 3882 679
-> 16 0 23 3794 G 3883 679
-> 15 0 24 3794 G 3883 680
-> 16 0 24 3794 G 3916 680
-> 15 0 23 3794 G 3912 681
-> 16 0 23 3794 G 3913 681
-> 15 0 24 3794 G 3913 682
-> 16 0 24 3794 G 3916 682
-> 15 0 23 3794 G 3834 683
-> 16 0 23 3794 G 3835 683
-> 15 0 24 3794 G 3835 684
-> 16 0 24 3794 G 3916 684
-> 15 0 23 3794 G 3864 685
-> 16 0 23 3794 G 3865 685
-> 15 0 24 3794 G 3865 686
-> 16 0 24 3794 G 3916 686
-> 15 0 23 3794 G 3894 687
-> 16 0 23 3794 G 3895 687
-> 15 0 24 3794 G 3895 688
-> 16 0 24 3794 G 3916 688
-> 15 0 23 3794 G 3846 689
-> 16 0 23 3794 G 3847 689
-> 15 0 24 3794 G 3847 690
-> 16 0 24 3794 G 3916 690
-> 15 0 23 3794 G 3876 691
-> 16 0 23 3794 G 3877 691
-> 15 0 24 3794 G 3877 692
-> 16 0 24 3794 G 3916 692
-> 15 0 23 3794 G 3906 693
-> 16 0 23 3794 G 3907 693
-> 15 0 24 3794 G 3907 694
-> 16 0 24 3794 G 3916 694
-> 15 0 23 3794 G 3795 695
-> 16 0 23 3794 G 3796 695
-> 15 0 24 3794 G 3796 696
-> 16 0 24 3794 G 3916 696
-> 15 0 23 3794 G 3807 697
-> 16 0 23 3794 G 3808 697
-> 15 0 24 3794 G 3808 698
-> 16 0 24 3794 G 3916 698
-> 15 0 23 3794 G 3819 699
-> 16 0 23 3794 G 3820 699
-> 15 0 24 3794 G 3820 700
-> 16 0 24 3794 G 3916 700
-> 15 0 23 3794 G 3831 701
-> 16 0 23 3794 G 3832 701
-> 15 0 24 3794 G 3832 702
-> 16 0 24 3794 G 3916 702
-> 15 0 23 3794 G 3861 703
-> 16 0 23 3794 G 3862 703
-> 15 0 24 3794 G 3862 704
-> 16 0 24 3794 G 3916 704
-> 15 0 23 3794 G 3891 705
-> 16 0 23 3794 G 3892 705
-> 15 0 24 3794 G 3892 706
-> 16 0 24 3794 G 3916 706
-> 15 0 23 3794 G 3843 707
-> 16 0 23 3794 G 3844 707
-> 15 0 24 3794 G 3844 708
-> 16 0 24 3794 G 3916 708
-> 15 0 23 3794 G 3873 709
-> 16 0 23 3794 G 3874 709
-> 15 0 24 3794 G 3874 710
-> 16 0 24 3794 G 3916 710
-> 15 0 23 3794 G 3903 711
-> 16 0 23 3794 G 3904 711
-> 15 0 24 3794 G 3904 712
-> 16 0 24 3794 G 3916 712
-> 15 0 23 3794 G 3804 713
-> 16 0 23 3794 G 3805 713
-> 15 0 24 3794 G 3805 714
-> 16 0 24 3794 G 3916 714
-> 15 0 23 3794 G 3816 715
-> 16 0 23 3794 G 3817 715
-> 15 0 24 3794 G 3817 716
-> 16 0 24 3794 G 3916 716
-> 15 0 23 3794 G 3828 717
-> 16 0 23 3794 G 3829 717
-> 15 0 24 3794 G 3829 718
-> 16 0 24 3794 G 3916 718
-> 15 0 23 3794 G 3858 719
-> 16 0 23 3794 G 3859 719
-> 15 0 24 3794 G 3859 720
-> 16 0 24 3794 G 3916 720
-> 15 0 23 3794 G 3888 721
-> 16 0 23 3794 G 3889 721
-> 15 0 24 3794 G 3889 722
-> 16 0 24 3794 G 3916 722
-> 15 0 23 3794 G 3840 723
-> 16 0 23 3794 G 3841 723
-> 15 0 24 3794 G 3841 724
-> 16 0 24 3794 G 3916 724
-> 15 0 23 3794 G 3870 725
-> 16 0 23 3794 G 3871 725
-> 15 0 24 3794 G 3871 726
-> 16 0 24 3794 G 3916 726
-> 15 0 23 3794 G 3900 727
-> 16 0 23 3794 G 3901 727
-> 15 0 24 3794 G 3901 728
-> 16 0 24 3794 G 3916 728
-> 15 0 23 3416 G 3462 729
-> 16 0 23 3416 G 3463 729
-> 15 0 24 3416 G 3463 730
-> 16 0 24 3416 G 3610 730
-> 15 0 24 3416 G 3610 731
-> 16 0 24 3416 G 3572 731
-> 15 0 25 3416 G 3572 732
-> 16 0 25 3416 G 3570 732
-> 15 0 24 3416 G 3610 733
-> 16 0 24 3416 G 3494 733
-> 15 0 25 3416 G 3494 734
-> 16 0 25 3416 G 3492 734
-> 15 0 24 3416 G 3610 735
-> 16 0 24 3416 G 3602 735
-> 15 0 25 3416 G 3602 736
-> 16 0 25 3416 G 3600 736
-> 15 0 24 3416 G 3610 737
-> 16 0 24 3416 G 3524 737
-> 15 0 25 3416 G 3524 738
-> 16 0 25 3416 G 3522 738
-> 15 0 24 3416 G 3610 739
-> 16 0 24 3416 G 3554 739
-> 15 0 25 3416 G 3554 740
-> 16 0 25 3416 G 3552 740
-> 15 0 24 3416 G 3610 741
-> 16 0 24 3416 G 3584 741
-> 15 0 25 3416 G 3584 742
-> 16 0 25 3416 G 3582 742
-> 15 0 24 3416 G 3610 743
-> 16 0 24 3416 G 3425 743
-> 15 0 25 3416 G 3425 744
-> 16 0 25 3416 G 3423 744
-> 15 0 24 3416 G 3610 745
-> 16 0 24 3416 G 3437 745
-> 15 0 25 3416 G 3437 746
-> 16 0 25 3416 G 3435 746
-> 15 0 24 3416 G 3610 747
-> 16 0 24 3416 G 3449 747
-> 15 0 25 3416 G 3449 748
-> 16 0 25 3416 G 3447 748
-> 15 0 24 3416 G 3610 749
-> 16 0 24 3416 G 3479 749
-> 15 0 25 3416 G 3479 750
-> 16 0 25 3416 G 3477 750
-> 15 0 24 3416 G 3610 751
-> 16 0 24 3416 G 3509 751
-> 15 0 25 3416 G 3509 752
-> 16 0 25 3416 G 3507 752
-> 15 0 24 3416 G 3610 753
-> 16 0 24 3416 G 3539 753
-> 15 0 25 3416 G 3539 754
-> 16 0 25 3416 G 3537 754
-> 15 0 24 3416 G 3610 755
-> 16 0 24 3416 G 3461 755
-> 15 0 25 3416 G 3461 756
-> 16 0 25 3416 G 3459 756
-> 15 0 24 3416 G 3610 757
-> 16 0 24 3416 G 3569 757
-> 15 0 25 3416 G 3569 758
-> 16 0 25 3416 G 3567 758
-> 15 0 24 3416 G 3610 759
-> 16 0 24 3416 G 3491 759
-> 15 0 25 3416 G 3491 760
-> 16 0 25 3416 G 3489 760
-> 15 0 24 3416 G 3610 761
-> 16 0 24 3416 G 3599 761
-> 15 0 25 3416 G 3599 762
-> 16 0 25 3416 G 3597 762
-> 15 0 24 3416 G 3610 763
-> 16 0 24 3416 G 3521 763
-> 15 0 25 3416 G 3521 764
-> 16 0 25 3416 G 3519 764
-> 15 0 24 3416 G 3610 765
-> 16 0 24 3416 G 3551 765
-> 15 0 25 3416 G 3551 766
-> 16 0 25 3416 G 3549 766
-> 15 0 24 3416 G 3610 767
-> 16 0 24 3416 G 3473 767
-> 15 0 25 3416 G 3473 768
-> 16 0 25 3416 G 3471 768
-> 15 0 24 3416 G 3610 769
-> 16 0 24 3416 G 3581 769
-> 15 0 25 3416 G 3581 770
-> 16 0 25 3416 G 3579 770
-> 15 0 24 3416 G 3610 771
-> 16 0 24 3416 G 3503 771
-> 15 0 25 3416 G 3503 772
-> 16 0 25 3416 G 3501 772
-> 15 0 24 3416 G 3610 773
-> 16 0 24 3416 G 3533 773
-> 15 0 25 3416 G 3533 774
-> 16 0 25 3416 G 3531 774
-> 15 0 24 3416 G 3610 775
-> 16 0 24 3416 G 3563 775
-> 15 0 25 3416 G 3563 776
-> 16 0 25 3416 G 3561 776
-> 15 0 24 3416 G 3610 777
-> 16 0 24 3416 G 3593 777
-> 15 0 25 3416 G 3593 778
-> 16 0 25 3416 G 3591 778
-> 15 0 24 3416 G 3610 779
-> 16 0 24 3416 G 3422 779
-> 15 0 25 3416 G 3422 780
-> 16 0 25 3416 G 3420 780
-> 15 0 24 3416 G 3610 781
-> 16 0 24 3416 G 3434 781
-> 15 0 25 3416 G 3434 782
-> 16 0 25 3416 G 3432 782
-> 15 0 24 3416 G 3610 783
-> 16 0 24 3416 G 3446 783
-> 15 0 25 3416 G 3446 784
-> 16 0 25 3416 G 3444 784
-> 15 0 24 3416 G 3610 785
-> 16 0 24 3416 G 3476 785
-> 15 0 25 3416 G 3476 786
-> 16 0 25 3416 G 3474 786
-> 15 0 26 3416 G 3610 787
-> 16 0 26 3416 G 3609 787
-> 15 0 24 3416 G 3610 788
-> 16 0 24 3416 G 3506 788
-> 15 0 25 3416 G 3506 789
-> 16 0 25 3416 G 3504 789
-> 15 0 24 3416 G 3610 790
-> 16 0 24 3416 G 3536 790
-> 15 0 25 3416 G 3536 791
-> 16 0 25 3416 G 3534 791
-> 15 0 24 3416 G 3610 792
-> 16 0 24 3416 G 3458 792
-> 15 0 25 3416 G 3458 793
-> 16 0 25 3416 G 3456 793
-> 15 0 24 3416 G 3610 794
-> 16 0 24 3416 G 3566 794
-> 15 0 25 3416 G 3566 795
-> 16 0 25 3416 G 3564 795
-> 15 0 24 3416 G 3610 796
-> 16 0 24 3416 G 3488 796
-> 15 0 25 3416 G 3488 797
-> 16 0 25 3416 G 3486 797
-> 15 0 24 3416 G 3610 798
-> 16 0 24 3416 G 3596 798
-> 15 0 25 3416 G 3596 799
-> 16 0 25 3416 G 3594 799
-> 15 0 24 3416 G 3610 800
-> 16 0 24 3416 G 3518 800
-> 15 0 25 3416 G 3518 801
-> 16 0 25 3416 G 3516 801
-> 15 0 24 3416 G 3610 802
-> 16 0 24 3416 G 3548 802
-> 15 0 25 3416 G 3548 803
-> 16 0 25 3416 G 3546 803
-> 15 0 24 3416 G 3610 804
-> 16 0 24 3416 G 3470 804
-> 15 0 25 3416 G 3470 805
-> 16 0 25 3416 G 3468 805
-> 15 0 24 3416 G 3610 806
-> 16 0 24 3416 G 3578 806
-> 15 0 25 3416 G 3578 807
-> 16 0 25 3416 G 3576 807
-> 15 0 24 3416 G 3610 808
-> 16 0 24 3416 G 3500 808
-> 15 0 25 3416 G 3500 809
-> 16 0 25 3416 G 3498 809
-> 15 0 24 3416 G 3610 810
-> 16 0 24 3416 G 3608 810
-> 15 0 25 3416 G 3608 811
-> 16 0 25 3416 G 3606 811
-> 15 0 24 3416 G 3610 812
-> 16 0 24 3416 G 3530 812
-> 15 0 25 3416 G 3530 813
-> 16 0 25 3416 G 3528 813
-> 15 0 24 3416 G 3610 814
-> 16 0 24 3416 G 3560 814
-> 15 0 25 3416 G 3560 815
-> 16 0 25 3416 G 3558 815
-> 15 0 24 3416 G 3610 816
-> 16 0 24 3416 G 3590 816
-> 15 0 25 3416 G 3590 817
-> 16 0 25 3416 G 3588 817
-> 15 0 24 3416 G 3610 818
-> 16 0 24 3416 G 3419 818
-> 15 0 25 3416 G 3419 819
-> 16 0 25 3416 G 3417 819
-> 15 0 24 3416 G 3610 820
-> 16 0 24 3416 G 3431 820
-> 15 0 25 3416 G 3431 821
-> 16 0 25 3416 G 3429 821
-> 15 0 24 3416 G 3610 822
-> 16 0 24 3416 G 3443 822
-> 15 0 25 3416 G 3443 823
-> 16 0 25 3416 G 3441 823
-> 15 0 24 3416 G 3610 824
-> 16 0 24 3416 G 3455 824
-> 15 0 25 3416 G 3455 825
-> 16 0 25 3416 G 3453 825
-> 15 0 24 3416 G 3610 826
-> 16 0 24 3416 G 3485 826
-> 15 0 25 3416 G 3485 827
-> 16 0 25 3416 G 3483 827
-> 15 0 24 3416 G 3610 828
-> 16 0 24 3416 G 3515 828
-> 15 0 25 3416 G 3515 829
-> 16 0 25 3416 G 3513 829
-> 15 0 24 3416 G 3610 830
-> 16 0 24 3416 G 3545 830
-> 15 0 25 3416 G 3545 831
-> 16 0 25 3416 G 3543 831
-> 15 0 24 3416 G 3610 832
-> 16 0 24 3416 G 3467 832
-> 15 0 25 3416 G 3467 833
-> 16 0 25 3416 G 3465 833
-> 15 0 24 3416 G 3610 834
-> 16 0 24 3416 G 3575 834
-> 15 0 25 3416 G 3575 835
-> 16 0 25 3416 G 3573 835
-> 15 0 24 3416 G 3610 836
-> 16 0 24 3416 G 3497 836
-> 15 0 25 3416 G 3497 837
-> 16 0 25 3416 G 3495 837
-> 15 0 24 3416 G 3610 838
-> 16 0 24 3416 G 3605 838
-> 15 0 25 3416 G 3605 839
-> 16 0 25 3416 G 3603 839
-> 15 0 24 3416 G 3610 840
-> 16 0 24 3416 G 3527 840
-> 15 0 25 3416 G 3527 841
-> 16 0 25 3416 G 3525 841
-> 15 0 24 3416 G 3610 842
-> 16 0 24 3416 G 3557 842
-> 15 0 25 3416 G 3557 843
-> 16 0 25 3416 G 3555 843
-> 15 0 24 3416 G 3610 844
-> 16 0 24 3416 G 3587 844
-> 15 0 25 3416 G 3587 845
-> 16 0 25 3416 G 3585 845
-> 15 0 24 3416 G 3610 846
-> 16 0 24 3416 G 3428 846
-> 15 0 25 3416 G 3428 847
-> 16 0 25 3416 G 3426 847
-> 15 0 24 3416 G 3610 848
-> 16 0 24 3416 G 3440 848
-> 15 0 25 3416 G 3440 849
-> 16 0 25 3416 G 3438 849
-> 15 0 24 3416 G 3610 850
-> 16 0 24 3416 G 3452 850
-> 15 0 25 3416 G 3452 851
-> 16 0 25 3416 G 3450 851
-> 15 0 24 3416 G 3610 852
-> 16 0 24 3416 G 3482 852
-> 15 0 25 3416 G 3482 853
-> 16 0 25 3416 G 3480 853
-> 15 0 24 3416 G 3610 854
-> 16 0 24 3416 G 3512 854
-> 15 0 25 3416 G 3512 855
-> 16 0 25 3416 G 3510 855
-> 15 0 24 3416 G 3610 856
-> 16 0 24 3416 G 3542 856
-> 15 0 25 3416 G 3542 857
-> 16 0 25 3416 G 3540 857
-> 15 0 23 3416 G 3570 858
-> 16 0 23 3416 G 3571 858
-> 15 0 24 3416 G 3571 859
-> 16 0 24 3416 G 3610 859
-> 15 0 24 3416 G 3610 860
-> 16 0 24 3416 G 3464 860
-> 15 0 25 3416 G 3464 861
-> 16 0 25 3416 G 3462 861
-> 15 0 23 3416 G 3492 862
-> 16 0 23 3416 G 3493 862
-> 15 0 24 3416 G 3493 863
-> 16 0 24 3416 G 3610 863
-> 15 0 23 3416 G 3600 864
-> 16 0 23 3416 G 3601 864
-> 15 0 24 3416 G 3601 865
-> 16 0 24 3416 G 3610 865
-> 15 0 23 3416 G 3522 866
-> 16 0 23 3416 G 3523 866
-> 15 0 24 3416 G 3523 867
-> 16 0 24 3416 G 3610 867
-> 15 0 23 3416 G 3552 868
-> 16 0 23 3416 G 3553 868
-> 15 0 24 3416 G 3553 869
-> 16 0 24 3416 G 3610 869
-> 15 0 23 3416 G 3582 870
-> 16 0 23 3416 G 3583 870
-> 15 0 24 3416 G 3583 871
-> 16 0 24 3416 G 3610 871
-> 15 0 23 3416 G 3423 872
-> 16 0 23 3416 G 3424 872
-> 15 0 24 3416 G 3424 873
-> 16 0 24 3416 G 3610 873
-> 15 0 23 3416 G 3435 874
-> 16 0 23 3416 G 3436 874
-> 15 0 24 3416 G 3436 875
-> 16 0 24 3416 G 3610 875
-> 15 0 23 3416 G 3447 876
-> 16 0 23 3416 G 3448 876
-> 15 0 24 3416 G 3448 877
-> 16 0 24 3416 G 3610 877
-> 15 0 23 3416 G 3477 878
-> 16 0 23 3416 G 3478 878
-> 15 0 24 3416 G 3478 879
-> 16 0 24 3416 G 3610 879
-> 15 0 23 3416 G 3507 880
-> 16 0 23 3416 G 3508 880
-> 15 0 24 3416 G 3508 881
-> 16 0 24 3416 G 3610 881
-> 15 0 23 3416 G 3537 882
-> 16 0 23 3416 G 3538 882
-> 15 0 24 3416 G 3538 883
-> 16 0 24 3416 G 3610 883
-> 15 0 23 3416 G 3459 884
-> 16 0 23 3416 G 3460 884
-> 15 0 24 3416 G 3460 885
-> 16 0 24 3416 G 3610 885
-> 15 0 23 3416 G 3567 886
-> 16 0 23 3416 G 3568 886
-> 15 0 24 3416 G 3568 887
-> 16 0 24 3416 G 3610 887
-> 15 0 23 3416 G 3489 888
-> 16 0 23 3416 G 3490 888
-> 15 0 24 3416 G 3490 889
-> 16 0 24 3416 G 3610 889
-> 15 0 23 3416 G 3597 890
-> 16 0 23 3416 G 3598 890
-> 15 0 24 3416 G 3598 891
-> 16 0 24 3416 G 3610 891
-> 15 0 23 3416 G 3519 892
-> 16 0 23 3416 G 3520 892
-> 15 0 24 3416 G 3520 893
-> 16 0 24 3416 G 3610 893
-> 15 0 23 3416 G 3549 894
-> 16 0 23 3416 G 3550 894
-> 15 0 24 3416 G 3550 895
-> 16 0 24 3416 G 3610 895
-> 15 0 23 3416 G 3471 896
-> 16 0 23 3416 G 3472 896
-> 15 0 24 3416 G 3472 897
-> 16 0 24 3416 G 3610 897
-> 15 0 23 3416 G 3579 898
-> 16 0 23 3416 G 3580 898
-> 15 0 24 3416 G 3580 899
-> 16 0 24 3416 G 3610 899
-> 15 0 23 3416 G 3501 900
-> 16 0 23 3416 G 3502 900
-> 15 0 24 3416 G 3502 901
-> 16 0 24 3416 G 3610 901
-> 15 0 23 3416 G 3531 902
-> 16 0 23 3416 G 3532 902
-> 15 0 24 3416 G 3532 903
-> 16 0 24 3416 G 3610 903
-> 15 0 23 3416 G 3561 904
-> 16 0 23 3416 G 3562 904
-> 15 0 24 3416 G 3562 905
-> 16 0 24 3416 G 3610 905
-> 15 0 23 3416 G 3591 906
-> 16 0 23 3416 G 3592 906
-> 15 0 24 3416 G 3592 907
-> 16 0 24 3416 G 3610 907
-> 15 0 23 3416 G 3420 908
-> 16 0 23 3416 G 3421 908
-> 15 0 24 3416 G 3421 909
-> 16 0 24 3416 G 3610 909
-> 15 0 23 3416 G 3432 910
-> 16 0 23 3416 G 3433 910
-> 15 0 24 3416 G 3433 911
-> 16 0 24 3416 G 3610 911
-> 15 0 23 3416 G 3444 912
-> 16 0 23 3416 G 3445 912
-> 15 0 24 3416 G 3445 913
-> 16 0 24 3416 G 3610 913
-> 15 0 23 3416 G 3474 914
-> 16 0 23 3416 G 3475 914
-> 15 0 24 3416 G 3475 915
-> 16 0 24 3416 G 3610 915
-> 15 0 23 3416 G 3504 916
-> 16 0 23 3416 G 3505 916
-> 15 0 24 3416 G 3505 917
-> 16 0 24 3416 G 3610 917
-> 15 0 23 3416 G 3534 918
-> 16 0 23 3416 G 3535 918
-> 15 0 24 3416 G 3535 919
-> 16 0 24 3416 G 3610 919
-> 15 0 23 3416 G 3456 920
-> 16 0 23 3416 G 3457 920
-> 15 0 24 3416 G 3457 921
-> 16 0 24 3416 G 3610 921
-> 15 0 23 3416 G 3564 922
-> 16 0 23 3416 G 3565 922
-> 15 0 24 3416 G 3565 923
-> 16 0 24 3416 G 3610 923
-> 15 0 23 3416 G 3486 924
-> 16 0 23 3416 G 3487 924
-> 15 0 24 3416 G 3487 925
-> 16 0 24 3416 G 3610 925
-> 15 0 23 3416 G 3594 926
-> 16 0 23 3416 G 3595 926
-> 15 0 24 3416 G 3595 927
-> 16 0 24 3416 G 3610 927
-> 15 0 23 3416 G 3516 928
-> 16 0 23 3416 G 3517 928
-> 15 0 24 3416 G 3517 929
-> 16 0 24 3416 G 3610 929
-> 15 0 23 3416 G 3546 930
-> 16 0 23 3416 G 3547 930
-> 15 0 24 3416 G 3547 931
-> 16 0 24 3416 G 3610 931
-> 15 0 23 3416 G 3468 932
-> 16 0 23 3416 G 3469 932
-> 15 0 24 3416 G 3469 933
-> 16 0 24 3416 G 3610 933
-> 15 0 23 3416 G 3576 934
-> 16 0 23 3416 G 3577 934
-> 15 0 24 3416 G 3577 935
-> 16 0 24 3416 G 3610 935
-> 15 0 23 3416 G 3498 936
-> 16 0 23 3416 G 3499 936
-> 15 0 24 3416 G 3499 937
-> 16 0 24 3416 G 3610 937
-> 15 0 23 3416 G 3606 938
-> 16 0 23 3416 G 3607 938
-> 15 0 24 3416 G 3607 939
-> 16 0 24 3416 G 3610 939
-> 15 0 23 3416 G 3528 940
-> 16 0 23 3416 G 3529 940
-> 15 0 24 3416 G 3529 941
-> 16 0 24 3416 G 3610 941
-> 15 0 23 3416 G 3558 942
-> 16 0 23 3416 G 3559 942
-> 15 0 24 3416 G 3559 943
-> 16 0 24 3416 G 3610 943
-> 15 0 23 3416 G 3588 944
-> 16 0 23 3416 G 3589 944
-> 15 0 24 3416 G 3589 945
-> 16 0 24 3416 G 3610 945
-> 15 0 23 3416 G 3417 946
-> 16 0 23 3416 G 3418 946
-> 15 0 24 3416 G 3418 947
-> 16 0 24 3416 G 3610 947
-> 15 0 23 3416 G 3429 948
-> 16 0 23 3416 G 3430 948
-> 15 0 24 3416 G 3430 949
-> 16 0 24 3416 G 3610 949
-> 15 0 23 3416 G 3441 950
-> 16 0 23 3416 G 3442 950
-> 15 0 24 3416 G 3442 951
-> 16 0 24 3416 G 3610 951
-> 15 0 23 3416 G 3453 952
-> 16 0 23 3416 G 3454 952
-> 15 0 24 3416 G 3454 953
-> 16 0 24 3416 G 3610 953
-> 15 0 23 3416 G 3483 954
-> 16 0 23 3416 G 3484 954
-> 15 0 24 3416 G 3484 955
-> 16 0 24 3416 G 3610 955
-> 15 0 23 3416 G 3513 956
-> 16 0 23 3416 G 3514 956
-> 15 0 24 3416 G 3514 957
-> 16 0 24 3416 G 3610 957
-> 15 0 23 3416 G 3543 958
-> 16 0 23 3416 G 3544 958
-> 15 0 24 3416 G 3544 959
-> 16 0 24 3416 G 3610 959
-> 15 0 23 3416 G 3465 960
-> 16 0 23 3416 G 3466 960
-> 15 0 24 3416 G 3466 961
-> 16 0 24 3416 G 3610 961
-> 15 0 23 3416 G 3573 962
-> 16 0 23 3416 G 3574 962
-> 15 0 24 3416 G 3574 963
-> 16 0 24 3416 G 3610 963
-> 15 0 23 3416 G 3495 964
-> 16 0 23 3416 G 3496 964
-> 15 0 24 3416 G 3496 965
-> 16 0 24 3416 G 3610 965
-> 15 0 23 3416 G 3603 966
-> 16 0 23 3416 G 3604 966
-> 15 0 24 3416 G 3604 967
-> 16 0 24 3416 G 3610 967
-> 15 0 23 3416 G 3525 968
-> 16 0 23 3416 G 3526 968
-> 15 0 24 3416 G 3526 969
-> 16 0 24 3416 G 3610 969
-> 15 0 23 3416 G 3555 970
-> 16 0 23 3416 G 3556 970
-> 15 0 24 3416 G 3556 971
-> 16 0 24 3416 G 3610 971
-> 15 0 23 3416 G 3585 972
-> 16 0 23 3416 G 3586 972
-> 15 0 24 3416 G 3586 973
-> 16 0 24 3416 G 3610 973
-> 15 0 23 3416 G 3426 974
-> 16 0 23 3416 G 3427 974
-> 15 0 24 3416 G 3427 975
-> 16 0 24 3416 G 3610 975
-> 15 0 23 3416 G 3438 976
-> 16 0 23 3416 G 3439 976
-> 15 0 24 3416 G 3439 977
-> 16 0 24 3416 G 3610 977
-> 15 0 23 3416 G 3450 978
-> 16 0 23 3416 G 3451 978
-> 15 0 24 3416 G 3451 979
-> 16 0 24 3416 G 3610 979
-> 15 0 23 3416 G 3480 980
-> 16 0 23 3416 G 3481 980
-> 15 0 24 3416 G 3481 981
-> 16 0 24 3416 G 3610 981
-> 15 0 23 3416 G 3510 982
-> 16 0 23 3416 G 3511 982
-> 15 0 24 3416 G 3511 983
-> 16 0 24 3416 G 3610 983
-> 15 0 23 3416 G 3540 984
-> 16 0 23 3416 G 3541 984
-> 15 0 24 3416 G 3541 985
-> 16 0 24 3416 G 3610 985
-> 15 0 23 3612 G 3640 986
-> 16 0 23 3612 G 3641 986
-> 15 0 24 3612 G 3641 987
-> 16 0 24 3612 G 3713 987
-> 15 0 24 3612 G 3713 988
-> 16 0 24 3612 G 3672 988
-> 15 0 25 3612 G 3672 989
-> 16 0 25 3612 G 3670 989
-> 15 0 24 3612 G 3713 990
-> 16 0 24 3612 G 3702 990
-> 15 0 25 3612 G 3702 991
-> 16 0 25 3612 G 3700 991
-> 15 0 24 3612 G 3713 992
-> 16 0 24 3612 G 3654 992
-> 15 0 25 3612 G 3654 993
-> 16 0 25 3612 G 3652 993
-> 15 0 24 3612 G 3713 994
-> 16 0 24 3612 G 3684 994
-> 15 0 25 3612 G 3684 995
-> 16 0 25 3612 G 3682 995
-> 15 0 24 3612 G 3713 996
-> 16 0 24 3612 G 3666 996
-> 15 0 25 3612 G 3666 997
-> 16 0 25 3612 G 3664 997
-> 15 0 24 3612 G 3713 998
-> 16 0 24 3612 G 3696 998
-> 15 0 25 3612 G 3696 999
-> 16 0 25 3612 G 3694 999
-> 15 0 24 3612 G 3713 1000
-> 16 0 24 3612 G 3615 1000
-> 15 0 25 3612 G 3615 1001
-> 16 0 25 3612 G 3613 1001
-> 15 0 24 3612 G 3713 1002
-> 16 0 24 3612 G 3627 1002
-> 15 0 25 3612 G 3627 1003
-> 16 0 25 3612 G 3625 1003
-> 15 0 24 3612 G 3713 1004
-> 16 0 24 3612 G 3639 1004
-> 15 0 25 3612 G 3639 1005
-> 16 0 25 3612 G 3637 1005
-> 15 0 24 3612 G 3713 1006
-> 16 0 24 3612 G 3651 1006
-> 15 0 25 3612 G 3651 1007
-> 16 0 25 3612 G 3649 1007
-> 15 0 24 3612 G 3713 1008
-> 16 0 24 3612 G 3681 1008
-> 15 0 25 3612 G 3681 1009
-> 16 0 25 3612 G 3679 1009
-> 15 0 24 3612 G 3713 1010
-> 16 0 24 3612 G 3711 1010
-> 15 0 25 3612 G 3711 1011
-> 16 0 25 3612 G 3709 1011
-> 15 0 24 3612 G 3713 1012
-> 16 0 24 3612 G 3663 1012
-> 15 0 25 3612 G 3663 1013
-> 16 0 25 3612 G 3661 1013
-> 15 0 24 3612 G 3713 1014
-> 16 0 24 3612 G 3693 1014
-> 15 0 25 3612 G 3693 1015
-> 16 0 25 3612 G 3691 1015
-> 15 0 26 3612 G 3713 1016
-> 16 0 26 3612 G 3712 1016
-> 15 0 24 3612 G 3713 1017
-> 16 0 24 3612 G 3624 1017
-> 15 0 25 3612 G 3624 1018
-> 16 0 25 3612 G 3622 1018
-> 15 0 24 3612 G 3713 1019
-> 16 0 24 3612 G 3636 1019
-> 15 0 25 3612 G 3636 1020
-> 16 0 25 3612 G 3634 1020
-> 15 0 24 3612 G 3713 1021
-> 16 0 24 3612 G 3648 1021
-> 15 0 25 3612 G 3648 1022
-> 16 0 25 3612 G 3646 1022
-> 15 0 24 3612 G 3713 1023
-> 16 0 24 3612 G 3678 1023
-> 15 0 25 3612 G 3678 1024
-> 16 0 25 3612 G 3676 1024
-> 15 0 24 3612 G 3713 1025
-> 16 0 24 3612 G 3708 1025
-> 15 0 25 3612 G 3708 1026
-> 16 0 25 3612 G 3706 1026
-> 15 0 24 3612 G 3713 1027
-> 16 0 24 3612 G 3660 1027
-> 15 0 25 3612 G 3660 1028
-> 16 0 25 3612 G 3658 1028
-> 15 0 24 3612 G 3713 1029
-> 16 0 24 3612 G 3690 1029
-> 15 0 25 3612 G 3690 1030
-> 16 0 25 3612 G 3688 1030
-> 15 0 24 3612 G 3713 1031
-> 16 0 24 3612 G 3621 1031
-> 15 0 25 3612 G 3621 1032
-> 16 0 25 3612 G 3619 1032
-> 15 0 24 3612 G 3713 1033
-> 16 0 24 3612 G 3633 1033
-> 15 0 25 3612 G 3633 1034
-> 16 0 25 3612 G 3631 1034
-> 15 0 24 3612 G 3713 1035
-> 16 0 24 3612 G 3645 1035
-> 15 0 25 3612 G 3645 1036
-> 16 0 25 3612 G 3643 1036
-> 15 0 24 3612 G 3713 1037
-> 16 0 24 3612 G 3675 1037
-> 15 0 25 3612 G 3675 1038
-> 16 0 25 3612 G 3673 1038
-> 15 0 24 3612 G 3713 1039
-> 16 0 24 3612 G 3705 1039
-> 15 0 25 3612 G 3705 1040
-> 16 0 25 3612 G 3703 1040
-> 15 0 24 3612 G 3713 1041
-> 16 0 24 3612 G 3657 1041
-> 15 0 25 3612 G 3657 1042
-> 16 0 25 3612 G 3655 1042
-> 15 0 24 3612 G 3713 1043
-> 16 0 24 3612 G 3687 1043
-> 15 0 25 3612 G 3687 1044
-> 16 0 25 3612 G 3685 1044
-> 15 0 24 3612 G 3713 1045
-> 16 0 24 3612 G 3669 1045
-> 15 0 25 3612 G 3669 1046
-> 16 0 25 3612 G 3667 1046
-> 15 0 24 3612 G 3713 1047
-> 16 0 24 3612 G 3699 1047
-> 15 0 25 3612 G 3699 1048
-> 16 0 25 3612 G 3697 1048
-> 15 0 24 3612 G 3713 1049
-> 16 0 24 3612 G 3618 1049
-> 15 0 25 3612 G 3618 1050
-> 16 0 25 3612 G 3616 1050
-> 15 0 24 3612 G 3713 1051
-> 16 0 24 3612 G 3630 1051
-> 15 0 25 3612 G 3630 1052
-> 16 0 25 3612 G 3628 1052
-> 15 0 23 3612 G 3670 1053
-> 16 0 23 3612 G 3671 1053
-> 15 0 24 3612 G 3671 1054
-> 16 0 24 3612 G 3713 1054
-> 15 0 24 3612 G 3713 1055
-> 16 0 24 3612 G 3642 1055
-> 15 0 25 3612 G 3642 1056
-> 16 0 25 3612 G 3640 1056
-> 15 0 23 3612 G 3700 1057
-> 16 0 23 3612 G 3701 1057
-> 15 0 24 3612 G 3701 1058
-> 16 0 24 3612 G 3713 1058
-> 15 0 23 3612 G 3652 1059
-> 16 0 23 3612 G 3653 1059
-> 15 0 24 3612 G 3653 1060
-> 16 0 24 3612 G 3713 1060
-> 15 0 23 3612 G 3682 1061
-> 16 0 23 3612 G 3683 1061
-> 15 0 24 3612 G 3683 1062
-> 16 0 24 3612 G 3713 1062
-> 15 0 23 3612 G 3664 1063
-> 16 0 23 3612 G 3665 1063
-> 15 0 24 3612 G 3665 1064
-> 16 0 24 3612 G 3713 1064
-> 15 0 23 3612 G 3694 1065
-> 16 0 23 3612 G 3695 1065
-> 15 0 24 3612 G 3695 1066
-> 16 0 24 3612 G 3713 1066
-> 15 0 23 3612 G 3613 1067
-> 16 0 23 3612 G 3614 1067
-> 15 0 24 3612 G 3614 1068
-> 16 0 24 3612 G 3713 1068
-> 15 0 23 3612 G 3625 1069
-> 16 0 23 3612 G 3626 1069
-> 15 0 24 3612 G 3626 1070
-> 16 0 24 3612 G 3713 1070
-> 15 0 23 3612 G 3637 1071
-> 16 0 23 3612 G 3638 1071
-> 15 0 24 3612 G 3638 1072
-> 16 0 24 3612 G 3713 1072
-> 15 0 23 3612 G 3649 1073
-> 16 0 23 3612 G 3650 1073
-> 15 0 24 3612 G 3650 1074
-> 16 0 24 3612 G 3713 1074
-> 15 0 23 3612 G 3679 1075
-> 16 0 23 3612 G 3680 1075
-> 15 0 24 3612 G 3680 1076
-> 16 0 24 3612 G 3713 1076
-> 15 0 23 3612 G 3709 1077
-> 16 0 23 3612 G 3710 1077
-> 15 0 24 3612 G 3710 1078
-> 16 0 24 3612 G 3713 1078
-> 15 0 23 3612 G 3661 1079
-> 16 0 23 3612 G 3662 1079
-> 15 0 24 3612 G 3662 1080
-> 16 0 24 3612 G 3713 1080
-> 15 0 23 3612 G 3691 1081
-> 16 0 23 3612 G 3692 1081
-> 15 0 24 3612 G 3692 1082
-> 16 0 24 3612 G 3713 1082
-> 15 0 23 3612 G 3622 1083
-> 16 0 23 3612 G 3623 1083
-> 15 0 24 3612 G 3623 1084
-> 16 0 24 3612 G 3713 1084
-> 15 0 23 3612 G 3634 1085
-> 16 0 23 3612 G 3635 1085
-> 15 0 24 3612 G 3635 1086
-> 16 0 24 3612 G 3713 1086
-> 15 0 23 3612 G 3646 1087
-> 16 0 23 3612 G 3647 1087
-> 15 0 24 3612 G 3647 1088
-> 16 0 24 3612 G 3713 1088
-> 15 0 23 3612 G 3676 1089
-> 16 0 23 3612 G 3677 1089
-> 15 0 24 3612 G 3677 1090
-> 16 0 24 3612 G 3713 1090
-> 15 0 23 3612 G 3706 1091
-> 16 0 23 3612 G 3707 1091
-> 15 0 24 3612 G 3707 1092
-> 16 0 24 3612 G 3713 1092
-> 15 0 23 3612 G 3658 1093
-> 16 0 23 3612 G 3659 1093
-> 15 0 24 3612 G 3659 1094
-> 16 0 24 3612 G 3713 1094
-> 15 0 23 3612 G 3688 1095
-> 16 0 23 3612 G 3689 1095
-> 15 0 24 3612 G 3689 1096
-> 16 0 24 3612 G 3713 1096
-> 15 0 23 3612 G 3619 1097
-> 16 0 23 3612 G 3620 1097
-> 15 0 24 3612 G 3620 1098
-> 16 0 24 3612 G 3713 1098
-> 15 0 23 3612 G 3631 1099
-> 16 0 23 3612 G 3632 1099
-> 15 0 24 3612 G 3632 1100
-> 16 0 24 3612 G 3713 1100
-> 15 0 23 3612 G 3643 1101
-> 16 0 23 3612 G 3644 1101
-> 15 0 24 3612 G 3644 1102
-> 16 0 24 3612 G 3713 1102
-> 15 0 23 3612 G 3673 1103
-> 16 0 23 3612 G 3674 1103
-> 15 0 24 3612 G 3674 1104
-> 16 0 24 3612 G 3713 1104
-> 15 0 23 3612 G 3703 1105
-> 16 0 23 3612 G 3704 1105
-> 15 0 24 3612 G 3704 1106
-> 16 0 24 3612 G 3713 1106
-> 15 0 23 3612 G 3655 1107
-> 16 0 23 3612 G 3656 1107
-> 15 0 24 3612 G 3656 1108
-> 16 0 24 3612 G 3713 1108
-> 15 0 23 3612 G 3685 1109
-> 16 0 23 3612 G 3686 1109
-> 15 0 24 3612 G 3686 1110
-> 16 0 24 3612 G 3713 1110
-> 15 0 23 3612 G 3667 1111
-> 16 0 23 3612 G 3668 1111
-> 15 0 24 3612 G 3668 1112
-> 16 0 24 3612 G 3713 1112
-> 15 0 23 3612 G 3697 1113
-> 16 0 23 3612 G 3698 1113
-> 15 0 24 3612 G 3698 1114
-> 16 0 24 3612 G 3713 1114
-> 15 0 23 3612 G 3616 1115
-> 16 0 23 3612 G 3617 1115
-> 15 0 24 3612 G 3617 1116
-> 16 0 24 3612 G 3713 1116
-> 15 0 23 3612 G 3628 1117
-> 16 0 23 3612 G 3629 1117
-> 15 0 24 3612 G 3629 1118
-> 16 0 24 3612 G 3713 1118
-> 15 0 23 3715 G 3725 1119
-> 16 0 23 3715 G 3726 1119
-> 15 0 24 3715 G 3726 1120
-> 16 0 24 3715 G 3792 1120
-> 15 0 24 3715 G 3792 1121
-> 16 0 24 3715 G 3739 1121
-> 15 0 25 3715 G 3739 1122
-> 16 0 25 3715 G 3737 1122
-> 15 0 24 3715 G 3792 1123
-> 16 0 24 3715 G 3748 1123
-> 15 0 25 3715 G 3748 1124
-> 16 0 25 3715 G 3746 1124
-> 15 0 24 3715 G 3792 1125
-> 16 0 24 3715 G 3778 1125
-> 15 0 25 3715 G 3778 1126
-> 16 0 25 3715 G 3776 1126
-> 15 0 24 3715 G 3792 1127
-> 16 0 24 3715 G 3760 1127
-> 15 0 25 3715 G 3760 1128
-> 16 0 25 3715 G 3758 1128
-> 15 0 24 3715 G 3792 1129
-> 16 0 24 3715 G 3790 1129
-> 15 0 25 3715 G 3790 1130
-> 16 0 25 3715 G 3788 1130
-> 15 0 24 3715 G 3792 1131
-> 16 0 24 3715 G 3772 1131
-> 15 0 25 3715 G 3772 1132
-> 16 0 25 3715 G 3770 1132
-> 15 0 24 3715 G 3792 1133
-> 16 0 24 3715 G 3724 1133
-> 15 0 25 3715 G 3724 1134
-> 16 0 25 3715 G 3722 1134
-> 15 0 24 3715 G 3792 1135
-> 16 0 24 3715 G 3736 1135
-> 15 0 25 3715 G 3736 1136
-> 16 0 25 3715 G 3734 1136
-> 15 0 26 3715 G 3792 1137
-> 16 0 26 3715 G 3791 1137
-> 15 0 24 3715 G 3792 1138
-> 16 0 24 3715 G 3745 1138
-> 15 0 25 3715 G 3745 1139
-> 16 0 25 3715 G 3743 1139
-> 15 0 24 3715 G 3792 1140
-> 16 0 24 3715 G 3775 1140
-> 15 0 25 3715 G 3775 1141
-> 16 0 25 3715 G 3773 1141
-> 15 0 24 3715 G 3792 1142
-> 16 0 24 3715 G 3757 1142
-> 15 0 25 3715 G 3757 1143
-> 16 0 25 3715 G 3755 1143
-> 15 0 24 3715 G 3792 1144
-> 16 0 24 3715 G 3787 1144
-> 15 0 25 3715 G 3787 1145
-> 16 0 25 3715 G 3785 1145
-> 15 0 24 3715 G 3792 1146
-> 16 0 24 3715 G 3769 1146
-> 15 0 25 3715 G 3769 1147
-> 16 0 25 3715 G 3767 1147
-> 15 0 24 3715 G 3792 1148
-> 16 0 24 3715 G 3721 1148
-> 15 0 25 3715 G 3721 1149
-> 16 0 25 3715 G 3719 1149
-> 15 0 24 3715 G 3792 1150
-> 16 0 24 3715 G 3733 1150
-> 15 0 25 3715 G 3733 1151
-> 16 0 25 3715 G 3731 1151
-> 15 0 24 3715 G 3792 1152
-> 16 0 24 3715 G 3754 1152
-> 15 0 25 3715 G 3754 1153
-> 16 0 25 3715 G 3752 1153
-> 15 0 24 3715 G 3792 1154
-> 16 0 24 3715 G 3784 1154
-> 15 0 25 3715 G 3784 1155
-> 16 0 25 3715 G 3782 1155
-> 15 0 24 3715 G 3792 1156
-> 16 0 24 3715 G 3766 1156
-> 15 0 25 3715 G 3766 1157
-> 16 0 25 3715 G 3764 1157
-> 15 0 24 3715 G 3792 1158
-> 16 0 24 3715 G 3718 1158
-> 15 0 25 3715 G 3718 1159
-> 16 0 25 3715 G 3716 1159
-> 15 0 24 3715 G 3792 1160
-> 16 0 24 3715 G 3730 1160
-> 15 0 25 3715 G 3730 1161
-> 16 0 25 3715 G 3728 1161
-> 15 0 24 3715 G 3792 1162
-> 16 0 24 3715 G 3742 1162
-> 15 0 25 3715 G 3742 1163
-> 16 0 25 3715 G 3740 1163
-> 15 0 24 3715 G 3792 1164
-> 16 0 24 3715 G 3751 1164
-> 15 0 25 3715 G 3751 1165
-> 16 0 25 3715 G 3749 1165
-> 15 0 24 3715 G 3792 1166
-> 16 0 24 3715 G 3781 1166
-> 15 0 25 3715 G 3781 1167
-> 16 0 25 3715 G 3779 1167
-> 15 0 24 3715 G 3792 1168
-> 16 0 24 3715 G 3763 1168
-> 15 0 25 3715 G 3763 1169
-> 16 0 25 3715 G 3761 1169
-> 15 0 23 3715 G 3737 1170
-> 16 0 23 3715 G 3738 1170
-> 15 0 24 3715 G 3738 1171
-> 16 0 24 3715 G 3792 1171
-> 15 0 24 3715 G 3792 1172
-> 16 0 24 3715 G 3727 1172
-> 15 0 25 3715 G 3727 1173
-> 16 0 25 3715 G 3725 1173
-> 15 0 23 3715 G 3746 1174
-> 16 0 23 3715 G 3747 1174
-> 15 0 24 3715 G 3747 1175
-> 16 0 24 3715 G 3792 1175
-> 15 0 23 3715 G 3776 1176
-> 16 0 23 3715 G 3777 1176
-> 15 0 24 3715 G 3777 1177
-> 16 0 24 3715 G 3792 1177
-> 15 0 23 3715 G 3758 1178
-> 16 0 23 3715 G 3759 1178
-> 15 0 24 3715 G 3759 1179
-> 16 0 24 3715 G 3792 1179
-> 15 0 23 3715 G 3788 1180
-> 16 0 23 3715 G 3789 1180
-> 15 0 24 3715 G 3789 1181
-> 16 0 24 3715 G 3792 1181
-> 15 0 23 3715 G 3770 1182
-> 16 0 23 3715 G 3771 1182
-> 15 0 24 3715 G 3771 1183
-> 16 0 24 3715 G 3792 1183
-> 15 0 23 3715 G 3722 1184
-> 16 0 23 3715 G 3723 1184
-> 15 0 24 3715 G 3723 1185
-> 16 0 24 3715 G 3792 1185
-> 15 0 23 3715 G 3734 1186
-> 16 0 23 3715 G 3735 1186
-> 15 0 24 3715 G 3735 1187
-> 16 0 24 3715 G 3792 1187
-> 15 0 23 3715 G 3743 1188
-> 16 0 23 3715 G 3744 1188
-> 15 0 24 3715 G 3744 1189
-> 16 0 24 3715 G 3792 1189
-> 15 0 23 3715 G 3773 1190
-> 16 0 23 3715 G 3774 1190
-> 15 0 24 3715 G 3774 1191
-> 16 0 24 3715 G 3792 1191
-> 15 0 23 3715 G 3755 1192
-> 16 0 23 3715 G 3756 1192
-> 15 0 24 3715 G 3756 1193
-> 16 0 24 3715 G 3792 1193
-> 15 0 23 3715 G 3785 1194
-> 16 0 23 3715 G 3786 1194
-> 15 0 24 3715 G 3786 1195
-> 16 0 24 3715 G 3792 1195
-> 15 0 23 3715 G 3767 1196
-> 16 0 23 3715 G 3768 1196
-> 15 0 24 3715 G 3768 1197
-> 16 0 24 3715 G 3792 1197
-> 15 0 23 3715 G 3719 1198
-> 16 0 23 3715 G 3720 1198
-> 15 0 24 3715 G 3720 1199
-> 16 0 24 3715 G 3792 1199
-> 15 0 23 3715 G 3731 1200
-> 16 0 23 3715 G 3732 1200
-> 15 0 24 3715 G 3732 1201
-> 16 0 24 3715 G 3792 1201
-> 15 0 23 3715 G 3752 1202
-> 16 0 23 3715 G 3753 1202
-> 15 0 24 3715 G 3753 1203
-> 16 0 24 3715 G 3792 1203
-> 15 0 23 3715 G 3782 1204
-> 16 0 23 3715 G 3783 1204
-> 15 0 24 3715 G 3783 1205
-> 16 0 24 3715 G 3792 1205
-> 15 0 23 3715 G 3764 1206
-> 16 0 23 3715 G 3765 1206
-> 15 0 24 3715 G 3765 1207
-> 16 0 24 3715 G 3792 1207
-> 15 0 23 3715 G 3716 1208
-> 16 0 23 3715 G 3717 1208
-> 15 0 24 3715 G 3717 1209
-> 16 0 24 3715 G 3792 1209
-> 15 0 23 3715 G 3728 1210
-> 16 0 23 3715 G 3729 1210
-> 15 0 24 3715 G 3729 1211
-> 16 0 24 3715 G 3792 1211
-> 15 0 23 3715 G 3740 1212
-> 16 0 23 3715 G 3741 1212
-> 15 0 24 3715 G 3741 1213
-> 16 0 24 3715 G 3792 1213
-> 15 0 23 3715 G 3749 1214
-> 16 0 23 3715 G 3750 1214
-> 15 0 24 3715 G 3750 1215
-> 16 0 24 3715 G 3792 1215
-> 15 0 23 3715 G 3779 1216
-> 16 0 23 3715 G 3780 1216
-> 15 0 24 3715 G 3780 1217
-> 16 0 24 3715 G 3792 1217
-> 15 0 23 3715 G 3761 1218
-> 16 0 23 3715 G 3762 1218
-> 15 0 24 3715 G 3762 1219
-> 16 0 24 3715 G 3792 1219
-> 15 0 27 3415 G 3919 1220
-> 16 0 27 3415 G 3917 1220
-> 15 0 28 3415 G 3917 1221
-> 16 0 28 3415 G 3915 1221
-> 15 0 27 3415 G 3919 1222
-> 16 0 27 3415 G 3611 1222
-> 15 0 28 3415 G 3611 1223
-> 16 0 28 3415 G 3609 1223
-> 15 0 27 3415 G 3919 1224
-> 16 0 27 3415 G 3714 1224
-> 15 0 28 3415 G 3714 1225
-> 16 0 28 3415 G 3712 1225
-> 15 0 27 3415 G 3919 1226
-> 16 0 27 3415 G 3793 1226
-> 15 0 28 3415 G 3793 1227
-> 16 0 28 3415 G 3791 1227
-> 15 0 21 3415 G 3917 1228
-> 16 0 21 3415 G 3611 1228
-> 15 0 21 3415 G 3917 1229
-> 16 0 21 3415 G 3714 1229
-> 15 0 21 3415 G 3917 1230
-> 16 0 21 3415 G 3793 1230
-> 15 0 21 3415 G 3611 1231
-> 16 0 21 3415 G 3714 1231
-> 15 0 21 3415 G 3611 1232
-> 16 0 21 3415 G 3793 1232
-> 15 0 21 3415 G 3714 1233
-> 16 0 21 3415 G 3793 1233
-> 15 0 23 540 G 628 1234
-> 16 0 23 540 G 629 1234
-> 15 0 24 540 G 629 1235
-> 16 0 24 540 G 758 1235
-> 15 0 24 540 G 758 1236
-> 16 0 24 540 G 582 1236
-> 15 0 25 540 G 582 1237
-> 16 0 25 540 G 580 1237
-> 15 0 24 540 G 758 1238
-> 16 0 24 540 G 666 1238
-> 15 0 25 540 G 666 1239
-> 16 0 25 540 G 664 1239
-> 15 0 24 540 G 758 1240
-> 16 0 24 540 G 750 1240
-> 15 0 25 540 G 750 1241
-> 16 0 25 540 G 748 1241
-> 15 0 24 540 G 758 1242
-> 16 0 24 540 G 618 1242
-> 15 0 25 540 G 618 1243
-> 16 0 25 540 G 616 1243
-> 15 0 24 540 G 758 1244
-> 16 0 24 540 G 702 1244
-> 15 0 25 540 G 702 1245
-> 16 0 25 540 G 700 1245
-> 15 0 24 540 G 758 1246
-> 16 0 24 540 G 654 1246
-> 15 0 25 540 G 654 1247
-> 16 0 25 540 G 652 1247
-> 15 0 24 540 G 758 1248
-> 16 0 24 540 G 738 1248
-> 15 0 25 540 G 738 1249
-> 16 0 25 540 G 736 1249
-> 15 0 24 540 G 758 1250
-> 16 0 24 540 G 564 1250
-> 15 0 25 540 G 564 1251
-> 16 0 25 540 G 562 1251
-> 15 0 24 540 G 758 1252
-> 16 0 24 540 G 573 1252
-> 15 0 25 540 G 573 1253
-> 16 0 25 540 G 571 1253
-> 15 0 24 540 G 758 1254
-> 16 0 24 540 G 609 1254
-> 15 0 25 540 G 609 1255
-> 16 0 25 540 G 607 1255
-> 15 0 24 540 G 758 1256
-> 16 0 24 540 G 693 1256
-> 15 0 25 540 G 693 1257
-> 16 0 25 540 G 691 1257
-> 15 0 24 540 G 758 1258
-> 16 0 24 540 G 645 1258
-> 15 0 25 540 G 645 1259
-> 16 0 25 540 G 643 1259
-> 15 0 24 540 G 758 1260
-> 16 0 24 540 G 729 1260
-> 15 0 25 540 G 729 1261
-> 16 0 25 540 G 727 1261
-> 15 0 24 540 G 758 1262
-> 16 0 24 540 G 597 1262
-> 15 0 25 540 G 597 1263
-> 16 0 25 540 G 595 1263
-> 15 0 24 540 G 758 1264
-> 16 0 24 540 G 681 1264
-> 15 0 25 540 G 681 1265
-> 16 0 25 540 G 679 1265
-> 15 0 24 540 G 758 1266
-> 16 0 24 540 G 717 1266
-> 15 0 25 540 G 717 1267
-> 16 0 25 540 G 715 1267
-> 15 0 24 540 G 758 1268
-> 16 0 24 540 G 555 1268
-> 15 0 25 540 G 555 1269
-> 16 0 25 540 G 553 1269
-> 15 0 24 540 G 758 1270
-> 16 0 24 540 G 600 1270
-> 15 0 25 540 G 600 1271
-> 16 0 25 540 G 598 1271
-> 15 0 24 540 G 758 1272
-> 16 0 24 540 G 636 1272
-> 15 0 25 540 G 636 1273
-> 16 0 25 540 G 634 1273
-> 15 0 24 540 G 758 1274
-> 16 0 24 540 G 720 1274
-> 15 0 25 540 G 720 1275
-> 16 0 25 540 G 718 1275
-> 15 0 24 540 G 758 1276
-> 16 0 24 540 G 588 1276
-> 15 0 25 540 G 588 1277
-> 16 0 25 540 G 586 1277
-> 15 0 24 540 G 758 1278
-> 16 0 24 540 G 672 1278
-> 15 0 25 540 G 672 1279
-> 16 0 25 540 G 670 1279
-> 15 0 24 540 G 758 1280
-> 16 0 24 540 G 756 1280
-> 15 0 25 540 G 756 1281
-> 16 0 25 540 G 754 1281
-> 15 0 24 540 G 758 1282
-> 16 0 24 540 G 624 1282
-> 15 0 25 540 G 624 1283
-> 16 0 25 540 G 622 1283
-> 15 0 24 540 G 758 1284
-> 16 0 24 540 G 708 1284
-> 15 0 25 540 G 708 1285
-> 16 0 25 540 G 706 1285
-> 15 0 24 540 G 758 1286
-> 16 0 24 540 G 744 1286
-> 15 0 25 540 G 744 1287
-> 16 0 25 540 G 742 1287
-> 15 0 24 540 G 758 1288
-> 16 0 24 540 G 546 1288
-> 15 0 25 540 G 546 1289
-> 16 0 25 540 G 544 1289
-> 15 0 24 540 G 758 1290
-> 16 0 24 540 G 579 1290
-> 15 0 25 540 G 579 1291
-> 16 0 25 540 G 577 1291
-> 15 0 24 540 G 758 1292
-> 16 0 24 540 G 663 1292
-> 15 0 25 540 G 663 1293
-> 16 0 25 540 G 661 1293
-> 15 0 24 540 G 758 1294
-> 16 0 24 540 G 615 1294
-> 15 0 25 540 G 615 1295
-> 16 0 25 540 G 613 1295
-> 15 0 24 540 G 758 1296
-> 16 0 24 540 G 699 1296
-> 15 0 25 540 G 699 1297
-> 16 0 25 540 G 697 1297
-> 15 0 24 540 G 758 1298
-> 16 0 24 540 G 651 1298
-> 15 0 25 540 G 651 1299
-> 16 0 25 540 G 649 1299
-> 15 0 24 540 G 758 1300
-> 16 0 24 540 G 735 1300
-> 15 0 25 540 G 735 1301
-> 16 0 25 540 G 733 1301
-> 15 0 24 540 G 758 1302
-> 16 0 24 540 G 687 1302
-> 15 0 25 540 G 687 1303
-> 16 0 25 540 G 685 1303
-> 15 0 24 540 G 758 1304
-> 16 0 24 540 G 561 1304
-> 15 0 25 540 G 561 1305
-> 16 0 25 540 G 559 1305
-> 15 0 24 540 G 758 1306
-> 16 0 24 540 G 570 1306
-> 15 0 25 540 G 570 1307
-> 16 0 25 540 G 568 1307
-> 15 0 24 540 G 758 1308
-> 16 0 24 540 G 606 1308
-> 15 0 25 540 G 606 1309
-> 16 0 25 540 G 604 1309
-> 15 0 24 540 G 758 1310
-> 16 0 24 540 G 690 1310
-> 15 0 25 540 G 690 1311
-> 16 0 25 540 G 688 1311
-> 15 0 24 540 G 758 1312
-> 16 0 24 540 G 642 1312
-> 15 0 25 540 G 642 1313
-> 16 0 25 540 G 640 1313
-> 15 0 24 540 G 758 1314
-> 16 0 24 540 G 726 1314
-> 15 0 25 540 G 726 1315
-> 16 0 25 540 G 724 1315
-> 15 0 24 540 G 758 1316
-> 16 0 24 540 G 594 1316
-> 15 0 25 540 G 594 1317
-> 16 0 25 540 G 592 1317
-> 15 0 24 540 G 758 1318
-> 16 0 24 540 G 678 1318
-> 15 0 25 540 G 678 1319
-> 16 0 25 540 G 676 1319
-> 15 0 24 540 G 758 1320
-> 16 0 24 540 G 714 1320
-> 15 0 25 540 G 714 1321
-> 16 0 25 540 G 712 1321
-> 15 0 26 540 G 758 1322
-> 16 0 26 540 G 757 1322
-> 15 0 24 540 G 758 1323
-> 16 0 24 540 G 552 1323
-> 15 0 25 540 G 552 1324
-> 16 0 25 540 G 550 1324
-> 15 0 24 540 G 758 1325
-> 16 0 24 540 G 633 1325
-> 15 0 25 540 G 633 1326
-> 16 0 25 540 G 631 1326
-> 15 0 24 540 G 758 1327
-> 16 0 24 540 G 585 1327
-> 15 0 25 540 G 585 1328
-> 16 0 25 540 G 583 1328
-> 15 0 24 540 G 758 1329
-> 16 0 24 540 G 669 1329
-> 15 0 25 540 G 669 1330
-> 16 0 25 540 G 667 1330
-> 15 0 24 540 G 758 1331
-> 16 0 24 540 G 753 1331
-> 15 0 25 540 G 753 1332
-> 16 0 25 540 G 751 1332
-> 15 0 24 540 G 758 1333
-> 16 0 24 540 G 621 1333
-> 15 0 25 540 G 621 1334
-> 16 0 25 540 G 619 1334
-> 15 0 24 540 G 758 1335
-> 16 0 24 540 G 705 1335
-> 15 0 25 540 G 705 1336
-> 16 0 25 540 G 703 1336
-> 15 0 24 540 G 758 1337
-> 16 0 24 540 G 657 1337
-> 15 0 25 540 G 657 1338
-> 16 0 25 540 G 655 1338
-> 15 0 24 540 G 758 1339
-> 16 0 24 540 G 741 1339
-> 15 0 25 540 G 741 1340
-> 16 0 25 540 G 739 1340
-> 15 0 24 540 G 758 1341
-> 16 0 24 540 G 543 1341
-> 15 0 25 540 G 543 1342
-> 16 0 25 540 G 541 1342
-> 15 0 24 540 G 758 1343
-> 16 0 24 540 G 567 1343
-> 15 0 25 540 G 567 1344
-> 16 0 25 540 G 565 1344
-> 15 0 24 540 G 758 1345
-> 16 0 24 540 G 576 1345
-> 15 0 25 540 G 576 1346
-> 16 0 25 540 G 574 1346
-> 15 0 24 540 G 758 1347
-> 16 0 24 540 G 660 1347
-> 15 0 25 540 G 660 1348
-> 16 0 25 540 G 658 1348
-> 15 0 24 540 G 758 1349
-> 16 0 24 540 G 612 1349
-> 15 0 25 540 G 612 1350
-> 16 0 25 540 G 610 1350
-> 15 0 24 540 G 758 1351
-> 16 0 24 540 G 696 1351
-> 15 0 25 540 G 696 1352
-> 16 0 25 540 G 694 1352
-> 15 0 24 540 G 758 1353
-> 16 0 24 540 G 648 1353
-> 15 0 25 540 G 648 1354
-> 16 0 25 540 G 646 1354
-> 15 0 24 540 G 758 1355
-> 16 0 24 540 G 732 1355
-> 15 0 25 540 G 732 1356
-> 16 0 25 540 G 730 1356
-> 15 0 24 540 G 758 1357
-> 16 0 24 540 G 684 1357
-> 15 0 25 540 G 684 1358
-> 16 0 25 540 G 682 1358
-> 15 0 24 540 G 758 1359
-> 16 0 24 540 G 558 1359
-> 15 0 25 540 G 558 1360
-> 16 0 25 540 G 556 1360
-> 15 0 24 540 G 758 1361
-> 16 0 24 540 G 603 1361
-> 15 0 25 540 G 603 1362
-> 16 0 25 540 G 601 1362
-> 15 0 24 540 G 758 1363
-> 16 0 24 540 G 639 1363
-> 15 0 25 540 G 639 1364
-> 16 0 25 540 G 637 1364
-> 15 0 24 540 G 758 1365
-> 16 0 24 540 G 723 1365
-> 15 0 25 540 G 723 1366
-> 16 0 25 540 G 721 1366
-> 15 0 24 540 G 758 1367
-> 16 0 24 540 G 591 1367
-> 15 0 25 540 G 591 1368
-> 16 0 25 540 G 589 1368
-> 15 0 24 540 G 758 1369
-> 16 0 24 540 G 675 1369
-> 15 0 25 540 G 675 1370
-> 16 0 25 540 G 673 1370
-> 15 0 24 540 G 758 1371
-> 16 0 24 540 G 627 1371
-> 15 0 25 540 G 627 1372
-> 16 0 25 540 G 625 1372
-> 15 0 24 540 G 758 1373
-> 16 0 24 540 G 711 1373
-> 15 0 25 540 G 711 1374
-> 16 0 25 540 G 709 1374
-> 15 0 24 540 G 758 1375
-> 16 0 24 540 G 747 1375
-> 15 0 25 540 G 747 1376
-> 16 0 25 540 G 745 1376
-> 15 0 24 540 G 758 1377
-> 16 0 24 540 G 549 1377
-> 15 0 25 540 G 549 1378
-> 16 0 25 540 G 547 1378
-> 15 0 23 540 G 580 1379
-> 16 0 23 540 G 581 1379
-> 15 0 24 540 G 581 1380
-> 16 0 24 540 G 758 1380
-> 15 0 24 540 G 758 1381
-> 16 0 24 540 G 630 1381
-> 15 0 25 540 G 630 1382
-> 16 0 25 540 G 628 1382
-> 15 0 23 540 G 664 1383
-> 16 0 23 540 G 665 1383
-> 15 0 24 540 G 665 1384
-> 16 0 24 540 G 758 1384
-> 15 0 23 540 G 748 1385
-> 16 0 23 540 G 749 1385
-> 15 0 24 540 G 749 1386
-> 16 0 24 540 G 758 1386
-> 15 0 23 540 G 616 1387
-> 16 0 23 540 G 617 1387
-> 15 0 24 540 G 617 1388
-> 16 0 24 540 G 758 1388
-> 15 0 23 540 G 700 1389
-> 16 0 23 540 G 701 1389
-> 15 0 24 540 G 701 1390
-> 16 0 24 540 G 758 1390
-> 15 0 23 540 G 652 1391
-> 16 0 23 540 G 653 1391
-> 15 0 24 540 G 653 1392
-> 16 0 24 540 G 758 1392
-> 15 0 23 540 G 736 1393
-> 16 0 23 540 G 737 1393
-> 15 0 24 540 G 737 1394
-> 16 0 24 540 G 758 1394
-> 15 0 23 540 G 562 1395
-> 16 0 23 540 G 563 1395
-> 15 0 24 540 G 563 1396
-> 16 0 24 540 G 758 1396
-> 15 0 23 540 G 571 1397
-> 16 0 23 540 G 572 1397
-> 15 0 24 540 G 572 1398
-> 16 0 24 540 G 758 1398
-> 15 0 23 540 G 607 1399
-> 16 0 23 540 G 608 1399
-> 15 0 24 540 G 608 1400
-> 16 0 24 540 G 758 1400
-> 15 0 23 540 G 691 1401
-> 16 0 23 540 G 692 1401
-> 15 0 24 540 G 692 1402
-> 16 0 24 540 G 758 1402
-> 15 0 23 540 G 643 1403
-> 16 0 23 540 G 644 1403
-> 15 0 24 540 G 644 1404
-> 16 0 24 540 G 758 1404
-> 15 0 23 540 G 727 1405
-> 16 0 23 540 G 728 1405
-> 15 0 24 540 G 728 1406
-> 16 0 24 540 G 758 1406
-> 15 0 23 540 G 595 1407
-> 16 0 23 540 G 596 1407
-> 15 0 24 540 G 596 1408
-> 16 0 24 540 G 758 1408
-> 15 0 23 540 G 679 1409
-> 16 0 23 540 G 680 1409
-> 15 0 24 540 G 680 1410
-> 16 0 24 540 G 758 1410
-> 15 0 23 540 G 715 1411
-> 16 0 23 540 G 716 1411
-> 15 0 24 540 G 716 1412
-> 16 0 24 540 G 758 1412
-> 15 0 23 540 G 553 1413
-> 16 0 23 540 G 554 1413
-> 15 0 24 540 G 554 1414
-> 16 0 24 540 G 758 1414
-> 15 0 23 540 G 598 1415
-> 16 0 23 540 G 599 1415
-> 15 0 24 540 G 599 1416
-> 16 0 24 540 G 758 1416
-> 15 0 23 540 G 634 1417
-> 16 0 23 540 G 635 1417
-> 15 0 24 540 G 635 1418
-> 16 0 24 540 G 758 1418
-> 15 0 23 540 G 718 1419
-> 16 0 23 540 G 719 1419
-> 15 0 24 540 G 719 1420
-> 16 0 24 540 G 758 1420
-> 15 0 23 540 G 586 1421
-> 16 0 23 540 G 587 1421
-> 15 0 24 540 G 587 1422
-> 16 0 24 540 G 758 1422
-> 15 0 23 540 G 670 1423
-> 16 0 23 540 G 671 1423
-> 15 0 24 540 G 671 1424
-> 16 0 24 540 G 758 1424
-> 15 0 23 540 G 754 1425
-> 16 0 23 540 G 755 1425
-> 15 0 24 540 G 755 1426
-> 16 0 24 540 G 758 1426
-> 15 0 23 540 G 622 1427
-> 16 0 23 540 G 623 1427
-> 15 0 24 540 G 623 1428
-> 16 0 24 540 G 758 1428
-> 15 0 23 540 G 706 1429
-> 16 0 23 540 G 707 1429
-> 15 0 24 540 G 707 1430
-> 16 0 24 540 G 758 1430
-> 15 0 23 540 G 742 1431
-> 16 0 23 540 G 743 1431
-> 15 0 24 540 G 743 1432
-> 16 0 24 540 G 758 1432
-> 15 0 23 540 G 544 1433
-> 16 0 23 540 G 545 1433
-> 15 0 24 540 G 545 1434
-> 16 0 24 540 G 758 1434
-> 15 0 23 540 G 577 1435
-> 16 0 23 540 G 578 1435
-> 15 0 24 540 G 578 1436
-> 16 0 24 540 G 758 1436
-> 15 0 23 540 G 661 1437
-> 16 0 23 540 G 662 1437
-> 15 0 24 540 G 662 1438
-> 16 0 24 540 G 758 1438
-> 15 0 23 540 G 613 1439
-> 16 0 23 540 G 614 1439
-> 15 0 24 540 G 614 1440
-> 16 0 24 540 G 758 1440
-> 15 0 23 540 G 697 1441
-> 16 0 23 540 G 698 1441
-> 15 0 24 540 G 698 1442
-> 16 0 24 540 G 758 1442
-> 15 0 23 540 G 649 1443
-> 16 0 23 540 G 650 1443
-> 15 0 24 540 G 650 1444
-> 16 0 24 540 G 758 1444
-> 15 0 23 540 G 733 1445
-> 16 0 23 540 G 734 1445
-> 15 0 24 540 G 734 1446
-> 16 0 24 540 G 758 1446
-> 15 0 23 540 G 685 1447
-> 16 0 23 540 G 686 1447
-> 15 0 24 540 G 686 1448
-> 16 0 24 540 G 758 1448
-> 15 0 23 540 G 559 1449
-> 16 0 23 540 G 560 1449
-> 15 0 24 540 G 560 1450
-> 16 0 24 540 G 758 1450
-> 15 0 23 540 G 568 1451
-> 16 0 23 540 G 569 1451
-> 15 0 24 540 G 569 1452
-> 16 0 24 540 G 758 1452
-> 15 0 23 540 G 604 1453
-> 16 0 23 540 G 605 1453
-> 15 0 24 540 G 605 1454
-> 16 0 24 540 G 758 1454
-> 15 0 23 540 G 688 1455
-> 16 0 23 540 G 689 1455
-> 15 0 24 540 G 689 1456
-> 16 0 24 540 G 758 1456
-> 15 0 23 540 G 640 1457
-> 16 0 23 540 G 641 1457
-> 15 0 24 540 G 641 1458
-> 16 0 24 540 G 758 1458
-> 15 0 23 540 G 724 1459
-> 16 0 23 540 G 725 1459
-> 15 0 24 540 G 725 1460
-> 16 0 24 540 G 758 1460
-> 15 0 23 540 G 592 1461
-> 16 0 23 540 G 593 1461
-> 15 0 24 540 G 593 1462
-> 16 0 24 540 G 758 1462
-> 15 0 23 540 G 676 1463
-> 16 0 23 540 G 677 1463
-> 15 0 24 540 G 677 1464
-> 16 0 24 540 G 758 1464
-> 15 0 23 540 G 712 1465
-> 16 0 23 540 G 713 1465
-> 15 0 24 540 G 713 1466
-> 16 0 24 540 G 758 1466
-> 15 0 23 540 G 550 1467
-> 16 0 23 540 G 551 1467
-> 15 0 24 540 G 551 1468
-> 16 0 24 540 G 758 1468
-> 15 0 23 540 G 631 1469
-> 16 0 23 540 G 632 1469
-> 15 0 24 540 G 632 1470
-> 16 0 24 540 G 758 1470
-> 15 0 23 540 G 583 1471
-> 16 0 23 540 G 584 1471
-> 15 0 24 540 G 584 1472
-> 16 0 24 540 G 758 1472
-> 15 0 23 540 G 667 1473
-> 16 0 23 540 G 668 1473
-> 15 0 24 540 G 668 1474
-> 16 0 24 540 G 758 1474
-> 15 0 23 540 G 751 1475
-> 16 0 23 540 G 752 1475
-> 15 0 24 540 G 752 1476
-> 16 0 24 540 G 758 1476
-> 15 0 23 540 G 619 1477
-> 16 0 23 540 G 620 1477
-> 15 0 24 540 G 620 1478
-> 16 0 24 540 G 758 1478
-> 15 0 23 540 G 703 1479
-> 16 0 23 540 G 704 1479
-> 15 0 24 540 G 704 1480
-> 16 0 24 540 G 758 1480
-> 15 0 23 540 G 655 1481
-> 16 0 23 540 G 656 1481
-> 15 0 24 540 G 656 1482
-> 16 0 24 540 G 758 1482
-> 15 0 23 540 G 739 1483
-> 16 0 23 540 G 740 1483
-> 15 0 24 540 G 740 1484
-> 16 0 24 540 G 758 1484
-> 15 0 23 540 G 541 1485
-> 16 0 23 540 G 542 1485
-> 15 0 24 540 G 542 1486
-> 16 0 24 540 G 758 1486
-> 15 0 23 540 G 565 1487
-> 16 0 23 540 G 566 1487
-> 15 0 24 540 G 566 1488
-> 16 0 24 540 G 758 1488
-> 15 0 23 540 G 574 1489
-> 16 0 23 540 G 575 1489
-> 15 0 24 540 G 575 1490
-> 16 0 24 540 G 758 1490
-> 15 0 23 540 G 658 1491
-> 16 0 23 540 G 659 1491
-> 15 0 24 540 G 659 1492
-> 16 0 24 540 G 758 1492
-> 15 0 23 540 G 610 1493
-> 16 0 23 540 G 611 1493
-> 15 0 24 540 G 611 1494
-> 16 0 24 540 G 758 1494
-> 15 0 23 540 G 694 1495
-> 16 0 23 540 G 695 1495
-> 15 0 24 540 G 695 1496
-> 16 0 24 540 G 758 1496
-> 15 0 23 540 G 646 1497
-> 16 0 23 540 G 647 1497
-> 15 0 24 540 G 647 1498
-> 16 0 24 540 G 758 1498
-> 15 0 23 540 G 730 1499
-> 16 0 23 540 G 731 1499
-> 15 0 24 540 G 731 1500
-> 16 0 24 540 G 758 1500
-> 15 0 23 540 G 682 1501
-> 16 0 23 540 G 683 1501
-> 15 0 24 540 G 683 1502
-> 16 0 24 540 G 758 1502
-> 15 0 23 540 G 556 1503
-> 16 0 23 540 G 557 1503
-> 15 0 24 540 G 557 1504
-> 16 0 24 540 G 758 1504
-> 15 0 23 540 G 601 1505
-> 16 0 23 540 G 602 1505
-> 15 0 24 540 G 602 1506
-> 16 0 24 540 G 758 1506
-> 15 0 23 540 G 637 1507
-> 16 0 23 540 G 638 1507
-> 15 0 24 540 G 638 1508
-> 16 0 24 540 G 758 1508
-> 15 0 23 540 G 721 1509
-> 16 0 23 540 G 722 1509
-> 15 0 24 540 G 722 1510
-> 16 0 24 540 G 758 1510
-> 15 0 23 540 G 589 1511
-> 16 0 23 540 G 590 1511
-> 15 0 24 540 G 590 1512
-> 16 0 24 540 G 758 1512
-> 15 0 23 540 G 673 1513
-> 16 0 23 540 G 674 1513
-> 15 0 24 540 G 674 1514
-> 16 0 24 540 G 758 1514
-> 15 0 23 540 G 625 1515
-> 16 0 23 540 G 626 1515
-> 15 0 24 540 G 626 1516
-> 16 0 24 540 G 758 1516
-> 15 0 23 540 G 709 1517
-> 16 0 23 540 G 710 1517
-> 15 0 24 540 G 710 1518
-> 16 0 24 540 G 758 1518
-> 15 0 23 540 G 745 1519
-> 16 0 23 540 G 746 1519
-> 15 0 24 540 G 746 1520
-> 16 0 24 540 G 758 1520
-> 15 0 23 540 G 547 1521
-> 16 0 23 540 G 548 1521
-> 15 0 24 540 G 548 1522
-> 16 0 24 540 G 758 1522
-> 15 0 23 760 G 788 1523
-> 16 0 23 760 G 789 1523
-> 15 0 24 760 G 789 1524
-> 16 0 24 760 G 864 1524
-> 15 0 24 760 G 864 1525
-> 16 0 24 760 G 850 1525
-> 15 0 25 760 G 850 1526
-> 16 0 25 760 G 848 1526
-> 15 0 24 760 G 864 1527
-> 16 0 24 760 G 826 1527
-> 15 0 25 760 G 826 1528
-> 16 0 25 760 G 824 1528
-> 15 0 24 760 G 864 1529
-> 16 0 24 760 G 802 1529
-> 15 0 25 760 G 802 1530
-> 16 0 25 760 G 800 1530
-> 15 0 24 760 G 864 1531
-> 16 0 24 760 G 862 1531
-> 15 0 25 760 G 862 1532
-> 16 0 25 760 G 860 1532
-> 15 0 24 760 G 864 1533
-> 16 0 24 760 G 838 1533
-> 15 0 25 760 G 838 1534
-> 16 0 25 760 G 836 1534
-> 15 0 24 760 G 864 1535
-> 16 0 24 760 G 814 1535
-> 15 0 25 760 G 814 1536
-> 16 0 25 760 G 812 1536
-> 15 0 26 760 G 864 1537
-> 16 0 26 760 G 863 1537
-> 15 0 24 760 G 864 1538
-> 16 0 24 760 G 766 1538
-> 15 0 25 760 G 766 1539
-> 16 0 25 760 G 764 1539
-> 15 0 24 760 G 864 1540
-> 16 0 24 760 G 778 1540
-> 15 0 25 760 G 778 1541
-> 16 0 25 760 G 776 1541
-> 15 0 24 760 G 864 1542
-> 16 0 24 760 G 793 1542
-> 15 0 25 760 G 793 1543
-> 16 0 25 760 G 791 1543
-> 15 0 24 760 G 864 1544
-> 16 0 24 760 G 853 1544
-> 15 0 25 760 G 853 1545
-> 16 0 25 760 G 851 1545
-> 15 0 24 760 G 864 1546
-> 16 0 24 760 G 829 1546
-> 15 0 25 760 G 829 1547
-> 16 0 25 760 G 827 1547
-> 15 0 24 760 G 864 1548
-> 16 0 24 760 G 805 1548
-> 15 0 25 760 G 805 1549
-> 16 0 25 760 G 803 1549
-> 15 0 24 760 G 864 1550
-> 16 0 24 760 G 841 1550
-> 15 0 25 760 G 841 1551
-> 16 0 25 760 G 839 1551
-> 15 0 24 760 G 864 1552
-> 16 0 24 760 G 817 1552
-> 15 0 25 760 G 817 1553
-> 16 0 25 760 G 815 1553
-> 15 0 24 760 G 864 1554
-> 16 0 24 760 G 769 1554
-> 15 0 25 760 G 769 1555
-> 16 0 25 760 G 767 1555
-> 15 0 24 760 G 864 1556
-> 16 0 24 760 G 781 1556
-> 15 0 25 760 G 781 1557
-> 16 0 25 760 G 779 1557
-> 15 0 24 760 G 864 1558
-> 16 0 24 760 G 820 1558
-> 15 0 25 760 G 820 1559
-> 16 0 25 760 G 818 1559
-> 15 0 24 760 G 864 1560
-> 16 0 24 760 G 796 1560
-> 15 0 25 760 G 796 1561
-> 16 0 25 760 G 794 1561
-> 15 0 24 760 G 864 1562
-> 16 0 24 760 G 856 1562
-> 15 0 25 760 G 856 1563
-> 16 0 25 760 G 854 1563
-> 15 0 24 760 G 864 1564
-> 16 0 24 760 G 832 1564
-> 15 0 25 760 G 832 1565
-> 16 0 25 760 G 830 1565
-> 15 0 24 760 G 864 1566
-> 16 0 24 760 G 808 1566
-> 15 0 25 760 G 808 1567
-> 16 0 25 760 G 806 1567
-> 15 0 24 760 G 864 1568
-> 16 0 24 760 G 844 1568
-> 15 0 25 760 G 844 1569
-> 16 0 25 760 G 842 1569
-> 15 0 24 760 G 864 1570
-> 16 0 24 760 G 772 1570
-> 15 0 25 760 G 772 1571
-> 16 0 25 760 G 770 1571
-> 15 0 24 760 G 864 1572
-> 16 0 24 760 G 784 1572
-> 15 0 25 760 G 784 1573
-> 16 0 25 760 G 782 1573
-> 15 0 24 760 G 864 1574
-> 16 0 24 760 G 823 1574
-> 15 0 25 760 G 823 1575
-> 16 0 25 760 G 821 1575
-> 15 0 24 760 G 864 1576
-> 16 0 24 760 G 799 1576
-> 15 0 25 760 G 799 1577
-> 16 0 25 760 G 797 1577
-> 15 0 24 760 G 864 1578
-> 16 0 24 760 G 859 1578
-> 15 0 25 760 G 859 1579
-> 16 0 25 760 G 857 1579
-> 15 0 24 760 G 864 1580
-> 16 0 24 760 G 835 1580
-> 15 0 25 760 G 835 1581
-> 16 0 25 760 G 833 1581
-> 15 0 24 760 G 864 1582
-> 16 0 24 760 G 811 1582
-> 15 0 25 760 G 811 1583
-> 16 0 25 760 G 809 1583
-> 15 0 24 760 G 864 1584
-> 16 0 24 760 G 847 1584
-> 15 0 25 760 G 847 1585
-> 16 0 25 760 G 845 1585
-> 15 0 24 760 G 864 1586
-> 16 0 24 760 G 763 1586
-> 15 0 25 760 G 763 1587
-> 16 0 25 760 G 761 1587
-> 15 0 24 760 G 864 1588
-> 16 0 24 760 G 775 1588
-> 15 0 25 760 G 775 1589
-> 16 0 25 760 G 773 1589
-> 15 0 24 760 G 864 1590
-> 16 0 24 760 G 787 1590
-> 15 0 25 760 G 787 1591
-> 16 0 25 760 G 785 1591
-> 15 0 23 760 G 848 1592
-> 16 0 23 760 G 849 1592
-> 15 0 24 760 G 849 1593
-> 16 0 24 760 G 864 1593
-> 15 0 24 760 G 864 1594
-> 16 0 24 760 G 790 1594
-> 15 0 25 760 G 790 1595
-> 16 0 25 760 G 788 1595
-> 15 0 23 760 G 824 1596
-> 16 0 23 760 G 825 1596
-> 15 0 24 760 G 825 1597
-> 16 0 24 760 G 864 1597
-> 15 0 23 760 G 800 1598
-> 16 0 23 760 G 801 1598
-> 15 0 24 760 G 801 1599
-> 16 0 24 760 G 864 1599
-> 15 0 23 760 G 860 1600
-> 16 0 23 760 G 861 1600
-> 15 0 24 760 G 861 1601
-> 16 0 24 760 G 864 1601
-> 15 0 23 760 G 836 1602
-> 16 0 23 760 G 837 1602
-> 15 0 24 760 G 837 1603
-> 16 0 24 760 G 864 1603
-> 15 0 23 760 G 812 1604
-> 16 0 23 760 G 813 1604
-> 15 0 24 760 G 813 1605
-> 16 0 24 760 G 864 1605
-> 15 0 23 760 G 764 1606
-> 16 0 23 760 G 765 1606
-> 15 0 24 760 G 765 1607
-> 16 0 24 760 G 864 1607
-> 15 0 23 760 G 776 1608
-> 16 0 23 760 G 777 1608
-> 15 0 24 760 G 777 1609
-> 16 0 24 760 G 864 1609
-> 15 0 23 760 G 791 1610
-> 16 0 23 760 G 792 1610
-> 15 0 24 760 G 792 1611
-> 16 0 24 760 G 864 1611
-> 15 0 23 760 G 851 1612
-> 16 0 23 760 G 852 1612
-> 15 0 24 760 G 852 1613
-> 16 0 24 760 G 864 1613
-> 15 0 23 760 G 827 1614
-> 16 0 23 760 G 828 1614
-> 15 0 24 760 G 828 1615
-> 16 0 24 760 G 864 1615
-> 15 0 23 760 G 803 1616
-> 16 0 23 760 G 804 1616
-> 15 0 24 760 G 804 1617
-> 16 0 24 760 G 864 1617
-> 15 0 23 760 G 839 1618
-> 16 0 23 760 G 840 1618
-> 15 0 24 760 G 840 1619
-> 16 0 24 760 G 864 1619
-> 15 0 23 760 G 815 1620
-> 16 0 23 760 G 816 1620
-> 15 0 24 760 G 816 1621
-> 16 0 24 760 G 864 1621
-> 15 0 23 760 G 767 1622
-> 16 0 23 760 G 768 1622
-> 15 0 24 760 G 768 1623
-> 16 0 24 760 G 864 1623
-> 15 0 23 760 G 779 1624
-> 16 0 23 760 G 780 1624
-> 15 0 24 760 G 780 1625
-> 16 0 24 760 G 864 1625
-> 15 0 23 760 G 818 1626
-> 16 0 23 760 G 819 1626
-> 15 0 24 760 G 819 1627
-> 16 0 24 760 G 864 1627
-> 15 0 23 760 G 794 1628
-> 16 0 23 760 G 795 1628
-> 15 0 24 760 G 795 1629
-> 16 0 24 760 G 864 1629
-> 15 0 23 760 G 854 1630
-> 16 0 23 760 G 855 1630
-> 15 0 24 760 G 855 1631
-> 16 0 24 760 G 864 1631
-> 15 0 23 760 G 830 1632
-> 16 0 23 760 G 831 1632
-> 15 0 24 760 G 831 1633
-> 16 0 24 760 G 864 1633
-> 15 0 23 760 G 806 1634
-> 16 0 23 760 G 807 1634
-> 15 0 24 760 G 807 1635
-> 16 0 24 760 G 864 1635
-> 15 0 23 760 G 842 1636
-> 16 0 23 760 G 843 1636
-> 15 0 24 760 G 843 1637
-> 16 0 24 760 G 864 1637
-> 15 0 23 760 G 770 1638
-> 16 0 23 760 G 771 1638
-> 15 0 24 760 G 771 1639
-> 16 0 24 760 G 864 1639
-> 15 0 23 760 G 782 1640
-> 16 0 23 760 G 783 1640
-> 15 0 24 760 G 783 1641
-> 16 0 24 760 G 864 1641
-> 15 0 23 760 G 821 1642
-> 16 0 23 760 G 822 1642
-> 15 0 24 760 G 822 1643
-> 16 0 24 760 G 864 1643
-> 15 0 23 760 G 797 1644
-> 16 0 23 760 G 798 1644
-> 15 0 24 760 G 798 1645
-> 16 0 24 760 G 864 1645
-> 15 0 23 760 G 857 1646
-> 16 0 23 760 G 858 1646
-> 15 0 24 760 G 858 1647
-> 16 0 24 760 G 864 1647
-> 15 0 23 760 G 833 1648
-> 16 0 23 760 G 834 1648
-> 15 0 24 760 G 834 1649
-> 16 0 24 760 G 864 1649
-> 15 0 23 760 G 809 1650
-> 16 0 23 760 G 810 1650
-> 15 0 24 760 G 810 1651
-> 16 0 24 760 G 864 1651
-> 15 0 23 760 G 845 1652
-> 16 0 23 760 G 846 1652
-> 15 0 24 760 G 846 1653
-> 16 0 24 760 G 864 1653
-> 15 0 23 760 G 761 1654
-> 16 0 23 760 G 762 1654
-> 15 0 24 760 G 762 1655
-> 16 0 24 760 G 864 1655
-> 15 0 23 760 G 773 1656
-> 16 0 23 760 G 774 1656
-> 15 0 24 760 G 774 1657
-> 16 0 24 760 G 864 1657
-> 15 0 23 760 G 785 1658
-> 16 0 23 760 G 786 1658
-> 15 0 24 760 G 786 1659
-> 16 0 24 760 G 864 1659
-> 15 0 23 500 G 519 1660
-> 16 0 23 500 G 520 1660
-> 15 0 24 500 G 520 1661
-> 16 0 24 500 G 538 1661
-> 15 0 24 500 G 538 1662
-> 16 0 24 500 G 530 1662
-> 15 0 25 500 G 530 1663
-> 16 0 25 500 G 528 1663
-> 15 0 26 500 G 538 1664
-> 16 0 26 500 G 537 1664
-> 15 0 24 500 G 538 1665
-> 16 0 24 500 G 512 1665
-> 15 0 25 500 G 512 1666
-> 16 0 25 500 G 510 1666
-> 15 0 24 500 G 538 1667
-> 16 0 24 500 G 524 1667
-> 15 0 25 500 G 524 1668
-> 16 0 25 500 G 522 1668
-> 15 0 24 500 G 538 1669
-> 16 0 24 500 G 533 1669
-> 15 0 25 500 G 533 1670
-> 16 0 25 500 G 531 1670
-> 15 0 24 500 G 538 1671
-> 16 0 24 500 G 503 1671
-> 15 0 25 500 G 503 1672
-> 16 0 25 500 G 501 1672
-> 15 0 24 500 G 538 1673
-> 16 0 24 500 G 515 1673
-> 15 0 25 500 G 515 1674
-> 16 0 25 500 G 513 1674
-> 15 0 24 500 G 538 1675
-> 16 0 24 500 G 527 1675
-> 15 0 25 500 G 527 1676
-> 16 0 25 500 G 525 1676
-> 15 0 24 500 G 538 1677
-> 16 0 24 500 G 536 1677
-> 15 0 25 500 G 536 1678
-> 16 0 25 500 G 534 1678
-> 15 0 24 500 G 538 1679
-> 16 0 24 500 G 506 1679
-> 15 0 25 500 G 506 1680
-> 16 0 25 500 G 504 1680
-> 15 0 24 500 G 538 1681
-> 16 0 24 500 G 518 1681
-> 15 0 25 500 G 518 1682
-> 16 0 25 500 G 516 1682
-> 15 0 24 500 G 538 1683
-> 16 0 24 500 G 509 1683
-> 15 0 25 500 G 509 1684
-> 16 0 25 500 G 507 1684
-> 15 0 23 500 G 528 1685
-> 16 0 23 500 G 529 1685
-> 15 0 24 500 G 529 1686
-> 16 0 24 500 G 538 1686
-> 15 0 24 500 G 538 1687
-> 16 0 24 500 G 521 1687
-> 15 0 25 500 G 521 1688
-> 16 0 25 500 G 519 1688
-> 15 0 23 500 G 510 1689
-> 16 0 23 500 G 511 1689
-> 15 0 24 500 G 511 1690
-> 16 0 24 500 G 538 1690
-> 15 0 23 500 G 522 1691
-> 16 0 23 500 G 523 1691
-> 15 0 24 500 G 523 1692
-> 16 0 24 500 G 538 1692
-> 15 0 23 500 G 531 1693
-> 16 0 23 500 G 532 1693
-> 15 0 24 500 G 532 1694
-> 16 0 24 500 G 538 1694
-> 15 0 23 500 G 501 1695
-> 16 0 23 500 G 502 1695
-> 15 0 24 500 G 502 1696
-> 16 0 24 500 G 538 1696
-> 15 0 23 500 G 513 1697
-> 16 0 23 500 G 514 1697
-> 15 0 24 500 G 514 1698
-> 16 0 24 500 G 538 1698
-> 15 0 23 500 G 525 1699
-> 16 0 23 500 G 526 1699
-> 15 0 24 500 G 526 1700
-> 16 0 24 500 G 538 1700
-> 15 0 23 500 G 534 1701
-> 16 0 23 500 G 535 1701
-> 15 0 24 500 G 535 1702
-> 16 0 24 500 G 538 1702
-> 15 0 23 500 G 504 1703
-> 16 0 23 500 G 505 1703
-> 15 0 24 500 G 505 1704
-> 16 0 24 500 G 538 1704
-> 15 0 23 500 G 516 1705
-> 16 0 23 500 G 517 1705
-> 15 0 24 500 G 517 1706
-> 16 0 24 500 G 538 1706
-> 15 0 23 500 G 507 1707
-> 16 0 23 500 G 508 1707
-> 15 0 24 500 G 508 1708
-> 16 0 24 500 G 538 1708
-> 15 0 27 499 G 757 1709
-> 16 0 27 499 G 759 1709
-> 15 0 28 499 G 759 1710
-> 16 0 28 499 G 867 1710
-> 15 0 21 499 G 759 1711
-> 16 0 21 499 G 865 1711
-> 15 0 28 499 G 865 1712
-> 16 0 28 499 G 863 1712
-> 15 0 21 499 G 759 1713
-> 16 0 21 499 G 539 1713
-> 15 0 28 499 G 539 1714
-> 16 0 28 499 G 537 1714
-> 15 0 27 499 G 867 1715
-> 16 0 27 499 G 865 1715
-> 15 0 27 499 G 867 1716
-> 16 0 27 499 G 539 1716
-> 15 0 21 499 G 865 1717
-> 16 0 21 499 G 539 1717
-> 15 0 23 3318 G 3373 1718
-> 16 0 23 3318 G 3374 1718
-> 15 0 24 3318 G 3374 1719
-> 16 0 24 3318 G 3410 1719
-> 15 0 24 3318 G 3410 1720
-> 16 0 24 3318 G 3378 1720
-> 15 0 25 3318 G 3378 1721
-> 16 0 25 3318 G 3376 1721
-> 15 0 24 3318 G 3410 1722
-> 16 0 24 3318 G 3384 1722
-> 15 0 25 3318 G 3384 1723
-> 16 0 25 3318 G 3382 1723
-> 15 0 24 3318 G 3410 1724
-> 16 0 24 3318 G 3390 1724
-> 15 0 25 3318 G 3390 1725
-> 16 0 25 3318 G 3388 1725
-> 15 0 24 3318 G 3410 1726
-> 16 0 24 3318 G 3396 1726
-> 15 0 25 3318 G 3396 1727
-> 16 0 25 3318 G 3394 1727
-> 15 0 24 3318 G 3410 1728
-> 16 0 24 3318 G 3402 1728
-> 15 0 25 3318 G 3402 1729
-> 16 0 25 3318 G 3400 1729
-> 15 0 24 3318 G 3410 1730
-> 16 0 24 3318 G 3324 1730
-> 15 0 25 3318 G 3324 1731
-> 16 0 25 3318 G 3322 1731
-> 15 0 24 3318 G 3410 1732
-> 16 0 24 3318 G 3330 1732
-> 15 0 25 3318 G 3330 1733
-> 16 0 25 3318 G 3328 1733
-> 15 0 24 3318 G 3410 1734
-> 16 0 24 3318 G 3336 1734
-> 15 0 25 3318 G 3336 1735
-> 16 0 25 3318 G 3334 1735
-> 15 0 24 3318 G 3410 1736
-> 16 0 24 3318 G 3342 1736
-> 15 0 25 3318 G 3342 1737
-> 16 0 25 3318 G 3340 1737
-> 15 0 24 3318 G 3410 1738
-> 16 0 24 3318 G 3348 1738
-> 15 0 25 3318 G 3348 1739
-> 16 0 25 3318 G 3346 1739
-> 15 0 24 3318 G 3410 1740
-> 16 0 24 3318 G 3354 1740
-> 15 0 25 3318 G 3354 1741
-> 16 0 25 3318 G 3352 1741
-> 15 0 24 3318 G 3410 1742
-> 16 0 24 3318 G 3360 1742
-> 15 0 25 3318 G 3360 1743
-> 16 0 25 3318 G 3358 1743
-> 15 0 24 3318 G 3410 1744
-> 16 0 24 3318 G 3366 1744
-> 15 0 25 3318 G 3366 1745
-> 16 0 25 3318 G 3364 1745
-> 15 0 24 3318 G 3410 1746
-> 16 0 24 3318 G 3372 1746
-> 15 0 25 3318 G 3372 1747
-> 16 0 25 3318 G 3370 1747
-> 15 0 24 3318 G 3410 1748
-> 16 0 24 3318 G 3381 1748
-> 15 0 25 3318 G 3381 1749
-> 16 0 25 3318 G 3379 1749
-> 15 0 24 3318 G 3410 1750
-> 16 0 24 3318 G 3387 1750
-> 15 0 25 3318 G 3387 1751
-> 16 0 25 3318 G 3385 1751
-> 15 0 24 3318 G 3410 1752
-> 16 0 24 3318 G 3393 1752
-> 15 0 25 3318 G 3393 1753
-> 16 0 25 3318 G 3391 1753
-> 15 0 24 3318 G 3410 1754
-> 16 0 24 3318 G 3399 1754
-> 15 0 25 3318 G 3399 1755
-> 16 0 25 3318 G 3397 1755
-> 15 0 24 3318 G 3410 1756
-> 16 0 24 3318 G 3405 1756
-> 15 0 25 3318 G 3405 1757
-> 16 0 25 3318 G 3403 1757
-> 15 0 24 3318 G 3410 1758
-> 16 0 24 3318 G 3321 1758
-> 15 0 25 3318 G 3321 1759
-> 16 0 25 3318 G 3319 1759
-> 15 0 24 3318 G 3410 1760
-> 16 0 24 3318 G 3327 1760
-> 15 0 25 3318 G 3327 1761
-> 16 0 25 3318 G 3325 1761
-> 15 0 24 3318 G 3410 1762
-> 16 0 24 3318 G 3333 1762
-> 15 0 25 3318 G 3333 1763
-> 16 0 25 3318 G 3331 1763
-> 15 0 24 3318 G 3410 1764
-> 16 0 24 3318 G 3339 1764
-> 15 0 25 3318 G 3339 1765
-> 16 0 25 3318 G 3337 1765
-> 15 0 24 3318 G 3410 1766
-> 16 0 24 3318 G 3345 1766
-> 15 0 25 3318 G 3345 1767
-> 16 0 25 3318 G 3343 1767
-> 15 0 26 3318 G 3410 1768
-> 16 0 26 3318 G 3409 1768
-> 15 0 24 3318 G 3410 1769
-> 16 0 24 3318 G 3351 1769
-> 15 0 25 3318 G 3351 1770
-> 16 0 25 3318 G 3349 1770
-> 15 0 24 3318 G 3410 1771
-> 16 0 24 3318 G 3408 1771
-> 15 0 25 3318 G 3408 1772
-> 16 0 25 3318 G 3406 1772
-> 15 0 24 3318 G 3410 1773
-> 16 0 24 3318 G 3357 1773
-> 15 0 25 3318 G 3357 1774
-> 16 0 25 3318 G 3355 1774
-> 15 0 24 3318 G 3410 1775
-> 16 0 24 3318 G 3363 1775
-> 15 0 25 3318 G 3363 1776
-> 16 0 25 3318 G 3361 1776
-> 15 0 24 3318 G 3410 1777
-> 16 0 24 3318 G 3369 1777
-> 15 0 25 3318 G 3369 1778
-> 16 0 25 3318 G 3367 1778
-> 15 0 23 3318 G 3376 1779
-> 16 0 23 3318 G 3377 1779
-> 15 0 24 3318 G 3377 1780
-> 16 0 24 3318 G 3410 1780
-> 15 0 24 3318 G 3410 1781
-> 16 0 24 3318 G 3375 1781
-> 15 0 25 3318 G 3375 1782
-> 16 0 25 3318 G 3373 1782
-> 15 0 23 3318 G 3382 1783
-> 16 0 23 3318 G 3383 1783
-> 15 0 24 3318 G 3383 1784
-> 16 0 24 3318 G 3410 1784
-> 15 0 23 3318 G 3388 1785
-> 16 0 23 3318 G 3389 1785
-> 15 0 24 3318 G 3389 1786
-> 16 0 24 3318 G 3410 1786
-> 15 0 23 3318 G 3394 1787
-> 16 0 23 3318 G 3395 1787
-> 15 0 24 3318 G 3395 1788
-> 16 0 24 3318 G 3410 1788
-> 15 0 23 3318 G 3400 1789
-> 16 0 23 3318 G 3401 1789
-> 15 0 24 3318 G 3401 1790
-> 16 0 24 3318 G 3410 1790
-> 15 0 23 3318 G 3322 1791
-> 16 0 23 3318 G 3323 1791
-> 15 0 24 3318 G 3323 1792
-> 16 0 24 3318 G 3410 1792
-> 15 0 23 3318 G 3328 1793
-> 16 0 23 3318 G 3329 1793
-> 15 0 24 3318 G 3329 1794
-> 16 0 24 3318 G 3410 1794
-> 15 0 23 3318 G 3334 1795
-> 16 0 23 3318 G 3335 1795
-> 15 0 24 3318 G 3335 1796
-> 16 0 24 3318 G 3410 1796
-> 15 0 23 3318 G 3340 1797
-> 16 0 23 3318 G 3341 1797
-> 15 0 24 3318 G 3341 1798
-> 16 0 24 3318 G 3410 1798
-> 15 0 23 3318 G 3346 1799
-> 16 0 23 3318 G 3347 1799
-> 15 0 24 3318 G 3347 1800
-> 16 0 24 3318 G 3410 1800
-> 15 0 23 3318 G 3352 1801
-> 16 0 23 3318 G 3353 1801
-> 15 0 24 3318 G 3353 1802
-> 16 0 24 3318 G 3410 1802
-> 15 0 23 3318 G 3358 1803
-> 16 0 23 3318 G 3359 1803
-> 15 0 24 3318 G 3359 1804
-> 16 0 24 3318 G 3410 1804
-> 15 0 23 3318 G 3364 1805
-> 16 0 23 3318 G 3365 1805
-> 15 0 24 3318 G 3365 1806
-> 16 0 24 3318 G 3410 1806
-> 15 0 23 3318 G 3370 1807
-> 16 0 23 3318 G 3371 1807
-> 15 0 24 3318 G 3371 1808
-> 16 0 24 3318 G 3410 1808
-> 15 0 23 3318 G 3379 1809
-> 16 0 23 3318 G 3380 1809
-> 15 0 24 3318 G 3380 1810
-> 16 0 24 3318 G 3410 1810
-> 15 0 23 3318 G 3385 1811
-> 16 0 23 3318 G 3386 1811
-> 15 0 24 3318 G 3386 1812
-> 16 0 24 3318 G 3410 1812
-> 15 0 23 3318 G 3391 1813
-> 16 0 23 3318 G 3392 1813
-> 15 0 24 3318 G 3392 1814
-> 16 0 24 3318 G 3410 1814
-> 15 0 23 3318 G 3397 1815
-> 16 0 23 3318 G 3398 1815
-> 15 0 24 3318 G 3398 1816
-> 16 0 24 3318 G 3410 1816
-> 15 0 23 3318 G 3403 1817
-> 16 0 23 3318 G 3404 1817
-> 15 0 24 3318 G 3404 1818
-> 16 0 24 3318 G 3410 1818
-> 15 0 23 3318 G 3319 1819
-> 16 0 23 3318 G 3320 1819
-> 15 0 24 3318 G 3320 1820
-> 16 0 24 3318 G 3410 1820
-> 15 0 23 3318 G 3325 1821
-> 16 0 23 3318 G 3326 1821
-> 15 0 24 3318 G 3326 1822
-> 16 0 24 3318 G 3410 1822
-> 15 0 23 3318 G 3331 1823
-> 16 0 23 3318 G 3332 1823
-> 15 0 24 3318 G 3332 1824
-> 16 0 24 3318 G 3410 1824
-> 15 0 23 3318 G 3337 1825
-> 16 0 23 3318 G 3338 1825
-> 15 0 24 3318 G 3338 1826
-> 16 0 24 3318 G 3410 1826
-> 15 0 23 3318 G 3343 1827
-> 16 0 23 3318 G 3344 1827
-> 15 0 24 3318 G 3344 1828
-> 16 0 24 3318 G 3410 1828
-> 15 0 23 3318 G 3349 1829
-> 16 0 23 3318 G 3350 1829
-> 15 0 24 3318 G 3350 1830
-> 16 0 24 3318 G 3410 1830
-> 15 0 23 3318 G 3406 1831
-> 16 0 23 3318 G 3407 1831
-> 15 0 24 3318 G 3407 1832
-> 16 0 24 3318 G 3410 1832
-> 15 0 23 3318 G 3355 1833
-> 16 0 23 3318 G 3356 1833
-> 15 0 24 3318 G 3356 1834
-> 16 0 24 3318 G 3410 1834
-> 15 0 23 3318 G 3361 1835
-> 16 0 23 3318 G 3362 1835
-> 15 0 24 3318 G 3362 1836
-> 16 0 24 3318 G 3410 1836
-> 15 0 23 3318 G 3367 1837
-> 16 0 23 3318 G 3368 1837
-> 15 0 24 3318 G 3368 1838
-> 16 0 24 3318 G 3410 1838
-> 15 0 29 3092 G 3144 1839
-> 16 0 29 3092 G 3145 1839
-> 15 0 30 3092 G 3145 1840
-> 16 0 30 3092 G 3202 1840
-> 15 0 30 3092 G 3202 1841
-> 16 0 30 3092 G 3095 1841
-> 15 0 31 3092 G 3095 1842
-> 16 0 31 3092 G 3093 1842
-> 15 0 30 3092 G 3202 1843
-> 16 0 30 3092 G 3152 1843
-> 15 0 31 3092 G 3152 1844
-> 16 0 31 3092 G 3150 1844
-> 15 0 30 3092 G 3202 1845
-> 16 0 30 3092 G 3101 1845
-> 15 0 31 3092 G 3101 1846
-> 16 0 31 3092 G 3099 1846
-> 15 0 30 3092 G 3202 1847
-> 16 0 30 3092 G 3158 1847
-> 15 0 31 3092 G 3158 1848
-> 16 0 31 3092 G 3156 1848
-> 15 0 30 3092 G 3202 1849
-> 16 0 30 3092 G 3107 1849
-> 15 0 31 3092 G 3107 1850
-> 16 0 31 3092 G 3105 1850
-> 15 0 30 3092 G 3202 1851
-> 16 0 30 3092 G 3164 1851
-> 15 0 31 3092 G 3164 1852
-> 16 0 31 3092 G 3162 1852
-> 15 0 30 3092 G 3202 1853
-> 16 0 30 3092 G 3113 1853
-> 15 0 31 3092 G 3113 1854
-> 16 0 31 3092 G 3111 1854
-> 15 0 30 3092 G 3202 1855
-> 16 0 30 3092 G 3170 1855
-> 15 0 31 3092 G 3170 1856
-> 16 0 31 3092 G 3168 1856
-> 15 0 30 3092 G 3202 1857
-> 16 0 30 3092 G 3116 1857
-> 15 0 31 3092 G 3116 1858
-> 16 0 31 3092 G 3114 1858
-> 15 0 30 3092 G 3202 1859
-> 16 0 30 3092 G 3122 1859
-> 15 0 31 3092 G 3122 1860
-> 16 0 31 3092 G 3120 1860
-> 15 0 30 3092 G 3202 1861
-> 16 0 30 3092 G 3179 1861
-> 15 0 31 3092 G 3179 1862
-> 16 0 31 3092 G 3177 1862
-> 15 0 30 3092 G 3202 1863
-> 16 0 30 3092 G 3128 1863
-> 15 0 31 3092 G 3128 1864
-> 16 0 31 3092 G 3126 1864
-> 15 0 30 3092 G 3202 1865
-> 16 0 30 3092 G 3185 1865
-> 15 0 31 3092 G 3185 1866
-> 16 0 31 3092 G 3183 1866
-> 15 0 30 3092 G 3202 1867
-> 16 0 30 3092 G 3134 1867
-> 15 0 31 3092 G 3134 1868
-> 16 0 31 3092 G 3132 1868
-> 15 0 30 3092 G 3202 1869
-> 16 0 30 3092 G 3191 1869
-> 15 0 31 3092 G 3191 1870
-> 16 0 31 3092 G 3189 1870
-> 15 0 30 3092 G 3202 1871
-> 16 0 30 3092 G 3140 1871
-> 15 0 31 3092 G 3140 1872
-> 16 0 31 3092 G 3138 1872
-> 15 0 30 3092 G 3202 1873
-> 16 0 30 3092 G 3197 1873
-> 15 0 31 3092 G 3197 1874
-> 16 0 31 3092 G 3195 1874
-> 15 0 30 3092 G 3202 1875
-> 16 0 30 3092 G 3149 1875
-> 15 0 31 3092 G 3149 1876
-> 16 0 31 3092 G 3147 1876
-> 15 0 30 3092 G 3202 1877
-> 16 0 30 3092 G 3098 1877
-> 15 0 31 3092 G 3098 1878
-> 16 0 31 3092 G 3096 1878
-> 15 0 30 3092 G 3202 1879
-> 16 0 30 3092 G 3155 1879
-> 15 0 31 3092 G 3155 1880
-> 16 0 31 3092 G 3153 1880
-> 15 0 32 3092 G 3202 1881
-> 16 0 32 3092 G 3201 1881
-> 15 0 30 3092 G 3202 1882
-> 16 0 30 3092 G 3104 1882
-> 15 0 31 3092 G 3104 1883
-> 16 0 31 3092 G 3102 1883
-> 15 0 30 3092 G 3202 1884
-> 16 0 30 3092 G 3161 1884
-> 15 0 31 3092 G 3161 1885
-> 16 0 31 3092 G 3159 1885
-> 15 0 30 3092 G 3202 1886
-> 16 0 30 3092 G 3110 1886
-> 15 0 31 3092 G 3110 1887
-> 16 0 31 3092 G 3108 1887
-> 15 0 30 3092 G 3202 1888
-> 16 0 30 3092 G 3167 1888
-> 15 0 31 3092 G 3167 1889
-> 16 0 31 3092 G 3165 1889
-> 15 0 30 3092 G 3202 1890
-> 16 0 30 3092 G 3173 1890
-> 15 0 31 3092 G 3173 1891
-> 16 0 31 3092 G 3171 1891
-> 15 0 30 3092 G 3202 1892
-> 16 0 30 3092 G 3119 1892
-> 15 0 31 3092 G 3119 1893
-> 16 0 31 3092 G 3117 1893
-> 15 0 30 3092 G 3202 1894
-> 16 0 30 3092 G 3176 1894
-> 15 0 31 3092 G 3176 1895
-> 16 0 31 3092 G 3174 1895
-> 15 0 30 3092 G 3202 1896
-> 16 0 30 3092 G 3125 1896
-> 15 0 31 3092 G 3125 1897
-> 16 0 31 3092 G 3123 1897
-> 15 0 30 3092 G 3202 1898
-> 16 0 30 3092 G 3182 1898
-> 15 0 31 3092 G 3182 1899
-> 16 0 31 3092 G 3180 1899
-> 15 0 30 3092 G 3202 1900
-> 16 0 30 3092 G 3131 1900
-> 15 0 31 3092 G 3131 1901
-> 16 0 31 3092 G 3129 1901
-> 15 0 30 3092 G 3202 1902
-> 16 0 30 3092 G 3188 1902
-> 15 0 31 3092 G 3188 1903
-> 16 0 31 3092 G 3186 1903
-> 15 0 30 3092 G 3202 1904
-> 16 0 30 3092 G 3137 1904
-> 15 0 31 3092 G 3137 1905
-> 16 0 31 3092 G 3135 1905
-> 15 0 30 3092 G 3202 1906
-> 16 0 30 3092 G 3194 1906
-> 15 0 31 3092 G 3194 1907
-> 16 0 31 3092 G 3192 1907
-> 15 0 30 3092 G 3202 1908
-> 16 0 30 3092 G 3143 1908
-> 15 0 31 3092 G 3143 1909
-> 16 0 31 3092 G 3141 1909
-> 15 0 30 3092 G 3202 1910
-> 16 0 30 3092 G 3200 1910
-> 15 0 31 3092 G 3200 1911
-> 16 0 31 3092 G 3198 1911
-> 15 0 29 3092 G 3093 1912
-> 16 0 29 3092 G 3094 1912
-> 15 0 30 3092 G 3094 1913
-> 16 0 30 3092 G 3202 1913
-> 15 0 30 3092 G 3202 1914
-> 16 0 30 3092 G 3146 1914
-> 15 0 31 3092 G 3146 1915
-> 16 0 31 3092 G 3144 1915
-> 15 0 29 3092 G 3150 1916
-> 16 0 29 3092 G 3151 1916
-> 15 0 30 3092 G 3151 1917
-> 16 0 30 3092 G 3202 1917
-> 15 0 29 3092 G 3099 1918
-> 16 0 29 3092 G 3100 1918
-> 15 0 30 3092 G 3100 1919
-> 16 0 30 3092 G 3202 1919
-> 15 0 29 3092 G 3156 1920
-> 16 0 29 3092 G 3157 1920
-> 15 0 30 3092 G 3157 1921
-> 16 0 30 3092 G 3202 1921
-> 15 0 29 3092 G 3105 1922
-> 16 0 29 3092 G 3106 1922
-> 15 0 30 3092 G 3106 1923
-> 16 0 30 3092 G 3202 1923
-> 15 0 29 3092 G 3162 1924
-> 16 0 29 3092 G 3163 1924
-> 15 0 30 3092 G 3163 1925
-> 16 0 30 3092 G 3202 1925
-> 15 0 29 3092 G 3111 1926
-> 16 0 29 3092 G 3112 1926
-> 15 0 30 3092 G 3112 1927
-> 16 0 30 3092 G 3202 1927
-> 15 0 29 3092 G 3168 1928
-> 16 0 29 3092 G 3169 1928
-> 15 0 30 3092 G 3169 1929
-> 16 0 30 3092 G 3202 1929
-> 15 0 29 3092 G 3114 1930
-> 16 0 29 3092 G 3115 1930
-> 15 0 30 3092 G 3115 1931
-> 16 0 30 3092 G 3202 1931
-> 15 0 29 3092 G 3120 1932
-> 16 0 29 3092 G 3121 1932
-> 15 0 30 3092 G 3121 1933
-> 16 0 30 3092 G 3202 1933
-> 15 0 29 3092 G 3177 1934
-> 16 0 29 3092 G 3178 1934
-> 15 0 30 3092 G 3178 1935
-> 16 0 30 3092 G 3202 1935
-> 15 0 29 3092 G 3126 1936
-> 16 0 29 3092 G 3127 1936
-> 15 0 30 3092 G 3127 1937
-> 16 0 30 3092 G 3202 1937
-> 15 0 29 3092 G 3183 1938
-> 16 0 29 3092 G 3184 1938
-> 15 0 30 3092 G 3184 1939
-> 16 0 30 3092 G 3202 1939
-> 15 0 29 3092 G 3132 1940
-> 16 0 29 3092 G 3133 1940
-> 15 0 30 3092 G 3133 1941
-> 16 0 30 3092 G 3202 1941
-> 15 0 29 3092 G 3189 1942
-> 16 0 29 3092 G 3190 1942
-> 15 0 30 3092 G 3190 1943
-> 16 0 30 3092 G 3202 1943
-> 15 0 29 3092 G 3138 1944
-> 16 0 29 3092 G 3139 1944
-> 15 0 30 3092 G 3139 1945
-> 16 0 30 3092 G 3202 1945
-> 15 0 29 3092 G 3195 1946
-> 16 0 29 3092 G 3196 1946
-> 15 0 30 3092 G 3196 1947
-> 16 0 30 3092 G 3202 1947
-> 15 0 29 3092 G 3147 1948
-> 16 0 29 3092 G 3148 1948
-> 15 0 30 3092 G 3148 1949
-> 16 0 30 3092 G 3202 1949
-> 15 0 29 3092 G 3096 1950
-> 16 0 29 3092 G 3097 1950
-> 15 0 30 3092 G 3097 1951
-> 16 0 30 3092 G 3202 1951
-> 15 0 29 3092 G 3153 1952
-> 16 0 29 3092 G 3154 1952
-> 15 0 30 3092 G 3154 1953
-> 16 0 30 3092 G 3202 1953
-> 15 0 29 3092 G 3102 1954
-> 16 0 29 3092 G 3103 1954
-> 15 0 30 3092 G 3103 1955
-> 16 0 30 3092 G 3202 1955
-> 15 0 29 3092 G 3159 1956
-> 16 0 29 3092 G 3160 1956
-> 15 0 30 3092 G 3160 1957
-> 16 0 30 3092 G 3202 1957
-> 15 0 29 3092 G 3108 1958
-> 16 0 29 3092 G 3109 1958
-> 15 0 30 3092 G 3109 1959
-> 16 0 30 3092 G 3202 1959
-> 15 0 29 3092 G 3165 1960
-> 16 0 29 3092 G 3166 1960
-> 15 0 30 3092 G 3166 1961
-> 16 0 30 3092 G 3202 1961
-> 15 0 29 3092 G 3171 1962
-> 16 0 29 3092 G 3172 1962
-> 15 0 30 3092 G 3172 1963
-> 16 0 30 3092 G 3202 1963
-> 15 0 29 3092 G 3117 1964
-> 16 0 29 3092 G 3118 1964
-> 15 0 30 3092 G 3118 1965
-> 16 0 30 3092 G 3202 1965
-> 15 0 29 3092 G 3174 1966
-> 16 0 29 3092 G 3175 1966
-> 15 0 30 3092 G 3175 1967
-> 16 0 30 3092 G 3202 1967
-> 15 0 29 3092 G 3123 1968
-> 16 0 29 3092 G 3124 1968
-> 15 0 30 3092 G 3124 1969
-> 16 0 30 3092 G 3202 1969
-> 15 0 29 3092 G 3180 1970
-> 16 0 29 3092 G 3181 1970
-> 15 0 30 3092 G 3181 1971
-> 16 0 30 3092 G 3202 1971
-> 15 0 29 3092 G 3129 1972
-> 16 0 29 3092 G 3130 1972
-> 15 0 30 3092 G 3130 1973
-> 16 0 30 3092 G 3202 1973
-> 15 0 29 3092 G 3186 1974
-> 16 0 29 3092 G 3187 1974
-> 15 0 30 3092 G 3187 1975
-> 16 0 30 3092 G 3202 1975
-> 15 0 29 3092 G 3135 1976
-> 16 0 29 3092 G 3136 1976
-> 15 0 30 3092 G 3136 1977
-> 16 0 30 3092 G 3202 1977
-> 15 0 29 3092 G 3192 1978
-> 16 0 29 3092 G 3193 1978
-> 15 0 30 3092 G 3193 1979
-> 16 0 30 3092 G 3202 1979
-> 15 0 29 3092 G 3141 1980
-> 16 0 29 3092 G 3142 1980
-> 15 0 30 3092 G 3142 1981
-> 16 0 30 3092 G 3202 1981
-> 15 0 29 3092 G 3198 1982
-> 16 0 29 3092 G 3199 1982
-> 15 0 30 3092 G 3199 1983
-> 16 0 30 3092 G 3202 1983
-> 15 0 29 3272 G 3273 1984
-> 16 0 29 3272 G 3274 1984
-> 15 0 30 3272 G 3274 1985
-> 16 0 30 3272 G 3292 1985
-> 15 0 30 3272 G 3292 1986
-> 16 0 30 3272 G 3281 1986
-> 15 0 31 3272 G 3281 1987
-> 16 0 31 3272 G 3279 1987
-> 15 0 30 3272 G 3292 1988
-> 16 0 30 3272 G 3287 1988
-> 15 0 31 3272 G 3287 1989
-> 16 0 31 3272 G 3285 1989
-> 15 0 30 3272 G 3292 1990
-> 16 0 30 3272 G 3278 1990
-> 15 0 31 3272 G 3278 1991
-> 16 0 31 3272 G 3276 1991
-> 15 0 30 3272 G 3292 1992
-> 16 0 30 3272 G 3284 1992
-> 15 0 31 3272 G 3284 1993
-> 16 0 31 3272 G 3282 1993
-> 15 0 30 3272 G 3292 1994
-> 16 0 30 3272 G 3290 1994
-> 15 0 31 3272 G 3290 1995
-> 16 0 31 3272 G 3288 1995
-> 15 0 32 3272 G 3292 1996
-> 16 0 32 3272 G 3291 1996
-> 15 0 29 3272 G 3279 1997
-> 16 0 29 3272 G 3280 1997
-> 15 0 30 3272 G 3280 1998
-> 16 0 30 3272 G 3292 1998
-> 15 0 30 3272 G 3292 1999
-> 16 0 30 3272 G 3275 1999
-> 15 0 31 3272 G 3275 2000
-> 16 0 31 3272 G 3273 2000
-> 15 0 29 3272 G 3285 2001
-> 16 0 29 3272 G 3286 2001
-> 15 0 30 3272 G 3286 2002
-> 16 0 30 3272 G 3292 2002
-> 15 0 29 3272 G 3276 2003
-> 16 0 29 3272 G 3277 2003
-> 15 0 30 3272 G 3277 2004
-> 16 0 30 3272 G 3292 2004
-> 15 0 29 3272 G 3282 2005
-> 16 0 29 3272 G 3283 2005
-> 15 0 30 3272 G 3283 2006
-> 16 0 30 3272 G 3292 2006
-> 15 0 29 3272 G 3288 2007
-> 16 0 29 3272 G 3289 2007
-> 15 0 30 3272 G 3289 2008
-> 16 0 30 3272 G 3292 2008
-> 15 0 29 2351 G 2352 2009
-> 16 0 29 2351 G 2353 2009
-> 15 0 30 2351 G 2353 2010
-> 16 0 30 2351 G 2461 2010
-> 15 0 30 2351 G 2461 2011
-> 16 0 30 2351 G 2360 2011
-> 15 0 31 2351 G 2360 2012
-> 16 0 31 2351 G 2358 2012
-> 15 0 30 2351 G 2461 2013
-> 16 0 30 2351 G 2366 2013
-> 15 0 31 2351 G 2366 2014
-> 16 0 31 2351 G 2364 2014
-> 15 0 30 2351 G 2461 2015
-> 16 0 30 2351 G 2372 2015
-> 15 0 31 2351 G 2372 2016
-> 16 0 31 2351 G 2370 2016
-> 15 0 30 2351 G 2461 2017
-> 16 0 30 2351 G 2378 2017
-> 15 0 31 2351 G 2378 2018
-> 16 0 31 2351 G 2376 2018
-> 15 0 30 2351 G 2461 2019
-> 16 0 30 2351 G 2414 2019
-> 15 0 31 2351 G 2414 2020
-> 16 0 31 2351 G 2412 2020
-> 15 0 30 2351 G 2461 2021
-> 16 0 30 2351 G 2420 2021
-> 15 0 31 2351 G 2420 2022
-> 16 0 31 2351 G 2418 2022
-> 15 0 30 2351 G 2461 2023
-> 16 0 30 2351 G 2426 2023
-> 15 0 31 2351 G 2426 2024
-> 16 0 31 2351 G 2424 2024
-> 15 0 30 2351 G 2461 2025
-> 16 0 30 2351 G 2432 2025
-> 15 0 31 2351 G 2432 2026
-> 16 0 31 2351 G 2430 2026
-> 15 0 30 2351 G 2461 2027
-> 16 0 30 2351 G 2438 2027
-> 15 0 31 2351 G 2438 2028
-> 16 0 31 2351 G 2436 2028
-> 15 0 32 2351 G 2461 2029
-> 16 0 32 2351 G 2460 2029
-> 15 0 30 2351 G 2461 2030
-> 16 0 30 2351 G 2384 2030
-> 15 0 31 2351 G 2384 2031
-> 16 0 31 2351 G 2382 2031
-> 15 0 30 2351 G 2461 2032
-> 16 0 30 2351 G 2441 2032
-> 15 0 31 2351 G 2441 2033
-> 16 0 31 2351 G 2439 2033
-> 15 0 30 2351 G 2461 2034
-> 16 0 30 2351 G 2390 2034
-> 15 0 31 2351 G 2390 2035
-> 16 0 31 2351 G 2388 2035
-> 15 0 30 2351 G 2461 2036
-> 16 0 30 2351 G 2447 2036
-> 15 0 31 2351 G 2447 2037
-> 16 0 31 2351 G 2445 2037
-> 15 0 30 2351 G 2461 2038
-> 16 0 30 2351 G 2396 2038
-> 15 0 31 2351 G 2396 2039
-> 16 0 31 2351 G 2394 2039
-> 15 0 30 2351 G 2461 2040
-> 16 0 30 2351 G 2453 2040
-> 15 0 31 2351 G 2453 2041
-> 16 0 31 2351 G 2451 2041
-> 15 0 30 2351 G 2461 2042
-> 16 0 30 2351 G 2402 2042
-> 15 0 31 2351 G 2402 2043
-> 16 0 31 2351 G 2400 2043
-> 15 0 30 2351 G 2461 2044
-> 16 0 30 2351 G 2459 2044
-> 15 0 31 2351 G 2459 2045
-> 16 0 31 2351 G 2457 2045
-> 15 0 30 2351 G 2461 2046
-> 16 0 30 2351 G 2408 2046
-> 15 0 31 2351 G 2408 2047
-> 16 0 31 2351 G 2406 2047
-> 15 0 30 2351 G 2461 2048
-> 16 0 30 2351 G 2357 2048
-> 15 0 31 2351 G 2357 2049
-> 16 0 31 2351 G 2355 2049
-> 15 0 30 2351 G 2461 2050
-> 16 0 30 2351 G 2363 2050
-> 15 0 31 2351 G 2363 2051
-> 16 0 31 2351 G 2361 2051
-> 15 0 30 2351 G 2461 2052
-> 16 0 30 2351 G 2369 2052
-> 15 0 31 2351 G 2369 2053
-> 16 0 31 2351 G 2367 2053
-> 15 0 30 2351 G 2461 2054
-> 16 0 30 2351 G 2375 2054
-> 15 0 31 2351 G 2375 2055
-> 16 0 31 2351 G 2373 2055
-> 15 0 30 2351 G 2461 2056
-> 16 0 30 2351 G 2411 2056
-> 15 0 31 2351 G 2411 2057
-> 16 0 31 2351 G 2409 2057
-> 15 0 30 2351 G 2461 2058
-> 16 0 30 2351 G 2417 2058
-> 15 0 31 2351 G 2417 2059
-> 16 0 31 2351 G 2415 2059
-> 15 0 30 2351 G 2461 2060
-> 16 0 30 2351 G 2423 2060
-> 15 0 31 2351 G 2423 2061
-> 16 0 31 2351 G 2421 2061
-> 15 0 30 2351 G 2461 2062
-> 16 0 30 2351 G 2429 2062
-> 15 0 31 2351 G 2429 2063
-> 16 0 31 2351 G 2427 2063
-> 15 0 30 2351 G 2461 2064
-> 16 0 30 2351 G 2435 2064
-> 15 0 31 2351 G 2435 2065
-> 16 0 31 2351 G 2433 2065
-> 15 0 30 2351 G 2461 2066
-> 16 0 30 2351 G 2381 2066
-> 15 0 31 2351 G 2381 2067
-> 16 0 31 2351 G 2379 2067
-> 15 0 30 2351 G 2461 2068
-> 16 0 30 2351 G 2387 2068
-> 15 0 31 2351 G 2387 2069
-> 16 0 31 2351 G 2385 2069
-> 15 0 30 2351 G 2461 2070
-> 16 0 30 2351 G 2444 2070
-> 15 0 31 2351 G 2444 2071
-> 16 0 31 2351 G 2442 2071
-> 15 0 30 2351 G 2461 2072
-> 16 0 30 2351 G 2393 2072
-> 15 0 31 2351 G 2393 2073
-> 16 0 31 2351 G 2391 2073
-> 15 0 30 2351 G 2461 2074
-> 16 0 30 2351 G 2450 2074
-> 15 0 31 2351 G 2450 2075
-> 16 0 31 2351 G 2448 2075
-> 15 0 30 2351 G 2461 2076
-> 16 0 30 2351 G 2399 2076
-> 15 0 31 2351 G 2399 2077
-> 16 0 31 2351 G 2397 2077
-> 15 0 30 2351 G 2461 2078
-> 16 0 30 2351 G 2456 2078
-> 15 0 31 2351 G 2456 2079
-> 16 0 31 2351 G 2454 2079
-> 15 0 30 2351 G 2461 2080
-> 16 0 30 2351 G 2405 2080
-> 15 0 31 2351 G 2405 2081
-> 16 0 31 2351 G 2403 2081
-> 15 0 29 2351 G 2358 2082
-> 16 0 29 2351 G 2359 2082
-> 15 0 30 2351 G 2359 2083
-> 16 0 30 2351 G 2461 2083
-> 15 0 30 2351 G 2461 2084
-> 16 0 30 2351 G 2354 2084
-> 15 0 31 2351 G 2354 2085
-> 16 0 31 2351 G 2352 2085
-> 15 0 29 2351 G 2364 2086
-> 16 0 29 2351 G 2365 2086
-> 15 0 30 2351 G 2365 2087
-> 16 0 30 2351 G 2461 2087
-> 15 0 29 2351 G 2370 2088
-> 16 0 29 2351 G 2371 2088
-> 15 0 30 2351 G 2371 2089
-> 16 0 30 2351 G 2461 2089
-> 15 0 29 2351 G 2376 2090
-> 16 0 29 2351 G 2377 2090
-> 15 0 30 2351 G 2377 2091
-> 16 0 30 2351 G 2461 2091
-> 15 0 29 2351 G 2412 2092
-> 16 0 29 2351 G 2413 2092
-> 15 0 30 2351 G 2413 2093
-> 16 0 30 2351 G 2461 2093
-> 15 0 29 2351 G 2418 2094
-> 16 0 29 2351 G 2419 2094
-> 15 0 30 2351 G 2419 2095
-> 16 0 30 2351 G 2461 2095
-> 15 0 29 2351 G 2424 2096
-> 16 0 29 2351 G 2425 2096
-> 15 0 30 2351 G 2425 2097
-> 16 0 30 2351 G 2461 2097
-> 15 0 29 2351 G 2430 2098
-> 16 0 29 2351 G 2431 2098
-> 15 0 30 2351 G 2431 2099
-> 16 0 30 2351 G 2461 2099
-> 15 0 29 2351 G 2436 2100
-> 16 0 29 2351 G 2437 2100
-> 15 0 30 2351 G 2437 2101
-> 16 0 30 2351 G 2461 2101
-> 15 0 29 2351 G 2382 2102
-> 16 0 29 2351 G 2383 2102
-> 15 0 30 2351 G 2383 2103
-> 16 0 30 2351 G 2461 2103
-> 15 0 29 2351 G 2439 2104
-> 16 0 29 2351 G 2440 2104
-> 15 0 30 2351 G 2440 2105
-> 16 0 30 2351 G 2461 2105
-> 15 0 29 2351 G 2388 2106
-> 16 0 29 2351 G 2389 2106
-> 15 0 30 2351 G 2389 2107
-> 16 0 30 2351 G 2461 2107
-> 15 0 29 2351 G 2445 2108
-> 16 0 29 2351 G 2446 2108
-> 15 0 30 2351 G 2446 2109
-> 16 0 30 2351 G 2461 2109
-> 15 0 29 2351 G 2394 2110
-> 16 0 29 2351 G 2395 2110
-> 15 0 30 2351 G 2395 2111
-> 16 0 30 2351 G 2461 2111
-> 15 0 29 2351 G 2451 2112
-> 16 0 29 2351 G 2452 2112
-> 15 0 30 2351 G 2452 2113
-> 16 0 30 2351 G 2461 2113
-> 15 0 29 2351 G 2400 2114
-> 16 0 29 2351 G 2401 2114
-> 15 0 30 2351 G 2401 2115
-> 16 0 30 2351 G 2461 2115
-> 15 0 29 2351 G 2457 2116
-> 16 0 29 2351 G 2458 2116
-> 15 0 30 2351 G 2458 2117
-> 16 0 30 2351 G 2461 2117
-> 15 0 29 2351 G 2406 2118
-> 16 0 29 2351 G 2407 2118
-> 15 0 30 2351 G 2407 2119
-> 16 0 30 2351 G 2461 2119
-> 15 0 29 2351 G 2355 2120
-> 16 0 29 2351 G 2356 2120
-> 15 0 30 2351 G 2356 2121
-> 16 0 30 2351 G 2461 2121
-> 15 0 29 2351 G 2361 2122
-> 16 0 29 2351 G 2362 2122
-> 15 0 30 2351 G 2362 2123
-> 16 0 30 2351 G 2461 2123
-> 15 0 29 2351 G 2367 2124
-> 16 0 29 2351 G 2368 2124
-> 15 0 30 2351 G 2368 2125
-> 16 0 30 2351 G 2461 2125
-> 15 0 29 2351 G 2373 2126
-> 16 0 29 2351 G 2374 2126
-> 15 0 30 2351 G 2374 2127
-> 16 0 30 2351 G 2461 2127
-> 15 0 29 2351 G 2409 2128
-> 16 0 29 2351 G 2410 2128
-> 15 0 30 2351 G 2410 2129
-> 16 0 30 2351 G 2461 2129
-> 15 0 29 2351 G 2415 2130
-> 16 0 29 2351 G 2416 2130
-> 15 0 30 2351 G 2416 2131
-> 16 0 30 2351 G 2461 2131
-> 15 0 29 2351 G 2421 2132
-> 16 0 29 2351 G 2422 2132
-> 15 0 30 2351 G 2422 2133
-> 16 0 30 2351 G 2461 2133
-> 15 0 29 2351 G 2427 2134
-> 16 0 29 2351 G 2428 2134
-> 15 0 30 2351 G 2428 2135
-> 16 0 30 2351 G 2461 2135
-> 15 0 29 2351 G 2433 2136
-> 16 0 29 2351 G 2434 2136
-> 15 0 30 2351 G 2434 2137
-> 16 0 30 2351 G 2461 2137
-> 15 0 29 2351 G 2379 2138
-> 16 0 29 2351 G 2380 2138
-> 15 0 30 2351 G 2380 2139
-> 16 0 30 2351 G 2461 2139
-> 15 0 29 2351 G 2385 2140
-> 16 0 29 2351 G 2386 2140
-> 15 0 30 2351 G 2386 2141
-> 16 0 30 2351 G 2461 2141
-> 15 0 29 2351 G 2442 2142
-> 16 0 29 2351 G 2443 2142
-> 15 0 30 2351 G 2443 2143
-> 16 0 30 2351 G 2461 2143
-> 15 0 29 2351 G 2391 2144
-> 16 0 29 2351 G 2392 2144
-> 15 0 30 2351 G 2392 2145
-> 16 0 30 2351 G 2461 2145
-> 15 0 29 2351 G 2448 2146
-> 16 0 29 2351 G 2449 2146
-> 15 0 30 2351 G 2449 2147
-> 16 0 30 2351 G 2461 2147
-> 15 0 29 2351 G 2397 2148
-> 16 0 29 2351 G 2398 2148
-> 15 0 30 2351 G 2398 2149
-> 16 0 30 2351 G 2461 2149
-> 15 0 29 2351 G 2454 2150
-> 16 0 29 2351 G 2455 2150
-> 15 0 30 2351 G 2455 2151
-> 16 0 30 2351 G 2461 2151
-> 15 0 29 2351 G 2403 2152
-> 16 0 29 2351 G 2404 2152
-> 15 0 30 2351 G 2404 2153
-> 16 0 30 2351 G 2461 2153
-> 15 0 29 2573 G 2592 2154
-> 16 0 29 2573 G 2593 2154
-> 15 0 30 2573 G 2593 2155
-> 16 0 30 2573 G 2683 2155
-> 15 0 30 2573 G 2683 2156
-> 16 0 30 2573 G 2651 2156
-> 15 0 31 2573 G 2651 2157
-> 16 0 31 2573 G 2649 2157
-> 15 0 30 2573 G 2683 2158
-> 16 0 30 2573 G 2597 2158
-> 15 0 31 2573 G 2597 2159
-> 16 0 31 2573 G 2595 2159
-> 15 0 30 2573 G 2683 2160
-> 16 0 30 2573 G 2603 2160
-> 15 0 31 2573 G 2603 2161
-> 16 0 31 2573 G 2601 2161
-> 15 0 30 2573 G 2683 2162
-> 16 0 30 2573 G 2609 2162
-> 15 0 31 2573 G 2609 2163
-> 16 0 31 2573 G 2607 2163
-> 15 0 30 2573 G 2683 2164
-> 16 0 30 2573 G 2615 2164
-> 15 0 31 2573 G 2615 2165
-> 16 0 31 2573 G 2613 2165
-> 15 0 30 2573 G 2683 2166
-> 16 0 30 2573 G 2621 2166
-> 15 0 31 2573 G 2621 2167
-> 16 0 31 2573 G 2619 2167
-> 15 0 30 2573 G 2683 2168
-> 16 0 30 2573 G 2660 2168
-> 15 0 31 2573 G 2660 2169
-> 16 0 31 2573 G 2658 2169
-> 15 0 30 2573 G 2683 2170
-> 16 0 30 2573 G 2666 2170
-> 15 0 31 2573 G 2666 2171
-> 16 0 31 2573 G 2664 2171
-> 15 0 30 2573 G 2683 2172
-> 16 0 30 2573 G 2672 2172
-> 15 0 31 2573 G 2672 2173
-> 16 0 31 2573 G 2670 2173
-> 15 0 30 2573 G 2683 2174
-> 16 0 30 2573 G 2678 2174
-> 15 0 31 2573 G 2678 2175
-> 16 0 31 2573 G 2676 2175
-> 15 0 30 2573 G 2683 2176
-> 16 0 30 2573 G 2630 2176
-> 15 0 31 2573 G 2630 2177
-> 16 0 31 2573 G 2628 2177
-> 15 0 30 2573 G 2683 2178
-> 16 0 30 2573 G 2579 2178
-> 15 0 31 2573 G 2579 2179
-> 16 0 31 2573 G 2577 2179
-> 15 0 30 2573 G 2683 2180
-> 16 0 30 2573 G 2636 2180
-> 15 0 31 2573 G 2636 2181
-> 16 0 31 2573 G 2634 2181
-> 15 0 30 2573 G 2683 2182
-> 16 0 30 2573 G 2585 2182
-> 15 0 31 2573 G 2585 2183
-> 16 0 31 2573 G 2583 2183
-> 15 0 30 2573 G 2683 2184
-> 16 0 30 2573 G 2642 2184
-> 15 0 31 2573 G 2642 2185
-> 16 0 31 2573 G 2640 2185
-> 15 0 30 2573 G 2683 2186
-> 16 0 30 2573 G 2591 2186
-> 15 0 31 2573 G 2591 2187
-> 16 0 31 2573 G 2589 2187
-> 15 0 30 2573 G 2683 2188
-> 16 0 30 2573 G 2648 2188
-> 15 0 31 2573 G 2648 2189
-> 16 0 31 2573 G 2646 2189
-> 15 0 30 2573 G 2683 2190
-> 16 0 30 2573 G 2654 2190
-> 15 0 31 2573 G 2654 2191
-> 16 0 31 2573 G 2652 2191
-> 15 0 30 2573 G 2683 2192
-> 16 0 30 2573 G 2600 2192
-> 15 0 31 2573 G 2600 2193
-> 16 0 31 2573 G 2598 2193
-> 15 0 30 2573 G 2683 2194
-> 16 0 30 2573 G 2606 2194
-> 15 0 31 2573 G 2606 2195
-> 16 0 31 2573 G 2604 2195
-> 15 0 30 2573 G 2683 2196
-> 16 0 30 2573 G 2612 2196
-> 15 0 31 2573 G 2612 2197
-> 16 0 31 2573 G 2610 2197
-> 15 0 30 2573 G 2683 2198
-> 16 0 30 2573 G 2618 2198
-> 15 0 31 2573 G 2618 2199
-> 16 0 31 2573 G 2616 2199
-> 15 0 30 2573 G 2683 2200
-> 16 0 30 2573 G 2624 2200
-> 15 0 31 2573 G 2624 2201
-> 16 0 31 2573 G 2622 2201
-> 15 0 30 2573 G 2683 2202
-> 16 0 30 2573 G 2657 2202
-> 15 0 31 2573 G 2657 2203
-> 16 0 31 2573 G 2655 2203
-> 15 0 30 2573 G 2683 2204
-> 16 0 30 2573 G 2663 2204
-> 15 0 31 2573 G 2663 2205
-> 16 0 31 2573 G 2661 2205
-> 15 0 30 2573 G 2683 2206
-> 16 0 30 2573 G 2669 2206
-> 15 0 31 2573 G 2669 2207
-> 16 0 31 2573 G 2667 2207
-> 15 0 30 2573 G 2683 2208
-> 16 0 30 2573 G 2675 2208
-> 15 0 31 2573 G 2675 2209
-> 16 0 31 2573 G 2673 2209
-> 15 0 32 2573 G 2683 2210
-> 16 0 32 2573 G 2682 2210
-> 15 0 30 2573 G 2683 2211
-> 16 0 30 2573 G 2681 2211
-> 15 0 31 2573 G 2681 2212
-> 16 0 31 2573 G 2679 2212
-> 15 0 30 2573 G 2683 2213
-> 16 0 30 2573 G 2627 2213
-> 15 0 31 2573 G 2627 2214
-> 16 0 31 2573 G 2625 2214
-> 15 0 30 2573 G 2683 2215
-> 16 0 30 2573 G 2576 2215
-> 15 0 31 2573 G 2576 2216
-> 16 0 31 2573 G 2574 2216
-> 15 0 30 2573 G 2683 2217
-> 16 0 30 2573 G 2633 2217
-> 15 0 31 2573 G 2633 2218
-> 16 0 31 2573 G 2631 2218
-> 15 0 30 2573 G 2683 2219
-> 16 0 30 2573 G 2582 2219
-> 15 0 31 2573 G 2582 2220
-> 16 0 31 2573 G 2580 2220
-> 15 0 30 2573 G 2683 2221
-> 16 0 30 2573 G 2639 2221
-> 15 0 31 2573 G 2639 2222
-> 16 0 31 2573 G 2637 2222
-> 15 0 30 2573 G 2683 2223
-> 16 0 30 2573 G 2588 2223
-> 15 0 31 2573 G 2588 2224
-> 16 0 31 2573 G 2586 2224
-> 15 0 30 2573 G 2683 2225
-> 16 0 30 2573 G 2645 2225
-> 15 0 31 2573 G 2645 2226
-> 16 0 31 2573 G 2643 2226
-> 15 0 29 2573 G 2649 2227
-> 16 0 29 2573 G 2650 2227
-> 15 0 30 2573 G 2650 2228
-> 16 0 30 2573 G 2683 2228
-> 15 0 30 2573 G 2683 2229
-> 16 0 30 2573 G 2594 2229
-> 15 0 31 2573 G 2594 2230
-> 16 0 31 2573 G 2592 2230
-> 15 0 29 2573 G 2595 2231
-> 16 0 29 2573 G 2596 2231
-> 15 0 30 2573 G 2596 2232
-> 16 0 30 2573 G 2683 2232
-> 15 0 29 2573 G 2601 2233
-> 16 0 29 2573 G 2602 2233
-> 15 0 30 2573 G 2602 2234
-> 16 0 30 2573 G 2683 2234
-> 15 0 29 2573 G 2607 2235
-> 16 0 29 2573 G 2608 2235
-> 15 0 30 2573 G 2608 2236
-> 16 0 30 2573 G 2683 2236
-> 15 0 29 2573 G 2613 2237
-> 16 0 29 2573 G 2614 2237
-> 15 0 30 2573 G 2614 2238
-> 16 0 30 2573 G 2683 2238
-> 15 0 29 2573 G 2619 2239
-> 16 0 29 2573 G 2620 2239
-> 15 0 30 2573 G 2620 2240
-> 16 0 30 2573 G 2683 2240
-> 15 0 29 2573 G 2658 2241
-> 16 0 29 2573 G 2659 2241
-> 15 0 30 2573 G 2659 2242
-> 16 0 30 2573 G 2683 2242
-> 15 0 29 2573 G 2664 2243
-> 16 0 29 2573 G 2665 2243
-> 15 0 30 2573 G 2665 2244
-> 16 0 30 2573 G 2683 2244
-> 15 0 29 2573 G 2670 2245
-> 16 0 29 2573 G 2671 2245
-> 15 0 30 2573 G 2671 2246
-> 16 0 30 2573 G 2683 2246
-> 15 0 29 2573 G 2676 2247
-> 16 0 29 2573 G 2677 2247
-> 15 0 30 2573 G 2677 2248
-> 16 0 30 2573 G 2683 2248
-> 15 0 29 2573 G 2628 2249
-> 16 0 29 2573 G 2629 2249
-> 15 0 30 2573 G 2629 2250
-> 16 0 30 2573 G 2683 2250
-> 15 0 29 2573 G 2577 2251
-> 16 0 29 2573 G 2578 2251
-> 15 0 30 2573 G 2578 2252
-> 16 0 30 2573 G 2683 2252
-> 15 0 29 2573 G 2634 2253
-> 16 0 29 2573 G 2635 2253
-> 15 0 30 2573 G 2635 2254
-> 16 0 30 2573 G 2683 2254
-> 15 0 29 2573 G 2583 2255
-> 16 0 29 2573 G 2584 2255
-> 15 0 30 2573 G 2584 2256
-> 16 0 30 2573 G 2683 2256
-> 15 0 29 2573 G 2640 2257
-> 16 0 29 2573 G 2641 2257
-> 15 0 30 2573 G 2641 2258
-> 16 0 30 2573 G 2683 2258
-> 15 0 29 2573 G 2589 2259
-> 16 0 29 2573 G 2590 2259
-> 15 0 30 2573 G 2590 2260
-> 16 0 30 2573 G 2683 2260
-> 15 0 29 2573 G 2646 2261
-> 16 0 29 2573 G 2647 2261
-> 15 0 30 2573 G 2647 2262
-> 16 0 30 2573 G 2683 2262
-> 15 0 29 2573 G 2652 2263
-> 16 0 29 2573 G 2653 2263
-> 15 0 30 2573 G 2653 2264
-> 16 0 30 2573 G 2683 2264
-> 15 0 29 2573 G 2598 2265
-> 16 0 29 2573 G 2599 2265
-> 15 0 30 2573 G 2599 2266
-> 16 0 30 2573 G 2683 2266
-> 15 0 29 2573 G 2604 2267
-> 16 0 29 2573 G 2605 2267
-> 15 0 30 2573 G 2605 2268
-> 16 0 30 2573 G 2683 2268
-> 15 0 29 2573 G 2610 2269
-> 16 0 29 2573 G 2611 2269
-> 15 0 30 2573 G 2611 2270
-> 16 0 30 2573 G 2683 2270
-> 15 0 29 2573 G 2616 2271
-> 16 0 29 2573 G 2617 2271
-> 15 0 30 2573 G 2617 2272
-> 16 0 30 2573 G 2683 2272
-> 15 0 29 2573 G 2622 2273
-> 16 0 29 2573 G 2623 2273
-> 15 0 30 2573 G 2623 2274
-> 16 0 30 2573 G 2683 2274
-> 15 0 29 2573 G 2655 2275
-> 16 0 29 2573 G 2656 2275
-> 15 0 30 2573 G 2656 2276
-> 16 0 30 2573 G 2683 2276
-> 15 0 29 2573 G 2661 2277
-> 16 0 29 2573 G 2662 2277
-> 15 0 30 2573 G 2662 2278
-> 16 0 30 2573 G 2683 2278
-> 15 0 29 2573 G 2667 2279
-> 16 0 29 2573 G 2668 2279
-> 15 0 30 2573 G 2668 2280
-> 16 0 30 2573 G 2683 2280
-> 15 0 29 2573 G 2673 2281
-> 16 0 29 2573 G 2674 2281
-> 15 0 30 2573 G 2674 2282
-> 16 0 30 2573 G 2683 2282
-> 15 0 29 2573 G 2679 2283
-> 16 0 29 2573 G 2680 2283
-> 15 0 30 2573 G 2680 2284
-> 16 0 30 2573 G 2683 2284
-> 15 0 29 2573 G 2625 2285
-> 16 0 29 2573 G 2626 2285
-> 15 0 30 2573 G 2626 2286
-> 16 0 30 2573 G 2683 2286
-> 15 0 29 2573 G 2574 2287
-> 16 0 29 2573 G 2575 2287
-> 15 0 30 2573 G 2575 2288
-> 16 0 30 2573 G 2683 2288
-> 15 0 29 2573 G 2631 2289
-> 16 0 29 2573 G 2632 2289
-> 15 0 30 2573 G 2632 2290
-> 16 0 30 2573 G 2683 2290
-> 15 0 29 2573 G 2580 2291
-> 16 0 29 2573 G 2581 2291
-> 15 0 30 2573 G 2581 2292
-> 16 0 30 2573 G 2683 2292
-> 15 0 29 2573 G 2637 2293
-> 16 0 29 2573 G 2638 2293
-> 15 0 30 2573 G 2638 2294
-> 16 0 30 2573 G 2683 2294
-> 15 0 29 2573 G 2586 2295
-> 16 0 29 2573 G 2587 2295
-> 15 0 30 2573 G 2587 2296
-> 16 0 30 2573 G 2683 2296
-> 15 0 29 2573 G 2643 2297
-> 16 0 29 2573 G 2644 2297
-> 15 0 30 2573 G 2644 2298
-> 16 0 30 2573 G 2683 2298
-> 15 0 29 2795 G 2814 2299
-> 16 0 29 2795 G 2815 2299
-> 15 0 30 2795 G 2815 2300
-> 16 0 30 2795 G 2905 2300
-> 15 0 30 2795 G 2905 2301
-> 16 0 30 2795 G 2873 2301
-> 15 0 31 2795 G 2873 2302
-> 16 0 31 2795 G 2871 2302
-> 15 0 30 2795 G 2905 2303
-> 16 0 30 2795 G 2822 2303
-> 15 0 31 2795 G 2822 2304
-> 16 0 31 2795 G 2820 2304
-> 15 0 30 2795 G 2905 2305
-> 16 0 30 2795 G 2879 2305
-> 15 0 31 2795 G 2879 2306
-> 16 0 31 2795 G 2877 2306
-> 15 0 30 2795 G 2905 2307
-> 16 0 30 2795 G 2828 2307
-> 15 0 31 2795 G 2828 2308
-> 16 0 31 2795 G 2826 2308
-> 15 0 30 2795 G 2905 2309
-> 16 0 30 2795 G 2885 2309
-> 15 0 31 2795 G 2885 2310
-> 16 0 31 2795 G 2883 2310
-> 15 0 30 2795 G 2905 2311
-> 16 0 30 2795 G 2834 2311
-> 15 0 31 2795 G 2834 2312
-> 16 0 31 2795 G 2832 2312
-> 15 0 30 2795 G 2905 2313
-> 16 0 30 2795 G 2891 2313
-> 15 0 31 2795 G 2891 2314
-> 16 0 31 2795 G 2889 2314
-> 15 0 30 2795 G 2905 2315
-> 16 0 30 2795 G 2840 2315
-> 15 0 31 2795 G 2840 2316
-> 16 0 31 2795 G 2838 2316
-> 15 0 30 2795 G 2905 2317
-> 16 0 30 2795 G 2897 2317
-> 15 0 31 2795 G 2897 2318
-> 16 0 31 2795 G 2895 2318
-> 15 0 30 2795 G 2905 2319
-> 16 0 30 2795 G 2843 2319
-> 15 0 31 2795 G 2843 2320
-> 16 0 31 2795 G 2841 2320
-> 15 0 30 2795 G 2905 2321
-> 16 0 30 2795 G 2849 2321
-> 15 0 31 2795 G 2849 2322
-> 16 0 31 2795 G 2847 2322
-> 15 0 32 2795 G 2905 2323
-> 16 0 32 2795 G 2904 2323
-> 15 0 30 2795 G 2905 2324
-> 16 0 30 2795 G 2798 2324
-> 15 0 31 2795 G 2798 2325
-> 16 0 31 2795 G 2796 2325
-> 15 0 30 2795 G 2905 2326
-> 16 0 30 2795 G 2855 2326
-> 15 0 31 2795 G 2855 2327
-> 16 0 31 2795 G 2853 2327
-> 15 0 30 2795 G 2905 2328
-> 16 0 30 2795 G 2804 2328
-> 15 0 31 2795 G 2804 2329
-> 16 0 31 2795 G 2802 2329
-> 15 0 30 2795 G 2905 2330
-> 16 0 30 2795 G 2861 2330
-> 15 0 31 2795 G 2861 2331
-> 16 0 31 2795 G 2859 2331
-> 15 0 30 2795 G 2905 2332
-> 16 0 30 2795 G 2810 2332
-> 15 0 31 2795 G 2810 2333
-> 16 0 31 2795 G 2808 2333
-> 15 0 30 2795 G 2905 2334
-> 16 0 30 2795 G 2867 2334
-> 15 0 31 2795 G 2867 2335
-> 16 0 31 2795 G 2865 2335
-> 15 0 30 2795 G 2905 2336
-> 16 0 30 2795 G 2813 2336
-> 15 0 31 2795 G 2813 2337
-> 16 0 31 2795 G 2811 2337
-> 15 0 30 2795 G 2905 2338
-> 16 0 30 2795 G 2819 2338
-> 15 0 31 2795 G 2819 2339
-> 16 0 31 2795 G 2817 2339
-> 15 0 30 2795 G 2905 2340
-> 16 0 30 2795 G 2876 2340
-> 15 0 31 2795 G 2876 2341
-> 16 0 31 2795 G 2874 2341
-> 15 0 30 2795 G 2905 2342
-> 16 0 30 2795 G 2825 2342
-> 15 0 31 2795 G 2825 2343
-> 16 0 31 2795 G 2823 2343
-> 15 0 30 2795 G 2905 2344
-> 16 0 30 2795 G 2882 2344
-> 15 0 31 2795 G 2882 2345
-> 16 0 31 2795 G 2880 2345
-> 15 0 30 2795 G 2905 2346
-> 16 0 30 2795 G 2831 2346
-> 15 0 31 2795 G 2831 2347
-> 16 0 31 2795 G 2829 2347
-> 15 0 30 2795 G 2905 2348
-> 16 0 30 2795 G 2888 2348
-> 15 0 31 2795 G 2888 2349
-> 16 0 31 2795 G 2886 2349
-> 15 0 30 2795 G 2905 2350
-> 16 0 30 2795 G 2837 2350
-> 15 0 31 2795 G 2837 2351
-> 16 0 31 2795 G 2835 2351
-> 15 0 30 2795 G 2905 2352
-> 16 0 30 2795 G 2894 2352
-> 15 0 31 2795 G 2894 2353
-> 16 0 31 2795 G 2892 2353
-> 15 0 30 2795 G 2905 2354
-> 16 0 30 2795 G 2900 2354
-> 15 0 31 2795 G 2900 2355
-> 16 0 31 2795 G 2898 2355
-> 15 0 30 2795 G 2905 2356
-> 16 0 30 2795 G 2846 2356
-> 15 0 31 2795 G 2846 2357
-> 16 0 31 2795 G 2844 2357
-> 15 0 30 2795 G 2905 2358
-> 16 0 30 2795 G 2903 2358
-> 15 0 31 2795 G 2903 2359
-> 16 0 31 2795 G 2901 2359
-> 15 0 30 2795 G 2905 2360
-> 16 0 30 2795 G 2852 2360
-> 15 0 31 2795 G 2852 2361
-> 16 0 31 2795 G 2850 2361
-> 15 0 30 2795 G 2905 2362
-> 16 0 30 2795 G 2801 2362
-> 15 0 31 2795 G 2801 2363
-> 16 0 31 2795 G 2799 2363
-> 15 0 30 2795 G 2905 2364
-> 16 0 30 2795 G 2858 2364
-> 15 0 31 2795 G 2858 2365
-> 16 0 31 2795 G 2856 2365
-> 15 0 30 2795 G 2905 2366
-> 16 0 30 2795 G 2807 2366
-> 15 0 31 2795 G 2807 2367
-> 16 0 31 2795 G 2805 2367
-> 15 0 30 2795 G 2905 2368
-> 16 0 30 2795 G 2864 2368
-> 15 0 31 2795 G 2864 2369
-> 16 0 31 2795 G 2862 2369
-> 15 0 30 2795 G 2905 2370
-> 16 0 30 2795 G 2870 2370
-> 15 0 31 2795 G 2870 2371
-> 16 0 31 2795 G 2868 2371
-> 15 0 29 2795 G 2871 2372
-> 16 0 29 2795 G 2872 2372
-> 15 0 30 2795 G 2872 2373
-> 16 0 30 2795 G 2905 2373
-> 15 0 30 2795 G 2905 2374
-> 16 0 30 2795 G 2816 2374
-> 15 0 31 2795 G 2816 2375
-> 16 0 31 2795 G 2814 2375
-> 15 0 29 2795 G 2820 2376
-> 16 0 29 2795 G 2821 2376
-> 15 0 30 2795 G 2821 2377
-> 16 0 30 2795 G 2905 2377
-> 15 0 29 2795 G 2877 2378
-> 16 0 29 2795 G 2878 2378
-> 15 0 30 2795 G 2878 2379
-> 16 0 30 2795 G 2905 2379
-> 15 0 29 2795 G 2826 2380
-> 16 0 29 2795 G 2827 2380
-> 15 0 30 2795 G 2827 2381
-> 16 0 30 2795 G 2905 2381
-> 15 0 29 2795 G 2883 2382
-> 16 0 29 2795 G 2884 2382
-> 15 0 30 2795 G 2884 2383
-> 16 0 30 2795 G 2905 2383
-> 15 0 29 2795 G 2832 2384
-> 16 0 29 2795 G 2833 2384
-> 15 0 30 2795 G 2833 2385
-> 16 0 30 2795 G 2905 2385
-> 15 0 29 2795 G 2889 2386
-> 16 0 29 2795 G 2890 2386
-> 15 0 30 2795 G 2890 2387
-> 16 0 30 2795 G 2905 2387
-> 15 0 29 2795 G 2838 2388
-> 16 0 29 2795 G 2839 2388
-> 15 0 30 2795 G 2839 2389
-> 16 0 30 2795 G 2905 2389
-> 15 0 29 2795 G 2895 2390
-> 16 0 29 2795 G 2896 2390
-> 15 0 30 2795 G 2896 2391
-> 16 0 30 2795 G 2905 2391
-> 15 0 29 2795 G 2841 2392
-> 16 0 29 2795 G 2842 2392
-> 15 0 30 2795 G 2842 2393
-> 16 0 30 2795 G 2905 2393
-> 15 0 29 2795 G 2847 2394
-> 16 0 29 2795 G 2848 2394
-> 15 0 30 2795 G 2848 2395
-> 16 0 30 2795 G 2905 2395
-> 15 0 29 2795 G 2796 2396
-> 16 0 29 2795 G 2797 2396
-> 15 0 30 2795 G 2797 2397
-> 16 0 30 2795 G 2905 2397
-> 15 0 29 2795 G 2853 2398
-> 16 0 29 2795 G 2854 2398
-> 15 0 30 2795 G 2854 2399
-> 16 0 30 2795 G 2905 2399
-> 15 0 29 2795 G 2802 2400
-> 16 0 29 2795 G 2803 2400
-> 15 0 30 2795 G 2803 2401
-> 16 0 30 2795 G 2905 2401
-> 15 0 29 2795 G 2859 2402
-> 16 0 29 2795 G 2860 2402
-> 15 0 30 2795 G 2860 2403
-> 16 0 30 2795 G 2905 2403
-> 15 0 29 2795 G 2808 2404
-> 16 0 29 2795 G 2809 2404
-> 15 0 30 2795 G 2809 2405
-> 16 0 30 2795 G 2905 2405
-> 15 0 29 2795 G 2865 2406
-> 16 0 29 2795 G 2866 2406
-> 15 0 30 2795 G 2866 2407
-> 16 0 30 2795 G 2905 2407
-> 15 0 29 2795 G 2811 2408
-> 16 0 29 2795 G 2812 2408
-> 15 0 30 2795 G 2812 2409
-> 16 0 30 2795 G 2905 2409
-> 15 0 29 2795 G 2817 2410
-> 16 0 29 2795 G 2818 2410
-> 15 0 30 2795 G 2818 2411
-> 16 0 30 2795 G 2905 2411
-> 15 0 29 2795 G 2874 2412
-> 16 0 29 2795 G 2875 2412
-> 15 0 30 2795 G 2875 2413
-> 16 0 30 2795 G 2905 2413
-> 15 0 29 2795 G 2823 2414
-> 16 0 29 2795 G 2824 2414
-> 15 0 30 2795 G 2824 2415
-> 16 0 30 2795 G 2905 2415
-> 15 0 29 2795 G 2880 2416
-> 16 0 29 2795 G 2881 2416
-> 15 0 30 2795 G 2881 2417
-> 16 0 30 2795 G 2905 2417
-> 15 0 29 2795 G 2829 2418
-> 16 0 29 2795 G 2830 2418
-> 15 0 30 2795 G 2830 2419
-> 16 0 30 2795 G 2905 2419
-> 15 0 29 2795 G 2886 2420
-> 16 0 29 2795 G 2887 2420
-> 15 0 30 2795 G 2887 2421
-> 16 0 30 2795 G 2905 2421
-> 15 0 29 2795 G 2835 2422
-> 16 0 29 2795 G 2836 2422
-> 15 0 30 2795 G 2836 2423
-> 16 0 30 2795 G 2905 2423
-> 15 0 29 2795 G 2892 2424
-> 16 0 29 2795 G 2893 2424
-> 15 0 30 2795 G 2893 2425
-> 16 0 30 2795 G 2905 2425
-> 15 0 29 2795 G 2898 2426
-> 16 0 29 2795 G 2899 2426
-> 15 0 30 2795 G 2899 2427
-> 16 0 30 2795 G 2905 2427
-> 15 0 29 2795 G 2844 2428
-> 16 0 29 2795 G 2845 2428
-> 15 0 30 2795 G 2845 2429
-> 16 0 30 2795 G 2905 2429
-> 15 0 29 2795 G 2901 2430
-> 16 0 29 2795 G 2902 2430
-> 15 0 30 2795 G 2902 2431
-> 16 0 30 2795 G 2905 2431
-> 15 0 29 2795 G 2850 2432
-> 16 0 29 2795 G 2851 2432
-> 15 0 30 2795 G 2851 2433
-> 16 0 30 2795 G 2905 2433
-> 15 0 29 2795 G 2799 2434
-> 16 0 29 2795 G 2800 2434
-> 15 0 30 2795 G 2800 2435
-> 16 0 30 2795 G 2905 2435
-> 15 0 29 2795 G 2856 2436
-> 16 0 29 2795 G 2857 2436
-> 15 0 30 2795 G 2857 2437
-> 16 0 30 2795 G 2905 2437
-> 15 0 29 2795 G 2805 2438
-> 16 0 29 2795 G 2806 2438
-> 15 0 30 2795 G 2806 2439
-> 16 0 30 2795 G 2905 2439
-> 15 0 29 2795 G 2862 2440
-> 16 0 29 2795 G 2863 2440
-> 15 0 30 2795 G 2863 2441
-> 16 0 30 2795 G 2905 2441
-> 15 0 29 2795 G 2868 2442
-> 16 0 29 2795 G 2869 2442
-> 15 0 30 2795 G 2869 2443
-> 16 0 30 2795 G 2905 2443
-> 15 0 29 2981 G 3021 2444
-> 16 0 29 2981 G 3022 2444
-> 15 0 30 2981 G 3022 2445
-> 16 0 30 2981 G 3091 2445
-> 15 0 30 2981 G 3091 2446
-> 16 0 30 2981 G 3029 2446
-> 15 0 31 2981 G 3029 2447
-> 16 0 31 2981 G 3027 2447
-> 15 0 30 2981 G 3091 2448
-> 16 0 30 2981 G 3086 2448
-> 15 0 31 2981 G 3086 2449
-> 16 0 31 2981 G 3084 2449
-> 15 0 30 2981 G 3091 2450
-> 16 0 30 2981 G 3035 2450
-> 15 0 31 2981 G 3035 2451
-> 16 0 31 2981 G 3033 2451
-> 15 0 30 2981 G 3091 2452
-> 16 0 30 2981 G 2984 2452
-> 15 0 31 2981 G 2984 2453
-> 16 0 31 2981 G 2982 2453
-> 15 0 30 2981 G 3091 2454
-> 16 0 30 2981 G 3041 2454
-> 15 0 31 2981 G 3041 2455
-> 16 0 31 2981 G 3039 2455
-> 15 0 30 2981 G 3091 2456
-> 16 0 30 2981 G 2990 2456
-> 15 0 31 2981 G 2990 2457
-> 16 0 31 2981 G 2988 2457
-> 15 0 30 2981 G 3091 2458
-> 16 0 30 2981 G 3047 2458
-> 15 0 31 2981 G 3047 2459
-> 16 0 31 2981 G 3045 2459
-> 15 0 30 2981 G 3091 2460
-> 16 0 30 2981 G 2993 2460
-> 15 0 31 2981 G 2993 2461
-> 16 0 31 2981 G 2991 2461
-> 15 0 30 2981 G 3091 2462
-> 16 0 30 2981 G 2999 2462
-> 15 0 31 2981 G 2999 2463
-> 16 0 31 2981 G 2997 2463
-> 15 0 30 2981 G 3091 2464
-> 16 0 30 2981 G 3056 2464
-> 15 0 31 2981 G 3056 2465
-> 16 0 31 2981 G 3054 2465
-> 15 0 30 2981 G 3091 2466
-> 16 0 30 2981 G 3005 2466
-> 15 0 31 2981 G 3005 2467
-> 16 0 31 2981 G 3003 2467
-> 15 0 30 2981 G 3091 2468
-> 16 0 30 2981 G 3062 2468
-> 15 0 31 2981 G 3062 2469
-> 16 0 31 2981 G 3060 2469
-> 15 0 30 2981 G 3091 2470
-> 16 0 30 2981 G 3011 2470
-> 15 0 31 2981 G 3011 2471
-> 16 0 31 2981 G 3009 2471
-> 15 0 30 2981 G 3091 2472
-> 16 0 30 2981 G 3068 2472
-> 15 0 31 2981 G 3068 2473
-> 16 0 31 2981 G 3066 2473
-> 15 0 30 2981 G 3091 2474
-> 16 0 30 2981 G 3017 2474
-> 15 0 31 2981 G 3017 2475
-> 16 0 31 2981 G 3015 2475
-> 15 0 30 2981 G 3091 2476
-> 16 0 30 2981 G 3074 2476
-> 15 0 31 2981 G 3074 2477
-> 16 0 31 2981 G 3072 2477
-> 15 0 30 2981 G 3091 2478
-> 16 0 30 2981 G 3080 2478
-> 15 0 31 2981 G 3080 2479
-> 16 0 31 2981 G 3078 2479
-> 15 0 30 2981 G 3091 2480
-> 16 0 30 2981 G 3026 2480
-> 15 0 31 2981 G 3026 2481
-> 16 0 31 2981 G 3024 2481
-> 15 0 30 2981 G 3091 2482
-> 16 0 30 2981 G 3083 2482
-> 15 0 31 2981 G 3083 2483
-> 16 0 31 2981 G 3081 2483
-> 15 0 30 2981 G 3091 2484
-> 16 0 30 2981 G 3032 2484
-> 15 0 31 2981 G 3032 2485
-> 16 0 31 2981 G 3030 2485
-> 15 0 30 2981 G 3091 2486
-> 16 0 30 2981 G 3089 2486
-> 15 0 31 2981 G 3089 2487
-> 16 0 31 2981 G 3087 2487
-> 15 0 30 2981 G 3091 2488
-> 16 0 30 2981 G 3038 2488
-> 15 0 31 2981 G 3038 2489
-> 16 0 31 2981 G 3036 2489
-> 15 0 30 2981 G 3091 2490
-> 16 0 30 2981 G 2987 2490
-> 15 0 31 2981 G 2987 2491
-> 16 0 31 2981 G 2985 2491
-> 15 0 30 2981 G 3091 2492
-> 16 0 30 2981 G 3044 2492
-> 15 0 31 2981 G 3044 2493
-> 16 0 31 2981 G 3042 2493
-> 15 0 30 2981 G 3091 2494
-> 16 0 30 2981 G 3050 2494
-> 15 0 31 2981 G 3050 2495
-> 16 0 31 2981 G 3048 2495
-> 15 0 30 2981 G 3091 2496
-> 16 0 30 2981 G 2996 2496
-> 15 0 31 2981 G 2996 2497
-> 16 0 31 2981 G 2994 2497
-> 15 0 30 2981 G 3091 2498
-> 16 0 30 2981 G 3053 2498
-> 15 0 31 2981 G 3053 2499
-> 16 0 31 2981 G 3051 2499
-> 15 0 30 2981 G 3091 2500
-> 16 0 30 2981 G 3002 2500
-> 15 0 31 2981 G 3002 2501
-> 16 0 31 2981 G 3000 2501
-> 15 0 30 2981 G 3091 2502
-> 16 0 30 2981 G 3059 2502
-> 15 0 31 2981 G 3059 2503
-> 16 0 31 2981 G 3057 2503
-> 15 0 30 2981 G 3091 2504
-> 16 0 30 2981 G 3008 2504
-> 15 0 31 2981 G 3008 2505
-> 16 0 31 2981 G 3006 2505
-> 15 0 30 2981 G 3091 2506
-> 16 0 30 2981 G 3065 2506
-> 15 0 31 2981 G 3065 2507
-> 16 0 31 2981 G 3063 2507
-> 15 0 30 2981 G 3091 2508
-> 16 0 30 2981 G 3014 2508
-> 15 0 31 2981 G 3014 2509
-> 16 0 31 2981 G 3012 2509
-> 15 0 32 2981 G 3091 2510
-> 16 0 32 2981 G 3090 2510
-> 15 0 30 2981 G 3091 2511
-> 16 0 30 2981 G 3071 2511
-> 15 0 31 2981 G 3071 2512
-> 16 0 31 2981 G 3069 2512
-> 15 0 30 2981 G 3091 2513
-> 16 0 30 2981 G 3020 2513
-> 15 0 31 2981 G 3020 2514
-> 16 0 31 2981 G 3018 2514
-> 15 0 30 2981 G 3091 2515
-> 16 0 30 2981 G 3077 2515
-> 15 0 31 2981 G 3077 2516
-> 16 0 31 2981 G 3075 2516
-> 15 0 29 2981 G 3027 2517
-> 16 0 29 2981 G 3028 2517
-> 15 0 30 2981 G 3028 2518
-> 16 0 30 2981 G 3091 2518
-> 15 0 30 2981 G 3091 2519
-> 16 0 30 2981 G 3023 2519
-> 15 0 31 2981 G 3023 2520
-> 16 0 31 2981 G 3021 2520
-> 15 0 29 2981 G 3084 2521
-> 16 0 29 2981 G 3085 2521
-> 15 0 30 2981 G 3085 2522
-> 16 0 30 2981 G 3091 2522
-> 15 0 29 2981 G 3033 2523
-> 16 0 29 2981 G 3034 2523
-> 15 0 30 2981 G 3034 2524
-> 16 0 30 2981 G 3091 2524
-> 15 0 29 2981 G 2982 2525
-> 16 0 29 2981 G 2983 2525
-> 15 0 30 2981 G 2983 2526
-> 16 0 30 2981 G 3091 2526
-> 15 0 29 2981 G 3039 2527
-> 16 0 29 2981 G 3040 2527
-> 15 0 30 2981 G 3040 2528
-> 16 0 30 2981 G 3091 2528
-> 15 0 29 2981 G 2988 2529
-> 16 0 29 2981 G 2989 2529
-> 15 0 30 2981 G 2989 2530
-> 16 0 30 2981 G 3091 2530
-> 15 0 29 2981 G 3045 2531
-> 16 0 29 2981 G 3046 2531
-> 15 0 30 2981 G 3046 2532
-> 16 0 30 2981 G 3091 2532
-> 15 0 29 2981 G 2991 2533
-> 16 0 29 2981 G 2992 2533
-> 15 0 30 2981 G 2992 2534
-> 16 0 30 2981 G 3091 2534
-> 15 0 29 2981 G 2997 2535
-> 16 0 29 2981 G 2998 2535
-> 15 0 30 2981 G 2998 2536
-> 16 0 30 2981 G 3091 2536
-> 15 0 29 2981 G 3054 2537
-> 16 0 29 2981 G 3055 2537
-> 15 0 30 2981 G 3055 2538
-> 16 0 30 2981 G 3091 2538
-> 15 0 29 2981 G 3003 2539
-> 16 0 29 2981 G 3004 2539
-> 15 0 30 2981 G 3004 2540
-> 16 0 30 2981 G 3091 2540
-> 15 0 29 2981 G 3060 2541
-> 16 0 29 2981 G 3061 2541
-> 15 0 30 2981 G 3061 2542
-> 16 0 30 2981 G 3091 2542
-> 15 0 29 2981 G 3009 2543
-> 16 0 29 2981 G 3010 2543
-> 15 0 30 2981 G 3010 2544
-> 16 0 30 2981 G 3091 2544
-> 15 0 29 2981 G 3066 2545
-> 16 0 29 2981 G 3067 2545
-> 15 0 30 2981 G 3067 2546
-> 16 0 30 2981 G 3091 2546
-> 15 0 29 2981 G 3015 2547
-> 16 0 29 2981 G 3016 2547
-> 15 0 30 2981 G 3016 2548
-> 16 0 30 2981 G 3091 2548
-> 15 0 29 2981 G 3072 2549
-> 16 0 29 2981 G 3073 2549
-> 15 0 30 2981 G 3073 2550
-> 16 0 30 2981 G 3091 2550
-> 15 0 29 2981 G 3078 2551
-> 16 0 29 2981 G 3079 2551
-> 15 0 30 2981 G 3079 2552
-> 16 0 30 2981 G 3091 2552
-> 15 0 29 2981 G 3024 2553
-> 16 0 29 2981 G 3025 2553
-> 15 0 30 2981 G 3025 2554
-> 16 0 30 2981 G 3091 2554
-> 15 0 29 2981 G 3081 2555
-> 16 0 29 2981 G 3082 2555
-> 15 0 30 2981 G 3082 2556
-> 16 0 30 2981 G 3091 2556
-> 15 0 29 2981 G 3030 2557
-> 16 0 29 2981 G 3031 2557
-> 15 0 30 2981 G 3031 2558
-> 16 0 30 2981 G 3091 2558
-> 15 0 29 2981 G 3087 2559
-> 16 0 29 2981 G 3088 2559
-> 15 0 30 2981 G 3088 2560
-> 16 0 30 2981 G 3091 2560
-> 15 0 29 2981 G 3036 2561
-> 16 0 29 2981 G 3037 2561
-> 15 0 30 2981 G 3037 2562
-> 16 0 30 2981 G 3091 2562
-> 15 0 29 2981 G 2985 2563
-> 16 0 29 2981 G 2986 2563
-> 15 0 30 2981 G 2986 2564
-> 16 0 30 2981 G 3091 2564
-> 15 0 29 2981 G 3042 2565
-> 16 0 29 2981 G 3043 2565
-> 15 0 30 2981 G 3043 2566
-> 16 0 30 2981 G 3091 2566
-> 15 0 29 2981 G 3048 2567
-> 16 0 29 2981 G 3049 2567
-> 15 0 30 2981 G 3049 2568
-> 16 0 30 2981 G 3091 2568
-> 15 0 29 2981 G 2994 2569
-> 16 0 29 2981 G 2995 2569
-> 15 0 30 2981 G 2995 2570
-> 16 0 30 2981 G 3091 2570
-> 15 0 29 2981 G 3051 2571
-> 16 0 29 2981 G 3052 2571
-> 15 0 30 2981 G 3052 2572
-> 16 0 30 2981 G 3091 2572
-> 15 0 29 2981 G 3000 2573
-> 16 0 29 2981 G 3001 2573
-> 15 0 30 2981 G 3001 2574
-> 16 0 30 2981 G 3091 2574
-> 15 0 29 2981 G 3057 2575
-> 16 0 29 2981 G 3058 2575
-> 15 0 30 2981 G 3058 2576
-> 16 0 30 2981 G 3091 2576
-> 15 0 29 2981 G 3006 2577
-> 16 0 29 2981 G 3007 2577
-> 15 0 30 2981 G 3007 2578
-> 16 0 30 2981 G 3091 2578
-> 15 0 29 2981 G 3063 2579
-> 16 0 29 2981 G 3064 2579
-> 15 0 30 2981 G 3064 2580
-> 16 0 30 2981 G 3091 2580
-> 15 0 29 2981 G 3012 2581
-> 16 0 29 2981 G 3013 2581
-> 15 0 30 2981 G 3013 2582
-> 16 0 30 2981 G 3091 2582
-> 15 0 29 2981 G 3069 2583
-> 16 0 29 2981 G 3070 2583
-> 15 0 30 2981 G 3070 2584
-> 16 0 30 2981 G 3091 2584
-> 15 0 29 2981 G 3018 2585
-> 16 0 29 2981 G 3019 2585
-> 15 0 30 2981 G 3019 2586
-> 16 0 30 2981 G 3091 2586
-> 15 0 29 2981 G 3075 2587
-> 16 0 29 2981 G 3076 2587
-> 15 0 30 2981 G 3076 2588
-> 16 0 30 2981 G 3091 2588
-> 15 0 29 3293 G 3306 2589
-> 16 0 29 3293 G 3307 2589
-> 15 0 30 3293 G 3307 2590
-> 16 0 30 3293 G 3313 2590
-> 15 0 30 3293 G 3313 2591
-> 16 0 30 3293 G 3296 2591
-> 15 0 31 3293 G 3296 2592
-> 16 0 31 3293 G 3294 2592
-> 15 0 30 3293 G 3313 2593
-> 16 0 30 3293 G 3302 2593
-> 15 0 31 3293 G 3302 2594
-> 16 0 31 3293 G 3300 2594
-> 15 0 30 3293 G 3313 2595
-> 16 0 30 3293 G 3305 2595
-> 15 0 31 3293 G 3305 2596
-> 16 0 31 3293 G 3303 2596
-> 15 0 30 3293 G 3313 2597
-> 16 0 30 3293 G 3311 2597
-> 15 0 31 3293 G 3311 2598
-> 16 0 31 3293 G 3309 2598
-> 15 0 32 3293 G 3313 2599
-> 16 0 32 3293 G 3312 2599
-> 15 0 30 3293 G 3313 2600
-> 16 0 30 3293 G 3299 2600
-> 15 0 31 3293 G 3299 2601
-> 16 0 31 3293 G 3297 2601
-> 15 0 29 3293 G 3294 2602
-> 16 0 29 3293 G 3295 2602
-> 15 0 30 3293 G 3295 2603
-> 16 0 30 3293 G 3313 2603
-> 15 0 30 3293 G 3313 2604
-> 16 0 30 3293 G 3308 2604
-> 15 0 31 3293 G 3308 2605
-> 16 0 31 3293 G 3306 2605
-> 15 0 29 3293 G 3300 2606
-> 16 0 29 3293 G 3301 2606
-> 15 0 30 3293 G 3301 2607
-> 16 0 30 3293 G 3313 2607
-> 15 0 29 3293 G 3303 2608
-> 16 0 29 3293 G 3304 2608
-> 15 0 30 3293 G 3304 2609
-> 16 0 30 3293 G 3313 2609
-> 15 0 29 3293 G 3309 2610
-> 16 0 29 3293 G 3310 2610
-> 15 0 30 3293 G 3310 2611
-> 16 0 30 3293 G 3313 2611
-> 15 0 29 3293 G 3297 2612
-> 16 0 29 3293 G 3298 2612
-> 15 0 30 3293 G 3298 2613
-> 16 0 30 3293 G 3313 2613
-> 15 0 29 3203 G 3210 2614
-> 16 0 29 3203 G 3211 2614
-> 15 0 30 3203 G 3211 2615
-> 16 0 30 3203 G 3271 2615
-> 15 0 30 3203 G 3271 2616
-> 16 0 30 3203 G 3218 2616
-> 15 0 31 3203 G 3218 2617
-> 16 0 31 3203 G 3216 2617
-> 15 0 30 3203 G 3271 2618
-> 16 0 30 3203 G 3224 2618
-> 15 0 31 3203 G 3224 2619
-> 16 0 31 3203 G 3222 2619
-> 15 0 30 3203 G 3271 2620
-> 16 0 30 3203 G 3230 2620
-> 15 0 31 3203 G 3230 2621
-> 16 0 31 3203 G 3228 2621
-> 15 0 30 3203 G 3271 2622
-> 16 0 30 3203 G 3236 2622
-> 15 0 31 3203 G 3236 2623
-> 16 0 31 3203 G 3234 2623
-> 15 0 30 3203 G 3271 2624
-> 16 0 30 3203 G 3242 2624
-> 15 0 31 3203 G 3242 2625
-> 16 0 31 3203 G 3240 2625
-> 15 0 30 3203 G 3271 2626
-> 16 0 30 3203 G 3248 2626
-> 15 0 31 3203 G 3248 2627
-> 16 0 31 3203 G 3246 2627
-> 15 0 30 3203 G 3271 2628
-> 16 0 30 3203 G 3254 2628
-> 15 0 31 3203 G 3254 2629
-> 16 0 31 3203 G 3252 2629
-> 15 0 30 3203 G 3271 2630
-> 16 0 30 3203 G 3260 2630
-> 15 0 31 3203 G 3260 2631
-> 16 0 31 3203 G 3258 2631
-> 15 0 30 3203 G 3271 2632
-> 16 0 30 3203 G 3266 2632
-> 15 0 31 3203 G 3266 2633
-> 16 0 31 3203 G 3264 2633
-> 15 0 30 3203 G 3271 2634
-> 16 0 30 3203 G 3206 2634
-> 15 0 31 3203 G 3206 2635
-> 16 0 31 3203 G 3204 2635
-> 15 0 30 3203 G 3271 2636
-> 16 0 30 3203 G 3269 2636
-> 15 0 31 3203 G 3269 2637
-> 16 0 31 3203 G 3267 2637
-> 15 0 32 3203 G 3271 2638
-> 16 0 32 3203 G 3270 2638
-> 15 0 30 3203 G 3271 2639
-> 16 0 30 3203 G 3209 2639
-> 15 0 31 3203 G 3209 2640
-> 16 0 31 3203 G 3207 2640
-> 15 0 30 3203 G 3271 2641
-> 16 0 30 3203 G 3215 2641
-> 15 0 31 3203 G 3215 2642
-> 16 0 31 3203 G 3213 2642
-> 15 0 30 3203 G 3271 2643
-> 16 0 30 3203 G 3221 2643
-> 15 0 31 3203 G 3221 2644
-> 16 0 31 3203 G 3219 2644
-> 15 0 30 3203 G 3271 2645
-> 16 0 30 3203 G 3227 2645
-> 15 0 31 3203 G 3227 2646
-> 16 0 31 3203 G 3225 2646
-> 15 0 30 3203 G 3271 2647
-> 16 0 30 3203 G 3233 2647
-> 15 0 31 3203 G 3233 2648
-> 16 0 31 3203 G 3231 2648
-> 15 0 30 3203 G 3271 2649
-> 16 0 30 3203 G 3239 2649
-> 15 0 31 3203 G 3239 2650
-> 16 0 31 3203 G 3237 2650
-> 15 0 30 3203 G 3271 2651
-> 16 0 30 3203 G 3245 2651
-> 15 0 31 3203 G 3245 2652
-> 16 0 31 3203 G 3243 2652
-> 15 0 30 3203 G 3271 2653
-> 16 0 30 3203 G 3251 2653
-> 15 0 31 3203 G 3251 2654
-> 16 0 31 3203 G 3249 2654
-> 15 0 30 3203 G 3271 2655
-> 16 0 30 3203 G 3257 2655
-> 15 0 31 3203 G 3257 2656
-> 16 0 31 3203 G 3255 2656
-> 15 0 30 3203 G 3271 2657
-> 16 0 30 3203 G 3263 2657
-> 15 0 31 3203 G 3263 2658
-> 16 0 31 3203 G 3261 2658
-> 15 0 29 3203 G 3216 2659
-> 16 0 29 3203 G 3217 2659
-> 15 0 30 3203 G 3217 2660
-> 16 0 30 3203 G 3271 2660
-> 15 0 30 3203 G 3271 2661
-> 16 0 30 3203 G 3212 2661
-> 15 0 31 3203 G 3212 2662
-> 16 0 31 3203 G 3210 2662
-> 15 0 29 3203 G 3222 2663
-> 16 0 29 3203 G 3223 2663
-> 15 0 30 3203 G 3223 2664
-> 16 0 30 3203 G 3271 2664
-> 15 0 29 3203 G 3228 2665
-> 16 0 29 3203 G 3229 2665
-> 15 0 30 3203 G 3229 2666
-> 16 0 30 3203 G 3271 2666
-> 15 0 29 3203 G 3234 2667
-> 16 0 29 3203 G 3235 2667
-> 15 0 30 3203 G 3235 2668
-> 16 0 30 3203 G 3271 2668
-> 15 0 29 3203 G 3240 2669
-> 16 0 29 3203 G 3241 2669
-> 15 0 30 3203 G 3241 2670
-> 16 0 30 3203 G 3271 2670
-> 15 0 29 3203 G 3246 2671
-> 16 0 29 3203 G 3247 2671
-> 15 0 30 3203 G 3247 2672
-> 16 0 30 3203 G 3271 2672
-> 15 0 29 3203 G 3252 2673
-> 16 0 29 3203 G 3253 2673
-> 15 0 30 3203 G 3253 2674
-> 16 0 30 3203 G 3271 2674
-> 15 0 29 3203 G 3258 2675
-> 16 0 29 3203 G 3259 2675
-> 15 0 30 3203 G 3259 2676
-> 16 0 30 3203 G 3271 2676
-> 15 0 29 3203 G 3264 2677
-> 16 0 29 3203 G 3265 2677
-> 15 0 30 3203 G 3265 2678
-> 16 0 30 3203 G 3271 2678
-> 15 0 29 3203 G 3204 2679
-> 16 0 29 3203 G 3205 2679
-> 15 0 30 3203 G 3205 2680
-> 16 0 30 3203 G 3271 2680
-> 15 0 29 3203 G 3267 2681
-> 16 0 29 3203 G 3268 2681
-> 15 0 30 3203 G 3268 2682
-> 16 0 30 3203 G 3271 2682
-> 15 0 29 3203 G 3207 2683
-> 16 0 29 3203 G 3208 2683
-> 15 0 30 3203 G 3208 2684
-> 16 0 30 3203 G 3271 2684
-> 15 0 29 3203 G 3213 2685
-> 16 0 29 3203 G 3214 2685
-> 15 0 30 3203 G 3214 2686
-> 16 0 30 3203 G 3271 2686
-> 15 0 29 3203 G 3219 2687
-> 16 0 29 3203 G 3220 2687
-> 15 0 30 3203 G 3220 2688
-> 16 0 30 3203 G 3271 2688
-> 15 0 29 3203 G 3225 2689
-> 16 0 29 3203 G 3226 2689
-> 15 0 30 3203 G 3226 2690
-> 16 0 30 3203 G 3271 2690
-> 15 0 29 3203 G 3231 2691
-> 16 0 29 3203 G 3232 2691
-> 15 0 30 3203 G 3232 2692
-> 16 0 30 3203 G 3271 2692
-> 15 0 29 3203 G 3237 2693
-> 16 0 29 3203 G 3238 2693
-> 15 0 30 3203 G 3238 2694
-> 16 0 30 3203 G 3271 2694
-> 15 0 29 3203 G 3243 2695
-> 16 0 29 3203 G 3244 2695
-> 15 0 30 3203 G 3244 2696
-> 16 0 30 3203 G 3271 2696
-> 15 0 29 3203 G 3249 2697
-> 16 0 29 3203 G 3250 2697
-> 15 0 30 3203 G 3250 2698
-> 16 0 30 3203 G 3271 2698
-> 15 0 29 3203 G 3255 2699
-> 16 0 29 3203 G 3256 2699
-> 15 0 30 3203 G 3256 2700
-> 16 0 30 3203 G 3271 2700
-> 15 0 29 3203 G 3261 2701
-> 16 0 29 3203 G 3262 2701
-> 15 0 30 3203 G 3262 2702
-> 16 0 30 3203 G 3271 2702
-> 15 0 33 2462 G 2571 2703
-> 16 0 33 2462 G 2572 2703
-> 15 0 30 2462 G 2572 2704
-> 16 0 30 2462 G 2474 2704
-> 15 0 31 2462 G 2474 2705
-> 16 0 31 2462 G 2472 2705
-> 15 0 30 2462 G 2572 2706
-> 16 0 30 2462 G 2480 2706
-> 15 0 31 2462 G 2480 2707
-> 16 0 31 2462 G 2478 2707
-> 15 0 30 2462 G 2572 2708
-> 16 0 30 2462 G 2537 2708
-> 15 0 31 2462 G 2537 2709
-> 16 0 31 2462 G 2535 2709
-> 15 0 30 2462 G 2572 2710
-> 16 0 30 2462 G 2486 2710
-> 15 0 31 2462 G 2486 2711
-> 16 0 31 2462 G 2484 2711
-> 15 0 30 2462 G 2572 2712
-> 16 0 30 2462 G 2543 2712
-> 15 0 31 2462 G 2543 2713
-> 16 0 31 2462 G 2541 2713
-> 15 0 30 2462 G 2572 2714
-> 16 0 30 2462 G 2492 2714
-> 15 0 31 2462 G 2492 2715
-> 16 0 31 2462 G 2490 2715
-> 15 0 30 2462 G 2572 2716
-> 16 0 30 2462 G 2549 2716
-> 15 0 31 2462 G 2549 2717
-> 16 0 31 2462 G 2547 2717
-> 15 0 30 2462 G 2572 2718
-> 16 0 30 2462 G 2498 2718
-> 15 0 31 2462 G 2498 2719
-> 16 0 31 2462 G 2496 2719
-> 15 0 30 2462 G 2572 2720
-> 16 0 30 2462 G 2555 2720
-> 15 0 31 2462 G 2555 2721
-> 16 0 31 2462 G 2553 2721
-> 15 0 30 2462 G 2572 2722
-> 16 0 30 2462 G 2561 2722
-> 15 0 31 2462 G 2561 2723
-> 16 0 31 2462 G 2559 2723
-> 15 0 30 2462 G 2572 2724
-> 16 0 30 2462 G 2507 2724
-> 15 0 31 2462 G 2507 2725
-> 16 0 31 2462 G 2505 2725
-> 15 0 30 2462 G 2572 2726
-> 16 0 30 2462 G 2564 2726
-> 15 0 31 2462 G 2564 2727
-> 16 0 31 2462 G 2562 2727
-> 15 0 30 2462 G 2572 2728
-> 16 0 30 2462 G 2513 2728
-> 15 0 31 2462 G 2513 2729
-> 16 0 31 2462 G 2511 2729
-> 15 0 30 2462 G 2572 2730
-> 16 0 30 2462 G 2570 2730
-> 15 0 31 2462 G 2570 2731
-> 16 0 31 2462 G 2568 2731
-> 15 0 30 2462 G 2572 2732
-> 16 0 30 2462 G 2519 2732
-> 15 0 31 2462 G 2519 2733
-> 16 0 31 2462 G 2517 2733
-> 15 0 30 2462 G 2572 2734
-> 16 0 30 2462 G 2468 2734
-> 15 0 31 2462 G 2468 2735
-> 16 0 31 2462 G 2466 2735
-> 15 0 30 2462 G 2572 2736
-> 16 0 30 2462 G 2525 2736
-> 15 0 31 2462 G 2525 2737
-> 16 0 31 2462 G 2523 2737
-> 15 0 30 2462 G 2572 2738
-> 16 0 30 2462 G 2531 2738
-> 15 0 31 2462 G 2531 2739
-> 16 0 31 2462 G 2529 2739
-> 15 0 30 2462 G 2572 2740
-> 16 0 30 2462 G 2477 2740
-> 15 0 31 2462 G 2477 2741
-> 16 0 31 2462 G 2475 2741
-> 15 0 30 2462 G 2572 2742
-> 16 0 30 2462 G 2534 2742
-> 15 0 31 2462 G 2534 2743
-> 16 0 31 2462 G 2532 2743
-> 15 0 30 2462 G 2572 2744
-> 16 0 30 2462 G 2483 2744
-> 15 0 31 2462 G 2483 2745
-> 16 0 31 2462 G 2481 2745
-> 15 0 30 2462 G 2572 2746
-> 16 0 30 2462 G 2540 2746
-> 15 0 31 2462 G 2540 2747
-> 16 0 31 2462 G 2538 2747
-> 15 0 30 2462 G 2572 2748
-> 16 0 30 2462 G 2489 2748
-> 15 0 31 2462 G 2489 2749
-> 16 0 31 2462 G 2487 2749
-> 15 0 30 2462 G 2572 2750
-> 16 0 30 2462 G 2546 2750
-> 15 0 31 2462 G 2546 2751
-> 16 0 31 2462 G 2544 2751
-> 15 0 30 2462 G 2572 2752
-> 16 0 30 2462 G 2495 2752
-> 15 0 31 2462 G 2495 2753
-> 16 0 31 2462 G 2493 2753
-> 15 0 30 2462 G 2572 2754
-> 16 0 30 2462 G 2552 2754
-> 15 0 31 2462 G 2552 2755
-> 16 0 31 2462 G 2550 2755
-> 15 0 30 2462 G 2572 2756
-> 16 0 30 2462 G 2501 2756
-> 15 0 31 2462 G 2501 2757
-> 16 0 31 2462 G 2499 2757
-> 15 0 30 2462 G 2572 2758
-> 16 0 30 2462 G 2558 2758
-> 15 0 31 2462 G 2558 2759
-> 16 0 31 2462 G 2556 2759
-> 15 0 30 2462 G 2572 2760
-> 16 0 30 2462 G 2504 2760
-> 15 0 31 2462 G 2504 2761
-> 16 0 31 2462 G 2502 2761
-> 15 0 30 2462 G 2572 2762
-> 16 0 30 2462 G 2510 2762
-> 15 0 31 2462 G 2510 2763
-> 16 0 31 2462 G 2508 2763
-> 15 0 30 2462 G 2572 2764
-> 16 0 30 2462 G 2567 2764
-> 15 0 31 2462 G 2567 2765
-> 16 0 31 2462 G 2565 2765
-> 15 0 30 2462 G 2572 2766
-> 16 0 30 2462 G 2516 2766
-> 15 0 31 2462 G 2516 2767
-> 16 0 31 2462 G 2514 2767
-> 15 0 30 2462 G 2572 2768
-> 16 0 30 2462 G 2465 2768
-> 15 0 31 2462 G 2465 2769
-> 16 0 31 2462 G 2463 2769
-> 15 0 30 2462 G 2572 2770
-> 16 0 30 2462 G 2522 2770
-> 15 0 31 2462 G 2522 2771
-> 16 0 31 2462 G 2520 2771
-> 15 0 30 2462 G 2572 2772
-> 16 0 30 2462 G 2471 2772
-> 15 0 31 2462 G 2471 2773
-> 16 0 31 2462 G 2469 2773
-> 15 0 30 2462 G 2572 2774
-> 16 0 30 2462 G 2528 2774
-> 15 0 31 2462 G 2528 2775
-> 16 0 31 2462 G 2526 2775
-> 15 0 29 2462 G 2472 2776
-> 16 0 29 2462 G 2473 2776
-> 15 0 30 2462 G 2473 2777
-> 16 0 30 2462 G 2572 2777
-> 15 0 29 2462 G 2478 2778
-> 16 0 29 2462 G 2479 2778
-> 15 0 30 2462 G 2479 2779
-> 16 0 30 2462 G 2572 2779
-> 15 0 29 2462 G 2535 2780
-> 16 0 29 2462 G 2536 2780
-> 15 0 30 2462 G 2536 2781
-> 16 0 30 2462 G 2572 2781
-> 15 0 29 2462 G 2484 2782
-> 16 0 29 2462 G 2485 2782
-> 15 0 30 2462 G 2485 2783
-> 16 0 30 2462 G 2572 2783
-> 15 0 29 2462 G 2541 2784
-> 16 0 29 2462 G 2542 2784
-> 15 0 30 2462 G 2542 2785
-> 16 0 30 2462 G 2572 2785
-> 15 0 29 2462 G 2490 2786
-> 16 0 29 2462 G 2491 2786
-> 15 0 30 2462 G 2491 2787
-> 16 0 30 2462 G 2572 2787
-> 15 0 29 2462 G 2547 2788
-> 16 0 29 2462 G 2548 2788
-> 15 0 30 2462 G 2548 2789
-> 16 0 30 2462 G 2572 2789
-> 15 0 29 2462 G 2496 2790
-> 16 0 29 2462 G 2497 2790
-> 15 0 30 2462 G 2497 2791
-> 16 0 30 2462 G 2572 2791
-> 15 0 29 2462 G 2553 2792
-> 16 0 29 2462 G 2554 2792
-> 15 0 30 2462 G 2554 2793
-> 16 0 30 2462 G 2572 2793
-> 15 0 29 2462 G 2559 2794
-> 16 0 29 2462 G 2560 2794
-> 15 0 30 2462 G 2560 2795
-> 16 0 30 2462 G 2572 2795
-> 15 0 29 2462 G 2505 2796
-> 16 0 29 2462 G 2506 2796
-> 15 0 30 2462 G 2506 2797
-> 16 0 30 2462 G 2572 2797
-> 15 0 29 2462 G 2562 2798
-> 16 0 29 2462 G 2563 2798
-> 15 0 30 2462 G 2563 2799
-> 16 0 30 2462 G 2572 2799
-> 15 0 29 2462 G 2511 2800
-> 16 0 29 2462 G 2512 2800
-> 15 0 30 2462 G 2512 2801
-> 16 0 30 2462 G 2572 2801
-> 15 0 29 2462 G 2568 2802
-> 16 0 29 2462 G 2569 2802
-> 15 0 30 2462 G 2569 2803
-> 16 0 30 2462 G 2572 2803
-> 15 0 29 2462 G 2517 2804
-> 16 0 29 2462 G 2518 2804
-> 15 0 30 2462 G 2518 2805
-> 16 0 30 2462 G 2572 2805
-> 15 0 29 2462 G 2466 2806
-> 16 0 29 2462 G 2467 2806
-> 15 0 30 2462 G 2467 2807
-> 16 0 30 2462 G 2572 2807
-> 15 0 29 2462 G 2523 2808
-> 16 0 29 2462 G 2524 2808
-> 15 0 30 2462 G 2524 2809
-> 16 0 30 2462 G 2572 2809
-> 15 0 29 2462 G 2529 2810
-> 16 0 29 2462 G 2530 2810
-> 15 0 30 2462 G 2530 2811
-> 16 0 30 2462 G 2572 2811
-> 15 0 29 2462 G 2475 2812
-> 16 0 29 2462 G 2476 2812
-> 15 0 30 2462 G 2476 2813
-> 16 0 30 2462 G 2572 2813
-> 15 0 29 2462 G 2532 2814
-> 16 0 29 2462 G 2533 2814
-> 15 0 30 2462 G 2533 2815
-> 16 0 30 2462 G 2572 2815
-> 15 0 29 2462 G 2481 2816
-> 16 0 29 2462 G 2482 2816
-> 15 0 30 2462 G 2482 2817
-> 16 0 30 2462 G 2572 2817
-> 15 0 29 2462 G 2538 2818
-> 16 0 29 2462 G 2539 2818
-> 15 0 30 2462 G 2539 2819
-> 16 0 30 2462 G 2572 2819
-> 15 0 29 2462 G 2487 2820
-> 16 0 29 2462 G 2488 2820
-> 15 0 30 2462 G 2488 2821
-> 16 0 30 2462 G 2572 2821
-> 15 0 29 2462 G 2544 2822
-> 16 0 29 2462 G 2545 2822
-> 15 0 30 2462 G 2545 2823
-> 16 0 30 2462 G 2572 2823
-> 15 0 29 2462 G 2493 2824
-> 16 0 29 2462 G 2494 2824
-> 15 0 30 2462 G 2494 2825
-> 16 0 30 2462 G 2572 2825
-> 15 0 29 2462 G 2550 2826
-> 16 0 29 2462 G 2551 2826
-> 15 0 30 2462 G 2551 2827
-> 16 0 30 2462 G 2572 2827
-> 15 0 29 2462 G 2499 2828
-> 16 0 29 2462 G 2500 2828
-> 15 0 30 2462 G 2500 2829
-> 16 0 30 2462 G 2572 2829
-> 15 0 29 2462 G 2556 2830
-> 16 0 29 2462 G 2557 2830
-> 15 0 30 2462 G 2557 2831
-> 16 0 30 2462 G 2572 2831
-> 15 0 29 2462 G 2502 2832
-> 16 0 29 2462 G 2503 2832
-> 15 0 30 2462 G 2503 2833
-> 16 0 30 2462 G 2572 2833
-> 15 0 29 2462 G 2508 2834
-> 16 0 29 2462 G 2509 2834
-> 15 0 30 2462 G 2509 2835
-> 16 0 30 2462 G 2572 2835
-> 15 0 29 2462 G 2565 2836
-> 16 0 29 2462 G 2566 2836
-> 15 0 30 2462 G 2566 2837
-> 16 0 30 2462 G 2572 2837
-> 15 0 29 2462 G 2514 2838
-> 16 0 29 2462 G 2515 2838
-> 15 0 30 2462 G 2515 2839
-> 16 0 30 2462 G 2572 2839
-> 15 0 29 2462 G 2463 2840
-> 16 0 29 2462 G 2464 2840
-> 15 0 30 2462 G 2464 2841
-> 16 0 30 2462 G 2572 2841
-> 15 0 29 2462 G 2520 2842
-> 16 0 29 2462 G 2521 2842
-> 15 0 30 2462 G 2521 2843
-> 16 0 30 2462 G 2572 2843
-> 15 0 29 2462 G 2469 2844
-> 16 0 29 2462 G 2470 2844
-> 15 0 30 2462 G 2470 2845
-> 16 0 30 2462 G 2572 2845
-> 15 0 29 2462 G 2526 2846
-> 16 0 29 2462 G 2527 2846
-> 15 0 30 2462 G 2527 2847
-> 16 0 30 2462 G 2572 2847
-> 15 0 29 2684 G 2691 2848
-> 16 0 29 2684 G 2692 2848
-> 15 0 30 2684 G 2692 2849
-> 16 0 30 2684 G 2794 2849
-> 15 0 30 2684 G 2794 2850
-> 16 0 30 2684 G 2750 2850
-> 15 0 31 2684 G 2750 2851
-> 16 0 31 2684 G 2748 2851
-> 15 0 30 2684 G 2794 2852
-> 16 0 30 2684 G 2699 2852
-> 15 0 31 2684 G 2699 2853
-> 16 0 31 2684 G 2697 2853
-> 15 0 30 2684 G 2794 2854
-> 16 0 30 2684 G 2756 2854
-> 15 0 31 2684 G 2756 2855
-> 16 0 31 2684 G 2754 2855
-> 15 0 30 2684 G 2794 2856
-> 16 0 30 2684 G 2705 2856
-> 15 0 31 2684 G 2705 2857
-> 16 0 31 2684 G 2703 2857
-> 15 0 30 2684 G 2794 2858
-> 16 0 30 2684 G 2762 2858
-> 15 0 31 2684 G 2762 2859
-> 16 0 31 2684 G 2760 2859
-> 15 0 30 2684 G 2794 2860
-> 16 0 30 2684 G 2711 2860
-> 15 0 31 2684 G 2711 2861
-> 16 0 31 2684 G 2709 2861
-> 15 0 30 2684 G 2794 2862
-> 16 0 30 2684 G 2768 2862
-> 15 0 31 2684 G 2768 2863
-> 16 0 31 2684 G 2766 2863
-> 15 0 30 2684 G 2794 2864
-> 16 0 30 2684 G 2717 2864
-> 15 0 31 2684 G 2717 2865
-> 16 0 31 2684 G 2715 2865
-> 15 0 30 2684 G 2794 2866
-> 16 0 30 2684 G 2774 2866
-> 15 0 31 2684 G 2774 2867
-> 16 0 31 2684 G 2772 2867
-> 15 0 30 2684 G 2794 2868
-> 16 0 30 2684 G 2720 2868
-> 15 0 31 2684 G 2720 2869
-> 16 0 31 2684 G 2718 2869
-> 15 0 30 2684 G 2794 2870
-> 16 0 30 2684 G 2726 2870
-> 15 0 31 2684 G 2726 2871
-> 16 0 31 2684 G 2724 2871
-> 15 0 30 2684 G 2794 2872
-> 16 0 30 2684 G 2783 2872
-> 15 0 31 2684 G 2783 2873
-> 16 0 31 2684 G 2781 2873
-> 15 0 30 2684 G 2794 2874
-> 16 0 30 2684 G 2732 2874
-> 15 0 31 2684 G 2732 2875
-> 16 0 31 2684 G 2730 2875
-> 15 0 30 2684 G 2794 2876
-> 16 0 30 2684 G 2789 2876
-> 15 0 31 2684 G 2789 2877
-> 16 0 31 2684 G 2787 2877
-> 15 0 30 2684 G 2794 2878
-> 16 0 30 2684 G 2738 2878
-> 15 0 31 2684 G 2738 2879
-> 16 0 31 2684 G 2736 2879
-> 15 0 30 2684 G 2794 2880
-> 16 0 30 2684 G 2687 2880
-> 15 0 31 2684 G 2687 2881
-> 16 0 31 2684 G 2685 2881
-> 15 0 30 2684 G 2794 2882
-> 16 0 30 2684 G 2744 2882
-> 15 0 31 2684 G 2744 2883
-> 16 0 31 2684 G 2742 2883
-> 15 0 30 2684 G 2794 2884
-> 16 0 30 2684 G 2690 2884
-> 15 0 31 2684 G 2690 2885
-> 16 0 31 2684 G 2688 2885
-> 15 0 30 2684 G 2794 2886
-> 16 0 30 2684 G 2696 2886
-> 15 0 31 2684 G 2696 2887
-> 16 0 31 2684 G 2694 2887
-> 15 0 30 2684 G 2794 2888
-> 16 0 30 2684 G 2753 2888
-> 15 0 31 2684 G 2753 2889
-> 16 0 31 2684 G 2751 2889
-> 15 0 30 2684 G 2794 2890
-> 16 0 30 2684 G 2702 2890
-> 15 0 31 2684 G 2702 2891
-> 16 0 31 2684 G 2700 2891
-> 15 0 30 2684 G 2794 2892
-> 16 0 30 2684 G 2759 2892
-> 15 0 31 2684 G 2759 2893
-> 16 0 31 2684 G 2757 2893
-> 15 0 30 2684 G 2794 2894
-> 16 0 30 2684 G 2708 2894
-> 15 0 31 2684 G 2708 2895
-> 16 0 31 2684 G 2706 2895
-> 15 0 32 2684 G 2794 2896
-> 16 0 32 2684 G 2793 2896
-> 15 0 30 2684 G 2794 2897
-> 16 0 30 2684 G 2765 2897
-> 15 0 31 2684 G 2765 2898
-> 16 0 31 2684 G 2763 2898
-> 15 0 30 2684 G 2794 2899
-> 16 0 30 2684 G 2714 2899
-> 15 0 31 2684 G 2714 2900
-> 16 0 31 2684 G 2712 2900
-> 15 0 30 2684 G 2794 2901
-> 16 0 30 2684 G 2771 2901
-> 15 0 31 2684 G 2771 2902
-> 16 0 31 2684 G 2769 2902
-> 15 0 30 2684 G 2794 2903
-> 16 0 30 2684 G 2777 2903
-> 15 0 31 2684 G 2777 2904
-> 16 0 31 2684 G 2775 2904
-> 15 0 30 2684 G 2794 2905
-> 16 0 30 2684 G 2723 2905
-> 15 0 31 2684 G 2723 2906
-> 16 0 31 2684 G 2721 2906
-> 15 0 30 2684 G 2794 2907
-> 16 0 30 2684 G 2780 2907
-> 15 0 31 2684 G 2780 2908
-> 16 0 31 2684 G 2778 2908
-> 15 0 30 2684 G 2794 2909
-> 16 0 30 2684 G 2729 2909
-> 15 0 31 2684 G 2729 2910
-> 16 0 31 2684 G 2727 2910
-> 15 0 30 2684 G 2794 2911
-> 16 0 30 2684 G 2786 2911
-> 15 0 31 2684 G 2786 2912
-> 16 0 31 2684 G 2784 2912
-> 15 0 30 2684 G 2794 2913
-> 16 0 30 2684 G 2735 2913
-> 15 0 31 2684 G 2735 2914
-> 16 0 31 2684 G 2733 2914
-> 15 0 30 2684 G 2794 2915
-> 16 0 30 2684 G 2792 2915
-> 15 0 31 2684 G 2792 2916
-> 16 0 31 2684 G 2790 2916
-> 15 0 30 2684 G 2794 2917
-> 16 0 30 2684 G 2741 2917
-> 15 0 31 2684 G 2741 2918
-> 16 0 31 2684 G 2739 2918
-> 15 0 30 2684 G 2794 2919
-> 16 0 30 2684 G 2747 2919
-> 15 0 31 2684 G 2747 2920
-> 16 0 31 2684 G 2745 2920
-> 15 0 29 2684 G 2748 2921
-> 16 0 29 2684 G 2749 2921
-> 15 0 30 2684 G 2749 2922
-> 16 0 30 2684 G 2794 2922
-> 15 0 30 2684 G 2794 2923
-> 16 0 30 2684 G 2693 2923
-> 15 0 31 2684 G 2693 2924
-> 16 0 31 2684 G 2691 2924
-> 15 0 29 2684 G 2697 2925
-> 16 0 29 2684 G 2698 2925
-> 15 0 30 2684 G 2698 2926
-> 16 0 30 2684 G 2794 2926
-> 15 0 29 2684 G 2754 2927
-> 16 0 29 2684 G 2755 2927
-> 15 0 30 2684 G 2755 2928
-> 16 0 30 2684 G 2794 2928
-> 15 0 29 2684 G 2703 2929
-> 16 0 29 2684 G 2704 2929
-> 15 0 30 2684 G 2704 2930
-> 16 0 30 2684 G 2794 2930
-> 15 0 29 2684 G 2760 2931
-> 16 0 29 2684 G 2761 2931
-> 15 0 30 2684 G 2761 2932
-> 16 0 30 2684 G 2794 2932
-> 15 0 29 2684 G 2709 2933
-> 16 0 29 2684 G 2710 2933
-> 15 0 30 2684 G 2710 2934
-> 16 0 30 2684 G 2794 2934
-> 15 0 29 2684 G 2766 2935
-> 16 0 29 2684 G 2767 2935
-> 15 0 30 2684 G 2767 2936
-> 16 0 30 2684 G 2794 2936
-> 15 0 29 2684 G 2715 2937
-> 16 0 29 2684 G 2716 2937
-> 15 0 30 2684 G 2716 2938
-> 16 0 30 2684 G 2794 2938
-> 15 0 29 2684 G 2772 2939
-> 16 0 29 2684 G 2773 2939
-> 15 0 30 2684 G 2773 2940
-> 16 0 30 2684 G 2794 2940
-> 15 0 29 2684 G 2718 2941
-> 16 0 29 2684 G 2719 2941
-> 15 0 30 2684 G 2719 2942
-> 16 0 30 2684 G 2794 2942
-> 15 0 29 2684 G 2724 2943
-> 16 0 29 2684 G 2725 2943
-> 15 0 30 2684 G 2725 2944
-> 16 0 30 2684 G 2794 2944
-> 15 0 29 2684 G 2781 2945
-> 16 0 29 2684 G 2782 2945
-> 15 0 30 2684 G 2782 2946
-> 16 0 30 2684 G 2794 2946
-> 15 0 29 2684 G 2730 2947
-> 16 0 29 2684 G 2731 2947
-> 15 0 30 2684 G 2731 2948
-> 16 0 30 2684 G 2794 2948
-> 15 0 29 2684 G 2787 2949
-> 16 0 29 2684 G 2788 2949
-> 15 0 30 2684 G 2788 2950
-> 16 0 30 2684 G 2794 2950
-> 15 0 29 2684 G 2736 2951
-> 16 0 29 2684 G 2737 2951
-> 15 0 30 2684 G 2737 2952
-> 16 0 30 2684 G 2794 2952
-> 15 0 29 2684 G 2685 2953
-> 16 0 29 2684 G 2686 2953
-> 15 0 30 2684 G 2686 2954
-> 16 0 30 2684 G 2794 2954
-> 15 0 29 2684 G 2742 2955
-> 16 0 29 2684 G 2743 2955
-> 15 0 30 2684 G 2743 2956
-> 16 0 30 2684 G 2794 2956
-> 15 0 29 2684 G 2688 2957
-> 16 0 29 2684 G 2689 2957
-> 15 0 30 2684 G 2689 2958
-> 16 0 30 2684 G 2794 2958
-> 15 0 29 2684 G 2694 2959
-> 16 0 29 2684 G 2695 2959
-> 15 0 30 2684 G 2695 2960
-> 16 0 30 2684 G 2794 2960
-> 15 0 29 2684 G 2751 2961
-> 16 0 29 2684 G 2752 2961
-> 15 0 30 2684 G 2752 2962
-> 16 0 30 2684 G 2794 2962
-> 15 0 29 2684 G 2700 2963
-> 16 0 29 2684 G 2701 2963
-> 15 0 30 2684 G 2701 2964
-> 16 0 30 2684 G 2794 2964
-> 15 0 29 2684 G 2757 2965
-> 16 0 29 2684 G 2758 2965
-> 15 0 30 2684 G 2758 2966
-> 16 0 30 2684 G 2794 2966
-> 15 0 29 2684 G 2706 2967
-> 16 0 29 2684 G 2707 2967
-> 15 0 30 2684 G 2707 2968
-> 16 0 30 2684 G 2794 2968
-> 15 0 29 2684 G 2763 2969
-> 16 0 29 2684 G 2764 2969
-> 15 0 30 2684 G 2764 2970
-> 16 0 30 2684 G 2794 2970
-> 15 0 29 2684 G 2712 2971
-> 16 0 29 2684 G 2713 2971
-> 15 0 30 2684 G 2713 2972
-> 16 0 30 2684 G 2794 2972
-> 15 0 29 2684 G 2769 2973
-> 16 0 29 2684 G 2770 2973
-> 15 0 30 2684 G 2770 2974
-> 16 0 30 2684 G 2794 2974
-> 15 0 29 2684 G 2775 2975
-> 16 0 29 2684 G 2776 2975
-> 15 0 30 2684 G 2776 2976
-> 16 0 30 2684 G 2794 2976
-> 15 0 29 2684 G 2721 2977
-> 16 0 29 2684 G 2722 2977
-> 15 0 30 2684 G 2722 2978
-> 16 0 30 2684 G 2794 2978
-> 15 0 29 2684 G 2778 2979
-> 16 0 29 2684 G 2779 2979
-> 15 0 30 2684 G 2779 2980
-> 16 0 30 2684 G 2794 2980
-> 15 0 29 2684 G 2727 2981
-> 16 0 29 2684 G 2728 2981
-> 15 0 30 2684 G 2728 2982
-> 16 0 30 2684 G 2794 2982
-> 15 0 29 2684 G 2784 2983
-> 16 0 29 2684 G 2785 2983
-> 15 0 30 2684 G 2785 2984
-> 16 0 30 2684 G 2794 2984
-> 15 0 29 2684 G 2733 2985
-> 16 0 29 2684 G 2734 2985
-> 15 0 30 2684 G 2734 2986
-> 16 0 30 2684 G 2794 2986
-> 15 0 29 2684 G 2790 2987
-> 16 0 29 2684 G 2791 2987
-> 15 0 30 2684 G 2791 2988
-> 16 0 30 2684 G 2794 2988
-> 15 0 29 2684 G 2739 2989
-> 16 0 29 2684 G 2740 2989
-> 15 0 30 2684 G 2740 2990
-> 16 0 30 2684 G 2794 2990
-> 15 0 29 2684 G 2745 2991
-> 16 0 29 2684 G 2746 2991
-> 15 0 30 2684 G 2746 2992
-> 16 0 30 2684 G 2794 2992
-> 15 0 29 2906 G 2961 2993
-> 16 0 29 2906 G 2962 2993
-> 15 0 30 2906 G 2962 2994
-> 16 0 30 2906 G 2980 2994
-> 15 0 30 2906 G 2980 2995
-> 16 0 30 2906 G 2969 2995
-> 15 0 31 2906 G 2969 2996
-> 16 0 31 2906 G 2967 2996
-> 15 0 30 2906 G 2980 2997
-> 16 0 30 2906 G 2975 2997
-> 15 0 31 2906 G 2975 2998
-> 16 0 31 2906 G 2973 2998
-> 15 0 32 2906 G 2980 2999
-> 16 0 32 2906 G 2979 2999
-> 15 0 30 2906 G 2980 3000
-> 16 0 30 2906 G 2909 3000
-> 15 0 31 2906 G 2909 3001
-> 16 0 31 2906 G 2907 3001
-> 15 0 30 2906 G 2980 3002
-> 16 0 30 2906 G 2915 3002
-> 15 0 31 2906 G 2915 3003
-> 16 0 31 2906 G 2913 3003
-> 15 0 30 2906 G 2980 3004
-> 16 0 30 2906 G 2921 3004
-> 15 0 31 2906 G 2921 3005
-> 16 0 31 2906 G 2919 3005
-> 15 0 30 2906 G 2980 3006
-> 16 0 30 2906 G 2927 3006
-> 15 0 31 2906 G 2927 3007
-> 16 0 31 2906 G 2925 3007
-> 15 0 30 2906 G 2980 3008
-> 16 0 30 2906 G 2933 3008
-> 15 0 31 2906 G 2933 3009
-> 16 0 31 2906 G 2931 3009
-> 15 0 30 2906 G 2980 3010
-> 16 0 30 2906 G 2939 3010
-> 15 0 31 2906 G 2939 3011
-> 16 0 31 2906 G 2937 3011
-> 15 0 30 2906 G 2980 3012
-> 16 0 30 2906 G 2945 3012
-> 15 0 31 2906 G 2945 3013
-> 16 0 31 2906 G 2943 3013
-> 15 0 30 2906 G 2980 3014
-> 16 0 30 2906 G 2951 3014
-> 15 0 31 2906 G 2951 3015
-> 16 0 31 2906 G 2949 3015
-> 15 0 30 2906 G 2980 3016
-> 16 0 30 2906 G 2957 3016
-> 15 0 31 2906 G 2957 3017
-> 16 0 31 2906 G 2955 3017
-> 15 0 30 2906 G 2980 3018
-> 16 0 30 2906 G 2960 3018
-> 15 0 31 2906 G 2960 3019
-> 16 0 31 2906 G 2958 3019
-> 15 0 30 2906 G 2980 3020
-> 16 0 30 2906 G 2966 3020
-> 15 0 31 2906 G 2966 3021
-> 16 0 31 2906 G 2964 3021
-> 15 0 30 2906 G 2980 3022
-> 16 0 30 2906 G 2972 3022
-> 15 0 31 2906 G 2972 3023
-> 16 0 31 2906 G 2970 3023
-> 15 0 30 2906 G 2980 3024
-> 16 0 30 2906 G 2978 3024
-> 15 0 31 2906 G 2978 3025
-> 16 0 31 2906 G 2976 3025
-> 15 0 30 2906 G 2980 3026
-> 16 0 30 2906 G 2912 3026
-> 15 0 31 2906 G 2912 3027
-> 16 0 31 2906 G 2910 3027
-> 15 0 30 2906 G 2980 3028
-> 16 0 30 2906 G 2918 3028
-> 15 0 31 2906 G 2918 3029
-> 16 0 31 2906 G 2916 3029
-> 15 0 30 2906 G 2980 3030
-> 16 0 30 2906 G 2924 3030
-> 15 0 31 2906 G 2924 3031
-> 16 0 31 2906 G 2922 3031
-> 15 0 30 2906 G 2980 3032
-> 16 0 30 2906 G 2930 3032
-> 15 0 31 2906 G 2930 3033
-> 16 0 31 2906 G 2928 3033
-> 15 0 30 2906 G 2980 3034
-> 16 0 30 2906 G 2936 3034
-> 15 0 31 2906 G 2936 3035
-> 16 0 31 2906 G 2934 3035
-> 15 0 30 2906 G 2980 3036
-> 16 0 30 2906 G 2942 3036
-> 15 0 31 2906 G 2942 3037
-> 16 0 31 2906 G 2940 3037
-> 15 0 30 2906 G 2980 3038
-> 16 0 30 2906 G 2948 3038
-> 15 0 31 2906 G 2948 3039
-> 16 0 31 2906 G 2946 3039
-> 15 0 30 2906 G 2980 3040
-> 16 0 30 2906 G 2954 3040
-> 15 0 31 2906 G 2954 3041
-> 16 0 31 2906 G 2952 3041
-> 15 0 29 2906 G 2967 3042
-> 16 0 29 2906 G 2968 3042
-> 15 0 30 2906 G 2968 3043
-> 16 0 30 2906 G 2980 3043
-> 15 0 30 2906 G 2980 3044
-> 16 0 30 2906 G 2963 3044
-> 15 0 31 2906 G 2963 3045
-> 16 0 31 2906 G 2961 3045
-> 15 0 29 2906 G 2973 3046
-> 16 0 29 2906 G 2974 3046
-> 15 0 30 2906 G 2974 3047
-> 16 0 30 2906 G 2980 3047
-> 15 0 29 2906 G 2907 3048
-> 16 0 29 2906 G 2908 3048
-> 15 0 30 2906 G 2908 3049
-> 16 0 30 2906 G 2980 3049
-> 15 0 29 2906 G 2913 3050
-> 16 0 29 2906 G 2914 3050
-> 15 0 30 2906 G 2914 3051
-> 16 0 30 2906 G 2980 3051
-> 15 0 29 2906 G 2919 3052
-> 16 0 29 2906 G 2920 3052
-> 15 0 30 2906 G 2920 3053
-> 16 0 30 2906 G 2980 3053
-> 15 0 29 2906 G 2925 3054
-> 16 0 29 2906 G 2926 3054
-> 15 0 30 2906 G 2926 3055
-> 16 0 30 2906 G 2980 3055
-> 15 0 29 2906 G 2931 3056
-> 16 0 29 2906 G 2932 3056
-> 15 0 30 2906 G 2932 3057
-> 16 0 30 2906 G 2980 3057
-> 15 0 29 2906 G 2937 3058
-> 16 0 29 2906 G 2938 3058
-> 15 0 30 2906 G 2938 3059
-> 16 0 30 2906 G 2980 3059
-> 15 0 29 2906 G 2943 3060
-> 16 0 29 2906 G 2944 3060
-> 15 0 30 2906 G 2944 3061
-> 16 0 30 2906 G 2980 3061
-> 15 0 29 2906 G 2949 3062
-> 16 0 29 2906 G 2950 3062
-> 15 0 30 2906 G 2950 3063
-> 16 0 30 2906 G 2980 3063
-> 15 0 29 2906 G 2955 3064
-> 16 0 29 2906 G 2956 3064
-> 15 0 30 2906 G 2956 3065
-> 16 0 30 2906 G 2980 3065
-> 15 0 29 2906 G 2958 3066
-> 16 0 29 2906 G 2959 3066
-> 15 0 30 2906 G 2959 3067
-> 16 0 30 2906 G 2980 3067
-> 15 0 29 2906 G 2964 3068
-> 16 0 29 2906 G 2965 3068
-> 15 0 30 2906 G 2965 3069
-> 16 0 30 2906 G 2980 3069
-> 15 0 29 2906 G 2970 3070
-> 16 0 29 2906 G 2971 3070
-> 15 0 30 2906 G 2971 3071
-> 16 0 30 2906 G 2980 3071
-> 15 0 29 2906 G 2976 3072
-> 16 0 29 2906 G 2977 3072
-> 15 0 30 2906 G 2977 3073
-> 16 0 30 2906 G 2980 3073
-> 15 0 29 2906 G 2910 3074
-> 16 0 29 2906 G 2911 3074
-> 15 0 30 2906 G 2911 3075
-> 16 0 30 2906 G 2980 3075
-> 15 0 29 2906 G 2916 3076
-> 16 0 29 2906 G 2917 3076
-> 15 0 30 2906 G 2917 3077
-> 16 0 30 2906 G 2980 3077
-> 15 0 29 2906 G 2922 3078
-> 16 0 29 2906 G 2923 3078
-> 15 0 30 2906 G 2923 3079
-> 16 0 30 2906 G 2980 3079
-> 15 0 29 2906 G 2928 3080
-> 16 0 29 2906 G 2929 3080
-> 15 0 30 2906 G 2929 3081
-> 16 0 30 2906 G 2980 3081
-> 15 0 29 2906 G 2934 3082
-> 16 0 29 2906 G 2935 3082
-> 15 0 30 2906 G 2935 3083
-> 16 0 30 2906 G 2980 3083
-> 15 0 29 2906 G 2940 3084
-> 16 0 29 2906 G 2941 3084
-> 15 0 30 2906 G 2941 3085
-> 16 0 30 2906 G 2980 3085
-> 15 0 29 2906 G 2946 3086
-> 16 0 29 2906 G 2947 3086
-> 15 0 30 2906 G 2947 3087
-> 16 0 30 2906 G 2980 3087
-> 15 0 29 2906 G 2952 3088
-> 16 0 29 2906 G 2953 3088
-> 15 0 30 2906 G 2953 3089
-> 16 0 30 2906 G 2980 3089
-> 15 0 34 2350 G 3201 3090
-> 16 0 34 2350 G 3316 3090
-> 15 0 35 2350 G 3316 3091
-> 16 0 35 2350 G 3291 3091
-> 15 0 35 2350 G 3316 3092
-> 16 0 35 2350 G 2460 3092
-> 15 0 35 2350 G 3316 3093
-> 16 0 35 2350 G 2682 3093
-> 15 0 35 2350 G 3316 3094
-> 16 0 35 2350 G 2904 3094
-> 15 0 35 2350 G 3316 3095
-> 16 0 35 2350 G 3090 3095
-> 15 0 35 2350 G 3316 3096
-> 16 0 35 2350 G 3312 3096
-> 15 0 35 2350 G 3316 3097
-> 16 0 35 2350 G 3270 3097
-> 15 0 35 2350 G 3316 3098
-> 16 0 35 2350 G 3315 3098
-> 15 0 35 2350 G 3316 3099
-> 16 0 35 2350 G 2571 3099
-> 15 0 35 2350 G 3316 3100
-> 16 0 35 2350 G 2793 3100
-> 15 0 35 2350 G 3316 3101
-> 16 0 35 2350 G 2979 3101
-> 15 0 27 2349 G 3409 3102
-> 16 0 27 2349 G 3411 3102
-> 15 0 28 2349 G 3411 3103
-> 16 0 28 2349 G 3413 3103
-> 15 0 21 2349 G 3411 3104
-> 16 0 21 2349 G 3317 3104
-> 15 0 36 2349 G 3317 3105
-> 16 0 36 2349 G 3315 3105
-> 15 0 27 2349 G 3413 3106
-> 16 0 27 2349 G 3317 3106
-> 15 0 29 1608 G 1636 3107
-> 16 0 29 1608 G 1637 3107
-> 15 0 30 1608 G 1637 3108
-> 16 0 30 1608 G 1727 3108
-> 15 0 32 1608 G 1727 3109
-> 16 0 32 1608 G 1726 3109
-> 15 0 30 1608 G 1727 3110
-> 16 0 30 1608 G 1644 3110
-> 15 0 31 1608 G 1644 3111
-> 16 0 31 1608 G 1642 3111
-> 15 0 30 1608 G 1727 3112
-> 16 0 30 1608 G 1701 3112
-> 15 0 31 1608 G 1701 3113
-> 16 0 31 1608 G 1699 3113
-> 15 0 30 1608 G 1727 3114
-> 16 0 30 1608 G 1650 3114
-> 15 0 31 1608 G 1650 3115
-> 16 0 31 1608 G 1648 3115
-> 15 0 30 1608 G 1727 3116
-> 16 0 30 1608 G 1707 3116
-> 15 0 31 1608 G 1707 3117
-> 16 0 31 1608 G 1705 3117
-> 15 0 30 1608 G 1727 3118
-> 16 0 30 1608 G 1656 3118
-> 15 0 31 1608 G 1656 3119
-> 16 0 31 1608 G 1654 3119
-> 15 0 30 1608 G 1727 3120
-> 16 0 30 1608 G 1713 3120
-> 15 0 31 1608 G 1713 3121
-> 16 0 31 1608 G 1711 3121
-> 15 0 30 1608 G 1727 3122
-> 16 0 30 1608 G 1662 3122
-> 15 0 31 1608 G 1662 3123
-> 16 0 31 1608 G 1660 3123
-> 15 0 30 1608 G 1727 3124
-> 16 0 30 1608 G 1719 3124
-> 15 0 31 1608 G 1719 3125
-> 16 0 31 1608 G 1717 3125
-> 15 0 30 1608 G 1727 3126
-> 16 0 30 1608 G 1725 3126
-> 15 0 31 1608 G 1725 3127
-> 16 0 31 1608 G 1723 3127
-> 15 0 30 1608 G 1727 3128
-> 16 0 30 1608 G 1671 3128
-> 15 0 31 1608 G 1671 3129
-> 16 0 31 1608 G 1669 3129
-> 15 0 30 1608 G 1727 3130
-> 16 0 30 1608 G 1677 3130
-> 15 0 31 1608 G 1677 3131
-> 16 0 31 1608 G 1675 3131
-> 15 0 30 1608 G 1727 3132
-> 16 0 30 1608 G 1683 3132
-> 15 0 31 1608 G 1683 3133
-> 16 0 31 1608 G 1681 3133
-> 15 0 30 1608 G 1727 3134
-> 16 0 30 1608 G 1689 3134
-> 15 0 31 1608 G 1689 3135
-> 16 0 31 1608 G 1687 3135
-> 15 0 30 1608 G 1727 3136
-> 16 0 30 1608 G 1695 3136
-> 15 0 31 1608 G 1695 3137
-> 16 0 31 1608 G 1693 3137
-> 15 0 30 1608 G 1727 3138
-> 16 0 30 1608 G 1611 3138
-> 15 0 31 1608 G 1611 3139
-> 16 0 31 1608 G 1609 3139
-> 15 0 30 1608 G 1727 3140
-> 16 0 30 1608 G 1617 3140
-> 15 0 31 1608 G 1617 3141
-> 16 0 31 1608 G 1615 3141
-> 15 0 30 1608 G 1727 3142
-> 16 0 30 1608 G 1623 3142
-> 15 0 31 1608 G 1623 3143
-> 16 0 31 1608 G 1621 3143
-> 15 0 30 1608 G 1727 3144
-> 16 0 30 1608 G 1629 3144
-> 15 0 31 1608 G 1629 3145
-> 16 0 31 1608 G 1627 3145
-> 15 0 30 1608 G 1727 3146
-> 16 0 30 1608 G 1635 3146
-> 15 0 31 1608 G 1635 3147
-> 16 0 31 1608 G 1633 3147
-> 15 0 30 1608 G 1727 3148
-> 16 0 30 1608 G 1641 3148
-> 15 0 31 1608 G 1641 3149
-> 16 0 31 1608 G 1639 3149
-> 15 0 30 1608 G 1727 3150
-> 16 0 30 1608 G 1698 3150
-> 15 0 31 1608 G 1698 3151
-> 16 0 31 1608 G 1696 3151
-> 15 0 30 1608 G 1727 3152
-> 16 0 30 1608 G 1647 3152
-> 15 0 31 1608 G 1647 3153
-> 16 0 31 1608 G 1645 3153
-> 15 0 30 1608 G 1727 3154
-> 16 0 30 1608 G 1704 3154
-> 15 0 31 1608 G 1704 3155
-> 16 0 31 1608 G 1702 3155
-> 15 0 30 1608 G 1727 3156
-> 16 0 30 1608 G 1653 3156
-> 15 0 31 1608 G 1653 3157
-> 16 0 31 1608 G 1651 3157
-> 15 0 30 1608 G 1727 3158
-> 16 0 30 1608 G 1710 3158
-> 15 0 31 1608 G 1710 3159
-> 16 0 31 1608 G 1708 3159
-> 15 0 30 1608 G 1727 3160
-> 16 0 30 1608 G 1659 3160
-> 15 0 31 1608 G 1659 3161
-> 16 0 31 1608 G 1657 3161
-> 15 0 30 1608 G 1727 3162
-> 16 0 30 1608 G 1716 3162
-> 15 0 31 1608 G 1716 3163
-> 16 0 31 1608 G 1714 3163
-> 15 0 30 1608 G 1727 3164
-> 16 0 30 1608 G 1665 3164
-> 15 0 31 1608 G 1665 3165
-> 16 0 31 1608 G 1663 3165
-> 15 0 30 1608 G 1727 3166
-> 16 0 30 1608 G 1722 3166
-> 15 0 31 1608 G 1722 3167
-> 16 0 31 1608 G 1720 3167
-> 15 0 30 1608 G 1727 3168
-> 16 0 30 1608 G 1668 3168
-> 15 0 31 1608 G 1668 3169
-> 16 0 31 1608 G 1666 3169
-> 15 0 30 1608 G 1727 3170
-> 16 0 30 1608 G 1674 3170
-> 15 0 31 1608 G 1674 3171
-> 16 0 31 1608 G 1672 3171
-> 15 0 30 1608 G 1727 3172
-> 16 0 30 1608 G 1680 3172
-> 15 0 31 1608 G 1680 3173
-> 16 0 31 1608 G 1678 3173
-> 15 0 30 1608 G 1727 3174
-> 16 0 30 1608 G 1686 3174
-> 15 0 31 1608 G 1686 3175
-> 16 0 31 1608 G 1684 3175
-> 15 0 30 1608 G 1727 3176
-> 16 0 30 1608 G 1692 3176
-> 15 0 31 1608 G 1692 3177
-> 16 0 31 1608 G 1690 3177
-> 15 0 30 1608 G 1727 3178
-> 16 0 30 1608 G 1614 3178
-> 15 0 31 1608 G 1614 3179
-> 16 0 31 1608 G 1612 3179
-> 15 0 30 1608 G 1727 3180
-> 16 0 30 1608 G 1620 3180
-> 15 0 31 1608 G 1620 3181
-> 16 0 31 1608 G 1618 3181
-> 15 0 30 1608 G 1727 3182
-> 16 0 30 1608 G 1626 3182
-> 15 0 31 1608 G 1626 3183
-> 16 0 31 1608 G 1624 3183
-> 15 0 30 1608 G 1727 3184
-> 16 0 30 1608 G 1632 3184
-> 15 0 31 1608 G 1632 3185
-> 16 0 31 1608 G 1630 3185
-> 15 0 30 1608 G 1727 3186
-> 16 0 30 1608 G 1638 3186
-> 15 0 31 1608 G 1638 3187
-> 16 0 31 1608 G 1636 3187
-> 15 0 29 1608 G 1642 3188
-> 16 0 29 1608 G 1643 3188
-> 15 0 30 1608 G 1643 3189
-> 16 0 30 1608 G 1727 3189
-> 15 0 29 1608 G 1699 3190
-> 16 0 29 1608 G 1700 3190
-> 15 0 30 1608 G 1700 3191
-> 16 0 30 1608 G 1727 3191
-> 15 0 29 1608 G 1648 3192
-> 16 0 29 1608 G 1649 3192
-> 15 0 30 1608 G 1649 3193
-> 16 0 30 1608 G 1727 3193
-> 15 0 29 1608 G 1705 3194
-> 16 0 29 1608 G 1706 3194
-> 15 0 30 1608 G 1706 3195
-> 16 0 30 1608 G 1727 3195
-> 15 0 29 1608 G 1654 3196
-> 16 0 29 1608 G 1655 3196
-> 15 0 30 1608 G 1655 3197
-> 16 0 30 1608 G 1727 3197
-> 15 0 29 1608 G 1711 3198
-> 16 0 29 1608 G 1712 3198
-> 15 0 30 1608 G 1712 3199
-> 16 0 30 1608 G 1727 3199
-> 15 0 29 1608 G 1660 3200
-> 16 0 29 1608 G 1661 3200
-> 15 0 30 1608 G 1661 3201
-> 16 0 30 1608 G 1727 3201
-> 15 0 29 1608 G 1717 3202
-> 16 0 29 1608 G 1718 3202
-> 15 0 30 1608 G 1718 3203
-> 16 0 30 1608 G 1727 3203
-> 15 0 29 1608 G 1723 3204
-> 16 0 29 1608 G 1724 3204
-> 15 0 30 1608 G 1724 3205
-> 16 0 30 1608 G 1727 3205
-> 15 0 29 1608 G 1669 3206
-> 16 0 29 1608 G 1670 3206
-> 15 0 30 1608 G 1670 3207
-> 16 0 30 1608 G 1727 3207
-> 15 0 29 1608 G 1675 3208
-> 16 0 29 1608 G 1676 3208
-> 15 0 30 1608 G 1676 3209
-> 16 0 30 1608 G 1727 3209
-> 15 0 29 1608 G 1681 3210
-> 16 0 29 1608 G 1682 3210
-> 15 0 30 1608 G 1682 3211
-> 16 0 30 1608 G 1727 3211
-> 15 0 29 1608 G 1687 3212
-> 16 0 29 1608 G 1688 3212
-> 15 0 30 1608 G 1688 3213
-> 16 0 30 1608 G 1727 3213
-> 15 0 29 1608 G 1693 3214
-> 16 0 29 1608 G 1694 3214
-> 15 0 30 1608 G 1694 3215
-> 16 0 30 1608 G 1727 3215
-> 15 0 29 1608 G 1609 3216
-> 16 0 29 1608 G 1610 3216
-> 15 0 30 1608 G 1610 3217
-> 16 0 30 1608 G 1727 3217
-> 15 0 29 1608 G 1615 3218
-> 16 0 29 1608 G 1616 3218
-> 15 0 30 1608 G 1616 3219
-> 16 0 30 1608 G 1727 3219
-> 15 0 29 1608 G 1621 3220
-> 16 0 29 1608 G 1622 3220
-> 15 0 30 1608 G 1622 3221
-> 16 0 30 1608 G 1727 3221
-> 15 0 29 1608 G 1627 3222
-> 16 0 29 1608 G 1628 3222
-> 15 0 30 1608 G 1628 3223
-> 16 0 30 1608 G 1727 3223
-> 15 0 29 1608 G 1633 3224
-> 16 0 29 1608 G 1634 3224
-> 15 0 30 1608 G 1634 3225
-> 16 0 30 1608 G 1727 3225
-> 15 0 29 1608 G 1639 3226
-> 16 0 29 1608 G 1640 3226
-> 15 0 30 1608 G 1640 3227
-> 16 0 30 1608 G 1727 3227
-> 15 0 29 1608 G 1696 3228
-> 16 0 29 1608 G 1697 3228
-> 15 0 30 1608 G 1697 3229
-> 16 0 30 1608 G 1727 3229
-> 15 0 29 1608 G 1645 3230
-> 16 0 29 1608 G 1646 3230
-> 15 0 30 1608 G 1646 3231
-> 16 0 30 1608 G 1727 3231
-> 15 0 29 1608 G 1702 3232
-> 16 0 29 1608 G 1703 3232
-> 15 0 30 1608 G 1703 3233
-> 16 0 30 1608 G 1727 3233
-> 15 0 29 1608 G 1651 3234
-> 16 0 29 1608 G 1652 3234
-> 15 0 30 1608 G 1652 3235
-> 16 0 30 1608 G 1727 3235
-> 15 0 29 1608 G 1708 3236
-> 16 0 29 1608 G 1709 3236
-> 15 0 30 1608 G 1709 3237
-> 16 0 30 1608 G 1727 3237
-> 15 0 29 1608 G 1657 3238
-> 16 0 29 1608 G 1658 3238
-> 15 0 30 1608 G 1658 3239
-> 16 0 30 1608 G 1727 3239
-> 15 0 29 1608 G 1714 3240
-> 16 0 29 1608 G 1715 3240
-> 15 0 30 1608 G 1715 3241
-> 16 0 30 1608 G 1727 3241
-> 15 0 29 1608 G 1663 3242
-> 16 0 29 1608 G 1664 3242
-> 15 0 30 1608 G 1664 3243
-> 16 0 30 1608 G 1727 3243
-> 15 0 29 1608 G 1720 3244
-> 16 0 29 1608 G 1721 3244
-> 15 0 30 1608 G 1721 3245
-> 16 0 30 1608 G 1727 3245
-> 15 0 29 1608 G 1666 3246
-> 16 0 29 1608 G 1667 3246
-> 15 0 30 1608 G 1667 3247
-> 16 0 30 1608 G 1727 3247
-> 15 0 29 1608 G 1672 3248
-> 16 0 29 1608 G 1673 3248
-> 15 0 30 1608 G 1673 3249
-> 16 0 30 1608 G 1727 3249
-> 15 0 29 1608 G 1678 3250
-> 16 0 29 1608 G 1679 3250
-> 15 0 30 1608 G 1679 3251
-> 16 0 30 1608 G 1727 3251
-> 15 0 29 1608 G 1684 3252
-> 16 0 29 1608 G 1685 3252
-> 15 0 30 1608 G 1685 3253
-> 16 0 30 1608 G 1727 3253
-> 15 0 29 1608 G 1690 3254
-> 16 0 29 1608 G 1691 3254
-> 15 0 30 1608 G 1691 3255
-> 16 0 30 1608 G 1727 3255
-> 15 0 29 1608 G 1612 3256
-> 16 0 29 1608 G 1613 3256
-> 15 0 30 1608 G 1613 3257
-> 16 0 30 1608 G 1727 3257
-> 15 0 29 1608 G 1618 3258
-> 16 0 29 1608 G 1619 3258
-> 15 0 30 1608 G 1619 3259
-> 16 0 30 1608 G 1727 3259
-> 15 0 29 1608 G 1624 3260
-> 16 0 29 1608 G 1625 3260
-> 15 0 30 1608 G 1625 3261
-> 16 0 30 1608 G 1727 3261
-> 15 0 29 1608 G 1630 3262
-> 16 0 29 1608 G 1631 3262
-> 15 0 30 1608 G 1631 3263
-> 16 0 30 1608 G 1727 3263
-> 15 0 29 1728 G 1759 3264
-> 16 0 29 1728 G 1760 3264
-> 15 0 30 1728 G 1760 3265
-> 16 0 30 1728 G 1835 3265
-> 15 0 30 1728 G 1835 3266
-> 16 0 30 1728 G 1767 3266
-> 15 0 31 1728 G 1767 3267
-> 16 0 31 1728 G 1765 3267
-> 15 0 30 1728 G 1835 3268
-> 16 0 30 1728 G 1824 3268
-> 15 0 31 1728 G 1824 3269
-> 16 0 31 1728 G 1822 3269
-> 15 0 30 1728 G 1835 3270
-> 16 0 30 1728 G 1773 3270
-> 15 0 31 1728 G 1773 3271
-> 16 0 31 1728 G 1771 3271
-> 15 0 30 1728 G 1835 3272
-> 16 0 30 1728 G 1830 3272
-> 15 0 31 1728 G 1830 3273
-> 16 0 31 1728 G 1828 3273
-> 15 0 30 1728 G 1835 3274
-> 16 0 30 1728 G 1779 3274
-> 15 0 31 1728 G 1779 3275
-> 16 0 31 1728 G 1777 3275
-> 15 0 30 1728 G 1835 3276
-> 16 0 30 1728 G 1785 3276
-> 15 0 31 1728 G 1785 3277
-> 16 0 31 1728 G 1783 3277
-> 15 0 32 1728 G 1835 3278
-> 16 0 32 1728 G 1834 3278
-> 15 0 30 1728 G 1835 3279
-> 16 0 30 1728 G 1731 3279
-> 15 0 31 1728 G 1731 3280
-> 16 0 31 1728 G 1729 3280
-> 15 0 30 1728 G 1835 3281
-> 16 0 30 1728 G 1737 3281
-> 15 0 31 1728 G 1737 3282
-> 16 0 31 1728 G 1735 3282
-> 15 0 30 1728 G 1835 3283
-> 16 0 30 1728 G 1794 3283
-> 15 0 31 1728 G 1794 3284
-> 16 0 31 1728 G 1792 3284
-> 15 0 30 1728 G 1835 3285
-> 16 0 30 1728 G 1743 3285
-> 15 0 31 1728 G 1743 3286
-> 16 0 31 1728 G 1741 3286
-> 15 0 30 1728 G 1835 3287
-> 16 0 30 1728 G 1800 3287
-> 15 0 31 1728 G 1800 3288
-> 16 0 31 1728 G 1798 3288
-> 15 0 30 1728 G 1835 3289
-> 16 0 30 1728 G 1749 3289
-> 15 0 31 1728 G 1749 3290
-> 16 0 31 1728 G 1747 3290
-> 15 0 30 1728 G 1835 3291
-> 16 0 30 1728 G 1806 3291
-> 15 0 31 1728 G 1806 3292
-> 16 0 31 1728 G 1804 3292
-> 15 0 30 1728 G 1835 3293
-> 16 0 30 1728 G 1755 3293
-> 15 0 31 1728 G 1755 3294
-> 16 0 31 1728 G 1753 3294
-> 15 0 30 1728 G 1835 3295
-> 16 0 30 1728 G 1812 3295
-> 15 0 31 1728 G 1812 3296
-> 16 0 31 1728 G 1810 3296
-> 15 0 30 1728 G 1835 3297
-> 16 0 30 1728 G 1818 3297
-> 15 0 31 1728 G 1818 3298
-> 16 0 31 1728 G 1816 3298
-> 15 0 30 1728 G 1835 3299
-> 16 0 30 1728 G 1764 3299
-> 15 0 31 1728 G 1764 3300
-> 16 0 31 1728 G 1762 3300
-> 15 0 30 1728 G 1835 3301
-> 16 0 30 1728 G 1821 3301
-> 15 0 31 1728 G 1821 3302
-> 16 0 31 1728 G 1819 3302
-> 15 0 30 1728 G 1835 3303
-> 16 0 30 1728 G 1770 3303
-> 15 0 31 1728 G 1770 3304
-> 16 0 31 1728 G 1768 3304
-> 15 0 30 1728 G 1835 3305
-> 16 0 30 1728 G 1827 3305
-> 15 0 31 1728 G 1827 3306
-> 16 0 31 1728 G 1825 3306
-> 15 0 30 1728 G 1835 3307
-> 16 0 30 1728 G 1776 3307
-> 15 0 31 1728 G 1776 3308
-> 16 0 31 1728 G 1774 3308
-> 15 0 30 1728 G 1835 3309
-> 16 0 30 1728 G 1833 3309
-> 15 0 31 1728 G 1833 3310
-> 16 0 31 1728 G 1831 3310
-> 15 0 30 1728 G 1835 3311
-> 16 0 30 1728 G 1782 3311
-> 15 0 31 1728 G 1782 3312
-> 16 0 31 1728 G 1780 3312
-> 15 0 30 1728 G 1835 3313
-> 16 0 30 1728 G 1788 3313
-> 15 0 31 1728 G 1788 3314
-> 16 0 31 1728 G 1786 3314
-> 15 0 30 1728 G 1835 3315
-> 16 0 30 1728 G 1734 3315
-> 15 0 31 1728 G 1734 3316
-> 16 0 31 1728 G 1732 3316
-> 15 0 30 1728 G 1835 3317
-> 16 0 30 1728 G 1791 3317
-> 15 0 31 1728 G 1791 3318
-> 16 0 31 1728 G 1789 3318
-> 15 0 30 1728 G 1835 3319
-> 16 0 30 1728 G 1740 3319
-> 15 0 31 1728 G 1740 3320
-> 16 0 31 1728 G 1738 3320
-> 15 0 30 1728 G 1835 3321
-> 16 0 30 1728 G 1797 3321
-> 15 0 31 1728 G 1797 3322
-> 16 0 31 1728 G 1795 3322
-> 15 0 30 1728 G 1835 3323
-> 16 0 30 1728 G 1746 3323
-> 15 0 31 1728 G 1746 3324
-> 16 0 31 1728 G 1744 3324
-> 15 0 30 1728 G 1835 3325
-> 16 0 30 1728 G 1803 3325
-> 15 0 31 1728 G 1803 3326
-> 16 0 31 1728 G 1801 3326
-> 15 0 30 1728 G 1835 3327
-> 16 0 30 1728 G 1752 3327
-> 15 0 31 1728 G 1752 3328
-> 16 0 31 1728 G 1750 3328
-> 15 0 30 1728 G 1835 3329
-> 16 0 30 1728 G 1809 3329
-> 15 0 31 1728 G 1809 3330
-> 16 0 31 1728 G 1807 3330
-> 15 0 30 1728 G 1835 3331
-> 16 0 30 1728 G 1758 3331
-> 15 0 31 1728 G 1758 3332
-> 16 0 31 1728 G 1756 3332
-> 15 0 30 1728 G 1835 3333
-> 16 0 30 1728 G 1815 3333
-> 15 0 31 1728 G 1815 3334
-> 16 0 31 1728 G 1813 3334
-> 15 0 29 1728 G 1765 3335
-> 16 0 29 1728 G 1766 3335
-> 15 0 30 1728 G 1766 3336
-> 16 0 30 1728 G 1835 3336
-> 15 0 30 1728 G 1835 3337
-> 16 0 30 1728 G 1761 3337
-> 15 0 31 1728 G 1761 3338
-> 16 0 31 1728 G 1759 3338
-> 15 0 29 1728 G 1822 3339
-> 16 0 29 1728 G 1823 3339
-> 15 0 30 1728 G 1823 3340
-> 16 0 30 1728 G 1835 3340
-> 15 0 29 1728 G 1771 3341
-> 16 0 29 1728 G 1772 3341
-> 15 0 30 1728 G 1772 3342
-> 16 0 30 1728 G 1835 3342
-> 15 0 29 1728 G 1828 3343
-> 16 0 29 1728 G 1829 3343
-> 15 0 30 1728 G 1829 3344
-> 16 0 30 1728 G 1835 3344
-> 15 0 29 1728 G 1777 3345
-> 16 0 29 1728 G 1778 3345
-> 15 0 30 1728 G 1778 3346
-> 16 0 30 1728 G 1835 3346
-> 15 0 29 1728 G 1783 3347
-> 16 0 29 1728 G 1784 3347
-> 15 0 30 1728 G 1784 3348
-> 16 0 30 1728 G 1835 3348
-> 15 0 29 1728 G 1729 3349
-> 16 0 29 1728 G 1730 3349
-> 15 0 30 1728 G 1730 3350
-> 16 0 30 1728 G 1835 3350
-> 15 0 29 1728 G 1735 3351
-> 16 0 29 1728 G 1736 3351
-> 15 0 30 1728 G 1736 3352
-> 16 0 30 1728 G 1835 3352
-> 15 0 29 1728 G 1792 3353
-> 16 0 29 1728 G 1793 3353
-> 15 0 30 1728 G 1793 3354
-> 16 0 30 1728 G 1835 3354
-> 15 0 29 1728 G 1741 3355
-> 16 0 29 1728 G 1742 3355
-> 15 0 30 1728 G 1742 3356
-> 16 0 30 1728 G 1835 3356
-> 15 0 29 1728 G 1798 3357
-> 16 0 29 1728 G 1799 3357
-> 15 0 30 1728 G 1799 3358
-> 16 0 30 1728 G 1835 3358
-> 15 0 29 1728 G 1747 3359
-> 16 0 29 1728 G 1748 3359
-> 15 0 30 1728 G 1748 3360
-> 16 0 30 1728 G 1835 3360
-> 15 0 29 1728 G 1804 3361
-> 16 0 29 1728 G 1805 3361
-> 15 0 30 1728 G 1805 3362
-> 16 0 30 1728 G 1835 3362
-> 15 0 29 1728 G 1753 3363
-> 16 0 29 1728 G 1754 3363
-> 15 0 30 1728 G 1754 3364
-> 16 0 30 1728 G 1835 3364
-> 15 0 29 1728 G 1810 3365
-> 16 0 29 1728 G 1811 3365
-> 15 0 30 1728 G 1811 3366
-> 16 0 30 1728 G 1835 3366
-> 15 0 29 1728 G 1816 3367
-> 16 0 29 1728 G 1817 3367
-> 15 0 30 1728 G 1817 3368
-> 16 0 30 1728 G 1835 3368
-> 15 0 29 1728 G 1762 3369
-> 16 0 29 1728 G 1763 3369
-> 15 0 30 1728 G 1763 3370
-> 16 0 30 1728 G 1835 3370
-> 15 0 29 1728 G 1819 3371
-> 16 0 29 1728 G 1820 3371
-> 15 0 30 1728 G 1820 3372
-> 16 0 30 1728 G 1835 3372
-> 15 0 29 1728 G 1768 3373
-> 16 0 29 1728 G 1769 3373
-> 15 0 30 1728 G 1769 3374
-> 16 0 30 1728 G 1835 3374
-> 15 0 29 1728 G 1825 3375
-> 16 0 29 1728 G 1826 3375
-> 15 0 30 1728 G 1826 3376
-> 16 0 30 1728 G 1835 3376
-> 15 0 29 1728 G 1774 3377
-> 16 0 29 1728 G 1775 3377
-> 15 0 30 1728 G 1775 3378
-> 16 0 30 1728 G 1835 3378
-> 15 0 29 1728 G 1831 3379
-> 16 0 29 1728 G 1832 3379
-> 15 0 30 1728 G 1832 3380
-> 16 0 30 1728 G 1835 3380
-> 15 0 29 1728 G 1780 3381
-> 16 0 29 1728 G 1781 3381
-> 15 0 30 1728 G 1781 3382
-> 16 0 30 1728 G 1835 3382
-> 15 0 29 1728 G 1786 3383
-> 16 0 29 1728 G 1787 3383
-> 15 0 30 1728 G 1787 3384
-> 16 0 30 1728 G 1835 3384
-> 15 0 29 1728 G 1732 3385
-> 16 0 29 1728 G 1733 3385
-> 15 0 30 1728 G 1733 3386
-> 16 0 30 1728 G 1835 3386
-> 15 0 29 1728 G 1789 3387
-> 16 0 29 1728 G 1790 3387
-> 15 0 30 1728 G 1790 3388
-> 16 0 30 1728 G 1835 3388
-> 15 0 29 1728 G 1738 3389
-> 16 0 29 1728 G 1739 3389
-> 15 0 30 1728 G 1739 3390
-> 16 0 30 1728 G 1835 3390
-> 15 0 29 1728 G 1795 3391
-> 16 0 29 1728 G 1796 3391
-> 15 0 30 1728 G 1796 3392
-> 16 0 30 1728 G 1835 3392
-> 15 0 29 1728 G 1744 3393
-> 16 0 29 1728 G 1745 3393
-> 15 0 30 1728 G 1745 3394
-> 16 0 30 1728 G 1835 3394
-> 15 0 29 1728 G 1801 3395
-> 16 0 29 1728 G 1802 3395
-> 15 0 30 1728 G 1802 3396
-> 16 0 30 1728 G 1835 3396
-> 15 0 29 1728 G 1750 3397
-> 16 0 29 1728 G 1751 3397
-> 15 0 30 1728 G 1751 3398
-> 16 0 30 1728 G 1835 3398
-> 15 0 29 1728 G 1807 3399
-> 16 0 29 1728 G 1808 3399
-> 15 0 30 1728 G 1808 3400
-> 16 0 30 1728 G 1835 3400
-> 15 0 29 1728 G 1756 3401
-> 16 0 29 1728 G 1757 3401
-> 15 0 30 1728 G 1757 3402
-> 16 0 30 1728 G 1835 3402
-> 15 0 29 1728 G 1813 3403
-> 16 0 29 1728 G 1814 3403
-> 15 0 30 1728 G 1814 3404
-> 16 0 30 1728 G 1835 3404
-> 15 0 29 1836 G 1882 3405
-> 16 0 29 1836 G 1883 3405
-> 15 0 30 1836 G 1883 3406
-> 16 0 30 1836 G 1928 3406
-> 15 0 30 1836 G 1928 3407
-> 16 0 30 1836 G 1890 3407
-> 15 0 31 1836 G 1890 3408
-> 16 0 31 1836 G 1888 3408
-> 15 0 30 1836 G 1928 3409
-> 16 0 30 1836 G 1839 3409
-> 15 0 31 1836 G 1839 3410
-> 16 0 31 1836 G 1837 3410
-> 15 0 30 1836 G 1928 3411
-> 16 0 30 1836 G 1896 3411
-> 15 0 31 1836 G 1896 3412
-> 16 0 31 1836 G 1894 3412
-> 15 0 30 1836 G 1928 3413
-> 16 0 30 1836 G 1845 3413
-> 15 0 31 1836 G 1845 3414
-> 16 0 31 1836 G 1843 3414
-> 15 0 30 1836 G 1928 3415
-> 16 0 30 1836 G 1902 3415
-> 15 0 31 1836 G 1902 3416
-> 16 0 31 1836 G 1900 3416
-> 15 0 30 1836 G 1928 3417
-> 16 0 30 1836 G 1851 3417
-> 15 0 31 1836 G 1851 3418
-> 16 0 31 1836 G 1849 3418
-> 15 0 30 1836 G 1928 3419
-> 16 0 30 1836 G 1908 3419
-> 15 0 31 1836 G 1908 3420
-> 16 0 31 1836 G 1906 3420
-> 15 0 30 1836 G 1928 3421
-> 16 0 30 1836 G 1917 3421
-> 15 0 31 1836 G 1917 3422
-> 16 0 31 1836 G 1915 3422
-> 15 0 30 1836 G 1928 3423
-> 16 0 30 1836 G 1923 3423
-> 15 0 31 1836 G 1923 3424
-> 16 0 31 1836 G 1921 3424
-> 15 0 30 1836 G 1928 3425
-> 16 0 30 1836 G 1854 3425
-> 15 0 31 1836 G 1854 3426
-> 16 0 31 1836 G 1852 3426
-> 15 0 30 1836 G 1928 3427
-> 16 0 30 1836 G 1860 3427
-> 15 0 31 1836 G 1860 3428
-> 16 0 31 1836 G 1858 3428
-> 15 0 30 1836 G 1928 3429
-> 16 0 30 1836 G 1866 3429
-> 15 0 31 1836 G 1866 3430
-> 16 0 31 1836 G 1864 3430
-> 15 0 30 1836 G 1928 3431
-> 16 0 30 1836 G 1872 3431
-> 15 0 31 1836 G 1872 3432
-> 16 0 31 1836 G 1870 3432
-> 15 0 30 1836 G 1928 3433
-> 16 0 30 1836 G 1878 3433
-> 15 0 31 1836 G 1878 3434
-> 16 0 31 1836 G 1876 3434
-> 15 0 32 1836 G 1928 3435
-> 16 0 32 1836 G 1927 3435
-> 15 0 30 1836 G 1928 3436
-> 16 0 30 1836 G 1887 3436
-> 15 0 31 1836 G 1887 3437
-> 16 0 31 1836 G 1885 3437
-> 15 0 30 1836 G 1928 3438
-> 16 0 30 1836 G 1893 3438
-> 15 0 31 1836 G 1893 3439
-> 16 0 31 1836 G 1891 3439
-> 15 0 30 1836 G 1928 3440
-> 16 0 30 1836 G 1842 3440
-> 15 0 31 1836 G 1842 3441
-> 16 0 31 1836 G 1840 3441
-> 15 0 30 1836 G 1928 3442
-> 16 0 30 1836 G 1899 3442
-> 15 0 31 1836 G 1899 3443
-> 16 0 31 1836 G 1897 3443
-> 15 0 30 1836 G 1928 3444
-> 16 0 30 1836 G 1848 3444
-> 15 0 31 1836 G 1848 3445
-> 16 0 31 1836 G 1846 3445
-> 15 0 30 1836 G 1928 3446
-> 16 0 30 1836 G 1905 3446
-> 15 0 31 1836 G 1905 3447
-> 16 0 31 1836 G 1903 3447
-> 15 0 30 1836 G 1928 3448
-> 16 0 30 1836 G 1914 3448
-> 15 0 31 1836 G 1914 3449
-> 16 0 31 1836 G 1912 3449
-> 15 0 30 1836 G 1928 3450
-> 16 0 30 1836 G 1911 3450
-> 15 0 31 1836 G 1911 3451
-> 16 0 31 1836 G 1909 3451
-> 15 0 30 1836 G 1928 3452
-> 16 0 30 1836 G 1920 3452
-> 15 0 31 1836 G 1920 3453
-> 16 0 31 1836 G 1918 3453
-> 15 0 30 1836 G 1928 3454
-> 16 0 30 1836 G 1926 3454
-> 15 0 31 1836 G 1926 3455
-> 16 0 31 1836 G 1924 3455
-> 15 0 30 1836 G 1928 3456
-> 16 0 30 1836 G 1857 3456
-> 15 0 31 1836 G 1857 3457
-> 16 0 31 1836 G 1855 3457
-> 15 0 30 1836 G 1928 3458
-> 16 0 30 1836 G 1863 3458
-> 15 0 31 1836 G 1863 3459
-> 16 0 31 1836 G 1861 3459
-> 15 0 30 1836 G 1928 3460
-> 16 0 30 1836 G 1869 3460
-> 15 0 31 1836 G 1869 3461
-> 16 0 31 1836 G 1867 3461
-> 15 0 30 1836 G 1928 3462
-> 16 0 30 1836 G 1875 3462
-> 15 0 31 1836 G 1875 3463
-> 16 0 31 1836 G 1873 3463
-> 15 0 30 1836 G 1928 3464
-> 16 0 30 1836 G 1881 3464
-> 15 0 31 1836 G 1881 3465
-> 16 0 31 1836 G 1879 3465
-> 15 0 29 1836 G 1888 3466
-> 16 0 29 1836 G 1889 3466
-> 15 0 30 1836 G 1889 3467
-> 16 0 30 1836 G 1928 3467
-> 15 0 30 1836 G 1928 3468
-> 16 0 30 1836 G 1884 3468
-> 15 0 31 1836 G 1884 3469
-> 16 0 31 1836 G 1882 3469
-> 15 0 29 1836 G 1837 3470
-> 16 0 29 1836 G 1838 3470
-> 15 0 30 1836 G 1838 3471
-> 16 0 30 1836 G 1928 3471
-> 15 0 29 1836 G 1894 3472
-> 16 0 29 1836 G 1895 3472
-> 15 0 30 1836 G 1895 3473
-> 16 0 30 1836 G 1928 3473
-> 15 0 29 1836 G 1843 3474
-> 16 0 29 1836 G 1844 3474
-> 15 0 30 1836 G 1844 3475
-> 16 0 30 1836 G 1928 3475
-> 15 0 29 1836 G 1900 3476
-> 16 0 29 1836 G 1901 3476
-> 15 0 30 1836 G 1901 3477
-> 16 0 30 1836 G 1928 3477
-> 15 0 29 1836 G 1849 3478
-> 16 0 29 1836 G 1850 3478
-> 15 0 30 1836 G 1850 3479
-> 16 0 30 1836 G 1928 3479
-> 15 0 29 1836 G 1906 3480
-> 16 0 29 1836 G 1907 3480
-> 15 0 30 1836 G 1907 3481
-> 16 0 30 1836 G 1928 3481
-> 15 0 29 1836 G 1915 3482
-> 16 0 29 1836 G 1916 3482
-> 15 0 30 1836 G 1916 3483
-> 16 0 30 1836 G 1928 3483
-> 15 0 29 1836 G 1921 3484
-> 16 0 29 1836 G 1922 3484
-> 15 0 30 1836 G 1922 3485
-> 16 0 30 1836 G 1928 3485
-> 15 0 29 1836 G 1852 3486
-> 16 0 29 1836 G 1853 3486
-> 15 0 30 1836 G 1853 3487
-> 16 0 30 1836 G 1928 3487
-> 15 0 29 1836 G 1858 3488
-> 16 0 29 1836 G 1859 3488
-> 15 0 30 1836 G 1859 3489
-> 16 0 30 1836 G 1928 3489
-> 15 0 29 1836 G 1864 3490
-> 16 0 29 1836 G 1865 3490
-> 15 0 30 1836 G 1865 3491
-> 16 0 30 1836 G 1928 3491
-> 15 0 29 1836 G 1870 3492
-> 16 0 29 1836 G 1871 3492
-> 15 0 30 1836 G 1871 3493
-> 16 0 30 1836 G 1928 3493
-> 15 0 29 1836 G 1876 3494
-> 16 0 29 1836 G 1877 3494
-> 15 0 30 1836 G 1877 3495
-> 16 0 30 1836 G 1928 3495
-> 15 0 29 1836 G 1885 3496
-> 16 0 29 1836 G 1886 3496
-> 15 0 30 1836 G 1886 3497
-> 16 0 30 1836 G 1928 3497
-> 15 0 29 1836 G 1891 3498
-> 16 0 29 1836 G 1892 3498
-> 15 0 30 1836 G 1892 3499
-> 16 0 30 1836 G 1928 3499
-> 15 0 29 1836 G 1840 3500
-> 16 0 29 1836 G 1841 3500
-> 15 0 30 1836 G 1841 3501
-> 16 0 30 1836 G 1928 3501
-> 15 0 29 1836 G 1897 3502
-> 16 0 29 1836 G 1898 3502
-> 15 0 30 1836 G 1898 3503
-> 16 0 30 1836 G 1928 3503
-> 15 0 29 1836 G 1846 3504
-> 16 0 29 1836 G 1847 3504
-> 15 0 30 1836 G 1847 3505
-> 16 0 30 1836 G 1928 3505
-> 15 0 29 1836 G 1903 3506
-> 16 0 29 1836 G 1904 3506
-> 15 0 30 1836 G 1904 3507
-> 16 0 30 1836 G 1928 3507
-> 15 0 29 1836 G 1912 3508
-> 16 0 29 1836 G 1913 3508
-> 15 0 30 1836 G 1913 3509
-> 16 0 30 1836 G 1928 3509
-> 15 0 29 1836 G 1909 3510
-> 16 0 29 1836 G 1910 3510
-> 15 0 30 1836 G 1910 3511
-> 16 0 30 1836 G 1928 3511
-> 15 0 29 1836 G 1918 3512
-> 16 0 29 1836 G 1919 3512
-> 15 0 30 1836 G 1919 3513
-> 16 0 30 1836 G 1928 3513
-> 15 0 29 1836 G 1924 3514
-> 16 0 29 1836 G 1925 3514
-> 15 0 30 1836 G 1925 3515
-> 16 0 30 1836 G 1928 3515
-> 15 0 29 1836 G 1855 3516
-> 16 0 29 1836 G 1856 3516
-> 15 0 30 1836 G 1856 3517
-> 16 0 30 1836 G 1928 3517
-> 15 0 29 1836 G 1861 3518
-> 16 0 29 1836 G 1862 3518
-> 15 0 30 1836 G 1862 3519
-> 16 0 30 1836 G 1928 3519
-> 15 0 29 1836 G 1867 3520
-> 16 0 29 1836 G 1868 3520
-> 15 0 30 1836 G 1868 3521
-> 16 0 30 1836 G 1928 3521
-> 15 0 29 1836 G 1873 3522
-> 16 0 29 1836 G 1874 3522
-> 15 0 30 1836 G 1874 3523
-> 16 0 30 1836 G 1928 3523
-> 15 0 29 1836 G 1879 3524
-> 16 0 29 1836 G 1880 3524
-> 15 0 30 1836 G 1880 3525
-> 16 0 30 1836 G 1928 3525
-> 15 0 29 1929 G 1975 3526
-> 16 0 29 1929 G 1976 3526
-> 15 0 30 1929 G 1976 3527
-> 16 0 30 1929 G 2051 3527
-> 15 0 30 1929 G 2051 3528
-> 16 0 30 1929 G 2040 3528
-> 15 0 31 1929 G 2040 3529
-> 16 0 31 1929 G 2038 3529
-> 15 0 30 1929 G 2051 3530
-> 16 0 30 1929 G 1989 3530
-> 15 0 31 1929 G 1989 3531
-> 16 0 31 1929 G 1987 3531
-> 15 0 30 1929 G 2051 3532
-> 16 0 30 1929 G 1938 3532
-> 15 0 31 1929 G 1938 3533
-> 16 0 31 1929 G 1936 3533
-> 15 0 30 1929 G 2051 3534
-> 16 0 30 1929 G 2001 3534
-> 15 0 31 1929 G 2001 3535
-> 16 0 31 1929 G 1999 3535
-> 15 0 30 1929 G 2051 3536
-> 16 0 30 1929 G 1953 3536
-> 15 0 31 1929 G 1953 3537
-> 16 0 31 1929 G 1951 3537
-> 15 0 30 1929 G 2051 3538
-> 16 0 30 1929 G 2016 3538
-> 15 0 31 1929 G 2016 3539
-> 16 0 31 1929 G 2014 3539
-> 15 0 30 1929 G 2051 3540
-> 16 0 30 1929 G 1965 3540
-> 15 0 31 1929 G 1965 3541
-> 16 0 31 1929 G 1963 3541
-> 15 0 30 1929 G 2051 3542
-> 16 0 30 1929 G 2028 3542
-> 15 0 31 1929 G 2028 3543
-> 16 0 31 1929 G 2026 3543
-> 15 0 30 1929 G 2051 3544
-> 16 0 30 1929 G 1980 3544
-> 15 0 31 1929 G 1980 3545
-> 16 0 31 1929 G 1978 3545
-> 15 0 30 1929 G 2051 3546
-> 16 0 30 1929 G 2043 3546
-> 15 0 31 1929 G 2043 3547
-> 16 0 31 1929 G 2041 3547
-> 15 0 30 1929 G 2051 3548
-> 16 0 30 1929 G 1992 3548
-> 15 0 31 1929 G 1992 3549
-> 16 0 31 1929 G 1990 3549
-> 15 0 30 1929 G 2051 3550
-> 16 0 30 1929 G 1941 3550
-> 15 0 31 1929 G 1941 3551
-> 16 0 31 1929 G 1939 3551
-> 15 0 30 1929 G 2051 3552
-> 16 0 30 1929 G 2004 3552
-> 15 0 31 1929 G 2004 3553
-> 16 0 31 1929 G 2002 3553
-> 15 0 30 1929 G 2051 3554
-> 16 0 30 1929 G 2007 3554
-> 15 0 31 1929 G 2007 3555
-> 16 0 31 1929 G 2005 3555
-> 15 0 30 1929 G 2051 3556
-> 16 0 30 1929 G 1956 3556
-> 15 0 31 1929 G 1956 3557
-> 16 0 31 1929 G 1954 3557
-> 15 0 30 1929 G 2051 3558
-> 16 0 30 1929 G 2019 3558
-> 15 0 31 1929 G 2019 3559
-> 16 0 31 1929 G 2017 3559
-> 15 0 30 1929 G 2051 3560
-> 16 0 30 1929 G 1968 3560
-> 15 0 31 1929 G 1968 3561
-> 16 0 31 1929 G 1966 3561
-> 15 0 30 1929 G 2051 3562
-> 16 0 30 1929 G 2031 3562
-> 15 0 31 1929 G 2031 3563
-> 16 0 31 1929 G 2029 3563
-> 15 0 30 1929 G 2051 3564
-> 16 0 30 1929 G 1983 3564
-> 15 0 31 1929 G 1983 3565
-> 16 0 31 1929 G 1981 3565
-> 15 0 30 1929 G 2051 3566
-> 16 0 30 1929 G 1932 3566
-> 15 0 31 1929 G 1932 3567
-> 16 0 31 1929 G 1930 3567
-> 15 0 30 1929 G 2051 3568
-> 16 0 30 1929 G 2046 3568
-> 15 0 31 1929 G 2046 3569
-> 16 0 31 1929 G 2044 3569
-> 15 0 30 1929 G 2051 3570
-> 16 0 30 1929 G 1995 3570
-> 15 0 31 1929 G 1995 3571
-> 16 0 31 1929 G 1993 3571
-> 15 0 30 1929 G 2051 3572
-> 16 0 30 1929 G 1944 3572
-> 15 0 31 1929 G 1944 3573
-> 16 0 31 1929 G 1942 3573
-> 15 0 30 1929 G 2051 3574
-> 16 0 30 1929 G 1947 3574
-> 15 0 31 1929 G 1947 3575
-> 16 0 31 1929 G 1945 3575
-> 15 0 30 1929 G 2051 3576
-> 16 0 30 1929 G 2010 3576
-> 15 0 31 1929 G 2010 3577
-> 16 0 31 1929 G 2008 3577
-> 15 0 30 1929 G 2051 3578
-> 16 0 30 1929 G 1959 3578
-> 15 0 31 1929 G 1959 3579
-> 16 0 31 1929 G 1957 3579
-> 15 0 30 1929 G 2051 3580
-> 16 0 30 1929 G 2022 3580
-> 15 0 31 1929 G 2022 3581
-> 16 0 31 1929 G 2020 3581
-> 15 0 30 1929 G 2051 3582
-> 16 0 30 1929 G 1971 3582
-> 15 0 31 1929 G 1971 3583
-> 16 0 31 1929 G 1969 3583
-> 15 0 30 1929 G 2051 3584
-> 16 0 30 1929 G 2034 3584
-> 15 0 31 1929 G 2034 3585
-> 16 0 31 1929 G 2032 3585
-> 15 0 30 1929 G 2051 3586
-> 16 0 30 1929 G 2037 3586
-> 15 0 31 1929 G 2037 3587
-> 16 0 31 1929 G 2035 3587
-> 15 0 30 1929 G 2051 3588
-> 16 0 30 1929 G 1986 3588
-> 15 0 31 1929 G 1986 3589
-> 16 0 31 1929 G 1984 3589
-> 15 0 30 1929 G 2051 3590
-> 16 0 30 1929 G 1935 3590
-> 15 0 31 1929 G 1935 3591
-> 16 0 31 1929 G 1933 3591
-> 15 0 30 1929 G 2051 3592
-> 16 0 30 1929 G 2049 3592
-> 15 0 31 1929 G 2049 3593
-> 16 0 31 1929 G 2047 3593
-> 15 0 30 1929 G 2051 3594
-> 16 0 30 1929 G 1998 3594
-> 15 0 31 1929 G 1998 3595
-> 16 0 31 1929 G 1996 3595
-> 15 0 32 1929 G 2051 3596
-> 16 0 32 1929 G 2050 3596
-> 15 0 30 1929 G 2051 3597
-> 16 0 30 1929 G 1950 3597
-> 15 0 31 1929 G 1950 3598
-> 16 0 31 1929 G 1948 3598
-> 15 0 30 1929 G 2051 3599
-> 16 0 30 1929 G 2013 3599
-> 15 0 31 1929 G 2013 3600
-> 16 0 31 1929 G 2011 3600
-> 15 0 30 1929 G 2051 3601
-> 16 0 30 1929 G 1962 3601
-> 15 0 31 1929 G 1962 3602
-> 16 0 31 1929 G 1960 3602
-> 15 0 30 1929 G 2051 3603
-> 16 0 30 1929 G 2025 3603
-> 15 0 31 1929 G 2025 3604
-> 16 0 31 1929 G 2023 3604
-> 15 0 30 1929 G 2051 3605
-> 16 0 30 1929 G 1974 3605
-> 15 0 31 1929 G 1974 3606
-> 16 0 31 1929 G 1972 3606
-> 15 0 29 1929 G 2038 3607
-> 16 0 29 1929 G 2039 3607
-> 15 0 30 1929 G 2039 3608
-> 16 0 30 1929 G 2051 3608
-> 15 0 30 1929 G 2051 3609
-> 16 0 30 1929 G 1977 3609
-> 15 0 31 1929 G 1977 3610
-> 16 0 31 1929 G 1975 3610
-> 15 0 29 1929 G 1987 3611
-> 16 0 29 1929 G 1988 3611
-> 15 0 30 1929 G 1988 3612
-> 16 0 30 1929 G 2051 3612
-> 15 0 29 1929 G 1936 3613
-> 16 0 29 1929 G 1937 3613
-> 15 0 30 1929 G 1937 3614
-> 16 0 30 1929 G 2051 3614
-> 15 0 29 1929 G 1999 3615
-> 16 0 29 1929 G 2000 3615
-> 15 0 30 1929 G 2000 3616
-> 16 0 30 1929 G 2051 3616
-> 15 0 29 1929 G 1951 3617
-> 16 0 29 1929 G 1952 3617
-> 15 0 30 1929 G 1952 3618
-> 16 0 30 1929 G 2051 3618
-> 15 0 29 1929 G 2014 3619
-> 16 0 29 1929 G 2015 3619
-> 15 0 30 1929 G 2015 3620
-> 16 0 30 1929 G 2051 3620
-> 15 0 29 1929 G 1963 3621
-> 16 0 29 1929 G 1964 3621
-> 15 0 30 1929 G 1964 3622
-> 16 0 30 1929 G 2051 3622
-> 15 0 29 1929 G 2026 3623
-> 16 0 29 1929 G 2027 3623
-> 15 0 30 1929 G 2027 3624
-> 16 0 30 1929 G 2051 3624
-> 15 0 29 1929 G 1978 3625
-> 16 0 29 1929 G 1979 3625
-> 15 0 30 1929 G 1979 3626
-> 16 0 30 1929 G 2051 3626
-> 15 0 29 1929 G 2041 3627
-> 16 0 29 1929 G 2042 3627
-> 15 0 30 1929 G 2042 3628
-> 16 0 30 1929 G 2051 3628
-> 15 0 29 1929 G 1990 3629
-> 16 0 29 1929 G 1991 3629
-> 15 0 30 1929 G 1991 3630
-> 16 0 30 1929 G 2051 3630
-> 15 0 29 1929 G 1939 3631
-> 16 0 29 1929 G 1940 3631
-> 15 0 30 1929 G 1940 3632
-> 16 0 30 1929 G 2051 3632
-> 15 0 29 1929 G 2002 3633
-> 16 0 29 1929 G 2003 3633
-> 15 0 30 1929 G 2003 3634
-> 16 0 30 1929 G 2051 3634
-> 15 0 29 1929 G 2005 3635
-> 16 0 29 1929 G 2006 3635
-> 15 0 30 1929 G 2006 3636
-> 16 0 30 1929 G 2051 3636
-> 15 0 29 1929 G 1954 3637
-> 16 0 29 1929 G 1955 3637
-> 15 0 30 1929 G 1955 3638
-> 16 0 30 1929 G 2051 3638
-> 15 0 29 1929 G 2017 3639
-> 16 0 29 1929 G 2018 3639
-> 15 0 30 1929 G 2018 3640
-> 16 0 30 1929 G 2051 3640
-> 15 0 29 1929 G 1966 3641
-> 16 0 29 1929 G 1967 3641
-> 15 0 30 1929 G 1967 3642
-> 16 0 30 1929 G 2051 3642
-> 15 0 29 1929 G 2029 3643
-> 16 0 29 1929 G 2030 3643
-> 15 0 30 1929 G 2030 3644
-> 16 0 30 1929 G 2051 3644
-> 15 0 29 1929 G 1981 3645
-> 16 0 29 1929 G 1982 3645
-> 15 0 30 1929 G 1982 3646
-> 16 0 30 1929 G 2051 3646
-> 15 0 29 1929 G 1930 3647
-> 16 0 29 1929 G 1931 3647
-> 15 0 30 1929 G 1931 3648
-> 16 0 30 1929 G 2051 3648
-> 15 0 29 1929 G 2044 3649
-> 16 0 29 1929 G 2045 3649
-> 15 0 30 1929 G 2045 3650
-> 16 0 30 1929 G 2051 3650
-> 15 0 29 1929 G 1993 3651
-> 16 0 29 1929 G 1994 3651
-> 15 0 30 1929 G 1994 3652
-> 16 0 30 1929 G 2051 3652
-> 15 0 29 1929 G 1942 3653
-> 16 0 29 1929 G 1943 3653
-> 15 0 30 1929 G 1943 3654
-> 16 0 30 1929 G 2051 3654
-> 15 0 29 1929 G 1945 3655
-> 16 0 29 1929 G 1946 3655
-> 15 0 30 1929 G 1946 3656
-> 16 0 30 1929 G 2051 3656
-> 15 0 29 1929 G 2008 3657
-> 16 0 29 1929 G 2009 3657
-> 15 0 30 1929 G 2009 3658
-> 16 0 30 1929 G 2051 3658
-> 15 0 29 1929 G 1957 3659
-> 16 0 29 1929 G 1958 3659
-> 15 0 30 1929 G 1958 3660
-> 16 0 30 1929 G 2051 3660
-> 15 0 29 1929 G 2020 3661
-> 16 0 29 1929 G 2021 3661
-> 15 0 30 1929 G 2021 3662
-> 16 0 30 1929 G 2051 3662
-> 15 0 29 1929 G 1969 3663
-> 16 0 29 1929 G 1970 3663
-> 15 0 30 1929 G 1970 3664
-> 16 0 30 1929 G 2051 3664
-> 15 0 29 1929 G 2032 3665
-> 16 0 29 1929 G 2033 3665
-> 15 0 30 1929 G 2033 3666
-> 16 0 30 1929 G 2051 3666
-> 15 0 29 1929 G 2035 3667
-> 16 0 29 1929 G 2036 3667
-> 15 0 30 1929 G 2036 3668
-> 16 0 30 1929 G 2051 3668
-> 15 0 29 1929 G 1984 3669
-> 16 0 29 1929 G 1985 3669
-> 15 0 30 1929 G 1985 3670
-> 16 0 30 1929 G 2051 3670
-> 15 0 29 1929 G 1933 3671
-> 16 0 29 1929 G 1934 3671
-> 15 0 30 1929 G 1934 3672
-> 16 0 30 1929 G 2051 3672
-> 15 0 29 1929 G 2047 3673
-> 16 0 29 1929 G 2048 3673
-> 15 0 30 1929 G 2048 3674
-> 16 0 30 1929 G 2051 3674
-> 15 0 29 1929 G 1996 3675
-> 16 0 29 1929 G 1997 3675
-> 15 0 30 1929 G 1997 3676
-> 16 0 30 1929 G 2051 3676
-> 15 0 29 1929 G 1948 3677
-> 16 0 29 1929 G 1949 3677
-> 15 0 30 1929 G 1949 3678
-> 16 0 30 1929 G 2051 3678
-> 15 0 29 1929 G 2011 3679
-> 16 0 29 1929 G 2012 3679
-> 15 0 30 1929 G 2012 3680
-> 16 0 30 1929 G 2051 3680
-> 15 0 29 1929 G 1960 3681
-> 16 0 29 1929 G 1961 3681
-> 15 0 30 1929 G 1961 3682
-> 16 0 30 1929 G 2051 3682
-> 15 0 29 1929 G 2023 3683
-> 16 0 29 1929 G 2024 3683
-> 15 0 30 1929 G 2024 3684
-> 16 0 30 1929 G 2051 3684
-> 15 0 29 1929 G 1972 3685
-> 16 0 29 1929 G 1973 3685
-> 15 0 30 1929 G 1973 3686
-> 16 0 30 1929 G 2051 3686
-> 15 0 34 1607 G 2053 3687
-> 16 0 34 1607 G 2054 3687
-> 15 0 35 1607 G 2054 3688
-> 16 0 35 1607 G 1726 3688
-> 15 0 35 1607 G 2054 3689
-> 16 0 35 1607 G 1834 3689
-> 15 0 35 1607 G 2054 3690
-> 16 0 35 1607 G 1927 3690
-> 15 0 35 1607 G 2054 3691
-> 16 0 35 1607 G 2050 3691
-> 15 0 29 2057 G 2085 3692
-> 16 0 29 2057 G 2086 3692
-> 15 0 30 2057 G 2086 3693
-> 16 0 30 2057 G 2155 3693
-> 15 0 30 2057 G 2155 3694
-> 16 0 30 2057 G 2093 3694
-> 15 0 31 2057 G 2093 3695
-> 16 0 31 2057 G 2091 3695
-> 15 0 30 2057 G 2155 3696
-> 16 0 30 2057 G 2099 3696
-> 15 0 31 2057 G 2099 3697
-> 16 0 31 2057 G 2097 3697
-> 15 0 30 2057 G 2155 3698
-> 16 0 30 2057 G 2105 3698
-> 15 0 31 2057 G 2105 3699
-> 16 0 31 2057 G 2103 3699
-> 15 0 30 2057 G 2155 3700
-> 16 0 30 2057 G 2111 3700
-> 15 0 31 2057 G 2111 3701
-> 16 0 31 2057 G 2109 3701
-> 15 0 30 2057 G 2155 3702
-> 16 0 30 2057 G 2147 3702
-> 15 0 31 2057 G 2147 3703
-> 16 0 31 2057 G 2145 3703
-> 15 0 30 2057 G 2155 3704
-> 16 0 30 2057 G 2060 3704
-> 15 0 31 2057 G 2060 3705
-> 16 0 31 2057 G 2058 3705
-> 15 0 30 2057 G 2155 3706
-> 16 0 30 2057 G 2066 3706
-> 15 0 31 2057 G 2066 3707
-> 16 0 31 2057 G 2064 3707
-> 15 0 30 2057 G 2155 3708
-> 16 0 30 2057 G 2072 3708
-> 15 0 31 2057 G 2072 3709
-> 16 0 31 2057 G 2070 3709
-> 15 0 30 2057 G 2155 3710
-> 16 0 30 2057 G 2078 3710
-> 15 0 31 2057 G 2078 3711
-> 16 0 31 2057 G 2076 3711
-> 15 0 30 2057 G 2155 3712
-> 16 0 30 2057 G 2084 3712
-> 15 0 31 2057 G 2084 3713
-> 16 0 31 2057 G 2082 3713
-> 15 0 32 2057 G 2155 3714
-> 16 0 32 2057 G 2154 3714
-> 15 0 30 2057 G 2155 3715
-> 16 0 30 2057 G 2120 3715
-> 15 0 31 2057 G 2120 3716
-> 16 0 31 2057 G 2118 3716
-> 15 0 30 2057 G 2155 3717
-> 16 0 30 2057 G 2126 3717
-> 15 0 31 2057 G 2126 3718
-> 16 0 31 2057 G 2124 3718
-> 15 0 30 2057 G 2155 3719
-> 16 0 30 2057 G 2132 3719
-> 15 0 31 2057 G 2132 3720
-> 16 0 31 2057 G 2130 3720
-> 15 0 30 2057 G 2155 3721
-> 16 0 30 2057 G 2138 3721
-> 15 0 31 2057 G 2138 3722
-> 16 0 31 2057 G 2136 3722
-> 15 0 30 2057 G 2155 3723
-> 16 0 30 2057 G 2144 3723
-> 15 0 31 2057 G 2144 3724
-> 16 0 31 2057 G 2142 3724
-> 15 0 30 2057 G 2155 3725
-> 16 0 30 2057 G 2090 3725
-> 15 0 31 2057 G 2090 3726
-> 16 0 31 2057 G 2088 3726
-> 15 0 30 2057 G 2155 3727
-> 16 0 30 2057 G 2096 3727
-> 15 0 31 2057 G 2096 3728
-> 16 0 31 2057 G 2094 3728
-> 15 0 30 2057 G 2155 3729
-> 16 0 30 2057 G 2102 3729
-> 15 0 31 2057 G 2102 3730
-> 16 0 31 2057 G 2100 3730
-> 15 0 30 2057 G 2155 3731
-> 16 0 30 2057 G 2108 3731
-> 15 0 31 2057 G 2108 3732
-> 16 0 31 2057 G 2106 3732
-> 15 0 30 2057 G 2155 3733
-> 16 0 30 2057 G 2114 3733
-> 15 0 31 2057 G 2114 3734
-> 16 0 31 2057 G 2112 3734
-> 15 0 30 2057 G 2155 3735
-> 16 0 30 2057 G 2150 3735
-> 15 0 31 2057 G 2150 3736
-> 16 0 31 2057 G 2148 3736
-> 15 0 30 2057 G 2155 3737
-> 16 0 30 2057 G 2063 3737
-> 15 0 31 2057 G 2063 3738
-> 16 0 31 2057 G 2061 3738
-> 15 0 30 2057 G 2155 3739
-> 16 0 30 2057 G 2069 3739
-> 15 0 31 2057 G 2069 3740
-> 16 0 31 2057 G 2067 3740
-> 15 0 30 2057 G 2155 3741
-> 16 0 30 2057 G 2075 3741
-> 15 0 31 2057 G 2075 3742
-> 16 0 31 2057 G 2073 3742
-> 15 0 30 2057 G 2155 3743
-> 16 0 30 2057 G 2081 3743
-> 15 0 31 2057 G 2081 3744
-> 16 0 31 2057 G 2079 3744
-> 15 0 30 2057 G 2155 3745
-> 16 0 30 2057 G 2117 3745
-> 15 0 31 2057 G 2117 3746
-> 16 0 31 2057 G 2115 3746
-> 15 0 30 2057 G 2155 3747
-> 16 0 30 2057 G 2123 3747
-> 15 0 31 2057 G 2123 3748
-> 16 0 31 2057 G 2121 3748
-> 15 0 30 2057 G 2155 3749
-> 16 0 30 2057 G 2129 3749
-> 15 0 31 2057 G 2129 3750
-> 16 0 31 2057 G 2127 3750
-> 15 0 30 2057 G 2155 3751
-> 16 0 30 2057 G 2153 3751
-> 15 0 31 2057 G 2153 3752
-> 16 0 31 2057 G 2151 3752
-> 15 0 30 2057 G 2155 3753
-> 16 0 30 2057 G 2135 3753
-> 15 0 31 2057 G 2135 3754
-> 16 0 31 2057 G 2133 3754
-> 15 0 30 2057 G 2155 3755
-> 16 0 30 2057 G 2141 3755
-> 15 0 31 2057 G 2141 3756
-> 16 0 31 2057 G 2139 3756
-> 15 0 29 2057 G 2091 3757
-> 16 0 29 2057 G 2092 3757
-> 15 0 30 2057 G 2092 3758
-> 16 0 30 2057 G 2155 3758
-> 15 0 30 2057 G 2155 3759
-> 16 0 30 2057 G 2087 3759
-> 15 0 31 2057 G 2087 3760
-> 16 0 31 2057 G 2085 3760
-> 15 0 29 2057 G 2097 3761
-> 16 0 29 2057 G 2098 3761
-> 15 0 30 2057 G 2098 3762
-> 16 0 30 2057 G 2155 3762
-> 15 0 29 2057 G 2103 3763
-> 16 0 29 2057 G 2104 3763
-> 15 0 30 2057 G 2104 3764
-> 16 0 30 2057 G 2155 3764
-> 15 0 29 2057 G 2109 3765
-> 16 0 29 2057 G 2110 3765
-> 15 0 30 2057 G 2110 3766
-> 16 0 30 2057 G 2155 3766
-> 15 0 29 2057 G 2145 3767
-> 16 0 29 2057 G 2146 3767
-> 15 0 30 2057 G 2146 3768
-> 16 0 30 2057 G 2155 3768
-> 15 0 29 2057 G 2058 3769
-> 16 0 29 2057 G 2059 3769
-> 15 0 30 2057 G 2059 3770
-> 16 0 30 2057 G 2155 3770
-> 15 0 29 2057 G 2064 3771
-> 16 0 29 2057 G 2065 3771
-> 15 0 30 2057 G 2065 3772
-> 16 0 30 2057 G 2155 3772
-> 15 0 29 2057 G 2070 3773
-> 16 0 29 2057 G 2071 3773
-> 15 0 30 2057 G 2071 3774
-> 16 0 30 2057 G 2155 3774
-> 15 0 29 2057 G 2076 3775
-> 16 0 29 2057 G 2077 3775
-> 15 0 30 2057 G 2077 3776
-> 16 0 30 2057 G 2155 3776
-> 15 0 29 2057 G 2082 3777
-> 16 0 29 2057 G 2083 3777
-> 15 0 30 2057 G 2083 3778
-> 16 0 30 2057 G 2155 3778
-> 15 0 29 2057 G 2118 3779
-> 16 0 29 2057 G 2119 3779
-> 15 0 30 2057 G 2119 3780
-> 16 0 30 2057 G 2155 3780
-> 15 0 29 2057 G 2124 3781
-> 16 0 29 2057 G 2125 3781
-> 15 0 30 2057 G 2125 3782
-> 16 0 30 2057 G 2155 3782
-> 15 0 29 2057 G 2130 3783
-> 16 0 29 2057 G 2131 3783
-> 15 0 30 2057 G 2131 3784
-> 16 0 30 2057 G 2155 3784
-> 15 0 29 2057 G 2136 3785
-> 16 0 29 2057 G 2137 3785
-> 15 0 30 2057 G 2137 3786
-> 16 0 30 2057 G 2155 3786
-> 15 0 29 2057 G 2142 3787
-> 16 0 29 2057 G 2143 3787
-> 15 0 30 2057 G 2143 3788
-> 16 0 30 2057 G 2155 3788
-> 15 0 29 2057 G 2088 3789
-> 16 0 29 2057 G 2089 3789
-> 15 0 30 2057 G 2089 3790
-> 16 0 30 2057 G 2155 3790
-> 15 0 29 2057 G 2094 3791
-> 16 0 29 2057 G 2095 3791
-> 15 0 30 2057 G 2095 3792
-> 16 0 30 2057 G 2155 3792
-> 15 0 29 2057 G 2100 3793
-> 16 0 29 2057 G 2101 3793
-> 15 0 30 2057 G 2101 3794
-> 16 0 30 2057 G 2155 3794
-> 15 0 29 2057 G 2106 3795
-> 16 0 29 2057 G 2107 3795
-> 15 0 30 2057 G 2107 3796
-> 16 0 30 2057 G 2155 3796
-> 15 0 29 2057 G 2112 3797
-> 16 0 29 2057 G 2113 3797
-> 15 0 30 2057 G 2113 3798
-> 16 0 30 2057 G 2155 3798
-> 15 0 29 2057 G 2148 3799
-> 16 0 29 2057 G 2149 3799
-> 15 0 30 2057 G 2149 3800
-> 16 0 30 2057 G 2155 3800
-> 15 0 29 2057 G 2061 3801
-> 16 0 29 2057 G 2062 3801
-> 15 0 30 2057 G 2062 3802
-> 16 0 30 2057 G 2155 3802
-> 15 0 29 2057 G 2067 3803
-> 16 0 29 2057 G 2068 3803
-> 15 0 30 2057 G 2068 3804
-> 16 0 30 2057 G 2155 3804
-> 15 0 29 2057 G 2073 3805
-> 16 0 29 2057 G 2074 3805
-> 15 0 30 2057 G 2074 3806
-> 16 0 30 2057 G 2155 3806
-> 15 0 29 2057 G 2079 3807
-> 16 0 29 2057 G 2080 3807
-> 15 0 30 2057 G 2080 3808
-> 16 0 30 2057 G 2155 3808
-> 15 0 29 2057 G 2115 3809
-> 16 0 29 2057 G 2116 3809
-> 15 0 30 2057 G 2116 3810
-> 16 0 30 2057 G 2155 3810
-> 15 0 29 2057 G 2121 3811
-> 16 0 29 2057 G 2122 3811
-> 15 0 30 2057 G 2122 3812
-> 16 0 30 2057 G 2155 3812
-> 15 0 29 2057 G 2127 3813
-> 16 0 29 2057 G 2128 3813
-> 15 0 30 2057 G 2128 3814
-> 16 0 30 2057 G 2155 3814
-> 15 0 29 2057 G 2151 3815
-> 16 0 29 2057 G 2152 3815
-> 15 0 30 2057 G 2152 3816
-> 16 0 30 2057 G 2155 3816
-> 15 0 29 2057 G 2133 3817
-> 16 0 29 2057 G 2134 3817
-> 15 0 30 2057 G 2134 3818
-> 16 0 30 2057 G 2155 3818
-> 15 0 29 2057 G 2139 3819
-> 16 0 29 2057 G 2140 3819
-> 15 0 30 2057 G 2140 3820
-> 16 0 30 2057 G 2155 3820
-> 15 0 29 2156 G 2160 3821
-> 16 0 29 2156 G 2161 3821
-> 15 0 30 2156 G 2161 3822
-> 16 0 30 2156 G 2242 3822
-> 15 0 30 2156 G 2242 3823
-> 16 0 30 2156 G 2219 3823
-> 15 0 31 2156 G 2219 3824
-> 16 0 31 2156 G 2217 3824
-> 15 0 30 2156 G 2242 3825
-> 16 0 30 2156 G 2168 3825
-> 15 0 31 2156 G 2168 3826
-> 16 0 31 2156 G 2166 3826
-> 15 0 30 2156 G 2242 3827
-> 16 0 30 2156 G 2225 3827
-> 15 0 31 2156 G 2225 3828
-> 16 0 31 2156 G 2223 3828
-> 15 0 30 2156 G 2242 3829
-> 16 0 30 2156 G 2174 3829
-> 15 0 31 2156 G 2174 3830
-> 16 0 31 2156 G 2172 3830
-> 15 0 30 2156 G 2242 3831
-> 16 0 30 2156 G 2231 3831
-> 15 0 31 2156 G 2231 3832
-> 16 0 31 2156 G 2229 3832
-> 15 0 30 2156 G 2242 3833
-> 16 0 30 2156 G 2180 3833
-> 15 0 31 2156 G 2180 3834
-> 16 0 31 2156 G 2178 3834
-> 15 0 30 2156 G 2242 3835
-> 16 0 30 2156 G 2237 3835
-> 15 0 31 2156 G 2237 3836
-> 16 0 31 2156 G 2235 3836
-> 15 0 30 2156 G 2242 3837
-> 16 0 30 2156 G 2186 3837
-> 15 0 31 2156 G 2186 3838
-> 16 0 31 2156 G 2184 3838
-> 15 0 30 2156 G 2242 3839
-> 16 0 30 2156 G 2189 3839
-> 15 0 31 2156 G 2189 3840
-> 16 0 31 2156 G 2187 3840
-> 15 0 30 2156 G 2242 3841
-> 16 0 30 2156 G 2195 3841
-> 15 0 31 2156 G 2195 3842
-> 16 0 31 2156 G 2193 3842
-> 15 0 30 2156 G 2242 3843
-> 16 0 30 2156 G 2201 3843
-> 15 0 31 2156 G 2201 3844
-> 16 0 31 2156 G 2199 3844
-> 15 0 30 2156 G 2242 3845
-> 16 0 30 2156 G 2207 3845
-> 15 0 31 2156 G 2207 3846
-> 16 0 31 2156 G 2205 3846
-> 15 0 30 2156 G 2242 3847
-> 16 0 30 2156 G 2213 3847
-> 15 0 31 2156 G 2213 3848
-> 16 0 31 2156 G 2211 3848
-> 15 0 30 2156 G 2242 3849
-> 16 0 30 2156 G 2159 3849
-> 15 0 31 2156 G 2159 3850
-> 16 0 31 2156 G 2157 3850
-> 15 0 32 2156 G 2242 3851
-> 16 0 32 2156 G 2241 3851
-> 15 0 30 2156 G 2242 3852
-> 16 0 30 2156 G 2165 3852
-> 15 0 31 2156 G 2165 3853
-> 16 0 31 2156 G 2163 3853
-> 15 0 30 2156 G 2242 3854
-> 16 0 30 2156 G 2222 3854
-> 15 0 31 2156 G 2222 3855
-> 16 0 31 2156 G 2220 3855
-> 15 0 30 2156 G 2242 3856
-> 16 0 30 2156 G 2171 3856
-> 15 0 31 2156 G 2171 3857
-> 16 0 31 2156 G 2169 3857
-> 15 0 30 2156 G 2242 3858
-> 16 0 30 2156 G 2228 3858
-> 15 0 31 2156 G 2228 3859
-> 16 0 31 2156 G 2226 3859
-> 15 0 30 2156 G 2242 3860
-> 16 0 30 2156 G 2177 3860
-> 15 0 31 2156 G 2177 3861
-> 16 0 31 2156 G 2175 3861
-> 15 0 30 2156 G 2242 3862
-> 16 0 30 2156 G 2234 3862
-> 15 0 31 2156 G 2234 3863
-> 16 0 31 2156 G 2232 3863
-> 15 0 30 2156 G 2242 3864
-> 16 0 30 2156 G 2183 3864
-> 15 0 31 2156 G 2183 3865
-> 16 0 31 2156 G 2181 3865
-> 15 0 30 2156 G 2242 3866
-> 16 0 30 2156 G 2240 3866
-> 15 0 31 2156 G 2240 3867
-> 16 0 31 2156 G 2238 3867
-> 15 0 30 2156 G 2242 3868
-> 16 0 30 2156 G 2192 3868
-> 15 0 31 2156 G 2192 3869
-> 16 0 31 2156 G 2190 3869
-> 15 0 30 2156 G 2242 3870
-> 16 0 30 2156 G 2198 3870
-> 15 0 31 2156 G 2198 3871
-> 16 0 31 2156 G 2196 3871
-> 15 0 30 2156 G 2242 3872
-> 16 0 30 2156 G 2204 3872
-> 15 0 31 2156 G 2204 3873
-> 16 0 31 2156 G 2202 3873
-> 15 0 30 2156 G 2242 3874
-> 16 0 30 2156 G 2210 3874
-> 15 0 31 2156 G 2210 3875
-> 16 0 31 2156 G 2208 3875
-> 15 0 30 2156 G 2242 3876
-> 16 0 30 2156 G 2216 3876
-> 15 0 31 2156 G 2216 3877
-> 16 0 31 2156 G 2214 3877
-> 15 0 29 2156 G 2217 3878
-> 16 0 29 2156 G 2218 3878
-> 15 0 30 2156 G 2218 3879
-> 16 0 30 2156 G 2242 3879
-> 15 0 30 2156 G 2242 3880
-> 16 0 30 2156 G 2162 3880
-> 15 0 31 2156 G 2162 3881
-> 16 0 31 2156 G 2160 3881
-> 15 0 29 2156 G 2166 3882
-> 16 0 29 2156 G 2167 3882
-> 15 0 30 2156 G 2167 3883
-> 16 0 30 2156 G 2242 3883
-> 15 0 29 2156 G 2223 3884
-> 16 0 29 2156 G 2224 3884
-> 15 0 30 2156 G 2224 3885
-> 16 0 30 2156 G 2242 3885
-> 15 0 29 2156 G 2172 3886
-> 16 0 29 2156 G 2173 3886
-> 15 0 30 2156 G 2173 3887
-> 16 0 30 2156 G 2242 3887
-> 15 0 29 2156 G 2229 3888
-> 16 0 29 2156 G 2230 3888
-> 15 0 30 2156 G 2230 3889
-> 16 0 30 2156 G 2242 3889
-> 15 0 29 2156 G 2178 3890
-> 16 0 29 2156 G 2179 3890
-> 15 0 30 2156 G 2179 3891
-> 16 0 30 2156 G 2242 3891
-> 15 0 29 2156 G 2235 3892
-> 16 0 29 2156 G 2236 3892
-> 15 0 30 2156 G 2236 3893
-> 16 0 30 2156 G 2242 3893
-> 15 0 29 2156 G 2184 3894
-> 16 0 29 2156 G 2185 3894
-> 15 0 30 2156 G 2185 3895
-> 16 0 30 2156 G 2242 3895
-> 15 0 29 2156 G 2187 3896
-> 16 0 29 2156 G 2188 3896
-> 15 0 30 2156 G 2188 3897
-> 16 0 30 2156 G 2242 3897
-> 15 0 29 2156 G 2193 3898
-> 16 0 29 2156 G 2194 3898
-> 15 0 30 2156 G 2194 3899
-> 16 0 30 2156 G 2242 3899
-> 15 0 29 2156 G 2199 3900
-> 16 0 29 2156 G 2200 3900
-> 15 0 30 2156 G 2200 3901
-> 16 0 30 2156 G 2242 3901
-> 15 0 29 2156 G 2205 3902
-> 16 0 29 2156 G 2206 3902
-> 15 0 30 2156 G 2206 3903
-> 16 0 30 2156 G 2242 3903
-> 15 0 29 2156 G 2211 3904
-> 16 0 29 2156 G 2212 3904
-> 15 0 30 2156 G 2212 3905
-> 16 0 30 2156 G 2242 3905
-> 15 0 29 2156 G 2157 3906
-> 16 0 29 2156 G 2158 3906
-> 15 0 30 2156 G 2158 3907
-> 16 0 30 2156 G 2242 3907
-> 15 0 29 2156 G 2163 3908
-> 16 0 29 2156 G 2164 3908
-> 15 0 30 2156 G 2164 3909
-> 16 0 30 2156 G 2242 3909
-> 15 0 29 2156 G 2220 3910
-> 16 0 29 2156 G 2221 3910
-> 15 0 30 2156 G 2221 3911
-> 16 0 30 2156 G 2242 3911
-> 15 0 29 2156 G 2169 3912
-> 16 0 29 2156 G 2170 3912
-> 15 0 30 2156 G 2170 3913
-> 16 0 30 2156 G 2242 3913
-> 15 0 29 2156 G 2226 3914
-> 16 0 29 2156 G 2227 3914
-> 15 0 30 2156 G 2227 3915
-> 16 0 30 2156 G 2242 3915
-> 15 0 29 2156 G 2175 3916
-> 16 0 29 2156 G 2176 3916
-> 15 0 30 2156 G 2176 3917
-> 16 0 30 2156 G 2242 3917
-> 15 0 29 2156 G 2232 3918
-> 16 0 29 2156 G 2233 3918
-> 15 0 30 2156 G 2233 3919
-> 16 0 30 2156 G 2242 3919
-> 15 0 29 2156 G 2181 3920
-> 16 0 29 2156 G 2182 3920
-> 15 0 30 2156 G 2182 3921
-> 16 0 30 2156 G 2242 3921
-> 15 0 29 2156 G 2238 3922
-> 16 0 29 2156 G 2239 3922
-> 15 0 30 2156 G 2239 3923
-> 16 0 30 2156 G 2242 3923
-> 15 0 29 2156 G 2190 3924
-> 16 0 29 2156 G 2191 3924
-> 15 0 30 2156 G 2191 3925
-> 16 0 30 2156 G 2242 3925
-> 15 0 29 2156 G 2196 3926
-> 16 0 29 2156 G 2197 3926
-> 15 0 30 2156 G 2197 3927
-> 16 0 30 2156 G 2242 3927
-> 15 0 29 2156 G 2202 3928
-> 16 0 29 2156 G 2203 3928
-> 15 0 30 2156 G 2203 3929
-> 16 0 30 2156 G 2242 3929
-> 15 0 29 2156 G 2208 3930
-> 16 0 29 2156 G 2209 3930
-> 15 0 30 2156 G 2209 3931
-> 16 0 30 2156 G 2242 3931
-> 15 0 29 2156 G 2214 3932
-> 16 0 29 2156 G 2215 3932
-> 15 0 30 2156 G 2215 3933
-> 16 0 30 2156 G 2242 3933
-> 15 0 29 2243 G 2274 3934
-> 16 0 29 2243 G 2275 3934
-> 15 0 30 2243 G 2275 3935
-> 16 0 30 2243 G 2341 3935
-> 15 0 30 2243 G 2341 3936
-> 16 0 30 2243 G 2333 3936
-> 15 0 31 2243 G 2333 3937
-> 16 0 31 2243 G 2331 3937
-> 15 0 30 2243 G 2341 3938
-> 16 0 30 2243 G 2282 3938
-> 15 0 31 2243 G 2282 3939
-> 16 0 31 2243 G 2280 3939
-> 15 0 30 2243 G 2341 3940
-> 16 0 30 2243 G 2339 3940
-> 15 0 31 2243 G 2339 3941
-> 16 0 31 2243 G 2337 3941
-> 15 0 30 2243 G 2341 3942
-> 16 0 30 2243 G 2288 3942
-> 15 0 31 2243 G 2288 3943
-> 16 0 31 2243 G 2286 3943
-> 15 0 30 2243 G 2341 3944
-> 16 0 30 2243 G 2294 3944
-> 15 0 31 2243 G 2294 3945
-> 16 0 31 2243 G 2292 3945
-> 15 0 30 2243 G 2341 3946
-> 16 0 30 2243 G 2300 3946
-> 15 0 31 2243 G 2300 3947
-> 16 0 31 2243 G 2298 3947
-> 15 0 30 2243 G 2341 3948
-> 16 0 30 2243 G 2246 3948
-> 15 0 31 2243 G 2246 3949
-> 16 0 31 2243 G 2244 3949
-> 15 0 30 2243 G 2341 3950
-> 16 0 30 2243 G 2303 3950
-> 15 0 31 2243 G 2303 3951
-> 16 0 31 2243 G 2301 3951
-> 15 0 30 2243 G 2341 3952
-> 16 0 30 2243 G 2252 3952
-> 15 0 31 2243 G 2252 3953
-> 16 0 31 2243 G 2250 3953
-> 15 0 30 2243 G 2341 3954
-> 16 0 30 2243 G 2309 3954
-> 15 0 31 2243 G 2309 3955
-> 16 0 31 2243 G 2307 3955
-> 15 0 30 2243 G 2341 3956
-> 16 0 30 2243 G 2258 3956
-> 15 0 31 2243 G 2258 3957
-> 16 0 31 2243 G 2256 3957
-> 15 0 30 2243 G 2341 3958
-> 16 0 30 2243 G 2315 3958
-> 15 0 31 2243 G 2315 3959
-> 16 0 31 2243 G 2313 3959
-> 15 0 30 2243 G 2341 3960
-> 16 0 30 2243 G 2264 3960
-> 15 0 31 2243 G 2264 3961
-> 16 0 31 2243 G 2262 3961
-> 15 0 30 2243 G 2341 3962
-> 16 0 30 2243 G 2321 3962
-> 15 0 31 2243 G 2321 3963
-> 16 0 31 2243 G 2319 3963
-> 15 0 30 2243 G 2341 3964
-> 16 0 30 2243 G 2270 3964
-> 15 0 31 2243 G 2270 3965
-> 16 0 31 2243 G 2268 3965
-> 15 0 30 2243 G 2341 3966
-> 16 0 30 2243 G 2327 3966
-> 15 0 31 2243 G 2327 3967
-> 16 0 31 2243 G 2325 3967
-> 15 0 30 2243 G 2341 3968
-> 16 0 30 2243 G 2273 3968
-> 15 0 31 2243 G 2273 3969
-> 16 0 31 2243 G 2271 3969
-> 15 0 30 2243 G 2341 3970
-> 16 0 30 2243 G 2279 3970
-> 15 0 31 2243 G 2279 3971
-> 16 0 31 2243 G 2277 3971
-> 15 0 30 2243 G 2341 3972
-> 16 0 30 2243 G 2336 3972
-> 15 0 31 2243 G 2336 3973
-> 16 0 31 2243 G 2334 3973
-> 15 0 30 2243 G 2341 3974
-> 16 0 30 2243 G 2285 3974
-> 15 0 31 2243 G 2285 3975
-> 16 0 31 2243 G 2283 3975
-> 15 0 30 2243 G 2341 3976
-> 16 0 30 2243 G 2291 3976
-> 15 0 31 2243 G 2291 3977
-> 16 0 31 2243 G 2289 3977
-> 15 0 30 2243 G 2341 3978
-> 16 0 30 2243 G 2297 3978
-> 15 0 31 2243 G 2297 3979
-> 16 0 31 2243 G 2295 3979
-> 15 0 32 2243 G 2341 3980
-> 16 0 32 2243 G 2340 3980
-> 15 0 30 2243 G 2341 3981
-> 16 0 30 2243 G 2249 3981
-> 15 0 31 2243 G 2249 3982
-> 16 0 31 2243 G 2247 3982
-> 15 0 30 2243 G 2341 3983
-> 16 0 30 2243 G 2306 3983
-> 15 0 31 2243 G 2306 3984
-> 16 0 31 2243 G 2304 3984
-> 15 0 30 2243 G 2341 3985
-> 16 0 30 2243 G 2255 3985
-> 15 0 31 2243 G 2255 3986
-> 16 0 31 2243 G 2253 3986
-> 15 0 30 2243 G 2341 3987
-> 16 0 30 2243 G 2312 3987
-> 15 0 31 2243 G 2312 3988
-> 16 0 31 2243 G 2310 3988
-> 15 0 30 2243 G 2341 3989
-> 16 0 30 2243 G 2261 3989
-> 15 0 31 2243 G 2261 3990
-> 16 0 31 2243 G 2259 3990
-> 15 0 30 2243 G 2341 3991
-> 16 0 30 2243 G 2318 3991
-> 15 0 31 2243 G 2318 3992
-> 16 0 31 2243 G 2316 3992
-> 15 0 30 2243 G 2341 3993
-> 16 0 30 2243 G 2267 3993
-> 15 0 31 2243 G 2267 3994
-> 16 0 31 2243 G 2265 3994
-> 15 0 30 2243 G 2341 3995
-> 16 0 30 2243 G 2324 3995
-> 15 0 31 2243 G 2324 3996
-> 16 0 31 2243 G 2322 3996
-> 15 0 30 2243 G 2341 3997
-> 16 0 30 2243 G 2330 3997
-> 15 0 31 2243 G 2330 3998
-> 16 0 31 2243 G 2328 3998
-> 15 0 29 2243 G 2331 3999
-> 16 0 29 2243 G 2332 3999
-> 15 0 30 2243 G 2332 4000
-> 16 0 30 2243 G 2341 4000
-> 15 0 30 2243 G 2341 4001
-> 16 0 30 2243 G 2276 4001
-> 15 0 31 2243 G 2276 4002
-> 16 0 31 2243 G 2274 4002
-> 15 0 29 2243 G 2280 4003
-> 16 0 29 2243 G 2281 4003
-> 15 0 30 2243 G 2281 4004
-> 16 0 30 2243 G 2341 4004
-> 15 0 29 2243 G 2337 4005
-> 16 0 29 2243 G 2338 4005
-> 15 0 30 2243 G 2338 4006
-> 16 0 30 2243 G 2341 4006
-> 15 0 29 2243 G 2286 4007
-> 16 0 29 2243 G 2287 4007
-> 15 0 30 2243 G 2287 4008
-> 16 0 30 2243 G 2341 4008
-> 15 0 29 2243 G 2292 4009
-> 16 0 29 2243 G 2293 4009
-> 15 0 30 2243 G 2293 4010
-> 16 0 30 2243 G 2341 4010
-> 15 0 29 2243 G 2298 4011
-> 16 0 29 2243 G 2299 4011
-> 15 0 30 2243 G 2299 4012
-> 16 0 30 2243 G 2341 4012
-> 15 0 29 2243 G 2244 4013
-> 16 0 29 2243 G 2245 4013
-> 15 0 30 2243 G 2245 4014
-> 16 0 30 2243 G 2341 4014
-> 15 0 29 2243 G 2301 4015
-> 16 0 29 2243 G 2302 4015
-> 15 0 30 2243 G 2302 4016
-> 16 0 30 2243 G 2341 4016
-> 15 0 29 2243 G 2250 4017
-> 16 0 29 2243 G 2251 4017
-> 15 0 30 2243 G 2251 4018
-> 16 0 30 2243 G 2341 4018
-> 15 0 29 2243 G 2307 4019
-> 16 0 29 2243 G 2308 4019
-> 15 0 30 2243 G 2308 4020
-> 16 0 30 2243 G 2341 4020
-> 15 0 29 2243 G 2256 4021
-> 16 0 29 2243 G 2257 4021
-> 15 0 30 2243 G 2257 4022
-> 16 0 30 2243 G 2341 4022
-> 15 0 29 2243 G 2313 4023
-> 16 0 29 2243 G 2314 4023
-> 15 0 30 2243 G 2314 4024
-> 16 0 30 2243 G 2341 4024
-> 15 0 29 2243 G 2262 4025
-> 16 0 29 2243 G 2263 4025
-> 15 0 30 2243 G 2263 4026
-> 16 0 30 2243 G 2341 4026
-> 15 0 29 2243 G 2319 4027
-> 16 0 29 2243 G 2320 4027
-> 15 0 30 2243 G 2320 4028
-> 16 0 30 2243 G 2341 4028
-> 15 0 29 2243 G 2268 4029
-> 16 0 29 2243 G 2269 4029
-> 15 0 30 2243 G 2269 4030
-> 16 0 30 2243 G 2341 4030
-> 15 0 29 2243 G 2325 4031
-> 16 0 29 2243 G 2326 4031
-> 15 0 30 2243 G 2326 4032
-> 16 0 30 2243 G 2341 4032
-> 15 0 29 2243 G 2271 4033
-> 16 0 29 2243 G 2272 4033
-> 15 0 30 2243 G 2272 4034
-> 16 0 30 2243 G 2341 4034
-> 15 0 29 2243 G 2277 4035
-> 16 0 29 2243 G 2278 4035
-> 15 0 30 2243 G 2278 4036
-> 16 0 30 2243 G 2341 4036
-> 15 0 29 2243 G 2334 4037
-> 16 0 29 2243 G 2335 4037
-> 15 0 30 2243 G 2335 4038
-> 16 0 30 2243 G 2341 4038
-> 15 0 29 2243 G 2283 4039
-> 16 0 29 2243 G 2284 4039
-> 15 0 30 2243 G 2284 4040
-> 16 0 30 2243 G 2341 4040
-> 15 0 29 2243 G 2289 4041
-> 16 0 29 2243 G 2290 4041
-> 15 0 30 2243 G 2290 4042
-> 16 0 30 2243 G 2341 4042
-> 15 0 29 2243 G 2295 4043
-> 16 0 29 2243 G 2296 4043
-> 15 0 30 2243 G 2296 4044
-> 16 0 30 2243 G 2341 4044
-> 15 0 29 2243 G 2247 4045
-> 16 0 29 2243 G 2248 4045
-> 15 0 30 2243 G 2248 4046
-> 16 0 30 2243 G 2341 4046
-> 15 0 29 2243 G 2304 4047
-> 16 0 29 2243 G 2305 4047
-> 15 0 30 2243 G 2305 4048
-> 16 0 30 2243 G 2341 4048
-> 15 0 29 2243 G 2253 4049
-> 16 0 29 2243 G 2254 4049
-> 15 0 30 2243 G 2254 4050
-> 16 0 30 2243 G 2341 4050
-> 15 0 29 2243 G 2310 4051
-> 16 0 29 2243 G 2311 4051
-> 15 0 30 2243 G 2311 4052
-> 16 0 30 2243 G 2341 4052
-> 15 0 29 2243 G 2259 4053
-> 16 0 29 2243 G 2260 4053
-> 15 0 30 2243 G 2260 4054
-> 16 0 30 2243 G 2341 4054
-> 15 0 29 2243 G 2316 4055
-> 16 0 29 2243 G 2317 4055
-> 15 0 30 2243 G 2317 4056
-> 16 0 30 2243 G 2341 4056
-> 15 0 29 2243 G 2265 4057
-> 16 0 29 2243 G 2266 4057
-> 15 0 30 2243 G 2266 4058
-> 16 0 30 2243 G 2341 4058
-> 15 0 29 2243 G 2322 4059
-> 16 0 29 2243 G 2323 4059
-> 15 0 30 2243 G 2323 4060
-> 16 0 30 2243 G 2341 4060
-> 15 0 29 2243 G 2328 4061
-> 16 0 29 2243 G 2329 4061
-> 15 0 30 2243 G 2329 4062
-> 16 0 30 2243 G 2341 4062
-> 15 0 34 2056 G 2343 4063
-> 16 0 34 2056 G 2344 4063
-> 15 0 35 2056 G 2344 4064
-> 16 0 35 2056 G 2154 4064
-> 15 0 35 2056 G 2344 4065
-> 16 0 35 2056 G 2241 4065
-> 15 0 35 2056 G 2344 4066
-> 16 0 35 2056 G 2340 4066
-> 15 0 37 1606 G 2053 4067
-> 16 0 37 1606 G 2055 4067
-> 15 0 21 1606 G 2055 4068
-> 16 0 21 1606 G 2345 4068
-> 15 0 36 1606 G 2345 4069
-> 16 0 36 1606 G 2343 4069
-> 15 0 28 1606 G 2055 4070
-> 16 0 28 1606 G 2347 4070
-> 15 0 28 1606 G 2345 4071
-> 16 0 28 1606 G 2347 4071
-> 15 0 23 462 G 469 4072
-> 16 0 23 462 G 470 4072
-> 15 0 24 462 G 470 4073
-> 16 0 24 462 G 494 4073
-> 15 0 24 462 G 494 4074
-> 16 0 24 462 G 483 4074
-> 15 0 25 462 G 483 4075
-> 16 0 25 462 G 481 4075
-> 15 0 26 462 G 494 4076
-> 16 0 26 462 G 493 4076
-> 15 0 24 462 G 494 4077
-> 16 0 24 462 G 492 4077
-> 15 0 25 462 G 492 4078
-> 16 0 25 462 G 490 4078
-> 15 0 24 462 G 494 4079
-> 16 0 24 462 G 474 4079
-> 15 0 25 462 G 474 4080
-> 16 0 25 462 G 472 4080
-> 15 0 24 462 G 494 4081
-> 16 0 24 462 G 486 4081
-> 15 0 25 462 G 486 4082
-> 16 0 25 462 G 484 4082
-> 15 0 24 462 G 494 4083
-> 16 0 24 462 G 465 4083
-> 15 0 25 462 G 465 4084
-> 16 0 25 462 G 463 4084
-> 15 0 24 462 G 494 4085
-> 16 0 24 462 G 477 4085
-> 15 0 25 462 G 477 4086
-> 16 0 25 462 G 475 4086
-> 15 0 24 462 G 494 4087
-> 16 0 24 462 G 489 4087
-> 15 0 25 462 G 489 4088
-> 16 0 25 462 G 487 4088
-> 15 0 24 462 G 494 4089
-> 16 0 24 462 G 468 4089
-> 15 0 25 462 G 468 4090
-> 16 0 25 462 G 466 4090
-> 15 0 24 462 G 494 4091
-> 16 0 24 462 G 480 4091
-> 15 0 25 462 G 480 4092
-> 16 0 25 462 G 478 4092
-> 15 0 23 462 G 481 4093
-> 16 0 23 462 G 482 4093
-> 15 0 24 462 G 482 4094
-> 16 0 24 462 G 494 4094
-> 15 0 24 462 G 494 4095
-> 16 0 24 462 G 471 4095
-> 15 0 25 462 G 471 4096
-> 16 0 25 462 G 469 4096
-> 15 0 23 462 G 490 4097
-> 16 0 23 462 G 491 4097
-> 15 0 24 462 G 491 4098
-> 16 0 24 462 G 494 4098
-> 15 0 23 462 G 472 4099
-> 16 0 23 462 G 473 4099
-> 15 0 24 462 G 473 4100
-> 16 0 24 462 G 494 4100
-> 15 0 23 462 G 484 4101
-> 16 0 23 462 G 485 4101
-> 15 0 24 462 G 485 4102
-> 16 0 24 462 G 494 4102
-> 15 0 23 462 G 463 4103
-> 16 0 23 462 G 464 4103
-> 15 0 24 462 G 464 4104
-> 16 0 24 462 G 494 4104
-> 15 0 23 462 G 475 4105
-> 16 0 23 462 G 476 4105
-> 15 0 24 462 G 476 4106
-> 16 0 24 462 G 494 4106
-> 15 0 23 462 G 487 4107
-> 16 0 23 462 G 488 4107
-> 15 0 24 462 G 488 4108
-> 16 0 24 462 G 494 4108
-> 15 0 23 462 G 466 4109
-> 16 0 23 462 G 467 4109
-> 15 0 24 462 G 467 4110
-> 16 0 24 462 G 494 4110
-> 15 0 23 462 G 478 4111
-> 16 0 23 462 G 479 4111
-> 15 0 24 462 G 479 4112
-> 16 0 24 462 G 494 4112
-> 15 0 23 22 G 35 4113
-> 16 0 23 22 G 36 4113
-> 15 0 24 22 G 36 4114
-> 16 0 24 22 G 177 4114
-> 15 0 24 22 G 177 4115
-> 16 0 24 22 G 49 4115
-> 15 0 25 22 G 49 4116
-> 16 0 25 22 G 47 4116
-> 15 0 24 22 G 177 4117
-> 16 0 24 22 G 85 4117
-> 15 0 25 22 G 85 4118
-> 16 0 25 22 G 83 4118
-> 15 0 24 22 G 177 4119
-> 16 0 24 22 G 61 4119
-> 15 0 25 22 G 61 4120
-> 16 0 25 22 G 59 4120
-> 15 0 24 22 G 177 4121
-> 16 0 24 22 G 145 4121
-> 15 0 25 22 G 145 4122
-> 16 0 25 22 G 143 4122
-> 15 0 24 22 G 177 4123
-> 16 0 24 22 G 121 4123
-> 15 0 25 22 G 121 4124
-> 16 0 25 22 G 119 4124
-> 15 0 24 22 G 177 4125
-> 16 0 24 22 G 97 4125
-> 15 0 25 22 G 97 4126
-> 16 0 25 22 G 95 4126
-> 15 0 24 22 G 177 4127
-> 16 0 24 22 G 73 4127
-> 15 0 25 22 G 73 4128
-> 16 0 25 22 G 71 4128
-> 15 0 24 22 G 177 4129
-> 16 0 24 22 G 157 4129
-> 15 0 25 22 G 157 4130
-> 16 0 25 22 G 155 4130
-> 15 0 24 22 G 177 4131
-> 16 0 24 22 G 133 4131
-> 15 0 25 22 G 133 4132
-> 16 0 25 22 G 131 4132
-> 15 0 24 22 G 177 4133
-> 16 0 24 22 G 109 4133
-> 15 0 25 22 G 109 4134
-> 16 0 25 22 G 107 4134
-> 15 0 24 22 G 177 4135
-> 16 0 24 22 G 169 4135
-> 15 0 25 22 G 169 4136
-> 16 0 25 22 G 167 4136
-> 15 0 24 22 G 177 4137
-> 16 0 24 22 G 28 4137
-> 15 0 25 22 G 28 4138
-> 16 0 25 22 G 26 4138
-> 15 0 24 22 G 177 4139
-> 16 0 24 22 G 40 4139
-> 15 0 25 22 G 40 4140
-> 16 0 25 22 G 38 4140
-> 15 0 24 22 G 177 4141
-> 16 0 24 22 G 52 4141
-> 15 0 25 22 G 52 4142
-> 16 0 25 22 G 50 4142
-> 15 0 24 22 G 177 4143
-> 16 0 24 22 G 112 4143
-> 15 0 25 22 G 112 4144
-> 16 0 25 22 G 110 4144
-> 15 0 24 22 G 177 4145
-> 16 0 24 22 G 88 4145
-> 15 0 25 22 G 88 4146
-> 16 0 25 22 G 86 4146
-> 15 0 24 22 G 177 4147
-> 16 0 24 22 G 64 4147
-> 15 0 25 22 G 64 4148
-> 16 0 25 22 G 62 4148
-> 15 0 24 22 G 177 4149
-> 16 0 24 22 G 172 4149
-> 15 0 25 22 G 172 4150
-> 16 0 25 22 G 170 4150
-> 15 0 24 22 G 177 4151
-> 16 0 24 22 G 148 4151
-> 15 0 25 22 G 148 4152
-> 16 0 25 22 G 146 4152
-> 15 0 24 22 G 177 4153
-> 16 0 24 22 G 124 4153
-> 15 0 25 22 G 124 4154
-> 16 0 25 22 G 122 4154
-> 15 0 24 22 G 177 4155
-> 16 0 24 22 G 100 4155
-> 15 0 25 22 G 100 4156
-> 16 0 25 22 G 98 4156
-> 15 0 24 22 G 177 4157
-> 16 0 24 22 G 76 4157
-> 15 0 25 22 G 76 4158
-> 16 0 25 22 G 74 4158
-> 15 0 24 22 G 177 4159
-> 16 0 24 22 G 160 4159
-> 15 0 25 22 G 160 4160
-> 16 0 25 22 G 158 4160
-> 15 0 24 22 G 177 4161
-> 16 0 24 22 G 136 4161
-> 15 0 25 22 G 136 4162
-> 16 0 25 22 G 134 4162
-> 15 0 24 22 G 177 4163
-> 16 0 24 22 G 31 4163
-> 15 0 25 22 G 31 4164
-> 16 0 25 22 G 29 4164
-> 15 0 24 22 G 177 4165
-> 16 0 24 22 G 43 4165
-> 15 0 25 22 G 43 4166
-> 16 0 25 22 G 41 4166
-> 15 0 24 22 G 177 4167
-> 16 0 24 22 G 55 4167
-> 15 0 25 22 G 55 4168
-> 16 0 25 22 G 53 4168
-> 15 0 24 22 G 177 4169
-> 16 0 24 22 G 115 4169
-> 15 0 25 22 G 115 4170
-> 16 0 25 22 G 113 4170
-> 15 0 24 22 G 177 4171
-> 16 0 24 22 G 91 4171
-> 15 0 25 22 G 91 4172
-> 16 0 25 22 G 89 4172
-> 15 0 24 22 G 177 4173
-> 16 0 24 22 G 67 4173
-> 15 0 25 22 G 67 4174
-> 16 0 25 22 G 65 4174
-> 15 0 24 22 G 177 4175
-> 16 0 24 22 G 175 4175
-> 15 0 25 22 G 175 4176
-> 16 0 25 22 G 173 4176
-> 15 0 24 22 G 177 4177
-> 16 0 24 22 G 151 4177
-> 15 0 25 22 G 151 4178
-> 16 0 25 22 G 149 4178
-> 15 0 24 22 G 177 4179
-> 16 0 24 22 G 127 4179
-> 15 0 25 22 G 127 4180
-> 16 0 25 22 G 125 4180
-> 15 0 24 22 G 177 4181
-> 16 0 24 22 G 103 4181
-> 15 0 25 22 G 103 4182
-> 16 0 25 22 G 101 4182
-> 15 0 24 22 G 177 4183
-> 16 0 24 22 G 79 4183
-> 15 0 25 22 G 79 4184
-> 16 0 25 22 G 77 4184
-> 15 0 24 22 G 177 4185
-> 16 0 24 22 G 163 4185
-> 15 0 25 22 G 163 4186
-> 16 0 25 22 G 161 4186
-> 15 0 24 22 G 177 4187
-> 16 0 24 22 G 139 4187
-> 15 0 25 22 G 139 4188
-> 16 0 25 22 G 137 4188
-> 15 0 24 22 G 177 4189
-> 16 0 24 22 G 34 4189
-> 15 0 25 22 G 34 4190
-> 16 0 25 22 G 32 4190
-> 15 0 24 22 G 177 4191
-> 16 0 24 22 G 46 4191
-> 15 0 25 22 G 46 4192
-> 16 0 25 22 G 44 4192
-> 15 0 24 22 G 177 4193
-> 16 0 24 22 G 82 4193
-> 15 0 25 22 G 82 4194
-> 16 0 25 22 G 80 4194
-> 15 0 24 22 G 177 4195
-> 16 0 24 22 G 58 4195
-> 15 0 25 22 G 58 4196
-> 16 0 25 22 G 56 4196
-> 15 0 24 22 G 177 4197
-> 16 0 24 22 G 142 4197
-> 15 0 25 22 G 142 4198
-> 16 0 25 22 G 140 4198
-> 15 0 24 22 G 177 4199
-> 16 0 24 22 G 118 4199
-> 15 0 25 22 G 118 4200
-> 16 0 25 22 G 116 4200
-> 15 0 24 22 G 177 4201
-> 16 0 24 22 G 94 4201
-> 15 0 25 22 G 94 4202
-> 16 0 25 22 G 92 4202
-> 15 0 24 22 G 177 4203
-> 16 0 24 22 G 70 4203
-> 15 0 25 22 G 70 4204
-> 16 0 25 22 G 68 4204
-> 15 0 24 22 G 177 4205
-> 16 0 24 22 G 154 4205
-> 15 0 25 22 G 154 4206
-> 16 0 25 22 G 152 4206
-> 15 0 26 22 G 177 4207
-> 16 0 26 22 G 176 4207
-> 15 0 24 22 G 177 4208
-> 16 0 24 22 G 130 4208
-> 15 0 25 22 G 130 4209
-> 16 0 25 22 G 128 4209
-> 15 0 24 22 G 177 4210
-> 16 0 24 22 G 106 4210
-> 15 0 25 22 G 106 4211
-> 16 0 25 22 G 104 4211
-> 15 0 24 22 G 177 4212
-> 16 0 24 22 G 166 4212
-> 15 0 25 22 G 166 4213
-> 16 0 25 22 G 164 4213
-> 15 0 24 22 G 177 4214
-> 16 0 24 22 G 25 4214
-> 15 0 25 22 G 25 4215
-> 16 0 25 22 G 23 4215
-> 15 0 23 22 G 47 4216
-> 16 0 23 22 G 48 4216
-> 15 0 24 22 G 48 4217
-> 16 0 24 22 G 177 4217
-> 15 0 24 22 G 177 4218
-> 16 0 24 22 G 37 4218
-> 15 0 25 22 G 37 4219
-> 16 0 25 22 G 35 4219
-> 15 0 23 22 G 83 4220
-> 16 0 23 22 G 84 4220
-> 15 0 24 22 G 84 4221
-> 16 0 24 22 G 177 4221
-> 15 0 23 22 G 59 4222
-> 16 0 23 22 G 60 4222
-> 15 0 24 22 G 60 4223
-> 16 0 24 22 G 177 4223
-> 15 0 23 22 G 143 4224
-> 16 0 23 22 G 144 4224
-> 15 0 24 22 G 144 4225
-> 16 0 24 22 G 177 4225
-> 15 0 23 22 G 119 4226
-> 16 0 23 22 G 120 4226
-> 15 0 24 22 G 120 4227
-> 16 0 24 22 G 177 4227
-> 15 0 23 22 G 95 4228
-> 16 0 23 22 G 96 4228
-> 15 0 24 22 G 96 4229
-> 16 0 24 22 G 177 4229
-> 15 0 23 22 G 71 4230
-> 16 0 23 22 G 72 4230
-> 15 0 24 22 G 72 4231
-> 16 0 24 22 G 177 4231
-> 15 0 23 22 G 155 4232
-> 16 0 23 22 G 156 4232
-> 15 0 24 22 G 156 4233
-> 16 0 24 22 G 177 4233
-> 15 0 23 22 G 131 4234
-> 16 0 23 22 G 132 4234
-> 15 0 24 22 G 132 4235
-> 16 0 24 22 G 177 4235
-> 15 0 23 22 G 107 4236
-> 16 0 23 22 G 108 4236
-> 15 0 24 22 G 108 4237
-> 16 0 24 22 G 177 4237
-> 15 0 23 22 G 167 4238
-> 16 0 23 22 G 168 4238
-> 15 0 24 22 G 168 4239
-> 16 0 24 22 G 177 4239
-> 15 0 23 22 G 26 4240
-> 16 0 23 22 G 27 4240
-> 15 0 24 22 G 27 4241
-> 16 0 24 22 G 177 4241
-> 15 0 23 22 G 38 4242
-> 16 0 23 22 G 39 4242
-> 15 0 24 22 G 39 4243
-> 16 0 24 22 G 177 4243
-> 15 0 23 22 G 50 4244
-> 16 0 23 22 G 51 4244
-> 15 0 24 22 G 51 4245
-> 16 0 24 22 G 177 4245
-> 15 0 23 22 G 110 4246
-> 16 0 23 22 G 111 4246
-> 15 0 24 22 G 111 4247
-> 16 0 24 22 G 177 4247
-> 15 0 23 22 G 86 4248
-> 16 0 23 22 G 87 4248
-> 15 0 24 22 G 87 4249
-> 16 0 24 22 G 177 4249
-> 15 0 23 22 G 62 4250
-> 16 0 23 22 G 63 4250
-> 15 0 24 22 G 63 4251
-> 16 0 24 22 G 177 4251
-> 15 0 23 22 G 170 4252
-> 16 0 23 22 G 171 4252
-> 15 0 24 22 G 171 4253
-> 16 0 24 22 G 177 4253
-> 15 0 23 22 G 146 4254
-> 16 0 23 22 G 147 4254
-> 15 0 24 22 G 147 4255
-> 16 0 24 22 G 177 4255
-> 15 0 23 22 G 122 4256
-> 16 0 23 22 G 123 4256
-> 15 0 24 22 G 123 4257
-> 16 0 24 22 G 177 4257
-> 15 0 23 22 G 98 4258
-> 16 0 23 22 G 99 4258
-> 15 0 24 22 G 99 4259
-> 16 0 24 22 G 177 4259
-> 15 0 23 22 G 74 4260
-> 16 0 23 22 G 75 4260
-> 15 0 24 22 G 75 4261
-> 16 0 24 22 G 177 4261
-> 15 0 23 22 G 158 4262
-> 16 0 23 22 G 159 4262
-> 15 0 24 22 G 159 4263
-> 16 0 24 22 G 177 4263
-> 15 0 23 22 G 134 4264
-> 16 0 23 22 G 135 4264
-> 15 0 24 22 G 135 4265
-> 16 0 24 22 G 177 4265
-> 15 0 23 22 G 29 4266
-> 16 0 23 22 G 30 4266
-> 15 0 24 22 G 30 4267
-> 16 0 24 22 G 177 4267
-> 15 0 23 22 G 41 4268
-> 16 0 23 22 G 42 4268
-> 15 0 24 22 G 42 4269
-> 16 0 24 22 G 177 4269
-> 15 0 23 22 G 53 4270
-> 16 0 23 22 G 54 4270
-> 15 0 24 22 G 54 4271
-> 16 0 24 22 G 177 4271
-> 15 0 23 22 G 113 4272
-> 16 0 23 22 G 114 4272
-> 15 0 24 22 G 114 4273
-> 16 0 24 22 G 177 4273
-> 15 0 23 22 G 89 4274
-> 16 0 23 22 G 90 4274
-> 15 0 24 22 G 90 4275
-> 16 0 24 22 G 177 4275
-> 15 0 23 22 G 65 4276
-> 16 0 23 22 G 66 4276
-> 15 0 24 22 G 66 4277
-> 16 0 24 22 G 177 4277
-> 15 0 23 22 G 173 4278
-> 16 0 23 22 G 174 4278
-> 15 0 24 22 G 174 4279
-> 16 0 24 22 G 177 4279
-> 15 0 23 22 G 149 4280
-> 16 0 23 22 G 150 4280
-> 15 0 24 22 G 150 4281
-> 16 0 24 22 G 177 4281
-> 15 0 23 22 G 125 4282
-> 16 0 23 22 G 126 4282
-> 15 0 24 22 G 126 4283
-> 16 0 24 22 G 177 4283
-> 15 0 23 22 G 101 4284
-> 16 0 23 22 G 102 4284
-> 15 0 24 22 G 102 4285
-> 16 0 24 22 G 177 4285
-> 15 0 23 22 G 77 4286
-> 16 0 23 22 G 78 4286
-> 15 0 24 22 G 78 4287
-> 16 0 24 22 G 177 4287
-> 15 0 23 22 G 161 4288
-> 16 0 23 22 G 162 4288
-> 15 0 24 22 G 162 4289
-> 16 0 24 22 G 177 4289
-> 15 0 23 22 G 137 4290
-> 16 0 23 22 G 138 4290
-> 15 0 24 22 G 138 4291
-> 16 0 24 22 G 177 4291
-> 15 0 23 22 G 32 4292
-> 16 0 23 22 G 33 4292
-> 15 0 24 22 G 33 4293
-> 16 0 24 22 G 177 4293
-> 15 0 23 22 G 44 4294
-> 16 0 23 22 G 45 4294
-> 15 0 24 22 G 45 4295
-> 16 0 24 22 G 177 4295
-> 15 0 23 22 G 80 4296
-> 16 0 23 22 G 81 4296
-> 15 0 24 22 G 81 4297
-> 16 0 24 22 G 177 4297
-> 15 0 23 22 G 56 4298
-> 16 0 23 22 G 57 4298
-> 15 0 24 22 G 57 4299
-> 16 0 24 22 G 177 4299
-> 15 0 23 22 G 140 4300
-> 16 0 23 22 G 141 4300
-> 15 0 24 22 G 141 4301
-> 16 0 24 22 G 177 4301
-> 15 0 23 22 G 116 4302
-> 16 0 23 22 G 117 4302
-> 15 0 24 22 G 117 4303
-> 16 0 24 22 G 177 4303
-> 15 0 23 22 G 92 4304
-> 16 0 23 22 G 93 4304
-> 15 0 24 22 G 93 4305
-> 16 0 24 22 G 177 4305
-> 15 0 23 22 G 68 4306
-> 16 0 23 22 G 69 4306
-> 15 0 24 22 G 69 4307
-> 16 0 24 22 G 177 4307
-> 15 0 23 22 G 152 4308
-> 16 0 23 22 G 153 4308
-> 15 0 24 22 G 153 4309
-> 16 0 24 22 G 177 4309
-> 15 0 23 22 G 128 4310
-> 16 0 23 22 G 129 4310
-> 15 0 24 22 G 129 4311
-> 16 0 24 22 G 177 4311
-> 15 0 23 22 G 104 4312
-> 16 0 23 22 G 105 4312
-> 15 0 24 22 G 105 4313
-> 16 0 24 22 G 177 4313
-> 15 0 23 22 G 164 4314
-> 16 0 23 22 G 165 4314
-> 15 0 24 22 G 165 4315
-> 16 0 24 22 G 177 4315
-> 15 0 23 22 G 23 4316
-> 16 0 23 22 G 24 4316
-> 15 0 24 22 G 24 4317
-> 16 0 24 22 G 177 4317
-> 15 0 23 179 G 441 4318
-> 16 0 23 179 G 442 4318
-> 15 0 24 179 G 442 4319
-> 16 0 24 179 G 460 4319
-> 15 0 24 179 G 460 4320
-> 16 0 24 179 G 182 4320
-> 15 0 25 179 G 182 4321
-> 16 0 25 179 G 180 4321
-> 15 0 24 179 G 460 4322
-> 16 0 24 179 G 206 4322
-> 15 0 25 179 G 206 4323
-> 16 0 25 179 G 204 4323
-> 15 0 24 179 G 460 4324
-> 16 0 24 179 G 242 4324
-> 15 0 25 179 G 242 4325
-> 16 0 25 179 G 240 4325
-> 15 0 24 179 G 460 4326
-> 16 0 24 179 G 278 4326
-> 15 0 25 179 G 278 4327
-> 16 0 25 179 G 276 4327
-> 15 0 24 179 G 460 4328
-> 16 0 24 179 G 362 4328
-> 15 0 25 179 G 362 4329
-> 16 0 25 179 G 360 4329
-> 15 0 24 179 G 460 4330
-> 16 0 24 179 G 230 4330
-> 15 0 25 179 G 230 4331
-> 16 0 25 179 G 228 4331
-> 15 0 24 179 G 460 4332
-> 16 0 24 179 G 314 4332
-> 15 0 25 179 G 314 4333
-> 16 0 25 179 G 312 4333
-> 15 0 24 179 G 460 4334
-> 16 0 24 179 G 398 4334
-> 15 0 25 179 G 398 4335
-> 16 0 25 179 G 396 4335
-> 15 0 24 179 G 460 4336
-> 16 0 24 179 G 266 4336
-> 15 0 25 179 G 266 4337
-> 16 0 25 179 G 264 4337
-> 15 0 24 179 G 460 4338
-> 16 0 24 179 G 350 4338
-> 15 0 25 179 G 350 4339
-> 16 0 25 179 G 348 4339
-> 15 0 24 179 G 460 4340
-> 16 0 24 179 G 434 4340
-> 15 0 25 179 G 434 4341
-> 16 0 25 179 G 432 4341
-> 15 0 24 179 G 460 4342
-> 16 0 24 179 G 386 4342
-> 15 0 25 179 G 386 4343
-> 16 0 25 179 G 384 4343
-> 15 0 24 179 G 460 4344
-> 16 0 24 179 G 197 4344
-> 15 0 25 179 G 197 4345
-> 16 0 25 179 G 195 4345
-> 15 0 24 179 G 460 4346
-> 16 0 24 179 G 269 4346
-> 15 0 25 179 G 269 4347
-> 16 0 25 179 G 267 4347
-> 15 0 24 179 G 460 4348
-> 16 0 24 179 G 221 4348
-> 15 0 25 179 G 221 4349
-> 16 0 25 179 G 219 4349
-> 15 0 24 179 G 460 4350
-> 16 0 24 179 G 305 4350
-> 15 0 25 179 G 305 4351
-> 16 0 25 179 G 303 4351
-> 15 0 24 179 G 460 4352
-> 16 0 24 179 G 389 4352
-> 15 0 25 179 G 389 4353
-> 16 0 25 179 G 387 4353
-> 15 0 24 179 G 460 4354
-> 16 0 24 179 G 257 4354
-> 15 0 25 179 G 257 4355
-> 16 0 25 179 G 255 4355
-> 15 0 24 179 G 460 4356
-> 16 0 24 179 G 341 4356
-> 15 0 25 179 G 341 4357
-> 16 0 25 179 G 339 4357
-> 15 0 24 179 G 460 4358
-> 16 0 24 179 G 425 4358
-> 15 0 25 179 G 425 4359
-> 16 0 25 179 G 423 4359
-> 15 0 24 179 G 460 4360
-> 16 0 24 179 G 293 4360
-> 15 0 25 179 G 293 4361
-> 16 0 25 179 G 291 4361
-> 15 0 24 179 G 460 4362
-> 16 0 24 179 G 377 4362
-> 15 0 25 179 G 377 4363
-> 16 0 25 179 G 375 4363
-> 15 0 24 179 G 460 4364
-> 16 0 24 179 G 413 4364
-> 15 0 25 179 G 413 4365
-> 16 0 25 179 G 411 4365
-> 15 0 24 179 G 460 4366
-> 16 0 24 179 G 188 4366
-> 15 0 25 179 G 188 4367
-> 16 0 25 179 G 186 4367
-> 15 0 24 179 G 460 4368
-> 16 0 24 179 G 212 4368
-> 15 0 25 179 G 212 4369
-> 16 0 25 179 G 210 4369
-> 15 0 24 179 G 460 4370
-> 16 0 24 179 G 248 4370
-> 15 0 25 179 G 248 4371
-> 16 0 25 179 G 246 4371
-> 15 0 24 179 G 460 4372
-> 16 0 24 179 G 332 4372
-> 15 0 25 179 G 332 4373
-> 16 0 25 179 G 330 4373
-> 15 0 24 179 G 460 4374
-> 16 0 24 179 G 284 4374
-> 15 0 25 179 G 284 4375
-> 16 0 25 179 G 282 4375
-> 15 0 24 179 G 460 4376
-> 16 0 24 179 G 368 4376
-> 15 0 25 179 G 368 4377
-> 16 0 25 179 G 366 4377
-> 15 0 24 179 G 460 4378
-> 16 0 24 179 G 236 4378
-> 15 0 25 179 G 236 4379
-> 16 0 25 179 G 234 4379
-> 15 0 24 179 G 460 4380
-> 16 0 24 179 G 452 4380
-> 15 0 25 179 G 452 4381
-> 16 0 25 179 G 450 4381
-> 15 0 24 179 G 460 4382
-> 16 0 24 179 G 320 4382
-> 15 0 25 179 G 320 4383
-> 16 0 25 179 G 318 4383
-> 15 0 24 179 G 460 4384
-> 16 0 24 179 G 404 4384
-> 15 0 25 179 G 404 4385
-> 16 0 25 179 G 402 4385
-> 15 0 24 179 G 460 4386
-> 16 0 24 179 G 356 4386
-> 15 0 25 179 G 356 4387
-> 16 0 25 179 G 354 4387
-> 15 0 24 179 G 460 4388
-> 16 0 24 179 G 440 4388
-> 15 0 25 179 G 440 4389
-> 16 0 25 179 G 438 4389
-> 15 0 24 179 G 460 4390
-> 16 0 24 179 G 203 4390
-> 15 0 25 179 G 203 4391
-> 16 0 25 179 G 201 4391
-> 15 0 24 179 G 460 4392
-> 16 0 24 179 G 239 4392
-> 15 0 25 179 G 239 4393
-> 16 0 25 179 G 237 4393
-> 15 0 24 179 G 460 4394
-> 16 0 24 179 G 275 4394
-> 15 0 25 179 G 275 4395
-> 16 0 25 179 G 273 4395
-> 15 0 24 179 G 460 4396
-> 16 0 24 179 G 359 4396
-> 15 0 25 179 G 359 4397
-> 16 0 25 179 G 357 4397
-> 15 0 24 179 G 460 4398
-> 16 0 24 179 G 227 4398
-> 15 0 25 179 G 227 4399
-> 16 0 25 179 G 225 4399
-> 15 0 24 179 G 460 4400
-> 16 0 24 179 G 311 4400
-> 15 0 25 179 G 311 4401
-> 16 0 25 179 G 309 4401
-> 15 0 24 179 G 460 4402
-> 16 0 24 179 G 395 4402
-> 15 0 25 179 G 395 4403
-> 16 0 25 179 G 393 4403
-> 15 0 24 179 G 460 4404
-> 16 0 24 179 G 263 4404
-> 15 0 25 179 G 263 4405
-> 16 0 25 179 G 261 4405
-> 15 0 24 179 G 460 4406
-> 16 0 24 179 G 347 4406
-> 15 0 25 179 G 347 4407
-> 16 0 25 179 G 345 4407
-> 15 0 24 179 G 460 4408
-> 16 0 24 179 G 431 4408
-> 15 0 25 179 G 431 4409
-> 16 0 25 179 G 429 4409
-> 15 0 24 179 G 460 4410
-> 16 0 24 179 G 383 4410
-> 15 0 25 179 G 383 4411
-> 16 0 25 179 G 381 4411
-> 15 0 24 179 G 460 4412
-> 16 0 24 179 G 194 4412
-> 15 0 25 179 G 194 4413
-> 16 0 25 179 G 192 4413
-> 15 0 24 179 G 460 4414
-> 16 0 24 179 G 218 4414
-> 15 0 25 179 G 218 4415
-> 16 0 25 179 G 216 4415
-> 15 0 24 179 G 460 4416
-> 16 0 24 179 G 302 4416
-> 15 0 25 179 G 302 4417
-> 16 0 25 179 G 300 4417
-> 15 0 24 179 G 460 4418
-> 16 0 24 179 G 254 4418
-> 15 0 25 179 G 254 4419
-> 16 0 25 179 G 252 4419
-> 15 0 24 179 G 460 4420
-> 16 0 24 179 G 338 4420
-> 15 0 25 179 G 338 4421
-> 16 0 25 179 G 336 4421
-> 15 0 24 179 G 460 4422
-> 16 0 24 179 G 422 4422
-> 15 0 25 179 G 422 4423
-> 16 0 25 179 G 420 4423
-> 15 0 24 179 G 460 4424
-> 16 0 24 179 G 290 4424
-> 15 0 25 179 G 290 4425
-> 16 0 25 179 G 288 4425
-> 15 0 24 179 G 460 4426
-> 16 0 24 179 G 374 4426
-> 15 0 25 179 G 374 4427
-> 16 0 25 179 G 372 4427
-> 15 0 24 179 G 460 4428
-> 16 0 24 179 G 458 4428
-> 15 0 25 179 G 458 4429
-> 16 0 25 179 G 456 4429
-> 15 0 24 179 G 460 4430
-> 16 0 24 179 G 326 4430
-> 15 0 25 179 G 326 4431
-> 16 0 25 179 G 324 4431
-> 15 0 24 179 G 460 4432
-> 16 0 24 179 G 410 4432
-> 15 0 25 179 G 410 4433
-> 16 0 25 179 G 408 4433
-> 15 0 24 179 G 460 4434
-> 16 0 24 179 G 446 4434
-> 15 0 25 179 G 446 4435
-> 16 0 25 179 G 444 4435
-> 15 0 24 179 G 460 4436
-> 16 0 24 179 G 185 4436
-> 15 0 25 179 G 185 4437
-> 16 0 25 179 G 183 4437
-> 15 0 24 179 G 460 4438
-> 16 0 24 179 G 209 4438
-> 15 0 25 179 G 209 4439
-> 16 0 25 179 G 207 4439
-> 15 0 24 179 G 460 4440
-> 16 0 24 179 G 245 4440
-> 15 0 25 179 G 245 4441
-> 16 0 25 179 G 243 4441
-> 15 0 24 179 G 460 4442
-> 16 0 24 179 G 329 4442
-> 15 0 25 179 G 329 4443
-> 16 0 25 179 G 327 4443
-> 15 0 24 179 G 460 4444
-> 16 0 24 179 G 281 4444
-> 15 0 25 179 G 281 4445
-> 16 0 25 179 G 279 4445
-> 15 0 24 179 G 460 4446
-> 16 0 24 179 G 365 4446
-> 15 0 25 179 G 365 4447
-> 16 0 25 179 G 363 4447
-> 15 0 24 179 G 460 4448
-> 16 0 24 179 G 233 4448
-> 15 0 25 179 G 233 4449
-> 16 0 25 179 G 231 4449
-> 15 0 24 179 G 460 4450
-> 16 0 24 179 G 449 4450
-> 15 0 25 179 G 449 4451
-> 16 0 25 179 G 447 4451
-> 15 0 24 179 G 460 4452
-> 16 0 24 179 G 317 4452
-> 15 0 25 179 G 317 4453
-> 16 0 25 179 G 315 4453
-> 15 0 24 179 G 460 4454
-> 16 0 24 179 G 401 4454
-> 15 0 25 179 G 401 4455
-> 16 0 25 179 G 399 4455
-> 15 0 24 179 G 460 4456
-> 16 0 24 179 G 353 4456
-> 15 0 25 179 G 353 4457
-> 16 0 25 179 G 351 4457
-> 15 0 24 179 G 460 4458
-> 16 0 24 179 G 437 4458
-> 15 0 25 179 G 437 4459
-> 16 0 25 179 G 435 4459
-> 15 0 24 179 G 460 4460
-> 16 0 24 179 G 200 4460
-> 15 0 25 179 G 200 4461
-> 16 0 25 179 G 198 4461
-> 15 0 24 179 G 460 4462
-> 16 0 24 179 G 272 4462
-> 15 0 25 179 G 272 4463
-> 16 0 25 179 G 270 4463
-> 15 0 24 179 G 460 4464
-> 16 0 24 179 G 224 4464
-> 15 0 25 179 G 224 4465
-> 16 0 25 179 G 222 4465
-> 15 0 24 179 G 460 4466
-> 16 0 24 179 G 308 4466
-> 15 0 25 179 G 308 4467
-> 16 0 25 179 G 306 4467
-> 15 0 24 179 G 460 4468
-> 16 0 24 179 G 392 4468
-> 15 0 25 179 G 392 4469
-> 16 0 25 179 G 390 4469
-> 15 0 24 179 G 460 4470
-> 16 0 24 179 G 260 4470
-> 15 0 25 179 G 260 4471
-> 16 0 25 179 G 258 4471
-> 15 0 24 179 G 460 4472
-> 16 0 24 179 G 344 4472
-> 15 0 25 179 G 344 4473
-> 16 0 25 179 G 342 4473
-> 15 0 24 179 G 460 4474
-> 16 0 24 179 G 428 4474
-> 15 0 25 179 G 428 4475
-> 16 0 25 179 G 426 4475
-> 15 0 24 179 G 460 4476
-> 16 0 24 179 G 296 4476
-> 15 0 25 179 G 296 4477
-> 16 0 25 179 G 294 4477
-> 15 0 26 179 G 460 4478
-> 16 0 26 179 G 459 4478
-> 15 0 24 179 G 460 4479
-> 16 0 24 179 G 380 4479
-> 15 0 25 179 G 380 4480
-> 16 0 25 179 G 378 4480
-> 15 0 24 179 G 460 4481
-> 16 0 24 179 G 416 4481
-> 15 0 25 179 G 416 4482
-> 16 0 25 179 G 414 4482
-> 15 0 24 179 G 460 4483
-> 16 0 24 179 G 191 4483
-> 15 0 25 179 G 191 4484
-> 16 0 25 179 G 189 4484
-> 15 0 24 179 G 460 4485
-> 16 0 24 179 G 215 4485
-> 15 0 25 179 G 215 4486
-> 16 0 25 179 G 213 4486
-> 15 0 24 179 G 460 4487
-> 16 0 24 179 G 299 4487
-> 15 0 25 179 G 299 4488
-> 16 0 25 179 G 297 4488
-> 15 0 24 179 G 460 4489
-> 16 0 24 179 G 251 4489
-> 15 0 25 179 G 251 4490
-> 16 0 25 179 G 249 4490
-> 15 0 24 179 G 460 4491
-> 16 0 24 179 G 335 4491
-> 15 0 25 179 G 335 4492
-> 16 0 25 179 G 333 4492
-> 15 0 24 179 G 460 4493
-> 16 0 24 179 G 419 4493
-> 15 0 25 179 G 419 4494
-> 16 0 25 179 G 417 4494
-> 15 0 24 179 G 460 4495
-> 16 0 24 179 G 287 4495
-> 15 0 25 179 G 287 4496
-> 16 0 25 179 G 285 4496
-> 15 0 24 179 G 460 4497
-> 16 0 24 179 G 371 4497
-> 15 0 25 179 G 371 4498
-> 16 0 25 179 G 369 4498
-> 15 0 24 179 G 460 4499
-> 16 0 24 179 G 455 4499
-> 15 0 25 179 G 455 4500
-> 16 0 25 179 G 453 4500
-> 15 0 24 179 G 460 4501
-> 16 0 24 179 G 323 4501
-> 15 0 25 179 G 323 4502
-> 16 0 25 179 G 321 4502
-> 15 0 24 179 G 460 4503
-> 16 0 24 179 G 407 4503
-> 15 0 25 179 G 407 4504
-> 16 0 25 179 G 405 4504
-> 15 0 23 179 G 180 4505
-> 16 0 23 179 G 181 4505
-> 15 0 24 179 G 181 4506
-> 16 0 24 179 G 460 4506
-> 15 0 24 179 G 460 4507
-> 16 0 24 179 G 443 4507
-> 15 0 25 179 G 443 4508
-> 16 0 25 179 G 441 4508
-> 15 0 23 179 G 204 4509
-> 16 0 23 179 G 205 4509
-> 15 0 24 179 G 205 4510
-> 16 0 24 179 G 460 4510
-> 15 0 23 179 G 240 4511
-> 16 0 23 179 G 241 4511
-> 15 0 24 179 G 241 4512
-> 16 0 24 179 G 460 4512
-> 15 0 23 179 G 276 4513
-> 16 0 23 179 G 277 4513
-> 15 0 24 179 G 277 4514
-> 16 0 24 179 G 460 4514
-> 15 0 23 179 G 360 4515
-> 16 0 23 179 G 361 4515
-> 15 0 24 179 G 361 4516
-> 16 0 24 179 G 460 4516
-> 15 0 23 179 G 228 4517
-> 16 0 23 179 G 229 4517
-> 15 0 24 179 G 229 4518
-> 16 0 24 179 G 460 4518
-> 15 0 23 179 G 312 4519
-> 16 0 23 179 G 313 4519
-> 15 0 24 179 G 313 4520
-> 16 0 24 179 G 460 4520
-> 15 0 23 179 G 396 4521
-> 16 0 23 179 G 397 4521
-> 15 0 24 179 G 397 4522
-> 16 0 24 179 G 460 4522
-> 15 0 23 179 G 264 4523
-> 16 0 23 179 G 265 4523
-> 15 0 24 179 G 265 4524
-> 16 0 24 179 G 460 4524
-> 15 0 23 179 G 348 4525
-> 16 0 23 179 G 349 4525
-> 15 0 24 179 G 349 4526
-> 16 0 24 179 G 460 4526
-> 15 0 23 179 G 432 4527
-> 16 0 23 179 G 433 4527
-> 15 0 24 179 G 433 4528
-> 16 0 24 179 G 460 4528
-> 15 0 23 179 G 384 4529
-> 16 0 23 179 G 385 4529
-> 15 0 24 179 G 385 4530
-> 16 0 24 179 G 460 4530
-> 15 0 23 179 G 195 4531
-> 16 0 23 179 G 196 4531
-> 15 0 24 179 G 196 4532
-> 16 0 24 179 G 460 4532
-> 15 0 23 179 G 267 4533
-> 16 0 23 179 G 268 4533
-> 15 0 24 179 G 268 4534
-> 16 0 24 179 G 460 4534
-> 15 0 23 179 G 219 4535
-> 16 0 23 179 G 220 4535
-> 15 0 24 179 G 220 4536
-> 16 0 24 179 G 460 4536
-> 15 0 23 179 G 303 4537
-> 16 0 23 179 G 304 4537
-> 15 0 24 179 G 304 4538
-> 16 0 24 179 G 460 4538
-> 15 0 23 179 G 387 4539
-> 16 0 23 179 G 388 4539
-> 15 0 24 179 G 388 4540
-> 16 0 24 179 G 460 4540
-> 15 0 23 179 G 255 4541
-> 16 0 23 179 G 256 4541
-> 15 0 24 179 G 256 4542
-> 16 0 24 179 G 460 4542
-> 15 0 23 179 G 339 4543
-> 16 0 23 179 G 340 4543
-> 15 0 24 179 G 340 4544
-> 16 0 24 179 G 460 4544
-> 15 0 23 179 G 423 4545
-> 16 0 23 179 G 424 4545
-> 15 0 24 179 G 424 4546
-> 16 0 24 179 G 460 4546
-> 15 0 23 179 G 291 4547
-> 16 0 23 179 G 292 4547
-> 15 0 24 179 G 292 4548
-> 16 0 24 179 G 460 4548
-> 15 0 23 179 G 375 4549
-> 16 0 23 179 G 376 4549
-> 15 0 24 179 G 376 4550
-> 16 0 24 179 G 460 4550
-> 15 0 23 179 G 411 4551
-> 16 0 23 179 G 412 4551
-> 15 0 24 179 G 412 4552
-> 16 0 24 179 G 460 4552
-> 15 0 23 179 G 186 4553
-> 16 0 23 179 G 187 4553
-> 15 0 24 179 G 187 4554
-> 16 0 24 179 G 460 4554
-> 15 0 23 179 G 210 4555
-> 16 0 23 179 G 211 4555
-> 15 0 24 179 G 211 4556
-> 16 0 24 179 G 460 4556
-> 15 0 23 179 G 246 4557
-> 16 0 23 179 G 247 4557
-> 15 0 24 179 G 247 4558
-> 16 0 24 179 G 460 4558
-> 15 0 23 179 G 330 4559
-> 16 0 23 179 G 331 4559
-> 15 0 24 179 G 331 4560
-> 16 0 24 179 G 460 4560
-> 15 0 23 179 G 282 4561
-> 16 0 23 179 G 283 4561
-> 15 0 24 179 G 283 4562
-> 16 0 24 179 G 460 4562
-> 15 0 23 179 G 366 4563
-> 16 0 23 179 G 367 4563
-> 15 0 24 179 G 367 4564
-> 16 0 24 179 G 460 4564
-> 15 0 23 179 G 234 4565
-> 16 0 23 179 G 235 4565
-> 15 0 24 179 G 235 4566
-> 16 0 24 179 G 460 4566
-> 15 0 23 179 G 450 4567
-> 16 0 23 179 G 451 4567
-> 15 0 24 179 G 451 4568
-> 16 0 24 179 G 460 4568
-> 15 0 23 179 G 318 4569
-> 16 0 23 179 G 319 4569
-> 15 0 24 179 G 319 4570
-> 16 0 24 179 G 460 4570
-> 15 0 23 179 G 402 4571
-> 16 0 23 179 G 403 4571
-> 15 0 24 179 G 403 4572
-> 16 0 24 179 G 460 4572
-> 15 0 23 179 G 354 4573
-> 16 0 23 179 G 355 4573
-> 15 0 24 179 G 355 4574
-> 16 0 24 179 G 460 4574
-> 15 0 23 179 G 438 4575
-> 16 0 23 179 G 439 4575
-> 15 0 24 179 G 439 4576
-> 16 0 24 179 G 460 4576
-> 15 0 23 179 G 201 4577
-> 16 0 23 179 G 202 4577
-> 15 0 24 179 G 202 4578
-> 16 0 24 179 G 460 4578
-> 15 0 23 179 G 237 4579
-> 16 0 23 179 G 238 4579
-> 15 0 24 179 G 238 4580
-> 16 0 24 179 G 460 4580
-> 15 0 23 179 G 273 4581
-> 16 0 23 179 G 274 4581
-> 15 0 24 179 G 274 4582
-> 16 0 24 179 G 460 4582
-> 15 0 23 179 G 357 4583
-> 16 0 23 179 G 358 4583
-> 15 0 24 179 G 358 4584
-> 16 0 24 179 G 460 4584
-> 15 0 23 179 G 225 4585
-> 16 0 23 179 G 226 4585
-> 15 0 24 179 G 226 4586
-> 16 0 24 179 G 460 4586
-> 15 0 23 179 G 309 4587
-> 16 0 23 179 G 310 4587
-> 15 0 24 179 G 310 4588
-> 16 0 24 179 G 460 4588
-> 15 0 23 179 G 393 4589
-> 16 0 23 179 G 394 4589
-> 15 0 24 179 G 394 4590
-> 16 0 24 179 G 460 4590
-> 15 0 23 179 G 261 4591
-> 16 0 23 179 G 262 4591
-> 15 0 24 179 G 262 4592
-> 16 0 24 179 G 460 4592
-> 15 0 23 179 G 345 4593
-> 16 0 23 179 G 346 4593
-> 15 0 24 179 G 346 4594
-> 16 0 24 179 G 460 4594
-> 15 0 23 179 G 429 4595
-> 16 0 23 179 G 430 4595
-> 15 0 24 179 G 430 4596
-> 16 0 24 179 G 460 4596
-> 15 0 23 179 G 381 4597
-> 16 0 23 179 G 382 4597
-> 15 0 24 179 G 382 4598
-> 16 0 24 179 G 460 4598
-> 15 0 23 179 G 192 4599
-> 16 0 23 179 G 193 4599
-> 15 0 24 179 G 193 4600
-> 16 0 24 179 G 460 4600
-> 15 0 23 179 G 216 4601
-> 16 0 23 179 G 217 4601
-> 15 0 24 179 G 217 4602
-> 16 0 24 179 G 460 4602
-> 15 0 23 179 G 300 4603
-> 16 0 23 179 G 301 4603
-> 15 0 24 179 G 301 4604
-> 16 0 24 179 G 460 4604
-> 15 0 23 179 G 252 4605
-> 16 0 23 179 G 253 4605
-> 15 0 24 179 G 253 4606
-> 16 0 24 179 G 460 4606
-> 15 0 23 179 G 336 4607
-> 16 0 23 179 G 337 4607
-> 15 0 24 179 G 337 4608
-> 16 0 24 179 G 460 4608
-> 15 0 23 179 G 420 4609
-> 16 0 23 179 G 421 4609
-> 15 0 24 179 G 421 4610
-> 16 0 24 179 G 460 4610
-> 15 0 23 179 G 288 4611
-> 16 0 23 179 G 289 4611
-> 15 0 24 179 G 289 4612
-> 16 0 24 179 G 460 4612
-> 15 0 23 179 G 372 4613
-> 16 0 23 179 G 373 4613
-> 15 0 24 179 G 373 4614
-> 16 0 24 179 G 460 4614
-> 15 0 23 179 G 456 4615
-> 16 0 23 179 G 457 4615
-> 15 0 24 179 G 457 4616
-> 16 0 24 179 G 460 4616
-> 15 0 23 179 G 324 4617
-> 16 0 23 179 G 325 4617
-> 15 0 24 179 G 325 4618
-> 16 0 24 179 G 460 4618
-> 15 0 23 179 G 408 4619
-> 16 0 23 179 G 409 4619
-> 15 0 24 179 G 409 4620
-> 16 0 24 179 G 460 4620
-> 15 0 23 179 G 444 4621
-> 16 0 23 179 G 445 4621
-> 15 0 24 179 G 445 4622
-> 16 0 24 179 G 460 4622
-> 15 0 23 179 G 183 4623
-> 16 0 23 179 G 184 4623
-> 15 0 24 179 G 184 4624
-> 16 0 24 179 G 460 4624
-> 15 0 23 179 G 207 4625
-> 16 0 23 179 G 208 4625
-> 15 0 24 179 G 208 4626
-> 16 0 24 179 G 460 4626
-> 15 0 23 179 G 243 4627
-> 16 0 23 179 G 244 4627
-> 15 0 24 179 G 244 4628
-> 16 0 24 179 G 460 4628
-> 15 0 23 179 G 327 4629
-> 16 0 23 179 G 328 4629
-> 15 0 24 179 G 328 4630
-> 16 0 24 179 G 460 4630
-> 15 0 23 179 G 279 4631
-> 16 0 23 179 G 280 4631
-> 15 0 24 179 G 280 4632
-> 16 0 24 179 G 460 4632
-> 15 0 23 179 G 363 4633
-> 16 0 23 179 G 364 4633
-> 15 0 24 179 G 364 4634
-> 16 0 24 179 G 460 4634
-> 15 0 23 179 G 231 4635
-> 16 0 23 179 G 232 4635
-> 15 0 24 179 G 232 4636
-> 16 0 24 179 G 460 4636
-> 15 0 23 179 G 447 4637
-> 16 0 23 179 G 448 4637
-> 15 0 24 179 G 448 4638
-> 16 0 24 179 G 460 4638
-> 15 0 23 179 G 315 4639
-> 16 0 23 179 G 316 4639
-> 15 0 24 179 G 316 4640
-> 16 0 24 179 G 460 4640
-> 15 0 23 179 G 399 4641
-> 16 0 23 179 G 400 4641
-> 15 0 24 179 G 400 4642
-> 16 0 24 179 G 460 4642
-> 15 0 23 179 G 351 4643
-> 16 0 23 179 G 352 4643
-> 15 0 24 179 G 352 4644
-> 16 0 24 179 G 460 4644
-> 15 0 23 179 G 435 4645
-> 16 0 23 179 G 436 4645
-> 15 0 24 179 G 436 4646
-> 16 0 24 179 G 460 4646
-> 15 0 23 179 G 198 4647
-> 16 0 23 179 G 199 4647
-> 15 0 24 179 G 199 4648
-> 16 0 24 179 G 460 4648
-> 15 0 23 179 G 270 4649
-> 16 0 23 179 G 271 4649
-> 15 0 24 179 G 271 4650
-> 16 0 24 179 G 460 4650
-> 15 0 23 179 G 222 4651
-> 16 0 23 179 G 223 4651
-> 15 0 24 179 G 223 4652
-> 16 0 24 179 G 460 4652
-> 15 0 23 179 G 306 4653
-> 16 0 23 179 G 307 4653
-> 15 0 24 179 G 307 4654
-> 16 0 24 179 G 460 4654
-> 15 0 23 179 G 390 4655
-> 16 0 23 179 G 391 4655
-> 15 0 24 179 G 391 4656
-> 16 0 24 179 G 460 4656
-> 15 0 23 179 G 258 4657
-> 16 0 23 179 G 259 4657
-> 15 0 24 179 G 259 4658
-> 16 0 24 179 G 460 4658
-> 15 0 23 179 G 342 4659
-> 16 0 23 179 G 343 4659
-> 15 0 24 179 G 343 4660
-> 16 0 24 179 G 460 4660
-> 15 0 23 179 G 426 4661
-> 16 0 23 179 G 427 4661
-> 15 0 24 179 G 427 4662
-> 16 0 24 179 G 460 4662
-> 15 0 23 179 G 294 4663
-> 16 0 23 179 G 295 4663
-> 15 0 24 179 G 295 4664
-> 16 0 24 179 G 460 4664
-> 15 0 23 179 G 378 4665
-> 16 0 23 179 G 379 4665
-> 15 0 24 179 G 379 4666
-> 16 0 24 179 G 460 4666
-> 15 0 23 179 G 414 4667
-> 16 0 23 179 G 415 4667
-> 15 0 24 179 G 415 4668
-> 16 0 24 179 G 460 4668
-> 15 0 23 179 G 189 4669
-> 16 0 23 179 G 190 4669
-> 15 0 24 179 G 190 4670
-> 16 0 24 179 G 460 4670
-> 15 0 23 179 G 213 4671
-> 16 0 23 179 G 214 4671
-> 15 0 24 179 G 214 4672
-> 16 0 24 179 G 460 4672
-> 15 0 23 179 G 297 4673
-> 16 0 23 179 G 298 4673
-> 15 0 24 179 G 298 4674
-> 16 0 24 179 G 460 4674
-> 15 0 23 179 G 249 4675
-> 16 0 23 179 G 250 4675
-> 15 0 24 179 G 250 4676
-> 16 0 24 179 G 460 4676
-> 15 0 23 179 G 333 4677
-> 16 0 23 179 G 334 4677
-> 15 0 24 179 G 334 4678
-> 16 0 24 179 G 460 4678
-> 15 0 23 179 G 417 4679
-> 16 0 23 179 G 418 4679
-> 15 0 24 179 G 418 4680
-> 16 0 24 179 G 460 4680
-> 15 0 23 179 G 285 4681
-> 16 0 23 179 G 286 4681
-> 15 0 24 179 G 286 4682
-> 16 0 24 179 G 460 4682
-> 15 0 23 179 G 369 4683
-> 16 0 23 179 G 370 4683
-> 15 0 24 179 G 370 4684
-> 16 0 24 179 G 460 4684
-> 15 0 23 179 G 453 4685
-> 16 0 23 179 G 454 4685
-> 15 0 24 179 G 454 4686
-> 16 0 24 179 G 460 4686
-> 15 0 23 179 G 321 4687
-> 16 0 23 179 G 322 4687
-> 15 0 24 179 G 322 4688
-> 16 0 24 179 G 460 4688
-> 15 0 23 179 G 405 4689
-> 16 0 23 179 G 406 4689
-> 15 0 24 179 G 406 4690
-> 16 0 24 179 G 460 4690
-> 15 0 27 21 G 493 4691
-> 16 0 27 21 G 495 4691
-> 15 0 21 21 G 495 4692
-> 16 0 21 21 G 178 4692
-> 15 0 28 21 G 178 4693
-> 16 0 28 21 G 176 4693
-> 15 0 28 21 G 495 4694
-> 16 0 28 21 G 497 4694
-> 15 0 21 21 G 495 4695
-> 16 0 21 21 G 461 4695
-> 15 0 28 21 G 461 4696
-> 16 0 28 21 G 459 4696
-> 15 0 28 21 G 178 4697
-> 16 0 28 21 G 497 4697
-> 15 0 21 21 G 178 4698
-> 16 0 21 21 G 461 4698
-> 15 0 27 21 G 497 4699
-> 16 0 27 21 G 461 4699
-> 15 0 23 1362 G 1375 4700
-> 16 0 23 1362 G 1376 4700
-> 15 0 24 1362 G 1376 4701
-> 16 0 24 1362 G 1601 4701
-> 15 0 24 1362 G 1601 4702
-> 16 0 24 1362 G 1425 4702
-> 15 0 25 1362 G 1425 4703
-> 16 0 25 1362 G 1423 4703
-> 15 0 24 1362 G 1601 4704
-> 16 0 24 1362 G 1401 4704
-> 15 0 25 1362 G 1401 4705
-> 16 0 25 1362 G 1399 4705
-> 15 0 24 1362 G 1601 4706
-> 16 0 24 1362 G 1545 4706
-> 15 0 25 1362 G 1545 4707
-> 16 0 25 1362 G 1543 4707
-> 15 0 24 1362 G 1601 4708
-> 16 0 24 1362 G 1521 4708
-> 15 0 25 1362 G 1521 4709
-> 16 0 25 1362 G 1519 4709
-> 15 0 24 1362 G 1601 4710
-> 16 0 24 1362 G 1497 4710
-> 15 0 25 1362 G 1497 4711
-> 16 0 25 1362 G 1495 4711
-> 15 0 24 1362 G 1601 4712
-> 16 0 24 1362 G 1473 4712
-> 15 0 25 1362 G 1473 4713
-> 16 0 25 1362 G 1471 4713
-> 15 0 24 1362 G 1601 4714
-> 16 0 24 1362 G 1449 4714
-> 15 0 25 1362 G 1449 4715
-> 16 0 25 1362 G 1447 4715
-> 15 0 24 1362 G 1601 4716
-> 16 0 24 1362 G 1593 4716
-> 15 0 25 1362 G 1593 4717
-> 16 0 25 1362 G 1591 4717
-> 15 0 24 1362 G 1601 4718
-> 16 0 24 1362 G 1569 4718
-> 15 0 25 1362 G 1569 4719
-> 16 0 25 1362 G 1567 4719
-> 15 0 24 1362 G 1601 4720
-> 16 0 24 1362 G 1380 4720
-> 15 0 25 1362 G 1380 4721
-> 16 0 25 1362 G 1378 4721
-> 15 0 24 1362 G 1601 4722
-> 16 0 24 1362 G 1452 4722
-> 15 0 25 1362 G 1452 4723
-> 16 0 25 1362 G 1450 4723
-> 15 0 24 1362 G 1601 4724
-> 16 0 24 1362 G 1428 4724
-> 15 0 25 1362 G 1428 4725
-> 16 0 25 1362 G 1426 4725
-> 15 0 24 1362 G 1601 4726
-> 16 0 24 1362 G 1404 4726
-> 15 0 25 1362 G 1404 4727
-> 16 0 25 1362 G 1402 4727
-> 15 0 24 1362 G 1601 4728
-> 16 0 24 1362 G 1572 4728
-> 15 0 25 1362 G 1572 4729
-> 16 0 25 1362 G 1570 4729
-> 15 0 24 1362 G 1601 4730
-> 16 0 24 1362 G 1548 4730
-> 15 0 25 1362 G 1548 4731
-> 16 0 25 1362 G 1546 4731
-> 15 0 24 1362 G 1601 4732
-> 16 0 24 1362 G 1524 4732
-> 15 0 25 1362 G 1524 4733
-> 16 0 25 1362 G 1522 4733
-> 15 0 24 1362 G 1601 4734
-> 16 0 24 1362 G 1500 4734
-> 15 0 25 1362 G 1500 4735
-> 16 0 25 1362 G 1498 4735
-> 15 0 24 1362 G 1601 4736
-> 16 0 24 1362 G 1476 4736
-> 15 0 25 1362 G 1476 4737
-> 16 0 25 1362 G 1474 4737
-> 15 0 24 1362 G 1601 4738
-> 16 0 24 1362 G 1596 4738
-> 15 0 25 1362 G 1596 4739
-> 16 0 25 1362 G 1594 4739
-> 15 0 24 1362 G 1601 4740
-> 16 0 24 1362 G 1383 4740
-> 15 0 25 1362 G 1383 4741
-> 16 0 25 1362 G 1381 4741
-> 15 0 24 1362 G 1601 4742
-> 16 0 24 1362 G 1455 4742
-> 15 0 25 1362 G 1455 4743
-> 16 0 25 1362 G 1453 4743
-> 15 0 24 1362 G 1601 4744
-> 16 0 24 1362 G 1431 4744
-> 15 0 25 1362 G 1431 4745
-> 16 0 25 1362 G 1429 4745
-> 15 0 24 1362 G 1601 4746
-> 16 0 24 1362 G 1407 4746
-> 15 0 25 1362 G 1407 4747
-> 16 0 25 1362 G 1405 4747
-> 15 0 24 1362 G 1601 4748
-> 16 0 24 1362 G 1575 4748
-> 15 0 25 1362 G 1575 4749
-> 16 0 25 1362 G 1573 4749
-> 15 0 24 1362 G 1601 4750
-> 16 0 24 1362 G 1551 4750
-> 15 0 25 1362 G 1551 4751
-> 16 0 25 1362 G 1549 4751
-> 15 0 24 1362 G 1601 4752
-> 16 0 24 1362 G 1527 4752
-> 15 0 25 1362 G 1527 4753
-> 16 0 25 1362 G 1525 4753
-> 15 0 24 1362 G 1601 4754
-> 16 0 24 1362 G 1503 4754
-> 15 0 25 1362 G 1503 4755
-> 16 0 25 1362 G 1501 4755
-> 15 0 24 1362 G 1601 4756
-> 16 0 24 1362 G 1479 4756
-> 15 0 25 1362 G 1479 4757
-> 16 0 25 1362 G 1477 4757
-> 15 0 24 1362 G 1601 4758
-> 16 0 24 1362 G 1599 4758
-> 15 0 25 1362 G 1599 4759
-> 16 0 25 1362 G 1597 4759
-> 15 0 24 1362 G 1601 4760
-> 16 0 24 1362 G 1386 4760
-> 15 0 25 1362 G 1386 4761
-> 16 0 25 1362 G 1384 4761
-> 15 0 26 1362 G 1601 4762
-> 16 0 26 1362 G 1600 4762
-> 15 0 24 1362 G 1601 4763
-> 16 0 24 1362 G 1482 4763
-> 15 0 25 1362 G 1482 4764
-> 16 0 25 1362 G 1480 4764
-> 15 0 24 1362 G 1601 4765
-> 16 0 24 1362 G 1458 4765
-> 15 0 25 1362 G 1458 4766
-> 16 0 25 1362 G 1456 4766
-> 15 0 24 1362 G 1601 4767
-> 16 0 24 1362 G 1434 4767
-> 15 0 25 1362 G 1434 4768
-> 16 0 25 1362 G 1432 4768
-> 15 0 24 1362 G 1601 4769
-> 16 0 24 1362 G 1410 4769
-> 15 0 25 1362 G 1410 4770
-> 16 0 25 1362 G 1408 4770
-> 15 0 24 1362 G 1601 4771
-> 16 0 24 1362 G 1578 4771
-> 15 0 25 1362 G 1578 4772
-> 16 0 25 1362 G 1576 4772
-> 15 0 24 1362 G 1601 4773
-> 16 0 24 1362 G 1554 4773
-> 15 0 25 1362 G 1554 4774
-> 16 0 25 1362 G 1552 4774
-> 15 0 24 1362 G 1601 4775
-> 16 0 24 1362 G 1530 4775
-> 15 0 25 1362 G 1530 4776
-> 16 0 25 1362 G 1528 4776
-> 15 0 24 1362 G 1601 4777
-> 16 0 24 1362 G 1506 4777
-> 15 0 25 1362 G 1506 4778
-> 16 0 25 1362 G 1504 4778
-> 15 0 24 1362 G 1601 4779
-> 16 0 24 1362 G 1365 4779
-> 15 0 25 1362 G 1365 4780
-> 16 0 25 1362 G 1363 4780
-> 15 0 24 1362 G 1601 4781
-> 16 0 24 1362 G 1389 4781
-> 15 0 25 1362 G 1389 4782
-> 16 0 25 1362 G 1387 4782
-> 15 0 24 1362 G 1601 4783
-> 16 0 24 1362 G 1485 4783
-> 15 0 25 1362 G 1485 4784
-> 16 0 25 1362 G 1483 4784
-> 15 0 24 1362 G 1601 4785
-> 16 0 24 1362 G 1461 4785
-> 15 0 25 1362 G 1461 4786
-> 16 0 25 1362 G 1459 4786
-> 15 0 24 1362 G 1601 4787
-> 16 0 24 1362 G 1437 4787
-> 15 0 25 1362 G 1437 4788
-> 16 0 25 1362 G 1435 4788
-> 15 0 24 1362 G 1601 4789
-> 16 0 24 1362 G 1413 4789
-> 15 0 25 1362 G 1413 4790
-> 16 0 25 1362 G 1411 4790
-> 15 0 24 1362 G 1601 4791
-> 16 0 24 1362 G 1581 4791
-> 15 0 25 1362 G 1581 4792
-> 16 0 25 1362 G 1579 4792
-> 15 0 24 1362 G 1601 4793
-> 16 0 24 1362 G 1557 4793
-> 15 0 25 1362 G 1557 4794
-> 16 0 25 1362 G 1555 4794
-> 15 0 24 1362 G 1601 4795
-> 16 0 24 1362 G 1533 4795
-> 15 0 25 1362 G 1533 4796
-> 16 0 25 1362 G 1531 4796
-> 15 0 24 1362 G 1601 4797
-> 16 0 24 1362 G 1509 4797
-> 15 0 25 1362 G 1509 4798
-> 16 0 25 1362 G 1507 4798
-> 15 0 24 1362 G 1601 4799
-> 16 0 24 1362 G 1368 4799
-> 15 0 25 1362 G 1368 4800
-> 16 0 25 1362 G 1366 4800
-> 15 0 24 1362 G 1601 4801
-> 16 0 24 1362 G 1392 4801
-> 15 0 25 1362 G 1392 4802
-> 16 0 25 1362 G 1390 4802
-> 15 0 24 1362 G 1601 4803
-> 16 0 24 1362 G 1512 4803
-> 15 0 25 1362 G 1512 4804
-> 16 0 25 1362 G 1510 4804
-> 15 0 24 1362 G 1601 4805
-> 16 0 24 1362 G 1488 4805
-> 15 0 25 1362 G 1488 4806
-> 16 0 25 1362 G 1486 4806
-> 15 0 24 1362 G 1601 4807
-> 16 0 24 1362 G 1464 4807
-> 15 0 25 1362 G 1464 4808
-> 16 0 25 1362 G 1462 4808
-> 15 0 24 1362 G 1601 4809
-> 16 0 24 1362 G 1440 4809
-> 15 0 25 1362 G 1440 4810
-> 16 0 25 1362 G 1438 4810
-> 15 0 24 1362 G 1601 4811
-> 16 0 24 1362 G 1416 4811
-> 15 0 25 1362 G 1416 4812
-> 16 0 25 1362 G 1414 4812
-> 15 0 24 1362 G 1601 4813
-> 16 0 24 1362 G 1584 4813
-> 15 0 25 1362 G 1584 4814
-> 16 0 25 1362 G 1582 4814
-> 15 0 24 1362 G 1601 4815
-> 16 0 24 1362 G 1560 4815
-> 15 0 25 1362 G 1560 4816
-> 16 0 25 1362 G 1558 4816
-> 15 0 24 1362 G 1601 4817
-> 16 0 24 1362 G 1536 4817
-> 15 0 25 1362 G 1536 4818
-> 16 0 25 1362 G 1534 4818
-> 15 0 24 1362 G 1601 4819
-> 16 0 24 1362 G 1371 4819
-> 15 0 25 1362 G 1371 4820
-> 16 0 25 1362 G 1369 4820
-> 15 0 24 1362 G 1601 4821
-> 16 0 24 1362 G 1395 4821
-> 15 0 25 1362 G 1395 4822
-> 16 0 25 1362 G 1393 4822
-> 15 0 24 1362 G 1601 4823
-> 16 0 24 1362 G 1515 4823
-> 15 0 25 1362 G 1515 4824
-> 16 0 25 1362 G 1513 4824
-> 15 0 24 1362 G 1601 4825
-> 16 0 24 1362 G 1491 4825
-> 15 0 25 1362 G 1491 4826
-> 16 0 25 1362 G 1489 4826
-> 15 0 24 1362 G 1601 4827
-> 16 0 24 1362 G 1467 4827
-> 15 0 25 1362 G 1467 4828
-> 16 0 25 1362 G 1465 4828
-> 15 0 24 1362 G 1601 4829
-> 16 0 24 1362 G 1443 4829
-> 15 0 25 1362 G 1443 4830
-> 16 0 25 1362 G 1441 4830
-> 15 0 24 1362 G 1601 4831
-> 16 0 24 1362 G 1419 4831
-> 15 0 25 1362 G 1419 4832
-> 16 0 25 1362 G 1417 4832
-> 15 0 24 1362 G 1601 4833
-> 16 0 24 1362 G 1587 4833
-> 15 0 25 1362 G 1587 4834
-> 16 0 25 1362 G 1585 4834
-> 15 0 24 1362 G 1601 4835
-> 16 0 24 1362 G 1563 4835
-> 15 0 25 1362 G 1563 4836
-> 16 0 25 1362 G 1561 4836
-> 15 0 24 1362 G 1601 4837
-> 16 0 24 1362 G 1539 4837
-> 15 0 25 1362 G 1539 4838
-> 16 0 25 1362 G 1537 4838
-> 15 0 24 1362 G 1601 4839
-> 16 0 24 1362 G 1374 4839
-> 15 0 25 1362 G 1374 4840
-> 16 0 25 1362 G 1372 4840
-> 15 0 24 1362 G 1601 4841
-> 16 0 24 1362 G 1422 4841
-> 15 0 25 1362 G 1422 4842
-> 16 0 25 1362 G 1420 4842
-> 15 0 24 1362 G 1601 4843
-> 16 0 24 1362 G 1398 4843
-> 15 0 25 1362 G 1398 4844
-> 16 0 25 1362 G 1396 4844
-> 15 0 24 1362 G 1601 4845
-> 16 0 24 1362 G 1542 4845
-> 15 0 25 1362 G 1542 4846
-> 16 0 25 1362 G 1540 4846
-> 15 0 24 1362 G 1601 4847
-> 16 0 24 1362 G 1518 4847
-> 15 0 25 1362 G 1518 4848
-> 16 0 25 1362 G 1516 4848
-> 15 0 24 1362 G 1601 4849
-> 16 0 24 1362 G 1494 4849
-> 15 0 25 1362 G 1494 4850
-> 16 0 25 1362 G 1492 4850
-> 15 0 24 1362 G 1601 4851
-> 16 0 24 1362 G 1470 4851
-> 15 0 25 1362 G 1470 4852
-> 16 0 25 1362 G 1468 4852
-> 15 0 24 1362 G 1601 4853
-> 16 0 24 1362 G 1446 4853
-> 15 0 25 1362 G 1446 4854
-> 16 0 25 1362 G 1444 4854
-> 15 0 24 1362 G 1601 4855
-> 16 0 24 1362 G 1590 4855
-> 15 0 25 1362 G 1590 4856
-> 16 0 25 1362 G 1588 4856
-> 15 0 24 1362 G 1601 4857
-> 16 0 24 1362 G 1566 4857
-> 15 0 25 1362 G 1566 4858
-> 16 0 25 1362 G 1564 4858
-> 15 0 23 1362 G 1423 4859
-> 16 0 23 1362 G 1424 4859
-> 15 0 24 1362 G 1424 4860
-> 16 0 24 1362 G 1601 4860
-> 15 0 24 1362 G 1601 4861
-> 16 0 24 1362 G 1377 4861
-> 15 0 25 1362 G 1377 4862
-> 16 0 25 1362 G 1375 4862
-> 15 0 23 1362 G 1399 4863
-> 16 0 23 1362 G 1400 4863
-> 15 0 24 1362 G 1400 4864
-> 16 0 24 1362 G 1601 4864
-> 15 0 23 1362 G 1543 4865
-> 16 0 23 1362 G 1544 4865
-> 15 0 24 1362 G 1544 4866
-> 16 0 24 1362 G 1601 4866
-> 15 0 23 1362 G 1519 4867
-> 16 0 23 1362 G 1520 4867
-> 15 0 24 1362 G 1520 4868
-> 16 0 24 1362 G 1601 4868
-> 15 0 23 1362 G 1495 4869
-> 16 0 23 1362 G 1496 4869
-> 15 0 24 1362 G 1496 4870
-> 16 0 24 1362 G 1601 4870
-> 15 0 23 1362 G 1471 4871
-> 16 0 23 1362 G 1472 4871
-> 15 0 24 1362 G 1472 4872
-> 16 0 24 1362 G 1601 4872
-> 15 0 23 1362 G 1447 4873
-> 16 0 23 1362 G 1448 4873
-> 15 0 24 1362 G 1448 4874
-> 16 0 24 1362 G 1601 4874
-> 15 0 23 1362 G 1591 4875
-> 16 0 23 1362 G 1592 4875
-> 15 0 24 1362 G 1592 4876
-> 16 0 24 1362 G 1601 4876
-> 15 0 23 1362 G 1567 4877
-> 16 0 23 1362 G 1568 4877
-> 15 0 24 1362 G 1568 4878
-> 16 0 24 1362 G 1601 4878
-> 15 0 23 1362 G 1378 4879
-> 16 0 23 1362 G 1379 4879
-> 15 0 24 1362 G 1379 4880
-> 16 0 24 1362 G 1601 4880
-> 15 0 23 1362 G 1450 4881
-> 16 0 23 1362 G 1451 4881
-> 15 0 24 1362 G 1451 4882
-> 16 0 24 1362 G 1601 4882
-> 15 0 23 1362 G 1426 4883
-> 16 0 23 1362 G 1427 4883
-> 15 0 24 1362 G 1427 4884
-> 16 0 24 1362 G 1601 4884
-> 15 0 23 1362 G 1402 4885
-> 16 0 23 1362 G 1403 4885
-> 15 0 24 1362 G 1403 4886
-> 16 0 24 1362 G 1601 4886
-> 15 0 23 1362 G 1570 4887
-> 16 0 23 1362 G 1571 4887
-> 15 0 24 1362 G 1571 4888
-> 16 0 24 1362 G 1601 4888
-> 15 0 23 1362 G 1546 4889
-> 16 0 23 1362 G 1547 4889
-> 15 0 24 1362 G 1547 4890
-> 16 0 24 1362 G 1601 4890
-> 15 0 23 1362 G 1522 4891
-> 16 0 23 1362 G 1523 4891
-> 15 0 24 1362 G 1523 4892
-> 16 0 24 1362 G 1601 4892
-> 15 0 23 1362 G 1498 4893
-> 16 0 23 1362 G 1499 4893
-> 15 0 24 1362 G 1499 4894
-> 16 0 24 1362 G 1601 4894
-> 15 0 23 1362 G 1474 4895
-> 16 0 23 1362 G 1475 4895
-> 15 0 24 1362 G 1475 4896
-> 16 0 24 1362 G 1601 4896
-> 15 0 23 1362 G 1594 4897
-> 16 0 23 1362 G 1595 4897
-> 15 0 24 1362 G 1595 4898
-> 16 0 24 1362 G 1601 4898
-> 15 0 23 1362 G 1381 4899
-> 16 0 23 1362 G 1382 4899
-> 15 0 24 1362 G 1382 4900
-> 16 0 24 1362 G 1601 4900
-> 15 0 23 1362 G 1453 4901
-> 16 0 23 1362 G 1454 4901
-> 15 0 24 1362 G 1454 4902
-> 16 0 24 1362 G 1601 4902
-> 15 0 23 1362 G 1429 4903
-> 16 0 23 1362 G 1430 4903
-> 15 0 24 1362 G 1430 4904
-> 16 0 24 1362 G 1601 4904
-> 15 0 23 1362 G 1405 4905
-> 16 0 23 1362 G 1406 4905
-> 15 0 24 1362 G 1406 4906
-> 16 0 24 1362 G 1601 4906
-> 15 0 23 1362 G 1573 4907
-> 16 0 23 1362 G 1574 4907
-> 15 0 24 1362 G 1574 4908
-> 16 0 24 1362 G 1601 4908
-> 15 0 23 1362 G 1549 4909
-> 16 0 23 1362 G 1550 4909
-> 15 0 24 1362 G 1550 4910
-> 16 0 24 1362 G 1601 4910
-> 15 0 23 1362 G 1525 4911
-> 16 0 23 1362 G 1526 4911
-> 15 0 24 1362 G 1526 4912
-> 16 0 24 1362 G 1601 4912
-> 15 0 23 1362 G 1501 4913
-> 16 0 23 1362 G 1502 4913
-> 15 0 24 1362 G 1502 4914
-> 16 0 24 1362 G 1601 4914
-> 15 0 23 1362 G 1477 4915
-> 16 0 23 1362 G 1478 4915
-> 15 0 24 1362 G 1478 4916
-> 16 0 24 1362 G 1601 4916
-> 15 0 23 1362 G 1597 4917
-> 16 0 23 1362 G 1598 4917
-> 15 0 24 1362 G 1598 4918
-> 16 0 24 1362 G 1601 4918
-> 15 0 23 1362 G 1384 4919
-> 16 0 23 1362 G 1385 4919
-> 15 0 24 1362 G 1385 4920
-> 16 0 24 1362 G 1601 4920
-> 15 0 23 1362 G 1480 4921
-> 16 0 23 1362 G 1481 4921
-> 15 0 24 1362 G 1481 4922
-> 16 0 24 1362 G 1601 4922
-> 15 0 23 1362 G 1456 4923
-> 16 0 23 1362 G 1457 4923
-> 15 0 24 1362 G 1457 4924
-> 16 0 24 1362 G 1601 4924
-> 15 0 23 1362 G 1432 4925
-> 16 0 23 1362 G 1433 4925
-> 15 0 24 1362 G 1433 4926
-> 16 0 24 1362 G 1601 4926
-> 15 0 23 1362 G 1408 4927
-> 16 0 23 1362 G 1409 4927
-> 15 0 24 1362 G 1409 4928
-> 16 0 24 1362 G 1601 4928
-> 15 0 23 1362 G 1576 4929
-> 16 0 23 1362 G 1577 4929
-> 15 0 24 1362 G 1577 4930
-> 16 0 24 1362 G 1601 4930
-> 15 0 23 1362 G 1552 4931
-> 16 0 23 1362 G 1553 4931
-> 15 0 24 1362 G 1553 4932
-> 16 0 24 1362 G 1601 4932
-> 15 0 23 1362 G 1528 4933
-> 16 0 23 1362 G 1529 4933
-> 15 0 24 1362 G 1529 4934
-> 16 0 24 1362 G 1601 4934
-> 15 0 23 1362 G 1504 4935
-> 16 0 23 1362 G 1505 4935
-> 15 0 24 1362 G 1505 4936
-> 16 0 24 1362 G 1601 4936
-> 15 0 23 1362 G 1363 4937
-> 16 0 23 1362 G 1364 4937
-> 15 0 24 1362 G 1364 4938
-> 16 0 24 1362 G 1601 4938
-> 15 0 23 1362 G 1387 4939
-> 16 0 23 1362 G 1388 4939
-> 15 0 24 1362 G 1388 4940
-> 16 0 24 1362 G 1601 4940
-> 15 0 23 1362 G 1483 4941
-> 16 0 23 1362 G 1484 4941
-> 15 0 24 1362 G 1484 4942
-> 16 0 24 1362 G 1601 4942
-> 15 0 23 1362 G 1459 4943
-> 16 0 23 1362 G 1460 4943
-> 15 0 24 1362 G 1460 4944
-> 16 0 24 1362 G 1601 4944
-> 15 0 23 1362 G 1435 4945
-> 16 0 23 1362 G 1436 4945
-> 15 0 24 1362 G 1436 4946
-> 16 0 24 1362 G 1601 4946
-> 15 0 23 1362 G 1411 4947
-> 16 0 23 1362 G 1412 4947
-> 15 0 24 1362 G 1412 4948
-> 16 0 24 1362 G 1601 4948
-> 15 0 23 1362 G 1579 4949
-> 16 0 23 1362 G 1580 4949
-> 15 0 24 1362 G 1580 4950
-> 16 0 24 1362 G 1601 4950
-> 15 0 23 1362 G 1555 4951
-> 16 0 23 1362 G 1556 4951
-> 15 0 24 1362 G 1556 4952
-> 16 0 24 1362 G 1601 4952
-> 15 0 23 1362 G 1531 4953
-> 16 0 23 1362 G 1532 4953
-> 15 0 24 1362 G 1532 4954
-> 16 0 24 1362 G 1601 4954
-> 15 0 23 1362 G 1507 4955
-> 16 0 23 1362 G 1508 4955
-> 15 0 24 1362 G 1508 4956
-> 16 0 24 1362 G 1601 4956
-> 15 0 23 1362 G 1366 4957
-> 16 0 23 1362 G 1367 4957
-> 15 0 24 1362 G 1367 4958
-> 16 0 24 1362 G 1601 4958
-> 15 0 23 1362 G 1390 4959
-> 16 0 23 1362 G 1391 4959
-> 15 0 24 1362 G 1391 4960
-> 16 0 24 1362 G 1601 4960
-> 15 0 23 1362 G 1510 4961
-> 16 0 23 1362 G 1511 4961
-> 15 0 24 1362 G 1511 4962
-> 16 0 24 1362 G 1601 4962
-> 15 0 23 1362 G 1486 4963
-> 16 0 23 1362 G 1487 4963
-> 15 0 24 1362 G 1487 4964
-> 16 0 24 1362 G 1601 4964
-> 15 0 23 1362 G 1462 4965
-> 16 0 23 1362 G 1463 4965
-> 15 0 24 1362 G 1463 4966
-> 16 0 24 1362 G 1601 4966
-> 15 0 23 1362 G 1438 4967
-> 16 0 23 1362 G 1439 4967
-> 15 0 24 1362 G 1439 4968
-> 16 0 24 1362 G 1601 4968
-> 15 0 23 1362 G 1414 4969
-> 16 0 23 1362 G 1415 4969
-> 15 0 24 1362 G 1415 4970
-> 16 0 24 1362 G 1601 4970
-> 15 0 23 1362 G 1582 4971
-> 16 0 23 1362 G 1583 4971
-> 15 0 24 1362 G 1583 4972
-> 16 0 24 1362 G 1601 4972
-> 15 0 23 1362 G 1558 4973
-> 16 0 23 1362 G 1559 4973
-> 15 0 24 1362 G 1559 4974
-> 16 0 24 1362 G 1601 4974
-> 15 0 23 1362 G 1534 4975
-> 16 0 23 1362 G 1535 4975
-> 15 0 24 1362 G 1535 4976
-> 16 0 24 1362 G 1601 4976
-> 15 0 23 1362 G 1369 4977
-> 16 0 23 1362 G 1370 4977
-> 15 0 24 1362 G 1370 4978
-> 16 0 24 1362 G 1601 4978
-> 15 0 23 1362 G 1393 4979
-> 16 0 23 1362 G 1394 4979
-> 15 0 24 1362 G 1394 4980
-> 16 0 24 1362 G 1601 4980
-> 15 0 23 1362 G 1513 4981
-> 16 0 23 1362 G 1514 4981
-> 15 0 24 1362 G 1514 4982
-> 16 0 24 1362 G 1601 4982
-> 15 0 23 1362 G 1489 4983
-> 16 0 23 1362 G 1490 4983
-> 15 0 24 1362 G 1490 4984
-> 16 0 24 1362 G 1601 4984
-> 15 0 23 1362 G 1465 4985
-> 16 0 23 1362 G 1466 4985
-> 15 0 24 1362 G 1466 4986
-> 16 0 24 1362 G 1601 4986
-> 15 0 23 1362 G 1441 4987
-> 16 0 23 1362 G 1442 4987
-> 15 0 24 1362 G 1442 4988
-> 16 0 24 1362 G 1601 4988
-> 15 0 23 1362 G 1417 4989
-> 16 0 23 1362 G 1418 4989
-> 15 0 24 1362 G 1418 4990
-> 16 0 24 1362 G 1601 4990
-> 15 0 23 1362 G 1585 4991
-> 16 0 23 1362 G 1586 4991
-> 15 0 24 1362 G 1586 4992
-> 16 0 24 1362 G 1601 4992
-> 15 0 23 1362 G 1561 4993
-> 16 0 23 1362 G 1562 4993
-> 15 0 24 1362 G 1562 4994
-> 16 0 24 1362 G 1601 4994
-> 15 0 23 1362 G 1537 4995
-> 16 0 23 1362 G 1538 4995
-> 15 0 24 1362 G 1538 4996
-> 16 0 24 1362 G 1601 4996
-> 15 0 23 1362 G 1372 4997
-> 16 0 23 1362 G 1373 4997
-> 15 0 24 1362 G 1373 4998
-> 16 0 24 1362 G 1601 4998
-> 15 0 23 1362 G 1420 4999
-> 16 0 23 1362 G 1421 4999
-> 15 0 24 1362 G 1421 5000
-> 16 0 24 1362 G 1601 5000
-> 15 0 23 1362 G 1396 5001
-> 16 0 23 1362 G 1397 5001
-> 15 0 24 1362 G 1397 5002
-> 16 0 24 1362 G 1601 5002
-> 15 0 23 1362 G 1540 5003
-> 16 0 23 1362 G 1541 5003
-> 15 0 24 1362 G 1541 5004
-> 16 0 24 1362 G 1601 5004
-> 15 0 23 1362 G 1516 5005
-> 16 0 23 1362 G 1517 5005
-> 15 0 24 1362 G 1517 5006
-> 16 0 24 1362 G 1601 5006
-> 15 0 23 1362 G 1492 5007
-> 16 0 23 1362 G 1493 5007
-> 15 0 24 1362 G 1493 5008
-> 16 0 24 1362 G 1601 5008
-> 15 0 23 1362 G 1468 5009
-> 16 0 23 1362 G 1469 5009
-> 15 0 24 1362 G 1469 5010
-> 16 0 24 1362 G 1601 5010
-> 15 0 23 1362 G 1444 5011
-> 16 0 23 1362 G 1445 5011
-> 15 0 24 1362 G 1445 5012
-> 16 0 24 1362 G 1601 5012
-> 15 0 23 1362 G 1588 5013
-> 16 0 23 1362 G 1589 5013
-> 15 0 24 1362 G 1589 5014
-> 16 0 24 1362 G 1601 5014
-> 15 0 23 1362 G 1564 5015
-> 16 0 23 1362 G 1565 5015
-> 15 0 24 1362 G 1565 5016
-> 16 0 24 1362 G 1601 5016
-> 15 0 23 1190 G 1221 5017
-> 16 0 23 1190 G 1222 5017
-> 15 0 24 1190 G 1222 5018
-> 16 0 24 1190 G 1360 5018
-> 15 0 24 1190 G 1360 5019
-> 16 0 24 1190 G 1283 5019
-> 15 0 25 1190 G 1283 5020
-> 16 0 25 1190 G 1281 5020
-> 15 0 24 1190 G 1360 5021
-> 16 0 24 1190 G 1259 5021
-> 15 0 25 1190 G 1259 5022
-> 16 0 25 1190 G 1257 5022
-> 15 0 24 1190 G 1360 5023
-> 16 0 24 1190 G 1235 5023
-> 15 0 25 1190 G 1235 5024
-> 16 0 25 1190 G 1233 5024
-> 15 0 24 1190 G 1360 5025
-> 16 0 24 1190 G 1343 5025
-> 15 0 25 1190 G 1343 5026
-> 16 0 25 1190 G 1341 5026
-> 15 0 24 1190 G 1360 5027
-> 16 0 24 1190 G 1319 5027
-> 15 0 25 1190 G 1319 5028
-> 16 0 25 1190 G 1317 5028
-> 15 0 24 1190 G 1360 5029
-> 16 0 24 1190 G 1295 5029
-> 15 0 25 1190 G 1295 5030
-> 16 0 25 1190 G 1293 5030
-> 15 0 24 1190 G 1360 5031
-> 16 0 24 1190 G 1271 5031
-> 15 0 25 1190 G 1271 5032
-> 16 0 25 1190 G 1269 5032
-> 15 0 24 1190 G 1360 5033
-> 16 0 24 1190 G 1247 5033
-> 15 0 25 1190 G 1247 5034
-> 16 0 25 1190 G 1245 5034
-> 15 0 24 1190 G 1360 5035
-> 16 0 24 1190 G 1355 5035
-> 15 0 25 1190 G 1355 5036
-> 16 0 25 1190 G 1353 5036
-> 15 0 24 1190 G 1360 5037
-> 16 0 24 1190 G 1331 5037
-> 15 0 25 1190 G 1331 5038
-> 16 0 25 1190 G 1329 5038
-> 15 0 24 1190 G 1360 5039
-> 16 0 24 1190 G 1307 5039
-> 15 0 25 1190 G 1307 5040
-> 16 0 25 1190 G 1305 5040
-> 15 0 24 1190 G 1360 5041
-> 16 0 24 1190 G 1193 5041
-> 15 0 25 1190 G 1193 5042
-> 16 0 25 1190 G 1191 5042
-> 15 0 24 1190 G 1360 5043
-> 16 0 24 1190 G 1205 5043
-> 15 0 25 1190 G 1205 5044
-> 16 0 25 1190 G 1203 5044
-> 15 0 24 1190 G 1360 5045
-> 16 0 24 1190 G 1217 5045
-> 15 0 25 1190 G 1217 5046
-> 16 0 25 1190 G 1215 5046
-> 15 0 26 1190 G 1360 5047
-> 16 0 26 1190 G 1359 5047
-> 15 0 24 1190 G 1360 5048
-> 16 0 24 1190 G 1250 5048
-> 15 0 25 1190 G 1250 5049
-> 16 0 25 1190 G 1248 5049
-> 15 0 24 1190 G 1360 5050
-> 16 0 24 1190 G 1226 5050
-> 15 0 25 1190 G 1226 5051
-> 16 0 25 1190 G 1224 5051
-> 15 0 24 1190 G 1360 5052
-> 16 0 24 1190 G 1310 5052
-> 15 0 25 1190 G 1310 5053
-> 16 0 25 1190 G 1308 5053
-> 15 0 24 1190 G 1360 5054
-> 16 0 24 1190 G 1286 5054
-> 15 0 25 1190 G 1286 5055
-> 16 0 25 1190 G 1284 5055
-> 15 0 24 1190 G 1360 5056
-> 16 0 24 1190 G 1262 5056
-> 15 0 25 1190 G 1262 5057
-> 16 0 25 1190 G 1260 5057
-> 15 0 24 1190 G 1360 5058
-> 16 0 24 1190 G 1238 5058
-> 15 0 25 1190 G 1238 5059
-> 16 0 25 1190 G 1236 5059
-> 15 0 24 1190 G 1360 5060
-> 16 0 24 1190 G 1346 5060
-> 15 0 25 1190 G 1346 5061
-> 16 0 25 1190 G 1344 5061
-> 15 0 24 1190 G 1360 5062
-> 16 0 24 1190 G 1322 5062
-> 15 0 25 1190 G 1322 5063
-> 16 0 25 1190 G 1320 5063
-> 15 0 24 1190 G 1360 5064
-> 16 0 24 1190 G 1298 5064
-> 15 0 25 1190 G 1298 5065
-> 16 0 25 1190 G 1296 5065
-> 15 0 24 1190 G 1360 5066
-> 16 0 24 1190 G 1274 5066
-> 15 0 25 1190 G 1274 5067
-> 16 0 25 1190 G 1272 5067
-> 15 0 24 1190 G 1360 5068
-> 16 0 24 1190 G 1358 5068
-> 15 0 25 1190 G 1358 5069
-> 16 0 25 1190 G 1356 5069
-> 15 0 24 1190 G 1360 5070
-> 16 0 24 1190 G 1334 5070
-> 15 0 25 1190 G 1334 5071
-> 16 0 25 1190 G 1332 5071
-> 15 0 24 1190 G 1360 5072
-> 16 0 24 1190 G 1196 5072
-> 15 0 25 1190 G 1196 5073
-> 16 0 25 1190 G 1194 5073
-> 15 0 24 1190 G 1360 5074
-> 16 0 24 1190 G 1208 5074
-> 15 0 25 1190 G 1208 5075
-> 16 0 25 1190 G 1206 5075
-> 15 0 24 1190 G 1360 5076
-> 16 0 24 1190 G 1253 5076
-> 15 0 25 1190 G 1253 5077
-> 16 0 25 1190 G 1251 5077
-> 15 0 24 1190 G 1360 5078
-> 16 0 24 1190 G 1229 5078
-> 15 0 25 1190 G 1229 5079
-> 16 0 25 1190 G 1227 5079
-> 15 0 24 1190 G 1360 5080
-> 16 0 24 1190 G 1313 5080
-> 15 0 25 1190 G 1313 5081
-> 16 0 25 1190 G 1311 5081
-> 15 0 24 1190 G 1360 5082
-> 16 0 24 1190 G 1289 5082
-> 15 0 25 1190 G 1289 5083
-> 16 0 25 1190 G 1287 5083
-> 15 0 24 1190 G 1360 5084
-> 16 0 24 1190 G 1265 5084
-> 15 0 25 1190 G 1265 5085
-> 16 0 25 1190 G 1263 5085
-> 15 0 24 1190 G 1360 5086
-> 16 0 24 1190 G 1241 5086
-> 15 0 25 1190 G 1241 5087
-> 16 0 25 1190 G 1239 5087
-> 15 0 24 1190 G 1360 5088
-> 16 0 24 1190 G 1349 5088
-> 15 0 25 1190 G 1349 5089
-> 16 0 25 1190 G 1347 5089
-> 15 0 24 1190 G 1360 5090
-> 16 0 24 1190 G 1325 5090
-> 15 0 25 1190 G 1325 5091
-> 16 0 25 1190 G 1323 5091
-> 15 0 24 1190 G 1360 5092
-> 16 0 24 1190 G 1301 5092
-> 15 0 25 1190 G 1301 5093
-> 16 0 25 1190 G 1299 5093
-> 15 0 24 1190 G 1360 5094
-> 16 0 24 1190 G 1277 5094
-> 15 0 25 1190 G 1277 5095
-> 16 0 25 1190 G 1275 5095
-> 15 0 24 1190 G 1360 5096
-> 16 0 24 1190 G 1337 5096
-> 15 0 25 1190 G 1337 5097
-> 16 0 25 1190 G 1335 5097
-> 15 0 24 1190 G 1360 5098
-> 16 0 24 1190 G 1199 5098
-> 15 0 25 1190 G 1199 5099
-> 16 0 25 1190 G 1197 5099
-> 15 0 24 1190 G 1360 5100
-> 16 0 24 1190 G 1211 5100
-> 15 0 25 1190 G 1211 5101
-> 16 0 25 1190 G 1209 5101
-> 15 0 24 1190 G 1360 5102
-> 16 0 24 1190 G 1220 5102
-> 15 0 25 1190 G 1220 5103
-> 16 0 25 1190 G 1218 5103
-> 15 0 24 1190 G 1360 5104
-> 16 0 24 1190 G 1280 5104
-> 15 0 25 1190 G 1280 5105
-> 16 0 25 1190 G 1278 5105
-> 15 0 24 1190 G 1360 5106
-> 16 0 24 1190 G 1256 5106
-> 15 0 25 1190 G 1256 5107
-> 16 0 25 1190 G 1254 5107
-> 15 0 24 1190 G 1360 5108
-> 16 0 24 1190 G 1232 5108
-> 15 0 25 1190 G 1232 5109
-> 16 0 25 1190 G 1230 5109
-> 15 0 24 1190 G 1360 5110
-> 16 0 24 1190 G 1340 5110
-> 15 0 25 1190 G 1340 5111
-> 16 0 25 1190 G 1338 5111
-> 15 0 24 1190 G 1360 5112
-> 16 0 24 1190 G 1316 5112
-> 15 0 25 1190 G 1316 5113
-> 16 0 25 1190 G 1314 5113
-> 15 0 24 1190 G 1360 5114
-> 16 0 24 1190 G 1292 5114
-> 15 0 25 1190 G 1292 5115
-> 16 0 25 1190 G 1290 5115
-> 15 0 24 1190 G 1360 5116
-> 16 0 24 1190 G 1268 5116
-> 15 0 25 1190 G 1268 5117
-> 16 0 25 1190 G 1266 5117
-> 15 0 24 1190 G 1360 5118
-> 16 0 24 1190 G 1244 5118
-> 15 0 25 1190 G 1244 5119
-> 16 0 25 1190 G 1242 5119
-> 15 0 24 1190 G 1360 5120
-> 16 0 24 1190 G 1352 5120
-> 15 0 25 1190 G 1352 5121
-> 16 0 25 1190 G 1350 5121
-> 15 0 24 1190 G 1360 5122
-> 16 0 24 1190 G 1328 5122
-> 15 0 25 1190 G 1328 5123
-> 16 0 25 1190 G 1326 5123
-> 15 0 24 1190 G 1360 5124
-> 16 0 24 1190 G 1304 5124
-> 15 0 25 1190 G 1304 5125
-> 16 0 25 1190 G 1302 5125
-> 15 0 24 1190 G 1360 5126
-> 16 0 24 1190 G 1202 5126
-> 15 0 25 1190 G 1202 5127
-> 16 0 25 1190 G 1200 5127
-> 15 0 24 1190 G 1360 5128
-> 16 0 24 1190 G 1214 5128
-> 15 0 25 1190 G 1214 5129
-> 16 0 25 1190 G 1212 5129
-> 15 0 23 1190 G 1281 5130
-> 16 0 23 1190 G 1282 5130
-> 15 0 24 1190 G 1282 5131
-> 16 0 24 1190 G 1360 5131
-> 15 0 24 1190 G 1360 5132
-> 16 0 24 1190 G 1223 5132
-> 15 0 25 1190 G 1223 5133
-> 16 0 25 1190 G 1221 5133
-> 15 0 23 1190 G 1257 5134
-> 16 0 23 1190 G 1258 5134
-> 15 0 24 1190 G 1258 5135
-> 16 0 24 1190 G 1360 5135
-> 15 0 23 1190 G 1233 5136
-> 16 0 23 1190 G 1234 5136
-> 15 0 24 1190 G 1234 5137
-> 16 0 24 1190 G 1360 5137
-> 15 0 23 1190 G 1341 5138
-> 16 0 23 1190 G 1342 5138
-> 15 0 24 1190 G 1342 5139
-> 16 0 24 1190 G 1360 5139
-> 15 0 23 1190 G 1317 5140
-> 16 0 23 1190 G 1318 5140
-> 15 0 24 1190 G 1318 5141
-> 16 0 24 1190 G 1360 5141
-> 15 0 23 1190 G 1293 5142
-> 16 0 23 1190 G 1294 5142
-> 15 0 24 1190 G 1294 5143
-> 16 0 24 1190 G 1360 5143
-> 15 0 23 1190 G 1269 5144
-> 16 0 23 1190 G 1270 5144
-> 15 0 24 1190 G 1270 5145
-> 16 0 24 1190 G 1360 5145
-> 15 0 23 1190 G 1245 5146
-> 16 0 23 1190 G 1246 5146
-> 15 0 24 1190 G 1246 5147
-> 16 0 24 1190 G 1360 5147
-> 15 0 23 1190 G 1353 5148
-> 16 0 23 1190 G 1354 5148
-> 15 0 24 1190 G 1354 5149
-> 16 0 24 1190 G 1360 5149
-> 15 0 23 1190 G 1329 5150
-> 16 0 23 1190 G 1330 5150
-> 15 0 24 1190 G 1330 5151
-> 16 0 24 1190 G 1360 5151
-> 15 0 23 1190 G 1305 5152
-> 16 0 23 1190 G 1306 5152
-> 15 0 24 1190 G 1306 5153
-> 16 0 24 1190 G 1360 5153
-> 15 0 23 1190 G 1191 5154
-> 16 0 23 1190 G 1192 5154
-> 15 0 24 1190 G 1192 5155
-> 16 0 24 1190 G 1360 5155
-> 15 0 23 1190 G 1203 5156
-> 16 0 23 1190 G 1204 5156
-> 15 0 24 1190 G 1204 5157
-> 16 0 24 1190 G 1360 5157
-> 15 0 23 1190 G 1215 5158
-> 16 0 23 1190 G 1216 5158
-> 15 0 24 1190 G 1216 5159
-> 16 0 24 1190 G 1360 5159
-> 15 0 23 1190 G 1248 5160
-> 16 0 23 1190 G 1249 5160
-> 15 0 24 1190 G 1249 5161
-> 16 0 24 1190 G 1360 5161
-> 15 0 23 1190 G 1224 5162
-> 16 0 23 1190 G 1225 5162
-> 15 0 24 1190 G 1225 5163
-> 16 0 24 1190 G 1360 5163
-> 15 0 23 1190 G 1308 5164
-> 16 0 23 1190 G 1309 5164
-> 15 0 24 1190 G 1309 5165
-> 16 0 24 1190 G 1360 5165
-> 15 0 23 1190 G 1284 5166
-> 16 0 23 1190 G 1285 5166
-> 15 0 24 1190 G 1285 5167
-> 16 0 24 1190 G 1360 5167
-> 15 0 23 1190 G 1260 5168
-> 16 0 23 1190 G 1261 5168
-> 15 0 24 1190 G 1261 5169
-> 16 0 24 1190 G 1360 5169
-> 15 0 23 1190 G 1236 5170
-> 16 0 23 1190 G 1237 5170
-> 15 0 24 1190 G 1237 5171
-> 16 0 24 1190 G 1360 5171
-> 15 0 23 1190 G 1344 5172
-> 16 0 23 1190 G 1345 5172
-> 15 0 24 1190 G 1345 5173
-> 16 0 24 1190 G 1360 5173
-> 15 0 23 1190 G 1320 5174
-> 16 0 23 1190 G 1321 5174
-> 15 0 24 1190 G 1321 5175
-> 16 0 24 1190 G 1360 5175
-> 15 0 23 1190 G 1296 5176
-> 16 0 23 1190 G 1297 5176
-> 15 0 24 1190 G 1297 5177
-> 16 0 24 1190 G 1360 5177
-> 15 0 23 1190 G 1272 5178
-> 16 0 23 1190 G 1273 5178
-> 15 0 24 1190 G 1273 5179
-> 16 0 24 1190 G 1360 5179
-> 15 0 23 1190 G 1356 5180
-> 16 0 23 1190 G 1357 5180
-> 15 0 24 1190 G 1357 5181
-> 16 0 24 1190 G 1360 5181
-> 15 0 23 1190 G 1332 5182
-> 16 0 23 1190 G 1333 5182
-> 15 0 24 1190 G 1333 5183
-> 16 0 24 1190 G 1360 5183
-> 15 0 23 1190 G 1194 5184
-> 16 0 23 1190 G 1195 5184
-> 15 0 24 1190 G 1195 5185
-> 16 0 24 1190 G 1360 5185
-> 15 0 23 1190 G 1206 5186
-> 16 0 23 1190 G 1207 5186
-> 15 0 24 1190 G 1207 5187
-> 16 0 24 1190 G 1360 5187
-> 15 0 23 1190 G 1251 5188
-> 16 0 23 1190 G 1252 5188
-> 15 0 24 1190 G 1252 5189
-> 16 0 24 1190 G 1360 5189
-> 15 0 23 1190 G 1227 5190
-> 16 0 23 1190 G 1228 5190
-> 15 0 24 1190 G 1228 5191
-> 16 0 24 1190 G 1360 5191
-> 15 0 23 1190 G 1311 5192
-> 16 0 23 1190 G 1312 5192
-> 15 0 24 1190 G 1312 5193
-> 16 0 24 1190 G 1360 5193
-> 15 0 23 1190 G 1287 5194
-> 16 0 23 1190 G 1288 5194
-> 15 0 24 1190 G 1288 5195
-> 16 0 24 1190 G 1360 5195
-> 15 0 23 1190 G 1263 5196
-> 16 0 23 1190 G 1264 5196
-> 15 0 24 1190 G 1264 5197
-> 16 0 24 1190 G 1360 5197
-> 15 0 23 1190 G 1239 5198
-> 16 0 23 1190 G 1240 5198
-> 15 0 24 1190 G 1240 5199
-> 16 0 24 1190 G 1360 5199
-> 15 0 23 1190 G 1347 5200
-> 16 0 23 1190 G 1348 5200
-> 15 0 24 1190 G 1348 5201
-> 16 0 24 1190 G 1360 5201
-> 15 0 23 1190 G 1323 5202
-> 16 0 23 1190 G 1324 5202
-> 15 0 24 1190 G 1324 5203
-> 16 0 24 1190 G 1360 5203
-> 15 0 23 1190 G 1299 5204
-> 16 0 23 1190 G 1300 5204
-> 15 0 24 1190 G 1300 5205
-> 16 0 24 1190 G 1360 5205
-> 15 0 23 1190 G 1275 5206
-> 16 0 23 1190 G 1276 5206
-> 15 0 24 1190 G 1276 5207
-> 16 0 24 1190 G 1360 5207
-> 15 0 23 1190 G 1335 5208
-> 16 0 23 1190 G 1336 5208
-> 15 0 24 1190 G 1336 5209
-> 16 0 24 1190 G 1360 5209
-> 15 0 23 1190 G 1197 5210
-> 16 0 23 1190 G 1198 5210
-> 15 0 24 1190 G 1198 5211
-> 16 0 24 1190 G 1360 5211
-> 15 0 23 1190 G 1209 5212
-> 16 0 23 1190 G 1210 5212
-> 15 0 24 1190 G 1210 5213
-> 16 0 24 1190 G 1360 5213
-> 15 0 23 1190 G 1218 5214
-> 16 0 23 1190 G 1219 5214
-> 15 0 24 1190 G 1219 5215
-> 16 0 24 1190 G 1360 5215
-> 15 0 23 1190 G 1278 5216
-> 16 0 23 1190 G 1279 5216
-> 15 0 24 1190 G 1279 5217
-> 16 0 24 1190 G 1360 5217
-> 15 0 23 1190 G 1254 5218
-> 16 0 23 1190 G 1255 5218
-> 15 0 24 1190 G 1255 5219
-> 16 0 24 1190 G 1360 5219
-> 15 0 23 1190 G 1230 5220
-> 16 0 23 1190 G 1231 5220
-> 15 0 24 1190 G 1231 5221
-> 16 0 24 1190 G 1360 5221
-> 15 0 23 1190 G 1338 5222
-> 16 0 23 1190 G 1339 5222
-> 15 0 24 1190 G 1339 5223
-> 16 0 24 1190 G 1360 5223
-> 15 0 23 1190 G 1314 5224
-> 16 0 23 1190 G 1315 5224
-> 15 0 24 1190 G 1315 5225
-> 16 0 24 1190 G 1360 5225
-> 15 0 23 1190 G 1290 5226
-> 16 0 23 1190 G 1291 5226
-> 15 0 24 1190 G 1291 5227
-> 16 0 24 1190 G 1360 5227
-> 15 0 23 1190 G 1266 5228
-> 16 0 23 1190 G 1267 5228
-> 15 0 24 1190 G 1267 5229
-> 16 0 24 1190 G 1360 5229
-> 15 0 23 1190 G 1242 5230
-> 16 0 23 1190 G 1243 5230
-> 15 0 24 1190 G 1243 5231
-> 16 0 24 1190 G 1360 5231
-> 15 0 23 1190 G 1350 5232
-> 16 0 23 1190 G 1351 5232
-> 15 0 24 1190 G 1351 5233
-> 16 0 24 1190 G 1360 5233
-> 15 0 23 1190 G 1326 5234
-> 16 0 23 1190 G 1327 5234
-> 15 0 24 1190 G 1327 5235
-> 16 0 24 1190 G 1360 5235
-> 15 0 23 1190 G 1302 5236
-> 16 0 23 1190 G 1303 5236
-> 15 0 24 1190 G 1303 5237
-> 16 0 24 1190 G 1360 5237
-> 15 0 23 1190 G 1200 5238
-> 16 0 23 1190 G 1201 5238
-> 15 0 24 1190 G 1201 5239
-> 16 0 24 1190 G 1360 5239
-> 15 0 23 1190 G 1212 5240
-> 16 0 23 1190 G 1213 5240
-> 15 0 24 1190 G 1213 5241
-> 16 0 24 1190 G 1360 5241
-> 15 0 27 1189 G 1600 5242
-> 16 0 27 1189 G 1602 5242
-> 15 0 28 1189 G 1602 5243
-> 16 0 28 1189 G 1604 5243
-> 15 0 21 1189 G 1602 5244
-> 16 0 21 1189 G 1361 5244
-> 15 0 28 1189 G 1361 5245
-> 16 0 28 1189 G 1359 5245
-> 15 0 27 1189 G 1604 5246
-> 16 0 27 1189 G 1361 5246
-> 15 0 23 1016 G 1059 5247
-> 16 0 23 1016 G 1060 5247
-> 15 0 24 1016 G 1060 5248
-> 16 0 24 1016 G 1156 5248
-> 15 0 24 1016 G 1156 5249
-> 16 0 24 1016 G 1124 5249
-> 15 0 25 1016 G 1124 5250
-> 16 0 25 1016 G 1122 5250
-> 15 0 24 1016 G 1156 5251
-> 16 0 24 1016 G 1073 5251
-> 15 0 25 1016 G 1073 5252
-> 16 0 25 1016 G 1071 5252
-> 15 0 24 1016 G 1156 5253
-> 16 0 24 1016 G 1019 5253
-> 15 0 25 1016 G 1019 5254
-> 16 0 25 1016 G 1017 5254
-> 15 0 24 1016 G 1156 5255
-> 16 0 24 1016 G 1031 5255
-> 15 0 25 1016 G 1031 5256
-> 16 0 25 1016 G 1029 5256
-> 15 0 24 1016 G 1156 5257
-> 16 0 24 1016 G 1043 5257
-> 15 0 25 1016 G 1043 5258
-> 16 0 25 1016 G 1041 5258
-> 15 0 26 1016 G 1156 5259
-> 16 0 26 1016 G 1155 5259
-> 15 0 24 1016 G 1156 5260
-> 16 0 24 1016 G 1076 5260
-> 15 0 25 1016 G 1076 5261
-> 16 0 25 1016 G 1074 5261
-> 15 0 24 1016 G 1156 5262
-> 16 0 24 1016 G 1139 5262
-> 15 0 25 1016 G 1139 5263
-> 16 0 25 1016 G 1137 5263
-> 15 0 24 1016 G 1156 5264
-> 16 0 24 1016 G 1088 5264
-> 15 0 25 1016 G 1088 5265
-> 16 0 25 1016 G 1086 5265
-> 15 0 24 1016 G 1156 5266
-> 16 0 24 1016 G 1151 5266
-> 15 0 25 1016 G 1151 5267
-> 16 0 25 1016 G 1149 5267
-> 15 0 24 1016 G 1156 5268
-> 16 0 24 1016 G 1100 5268
-> 15 0 25 1016 G 1100 5269
-> 16 0 25 1016 G 1098 5269
-> 15 0 24 1016 G 1156 5270
-> 16 0 24 1016 G 1052 5270
-> 15 0 25 1016 G 1052 5271
-> 16 0 25 1016 G 1050 5271
-> 15 0 24 1016 G 1156 5272
-> 16 0 24 1016 G 1115 5272
-> 15 0 25 1016 G 1115 5273
-> 16 0 25 1016 G 1113 5273
-> 15 0 24 1016 G 1156 5274
-> 16 0 24 1016 G 1064 5274
-> 15 0 25 1016 G 1064 5275
-> 16 0 25 1016 G 1062 5275
-> 15 0 24 1016 G 1156 5276
-> 16 0 24 1016 G 1127 5276
-> 15 0 25 1016 G 1127 5277
-> 16 0 25 1016 G 1125 5277
-> 15 0 24 1016 G 1156 5278
-> 16 0 24 1016 G 1022 5278
-> 15 0 25 1016 G 1022 5279
-> 16 0 25 1016 G 1020 5279
-> 15 0 24 1016 G 1156 5280
-> 16 0 24 1016 G 1034 5280
-> 15 0 25 1016 G 1034 5281
-> 16 0 25 1016 G 1032 5281
-> 15 0 24 1016 G 1156 5282
-> 16 0 24 1016 G 1079 5282
-> 15 0 25 1016 G 1079 5283
-> 16 0 25 1016 G 1077 5283
-> 15 0 24 1016 G 1156 5284
-> 16 0 24 1016 G 1142 5284
-> 15 0 25 1016 G 1142 5285
-> 16 0 25 1016 G 1140 5285
-> 15 0 24 1016 G 1156 5286
-> 16 0 24 1016 G 1091 5286
-> 15 0 25 1016 G 1091 5287
-> 16 0 25 1016 G 1089 5287
-> 15 0 24 1016 G 1156 5288
-> 16 0 24 1016 G 1154 5288
-> 15 0 25 1016 G 1154 5289
-> 16 0 25 1016 G 1152 5289
-> 15 0 24 1016 G 1156 5290
-> 16 0 24 1016 G 1103 5290
-> 15 0 25 1016 G 1103 5291
-> 16 0 25 1016 G 1101 5291
-> 15 0 24 1016 G 1156 5292
-> 16 0 24 1016 G 1106 5292
-> 15 0 25 1016 G 1106 5293
-> 16 0 25 1016 G 1104 5293
-> 15 0 24 1016 G 1156 5294
-> 16 0 24 1016 G 1055 5294
-> 15 0 25 1016 G 1055 5295
-> 16 0 25 1016 G 1053 5295
-> 15 0 24 1016 G 1156 5296
-> 16 0 24 1016 G 1118 5296
-> 15 0 25 1016 G 1118 5297
-> 16 0 25 1016 G 1116 5297
-> 15 0 24 1016 G 1156 5298
-> 16 0 24 1016 G 1067 5298
-> 15 0 25 1016 G 1067 5299
-> 16 0 25 1016 G 1065 5299
-> 15 0 24 1016 G 1156 5300
-> 16 0 24 1016 G 1130 5300
-> 15 0 25 1016 G 1130 5301
-> 16 0 25 1016 G 1128 5301
-> 15 0 24 1016 G 1156 5302
-> 16 0 24 1016 G 1025 5302
-> 15 0 25 1016 G 1025 5303
-> 16 0 25 1016 G 1023 5303
-> 15 0 24 1016 G 1156 5304
-> 16 0 24 1016 G 1037 5304
-> 15 0 25 1016 G 1037 5305
-> 16 0 25 1016 G 1035 5305
-> 15 0 24 1016 G 1156 5306
-> 16 0 24 1016 G 1082 5306
-> 15 0 25 1016 G 1082 5307
-> 16 0 25 1016 G 1080 5307
-> 15 0 24 1016 G 1156 5308
-> 16 0 24 1016 G 1145 5308
-> 15 0 25 1016 G 1145 5309
-> 16 0 25 1016 G 1143 5309
-> 15 0 24 1016 G 1156 5310
-> 16 0 24 1016 G 1094 5310
-> 15 0 25 1016 G 1094 5311
-> 16 0 25 1016 G 1092 5311
-> 15 0 24 1016 G 1156 5312
-> 16 0 24 1016 G 1046 5312
-> 15 0 25 1016 G 1046 5313
-> 16 0 25 1016 G 1044 5313
-> 15 0 24 1016 G 1156 5314
-> 16 0 24 1016 G 1109 5314
-> 15 0 25 1016 G 1109 5315
-> 16 0 25 1016 G 1107 5315
-> 15 0 24 1016 G 1156 5316
-> 16 0 24 1016 G 1058 5316
-> 15 0 25 1016 G 1058 5317
-> 16 0 25 1016 G 1056 5317
-> 15 0 24 1016 G 1156 5318
-> 16 0 24 1016 G 1121 5318
-> 15 0 25 1016 G 1121 5319
-> 16 0 25 1016 G 1119 5319
-> 15 0 24 1016 G 1156 5320
-> 16 0 24 1016 G 1070 5320
-> 15 0 25 1016 G 1070 5321
-> 16 0 25 1016 G 1068 5321
-> 15 0 24 1016 G 1156 5322
-> 16 0 24 1016 G 1133 5322
-> 15 0 25 1016 G 1133 5323
-> 16 0 25 1016 G 1131 5323
-> 15 0 24 1016 G 1156 5324
-> 16 0 24 1016 G 1028 5324
-> 15 0 25 1016 G 1028 5325
-> 16 0 25 1016 G 1026 5325
-> 15 0 24 1016 G 1156 5326
-> 16 0 24 1016 G 1040 5326
-> 15 0 25 1016 G 1040 5327
-> 16 0 25 1016 G 1038 5327
-> 15 0 24 1016 G 1156 5328
-> 16 0 24 1016 G 1136 5328
-> 15 0 25 1016 G 1136 5329
-> 16 0 25 1016 G 1134 5329
-> 15 0 24 1016 G 1156 5330
-> 16 0 24 1016 G 1085 5330
-> 15 0 25 1016 G 1085 5331
-> 16 0 25 1016 G 1083 5331
-> 15 0 24 1016 G 1156 5332
-> 16 0 24 1016 G 1148 5332
-> 15 0 25 1016 G 1148 5333
-> 16 0 25 1016 G 1146 5333
-> 15 0 24 1016 G 1156 5334
-> 16 0 24 1016 G 1097 5334
-> 15 0 25 1016 G 1097 5335
-> 16 0 25 1016 G 1095 5335
-> 15 0 24 1016 G 1156 5336
-> 16 0 24 1016 G 1049 5336
-> 15 0 25 1016 G 1049 5337
-> 16 0 25 1016 G 1047 5337
-> 15 0 24 1016 G 1156 5338
-> 16 0 24 1016 G 1112 5338
-> 15 0 25 1016 G 1112 5339
-> 16 0 25 1016 G 1110 5339
-> 15 0 23 1016 G 1122 5340
-> 16 0 23 1016 G 1123 5340
-> 15 0 24 1016 G 1123 5341
-> 16 0 24 1016 G 1156 5341
-> 15 0 24 1016 G 1156 5342
-> 16 0 24 1016 G 1061 5342
-> 15 0 25 1016 G 1061 5343
-> 16 0 25 1016 G 1059 5343
-> 15 0 23 1016 G 1071 5344
-> 16 0 23 1016 G 1072 5344
-> 15 0 24 1016 G 1072 5345
-> 16 0 24 1016 G 1156 5345
-> 15 0 23 1016 G 1017 5346
-> 16 0 23 1016 G 1018 5346
-> 15 0 24 1016 G 1018 5347
-> 16 0 24 1016 G 1156 5347
-> 15 0 23 1016 G 1029 5348
-> 16 0 23 1016 G 1030 5348
-> 15 0 24 1016 G 1030 5349
-> 16 0 24 1016 G 1156 5349
-> 15 0 23 1016 G 1041 5350
-> 16 0 23 1016 G 1042 5350
-> 15 0 24 1016 G 1042 5351
-> 16 0 24 1016 G 1156 5351
-> 15 0 23 1016 G 1074 5352
-> 16 0 23 1016 G 1075 5352
-> 15 0 24 1016 G 1075 5353
-> 16 0 24 1016 G 1156 5353
-> 15 0 23 1016 G 1137 5354
-> 16 0 23 1016 G 1138 5354
-> 15 0 24 1016 G 1138 5355
-> 16 0 24 1016 G 1156 5355
-> 15 0 23 1016 G 1086 5356
-> 16 0 23 1016 G 1087 5356
-> 15 0 24 1016 G 1087 5357
-> 16 0 24 1016 G 1156 5357
-> 15 0 23 1016 G 1149 5358
-> 16 0 23 1016 G 1150 5358
-> 15 0 24 1016 G 1150 5359
-> 16 0 24 1016 G 1156 5359
-> 15 0 23 1016 G 1098 5360
-> 16 0 23 1016 G 1099 5360
-> 15 0 24 1016 G 1099 5361
-> 16 0 24 1016 G 1156 5361
-> 15 0 23 1016 G 1050 5362
-> 16 0 23 1016 G 1051 5362
-> 15 0 24 1016 G 1051 5363
-> 16 0 24 1016 G 1156 5363
-> 15 0 23 1016 G 1113 5364
-> 16 0 23 1016 G 1114 5364
-> 15 0 24 1016 G 1114 5365
-> 16 0 24 1016 G 1156 5365
-> 15 0 23 1016 G 1062 5366
-> 16 0 23 1016 G 1063 5366
-> 15 0 24 1016 G 1063 5367
-> 16 0 24 1016 G 1156 5367
-> 15 0 23 1016 G 1125 5368
-> 16 0 23 1016 G 1126 5368
-> 15 0 24 1016 G 1126 5369
-> 16 0 24 1016 G 1156 5369
-> 15 0 23 1016 G 1020 5370
-> 16 0 23 1016 G 1021 5370
-> 15 0 24 1016 G 1021 5371
-> 16 0 24 1016 G 1156 5371
-> 15 0 23 1016 G 1032 5372
-> 16 0 23 1016 G 1033 5372
-> 15 0 24 1016 G 1033 5373
-> 16 0 24 1016 G 1156 5373
-> 15 0 23 1016 G 1077 5374
-> 16 0 23 1016 G 1078 5374
-> 15 0 24 1016 G 1078 5375
-> 16 0 24 1016 G 1156 5375
-> 15 0 23 1016 G 1140 5376
-> 16 0 23 1016 G 1141 5376
-> 15 0 24 1016 G 1141 5377
-> 16 0 24 1016 G 1156 5377
-> 15 0 23 1016 G 1089 5378
-> 16 0 23 1016 G 1090 5378
-> 15 0 24 1016 G 1090 5379
-> 16 0 24 1016 G 1156 5379
-> 15 0 23 1016 G 1152 5380
-> 16 0 23 1016 G 1153 5380
-> 15 0 24 1016 G 1153 5381
-> 16 0 24 1016 G 1156 5381
-> 15 0 23 1016 G 1101 5382
-> 16 0 23 1016 G 1102 5382
-> 15 0 24 1016 G 1102 5383
-> 16 0 24 1016 G 1156 5383
-> 15 0 23 1016 G 1104 5384
-> 16 0 23 1016 G 1105 5384
-> 15 0 24 1016 G 1105 5385
-> 16 0 24 1016 G 1156 5385
-> 15 0 23 1016 G 1053 5386
-> 16 0 23 1016 G 1054 5386
-> 15 0 24 1016 G 1054 5387
-> 16 0 24 1016 G 1156 5387
-> 15 0 23 1016 G 1116 5388
-> 16 0 23 1016 G 1117 5388
-> 15 0 24 1016 G 1117 5389
-> 16 0 24 1016 G 1156 5389
-> 15 0 23 1016 G 1065 5390
-> 16 0 23 1016 G 1066 5390
-> 15 0 24 1016 G 1066 5391
-> 16 0 24 1016 G 1156 5391
-> 15 0 23 1016 G 1128 5392
-> 16 0 23 1016 G 1129 5392
-> 15 0 24 1016 G 1129 5393
-> 16 0 24 1016 G 1156 5393
-> 15 0 23 1016 G 1023 5394
-> 16 0 23 1016 G 1024 5394
-> 15 0 24 1016 G 1024 5395
-> 16 0 24 1016 G 1156 5395
-> 15 0 23 1016 G 1035 5396
-> 16 0 23 1016 G 1036 5396
-> 15 0 24 1016 G 1036 5397
-> 16 0 24 1016 G 1156 5397
-> 15 0 23 1016 G 1080 5398
-> 16 0 23 1016 G 1081 5398
-> 15 0 24 1016 G 1081 5399
-> 16 0 24 1016 G 1156 5399
-> 15 0 23 1016 G 1143 5400
-> 16 0 23 1016 G 1144 5400
-> 15 0 24 1016 G 1144 5401
-> 16 0 24 1016 G 1156 5401
-> 15 0 23 1016 G 1092 5402
-> 16 0 23 1016 G 1093 5402
-> 15 0 24 1016 G 1093 5403
-> 16 0 24 1016 G 1156 5403
-> 15 0 23 1016 G 1044 5404
-> 16 0 23 1016 G 1045 5404
-> 15 0 24 1016 G 1045 5405
-> 16 0 24 1016 G 1156 5405
-> 15 0 23 1016 G 1107 5406
-> 16 0 23 1016 G 1108 5406
-> 15 0 24 1016 G 1108 5407
-> 16 0 24 1016 G 1156 5407
-> 15 0 23 1016 G 1056 5408
-> 16 0 23 1016 G 1057 5408
-> 15 0 24 1016 G 1057 5409
-> 16 0 24 1016 G 1156 5409
-> 15 0 23 1016 G 1119 5410
-> 16 0 23 1016 G 1120 5410
-> 15 0 24 1016 G 1120 5411
-> 16 0 24 1016 G 1156 5411
-> 15 0 23 1016 G 1068 5412
-> 16 0 23 1016 G 1069 5412
-> 15 0 24 1016 G 1069 5413
-> 16 0 24 1016 G 1156 5413
-> 15 0 23 1016 G 1131 5414
-> 16 0 23 1016 G 1132 5414
-> 15 0 24 1016 G 1132 5415
-> 16 0 24 1016 G 1156 5415
-> 15 0 23 1016 G 1026 5416
-> 16 0 23 1016 G 1027 5416
-> 15 0 24 1016 G 1027 5417
-> 16 0 24 1016 G 1156 5417
-> 15 0 23 1016 G 1038 5418
-> 16 0 23 1016 G 1039 5418
-> 15 0 24 1016 G 1039 5419
-> 16 0 24 1016 G 1156 5419
-> 15 0 23 1016 G 1134 5420
-> 16 0 23 1016 G 1135 5420
-> 15 0 24 1016 G 1135 5421
-> 16 0 24 1016 G 1156 5421
-> 15 0 23 1016 G 1083 5422
-> 16 0 23 1016 G 1084 5422
-> 15 0 24 1016 G 1084 5423
-> 16 0 24 1016 G 1156 5423
-> 15 0 23 1016 G 1146 5424
-> 16 0 23 1016 G 1147 5424
-> 15 0 24 1016 G 1147 5425
-> 16 0 24 1016 G 1156 5425
-> 15 0 23 1016 G 1095 5426
-> 16 0 23 1016 G 1096 5426
-> 15 0 24 1016 G 1096 5427
-> 16 0 24 1016 G 1156 5427
-> 15 0 23 1016 G 1047 5428
-> 16 0 23 1016 G 1048 5428
-> 15 0 24 1016 G 1048 5429
-> 16 0 24 1016 G 1156 5429
-> 15 0 23 1016 G 1110 5430
-> 16 0 23 1016 G 1111 5430
-> 15 0 24 1016 G 1111 5431
-> 16 0 24 1016 G 1156 5431
-> 15 0 23 952 G 989 5432
-> 16 0 23 952 G 990 5432
-> 15 0 24 952 G 990 5433
-> 16 0 24 952 G 1014 5433
-> 15 0 24 952 G 1014 5434
-> 16 0 24 952 G 997 5434
-> 15 0 25 952 G 997 5435
-> 16 0 25 952 G 995 5435
-> 15 0 24 952 G 1014 5436
-> 16 0 24 952 G 1003 5436
-> 15 0 25 952 G 1003 5437
-> 16 0 25 952 G 1001 5437
-> 15 0 24 952 G 1014 5438
-> 16 0 24 952 G 1009 5438
-> 15 0 25 952 G 1009 5439
-> 16 0 25 952 G 1007 5439
-> 15 0 24 952 G 1014 5440
-> 16 0 24 952 G 1012 5440
-> 15 0 25 952 G 1012 5441
-> 16 0 25 952 G 1010 5441
-> 15 0 24 952 G 1014 5442
-> 16 0 24 952 G 955 5442
-> 15 0 25 952 G 955 5443
-> 16 0 25 952 G 953 5443
-> 15 0 24 952 G 1014 5444
-> 16 0 24 952 G 961 5444
-> 15 0 25 952 G 961 5445
-> 16 0 25 952 G 959 5445
-> 15 0 24 952 G 1014 5446
-> 16 0 24 952 G 967 5446
-> 15 0 25 952 G 967 5447
-> 16 0 25 952 G 965 5447
-> 15 0 24 952 G 1014 5448
-> 16 0 24 952 G 973 5448
-> 15 0 25 952 G 973 5449
-> 16 0 25 952 G 971 5449
-> 15 0 24 952 G 1014 5450
-> 16 0 24 952 G 979 5450
-> 15 0 25 952 G 979 5451
-> 16 0 25 952 G 977 5451
-> 15 0 24 952 G 1014 5452
-> 16 0 24 952 G 982 5452
-> 15 0 25 952 G 982 5453
-> 16 0 25 952 G 980 5453
-> 15 0 24 952 G 1014 5454
-> 16 0 24 952 G 988 5454
-> 15 0 25 952 G 988 5455
-> 16 0 25 952 G 986 5455
-> 15 0 24 952 G 1014 5456
-> 16 0 24 952 G 994 5456
-> 15 0 25 952 G 994 5457
-> 16 0 25 952 G 992 5457
-> 15 0 24 952 G 1014 5458
-> 16 0 24 952 G 1000 5458
-> 15 0 25 952 G 1000 5459
-> 16 0 25 952 G 998 5459
-> 15 0 24 952 G 1014 5460
-> 16 0 24 952 G 1006 5460
-> 15 0 25 952 G 1006 5461
-> 16 0 25 952 G 1004 5461
-> 15 0 26 952 G 1014 5462
-> 16 0 26 952 G 1013 5462
-> 15 0 24 952 G 1014 5463
-> 16 0 24 952 G 958 5463
-> 15 0 25 952 G 958 5464
-> 16 0 25 952 G 956 5464
-> 15 0 24 952 G 1014 5465
-> 16 0 24 952 G 964 5465
-> 15 0 25 952 G 964 5466
-> 16 0 25 952 G 962 5466
-> 15 0 24 952 G 1014 5467
-> 16 0 24 952 G 970 5467
-> 15 0 25 952 G 970 5468
-> 16 0 25 952 G 968 5468
-> 15 0 24 952 G 1014 5469
-> 16 0 24 952 G 976 5469
-> 15 0 25 952 G 976 5470
-> 16 0 25 952 G 974 5470
-> 15 0 24 952 G 1014 5471
-> 16 0 24 952 G 985 5471
-> 15 0 25 952 G 985 5472
-> 16 0 25 952 G 983 5472
-> 15 0 23 952 G 995 5473
-> 16 0 23 952 G 996 5473
-> 15 0 24 952 G 996 5474
-> 16 0 24 952 G 1014 5474
-> 15 0 24 952 G 1014 5475
-> 16 0 24 952 G 991 5475
-> 15 0 25 952 G 991 5476
-> 16 0 25 952 G 989 5476
-> 15 0 23 952 G 1001 5477
-> 16 0 23 952 G 1002 5477
-> 15 0 24 952 G 1002 5478
-> 16 0 24 952 G 1014 5478
-> 15 0 23 952 G 1007 5479
-> 16 0 23 952 G 1008 5479
-> 15 0 24 952 G 1008 5480
-> 16 0 24 952 G 1014 5480
-> 15 0 23 952 G 1010 5481
-> 16 0 23 952 G 1011 5481
-> 15 0 24 952 G 1011 5482
-> 16 0 24 952 G 1014 5482
-> 15 0 23 952 G 953 5483
-> 16 0 23 952 G 954 5483
-> 15 0 24 952 G 954 5484
-> 16 0 24 952 G 1014 5484
-> 15 0 23 952 G 959 5485
-> 16 0 23 952 G 960 5485
-> 15 0 24 952 G 960 5486
-> 16 0 24 952 G 1014 5486
-> 15 0 23 952 G 965 5487
-> 16 0 23 952 G 966 5487
-> 15 0 24 952 G 966 5488
-> 16 0 24 952 G 1014 5488
-> 15 0 23 952 G 971 5489
-> 16 0 23 952 G 972 5489
-> 15 0 24 952 G 972 5490
-> 16 0 24 952 G 1014 5490
-> 15 0 23 952 G 977 5491
-> 16 0 23 952 G 978 5491
-> 15 0 24 952 G 978 5492
-> 16 0 24 952 G 1014 5492
-> 15 0 23 952 G 980 5493
-> 16 0 23 952 G 981 5493
-> 15 0 24 952 G 981 5494
-> 16 0 24 952 G 1014 5494
-> 15 0 23 952 G 986 5495
-> 16 0 23 952 G 987 5495
-> 15 0 24 952 G 987 5496
-> 16 0 24 952 G 1014 5496
-> 15 0 23 952 G 992 5497
-> 16 0 23 952 G 993 5497
-> 15 0 24 952 G 993 5498
-> 16 0 24 952 G 1014 5498
-> 15 0 23 952 G 998 5499
-> 16 0 23 952 G 999 5499
-> 15 0 24 952 G 999 5500
-> 16 0 24 952 G 1014 5500
-> 15 0 23 952 G 1004 5501
-> 16 0 23 952 G 1005 5501
-> 15 0 24 952 G 1005 5502
-> 16 0 24 952 G 1014 5502
-> 15 0 23 952 G 956 5503
-> 16 0 23 952 G 957 5503
-> 15 0 24 952 G 957 5504
-> 16 0 24 952 G 1014 5504
-> 15 0 23 952 G 962 5505
-> 16 0 23 952 G 963 5505
-> 15 0 24 952 G 963 5506
-> 16 0 24 952 G 1014 5506
-> 15 0 23 952 G 968 5507
-> 16 0 23 952 G 969 5507
-> 15 0 24 952 G 969 5508
-> 16 0 24 952 G 1014 5508
-> 15 0 23 952 G 974 5509
-> 16 0 23 952 G 975 5509
-> 15 0 24 952 G 975 5510
-> 16 0 24 952 G 1014 5510
-> 15 0 23 952 G 983 5511
-> 16 0 23 952 G 984 5511
-> 15 0 24 952 G 984 5512
-> 16 0 24 952 G 1014 5512
-> 15 0 23 1158 G 1159 5513
-> 16 0 23 1158 G 1160 5513
-> 15 0 24 1158 G 1160 5514
-> 16 0 24 1158 G 1184 5514
-> 15 0 24 1158 G 1184 5515
-> 16 0 24 1158 G 1167 5515
-> 15 0 25 1158 G 1167 5516
-> 16 0 25 1158 G 1165 5516
-> 15 0 24 1158 G 1184 5517
-> 16 0 24 1158 G 1173 5517
-> 15 0 25 1158 G 1173 5518
-> 16 0 25 1158 G 1171 5518
-> 15 0 24 1158 G 1184 5519
-> 16 0 24 1158 G 1179 5519
-> 15 0 25 1158 G 1179 5520
-> 16 0 25 1158 G 1177 5520
-> 15 0 26 1158 G 1184 5521
-> 16 0 26 1158 G 1183 5521
-> 15 0 24 1158 G 1184 5522
-> 16 0 24 1158 G 1164 5522
-> 15 0 25 1158 G 1164 5523
-> 16 0 25 1158 G 1162 5523
-> 15 0 24 1158 G 1184 5524
-> 16 0 24 1158 G 1170 5524
-> 15 0 25 1158 G 1170 5525
-> 16 0 25 1158 G 1168 5525
-> 15 0 24 1158 G 1184 5526
-> 16 0 24 1158 G 1176 5526
-> 15 0 25 1158 G 1176 5527
-> 16 0 25 1158 G 1174 5527
-> 15 0 24 1158 G 1184 5528
-> 16 0 24 1158 G 1182 5528
-> 15 0 25 1158 G 1182 5529
-> 16 0 25 1158 G 1180 5529
-> 15 0 23 1158 G 1165 5530
-> 16 0 23 1158 G 1166 5530
-> 15 0 24 1158 G 1166 5531
-> 16 0 24 1158 G 1184 5531
-> 15 0 24 1158 G 1184 5532
-> 16 0 24 1158 G 1161 5532
-> 15 0 25 1158 G 1161 5533
-> 16 0 25 1158 G 1159 5533
-> 15 0 23 1158 G 1171 5534
-> 16 0 23 1158 G 1172 5534
-> 15 0 24 1158 G 1172 5535
-> 16 0 24 1158 G 1184 5535
-> 15 0 23 1158 G 1177 5536
-> 16 0 23 1158 G 1178 5536
-> 15 0 24 1158 G 1178 5537
-> 16 0 24 1158 G 1184 5537
-> 15 0 23 1158 G 1162 5538
-> 16 0 23 1158 G 1163 5538
-> 15 0 24 1158 G 1163 5539
-> 16 0 24 1158 G 1184 5539
-> 15 0 23 1158 G 1168 5540
-> 16 0 23 1158 G 1169 5540
-> 15 0 24 1158 G 1169 5541
-> 16 0 24 1158 G 1184 5541
-> 15 0 23 1158 G 1174 5542
-> 16 0 23 1158 G 1175 5542
-> 15 0 24 1158 G 1175 5543
-> 16 0 24 1158 G 1184 5543
-> 15 0 23 1158 G 1180 5544
-> 16 0 23 1158 G 1181 5544
-> 15 0 24 1158 G 1181 5545
-> 16 0 24 1158 G 1184 5545
-> 15 0 23 870 G 931 5546
-> 16 0 23 870 G 932 5546
-> 15 0 24 870 G 932 5547
-> 16 0 24 870 G 950 5547
-> 15 0 24 870 G 950 5548
-> 16 0 24 870 G 939 5548
-> 15 0 25 870 G 939 5549
-> 16 0 25 870 G 937 5549
-> 15 0 24 870 G 950 5550
-> 16 0 24 870 G 945 5550
-> 15 0 25 870 G 945 5551
-> 16 0 25 870 G 943 5551
-> 15 0 24 870 G 950 5552
-> 16 0 24 870 G 876 5552
-> 15 0 25 870 G 876 5553
-> 16 0 25 870 G 874 5553
-> 15 0 24 870 G 950 5554
-> 16 0 24 870 G 882 5554
-> 15 0 25 870 G 882 5555
-> 16 0 25 870 G 880 5555
-> 15 0 24 870 G 950 5556
-> 16 0 24 870 G 888 5556
-> 15 0 25 870 G 888 5557
-> 16 0 25 870 G 886 5557
-> 15 0 24 870 G 950 5558
-> 16 0 24 870 G 894 5558
-> 15 0 25 870 G 894 5559
-> 16 0 25 870 G 892 5559
-> 15 0 24 870 G 950 5560
-> 16 0 24 870 G 903 5560
-> 15 0 25 870 G 903 5561
-> 16 0 25 870 G 901 5561
-> 15 0 24 870 G 950 5562
-> 16 0 24 870 G 909 5562
-> 15 0 25 870 G 909 5563
-> 16 0 25 870 G 907 5563
-> 15 0 24 870 G 950 5564
-> 16 0 24 870 G 915 5564
-> 15 0 25 870 G 915 5565
-> 16 0 25 870 G 913 5565
-> 15 0 26 870 G 950 5566
-> 16 0 26 870 G 949 5566
-> 15 0 24 870 G 950 5567
-> 16 0 24 870 G 921 5567
-> 15 0 25 870 G 921 5568
-> 16 0 25 870 G 919 5568
-> 15 0 24 870 G 950 5569
-> 16 0 24 870 G 927 5569
-> 15 0 25 870 G 927 5570
-> 16 0 25 870 G 925 5570
-> 15 0 24 870 G 950 5571
-> 16 0 24 870 G 930 5571
-> 15 0 25 870 G 930 5572
-> 16 0 25 870 G 928 5572
-> 15 0 24 870 G 950 5573
-> 16 0 24 870 G 936 5573
-> 15 0 25 870 G 936 5574
-> 16 0 25 870 G 934 5574
-> 15 0 24 870 G 950 5575
-> 16 0 24 870 G 942 5575
-> 15 0 25 870 G 942 5576
-> 16 0 25 870 G 940 5576
-> 15 0 24 870 G 950 5577
-> 16 0 24 870 G 948 5577
-> 15 0 25 870 G 948 5578
-> 16 0 25 870 G 946 5578
-> 15 0 24 870 G 950 5579
-> 16 0 24 870 G 873 5579
-> 15 0 25 870 G 873 5580
-> 16 0 25 870 G 871 5580
-> 15 0 24 870 G 950 5581
-> 16 0 24 870 G 879 5581
-> 15 0 25 870 G 879 5582
-> 16 0 25 870 G 877 5582
-> 15 0 24 870 G 950 5583
-> 16 0 24 870 G 885 5583
-> 15 0 25 870 G 885 5584
-> 16 0 25 870 G 883 5584
-> 15 0 24 870 G 950 5585
-> 16 0 24 870 G 891 5585
-> 15 0 25 870 G 891 5586
-> 16 0 25 870 G 889 5586
-> 15 0 24 870 G 950 5587
-> 16 0 24 870 G 897 5587
-> 15 0 25 870 G 897 5588
-> 16 0 25 870 G 895 5588
-> 15 0 24 870 G 950 5589
-> 16 0 24 870 G 900 5589
-> 15 0 25 870 G 900 5590
-> 16 0 25 870 G 898 5590
-> 15 0 24 870 G 950 5591
-> 16 0 24 870 G 906 5591
-> 15 0 25 870 G 906 5592
-> 16 0 25 870 G 904 5592
-> 15 0 24 870 G 950 5593
-> 16 0 24 870 G 912 5593
-> 15 0 25 870 G 912 5594
-> 16 0 25 870 G 910 5594
-> 15 0 24 870 G 950 5595
-> 16 0 24 870 G 918 5595
-> 15 0 25 870 G 918 5596
-> 16 0 25 870 G 916 5596
-> 15 0 24 870 G 950 5597
-> 16 0 24 870 G 924 5597
-> 15 0 25 870 G 924 5598
-> 16 0 25 870 G 922 5598
-> 15 0 23 870 G 937 5599
-> 16 0 23 870 G 938 5599
-> 15 0 24 870 G 938 5600
-> 16 0 24 870 G 950 5600
-> 15 0 24 870 G 950 5601
-> 16 0 24 870 G 933 5601
-> 15 0 25 870 G 933 5602
-> 16 0 25 870 G 931 5602
-> 15 0 23 870 G 943 5603
-> 16 0 23 870 G 944 5603
-> 15 0 24 870 G 944 5604
-> 16 0 24 870 G 950 5604
-> 15 0 23 870 G 874 5605
-> 16 0 23 870 G 875 5605
-> 15 0 24 870 G 875 5606
-> 16 0 24 870 G 950 5606
-> 15 0 23 870 G 880 5607
-> 16 0 23 870 G 881 5607
-> 15 0 24 870 G 881 5608
-> 16 0 24 870 G 950 5608
-> 15 0 23 870 G 886 5609
-> 16 0 23 870 G 887 5609
-> 15 0 24 870 G 887 5610
-> 16 0 24 870 G 950 5610
-> 15 0 23 870 G 892 5611
-> 16 0 23 870 G 893 5611
-> 15 0 24 870 G 893 5612
-> 16 0 24 870 G 950 5612
-> 15 0 23 870 G 901 5613
-> 16 0 23 870 G 902 5613
-> 15 0 24 870 G 902 5614
-> 16 0 24 870 G 950 5614
-> 15 0 23 870 G 907 5615
-> 16 0 23 870 G 908 5615
-> 15 0 24 870 G 908 5616
-> 16 0 24 870 G 950 5616
-> 15 0 23 870 G 913 5617
-> 16 0 23 870 G 914 5617
-> 15 0 24 870 G 914 5618
-> 16 0 24 870 G 950 5618
-> 15 0 23 870 G 919 5619
-> 16 0 23 870 G 920 5619
-> 15 0 24 870 G 920 5620
-> 16 0 24 870 G 950 5620
-> 15 0 23 870 G 925 5621
-> 16 0 23 870 G 926 5621
-> 15 0 24 870 G 926 5622
-> 16 0 24 870 G 950 5622
-> 15 0 23 870 G 928 5623
-> 16 0 23 870 G 929 5623
-> 15 0 24 870 G 929 5624
-> 16 0 24 870 G 950 5624
-> 15 0 23 870 G 934 5625
-> 16 0 23 870 G 935 5625
-> 15 0 24 870 G 935 5626
-> 16 0 24 870 G 950 5626
-> 15 0 23 870 G 940 5627
-> 16 0 23 870 G 941 5627
-> 15 0 24 870 G 941 5628
-> 16 0 24 870 G 950 5628
-> 15 0 23 870 G 946 5629
-> 16 0 23 870 G 947 5629
-> 15 0 24 870 G 947 5630
-> 16 0 24 870 G 950 5630
-> 15 0 23 870 G 871 5631
-> 16 0 23 870 G 872 5631
-> 15 0 24 870 G 872 5632
-> 16 0 24 870 G 950 5632
-> 15 0 23 870 G 877 5633
-> 16 0 23 870 G 878 5633
-> 15 0 24 870 G 878 5634
-> 16 0 24 870 G 950 5634
-> 15 0 23 870 G 883 5635
-> 16 0 23 870 G 884 5635
-> 15 0 24 870 G 884 5636
-> 16 0 24 870 G 950 5636
-> 15 0 23 870 G 889 5637
-> 16 0 23 870 G 890 5637
-> 15 0 24 870 G 890 5638
-> 16 0 24 870 G 950 5638
-> 15 0 23 870 G 895 5639
-> 16 0 23 870 G 896 5639
-> 15 0 24 870 G 896 5640
-> 16 0 24 870 G 950 5640
-> 15 0 23 870 G 898 5641
-> 16 0 23 870 G 899 5641
-> 15 0 24 870 G 899 5642
-> 16 0 24 870 G 950 5642
-> 15 0 23 870 G 904 5643
-> 16 0 23 870 G 905 5643
-> 15 0 24 870 G 905 5644
-> 16 0 24 870 G 950 5644
-> 15 0 23 870 G 910 5645
-> 16 0 23 870 G 911 5645
-> 15 0 24 870 G 911 5646
-> 16 0 24 870 G 950 5646
-> 15 0 23 870 G 916 5647
-> 16 0 23 870 G 917 5647
-> 15 0 24 870 G 917 5648
-> 16 0 24 870 G 950 5648
-> 15 0 23 870 G 922 5649
-> 16 0 23 870 G 923 5649
-> 15 0 24 870 G 923 5650
-> 16 0 24 870 G 950 5650
-> 15 0 27 869 G 1155 5651
-> 16 0 27 869 G 1157 5651
-> 15 0 21 869 G 1157 5652
-> 16 0 21 869 G 1015 5652
-> 15 0 28 869 G 1015 5653
-> 16 0 28 869 G 1013 5653
-> 15 0 21 869 G 1157 5654
-> 16 0 21 869 G 1185 5654
-> 15 0 28 869 G 1185 5655
-> 16 0 28 869 G 1183 5655
-> 15 0 28 869 G 1157 5656
-> 16 0 28 869 G 1187 5656
-> 15 0 21 869 G 1157 5657
-> 16 0 21 869 G 951 5657
-> 15 0 28 869 G 951 5658
-> 16 0 28 869 G 949 5658
-> 15 0 21 869 G 1015 5659
-> 16 0 21 869 G 1185 5659
-> 15 0 28 869 G 1015 5660
-> 16 0 28 869 G 1187 5660
-> 15 0 21 869 G 1015 5661
-> 16 0 21 869 G 951 5661
-> 15 0 28 869 G 1185 5662
-> 16 0 28 869 G 1187 5662
-> 15 0 21 869 G 1185 5663
-> 16 0 21 869 G 951 5663
-> 15 0 27 869 G 1187 5664
-> 16 0 27 869 G 951 5664
-> 15 0 23 3922 G 3989 5665
-> 16 0 23 3922 G 3990 5665
-> 15 0 24 3922 G 3990 5666
-> 16 0 24 3922 G 4092 5666
-> 15 0 24 3922 G 4092 5667
-> 16 0 24 3922 G 4051 5667
-> 15 0 25 3922 G 4051 5668
-> 16 0 25 3922 G 4049 5668
-> 15 0 24 3922 G 4092 5669
-> 16 0 24 3922 G 3973 5669
-> 15 0 25 3922 G 3973 5670
-> 16 0 25 3922 G 3971 5670
-> 15 0 24 3922 G 4092 5671
-> 16 0 24 3922 G 4033 5671
-> 15 0 25 3922 G 4033 5672
-> 16 0 25 3922 G 4031 5672
-> 15 0 24 3922 G 4092 5673
-> 16 0 24 3922 G 3931 5673
-> 15 0 25 3922 G 3931 5674
-> 16 0 25 3922 G 3929 5674
-> 15 0 24 3922 G 4092 5675
-> 16 0 24 3922 G 3958 5675
-> 15 0 25 3922 G 3958 5676
-> 16 0 25 3922 G 3956 5676
-> 15 0 24 3922 G 4092 5677
-> 16 0 24 3922 G 4018 5677
-> 15 0 25 3922 G 4018 5678
-> 16 0 25 3922 G 4016 5678
-> 15 0 24 3922 G 4092 5679
-> 16 0 24 3922 G 4078 5679
-> 15 0 25 3922 G 4078 5680
-> 16 0 25 3922 G 4076 5680
-> 15 0 24 3922 G 4092 5681
-> 16 0 24 3922 G 4000 5681
-> 15 0 25 3922 G 4000 5682
-> 16 0 25 3922 G 3998 5682
-> 15 0 24 3922 G 4092 5683
-> 16 0 24 3922 G 4060 5683
-> 15 0 25 3922 G 4060 5684
-> 16 0 25 3922 G 4058 5684
-> 15 0 24 3922 G 4092 5685
-> 16 0 24 3922 G 3940 5685
-> 15 0 25 3922 G 3940 5686
-> 16 0 25 3922 G 3938 5686
-> 15 0 24 3922 G 4092 5687
-> 16 0 24 3922 G 3985 5687
-> 15 0 25 3922 G 3985 5688
-> 16 0 25 3922 G 3983 5688
-> 15 0 24 3922 G 4092 5689
-> 16 0 24 3922 G 4045 5689
-> 15 0 25 3922 G 4045 5690
-> 16 0 25 3922 G 4043 5690
-> 15 0 24 3922 G 4092 5691
-> 16 0 24 3922 G 3967 5691
-> 15 0 25 3922 G 3967 5692
-> 16 0 25 3922 G 3965 5692
-> 15 0 24 3922 G 4092 5693
-> 16 0 24 3922 G 4027 5693
-> 15 0 25 3922 G 4027 5694
-> 16 0 25 3922 G 4025 5694
-> 15 0 24 3922 G 4092 5695
-> 16 0 24 3922 G 4087 5695
-> 15 0 25 3922 G 4087 5696
-> 16 0 25 3922 G 4085 5696
-> 15 0 24 3922 G 4092 5697
-> 16 0 24 3922 G 4009 5697
-> 15 0 25 3922 G 4009 5698
-> 16 0 25 3922 G 4007 5698
-> 15 0 24 3922 G 4092 5699
-> 16 0 24 3922 G 4069 5699
-> 15 0 25 3922 G 4069 5700
-> 16 0 25 3922 G 4067 5700
-> 15 0 24 3922 G 4092 5701
-> 16 0 24 3922 G 3925 5701
-> 15 0 25 3922 G 3925 5702
-> 16 0 25 3922 G 3923 5702
-> 15 0 24 3922 G 4092 5703
-> 16 0 24 3922 G 3949 5703
-> 15 0 25 3922 G 3949 5704
-> 16 0 25 3922 G 3947 5704
-> 15 0 24 3922 G 4092 5705
-> 16 0 24 3922 G 3952 5705
-> 15 0 25 3922 G 3952 5706
-> 16 0 25 3922 G 3950 5706
-> 15 0 24 3922 G 4092 5707
-> 16 0 24 3922 G 4012 5707
-> 15 0 25 3922 G 4012 5708
-> 16 0 25 3922 G 4010 5708
-> 15 0 24 3922 G 4092 5709
-> 16 0 24 3922 G 4072 5709
-> 15 0 25 3922 G 4072 5710
-> 16 0 25 3922 G 4070 5710
-> 15 0 24 3922 G 4092 5711
-> 16 0 24 3922 G 3994 5711
-> 15 0 25 3922 G 3994 5712
-> 16 0 25 3922 G 3992 5712
-> 15 0 24 3922 G 4092 5713
-> 16 0 24 3922 G 4054 5713
-> 15 0 25 3922 G 4054 5714
-> 16 0 25 3922 G 4052 5714
-> 15 0 24 3922 G 4092 5715
-> 16 0 24 3922 G 3976 5715
-> 15 0 25 3922 G 3976 5716
-> 16 0 25 3922 G 3974 5716
-> 15 0 24 3922 G 4092 5717
-> 16 0 24 3922 G 4036 5717
-> 15 0 25 3922 G 4036 5718
-> 16 0 25 3922 G 4034 5718
-> 15 0 24 3922 G 4092 5719
-> 16 0 24 3922 G 3934 5719
-> 15 0 25 3922 G 3934 5720
-> 16 0 25 3922 G 3932 5720
-> 15 0 24 3922 G 4092 5721
-> 16 0 24 3922 G 3961 5721
-> 15 0 25 3922 G 3961 5722
-> 16 0 25 3922 G 3959 5722
-> 15 0 24 3922 G 4092 5723
-> 16 0 24 3922 G 4021 5723
-> 15 0 25 3922 G 4021 5724
-> 16 0 25 3922 G 4019 5724
-> 15 0 24 3922 G 4092 5725
-> 16 0 24 3922 G 4081 5725
-> 15 0 25 3922 G 4081 5726
-> 16 0 25 3922 G 4079 5726
-> 15 0 24 3922 G 4092 5727
-> 16 0 24 3922 G 4003 5727
-> 15 0 25 3922 G 4003 5728
-> 16 0 25 3922 G 4001 5728
-> 15 0 24 3922 G 4092 5729
-> 16 0 24 3922 G 4063 5729
-> 15 0 25 3922 G 4063 5730
-> 16 0 25 3922 G 4061 5730
-> 15 0 24 3922 G 4092 5731
-> 16 0 24 3922 G 3943 5731
-> 15 0 25 3922 G 3943 5732
-> 16 0 25 3922 G 3941 5732
-> 15 0 24 3922 G 4092 5733
-> 16 0 24 3922 G 3988 5733
-> 15 0 25 3922 G 3988 5734
-> 16 0 25 3922 G 3986 5734
-> 15 0 24 3922 G 4092 5735
-> 16 0 24 3922 G 4048 5735
-> 15 0 25 3922 G 4048 5736
-> 16 0 25 3922 G 4046 5736
-> 15 0 24 3922 G 4092 5737
-> 16 0 24 3922 G 3970 5737
-> 15 0 25 3922 G 3970 5738
-> 16 0 25 3922 G 3968 5738
-> 15 0 24 3922 G 4092 5739
-> 16 0 24 3922 G 4030 5739
-> 15 0 25 3922 G 4030 5740
-> 16 0 25 3922 G 4028 5740
-> 15 0 24 3922 G 4092 5741
-> 16 0 24 3922 G 4090 5741
-> 15 0 25 3922 G 4090 5742
-> 16 0 25 3922 G 4088 5742
-> 15 0 24 3922 G 4092 5743
-> 16 0 24 3922 G 3928 5743
-> 15 0 25 3922 G 3928 5744
-> 16 0 25 3922 G 3926 5744
-> 15 0 26 3922 G 4092 5745
-> 16 0 26 3922 G 4091 5745
-> 15 0 24 3922 G 4092 5746
-> 16 0 24 3922 G 3955 5746
-> 15 0 25 3922 G 3955 5747
-> 16 0 25 3922 G 3953 5747
-> 15 0 24 3922 G 4092 5748
-> 16 0 24 3922 G 4015 5748
-> 15 0 25 3922 G 4015 5749
-> 16 0 25 3922 G 4013 5749
-> 15 0 24 3922 G 4092 5750
-> 16 0 24 3922 G 4075 5750
-> 15 0 25 3922 G 4075 5751
-> 16 0 25 3922 G 4073 5751
-> 15 0 24 3922 G 4092 5752
-> 16 0 24 3922 G 3997 5752
-> 15 0 25 3922 G 3997 5753
-> 16 0 25 3922 G 3995 5753
-> 15 0 24 3922 G 4092 5754
-> 16 0 24 3922 G 4057 5754
-> 15 0 25 3922 G 4057 5755
-> 16 0 25 3922 G 4055 5755
-> 15 0 24 3922 G 4092 5756
-> 16 0 24 3922 G 3979 5756
-> 15 0 25 3922 G 3979 5757
-> 16 0 25 3922 G 3977 5757
-> 15 0 24 3922 G 4092 5758
-> 16 0 24 3922 G 4039 5758
-> 15 0 25 3922 G 4039 5759
-> 16 0 25 3922 G 4037 5759
-> 15 0 24 3922 G 4092 5760
-> 16 0 24 3922 G 3937 5760
-> 15 0 25 3922 G 3937 5761
-> 16 0 25 3922 G 3935 5761
-> 15 0 24 3922 G 4092 5762
-> 16 0 24 3922 G 3982 5762
-> 15 0 25 3922 G 3982 5763
-> 16 0 25 3922 G 3980 5763
-> 15 0 24 3922 G 4092 5764
-> 16 0 24 3922 G 4042 5764
-> 15 0 25 3922 G 4042 5765
-> 16 0 25 3922 G 4040 5765
-> 15 0 24 3922 G 4092 5766
-> 16 0 24 3922 G 3964 5766
-> 15 0 25 3922 G 3964 5767
-> 16 0 25 3922 G 3962 5767
-> 15 0 24 3922 G 4092 5768
-> 16 0 24 3922 G 4024 5768
-> 15 0 25 3922 G 4024 5769
-> 16 0 25 3922 G 4022 5769
-> 15 0 24 3922 G 4092 5770
-> 16 0 24 3922 G 4084 5770
-> 15 0 25 3922 G 4084 5771
-> 16 0 25 3922 G 4082 5771
-> 15 0 24 3922 G 4092 5772
-> 16 0 24 3922 G 4006 5772
-> 15 0 25 3922 G 4006 5773
-> 16 0 25 3922 G 4004 5773
-> 15 0 24 3922 G 4092 5774
-> 16 0 24 3922 G 4066 5774
-> 15 0 25 3922 G 4066 5775
-> 16 0 25 3922 G 4064 5775
-> 15 0 24 3922 G 4092 5776
-> 16 0 24 3922 G 3946 5776
-> 15 0 25 3922 G 3946 5777
-> 16 0 25 3922 G 3944 5777
-> 15 0 23 3922 G 4049 5778
-> 16 0 23 3922 G 4050 5778
-> 15 0 24 3922 G 4050 5779
-> 16 0 24 3922 G 4092 5779
-> 15 0 24 3922 G 4092 5780
-> 16 0 24 3922 G 3991 5780
-> 15 0 25 3922 G 3991 5781
-> 16 0 25 3922 G 3989 5781
-> 15 0 23 3922 G 3971 5782
-> 16 0 23 3922 G 3972 5782
-> 15 0 24 3922 G 3972 5783
-> 16 0 24 3922 G 4092 5783
-> 15 0 23 3922 G 4031 5784
-> 16 0 23 3922 G 4032 5784
-> 15 0 24 3922 G 4032 5785
-> 16 0 24 3922 G 4092 5785
-> 15 0 23 3922 G 3929 5786
-> 16 0 23 3922 G 3930 5786
-> 15 0 24 3922 G 3930 5787
-> 16 0 24 3922 G 4092 5787
-> 15 0 23 3922 G 3956 5788
-> 16 0 23 3922 G 3957 5788
-> 15 0 24 3922 G 3957 5789
-> 16 0 24 3922 G 4092 5789
-> 15 0 23 3922 G 4016 5790
-> 16 0 23 3922 G 4017 5790
-> 15 0 24 3922 G 4017 5791
-> 16 0 24 3922 G 4092 5791
-> 15 0 23 3922 G 4076 5792
-> 16 0 23 3922 G 4077 5792
-> 15 0 24 3922 G 4077 5793
-> 16 0 24 3922 G 4092 5793
-> 15 0 23 3922 G 3998 5794
-> 16 0 23 3922 G 3999 5794
-> 15 0 24 3922 G 3999 5795
-> 16 0 24 3922 G 4092 5795
-> 15 0 23 3922 G 4058 5796
-> 16 0 23 3922 G 4059 5796
-> 15 0 24 3922 G 4059 5797
-> 16 0 24 3922 G 4092 5797
-> 15 0 23 3922 G 3938 5798
-> 16 0 23 3922 G 3939 5798
-> 15 0 24 3922 G 3939 5799
-> 16 0 24 3922 G 4092 5799
-> 15 0 23 3922 G 3983 5800
-> 16 0 23 3922 G 3984 5800
-> 15 0 24 3922 G 3984 5801
-> 16 0 24 3922 G 4092 5801
-> 15 0 23 3922 G 4043 5802
-> 16 0 23 3922 G 4044 5802
-> 15 0 24 3922 G 4044 5803
-> 16 0 24 3922 G 4092 5803
-> 15 0 23 3922 G 3965 5804
-> 16 0 23 3922 G 3966 5804
-> 15 0 24 3922 G 3966 5805
-> 16 0 24 3922 G 4092 5805
-> 15 0 23 3922 G 4025 5806
-> 16 0 23 3922 G 4026 5806
-> 15 0 24 3922 G 4026 5807
-> 16 0 24 3922 G 4092 5807
-> 15 0 23 3922 G 4085 5808
-> 16 0 23 3922 G 4086 5808
-> 15 0 24 3922 G 4086 5809
-> 16 0 24 3922 G 4092 5809
-> 15 0 23 3922 G 4007 5810
-> 16 0 23 3922 G 4008 5810
-> 15 0 24 3922 G 4008 5811
-> 16 0 24 3922 G 4092 5811
-> 15 0 23 3922 G 4067 5812
-> 16 0 23 3922 G 4068 5812
-> 15 0 24 3922 G 4068 5813
-> 16 0 24 3922 G 4092 5813
-> 15 0 23 3922 G 3923 5814
-> 16 0 23 3922 G 3924 5814
-> 15 0 24 3922 G 3924 5815
-> 16 0 24 3922 G 4092 5815
-> 15 0 23 3922 G 3947 5816
-> 16 0 23 3922 G 3948 5816
-> 15 0 24 3922 G 3948 5817
-> 16 0 24 3922 G 4092 5817
-> 15 0 23 3922 G 3950 5818
-> 16 0 23 3922 G 3951 5818
-> 15 0 24 3922 G 3951 5819
-> 16 0 24 3922 G 4092 5819
-> 15 0 23 3922 G 4010 5820
-> 16 0 23 3922 G 4011 5820
-> 15 0 24 3922 G 4011 5821
-> 16 0 24 3922 G 4092 5821
-> 15 0 23 3922 G 4070 5822
-> 16 0 23 3922 G 4071 5822
-> 15 0 24 3922 G 4071 5823
-> 16 0 24 3922 G 4092 5823
-> 15 0 23 3922 G 3992 5824
-> 16 0 23 3922 G 3993 5824
-> 15 0 24 3922 G 3993 5825
-> 16 0 24 3922 G 4092 5825
-> 15 0 23 3922 G 4052 5826
-> 16 0 23 3922 G 4053 5826
-> 15 0 24 3922 G 4053 5827
-> 16 0 24 3922 G 4092 5827
-> 15 0 23 3922 G 3974 5828
-> 16 0 23 3922 G 3975 5828
-> 15 0 24 3922 G 3975 5829
-> 16 0 24 3922 G 4092 5829
-> 15 0 23 3922 G 4034 5830
-> 16 0 23 3922 G 4035 5830
-> 15 0 24 3922 G 4035 5831
-> 16 0 24 3922 G 4092 5831
-> 15 0 23 3922 G 3932 5832
-> 16 0 23 3922 G 3933 5832
-> 15 0 24 3922 G 3933 5833
-> 16 0 24 3922 G 4092 5833
-> 15 0 23 3922 G 3959 5834
-> 16 0 23 3922 G 3960 5834
-> 15 0 24 3922 G 3960 5835
-> 16 0 24 3922 G 4092 5835
-> 15 0 23 3922 G 4019 5836
-> 16 0 23 3922 G 4020 5836
-> 15 0 24 3922 G 4020 5837
-> 16 0 24 3922 G 4092 5837
-> 15 0 23 3922 G 4079 5838
-> 16 0 23 3922 G 4080 5838
-> 15 0 24 3922 G 4080 5839
-> 16 0 24 3922 G 4092 5839
-> 15 0 23 3922 G 4001 5840
-> 16 0 23 3922 G 4002 5840
-> 15 0 24 3922 G 4002 5841
-> 16 0 24 3922 G 4092 5841
-> 15 0 23 3922 G 4061 5842
-> 16 0 23 3922 G 4062 5842
-> 15 0 24 3922 G 4062 5843
-> 16 0 24 3922 G 4092 5843
-> 15 0 23 3922 G 3941 5844
-> 16 0 23 3922 G 3942 5844
-> 15 0 24 3922 G 3942 5845
-> 16 0 24 3922 G 4092 5845
-> 15 0 23 3922 G 3986 5846
-> 16 0 23 3922 G 3987 5846
-> 15 0 24 3922 G 3987 5847
-> 16 0 24 3922 G 4092 5847
-> 15 0 23 3922 G 4046 5848
-> 16 0 23 3922 G 4047 5848
-> 15 0 24 3922 G 4047 5849
-> 16 0 24 3922 G 4092 5849
-> 15 0 23 3922 G 3968 5850
-> 16 0 23 3922 G 3969 5850
-> 15 0 24 3922 G 3969 5851
-> 16 0 24 3922 G 4092 5851
-> 15 0 23 3922 G 4028 5852
-> 16 0 23 3922 G 4029 5852
-> 15 0 24 3922 G 4029 5853
-> 16 0 24 3922 G 4092 5853
-> 15 0 23 3922 G 4088 5854
-> 16 0 23 3922 G 4089 5854
-> 15 0 24 3922 G 4089 5855
-> 16 0 24 3922 G 4092 5855
-> 15 0 23 3922 G 3926 5856
-> 16 0 23 3922 G 3927 5856
-> 15 0 24 3922 G 3927 5857
-> 16 0 24 3922 G 4092 5857
-> 15 0 23 3922 G 3953 5858
-> 16 0 23 3922 G 3954 5858
-> 15 0 24 3922 G 3954 5859
-> 16 0 24 3922 G 4092 5859
-> 15 0 23 3922 G 4013 5860
-> 16 0 23 3922 G 4014 5860
-> 15 0 24 3922 G 4014 5861
-> 16 0 24 3922 G 4092 5861
-> 15 0 23 3922 G 4073 5862
-> 16 0 23 3922 G 4074 5862
-> 15 0 24 3922 G 4074 5863
-> 16 0 24 3922 G 4092 5863
-> 15 0 23 3922 G 3995 5864
-> 16 0 23 3922 G 3996 5864
-> 15 0 24 3922 G 3996 5865
-> 16 0 24 3922 G 4092 5865
-> 15 0 23 3922 G 4055 5866
-> 16 0 23 3922 G 4056 5866
-> 15 0 24 3922 G 4056 5867
-> 16 0 24 3922 G 4092 5867
-> 15 0 23 3922 G 3977 5868
-> 16 0 23 3922 G 3978 5868
-> 15 0 24 3922 G 3978 5869
-> 16 0 24 3922 G 4092 5869
-> 15 0 23 3922 G 4037 5870
-> 16 0 23 3922 G 4038 5870
-> 15 0 24 3922 G 4038 5871
-> 16 0 24 3922 G 4092 5871
-> 15 0 23 3922 G 3935 5872
-> 16 0 23 3922 G 3936 5872
-> 15 0 24 3922 G 3936 5873
-> 16 0 24 3922 G 4092 5873
-> 15 0 23 3922 G 3980 5874
-> 16 0 23 3922 G 3981 5874
-> 15 0 24 3922 G 3981 5875
-> 16 0 24 3922 G 4092 5875
-> 15 0 23 3922 G 4040 5876
-> 16 0 23 3922 G 4041 5876
-> 15 0 24 3922 G 4041 5877
-> 16 0 24 3922 G 4092 5877
-> 15 0 23 3922 G 3962 5878
-> 16 0 23 3922 G 3963 5878
-> 15 0 24 3922 G 3963 5879
-> 16 0 24 3922 G 4092 5879
-> 15 0 23 3922 G 4022 5880
-> 16 0 23 3922 G 4023 5880
-> 15 0 24 3922 G 4023 5881
-> 16 0 24 3922 G 4092 5881
-> 15 0 23 3922 G 4082 5882
-> 16 0 23 3922 G 4083 5882
-> 15 0 24 3922 G 4083 5883
-> 16 0 24 3922 G 4092 5883
-> 15 0 23 3922 G 4004 5884
-> 16 0 23 3922 G 4005 5884
-> 15 0 24 3922 G 4005 5885
-> 16 0 24 3922 G 4092 5885
-> 15 0 23 3922 G 4064 5886
-> 16 0 23 3922 G 4065 5886
-> 15 0 24 3922 G 4065 5887
-> 16 0 24 3922 G 4092 5887
-> 15 0 23 3922 G 3944 5888
-> 16 0 23 3922 G 3945 5888
-> 15 0 24 3922 G 3945 5889
-> 16 0 24 3922 G 4092 5889
-> 15 0 23 4248 G 4273 5890
-> 16 0 23 4248 G 4274 5890
-> 15 0 24 4248 G 4274 5891
-> 16 0 24 4248 G 4385 5891
-> 15 0 24 4248 G 4385 5892
-> 16 0 24 4248 G 4281 5892
-> 15 0 25 4248 G 4281 5893
-> 16 0 25 4248 G 4279 5893
-> 15 0 24 4248 G 4385 5894
-> 16 0 24 4248 G 4311 5894
-> 15 0 25 4248 G 4311 5895
-> 16 0 25 4248 G 4309 5895
-> 15 0 24 4248 G 4385 5896
-> 16 0 24 4248 G 4341 5896
-> 15 0 25 4248 G 4341 5897
-> 16 0 25 4248 G 4339 5897
-> 15 0 24 4248 G 4385 5898
-> 16 0 24 4248 G 4371 5898
-> 15 0 25 4248 G 4371 5899
-> 16 0 25 4248 G 4369 5899
-> 15 0 24 4248 G 4385 5900
-> 16 0 24 4248 G 4293 5900
-> 15 0 25 4248 G 4293 5901
-> 16 0 25 4248 G 4291 5901
-> 15 0 24 4248 G 4385 5902
-> 16 0 24 4248 G 4323 5902
-> 15 0 25 4248 G 4323 5903
-> 16 0 25 4248 G 4321 5903
-> 15 0 24 4248 G 4385 5904
-> 16 0 24 4248 G 4353 5904
-> 15 0 25 4248 G 4353 5905
-> 16 0 25 4248 G 4351 5905
-> 15 0 24 4248 G 4385 5906
-> 16 0 24 4248 G 4383 5906
-> 15 0 25 4248 G 4383 5907
-> 16 0 25 4248 G 4381 5907
-> 15 0 24 4248 G 4385 5908
-> 16 0 24 4248 G 4305 5908
-> 15 0 25 4248 G 4305 5909
-> 16 0 25 4248 G 4303 5909
-> 15 0 24 4248 G 4385 5910
-> 16 0 24 4248 G 4335 5910
-> 15 0 25 4248 G 4335 5911
-> 16 0 25 4248 G 4333 5911
-> 15 0 24 4248 G 4385 5912
-> 16 0 24 4248 G 4365 5912
-> 15 0 25 4248 G 4365 5913
-> 16 0 25 4248 G 4363 5913
-> 15 0 24 4248 G 4385 5914
-> 16 0 24 4248 G 4260 5914
-> 15 0 25 4248 G 4260 5915
-> 16 0 25 4248 G 4258 5915
-> 15 0 24 4248 G 4385 5916
-> 16 0 24 4248 G 4272 5916
-> 15 0 25 4248 G 4272 5917
-> 16 0 25 4248 G 4270 5917
-> 15 0 24 4248 G 4385 5918
-> 16 0 24 4248 G 4278 5918
-> 15 0 25 4248 G 4278 5919
-> 16 0 25 4248 G 4276 5919
-> 15 0 24 4248 G 4385 5920
-> 16 0 24 4248 G 4308 5920
-> 15 0 25 4248 G 4308 5921
-> 16 0 25 4248 G 4306 5921
-> 15 0 24 4248 G 4385 5922
-> 16 0 24 4248 G 4338 5922
-> 15 0 25 4248 G 4338 5923
-> 16 0 25 4248 G 4336 5923
-> 15 0 24 4248 G 4385 5924
-> 16 0 24 4248 G 4368 5924
-> 15 0 25 4248 G 4368 5925
-> 16 0 25 4248 G 4366 5925
-> 15 0 24 4248 G 4385 5926
-> 16 0 24 4248 G 4290 5926
-> 15 0 25 4248 G 4290 5927
-> 16 0 25 4248 G 4288 5927
-> 15 0 24 4248 G 4385 5928
-> 16 0 24 4248 G 4320 5928
-> 15 0 25 4248 G 4320 5929
-> 16 0 25 4248 G 4318 5929
-> 15 0 24 4248 G 4385 5930
-> 16 0 24 4248 G 4350 5930
-> 15 0 25 4248 G 4350 5931
-> 16 0 25 4248 G 4348 5931
-> 15 0 24 4248 G 4385 5932
-> 16 0 24 4248 G 4380 5932
-> 15 0 25 4248 G 4380 5933
-> 16 0 25 4248 G 4378 5933
-> 15 0 24 4248 G 4385 5934
-> 16 0 24 4248 G 4302 5934
-> 15 0 25 4248 G 4302 5935
-> 16 0 25 4248 G 4300 5935
-> 15 0 24 4248 G 4385 5936
-> 16 0 24 4248 G 4332 5936
-> 15 0 25 4248 G 4332 5937
-> 16 0 25 4248 G 4330 5937
-> 15 0 24 4248 G 4385 5938
-> 16 0 24 4248 G 4362 5938
-> 15 0 25 4248 G 4362 5939
-> 16 0 25 4248 G 4360 5939
-> 15 0 24 4248 G 4385 5940
-> 16 0 24 4248 G 4257 5940
-> 15 0 25 4248 G 4257 5941
-> 16 0 25 4248 G 4255 5941
-> 15 0 24 4248 G 4385 5942
-> 16 0 24 4248 G 4269 5942
-> 15 0 25 4248 G 4269 5943
-> 16 0 25 4248 G 4267 5943
-> 15 0 26 4248 G 4385 5944
-> 16 0 26 4248 G 4384 5944
-> 15 0 24 4248 G 4385 5945
-> 16 0 24 4248 G 4287 5945
-> 15 0 25 4248 G 4287 5946
-> 16 0 25 4248 G 4285 5946
-> 15 0 24 4248 G 4385 5947
-> 16 0 24 4248 G 4317 5947
-> 15 0 25 4248 G 4317 5948
-> 16 0 25 4248 G 4315 5948
-> 15 0 24 4248 G 4385 5949
-> 16 0 24 4248 G 4347 5949
-> 15 0 25 4248 G 4347 5950
-> 16 0 25 4248 G 4345 5950
-> 15 0 24 4248 G 4385 5951
-> 16 0 24 4248 G 4377 5951
-> 15 0 25 4248 G 4377 5952
-> 16 0 25 4248 G 4375 5952
-> 15 0 24 4248 G 4385 5953
-> 16 0 24 4248 G 4299 5953
-> 15 0 25 4248 G 4299 5954
-> 16 0 25 4248 G 4297 5954
-> 15 0 24 4248 G 4385 5955
-> 16 0 24 4248 G 4329 5955
-> 15 0 25 4248 G 4329 5956
-> 16 0 25 4248 G 4327 5956
-> 15 0 24 4248 G 4385 5957
-> 16 0 24 4248 G 4359 5957
-> 15 0 25 4248 G 4359 5958
-> 16 0 25 4248 G 4357 5958
-> 15 0 24 4248 G 4385 5959
-> 16 0 24 4248 G 4254 5959
-> 15 0 25 4248 G 4254 5960
-> 16 0 25 4248 G 4252 5960
-> 15 0 24 4248 G 4385 5961
-> 16 0 24 4248 G 4266 5961
-> 15 0 25 4248 G 4266 5962
-> 16 0 25 4248 G 4264 5962
-> 15 0 24 4248 G 4385 5963
-> 16 0 24 4248 G 4284 5963
-> 15 0 25 4248 G 4284 5964
-> 16 0 25 4248 G 4282 5964
-> 15 0 24 4248 G 4385 5965
-> 16 0 24 4248 G 4314 5965
-> 15 0 25 4248 G 4314 5966
-> 16 0 25 4248 G 4312 5966
-> 15 0 24 4248 G 4385 5967
-> 16 0 24 4248 G 4344 5967
-> 15 0 25 4248 G 4344 5968
-> 16 0 25 4248 G 4342 5968
-> 15 0 24 4248 G 4385 5969
-> 16 0 24 4248 G 4374 5969
-> 15 0 25 4248 G 4374 5970
-> 16 0 25 4248 G 4372 5970
-> 15 0 24 4248 G 4385 5971
-> 16 0 24 4248 G 4296 5971
-> 15 0 25 4248 G 4296 5972
-> 16 0 25 4248 G 4294 5972
-> 15 0 24 4248 G 4385 5973
-> 16 0 24 4248 G 4326 5973
-> 15 0 25 4248 G 4326 5974
-> 16 0 25 4248 G 4324 5974
-> 15 0 24 4248 G 4385 5975
-> 16 0 24 4248 G 4356 5975
-> 15 0 25 4248 G 4356 5976
-> 16 0 25 4248 G 4354 5976
-> 15 0 24 4248 G 4385 5977
-> 16 0 24 4248 G 4251 5977
-> 15 0 25 4248 G 4251 5978
-> 16 0 25 4248 G 4249 5978
-> 15 0 24 4248 G 4385 5979
-> 16 0 24 4248 G 4263 5979
-> 15 0 25 4248 G 4263 5980
-> 16 0 25 4248 G 4261 5980
-> 15 0 23 4248 G 4279 5981
-> 16 0 23 4248 G 4280 5981
-> 15 0 24 4248 G 4280 5982
-> 16 0 24 4248 G 4385 5982
-> 15 0 24 4248 G 4385 5983
-> 16 0 24 4248 G 4275 5983
-> 15 0 25 4248 G 4275 5984
-> 16 0 25 4248 G 4273 5984
-> 15 0 23 4248 G 4309 5985
-> 16 0 23 4248 G 4310 5985
-> 15 0 24 4248 G 4310 5986
-> 16 0 24 4248 G 4385 5986
-> 15 0 23 4248 G 4339 5987
-> 16 0 23 4248 G 4340 5987
-> 15 0 24 4248 G 4340 5988
-> 16 0 24 4248 G 4385 5988
-> 15 0 23 4248 G 4369 5989
-> 16 0 23 4248 G 4370 5989
-> 15 0 24 4248 G 4370 5990
-> 16 0 24 4248 G 4385 5990
-> 15 0 23 4248 G 4291 5991
-> 16 0 23 4248 G 4292 5991
-> 15 0 24 4248 G 4292 5992
-> 16 0 24 4248 G 4385 5992
-> 15 0 23 4248 G 4321 5993
-> 16 0 23 4248 G 4322 5993
-> 15 0 24 4248 G 4322 5994
-> 16 0 24 4248 G 4385 5994
-> 15 0 23 4248 G 4351 5995
-> 16 0 23 4248 G 4352 5995
-> 15 0 24 4248 G 4352 5996
-> 16 0 24 4248 G 4385 5996
-> 15 0 23 4248 G 4381 5997
-> 16 0 23 4248 G 4382 5997
-> 15 0 24 4248 G 4382 5998
-> 16 0 24 4248 G 4385 5998
-> 15 0 23 4248 G 4303 5999
-> 16 0 23 4248 G 4304 5999
-> 15 0 24 4248 G 4304 6000
-> 16 0 24 4248 G 4385 6000
-> 15 0 23 4248 G 4333 6001
-> 16 0 23 4248 G 4334 6001
-> 15 0 24 4248 G 4334 6002
-> 16 0 24 4248 G 4385 6002
-> 15 0 23 4248 G 4363 6003
-> 16 0 23 4248 G 4364 6003
-> 15 0 24 4248 G 4364 6004
-> 16 0 24 4248 G 4385 6004
-> 15 0 23 4248 G 4258 6005
-> 16 0 23 4248 G 4259 6005
-> 15 0 24 4248 G 4259 6006
-> 16 0 24 4248 G 4385 6006
-> 15 0 23 4248 G 4270 6007
-> 16 0 23 4248 G 4271 6007
-> 15 0 24 4248 G 4271 6008
-> 16 0 24 4248 G 4385 6008
-> 15 0 23 4248 G 4276 6009
-> 16 0 23 4248 G 4277 6009
-> 15 0 24 4248 G 4277 6010
-> 16 0 24 4248 G 4385 6010
-> 15 0 23 4248 G 4306 6011
-> 16 0 23 4248 G 4307 6011
-> 15 0 24 4248 G 4307 6012
-> 16 0 24 4248 G 4385 6012
-> 15 0 23 4248 G 4336 6013
-> 16 0 23 4248 G 4337 6013
-> 15 0 24 4248 G 4337 6014
-> 16 0 24 4248 G 4385 6014
-> 15 0 23 4248 G 4366 6015
-> 16 0 23 4248 G 4367 6015
-> 15 0 24 4248 G 4367 6016
-> 16 0 24 4248 G 4385 6016
-> 15 0 23 4248 G 4288 6017
-> 16 0 23 4248 G 4289 6017
-> 15 0 24 4248 G 4289 6018
-> 16 0 24 4248 G 4385 6018
-> 15 0 23 4248 G 4318 6019
-> 16 0 23 4248 G 4319 6019
-> 15 0 24 4248 G 4319 6020
-> 16 0 24 4248 G 4385 6020
-> 15 0 23 4248 G 4348 6021
-> 16 0 23 4248 G 4349 6021
-> 15 0 24 4248 G 4349 6022
-> 16 0 24 4248 G 4385 6022
-> 15 0 23 4248 G 4378 6023
-> 16 0 23 4248 G 4379 6023
-> 15 0 24 4248 G 4379 6024
-> 16 0 24 4248 G 4385 6024
-> 15 0 23 4248 G 4300 6025
-> 16 0 23 4248 G 4301 6025
-> 15 0 24 4248 G 4301 6026
-> 16 0 24 4248 G 4385 6026
-> 15 0 23 4248 G 4330 6027
-> 16 0 23 4248 G 4331 6027
-> 15 0 24 4248 G 4331 6028
-> 16 0 24 4248 G 4385 6028
-> 15 0 23 4248 G 4360 6029
-> 16 0 23 4248 G 4361 6029
-> 15 0 24 4248 G 4361 6030
-> 16 0 24 4248 G 4385 6030
-> 15 0 23 4248 G 4255 6031
-> 16 0 23 4248 G 4256 6031
-> 15 0 24 4248 G 4256 6032
-> 16 0 24 4248 G 4385 6032
-> 15 0 23 4248 G 4267 6033
-> 16 0 23 4248 G 4268 6033
-> 15 0 24 4248 G 4268 6034
-> 16 0 24 4248 G 4385 6034
-> 15 0 23 4248 G 4285 6035
-> 16 0 23 4248 G 4286 6035
-> 15 0 24 4248 G 4286 6036
-> 16 0 24 4248 G 4385 6036
-> 15 0 23 4248 G 4315 6037
-> 16 0 23 4248 G 4316 6037
-> 15 0 24 4248 G 4316 6038
-> 16 0 24 4248 G 4385 6038
-> 15 0 23 4248 G 4345 6039
-> 16 0 23 4248 G 4346 6039
-> 15 0 24 4248 G 4346 6040
-> 16 0 24 4248 G 4385 6040
-> 15 0 23 4248 G 4375 6041
-> 16 0 23 4248 G 4376 6041
-> 15 0 24 4248 G 4376 6042
-> 16 0 24 4248 G 4385 6042
-> 15 0 23 4248 G 4297 6043
-> 16 0 23 4248 G 4298 6043
-> 15 0 24 4248 G 4298 6044
-> 16 0 24 4248 G 4385 6044
-> 15 0 23 4248 G 4327 6045
-> 16 0 23 4248 G 4328 6045
-> 15 0 24 4248 G 4328 6046
-> 16 0 24 4248 G 4385 6046
-> 15 0 23 4248 G 4357 6047
-> 16 0 23 4248 G 4358 6047
-> 15 0 24 4248 G 4358 6048
-> 16 0 24 4248 G 4385 6048
-> 15 0 23 4248 G 4252 6049
-> 16 0 23 4248 G 4253 6049
-> 15 0 24 4248 G 4253 6050
-> 16 0 24 4248 G 4385 6050
-> 15 0 23 4248 G 4264 6051
-> 16 0 23 4248 G 4265 6051
-> 15 0 24 4248 G 4265 6052
-> 16 0 24 4248 G 4385 6052
-> 15 0 23 4248 G 4282 6053
-> 16 0 23 4248 G 4283 6053
-> 15 0 24 4248 G 4283 6054
-> 16 0 24 4248 G 4385 6054
-> 15 0 23 4248 G 4312 6055
-> 16 0 23 4248 G 4313 6055
-> 15 0 24 4248 G 4313 6056
-> 16 0 24 4248 G 4385 6056
-> 15 0 23 4248 G 4342 6057
-> 16 0 23 4248 G 4343 6057
-> 15 0 24 4248 G 4343 6058
-> 16 0 24 4248 G 4385 6058
-> 15 0 23 4248 G 4372 6059
-> 16 0 23 4248 G 4373 6059
-> 15 0 24 4248 G 4373 6060
-> 16 0 24 4248 G 4385 6060
-> 15 0 23 4248 G 4294 6061
-> 16 0 23 4248 G 4295 6061
-> 15 0 24 4248 G 4295 6062
-> 16 0 24 4248 G 4385 6062
-> 15 0 23 4248 G 4324 6063
-> 16 0 23 4248 G 4325 6063
-> 15 0 24 4248 G 4325 6064
-> 16 0 24 4248 G 4385 6064
-> 15 0 23 4248 G 4354 6065
-> 16 0 23 4248 G 4355 6065
-> 15 0 24 4248 G 4355 6066
-> 16 0 24 4248 G 4385 6066
-> 15 0 23 4248 G 4249 6067
-> 16 0 23 4248 G 4250 6067
-> 15 0 24 4248 G 4250 6068
-> 16 0 24 4248 G 4385 6068
-> 15 0 23 4248 G 4261 6069
-> 16 0 23 4248 G 4262 6069
-> 15 0 24 4248 G 4262 6070
-> 16 0 24 4248 G 4385 6070
-> 15 0 23 4094 G 4095 6071
-> 16 0 23 4094 G 4096 6071
-> 15 0 24 4094 G 4096 6072
-> 16 0 24 4094 G 4246 6072
-> 15 0 24 4094 G 4246 6073
-> 16 0 24 4094 G 4109 6073
-> 15 0 25 4094 G 4109 6074
-> 16 0 25 4094 G 4107 6074
-> 15 0 24 4094 G 4246 6075
-> 16 0 24 4094 G 4121 6075
-> 15 0 25 4094 G 4121 6076
-> 16 0 25 4094 G 4119 6076
-> 15 0 24 4094 G 4246 6077
-> 16 0 24 4094 G 4130 6077
-> 15 0 25 4094 G 4130 6078
-> 16 0 25 4094 G 4128 6078
-> 15 0 24 4094 G 4246 6079
-> 16 0 24 4094 G 4160 6079
-> 15 0 25 4094 G 4160 6080
-> 16 0 25 4094 G 4158 6080
-> 15 0 24 4094 G 4246 6081
-> 16 0 24 4094 G 4190 6081
-> 15 0 25 4094 G 4190 6082
-> 16 0 25 4094 G 4188 6082
-> 15 0 24 4094 G 4246 6083
-> 16 0 24 4094 G 4220 6083
-> 15 0 25 4094 G 4220 6084
-> 16 0 25 4094 G 4218 6084
-> 15 0 24 4094 G 4246 6085
-> 16 0 24 4094 G 4142 6085
-> 15 0 25 4094 G 4142 6086
-> 16 0 25 4094 G 4140 6086
-> 15 0 24 4094 G 4246 6087
-> 16 0 24 4094 G 4172 6087
-> 15 0 25 4094 G 4172 6088
-> 16 0 25 4094 G 4170 6088
-> 15 0 24 4094 G 4246 6089
-> 16 0 24 4094 G 4202 6089
-> 15 0 25 4094 G 4202 6090
-> 16 0 25 4094 G 4200 6090
-> 15 0 24 4094 G 4246 6091
-> 16 0 24 4094 G 4232 6091
-> 15 0 25 4094 G 4232 6092
-> 16 0 25 4094 G 4230 6092
-> 15 0 24 4094 G 4246 6093
-> 16 0 24 4094 G 4106 6093
-> 15 0 25 4094 G 4106 6094
-> 16 0 25 4094 G 4104 6094
-> 15 0 24 4094 G 4246 6095
-> 16 0 24 4094 G 4118 6095
-> 15 0 25 4094 G 4118 6096
-> 16 0 25 4094 G 4116 6096
-> 15 0 24 4094 G 4246 6097
-> 16 0 24 4094 G 4127 6097
-> 15 0 25 4094 G 4127 6098
-> 16 0 25 4094 G 4125 6098
-> 15 0 24 4094 G 4246 6099
-> 16 0 24 4094 G 4157 6099
-> 15 0 25 4094 G 4157 6100
-> 16 0 25 4094 G 4155 6100
-> 15 0 24 4094 G 4246 6101
-> 16 0 24 4094 G 4187 6101
-> 15 0 25 4094 G 4187 6102
-> 16 0 25 4094 G 4185 6102
-> 15 0 24 4094 G 4246 6103
-> 16 0 24 4094 G 4217 6103
-> 15 0 25 4094 G 4217 6104
-> 16 0 25 4094 G 4215 6104
-> 15 0 24 4094 G 4246 6105
-> 16 0 24 4094 G 4139 6105
-> 15 0 25 4094 G 4139 6106
-> 16 0 25 4094 G 4137 6106
-> 15 0 24 4094 G 4246 6107
-> 16 0 24 4094 G 4169 6107
-> 15 0 25 4094 G 4169 6108
-> 16 0 25 4094 G 4167 6108
-> 15 0 24 4094 G 4246 6109
-> 16 0 24 4094 G 4199 6109
-> 15 0 25 4094 G 4199 6110
-> 16 0 25 4094 G 4197 6110
-> 15 0 24 4094 G 4246 6111
-> 16 0 24 4094 G 4229 6111
-> 15 0 25 4094 G 4229 6112
-> 16 0 25 4094 G 4227 6112
-> 15 0 24 4094 G 4246 6113
-> 16 0 24 4094 G 4151 6113
-> 15 0 25 4094 G 4151 6114
-> 16 0 25 4094 G 4149 6114
-> 15 0 24 4094 G 4246 6115
-> 16 0 24 4094 G 4181 6115
-> 15 0 25 4094 G 4181 6116
-> 16 0 25 4094 G 4179 6116
-> 15 0 24 4094 G 4246 6117
-> 16 0 24 4094 G 4211 6117
-> 15 0 25 4094 G 4211 6118
-> 16 0 25 4094 G 4209 6118
-> 15 0 24 4094 G 4246 6119
-> 16 0 24 4094 G 4241 6119
-> 15 0 25 4094 G 4241 6120
-> 16 0 25 4094 G 4239 6120
-> 15 0 24 4094 G 4246 6121
-> 16 0 24 4094 G 4103 6121
-> 15 0 25 4094 G 4103 6122
-> 16 0 25 4094 G 4101 6122
-> 15 0 24 4094 G 4246 6123
-> 16 0 24 4094 G 4115 6123
-> 15 0 25 4094 G 4115 6124
-> 16 0 25 4094 G 4113 6124
-> 15 0 24 4094 G 4246 6125
-> 16 0 24 4094 G 4124 6125
-> 15 0 25 4094 G 4124 6126
-> 16 0 25 4094 G 4122 6126
-> 15 0 26 4094 G 4246 6127
-> 16 0 26 4094 G 4245 6127
-> 15 0 24 4094 G 4246 6128
-> 16 0 24 4094 G 4154 6128
-> 15 0 25 4094 G 4154 6129
-> 16 0 25 4094 G 4152 6129
-> 15 0 24 4094 G 4246 6130
-> 16 0 24 4094 G 4184 6130
-> 15 0 25 4094 G 4184 6131
-> 16 0 25 4094 G 4182 6131
-> 15 0 24 4094 G 4246 6132
-> 16 0 24 4094 G 4214 6132
-> 15 0 25 4094 G 4214 6133
-> 16 0 25 4094 G 4212 6133
-> 15 0 24 4094 G 4246 6134
-> 16 0 24 4094 G 4136 6134
-> 15 0 25 4094 G 4136 6135
-> 16 0 25 4094 G 4134 6135
-> 15 0 24 4094 G 4246 6136
-> 16 0 24 4094 G 4244 6136
-> 15 0 25 4094 G 4244 6137
-> 16 0 25 4094 G 4242 6137
-> 15 0 24 4094 G 4246 6138
-> 16 0 24 4094 G 4166 6138
-> 15 0 25 4094 G 4166 6139
-> 16 0 25 4094 G 4164 6139
-> 15 0 24 4094 G 4246 6140
-> 16 0 24 4094 G 4196 6140
-> 15 0 25 4094 G 4196 6141
-> 16 0 25 4094 G 4194 6141
-> 15 0 24 4094 G 4246 6142
-> 16 0 24 4094 G 4226 6142
-> 15 0 25 4094 G 4226 6143
-> 16 0 25 4094 G 4224 6143
-> 15 0 24 4094 G 4246 6144
-> 16 0 24 4094 G 4148 6144
-> 15 0 25 4094 G 4148 6145
-> 16 0 25 4094 G 4146 6145
-> 15 0 24 4094 G 4246 6146
-> 16 0 24 4094 G 4178 6146
-> 15 0 25 4094 G 4178 6147
-> 16 0 25 4094 G 4176 6147
-> 15 0 24 4094 G 4246 6148
-> 16 0 24 4094 G 4208 6148
-> 15 0 25 4094 G 4208 6149
-> 16 0 25 4094 G 4206 6149
-> 15 0 24 4094 G 4246 6150
-> 16 0 24 4094 G 4238 6150
-> 15 0 25 4094 G 4238 6151
-> 16 0 25 4094 G 4236 6151
-> 15 0 24 4094 G 4246 6152
-> 16 0 24 4094 G 4100 6152
-> 15 0 25 4094 G 4100 6153
-> 16 0 25 4094 G 4098 6153
-> 15 0 24 4094 G 4246 6154
-> 16 0 24 4094 G 4112 6154
-> 15 0 25 4094 G 4112 6155
-> 16 0 25 4094 G 4110 6155
-> 15 0 24 4094 G 4246 6156
-> 16 0 24 4094 G 4133 6156
-> 15 0 25 4094 G 4133 6157
-> 16 0 25 4094 G 4131 6157
-> 15 0 24 4094 G 4246 6158
-> 16 0 24 4094 G 4163 6158
-> 15 0 25 4094 G 4163 6159
-> 16 0 25 4094 G 4161 6159
-> 15 0 24 4094 G 4246 6160
-> 16 0 24 4094 G 4193 6160
-> 15 0 25 4094 G 4193 6161
-> 16 0 25 4094 G 4191 6161
-> 15 0 24 4094 G 4246 6162
-> 16 0 24 4094 G 4223 6162
-> 15 0 25 4094 G 4223 6163
-> 16 0 25 4094 G 4221 6163
-> 15 0 24 4094 G 4246 6164
-> 16 0 24 4094 G 4145 6164
-> 15 0 25 4094 G 4145 6165
-> 16 0 25 4094 G 4143 6165
-> 15 0 24 4094 G 4246 6166
-> 16 0 24 4094 G 4175 6166
-> 15 0 25 4094 G 4175 6167
-> 16 0 25 4094 G 4173 6167
-> 15 0 24 4094 G 4246 6168
-> 16 0 24 4094 G 4205 6168
-> 15 0 25 4094 G 4205 6169
-> 16 0 25 4094 G 4203 6169
-> 15 0 24 4094 G 4246 6170
-> 16 0 24 4094 G 4235 6170
-> 15 0 25 4094 G 4235 6171
-> 16 0 25 4094 G 4233 6171
-> 15 0 23 4094 G 4107 6172
-> 16 0 23 4094 G 4108 6172
-> 15 0 24 4094 G 4108 6173
-> 16 0 24 4094 G 4246 6173
-> 15 0 24 4094 G 4246 6174
-> 16 0 24 4094 G 4097 6174
-> 15 0 25 4094 G 4097 6175
-> 16 0 25 4094 G 4095 6175
-> 15 0 23 4094 G 4119 6176
-> 16 0 23 4094 G 4120 6176
-> 15 0 24 4094 G 4120 6177
-> 16 0 24 4094 G 4246 6177
-> 15 0 23 4094 G 4128 6178
-> 16 0 23 4094 G 4129 6178
-> 15 0 24 4094 G 4129 6179
-> 16 0 24 4094 G 4246 6179
-> 15 0 23 4094 G 4158 6180
-> 16 0 23 4094 G 4159 6180
-> 15 0 24 4094 G 4159 6181
-> 16 0 24 4094 G 4246 6181
-> 15 0 23 4094 G 4188 6182
-> 16 0 23 4094 G 4189 6182
-> 15 0 24 4094 G 4189 6183
-> 16 0 24 4094 G 4246 6183
-> 15 0 23 4094 G 4218 6184
-> 16 0 23 4094 G 4219 6184
-> 15 0 24 4094 G 4219 6185
-> 16 0 24 4094 G 4246 6185
-> 15 0 23 4094 G 4140 6186
-> 16 0 23 4094 G 4141 6186
-> 15 0 24 4094 G 4141 6187
-> 16 0 24 4094 G 4246 6187
-> 15 0 23 4094 G 4170 6188
-> 16 0 23 4094 G 4171 6188
-> 15 0 24 4094 G 4171 6189
-> 16 0 24 4094 G 4246 6189
-> 15 0 23 4094 G 4200 6190
-> 16 0 23 4094 G 4201 6190
-> 15 0 24 4094 G 4201 6191
-> 16 0 24 4094 G 4246 6191
-> 15 0 23 4094 G 4230 6192
-> 16 0 23 4094 G 4231 6192
-> 15 0 24 4094 G 4231 6193
-> 16 0 24 4094 G 4246 6193
-> 15 0 23 4094 G 4104 6194
-> 16 0 23 4094 G 4105 6194
-> 15 0 24 4094 G 4105 6195
-> 16 0 24 4094 G 4246 6195
-> 15 0 23 4094 G 4116 6196
-> 16 0 23 4094 G 4117 6196
-> 15 0 24 4094 G 4117 6197
-> 16 0 24 4094 G 4246 6197
-> 15 0 23 4094 G 4125 6198
-> 16 0 23 4094 G 4126 6198
-> 15 0 24 4094 G 4126 6199
-> 16 0 24 4094 G 4246 6199
-> 15 0 23 4094 G 4155 6200
-> 16 0 23 4094 G 4156 6200
-> 15 0 24 4094 G 4156 6201
-> 16 0 24 4094 G 4246 6201
-> 15 0 23 4094 G 4185 6202
-> 16 0 23 4094 G 4186 6202
-> 15 0 24 4094 G 4186 6203
-> 16 0 24 4094 G 4246 6203
-> 15 0 23 4094 G 4215 6204
-> 16 0 23 4094 G 4216 6204
-> 15 0 24 4094 G 4216 6205
-> 16 0 24 4094 G 4246 6205
-> 15 0 23 4094 G 4137 6206
-> 16 0 23 4094 G 4138 6206
-> 15 0 24 4094 G 4138 6207
-> 16 0 24 4094 G 4246 6207
-> 15 0 23 4094 G 4167 6208
-> 16 0 23 4094 G 4168 6208
-> 15 0 24 4094 G 4168 6209
-> 16 0 24 4094 G 4246 6209
-> 15 0 23 4094 G 4197 6210
-> 16 0 23 4094 G 4198 6210
-> 15 0 24 4094 G 4198 6211
-> 16 0 24 4094 G 4246 6211
-> 15 0 23 4094 G 4227 6212
-> 16 0 23 4094 G 4228 6212
-> 15 0 24 4094 G 4228 6213
-> 16 0 24 4094 G 4246 6213
-> 15 0 23 4094 G 4149 6214
-> 16 0 23 4094 G 4150 6214
-> 15 0 24 4094 G 4150 6215
-> 16 0 24 4094 G 4246 6215
-> 15 0 23 4094 G 4179 6216
-> 16 0 23 4094 G 4180 6216
-> 15 0 24 4094 G 4180 6217
-> 16 0 24 4094 G 4246 6217
-> 15 0 23 4094 G 4209 6218
-> 16 0 23 4094 G 4210 6218
-> 15 0 24 4094 G 4210 6219
-> 16 0 24 4094 G 4246 6219
-> 15 0 23 4094 G 4239 6220
-> 16 0 23 4094 G 4240 6220
-> 15 0 24 4094 G 4240 6221
-> 16 0 24 4094 G 4246 6221
-> 15 0 23 4094 G 4101 6222
-> 16 0 23 4094 G 4102 6222
-> 15 0 24 4094 G 4102 6223
-> 16 0 24 4094 G 4246 6223
-> 15 0 23 4094 G 4113 6224
-> 16 0 23 4094 G 4114 6224
-> 15 0 24 4094 G 4114 6225
-> 16 0 24 4094 G 4246 6225
-> 15 0 23 4094 G 4122 6226
-> 16 0 23 4094 G 4123 6226
-> 15 0 24 4094 G 4123 6227
-> 16 0 24 4094 G 4246 6227
-> 15 0 23 4094 G 4152 6228
-> 16 0 23 4094 G 4153 6228
-> 15 0 24 4094 G 4153 6229
-> 16 0 24 4094 G 4246 6229
-> 15 0 23 4094 G 4182 6230
-> 16 0 23 4094 G 4183 6230
-> 15 0 24 4094 G 4183 6231
-> 16 0 24 4094 G 4246 6231
-> 15 0 23 4094 G 4212 6232
-> 16 0 23 4094 G 4213 6232
-> 15 0 24 4094 G 4213 6233
-> 16 0 24 4094 G 4246 6233
-> 15 0 23 4094 G 4134 6234
-> 16 0 23 4094 G 4135 6234
-> 15 0 24 4094 G 4135 6235
-> 16 0 24 4094 G 4246 6235
-> 15 0 23 4094 G 4242 6236
-> 16 0 23 4094 G 4243 6236
-> 15 0 24 4094 G 4243 6237
-> 16 0 24 4094 G 4246 6237
-> 15 0 23 4094 G 4164 6238
-> 16 0 23 4094 G 4165 6238
-> 15 0 24 4094 G 4165 6239
-> 16 0 24 4094 G 4246 6239
-> 15 0 23 4094 G 4194 6240
-> 16 0 23 4094 G 4195 6240
-> 15 0 24 4094 G 4195 6241
-> 16 0 24 4094 G 4246 6241
-> 15 0 23 4094 G 4224 6242
-> 16 0 23 4094 G 4225 6242
-> 15 0 24 4094 G 4225 6243
-> 16 0 24 4094 G 4246 6243
-> 15 0 23 4094 G 4146 6244
-> 16 0 23 4094 G 4147 6244
-> 15 0 24 4094 G 4147 6245
-> 16 0 24 4094 G 4246 6245
-> 15 0 23 4094 G 4176 6246
-> 16 0 23 4094 G 4177 6246
-> 15 0 24 4094 G 4177 6247
-> 16 0 24 4094 G 4246 6247
-> 15 0 23 4094 G 4206 6248
-> 16 0 23 4094 G 4207 6248
-> 15 0 24 4094 G 4207 6249
-> 16 0 24 4094 G 4246 6249
-> 15 0 23 4094 G 4236 6250
-> 16 0 23 4094 G 4237 6250
-> 15 0 24 4094 G 4237 6251
-> 16 0 24 4094 G 4246 6251
-> 15 0 23 4094 G 4098 6252
-> 16 0 23 4094 G 4099 6252
-> 15 0 24 4094 G 4099 6253
-> 16 0 24 4094 G 4246 6253
-> 15 0 23 4094 G 4110 6254
-> 16 0 23 4094 G 4111 6254
-> 15 0 24 4094 G 4111 6255
-> 16 0 24 4094 G 4246 6255
-> 15 0 23 4094 G 4131 6256
-> 16 0 23 4094 G 4132 6256
-> 15 0 24 4094 G 4132 6257
-> 16 0 24 4094 G 4246 6257
-> 15 0 23 4094 G 4161 6258
-> 16 0 23 4094 G 4162 6258
-> 15 0 24 4094 G 4162 6259
-> 16 0 24 4094 G 4246 6259
-> 15 0 23 4094 G 4191 6260
-> 16 0 23 4094 G 4192 6260
-> 15 0 24 4094 G 4192 6261
-> 16 0 24 4094 G 4246 6261
-> 15 0 23 4094 G 4221 6262
-> 16 0 23 4094 G 4222 6262
-> 15 0 24 4094 G 4222 6263
-> 16 0 24 4094 G 4246 6263
-> 15 0 23 4094 G 4143 6264
-> 16 0 23 4094 G 4144 6264
-> 15 0 24 4094 G 4144 6265
-> 16 0 24 4094 G 4246 6265
-> 15 0 23 4094 G 4173 6266
-> 16 0 23 4094 G 4174 6266
-> 15 0 24 4094 G 4174 6267
-> 16 0 24 4094 G 4246 6267
-> 15 0 23 4094 G 4203 6268
-> 16 0 23 4094 G 4204 6268
-> 15 0 24 4094 G 4204 6269
-> 16 0 24 4094 G 4246 6269
-> 15 0 23 4094 G 4233 6270
-> 16 0 23 4094 G 4234 6270
-> 15 0 24 4094 G 4234 6271
-> 16 0 24 4094 G 4246 6271
-> 15 0 27 3921 G 4091 6272
-> 16 0 27 3921 G 4093 6272
-> 15 0 28 3921 G 4093 6273
-> 16 0 28 3921 G 4388 6273
-> 15 0 21 3921 G 4093 6274
-> 16 0 21 3921 G 4386 6274
-> 15 0 28 3921 G 4386 6275
-> 16 0 28 3921 G 4384 6275
-> 15 0 21 3921 G 4093 6276
-> 16 0 21 3921 G 4247 6276
-> 15 0 28 3921 G 4247 6277
-> 16 0 28 3921 G 4245 6277
-> 15 0 27 3921 G 4388 6278
-> 16 0 27 3921 G 4386 6278
-> 15 0 27 3921 G 4388 6279
-> 16 0 27 3921 G 4247 6279
-> 15 0 21 3921 G 4386 6280
-> 16 0 21 3921 G 4247 6280
-> 15 0 38 0 G 10 6281
-> 16 0 38 0 G 4797 6281
-> 15 0 28 4390 G 4797 6282
-> 16 0 28 4390 G 4796 6282
-> 15 0 38 0 G 5 6283
-> 16 0 38 0 G 3920 6283
-> 15 0 28 3415 G 3920 6284
-> 16 0 28 3415 G 3919 6284
-> 15 0 38 0 G 8 6285
-> 16 0 38 0 G 868 6285
-> 15 0 28 499 G 868 6286
-> 16 0 28 499 G 867 6286
-> 15 0 38 0 G 3 6287
-> 16 0 38 0 G 3414 6287
-> 15 0 28 2349 G 3414 6288
-> 16 0 28 2349 G 3413 6288
-> 15 0 38 0 G 4 6289
-> 16 0 38 0 G 2348 6289
-> 15 0 28 1606 G 2348 6290
-> 16 0 28 1606 G 2347 6290
-> 15 0 38 0 G 7 6291
-> 16 0 38 0 G 498 6291
-> 15 0 28 21 G 498 6292
-> 16 0 28 21 G 497 6292
-> 15 0 38 0 G 6 6293
-> 16 0 38 0 G 1605 6293
-> 15 0 28 1189 G 1605 6294
-> 16 0 28 1189 G 1604 6294
-> 15 0 38 0 G 2 6295
-> 16 0 38 0 G 1188 6295
-> 15 0 28 869 G 1188 6296
-> 16 0 28 869 G 1187 6296
-> 15 0 38 0 G 11 6297
-> 16 0 38 0 G 4389 6297
-> 15 0 28 3921 G 4389 6298
-> 16 0 28 3921 G 4388 6298
-> 15 0 39 0 G 4797 6299
-> 16 0 39 0 G 20 6299
-> 15 0 39 0 G 14 6300
-> 16 0 39 0 G 3920 6300
-> 15 0 39 0 G 17 6301
-> 16 0 39 0 G 868 6301
-> 15 0 39 0 G 15 6302
-> 16 0 39 0 G 3414 6302
-> 15 0 39 0 G 13 6303
-> 16 0 39 0 G 2348 6303
-> 15 0 39 0 G 16 6304
-> 16 0 39 0 G 498 6304
-> 15 0 39 0 G 18 6305
-> 16 0 39 0 G 1605 6305
-> 15 0 39 0 G 12 6306
-> 16 0 39 0 G 1188 6306
-> 15 0 39 0 G 19 6307
-> 16 0 39 0 G 4389 6307
-> 15 0 39 0 G 14 6308
-> 16 0 39 0 G 3414 6308
-> 15 0 39 0 G 15 6309
-> 16 0 39 0 G 1605 6309
-> 15 0 39 0 G 17 6310
-> 16 0 39 0 G 1605 6310
-> 15 0 39 0 G 3414 6311
-> 16 0 39 0 G 13 6311
-> 15 0 39 0 G 3414 6312
-> 16 0 39 0 G 12 6312
-> 15 0 39 0 G 16 6313
-> 16 0 39 0 G 1605 6313
+> 15 0 20 1 topology 9 0
+> 16 0 20 1 topology 18 0
+> 15 0 21 1 topology 18 1
+> 16 0 21 1 topology 15 1
+> 15 0 21 1 topology 15 2
+> 16 0 21 1 topology 12 2
+> 15 0 22 1 topology 12 3
+> 16 0 22 1 topology 2 3
+> 15 0 20 1 topology 9 4
+> 16 0 20 1 topology 20 4
+> 15 0 22 1 topology 20 5
+> 16 0 22 1 topology 10 5
+> 15 0 21 1 topology 18 6
+> 16 0 21 1 topology 17 6
+> 15 0 22 1 topology 17 7
+> 16 0 22 1 topology 8 7
+> 15 0 22 1 topology 15 8
+> 16 0 22 1 topology 3 8
+> 15 0 20 1 topology 9 9
+> 16 0 20 1 topology 19 9
+> 15 0 22 1 topology 19 10
+> 16 0 22 1 topology 11 10
+> 15 0 21 1 topology 18 11
+> 16 0 21 1 topology 16 11
+> 15 0 22 1 topology 16 12
+> 16 0 22 1 topology 7 12
+> 15 0 22 1 topology 18 13
+> 16 0 22 1 topology 6 13
+> 15 0 21 1 topology 15 14
+> 16 0 21 1 topology 14 14
+> 15 0 22 1 topology 14 15
+> 16 0 22 1 topology 5 15
+> 15 0 21 1 topology 15 16
+> 16 0 21 1 topology 13 16
+> 15 0 22 1 topology 13 17
+> 16 0 22 1 topology 4 17
+> 15 0 21 1 topology 18 18
+> 16 0 21 1 topology 20 18
+> 15 0 21 1 topology 15 19
+> 16 0 21 1 topology 17 19
+> 15 0 22 1 topology 12 20
+> 16 0 22 1 topology 3 20
+> 15 0 21 1 topology 18 21
+> 16 0 21 1 topology 19 21
+> 15 0 21 1 topology 15 22
+> 16 0 21 1 topology 16 22
+> 15 0 22 1 topology 15 23
+> 16 0 22 1 topology 6 23
+> 15 0 21 1 topology 12 24
+> 16 0 21 1 topology 14 24
+> 15 0 21 1 topology 12 25
+> 16 0 21 1 topology 13 25
+> 15 0 21 1 topology 20 26
+> 16 0 21 1 topology 19 26
+> 15 0 21 1 topology 17 27
+> 16 0 21 1 topology 16 27
+> 15 0 22 1 topology 17 28
+> 16 0 22 1 topology 6 28
+> 15 0 20 1 topology 3 29
+> 16 0 20 1 topology 14 29
+> 15 0 20 1 topology 3 30
+> 16 0 20 1 topology 13 30
+> 15 0 22 1 topology 16 31
+> 16 0 22 1 topology 6 31
+> 15 0 21 1 topology 14 32
+> 16 0 21 1 topology 13 32
+> 15 0 23 4635 topology 4648 33
+> 16 0 23 4635 topology 4649 33
+> 15 0 24 4635 topology 4649 34
+> 16 0 24 4635 topology 4793 34
+> 15 0 24 4635 topology 4793 35
+> 16 0 24 4635 topology 4662 35
+> 15 0 25 4635 topology 4662 36
+> 16 0 25 4635 topology 4660 36
+> 15 0 24 4635 topology 4793 37
+> 16 0 24 4635 topology 4665 37
+> 15 0 25 4635 topology 4665 38
+> 16 0 25 4635 topology 4663 38
+> 15 0 24 4635 topology 4793 39
+> 16 0 24 4635 topology 4725 39
+> 15 0 25 4635 topology 4725 40
+> 16 0 25 4635 topology 4723 40
+> 15 0 24 4635 topology 4793 41
+> 16 0 24 4635 topology 4701 41
+> 15 0 25 4635 topology 4701 42
+> 16 0 25 4635 topology 4699 42
+> 15 0 24 4635 topology 4793 43
+> 16 0 24 4635 topology 4677 43
+> 15 0 25 4635 topology 4677 44
+> 16 0 25 4635 topology 4675 44
+> 15 0 24 4635 topology 4793 45
+> 16 0 24 4635 topology 4785 45
+> 15 0 25 4635 topology 4785 46
+> 16 0 25 4635 topology 4783 46
+> 15 0 24 4635 topology 4793 47
+> 16 0 24 4635 topology 4761 47
+> 15 0 25 4635 topology 4761 48
+> 16 0 25 4635 topology 4759 48
+> 15 0 24 4635 topology 4793 49
+> 16 0 24 4635 topology 4737 49
+> 15 0 25 4635 topology 4737 50
+> 16 0 25 4635 topology 4735 50
+> 15 0 24 4635 topology 4793 51
+> 16 0 24 4635 topology 4713 51
+> 15 0 25 4635 topology 4713 52
+> 16 0 25 4635 topology 4711 52
+> 15 0 24 4635 topology 4793 53
+> 16 0 24 4635 topology 4689 53
+> 15 0 25 4635 topology 4689 54
+> 16 0 25 4635 topology 4687 54
+> 15 0 24 4635 topology 4793 55
+> 16 0 24 4635 topology 4773 55
+> 15 0 25 4635 topology 4773 56
+> 16 0 25 4635 topology 4771 56
+> 15 0 24 4635 topology 4793 57
+> 16 0 24 4635 topology 4749 57
+> 15 0 25 4635 topology 4749 58
+> 16 0 25 4635 topology 4747 58
+> 15 0 24 4635 topology 4793 59
+> 16 0 24 4635 topology 4641 59
+> 15 0 25 4635 topology 4641 60
+> 16 0 25 4635 topology 4639 60
+> 15 0 24 4635 topology 4793 61
+> 16 0 24 4635 topology 4653 61
+> 15 0 25 4635 topology 4653 62
+> 16 0 25 4635 topology 4651 62
+> 15 0 26 4635 topology 4793 63
+> 16 0 26 4635 topology 4792 63
+> 15 0 24 4635 topology 4793 64
+> 16 0 24 4635 topology 4668 64
+> 15 0 25 4635 topology 4668 65
+> 16 0 25 4635 topology 4666 65
+> 15 0 24 4635 topology 4793 66
+> 16 0 24 4635 topology 4728 66
+> 15 0 25 4635 topology 4728 67
+> 16 0 25 4635 topology 4726 67
+> 15 0 24 4635 topology 4793 68
+> 16 0 24 4635 topology 4704 68
+> 15 0 25 4635 topology 4704 69
+> 16 0 25 4635 topology 4702 69
+> 15 0 24 4635 topology 4793 70
+> 16 0 24 4635 topology 4680 70
+> 15 0 25 4635 topology 4680 71
+> 16 0 25 4635 topology 4678 71
+> 15 0 24 4635 topology 4793 72
+> 16 0 24 4635 topology 4788 72
+> 15 0 25 4635 topology 4788 73
+> 16 0 25 4635 topology 4786 73
+> 15 0 24 4635 topology 4793 74
+> 16 0 24 4635 topology 4764 74
+> 15 0 25 4635 topology 4764 75
+> 16 0 25 4635 topology 4762 75
+> 15 0 24 4635 topology 4793 76
+> 16 0 24 4635 topology 4740 76
+> 15 0 25 4635 topology 4740 77
+> 16 0 25 4635 topology 4738 77
+> 15 0 24 4635 topology 4793 78
+> 16 0 24 4635 topology 4716 78
+> 15 0 25 4635 topology 4716 79
+> 16 0 25 4635 topology 4714 79
+> 15 0 24 4635 topology 4793 80
+> 16 0 24 4635 topology 4692 80
+> 15 0 25 4635 topology 4692 81
+> 16 0 25 4635 topology 4690 81
+> 15 0 24 4635 topology 4793 82
+> 16 0 24 4635 topology 4776 82
+> 15 0 25 4635 topology 4776 83
+> 16 0 25 4635 topology 4774 83
+> 15 0 24 4635 topology 4793 84
+> 16 0 24 4635 topology 4752 84
+> 15 0 25 4635 topology 4752 85
+> 16 0 25 4635 topology 4750 85
+> 15 0 24 4635 topology 4793 86
+> 16 0 24 4635 topology 4644 86
+> 15 0 25 4635 topology 4644 87
+> 16 0 25 4635 topology 4642 87
+> 15 0 24 4635 topology 4793 88
+> 16 0 24 4635 topology 4656 88
+> 15 0 25 4635 topology 4656 89
+> 16 0 25 4635 topology 4654 89
+> 15 0 24 4635 topology 4793 90
+> 16 0 24 4635 topology 4695 90
+> 15 0 25 4635 topology 4695 91
+> 16 0 25 4635 topology 4693 91
+> 15 0 24 4635 topology 4793 92
+> 16 0 24 4635 topology 4671 92
+> 15 0 25 4635 topology 4671 93
+> 16 0 25 4635 topology 4669 93
+> 15 0 24 4635 topology 4793 94
+> 16 0 24 4635 topology 4755 94
+> 15 0 25 4635 topology 4755 95
+> 16 0 25 4635 topology 4753 95
+> 15 0 24 4635 topology 4793 96
+> 16 0 24 4635 topology 4731 96
+> 15 0 25 4635 topology 4731 97
+> 16 0 25 4635 topology 4729 97
+> 15 0 24 4635 topology 4793 98
+> 16 0 24 4635 topology 4707 98
+> 15 0 25 4635 topology 4707 99
+> 16 0 25 4635 topology 4705 99
+> 15 0 24 4635 topology 4793 100
+> 16 0 24 4635 topology 4683 100
+> 15 0 25 4635 topology 4683 101
+> 16 0 25 4635 topology 4681 101
+> 15 0 24 4635 topology 4793 102
+> 16 0 24 4635 topology 4791 102
+> 15 0 25 4635 topology 4791 103
+> 16 0 25 4635 topology 4789 103
+> 15 0 24 4635 topology 4793 104
+> 16 0 24 4635 topology 4767 104
+> 15 0 25 4635 topology 4767 105
+> 16 0 25 4635 topology 4765 105
+> 15 0 24 4635 topology 4793 106
+> 16 0 24 4635 topology 4743 106
+> 15 0 25 4635 topology 4743 107
+> 16 0 25 4635 topology 4741 107
+> 15 0 24 4635 topology 4793 108
+> 16 0 24 4635 topology 4719 108
+> 15 0 25 4635 topology 4719 109
+> 16 0 25 4635 topology 4717 109
+> 15 0 24 4635 topology 4793 110
+> 16 0 24 4635 topology 4779 110
+> 15 0 25 4635 topology 4779 111
+> 16 0 25 4635 topology 4777 111
+> 15 0 24 4635 topology 4793 112
+> 16 0 24 4635 topology 4647 112
+> 15 0 25 4635 topology 4647 113
+> 16 0 25 4635 topology 4645 113
+> 15 0 24 4635 topology 4793 114
+> 16 0 24 4635 topology 4659 114
+> 15 0 25 4635 topology 4659 115
+> 16 0 25 4635 topology 4657 115
+> 15 0 24 4635 topology 4793 116
+> 16 0 24 4635 topology 4698 116
+> 15 0 25 4635 topology 4698 117
+> 16 0 25 4635 topology 4696 117
+> 15 0 24 4635 topology 4793 118
+> 16 0 24 4635 topology 4674 118
+> 15 0 25 4635 topology 4674 119
+> 16 0 25 4635 topology 4672 119
+> 15 0 24 4635 topology 4793 120
+> 16 0 24 4635 topology 4758 120
+> 15 0 25 4635 topology 4758 121
+> 16 0 25 4635 topology 4756 121
+> 15 0 24 4635 topology 4793 122
+> 16 0 24 4635 topology 4734 122
+> 15 0 25 4635 topology 4734 123
+> 16 0 25 4635 topology 4732 123
+> 15 0 24 4635 topology 4793 124
+> 16 0 24 4635 topology 4710 124
+> 15 0 25 4635 topology 4710 125
+> 16 0 25 4635 topology 4708 125
+> 15 0 24 4635 topology 4793 126
+> 16 0 24 4635 topology 4686 126
+> 15 0 25 4635 topology 4686 127
+> 16 0 25 4635 topology 4684 127
+> 15 0 24 4635 topology 4793 128
+> 16 0 24 4635 topology 4770 128
+> 15 0 25 4635 topology 4770 129
+> 16 0 25 4635 topology 4768 129
+> 15 0 24 4635 topology 4793 130
+> 16 0 24 4635 topology 4746 130
+> 15 0 25 4635 topology 4746 131
+> 16 0 25 4635 topology 4744 131
+> 15 0 24 4635 topology 4793 132
+> 16 0 24 4635 topology 4722 132
+> 15 0 25 4635 topology 4722 133
+> 16 0 25 4635 topology 4720 133
+> 15 0 24 4635 topology 4793 134
+> 16 0 24 4635 topology 4782 134
+> 15 0 25 4635 topology 4782 135
+> 16 0 25 4635 topology 4780 135
+> 15 0 24 4635 topology 4793 136
+> 16 0 24 4635 topology 4638 136
+> 15 0 25 4635 topology 4638 137
+> 16 0 25 4635 topology 4636 137
+> 15 0 23 4635 topology 4660 138
+> 16 0 23 4635 topology 4661 138
+> 15 0 24 4635 topology 4661 139
+> 16 0 24 4635 topology 4793 139
+> 15 0 24 4635 topology 4793 140
+> 16 0 24 4635 topology 4650 140
+> 15 0 25 4635 topology 4650 141
+> 16 0 25 4635 topology 4648 141
+> 15 0 23 4635 topology 4663 142
+> 16 0 23 4635 topology 4664 142
+> 15 0 24 4635 topology 4664 143
+> 16 0 24 4635 topology 4793 143
+> 15 0 23 4635 topology 4723 144
+> 16 0 23 4635 topology 4724 144
+> 15 0 24 4635 topology 4724 145
+> 16 0 24 4635 topology 4793 145
+> 15 0 23 4635 topology 4699 146
+> 16 0 23 4635 topology 4700 146
+> 15 0 24 4635 topology 4700 147
+> 16 0 24 4635 topology 4793 147
+> 15 0 23 4635 topology 4675 148
+> 16 0 23 4635 topology 4676 148
+> 15 0 24 4635 topology 4676 149
+> 16 0 24 4635 topology 4793 149
+> 15 0 23 4635 topology 4783 150
+> 16 0 23 4635 topology 4784 150
+> 15 0 24 4635 topology 4784 151
+> 16 0 24 4635 topology 4793 151
+> 15 0 23 4635 topology 4759 152
+> 16 0 23 4635 topology 4760 152
+> 15 0 24 4635 topology 4760 153
+> 16 0 24 4635 topology 4793 153
+> 15 0 23 4635 topology 4735 154
+> 16 0 23 4635 topology 4736 154
+> 15 0 24 4635 topology 4736 155
+> 16 0 24 4635 topology 4793 155
+> 15 0 23 4635 topology 4711 156
+> 16 0 23 4635 topology 4712 156
+> 15 0 24 4635 topology 4712 157
+> 16 0 24 4635 topology 4793 157
+> 15 0 23 4635 topology 4687 158
+> 16 0 23 4635 topology 4688 158
+> 15 0 24 4635 topology 4688 159
+> 16 0 24 4635 topology 4793 159
+> 15 0 23 4635 topology 4771 160
+> 16 0 23 4635 topology 4772 160
+> 15 0 24 4635 topology 4772 161
+> 16 0 24 4635 topology 4793 161
+> 15 0 23 4635 topology 4747 162
+> 16 0 23 4635 topology 4748 162
+> 15 0 24 4635 topology 4748 163
+> 16 0 24 4635 topology 4793 163
+> 15 0 23 4635 topology 4639 164
+> 16 0 23 4635 topology 4640 164
+> 15 0 24 4635 topology 4640 165
+> 16 0 24 4635 topology 4793 165
+> 15 0 23 4635 topology 4651 166
+> 16 0 23 4635 topology 4652 166
+> 15 0 24 4635 topology 4652 167
+> 16 0 24 4635 topology 4793 167
+> 15 0 23 4635 topology 4666 168
+> 16 0 23 4635 topology 4667 168
+> 15 0 24 4635 topology 4667 169
+> 16 0 24 4635 topology 4793 169
+> 15 0 23 4635 topology 4726 170
+> 16 0 23 4635 topology 4727 170
+> 15 0 24 4635 topology 4727 171
+> 16 0 24 4635 topology 4793 171
+> 15 0 23 4635 topology 4702 172
+> 16 0 23 4635 topology 4703 172
+> 15 0 24 4635 topology 4703 173
+> 16 0 24 4635 topology 4793 173
+> 15 0 23 4635 topology 4678 174
+> 16 0 23 4635 topology 4679 174
+> 15 0 24 4635 topology 4679 175
+> 16 0 24 4635 topology 4793 175
+> 15 0 23 4635 topology 4786 176
+> 16 0 23 4635 topology 4787 176
+> 15 0 24 4635 topology 4787 177
+> 16 0 24 4635 topology 4793 177
+> 15 0 23 4635 topology 4762 178
+> 16 0 23 4635 topology 4763 178
+> 15 0 24 4635 topology 4763 179
+> 16 0 24 4635 topology 4793 179
+> 15 0 23 4635 topology 4738 180
+> 16 0 23 4635 topology 4739 180
+> 15 0 24 4635 topology 4739 181
+> 16 0 24 4635 topology 4793 181
+> 15 0 23 4635 topology 4714 182
+> 16 0 23 4635 topology 4715 182
+> 15 0 24 4635 topology 4715 183
+> 16 0 24 4635 topology 4793 183
+> 15 0 23 4635 topology 4690 184
+> 16 0 23 4635 topology 4691 184
+> 15 0 24 4635 topology 4691 185
+> 16 0 24 4635 topology 4793 185
+> 15 0 23 4635 topology 4774 186
+> 16 0 23 4635 topology 4775 186
+> 15 0 24 4635 topology 4775 187
+> 16 0 24 4635 topology 4793 187
+> 15 0 23 4635 topology 4750 188
+> 16 0 23 4635 topology 4751 188
+> 15 0 24 4635 topology 4751 189
+> 16 0 24 4635 topology 4793 189
+> 15 0 23 4635 topology 4642 190
+> 16 0 23 4635 topology 4643 190
+> 15 0 24 4635 topology 4643 191
+> 16 0 24 4635 topology 4793 191
+> 15 0 23 4635 topology 4654 192
+> 16 0 23 4635 topology 4655 192
+> 15 0 24 4635 topology 4655 193
+> 16 0 24 4635 topology 4793 193
+> 15 0 23 4635 topology 4693 194
+> 16 0 23 4635 topology 4694 194
+> 15 0 24 4635 topology 4694 195
+> 16 0 24 4635 topology 4793 195
+> 15 0 23 4635 topology 4669 196
+> 16 0 23 4635 topology 4670 196
+> 15 0 24 4635 topology 4670 197
+> 16 0 24 4635 topology 4793 197
+> 15 0 23 4635 topology 4753 198
+> 16 0 23 4635 topology 4754 198
+> 15 0 24 4635 topology 4754 199
+> 16 0 24 4635 topology 4793 199
+> 15 0 23 4635 topology 4729 200
+> 16 0 23 4635 topology 4730 200
+> 15 0 24 4635 topology 4730 201
+> 16 0 24 4635 topology 4793 201
+> 15 0 23 4635 topology 4705 202
+> 16 0 23 4635 topology 4706 202
+> 15 0 24 4635 topology 4706 203
+> 16 0 24 4635 topology 4793 203
+> 15 0 23 4635 topology 4681 204
+> 16 0 23 4635 topology 4682 204
+> 15 0 24 4635 topology 4682 205
+> 16 0 24 4635 topology 4793 205
+> 15 0 23 4635 topology 4789 206
+> 16 0 23 4635 topology 4790 206
+> 15 0 24 4635 topology 4790 207
+> 16 0 24 4635 topology 4793 207
+> 15 0 23 4635 topology 4765 208
+> 16 0 23 4635 topology 4766 208
+> 15 0 24 4635 topology 4766 209
+> 16 0 24 4635 topology 4793 209
+> 15 0 23 4635 topology 4741 210
+> 16 0 23 4635 topology 4742 210
+> 15 0 24 4635 topology 4742 211
+> 16 0 24 4635 topology 4793 211
+> 15 0 23 4635 topology 4717 212
+> 16 0 23 4635 topology 4718 212
+> 15 0 24 4635 topology 4718 213
+> 16 0 24 4635 topology 4793 213
+> 15 0 23 4635 topology 4777 214
+> 16 0 23 4635 topology 4778 214
+> 15 0 24 4635 topology 4778 215
+> 16 0 24 4635 topology 4793 215
+> 15 0 23 4635 topology 4645 216
+> 16 0 23 4635 topology 4646 216
+> 15 0 24 4635 topology 4646 217
+> 16 0 24 4635 topology 4793 217
+> 15 0 23 4635 topology 4657 218
+> 16 0 23 4635 topology 4658 218
+> 15 0 24 4635 topology 4658 219
+> 16 0 24 4635 topology 4793 219
+> 15 0 23 4635 topology 4696 220
+> 16 0 23 4635 topology 4697 220
+> 15 0 24 4635 topology 4697 221
+> 16 0 24 4635 topology 4793 221
+> 15 0 23 4635 topology 4672 222
+> 16 0 23 4635 topology 4673 222
+> 15 0 24 4635 topology 4673 223
+> 16 0 24 4635 topology 4793 223
+> 15 0 23 4635 topology 4756 224
+> 16 0 23 4635 topology 4757 224
+> 15 0 24 4635 topology 4757 225
+> 16 0 24 4635 topology 4793 225
+> 15 0 23 4635 topology 4732 226
+> 16 0 23 4635 topology 4733 226
+> 15 0 24 4635 topology 4733 227
+> 16 0 24 4635 topology 4793 227
+> 15 0 23 4635 topology 4708 228
+> 16 0 23 4635 topology 4709 228
+> 15 0 24 4635 topology 4709 229
+> 16 0 24 4635 topology 4793 229
+> 15 0 23 4635 topology 4684 230
+> 16 0 23 4635 topology 4685 230
+> 15 0 24 4635 topology 4685 231
+> 16 0 24 4635 topology 4793 231
+> 15 0 23 4635 topology 4768 232
+> 16 0 23 4635 topology 4769 232
+> 15 0 24 4635 topology 4769 233
+> 16 0 24 4635 topology 4793 233
+> 15 0 23 4635 topology 4744 234
+> 16 0 23 4635 topology 4745 234
+> 15 0 24 4635 topology 4745 235
+> 16 0 24 4635 topology 4793 235
+> 15 0 23 4635 topology 4720 236
+> 16 0 23 4635 topology 4721 236
+> 15 0 24 4635 topology 4721 237
+> 16 0 24 4635 topology 4793 237
+> 15 0 23 4635 topology 4780 238
+> 16 0 23 4635 topology 4781 238
+> 15 0 24 4635 topology 4781 239
+> 16 0 24 4635 topology 4793 239
+> 15 0 23 4635 topology 4636 240
+> 16 0 23 4635 topology 4637 240
+> 15 0 24 4635 topology 4637 241
+> 16 0 24 4635 topology 4793 241
+> 15 0 23 4391 topology 4422 242
+> 16 0 23 4391 topology 4423 242
+> 15 0 24 4391 topology 4423 243
+> 16 0 24 4391 topology 4633 243
+> 15 0 24 4391 topology 4633 244
+> 16 0 24 4391 topology 4460 244
+> 15 0 25 4391 topology 4460 245
+> 16 0 25 4391 topology 4458 245
+> 15 0 24 4391 topology 4633 246
+> 16 0 24 4391 topology 4544 246
+> 15 0 25 4391 topology 4544 247
+> 16 0 25 4391 topology 4542 247
+> 15 0 24 4391 topology 4633 248
+> 16 0 24 4391 topology 4496 248
+> 15 0 25 4391 topology 4496 249
+> 16 0 25 4391 topology 4494 249
+> 15 0 24 4391 topology 4633 250
+> 16 0 24 4391 topology 4580 250
+> 15 0 25 4391 topology 4580 251
+> 16 0 25 4391 topology 4578 251
+> 15 0 24 4391 topology 4633 252
+> 16 0 24 4391 topology 4448 252
+> 15 0 25 4391 topology 4448 253
+> 16 0 25 4391 topology 4446 253
+> 15 0 24 4391 topology 4633 254
+> 16 0 24 4391 topology 4532 254
+> 15 0 25 4391 topology 4532 255
+> 16 0 25 4391 topology 4530 255
+> 15 0 24 4391 topology 4633 256
+> 16 0 24 4391 topology 4616 256
+> 15 0 25 4391 topology 4616 257
+> 16 0 25 4391 topology 4614 257
+> 15 0 24 4391 topology 4633 258
+> 16 0 24 4391 topology 4568 258
+> 15 0 25 4391 topology 4568 259
+> 16 0 25 4391 topology 4566 259
+> 15 0 24 4391 topology 4633 260
+> 16 0 24 4391 topology 4415 260
+> 15 0 25 4391 topology 4415 261
+> 16 0 25 4391 topology 4413 261
+> 15 0 24 4391 topology 4633 262
+> 16 0 24 4391 topology 4451 262
+> 15 0 25 4391 topology 4451 263
+> 16 0 25 4391 topology 4449 263
+> 15 0 24 4391 topology 4633 264
+> 16 0 24 4391 topology 4487 264
+> 15 0 25 4391 topology 4487 265
+> 16 0 25 4391 topology 4485 265
+> 15 0 24 4391 topology 4633 266
+> 16 0 24 4391 topology 4571 266
+> 15 0 25 4391 topology 4571 267
+> 16 0 25 4391 topology 4569 267
+> 15 0 24 4391 topology 4633 268
+> 16 0 24 4391 topology 4439 268
+> 15 0 25 4391 topology 4439 269
+> 16 0 25 4391 topology 4437 269
+> 15 0 24 4391 topology 4633 270
+> 16 0 24 4391 topology 4523 270
+> 15 0 25 4391 topology 4523 271
+> 16 0 25 4391 topology 4521 271
+> 15 0 24 4391 topology 4633 272
+> 16 0 24 4391 topology 4607 272
+> 15 0 25 4391 topology 4607 273
+> 16 0 25 4391 topology 4605 273
+> 15 0 24 4391 topology 4633 274
+> 16 0 24 4391 topology 4475 274
+> 15 0 25 4391 topology 4475 275
+> 16 0 25 4391 topology 4473 275
+> 15 0 24 4391 topology 4633 276
+> 16 0 24 4391 topology 4559 276
+> 15 0 25 4391 topology 4559 277
+> 16 0 25 4391 topology 4557 277
+> 15 0 24 4391 topology 4633 278
+> 16 0 24 4391 topology 4595 278
+> 15 0 25 4391 topology 4595 279
+> 16 0 25 4391 topology 4593 279
+> 15 0 24 4391 topology 4633 280
+> 16 0 24 4391 topology 4406 280
+> 15 0 25 4391 topology 4406 281
+> 16 0 25 4391 topology 4404 281
+> 15 0 24 4391 topology 4633 282
+> 16 0 24 4391 topology 4430 282
+> 15 0 25 4391 topology 4430 283
+> 16 0 25 4391 topology 4428 283
+> 15 0 24 4391 topology 4633 284
+> 16 0 24 4391 topology 4514 284
+> 15 0 25 4391 topology 4514 285
+> 16 0 25 4391 topology 4512 285
+> 15 0 24 4391 topology 4633 286
+> 16 0 24 4391 topology 4466 286
+> 15 0 25 4391 topology 4466 287
+> 16 0 25 4391 topology 4464 287
+> 15 0 24 4391 topology 4633 288
+> 16 0 24 4391 topology 4550 288
+> 15 0 25 4391 topology 4550 289
+> 16 0 25 4391 topology 4548 289
+> 15 0 24 4391 topology 4633 290
+> 16 0 24 4391 topology 4502 290
+> 15 0 25 4391 topology 4502 291
+> 16 0 25 4391 topology 4500 291
+> 15 0 24 4391 topology 4633 292
+> 16 0 24 4391 topology 4586 292
+> 15 0 25 4391 topology 4586 293
+> 16 0 25 4391 topology 4584 293
+> 15 0 24 4391 topology 4633 294
+> 16 0 24 4391 topology 4538 294
+> 15 0 25 4391 topology 4538 295
+> 16 0 25 4391 topology 4536 295
+> 15 0 24 4391 topology 4633 296
+> 16 0 24 4391 topology 4622 296
+> 15 0 25 4391 topology 4622 297
+> 16 0 25 4391 topology 4620 297
+> 15 0 24 4391 topology 4633 298
+> 16 0 24 4391 topology 4397 298
+> 15 0 25 4391 topology 4397 299
+> 16 0 25 4391 topology 4395 299
+> 15 0 24 4391 topology 4633 300
+> 16 0 24 4391 topology 4421 300
+> 15 0 25 4391 topology 4421 301
+> 16 0 25 4391 topology 4419 301
+> 15 0 24 4391 topology 4633 302
+> 16 0 24 4391 topology 4457 302
+> 15 0 25 4391 topology 4457 303
+> 16 0 25 4391 topology 4455 303
+> 15 0 24 4391 topology 4633 304
+> 16 0 24 4391 topology 4541 304
+> 15 0 25 4391 topology 4541 305
+> 16 0 25 4391 topology 4539 305
+> 15 0 24 4391 topology 4633 306
+> 16 0 24 4391 topology 4493 306
+> 15 0 25 4391 topology 4493 307
+> 16 0 25 4391 topology 4491 307
+> 15 0 24 4391 topology 4633 308
+> 16 0 24 4391 topology 4577 308
+> 15 0 25 4391 topology 4577 309
+> 16 0 25 4391 topology 4575 309
+> 15 0 24 4391 topology 4633 310
+> 16 0 24 4391 topology 4445 310
+> 15 0 25 4391 topology 4445 311
+> 16 0 25 4391 topology 4443 311
+> 15 0 24 4391 topology 4633 312
+> 16 0 24 4391 topology 4529 312
+> 15 0 25 4391 topology 4529 313
+> 16 0 25 4391 topology 4527 313
+> 15 0 24 4391 topology 4633 314
+> 16 0 24 4391 topology 4613 314
+> 15 0 25 4391 topology 4613 315
+> 16 0 25 4391 topology 4611 315
+> 15 0 24 4391 topology 4633 316
+> 16 0 24 4391 topology 4565 316
+> 15 0 25 4391 topology 4565 317
+> 16 0 25 4391 topology 4563 317
+> 15 0 24 4391 topology 4633 318
+> 16 0 24 4391 topology 4412 318
+> 15 0 25 4391 topology 4412 319
+> 16 0 25 4391 topology 4410 319
+> 15 0 24 4391 topology 4633 320
+> 16 0 24 4391 topology 4484 320
+> 15 0 25 4391 topology 4484 321
+> 16 0 25 4391 topology 4482 321
+> 15 0 24 4391 topology 4633 322
+> 16 0 24 4391 topology 4436 322
+> 15 0 25 4391 topology 4436 323
+> 16 0 25 4391 topology 4434 323
+> 15 0 24 4391 topology 4633 324
+> 16 0 24 4391 topology 4520 324
+> 15 0 25 4391 topology 4520 325
+> 16 0 25 4391 topology 4518 325
+> 15 0 24 4391 topology 4633 326
+> 16 0 24 4391 topology 4604 326
+> 15 0 25 4391 topology 4604 327
+> 16 0 25 4391 topology 4602 327
+> 15 0 24 4391 topology 4633 328
+> 16 0 24 4391 topology 4472 328
+> 15 0 25 4391 topology 4472 329
+> 16 0 25 4391 topology 4470 329
+> 15 0 24 4391 topology 4633 330
+> 16 0 24 4391 topology 4556 330
+> 15 0 25 4391 topology 4556 331
+> 16 0 25 4391 topology 4554 331
+> 15 0 24 4391 topology 4633 332
+> 16 0 24 4391 topology 4508 332
+> 15 0 25 4391 topology 4508 333
+> 16 0 25 4391 topology 4506 333
+> 15 0 24 4391 topology 4633 334
+> 16 0 24 4391 topology 4592 334
+> 15 0 25 4391 topology 4592 335
+> 16 0 25 4391 topology 4590 335
+> 15 0 24 4391 topology 4633 336
+> 16 0 24 4391 topology 4628 336
+> 15 0 25 4391 topology 4628 337
+> 16 0 25 4391 topology 4626 337
+> 15 0 24 4391 topology 4633 338
+> 16 0 24 4391 topology 4403 338
+> 15 0 25 4391 topology 4403 339
+> 16 0 25 4391 topology 4401 339
+> 15 0 26 4391 topology 4633 340
+> 16 0 26 4391 topology 4632 340
+> 15 0 24 4391 topology 4633 341
+> 16 0 24 4391 topology 4427 341
+> 15 0 25 4391 topology 4427 342
+> 16 0 25 4391 topology 4425 342
+> 15 0 24 4391 topology 4633 343
+> 16 0 24 4391 topology 4511 343
+> 15 0 25 4391 topology 4511 344
+> 16 0 25 4391 topology 4509 344
+> 15 0 24 4391 topology 4633 345
+> 16 0 24 4391 topology 4463 345
+> 15 0 25 4391 topology 4463 346
+> 16 0 25 4391 topology 4461 346
+> 15 0 24 4391 topology 4633 347
+> 16 0 24 4391 topology 4547 347
+> 15 0 25 4391 topology 4547 348
+> 16 0 25 4391 topology 4545 348
+> 15 0 24 4391 topology 4633 349
+> 16 0 24 4391 topology 4631 349
+> 15 0 25 4391 topology 4631 350
+> 16 0 25 4391 topology 4629 350
+> 15 0 24 4391 topology 4633 351
+> 16 0 24 4391 topology 4499 351
+> 15 0 25 4391 topology 4499 352
+> 16 0 25 4391 topology 4497 352
+> 15 0 24 4391 topology 4633 353
+> 16 0 24 4391 topology 4583 353
+> 15 0 25 4391 topology 4583 354
+> 16 0 25 4391 topology 4581 354
+> 15 0 24 4391 topology 4633 355
+> 16 0 24 4391 topology 4535 355
+> 15 0 25 4391 topology 4535 356
+> 16 0 25 4391 topology 4533 356
+> 15 0 24 4391 topology 4633 357
+> 16 0 24 4391 topology 4619 357
+> 15 0 25 4391 topology 4619 358
+> 16 0 25 4391 topology 4617 358
+> 15 0 24 4391 topology 4633 359
+> 16 0 24 4391 topology 4394 359
+> 15 0 25 4391 topology 4394 360
+> 16 0 25 4391 topology 4392 360
+> 15 0 24 4391 topology 4633 361
+> 16 0 24 4391 topology 4418 361
+> 15 0 25 4391 topology 4418 362
+> 16 0 25 4391 topology 4416 362
+> 15 0 24 4391 topology 4633 363
+> 16 0 24 4391 topology 4454 363
+> 15 0 25 4391 topology 4454 364
+> 16 0 25 4391 topology 4452 364
+> 15 0 24 4391 topology 4633 365
+> 16 0 24 4391 topology 4490 365
+> 15 0 25 4391 topology 4490 366
+> 16 0 25 4391 topology 4488 366
+> 15 0 24 4391 topology 4633 367
+> 16 0 24 4391 topology 4574 367
+> 15 0 25 4391 topology 4574 368
+> 16 0 25 4391 topology 4572 368
+> 15 0 24 4391 topology 4633 369
+> 16 0 24 4391 topology 4442 369
+> 15 0 25 4391 topology 4442 370
+> 16 0 25 4391 topology 4440 370
+> 15 0 24 4391 topology 4633 371
+> 16 0 24 4391 topology 4526 371
+> 15 0 25 4391 topology 4526 372
+> 16 0 25 4391 topology 4524 372
+> 15 0 24 4391 topology 4633 373
+> 16 0 24 4391 topology 4610 373
+> 15 0 25 4391 topology 4610 374
+> 16 0 25 4391 topology 4608 374
+> 15 0 24 4391 topology 4633 375
+> 16 0 24 4391 topology 4478 375
+> 15 0 25 4391 topology 4478 376
+> 16 0 25 4391 topology 4476 376
+> 15 0 24 4391 topology 4633 377
+> 16 0 24 4391 topology 4562 377
+> 15 0 25 4391 topology 4562 378
+> 16 0 25 4391 topology 4560 378
+> 15 0 24 4391 topology 4633 379
+> 16 0 24 4391 topology 4598 379
+> 15 0 25 4391 topology 4598 380
+> 16 0 25 4391 topology 4596 380
+> 15 0 24 4391 topology 4633 381
+> 16 0 24 4391 topology 4409 381
+> 15 0 25 4391 topology 4409 382
+> 16 0 25 4391 topology 4407 382
+> 15 0 24 4391 topology 4633 383
+> 16 0 24 4391 topology 4481 383
+> 15 0 25 4391 topology 4481 384
+> 16 0 25 4391 topology 4479 384
+> 15 0 24 4391 topology 4633 385
+> 16 0 24 4391 topology 4433 385
+> 15 0 25 4391 topology 4433 386
+> 16 0 25 4391 topology 4431 386
+> 15 0 24 4391 topology 4633 387
+> 16 0 24 4391 topology 4517 387
+> 15 0 25 4391 topology 4517 388
+> 16 0 25 4391 topology 4515 388
+> 15 0 24 4391 topology 4633 389
+> 16 0 24 4391 topology 4601 389
+> 15 0 25 4391 topology 4601 390
+> 16 0 25 4391 topology 4599 390
+> 15 0 24 4391 topology 4633 391
+> 16 0 24 4391 topology 4469 391
+> 15 0 25 4391 topology 4469 392
+> 16 0 25 4391 topology 4467 392
+> 15 0 24 4391 topology 4633 393
+> 16 0 24 4391 topology 4553 393
+> 15 0 25 4391 topology 4553 394
+> 16 0 25 4391 topology 4551 394
+> 15 0 24 4391 topology 4633 395
+> 16 0 24 4391 topology 4505 395
+> 15 0 25 4391 topology 4505 396
+> 16 0 25 4391 topology 4503 396
+> 15 0 24 4391 topology 4633 397
+> 16 0 24 4391 topology 4589 397
+> 15 0 25 4391 topology 4589 398
+> 16 0 25 4391 topology 4587 398
+> 15 0 24 4391 topology 4633 399
+> 16 0 24 4391 topology 4625 399
+> 15 0 25 4391 topology 4625 400
+> 16 0 25 4391 topology 4623 400
+> 15 0 24 4391 topology 4633 401
+> 16 0 24 4391 topology 4400 401
+> 15 0 25 4391 topology 4400 402
+> 16 0 25 4391 topology 4398 402
+> 15 0 23 4391 topology 4458 403
+> 16 0 23 4391 topology 4459 403
+> 15 0 24 4391 topology 4459 404
+> 16 0 24 4391 topology 4633 404
+> 15 0 24 4391 topology 4633 405
+> 16 0 24 4391 topology 4424 405
+> 15 0 25 4391 topology 4424 406
+> 16 0 25 4391 topology 4422 406
+> 15 0 23 4391 topology 4542 407
+> 16 0 23 4391 topology 4543 407
+> 15 0 24 4391 topology 4543 408
+> 16 0 24 4391 topology 4633 408
+> 15 0 23 4391 topology 4494 409
+> 16 0 23 4391 topology 4495 409
+> 15 0 24 4391 topology 4495 410
+> 16 0 24 4391 topology 4633 410
+> 15 0 23 4391 topology 4578 411
+> 16 0 23 4391 topology 4579 411
+> 15 0 24 4391 topology 4579 412
+> 16 0 24 4391 topology 4633 412
+> 15 0 23 4391 topology 4446 413
+> 16 0 23 4391 topology 4447 413
+> 15 0 24 4391 topology 4447 414
+> 16 0 24 4391 topology 4633 414
+> 15 0 23 4391 topology 4530 415
+> 16 0 23 4391 topology 4531 415
+> 15 0 24 4391 topology 4531 416
+> 16 0 24 4391 topology 4633 416
+> 15 0 23 4391 topology 4614 417
+> 16 0 23 4391 topology 4615 417
+> 15 0 24 4391 topology 4615 418
+> 16 0 24 4391 topology 4633 418
+> 15 0 23 4391 topology 4566 419
+> 16 0 23 4391 topology 4567 419
+> 15 0 24 4391 topology 4567 420
+> 16 0 24 4391 topology 4633 420
+> 15 0 23 4391 topology 4413 421
+> 16 0 23 4391 topology 4414 421
+> 15 0 24 4391 topology 4414 422
+> 16 0 24 4391 topology 4633 422
+> 15 0 23 4391 topology 4449 423
+> 16 0 23 4391 topology 4450 423
+> 15 0 24 4391 topology 4450 424
+> 16 0 24 4391 topology 4633 424
+> 15 0 23 4391 topology 4485 425
+> 16 0 23 4391 topology 4486 425
+> 15 0 24 4391 topology 4486 426
+> 16 0 24 4391 topology 4633 426
+> 15 0 23 4391 topology 4569 427
+> 16 0 23 4391 topology 4570 427
+> 15 0 24 4391 topology 4570 428
+> 16 0 24 4391 topology 4633 428
+> 15 0 23 4391 topology 4437 429
+> 16 0 23 4391 topology 4438 429
+> 15 0 24 4391 topology 4438 430
+> 16 0 24 4391 topology 4633 430
+> 15 0 23 4391 topology 4521 431
+> 16 0 23 4391 topology 4522 431
+> 15 0 24 4391 topology 4522 432
+> 16 0 24 4391 topology 4633 432
+> 15 0 23 4391 topology 4605 433
+> 16 0 23 4391 topology 4606 433
+> 15 0 24 4391 topology 4606 434
+> 16 0 24 4391 topology 4633 434
+> 15 0 23 4391 topology 4473 435
+> 16 0 23 4391 topology 4474 435
+> 15 0 24 4391 topology 4474 436
+> 16 0 24 4391 topology 4633 436
+> 15 0 23 4391 topology 4557 437
+> 16 0 23 4391 topology 4558 437
+> 15 0 24 4391 topology 4558 438
+> 16 0 24 4391 topology 4633 438
+> 15 0 23 4391 topology 4593 439
+> 16 0 23 4391 topology 4594 439
+> 15 0 24 4391 topology 4594 440
+> 16 0 24 4391 topology 4633 440
+> 15 0 23 4391 topology 4404 441
+> 16 0 23 4391 topology 4405 441
+> 15 0 24 4391 topology 4405 442
+> 16 0 24 4391 topology 4633 442
+> 15 0 23 4391 topology 4428 443
+> 16 0 23 4391 topology 4429 443
+> 15 0 24 4391 topology 4429 444
+> 16 0 24 4391 topology 4633 444
+> 15 0 23 4391 topology 4512 445
+> 16 0 23 4391 topology 4513 445
+> 15 0 24 4391 topology 4513 446
+> 16 0 24 4391 topology 4633 446
+> 15 0 23 4391 topology 4464 447
+> 16 0 23 4391 topology 4465 447
+> 15 0 24 4391 topology 4465 448
+> 16 0 24 4391 topology 4633 448
+> 15 0 23 4391 topology 4548 449
+> 16 0 23 4391 topology 4549 449
+> 15 0 24 4391 topology 4549 450
+> 16 0 24 4391 topology 4633 450
+> 15 0 23 4391 topology 4500 451
+> 16 0 23 4391 topology 4501 451
+> 15 0 24 4391 topology 4501 452
+> 16 0 24 4391 topology 4633 452
+> 15 0 23 4391 topology 4584 453
+> 16 0 23 4391 topology 4585 453
+> 15 0 24 4391 topology 4585 454
+> 16 0 24 4391 topology 4633 454
+> 15 0 23 4391 topology 4536 455
+> 16 0 23 4391 topology 4537 455
+> 15 0 24 4391 topology 4537 456
+> 16 0 24 4391 topology 4633 456
+> 15 0 23 4391 topology 4620 457
+> 16 0 23 4391 topology 4621 457
+> 15 0 24 4391 topology 4621 458
+> 16 0 24 4391 topology 4633 458
+> 15 0 23 4391 topology 4395 459
+> 16 0 23 4391 topology 4396 459
+> 15 0 24 4391 topology 4396 460
+> 16 0 24 4391 topology 4633 460
+> 15 0 23 4391 topology 4419 461
+> 16 0 23 4391 topology 4420 461
+> 15 0 24 4391 topology 4420 462
+> 16 0 24 4391 topology 4633 462
+> 15 0 23 4391 topology 4455 463
+> 16 0 23 4391 topology 4456 463
+> 15 0 24 4391 topology 4456 464
+> 16 0 24 4391 topology 4633 464
+> 15 0 23 4391 topology 4539 465
+> 16 0 23 4391 topology 4540 465
+> 15 0 24 4391 topology 4540 466
+> 16 0 24 4391 topology 4633 466
+> 15 0 23 4391 topology 4491 467
+> 16 0 23 4391 topology 4492 467
+> 15 0 24 4391 topology 4492 468
+> 16 0 24 4391 topology 4633 468
+> 15 0 23 4391 topology 4575 469
+> 16 0 23 4391 topology 4576 469
+> 15 0 24 4391 topology 4576 470
+> 16 0 24 4391 topology 4633 470
+> 15 0 23 4391 topology 4443 471
+> 16 0 23 4391 topology 4444 471
+> 15 0 24 4391 topology 4444 472
+> 16 0 24 4391 topology 4633 472
+> 15 0 23 4391 topology 4527 473
+> 16 0 23 4391 topology 4528 473
+> 15 0 24 4391 topology 4528 474
+> 16 0 24 4391 topology 4633 474
+> 15 0 23 4391 topology 4611 475
+> 16 0 23 4391 topology 4612 475
+> 15 0 24 4391 topology 4612 476
+> 16 0 24 4391 topology 4633 476
+> 15 0 23 4391 topology 4563 477
+> 16 0 23 4391 topology 4564 477
+> 15 0 24 4391 topology 4564 478
+> 16 0 24 4391 topology 4633 478
+> 15 0 23 4391 topology 4410 479
+> 16 0 23 4391 topology 4411 479
+> 15 0 24 4391 topology 4411 480
+> 16 0 24 4391 topology 4633 480
+> 15 0 23 4391 topology 4482 481
+> 16 0 23 4391 topology 4483 481
+> 15 0 24 4391 topology 4483 482
+> 16 0 24 4391 topology 4633 482
+> 15 0 23 4391 topology 4434 483
+> 16 0 23 4391 topology 4435 483
+> 15 0 24 4391 topology 4435 484
+> 16 0 24 4391 topology 4633 484
+> 15 0 23 4391 topology 4518 485
+> 16 0 23 4391 topology 4519 485
+> 15 0 24 4391 topology 4519 486
+> 16 0 24 4391 topology 4633 486
+> 15 0 23 4391 topology 4602 487
+> 16 0 23 4391 topology 4603 487
+> 15 0 24 4391 topology 4603 488
+> 16 0 24 4391 topology 4633 488
+> 15 0 23 4391 topology 4470 489
+> 16 0 23 4391 topology 4471 489
+> 15 0 24 4391 topology 4471 490
+> 16 0 24 4391 topology 4633 490
+> 15 0 23 4391 topology 4554 491
+> 16 0 23 4391 topology 4555 491
+> 15 0 24 4391 topology 4555 492
+> 16 0 24 4391 topology 4633 492
+> 15 0 23 4391 topology 4506 493
+> 16 0 23 4391 topology 4507 493
+> 15 0 24 4391 topology 4507 494
+> 16 0 24 4391 topology 4633 494
+> 15 0 23 4391 topology 4590 495
+> 16 0 23 4391 topology 4591 495
+> 15 0 24 4391 topology 4591 496
+> 16 0 24 4391 topology 4633 496
+> 15 0 23 4391 topology 4626 497
+> 16 0 23 4391 topology 4627 497
+> 15 0 24 4391 topology 4627 498
+> 16 0 24 4391 topology 4633 498
+> 15 0 23 4391 topology 4401 499
+> 16 0 23 4391 topology 4402 499
+> 15 0 24 4391 topology 4402 500
+> 16 0 24 4391 topology 4633 500
+> 15 0 23 4391 topology 4425 501
+> 16 0 23 4391 topology 4426 501
+> 15 0 24 4391 topology 4426 502
+> 16 0 24 4391 topology 4633 502
+> 15 0 23 4391 topology 4509 503
+> 16 0 23 4391 topology 4510 503
+> 15 0 24 4391 topology 4510 504
+> 16 0 24 4391 topology 4633 504
+> 15 0 23 4391 topology 4461 505
+> 16 0 23 4391 topology 4462 505
+> 15 0 24 4391 topology 4462 506
+> 16 0 24 4391 topology 4633 506
+> 15 0 23 4391 topology 4545 507
+> 16 0 23 4391 topology 4546 507
+> 15 0 24 4391 topology 4546 508
+> 16 0 24 4391 topology 4633 508
+> 15 0 23 4391 topology 4629 509
+> 16 0 23 4391 topology 4630 509
+> 15 0 24 4391 topology 4630 510
+> 16 0 24 4391 topology 4633 510
+> 15 0 23 4391 topology 4497 511
+> 16 0 23 4391 topology 4498 511
+> 15 0 24 4391 topology 4498 512
+> 16 0 24 4391 topology 4633 512
+> 15 0 23 4391 topology 4581 513
+> 16 0 23 4391 topology 4582 513
+> 15 0 24 4391 topology 4582 514
+> 16 0 24 4391 topology 4633 514
+> 15 0 23 4391 topology 4533 515
+> 16 0 23 4391 topology 4534 515
+> 15 0 24 4391 topology 4534 516
+> 16 0 24 4391 topology 4633 516
+> 15 0 23 4391 topology 4617 517
+> 16 0 23 4391 topology 4618 517
+> 15 0 24 4391 topology 4618 518
+> 16 0 24 4391 topology 4633 518
+> 15 0 23 4391 topology 4392 519
+> 16 0 23 4391 topology 4393 519
+> 15 0 24 4391 topology 4393 520
+> 16 0 24 4391 topology 4633 520
+> 15 0 23 4391 topology 4416 521
+> 16 0 23 4391 topology 4417 521
+> 15 0 24 4391 topology 4417 522
+> 16 0 24 4391 topology 4633 522
+> 15 0 23 4391 topology 4452 523
+> 16 0 23 4391 topology 4453 523
+> 15 0 24 4391 topology 4453 524
+> 16 0 24 4391 topology 4633 524
+> 15 0 23 4391 topology 4488 525
+> 16 0 23 4391 topology 4489 525
+> 15 0 24 4391 topology 4489 526
+> 16 0 24 4391 topology 4633 526
+> 15 0 23 4391 topology 4572 527
+> 16 0 23 4391 topology 4573 527
+> 15 0 24 4391 topology 4573 528
+> 16 0 24 4391 topology 4633 528
+> 15 0 23 4391 topology 4440 529
+> 16 0 23 4391 topology 4441 529
+> 15 0 24 4391 topology 4441 530
+> 16 0 24 4391 topology 4633 530
+> 15 0 23 4391 topology 4524 531
+> 16 0 23 4391 topology 4525 531
+> 15 0 24 4391 topology 4525 532
+> 16 0 24 4391 topology 4633 532
+> 15 0 23 4391 topology 4608 533
+> 16 0 23 4391 topology 4609 533
+> 15 0 24 4391 topology 4609 534
+> 16 0 24 4391 topology 4633 534
+> 15 0 23 4391 topology 4476 535
+> 16 0 23 4391 topology 4477 535
+> 15 0 24 4391 topology 4477 536
+> 16 0 24 4391 topology 4633 536
+> 15 0 23 4391 topology 4560 537
+> 16 0 23 4391 topology 4561 537
+> 15 0 24 4391 topology 4561 538
+> 16 0 24 4391 topology 4633 538
+> 15 0 23 4391 topology 4596 539
+> 16 0 23 4391 topology 4597 539
+> 15 0 24 4391 topology 4597 540
+> 16 0 24 4391 topology 4633 540
+> 15 0 23 4391 topology 4407 541
+> 16 0 23 4391 topology 4408 541
+> 15 0 24 4391 topology 4408 542
+> 16 0 24 4391 topology 4633 542
+> 15 0 23 4391 topology 4479 543
+> 16 0 23 4391 topology 4480 543
+> 15 0 24 4391 topology 4480 544
+> 16 0 24 4391 topology 4633 544
+> 15 0 23 4391 topology 4431 545
+> 16 0 23 4391 topology 4432 545
+> 15 0 24 4391 topology 4432 546
+> 16 0 24 4391 topology 4633 546
+> 15 0 23 4391 topology 4515 547
+> 16 0 23 4391 topology 4516 547
+> 15 0 24 4391 topology 4516 548
+> 16 0 24 4391 topology 4633 548
+> 15 0 23 4391 topology 4599 549
+> 16 0 23 4391 topology 4600 549
+> 15 0 24 4391 topology 4600 550
+> 16 0 24 4391 topology 4633 550
+> 15 0 23 4391 topology 4467 551
+> 16 0 23 4391 topology 4468 551
+> 15 0 24 4391 topology 4468 552
+> 16 0 24 4391 topology 4633 552
+> 15 0 23 4391 topology 4551 553
+> 16 0 23 4391 topology 4552 553
+> 15 0 24 4391 topology 4552 554
+> 16 0 24 4391 topology 4633 554
+> 15 0 23 4391 topology 4503 555
+> 16 0 23 4391 topology 4504 555
+> 15 0 24 4391 topology 4504 556
+> 16 0 24 4391 topology 4633 556
+> 15 0 23 4391 topology 4587 557
+> 16 0 23 4391 topology 4588 557
+> 15 0 24 4391 topology 4588 558
+> 16 0 24 4391 topology 4633 558
+> 15 0 23 4391 topology 4623 559
+> 16 0 23 4391 topology 4624 559
+> 15 0 24 4391 topology 4624 560
+> 16 0 24 4391 topology 4633 560
+> 15 0 23 4391 topology 4398 561
+> 16 0 23 4391 topology 4399 561
+> 15 0 24 4391 topology 4399 562
+> 16 0 24 4391 topology 4633 562
+> 15 0 27 4390 topology 4792 563
+> 16 0 27 4390 topology 4794 563
+> 15 0 28 4390 topology 4794 564
+> 16 0 28 4390 topology 4796 564
+> 15 0 21 4390 topology 4794 565
+> 16 0 21 4390 topology 4634 565
+> 15 0 28 4390 topology 4634 566
+> 16 0 28 4390 topology 4632 566
+> 15 0 27 4390 topology 4796 567
+> 16 0 27 4390 topology 4634 567
+> 15 0 23 3794 topology 3801 568
+> 16 0 23 3794 topology 3802 568
+> 15 0 24 3794 topology 3802 569
+> 16 0 24 3794 topology 3916 569
+> 15 0 26 3794 topology 3916 570
+> 16 0 26 3794 topology 3915 570
+> 15 0 24 3794 topology 3916 571
+> 16 0 24 3794 topology 3815 571
+> 15 0 25 3794 topology 3815 572
+> 16 0 25 3794 topology 3813 572
+> 15 0 24 3794 topology 3916 573
+> 16 0 24 3794 topology 3827 573
+> 15 0 25 3794 topology 3827 574
+> 16 0 25 3794 topology 3825 574
+> 15 0 24 3794 topology 3916 575
+> 16 0 24 3794 topology 3857 575
+> 15 0 25 3794 topology 3857 576
+> 16 0 25 3794 topology 3855 576
+> 15 0 24 3794 topology 3916 577
+> 16 0 24 3794 topology 3887 577
+> 15 0 25 3794 topology 3887 578
+> 16 0 25 3794 topology 3885 578
+> 15 0 24 3794 topology 3916 579
+> 16 0 24 3794 topology 3839 579
+> 15 0 25 3794 topology 3839 580
+> 16 0 25 3794 topology 3837 580
+> 15 0 24 3794 topology 3916 581
+> 16 0 24 3794 topology 3869 581
+> 15 0 25 3794 topology 3869 582
+> 16 0 25 3794 topology 3867 582
+> 15 0 24 3794 topology 3916 583
+> 16 0 24 3794 topology 3899 583
+> 15 0 25 3794 topology 3899 584
+> 16 0 25 3794 topology 3897 584
+> 15 0 24 3794 topology 3916 585
+> 16 0 24 3794 topology 3851 585
+> 15 0 25 3794 topology 3851 586
+> 16 0 25 3794 topology 3849 586
+> 15 0 24 3794 topology 3916 587
+> 16 0 24 3794 topology 3881 587
+> 15 0 25 3794 topology 3881 588
+> 16 0 25 3794 topology 3879 588
+> 15 0 24 3794 topology 3916 589
+> 16 0 24 3794 topology 3911 589
+> 15 0 25 3794 topology 3911 590
+> 16 0 25 3794 topology 3909 590
+> 15 0 24 3794 topology 3916 591
+> 16 0 24 3794 topology 3800 591
+> 15 0 25 3794 topology 3800 592
+> 16 0 25 3794 topology 3798 592
+> 15 0 24 3794 topology 3916 593
+> 16 0 24 3794 topology 3812 593
+> 15 0 25 3794 topology 3812 594
+> 16 0 25 3794 topology 3810 594
+> 15 0 24 3794 topology 3916 595
+> 16 0 24 3794 topology 3824 595
+> 15 0 25 3794 topology 3824 596
+> 16 0 25 3794 topology 3822 596
+> 15 0 24 3794 topology 3916 597
+> 16 0 24 3794 topology 3854 597
+> 15 0 25 3794 topology 3854 598
+> 16 0 25 3794 topology 3852 598
+> 15 0 24 3794 topology 3916 599
+> 16 0 24 3794 topology 3884 599
+> 15 0 25 3794 topology 3884 600
+> 16 0 25 3794 topology 3882 600
+> 15 0 24 3794 topology 3916 601
+> 16 0 24 3794 topology 3914 601
+> 15 0 25 3794 topology 3914 602
+> 16 0 25 3794 topology 3912 602
+> 15 0 24 3794 topology 3916 603
+> 16 0 24 3794 topology 3836 603
+> 15 0 25 3794 topology 3836 604
+> 16 0 25 3794 topology 3834 604
+> 15 0 24 3794 topology 3916 605
+> 16 0 24 3794 topology 3866 605
+> 15 0 25 3794 topology 3866 606
+> 16 0 25 3794 topology 3864 606
+> 15 0 24 3794 topology 3916 607
+> 16 0 24 3794 topology 3896 607
+> 15 0 25 3794 topology 3896 608
+> 16 0 25 3794 topology 3894 608
+> 15 0 24 3794 topology 3916 609
+> 16 0 24 3794 topology 3848 609
+> 15 0 25 3794 topology 3848 610
+> 16 0 25 3794 topology 3846 610
+> 15 0 24 3794 topology 3916 611
+> 16 0 24 3794 topology 3878 611
+> 15 0 25 3794 topology 3878 612
+> 16 0 25 3794 topology 3876 612
+> 15 0 24 3794 topology 3916 613
+> 16 0 24 3794 topology 3908 613
+> 15 0 25 3794 topology 3908 614
+> 16 0 25 3794 topology 3906 614
+> 15 0 24 3794 topology 3916 615
+> 16 0 24 3794 topology 3797 615
+> 15 0 25 3794 topology 3797 616
+> 16 0 25 3794 topology 3795 616
+> 15 0 24 3794 topology 3916 617
+> 16 0 24 3794 topology 3809 617
+> 15 0 25 3794 topology 3809 618
+> 16 0 25 3794 topology 3807 618
+> 15 0 24 3794 topology 3916 619
+> 16 0 24 3794 topology 3821 619
+> 15 0 25 3794 topology 3821 620
+> 16 0 25 3794 topology 3819 620
+> 15 0 24 3794 topology 3916 621
+> 16 0 24 3794 topology 3833 621
+> 15 0 25 3794 topology 3833 622
+> 16 0 25 3794 topology 3831 622
+> 15 0 24 3794 topology 3916 623
+> 16 0 24 3794 topology 3863 623
+> 15 0 25 3794 topology 3863 624
+> 16 0 25 3794 topology 3861 624
+> 15 0 24 3794 topology 3916 625
+> 16 0 24 3794 topology 3893 625
+> 15 0 25 3794 topology 3893 626
+> 16 0 25 3794 topology 3891 626
+> 15 0 24 3794 topology 3916 627
+> 16 0 24 3794 topology 3845 627
+> 15 0 25 3794 topology 3845 628
+> 16 0 25 3794 topology 3843 628
+> 15 0 24 3794 topology 3916 629
+> 16 0 24 3794 topology 3875 629
+> 15 0 25 3794 topology 3875 630
+> 16 0 25 3794 topology 3873 630
+> 15 0 24 3794 topology 3916 631
+> 16 0 24 3794 topology 3905 631
+> 15 0 25 3794 topology 3905 632
+> 16 0 25 3794 topology 3903 632
+> 15 0 24 3794 topology 3916 633
+> 16 0 24 3794 topology 3806 633
+> 15 0 25 3794 topology 3806 634
+> 16 0 25 3794 topology 3804 634
+> 15 0 24 3794 topology 3916 635
+> 16 0 24 3794 topology 3818 635
+> 15 0 25 3794 topology 3818 636
+> 16 0 25 3794 topology 3816 636
+> 15 0 24 3794 topology 3916 637
+> 16 0 24 3794 topology 3830 637
+> 15 0 25 3794 topology 3830 638
+> 16 0 25 3794 topology 3828 638
+> 15 0 24 3794 topology 3916 639
+> 16 0 24 3794 topology 3860 639
+> 15 0 25 3794 topology 3860 640
+> 16 0 25 3794 topology 3858 640
+> 15 0 24 3794 topology 3916 641
+> 16 0 24 3794 topology 3890 641
+> 15 0 25 3794 topology 3890 642
+> 16 0 25 3794 topology 3888 642
+> 15 0 24 3794 topology 3916 643
+> 16 0 24 3794 topology 3842 643
+> 15 0 25 3794 topology 3842 644
+> 16 0 25 3794 topology 3840 644
+> 15 0 24 3794 topology 3916 645
+> 16 0 24 3794 topology 3872 645
+> 15 0 25 3794 topology 3872 646
+> 16 0 25 3794 topology 3870 646
+> 15 0 24 3794 topology 3916 647
+> 16 0 24 3794 topology 3902 647
+> 15 0 25 3794 topology 3902 648
+> 16 0 25 3794 topology 3900 648
+> 15 0 24 3794 topology 3916 649
+> 16 0 24 3794 topology 3803 649
+> 15 0 25 3794 topology 3803 650
+> 16 0 25 3794 topology 3801 650
+> 15 0 23 3794 topology 3813 651
+> 16 0 23 3794 topology 3814 651
+> 15 0 24 3794 topology 3814 652
+> 16 0 24 3794 topology 3916 652
+> 15 0 23 3794 topology 3825 653
+> 16 0 23 3794 topology 3826 653
+> 15 0 24 3794 topology 3826 654
+> 16 0 24 3794 topology 3916 654
+> 15 0 23 3794 topology 3855 655
+> 16 0 23 3794 topology 3856 655
+> 15 0 24 3794 topology 3856 656
+> 16 0 24 3794 topology 3916 656
+> 15 0 23 3794 topology 3885 657
+> 16 0 23 3794 topology 3886 657
+> 15 0 24 3794 topology 3886 658
+> 16 0 24 3794 topology 3916 658
+> 15 0 23 3794 topology 3837 659
+> 16 0 23 3794 topology 3838 659
+> 15 0 24 3794 topology 3838 660
+> 16 0 24 3794 topology 3916 660
+> 15 0 23 3794 topology 3867 661
+> 16 0 23 3794 topology 3868 661
+> 15 0 24 3794 topology 3868 662
+> 16 0 24 3794 topology 3916 662
+> 15 0 23 3794 topology 3897 663
+> 16 0 23 3794 topology 3898 663
+> 15 0 24 3794 topology 3898 664
+> 16 0 24 3794 topology 3916 664
+> 15 0 23 3794 topology 3849 665
+> 16 0 23 3794 topology 3850 665
+> 15 0 24 3794 topology 3850 666
+> 16 0 24 3794 topology 3916 666
+> 15 0 23 3794 topology 3879 667
+> 16 0 23 3794 topology 3880 667
+> 15 0 24 3794 topology 3880 668
+> 16 0 24 3794 topology 3916 668
+> 15 0 23 3794 topology 3909 669
+> 16 0 23 3794 topology 3910 669
+> 15 0 24 3794 topology 3910 670
+> 16 0 24 3794 topology 3916 670
+> 15 0 23 3794 topology 3798 671
+> 16 0 23 3794 topology 3799 671
+> 15 0 24 3794 topology 3799 672
+> 16 0 24 3794 topology 3916 672
+> 15 0 23 3794 topology 3810 673
+> 16 0 23 3794 topology 3811 673
+> 15 0 24 3794 topology 3811 674
+> 16 0 24 3794 topology 3916 674
+> 15 0 23 3794 topology 3822 675
+> 16 0 23 3794 topology 3823 675
+> 15 0 24 3794 topology 3823 676
+> 16 0 24 3794 topology 3916 676
+> 15 0 23 3794 topology 3852 677
+> 16 0 23 3794 topology 3853 677
+> 15 0 24 3794 topology 3853 678
+> 16 0 24 3794 topology 3916 678
+> 15 0 23 3794 topology 3882 679
+> 16 0 23 3794 topology 3883 679
+> 15 0 24 3794 topology 3883 680
+> 16 0 24 3794 topology 3916 680
+> 15 0 23 3794 topology 3912 681
+> 16 0 23 3794 topology 3913 681
+> 15 0 24 3794 topology 3913 682
+> 16 0 24 3794 topology 3916 682
+> 15 0 23 3794 topology 3834 683
+> 16 0 23 3794 topology 3835 683
+> 15 0 24 3794 topology 3835 684
+> 16 0 24 3794 topology 3916 684
+> 15 0 23 3794 topology 3864 685
+> 16 0 23 3794 topology 3865 685
+> 15 0 24 3794 topology 3865 686
+> 16 0 24 3794 topology 3916 686
+> 15 0 23 3794 topology 3894 687
+> 16 0 23 3794 topology 3895 687
+> 15 0 24 3794 topology 3895 688
+> 16 0 24 3794 topology 3916 688
+> 15 0 23 3794 topology 3846 689
+> 16 0 23 3794 topology 3847 689
+> 15 0 24 3794 topology 3847 690
+> 16 0 24 3794 topology 3916 690
+> 15 0 23 3794 topology 3876 691
+> 16 0 23 3794 topology 3877 691
+> 15 0 24 3794 topology 3877 692
+> 16 0 24 3794 topology 3916 692
+> 15 0 23 3794 topology 3906 693
+> 16 0 23 3794 topology 3907 693
+> 15 0 24 3794 topology 3907 694
+> 16 0 24 3794 topology 3916 694
+> 15 0 23 3794 topology 3795 695
+> 16 0 23 3794 topology 3796 695
+> 15 0 24 3794 topology 3796 696
+> 16 0 24 3794 topology 3916 696
+> 15 0 23 3794 topology 3807 697
+> 16 0 23 3794 topology 3808 697
+> 15 0 24 3794 topology 3808 698
+> 16 0 24 3794 topology 3916 698
+> 15 0 23 3794 topology 3819 699
+> 16 0 23 3794 topology 3820 699
+> 15 0 24 3794 topology 3820 700
+> 16 0 24 3794 topology 3916 700
+> 15 0 23 3794 topology 3831 701
+> 16 0 23 3794 topology 3832 701
+> 15 0 24 3794 topology 3832 702
+> 16 0 24 3794 topology 3916 702
+> 15 0 23 3794 topology 3861 703
+> 16 0 23 3794 topology 3862 703
+> 15 0 24 3794 topology 3862 704
+> 16 0 24 3794 topology 3916 704
+> 15 0 23 3794 topology 3891 705
+> 16 0 23 3794 topology 3892 705
+> 15 0 24 3794 topology 3892 706
+> 16 0 24 3794 topology 3916 706
+> 15 0 23 3794 topology 3843 707
+> 16 0 23 3794 topology 3844 707
+> 15 0 24 3794 topology 3844 708
+> 16 0 24 3794 topology 3916 708
+> 15 0 23 3794 topology 3873 709
+> 16 0 23 3794 topology 3874 709
+> 15 0 24 3794 topology 3874 710
+> 16 0 24 3794 topology 3916 710
+> 15 0 23 3794 topology 3903 711
+> 16 0 23 3794 topology 3904 711
+> 15 0 24 3794 topology 3904 712
+> 16 0 24 3794 topology 3916 712
+> 15 0 23 3794 topology 3804 713
+> 16 0 23 3794 topology 3805 713
+> 15 0 24 3794 topology 3805 714
+> 16 0 24 3794 topology 3916 714
+> 15 0 23 3794 topology 3816 715
+> 16 0 23 3794 topology 3817 715
+> 15 0 24 3794 topology 3817 716
+> 16 0 24 3794 topology 3916 716
+> 15 0 23 3794 topology 3828 717
+> 16 0 23 3794 topology 3829 717
+> 15 0 24 3794 topology 3829 718
+> 16 0 24 3794 topology 3916 718
+> 15 0 23 3794 topology 3858 719
+> 16 0 23 3794 topology 3859 719
+> 15 0 24 3794 topology 3859 720
+> 16 0 24 3794 topology 3916 720
+> 15 0 23 3794 topology 3888 721
+> 16 0 23 3794 topology 3889 721
+> 15 0 24 3794 topology 3889 722
+> 16 0 24 3794 topology 3916 722
+> 15 0 23 3794 topology 3840 723
+> 16 0 23 3794 topology 3841 723
+> 15 0 24 3794 topology 3841 724
+> 16 0 24 3794 topology 3916 724
+> 15 0 23 3794 topology 3870 725
+> 16 0 23 3794 topology 3871 725
+> 15 0 24 3794 topology 3871 726
+> 16 0 24 3794 topology 3916 726
+> 15 0 23 3794 topology 3900 727
+> 16 0 23 3794 topology 3901 727
+> 15 0 24 3794 topology 3901 728
+> 16 0 24 3794 topology 3916 728
+> 15 0 23 3416 topology 3462 729
+> 16 0 23 3416 topology 3463 729
+> 15 0 24 3416 topology 3463 730
+> 16 0 24 3416 topology 3610 730
+> 15 0 24 3416 topology 3610 731
+> 16 0 24 3416 topology 3572 731
+> 15 0 25 3416 topology 3572 732
+> 16 0 25 3416 topology 3570 732
+> 15 0 24 3416 topology 3610 733
+> 16 0 24 3416 topology 3494 733
+> 15 0 25 3416 topology 3494 734
+> 16 0 25 3416 topology 3492 734
+> 15 0 24 3416 topology 3610 735
+> 16 0 24 3416 topology 3602 735
+> 15 0 25 3416 topology 3602 736
+> 16 0 25 3416 topology 3600 736
+> 15 0 24 3416 topology 3610 737
+> 16 0 24 3416 topology 3524 737
+> 15 0 25 3416 topology 3524 738
+> 16 0 25 3416 topology 3522 738
+> 15 0 24 3416 topology 3610 739
+> 16 0 24 3416 topology 3554 739
+> 15 0 25 3416 topology 3554 740
+> 16 0 25 3416 topology 3552 740
+> 15 0 24 3416 topology 3610 741
+> 16 0 24 3416 topology 3584 741
+> 15 0 25 3416 topology 3584 742
+> 16 0 25 3416 topology 3582 742
+> 15 0 24 3416 topology 3610 743
+> 16 0 24 3416 topology 3425 743
+> 15 0 25 3416 topology 3425 744
+> 16 0 25 3416 topology 3423 744
+> 15 0 24 3416 topology 3610 745
+> 16 0 24 3416 topology 3437 745
+> 15 0 25 3416 topology 3437 746
+> 16 0 25 3416 topology 3435 746
+> 15 0 24 3416 topology 3610 747
+> 16 0 24 3416 topology 3449 747
+> 15 0 25 3416 topology 3449 748
+> 16 0 25 3416 topology 3447 748
+> 15 0 24 3416 topology 3610 749
+> 16 0 24 3416 topology 3479 749
+> 15 0 25 3416 topology 3479 750
+> 16 0 25 3416 topology 3477 750
+> 15 0 24 3416 topology 3610 751
+> 16 0 24 3416 topology 3509 751
+> 15 0 25 3416 topology 3509 752
+> 16 0 25 3416 topology 3507 752
+> 15 0 24 3416 topology 3610 753
+> 16 0 24 3416 topology 3539 753
+> 15 0 25 3416 topology 3539 754
+> 16 0 25 3416 topology 3537 754
+> 15 0 24 3416 topology 3610 755
+> 16 0 24 3416 topology 3461 755
+> 15 0 25 3416 topology 3461 756
+> 16 0 25 3416 topology 3459 756
+> 15 0 24 3416 topology 3610 757
+> 16 0 24 3416 topology 3569 757
+> 15 0 25 3416 topology 3569 758
+> 16 0 25 3416 topology 3567 758
+> 15 0 24 3416 topology 3610 759
+> 16 0 24 3416 topology 3491 759
+> 15 0 25 3416 topology 3491 760
+> 16 0 25 3416 topology 3489 760
+> 15 0 24 3416 topology 3610 761
+> 16 0 24 3416 topology 3599 761
+> 15 0 25 3416 topology 3599 762
+> 16 0 25 3416 topology 3597 762
+> 15 0 24 3416 topology 3610 763
+> 16 0 24 3416 topology 3521 763
+> 15 0 25 3416 topology 3521 764
+> 16 0 25 3416 topology 3519 764
+> 15 0 24 3416 topology 3610 765
+> 16 0 24 3416 topology 3551 765
+> 15 0 25 3416 topology 3551 766
+> 16 0 25 3416 topology 3549 766
+> 15 0 24 3416 topology 3610 767
+> 16 0 24 3416 topology 3473 767
+> 15 0 25 3416 topology 3473 768
+> 16 0 25 3416 topology 3471 768
+> 15 0 24 3416 topology 3610 769
+> 16 0 24 3416 topology 3581 769
+> 15 0 25 3416 topology 3581 770
+> 16 0 25 3416 topology 3579 770
+> 15 0 24 3416 topology 3610 771
+> 16 0 24 3416 topology 3503 771
+> 15 0 25 3416 topology 3503 772
+> 16 0 25 3416 topology 3501 772
+> 15 0 24 3416 topology 3610 773
+> 16 0 24 3416 topology 3533 773
+> 15 0 25 3416 topology 3533 774
+> 16 0 25 3416 topology 3531 774
+> 15 0 24 3416 topology 3610 775
+> 16 0 24 3416 topology 3563 775
+> 15 0 25 3416 topology 3563 776
+> 16 0 25 3416 topology 3561 776
+> 15 0 24 3416 topology 3610 777
+> 16 0 24 3416 topology 3593 777
+> 15 0 25 3416 topology 3593 778
+> 16 0 25 3416 topology 3591 778
+> 15 0 24 3416 topology 3610 779
+> 16 0 24 3416 topology 3422 779
+> 15 0 25 3416 topology 3422 780
+> 16 0 25 3416 topology 3420 780
+> 15 0 24 3416 topology 3610 781
+> 16 0 24 3416 topology 3434 781
+> 15 0 25 3416 topology 3434 782
+> 16 0 25 3416 topology 3432 782
+> 15 0 24 3416 topology 3610 783
+> 16 0 24 3416 topology 3446 783
+> 15 0 25 3416 topology 3446 784
+> 16 0 25 3416 topology 3444 784
+> 15 0 24 3416 topology 3610 785
+> 16 0 24 3416 topology 3476 785
+> 15 0 25 3416 topology 3476 786
+> 16 0 25 3416 topology 3474 786
+> 15 0 26 3416 topology 3610 787
+> 16 0 26 3416 topology 3609 787
+> 15 0 24 3416 topology 3610 788
+> 16 0 24 3416 topology 3506 788
+> 15 0 25 3416 topology 3506 789
+> 16 0 25 3416 topology 3504 789
+> 15 0 24 3416 topology 3610 790
+> 16 0 24 3416 topology 3536 790
+> 15 0 25 3416 topology 3536 791
+> 16 0 25 3416 topology 3534 791
+> 15 0 24 3416 topology 3610 792
+> 16 0 24 3416 topology 3458 792
+> 15 0 25 3416 topology 3458 793
+> 16 0 25 3416 topology 3456 793
+> 15 0 24 3416 topology 3610 794
+> 16 0 24 3416 topology 3566 794
+> 15 0 25 3416 topology 3566 795
+> 16 0 25 3416 topology 3564 795
+> 15 0 24 3416 topology 3610 796
+> 16 0 24 3416 topology 3488 796
+> 15 0 25 3416 topology 3488 797
+> 16 0 25 3416 topology 3486 797
+> 15 0 24 3416 topology 3610 798
+> 16 0 24 3416 topology 3596 798
+> 15 0 25 3416 topology 3596 799
+> 16 0 25 3416 topology 3594 799
+> 15 0 24 3416 topology 3610 800
+> 16 0 24 3416 topology 3518 800
+> 15 0 25 3416 topology 3518 801
+> 16 0 25 3416 topology 3516 801
+> 15 0 24 3416 topology 3610 802
+> 16 0 24 3416 topology 3548 802
+> 15 0 25 3416 topology 3548 803
+> 16 0 25 3416 topology 3546 803
+> 15 0 24 3416 topology 3610 804
+> 16 0 24 3416 topology 3470 804
+> 15 0 25 3416 topology 3470 805
+> 16 0 25 3416 topology 3468 805
+> 15 0 24 3416 topology 3610 806
+> 16 0 24 3416 topology 3578 806
+> 15 0 25 3416 topology 3578 807
+> 16 0 25 3416 topology 3576 807
+> 15 0 24 3416 topology 3610 808
+> 16 0 24 3416 topology 3500 808
+> 15 0 25 3416 topology 3500 809
+> 16 0 25 3416 topology 3498 809
+> 15 0 24 3416 topology 3610 810
+> 16 0 24 3416 topology 3608 810
+> 15 0 25 3416 topology 3608 811
+> 16 0 25 3416 topology 3606 811
+> 15 0 24 3416 topology 3610 812
+> 16 0 24 3416 topology 3530 812
+> 15 0 25 3416 topology 3530 813
+> 16 0 25 3416 topology 3528 813
+> 15 0 24 3416 topology 3610 814
+> 16 0 24 3416 topology 3560 814
+> 15 0 25 3416 topology 3560 815
+> 16 0 25 3416 topology 3558 815
+> 15 0 24 3416 topology 3610 816
+> 16 0 24 3416 topology 3590 816
+> 15 0 25 3416 topology 3590 817
+> 16 0 25 3416 topology 3588 817
+> 15 0 24 3416 topology 3610 818
+> 16 0 24 3416 topology 3419 818
+> 15 0 25 3416 topology 3419 819
+> 16 0 25 3416 topology 3417 819
+> 15 0 24 3416 topology 3610 820
+> 16 0 24 3416 topology 3431 820
+> 15 0 25 3416 topology 3431 821
+> 16 0 25 3416 topology 3429 821
+> 15 0 24 3416 topology 3610 822
+> 16 0 24 3416 topology 3443 822
+> 15 0 25 3416 topology 3443 823
+> 16 0 25 3416 topology 3441 823
+> 15 0 24 3416 topology 3610 824
+> 16 0 24 3416 topology 3455 824
+> 15 0 25 3416 topology 3455 825
+> 16 0 25 3416 topology 3453 825
+> 15 0 24 3416 topology 3610 826
+> 16 0 24 3416 topology 3485 826
+> 15 0 25 3416 topology 3485 827
+> 16 0 25 3416 topology 3483 827
+> 15 0 24 3416 topology 3610 828
+> 16 0 24 3416 topology 3515 828
+> 15 0 25 3416 topology 3515 829
+> 16 0 25 3416 topology 3513 829
+> 15 0 24 3416 topology 3610 830
+> 16 0 24 3416 topology 3545 830
+> 15 0 25 3416 topology 3545 831
+> 16 0 25 3416 topology 3543 831
+> 15 0 24 3416 topology 3610 832
+> 16 0 24 3416 topology 3467 832
+> 15 0 25 3416 topology 3467 833
+> 16 0 25 3416 topology 3465 833
+> 15 0 24 3416 topology 3610 834
+> 16 0 24 3416 topology 3575 834
+> 15 0 25 3416 topology 3575 835
+> 16 0 25 3416 topology 3573 835
+> 15 0 24 3416 topology 3610 836
+> 16 0 24 3416 topology 3497 836
+> 15 0 25 3416 topology 3497 837
+> 16 0 25 3416 topology 3495 837
+> 15 0 24 3416 topology 3610 838
+> 16 0 24 3416 topology 3605 838
+> 15 0 25 3416 topology 3605 839
+> 16 0 25 3416 topology 3603 839
+> 15 0 24 3416 topology 3610 840
+> 16 0 24 3416 topology 3527 840
+> 15 0 25 3416 topology 3527 841
+> 16 0 25 3416 topology 3525 841
+> 15 0 24 3416 topology 3610 842
+> 16 0 24 3416 topology 3557 842
+> 15 0 25 3416 topology 3557 843
+> 16 0 25 3416 topology 3555 843
+> 15 0 24 3416 topology 3610 844
+> 16 0 24 3416 topology 3587 844
+> 15 0 25 3416 topology 3587 845
+> 16 0 25 3416 topology 3585 845
+> 15 0 24 3416 topology 3610 846
+> 16 0 24 3416 topology 3428 846
+> 15 0 25 3416 topology 3428 847
+> 16 0 25 3416 topology 3426 847
+> 15 0 24 3416 topology 3610 848
+> 16 0 24 3416 topology 3440 848
+> 15 0 25 3416 topology 3440 849
+> 16 0 25 3416 topology 3438 849
+> 15 0 24 3416 topology 3610 850
+> 16 0 24 3416 topology 3452 850
+> 15 0 25 3416 topology 3452 851
+> 16 0 25 3416 topology 3450 851
+> 15 0 24 3416 topology 3610 852
+> 16 0 24 3416 topology 3482 852
+> 15 0 25 3416 topology 3482 853
+> 16 0 25 3416 topology 3480 853
+> 15 0 24 3416 topology 3610 854
+> 16 0 24 3416 topology 3512 854
+> 15 0 25 3416 topology 3512 855
+> 16 0 25 3416 topology 3510 855
+> 15 0 24 3416 topology 3610 856
+> 16 0 24 3416 topology 3542 856
+> 15 0 25 3416 topology 3542 857
+> 16 0 25 3416 topology 3540 857
+> 15 0 23 3416 topology 3570 858
+> 16 0 23 3416 topology 3571 858
+> 15 0 24 3416 topology 3571 859
+> 16 0 24 3416 topology 3610 859
+> 15 0 24 3416 topology 3610 860
+> 16 0 24 3416 topology 3464 860
+> 15 0 25 3416 topology 3464 861
+> 16 0 25 3416 topology 3462 861
+> 15 0 23 3416 topology 3492 862
+> 16 0 23 3416 topology 3493 862
+> 15 0 24 3416 topology 3493 863
+> 16 0 24 3416 topology 3610 863
+> 15 0 23 3416 topology 3600 864
+> 16 0 23 3416 topology 3601 864
+> 15 0 24 3416 topology 3601 865
+> 16 0 24 3416 topology 3610 865
+> 15 0 23 3416 topology 3522 866
+> 16 0 23 3416 topology 3523 866
+> 15 0 24 3416 topology 3523 867
+> 16 0 24 3416 topology 3610 867
+> 15 0 23 3416 topology 3552 868
+> 16 0 23 3416 topology 3553 868
+> 15 0 24 3416 topology 3553 869
+> 16 0 24 3416 topology 3610 869
+> 15 0 23 3416 topology 3582 870
+> 16 0 23 3416 topology 3583 870
+> 15 0 24 3416 topology 3583 871
+> 16 0 24 3416 topology 3610 871
+> 15 0 23 3416 topology 3423 872
+> 16 0 23 3416 topology 3424 872
+> 15 0 24 3416 topology 3424 873
+> 16 0 24 3416 topology 3610 873
+> 15 0 23 3416 topology 3435 874
+> 16 0 23 3416 topology 3436 874
+> 15 0 24 3416 topology 3436 875
+> 16 0 24 3416 topology 3610 875
+> 15 0 23 3416 topology 3447 876
+> 16 0 23 3416 topology 3448 876
+> 15 0 24 3416 topology 3448 877
+> 16 0 24 3416 topology 3610 877
+> 15 0 23 3416 topology 3477 878
+> 16 0 23 3416 topology 3478 878
+> 15 0 24 3416 topology 3478 879
+> 16 0 24 3416 topology 3610 879
+> 15 0 23 3416 topology 3507 880
+> 16 0 23 3416 topology 3508 880
+> 15 0 24 3416 topology 3508 881
+> 16 0 24 3416 topology 3610 881
+> 15 0 23 3416 topology 3537 882
+> 16 0 23 3416 topology 3538 882
+> 15 0 24 3416 topology 3538 883
+> 16 0 24 3416 topology 3610 883
+> 15 0 23 3416 topology 3459 884
+> 16 0 23 3416 topology 3460 884
+> 15 0 24 3416 topology 3460 885
+> 16 0 24 3416 topology 3610 885
+> 15 0 23 3416 topology 3567 886
+> 16 0 23 3416 topology 3568 886
+> 15 0 24 3416 topology 3568 887
+> 16 0 24 3416 topology 3610 887
+> 15 0 23 3416 topology 3489 888
+> 16 0 23 3416 topology 3490 888
+> 15 0 24 3416 topology 3490 889
+> 16 0 24 3416 topology 3610 889
+> 15 0 23 3416 topology 3597 890
+> 16 0 23 3416 topology 3598 890
+> 15 0 24 3416 topology 3598 891
+> 16 0 24 3416 topology 3610 891
+> 15 0 23 3416 topology 3519 892
+> 16 0 23 3416 topology 3520 892
+> 15 0 24 3416 topology 3520 893
+> 16 0 24 3416 topology 3610 893
+> 15 0 23 3416 topology 3549 894
+> 16 0 23 3416 topology 3550 894
+> 15 0 24 3416 topology 3550 895
+> 16 0 24 3416 topology 3610 895
+> 15 0 23 3416 topology 3471 896
+> 16 0 23 3416 topology 3472 896
+> 15 0 24 3416 topology 3472 897
+> 16 0 24 3416 topology 3610 897
+> 15 0 23 3416 topology 3579 898
+> 16 0 23 3416 topology 3580 898
+> 15 0 24 3416 topology 3580 899
+> 16 0 24 3416 topology 3610 899
+> 15 0 23 3416 topology 3501 900
+> 16 0 23 3416 topology 3502 900
+> 15 0 24 3416 topology 3502 901
+> 16 0 24 3416 topology 3610 901
+> 15 0 23 3416 topology 3531 902
+> 16 0 23 3416 topology 3532 902
+> 15 0 24 3416 topology 3532 903
+> 16 0 24 3416 topology 3610 903
+> 15 0 23 3416 topology 3561 904
+> 16 0 23 3416 topology 3562 904
+> 15 0 24 3416 topology 3562 905
+> 16 0 24 3416 topology 3610 905
+> 15 0 23 3416 topology 3591 906
+> 16 0 23 3416 topology 3592 906
+> 15 0 24 3416 topology 3592 907
+> 16 0 24 3416 topology 3610 907
+> 15 0 23 3416 topology 3420 908
+> 16 0 23 3416 topology 3421 908
+> 15 0 24 3416 topology 3421 909
+> 16 0 24 3416 topology 3610 909
+> 15 0 23 3416 topology 3432 910
+> 16 0 23 3416 topology 3433 910
+> 15 0 24 3416 topology 3433 911
+> 16 0 24 3416 topology 3610 911
+> 15 0 23 3416 topology 3444 912
+> 16 0 23 3416 topology 3445 912
+> 15 0 24 3416 topology 3445 913
+> 16 0 24 3416 topology 3610 913
+> 15 0 23 3416 topology 3474 914
+> 16 0 23 3416 topology 3475 914
+> 15 0 24 3416 topology 3475 915
+> 16 0 24 3416 topology 3610 915
+> 15 0 23 3416 topology 3504 916
+> 16 0 23 3416 topology 3505 916
+> 15 0 24 3416 topology 3505 917
+> 16 0 24 3416 topology 3610 917
+> 15 0 23 3416 topology 3534 918
+> 16 0 23 3416 topology 3535 918
+> 15 0 24 3416 topology 3535 919
+> 16 0 24 3416 topology 3610 919
+> 15 0 23 3416 topology 3456 920
+> 16 0 23 3416 topology 3457 920
+> 15 0 24 3416 topology 3457 921
+> 16 0 24 3416 topology 3610 921
+> 15 0 23 3416 topology 3564 922
+> 16 0 23 3416 topology 3565 922
+> 15 0 24 3416 topology 3565 923
+> 16 0 24 3416 topology 3610 923
+> 15 0 23 3416 topology 3486 924
+> 16 0 23 3416 topology 3487 924
+> 15 0 24 3416 topology 3487 925
+> 16 0 24 3416 topology 3610 925
+> 15 0 23 3416 topology 3594 926
+> 16 0 23 3416 topology 3595 926
+> 15 0 24 3416 topology 3595 927
+> 16 0 24 3416 topology 3610 927
+> 15 0 23 3416 topology 3516 928
+> 16 0 23 3416 topology 3517 928
+> 15 0 24 3416 topology 3517 929
+> 16 0 24 3416 topology 3610 929
+> 15 0 23 3416 topology 3546 930
+> 16 0 23 3416 topology 3547 930
+> 15 0 24 3416 topology 3547 931
+> 16 0 24 3416 topology 3610 931
+> 15 0 23 3416 topology 3468 932
+> 16 0 23 3416 topology 3469 932
+> 15 0 24 3416 topology 3469 933
+> 16 0 24 3416 topology 3610 933
+> 15 0 23 3416 topology 3576 934
+> 16 0 23 3416 topology 3577 934
+> 15 0 24 3416 topology 3577 935
+> 16 0 24 3416 topology 3610 935
+> 15 0 23 3416 topology 3498 936
+> 16 0 23 3416 topology 3499 936
+> 15 0 24 3416 topology 3499 937
+> 16 0 24 3416 topology 3610 937
+> 15 0 23 3416 topology 3606 938
+> 16 0 23 3416 topology 3607 938
+> 15 0 24 3416 topology 3607 939
+> 16 0 24 3416 topology 3610 939
+> 15 0 23 3416 topology 3528 940
+> 16 0 23 3416 topology 3529 940
+> 15 0 24 3416 topology 3529 941
+> 16 0 24 3416 topology 3610 941
+> 15 0 23 3416 topology 3558 942
+> 16 0 23 3416 topology 3559 942
+> 15 0 24 3416 topology 3559 943
+> 16 0 24 3416 topology 3610 943
+> 15 0 23 3416 topology 3588 944
+> 16 0 23 3416 topology 3589 944
+> 15 0 24 3416 topology 3589 945
+> 16 0 24 3416 topology 3610 945
+> 15 0 23 3416 topology 3417 946
+> 16 0 23 3416 topology 3418 946
+> 15 0 24 3416 topology 3418 947
+> 16 0 24 3416 topology 3610 947
+> 15 0 23 3416 topology 3429 948
+> 16 0 23 3416 topology 3430 948
+> 15 0 24 3416 topology 3430 949
+> 16 0 24 3416 topology 3610 949
+> 15 0 23 3416 topology 3441 950
+> 16 0 23 3416 topology 3442 950
+> 15 0 24 3416 topology 3442 951
+> 16 0 24 3416 topology 3610 951
+> 15 0 23 3416 topology 3453 952
+> 16 0 23 3416 topology 3454 952
+> 15 0 24 3416 topology 3454 953
+> 16 0 24 3416 topology 3610 953
+> 15 0 23 3416 topology 3483 954
+> 16 0 23 3416 topology 3484 954
+> 15 0 24 3416 topology 3484 955
+> 16 0 24 3416 topology 3610 955
+> 15 0 23 3416 topology 3513 956
+> 16 0 23 3416 topology 3514 956
+> 15 0 24 3416 topology 3514 957
+> 16 0 24 3416 topology 3610 957
+> 15 0 23 3416 topology 3543 958
+> 16 0 23 3416 topology 3544 958
+> 15 0 24 3416 topology 3544 959
+> 16 0 24 3416 topology 3610 959
+> 15 0 23 3416 topology 3465 960
+> 16 0 23 3416 topology 3466 960
+> 15 0 24 3416 topology 3466 961
+> 16 0 24 3416 topology 3610 961
+> 15 0 23 3416 topology 3573 962
+> 16 0 23 3416 topology 3574 962
+> 15 0 24 3416 topology 3574 963
+> 16 0 24 3416 topology 3610 963
+> 15 0 23 3416 topology 3495 964
+> 16 0 23 3416 topology 3496 964
+> 15 0 24 3416 topology 3496 965
+> 16 0 24 3416 topology 3610 965
+> 15 0 23 3416 topology 3603 966
+> 16 0 23 3416 topology 3604 966
+> 15 0 24 3416 topology 3604 967
+> 16 0 24 3416 topology 3610 967
+> 15 0 23 3416 topology 3525 968
+> 16 0 23 3416 topology 3526 968
+> 15 0 24 3416 topology 3526 969
+> 16 0 24 3416 topology 3610 969
+> 15 0 23 3416 topology 3555 970
+> 16 0 23 3416 topology 3556 970
+> 15 0 24 3416 topology 3556 971
+> 16 0 24 3416 topology 3610 971
+> 15 0 23 3416 topology 3585 972
+> 16 0 23 3416 topology 3586 972
+> 15 0 24 3416 topology 3586 973
+> 16 0 24 3416 topology 3610 973
+> 15 0 23 3416 topology 3426 974
+> 16 0 23 3416 topology 3427 974
+> 15 0 24 3416 topology 3427 975
+> 16 0 24 3416 topology 3610 975
+> 15 0 23 3416 topology 3438 976
+> 16 0 23 3416 topology 3439 976
+> 15 0 24 3416 topology 3439 977
+> 16 0 24 3416 topology 3610 977
+> 15 0 23 3416 topology 3450 978
+> 16 0 23 3416 topology 3451 978
+> 15 0 24 3416 topology 3451 979
+> 16 0 24 3416 topology 3610 979
+> 15 0 23 3416 topology 3480 980
+> 16 0 23 3416 topology 3481 980
+> 15 0 24 3416 topology 3481 981
+> 16 0 24 3416 topology 3610 981
+> 15 0 23 3416 topology 3510 982
+> 16 0 23 3416 topology 3511 982
+> 15 0 24 3416 topology 3511 983
+> 16 0 24 3416 topology 3610 983
+> 15 0 23 3416 topology 3540 984
+> 16 0 23 3416 topology 3541 984
+> 15 0 24 3416 topology 3541 985
+> 16 0 24 3416 topology 3610 985
+> 15 0 23 3612 topology 3640 986
+> 16 0 23 3612 topology 3641 986
+> 15 0 24 3612 topology 3641 987
+> 16 0 24 3612 topology 3713 987
+> 15 0 24 3612 topology 3713 988
+> 16 0 24 3612 topology 3672 988
+> 15 0 25 3612 topology 3672 989
+> 16 0 25 3612 topology 3670 989
+> 15 0 24 3612 topology 3713 990
+> 16 0 24 3612 topology 3702 990
+> 15 0 25 3612 topology 3702 991
+> 16 0 25 3612 topology 3700 991
+> 15 0 24 3612 topology 3713 992
+> 16 0 24 3612 topology 3654 992
+> 15 0 25 3612 topology 3654 993
+> 16 0 25 3612 topology 3652 993
+> 15 0 24 3612 topology 3713 994
+> 16 0 24 3612 topology 3684 994
+> 15 0 25 3612 topology 3684 995
+> 16 0 25 3612 topology 3682 995
+> 15 0 24 3612 topology 3713 996
+> 16 0 24 3612 topology 3666 996
+> 15 0 25 3612 topology 3666 997
+> 16 0 25 3612 topology 3664 997
+> 15 0 24 3612 topology 3713 998
+> 16 0 24 3612 topology 3696 998
+> 15 0 25 3612 topology 3696 999
+> 16 0 25 3612 topology 3694 999
+> 15 0 24 3612 topology 3713 1000
+> 16 0 24 3612 topology 3615 1000
+> 15 0 25 3612 topology 3615 1001
+> 16 0 25 3612 topology 3613 1001
+> 15 0 24 3612 topology 3713 1002
+> 16 0 24 3612 topology 3627 1002
+> 15 0 25 3612 topology 3627 1003
+> 16 0 25 3612 topology 3625 1003
+> 15 0 24 3612 topology 3713 1004
+> 16 0 24 3612 topology 3639 1004
+> 15 0 25 3612 topology 3639 1005
+> 16 0 25 3612 topology 3637 1005
+> 15 0 24 3612 topology 3713 1006
+> 16 0 24 3612 topology 3651 1006
+> 15 0 25 3612 topology 3651 1007
+> 16 0 25 3612 topology 3649 1007
+> 15 0 24 3612 topology 3713 1008
+> 16 0 24 3612 topology 3681 1008
+> 15 0 25 3612 topology 3681 1009
+> 16 0 25 3612 topology 3679 1009
+> 15 0 24 3612 topology 3713 1010
+> 16 0 24 3612 topology 3711 1010
+> 15 0 25 3612 topology 3711 1011
+> 16 0 25 3612 topology 3709 1011
+> 15 0 24 3612 topology 3713 1012
+> 16 0 24 3612 topology 3663 1012
+> 15 0 25 3612 topology 3663 1013
+> 16 0 25 3612 topology 3661 1013
+> 15 0 24 3612 topology 3713 1014
+> 16 0 24 3612 topology 3693 1014
+> 15 0 25 3612 topology 3693 1015
+> 16 0 25 3612 topology 3691 1015
+> 15 0 26 3612 topology 3713 1016
+> 16 0 26 3612 topology 3712 1016
+> 15 0 24 3612 topology 3713 1017
+> 16 0 24 3612 topology 3624 1017
+> 15 0 25 3612 topology 3624 1018
+> 16 0 25 3612 topology 3622 1018
+> 15 0 24 3612 topology 3713 1019
+> 16 0 24 3612 topology 3636 1019
+> 15 0 25 3612 topology 3636 1020
+> 16 0 25 3612 topology 3634 1020
+> 15 0 24 3612 topology 3713 1021
+> 16 0 24 3612 topology 3648 1021
+> 15 0 25 3612 topology 3648 1022
+> 16 0 25 3612 topology 3646 1022
+> 15 0 24 3612 topology 3713 1023
+> 16 0 24 3612 topology 3678 1023
+> 15 0 25 3612 topology 3678 1024
+> 16 0 25 3612 topology 3676 1024
+> 15 0 24 3612 topology 3713 1025
+> 16 0 24 3612 topology 3708 1025
+> 15 0 25 3612 topology 3708 1026
+> 16 0 25 3612 topology 3706 1026
+> 15 0 24 3612 topology 3713 1027
+> 16 0 24 3612 topology 3660 1027
+> 15 0 25 3612 topology 3660 1028
+> 16 0 25 3612 topology 3658 1028
+> 15 0 24 3612 topology 3713 1029
+> 16 0 24 3612 topology 3690 1029
+> 15 0 25 3612 topology 3690 1030
+> 16 0 25 3612 topology 3688 1030
+> 15 0 24 3612 topology 3713 1031
+> 16 0 24 3612 topology 3621 1031
+> 15 0 25 3612 topology 3621 1032
+> 16 0 25 3612 topology 3619 1032
+> 15 0 24 3612 topology 3713 1033
+> 16 0 24 3612 topology 3633 1033
+> 15 0 25 3612 topology 3633 1034
+> 16 0 25 3612 topology 3631 1034
+> 15 0 24 3612 topology 3713 1035
+> 16 0 24 3612 topology 3645 1035
+> 15 0 25 3612 topology 3645 1036
+> 16 0 25 3612 topology 3643 1036
+> 15 0 24 3612 topology 3713 1037
+> 16 0 24 3612 topology 3675 1037
+> 15 0 25 3612 topology 3675 1038
+> 16 0 25 3612 topology 3673 1038
+> 15 0 24 3612 topology 3713 1039
+> 16 0 24 3612 topology 3705 1039
+> 15 0 25 3612 topology 3705 1040
+> 16 0 25 3612 topology 3703 1040
+> 15 0 24 3612 topology 3713 1041
+> 16 0 24 3612 topology 3657 1041
+> 15 0 25 3612 topology 3657 1042
+> 16 0 25 3612 topology 3655 1042
+> 15 0 24 3612 topology 3713 1043
+> 16 0 24 3612 topology 3687 1043
+> 15 0 25 3612 topology 3687 1044
+> 16 0 25 3612 topology 3685 1044
+> 15 0 24 3612 topology 3713 1045
+> 16 0 24 3612 topology 3669 1045
+> 15 0 25 3612 topology 3669 1046
+> 16 0 25 3612 topology 3667 1046
+> 15 0 24 3612 topology 3713 1047
+> 16 0 24 3612 topology 3699 1047
+> 15 0 25 3612 topology 3699 1048
+> 16 0 25 3612 topology 3697 1048
+> 15 0 24 3612 topology 3713 1049
+> 16 0 24 3612 topology 3618 1049
+> 15 0 25 3612 topology 3618 1050
+> 16 0 25 3612 topology 3616 1050
+> 15 0 24 3612 topology 3713 1051
+> 16 0 24 3612 topology 3630 1051
+> 15 0 25 3612 topology 3630 1052
+> 16 0 25 3612 topology 3628 1052
+> 15 0 23 3612 topology 3670 1053
+> 16 0 23 3612 topology 3671 1053
+> 15 0 24 3612 topology 3671 1054
+> 16 0 24 3612 topology 3713 1054
+> 15 0 24 3612 topology 3713 1055
+> 16 0 24 3612 topology 3642 1055
+> 15 0 25 3612 topology 3642 1056
+> 16 0 25 3612 topology 3640 1056
+> 15 0 23 3612 topology 3700 1057
+> 16 0 23 3612 topology 3701 1057
+> 15 0 24 3612 topology 3701 1058
+> 16 0 24 3612 topology 3713 1058
+> 15 0 23 3612 topology 3652 1059
+> 16 0 23 3612 topology 3653 1059
+> 15 0 24 3612 topology 3653 1060
+> 16 0 24 3612 topology 3713 1060
+> 15 0 23 3612 topology 3682 1061
+> 16 0 23 3612 topology 3683 1061
+> 15 0 24 3612 topology 3683 1062
+> 16 0 24 3612 topology 3713 1062
+> 15 0 23 3612 topology 3664 1063
+> 16 0 23 3612 topology 3665 1063
+> 15 0 24 3612 topology 3665 1064
+> 16 0 24 3612 topology 3713 1064
+> 15 0 23 3612 topology 3694 1065
+> 16 0 23 3612 topology 3695 1065
+> 15 0 24 3612 topology 3695 1066
+> 16 0 24 3612 topology 3713 1066
+> 15 0 23 3612 topology 3613 1067
+> 16 0 23 3612 topology 3614 1067
+> 15 0 24 3612 topology 3614 1068
+> 16 0 24 3612 topology 3713 1068
+> 15 0 23 3612 topology 3625 1069
+> 16 0 23 3612 topology 3626 1069
+> 15 0 24 3612 topology 3626 1070
+> 16 0 24 3612 topology 3713 1070
+> 15 0 23 3612 topology 3637 1071
+> 16 0 23 3612 topology 3638 1071
+> 15 0 24 3612 topology 3638 1072
+> 16 0 24 3612 topology 3713 1072
+> 15 0 23 3612 topology 3649 1073
+> 16 0 23 3612 topology 3650 1073
+> 15 0 24 3612 topology 3650 1074
+> 16 0 24 3612 topology 3713 1074
+> 15 0 23 3612 topology 3679 1075
+> 16 0 23 3612 topology 3680 1075
+> 15 0 24 3612 topology 3680 1076
+> 16 0 24 3612 topology 3713 1076
+> 15 0 23 3612 topology 3709 1077
+> 16 0 23 3612 topology 3710 1077
+> 15 0 24 3612 topology 3710 1078
+> 16 0 24 3612 topology 3713 1078
+> 15 0 23 3612 topology 3661 1079
+> 16 0 23 3612 topology 3662 1079
+> 15 0 24 3612 topology 3662 1080
+> 16 0 24 3612 topology 3713 1080
+> 15 0 23 3612 topology 3691 1081
+> 16 0 23 3612 topology 3692 1081
+> 15 0 24 3612 topology 3692 1082
+> 16 0 24 3612 topology 3713 1082
+> 15 0 23 3612 topology 3622 1083
+> 16 0 23 3612 topology 3623 1083
+> 15 0 24 3612 topology 3623 1084
+> 16 0 24 3612 topology 3713 1084
+> 15 0 23 3612 topology 3634 1085
+> 16 0 23 3612 topology 3635 1085
+> 15 0 24 3612 topology 3635 1086
+> 16 0 24 3612 topology 3713 1086
+> 15 0 23 3612 topology 3646 1087
+> 16 0 23 3612 topology 3647 1087
+> 15 0 24 3612 topology 3647 1088
+> 16 0 24 3612 topology 3713 1088
+> 15 0 23 3612 topology 3676 1089
+> 16 0 23 3612 topology 3677 1089
+> 15 0 24 3612 topology 3677 1090
+> 16 0 24 3612 topology 3713 1090
+> 15 0 23 3612 topology 3706 1091
+> 16 0 23 3612 topology 3707 1091
+> 15 0 24 3612 topology 3707 1092
+> 16 0 24 3612 topology 3713 1092
+> 15 0 23 3612 topology 3658 1093
+> 16 0 23 3612 topology 3659 1093
+> 15 0 24 3612 topology 3659 1094
+> 16 0 24 3612 topology 3713 1094
+> 15 0 23 3612 topology 3688 1095
+> 16 0 23 3612 topology 3689 1095
+> 15 0 24 3612 topology 3689 1096
+> 16 0 24 3612 topology 3713 1096
+> 15 0 23 3612 topology 3619 1097
+> 16 0 23 3612 topology 3620 1097
+> 15 0 24 3612 topology 3620 1098
+> 16 0 24 3612 topology 3713 1098
+> 15 0 23 3612 topology 3631 1099
+> 16 0 23 3612 topology 3632 1099
+> 15 0 24 3612 topology 3632 1100
+> 16 0 24 3612 topology 3713 1100
+> 15 0 23 3612 topology 3643 1101
+> 16 0 23 3612 topology 3644 1101
+> 15 0 24 3612 topology 3644 1102
+> 16 0 24 3612 topology 3713 1102
+> 15 0 23 3612 topology 3673 1103
+> 16 0 23 3612 topology 3674 1103
+> 15 0 24 3612 topology 3674 1104
+> 16 0 24 3612 topology 3713 1104
+> 15 0 23 3612 topology 3703 1105
+> 16 0 23 3612 topology 3704 1105
+> 15 0 24 3612 topology 3704 1106
+> 16 0 24 3612 topology 3713 1106
+> 15 0 23 3612 topology 3655 1107
+> 16 0 23 3612 topology 3656 1107
+> 15 0 24 3612 topology 3656 1108
+> 16 0 24 3612 topology 3713 1108
+> 15 0 23 3612 topology 3685 1109
+> 16 0 23 3612 topology 3686 1109
+> 15 0 24 3612 topology 3686 1110
+> 16 0 24 3612 topology 3713 1110
+> 15 0 23 3612 topology 3667 1111
+> 16 0 23 3612 topology 3668 1111
+> 15 0 24 3612 topology 3668 1112
+> 16 0 24 3612 topology 3713 1112
+> 15 0 23 3612 topology 3697 1113
+> 16 0 23 3612 topology 3698 1113
+> 15 0 24 3612 topology 3698 1114
+> 16 0 24 3612 topology 3713 1114
+> 15 0 23 3612 topology 3616 1115
+> 16 0 23 3612 topology 3617 1115
+> 15 0 24 3612 topology 3617 1116
+> 16 0 24 3612 topology 3713 1116
+> 15 0 23 3612 topology 3628 1117
+> 16 0 23 3612 topology 3629 1117
+> 15 0 24 3612 topology 3629 1118
+> 16 0 24 3612 topology 3713 1118
+> 15 0 23 3715 topology 3725 1119
+> 16 0 23 3715 topology 3726 1119
+> 15 0 24 3715 topology 3726 1120
+> 16 0 24 3715 topology 3792 1120
+> 15 0 24 3715 topology 3792 1121
+> 16 0 24 3715 topology 3739 1121
+> 15 0 25 3715 topology 3739 1122
+> 16 0 25 3715 topology 3737 1122
+> 15 0 24 3715 topology 3792 1123
+> 16 0 24 3715 topology 3748 1123
+> 15 0 25 3715 topology 3748 1124
+> 16 0 25 3715 topology 3746 1124
+> 15 0 24 3715 topology 3792 1125
+> 16 0 24 3715 topology 3778 1125
+> 15 0 25 3715 topology 3778 1126
+> 16 0 25 3715 topology 3776 1126
+> 15 0 24 3715 topology 3792 1127
+> 16 0 24 3715 topology 3760 1127
+> 15 0 25 3715 topology 3760 1128
+> 16 0 25 3715 topology 3758 1128
+> 15 0 24 3715 topology 3792 1129
+> 16 0 24 3715 topology 3790 1129
+> 15 0 25 3715 topology 3790 1130
+> 16 0 25 3715 topology 3788 1130
+> 15 0 24 3715 topology 3792 1131
+> 16 0 24 3715 topology 3772 1131
+> 15 0 25 3715 topology 3772 1132
+> 16 0 25 3715 topology 3770 1132
+> 15 0 24 3715 topology 3792 1133
+> 16 0 24 3715 topology 3724 1133
+> 15 0 25 3715 topology 3724 1134
+> 16 0 25 3715 topology 3722 1134
+> 15 0 24 3715 topology 3792 1135
+> 16 0 24 3715 topology 3736 1135
+> 15 0 25 3715 topology 3736 1136
+> 16 0 25 3715 topology 3734 1136
+> 15 0 26 3715 topology 3792 1137
+> 16 0 26 3715 topology 3791 1137
+> 15 0 24 3715 topology 3792 1138
+> 16 0 24 3715 topology 3745 1138
+> 15 0 25 3715 topology 3745 1139
+> 16 0 25 3715 topology 3743 1139
+> 15 0 24 3715 topology 3792 1140
+> 16 0 24 3715 topology 3775 1140
+> 15 0 25 3715 topology 3775 1141
+> 16 0 25 3715 topology 3773 1141
+> 15 0 24 3715 topology 3792 1142
+> 16 0 24 3715 topology 3757 1142
+> 15 0 25 3715 topology 3757 1143
+> 16 0 25 3715 topology 3755 1143
+> 15 0 24 3715 topology 3792 1144
+> 16 0 24 3715 topology 3787 1144
+> 15 0 25 3715 topology 3787 1145
+> 16 0 25 3715 topology 3785 1145
+> 15 0 24 3715 topology 3792 1146
+> 16 0 24 3715 topology 3769 1146
+> 15 0 25 3715 topology 3769 1147
+> 16 0 25 3715 topology 3767 1147
+> 15 0 24 3715 topology 3792 1148
+> 16 0 24 3715 topology 3721 1148
+> 15 0 25 3715 topology 3721 1149
+> 16 0 25 3715 topology 3719 1149
+> 15 0 24 3715 topology 3792 1150
+> 16 0 24 3715 topology 3733 1150
+> 15 0 25 3715 topology 3733 1151
+> 16 0 25 3715 topology 3731 1151
+> 15 0 24 3715 topology 3792 1152
+> 16 0 24 3715 topology 3754 1152
+> 15 0 25 3715 topology 3754 1153
+> 16 0 25 3715 topology 3752 1153
+> 15 0 24 3715 topology 3792 1154
+> 16 0 24 3715 topology 3784 1154
+> 15 0 25 3715 topology 3784 1155
+> 16 0 25 3715 topology 3782 1155
+> 15 0 24 3715 topology 3792 1156
+> 16 0 24 3715 topology 3766 1156
+> 15 0 25 3715 topology 3766 1157
+> 16 0 25 3715 topology 3764 1157
+> 15 0 24 3715 topology 3792 1158
+> 16 0 24 3715 topology 3718 1158
+> 15 0 25 3715 topology 3718 1159
+> 16 0 25 3715 topology 3716 1159
+> 15 0 24 3715 topology 3792 1160
+> 16 0 24 3715 topology 3730 1160
+> 15 0 25 3715 topology 3730 1161
+> 16 0 25 3715 topology 3728 1161
+> 15 0 24 3715 topology 3792 1162
+> 16 0 24 3715 topology 3742 1162
+> 15 0 25 3715 topology 3742 1163
+> 16 0 25 3715 topology 3740 1163
+> 15 0 24 3715 topology 3792 1164
+> 16 0 24 3715 topology 3751 1164
+> 15 0 25 3715 topology 3751 1165
+> 16 0 25 3715 topology 3749 1165
+> 15 0 24 3715 topology 3792 1166
+> 16 0 24 3715 topology 3781 1166
+> 15 0 25 3715 topology 3781 1167
+> 16 0 25 3715 topology 3779 1167
+> 15 0 24 3715 topology 3792 1168
+> 16 0 24 3715 topology 3763 1168
+> 15 0 25 3715 topology 3763 1169
+> 16 0 25 3715 topology 3761 1169
+> 15 0 23 3715 topology 3737 1170
+> 16 0 23 3715 topology 3738 1170
+> 15 0 24 3715 topology 3738 1171
+> 16 0 24 3715 topology 3792 1171
+> 15 0 24 3715 topology 3792 1172
+> 16 0 24 3715 topology 3727 1172
+> 15 0 25 3715 topology 3727 1173
+> 16 0 25 3715 topology 3725 1173
+> 15 0 23 3715 topology 3746 1174
+> 16 0 23 3715 topology 3747 1174
+> 15 0 24 3715 topology 3747 1175
+> 16 0 24 3715 topology 3792 1175
+> 15 0 23 3715 topology 3776 1176
+> 16 0 23 3715 topology 3777 1176
+> 15 0 24 3715 topology 3777 1177
+> 16 0 24 3715 topology 3792 1177
+> 15 0 23 3715 topology 3758 1178
+> 16 0 23 3715 topology 3759 1178
+> 15 0 24 3715 topology 3759 1179
+> 16 0 24 3715 topology 3792 1179
+> 15 0 23 3715 topology 3788 1180
+> 16 0 23 3715 topology 3789 1180
+> 15 0 24 3715 topology 3789 1181
+> 16 0 24 3715 topology 3792 1181
+> 15 0 23 3715 topology 3770 1182
+> 16 0 23 3715 topology 3771 1182
+> 15 0 24 3715 topology 3771 1183
+> 16 0 24 3715 topology 3792 1183
+> 15 0 23 3715 topology 3722 1184
+> 16 0 23 3715 topology 3723 1184
+> 15 0 24 3715 topology 3723 1185
+> 16 0 24 3715 topology 3792 1185
+> 15 0 23 3715 topology 3734 1186
+> 16 0 23 3715 topology 3735 1186
+> 15 0 24 3715 topology 3735 1187
+> 16 0 24 3715 topology 3792 1187
+> 15 0 23 3715 topology 3743 1188
+> 16 0 23 3715 topology 3744 1188
+> 15 0 24 3715 topology 3744 1189
+> 16 0 24 3715 topology 3792 1189
+> 15 0 23 3715 topology 3773 1190
+> 16 0 23 3715 topology 3774 1190
+> 15 0 24 3715 topology 3774 1191
+> 16 0 24 3715 topology 3792 1191
+> 15 0 23 3715 topology 3755 1192
+> 16 0 23 3715 topology 3756 1192
+> 15 0 24 3715 topology 3756 1193
+> 16 0 24 3715 topology 3792 1193
+> 15 0 23 3715 topology 3785 1194
+> 16 0 23 3715 topology 3786 1194
+> 15 0 24 3715 topology 3786 1195
+> 16 0 24 3715 topology 3792 1195
+> 15 0 23 3715 topology 3767 1196
+> 16 0 23 3715 topology 3768 1196
+> 15 0 24 3715 topology 3768 1197
+> 16 0 24 3715 topology 3792 1197
+> 15 0 23 3715 topology 3719 1198
+> 16 0 23 3715 topology 3720 1198
+> 15 0 24 3715 topology 3720 1199
+> 16 0 24 3715 topology 3792 1199
+> 15 0 23 3715 topology 3731 1200
+> 16 0 23 3715 topology 3732 1200
+> 15 0 24 3715 topology 3732 1201
+> 16 0 24 3715 topology 3792 1201
+> 15 0 23 3715 topology 3752 1202
+> 16 0 23 3715 topology 3753 1202
+> 15 0 24 3715 topology 3753 1203
+> 16 0 24 3715 topology 3792 1203
+> 15 0 23 3715 topology 3782 1204
+> 16 0 23 3715 topology 3783 1204
+> 15 0 24 3715 topology 3783 1205
+> 16 0 24 3715 topology 3792 1205
+> 15 0 23 3715 topology 3764 1206
+> 16 0 23 3715 topology 3765 1206
+> 15 0 24 3715 topology 3765 1207
+> 16 0 24 3715 topology 3792 1207
+> 15 0 23 3715 topology 3716 1208
+> 16 0 23 3715 topology 3717 1208
+> 15 0 24 3715 topology 3717 1209
+> 16 0 24 3715 topology 3792 1209
+> 15 0 23 3715 topology 3728 1210
+> 16 0 23 3715 topology 3729 1210
+> 15 0 24 3715 topology 3729 1211
+> 16 0 24 3715 topology 3792 1211
+> 15 0 23 3715 topology 3740 1212
+> 16 0 23 3715 topology 3741 1212
+> 15 0 24 3715 topology 3741 1213
+> 16 0 24 3715 topology 3792 1213
+> 15 0 23 3715 topology 3749 1214
+> 16 0 23 3715 topology 3750 1214
+> 15 0 24 3715 topology 3750 1215
+> 16 0 24 3715 topology 3792 1215
+> 15 0 23 3715 topology 3779 1216
+> 16 0 23 3715 topology 3780 1216
+> 15 0 24 3715 topology 3780 1217
+> 16 0 24 3715 topology 3792 1217
+> 15 0 23 3715 topology 3761 1218
+> 16 0 23 3715 topology 3762 1218
+> 15 0 24 3715 topology 3762 1219
+> 16 0 24 3715 topology 3792 1219
+> 15 0 27 3415 topology 3919 1220
+> 16 0 27 3415 topology 3917 1220
+> 15 0 28 3415 topology 3917 1221
+> 16 0 28 3415 topology 3915 1221
+> 15 0 27 3415 topology 3919 1222
+> 16 0 27 3415 topology 3611 1222
+> 15 0 28 3415 topology 3611 1223
+> 16 0 28 3415 topology 3609 1223
+> 15 0 27 3415 topology 3919 1224
+> 16 0 27 3415 topology 3714 1224
+> 15 0 28 3415 topology 3714 1225
+> 16 0 28 3415 topology 3712 1225
+> 15 0 27 3415 topology 3919 1226
+> 16 0 27 3415 topology 3793 1226
+> 15 0 28 3415 topology 3793 1227
+> 16 0 28 3415 topology 3791 1227
+> 15 0 21 3415 topology 3917 1228
+> 16 0 21 3415 topology 3611 1228
+> 15 0 21 3415 topology 3917 1229
+> 16 0 21 3415 topology 3714 1229
+> 15 0 21 3415 topology 3917 1230
+> 16 0 21 3415 topology 3793 1230
+> 15 0 21 3415 topology 3611 1231
+> 16 0 21 3415 topology 3714 1231
+> 15 0 21 3415 topology 3611 1232
+> 16 0 21 3415 topology 3793 1232
+> 15 0 21 3415 topology 3714 1233
+> 16 0 21 3415 topology 3793 1233
+> 15 0 23 540 topology 628 1234
+> 16 0 23 540 topology 629 1234
+> 15 0 24 540 topology 629 1235
+> 16 0 24 540 topology 758 1235
+> 15 0 24 540 topology 758 1236
+> 16 0 24 540 topology 582 1236
+> 15 0 25 540 topology 582 1237
+> 16 0 25 540 topology 580 1237
+> 15 0 24 540 topology 758 1238
+> 16 0 24 540 topology 666 1238
+> 15 0 25 540 topology 666 1239
+> 16 0 25 540 topology 664 1239
+> 15 0 24 540 topology 758 1240
+> 16 0 24 540 topology 750 1240
+> 15 0 25 540 topology 750 1241
+> 16 0 25 540 topology 748 1241
+> 15 0 24 540 topology 758 1242
+> 16 0 24 540 topology 618 1242
+> 15 0 25 540 topology 618 1243
+> 16 0 25 540 topology 616 1243
+> 15 0 24 540 topology 758 1244
+> 16 0 24 540 topology 702 1244
+> 15 0 25 540 topology 702 1245
+> 16 0 25 540 topology 700 1245
+> 15 0 24 540 topology 758 1246
+> 16 0 24 540 topology 654 1246
+> 15 0 25 540 topology 654 1247
+> 16 0 25 540 topology 652 1247
+> 15 0 24 540 topology 758 1248
+> 16 0 24 540 topology 738 1248
+> 15 0 25 540 topology 738 1249
+> 16 0 25 540 topology 736 1249
+> 15 0 24 540 topology 758 1250
+> 16 0 24 540 topology 564 1250
+> 15 0 25 540 topology 564 1251
+> 16 0 25 540 topology 562 1251
+> 15 0 24 540 topology 758 1252
+> 16 0 24 540 topology 573 1252
+> 15 0 25 540 topology 573 1253
+> 16 0 25 540 topology 571 1253
+> 15 0 24 540 topology 758 1254
+> 16 0 24 540 topology 609 1254
+> 15 0 25 540 topology 609 1255
+> 16 0 25 540 topology 607 1255
+> 15 0 24 540 topology 758 1256
+> 16 0 24 540 topology 693 1256
+> 15 0 25 540 topology 693 1257
+> 16 0 25 540 topology 691 1257
+> 15 0 24 540 topology 758 1258
+> 16 0 24 540 topology 645 1258
+> 15 0 25 540 topology 645 1259
+> 16 0 25 540 topology 643 1259
+> 15 0 24 540 topology 758 1260
+> 16 0 24 540 topology 729 1260
+> 15 0 25 540 topology 729 1261
+> 16 0 25 540 topology 727 1261
+> 15 0 24 540 topology 758 1262
+> 16 0 24 540 topology 597 1262
+> 15 0 25 540 topology 597 1263
+> 16 0 25 540 topology 595 1263
+> 15 0 24 540 topology 758 1264
+> 16 0 24 540 topology 681 1264
+> 15 0 25 540 topology 681 1265
+> 16 0 25 540 topology 679 1265
+> 15 0 24 540 topology 758 1266
+> 16 0 24 540 topology 717 1266
+> 15 0 25 540 topology 717 1267
+> 16 0 25 540 topology 715 1267
+> 15 0 24 540 topology 758 1268
+> 16 0 24 540 topology 555 1268
+> 15 0 25 540 topology 555 1269
+> 16 0 25 540 topology 553 1269
+> 15 0 24 540 topology 758 1270
+> 16 0 24 540 topology 600 1270
+> 15 0 25 540 topology 600 1271
+> 16 0 25 540 topology 598 1271
+> 15 0 24 540 topology 758 1272
+> 16 0 24 540 topology 636 1272
+> 15 0 25 540 topology 636 1273
+> 16 0 25 540 topology 634 1273
+> 15 0 24 540 topology 758 1274
+> 16 0 24 540 topology 720 1274
+> 15 0 25 540 topology 720 1275
+> 16 0 25 540 topology 718 1275
+> 15 0 24 540 topology 758 1276
+> 16 0 24 540 topology 588 1276
+> 15 0 25 540 topology 588 1277
+> 16 0 25 540 topology 586 1277
+> 15 0 24 540 topology 758 1278
+> 16 0 24 540 topology 672 1278
+> 15 0 25 540 topology 672 1279
+> 16 0 25 540 topology 670 1279
+> 15 0 24 540 topology 758 1280
+> 16 0 24 540 topology 756 1280
+> 15 0 25 540 topology 756 1281
+> 16 0 25 540 topology 754 1281
+> 15 0 24 540 topology 758 1282
+> 16 0 24 540 topology 624 1282
+> 15 0 25 540 topology 624 1283
+> 16 0 25 540 topology 622 1283
+> 15 0 24 540 topology 758 1284
+> 16 0 24 540 topology 708 1284
+> 15 0 25 540 topology 708 1285
+> 16 0 25 540 topology 706 1285
+> 15 0 24 540 topology 758 1286
+> 16 0 24 540 topology 744 1286
+> 15 0 25 540 topology 744 1287
+> 16 0 25 540 topology 742 1287
+> 15 0 24 540 topology 758 1288
+> 16 0 24 540 topology 546 1288
+> 15 0 25 540 topology 546 1289
+> 16 0 25 540 topology 544 1289
+> 15 0 24 540 topology 758 1290
+> 16 0 24 540 topology 579 1290
+> 15 0 25 540 topology 579 1291
+> 16 0 25 540 topology 577 1291
+> 15 0 24 540 topology 758 1292
+> 16 0 24 540 topology 663 1292
+> 15 0 25 540 topology 663 1293
+> 16 0 25 540 topology 661 1293
+> 15 0 24 540 topology 758 1294
+> 16 0 24 540 topology 615 1294
+> 15 0 25 540 topology 615 1295
+> 16 0 25 540 topology 613 1295
+> 15 0 24 540 topology 758 1296
+> 16 0 24 540 topology 699 1296
+> 15 0 25 540 topology 699 1297
+> 16 0 25 540 topology 697 1297
+> 15 0 24 540 topology 758 1298
+> 16 0 24 540 topology 651 1298
+> 15 0 25 540 topology 651 1299
+> 16 0 25 540 topology 649 1299
+> 15 0 24 540 topology 758 1300
+> 16 0 24 540 topology 735 1300
+> 15 0 25 540 topology 735 1301
+> 16 0 25 540 topology 733 1301
+> 15 0 24 540 topology 758 1302
+> 16 0 24 540 topology 687 1302
+> 15 0 25 540 topology 687 1303
+> 16 0 25 540 topology 685 1303
+> 15 0 24 540 topology 758 1304
+> 16 0 24 540 topology 561 1304
+> 15 0 25 540 topology 561 1305
+> 16 0 25 540 topology 559 1305
+> 15 0 24 540 topology 758 1306
+> 16 0 24 540 topology 570 1306
+> 15 0 25 540 topology 570 1307
+> 16 0 25 540 topology 568 1307
+> 15 0 24 540 topology 758 1308
+> 16 0 24 540 topology 606 1308
+> 15 0 25 540 topology 606 1309
+> 16 0 25 540 topology 604 1309
+> 15 0 24 540 topology 758 1310
+> 16 0 24 540 topology 690 1310
+> 15 0 25 540 topology 690 1311
+> 16 0 25 540 topology 688 1311
+> 15 0 24 540 topology 758 1312
+> 16 0 24 540 topology 642 1312
+> 15 0 25 540 topology 642 1313
+> 16 0 25 540 topology 640 1313
+> 15 0 24 540 topology 758 1314
+> 16 0 24 540 topology 726 1314
+> 15 0 25 540 topology 726 1315
+> 16 0 25 540 topology 724 1315
+> 15 0 24 540 topology 758 1316
+> 16 0 24 540 topology 594 1316
+> 15 0 25 540 topology 594 1317
+> 16 0 25 540 topology 592 1317
+> 15 0 24 540 topology 758 1318
+> 16 0 24 540 topology 678 1318
+> 15 0 25 540 topology 678 1319
+> 16 0 25 540 topology 676 1319
+> 15 0 24 540 topology 758 1320
+> 16 0 24 540 topology 714 1320
+> 15 0 25 540 topology 714 1321
+> 16 0 25 540 topology 712 1321
+> 15 0 26 540 topology 758 1322
+> 16 0 26 540 topology 757 1322
+> 15 0 24 540 topology 758 1323
+> 16 0 24 540 topology 552 1323
+> 15 0 25 540 topology 552 1324
+> 16 0 25 540 topology 550 1324
+> 15 0 24 540 topology 758 1325
+> 16 0 24 540 topology 633 1325
+> 15 0 25 540 topology 633 1326
+> 16 0 25 540 topology 631 1326
+> 15 0 24 540 topology 758 1327
+> 16 0 24 540 topology 585 1327
+> 15 0 25 540 topology 585 1328
+> 16 0 25 540 topology 583 1328
+> 15 0 24 540 topology 758 1329
+> 16 0 24 540 topology 669 1329
+> 15 0 25 540 topology 669 1330
+> 16 0 25 540 topology 667 1330
+> 15 0 24 540 topology 758 1331
+> 16 0 24 540 topology 753 1331
+> 15 0 25 540 topology 753 1332
+> 16 0 25 540 topology 751 1332
+> 15 0 24 540 topology 758 1333
+> 16 0 24 540 topology 621 1333
+> 15 0 25 540 topology 621 1334
+> 16 0 25 540 topology 619 1334
+> 15 0 24 540 topology 758 1335
+> 16 0 24 540 topology 705 1335
+> 15 0 25 540 topology 705 1336
+> 16 0 25 540 topology 703 1336
+> 15 0 24 540 topology 758 1337
+> 16 0 24 540 topology 657 1337
+> 15 0 25 540 topology 657 1338
+> 16 0 25 540 topology 655 1338
+> 15 0 24 540 topology 758 1339
+> 16 0 24 540 topology 741 1339
+> 15 0 25 540 topology 741 1340
+> 16 0 25 540 topology 739 1340
+> 15 0 24 540 topology 758 1341
+> 16 0 24 540 topology 543 1341
+> 15 0 25 540 topology 543 1342
+> 16 0 25 540 topology 541 1342
+> 15 0 24 540 topology 758 1343
+> 16 0 24 540 topology 567 1343
+> 15 0 25 540 topology 567 1344
+> 16 0 25 540 topology 565 1344
+> 15 0 24 540 topology 758 1345
+> 16 0 24 540 topology 576 1345
+> 15 0 25 540 topology 576 1346
+> 16 0 25 540 topology 574 1346
+> 15 0 24 540 topology 758 1347
+> 16 0 24 540 topology 660 1347
+> 15 0 25 540 topology 660 1348
+> 16 0 25 540 topology 658 1348
+> 15 0 24 540 topology 758 1349
+> 16 0 24 540 topology 612 1349
+> 15 0 25 540 topology 612 1350
+> 16 0 25 540 topology 610 1350
+> 15 0 24 540 topology 758 1351
+> 16 0 24 540 topology 696 1351
+> 15 0 25 540 topology 696 1352
+> 16 0 25 540 topology 694 1352
+> 15 0 24 540 topology 758 1353
+> 16 0 24 540 topology 648 1353
+> 15 0 25 540 topology 648 1354
+> 16 0 25 540 topology 646 1354
+> 15 0 24 540 topology 758 1355
+> 16 0 24 540 topology 732 1355
+> 15 0 25 540 topology 732 1356
+> 16 0 25 540 topology 730 1356
+> 15 0 24 540 topology 758 1357
+> 16 0 24 540 topology 684 1357
+> 15 0 25 540 topology 684 1358
+> 16 0 25 540 topology 682 1358
+> 15 0 24 540 topology 758 1359
+> 16 0 24 540 topology 558 1359
+> 15 0 25 540 topology 558 1360
+> 16 0 25 540 topology 556 1360
+> 15 0 24 540 topology 758 1361
+> 16 0 24 540 topology 603 1361
+> 15 0 25 540 topology 603 1362
+> 16 0 25 540 topology 601 1362
+> 15 0 24 540 topology 758 1363
+> 16 0 24 540 topology 639 1363
+> 15 0 25 540 topology 639 1364
+> 16 0 25 540 topology 637 1364
+> 15 0 24 540 topology 758 1365
+> 16 0 24 540 topology 723 1365
+> 15 0 25 540 topology 723 1366
+> 16 0 25 540 topology 721 1366
+> 15 0 24 540 topology 758 1367
+> 16 0 24 540 topology 591 1367
+> 15 0 25 540 topology 591 1368
+> 16 0 25 540 topology 589 1368
+> 15 0 24 540 topology 758 1369
+> 16 0 24 540 topology 675 1369
+> 15 0 25 540 topology 675 1370
+> 16 0 25 540 topology 673 1370
+> 15 0 24 540 topology 758 1371
+> 16 0 24 540 topology 627 1371
+> 15 0 25 540 topology 627 1372
+> 16 0 25 540 topology 625 1372
+> 15 0 24 540 topology 758 1373
+> 16 0 24 540 topology 711 1373
+> 15 0 25 540 topology 711 1374
+> 16 0 25 540 topology 709 1374
+> 15 0 24 540 topology 758 1375
+> 16 0 24 540 topology 747 1375
+> 15 0 25 540 topology 747 1376
+> 16 0 25 540 topology 745 1376
+> 15 0 24 540 topology 758 1377
+> 16 0 24 540 topology 549 1377
+> 15 0 25 540 topology 549 1378
+> 16 0 25 540 topology 547 1378
+> 15 0 23 540 topology 580 1379
+> 16 0 23 540 topology 581 1379
+> 15 0 24 540 topology 581 1380
+> 16 0 24 540 topology 758 1380
+> 15 0 24 540 topology 758 1381
+> 16 0 24 540 topology 630 1381
+> 15 0 25 540 topology 630 1382
+> 16 0 25 540 topology 628 1382
+> 15 0 23 540 topology 664 1383
+> 16 0 23 540 topology 665 1383
+> 15 0 24 540 topology 665 1384
+> 16 0 24 540 topology 758 1384
+> 15 0 23 540 topology 748 1385
+> 16 0 23 540 topology 749 1385
+> 15 0 24 540 topology 749 1386
+> 16 0 24 540 topology 758 1386
+> 15 0 23 540 topology 616 1387
+> 16 0 23 540 topology 617 1387
+> 15 0 24 540 topology 617 1388
+> 16 0 24 540 topology 758 1388
+> 15 0 23 540 topology 700 1389
+> 16 0 23 540 topology 701 1389
+> 15 0 24 540 topology 701 1390
+> 16 0 24 540 topology 758 1390
+> 15 0 23 540 topology 652 1391
+> 16 0 23 540 topology 653 1391
+> 15 0 24 540 topology 653 1392
+> 16 0 24 540 topology 758 1392
+> 15 0 23 540 topology 736 1393
+> 16 0 23 540 topology 737 1393
+> 15 0 24 540 topology 737 1394
+> 16 0 24 540 topology 758 1394
+> 15 0 23 540 topology 562 1395
+> 16 0 23 540 topology 563 1395
+> 15 0 24 540 topology 563 1396
+> 16 0 24 540 topology 758 1396
+> 15 0 23 540 topology 571 1397
+> 16 0 23 540 topology 572 1397
+> 15 0 24 540 topology 572 1398
+> 16 0 24 540 topology 758 1398
+> 15 0 23 540 topology 607 1399
+> 16 0 23 540 topology 608 1399
+> 15 0 24 540 topology 608 1400
+> 16 0 24 540 topology 758 1400
+> 15 0 23 540 topology 691 1401
+> 16 0 23 540 topology 692 1401
+> 15 0 24 540 topology 692 1402
+> 16 0 24 540 topology 758 1402
+> 15 0 23 540 topology 643 1403
+> 16 0 23 540 topology 644 1403
+> 15 0 24 540 topology 644 1404
+> 16 0 24 540 topology 758 1404
+> 15 0 23 540 topology 727 1405
+> 16 0 23 540 topology 728 1405
+> 15 0 24 540 topology 728 1406
+> 16 0 24 540 topology 758 1406
+> 15 0 23 540 topology 595 1407
+> 16 0 23 540 topology 596 1407
+> 15 0 24 540 topology 596 1408
+> 16 0 24 540 topology 758 1408
+> 15 0 23 540 topology 679 1409
+> 16 0 23 540 topology 680 1409
+> 15 0 24 540 topology 680 1410
+> 16 0 24 540 topology 758 1410
+> 15 0 23 540 topology 715 1411
+> 16 0 23 540 topology 716 1411
+> 15 0 24 540 topology 716 1412
+> 16 0 24 540 topology 758 1412
+> 15 0 23 540 topology 553 1413
+> 16 0 23 540 topology 554 1413
+> 15 0 24 540 topology 554 1414
+> 16 0 24 540 topology 758 1414
+> 15 0 23 540 topology 598 1415
+> 16 0 23 540 topology 599 1415
+> 15 0 24 540 topology 599 1416
+> 16 0 24 540 topology 758 1416
+> 15 0 23 540 topology 634 1417
+> 16 0 23 540 topology 635 1417
+> 15 0 24 540 topology 635 1418
+> 16 0 24 540 topology 758 1418
+> 15 0 23 540 topology 718 1419
+> 16 0 23 540 topology 719 1419
+> 15 0 24 540 topology 719 1420
+> 16 0 24 540 topology 758 1420
+> 15 0 23 540 topology 586 1421
+> 16 0 23 540 topology 587 1421
+> 15 0 24 540 topology 587 1422
+> 16 0 24 540 topology 758 1422
+> 15 0 23 540 topology 670 1423
+> 16 0 23 540 topology 671 1423
+> 15 0 24 540 topology 671 1424
+> 16 0 24 540 topology 758 1424
+> 15 0 23 540 topology 754 1425
+> 16 0 23 540 topology 755 1425
+> 15 0 24 540 topology 755 1426
+> 16 0 24 540 topology 758 1426
+> 15 0 23 540 topology 622 1427
+> 16 0 23 540 topology 623 1427
+> 15 0 24 540 topology 623 1428
+> 16 0 24 540 topology 758 1428
+> 15 0 23 540 topology 706 1429
+> 16 0 23 540 topology 707 1429
+> 15 0 24 540 topology 707 1430
+> 16 0 24 540 topology 758 1430
+> 15 0 23 540 topology 742 1431
+> 16 0 23 540 topology 743 1431
+> 15 0 24 540 topology 743 1432
+> 16 0 24 540 topology 758 1432
+> 15 0 23 540 topology 544 1433
+> 16 0 23 540 topology 545 1433
+> 15 0 24 540 topology 545 1434
+> 16 0 24 540 topology 758 1434
+> 15 0 23 540 topology 577 1435
+> 16 0 23 540 topology 578 1435
+> 15 0 24 540 topology 578 1436
+> 16 0 24 540 topology 758 1436
+> 15 0 23 540 topology 661 1437
+> 16 0 23 540 topology 662 1437
+> 15 0 24 540 topology 662 1438
+> 16 0 24 540 topology 758 1438
+> 15 0 23 540 topology 613 1439
+> 16 0 23 540 topology 614 1439
+> 15 0 24 540 topology 614 1440
+> 16 0 24 540 topology 758 1440
+> 15 0 23 540 topology 697 1441
+> 16 0 23 540 topology 698 1441
+> 15 0 24 540 topology 698 1442
+> 16 0 24 540 topology 758 1442
+> 15 0 23 540 topology 649 1443
+> 16 0 23 540 topology 650 1443
+> 15 0 24 540 topology 650 1444
+> 16 0 24 540 topology 758 1444
+> 15 0 23 540 topology 733 1445
+> 16 0 23 540 topology 734 1445
+> 15 0 24 540 topology 734 1446
+> 16 0 24 540 topology 758 1446
+> 15 0 23 540 topology 685 1447
+> 16 0 23 540 topology 686 1447
+> 15 0 24 540 topology 686 1448
+> 16 0 24 540 topology 758 1448
+> 15 0 23 540 topology 559 1449
+> 16 0 23 540 topology 560 1449
+> 15 0 24 540 topology 560 1450
+> 16 0 24 540 topology 758 1450
+> 15 0 23 540 topology 568 1451
+> 16 0 23 540 topology 569 1451
+> 15 0 24 540 topology 569 1452
+> 16 0 24 540 topology 758 1452
+> 15 0 23 540 topology 604 1453
+> 16 0 23 540 topology 605 1453
+> 15 0 24 540 topology 605 1454
+> 16 0 24 540 topology 758 1454
+> 15 0 23 540 topology 688 1455
+> 16 0 23 540 topology 689 1455
+> 15 0 24 540 topology 689 1456
+> 16 0 24 540 topology 758 1456
+> 15 0 23 540 topology 640 1457
+> 16 0 23 540 topology 641 1457
+> 15 0 24 540 topology 641 1458
+> 16 0 24 540 topology 758 1458
+> 15 0 23 540 topology 724 1459
+> 16 0 23 540 topology 725 1459
+> 15 0 24 540 topology 725 1460
+> 16 0 24 540 topology 758 1460
+> 15 0 23 540 topology 592 1461
+> 16 0 23 540 topology 593 1461
+> 15 0 24 540 topology 593 1462
+> 16 0 24 540 topology 758 1462
+> 15 0 23 540 topology 676 1463
+> 16 0 23 540 topology 677 1463
+> 15 0 24 540 topology 677 1464
+> 16 0 24 540 topology 758 1464
+> 15 0 23 540 topology 712 1465
+> 16 0 23 540 topology 713 1465
+> 15 0 24 540 topology 713 1466
+> 16 0 24 540 topology 758 1466
+> 15 0 23 540 topology 550 1467
+> 16 0 23 540 topology 551 1467
+> 15 0 24 540 topology 551 1468
+> 16 0 24 540 topology 758 1468
+> 15 0 23 540 topology 631 1469
+> 16 0 23 540 topology 632 1469
+> 15 0 24 540 topology 632 1470
+> 16 0 24 540 topology 758 1470
+> 15 0 23 540 topology 583 1471
+> 16 0 23 540 topology 584 1471
+> 15 0 24 540 topology 584 1472
+> 16 0 24 540 topology 758 1472
+> 15 0 23 540 topology 667 1473
+> 16 0 23 540 topology 668 1473
+> 15 0 24 540 topology 668 1474
+> 16 0 24 540 topology 758 1474
+> 15 0 23 540 topology 751 1475
+> 16 0 23 540 topology 752 1475
+> 15 0 24 540 topology 752 1476
+> 16 0 24 540 topology 758 1476
+> 15 0 23 540 topology 619 1477
+> 16 0 23 540 topology 620 1477
+> 15 0 24 540 topology 620 1478
+> 16 0 24 540 topology 758 1478
+> 15 0 23 540 topology 703 1479
+> 16 0 23 540 topology 704 1479
+> 15 0 24 540 topology 704 1480
+> 16 0 24 540 topology 758 1480
+> 15 0 23 540 topology 655 1481
+> 16 0 23 540 topology 656 1481
+> 15 0 24 540 topology 656 1482
+> 16 0 24 540 topology 758 1482
+> 15 0 23 540 topology 739 1483
+> 16 0 23 540 topology 740 1483
+> 15 0 24 540 topology 740 1484
+> 16 0 24 540 topology 758 1484
+> 15 0 23 540 topology 541 1485
+> 16 0 23 540 topology 542 1485
+> 15 0 24 540 topology 542 1486
+> 16 0 24 540 topology 758 1486
+> 15 0 23 540 topology 565 1487
+> 16 0 23 540 topology 566 1487
+> 15 0 24 540 topology 566 1488
+> 16 0 24 540 topology 758 1488
+> 15 0 23 540 topology 574 1489
+> 16 0 23 540 topology 575 1489
+> 15 0 24 540 topology 575 1490
+> 16 0 24 540 topology 758 1490
+> 15 0 23 540 topology 658 1491
+> 16 0 23 540 topology 659 1491
+> 15 0 24 540 topology 659 1492
+> 16 0 24 540 topology 758 1492
+> 15 0 23 540 topology 610 1493
+> 16 0 23 540 topology 611 1493
+> 15 0 24 540 topology 611 1494
+> 16 0 24 540 topology 758 1494
+> 15 0 23 540 topology 694 1495
+> 16 0 23 540 topology 695 1495
+> 15 0 24 540 topology 695 1496
+> 16 0 24 540 topology 758 1496
+> 15 0 23 540 topology 646 1497
+> 16 0 23 540 topology 647 1497
+> 15 0 24 540 topology 647 1498
+> 16 0 24 540 topology 758 1498
+> 15 0 23 540 topology 730 1499
+> 16 0 23 540 topology 731 1499
+> 15 0 24 540 topology 731 1500
+> 16 0 24 540 topology 758 1500
+> 15 0 23 540 topology 682 1501
+> 16 0 23 540 topology 683 1501
+> 15 0 24 540 topology 683 1502
+> 16 0 24 540 topology 758 1502
+> 15 0 23 540 topology 556 1503
+> 16 0 23 540 topology 557 1503
+> 15 0 24 540 topology 557 1504
+> 16 0 24 540 topology 758 1504
+> 15 0 23 540 topology 601 1505
+> 16 0 23 540 topology 602 1505
+> 15 0 24 540 topology 602 1506
+> 16 0 24 540 topology 758 1506
+> 15 0 23 540 topology 637 1507
+> 16 0 23 540 topology 638 1507
+> 15 0 24 540 topology 638 1508
+> 16 0 24 540 topology 758 1508
+> 15 0 23 540 topology 721 1509
+> 16 0 23 540 topology 722 1509
+> 15 0 24 540 topology 722 1510
+> 16 0 24 540 topology 758 1510
+> 15 0 23 540 topology 589 1511
+> 16 0 23 540 topology 590 1511
+> 15 0 24 540 topology 590 1512
+> 16 0 24 540 topology 758 1512
+> 15 0 23 540 topology 673 1513
+> 16 0 23 540 topology 674 1513
+> 15 0 24 540 topology 674 1514
+> 16 0 24 540 topology 758 1514
+> 15 0 23 540 topology 625 1515
+> 16 0 23 540 topology 626 1515
+> 15 0 24 540 topology 626 1516
+> 16 0 24 540 topology 758 1516
+> 15 0 23 540 topology 709 1517
+> 16 0 23 540 topology 710 1517
+> 15 0 24 540 topology 710 1518
+> 16 0 24 540 topology 758 1518
+> 15 0 23 540 topology 745 1519
+> 16 0 23 540 topology 746 1519
+> 15 0 24 540 topology 746 1520
+> 16 0 24 540 topology 758 1520
+> 15 0 23 540 topology 547 1521
+> 16 0 23 540 topology 548 1521
+> 15 0 24 540 topology 548 1522
+> 16 0 24 540 topology 758 1522
+> 15 0 23 760 topology 788 1523
+> 16 0 23 760 topology 789 1523
+> 15 0 24 760 topology 789 1524
+> 16 0 24 760 topology 864 1524
+> 15 0 24 760 topology 864 1525
+> 16 0 24 760 topology 850 1525
+> 15 0 25 760 topology 850 1526
+> 16 0 25 760 topology 848 1526
+> 15 0 24 760 topology 864 1527
+> 16 0 24 760 topology 826 1527
+> 15 0 25 760 topology 826 1528
+> 16 0 25 760 topology 824 1528
+> 15 0 24 760 topology 864 1529
+> 16 0 24 760 topology 802 1529
+> 15 0 25 760 topology 802 1530
+> 16 0 25 760 topology 800 1530
+> 15 0 24 760 topology 864 1531
+> 16 0 24 760 topology 862 1531
+> 15 0 25 760 topology 862 1532
+> 16 0 25 760 topology 860 1532
+> 15 0 24 760 topology 864 1533
+> 16 0 24 760 topology 838 1533
+> 15 0 25 760 topology 838 1534
+> 16 0 25 760 topology 836 1534
+> 15 0 24 760 topology 864 1535
+> 16 0 24 760 topology 814 1535
+> 15 0 25 760 topology 814 1536
+> 16 0 25 760 topology 812 1536
+> 15 0 26 760 topology 864 1537
+> 16 0 26 760 topology 863 1537
+> 15 0 24 760 topology 864 1538
+> 16 0 24 760 topology 766 1538
+> 15 0 25 760 topology 766 1539
+> 16 0 25 760 topology 764 1539
+> 15 0 24 760 topology 864 1540
+> 16 0 24 760 topology 778 1540
+> 15 0 25 760 topology 778 1541
+> 16 0 25 760 topology 776 1541
+> 15 0 24 760 topology 864 1542
+> 16 0 24 760 topology 793 1542
+> 15 0 25 760 topology 793 1543
+> 16 0 25 760 topology 791 1543
+> 15 0 24 760 topology 864 1544
+> 16 0 24 760 topology 853 1544
+> 15 0 25 760 topology 853 1545
+> 16 0 25 760 topology 851 1545
+> 15 0 24 760 topology 864 1546
+> 16 0 24 760 topology 829 1546
+> 15 0 25 760 topology 829 1547
+> 16 0 25 760 topology 827 1547
+> 15 0 24 760 topology 864 1548
+> 16 0 24 760 topology 805 1548
+> 15 0 25 760 topology 805 1549
+> 16 0 25 760 topology 803 1549
+> 15 0 24 760 topology 864 1550
+> 16 0 24 760 topology 841 1550
+> 15 0 25 760 topology 841 1551
+> 16 0 25 760 topology 839 1551
+> 15 0 24 760 topology 864 1552
+> 16 0 24 760 topology 817 1552
+> 15 0 25 760 topology 817 1553
+> 16 0 25 760 topology 815 1553
+> 15 0 24 760 topology 864 1554
+> 16 0 24 760 topology 769 1554
+> 15 0 25 760 topology 769 1555
+> 16 0 25 760 topology 767 1555
+> 15 0 24 760 topology 864 1556
+> 16 0 24 760 topology 781 1556
+> 15 0 25 760 topology 781 1557
+> 16 0 25 760 topology 779 1557
+> 15 0 24 760 topology 864 1558
+> 16 0 24 760 topology 820 1558
+> 15 0 25 760 topology 820 1559
+> 16 0 25 760 topology 818 1559
+> 15 0 24 760 topology 864 1560
+> 16 0 24 760 topology 796 1560
+> 15 0 25 760 topology 796 1561
+> 16 0 25 760 topology 794 1561
+> 15 0 24 760 topology 864 1562
+> 16 0 24 760 topology 856 1562
+> 15 0 25 760 topology 856 1563
+> 16 0 25 760 topology 854 1563
+> 15 0 24 760 topology 864 1564
+> 16 0 24 760 topology 832 1564
+> 15 0 25 760 topology 832 1565
+> 16 0 25 760 topology 830 1565
+> 15 0 24 760 topology 864 1566
+> 16 0 24 760 topology 808 1566
+> 15 0 25 760 topology 808 1567
+> 16 0 25 760 topology 806 1567
+> 15 0 24 760 topology 864 1568
+> 16 0 24 760 topology 844 1568
+> 15 0 25 760 topology 844 1569
+> 16 0 25 760 topology 842 1569
+> 15 0 24 760 topology 864 1570
+> 16 0 24 760 topology 772 1570
+> 15 0 25 760 topology 772 1571
+> 16 0 25 760 topology 770 1571
+> 15 0 24 760 topology 864 1572
+> 16 0 24 760 topology 784 1572
+> 15 0 25 760 topology 784 1573
+> 16 0 25 760 topology 782 1573
+> 15 0 24 760 topology 864 1574
+> 16 0 24 760 topology 823 1574
+> 15 0 25 760 topology 823 1575
+> 16 0 25 760 topology 821 1575
+> 15 0 24 760 topology 864 1576
+> 16 0 24 760 topology 799 1576
+> 15 0 25 760 topology 799 1577
+> 16 0 25 760 topology 797 1577
+> 15 0 24 760 topology 864 1578
+> 16 0 24 760 topology 859 1578
+> 15 0 25 760 topology 859 1579
+> 16 0 25 760 topology 857 1579
+> 15 0 24 760 topology 864 1580
+> 16 0 24 760 topology 835 1580
+> 15 0 25 760 topology 835 1581
+> 16 0 25 760 topology 833 1581
+> 15 0 24 760 topology 864 1582
+> 16 0 24 760 topology 811 1582
+> 15 0 25 760 topology 811 1583
+> 16 0 25 760 topology 809 1583
+> 15 0 24 760 topology 864 1584
+> 16 0 24 760 topology 847 1584
+> 15 0 25 760 topology 847 1585
+> 16 0 25 760 topology 845 1585
+> 15 0 24 760 topology 864 1586
+> 16 0 24 760 topology 763 1586
+> 15 0 25 760 topology 763 1587
+> 16 0 25 760 topology 761 1587
+> 15 0 24 760 topology 864 1588
+> 16 0 24 760 topology 775 1588
+> 15 0 25 760 topology 775 1589
+> 16 0 25 760 topology 773 1589
+> 15 0 24 760 topology 864 1590
+> 16 0 24 760 topology 787 1590
+> 15 0 25 760 topology 787 1591
+> 16 0 25 760 topology 785 1591
+> 15 0 23 760 topology 848 1592
+> 16 0 23 760 topology 849 1592
+> 15 0 24 760 topology 849 1593
+> 16 0 24 760 topology 864 1593
+> 15 0 24 760 topology 864 1594
+> 16 0 24 760 topology 790 1594
+> 15 0 25 760 topology 790 1595
+> 16 0 25 760 topology 788 1595
+> 15 0 23 760 topology 824 1596
+> 16 0 23 760 topology 825 1596
+> 15 0 24 760 topology 825 1597
+> 16 0 24 760 topology 864 1597
+> 15 0 23 760 topology 800 1598
+> 16 0 23 760 topology 801 1598
+> 15 0 24 760 topology 801 1599
+> 16 0 24 760 topology 864 1599
+> 15 0 23 760 topology 860 1600
+> 16 0 23 760 topology 861 1600
+> 15 0 24 760 topology 861 1601
+> 16 0 24 760 topology 864 1601
+> 15 0 23 760 topology 836 1602
+> 16 0 23 760 topology 837 1602
+> 15 0 24 760 topology 837 1603
+> 16 0 24 760 topology 864 1603
+> 15 0 23 760 topology 812 1604
+> 16 0 23 760 topology 813 1604
+> 15 0 24 760 topology 813 1605
+> 16 0 24 760 topology 864 1605
+> 15 0 23 760 topology 764 1606
+> 16 0 23 760 topology 765 1606
+> 15 0 24 760 topology 765 1607
+> 16 0 24 760 topology 864 1607
+> 15 0 23 760 topology 776 1608
+> 16 0 23 760 topology 777 1608
+> 15 0 24 760 topology 777 1609
+> 16 0 24 760 topology 864 1609
+> 15 0 23 760 topology 791 1610
+> 16 0 23 760 topology 792 1610
+> 15 0 24 760 topology 792 1611
+> 16 0 24 760 topology 864 1611
+> 15 0 23 760 topology 851 1612
+> 16 0 23 760 topology 852 1612
+> 15 0 24 760 topology 852 1613
+> 16 0 24 760 topology 864 1613
+> 15 0 23 760 topology 827 1614
+> 16 0 23 760 topology 828 1614
+> 15 0 24 760 topology 828 1615
+> 16 0 24 760 topology 864 1615
+> 15 0 23 760 topology 803 1616
+> 16 0 23 760 topology 804 1616
+> 15 0 24 760 topology 804 1617
+> 16 0 24 760 topology 864 1617
+> 15 0 23 760 topology 839 1618
+> 16 0 23 760 topology 840 1618
+> 15 0 24 760 topology 840 1619
+> 16 0 24 760 topology 864 1619
+> 15 0 23 760 topology 815 1620
+> 16 0 23 760 topology 816 1620
+> 15 0 24 760 topology 816 1621
+> 16 0 24 760 topology 864 1621
+> 15 0 23 760 topology 767 1622
+> 16 0 23 760 topology 768 1622
+> 15 0 24 760 topology 768 1623
+> 16 0 24 760 topology 864 1623
+> 15 0 23 760 topology 779 1624
+> 16 0 23 760 topology 780 1624
+> 15 0 24 760 topology 780 1625
+> 16 0 24 760 topology 864 1625
+> 15 0 23 760 topology 818 1626
+> 16 0 23 760 topology 819 1626
+> 15 0 24 760 topology 819 1627
+> 16 0 24 760 topology 864 1627
+> 15 0 23 760 topology 794 1628
+> 16 0 23 760 topology 795 1628
+> 15 0 24 760 topology 795 1629
+> 16 0 24 760 topology 864 1629
+> 15 0 23 760 topology 854 1630
+> 16 0 23 760 topology 855 1630
+> 15 0 24 760 topology 855 1631
+> 16 0 24 760 topology 864 1631
+> 15 0 23 760 topology 830 1632
+> 16 0 23 760 topology 831 1632
+> 15 0 24 760 topology 831 1633
+> 16 0 24 760 topology 864 1633
+> 15 0 23 760 topology 806 1634
+> 16 0 23 760 topology 807 1634
+> 15 0 24 760 topology 807 1635
+> 16 0 24 760 topology 864 1635
+> 15 0 23 760 topology 842 1636
+> 16 0 23 760 topology 843 1636
+> 15 0 24 760 topology 843 1637
+> 16 0 24 760 topology 864 1637
+> 15 0 23 760 topology 770 1638
+> 16 0 23 760 topology 771 1638
+> 15 0 24 760 topology 771 1639
+> 16 0 24 760 topology 864 1639
+> 15 0 23 760 topology 782 1640
+> 16 0 23 760 topology 783 1640
+> 15 0 24 760 topology 783 1641
+> 16 0 24 760 topology 864 1641
+> 15 0 23 760 topology 821 1642
+> 16 0 23 760 topology 822 1642
+> 15 0 24 760 topology 822 1643
+> 16 0 24 760 topology 864 1643
+> 15 0 23 760 topology 797 1644
+> 16 0 23 760 topology 798 1644
+> 15 0 24 760 topology 798 1645
+> 16 0 24 760 topology 864 1645
+> 15 0 23 760 topology 857 1646
+> 16 0 23 760 topology 858 1646
+> 15 0 24 760 topology 858 1647
+> 16 0 24 760 topology 864 1647
+> 15 0 23 760 topology 833 1648
+> 16 0 23 760 topology 834 1648
+> 15 0 24 760 topology 834 1649
+> 16 0 24 760 topology 864 1649
+> 15 0 23 760 topology 809 1650
+> 16 0 23 760 topology 810 1650
+> 15 0 24 760 topology 810 1651
+> 16 0 24 760 topology 864 1651
+> 15 0 23 760 topology 845 1652
+> 16 0 23 760 topology 846 1652
+> 15 0 24 760 topology 846 1653
+> 16 0 24 760 topology 864 1653
+> 15 0 23 760 topology 761 1654
+> 16 0 23 760 topology 762 1654
+> 15 0 24 760 topology 762 1655
+> 16 0 24 760 topology 864 1655
+> 15 0 23 760 topology 773 1656
+> 16 0 23 760 topology 774 1656
+> 15 0 24 760 topology 774 1657
+> 16 0 24 760 topology 864 1657
+> 15 0 23 760 topology 785 1658
+> 16 0 23 760 topology 786 1658
+> 15 0 24 760 topology 786 1659
+> 16 0 24 760 topology 864 1659
+> 15 0 23 500 topology 519 1660
+> 16 0 23 500 topology 520 1660
+> 15 0 24 500 topology 520 1661
+> 16 0 24 500 topology 538 1661
+> 15 0 24 500 topology 538 1662
+> 16 0 24 500 topology 530 1662
+> 15 0 25 500 topology 530 1663
+> 16 0 25 500 topology 528 1663
+> 15 0 26 500 topology 538 1664
+> 16 0 26 500 topology 537 1664
+> 15 0 24 500 topology 538 1665
+> 16 0 24 500 topology 512 1665
+> 15 0 25 500 topology 512 1666
+> 16 0 25 500 topology 510 1666
+> 15 0 24 500 topology 538 1667
+> 16 0 24 500 topology 524 1667
+> 15 0 25 500 topology 524 1668
+> 16 0 25 500 topology 522 1668
+> 15 0 24 500 topology 538 1669
+> 16 0 24 500 topology 533 1669
+> 15 0 25 500 topology 533 1670
+> 16 0 25 500 topology 531 1670
+> 15 0 24 500 topology 538 1671
+> 16 0 24 500 topology 503 1671
+> 15 0 25 500 topology 503 1672
+> 16 0 25 500 topology 501 1672
+> 15 0 24 500 topology 538 1673
+> 16 0 24 500 topology 515 1673
+> 15 0 25 500 topology 515 1674
+> 16 0 25 500 topology 513 1674
+> 15 0 24 500 topology 538 1675
+> 16 0 24 500 topology 527 1675
+> 15 0 25 500 topology 527 1676
+> 16 0 25 500 topology 525 1676
+> 15 0 24 500 topology 538 1677
+> 16 0 24 500 topology 536 1677
+> 15 0 25 500 topology 536 1678
+> 16 0 25 500 topology 534 1678
+> 15 0 24 500 topology 538 1679
+> 16 0 24 500 topology 506 1679
+> 15 0 25 500 topology 506 1680
+> 16 0 25 500 topology 504 1680
+> 15 0 24 500 topology 538 1681
+> 16 0 24 500 topology 518 1681
+> 15 0 25 500 topology 518 1682
+> 16 0 25 500 topology 516 1682
+> 15 0 24 500 topology 538 1683
+> 16 0 24 500 topology 509 1683
+> 15 0 25 500 topology 509 1684
+> 16 0 25 500 topology 507 1684
+> 15 0 23 500 topology 528 1685
+> 16 0 23 500 topology 529 1685
+> 15 0 24 500 topology 529 1686
+> 16 0 24 500 topology 538 1686
+> 15 0 24 500 topology 538 1687
+> 16 0 24 500 topology 521 1687
+> 15 0 25 500 topology 521 1688
+> 16 0 25 500 topology 519 1688
+> 15 0 23 500 topology 510 1689
+> 16 0 23 500 topology 511 1689
+> 15 0 24 500 topology 511 1690
+> 16 0 24 500 topology 538 1690
+> 15 0 23 500 topology 522 1691
+> 16 0 23 500 topology 523 1691
+> 15 0 24 500 topology 523 1692
+> 16 0 24 500 topology 538 1692
+> 15 0 23 500 topology 531 1693
+> 16 0 23 500 topology 532 1693
+> 15 0 24 500 topology 532 1694
+> 16 0 24 500 topology 538 1694
+> 15 0 23 500 topology 501 1695
+> 16 0 23 500 topology 502 1695
+> 15 0 24 500 topology 502 1696
+> 16 0 24 500 topology 538 1696
+> 15 0 23 500 topology 513 1697
+> 16 0 23 500 topology 514 1697
+> 15 0 24 500 topology 514 1698
+> 16 0 24 500 topology 538 1698
+> 15 0 23 500 topology 525 1699
+> 16 0 23 500 topology 526 1699
+> 15 0 24 500 topology 526 1700
+> 16 0 24 500 topology 538 1700
+> 15 0 23 500 topology 534 1701
+> 16 0 23 500 topology 535 1701
+> 15 0 24 500 topology 535 1702
+> 16 0 24 500 topology 538 1702
+> 15 0 23 500 topology 504 1703
+> 16 0 23 500 topology 505 1703
+> 15 0 24 500 topology 505 1704
+> 16 0 24 500 topology 538 1704
+> 15 0 23 500 topology 516 1705
+> 16 0 23 500 topology 517 1705
+> 15 0 24 500 topology 517 1706
+> 16 0 24 500 topology 538 1706
+> 15 0 23 500 topology 507 1707
+> 16 0 23 500 topology 508 1707
+> 15 0 24 500 topology 508 1708
+> 16 0 24 500 topology 538 1708
+> 15 0 27 499 topology 757 1709
+> 16 0 27 499 topology 759 1709
+> 15 0 28 499 topology 759 1710
+> 16 0 28 499 topology 867 1710
+> 15 0 21 499 topology 759 1711
+> 16 0 21 499 topology 865 1711
+> 15 0 28 499 topology 865 1712
+> 16 0 28 499 topology 863 1712
+> 15 0 21 499 topology 759 1713
+> 16 0 21 499 topology 539 1713
+> 15 0 28 499 topology 539 1714
+> 16 0 28 499 topology 537 1714
+> 15 0 27 499 topology 867 1715
+> 16 0 27 499 topology 865 1715
+> 15 0 27 499 topology 867 1716
+> 16 0 27 499 topology 539 1716
+> 15 0 21 499 topology 865 1717
+> 16 0 21 499 topology 539 1717
+> 15 0 23 3318 topology 3373 1718
+> 16 0 23 3318 topology 3374 1718
+> 15 0 24 3318 topology 3374 1719
+> 16 0 24 3318 topology 3410 1719
+> 15 0 24 3318 topology 3410 1720
+> 16 0 24 3318 topology 3378 1720
+> 15 0 25 3318 topology 3378 1721
+> 16 0 25 3318 topology 3376 1721
+> 15 0 24 3318 topology 3410 1722
+> 16 0 24 3318 topology 3384 1722
+> 15 0 25 3318 topology 3384 1723
+> 16 0 25 3318 topology 3382 1723
+> 15 0 24 3318 topology 3410 1724
+> 16 0 24 3318 topology 3390 1724
+> 15 0 25 3318 topology 3390 1725
+> 16 0 25 3318 topology 3388 1725
+> 15 0 24 3318 topology 3410 1726
+> 16 0 24 3318 topology 3396 1726
+> 15 0 25 3318 topology 3396 1727
+> 16 0 25 3318 topology 3394 1727
+> 15 0 24 3318 topology 3410 1728
+> 16 0 24 3318 topology 3402 1728
+> 15 0 25 3318 topology 3402 1729
+> 16 0 25 3318 topology 3400 1729
+> 15 0 24 3318 topology 3410 1730
+> 16 0 24 3318 topology 3324 1730
+> 15 0 25 3318 topology 3324 1731
+> 16 0 25 3318 topology 3322 1731
+> 15 0 24 3318 topology 3410 1732
+> 16 0 24 3318 topology 3330 1732
+> 15 0 25 3318 topology 3330 1733
+> 16 0 25 3318 topology 3328 1733
+> 15 0 24 3318 topology 3410 1734
+> 16 0 24 3318 topology 3336 1734
+> 15 0 25 3318 topology 3336 1735
+> 16 0 25 3318 topology 3334 1735
+> 15 0 24 3318 topology 3410 1736
+> 16 0 24 3318 topology 3342 1736
+> 15 0 25 3318 topology 3342 1737
+> 16 0 25 3318 topology 3340 1737
+> 15 0 24 3318 topology 3410 1738
+> 16 0 24 3318 topology 3348 1738
+> 15 0 25 3318 topology 3348 1739
+> 16 0 25 3318 topology 3346 1739
+> 15 0 24 3318 topology 3410 1740
+> 16 0 24 3318 topology 3354 1740
+> 15 0 25 3318 topology 3354 1741
+> 16 0 25 3318 topology 3352 1741
+> 15 0 24 3318 topology 3410 1742
+> 16 0 24 3318 topology 3360 1742
+> 15 0 25 3318 topology 3360 1743
+> 16 0 25 3318 topology 3358 1743
+> 15 0 24 3318 topology 3410 1744
+> 16 0 24 3318 topology 3366 1744
+> 15 0 25 3318 topology 3366 1745
+> 16 0 25 3318 topology 3364 1745
+> 15 0 24 3318 topology 3410 1746
+> 16 0 24 3318 topology 3372 1746
+> 15 0 25 3318 topology 3372 1747
+> 16 0 25 3318 topology 3370 1747
+> 15 0 24 3318 topology 3410 1748
+> 16 0 24 3318 topology 3381 1748
+> 15 0 25 3318 topology 3381 1749
+> 16 0 25 3318 topology 3379 1749
+> 15 0 24 3318 topology 3410 1750
+> 16 0 24 3318 topology 3387 1750
+> 15 0 25 3318 topology 3387 1751
+> 16 0 25 3318 topology 3385 1751
+> 15 0 24 3318 topology 3410 1752
+> 16 0 24 3318 topology 3393 1752
+> 15 0 25 3318 topology 3393 1753
+> 16 0 25 3318 topology 3391 1753
+> 15 0 24 3318 topology 3410 1754
+> 16 0 24 3318 topology 3399 1754
+> 15 0 25 3318 topology 3399 1755
+> 16 0 25 3318 topology 3397 1755
+> 15 0 24 3318 topology 3410 1756
+> 16 0 24 3318 topology 3405 1756
+> 15 0 25 3318 topology 3405 1757
+> 16 0 25 3318 topology 3403 1757
+> 15 0 24 3318 topology 3410 1758
+> 16 0 24 3318 topology 3321 1758
+> 15 0 25 3318 topology 3321 1759
+> 16 0 25 3318 topology 3319 1759
+> 15 0 24 3318 topology 3410 1760
+> 16 0 24 3318 topology 3327 1760
+> 15 0 25 3318 topology 3327 1761
+> 16 0 25 3318 topology 3325 1761
+> 15 0 24 3318 topology 3410 1762
+> 16 0 24 3318 topology 3333 1762
+> 15 0 25 3318 topology 3333 1763
+> 16 0 25 3318 topology 3331 1763
+> 15 0 24 3318 topology 3410 1764
+> 16 0 24 3318 topology 3339 1764
+> 15 0 25 3318 topology 3339 1765
+> 16 0 25 3318 topology 3337 1765
+> 15 0 24 3318 topology 3410 1766
+> 16 0 24 3318 topology 3345 1766
+> 15 0 25 3318 topology 3345 1767
+> 16 0 25 3318 topology 3343 1767
+> 15 0 26 3318 topology 3410 1768
+> 16 0 26 3318 topology 3409 1768
+> 15 0 24 3318 topology 3410 1769
+> 16 0 24 3318 topology 3351 1769
+> 15 0 25 3318 topology 3351 1770
+> 16 0 25 3318 topology 3349 1770
+> 15 0 24 3318 topology 3410 1771
+> 16 0 24 3318 topology 3408 1771
+> 15 0 25 3318 topology 3408 1772
+> 16 0 25 3318 topology 3406 1772
+> 15 0 24 3318 topology 3410 1773
+> 16 0 24 3318 topology 3357 1773
+> 15 0 25 3318 topology 3357 1774
+> 16 0 25 3318 topology 3355 1774
+> 15 0 24 3318 topology 3410 1775
+> 16 0 24 3318 topology 3363 1775
+> 15 0 25 3318 topology 3363 1776
+> 16 0 25 3318 topology 3361 1776
+> 15 0 24 3318 topology 3410 1777
+> 16 0 24 3318 topology 3369 1777
+> 15 0 25 3318 topology 3369 1778
+> 16 0 25 3318 topology 3367 1778
+> 15 0 23 3318 topology 3376 1779
+> 16 0 23 3318 topology 3377 1779
+> 15 0 24 3318 topology 3377 1780
+> 16 0 24 3318 topology 3410 1780
+> 15 0 24 3318 topology 3410 1781
+> 16 0 24 3318 topology 3375 1781
+> 15 0 25 3318 topology 3375 1782
+> 16 0 25 3318 topology 3373 1782
+> 15 0 23 3318 topology 3382 1783
+> 16 0 23 3318 topology 3383 1783
+> 15 0 24 3318 topology 3383 1784
+> 16 0 24 3318 topology 3410 1784
+> 15 0 23 3318 topology 3388 1785
+> 16 0 23 3318 topology 3389 1785
+> 15 0 24 3318 topology 3389 1786
+> 16 0 24 3318 topology 3410 1786
+> 15 0 23 3318 topology 3394 1787
+> 16 0 23 3318 topology 3395 1787
+> 15 0 24 3318 topology 3395 1788
+> 16 0 24 3318 topology 3410 1788
+> 15 0 23 3318 topology 3400 1789
+> 16 0 23 3318 topology 3401 1789
+> 15 0 24 3318 topology 3401 1790
+> 16 0 24 3318 topology 3410 1790
+> 15 0 23 3318 topology 3322 1791
+> 16 0 23 3318 topology 3323 1791
+> 15 0 24 3318 topology 3323 1792
+> 16 0 24 3318 topology 3410 1792
+> 15 0 23 3318 topology 3328 1793
+> 16 0 23 3318 topology 3329 1793
+> 15 0 24 3318 topology 3329 1794
+> 16 0 24 3318 topology 3410 1794
+> 15 0 23 3318 topology 3334 1795
+> 16 0 23 3318 topology 3335 1795
+> 15 0 24 3318 topology 3335 1796
+> 16 0 24 3318 topology 3410 1796
+> 15 0 23 3318 topology 3340 1797
+> 16 0 23 3318 topology 3341 1797
+> 15 0 24 3318 topology 3341 1798
+> 16 0 24 3318 topology 3410 1798
+> 15 0 23 3318 topology 3346 1799
+> 16 0 23 3318 topology 3347 1799
+> 15 0 24 3318 topology 3347 1800
+> 16 0 24 3318 topology 3410 1800
+> 15 0 23 3318 topology 3352 1801
+> 16 0 23 3318 topology 3353 1801
+> 15 0 24 3318 topology 3353 1802
+> 16 0 24 3318 topology 3410 1802
+> 15 0 23 3318 topology 3358 1803
+> 16 0 23 3318 topology 3359 1803
+> 15 0 24 3318 topology 3359 1804
+> 16 0 24 3318 topology 3410 1804
+> 15 0 23 3318 topology 3364 1805
+> 16 0 23 3318 topology 3365 1805
+> 15 0 24 3318 topology 3365 1806
+> 16 0 24 3318 topology 3410 1806
+> 15 0 23 3318 topology 3370 1807
+> 16 0 23 3318 topology 3371 1807
+> 15 0 24 3318 topology 3371 1808
+> 16 0 24 3318 topology 3410 1808
+> 15 0 23 3318 topology 3379 1809
+> 16 0 23 3318 topology 3380 1809
+> 15 0 24 3318 topology 3380 1810
+> 16 0 24 3318 topology 3410 1810
+> 15 0 23 3318 topology 3385 1811
+> 16 0 23 3318 topology 3386 1811
+> 15 0 24 3318 topology 3386 1812
+> 16 0 24 3318 topology 3410 1812
+> 15 0 23 3318 topology 3391 1813
+> 16 0 23 3318 topology 3392 1813
+> 15 0 24 3318 topology 3392 1814
+> 16 0 24 3318 topology 3410 1814
+> 15 0 23 3318 topology 3397 1815
+> 16 0 23 3318 topology 3398 1815
+> 15 0 24 3318 topology 3398 1816
+> 16 0 24 3318 topology 3410 1816
+> 15 0 23 3318 topology 3403 1817
+> 16 0 23 3318 topology 3404 1817
+> 15 0 24 3318 topology 3404 1818
+> 16 0 24 3318 topology 3410 1818
+> 15 0 23 3318 topology 3319 1819
+> 16 0 23 3318 topology 3320 1819
+> 15 0 24 3318 topology 3320 1820
+> 16 0 24 3318 topology 3410 1820
+> 15 0 23 3318 topology 3325 1821
+> 16 0 23 3318 topology 3326 1821
+> 15 0 24 3318 topology 3326 1822
+> 16 0 24 3318 topology 3410 1822
+> 15 0 23 3318 topology 3331 1823
+> 16 0 23 3318 topology 3332 1823
+> 15 0 24 3318 topology 3332 1824
+> 16 0 24 3318 topology 3410 1824
+> 15 0 23 3318 topology 3337 1825
+> 16 0 23 3318 topology 3338 1825
+> 15 0 24 3318 topology 3338 1826
+> 16 0 24 3318 topology 3410 1826
+> 15 0 23 3318 topology 3343 1827
+> 16 0 23 3318 topology 3344 1827
+> 15 0 24 3318 topology 3344 1828
+> 16 0 24 3318 topology 3410 1828
+> 15 0 23 3318 topology 3349 1829
+> 16 0 23 3318 topology 3350 1829
+> 15 0 24 3318 topology 3350 1830
+> 16 0 24 3318 topology 3410 1830
+> 15 0 23 3318 topology 3406 1831
+> 16 0 23 3318 topology 3407 1831
+> 15 0 24 3318 topology 3407 1832
+> 16 0 24 3318 topology 3410 1832
+> 15 0 23 3318 topology 3355 1833
+> 16 0 23 3318 topology 3356 1833
+> 15 0 24 3318 topology 3356 1834
+> 16 0 24 3318 topology 3410 1834
+> 15 0 23 3318 topology 3361 1835
+> 16 0 23 3318 topology 3362 1835
+> 15 0 24 3318 topology 3362 1836
+> 16 0 24 3318 topology 3410 1836
+> 15 0 23 3318 topology 3367 1837
+> 16 0 23 3318 topology 3368 1837
+> 15 0 24 3318 topology 3368 1838
+> 16 0 24 3318 topology 3410 1838
+> 15 0 29 3092 topology 3144 1839
+> 16 0 29 3092 topology 3145 1839
+> 15 0 30 3092 topology 3145 1840
+> 16 0 30 3092 topology 3202 1840
+> 15 0 30 3092 topology 3202 1841
+> 16 0 30 3092 topology 3095 1841
+> 15 0 31 3092 topology 3095 1842
+> 16 0 31 3092 topology 3093 1842
+> 15 0 30 3092 topology 3202 1843
+> 16 0 30 3092 topology 3152 1843
+> 15 0 31 3092 topology 3152 1844
+> 16 0 31 3092 topology 3150 1844
+> 15 0 30 3092 topology 3202 1845
+> 16 0 30 3092 topology 3101 1845
+> 15 0 31 3092 topology 3101 1846
+> 16 0 31 3092 topology 3099 1846
+> 15 0 30 3092 topology 3202 1847
+> 16 0 30 3092 topology 3158 1847
+> 15 0 31 3092 topology 3158 1848
+> 16 0 31 3092 topology 3156 1848
+> 15 0 30 3092 topology 3202 1849
+> 16 0 30 3092 topology 3107 1849
+> 15 0 31 3092 topology 3107 1850
+> 16 0 31 3092 topology 3105 1850
+> 15 0 30 3092 topology 3202 1851
+> 16 0 30 3092 topology 3164 1851
+> 15 0 31 3092 topology 3164 1852
+> 16 0 31 3092 topology 3162 1852
+> 15 0 30 3092 topology 3202 1853
+> 16 0 30 3092 topology 3113 1853
+> 15 0 31 3092 topology 3113 1854
+> 16 0 31 3092 topology 3111 1854
+> 15 0 30 3092 topology 3202 1855
+> 16 0 30 3092 topology 3170 1855
+> 15 0 31 3092 topology 3170 1856
+> 16 0 31 3092 topology 3168 1856
+> 15 0 30 3092 topology 3202 1857
+> 16 0 30 3092 topology 3116 1857
+> 15 0 31 3092 topology 3116 1858
+> 16 0 31 3092 topology 3114 1858
+> 15 0 30 3092 topology 3202 1859
+> 16 0 30 3092 topology 3122 1859
+> 15 0 31 3092 topology 3122 1860
+> 16 0 31 3092 topology 3120 1860
+> 15 0 30 3092 topology 3202 1861
+> 16 0 30 3092 topology 3179 1861
+> 15 0 31 3092 topology 3179 1862
+> 16 0 31 3092 topology 3177 1862
+> 15 0 30 3092 topology 3202 1863
+> 16 0 30 3092 topology 3128 1863
+> 15 0 31 3092 topology 3128 1864
+> 16 0 31 3092 topology 3126 1864
+> 15 0 30 3092 topology 3202 1865
+> 16 0 30 3092 topology 3185 1865
+> 15 0 31 3092 topology 3185 1866
+> 16 0 31 3092 topology 3183 1866
+> 15 0 30 3092 topology 3202 1867
+> 16 0 30 3092 topology 3134 1867
+> 15 0 31 3092 topology 3134 1868
+> 16 0 31 3092 topology 3132 1868
+> 15 0 30 3092 topology 3202 1869
+> 16 0 30 3092 topology 3191 1869
+> 15 0 31 3092 topology 3191 1870
+> 16 0 31 3092 topology 3189 1870
+> 15 0 30 3092 topology 3202 1871
+> 16 0 30 3092 topology 3140 1871
+> 15 0 31 3092 topology 3140 1872
+> 16 0 31 3092 topology 3138 1872
+> 15 0 30 3092 topology 3202 1873
+> 16 0 30 3092 topology 3197 1873
+> 15 0 31 3092 topology 3197 1874
+> 16 0 31 3092 topology 3195 1874
+> 15 0 30 3092 topology 3202 1875
+> 16 0 30 3092 topology 3149 1875
+> 15 0 31 3092 topology 3149 1876
+> 16 0 31 3092 topology 3147 1876
+> 15 0 30 3092 topology 3202 1877
+> 16 0 30 3092 topology 3098 1877
+> 15 0 31 3092 topology 3098 1878
+> 16 0 31 3092 topology 3096 1878
+> 15 0 30 3092 topology 3202 1879
+> 16 0 30 3092 topology 3155 1879
+> 15 0 31 3092 topology 3155 1880
+> 16 0 31 3092 topology 3153 1880
+> 15 0 32 3092 topology 3202 1881
+> 16 0 32 3092 topology 3201 1881
+> 15 0 30 3092 topology 3202 1882
+> 16 0 30 3092 topology 3104 1882
+> 15 0 31 3092 topology 3104 1883
+> 16 0 31 3092 topology 3102 1883
+> 15 0 30 3092 topology 3202 1884
+> 16 0 30 3092 topology 3161 1884
+> 15 0 31 3092 topology 3161 1885
+> 16 0 31 3092 topology 3159 1885
+> 15 0 30 3092 topology 3202 1886
+> 16 0 30 3092 topology 3110 1886
+> 15 0 31 3092 topology 3110 1887
+> 16 0 31 3092 topology 3108 1887
+> 15 0 30 3092 topology 3202 1888
+> 16 0 30 3092 topology 3167 1888
+> 15 0 31 3092 topology 3167 1889
+> 16 0 31 3092 topology 3165 1889
+> 15 0 30 3092 topology 3202 1890
+> 16 0 30 3092 topology 3173 1890
+> 15 0 31 3092 topology 3173 1891
+> 16 0 31 3092 topology 3171 1891
+> 15 0 30 3092 topology 3202 1892
+> 16 0 30 3092 topology 3119 1892
+> 15 0 31 3092 topology 3119 1893
+> 16 0 31 3092 topology 3117 1893
+> 15 0 30 3092 topology 3202 1894
+> 16 0 30 3092 topology 3176 1894
+> 15 0 31 3092 topology 3176 1895
+> 16 0 31 3092 topology 3174 1895
+> 15 0 30 3092 topology 3202 1896
+> 16 0 30 3092 topology 3125 1896
+> 15 0 31 3092 topology 3125 1897
+> 16 0 31 3092 topology 3123 1897
+> 15 0 30 3092 topology 3202 1898
+> 16 0 30 3092 topology 3182 1898
+> 15 0 31 3092 topology 3182 1899
+> 16 0 31 3092 topology 3180 1899
+> 15 0 30 3092 topology 3202 1900
+> 16 0 30 3092 topology 3131 1900
+> 15 0 31 3092 topology 3131 1901
+> 16 0 31 3092 topology 3129 1901
+> 15 0 30 3092 topology 3202 1902
+> 16 0 30 3092 topology 3188 1902
+> 15 0 31 3092 topology 3188 1903
+> 16 0 31 3092 topology 3186 1903
+> 15 0 30 3092 topology 3202 1904
+> 16 0 30 3092 topology 3137 1904
+> 15 0 31 3092 topology 3137 1905
+> 16 0 31 3092 topology 3135 1905
+> 15 0 30 3092 topology 3202 1906
+> 16 0 30 3092 topology 3194 1906
+> 15 0 31 3092 topology 3194 1907
+> 16 0 31 3092 topology 3192 1907
+> 15 0 30 3092 topology 3202 1908
+> 16 0 30 3092 topology 3143 1908
+> 15 0 31 3092 topology 3143 1909
+> 16 0 31 3092 topology 3141 1909
+> 15 0 30 3092 topology 3202 1910
+> 16 0 30 3092 topology 3200 1910
+> 15 0 31 3092 topology 3200 1911
+> 16 0 31 3092 topology 3198 1911
+> 15 0 29 3092 topology 3093 1912
+> 16 0 29 3092 topology 3094 1912
+> 15 0 30 3092 topology 3094 1913
+> 16 0 30 3092 topology 3202 1913
+> 15 0 30 3092 topology 3202 1914
+> 16 0 30 3092 topology 3146 1914
+> 15 0 31 3092 topology 3146 1915
+> 16 0 31 3092 topology 3144 1915
+> 15 0 29 3092 topology 3150 1916
+> 16 0 29 3092 topology 3151 1916
+> 15 0 30 3092 topology 3151 1917
+> 16 0 30 3092 topology 3202 1917
+> 15 0 29 3092 topology 3099 1918
+> 16 0 29 3092 topology 3100 1918
+> 15 0 30 3092 topology 3100 1919
+> 16 0 30 3092 topology 3202 1919
+> 15 0 29 3092 topology 3156 1920
+> 16 0 29 3092 topology 3157 1920
+> 15 0 30 3092 topology 3157 1921
+> 16 0 30 3092 topology 3202 1921
+> 15 0 29 3092 topology 3105 1922
+> 16 0 29 3092 topology 3106 1922
+> 15 0 30 3092 topology 3106 1923
+> 16 0 30 3092 topology 3202 1923
+> 15 0 29 3092 topology 3162 1924
+> 16 0 29 3092 topology 3163 1924
+> 15 0 30 3092 topology 3163 1925
+> 16 0 30 3092 topology 3202 1925
+> 15 0 29 3092 topology 3111 1926
+> 16 0 29 3092 topology 3112 1926
+> 15 0 30 3092 topology 3112 1927
+> 16 0 30 3092 topology 3202 1927
+> 15 0 29 3092 topology 3168 1928
+> 16 0 29 3092 topology 3169 1928
+> 15 0 30 3092 topology 3169 1929
+> 16 0 30 3092 topology 3202 1929
+> 15 0 29 3092 topology 3114 1930
+> 16 0 29 3092 topology 3115 1930
+> 15 0 30 3092 topology 3115 1931
+> 16 0 30 3092 topology 3202 1931
+> 15 0 29 3092 topology 3120 1932
+> 16 0 29 3092 topology 3121 1932
+> 15 0 30 3092 topology 3121 1933
+> 16 0 30 3092 topology 3202 1933
+> 15 0 29 3092 topology 3177 1934
+> 16 0 29 3092 topology 3178 1934
+> 15 0 30 3092 topology 3178 1935
+> 16 0 30 3092 topology 3202 1935
+> 15 0 29 3092 topology 3126 1936
+> 16 0 29 3092 topology 3127 1936
+> 15 0 30 3092 topology 3127 1937
+> 16 0 30 3092 topology 3202 1937
+> 15 0 29 3092 topology 3183 1938
+> 16 0 29 3092 topology 3184 1938
+> 15 0 30 3092 topology 3184 1939
+> 16 0 30 3092 topology 3202 1939
+> 15 0 29 3092 topology 3132 1940
+> 16 0 29 3092 topology 3133 1940
+> 15 0 30 3092 topology 3133 1941
+> 16 0 30 3092 topology 3202 1941
+> 15 0 29 3092 topology 3189 1942
+> 16 0 29 3092 topology 3190 1942
+> 15 0 30 3092 topology 3190 1943
+> 16 0 30 3092 topology 3202 1943
+> 15 0 29 3092 topology 3138 1944
+> 16 0 29 3092 topology 3139 1944
+> 15 0 30 3092 topology 3139 1945
+> 16 0 30 3092 topology 3202 1945
+> 15 0 29 3092 topology 3195 1946
+> 16 0 29 3092 topology 3196 1946
+> 15 0 30 3092 topology 3196 1947
+> 16 0 30 3092 topology 3202 1947
+> 15 0 29 3092 topology 3147 1948
+> 16 0 29 3092 topology 3148 1948
+> 15 0 30 3092 topology 3148 1949
+> 16 0 30 3092 topology 3202 1949
+> 15 0 29 3092 topology 3096 1950
+> 16 0 29 3092 topology 3097 1950
+> 15 0 30 3092 topology 3097 1951
+> 16 0 30 3092 topology 3202 1951
+> 15 0 29 3092 topology 3153 1952
+> 16 0 29 3092 topology 3154 1952
+> 15 0 30 3092 topology 3154 1953
+> 16 0 30 3092 topology 3202 1953
+> 15 0 29 3092 topology 3102 1954
+> 16 0 29 3092 topology 3103 1954
+> 15 0 30 3092 topology 3103 1955
+> 16 0 30 3092 topology 3202 1955
+> 15 0 29 3092 topology 3159 1956
+> 16 0 29 3092 topology 3160 1956
+> 15 0 30 3092 topology 3160 1957
+> 16 0 30 3092 topology 3202 1957
+> 15 0 29 3092 topology 3108 1958
+> 16 0 29 3092 topology 3109 1958
+> 15 0 30 3092 topology 3109 1959
+> 16 0 30 3092 topology 3202 1959
+> 15 0 29 3092 topology 3165 1960
+> 16 0 29 3092 topology 3166 1960
+> 15 0 30 3092 topology 3166 1961
+> 16 0 30 3092 topology 3202 1961
+> 15 0 29 3092 topology 3171 1962
+> 16 0 29 3092 topology 3172 1962
+> 15 0 30 3092 topology 3172 1963
+> 16 0 30 3092 topology 3202 1963
+> 15 0 29 3092 topology 3117 1964
+> 16 0 29 3092 topology 3118 1964
+> 15 0 30 3092 topology 3118 1965
+> 16 0 30 3092 topology 3202 1965
+> 15 0 29 3092 topology 3174 1966
+> 16 0 29 3092 topology 3175 1966
+> 15 0 30 3092 topology 3175 1967
+> 16 0 30 3092 topology 3202 1967
+> 15 0 29 3092 topology 3123 1968
+> 16 0 29 3092 topology 3124 1968
+> 15 0 30 3092 topology 3124 1969
+> 16 0 30 3092 topology 3202 1969
+> 15 0 29 3092 topology 3180 1970
+> 16 0 29 3092 topology 3181 1970
+> 15 0 30 3092 topology 3181 1971
+> 16 0 30 3092 topology 3202 1971
+> 15 0 29 3092 topology 3129 1972
+> 16 0 29 3092 topology 3130 1972
+> 15 0 30 3092 topology 3130 1973
+> 16 0 30 3092 topology 3202 1973
+> 15 0 29 3092 topology 3186 1974
+> 16 0 29 3092 topology 3187 1974
+> 15 0 30 3092 topology 3187 1975
+> 16 0 30 3092 topology 3202 1975
+> 15 0 29 3092 topology 3135 1976
+> 16 0 29 3092 topology 3136 1976
+> 15 0 30 3092 topology 3136 1977
+> 16 0 30 3092 topology 3202 1977
+> 15 0 29 3092 topology 3192 1978
+> 16 0 29 3092 topology 3193 1978
+> 15 0 30 3092 topology 3193 1979
+> 16 0 30 3092 topology 3202 1979
+> 15 0 29 3092 topology 3141 1980
+> 16 0 29 3092 topology 3142 1980
+> 15 0 30 3092 topology 3142 1981
+> 16 0 30 3092 topology 3202 1981
+> 15 0 29 3092 topology 3198 1982
+> 16 0 29 3092 topology 3199 1982
+> 15 0 30 3092 topology 3199 1983
+> 16 0 30 3092 topology 3202 1983
+> 15 0 29 3272 topology 3273 1984
+> 16 0 29 3272 topology 3274 1984
+> 15 0 30 3272 topology 3274 1985
+> 16 0 30 3272 topology 3292 1985
+> 15 0 30 3272 topology 3292 1986
+> 16 0 30 3272 topology 3281 1986
+> 15 0 31 3272 topology 3281 1987
+> 16 0 31 3272 topology 3279 1987
+> 15 0 30 3272 topology 3292 1988
+> 16 0 30 3272 topology 3287 1988
+> 15 0 31 3272 topology 3287 1989
+> 16 0 31 3272 topology 3285 1989
+> 15 0 30 3272 topology 3292 1990
+> 16 0 30 3272 topology 3278 1990
+> 15 0 31 3272 topology 3278 1991
+> 16 0 31 3272 topology 3276 1991
+> 15 0 30 3272 topology 3292 1992
+> 16 0 30 3272 topology 3284 1992
+> 15 0 31 3272 topology 3284 1993
+> 16 0 31 3272 topology 3282 1993
+> 15 0 30 3272 topology 3292 1994
+> 16 0 30 3272 topology 3290 1994
+> 15 0 31 3272 topology 3290 1995
+> 16 0 31 3272 topology 3288 1995
+> 15 0 32 3272 topology 3292 1996
+> 16 0 32 3272 topology 3291 1996
+> 15 0 29 3272 topology 3279 1997
+> 16 0 29 3272 topology 3280 1997
+> 15 0 30 3272 topology 3280 1998
+> 16 0 30 3272 topology 3292 1998
+> 15 0 30 3272 topology 3292 1999
+> 16 0 30 3272 topology 3275 1999
+> 15 0 31 3272 topology 3275 2000
+> 16 0 31 3272 topology 3273 2000
+> 15 0 29 3272 topology 3285 2001
+> 16 0 29 3272 topology 3286 2001
+> 15 0 30 3272 topology 3286 2002
+> 16 0 30 3272 topology 3292 2002
+> 15 0 29 3272 topology 3276 2003
+> 16 0 29 3272 topology 3277 2003
+> 15 0 30 3272 topology 3277 2004
+> 16 0 30 3272 topology 3292 2004
+> 15 0 29 3272 topology 3282 2005
+> 16 0 29 3272 topology 3283 2005
+> 15 0 30 3272 topology 3283 2006
+> 16 0 30 3272 topology 3292 2006
+> 15 0 29 3272 topology 3288 2007
+> 16 0 29 3272 topology 3289 2007
+> 15 0 30 3272 topology 3289 2008
+> 16 0 30 3272 topology 3292 2008
+> 15 0 29 2351 topology 2352 2009
+> 16 0 29 2351 topology 2353 2009
+> 15 0 30 2351 topology 2353 2010
+> 16 0 30 2351 topology 2461 2010
+> 15 0 30 2351 topology 2461 2011
+> 16 0 30 2351 topology 2360 2011
+> 15 0 31 2351 topology 2360 2012
+> 16 0 31 2351 topology 2358 2012
+> 15 0 30 2351 topology 2461 2013
+> 16 0 30 2351 topology 2366 2013
+> 15 0 31 2351 topology 2366 2014
+> 16 0 31 2351 topology 2364 2014
+> 15 0 30 2351 topology 2461 2015
+> 16 0 30 2351 topology 2372 2015
+> 15 0 31 2351 topology 2372 2016
+> 16 0 31 2351 topology 2370 2016
+> 15 0 30 2351 topology 2461 2017
+> 16 0 30 2351 topology 2378 2017
+> 15 0 31 2351 topology 2378 2018
+> 16 0 31 2351 topology 2376 2018
+> 15 0 30 2351 topology 2461 2019
+> 16 0 30 2351 topology 2414 2019
+> 15 0 31 2351 topology 2414 2020
+> 16 0 31 2351 topology 2412 2020
+> 15 0 30 2351 topology 2461 2021
+> 16 0 30 2351 topology 2420 2021
+> 15 0 31 2351 topology 2420 2022
+> 16 0 31 2351 topology 2418 2022
+> 15 0 30 2351 topology 2461 2023
+> 16 0 30 2351 topology 2426 2023
+> 15 0 31 2351 topology 2426 2024
+> 16 0 31 2351 topology 2424 2024
+> 15 0 30 2351 topology 2461 2025
+> 16 0 30 2351 topology 2432 2025
+> 15 0 31 2351 topology 2432 2026
+> 16 0 31 2351 topology 2430 2026
+> 15 0 30 2351 topology 2461 2027
+> 16 0 30 2351 topology 2438 2027
+> 15 0 31 2351 topology 2438 2028
+> 16 0 31 2351 topology 2436 2028
+> 15 0 32 2351 topology 2461 2029
+> 16 0 32 2351 topology 2460 2029
+> 15 0 30 2351 topology 2461 2030
+> 16 0 30 2351 topology 2384 2030
+> 15 0 31 2351 topology 2384 2031
+> 16 0 31 2351 topology 2382 2031
+> 15 0 30 2351 topology 2461 2032
+> 16 0 30 2351 topology 2441 2032
+> 15 0 31 2351 topology 2441 2033
+> 16 0 31 2351 topology 2439 2033
+> 15 0 30 2351 topology 2461 2034
+> 16 0 30 2351 topology 2390 2034
+> 15 0 31 2351 topology 2390 2035
+> 16 0 31 2351 topology 2388 2035
+> 15 0 30 2351 topology 2461 2036
+> 16 0 30 2351 topology 2447 2036
+> 15 0 31 2351 topology 2447 2037
+> 16 0 31 2351 topology 2445 2037
+> 15 0 30 2351 topology 2461 2038
+> 16 0 30 2351 topology 2396 2038
+> 15 0 31 2351 topology 2396 2039
+> 16 0 31 2351 topology 2394 2039
+> 15 0 30 2351 topology 2461 2040
+> 16 0 30 2351 topology 2453 2040
+> 15 0 31 2351 topology 2453 2041
+> 16 0 31 2351 topology 2451 2041
+> 15 0 30 2351 topology 2461 2042
+> 16 0 30 2351 topology 2402 2042
+> 15 0 31 2351 topology 2402 2043
+> 16 0 31 2351 topology 2400 2043
+> 15 0 30 2351 topology 2461 2044
+> 16 0 30 2351 topology 2459 2044
+> 15 0 31 2351 topology 2459 2045
+> 16 0 31 2351 topology 2457 2045
+> 15 0 30 2351 topology 2461 2046
+> 16 0 30 2351 topology 2408 2046
+> 15 0 31 2351 topology 2408 2047
+> 16 0 31 2351 topology 2406 2047
+> 15 0 30 2351 topology 2461 2048
+> 16 0 30 2351 topology 2357 2048
+> 15 0 31 2351 topology 2357 2049
+> 16 0 31 2351 topology 2355 2049
+> 15 0 30 2351 topology 2461 2050
+> 16 0 30 2351 topology 2363 2050
+> 15 0 31 2351 topology 2363 2051
+> 16 0 31 2351 topology 2361 2051
+> 15 0 30 2351 topology 2461 2052
+> 16 0 30 2351 topology 2369 2052
+> 15 0 31 2351 topology 2369 2053
+> 16 0 31 2351 topology 2367 2053
+> 15 0 30 2351 topology 2461 2054
+> 16 0 30 2351 topology 2375 2054
+> 15 0 31 2351 topology 2375 2055
+> 16 0 31 2351 topology 2373 2055
+> 15 0 30 2351 topology 2461 2056
+> 16 0 30 2351 topology 2411 2056
+> 15 0 31 2351 topology 2411 2057
+> 16 0 31 2351 topology 2409 2057
+> 15 0 30 2351 topology 2461 2058
+> 16 0 30 2351 topology 2417 2058
+> 15 0 31 2351 topology 2417 2059
+> 16 0 31 2351 topology 2415 2059
+> 15 0 30 2351 topology 2461 2060
+> 16 0 30 2351 topology 2423 2060
+> 15 0 31 2351 topology 2423 2061
+> 16 0 31 2351 topology 2421 2061
+> 15 0 30 2351 topology 2461 2062
+> 16 0 30 2351 topology 2429 2062
+> 15 0 31 2351 topology 2429 2063
+> 16 0 31 2351 topology 2427 2063
+> 15 0 30 2351 topology 2461 2064
+> 16 0 30 2351 topology 2435 2064
+> 15 0 31 2351 topology 2435 2065
+> 16 0 31 2351 topology 2433 2065
+> 15 0 30 2351 topology 2461 2066
+> 16 0 30 2351 topology 2381 2066
+> 15 0 31 2351 topology 2381 2067
+> 16 0 31 2351 topology 2379 2067
+> 15 0 30 2351 topology 2461 2068
+> 16 0 30 2351 topology 2387 2068
+> 15 0 31 2351 topology 2387 2069
+> 16 0 31 2351 topology 2385 2069
+> 15 0 30 2351 topology 2461 2070
+> 16 0 30 2351 topology 2444 2070
+> 15 0 31 2351 topology 2444 2071
+> 16 0 31 2351 topology 2442 2071
+> 15 0 30 2351 topology 2461 2072
+> 16 0 30 2351 topology 2393 2072
+> 15 0 31 2351 topology 2393 2073
+> 16 0 31 2351 topology 2391 2073
+> 15 0 30 2351 topology 2461 2074
+> 16 0 30 2351 topology 2450 2074
+> 15 0 31 2351 topology 2450 2075
+> 16 0 31 2351 topology 2448 2075
+> 15 0 30 2351 topology 2461 2076
+> 16 0 30 2351 topology 2399 2076
+> 15 0 31 2351 topology 2399 2077
+> 16 0 31 2351 topology 2397 2077
+> 15 0 30 2351 topology 2461 2078
+> 16 0 30 2351 topology 2456 2078
+> 15 0 31 2351 topology 2456 2079
+> 16 0 31 2351 topology 2454 2079
+> 15 0 30 2351 topology 2461 2080
+> 16 0 30 2351 topology 2405 2080
+> 15 0 31 2351 topology 2405 2081
+> 16 0 31 2351 topology 2403 2081
+> 15 0 29 2351 topology 2358 2082
+> 16 0 29 2351 topology 2359 2082
+> 15 0 30 2351 topology 2359 2083
+> 16 0 30 2351 topology 2461 2083
+> 15 0 30 2351 topology 2461 2084
+> 16 0 30 2351 topology 2354 2084
+> 15 0 31 2351 topology 2354 2085
+> 16 0 31 2351 topology 2352 2085
+> 15 0 29 2351 topology 2364 2086
+> 16 0 29 2351 topology 2365 2086
+> 15 0 30 2351 topology 2365 2087
+> 16 0 30 2351 topology 2461 2087
+> 15 0 29 2351 topology 2370 2088
+> 16 0 29 2351 topology 2371 2088
+> 15 0 30 2351 topology 2371 2089
+> 16 0 30 2351 topology 2461 2089
+> 15 0 29 2351 topology 2376 2090
+> 16 0 29 2351 topology 2377 2090
+> 15 0 30 2351 topology 2377 2091
+> 16 0 30 2351 topology 2461 2091
+> 15 0 29 2351 topology 2412 2092
+> 16 0 29 2351 topology 2413 2092
+> 15 0 30 2351 topology 2413 2093
+> 16 0 30 2351 topology 2461 2093
+> 15 0 29 2351 topology 2418 2094
+> 16 0 29 2351 topology 2419 2094
+> 15 0 30 2351 topology 2419 2095
+> 16 0 30 2351 topology 2461 2095
+> 15 0 29 2351 topology 2424 2096
+> 16 0 29 2351 topology 2425 2096
+> 15 0 30 2351 topology 2425 2097
+> 16 0 30 2351 topology 2461 2097
+> 15 0 29 2351 topology 2430 2098
+> 16 0 29 2351 topology 2431 2098
+> 15 0 30 2351 topology 2431 2099
+> 16 0 30 2351 topology 2461 2099
+> 15 0 29 2351 topology 2436 2100
+> 16 0 29 2351 topology 2437 2100
+> 15 0 30 2351 topology 2437 2101
+> 16 0 30 2351 topology 2461 2101
+> 15 0 29 2351 topology 2382 2102
+> 16 0 29 2351 topology 2383 2102
+> 15 0 30 2351 topology 2383 2103
+> 16 0 30 2351 topology 2461 2103
+> 15 0 29 2351 topology 2439 2104
+> 16 0 29 2351 topology 2440 2104
+> 15 0 30 2351 topology 2440 2105
+> 16 0 30 2351 topology 2461 2105
+> 15 0 29 2351 topology 2388 2106
+> 16 0 29 2351 topology 2389 2106
+> 15 0 30 2351 topology 2389 2107
+> 16 0 30 2351 topology 2461 2107
+> 15 0 29 2351 topology 2445 2108
+> 16 0 29 2351 topology 2446 2108
+> 15 0 30 2351 topology 2446 2109
+> 16 0 30 2351 topology 2461 2109
+> 15 0 29 2351 topology 2394 2110
+> 16 0 29 2351 topology 2395 2110
+> 15 0 30 2351 topology 2395 2111
+> 16 0 30 2351 topology 2461 2111
+> 15 0 29 2351 topology 2451 2112
+> 16 0 29 2351 topology 2452 2112
+> 15 0 30 2351 topology 2452 2113
+> 16 0 30 2351 topology 2461 2113
+> 15 0 29 2351 topology 2400 2114
+> 16 0 29 2351 topology 2401 2114
+> 15 0 30 2351 topology 2401 2115
+> 16 0 30 2351 topology 2461 2115
+> 15 0 29 2351 topology 2457 2116
+> 16 0 29 2351 topology 2458 2116
+> 15 0 30 2351 topology 2458 2117
+> 16 0 30 2351 topology 2461 2117
+> 15 0 29 2351 topology 2406 2118
+> 16 0 29 2351 topology 2407 2118
+> 15 0 30 2351 topology 2407 2119
+> 16 0 30 2351 topology 2461 2119
+> 15 0 29 2351 topology 2355 2120
+> 16 0 29 2351 topology 2356 2120
+> 15 0 30 2351 topology 2356 2121
+> 16 0 30 2351 topology 2461 2121
+> 15 0 29 2351 topology 2361 2122
+> 16 0 29 2351 topology 2362 2122
+> 15 0 30 2351 topology 2362 2123
+> 16 0 30 2351 topology 2461 2123
+> 15 0 29 2351 topology 2367 2124
+> 16 0 29 2351 topology 2368 2124
+> 15 0 30 2351 topology 2368 2125
+> 16 0 30 2351 topology 2461 2125
+> 15 0 29 2351 topology 2373 2126
+> 16 0 29 2351 topology 2374 2126
+> 15 0 30 2351 topology 2374 2127
+> 16 0 30 2351 topology 2461 2127
+> 15 0 29 2351 topology 2409 2128
+> 16 0 29 2351 topology 2410 2128
+> 15 0 30 2351 topology 2410 2129
+> 16 0 30 2351 topology 2461 2129
+> 15 0 29 2351 topology 2415 2130
+> 16 0 29 2351 topology 2416 2130
+> 15 0 30 2351 topology 2416 2131
+> 16 0 30 2351 topology 2461 2131
+> 15 0 29 2351 topology 2421 2132
+> 16 0 29 2351 topology 2422 2132
+> 15 0 30 2351 topology 2422 2133
+> 16 0 30 2351 topology 2461 2133
+> 15 0 29 2351 topology 2427 2134
+> 16 0 29 2351 topology 2428 2134
+> 15 0 30 2351 topology 2428 2135
+> 16 0 30 2351 topology 2461 2135
+> 15 0 29 2351 topology 2433 2136
+> 16 0 29 2351 topology 2434 2136
+> 15 0 30 2351 topology 2434 2137
+> 16 0 30 2351 topology 2461 2137
+> 15 0 29 2351 topology 2379 2138
+> 16 0 29 2351 topology 2380 2138
+> 15 0 30 2351 topology 2380 2139
+> 16 0 30 2351 topology 2461 2139
+> 15 0 29 2351 topology 2385 2140
+> 16 0 29 2351 topology 2386 2140
+> 15 0 30 2351 topology 2386 2141
+> 16 0 30 2351 topology 2461 2141
+> 15 0 29 2351 topology 2442 2142
+> 16 0 29 2351 topology 2443 2142
+> 15 0 30 2351 topology 2443 2143
+> 16 0 30 2351 topology 2461 2143
+> 15 0 29 2351 topology 2391 2144
+> 16 0 29 2351 topology 2392 2144
+> 15 0 30 2351 topology 2392 2145
+> 16 0 30 2351 topology 2461 2145
+> 15 0 29 2351 topology 2448 2146
+> 16 0 29 2351 topology 2449 2146
+> 15 0 30 2351 topology 2449 2147
+> 16 0 30 2351 topology 2461 2147
+> 15 0 29 2351 topology 2397 2148
+> 16 0 29 2351 topology 2398 2148
+> 15 0 30 2351 topology 2398 2149
+> 16 0 30 2351 topology 2461 2149
+> 15 0 29 2351 topology 2454 2150
+> 16 0 29 2351 topology 2455 2150
+> 15 0 30 2351 topology 2455 2151
+> 16 0 30 2351 topology 2461 2151
+> 15 0 29 2351 topology 2403 2152
+> 16 0 29 2351 topology 2404 2152
+> 15 0 30 2351 topology 2404 2153
+> 16 0 30 2351 topology 2461 2153
+> 15 0 29 2573 topology 2592 2154
+> 16 0 29 2573 topology 2593 2154
+> 15 0 30 2573 topology 2593 2155
+> 16 0 30 2573 topology 2683 2155
+> 15 0 30 2573 topology 2683 2156
+> 16 0 30 2573 topology 2651 2156
+> 15 0 31 2573 topology 2651 2157
+> 16 0 31 2573 topology 2649 2157
+> 15 0 30 2573 topology 2683 2158
+> 16 0 30 2573 topology 2597 2158
+> 15 0 31 2573 topology 2597 2159
+> 16 0 31 2573 topology 2595 2159
+> 15 0 30 2573 topology 2683 2160
+> 16 0 30 2573 topology 2603 2160
+> 15 0 31 2573 topology 2603 2161
+> 16 0 31 2573 topology 2601 2161
+> 15 0 30 2573 topology 2683 2162
+> 16 0 30 2573 topology 2609 2162
+> 15 0 31 2573 topology 2609 2163
+> 16 0 31 2573 topology 2607 2163
+> 15 0 30 2573 topology 2683 2164
+> 16 0 30 2573 topology 2615 2164
+> 15 0 31 2573 topology 2615 2165
+> 16 0 31 2573 topology 2613 2165
+> 15 0 30 2573 topology 2683 2166
+> 16 0 30 2573 topology 2621 2166
+> 15 0 31 2573 topology 2621 2167
+> 16 0 31 2573 topology 2619 2167
+> 15 0 30 2573 topology 2683 2168
+> 16 0 30 2573 topology 2660 2168
+> 15 0 31 2573 topology 2660 2169
+> 16 0 31 2573 topology 2658 2169
+> 15 0 30 2573 topology 2683 2170
+> 16 0 30 2573 topology 2666 2170
+> 15 0 31 2573 topology 2666 2171
+> 16 0 31 2573 topology 2664 2171
+> 15 0 30 2573 topology 2683 2172
+> 16 0 30 2573 topology 2672 2172
+> 15 0 31 2573 topology 2672 2173
+> 16 0 31 2573 topology 2670 2173
+> 15 0 30 2573 topology 2683 2174
+> 16 0 30 2573 topology 2678 2174
+> 15 0 31 2573 topology 2678 2175
+> 16 0 31 2573 topology 2676 2175
+> 15 0 30 2573 topology 2683 2176
+> 16 0 30 2573 topology 2630 2176
+> 15 0 31 2573 topology 2630 2177
+> 16 0 31 2573 topology 2628 2177
+> 15 0 30 2573 topology 2683 2178
+> 16 0 30 2573 topology 2579 2178
+> 15 0 31 2573 topology 2579 2179
+> 16 0 31 2573 topology 2577 2179
+> 15 0 30 2573 topology 2683 2180
+> 16 0 30 2573 topology 2636 2180
+> 15 0 31 2573 topology 2636 2181
+> 16 0 31 2573 topology 2634 2181
+> 15 0 30 2573 topology 2683 2182
+> 16 0 30 2573 topology 2585 2182
+> 15 0 31 2573 topology 2585 2183
+> 16 0 31 2573 topology 2583 2183
+> 15 0 30 2573 topology 2683 2184
+> 16 0 30 2573 topology 2642 2184
+> 15 0 31 2573 topology 2642 2185
+> 16 0 31 2573 topology 2640 2185
+> 15 0 30 2573 topology 2683 2186
+> 16 0 30 2573 topology 2591 2186
+> 15 0 31 2573 topology 2591 2187
+> 16 0 31 2573 topology 2589 2187
+> 15 0 30 2573 topology 2683 2188
+> 16 0 30 2573 topology 2648 2188
+> 15 0 31 2573 topology 2648 2189
+> 16 0 31 2573 topology 2646 2189
+> 15 0 30 2573 topology 2683 2190
+> 16 0 30 2573 topology 2654 2190
+> 15 0 31 2573 topology 2654 2191
+> 16 0 31 2573 topology 2652 2191
+> 15 0 30 2573 topology 2683 2192
+> 16 0 30 2573 topology 2600 2192
+> 15 0 31 2573 topology 2600 2193
+> 16 0 31 2573 topology 2598 2193
+> 15 0 30 2573 topology 2683 2194
+> 16 0 30 2573 topology 2606 2194
+> 15 0 31 2573 topology 2606 2195
+> 16 0 31 2573 topology 2604 2195
+> 15 0 30 2573 topology 2683 2196
+> 16 0 30 2573 topology 2612 2196
+> 15 0 31 2573 topology 2612 2197
+> 16 0 31 2573 topology 2610 2197
+> 15 0 30 2573 topology 2683 2198
+> 16 0 30 2573 topology 2618 2198
+> 15 0 31 2573 topology 2618 2199
+> 16 0 31 2573 topology 2616 2199
+> 15 0 30 2573 topology 2683 2200
+> 16 0 30 2573 topology 2624 2200
+> 15 0 31 2573 topology 2624 2201
+> 16 0 31 2573 topology 2622 2201
+> 15 0 30 2573 topology 2683 2202
+> 16 0 30 2573 topology 2657 2202
+> 15 0 31 2573 topology 2657 2203
+> 16 0 31 2573 topology 2655 2203
+> 15 0 30 2573 topology 2683 2204
+> 16 0 30 2573 topology 2663 2204
+> 15 0 31 2573 topology 2663 2205
+> 16 0 31 2573 topology 2661 2205
+> 15 0 30 2573 topology 2683 2206
+> 16 0 30 2573 topology 2669 2206
+> 15 0 31 2573 topology 2669 2207
+> 16 0 31 2573 topology 2667 2207
+> 15 0 30 2573 topology 2683 2208
+> 16 0 30 2573 topology 2675 2208
+> 15 0 31 2573 topology 2675 2209
+> 16 0 31 2573 topology 2673 2209
+> 15 0 32 2573 topology 2683 2210
+> 16 0 32 2573 topology 2682 2210
+> 15 0 30 2573 topology 2683 2211
+> 16 0 30 2573 topology 2681 2211
+> 15 0 31 2573 topology 2681 2212
+> 16 0 31 2573 topology 2679 2212
+> 15 0 30 2573 topology 2683 2213
+> 16 0 30 2573 topology 2627 2213
+> 15 0 31 2573 topology 2627 2214
+> 16 0 31 2573 topology 2625 2214
+> 15 0 30 2573 topology 2683 2215
+> 16 0 30 2573 topology 2576 2215
+> 15 0 31 2573 topology 2576 2216
+> 16 0 31 2573 topology 2574 2216
+> 15 0 30 2573 topology 2683 2217
+> 16 0 30 2573 topology 2633 2217
+> 15 0 31 2573 topology 2633 2218
+> 16 0 31 2573 topology 2631 2218
+> 15 0 30 2573 topology 2683 2219
+> 16 0 30 2573 topology 2582 2219
+> 15 0 31 2573 topology 2582 2220
+> 16 0 31 2573 topology 2580 2220
+> 15 0 30 2573 topology 2683 2221
+> 16 0 30 2573 topology 2639 2221
+> 15 0 31 2573 topology 2639 2222
+> 16 0 31 2573 topology 2637 2222
+> 15 0 30 2573 topology 2683 2223
+> 16 0 30 2573 topology 2588 2223
+> 15 0 31 2573 topology 2588 2224
+> 16 0 31 2573 topology 2586 2224
+> 15 0 30 2573 topology 2683 2225
+> 16 0 30 2573 topology 2645 2225
+> 15 0 31 2573 topology 2645 2226
+> 16 0 31 2573 topology 2643 2226
+> 15 0 29 2573 topology 2649 2227
+> 16 0 29 2573 topology 2650 2227
+> 15 0 30 2573 topology 2650 2228
+> 16 0 30 2573 topology 2683 2228
+> 15 0 30 2573 topology 2683 2229
+> 16 0 30 2573 topology 2594 2229
+> 15 0 31 2573 topology 2594 2230
+> 16 0 31 2573 topology 2592 2230
+> 15 0 29 2573 topology 2595 2231
+> 16 0 29 2573 topology 2596 2231
+> 15 0 30 2573 topology 2596 2232
+> 16 0 30 2573 topology 2683 2232
+> 15 0 29 2573 topology 2601 2233
+> 16 0 29 2573 topology 2602 2233
+> 15 0 30 2573 topology 2602 2234
+> 16 0 30 2573 topology 2683 2234
+> 15 0 29 2573 topology 2607 2235
+> 16 0 29 2573 topology 2608 2235
+> 15 0 30 2573 topology 2608 2236
+> 16 0 30 2573 topology 2683 2236
+> 15 0 29 2573 topology 2613 2237
+> 16 0 29 2573 topology 2614 2237
+> 15 0 30 2573 topology 2614 2238
+> 16 0 30 2573 topology 2683 2238
+> 15 0 29 2573 topology 2619 2239
+> 16 0 29 2573 topology 2620 2239
+> 15 0 30 2573 topology 2620 2240
+> 16 0 30 2573 topology 2683 2240
+> 15 0 29 2573 topology 2658 2241
+> 16 0 29 2573 topology 2659 2241
+> 15 0 30 2573 topology 2659 2242
+> 16 0 30 2573 topology 2683 2242
+> 15 0 29 2573 topology 2664 2243
+> 16 0 29 2573 topology 2665 2243
+> 15 0 30 2573 topology 2665 2244
+> 16 0 30 2573 topology 2683 2244
+> 15 0 29 2573 topology 2670 2245
+> 16 0 29 2573 topology 2671 2245
+> 15 0 30 2573 topology 2671 2246
+> 16 0 30 2573 topology 2683 2246
+> 15 0 29 2573 topology 2676 2247
+> 16 0 29 2573 topology 2677 2247
+> 15 0 30 2573 topology 2677 2248
+> 16 0 30 2573 topology 2683 2248
+> 15 0 29 2573 topology 2628 2249
+> 16 0 29 2573 topology 2629 2249
+> 15 0 30 2573 topology 2629 2250
+> 16 0 30 2573 topology 2683 2250
+> 15 0 29 2573 topology 2577 2251
+> 16 0 29 2573 topology 2578 2251
+> 15 0 30 2573 topology 2578 2252
+> 16 0 30 2573 topology 2683 2252
+> 15 0 29 2573 topology 2634 2253
+> 16 0 29 2573 topology 2635 2253
+> 15 0 30 2573 topology 2635 2254
+> 16 0 30 2573 topology 2683 2254
+> 15 0 29 2573 topology 2583 2255
+> 16 0 29 2573 topology 2584 2255
+> 15 0 30 2573 topology 2584 2256
+> 16 0 30 2573 topology 2683 2256
+> 15 0 29 2573 topology 2640 2257
+> 16 0 29 2573 topology 2641 2257
+> 15 0 30 2573 topology 2641 2258
+> 16 0 30 2573 topology 2683 2258
+> 15 0 29 2573 topology 2589 2259
+> 16 0 29 2573 topology 2590 2259
+> 15 0 30 2573 topology 2590 2260
+> 16 0 30 2573 topology 2683 2260
+> 15 0 29 2573 topology 2646 2261
+> 16 0 29 2573 topology 2647 2261
+> 15 0 30 2573 topology 2647 2262
+> 16 0 30 2573 topology 2683 2262
+> 15 0 29 2573 topology 2652 2263
+> 16 0 29 2573 topology 2653 2263
+> 15 0 30 2573 topology 2653 2264
+> 16 0 30 2573 topology 2683 2264
+> 15 0 29 2573 topology 2598 2265
+> 16 0 29 2573 topology 2599 2265
+> 15 0 30 2573 topology 2599 2266
+> 16 0 30 2573 topology 2683 2266
+> 15 0 29 2573 topology 2604 2267
+> 16 0 29 2573 topology 2605 2267
+> 15 0 30 2573 topology 2605 2268
+> 16 0 30 2573 topology 2683 2268
+> 15 0 29 2573 topology 2610 2269
+> 16 0 29 2573 topology 2611 2269
+> 15 0 30 2573 topology 2611 2270
+> 16 0 30 2573 topology 2683 2270
+> 15 0 29 2573 topology 2616 2271
+> 16 0 29 2573 topology 2617 2271
+> 15 0 30 2573 topology 2617 2272
+> 16 0 30 2573 topology 2683 2272
+> 15 0 29 2573 topology 2622 2273
+> 16 0 29 2573 topology 2623 2273
+> 15 0 30 2573 topology 2623 2274
+> 16 0 30 2573 topology 2683 2274
+> 15 0 29 2573 topology 2655 2275
+> 16 0 29 2573 topology 2656 2275
+> 15 0 30 2573 topology 2656 2276
+> 16 0 30 2573 topology 2683 2276
+> 15 0 29 2573 topology 2661 2277
+> 16 0 29 2573 topology 2662 2277
+> 15 0 30 2573 topology 2662 2278
+> 16 0 30 2573 topology 2683 2278
+> 15 0 29 2573 topology 2667 2279
+> 16 0 29 2573 topology 2668 2279
+> 15 0 30 2573 topology 2668 2280
+> 16 0 30 2573 topology 2683 2280
+> 15 0 29 2573 topology 2673 2281
+> 16 0 29 2573 topology 2674 2281
+> 15 0 30 2573 topology 2674 2282
+> 16 0 30 2573 topology 2683 2282
+> 15 0 29 2573 topology 2679 2283
+> 16 0 29 2573 topology 2680 2283
+> 15 0 30 2573 topology 2680 2284
+> 16 0 30 2573 topology 2683 2284
+> 15 0 29 2573 topology 2625 2285
+> 16 0 29 2573 topology 2626 2285
+> 15 0 30 2573 topology 2626 2286
+> 16 0 30 2573 topology 2683 2286
+> 15 0 29 2573 topology 2574 2287
+> 16 0 29 2573 topology 2575 2287
+> 15 0 30 2573 topology 2575 2288
+> 16 0 30 2573 topology 2683 2288
+> 15 0 29 2573 topology 2631 2289
+> 16 0 29 2573 topology 2632 2289
+> 15 0 30 2573 topology 2632 2290
+> 16 0 30 2573 topology 2683 2290
+> 15 0 29 2573 topology 2580 2291
+> 16 0 29 2573 topology 2581 2291
+> 15 0 30 2573 topology 2581 2292
+> 16 0 30 2573 topology 2683 2292
+> 15 0 29 2573 topology 2637 2293
+> 16 0 29 2573 topology 2638 2293
+> 15 0 30 2573 topology 2638 2294
+> 16 0 30 2573 topology 2683 2294
+> 15 0 29 2573 topology 2586 2295
+> 16 0 29 2573 topology 2587 2295
+> 15 0 30 2573 topology 2587 2296
+> 16 0 30 2573 topology 2683 2296
+> 15 0 29 2573 topology 2643 2297
+> 16 0 29 2573 topology 2644 2297
+> 15 0 30 2573 topology 2644 2298
+> 16 0 30 2573 topology 2683 2298
+> 15 0 29 2795 topology 2814 2299
+> 16 0 29 2795 topology 2815 2299
+> 15 0 30 2795 topology 2815 2300
+> 16 0 30 2795 topology 2905 2300
+> 15 0 30 2795 topology 2905 2301
+> 16 0 30 2795 topology 2873 2301
+> 15 0 31 2795 topology 2873 2302
+> 16 0 31 2795 topology 2871 2302
+> 15 0 30 2795 topology 2905 2303
+> 16 0 30 2795 topology 2822 2303
+> 15 0 31 2795 topology 2822 2304
+> 16 0 31 2795 topology 2820 2304
+> 15 0 30 2795 topology 2905 2305
+> 16 0 30 2795 topology 2879 2305
+> 15 0 31 2795 topology 2879 2306
+> 16 0 31 2795 topology 2877 2306
+> 15 0 30 2795 topology 2905 2307
+> 16 0 30 2795 topology 2828 2307
+> 15 0 31 2795 topology 2828 2308
+> 16 0 31 2795 topology 2826 2308
+> 15 0 30 2795 topology 2905 2309
+> 16 0 30 2795 topology 2885 2309
+> 15 0 31 2795 topology 2885 2310
+> 16 0 31 2795 topology 2883 2310
+> 15 0 30 2795 topology 2905 2311
+> 16 0 30 2795 topology 2834 2311
+> 15 0 31 2795 topology 2834 2312
+> 16 0 31 2795 topology 2832 2312
+> 15 0 30 2795 topology 2905 2313
+> 16 0 30 2795 topology 2891 2313
+> 15 0 31 2795 topology 2891 2314
+> 16 0 31 2795 topology 2889 2314
+> 15 0 30 2795 topology 2905 2315
+> 16 0 30 2795 topology 2840 2315
+> 15 0 31 2795 topology 2840 2316
+> 16 0 31 2795 topology 2838 2316
+> 15 0 30 2795 topology 2905 2317
+> 16 0 30 2795 topology 2897 2317
+> 15 0 31 2795 topology 2897 2318
+> 16 0 31 2795 topology 2895 2318
+> 15 0 30 2795 topology 2905 2319
+> 16 0 30 2795 topology 2843 2319
+> 15 0 31 2795 topology 2843 2320
+> 16 0 31 2795 topology 2841 2320
+> 15 0 30 2795 topology 2905 2321
+> 16 0 30 2795 topology 2849 2321
+> 15 0 31 2795 topology 2849 2322
+> 16 0 31 2795 topology 2847 2322
+> 15 0 32 2795 topology 2905 2323
+> 16 0 32 2795 topology 2904 2323
+> 15 0 30 2795 topology 2905 2324
+> 16 0 30 2795 topology 2798 2324
+> 15 0 31 2795 topology 2798 2325
+> 16 0 31 2795 topology 2796 2325
+> 15 0 30 2795 topology 2905 2326
+> 16 0 30 2795 topology 2855 2326
+> 15 0 31 2795 topology 2855 2327
+> 16 0 31 2795 topology 2853 2327
+> 15 0 30 2795 topology 2905 2328
+> 16 0 30 2795 topology 2804 2328
+> 15 0 31 2795 topology 2804 2329
+> 16 0 31 2795 topology 2802 2329
+> 15 0 30 2795 topology 2905 2330
+> 16 0 30 2795 topology 2861 2330
+> 15 0 31 2795 topology 2861 2331
+> 16 0 31 2795 topology 2859 2331
+> 15 0 30 2795 topology 2905 2332
+> 16 0 30 2795 topology 2810 2332
+> 15 0 31 2795 topology 2810 2333
+> 16 0 31 2795 topology 2808 2333
+> 15 0 30 2795 topology 2905 2334
+> 16 0 30 2795 topology 2867 2334
+> 15 0 31 2795 topology 2867 2335
+> 16 0 31 2795 topology 2865 2335
+> 15 0 30 2795 topology 2905 2336
+> 16 0 30 2795 topology 2813 2336
+> 15 0 31 2795 topology 2813 2337
+> 16 0 31 2795 topology 2811 2337
+> 15 0 30 2795 topology 2905 2338
+> 16 0 30 2795 topology 2819 2338
+> 15 0 31 2795 topology 2819 2339
+> 16 0 31 2795 topology 2817 2339
+> 15 0 30 2795 topology 2905 2340
+> 16 0 30 2795 topology 2876 2340
+> 15 0 31 2795 topology 2876 2341
+> 16 0 31 2795 topology 2874 2341
+> 15 0 30 2795 topology 2905 2342
+> 16 0 30 2795 topology 2825 2342
+> 15 0 31 2795 topology 2825 2343
+> 16 0 31 2795 topology 2823 2343
+> 15 0 30 2795 topology 2905 2344
+> 16 0 30 2795 topology 2882 2344
+> 15 0 31 2795 topology 2882 2345
+> 16 0 31 2795 topology 2880 2345
+> 15 0 30 2795 topology 2905 2346
+> 16 0 30 2795 topology 2831 2346
+> 15 0 31 2795 topology 2831 2347
+> 16 0 31 2795 topology 2829 2347
+> 15 0 30 2795 topology 2905 2348
+> 16 0 30 2795 topology 2888 2348
+> 15 0 31 2795 topology 2888 2349
+> 16 0 31 2795 topology 2886 2349
+> 15 0 30 2795 topology 2905 2350
+> 16 0 30 2795 topology 2837 2350
+> 15 0 31 2795 topology 2837 2351
+> 16 0 31 2795 topology 2835 2351
+> 15 0 30 2795 topology 2905 2352
+> 16 0 30 2795 topology 2894 2352
+> 15 0 31 2795 topology 2894 2353
+> 16 0 31 2795 topology 2892 2353
+> 15 0 30 2795 topology 2905 2354
+> 16 0 30 2795 topology 2900 2354
+> 15 0 31 2795 topology 2900 2355
+> 16 0 31 2795 topology 2898 2355
+> 15 0 30 2795 topology 2905 2356
+> 16 0 30 2795 topology 2846 2356
+> 15 0 31 2795 topology 2846 2357
+> 16 0 31 2795 topology 2844 2357
+> 15 0 30 2795 topology 2905 2358
+> 16 0 30 2795 topology 2903 2358
+> 15 0 31 2795 topology 2903 2359
+> 16 0 31 2795 topology 2901 2359
+> 15 0 30 2795 topology 2905 2360
+> 16 0 30 2795 topology 2852 2360
+> 15 0 31 2795 topology 2852 2361
+> 16 0 31 2795 topology 2850 2361
+> 15 0 30 2795 topology 2905 2362
+> 16 0 30 2795 topology 2801 2362
+> 15 0 31 2795 topology 2801 2363
+> 16 0 31 2795 topology 2799 2363
+> 15 0 30 2795 topology 2905 2364
+> 16 0 30 2795 topology 2858 2364
+> 15 0 31 2795 topology 2858 2365
+> 16 0 31 2795 topology 2856 2365
+> 15 0 30 2795 topology 2905 2366
+> 16 0 30 2795 topology 2807 2366
+> 15 0 31 2795 topology 2807 2367
+> 16 0 31 2795 topology 2805 2367
+> 15 0 30 2795 topology 2905 2368
+> 16 0 30 2795 topology 2864 2368
+> 15 0 31 2795 topology 2864 2369
+> 16 0 31 2795 topology 2862 2369
+> 15 0 30 2795 topology 2905 2370
+> 16 0 30 2795 topology 2870 2370
+> 15 0 31 2795 topology 2870 2371
+> 16 0 31 2795 topology 2868 2371
+> 15 0 29 2795 topology 2871 2372
+> 16 0 29 2795 topology 2872 2372
+> 15 0 30 2795 topology 2872 2373
+> 16 0 30 2795 topology 2905 2373
+> 15 0 30 2795 topology 2905 2374
+> 16 0 30 2795 topology 2816 2374
+> 15 0 31 2795 topology 2816 2375
+> 16 0 31 2795 topology 2814 2375
+> 15 0 29 2795 topology 2820 2376
+> 16 0 29 2795 topology 2821 2376
+> 15 0 30 2795 topology 2821 2377
+> 16 0 30 2795 topology 2905 2377
+> 15 0 29 2795 topology 2877 2378
+> 16 0 29 2795 topology 2878 2378
+> 15 0 30 2795 topology 2878 2379
+> 16 0 30 2795 topology 2905 2379
+> 15 0 29 2795 topology 2826 2380
+> 16 0 29 2795 topology 2827 2380
+> 15 0 30 2795 topology 2827 2381
+> 16 0 30 2795 topology 2905 2381
+> 15 0 29 2795 topology 2883 2382
+> 16 0 29 2795 topology 2884 2382
+> 15 0 30 2795 topology 2884 2383
+> 16 0 30 2795 topology 2905 2383
+> 15 0 29 2795 topology 2832 2384
+> 16 0 29 2795 topology 2833 2384
+> 15 0 30 2795 topology 2833 2385
+> 16 0 30 2795 topology 2905 2385
+> 15 0 29 2795 topology 2889 2386
+> 16 0 29 2795 topology 2890 2386
+> 15 0 30 2795 topology 2890 2387
+> 16 0 30 2795 topology 2905 2387
+> 15 0 29 2795 topology 2838 2388
+> 16 0 29 2795 topology 2839 2388
+> 15 0 30 2795 topology 2839 2389
+> 16 0 30 2795 topology 2905 2389
+> 15 0 29 2795 topology 2895 2390
+> 16 0 29 2795 topology 2896 2390
+> 15 0 30 2795 topology 2896 2391
+> 16 0 30 2795 topology 2905 2391
+> 15 0 29 2795 topology 2841 2392
+> 16 0 29 2795 topology 2842 2392
+> 15 0 30 2795 topology 2842 2393
+> 16 0 30 2795 topology 2905 2393
+> 15 0 29 2795 topology 2847 2394
+> 16 0 29 2795 topology 2848 2394
+> 15 0 30 2795 topology 2848 2395
+> 16 0 30 2795 topology 2905 2395
+> 15 0 29 2795 topology 2796 2396
+> 16 0 29 2795 topology 2797 2396
+> 15 0 30 2795 topology 2797 2397
+> 16 0 30 2795 topology 2905 2397
+> 15 0 29 2795 topology 2853 2398
+> 16 0 29 2795 topology 2854 2398
+> 15 0 30 2795 topology 2854 2399
+> 16 0 30 2795 topology 2905 2399
+> 15 0 29 2795 topology 2802 2400
+> 16 0 29 2795 topology 2803 2400
+> 15 0 30 2795 topology 2803 2401
+> 16 0 30 2795 topology 2905 2401
+> 15 0 29 2795 topology 2859 2402
+> 16 0 29 2795 topology 2860 2402
+> 15 0 30 2795 topology 2860 2403
+> 16 0 30 2795 topology 2905 2403
+> 15 0 29 2795 topology 2808 2404
+> 16 0 29 2795 topology 2809 2404
+> 15 0 30 2795 topology 2809 2405
+> 16 0 30 2795 topology 2905 2405
+> 15 0 29 2795 topology 2865 2406
+> 16 0 29 2795 topology 2866 2406
+> 15 0 30 2795 topology 2866 2407
+> 16 0 30 2795 topology 2905 2407
+> 15 0 29 2795 topology 2811 2408
+> 16 0 29 2795 topology 2812 2408
+> 15 0 30 2795 topology 2812 2409
+> 16 0 30 2795 topology 2905 2409
+> 15 0 29 2795 topology 2817 2410
+> 16 0 29 2795 topology 2818 2410
+> 15 0 30 2795 topology 2818 2411
+> 16 0 30 2795 topology 2905 2411
+> 15 0 29 2795 topology 2874 2412
+> 16 0 29 2795 topology 2875 2412
+> 15 0 30 2795 topology 2875 2413
+> 16 0 30 2795 topology 2905 2413
+> 15 0 29 2795 topology 2823 2414
+> 16 0 29 2795 topology 2824 2414
+> 15 0 30 2795 topology 2824 2415
+> 16 0 30 2795 topology 2905 2415
+> 15 0 29 2795 topology 2880 2416
+> 16 0 29 2795 topology 2881 2416
+> 15 0 30 2795 topology 2881 2417
+> 16 0 30 2795 topology 2905 2417
+> 15 0 29 2795 topology 2829 2418
+> 16 0 29 2795 topology 2830 2418
+> 15 0 30 2795 topology 2830 2419
+> 16 0 30 2795 topology 2905 2419
+> 15 0 29 2795 topology 2886 2420
+> 16 0 29 2795 topology 2887 2420
+> 15 0 30 2795 topology 2887 2421
+> 16 0 30 2795 topology 2905 2421
+> 15 0 29 2795 topology 2835 2422
+> 16 0 29 2795 topology 2836 2422
+> 15 0 30 2795 topology 2836 2423
+> 16 0 30 2795 topology 2905 2423
+> 15 0 29 2795 topology 2892 2424
+> 16 0 29 2795 topology 2893 2424
+> 15 0 30 2795 topology 2893 2425
+> 16 0 30 2795 topology 2905 2425
+> 15 0 29 2795 topology 2898 2426
+> 16 0 29 2795 topology 2899 2426
+> 15 0 30 2795 topology 2899 2427
+> 16 0 30 2795 topology 2905 2427
+> 15 0 29 2795 topology 2844 2428
+> 16 0 29 2795 topology 2845 2428
+> 15 0 30 2795 topology 2845 2429
+> 16 0 30 2795 topology 2905 2429
+> 15 0 29 2795 topology 2901 2430
+> 16 0 29 2795 topology 2902 2430
+> 15 0 30 2795 topology 2902 2431
+> 16 0 30 2795 topology 2905 2431
+> 15 0 29 2795 topology 2850 2432
+> 16 0 29 2795 topology 2851 2432
+> 15 0 30 2795 topology 2851 2433
+> 16 0 30 2795 topology 2905 2433
+> 15 0 29 2795 topology 2799 2434
+> 16 0 29 2795 topology 2800 2434
+> 15 0 30 2795 topology 2800 2435
+> 16 0 30 2795 topology 2905 2435
+> 15 0 29 2795 topology 2856 2436
+> 16 0 29 2795 topology 2857 2436
+> 15 0 30 2795 topology 2857 2437
+> 16 0 30 2795 topology 2905 2437
+> 15 0 29 2795 topology 2805 2438
+> 16 0 29 2795 topology 2806 2438
+> 15 0 30 2795 topology 2806 2439
+> 16 0 30 2795 topology 2905 2439
+> 15 0 29 2795 topology 2862 2440
+> 16 0 29 2795 topology 2863 2440
+> 15 0 30 2795 topology 2863 2441
+> 16 0 30 2795 topology 2905 2441
+> 15 0 29 2795 topology 2868 2442
+> 16 0 29 2795 topology 2869 2442
+> 15 0 30 2795 topology 2869 2443
+> 16 0 30 2795 topology 2905 2443
+> 15 0 29 2981 topology 3021 2444
+> 16 0 29 2981 topology 3022 2444
+> 15 0 30 2981 topology 3022 2445
+> 16 0 30 2981 topology 3091 2445
+> 15 0 30 2981 topology 3091 2446
+> 16 0 30 2981 topology 3029 2446
+> 15 0 31 2981 topology 3029 2447
+> 16 0 31 2981 topology 3027 2447
+> 15 0 30 2981 topology 3091 2448
+> 16 0 30 2981 topology 3086 2448
+> 15 0 31 2981 topology 3086 2449
+> 16 0 31 2981 topology 3084 2449
+> 15 0 30 2981 topology 3091 2450
+> 16 0 30 2981 topology 3035 2450
+> 15 0 31 2981 topology 3035 2451
+> 16 0 31 2981 topology 3033 2451
+> 15 0 30 2981 topology 3091 2452
+> 16 0 30 2981 topology 2984 2452
+> 15 0 31 2981 topology 2984 2453
+> 16 0 31 2981 topology 2982 2453
+> 15 0 30 2981 topology 3091 2454
+> 16 0 30 2981 topology 3041 2454
+> 15 0 31 2981 topology 3041 2455
+> 16 0 31 2981 topology 3039 2455
+> 15 0 30 2981 topology 3091 2456
+> 16 0 30 2981 topology 2990 2456
+> 15 0 31 2981 topology 2990 2457
+> 16 0 31 2981 topology 2988 2457
+> 15 0 30 2981 topology 3091 2458
+> 16 0 30 2981 topology 3047 2458
+> 15 0 31 2981 topology 3047 2459
+> 16 0 31 2981 topology 3045 2459
+> 15 0 30 2981 topology 3091 2460
+> 16 0 30 2981 topology 2993 2460
+> 15 0 31 2981 topology 2993 2461
+> 16 0 31 2981 topology 2991 2461
+> 15 0 30 2981 topology 3091 2462
+> 16 0 30 2981 topology 2999 2462
+> 15 0 31 2981 topology 2999 2463
+> 16 0 31 2981 topology 2997 2463
+> 15 0 30 2981 topology 3091 2464
+> 16 0 30 2981 topology 3056 2464
+> 15 0 31 2981 topology 3056 2465
+> 16 0 31 2981 topology 3054 2465
+> 15 0 30 2981 topology 3091 2466
+> 16 0 30 2981 topology 3005 2466
+> 15 0 31 2981 topology 3005 2467
+> 16 0 31 2981 topology 3003 2467
+> 15 0 30 2981 topology 3091 2468
+> 16 0 30 2981 topology 3062 2468
+> 15 0 31 2981 topology 3062 2469
+> 16 0 31 2981 topology 3060 2469
+> 15 0 30 2981 topology 3091 2470
+> 16 0 30 2981 topology 3011 2470
+> 15 0 31 2981 topology 3011 2471
+> 16 0 31 2981 topology 3009 2471
+> 15 0 30 2981 topology 3091 2472
+> 16 0 30 2981 topology 3068 2472
+> 15 0 31 2981 topology 3068 2473
+> 16 0 31 2981 topology 3066 2473
+> 15 0 30 2981 topology 3091 2474
+> 16 0 30 2981 topology 3017 2474
+> 15 0 31 2981 topology 3017 2475
+> 16 0 31 2981 topology 3015 2475
+> 15 0 30 2981 topology 3091 2476
+> 16 0 30 2981 topology 3074 2476
+> 15 0 31 2981 topology 3074 2477
+> 16 0 31 2981 topology 3072 2477
+> 15 0 30 2981 topology 3091 2478
+> 16 0 30 2981 topology 3080 2478
+> 15 0 31 2981 topology 3080 2479
+> 16 0 31 2981 topology 3078 2479
+> 15 0 30 2981 topology 3091 2480
+> 16 0 30 2981 topology 3026 2480
+> 15 0 31 2981 topology 3026 2481
+> 16 0 31 2981 topology 3024 2481
+> 15 0 30 2981 topology 3091 2482
+> 16 0 30 2981 topology 3083 2482
+> 15 0 31 2981 topology 3083 2483
+> 16 0 31 2981 topology 3081 2483
+> 15 0 30 2981 topology 3091 2484
+> 16 0 30 2981 topology 3032 2484
+> 15 0 31 2981 topology 3032 2485
+> 16 0 31 2981 topology 3030 2485
+> 15 0 30 2981 topology 3091 2486
+> 16 0 30 2981 topology 3089 2486
+> 15 0 31 2981 topology 3089 2487
+> 16 0 31 2981 topology 3087 2487
+> 15 0 30 2981 topology 3091 2488
+> 16 0 30 2981 topology 3038 2488
+> 15 0 31 2981 topology 3038 2489
+> 16 0 31 2981 topology 3036 2489
+> 15 0 30 2981 topology 3091 2490
+> 16 0 30 2981 topology 2987 2490
+> 15 0 31 2981 topology 2987 2491
+> 16 0 31 2981 topology 2985 2491
+> 15 0 30 2981 topology 3091 2492
+> 16 0 30 2981 topology 3044 2492
+> 15 0 31 2981 topology 3044 2493
+> 16 0 31 2981 topology 3042 2493
+> 15 0 30 2981 topology 3091 2494
+> 16 0 30 2981 topology 3050 2494
+> 15 0 31 2981 topology 3050 2495
+> 16 0 31 2981 topology 3048 2495
+> 15 0 30 2981 topology 3091 2496
+> 16 0 30 2981 topology 2996 2496
+> 15 0 31 2981 topology 2996 2497
+> 16 0 31 2981 topology 2994 2497
+> 15 0 30 2981 topology 3091 2498
+> 16 0 30 2981 topology 3053 2498
+> 15 0 31 2981 topology 3053 2499
+> 16 0 31 2981 topology 3051 2499
+> 15 0 30 2981 topology 3091 2500
+> 16 0 30 2981 topology 3002 2500
+> 15 0 31 2981 topology 3002 2501
+> 16 0 31 2981 topology 3000 2501
+> 15 0 30 2981 topology 3091 2502
+> 16 0 30 2981 topology 3059 2502
+> 15 0 31 2981 topology 3059 2503
+> 16 0 31 2981 topology 3057 2503
+> 15 0 30 2981 topology 3091 2504
+> 16 0 30 2981 topology 3008 2504
+> 15 0 31 2981 topology 3008 2505
+> 16 0 31 2981 topology 3006 2505
+> 15 0 30 2981 topology 3091 2506
+> 16 0 30 2981 topology 3065 2506
+> 15 0 31 2981 topology 3065 2507
+> 16 0 31 2981 topology 3063 2507
+> 15 0 30 2981 topology 3091 2508
+> 16 0 30 2981 topology 3014 2508
+> 15 0 31 2981 topology 3014 2509
+> 16 0 31 2981 topology 3012 2509
+> 15 0 32 2981 topology 3091 2510
+> 16 0 32 2981 topology 3090 2510
+> 15 0 30 2981 topology 3091 2511
+> 16 0 30 2981 topology 3071 2511
+> 15 0 31 2981 topology 3071 2512
+> 16 0 31 2981 topology 3069 2512
+> 15 0 30 2981 topology 3091 2513
+> 16 0 30 2981 topology 3020 2513
+> 15 0 31 2981 topology 3020 2514
+> 16 0 31 2981 topology 3018 2514
+> 15 0 30 2981 topology 3091 2515
+> 16 0 30 2981 topology 3077 2515
+> 15 0 31 2981 topology 3077 2516
+> 16 0 31 2981 topology 3075 2516
+> 15 0 29 2981 topology 3027 2517
+> 16 0 29 2981 topology 3028 2517
+> 15 0 30 2981 topology 3028 2518
+> 16 0 30 2981 topology 3091 2518
+> 15 0 30 2981 topology 3091 2519
+> 16 0 30 2981 topology 3023 2519
+> 15 0 31 2981 topology 3023 2520
+> 16 0 31 2981 topology 3021 2520
+> 15 0 29 2981 topology 3084 2521
+> 16 0 29 2981 topology 3085 2521
+> 15 0 30 2981 topology 3085 2522
+> 16 0 30 2981 topology 3091 2522
+> 15 0 29 2981 topology 3033 2523
+> 16 0 29 2981 topology 3034 2523
+> 15 0 30 2981 topology 3034 2524
+> 16 0 30 2981 topology 3091 2524
+> 15 0 29 2981 topology 2982 2525
+> 16 0 29 2981 topology 2983 2525
+> 15 0 30 2981 topology 2983 2526
+> 16 0 30 2981 topology 3091 2526
+> 15 0 29 2981 topology 3039 2527
+> 16 0 29 2981 topology 3040 2527
+> 15 0 30 2981 topology 3040 2528
+> 16 0 30 2981 topology 3091 2528
+> 15 0 29 2981 topology 2988 2529
+> 16 0 29 2981 topology 2989 2529
+> 15 0 30 2981 topology 2989 2530
+> 16 0 30 2981 topology 3091 2530
+> 15 0 29 2981 topology 3045 2531
+> 16 0 29 2981 topology 3046 2531
+> 15 0 30 2981 topology 3046 2532
+> 16 0 30 2981 topology 3091 2532
+> 15 0 29 2981 topology 2991 2533
+> 16 0 29 2981 topology 2992 2533
+> 15 0 30 2981 topology 2992 2534
+> 16 0 30 2981 topology 3091 2534
+> 15 0 29 2981 topology 2997 2535
+> 16 0 29 2981 topology 2998 2535
+> 15 0 30 2981 topology 2998 2536
+> 16 0 30 2981 topology 3091 2536
+> 15 0 29 2981 topology 3054 2537
+> 16 0 29 2981 topology 3055 2537
+> 15 0 30 2981 topology 3055 2538
+> 16 0 30 2981 topology 3091 2538
+> 15 0 29 2981 topology 3003 2539
+> 16 0 29 2981 topology 3004 2539
+> 15 0 30 2981 topology 3004 2540
+> 16 0 30 2981 topology 3091 2540
+> 15 0 29 2981 topology 3060 2541
+> 16 0 29 2981 topology 3061 2541
+> 15 0 30 2981 topology 3061 2542
+> 16 0 30 2981 topology 3091 2542
+> 15 0 29 2981 topology 3009 2543
+> 16 0 29 2981 topology 3010 2543
+> 15 0 30 2981 topology 3010 2544
+> 16 0 30 2981 topology 3091 2544
+> 15 0 29 2981 topology 3066 2545
+> 16 0 29 2981 topology 3067 2545
+> 15 0 30 2981 topology 3067 2546
+> 16 0 30 2981 topology 3091 2546
+> 15 0 29 2981 topology 3015 2547
+> 16 0 29 2981 topology 3016 2547
+> 15 0 30 2981 topology 3016 2548
+> 16 0 30 2981 topology 3091 2548
+> 15 0 29 2981 topology 3072 2549
+> 16 0 29 2981 topology 3073 2549
+> 15 0 30 2981 topology 3073 2550
+> 16 0 30 2981 topology 3091 2550
+> 15 0 29 2981 topology 3078 2551
+> 16 0 29 2981 topology 3079 2551
+> 15 0 30 2981 topology 3079 2552
+> 16 0 30 2981 topology 3091 2552
+> 15 0 29 2981 topology 3024 2553
+> 16 0 29 2981 topology 3025 2553
+> 15 0 30 2981 topology 3025 2554
+> 16 0 30 2981 topology 3091 2554
+> 15 0 29 2981 topology 3081 2555
+> 16 0 29 2981 topology 3082 2555
+> 15 0 30 2981 topology 3082 2556
+> 16 0 30 2981 topology 3091 2556
+> 15 0 29 2981 topology 3030 2557
+> 16 0 29 2981 topology 3031 2557
+> 15 0 30 2981 topology 3031 2558
+> 16 0 30 2981 topology 3091 2558
+> 15 0 29 2981 topology 3087 2559
+> 16 0 29 2981 topology 3088 2559
+> 15 0 30 2981 topology 3088 2560
+> 16 0 30 2981 topology 3091 2560
+> 15 0 29 2981 topology 3036 2561
+> 16 0 29 2981 topology 3037 2561
+> 15 0 30 2981 topology 3037 2562
+> 16 0 30 2981 topology 3091 2562
+> 15 0 29 2981 topology 2985 2563
+> 16 0 29 2981 topology 2986 2563
+> 15 0 30 2981 topology 2986 2564
+> 16 0 30 2981 topology 3091 2564
+> 15 0 29 2981 topology 3042 2565
+> 16 0 29 2981 topology 3043 2565
+> 15 0 30 2981 topology 3043 2566
+> 16 0 30 2981 topology 3091 2566
+> 15 0 29 2981 topology 3048 2567
+> 16 0 29 2981 topology 3049 2567
+> 15 0 30 2981 topology 3049 2568
+> 16 0 30 2981 topology 3091 2568
+> 15 0 29 2981 topology 2994 2569
+> 16 0 29 2981 topology 2995 2569
+> 15 0 30 2981 topology 2995 2570
+> 16 0 30 2981 topology 3091 2570
+> 15 0 29 2981 topology 3051 2571
+> 16 0 29 2981 topology 3052 2571
+> 15 0 30 2981 topology 3052 2572
+> 16 0 30 2981 topology 3091 2572
+> 15 0 29 2981 topology 3000 2573
+> 16 0 29 2981 topology 3001 2573
+> 15 0 30 2981 topology 3001 2574
+> 16 0 30 2981 topology 3091 2574
+> 15 0 29 2981 topology 3057 2575
+> 16 0 29 2981 topology 3058 2575
+> 15 0 30 2981 topology 3058 2576
+> 16 0 30 2981 topology 3091 2576
+> 15 0 29 2981 topology 3006 2577
+> 16 0 29 2981 topology 3007 2577
+> 15 0 30 2981 topology 3007 2578
+> 16 0 30 2981 topology 3091 2578
+> 15 0 29 2981 topology 3063 2579
+> 16 0 29 2981 topology 3064 2579
+> 15 0 30 2981 topology 3064 2580
+> 16 0 30 2981 topology 3091 2580
+> 15 0 29 2981 topology 3012 2581
+> 16 0 29 2981 topology 3013 2581
+> 15 0 30 2981 topology 3013 2582
+> 16 0 30 2981 topology 3091 2582
+> 15 0 29 2981 topology 3069 2583
+> 16 0 29 2981 topology 3070 2583
+> 15 0 30 2981 topology 3070 2584
+> 16 0 30 2981 topology 3091 2584
+> 15 0 29 2981 topology 3018 2585
+> 16 0 29 2981 topology 3019 2585
+> 15 0 30 2981 topology 3019 2586
+> 16 0 30 2981 topology 3091 2586
+> 15 0 29 2981 topology 3075 2587
+> 16 0 29 2981 topology 3076 2587
+> 15 0 30 2981 topology 3076 2588
+> 16 0 30 2981 topology 3091 2588
+> 15 0 29 3293 topology 3306 2589
+> 16 0 29 3293 topology 3307 2589
+> 15 0 30 3293 topology 3307 2590
+> 16 0 30 3293 topology 3313 2590
+> 15 0 30 3293 topology 3313 2591
+> 16 0 30 3293 topology 3296 2591
+> 15 0 31 3293 topology 3296 2592
+> 16 0 31 3293 topology 3294 2592
+> 15 0 30 3293 topology 3313 2593
+> 16 0 30 3293 topology 3302 2593
+> 15 0 31 3293 topology 3302 2594
+> 16 0 31 3293 topology 3300 2594
+> 15 0 30 3293 topology 3313 2595
+> 16 0 30 3293 topology 3305 2595
+> 15 0 31 3293 topology 3305 2596
+> 16 0 31 3293 topology 3303 2596
+> 15 0 30 3293 topology 3313 2597
+> 16 0 30 3293 topology 3311 2597
+> 15 0 31 3293 topology 3311 2598
+> 16 0 31 3293 topology 3309 2598
+> 15 0 32 3293 topology 3313 2599
+> 16 0 32 3293 topology 3312 2599
+> 15 0 30 3293 topology 3313 2600
+> 16 0 30 3293 topology 3299 2600
+> 15 0 31 3293 topology 3299 2601
+> 16 0 31 3293 topology 3297 2601
+> 15 0 29 3293 topology 3294 2602
+> 16 0 29 3293 topology 3295 2602
+> 15 0 30 3293 topology 3295 2603
+> 16 0 30 3293 topology 3313 2603
+> 15 0 30 3293 topology 3313 2604
+> 16 0 30 3293 topology 3308 2604
+> 15 0 31 3293 topology 3308 2605
+> 16 0 31 3293 topology 3306 2605
+> 15 0 29 3293 topology 3300 2606
+> 16 0 29 3293 topology 3301 2606
+> 15 0 30 3293 topology 3301 2607
+> 16 0 30 3293 topology 3313 2607
+> 15 0 29 3293 topology 3303 2608
+> 16 0 29 3293 topology 3304 2608
+> 15 0 30 3293 topology 3304 2609
+> 16 0 30 3293 topology 3313 2609
+> 15 0 29 3293 topology 3309 2610
+> 16 0 29 3293 topology 3310 2610
+> 15 0 30 3293 topology 3310 2611
+> 16 0 30 3293 topology 3313 2611
+> 15 0 29 3293 topology 3297 2612
+> 16 0 29 3293 topology 3298 2612
+> 15 0 30 3293 topology 3298 2613
+> 16 0 30 3293 topology 3313 2613
+> 15 0 29 3203 topology 3210 2614
+> 16 0 29 3203 topology 3211 2614
+> 15 0 30 3203 topology 3211 2615
+> 16 0 30 3203 topology 3271 2615
+> 15 0 30 3203 topology 3271 2616
+> 16 0 30 3203 topology 3218 2616
+> 15 0 31 3203 topology 3218 2617
+> 16 0 31 3203 topology 3216 2617
+> 15 0 30 3203 topology 3271 2618
+> 16 0 30 3203 topology 3224 2618
+> 15 0 31 3203 topology 3224 2619
+> 16 0 31 3203 topology 3222 2619
+> 15 0 30 3203 topology 3271 2620
+> 16 0 30 3203 topology 3230 2620
+> 15 0 31 3203 topology 3230 2621
+> 16 0 31 3203 topology 3228 2621
+> 15 0 30 3203 topology 3271 2622
+> 16 0 30 3203 topology 3236 2622
+> 15 0 31 3203 topology 3236 2623
+> 16 0 31 3203 topology 3234 2623
+> 15 0 30 3203 topology 3271 2624
+> 16 0 30 3203 topology 3242 2624
+> 15 0 31 3203 topology 3242 2625
+> 16 0 31 3203 topology 3240 2625
+> 15 0 30 3203 topology 3271 2626
+> 16 0 30 3203 topology 3248 2626
+> 15 0 31 3203 topology 3248 2627
+> 16 0 31 3203 topology 3246 2627
+> 15 0 30 3203 topology 3271 2628
+> 16 0 30 3203 topology 3254 2628
+> 15 0 31 3203 topology 3254 2629
+> 16 0 31 3203 topology 3252 2629
+> 15 0 30 3203 topology 3271 2630
+> 16 0 30 3203 topology 3260 2630
+> 15 0 31 3203 topology 3260 2631
+> 16 0 31 3203 topology 3258 2631
+> 15 0 30 3203 topology 3271 2632
+> 16 0 30 3203 topology 3266 2632
+> 15 0 31 3203 topology 3266 2633
+> 16 0 31 3203 topology 3264 2633
+> 15 0 30 3203 topology 3271 2634
+> 16 0 30 3203 topology 3206 2634
+> 15 0 31 3203 topology 3206 2635
+> 16 0 31 3203 topology 3204 2635
+> 15 0 30 3203 topology 3271 2636
+> 16 0 30 3203 topology 3269 2636
+> 15 0 31 3203 topology 3269 2637
+> 16 0 31 3203 topology 3267 2637
+> 15 0 32 3203 topology 3271 2638
+> 16 0 32 3203 topology 3270 2638
+> 15 0 30 3203 topology 3271 2639
+> 16 0 30 3203 topology 3209 2639
+> 15 0 31 3203 topology 3209 2640
+> 16 0 31 3203 topology 3207 2640
+> 15 0 30 3203 topology 3271 2641
+> 16 0 30 3203 topology 3215 2641
+> 15 0 31 3203 topology 3215 2642
+> 16 0 31 3203 topology 3213 2642
+> 15 0 30 3203 topology 3271 2643
+> 16 0 30 3203 topology 3221 2643
+> 15 0 31 3203 topology 3221 2644
+> 16 0 31 3203 topology 3219 2644
+> 15 0 30 3203 topology 3271 2645
+> 16 0 30 3203 topology 3227 2645
+> 15 0 31 3203 topology 3227 2646
+> 16 0 31 3203 topology 3225 2646
+> 15 0 30 3203 topology 3271 2647
+> 16 0 30 3203 topology 3233 2647
+> 15 0 31 3203 topology 3233 2648
+> 16 0 31 3203 topology 3231 2648
+> 15 0 30 3203 topology 3271 2649
+> 16 0 30 3203 topology 3239 2649
+> 15 0 31 3203 topology 3239 2650
+> 16 0 31 3203 topology 3237 2650
+> 15 0 30 3203 topology 3271 2651
+> 16 0 30 3203 topology 3245 2651
+> 15 0 31 3203 topology 3245 2652
+> 16 0 31 3203 topology 3243 2652
+> 15 0 30 3203 topology 3271 2653
+> 16 0 30 3203 topology 3251 2653
+> 15 0 31 3203 topology 3251 2654
+> 16 0 31 3203 topology 3249 2654
+> 15 0 30 3203 topology 3271 2655
+> 16 0 30 3203 topology 3257 2655
+> 15 0 31 3203 topology 3257 2656
+> 16 0 31 3203 topology 3255 2656
+> 15 0 30 3203 topology 3271 2657
+> 16 0 30 3203 topology 3263 2657
+> 15 0 31 3203 topology 3263 2658
+> 16 0 31 3203 topology 3261 2658
+> 15 0 29 3203 topology 3216 2659
+> 16 0 29 3203 topology 3217 2659
+> 15 0 30 3203 topology 3217 2660
+> 16 0 30 3203 topology 3271 2660
+> 15 0 30 3203 topology 3271 2661
+> 16 0 30 3203 topology 3212 2661
+> 15 0 31 3203 topology 3212 2662
+> 16 0 31 3203 topology 3210 2662
+> 15 0 29 3203 topology 3222 2663
+> 16 0 29 3203 topology 3223 2663
+> 15 0 30 3203 topology 3223 2664
+> 16 0 30 3203 topology 3271 2664
+> 15 0 29 3203 topology 3228 2665
+> 16 0 29 3203 topology 3229 2665
+> 15 0 30 3203 topology 3229 2666
+> 16 0 30 3203 topology 3271 2666
+> 15 0 29 3203 topology 3234 2667
+> 16 0 29 3203 topology 3235 2667
+> 15 0 30 3203 topology 3235 2668
+> 16 0 30 3203 topology 3271 2668
+> 15 0 29 3203 topology 3240 2669
+> 16 0 29 3203 topology 3241 2669
+> 15 0 30 3203 topology 3241 2670
+> 16 0 30 3203 topology 3271 2670
+> 15 0 29 3203 topology 3246 2671
+> 16 0 29 3203 topology 3247 2671
+> 15 0 30 3203 topology 3247 2672
+> 16 0 30 3203 topology 3271 2672
+> 15 0 29 3203 topology 3252 2673
+> 16 0 29 3203 topology 3253 2673
+> 15 0 30 3203 topology 3253 2674
+> 16 0 30 3203 topology 3271 2674
+> 15 0 29 3203 topology 3258 2675
+> 16 0 29 3203 topology 3259 2675
+> 15 0 30 3203 topology 3259 2676
+> 16 0 30 3203 topology 3271 2676
+> 15 0 29 3203 topology 3264 2677
+> 16 0 29 3203 topology 3265 2677
+> 15 0 30 3203 topology 3265 2678
+> 16 0 30 3203 topology 3271 2678
+> 15 0 29 3203 topology 3204 2679
+> 16 0 29 3203 topology 3205 2679
+> 15 0 30 3203 topology 3205 2680
+> 16 0 30 3203 topology 3271 2680
+> 15 0 29 3203 topology 3267 2681
+> 16 0 29 3203 topology 3268 2681
+> 15 0 30 3203 topology 3268 2682
+> 16 0 30 3203 topology 3271 2682
+> 15 0 29 3203 topology 3207 2683
+> 16 0 29 3203 topology 3208 2683
+> 15 0 30 3203 topology 3208 2684
+> 16 0 30 3203 topology 3271 2684
+> 15 0 29 3203 topology 3213 2685
+> 16 0 29 3203 topology 3214 2685
+> 15 0 30 3203 topology 3214 2686
+> 16 0 30 3203 topology 3271 2686
+> 15 0 29 3203 topology 3219 2687
+> 16 0 29 3203 topology 3220 2687
+> 15 0 30 3203 topology 3220 2688
+> 16 0 30 3203 topology 3271 2688
+> 15 0 29 3203 topology 3225 2689
+> 16 0 29 3203 topology 3226 2689
+> 15 0 30 3203 topology 3226 2690
+> 16 0 30 3203 topology 3271 2690
+> 15 0 29 3203 topology 3231 2691
+> 16 0 29 3203 topology 3232 2691
+> 15 0 30 3203 topology 3232 2692
+> 16 0 30 3203 topology 3271 2692
+> 15 0 29 3203 topology 3237 2693
+> 16 0 29 3203 topology 3238 2693
+> 15 0 30 3203 topology 3238 2694
+> 16 0 30 3203 topology 3271 2694
+> 15 0 29 3203 topology 3243 2695
+> 16 0 29 3203 topology 3244 2695
+> 15 0 30 3203 topology 3244 2696
+> 16 0 30 3203 topology 3271 2696
+> 15 0 29 3203 topology 3249 2697
+> 16 0 29 3203 topology 3250 2697
+> 15 0 30 3203 topology 3250 2698
+> 16 0 30 3203 topology 3271 2698
+> 15 0 29 3203 topology 3255 2699
+> 16 0 29 3203 topology 3256 2699
+> 15 0 30 3203 topology 3256 2700
+> 16 0 30 3203 topology 3271 2700
+> 15 0 29 3203 topology 3261 2701
+> 16 0 29 3203 topology 3262 2701
+> 15 0 30 3203 topology 3262 2702
+> 16 0 30 3203 topology 3271 2702
+> 15 0 33 2462 topology 2571 2703
+> 16 0 33 2462 topology 2572 2703
+> 15 0 30 2462 topology 2572 2704
+> 16 0 30 2462 topology 2474 2704
+> 15 0 31 2462 topology 2474 2705
+> 16 0 31 2462 topology 2472 2705
+> 15 0 30 2462 topology 2572 2706
+> 16 0 30 2462 topology 2480 2706
+> 15 0 31 2462 topology 2480 2707
+> 16 0 31 2462 topology 2478 2707
+> 15 0 30 2462 topology 2572 2708
+> 16 0 30 2462 topology 2537 2708
+> 15 0 31 2462 topology 2537 2709
+> 16 0 31 2462 topology 2535 2709
+> 15 0 30 2462 topology 2572 2710
+> 16 0 30 2462 topology 2486 2710
+> 15 0 31 2462 topology 2486 2711
+> 16 0 31 2462 topology 2484 2711
+> 15 0 30 2462 topology 2572 2712
+> 16 0 30 2462 topology 2543 2712
+> 15 0 31 2462 topology 2543 2713
+> 16 0 31 2462 topology 2541 2713
+> 15 0 30 2462 topology 2572 2714
+> 16 0 30 2462 topology 2492 2714
+> 15 0 31 2462 topology 2492 2715
+> 16 0 31 2462 topology 2490 2715
+> 15 0 30 2462 topology 2572 2716
+> 16 0 30 2462 topology 2549 2716
+> 15 0 31 2462 topology 2549 2717
+> 16 0 31 2462 topology 2547 2717
+> 15 0 30 2462 topology 2572 2718
+> 16 0 30 2462 topology 2498 2718
+> 15 0 31 2462 topology 2498 2719
+> 16 0 31 2462 topology 2496 2719
+> 15 0 30 2462 topology 2572 2720
+> 16 0 30 2462 topology 2555 2720
+> 15 0 31 2462 topology 2555 2721
+> 16 0 31 2462 topology 2553 2721
+> 15 0 30 2462 topology 2572 2722
+> 16 0 30 2462 topology 2561 2722
+> 15 0 31 2462 topology 2561 2723
+> 16 0 31 2462 topology 2559 2723
+> 15 0 30 2462 topology 2572 2724
+> 16 0 30 2462 topology 2507 2724
+> 15 0 31 2462 topology 2507 2725
+> 16 0 31 2462 topology 2505 2725
+> 15 0 30 2462 topology 2572 2726
+> 16 0 30 2462 topology 2564 2726
+> 15 0 31 2462 topology 2564 2727
+> 16 0 31 2462 topology 2562 2727
+> 15 0 30 2462 topology 2572 2728
+> 16 0 30 2462 topology 2513 2728
+> 15 0 31 2462 topology 2513 2729
+> 16 0 31 2462 topology 2511 2729
+> 15 0 30 2462 topology 2572 2730
+> 16 0 30 2462 topology 2570 2730
+> 15 0 31 2462 topology 2570 2731
+> 16 0 31 2462 topology 2568 2731
+> 15 0 30 2462 topology 2572 2732
+> 16 0 30 2462 topology 2519 2732
+> 15 0 31 2462 topology 2519 2733
+> 16 0 31 2462 topology 2517 2733
+> 15 0 30 2462 topology 2572 2734
+> 16 0 30 2462 topology 2468 2734
+> 15 0 31 2462 topology 2468 2735
+> 16 0 31 2462 topology 2466 2735
+> 15 0 30 2462 topology 2572 2736
+> 16 0 30 2462 topology 2525 2736
+> 15 0 31 2462 topology 2525 2737
+> 16 0 31 2462 topology 2523 2737
+> 15 0 30 2462 topology 2572 2738
+> 16 0 30 2462 topology 2531 2738
+> 15 0 31 2462 topology 2531 2739
+> 16 0 31 2462 topology 2529 2739
+> 15 0 30 2462 topology 2572 2740
+> 16 0 30 2462 topology 2477 2740
+> 15 0 31 2462 topology 2477 2741
+> 16 0 31 2462 topology 2475 2741
+> 15 0 30 2462 topology 2572 2742
+> 16 0 30 2462 topology 2534 2742
+> 15 0 31 2462 topology 2534 2743
+> 16 0 31 2462 topology 2532 2743
+> 15 0 30 2462 topology 2572 2744
+> 16 0 30 2462 topology 2483 2744
+> 15 0 31 2462 topology 2483 2745
+> 16 0 31 2462 topology 2481 2745
+> 15 0 30 2462 topology 2572 2746
+> 16 0 30 2462 topology 2540 2746
+> 15 0 31 2462 topology 2540 2747
+> 16 0 31 2462 topology 2538 2747
+> 15 0 30 2462 topology 2572 2748
+> 16 0 30 2462 topology 2489 2748
+> 15 0 31 2462 topology 2489 2749
+> 16 0 31 2462 topology 2487 2749
+> 15 0 30 2462 topology 2572 2750
+> 16 0 30 2462 topology 2546 2750
+> 15 0 31 2462 topology 2546 2751
+> 16 0 31 2462 topology 2544 2751
+> 15 0 30 2462 topology 2572 2752
+> 16 0 30 2462 topology 2495 2752
+> 15 0 31 2462 topology 2495 2753
+> 16 0 31 2462 topology 2493 2753
+> 15 0 30 2462 topology 2572 2754
+> 16 0 30 2462 topology 2552 2754
+> 15 0 31 2462 topology 2552 2755
+> 16 0 31 2462 topology 2550 2755
+> 15 0 30 2462 topology 2572 2756
+> 16 0 30 2462 topology 2501 2756
+> 15 0 31 2462 topology 2501 2757
+> 16 0 31 2462 topology 2499 2757
+> 15 0 30 2462 topology 2572 2758
+> 16 0 30 2462 topology 2558 2758
+> 15 0 31 2462 topology 2558 2759
+> 16 0 31 2462 topology 2556 2759
+> 15 0 30 2462 topology 2572 2760
+> 16 0 30 2462 topology 2504 2760
+> 15 0 31 2462 topology 2504 2761
+> 16 0 31 2462 topology 2502 2761
+> 15 0 30 2462 topology 2572 2762
+> 16 0 30 2462 topology 2510 2762
+> 15 0 31 2462 topology 2510 2763
+> 16 0 31 2462 topology 2508 2763
+> 15 0 30 2462 topology 2572 2764
+> 16 0 30 2462 topology 2567 2764
+> 15 0 31 2462 topology 2567 2765
+> 16 0 31 2462 topology 2565 2765
+> 15 0 30 2462 topology 2572 2766
+> 16 0 30 2462 topology 2516 2766
+> 15 0 31 2462 topology 2516 2767
+> 16 0 31 2462 topology 2514 2767
+> 15 0 30 2462 topology 2572 2768
+> 16 0 30 2462 topology 2465 2768
+> 15 0 31 2462 topology 2465 2769
+> 16 0 31 2462 topology 2463 2769
+> 15 0 30 2462 topology 2572 2770
+> 16 0 30 2462 topology 2522 2770
+> 15 0 31 2462 topology 2522 2771
+> 16 0 31 2462 topology 2520 2771
+> 15 0 30 2462 topology 2572 2772
+> 16 0 30 2462 topology 2471 2772
+> 15 0 31 2462 topology 2471 2773
+> 16 0 31 2462 topology 2469 2773
+> 15 0 30 2462 topology 2572 2774
+> 16 0 30 2462 topology 2528 2774
+> 15 0 31 2462 topology 2528 2775
+> 16 0 31 2462 topology 2526 2775
+> 15 0 29 2462 topology 2472 2776
+> 16 0 29 2462 topology 2473 2776
+> 15 0 30 2462 topology 2473 2777
+> 16 0 30 2462 topology 2572 2777
+> 15 0 29 2462 topology 2478 2778
+> 16 0 29 2462 topology 2479 2778
+> 15 0 30 2462 topology 2479 2779
+> 16 0 30 2462 topology 2572 2779
+> 15 0 29 2462 topology 2535 2780
+> 16 0 29 2462 topology 2536 2780
+> 15 0 30 2462 topology 2536 2781
+> 16 0 30 2462 topology 2572 2781
+> 15 0 29 2462 topology 2484 2782
+> 16 0 29 2462 topology 2485 2782
+> 15 0 30 2462 topology 2485 2783
+> 16 0 30 2462 topology 2572 2783
+> 15 0 29 2462 topology 2541 2784
+> 16 0 29 2462 topology 2542 2784
+> 15 0 30 2462 topology 2542 2785
+> 16 0 30 2462 topology 2572 2785
+> 15 0 29 2462 topology 2490 2786
+> 16 0 29 2462 topology 2491 2786
+> 15 0 30 2462 topology 2491 2787
+> 16 0 30 2462 topology 2572 2787
+> 15 0 29 2462 topology 2547 2788
+> 16 0 29 2462 topology 2548 2788
+> 15 0 30 2462 topology 2548 2789
+> 16 0 30 2462 topology 2572 2789
+> 15 0 29 2462 topology 2496 2790
+> 16 0 29 2462 topology 2497 2790
+> 15 0 30 2462 topology 2497 2791
+> 16 0 30 2462 topology 2572 2791
+> 15 0 29 2462 topology 2553 2792
+> 16 0 29 2462 topology 2554 2792
+> 15 0 30 2462 topology 2554 2793
+> 16 0 30 2462 topology 2572 2793
+> 15 0 29 2462 topology 2559 2794
+> 16 0 29 2462 topology 2560 2794
+> 15 0 30 2462 topology 2560 2795
+> 16 0 30 2462 topology 2572 2795
+> 15 0 29 2462 topology 2505 2796
+> 16 0 29 2462 topology 2506 2796
+> 15 0 30 2462 topology 2506 2797
+> 16 0 30 2462 topology 2572 2797
+> 15 0 29 2462 topology 2562 2798
+> 16 0 29 2462 topology 2563 2798
+> 15 0 30 2462 topology 2563 2799
+> 16 0 30 2462 topology 2572 2799
+> 15 0 29 2462 topology 2511 2800
+> 16 0 29 2462 topology 2512 2800
+> 15 0 30 2462 topology 2512 2801
+> 16 0 30 2462 topology 2572 2801
+> 15 0 29 2462 topology 2568 2802
+> 16 0 29 2462 topology 2569 2802
+> 15 0 30 2462 topology 2569 2803
+> 16 0 30 2462 topology 2572 2803
+> 15 0 29 2462 topology 2517 2804
+> 16 0 29 2462 topology 2518 2804
+> 15 0 30 2462 topology 2518 2805
+> 16 0 30 2462 topology 2572 2805
+> 15 0 29 2462 topology 2466 2806
+> 16 0 29 2462 topology 2467 2806
+> 15 0 30 2462 topology 2467 2807
+> 16 0 30 2462 topology 2572 2807
+> 15 0 29 2462 topology 2523 2808
+> 16 0 29 2462 topology 2524 2808
+> 15 0 30 2462 topology 2524 2809
+> 16 0 30 2462 topology 2572 2809
+> 15 0 29 2462 topology 2529 2810
+> 16 0 29 2462 topology 2530 2810
+> 15 0 30 2462 topology 2530 2811
+> 16 0 30 2462 topology 2572 2811
+> 15 0 29 2462 topology 2475 2812
+> 16 0 29 2462 topology 2476 2812
+> 15 0 30 2462 topology 2476 2813
+> 16 0 30 2462 topology 2572 2813
+> 15 0 29 2462 topology 2532 2814
+> 16 0 29 2462 topology 2533 2814
+> 15 0 30 2462 topology 2533 2815
+> 16 0 30 2462 topology 2572 2815
+> 15 0 29 2462 topology 2481 2816
+> 16 0 29 2462 topology 2482 2816
+> 15 0 30 2462 topology 2482 2817
+> 16 0 30 2462 topology 2572 2817
+> 15 0 29 2462 topology 2538 2818
+> 16 0 29 2462 topology 2539 2818
+> 15 0 30 2462 topology 2539 2819
+> 16 0 30 2462 topology 2572 2819
+> 15 0 29 2462 topology 2487 2820
+> 16 0 29 2462 topology 2488 2820
+> 15 0 30 2462 topology 2488 2821
+> 16 0 30 2462 topology 2572 2821
+> 15 0 29 2462 topology 2544 2822
+> 16 0 29 2462 topology 2545 2822
+> 15 0 30 2462 topology 2545 2823
+> 16 0 30 2462 topology 2572 2823
+> 15 0 29 2462 topology 2493 2824
+> 16 0 29 2462 topology 2494 2824
+> 15 0 30 2462 topology 2494 2825
+> 16 0 30 2462 topology 2572 2825
+> 15 0 29 2462 topology 2550 2826
+> 16 0 29 2462 topology 2551 2826
+> 15 0 30 2462 topology 2551 2827
+> 16 0 30 2462 topology 2572 2827
+> 15 0 29 2462 topology 2499 2828
+> 16 0 29 2462 topology 2500 2828
+> 15 0 30 2462 topology 2500 2829
+> 16 0 30 2462 topology 2572 2829
+> 15 0 29 2462 topology 2556 2830
+> 16 0 29 2462 topology 2557 2830
+> 15 0 30 2462 topology 2557 2831
+> 16 0 30 2462 topology 2572 2831
+> 15 0 29 2462 topology 2502 2832
+> 16 0 29 2462 topology 2503 2832
+> 15 0 30 2462 topology 2503 2833
+> 16 0 30 2462 topology 2572 2833
+> 15 0 29 2462 topology 2508 2834
+> 16 0 29 2462 topology 2509 2834
+> 15 0 30 2462 topology 2509 2835
+> 16 0 30 2462 topology 2572 2835
+> 15 0 29 2462 topology 2565 2836
+> 16 0 29 2462 topology 2566 2836
+> 15 0 30 2462 topology 2566 2837
+> 16 0 30 2462 topology 2572 2837
+> 15 0 29 2462 topology 2514 2838
+> 16 0 29 2462 topology 2515 2838
+> 15 0 30 2462 topology 2515 2839
+> 16 0 30 2462 topology 2572 2839
+> 15 0 29 2462 topology 2463 2840
+> 16 0 29 2462 topology 2464 2840
+> 15 0 30 2462 topology 2464 2841
+> 16 0 30 2462 topology 2572 2841
+> 15 0 29 2462 topology 2520 2842
+> 16 0 29 2462 topology 2521 2842
+> 15 0 30 2462 topology 2521 2843
+> 16 0 30 2462 topology 2572 2843
+> 15 0 29 2462 topology 2469 2844
+> 16 0 29 2462 topology 2470 2844
+> 15 0 30 2462 topology 2470 2845
+> 16 0 30 2462 topology 2572 2845
+> 15 0 29 2462 topology 2526 2846
+> 16 0 29 2462 topology 2527 2846
+> 15 0 30 2462 topology 2527 2847
+> 16 0 30 2462 topology 2572 2847
+> 15 0 29 2684 topology 2691 2848
+> 16 0 29 2684 topology 2692 2848
+> 15 0 30 2684 topology 2692 2849
+> 16 0 30 2684 topology 2794 2849
+> 15 0 30 2684 topology 2794 2850
+> 16 0 30 2684 topology 2750 2850
+> 15 0 31 2684 topology 2750 2851
+> 16 0 31 2684 topology 2748 2851
+> 15 0 30 2684 topology 2794 2852
+> 16 0 30 2684 topology 2699 2852
+> 15 0 31 2684 topology 2699 2853
+> 16 0 31 2684 topology 2697 2853
+> 15 0 30 2684 topology 2794 2854
+> 16 0 30 2684 topology 2756 2854
+> 15 0 31 2684 topology 2756 2855
+> 16 0 31 2684 topology 2754 2855
+> 15 0 30 2684 topology 2794 2856
+> 16 0 30 2684 topology 2705 2856
+> 15 0 31 2684 topology 2705 2857
+> 16 0 31 2684 topology 2703 2857
+> 15 0 30 2684 topology 2794 2858
+> 16 0 30 2684 topology 2762 2858
+> 15 0 31 2684 topology 2762 2859
+> 16 0 31 2684 topology 2760 2859
+> 15 0 30 2684 topology 2794 2860
+> 16 0 30 2684 topology 2711 2860
+> 15 0 31 2684 topology 2711 2861
+> 16 0 31 2684 topology 2709 2861
+> 15 0 30 2684 topology 2794 2862
+> 16 0 30 2684 topology 2768 2862
+> 15 0 31 2684 topology 2768 2863
+> 16 0 31 2684 topology 2766 2863
+> 15 0 30 2684 topology 2794 2864
+> 16 0 30 2684 topology 2717 2864
+> 15 0 31 2684 topology 2717 2865
+> 16 0 31 2684 topology 2715 2865
+> 15 0 30 2684 topology 2794 2866
+> 16 0 30 2684 topology 2774 2866
+> 15 0 31 2684 topology 2774 2867
+> 16 0 31 2684 topology 2772 2867
+> 15 0 30 2684 topology 2794 2868
+> 16 0 30 2684 topology 2720 2868
+> 15 0 31 2684 topology 2720 2869
+> 16 0 31 2684 topology 2718 2869
+> 15 0 30 2684 topology 2794 2870
+> 16 0 30 2684 topology 2726 2870
+> 15 0 31 2684 topology 2726 2871
+> 16 0 31 2684 topology 2724 2871
+> 15 0 30 2684 topology 2794 2872
+> 16 0 30 2684 topology 2783 2872
+> 15 0 31 2684 topology 2783 2873
+> 16 0 31 2684 topology 2781 2873
+> 15 0 30 2684 topology 2794 2874
+> 16 0 30 2684 topology 2732 2874
+> 15 0 31 2684 topology 2732 2875
+> 16 0 31 2684 topology 2730 2875
+> 15 0 30 2684 topology 2794 2876
+> 16 0 30 2684 topology 2789 2876
+> 15 0 31 2684 topology 2789 2877
+> 16 0 31 2684 topology 2787 2877
+> 15 0 30 2684 topology 2794 2878
+> 16 0 30 2684 topology 2738 2878
+> 15 0 31 2684 topology 2738 2879
+> 16 0 31 2684 topology 2736 2879
+> 15 0 30 2684 topology 2794 2880
+> 16 0 30 2684 topology 2687 2880
+> 15 0 31 2684 topology 2687 2881
+> 16 0 31 2684 topology 2685 2881
+> 15 0 30 2684 topology 2794 2882
+> 16 0 30 2684 topology 2744 2882
+> 15 0 31 2684 topology 2744 2883
+> 16 0 31 2684 topology 2742 2883
+> 15 0 30 2684 topology 2794 2884
+> 16 0 30 2684 topology 2690 2884
+> 15 0 31 2684 topology 2690 2885
+> 16 0 31 2684 topology 2688 2885
+> 15 0 30 2684 topology 2794 2886
+> 16 0 30 2684 topology 2696 2886
+> 15 0 31 2684 topology 2696 2887
+> 16 0 31 2684 topology 2694 2887
+> 15 0 30 2684 topology 2794 2888
+> 16 0 30 2684 topology 2753 2888
+> 15 0 31 2684 topology 2753 2889
+> 16 0 31 2684 topology 2751 2889
+> 15 0 30 2684 topology 2794 2890
+> 16 0 30 2684 topology 2702 2890
+> 15 0 31 2684 topology 2702 2891
+> 16 0 31 2684 topology 2700 2891
+> 15 0 30 2684 topology 2794 2892
+> 16 0 30 2684 topology 2759 2892
+> 15 0 31 2684 topology 2759 2893
+> 16 0 31 2684 topology 2757 2893
+> 15 0 30 2684 topology 2794 2894
+> 16 0 30 2684 topology 2708 2894
+> 15 0 31 2684 topology 2708 2895
+> 16 0 31 2684 topology 2706 2895
+> 15 0 32 2684 topology 2794 2896
+> 16 0 32 2684 topology 2793 2896
+> 15 0 30 2684 topology 2794 2897
+> 16 0 30 2684 topology 2765 2897
+> 15 0 31 2684 topology 2765 2898
+> 16 0 31 2684 topology 2763 2898
+> 15 0 30 2684 topology 2794 2899
+> 16 0 30 2684 topology 2714 2899
+> 15 0 31 2684 topology 2714 2900
+> 16 0 31 2684 topology 2712 2900
+> 15 0 30 2684 topology 2794 2901
+> 16 0 30 2684 topology 2771 2901
+> 15 0 31 2684 topology 2771 2902
+> 16 0 31 2684 topology 2769 2902
+> 15 0 30 2684 topology 2794 2903
+> 16 0 30 2684 topology 2777 2903
+> 15 0 31 2684 topology 2777 2904
+> 16 0 31 2684 topology 2775 2904
+> 15 0 30 2684 topology 2794 2905
+> 16 0 30 2684 topology 2723 2905
+> 15 0 31 2684 topology 2723 2906
+> 16 0 31 2684 topology 2721 2906
+> 15 0 30 2684 topology 2794 2907
+> 16 0 30 2684 topology 2780 2907
+> 15 0 31 2684 topology 2780 2908
+> 16 0 31 2684 topology 2778 2908
+> 15 0 30 2684 topology 2794 2909
+> 16 0 30 2684 topology 2729 2909
+> 15 0 31 2684 topology 2729 2910
+> 16 0 31 2684 topology 2727 2910
+> 15 0 30 2684 topology 2794 2911
+> 16 0 30 2684 topology 2786 2911
+> 15 0 31 2684 topology 2786 2912
+> 16 0 31 2684 topology 2784 2912
+> 15 0 30 2684 topology 2794 2913
+> 16 0 30 2684 topology 2735 2913
+> 15 0 31 2684 topology 2735 2914
+> 16 0 31 2684 topology 2733 2914
+> 15 0 30 2684 topology 2794 2915
+> 16 0 30 2684 topology 2792 2915
+> 15 0 31 2684 topology 2792 2916
+> 16 0 31 2684 topology 2790 2916
+> 15 0 30 2684 topology 2794 2917
+> 16 0 30 2684 topology 2741 2917
+> 15 0 31 2684 topology 2741 2918
+> 16 0 31 2684 topology 2739 2918
+> 15 0 30 2684 topology 2794 2919
+> 16 0 30 2684 topology 2747 2919
+> 15 0 31 2684 topology 2747 2920
+> 16 0 31 2684 topology 2745 2920
+> 15 0 29 2684 topology 2748 2921
+> 16 0 29 2684 topology 2749 2921
+> 15 0 30 2684 topology 2749 2922
+> 16 0 30 2684 topology 2794 2922
+> 15 0 30 2684 topology 2794 2923
+> 16 0 30 2684 topology 2693 2923
+> 15 0 31 2684 topology 2693 2924
+> 16 0 31 2684 topology 2691 2924
+> 15 0 29 2684 topology 2697 2925
+> 16 0 29 2684 topology 2698 2925
+> 15 0 30 2684 topology 2698 2926
+> 16 0 30 2684 topology 2794 2926
+> 15 0 29 2684 topology 2754 2927
+> 16 0 29 2684 topology 2755 2927
+> 15 0 30 2684 topology 2755 2928
+> 16 0 30 2684 topology 2794 2928
+> 15 0 29 2684 topology 2703 2929
+> 16 0 29 2684 topology 2704 2929
+> 15 0 30 2684 topology 2704 2930
+> 16 0 30 2684 topology 2794 2930
+> 15 0 29 2684 topology 2760 2931
+> 16 0 29 2684 topology 2761 2931
+> 15 0 30 2684 topology 2761 2932
+> 16 0 30 2684 topology 2794 2932
+> 15 0 29 2684 topology 2709 2933
+> 16 0 29 2684 topology 2710 2933
+> 15 0 30 2684 topology 2710 2934
+> 16 0 30 2684 topology 2794 2934
+> 15 0 29 2684 topology 2766 2935
+> 16 0 29 2684 topology 2767 2935
+> 15 0 30 2684 topology 2767 2936
+> 16 0 30 2684 topology 2794 2936
+> 15 0 29 2684 topology 2715 2937
+> 16 0 29 2684 topology 2716 2937
+> 15 0 30 2684 topology 2716 2938
+> 16 0 30 2684 topology 2794 2938
+> 15 0 29 2684 topology 2772 2939
+> 16 0 29 2684 topology 2773 2939
+> 15 0 30 2684 topology 2773 2940
+> 16 0 30 2684 topology 2794 2940
+> 15 0 29 2684 topology 2718 2941
+> 16 0 29 2684 topology 2719 2941
+> 15 0 30 2684 topology 2719 2942
+> 16 0 30 2684 topology 2794 2942
+> 15 0 29 2684 topology 2724 2943
+> 16 0 29 2684 topology 2725 2943
+> 15 0 30 2684 topology 2725 2944
+> 16 0 30 2684 topology 2794 2944
+> 15 0 29 2684 topology 2781 2945
+> 16 0 29 2684 topology 2782 2945
+> 15 0 30 2684 topology 2782 2946
+> 16 0 30 2684 topology 2794 2946
+> 15 0 29 2684 topology 2730 2947
+> 16 0 29 2684 topology 2731 2947
+> 15 0 30 2684 topology 2731 2948
+> 16 0 30 2684 topology 2794 2948
+> 15 0 29 2684 topology 2787 2949
+> 16 0 29 2684 topology 2788 2949
+> 15 0 30 2684 topology 2788 2950
+> 16 0 30 2684 topology 2794 2950
+> 15 0 29 2684 topology 2736 2951
+> 16 0 29 2684 topology 2737 2951
+> 15 0 30 2684 topology 2737 2952
+> 16 0 30 2684 topology 2794 2952
+> 15 0 29 2684 topology 2685 2953
+> 16 0 29 2684 topology 2686 2953
+> 15 0 30 2684 topology 2686 2954
+> 16 0 30 2684 topology 2794 2954
+> 15 0 29 2684 topology 2742 2955
+> 16 0 29 2684 topology 2743 2955
+> 15 0 30 2684 topology 2743 2956
+> 16 0 30 2684 topology 2794 2956
+> 15 0 29 2684 topology 2688 2957
+> 16 0 29 2684 topology 2689 2957
+> 15 0 30 2684 topology 2689 2958
+> 16 0 30 2684 topology 2794 2958
+> 15 0 29 2684 topology 2694 2959
+> 16 0 29 2684 topology 2695 2959
+> 15 0 30 2684 topology 2695 2960
+> 16 0 30 2684 topology 2794 2960
+> 15 0 29 2684 topology 2751 2961
+> 16 0 29 2684 topology 2752 2961
+> 15 0 30 2684 topology 2752 2962
+> 16 0 30 2684 topology 2794 2962
+> 15 0 29 2684 topology 2700 2963
+> 16 0 29 2684 topology 2701 2963
+> 15 0 30 2684 topology 2701 2964
+> 16 0 30 2684 topology 2794 2964
+> 15 0 29 2684 topology 2757 2965
+> 16 0 29 2684 topology 2758 2965
+> 15 0 30 2684 topology 2758 2966
+> 16 0 30 2684 topology 2794 2966
+> 15 0 29 2684 topology 2706 2967
+> 16 0 29 2684 topology 2707 2967
+> 15 0 30 2684 topology 2707 2968
+> 16 0 30 2684 topology 2794 2968
+> 15 0 29 2684 topology 2763 2969
+> 16 0 29 2684 topology 2764 2969
+> 15 0 30 2684 topology 2764 2970
+> 16 0 30 2684 topology 2794 2970
+> 15 0 29 2684 topology 2712 2971
+> 16 0 29 2684 topology 2713 2971
+> 15 0 30 2684 topology 2713 2972
+> 16 0 30 2684 topology 2794 2972
+> 15 0 29 2684 topology 2769 2973
+> 16 0 29 2684 topology 2770 2973
+> 15 0 30 2684 topology 2770 2974
+> 16 0 30 2684 topology 2794 2974
+> 15 0 29 2684 topology 2775 2975
+> 16 0 29 2684 topology 2776 2975
+> 15 0 30 2684 topology 2776 2976
+> 16 0 30 2684 topology 2794 2976
+> 15 0 29 2684 topology 2721 2977
+> 16 0 29 2684 topology 2722 2977
+> 15 0 30 2684 topology 2722 2978
+> 16 0 30 2684 topology 2794 2978
+> 15 0 29 2684 topology 2778 2979
+> 16 0 29 2684 topology 2779 2979
+> 15 0 30 2684 topology 2779 2980
+> 16 0 30 2684 topology 2794 2980
+> 15 0 29 2684 topology 2727 2981
+> 16 0 29 2684 topology 2728 2981
+> 15 0 30 2684 topology 2728 2982
+> 16 0 30 2684 topology 2794 2982
+> 15 0 29 2684 topology 2784 2983
+> 16 0 29 2684 topology 2785 2983
+> 15 0 30 2684 topology 2785 2984
+> 16 0 30 2684 topology 2794 2984
+> 15 0 29 2684 topology 2733 2985
+> 16 0 29 2684 topology 2734 2985
+> 15 0 30 2684 topology 2734 2986
+> 16 0 30 2684 topology 2794 2986
+> 15 0 29 2684 topology 2790 2987
+> 16 0 29 2684 topology 2791 2987
+> 15 0 30 2684 topology 2791 2988
+> 16 0 30 2684 topology 2794 2988
+> 15 0 29 2684 topology 2739 2989
+> 16 0 29 2684 topology 2740 2989
+> 15 0 30 2684 topology 2740 2990
+> 16 0 30 2684 topology 2794 2990
+> 15 0 29 2684 topology 2745 2991
+> 16 0 29 2684 topology 2746 2991
+> 15 0 30 2684 topology 2746 2992
+> 16 0 30 2684 topology 2794 2992
+> 15 0 29 2906 topology 2961 2993
+> 16 0 29 2906 topology 2962 2993
+> 15 0 30 2906 topology 2962 2994
+> 16 0 30 2906 topology 2980 2994
+> 15 0 30 2906 topology 2980 2995
+> 16 0 30 2906 topology 2969 2995
+> 15 0 31 2906 topology 2969 2996
+> 16 0 31 2906 topology 2967 2996
+> 15 0 30 2906 topology 2980 2997
+> 16 0 30 2906 topology 2975 2997
+> 15 0 31 2906 topology 2975 2998
+> 16 0 31 2906 topology 2973 2998
+> 15 0 32 2906 topology 2980 2999
+> 16 0 32 2906 topology 2979 2999
+> 15 0 30 2906 topology 2980 3000
+> 16 0 30 2906 topology 2909 3000
+> 15 0 31 2906 topology 2909 3001
+> 16 0 31 2906 topology 2907 3001
+> 15 0 30 2906 topology 2980 3002
+> 16 0 30 2906 topology 2915 3002
+> 15 0 31 2906 topology 2915 3003
+> 16 0 31 2906 topology 2913 3003
+> 15 0 30 2906 topology 2980 3004
+> 16 0 30 2906 topology 2921 3004
+> 15 0 31 2906 topology 2921 3005
+> 16 0 31 2906 topology 2919 3005
+> 15 0 30 2906 topology 2980 3006
+> 16 0 30 2906 topology 2927 3006
+> 15 0 31 2906 topology 2927 3007
+> 16 0 31 2906 topology 2925 3007
+> 15 0 30 2906 topology 2980 3008
+> 16 0 30 2906 topology 2933 3008
+> 15 0 31 2906 topology 2933 3009
+> 16 0 31 2906 topology 2931 3009
+> 15 0 30 2906 topology 2980 3010
+> 16 0 30 2906 topology 2939 3010
+> 15 0 31 2906 topology 2939 3011
+> 16 0 31 2906 topology 2937 3011
+> 15 0 30 2906 topology 2980 3012
+> 16 0 30 2906 topology 2945 3012
+> 15 0 31 2906 topology 2945 3013
+> 16 0 31 2906 topology 2943 3013
+> 15 0 30 2906 topology 2980 3014
+> 16 0 30 2906 topology 2951 3014
+> 15 0 31 2906 topology 2951 3015
+> 16 0 31 2906 topology 2949 3015
+> 15 0 30 2906 topology 2980 3016
+> 16 0 30 2906 topology 2957 3016
+> 15 0 31 2906 topology 2957 3017
+> 16 0 31 2906 topology 2955 3017
+> 15 0 30 2906 topology 2980 3018
+> 16 0 30 2906 topology 2960 3018
+> 15 0 31 2906 topology 2960 3019
+> 16 0 31 2906 topology 2958 3019
+> 15 0 30 2906 topology 2980 3020
+> 16 0 30 2906 topology 2966 3020
+> 15 0 31 2906 topology 2966 3021
+> 16 0 31 2906 topology 2964 3021
+> 15 0 30 2906 topology 2980 3022
+> 16 0 30 2906 topology 2972 3022
+> 15 0 31 2906 topology 2972 3023
+> 16 0 31 2906 topology 2970 3023
+> 15 0 30 2906 topology 2980 3024
+> 16 0 30 2906 topology 2978 3024
+> 15 0 31 2906 topology 2978 3025
+> 16 0 31 2906 topology 2976 3025
+> 15 0 30 2906 topology 2980 3026
+> 16 0 30 2906 topology 2912 3026
+> 15 0 31 2906 topology 2912 3027
+> 16 0 31 2906 topology 2910 3027
+> 15 0 30 2906 topology 2980 3028
+> 16 0 30 2906 topology 2918 3028
+> 15 0 31 2906 topology 2918 3029
+> 16 0 31 2906 topology 2916 3029
+> 15 0 30 2906 topology 2980 3030
+> 16 0 30 2906 topology 2924 3030
+> 15 0 31 2906 topology 2924 3031
+> 16 0 31 2906 topology 2922 3031
+> 15 0 30 2906 topology 2980 3032
+> 16 0 30 2906 topology 2930 3032
+> 15 0 31 2906 topology 2930 3033
+> 16 0 31 2906 topology 2928 3033
+> 15 0 30 2906 topology 2980 3034
+> 16 0 30 2906 topology 2936 3034
+> 15 0 31 2906 topology 2936 3035
+> 16 0 31 2906 topology 2934 3035
+> 15 0 30 2906 topology 2980 3036
+> 16 0 30 2906 topology 2942 3036
+> 15 0 31 2906 topology 2942 3037
+> 16 0 31 2906 topology 2940 3037
+> 15 0 30 2906 topology 2980 3038
+> 16 0 30 2906 topology 2948 3038
+> 15 0 31 2906 topology 2948 3039
+> 16 0 31 2906 topology 2946 3039
+> 15 0 30 2906 topology 2980 3040
+> 16 0 30 2906 topology 2954 3040
+> 15 0 31 2906 topology 2954 3041
+> 16 0 31 2906 topology 2952 3041
+> 15 0 29 2906 topology 2967 3042
+> 16 0 29 2906 topology 2968 3042
+> 15 0 30 2906 topology 2968 3043
+> 16 0 30 2906 topology 2980 3043
+> 15 0 30 2906 topology 2980 3044
+> 16 0 30 2906 topology 2963 3044
+> 15 0 31 2906 topology 2963 3045
+> 16 0 31 2906 topology 2961 3045
+> 15 0 29 2906 topology 2973 3046
+> 16 0 29 2906 topology 2974 3046
+> 15 0 30 2906 topology 2974 3047
+> 16 0 30 2906 topology 2980 3047
+> 15 0 29 2906 topology 2907 3048
+> 16 0 29 2906 topology 2908 3048
+> 15 0 30 2906 topology 2908 3049
+> 16 0 30 2906 topology 2980 3049
+> 15 0 29 2906 topology 2913 3050
+> 16 0 29 2906 topology 2914 3050
+> 15 0 30 2906 topology 2914 3051
+> 16 0 30 2906 topology 2980 3051
+> 15 0 29 2906 topology 2919 3052
+> 16 0 29 2906 topology 2920 3052
+> 15 0 30 2906 topology 2920 3053
+> 16 0 30 2906 topology 2980 3053
+> 15 0 29 2906 topology 2925 3054
+> 16 0 29 2906 topology 2926 3054
+> 15 0 30 2906 topology 2926 3055
+> 16 0 30 2906 topology 2980 3055
+> 15 0 29 2906 topology 2931 3056
+> 16 0 29 2906 topology 2932 3056
+> 15 0 30 2906 topology 2932 3057
+> 16 0 30 2906 topology 2980 3057
+> 15 0 29 2906 topology 2937 3058
+> 16 0 29 2906 topology 2938 3058
+> 15 0 30 2906 topology 2938 3059
+> 16 0 30 2906 topology 2980 3059
+> 15 0 29 2906 topology 2943 3060
+> 16 0 29 2906 topology 2944 3060
+> 15 0 30 2906 topology 2944 3061
+> 16 0 30 2906 topology 2980 3061
+> 15 0 29 2906 topology 2949 3062
+> 16 0 29 2906 topology 2950 3062
+> 15 0 30 2906 topology 2950 3063
+> 16 0 30 2906 topology 2980 3063
+> 15 0 29 2906 topology 2955 3064
+> 16 0 29 2906 topology 2956 3064
+> 15 0 30 2906 topology 2956 3065
+> 16 0 30 2906 topology 2980 3065
+> 15 0 29 2906 topology 2958 3066
+> 16 0 29 2906 topology 2959 3066
+> 15 0 30 2906 topology 2959 3067
+> 16 0 30 2906 topology 2980 3067
+> 15 0 29 2906 topology 2964 3068
+> 16 0 29 2906 topology 2965 3068
+> 15 0 30 2906 topology 2965 3069
+> 16 0 30 2906 topology 2980 3069
+> 15 0 29 2906 topology 2970 3070
+> 16 0 29 2906 topology 2971 3070
+> 15 0 30 2906 topology 2971 3071
+> 16 0 30 2906 topology 2980 3071
+> 15 0 29 2906 topology 2976 3072
+> 16 0 29 2906 topology 2977 3072
+> 15 0 30 2906 topology 2977 3073
+> 16 0 30 2906 topology 2980 3073
+> 15 0 29 2906 topology 2910 3074
+> 16 0 29 2906 topology 2911 3074
+> 15 0 30 2906 topology 2911 3075
+> 16 0 30 2906 topology 2980 3075
+> 15 0 29 2906 topology 2916 3076
+> 16 0 29 2906 topology 2917 3076
+> 15 0 30 2906 topology 2917 3077
+> 16 0 30 2906 topology 2980 3077
+> 15 0 29 2906 topology 2922 3078
+> 16 0 29 2906 topology 2923 3078
+> 15 0 30 2906 topology 2923 3079
+> 16 0 30 2906 topology 2980 3079
+> 15 0 29 2906 topology 2928 3080
+> 16 0 29 2906 topology 2929 3080
+> 15 0 30 2906 topology 2929 3081
+> 16 0 30 2906 topology 2980 3081
+> 15 0 29 2906 topology 2934 3082
+> 16 0 29 2906 topology 2935 3082
+> 15 0 30 2906 topology 2935 3083
+> 16 0 30 2906 topology 2980 3083
+> 15 0 29 2906 topology 2940 3084
+> 16 0 29 2906 topology 2941 3084
+> 15 0 30 2906 topology 2941 3085
+> 16 0 30 2906 topology 2980 3085
+> 15 0 29 2906 topology 2946 3086
+> 16 0 29 2906 topology 2947 3086
+> 15 0 30 2906 topology 2947 3087
+> 16 0 30 2906 topology 2980 3087
+> 15 0 29 2906 topology 2952 3088
+> 16 0 29 2906 topology 2953 3088
+> 15 0 30 2906 topology 2953 3089
+> 16 0 30 2906 topology 2980 3089
+> 15 0 34 2350 topology 3201 3090
+> 16 0 34 2350 topology 3316 3090
+> 15 0 35 2350 topology 3316 3091
+> 16 0 35 2350 topology 3291 3091
+> 15 0 35 2350 topology 3316 3092
+> 16 0 35 2350 topology 2460 3092
+> 15 0 35 2350 topology 3316 3093
+> 16 0 35 2350 topology 2682 3093
+> 15 0 35 2350 topology 3316 3094
+> 16 0 35 2350 topology 2904 3094
+> 15 0 35 2350 topology 3316 3095
+> 16 0 35 2350 topology 3090 3095
+> 15 0 35 2350 topology 3316 3096
+> 16 0 35 2350 topology 3312 3096
+> 15 0 35 2350 topology 3316 3097
+> 16 0 35 2350 topology 3270 3097
+> 15 0 35 2350 topology 3316 3098
+> 16 0 35 2350 topology 3315 3098
+> 15 0 35 2350 topology 3316 3099
+> 16 0 35 2350 topology 2571 3099
+> 15 0 35 2350 topology 3316 3100
+> 16 0 35 2350 topology 2793 3100
+> 15 0 35 2350 topology 3316 3101
+> 16 0 35 2350 topology 2979 3101
+> 15 0 27 2349 topology 3409 3102
+> 16 0 27 2349 topology 3411 3102
+> 15 0 28 2349 topology 3411 3103
+> 16 0 28 2349 topology 3413 3103
+> 15 0 21 2349 topology 3411 3104
+> 16 0 21 2349 topology 3317 3104
+> 15 0 36 2349 topology 3317 3105
+> 16 0 36 2349 topology 3315 3105
+> 15 0 27 2349 topology 3413 3106
+> 16 0 27 2349 topology 3317 3106
+> 15 0 29 1608 topology 1636 3107
+> 16 0 29 1608 topology 1637 3107
+> 15 0 30 1608 topology 1637 3108
+> 16 0 30 1608 topology 1727 3108
+> 15 0 32 1608 topology 1727 3109
+> 16 0 32 1608 topology 1726 3109
+> 15 0 30 1608 topology 1727 3110
+> 16 0 30 1608 topology 1644 3110
+> 15 0 31 1608 topology 1644 3111
+> 16 0 31 1608 topology 1642 3111
+> 15 0 30 1608 topology 1727 3112
+> 16 0 30 1608 topology 1701 3112
+> 15 0 31 1608 topology 1701 3113
+> 16 0 31 1608 topology 1699 3113
+> 15 0 30 1608 topology 1727 3114
+> 16 0 30 1608 topology 1650 3114
+> 15 0 31 1608 topology 1650 3115
+> 16 0 31 1608 topology 1648 3115
+> 15 0 30 1608 topology 1727 3116
+> 16 0 30 1608 topology 1707 3116
+> 15 0 31 1608 topology 1707 3117
+> 16 0 31 1608 topology 1705 3117
+> 15 0 30 1608 topology 1727 3118
+> 16 0 30 1608 topology 1656 3118
+> 15 0 31 1608 topology 1656 3119
+> 16 0 31 1608 topology 1654 3119
+> 15 0 30 1608 topology 1727 3120
+> 16 0 30 1608 topology 1713 3120
+> 15 0 31 1608 topology 1713 3121
+> 16 0 31 1608 topology 1711 3121
+> 15 0 30 1608 topology 1727 3122
+> 16 0 30 1608 topology 1662 3122
+> 15 0 31 1608 topology 1662 3123
+> 16 0 31 1608 topology 1660 3123
+> 15 0 30 1608 topology 1727 3124
+> 16 0 30 1608 topology 1719 3124
+> 15 0 31 1608 topology 1719 3125
+> 16 0 31 1608 topology 1717 3125
+> 15 0 30 1608 topology 1727 3126
+> 16 0 30 1608 topology 1725 3126
+> 15 0 31 1608 topology 1725 3127
+> 16 0 31 1608 topology 1723 3127
+> 15 0 30 1608 topology 1727 3128
+> 16 0 30 1608 topology 1671 3128
+> 15 0 31 1608 topology 1671 3129
+> 16 0 31 1608 topology 1669 3129
+> 15 0 30 1608 topology 1727 3130
+> 16 0 30 1608 topology 1677 3130
+> 15 0 31 1608 topology 1677 3131
+> 16 0 31 1608 topology 1675 3131
+> 15 0 30 1608 topology 1727 3132
+> 16 0 30 1608 topology 1683 3132
+> 15 0 31 1608 topology 1683 3133
+> 16 0 31 1608 topology 1681 3133
+> 15 0 30 1608 topology 1727 3134
+> 16 0 30 1608 topology 1689 3134
+> 15 0 31 1608 topology 1689 3135
+> 16 0 31 1608 topology 1687 3135
+> 15 0 30 1608 topology 1727 3136
+> 16 0 30 1608 topology 1695 3136
+> 15 0 31 1608 topology 1695 3137
+> 16 0 31 1608 topology 1693 3137
+> 15 0 30 1608 topology 1727 3138
+> 16 0 30 1608 topology 1611 3138
+> 15 0 31 1608 topology 1611 3139
+> 16 0 31 1608 topology 1609 3139
+> 15 0 30 1608 topology 1727 3140
+> 16 0 30 1608 topology 1617 3140
+> 15 0 31 1608 topology 1617 3141
+> 16 0 31 1608 topology 1615 3141
+> 15 0 30 1608 topology 1727 3142
+> 16 0 30 1608 topology 1623 3142
+> 15 0 31 1608 topology 1623 3143
+> 16 0 31 1608 topology 1621 3143
+> 15 0 30 1608 topology 1727 3144
+> 16 0 30 1608 topology 1629 3144
+> 15 0 31 1608 topology 1629 3145
+> 16 0 31 1608 topology 1627 3145
+> 15 0 30 1608 topology 1727 3146
+> 16 0 30 1608 topology 1635 3146
+> 15 0 31 1608 topology 1635 3147
+> 16 0 31 1608 topology 1633 3147
+> 15 0 30 1608 topology 1727 3148
+> 16 0 30 1608 topology 1641 3148
+> 15 0 31 1608 topology 1641 3149
+> 16 0 31 1608 topology 1639 3149
+> 15 0 30 1608 topology 1727 3150
+> 16 0 30 1608 topology 1698 3150
+> 15 0 31 1608 topology 1698 3151
+> 16 0 31 1608 topology 1696 3151
+> 15 0 30 1608 topology 1727 3152
+> 16 0 30 1608 topology 1647 3152
+> 15 0 31 1608 topology 1647 3153
+> 16 0 31 1608 topology 1645 3153
+> 15 0 30 1608 topology 1727 3154
+> 16 0 30 1608 topology 1704 3154
+> 15 0 31 1608 topology 1704 3155
+> 16 0 31 1608 topology 1702 3155
+> 15 0 30 1608 topology 1727 3156
+> 16 0 30 1608 topology 1653 3156
+> 15 0 31 1608 topology 1653 3157
+> 16 0 31 1608 topology 1651 3157
+> 15 0 30 1608 topology 1727 3158
+> 16 0 30 1608 topology 1710 3158
+> 15 0 31 1608 topology 1710 3159
+> 16 0 31 1608 topology 1708 3159
+> 15 0 30 1608 topology 1727 3160
+> 16 0 30 1608 topology 1659 3160
+> 15 0 31 1608 topology 1659 3161
+> 16 0 31 1608 topology 1657 3161
+> 15 0 30 1608 topology 1727 3162
+> 16 0 30 1608 topology 1716 3162
+> 15 0 31 1608 topology 1716 3163
+> 16 0 31 1608 topology 1714 3163
+> 15 0 30 1608 topology 1727 3164
+> 16 0 30 1608 topology 1665 3164
+> 15 0 31 1608 topology 1665 3165
+> 16 0 31 1608 topology 1663 3165
+> 15 0 30 1608 topology 1727 3166
+> 16 0 30 1608 topology 1722 3166
+> 15 0 31 1608 topology 1722 3167
+> 16 0 31 1608 topology 1720 3167
+> 15 0 30 1608 topology 1727 3168
+> 16 0 30 1608 topology 1668 3168
+> 15 0 31 1608 topology 1668 3169
+> 16 0 31 1608 topology 1666 3169
+> 15 0 30 1608 topology 1727 3170
+> 16 0 30 1608 topology 1674 3170
+> 15 0 31 1608 topology 1674 3171
+> 16 0 31 1608 topology 1672 3171
+> 15 0 30 1608 topology 1727 3172
+> 16 0 30 1608 topology 1680 3172
+> 15 0 31 1608 topology 1680 3173
+> 16 0 31 1608 topology 1678 3173
+> 15 0 30 1608 topology 1727 3174
+> 16 0 30 1608 topology 1686 3174
+> 15 0 31 1608 topology 1686 3175
+> 16 0 31 1608 topology 1684 3175
+> 15 0 30 1608 topology 1727 3176
+> 16 0 30 1608 topology 1692 3176
+> 15 0 31 1608 topology 1692 3177
+> 16 0 31 1608 topology 1690 3177
+> 15 0 30 1608 topology 1727 3178
+> 16 0 30 1608 topology 1614 3178
+> 15 0 31 1608 topology 1614 3179
+> 16 0 31 1608 topology 1612 3179
+> 15 0 30 1608 topology 1727 3180
+> 16 0 30 1608 topology 1620 3180
+> 15 0 31 1608 topology 1620 3181
+> 16 0 31 1608 topology 1618 3181
+> 15 0 30 1608 topology 1727 3182
+> 16 0 30 1608 topology 1626 3182
+> 15 0 31 1608 topology 1626 3183
+> 16 0 31 1608 topology 1624 3183
+> 15 0 30 1608 topology 1727 3184
+> 16 0 30 1608 topology 1632 3184
+> 15 0 31 1608 topology 1632 3185
+> 16 0 31 1608 topology 1630 3185
+> 15 0 30 1608 topology 1727 3186
+> 16 0 30 1608 topology 1638 3186
+> 15 0 31 1608 topology 1638 3187
+> 16 0 31 1608 topology 1636 3187
+> 15 0 29 1608 topology 1642 3188
+> 16 0 29 1608 topology 1643 3188
+> 15 0 30 1608 topology 1643 3189
+> 16 0 30 1608 topology 1727 3189
+> 15 0 29 1608 topology 1699 3190
+> 16 0 29 1608 topology 1700 3190
+> 15 0 30 1608 topology 1700 3191
+> 16 0 30 1608 topology 1727 3191
+> 15 0 29 1608 topology 1648 3192
+> 16 0 29 1608 topology 1649 3192
+> 15 0 30 1608 topology 1649 3193
+> 16 0 30 1608 topology 1727 3193
+> 15 0 29 1608 topology 1705 3194
+> 16 0 29 1608 topology 1706 3194
+> 15 0 30 1608 topology 1706 3195
+> 16 0 30 1608 topology 1727 3195
+> 15 0 29 1608 topology 1654 3196
+> 16 0 29 1608 topology 1655 3196
+> 15 0 30 1608 topology 1655 3197
+> 16 0 30 1608 topology 1727 3197
+> 15 0 29 1608 topology 1711 3198
+> 16 0 29 1608 topology 1712 3198
+> 15 0 30 1608 topology 1712 3199
+> 16 0 30 1608 topology 1727 3199
+> 15 0 29 1608 topology 1660 3200
+> 16 0 29 1608 topology 1661 3200
+> 15 0 30 1608 topology 1661 3201
+> 16 0 30 1608 topology 1727 3201
+> 15 0 29 1608 topology 1717 3202
+> 16 0 29 1608 topology 1718 3202
+> 15 0 30 1608 topology 1718 3203
+> 16 0 30 1608 topology 1727 3203
+> 15 0 29 1608 topology 1723 3204
+> 16 0 29 1608 topology 1724 3204
+> 15 0 30 1608 topology 1724 3205
+> 16 0 30 1608 topology 1727 3205
+> 15 0 29 1608 topology 1669 3206
+> 16 0 29 1608 topology 1670 3206
+> 15 0 30 1608 topology 1670 3207
+> 16 0 30 1608 topology 1727 3207
+> 15 0 29 1608 topology 1675 3208
+> 16 0 29 1608 topology 1676 3208
+> 15 0 30 1608 topology 1676 3209
+> 16 0 30 1608 topology 1727 3209
+> 15 0 29 1608 topology 1681 3210
+> 16 0 29 1608 topology 1682 3210
+> 15 0 30 1608 topology 1682 3211
+> 16 0 30 1608 topology 1727 3211
+> 15 0 29 1608 topology 1687 3212
+> 16 0 29 1608 topology 1688 3212
+> 15 0 30 1608 topology 1688 3213
+> 16 0 30 1608 topology 1727 3213
+> 15 0 29 1608 topology 1693 3214
+> 16 0 29 1608 topology 1694 3214
+> 15 0 30 1608 topology 1694 3215
+> 16 0 30 1608 topology 1727 3215
+> 15 0 29 1608 topology 1609 3216
+> 16 0 29 1608 topology 1610 3216
+> 15 0 30 1608 topology 1610 3217
+> 16 0 30 1608 topology 1727 3217
+> 15 0 29 1608 topology 1615 3218
+> 16 0 29 1608 topology 1616 3218
+> 15 0 30 1608 topology 1616 3219
+> 16 0 30 1608 topology 1727 3219
+> 15 0 29 1608 topology 1621 3220
+> 16 0 29 1608 topology 1622 3220
+> 15 0 30 1608 topology 1622 3221
+> 16 0 30 1608 topology 1727 3221
+> 15 0 29 1608 topology 1627 3222
+> 16 0 29 1608 topology 1628 3222
+> 15 0 30 1608 topology 1628 3223
+> 16 0 30 1608 topology 1727 3223
+> 15 0 29 1608 topology 1633 3224
+> 16 0 29 1608 topology 1634 3224
+> 15 0 30 1608 topology 1634 3225
+> 16 0 30 1608 topology 1727 3225
+> 15 0 29 1608 topology 1639 3226
+> 16 0 29 1608 topology 1640 3226
+> 15 0 30 1608 topology 1640 3227
+> 16 0 30 1608 topology 1727 3227
+> 15 0 29 1608 topology 1696 3228
+> 16 0 29 1608 topology 1697 3228
+> 15 0 30 1608 topology 1697 3229
+> 16 0 30 1608 topology 1727 3229
+> 15 0 29 1608 topology 1645 3230
+> 16 0 29 1608 topology 1646 3230
+> 15 0 30 1608 topology 1646 3231
+> 16 0 30 1608 topology 1727 3231
+> 15 0 29 1608 topology 1702 3232
+> 16 0 29 1608 topology 1703 3232
+> 15 0 30 1608 topology 1703 3233
+> 16 0 30 1608 topology 1727 3233
+> 15 0 29 1608 topology 1651 3234
+> 16 0 29 1608 topology 1652 3234
+> 15 0 30 1608 topology 1652 3235
+> 16 0 30 1608 topology 1727 3235
+> 15 0 29 1608 topology 1708 3236
+> 16 0 29 1608 topology 1709 3236
+> 15 0 30 1608 topology 1709 3237
+> 16 0 30 1608 topology 1727 3237
+> 15 0 29 1608 topology 1657 3238
+> 16 0 29 1608 topology 1658 3238
+> 15 0 30 1608 topology 1658 3239
+> 16 0 30 1608 topology 1727 3239
+> 15 0 29 1608 topology 1714 3240
+> 16 0 29 1608 topology 1715 3240
+> 15 0 30 1608 topology 1715 3241
+> 16 0 30 1608 topology 1727 3241
+> 15 0 29 1608 topology 1663 3242
+> 16 0 29 1608 topology 1664 3242
+> 15 0 30 1608 topology 1664 3243
+> 16 0 30 1608 topology 1727 3243
+> 15 0 29 1608 topology 1720 3244
+> 16 0 29 1608 topology 1721 3244
+> 15 0 30 1608 topology 1721 3245
+> 16 0 30 1608 topology 1727 3245
+> 15 0 29 1608 topology 1666 3246
+> 16 0 29 1608 topology 1667 3246
+> 15 0 30 1608 topology 1667 3247
+> 16 0 30 1608 topology 1727 3247
+> 15 0 29 1608 topology 1672 3248
+> 16 0 29 1608 topology 1673 3248
+> 15 0 30 1608 topology 1673 3249
+> 16 0 30 1608 topology 1727 3249
+> 15 0 29 1608 topology 1678 3250
+> 16 0 29 1608 topology 1679 3250
+> 15 0 30 1608 topology 1679 3251
+> 16 0 30 1608 topology 1727 3251
+> 15 0 29 1608 topology 1684 3252
+> 16 0 29 1608 topology 1685 3252
+> 15 0 30 1608 topology 1685 3253
+> 16 0 30 1608 topology 1727 3253
+> 15 0 29 1608 topology 1690 3254
+> 16 0 29 1608 topology 1691 3254
+> 15 0 30 1608 topology 1691 3255
+> 16 0 30 1608 topology 1727 3255
+> 15 0 29 1608 topology 1612 3256
+> 16 0 29 1608 topology 1613 3256
+> 15 0 30 1608 topology 1613 3257
+> 16 0 30 1608 topology 1727 3257
+> 15 0 29 1608 topology 1618 3258
+> 16 0 29 1608 topology 1619 3258
+> 15 0 30 1608 topology 1619 3259
+> 16 0 30 1608 topology 1727 3259
+> 15 0 29 1608 topology 1624 3260
+> 16 0 29 1608 topology 1625 3260
+> 15 0 30 1608 topology 1625 3261
+> 16 0 30 1608 topology 1727 3261
+> 15 0 29 1608 topology 1630 3262
+> 16 0 29 1608 topology 1631 3262
+> 15 0 30 1608 topology 1631 3263
+> 16 0 30 1608 topology 1727 3263
+> 15 0 29 1728 topology 1759 3264
+> 16 0 29 1728 topology 1760 3264
+> 15 0 30 1728 topology 1760 3265
+> 16 0 30 1728 topology 1835 3265
+> 15 0 30 1728 topology 1835 3266
+> 16 0 30 1728 topology 1767 3266
+> 15 0 31 1728 topology 1767 3267
+> 16 0 31 1728 topology 1765 3267
+> 15 0 30 1728 topology 1835 3268
+> 16 0 30 1728 topology 1824 3268
+> 15 0 31 1728 topology 1824 3269
+> 16 0 31 1728 topology 1822 3269
+> 15 0 30 1728 topology 1835 3270
+> 16 0 30 1728 topology 1773 3270
+> 15 0 31 1728 topology 1773 3271
+> 16 0 31 1728 topology 1771 3271
+> 15 0 30 1728 topology 1835 3272
+> 16 0 30 1728 topology 1830 3272
+> 15 0 31 1728 topology 1830 3273
+> 16 0 31 1728 topology 1828 3273
+> 15 0 30 1728 topology 1835 3274
+> 16 0 30 1728 topology 1779 3274
+> 15 0 31 1728 topology 1779 3275
+> 16 0 31 1728 topology 1777 3275
+> 15 0 30 1728 topology 1835 3276
+> 16 0 30 1728 topology 1785 3276
+> 15 0 31 1728 topology 1785 3277
+> 16 0 31 1728 topology 1783 3277
+> 15 0 32 1728 topology 1835 3278
+> 16 0 32 1728 topology 1834 3278
+> 15 0 30 1728 topology 1835 3279
+> 16 0 30 1728 topology 1731 3279
+> 15 0 31 1728 topology 1731 3280
+> 16 0 31 1728 topology 1729 3280
+> 15 0 30 1728 topology 1835 3281
+> 16 0 30 1728 topology 1737 3281
+> 15 0 31 1728 topology 1737 3282
+> 16 0 31 1728 topology 1735 3282
+> 15 0 30 1728 topology 1835 3283
+> 16 0 30 1728 topology 1794 3283
+> 15 0 31 1728 topology 1794 3284
+> 16 0 31 1728 topology 1792 3284
+> 15 0 30 1728 topology 1835 3285
+> 16 0 30 1728 topology 1743 3285
+> 15 0 31 1728 topology 1743 3286
+> 16 0 31 1728 topology 1741 3286
+> 15 0 30 1728 topology 1835 3287
+> 16 0 30 1728 topology 1800 3287
+> 15 0 31 1728 topology 1800 3288
+> 16 0 31 1728 topology 1798 3288
+> 15 0 30 1728 topology 1835 3289
+> 16 0 30 1728 topology 1749 3289
+> 15 0 31 1728 topology 1749 3290
+> 16 0 31 1728 topology 1747 3290
+> 15 0 30 1728 topology 1835 3291
+> 16 0 30 1728 topology 1806 3291
+> 15 0 31 1728 topology 1806 3292
+> 16 0 31 1728 topology 1804 3292
+> 15 0 30 1728 topology 1835 3293
+> 16 0 30 1728 topology 1755 3293
+> 15 0 31 1728 topology 1755 3294
+> 16 0 31 1728 topology 1753 3294
+> 15 0 30 1728 topology 1835 3295
+> 16 0 30 1728 topology 1812 3295
+> 15 0 31 1728 topology 1812 3296
+> 16 0 31 1728 topology 1810 3296
+> 15 0 30 1728 topology 1835 3297
+> 16 0 30 1728 topology 1818 3297
+> 15 0 31 1728 topology 1818 3298
+> 16 0 31 1728 topology 1816 3298
+> 15 0 30 1728 topology 1835 3299
+> 16 0 30 1728 topology 1764 3299
+> 15 0 31 1728 topology 1764 3300
+> 16 0 31 1728 topology 1762 3300
+> 15 0 30 1728 topology 1835 3301
+> 16 0 30 1728 topology 1821 3301
+> 15 0 31 1728 topology 1821 3302
+> 16 0 31 1728 topology 1819 3302
+> 15 0 30 1728 topology 1835 3303
+> 16 0 30 1728 topology 1770 3303
+> 15 0 31 1728 topology 1770 3304
+> 16 0 31 1728 topology 1768 3304
+> 15 0 30 1728 topology 1835 3305
+> 16 0 30 1728 topology 1827 3305
+> 15 0 31 1728 topology 1827 3306
+> 16 0 31 1728 topology 1825 3306
+> 15 0 30 1728 topology 1835 3307
+> 16 0 30 1728 topology 1776 3307
+> 15 0 31 1728 topology 1776 3308
+> 16 0 31 1728 topology 1774 3308
+> 15 0 30 1728 topology 1835 3309
+> 16 0 30 1728 topology 1833 3309
+> 15 0 31 1728 topology 1833 3310
+> 16 0 31 1728 topology 1831 3310
+> 15 0 30 1728 topology 1835 3311
+> 16 0 30 1728 topology 1782 3311
+> 15 0 31 1728 topology 1782 3312
+> 16 0 31 1728 topology 1780 3312
+> 15 0 30 1728 topology 1835 3313
+> 16 0 30 1728 topology 1788 3313
+> 15 0 31 1728 topology 1788 3314
+> 16 0 31 1728 topology 1786 3314
+> 15 0 30 1728 topology 1835 3315
+> 16 0 30 1728 topology 1734 3315
+> 15 0 31 1728 topology 1734 3316
+> 16 0 31 1728 topology 1732 3316
+> 15 0 30 1728 topology 1835 3317
+> 16 0 30 1728 topology 1791 3317
+> 15 0 31 1728 topology 1791 3318
+> 16 0 31 1728 topology 1789 3318
+> 15 0 30 1728 topology 1835 3319
+> 16 0 30 1728 topology 1740 3319
+> 15 0 31 1728 topology 1740 3320
+> 16 0 31 1728 topology 1738 3320
+> 15 0 30 1728 topology 1835 3321
+> 16 0 30 1728 topology 1797 3321
+> 15 0 31 1728 topology 1797 3322
+> 16 0 31 1728 topology 1795 3322
+> 15 0 30 1728 topology 1835 3323
+> 16 0 30 1728 topology 1746 3323
+> 15 0 31 1728 topology 1746 3324
+> 16 0 31 1728 topology 1744 3324
+> 15 0 30 1728 topology 1835 3325
+> 16 0 30 1728 topology 1803 3325
+> 15 0 31 1728 topology 1803 3326
+> 16 0 31 1728 topology 1801 3326
+> 15 0 30 1728 topology 1835 3327
+> 16 0 30 1728 topology 1752 3327
+> 15 0 31 1728 topology 1752 3328
+> 16 0 31 1728 topology 1750 3328
+> 15 0 30 1728 topology 1835 3329
+> 16 0 30 1728 topology 1809 3329
+> 15 0 31 1728 topology 1809 3330
+> 16 0 31 1728 topology 1807 3330
+> 15 0 30 1728 topology 1835 3331
+> 16 0 30 1728 topology 1758 3331
+> 15 0 31 1728 topology 1758 3332
+> 16 0 31 1728 topology 1756 3332
+> 15 0 30 1728 topology 1835 3333
+> 16 0 30 1728 topology 1815 3333
+> 15 0 31 1728 topology 1815 3334
+> 16 0 31 1728 topology 1813 3334
+> 15 0 29 1728 topology 1765 3335
+> 16 0 29 1728 topology 1766 3335
+> 15 0 30 1728 topology 1766 3336
+> 16 0 30 1728 topology 1835 3336
+> 15 0 30 1728 topology 1835 3337
+> 16 0 30 1728 topology 1761 3337
+> 15 0 31 1728 topology 1761 3338
+> 16 0 31 1728 topology 1759 3338
+> 15 0 29 1728 topology 1822 3339
+> 16 0 29 1728 topology 1823 3339
+> 15 0 30 1728 topology 1823 3340
+> 16 0 30 1728 topology 1835 3340
+> 15 0 29 1728 topology 1771 3341
+> 16 0 29 1728 topology 1772 3341
+> 15 0 30 1728 topology 1772 3342
+> 16 0 30 1728 topology 1835 3342
+> 15 0 29 1728 topology 1828 3343
+> 16 0 29 1728 topology 1829 3343
+> 15 0 30 1728 topology 1829 3344
+> 16 0 30 1728 topology 1835 3344
+> 15 0 29 1728 topology 1777 3345
+> 16 0 29 1728 topology 1778 3345
+> 15 0 30 1728 topology 1778 3346
+> 16 0 30 1728 topology 1835 3346
+> 15 0 29 1728 topology 1783 3347
+> 16 0 29 1728 topology 1784 3347
+> 15 0 30 1728 topology 1784 3348
+> 16 0 30 1728 topology 1835 3348
+> 15 0 29 1728 topology 1729 3349
+> 16 0 29 1728 topology 1730 3349
+> 15 0 30 1728 topology 1730 3350
+> 16 0 30 1728 topology 1835 3350
+> 15 0 29 1728 topology 1735 3351
+> 16 0 29 1728 topology 1736 3351
+> 15 0 30 1728 topology 1736 3352
+> 16 0 30 1728 topology 1835 3352
+> 15 0 29 1728 topology 1792 3353
+> 16 0 29 1728 topology 1793 3353
+> 15 0 30 1728 topology 1793 3354
+> 16 0 30 1728 topology 1835 3354
+> 15 0 29 1728 topology 1741 3355
+> 16 0 29 1728 topology 1742 3355
+> 15 0 30 1728 topology 1742 3356
+> 16 0 30 1728 topology 1835 3356
+> 15 0 29 1728 topology 1798 3357
+> 16 0 29 1728 topology 1799 3357
+> 15 0 30 1728 topology 1799 3358
+> 16 0 30 1728 topology 1835 3358
+> 15 0 29 1728 topology 1747 3359
+> 16 0 29 1728 topology 1748 3359
+> 15 0 30 1728 topology 1748 3360
+> 16 0 30 1728 topology 1835 3360
+> 15 0 29 1728 topology 1804 3361
+> 16 0 29 1728 topology 1805 3361
+> 15 0 30 1728 topology 1805 3362
+> 16 0 30 1728 topology 1835 3362
+> 15 0 29 1728 topology 1753 3363
+> 16 0 29 1728 topology 1754 3363
+> 15 0 30 1728 topology 1754 3364
+> 16 0 30 1728 topology 1835 3364
+> 15 0 29 1728 topology 1810 3365
+> 16 0 29 1728 topology 1811 3365
+> 15 0 30 1728 topology 1811 3366
+> 16 0 30 1728 topology 1835 3366
+> 15 0 29 1728 topology 1816 3367
+> 16 0 29 1728 topology 1817 3367
+> 15 0 30 1728 topology 1817 3368
+> 16 0 30 1728 topology 1835 3368
+> 15 0 29 1728 topology 1762 3369
+> 16 0 29 1728 topology 1763 3369
+> 15 0 30 1728 topology 1763 3370
+> 16 0 30 1728 topology 1835 3370
+> 15 0 29 1728 topology 1819 3371
+> 16 0 29 1728 topology 1820 3371
+> 15 0 30 1728 topology 1820 3372
+> 16 0 30 1728 topology 1835 3372
+> 15 0 29 1728 topology 1768 3373
+> 16 0 29 1728 topology 1769 3373
+> 15 0 30 1728 topology 1769 3374
+> 16 0 30 1728 topology 1835 3374
+> 15 0 29 1728 topology 1825 3375
+> 16 0 29 1728 topology 1826 3375
+> 15 0 30 1728 topology 1826 3376
+> 16 0 30 1728 topology 1835 3376
+> 15 0 29 1728 topology 1774 3377
+> 16 0 29 1728 topology 1775 3377
+> 15 0 30 1728 topology 1775 3378
+> 16 0 30 1728 topology 1835 3378
+> 15 0 29 1728 topology 1831 3379
+> 16 0 29 1728 topology 1832 3379
+> 15 0 30 1728 topology 1832 3380
+> 16 0 30 1728 topology 1835 3380
+> 15 0 29 1728 topology 1780 3381
+> 16 0 29 1728 topology 1781 3381
+> 15 0 30 1728 topology 1781 3382
+> 16 0 30 1728 topology 1835 3382
+> 15 0 29 1728 topology 1786 3383
+> 16 0 29 1728 topology 1787 3383
+> 15 0 30 1728 topology 1787 3384
+> 16 0 30 1728 topology 1835 3384
+> 15 0 29 1728 topology 1732 3385
+> 16 0 29 1728 topology 1733 3385
+> 15 0 30 1728 topology 1733 3386
+> 16 0 30 1728 topology 1835 3386
+> 15 0 29 1728 topology 1789 3387
+> 16 0 29 1728 topology 1790 3387
+> 15 0 30 1728 topology 1790 3388
+> 16 0 30 1728 topology 1835 3388
+> 15 0 29 1728 topology 1738 3389
+> 16 0 29 1728 topology 1739 3389
+> 15 0 30 1728 topology 1739 3390
+> 16 0 30 1728 topology 1835 3390
+> 15 0 29 1728 topology 1795 3391
+> 16 0 29 1728 topology 1796 3391
+> 15 0 30 1728 topology 1796 3392
+> 16 0 30 1728 topology 1835 3392
+> 15 0 29 1728 topology 1744 3393
+> 16 0 29 1728 topology 1745 3393
+> 15 0 30 1728 topology 1745 3394
+> 16 0 30 1728 topology 1835 3394
+> 15 0 29 1728 topology 1801 3395
+> 16 0 29 1728 topology 1802 3395
+> 15 0 30 1728 topology 1802 3396
+> 16 0 30 1728 topology 1835 3396
+> 15 0 29 1728 topology 1750 3397
+> 16 0 29 1728 topology 1751 3397
+> 15 0 30 1728 topology 1751 3398
+> 16 0 30 1728 topology 1835 3398
+> 15 0 29 1728 topology 1807 3399
+> 16 0 29 1728 topology 1808 3399
+> 15 0 30 1728 topology 1808 3400
+> 16 0 30 1728 topology 1835 3400
+> 15 0 29 1728 topology 1756 3401
+> 16 0 29 1728 topology 1757 3401
+> 15 0 30 1728 topology 1757 3402
+> 16 0 30 1728 topology 1835 3402
+> 15 0 29 1728 topology 1813 3403
+> 16 0 29 1728 topology 1814 3403
+> 15 0 30 1728 topology 1814 3404
+> 16 0 30 1728 topology 1835 3404
+> 15 0 29 1836 topology 1882 3405
+> 16 0 29 1836 topology 1883 3405
+> 15 0 30 1836 topology 1883 3406
+> 16 0 30 1836 topology 1928 3406
+> 15 0 30 1836 topology 1928 3407
+> 16 0 30 1836 topology 1890 3407
+> 15 0 31 1836 topology 1890 3408
+> 16 0 31 1836 topology 1888 3408
+> 15 0 30 1836 topology 1928 3409
+> 16 0 30 1836 topology 1839 3409
+> 15 0 31 1836 topology 1839 3410
+> 16 0 31 1836 topology 1837 3410
+> 15 0 30 1836 topology 1928 3411
+> 16 0 30 1836 topology 1896 3411
+> 15 0 31 1836 topology 1896 3412
+> 16 0 31 1836 topology 1894 3412
+> 15 0 30 1836 topology 1928 3413
+> 16 0 30 1836 topology 1845 3413
+> 15 0 31 1836 topology 1845 3414
+> 16 0 31 1836 topology 1843 3414
+> 15 0 30 1836 topology 1928 3415
+> 16 0 30 1836 topology 1902 3415
+> 15 0 31 1836 topology 1902 3416
+> 16 0 31 1836 topology 1900 3416
+> 15 0 30 1836 topology 1928 3417
+> 16 0 30 1836 topology 1851 3417
+> 15 0 31 1836 topology 1851 3418
+> 16 0 31 1836 topology 1849 3418
+> 15 0 30 1836 topology 1928 3419
+> 16 0 30 1836 topology 1908 3419
+> 15 0 31 1836 topology 1908 3420
+> 16 0 31 1836 topology 1906 3420
+> 15 0 30 1836 topology 1928 3421
+> 16 0 30 1836 topology 1917 3421
+> 15 0 31 1836 topology 1917 3422
+> 16 0 31 1836 topology 1915 3422
+> 15 0 30 1836 topology 1928 3423
+> 16 0 30 1836 topology 1923 3423
+> 15 0 31 1836 topology 1923 3424
+> 16 0 31 1836 topology 1921 3424
+> 15 0 30 1836 topology 1928 3425
+> 16 0 30 1836 topology 1854 3425
+> 15 0 31 1836 topology 1854 3426
+> 16 0 31 1836 topology 1852 3426
+> 15 0 30 1836 topology 1928 3427
+> 16 0 30 1836 topology 1860 3427
+> 15 0 31 1836 topology 1860 3428
+> 16 0 31 1836 topology 1858 3428
+> 15 0 30 1836 topology 1928 3429
+> 16 0 30 1836 topology 1866 3429
+> 15 0 31 1836 topology 1866 3430
+> 16 0 31 1836 topology 1864 3430
+> 15 0 30 1836 topology 1928 3431
+> 16 0 30 1836 topology 1872 3431
+> 15 0 31 1836 topology 1872 3432
+> 16 0 31 1836 topology 1870 3432
+> 15 0 30 1836 topology 1928 3433
+> 16 0 30 1836 topology 1878 3433
+> 15 0 31 1836 topology 1878 3434
+> 16 0 31 1836 topology 1876 3434
+> 15 0 32 1836 topology 1928 3435
+> 16 0 32 1836 topology 1927 3435
+> 15 0 30 1836 topology 1928 3436
+> 16 0 30 1836 topology 1887 3436
+> 15 0 31 1836 topology 1887 3437
+> 16 0 31 1836 topology 1885 3437
+> 15 0 30 1836 topology 1928 3438
+> 16 0 30 1836 topology 1893 3438
+> 15 0 31 1836 topology 1893 3439
+> 16 0 31 1836 topology 1891 3439
+> 15 0 30 1836 topology 1928 3440
+> 16 0 30 1836 topology 1842 3440
+> 15 0 31 1836 topology 1842 3441
+> 16 0 31 1836 topology 1840 3441
+> 15 0 30 1836 topology 1928 3442
+> 16 0 30 1836 topology 1899 3442
+> 15 0 31 1836 topology 1899 3443
+> 16 0 31 1836 topology 1897 3443
+> 15 0 30 1836 topology 1928 3444
+> 16 0 30 1836 topology 1848 3444
+> 15 0 31 1836 topology 1848 3445
+> 16 0 31 1836 topology 1846 3445
+> 15 0 30 1836 topology 1928 3446
+> 16 0 30 1836 topology 1905 3446
+> 15 0 31 1836 topology 1905 3447
+> 16 0 31 1836 topology 1903 3447
+> 15 0 30 1836 topology 1928 3448
+> 16 0 30 1836 topology 1914 3448
+> 15 0 31 1836 topology 1914 3449
+> 16 0 31 1836 topology 1912 3449
+> 15 0 30 1836 topology 1928 3450
+> 16 0 30 1836 topology 1911 3450
+> 15 0 31 1836 topology 1911 3451
+> 16 0 31 1836 topology 1909 3451
+> 15 0 30 1836 topology 1928 3452
+> 16 0 30 1836 topology 1920 3452
+> 15 0 31 1836 topology 1920 3453
+> 16 0 31 1836 topology 1918 3453
+> 15 0 30 1836 topology 1928 3454
+> 16 0 30 1836 topology 1926 3454
+> 15 0 31 1836 topology 1926 3455
+> 16 0 31 1836 topology 1924 3455
+> 15 0 30 1836 topology 1928 3456
+> 16 0 30 1836 topology 1857 3456
+> 15 0 31 1836 topology 1857 3457
+> 16 0 31 1836 topology 1855 3457
+> 15 0 30 1836 topology 1928 3458
+> 16 0 30 1836 topology 1863 3458
+> 15 0 31 1836 topology 1863 3459
+> 16 0 31 1836 topology 1861 3459
+> 15 0 30 1836 topology 1928 3460
+> 16 0 30 1836 topology 1869 3460
+> 15 0 31 1836 topology 1869 3461
+> 16 0 31 1836 topology 1867 3461
+> 15 0 30 1836 topology 1928 3462
+> 16 0 30 1836 topology 1875 3462
+> 15 0 31 1836 topology 1875 3463
+> 16 0 31 1836 topology 1873 3463
+> 15 0 30 1836 topology 1928 3464
+> 16 0 30 1836 topology 1881 3464
+> 15 0 31 1836 topology 1881 3465
+> 16 0 31 1836 topology 1879 3465
+> 15 0 29 1836 topology 1888 3466
+> 16 0 29 1836 topology 1889 3466
+> 15 0 30 1836 topology 1889 3467
+> 16 0 30 1836 topology 1928 3467
+> 15 0 30 1836 topology 1928 3468
+> 16 0 30 1836 topology 1884 3468
+> 15 0 31 1836 topology 1884 3469
+> 16 0 31 1836 topology 1882 3469
+> 15 0 29 1836 topology 1837 3470
+> 16 0 29 1836 topology 1838 3470
+> 15 0 30 1836 topology 1838 3471
+> 16 0 30 1836 topology 1928 3471
+> 15 0 29 1836 topology 1894 3472
+> 16 0 29 1836 topology 1895 3472
+> 15 0 30 1836 topology 1895 3473
+> 16 0 30 1836 topology 1928 3473
+> 15 0 29 1836 topology 1843 3474
+> 16 0 29 1836 topology 1844 3474
+> 15 0 30 1836 topology 1844 3475
+> 16 0 30 1836 topology 1928 3475
+> 15 0 29 1836 topology 1900 3476
+> 16 0 29 1836 topology 1901 3476
+> 15 0 30 1836 topology 1901 3477
+> 16 0 30 1836 topology 1928 3477
+> 15 0 29 1836 topology 1849 3478
+> 16 0 29 1836 topology 1850 3478
+> 15 0 30 1836 topology 1850 3479
+> 16 0 30 1836 topology 1928 3479
+> 15 0 29 1836 topology 1906 3480
+> 16 0 29 1836 topology 1907 3480
+> 15 0 30 1836 topology 1907 3481
+> 16 0 30 1836 topology 1928 3481
+> 15 0 29 1836 topology 1915 3482
+> 16 0 29 1836 topology 1916 3482
+> 15 0 30 1836 topology 1916 3483
+> 16 0 30 1836 topology 1928 3483
+> 15 0 29 1836 topology 1921 3484
+> 16 0 29 1836 topology 1922 3484
+> 15 0 30 1836 topology 1922 3485
+> 16 0 30 1836 topology 1928 3485
+> 15 0 29 1836 topology 1852 3486
+> 16 0 29 1836 topology 1853 3486
+> 15 0 30 1836 topology 1853 3487
+> 16 0 30 1836 topology 1928 3487
+> 15 0 29 1836 topology 1858 3488
+> 16 0 29 1836 topology 1859 3488
+> 15 0 30 1836 topology 1859 3489
+> 16 0 30 1836 topology 1928 3489
+> 15 0 29 1836 topology 1864 3490
+> 16 0 29 1836 topology 1865 3490
+> 15 0 30 1836 topology 1865 3491
+> 16 0 30 1836 topology 1928 3491
+> 15 0 29 1836 topology 1870 3492
+> 16 0 29 1836 topology 1871 3492
+> 15 0 30 1836 topology 1871 3493
+> 16 0 30 1836 topology 1928 3493
+> 15 0 29 1836 topology 1876 3494
+> 16 0 29 1836 topology 1877 3494
+> 15 0 30 1836 topology 1877 3495
+> 16 0 30 1836 topology 1928 3495
+> 15 0 29 1836 topology 1885 3496
+> 16 0 29 1836 topology 1886 3496
+> 15 0 30 1836 topology 1886 3497
+> 16 0 30 1836 topology 1928 3497
+> 15 0 29 1836 topology 1891 3498
+> 16 0 29 1836 topology 1892 3498
+> 15 0 30 1836 topology 1892 3499
+> 16 0 30 1836 topology 1928 3499
+> 15 0 29 1836 topology 1840 3500
+> 16 0 29 1836 topology 1841 3500
+> 15 0 30 1836 topology 1841 3501
+> 16 0 30 1836 topology 1928 3501
+> 15 0 29 1836 topology 1897 3502
+> 16 0 29 1836 topology 1898 3502
+> 15 0 30 1836 topology 1898 3503
+> 16 0 30 1836 topology 1928 3503
+> 15 0 29 1836 topology 1846 3504
+> 16 0 29 1836 topology 1847 3504
+> 15 0 30 1836 topology 1847 3505
+> 16 0 30 1836 topology 1928 3505
+> 15 0 29 1836 topology 1903 3506
+> 16 0 29 1836 topology 1904 3506
+> 15 0 30 1836 topology 1904 3507
+> 16 0 30 1836 topology 1928 3507
+> 15 0 29 1836 topology 1912 3508
+> 16 0 29 1836 topology 1913 3508
+> 15 0 30 1836 topology 1913 3509
+> 16 0 30 1836 topology 1928 3509
+> 15 0 29 1836 topology 1909 3510
+> 16 0 29 1836 topology 1910 3510
+> 15 0 30 1836 topology 1910 3511
+> 16 0 30 1836 topology 1928 3511
+> 15 0 29 1836 topology 1918 3512
+> 16 0 29 1836 topology 1919 3512
+> 15 0 30 1836 topology 1919 3513
+> 16 0 30 1836 topology 1928 3513
+> 15 0 29 1836 topology 1924 3514
+> 16 0 29 1836 topology 1925 3514
+> 15 0 30 1836 topology 1925 3515
+> 16 0 30 1836 topology 1928 3515
+> 15 0 29 1836 topology 1855 3516
+> 16 0 29 1836 topology 1856 3516
+> 15 0 30 1836 topology 1856 3517
+> 16 0 30 1836 topology 1928 3517
+> 15 0 29 1836 topology 1861 3518
+> 16 0 29 1836 topology 1862 3518
+> 15 0 30 1836 topology 1862 3519
+> 16 0 30 1836 topology 1928 3519
+> 15 0 29 1836 topology 1867 3520
+> 16 0 29 1836 topology 1868 3520
+> 15 0 30 1836 topology 1868 3521
+> 16 0 30 1836 topology 1928 3521
+> 15 0 29 1836 topology 1873 3522
+> 16 0 29 1836 topology 1874 3522
+> 15 0 30 1836 topology 1874 3523
+> 16 0 30 1836 topology 1928 3523
+> 15 0 29 1836 topology 1879 3524
+> 16 0 29 1836 topology 1880 3524
+> 15 0 30 1836 topology 1880 3525
+> 16 0 30 1836 topology 1928 3525
+> 15 0 29 1929 topology 1975 3526
+> 16 0 29 1929 topology 1976 3526
+> 15 0 30 1929 topology 1976 3527
+> 16 0 30 1929 topology 2051 3527
+> 15 0 30 1929 topology 2051 3528
+> 16 0 30 1929 topology 2040 3528
+> 15 0 31 1929 topology 2040 3529
+> 16 0 31 1929 topology 2038 3529
+> 15 0 30 1929 topology 2051 3530
+> 16 0 30 1929 topology 1989 3530
+> 15 0 31 1929 topology 1989 3531
+> 16 0 31 1929 topology 1987 3531
+> 15 0 30 1929 topology 2051 3532
+> 16 0 30 1929 topology 1938 3532
+> 15 0 31 1929 topology 1938 3533
+> 16 0 31 1929 topology 1936 3533
+> 15 0 30 1929 topology 2051 3534
+> 16 0 30 1929 topology 2001 3534
+> 15 0 31 1929 topology 2001 3535
+> 16 0 31 1929 topology 1999 3535
+> 15 0 30 1929 topology 2051 3536
+> 16 0 30 1929 topology 1953 3536
+> 15 0 31 1929 topology 1953 3537
+> 16 0 31 1929 topology 1951 3537
+> 15 0 30 1929 topology 2051 3538
+> 16 0 30 1929 topology 2016 3538
+> 15 0 31 1929 topology 2016 3539
+> 16 0 31 1929 topology 2014 3539
+> 15 0 30 1929 topology 2051 3540
+> 16 0 30 1929 topology 1965 3540
+> 15 0 31 1929 topology 1965 3541
+> 16 0 31 1929 topology 1963 3541
+> 15 0 30 1929 topology 2051 3542
+> 16 0 30 1929 topology 2028 3542
+> 15 0 31 1929 topology 2028 3543
+> 16 0 31 1929 topology 2026 3543
+> 15 0 30 1929 topology 2051 3544
+> 16 0 30 1929 topology 1980 3544
+> 15 0 31 1929 topology 1980 3545
+> 16 0 31 1929 topology 1978 3545
+> 15 0 30 1929 topology 2051 3546
+> 16 0 30 1929 topology 2043 3546
+> 15 0 31 1929 topology 2043 3547
+> 16 0 31 1929 topology 2041 3547
+> 15 0 30 1929 topology 2051 3548
+> 16 0 30 1929 topology 1992 3548
+> 15 0 31 1929 topology 1992 3549
+> 16 0 31 1929 topology 1990 3549
+> 15 0 30 1929 topology 2051 3550
+> 16 0 30 1929 topology 1941 3550
+> 15 0 31 1929 topology 1941 3551
+> 16 0 31 1929 topology 1939 3551
+> 15 0 30 1929 topology 2051 3552
+> 16 0 30 1929 topology 2004 3552
+> 15 0 31 1929 topology 2004 3553
+> 16 0 31 1929 topology 2002 3553
+> 15 0 30 1929 topology 2051 3554
+> 16 0 30 1929 topology 2007 3554
+> 15 0 31 1929 topology 2007 3555
+> 16 0 31 1929 topology 2005 3555
+> 15 0 30 1929 topology 2051 3556
+> 16 0 30 1929 topology 1956 3556
+> 15 0 31 1929 topology 1956 3557
+> 16 0 31 1929 topology 1954 3557
+> 15 0 30 1929 topology 2051 3558
+> 16 0 30 1929 topology 2019 3558
+> 15 0 31 1929 topology 2019 3559
+> 16 0 31 1929 topology 2017 3559
+> 15 0 30 1929 topology 2051 3560
+> 16 0 30 1929 topology 1968 3560
+> 15 0 31 1929 topology 1968 3561
+> 16 0 31 1929 topology 1966 3561
+> 15 0 30 1929 topology 2051 3562
+> 16 0 30 1929 topology 2031 3562
+> 15 0 31 1929 topology 2031 3563
+> 16 0 31 1929 topology 2029 3563
+> 15 0 30 1929 topology 2051 3564
+> 16 0 30 1929 topology 1983 3564
+> 15 0 31 1929 topology 1983 3565
+> 16 0 31 1929 topology 1981 3565
+> 15 0 30 1929 topology 2051 3566
+> 16 0 30 1929 topology 1932 3566
+> 15 0 31 1929 topology 1932 3567
+> 16 0 31 1929 topology 1930 3567
+> 15 0 30 1929 topology 2051 3568
+> 16 0 30 1929 topology 2046 3568
+> 15 0 31 1929 topology 2046 3569
+> 16 0 31 1929 topology 2044 3569
+> 15 0 30 1929 topology 2051 3570
+> 16 0 30 1929 topology 1995 3570
+> 15 0 31 1929 topology 1995 3571
+> 16 0 31 1929 topology 1993 3571
+> 15 0 30 1929 topology 2051 3572
+> 16 0 30 1929 topology 1944 3572
+> 15 0 31 1929 topology 1944 3573
+> 16 0 31 1929 topology 1942 3573
+> 15 0 30 1929 topology 2051 3574
+> 16 0 30 1929 topology 1947 3574
+> 15 0 31 1929 topology 1947 3575
+> 16 0 31 1929 topology 1945 3575
+> 15 0 30 1929 topology 2051 3576
+> 16 0 30 1929 topology 2010 3576
+> 15 0 31 1929 topology 2010 3577
+> 16 0 31 1929 topology 2008 3577
+> 15 0 30 1929 topology 2051 3578
+> 16 0 30 1929 topology 1959 3578
+> 15 0 31 1929 topology 1959 3579
+> 16 0 31 1929 topology 1957 3579
+> 15 0 30 1929 topology 2051 3580
+> 16 0 30 1929 topology 2022 3580
+> 15 0 31 1929 topology 2022 3581
+> 16 0 31 1929 topology 2020 3581
+> 15 0 30 1929 topology 2051 3582
+> 16 0 30 1929 topology 1971 3582
+> 15 0 31 1929 topology 1971 3583
+> 16 0 31 1929 topology 1969 3583
+> 15 0 30 1929 topology 2051 3584
+> 16 0 30 1929 topology 2034 3584
+> 15 0 31 1929 topology 2034 3585
+> 16 0 31 1929 topology 2032 3585
+> 15 0 30 1929 topology 2051 3586
+> 16 0 30 1929 topology 2037 3586
+> 15 0 31 1929 topology 2037 3587
+> 16 0 31 1929 topology 2035 3587
+> 15 0 30 1929 topology 2051 3588
+> 16 0 30 1929 topology 1986 3588
+> 15 0 31 1929 topology 1986 3589
+> 16 0 31 1929 topology 1984 3589
+> 15 0 30 1929 topology 2051 3590
+> 16 0 30 1929 topology 1935 3590
+> 15 0 31 1929 topology 1935 3591
+> 16 0 31 1929 topology 1933 3591
+> 15 0 30 1929 topology 2051 3592
+> 16 0 30 1929 topology 2049 3592
+> 15 0 31 1929 topology 2049 3593
+> 16 0 31 1929 topology 2047 3593
+> 15 0 30 1929 topology 2051 3594
+> 16 0 30 1929 topology 1998 3594
+> 15 0 31 1929 topology 1998 3595
+> 16 0 31 1929 topology 1996 3595
+> 15 0 32 1929 topology 2051 3596
+> 16 0 32 1929 topology 2050 3596
+> 15 0 30 1929 topology 2051 3597
+> 16 0 30 1929 topology 1950 3597
+> 15 0 31 1929 topology 1950 3598
+> 16 0 31 1929 topology 1948 3598
+> 15 0 30 1929 topology 2051 3599
+> 16 0 30 1929 topology 2013 3599
+> 15 0 31 1929 topology 2013 3600
+> 16 0 31 1929 topology 2011 3600
+> 15 0 30 1929 topology 2051 3601
+> 16 0 30 1929 topology 1962 3601
+> 15 0 31 1929 topology 1962 3602
+> 16 0 31 1929 topology 1960 3602
+> 15 0 30 1929 topology 2051 3603
+> 16 0 30 1929 topology 2025 3603
+> 15 0 31 1929 topology 2025 3604
+> 16 0 31 1929 topology 2023 3604
+> 15 0 30 1929 topology 2051 3605
+> 16 0 30 1929 topology 1974 3605
+> 15 0 31 1929 topology 1974 3606
+> 16 0 31 1929 topology 1972 3606
+> 15 0 29 1929 topology 2038 3607
+> 16 0 29 1929 topology 2039 3607
+> 15 0 30 1929 topology 2039 3608
+> 16 0 30 1929 topology 2051 3608
+> 15 0 30 1929 topology 2051 3609
+> 16 0 30 1929 topology 1977 3609
+> 15 0 31 1929 topology 1977 3610
+> 16 0 31 1929 topology 1975 3610
+> 15 0 29 1929 topology 1987 3611
+> 16 0 29 1929 topology 1988 3611
+> 15 0 30 1929 topology 1988 3612
+> 16 0 30 1929 topology 2051 3612
+> 15 0 29 1929 topology 1936 3613
+> 16 0 29 1929 topology 1937 3613
+> 15 0 30 1929 topology 1937 3614
+> 16 0 30 1929 topology 2051 3614
+> 15 0 29 1929 topology 1999 3615
+> 16 0 29 1929 topology 2000 3615
+> 15 0 30 1929 topology 2000 3616
+> 16 0 30 1929 topology 2051 3616
+> 15 0 29 1929 topology 1951 3617
+> 16 0 29 1929 topology 1952 3617
+> 15 0 30 1929 topology 1952 3618
+> 16 0 30 1929 topology 2051 3618
+> 15 0 29 1929 topology 2014 3619
+> 16 0 29 1929 topology 2015 3619
+> 15 0 30 1929 topology 2015 3620
+> 16 0 30 1929 topology 2051 3620
+> 15 0 29 1929 topology 1963 3621
+> 16 0 29 1929 topology 1964 3621
+> 15 0 30 1929 topology 1964 3622
+> 16 0 30 1929 topology 2051 3622
+> 15 0 29 1929 topology 2026 3623
+> 16 0 29 1929 topology 2027 3623
+> 15 0 30 1929 topology 2027 3624
+> 16 0 30 1929 topology 2051 3624
+> 15 0 29 1929 topology 1978 3625
+> 16 0 29 1929 topology 1979 3625
+> 15 0 30 1929 topology 1979 3626
+> 16 0 30 1929 topology 2051 3626
+> 15 0 29 1929 topology 2041 3627
+> 16 0 29 1929 topology 2042 3627
+> 15 0 30 1929 topology 2042 3628
+> 16 0 30 1929 topology 2051 3628
+> 15 0 29 1929 topology 1990 3629
+> 16 0 29 1929 topology 1991 3629
+> 15 0 30 1929 topology 1991 3630
+> 16 0 30 1929 topology 2051 3630
+> 15 0 29 1929 topology 1939 3631
+> 16 0 29 1929 topology 1940 3631
+> 15 0 30 1929 topology 1940 3632
+> 16 0 30 1929 topology 2051 3632
+> 15 0 29 1929 topology 2002 3633
+> 16 0 29 1929 topology 2003 3633
+> 15 0 30 1929 topology 2003 3634
+> 16 0 30 1929 topology 2051 3634
+> 15 0 29 1929 topology 2005 3635
+> 16 0 29 1929 topology 2006 3635
+> 15 0 30 1929 topology 2006 3636
+> 16 0 30 1929 topology 2051 3636
+> 15 0 29 1929 topology 1954 3637
+> 16 0 29 1929 topology 1955 3637
+> 15 0 30 1929 topology 1955 3638
+> 16 0 30 1929 topology 2051 3638
+> 15 0 29 1929 topology 2017 3639
+> 16 0 29 1929 topology 2018 3639
+> 15 0 30 1929 topology 2018 3640
+> 16 0 30 1929 topology 2051 3640
+> 15 0 29 1929 topology 1966 3641
+> 16 0 29 1929 topology 1967 3641
+> 15 0 30 1929 topology 1967 3642
+> 16 0 30 1929 topology 2051 3642
+> 15 0 29 1929 topology 2029 3643
+> 16 0 29 1929 topology 2030 3643
+> 15 0 30 1929 topology 2030 3644
+> 16 0 30 1929 topology 2051 3644
+> 15 0 29 1929 topology 1981 3645
+> 16 0 29 1929 topology 1982 3645
+> 15 0 30 1929 topology 1982 3646
+> 16 0 30 1929 topology 2051 3646
+> 15 0 29 1929 topology 1930 3647
+> 16 0 29 1929 topology 1931 3647
+> 15 0 30 1929 topology 1931 3648
+> 16 0 30 1929 topology 2051 3648
+> 15 0 29 1929 topology 2044 3649
+> 16 0 29 1929 topology 2045 3649
+> 15 0 30 1929 topology 2045 3650
+> 16 0 30 1929 topology 2051 3650
+> 15 0 29 1929 topology 1993 3651
+> 16 0 29 1929 topology 1994 3651
+> 15 0 30 1929 topology 1994 3652
+> 16 0 30 1929 topology 2051 3652
+> 15 0 29 1929 topology 1942 3653
+> 16 0 29 1929 topology 1943 3653
+> 15 0 30 1929 topology 1943 3654
+> 16 0 30 1929 topology 2051 3654
+> 15 0 29 1929 topology 1945 3655
+> 16 0 29 1929 topology 1946 3655
+> 15 0 30 1929 topology 1946 3656
+> 16 0 30 1929 topology 2051 3656
+> 15 0 29 1929 topology 2008 3657
+> 16 0 29 1929 topology 2009 3657
+> 15 0 30 1929 topology 2009 3658
+> 16 0 30 1929 topology 2051 3658
+> 15 0 29 1929 topology 1957 3659
+> 16 0 29 1929 topology 1958 3659
+> 15 0 30 1929 topology 1958 3660
+> 16 0 30 1929 topology 2051 3660
+> 15 0 29 1929 topology 2020 3661
+> 16 0 29 1929 topology 2021 3661
+> 15 0 30 1929 topology 2021 3662
+> 16 0 30 1929 topology 2051 3662
+> 15 0 29 1929 topology 1969 3663
+> 16 0 29 1929 topology 1970 3663
+> 15 0 30 1929 topology 1970 3664
+> 16 0 30 1929 topology 2051 3664
+> 15 0 29 1929 topology 2032 3665
+> 16 0 29 1929 topology 2033 3665
+> 15 0 30 1929 topology 2033 3666
+> 16 0 30 1929 topology 2051 3666
+> 15 0 29 1929 topology 2035 3667
+> 16 0 29 1929 topology 2036 3667
+> 15 0 30 1929 topology 2036 3668
+> 16 0 30 1929 topology 2051 3668
+> 15 0 29 1929 topology 1984 3669
+> 16 0 29 1929 topology 1985 3669
+> 15 0 30 1929 topology 1985 3670
+> 16 0 30 1929 topology 2051 3670
+> 15 0 29 1929 topology 1933 3671
+> 16 0 29 1929 topology 1934 3671
+> 15 0 30 1929 topology 1934 3672
+> 16 0 30 1929 topology 2051 3672
+> 15 0 29 1929 topology 2047 3673
+> 16 0 29 1929 topology 2048 3673
+> 15 0 30 1929 topology 2048 3674
+> 16 0 30 1929 topology 2051 3674
+> 15 0 29 1929 topology 1996 3675
+> 16 0 29 1929 topology 1997 3675
+> 15 0 30 1929 topology 1997 3676
+> 16 0 30 1929 topology 2051 3676
+> 15 0 29 1929 topology 1948 3677
+> 16 0 29 1929 topology 1949 3677
+> 15 0 30 1929 topology 1949 3678
+> 16 0 30 1929 topology 2051 3678
+> 15 0 29 1929 topology 2011 3679
+> 16 0 29 1929 topology 2012 3679
+> 15 0 30 1929 topology 2012 3680
+> 16 0 30 1929 topology 2051 3680
+> 15 0 29 1929 topology 1960 3681
+> 16 0 29 1929 topology 1961 3681
+> 15 0 30 1929 topology 1961 3682
+> 16 0 30 1929 topology 2051 3682
+> 15 0 29 1929 topology 2023 3683
+> 16 0 29 1929 topology 2024 3683
+> 15 0 30 1929 topology 2024 3684
+> 16 0 30 1929 topology 2051 3684
+> 15 0 29 1929 topology 1972 3685
+> 16 0 29 1929 topology 1973 3685
+> 15 0 30 1929 topology 1973 3686
+> 16 0 30 1929 topology 2051 3686
+> 15 0 34 1607 topology 2053 3687
+> 16 0 34 1607 topology 2054 3687
+> 15 0 35 1607 topology 2054 3688
+> 16 0 35 1607 topology 1726 3688
+> 15 0 35 1607 topology 2054 3689
+> 16 0 35 1607 topology 1834 3689
+> 15 0 35 1607 topology 2054 3690
+> 16 0 35 1607 topology 1927 3690
+> 15 0 35 1607 topology 2054 3691
+> 16 0 35 1607 topology 2050 3691
+> 15 0 29 2057 topology 2085 3692
+> 16 0 29 2057 topology 2086 3692
+> 15 0 30 2057 topology 2086 3693
+> 16 0 30 2057 topology 2155 3693
+> 15 0 30 2057 topology 2155 3694
+> 16 0 30 2057 topology 2093 3694
+> 15 0 31 2057 topology 2093 3695
+> 16 0 31 2057 topology 2091 3695
+> 15 0 30 2057 topology 2155 3696
+> 16 0 30 2057 topology 2099 3696
+> 15 0 31 2057 topology 2099 3697
+> 16 0 31 2057 topology 2097 3697
+> 15 0 30 2057 topology 2155 3698
+> 16 0 30 2057 topology 2105 3698
+> 15 0 31 2057 topology 2105 3699
+> 16 0 31 2057 topology 2103 3699
+> 15 0 30 2057 topology 2155 3700
+> 16 0 30 2057 topology 2111 3700
+> 15 0 31 2057 topology 2111 3701
+> 16 0 31 2057 topology 2109 3701
+> 15 0 30 2057 topology 2155 3702
+> 16 0 30 2057 topology 2147 3702
+> 15 0 31 2057 topology 2147 3703
+> 16 0 31 2057 topology 2145 3703
+> 15 0 30 2057 topology 2155 3704
+> 16 0 30 2057 topology 2060 3704
+> 15 0 31 2057 topology 2060 3705
+> 16 0 31 2057 topology 2058 3705
+> 15 0 30 2057 topology 2155 3706
+> 16 0 30 2057 topology 2066 3706
+> 15 0 31 2057 topology 2066 3707
+> 16 0 31 2057 topology 2064 3707
+> 15 0 30 2057 topology 2155 3708
+> 16 0 30 2057 topology 2072 3708
+> 15 0 31 2057 topology 2072 3709
+> 16 0 31 2057 topology 2070 3709
+> 15 0 30 2057 topology 2155 3710
+> 16 0 30 2057 topology 2078 3710
+> 15 0 31 2057 topology 2078 3711
+> 16 0 31 2057 topology 2076 3711
+> 15 0 30 2057 topology 2155 3712
+> 16 0 30 2057 topology 2084 3712
+> 15 0 31 2057 topology 2084 3713
+> 16 0 31 2057 topology 2082 3713
+> 15 0 32 2057 topology 2155 3714
+> 16 0 32 2057 topology 2154 3714
+> 15 0 30 2057 topology 2155 3715
+> 16 0 30 2057 topology 2120 3715
+> 15 0 31 2057 topology 2120 3716
+> 16 0 31 2057 topology 2118 3716
+> 15 0 30 2057 topology 2155 3717
+> 16 0 30 2057 topology 2126 3717
+> 15 0 31 2057 topology 2126 3718
+> 16 0 31 2057 topology 2124 3718
+> 15 0 30 2057 topology 2155 3719
+> 16 0 30 2057 topology 2132 3719
+> 15 0 31 2057 topology 2132 3720
+> 16 0 31 2057 topology 2130 3720
+> 15 0 30 2057 topology 2155 3721
+> 16 0 30 2057 topology 2138 3721
+> 15 0 31 2057 topology 2138 3722
+> 16 0 31 2057 topology 2136 3722
+> 15 0 30 2057 topology 2155 3723
+> 16 0 30 2057 topology 2144 3723
+> 15 0 31 2057 topology 2144 3724
+> 16 0 31 2057 topology 2142 3724
+> 15 0 30 2057 topology 2155 3725
+> 16 0 30 2057 topology 2090 3725
+> 15 0 31 2057 topology 2090 3726
+> 16 0 31 2057 topology 2088 3726
+> 15 0 30 2057 topology 2155 3727
+> 16 0 30 2057 topology 2096 3727
+> 15 0 31 2057 topology 2096 3728
+> 16 0 31 2057 topology 2094 3728
+> 15 0 30 2057 topology 2155 3729
+> 16 0 30 2057 topology 2102 3729
+> 15 0 31 2057 topology 2102 3730
+> 16 0 31 2057 topology 2100 3730
+> 15 0 30 2057 topology 2155 3731
+> 16 0 30 2057 topology 2108 3731
+> 15 0 31 2057 topology 2108 3732
+> 16 0 31 2057 topology 2106 3732
+> 15 0 30 2057 topology 2155 3733
+> 16 0 30 2057 topology 2114 3733
+> 15 0 31 2057 topology 2114 3734
+> 16 0 31 2057 topology 2112 3734
+> 15 0 30 2057 topology 2155 3735
+> 16 0 30 2057 topology 2150 3735
+> 15 0 31 2057 topology 2150 3736
+> 16 0 31 2057 topology 2148 3736
+> 15 0 30 2057 topology 2155 3737
+> 16 0 30 2057 topology 2063 3737
+> 15 0 31 2057 topology 2063 3738
+> 16 0 31 2057 topology 2061 3738
+> 15 0 30 2057 topology 2155 3739
+> 16 0 30 2057 topology 2069 3739
+> 15 0 31 2057 topology 2069 3740
+> 16 0 31 2057 topology 2067 3740
+> 15 0 30 2057 topology 2155 3741
+> 16 0 30 2057 topology 2075 3741
+> 15 0 31 2057 topology 2075 3742
+> 16 0 31 2057 topology 2073 3742
+> 15 0 30 2057 topology 2155 3743
+> 16 0 30 2057 topology 2081 3743
+> 15 0 31 2057 topology 2081 3744
+> 16 0 31 2057 topology 2079 3744
+> 15 0 30 2057 topology 2155 3745
+> 16 0 30 2057 topology 2117 3745
+> 15 0 31 2057 topology 2117 3746
+> 16 0 31 2057 topology 2115 3746
+> 15 0 30 2057 topology 2155 3747
+> 16 0 30 2057 topology 2123 3747
+> 15 0 31 2057 topology 2123 3748
+> 16 0 31 2057 topology 2121 3748
+> 15 0 30 2057 topology 2155 3749
+> 16 0 30 2057 topology 2129 3749
+> 15 0 31 2057 topology 2129 3750
+> 16 0 31 2057 topology 2127 3750
+> 15 0 30 2057 topology 2155 3751
+> 16 0 30 2057 topology 2153 3751
+> 15 0 31 2057 topology 2153 3752
+> 16 0 31 2057 topology 2151 3752
+> 15 0 30 2057 topology 2155 3753
+> 16 0 30 2057 topology 2135 3753
+> 15 0 31 2057 topology 2135 3754
+> 16 0 31 2057 topology 2133 3754
+> 15 0 30 2057 topology 2155 3755
+> 16 0 30 2057 topology 2141 3755
+> 15 0 31 2057 topology 2141 3756
+> 16 0 31 2057 topology 2139 3756
+> 15 0 29 2057 topology 2091 3757
+> 16 0 29 2057 topology 2092 3757
+> 15 0 30 2057 topology 2092 3758
+> 16 0 30 2057 topology 2155 3758
+> 15 0 30 2057 topology 2155 3759
+> 16 0 30 2057 topology 2087 3759
+> 15 0 31 2057 topology 2087 3760
+> 16 0 31 2057 topology 2085 3760
+> 15 0 29 2057 topology 2097 3761
+> 16 0 29 2057 topology 2098 3761
+> 15 0 30 2057 topology 2098 3762
+> 16 0 30 2057 topology 2155 3762
+> 15 0 29 2057 topology 2103 3763
+> 16 0 29 2057 topology 2104 3763
+> 15 0 30 2057 topology 2104 3764
+> 16 0 30 2057 topology 2155 3764
+> 15 0 29 2057 topology 2109 3765
+> 16 0 29 2057 topology 2110 3765
+> 15 0 30 2057 topology 2110 3766
+> 16 0 30 2057 topology 2155 3766
+> 15 0 29 2057 topology 2145 3767
+> 16 0 29 2057 topology 2146 3767
+> 15 0 30 2057 topology 2146 3768
+> 16 0 30 2057 topology 2155 3768
+> 15 0 29 2057 topology 2058 3769
+> 16 0 29 2057 topology 2059 3769
+> 15 0 30 2057 topology 2059 3770
+> 16 0 30 2057 topology 2155 3770
+> 15 0 29 2057 topology 2064 3771
+> 16 0 29 2057 topology 2065 3771
+> 15 0 30 2057 topology 2065 3772
+> 16 0 30 2057 topology 2155 3772
+> 15 0 29 2057 topology 2070 3773
+> 16 0 29 2057 topology 2071 3773
+> 15 0 30 2057 topology 2071 3774
+> 16 0 30 2057 topology 2155 3774
+> 15 0 29 2057 topology 2076 3775
+> 16 0 29 2057 topology 2077 3775
+> 15 0 30 2057 topology 2077 3776
+> 16 0 30 2057 topology 2155 3776
+> 15 0 29 2057 topology 2082 3777
+> 16 0 29 2057 topology 2083 3777
+> 15 0 30 2057 topology 2083 3778
+> 16 0 30 2057 topology 2155 3778
+> 15 0 29 2057 topology 2118 3779
+> 16 0 29 2057 topology 2119 3779
+> 15 0 30 2057 topology 2119 3780
+> 16 0 30 2057 topology 2155 3780
+> 15 0 29 2057 topology 2124 3781
+> 16 0 29 2057 topology 2125 3781
+> 15 0 30 2057 topology 2125 3782
+> 16 0 30 2057 topology 2155 3782
+> 15 0 29 2057 topology 2130 3783
+> 16 0 29 2057 topology 2131 3783
+> 15 0 30 2057 topology 2131 3784
+> 16 0 30 2057 topology 2155 3784
+> 15 0 29 2057 topology 2136 3785
+> 16 0 29 2057 topology 2137 3785
+> 15 0 30 2057 topology 2137 3786
+> 16 0 30 2057 topology 2155 3786
+> 15 0 29 2057 topology 2142 3787
+> 16 0 29 2057 topology 2143 3787
+> 15 0 30 2057 topology 2143 3788
+> 16 0 30 2057 topology 2155 3788
+> 15 0 29 2057 topology 2088 3789
+> 16 0 29 2057 topology 2089 3789
+> 15 0 30 2057 topology 2089 3790
+> 16 0 30 2057 topology 2155 3790
+> 15 0 29 2057 topology 2094 3791
+> 16 0 29 2057 topology 2095 3791
+> 15 0 30 2057 topology 2095 3792
+> 16 0 30 2057 topology 2155 3792
+> 15 0 29 2057 topology 2100 3793
+> 16 0 29 2057 topology 2101 3793
+> 15 0 30 2057 topology 2101 3794
+> 16 0 30 2057 topology 2155 3794
+> 15 0 29 2057 topology 2106 3795
+> 16 0 29 2057 topology 2107 3795
+> 15 0 30 2057 topology 2107 3796
+> 16 0 30 2057 topology 2155 3796
+> 15 0 29 2057 topology 2112 3797
+> 16 0 29 2057 topology 2113 3797
+> 15 0 30 2057 topology 2113 3798
+> 16 0 30 2057 topology 2155 3798
+> 15 0 29 2057 topology 2148 3799
+> 16 0 29 2057 topology 2149 3799
+> 15 0 30 2057 topology 2149 3800
+> 16 0 30 2057 topology 2155 3800
+> 15 0 29 2057 topology 2061 3801
+> 16 0 29 2057 topology 2062 3801
+> 15 0 30 2057 topology 2062 3802
+> 16 0 30 2057 topology 2155 3802
+> 15 0 29 2057 topology 2067 3803
+> 16 0 29 2057 topology 2068 3803
+> 15 0 30 2057 topology 2068 3804
+> 16 0 30 2057 topology 2155 3804
+> 15 0 29 2057 topology 2073 3805
+> 16 0 29 2057 topology 2074 3805
+> 15 0 30 2057 topology 2074 3806
+> 16 0 30 2057 topology 2155 3806
+> 15 0 29 2057 topology 2079 3807
+> 16 0 29 2057 topology 2080 3807
+> 15 0 30 2057 topology 2080 3808
+> 16 0 30 2057 topology 2155 3808
+> 15 0 29 2057 topology 2115 3809
+> 16 0 29 2057 topology 2116 3809
+> 15 0 30 2057 topology 2116 3810
+> 16 0 30 2057 topology 2155 3810
+> 15 0 29 2057 topology 2121 3811
+> 16 0 29 2057 topology 2122 3811
+> 15 0 30 2057 topology 2122 3812
+> 16 0 30 2057 topology 2155 3812
+> 15 0 29 2057 topology 2127 3813
+> 16 0 29 2057 topology 2128 3813
+> 15 0 30 2057 topology 2128 3814
+> 16 0 30 2057 topology 2155 3814
+> 15 0 29 2057 topology 2151 3815
+> 16 0 29 2057 topology 2152 3815
+> 15 0 30 2057 topology 2152 3816
+> 16 0 30 2057 topology 2155 3816
+> 15 0 29 2057 topology 2133 3817
+> 16 0 29 2057 topology 2134 3817
+> 15 0 30 2057 topology 2134 3818
+> 16 0 30 2057 topology 2155 3818
+> 15 0 29 2057 topology 2139 3819
+> 16 0 29 2057 topology 2140 3819
+> 15 0 30 2057 topology 2140 3820
+> 16 0 30 2057 topology 2155 3820
+> 15 0 29 2156 topology 2160 3821
+> 16 0 29 2156 topology 2161 3821
+> 15 0 30 2156 topology 2161 3822
+> 16 0 30 2156 topology 2242 3822
+> 15 0 30 2156 topology 2242 3823
+> 16 0 30 2156 topology 2219 3823
+> 15 0 31 2156 topology 2219 3824
+> 16 0 31 2156 topology 2217 3824
+> 15 0 30 2156 topology 2242 3825
+> 16 0 30 2156 topology 2168 3825
+> 15 0 31 2156 topology 2168 3826
+> 16 0 31 2156 topology 2166 3826
+> 15 0 30 2156 topology 2242 3827
+> 16 0 30 2156 topology 2225 3827
+> 15 0 31 2156 topology 2225 3828
+> 16 0 31 2156 topology 2223 3828
+> 15 0 30 2156 topology 2242 3829
+> 16 0 30 2156 topology 2174 3829
+> 15 0 31 2156 topology 2174 3830
+> 16 0 31 2156 topology 2172 3830
+> 15 0 30 2156 topology 2242 3831
+> 16 0 30 2156 topology 2231 3831
+> 15 0 31 2156 topology 2231 3832
+> 16 0 31 2156 topology 2229 3832
+> 15 0 30 2156 topology 2242 3833
+> 16 0 30 2156 topology 2180 3833
+> 15 0 31 2156 topology 2180 3834
+> 16 0 31 2156 topology 2178 3834
+> 15 0 30 2156 topology 2242 3835
+> 16 0 30 2156 topology 2237 3835
+> 15 0 31 2156 topology 2237 3836
+> 16 0 31 2156 topology 2235 3836
+> 15 0 30 2156 topology 2242 3837
+> 16 0 30 2156 topology 2186 3837
+> 15 0 31 2156 topology 2186 3838
+> 16 0 31 2156 topology 2184 3838
+> 15 0 30 2156 topology 2242 3839
+> 16 0 30 2156 topology 2189 3839
+> 15 0 31 2156 topology 2189 3840
+> 16 0 31 2156 topology 2187 3840
+> 15 0 30 2156 topology 2242 3841
+> 16 0 30 2156 topology 2195 3841
+> 15 0 31 2156 topology 2195 3842
+> 16 0 31 2156 topology 2193 3842
+> 15 0 30 2156 topology 2242 3843
+> 16 0 30 2156 topology 2201 3843
+> 15 0 31 2156 topology 2201 3844
+> 16 0 31 2156 topology 2199 3844
+> 15 0 30 2156 topology 2242 3845
+> 16 0 30 2156 topology 2207 3845
+> 15 0 31 2156 topology 2207 3846
+> 16 0 31 2156 topology 2205 3846
+> 15 0 30 2156 topology 2242 3847
+> 16 0 30 2156 topology 2213 3847
+> 15 0 31 2156 topology 2213 3848
+> 16 0 31 2156 topology 2211 3848
+> 15 0 30 2156 topology 2242 3849
+> 16 0 30 2156 topology 2159 3849
+> 15 0 31 2156 topology 2159 3850
+> 16 0 31 2156 topology 2157 3850
+> 15 0 32 2156 topology 2242 3851
+> 16 0 32 2156 topology 2241 3851
+> 15 0 30 2156 topology 2242 3852
+> 16 0 30 2156 topology 2165 3852
+> 15 0 31 2156 topology 2165 3853
+> 16 0 31 2156 topology 2163 3853
+> 15 0 30 2156 topology 2242 3854
+> 16 0 30 2156 topology 2222 3854
+> 15 0 31 2156 topology 2222 3855
+> 16 0 31 2156 topology 2220 3855
+> 15 0 30 2156 topology 2242 3856
+> 16 0 30 2156 topology 2171 3856
+> 15 0 31 2156 topology 2171 3857
+> 16 0 31 2156 topology 2169 3857
+> 15 0 30 2156 topology 2242 3858
+> 16 0 30 2156 topology 2228 3858
+> 15 0 31 2156 topology 2228 3859
+> 16 0 31 2156 topology 2226 3859
+> 15 0 30 2156 topology 2242 3860
+> 16 0 30 2156 topology 2177 3860
+> 15 0 31 2156 topology 2177 3861
+> 16 0 31 2156 topology 2175 3861
+> 15 0 30 2156 topology 2242 3862
+> 16 0 30 2156 topology 2234 3862
+> 15 0 31 2156 topology 2234 3863
+> 16 0 31 2156 topology 2232 3863
+> 15 0 30 2156 topology 2242 3864
+> 16 0 30 2156 topology 2183 3864
+> 15 0 31 2156 topology 2183 3865
+> 16 0 31 2156 topology 2181 3865
+> 15 0 30 2156 topology 2242 3866
+> 16 0 30 2156 topology 2240 3866
+> 15 0 31 2156 topology 2240 3867
+> 16 0 31 2156 topology 2238 3867
+> 15 0 30 2156 topology 2242 3868
+> 16 0 30 2156 topology 2192 3868
+> 15 0 31 2156 topology 2192 3869
+> 16 0 31 2156 topology 2190 3869
+> 15 0 30 2156 topology 2242 3870
+> 16 0 30 2156 topology 2198 3870
+> 15 0 31 2156 topology 2198 3871
+> 16 0 31 2156 topology 2196 3871
+> 15 0 30 2156 topology 2242 3872
+> 16 0 30 2156 topology 2204 3872
+> 15 0 31 2156 topology 2204 3873
+> 16 0 31 2156 topology 2202 3873
+> 15 0 30 2156 topology 2242 3874
+> 16 0 30 2156 topology 2210 3874
+> 15 0 31 2156 topology 2210 3875
+> 16 0 31 2156 topology 2208 3875
+> 15 0 30 2156 topology 2242 3876
+> 16 0 30 2156 topology 2216 3876
+> 15 0 31 2156 topology 2216 3877
+> 16 0 31 2156 topology 2214 3877
+> 15 0 29 2156 topology 2217 3878
+> 16 0 29 2156 topology 2218 3878
+> 15 0 30 2156 topology 2218 3879
+> 16 0 30 2156 topology 2242 3879
+> 15 0 30 2156 topology 2242 3880
+> 16 0 30 2156 topology 2162 3880
+> 15 0 31 2156 topology 2162 3881
+> 16 0 31 2156 topology 2160 3881
+> 15 0 29 2156 topology 2166 3882
+> 16 0 29 2156 topology 2167 3882
+> 15 0 30 2156 topology 2167 3883
+> 16 0 30 2156 topology 2242 3883
+> 15 0 29 2156 topology 2223 3884
+> 16 0 29 2156 topology 2224 3884
+> 15 0 30 2156 topology 2224 3885
+> 16 0 30 2156 topology 2242 3885
+> 15 0 29 2156 topology 2172 3886
+> 16 0 29 2156 topology 2173 3886
+> 15 0 30 2156 topology 2173 3887
+> 16 0 30 2156 topology 2242 3887
+> 15 0 29 2156 topology 2229 3888
+> 16 0 29 2156 topology 2230 3888
+> 15 0 30 2156 topology 2230 3889
+> 16 0 30 2156 topology 2242 3889
+> 15 0 29 2156 topology 2178 3890
+> 16 0 29 2156 topology 2179 3890
+> 15 0 30 2156 topology 2179 3891
+> 16 0 30 2156 topology 2242 3891
+> 15 0 29 2156 topology 2235 3892
+> 16 0 29 2156 topology 2236 3892
+> 15 0 30 2156 topology 2236 3893
+> 16 0 30 2156 topology 2242 3893
+> 15 0 29 2156 topology 2184 3894
+> 16 0 29 2156 topology 2185 3894
+> 15 0 30 2156 topology 2185 3895
+> 16 0 30 2156 topology 2242 3895
+> 15 0 29 2156 topology 2187 3896
+> 16 0 29 2156 topology 2188 3896
+> 15 0 30 2156 topology 2188 3897
+> 16 0 30 2156 topology 2242 3897
+> 15 0 29 2156 topology 2193 3898
+> 16 0 29 2156 topology 2194 3898
+> 15 0 30 2156 topology 2194 3899
+> 16 0 30 2156 topology 2242 3899
+> 15 0 29 2156 topology 2199 3900
+> 16 0 29 2156 topology 2200 3900
+> 15 0 30 2156 topology 2200 3901
+> 16 0 30 2156 topology 2242 3901
+> 15 0 29 2156 topology 2205 3902
+> 16 0 29 2156 topology 2206 3902
+> 15 0 30 2156 topology 2206 3903
+> 16 0 30 2156 topology 2242 3903
+> 15 0 29 2156 topology 2211 3904
+> 16 0 29 2156 topology 2212 3904
+> 15 0 30 2156 topology 2212 3905
+> 16 0 30 2156 topology 2242 3905
+> 15 0 29 2156 topology 2157 3906
+> 16 0 29 2156 topology 2158 3906
+> 15 0 30 2156 topology 2158 3907
+> 16 0 30 2156 topology 2242 3907
+> 15 0 29 2156 topology 2163 3908
+> 16 0 29 2156 topology 2164 3908
+> 15 0 30 2156 topology 2164 3909
+> 16 0 30 2156 topology 2242 3909
+> 15 0 29 2156 topology 2220 3910
+> 16 0 29 2156 topology 2221 3910
+> 15 0 30 2156 topology 2221 3911
+> 16 0 30 2156 topology 2242 3911
+> 15 0 29 2156 topology 2169 3912
+> 16 0 29 2156 topology 2170 3912
+> 15 0 30 2156 topology 2170 3913
+> 16 0 30 2156 topology 2242 3913
+> 15 0 29 2156 topology 2226 3914
+> 16 0 29 2156 topology 2227 3914
+> 15 0 30 2156 topology 2227 3915
+> 16 0 30 2156 topology 2242 3915
+> 15 0 29 2156 topology 2175 3916
+> 16 0 29 2156 topology 2176 3916
+> 15 0 30 2156 topology 2176 3917
+> 16 0 30 2156 topology 2242 3917
+> 15 0 29 2156 topology 2232 3918
+> 16 0 29 2156 topology 2233 3918
+> 15 0 30 2156 topology 2233 3919
+> 16 0 30 2156 topology 2242 3919
+> 15 0 29 2156 topology 2181 3920
+> 16 0 29 2156 topology 2182 3920
+> 15 0 30 2156 topology 2182 3921
+> 16 0 30 2156 topology 2242 3921
+> 15 0 29 2156 topology 2238 3922
+> 16 0 29 2156 topology 2239 3922
+> 15 0 30 2156 topology 2239 3923
+> 16 0 30 2156 topology 2242 3923
+> 15 0 29 2156 topology 2190 3924
+> 16 0 29 2156 topology 2191 3924
+> 15 0 30 2156 topology 2191 3925
+> 16 0 30 2156 topology 2242 3925
+> 15 0 29 2156 topology 2196 3926
+> 16 0 29 2156 topology 2197 3926
+> 15 0 30 2156 topology 2197 3927
+> 16 0 30 2156 topology 2242 3927
+> 15 0 29 2156 topology 2202 3928
+> 16 0 29 2156 topology 2203 3928
+> 15 0 30 2156 topology 2203 3929
+> 16 0 30 2156 topology 2242 3929
+> 15 0 29 2156 topology 2208 3930
+> 16 0 29 2156 topology 2209 3930
+> 15 0 30 2156 topology 2209 3931
+> 16 0 30 2156 topology 2242 3931
+> 15 0 29 2156 topology 2214 3932
+> 16 0 29 2156 topology 2215 3932
+> 15 0 30 2156 topology 2215 3933
+> 16 0 30 2156 topology 2242 3933
+> 15 0 29 2243 topology 2274 3934
+> 16 0 29 2243 topology 2275 3934
+> 15 0 30 2243 topology 2275 3935
+> 16 0 30 2243 topology 2341 3935
+> 15 0 30 2243 topology 2341 3936
+> 16 0 30 2243 topology 2333 3936
+> 15 0 31 2243 topology 2333 3937
+> 16 0 31 2243 topology 2331 3937
+> 15 0 30 2243 topology 2341 3938
+> 16 0 30 2243 topology 2282 3938
+> 15 0 31 2243 topology 2282 3939
+> 16 0 31 2243 topology 2280 3939
+> 15 0 30 2243 topology 2341 3940
+> 16 0 30 2243 topology 2339 3940
+> 15 0 31 2243 topology 2339 3941
+> 16 0 31 2243 topology 2337 3941
+> 15 0 30 2243 topology 2341 3942
+> 16 0 30 2243 topology 2288 3942
+> 15 0 31 2243 topology 2288 3943
+> 16 0 31 2243 topology 2286 3943
+> 15 0 30 2243 topology 2341 3944
+> 16 0 30 2243 topology 2294 3944
+> 15 0 31 2243 topology 2294 3945
+> 16 0 31 2243 topology 2292 3945
+> 15 0 30 2243 topology 2341 3946
+> 16 0 30 2243 topology 2300 3946
+> 15 0 31 2243 topology 2300 3947
+> 16 0 31 2243 topology 2298 3947
+> 15 0 30 2243 topology 2341 3948
+> 16 0 30 2243 topology 2246 3948
+> 15 0 31 2243 topology 2246 3949
+> 16 0 31 2243 topology 2244 3949
+> 15 0 30 2243 topology 2341 3950
+> 16 0 30 2243 topology 2303 3950
+> 15 0 31 2243 topology 2303 3951
+> 16 0 31 2243 topology 2301 3951
+> 15 0 30 2243 topology 2341 3952
+> 16 0 30 2243 topology 2252 3952
+> 15 0 31 2243 topology 2252 3953
+> 16 0 31 2243 topology 2250 3953
+> 15 0 30 2243 topology 2341 3954
+> 16 0 30 2243 topology 2309 3954
+> 15 0 31 2243 topology 2309 3955
+> 16 0 31 2243 topology 2307 3955
+> 15 0 30 2243 topology 2341 3956
+> 16 0 30 2243 topology 2258 3956
+> 15 0 31 2243 topology 2258 3957
+> 16 0 31 2243 topology 2256 3957
+> 15 0 30 2243 topology 2341 3958
+> 16 0 30 2243 topology 2315 3958
+> 15 0 31 2243 topology 2315 3959
+> 16 0 31 2243 topology 2313 3959
+> 15 0 30 2243 topology 2341 3960
+> 16 0 30 2243 topology 2264 3960
+> 15 0 31 2243 topology 2264 3961
+> 16 0 31 2243 topology 2262 3961
+> 15 0 30 2243 topology 2341 3962
+> 16 0 30 2243 topology 2321 3962
+> 15 0 31 2243 topology 2321 3963
+> 16 0 31 2243 topology 2319 3963
+> 15 0 30 2243 topology 2341 3964
+> 16 0 30 2243 topology 2270 3964
+> 15 0 31 2243 topology 2270 3965
+> 16 0 31 2243 topology 2268 3965
+> 15 0 30 2243 topology 2341 3966
+> 16 0 30 2243 topology 2327 3966
+> 15 0 31 2243 topology 2327 3967
+> 16 0 31 2243 topology 2325 3967
+> 15 0 30 2243 topology 2341 3968
+> 16 0 30 2243 topology 2273 3968
+> 15 0 31 2243 topology 2273 3969
+> 16 0 31 2243 topology 2271 3969
+> 15 0 30 2243 topology 2341 3970
+> 16 0 30 2243 topology 2279 3970
+> 15 0 31 2243 topology 2279 3971
+> 16 0 31 2243 topology 2277 3971
+> 15 0 30 2243 topology 2341 3972
+> 16 0 30 2243 topology 2336 3972
+> 15 0 31 2243 topology 2336 3973
+> 16 0 31 2243 topology 2334 3973
+> 15 0 30 2243 topology 2341 3974
+> 16 0 30 2243 topology 2285 3974
+> 15 0 31 2243 topology 2285 3975
+> 16 0 31 2243 topology 2283 3975
+> 15 0 30 2243 topology 2341 3976
+> 16 0 30 2243 topology 2291 3976
+> 15 0 31 2243 topology 2291 3977
+> 16 0 31 2243 topology 2289 3977
+> 15 0 30 2243 topology 2341 3978
+> 16 0 30 2243 topology 2297 3978
+> 15 0 31 2243 topology 2297 3979
+> 16 0 31 2243 topology 2295 3979
+> 15 0 32 2243 topology 2341 3980
+> 16 0 32 2243 topology 2340 3980
+> 15 0 30 2243 topology 2341 3981
+> 16 0 30 2243 topology 2249 3981
+> 15 0 31 2243 topology 2249 3982
+> 16 0 31 2243 topology 2247 3982
+> 15 0 30 2243 topology 2341 3983
+> 16 0 30 2243 topology 2306 3983
+> 15 0 31 2243 topology 2306 3984
+> 16 0 31 2243 topology 2304 3984
+> 15 0 30 2243 topology 2341 3985
+> 16 0 30 2243 topology 2255 3985
+> 15 0 31 2243 topology 2255 3986
+> 16 0 31 2243 topology 2253 3986
+> 15 0 30 2243 topology 2341 3987
+> 16 0 30 2243 topology 2312 3987
+> 15 0 31 2243 topology 2312 3988
+> 16 0 31 2243 topology 2310 3988
+> 15 0 30 2243 topology 2341 3989
+> 16 0 30 2243 topology 2261 3989
+> 15 0 31 2243 topology 2261 3990
+> 16 0 31 2243 topology 2259 3990
+> 15 0 30 2243 topology 2341 3991
+> 16 0 30 2243 topology 2318 3991
+> 15 0 31 2243 topology 2318 3992
+> 16 0 31 2243 topology 2316 3992
+> 15 0 30 2243 topology 2341 3993
+> 16 0 30 2243 topology 2267 3993
+> 15 0 31 2243 topology 2267 3994
+> 16 0 31 2243 topology 2265 3994
+> 15 0 30 2243 topology 2341 3995
+> 16 0 30 2243 topology 2324 3995
+> 15 0 31 2243 topology 2324 3996
+> 16 0 31 2243 topology 2322 3996
+> 15 0 30 2243 topology 2341 3997
+> 16 0 30 2243 topology 2330 3997
+> 15 0 31 2243 topology 2330 3998
+> 16 0 31 2243 topology 2328 3998
+> 15 0 29 2243 topology 2331 3999
+> 16 0 29 2243 topology 2332 3999
+> 15 0 30 2243 topology 2332 4000
+> 16 0 30 2243 topology 2341 4000
+> 15 0 30 2243 topology 2341 4001
+> 16 0 30 2243 topology 2276 4001
+> 15 0 31 2243 topology 2276 4002
+> 16 0 31 2243 topology 2274 4002
+> 15 0 29 2243 topology 2280 4003
+> 16 0 29 2243 topology 2281 4003
+> 15 0 30 2243 topology 2281 4004
+> 16 0 30 2243 topology 2341 4004
+> 15 0 29 2243 topology 2337 4005
+> 16 0 29 2243 topology 2338 4005
+> 15 0 30 2243 topology 2338 4006
+> 16 0 30 2243 topology 2341 4006
+> 15 0 29 2243 topology 2286 4007
+> 16 0 29 2243 topology 2287 4007
+> 15 0 30 2243 topology 2287 4008
+> 16 0 30 2243 topology 2341 4008
+> 15 0 29 2243 topology 2292 4009
+> 16 0 29 2243 topology 2293 4009
+> 15 0 30 2243 topology 2293 4010
+> 16 0 30 2243 topology 2341 4010
+> 15 0 29 2243 topology 2298 4011
+> 16 0 29 2243 topology 2299 4011
+> 15 0 30 2243 topology 2299 4012
+> 16 0 30 2243 topology 2341 4012
+> 15 0 29 2243 topology 2244 4013
+> 16 0 29 2243 topology 2245 4013
+> 15 0 30 2243 topology 2245 4014
+> 16 0 30 2243 topology 2341 4014
+> 15 0 29 2243 topology 2301 4015
+> 16 0 29 2243 topology 2302 4015
+> 15 0 30 2243 topology 2302 4016
+> 16 0 30 2243 topology 2341 4016
+> 15 0 29 2243 topology 2250 4017
+> 16 0 29 2243 topology 2251 4017
+> 15 0 30 2243 topology 2251 4018
+> 16 0 30 2243 topology 2341 4018
+> 15 0 29 2243 topology 2307 4019
+> 16 0 29 2243 topology 2308 4019
+> 15 0 30 2243 topology 2308 4020
+> 16 0 30 2243 topology 2341 4020
+> 15 0 29 2243 topology 2256 4021
+> 16 0 29 2243 topology 2257 4021
+> 15 0 30 2243 topology 2257 4022
+> 16 0 30 2243 topology 2341 4022
+> 15 0 29 2243 topology 2313 4023
+> 16 0 29 2243 topology 2314 4023
+> 15 0 30 2243 topology 2314 4024
+> 16 0 30 2243 topology 2341 4024
+> 15 0 29 2243 topology 2262 4025
+> 16 0 29 2243 topology 2263 4025
+> 15 0 30 2243 topology 2263 4026
+> 16 0 30 2243 topology 2341 4026
+> 15 0 29 2243 topology 2319 4027
+> 16 0 29 2243 topology 2320 4027
+> 15 0 30 2243 topology 2320 4028
+> 16 0 30 2243 topology 2341 4028
+> 15 0 29 2243 topology 2268 4029
+> 16 0 29 2243 topology 2269 4029
+> 15 0 30 2243 topology 2269 4030
+> 16 0 30 2243 topology 2341 4030
+> 15 0 29 2243 topology 2325 4031
+> 16 0 29 2243 topology 2326 4031
+> 15 0 30 2243 topology 2326 4032
+> 16 0 30 2243 topology 2341 4032
+> 15 0 29 2243 topology 2271 4033
+> 16 0 29 2243 topology 2272 4033
+> 15 0 30 2243 topology 2272 4034
+> 16 0 30 2243 topology 2341 4034
+> 15 0 29 2243 topology 2277 4035
+> 16 0 29 2243 topology 2278 4035
+> 15 0 30 2243 topology 2278 4036
+> 16 0 30 2243 topology 2341 4036
+> 15 0 29 2243 topology 2334 4037
+> 16 0 29 2243 topology 2335 4037
+> 15 0 30 2243 topology 2335 4038
+> 16 0 30 2243 topology 2341 4038
+> 15 0 29 2243 topology 2283 4039
+> 16 0 29 2243 topology 2284 4039
+> 15 0 30 2243 topology 2284 4040
+> 16 0 30 2243 topology 2341 4040
+> 15 0 29 2243 topology 2289 4041
+> 16 0 29 2243 topology 2290 4041
+> 15 0 30 2243 topology 2290 4042
+> 16 0 30 2243 topology 2341 4042
+> 15 0 29 2243 topology 2295 4043
+> 16 0 29 2243 topology 2296 4043
+> 15 0 30 2243 topology 2296 4044
+> 16 0 30 2243 topology 2341 4044
+> 15 0 29 2243 topology 2247 4045
+> 16 0 29 2243 topology 2248 4045
+> 15 0 30 2243 topology 2248 4046
+> 16 0 30 2243 topology 2341 4046
+> 15 0 29 2243 topology 2304 4047
+> 16 0 29 2243 topology 2305 4047
+> 15 0 30 2243 topology 2305 4048
+> 16 0 30 2243 topology 2341 4048
+> 15 0 29 2243 topology 2253 4049
+> 16 0 29 2243 topology 2254 4049
+> 15 0 30 2243 topology 2254 4050
+> 16 0 30 2243 topology 2341 4050
+> 15 0 29 2243 topology 2310 4051
+> 16 0 29 2243 topology 2311 4051
+> 15 0 30 2243 topology 2311 4052
+> 16 0 30 2243 topology 2341 4052
+> 15 0 29 2243 topology 2259 4053
+> 16 0 29 2243 topology 2260 4053
+> 15 0 30 2243 topology 2260 4054
+> 16 0 30 2243 topology 2341 4054
+> 15 0 29 2243 topology 2316 4055
+> 16 0 29 2243 topology 2317 4055
+> 15 0 30 2243 topology 2317 4056
+> 16 0 30 2243 topology 2341 4056
+> 15 0 29 2243 topology 2265 4057
+> 16 0 29 2243 topology 2266 4057
+> 15 0 30 2243 topology 2266 4058
+> 16 0 30 2243 topology 2341 4058
+> 15 0 29 2243 topology 2322 4059
+> 16 0 29 2243 topology 2323 4059
+> 15 0 30 2243 topology 2323 4060
+> 16 0 30 2243 topology 2341 4060
+> 15 0 29 2243 topology 2328 4061
+> 16 0 29 2243 topology 2329 4061
+> 15 0 30 2243 topology 2329 4062
+> 16 0 30 2243 topology 2341 4062
+> 15 0 34 2056 topology 2343 4063
+> 16 0 34 2056 topology 2344 4063
+> 15 0 35 2056 topology 2344 4064
+> 16 0 35 2056 topology 2154 4064
+> 15 0 35 2056 topology 2344 4065
+> 16 0 35 2056 topology 2241 4065
+> 15 0 35 2056 topology 2344 4066
+> 16 0 35 2056 topology 2340 4066
+> 15 0 37 1606 topology 2053 4067
+> 16 0 37 1606 topology 2055 4067
+> 15 0 21 1606 topology 2055 4068
+> 16 0 21 1606 topology 2345 4068
+> 15 0 36 1606 topology 2345 4069
+> 16 0 36 1606 topology 2343 4069
+> 15 0 28 1606 topology 2055 4070
+> 16 0 28 1606 topology 2347 4070
+> 15 0 28 1606 topology 2345 4071
+> 16 0 28 1606 topology 2347 4071
+> 15 0 23 462 topology 469 4072
+> 16 0 23 462 topology 470 4072
+> 15 0 24 462 topology 470 4073
+> 16 0 24 462 topology 494 4073
+> 15 0 24 462 topology 494 4074
+> 16 0 24 462 topology 483 4074
+> 15 0 25 462 topology 483 4075
+> 16 0 25 462 topology 481 4075
+> 15 0 26 462 topology 494 4076
+> 16 0 26 462 topology 493 4076
+> 15 0 24 462 topology 494 4077
+> 16 0 24 462 topology 492 4077
+> 15 0 25 462 topology 492 4078
+> 16 0 25 462 topology 490 4078
+> 15 0 24 462 topology 494 4079
+> 16 0 24 462 topology 474 4079
+> 15 0 25 462 topology 474 4080
+> 16 0 25 462 topology 472 4080
+> 15 0 24 462 topology 494 4081
+> 16 0 24 462 topology 486 4081
+> 15 0 25 462 topology 486 4082
+> 16 0 25 462 topology 484 4082
+> 15 0 24 462 topology 494 4083
+> 16 0 24 462 topology 465 4083
+> 15 0 25 462 topology 465 4084
+> 16 0 25 462 topology 463 4084
+> 15 0 24 462 topology 494 4085
+> 16 0 24 462 topology 477 4085
+> 15 0 25 462 topology 477 4086
+> 16 0 25 462 topology 475 4086
+> 15 0 24 462 topology 494 4087
+> 16 0 24 462 topology 489 4087
+> 15 0 25 462 topology 489 4088
+> 16 0 25 462 topology 487 4088
+> 15 0 24 462 topology 494 4089
+> 16 0 24 462 topology 468 4089
+> 15 0 25 462 topology 468 4090
+> 16 0 25 462 topology 466 4090
+> 15 0 24 462 topology 494 4091
+> 16 0 24 462 topology 480 4091
+> 15 0 25 462 topology 480 4092
+> 16 0 25 462 topology 478 4092
+> 15 0 23 462 topology 481 4093
+> 16 0 23 462 topology 482 4093
+> 15 0 24 462 topology 482 4094
+> 16 0 24 462 topology 494 4094
+> 15 0 24 462 topology 494 4095
+> 16 0 24 462 topology 471 4095
+> 15 0 25 462 topology 471 4096
+> 16 0 25 462 topology 469 4096
+> 15 0 23 462 topology 490 4097
+> 16 0 23 462 topology 491 4097
+> 15 0 24 462 topology 491 4098
+> 16 0 24 462 topology 494 4098
+> 15 0 23 462 topology 472 4099
+> 16 0 23 462 topology 473 4099
+> 15 0 24 462 topology 473 4100
+> 16 0 24 462 topology 494 4100
+> 15 0 23 462 topology 484 4101
+> 16 0 23 462 topology 485 4101
+> 15 0 24 462 topology 485 4102
+> 16 0 24 462 topology 494 4102
+> 15 0 23 462 topology 463 4103
+> 16 0 23 462 topology 464 4103
+> 15 0 24 462 topology 464 4104
+> 16 0 24 462 topology 494 4104
+> 15 0 23 462 topology 475 4105
+> 16 0 23 462 topology 476 4105
+> 15 0 24 462 topology 476 4106
+> 16 0 24 462 topology 494 4106
+> 15 0 23 462 topology 487 4107
+> 16 0 23 462 topology 488 4107
+> 15 0 24 462 topology 488 4108
+> 16 0 24 462 topology 494 4108
+> 15 0 23 462 topology 466 4109
+> 16 0 23 462 topology 467 4109
+> 15 0 24 462 topology 467 4110
+> 16 0 24 462 topology 494 4110
+> 15 0 23 462 topology 478 4111
+> 16 0 23 462 topology 479 4111
+> 15 0 24 462 topology 479 4112
+> 16 0 24 462 topology 494 4112
+> 15 0 23 22 topology 35 4113
+> 16 0 23 22 topology 36 4113
+> 15 0 24 22 topology 36 4114
+> 16 0 24 22 topology 177 4114
+> 15 0 24 22 topology 177 4115
+> 16 0 24 22 topology 49 4115
+> 15 0 25 22 topology 49 4116
+> 16 0 25 22 topology 47 4116
+> 15 0 24 22 topology 177 4117
+> 16 0 24 22 topology 85 4117
+> 15 0 25 22 topology 85 4118
+> 16 0 25 22 topology 83 4118
+> 15 0 24 22 topology 177 4119
+> 16 0 24 22 topology 61 4119
+> 15 0 25 22 topology 61 4120
+> 16 0 25 22 topology 59 4120
+> 15 0 24 22 topology 177 4121
+> 16 0 24 22 topology 145 4121
+> 15 0 25 22 topology 145 4122
+> 16 0 25 22 topology 143 4122
+> 15 0 24 22 topology 177 4123
+> 16 0 24 22 topology 121 4123
+> 15 0 25 22 topology 121 4124
+> 16 0 25 22 topology 119 4124
+> 15 0 24 22 topology 177 4125
+> 16 0 24 22 topology 97 4125
+> 15 0 25 22 topology 97 4126
+> 16 0 25 22 topology 95 4126
+> 15 0 24 22 topology 177 4127
+> 16 0 24 22 topology 73 4127
+> 15 0 25 22 topology 73 4128
+> 16 0 25 22 topology 71 4128
+> 15 0 24 22 topology 177 4129
+> 16 0 24 22 topology 157 4129
+> 15 0 25 22 topology 157 4130
+> 16 0 25 22 topology 155 4130
+> 15 0 24 22 topology 177 4131
+> 16 0 24 22 topology 133 4131
+> 15 0 25 22 topology 133 4132
+> 16 0 25 22 topology 131 4132
+> 15 0 24 22 topology 177 4133
+> 16 0 24 22 topology 109 4133
+> 15 0 25 22 topology 109 4134
+> 16 0 25 22 topology 107 4134
+> 15 0 24 22 topology 177 4135
+> 16 0 24 22 topology 169 4135
+> 15 0 25 22 topology 169 4136
+> 16 0 25 22 topology 167 4136
+> 15 0 24 22 topology 177 4137
+> 16 0 24 22 topology 28 4137
+> 15 0 25 22 topology 28 4138
+> 16 0 25 22 topology 26 4138
+> 15 0 24 22 topology 177 4139
+> 16 0 24 22 topology 40 4139
+> 15 0 25 22 topology 40 4140
+> 16 0 25 22 topology 38 4140
+> 15 0 24 22 topology 177 4141
+> 16 0 24 22 topology 52 4141
+> 15 0 25 22 topology 52 4142
+> 16 0 25 22 topology 50 4142
+> 15 0 24 22 topology 177 4143
+> 16 0 24 22 topology 112 4143
+> 15 0 25 22 topology 112 4144
+> 16 0 25 22 topology 110 4144
+> 15 0 24 22 topology 177 4145
+> 16 0 24 22 topology 88 4145
+> 15 0 25 22 topology 88 4146
+> 16 0 25 22 topology 86 4146
+> 15 0 24 22 topology 177 4147
+> 16 0 24 22 topology 64 4147
+> 15 0 25 22 topology 64 4148
+> 16 0 25 22 topology 62 4148
+> 15 0 24 22 topology 177 4149
+> 16 0 24 22 topology 172 4149
+> 15 0 25 22 topology 172 4150
+> 16 0 25 22 topology 170 4150
+> 15 0 24 22 topology 177 4151
+> 16 0 24 22 topology 148 4151
+> 15 0 25 22 topology 148 4152
+> 16 0 25 22 topology 146 4152
+> 15 0 24 22 topology 177 4153
+> 16 0 24 22 topology 124 4153
+> 15 0 25 22 topology 124 4154
+> 16 0 25 22 topology 122 4154
+> 15 0 24 22 topology 177 4155
+> 16 0 24 22 topology 100 4155
+> 15 0 25 22 topology 100 4156
+> 16 0 25 22 topology 98 4156
+> 15 0 24 22 topology 177 4157
+> 16 0 24 22 topology 76 4157
+> 15 0 25 22 topology 76 4158
+> 16 0 25 22 topology 74 4158
+> 15 0 24 22 topology 177 4159
+> 16 0 24 22 topology 160 4159
+> 15 0 25 22 topology 160 4160
+> 16 0 25 22 topology 158 4160
+> 15 0 24 22 topology 177 4161
+> 16 0 24 22 topology 136 4161
+> 15 0 25 22 topology 136 4162
+> 16 0 25 22 topology 134 4162
+> 15 0 24 22 topology 177 4163
+> 16 0 24 22 topology 31 4163
+> 15 0 25 22 topology 31 4164
+> 16 0 25 22 topology 29 4164
+> 15 0 24 22 topology 177 4165
+> 16 0 24 22 topology 43 4165
+> 15 0 25 22 topology 43 4166
+> 16 0 25 22 topology 41 4166
+> 15 0 24 22 topology 177 4167
+> 16 0 24 22 topology 55 4167
+> 15 0 25 22 topology 55 4168
+> 16 0 25 22 topology 53 4168
+> 15 0 24 22 topology 177 4169
+> 16 0 24 22 topology 115 4169
+> 15 0 25 22 topology 115 4170
+> 16 0 25 22 topology 113 4170
+> 15 0 24 22 topology 177 4171
+> 16 0 24 22 topology 91 4171
+> 15 0 25 22 topology 91 4172
+> 16 0 25 22 topology 89 4172
+> 15 0 24 22 topology 177 4173
+> 16 0 24 22 topology 67 4173
+> 15 0 25 22 topology 67 4174
+> 16 0 25 22 topology 65 4174
+> 15 0 24 22 topology 177 4175
+> 16 0 24 22 topology 175 4175
+> 15 0 25 22 topology 175 4176
+> 16 0 25 22 topology 173 4176
+> 15 0 24 22 topology 177 4177
+> 16 0 24 22 topology 151 4177
+> 15 0 25 22 topology 151 4178
+> 16 0 25 22 topology 149 4178
+> 15 0 24 22 topology 177 4179
+> 16 0 24 22 topology 127 4179
+> 15 0 25 22 topology 127 4180
+> 16 0 25 22 topology 125 4180
+> 15 0 24 22 topology 177 4181
+> 16 0 24 22 topology 103 4181
+> 15 0 25 22 topology 103 4182
+> 16 0 25 22 topology 101 4182
+> 15 0 24 22 topology 177 4183
+> 16 0 24 22 topology 79 4183
+> 15 0 25 22 topology 79 4184
+> 16 0 25 22 topology 77 4184
+> 15 0 24 22 topology 177 4185
+> 16 0 24 22 topology 163 4185
+> 15 0 25 22 topology 163 4186
+> 16 0 25 22 topology 161 4186
+> 15 0 24 22 topology 177 4187
+> 16 0 24 22 topology 139 4187
+> 15 0 25 22 topology 139 4188
+> 16 0 25 22 topology 137 4188
+> 15 0 24 22 topology 177 4189
+> 16 0 24 22 topology 34 4189
+> 15 0 25 22 topology 34 4190
+> 16 0 25 22 topology 32 4190
+> 15 0 24 22 topology 177 4191
+> 16 0 24 22 topology 46 4191
+> 15 0 25 22 topology 46 4192
+> 16 0 25 22 topology 44 4192
+> 15 0 24 22 topology 177 4193
+> 16 0 24 22 topology 82 4193
+> 15 0 25 22 topology 82 4194
+> 16 0 25 22 topology 80 4194
+> 15 0 24 22 topology 177 4195
+> 16 0 24 22 topology 58 4195
+> 15 0 25 22 topology 58 4196
+> 16 0 25 22 topology 56 4196
+> 15 0 24 22 topology 177 4197
+> 16 0 24 22 topology 142 4197
+> 15 0 25 22 topology 142 4198
+> 16 0 25 22 topology 140 4198
+> 15 0 24 22 topology 177 4199
+> 16 0 24 22 topology 118 4199
+> 15 0 25 22 topology 118 4200
+> 16 0 25 22 topology 116 4200
+> 15 0 24 22 topology 177 4201
+> 16 0 24 22 topology 94 4201
+> 15 0 25 22 topology 94 4202
+> 16 0 25 22 topology 92 4202
+> 15 0 24 22 topology 177 4203
+> 16 0 24 22 topology 70 4203
+> 15 0 25 22 topology 70 4204
+> 16 0 25 22 topology 68 4204
+> 15 0 24 22 topology 177 4205
+> 16 0 24 22 topology 154 4205
+> 15 0 25 22 topology 154 4206
+> 16 0 25 22 topology 152 4206
+> 15 0 26 22 topology 177 4207
+> 16 0 26 22 topology 176 4207
+> 15 0 24 22 topology 177 4208
+> 16 0 24 22 topology 130 4208
+> 15 0 25 22 topology 130 4209
+> 16 0 25 22 topology 128 4209
+> 15 0 24 22 topology 177 4210
+> 16 0 24 22 topology 106 4210
+> 15 0 25 22 topology 106 4211
+> 16 0 25 22 topology 104 4211
+> 15 0 24 22 topology 177 4212
+> 16 0 24 22 topology 166 4212
+> 15 0 25 22 topology 166 4213
+> 16 0 25 22 topology 164 4213
+> 15 0 24 22 topology 177 4214
+> 16 0 24 22 topology 25 4214
+> 15 0 25 22 topology 25 4215
+> 16 0 25 22 topology 23 4215
+> 15 0 23 22 topology 47 4216
+> 16 0 23 22 topology 48 4216
+> 15 0 24 22 topology 48 4217
+> 16 0 24 22 topology 177 4217
+> 15 0 24 22 topology 177 4218
+> 16 0 24 22 topology 37 4218
+> 15 0 25 22 topology 37 4219
+> 16 0 25 22 topology 35 4219
+> 15 0 23 22 topology 83 4220
+> 16 0 23 22 topology 84 4220
+> 15 0 24 22 topology 84 4221
+> 16 0 24 22 topology 177 4221
+> 15 0 23 22 topology 59 4222
+> 16 0 23 22 topology 60 4222
+> 15 0 24 22 topology 60 4223
+> 16 0 24 22 topology 177 4223
+> 15 0 23 22 topology 143 4224
+> 16 0 23 22 topology 144 4224
+> 15 0 24 22 topology 144 4225
+> 16 0 24 22 topology 177 4225
+> 15 0 23 22 topology 119 4226
+> 16 0 23 22 topology 120 4226
+> 15 0 24 22 topology 120 4227
+> 16 0 24 22 topology 177 4227
+> 15 0 23 22 topology 95 4228
+> 16 0 23 22 topology 96 4228
+> 15 0 24 22 topology 96 4229
+> 16 0 24 22 topology 177 4229
+> 15 0 23 22 topology 71 4230
+> 16 0 23 22 topology 72 4230
+> 15 0 24 22 topology 72 4231
+> 16 0 24 22 topology 177 4231
+> 15 0 23 22 topology 155 4232
+> 16 0 23 22 topology 156 4232
+> 15 0 24 22 topology 156 4233
+> 16 0 24 22 topology 177 4233
+> 15 0 23 22 topology 131 4234
+> 16 0 23 22 topology 132 4234
+> 15 0 24 22 topology 132 4235
+> 16 0 24 22 topology 177 4235
+> 15 0 23 22 topology 107 4236
+> 16 0 23 22 topology 108 4236
+> 15 0 24 22 topology 108 4237
+> 16 0 24 22 topology 177 4237
+> 15 0 23 22 topology 167 4238
+> 16 0 23 22 topology 168 4238
+> 15 0 24 22 topology 168 4239
+> 16 0 24 22 topology 177 4239
+> 15 0 23 22 topology 26 4240
+> 16 0 23 22 topology 27 4240
+> 15 0 24 22 topology 27 4241
+> 16 0 24 22 topology 177 4241
+> 15 0 23 22 topology 38 4242
+> 16 0 23 22 topology 39 4242
+> 15 0 24 22 topology 39 4243
+> 16 0 24 22 topology 177 4243
+> 15 0 23 22 topology 50 4244
+> 16 0 23 22 topology 51 4244
+> 15 0 24 22 topology 51 4245
+> 16 0 24 22 topology 177 4245
+> 15 0 23 22 topology 110 4246
+> 16 0 23 22 topology 111 4246
+> 15 0 24 22 topology 111 4247
+> 16 0 24 22 topology 177 4247
+> 15 0 23 22 topology 86 4248
+> 16 0 23 22 topology 87 4248
+> 15 0 24 22 topology 87 4249
+> 16 0 24 22 topology 177 4249
+> 15 0 23 22 topology 62 4250
+> 16 0 23 22 topology 63 4250
+> 15 0 24 22 topology 63 4251
+> 16 0 24 22 topology 177 4251
+> 15 0 23 22 topology 170 4252
+> 16 0 23 22 topology 171 4252
+> 15 0 24 22 topology 171 4253
+> 16 0 24 22 topology 177 4253
+> 15 0 23 22 topology 146 4254
+> 16 0 23 22 topology 147 4254
+> 15 0 24 22 topology 147 4255
+> 16 0 24 22 topology 177 4255
+> 15 0 23 22 topology 122 4256
+> 16 0 23 22 topology 123 4256
+> 15 0 24 22 topology 123 4257
+> 16 0 24 22 topology 177 4257
+> 15 0 23 22 topology 98 4258
+> 16 0 23 22 topology 99 4258
+> 15 0 24 22 topology 99 4259
+> 16 0 24 22 topology 177 4259
+> 15 0 23 22 topology 74 4260
+> 16 0 23 22 topology 75 4260
+> 15 0 24 22 topology 75 4261
+> 16 0 24 22 topology 177 4261
+> 15 0 23 22 topology 158 4262
+> 16 0 23 22 topology 159 4262
+> 15 0 24 22 topology 159 4263
+> 16 0 24 22 topology 177 4263
+> 15 0 23 22 topology 134 4264
+> 16 0 23 22 topology 135 4264
+> 15 0 24 22 topology 135 4265
+> 16 0 24 22 topology 177 4265
+> 15 0 23 22 topology 29 4266
+> 16 0 23 22 topology 30 4266
+> 15 0 24 22 topology 30 4267
+> 16 0 24 22 topology 177 4267
+> 15 0 23 22 topology 41 4268
+> 16 0 23 22 topology 42 4268
+> 15 0 24 22 topology 42 4269
+> 16 0 24 22 topology 177 4269
+> 15 0 23 22 topology 53 4270
+> 16 0 23 22 topology 54 4270
+> 15 0 24 22 topology 54 4271
+> 16 0 24 22 topology 177 4271
+> 15 0 23 22 topology 113 4272
+> 16 0 23 22 topology 114 4272
+> 15 0 24 22 topology 114 4273
+> 16 0 24 22 topology 177 4273
+> 15 0 23 22 topology 89 4274
+> 16 0 23 22 topology 90 4274
+> 15 0 24 22 topology 90 4275
+> 16 0 24 22 topology 177 4275
+> 15 0 23 22 topology 65 4276
+> 16 0 23 22 topology 66 4276
+> 15 0 24 22 topology 66 4277
+> 16 0 24 22 topology 177 4277
+> 15 0 23 22 topology 173 4278
+> 16 0 23 22 topology 174 4278
+> 15 0 24 22 topology 174 4279
+> 16 0 24 22 topology 177 4279
+> 15 0 23 22 topology 149 4280
+> 16 0 23 22 topology 150 4280
+> 15 0 24 22 topology 150 4281
+> 16 0 24 22 topology 177 4281
+> 15 0 23 22 topology 125 4282
+> 16 0 23 22 topology 126 4282
+> 15 0 24 22 topology 126 4283
+> 16 0 24 22 topology 177 4283
+> 15 0 23 22 topology 101 4284
+> 16 0 23 22 topology 102 4284
+> 15 0 24 22 topology 102 4285
+> 16 0 24 22 topology 177 4285
+> 15 0 23 22 topology 77 4286
+> 16 0 23 22 topology 78 4286
+> 15 0 24 22 topology 78 4287
+> 16 0 24 22 topology 177 4287
+> 15 0 23 22 topology 161 4288
+> 16 0 23 22 topology 162 4288
+> 15 0 24 22 topology 162 4289
+> 16 0 24 22 topology 177 4289
+> 15 0 23 22 topology 137 4290
+> 16 0 23 22 topology 138 4290
+> 15 0 24 22 topology 138 4291
+> 16 0 24 22 topology 177 4291
+> 15 0 23 22 topology 32 4292
+> 16 0 23 22 topology 33 4292
+> 15 0 24 22 topology 33 4293
+> 16 0 24 22 topology 177 4293
+> 15 0 23 22 topology 44 4294
+> 16 0 23 22 topology 45 4294
+> 15 0 24 22 topology 45 4295
+> 16 0 24 22 topology 177 4295
+> 15 0 23 22 topology 80 4296
+> 16 0 23 22 topology 81 4296
+> 15 0 24 22 topology 81 4297
+> 16 0 24 22 topology 177 4297
+> 15 0 23 22 topology 56 4298
+> 16 0 23 22 topology 57 4298
+> 15 0 24 22 topology 57 4299
+> 16 0 24 22 topology 177 4299
+> 15 0 23 22 topology 140 4300
+> 16 0 23 22 topology 141 4300
+> 15 0 24 22 topology 141 4301
+> 16 0 24 22 topology 177 4301
+> 15 0 23 22 topology 116 4302
+> 16 0 23 22 topology 117 4302
+> 15 0 24 22 topology 117 4303
+> 16 0 24 22 topology 177 4303
+> 15 0 23 22 topology 92 4304
+> 16 0 23 22 topology 93 4304
+> 15 0 24 22 topology 93 4305
+> 16 0 24 22 topology 177 4305
+> 15 0 23 22 topology 68 4306
+> 16 0 23 22 topology 69 4306
+> 15 0 24 22 topology 69 4307
+> 16 0 24 22 topology 177 4307
+> 15 0 23 22 topology 152 4308
+> 16 0 23 22 topology 153 4308
+> 15 0 24 22 topology 153 4309
+> 16 0 24 22 topology 177 4309
+> 15 0 23 22 topology 128 4310
+> 16 0 23 22 topology 129 4310
+> 15 0 24 22 topology 129 4311
+> 16 0 24 22 topology 177 4311
+> 15 0 23 22 topology 104 4312
+> 16 0 23 22 topology 105 4312
+> 15 0 24 22 topology 105 4313
+> 16 0 24 22 topology 177 4313
+> 15 0 23 22 topology 164 4314
+> 16 0 23 22 topology 165 4314
+> 15 0 24 22 topology 165 4315
+> 16 0 24 22 topology 177 4315
+> 15 0 23 22 topology 23 4316
+> 16 0 23 22 topology 24 4316
+> 15 0 24 22 topology 24 4317
+> 16 0 24 22 topology 177 4317
+> 15 0 23 179 topology 441 4318
+> 16 0 23 179 topology 442 4318
+> 15 0 24 179 topology 442 4319
+> 16 0 24 179 topology 460 4319
+> 15 0 24 179 topology 460 4320
+> 16 0 24 179 topology 182 4320
+> 15 0 25 179 topology 182 4321
+> 16 0 25 179 topology 180 4321
+> 15 0 24 179 topology 460 4322
+> 16 0 24 179 topology 206 4322
+> 15 0 25 179 topology 206 4323
+> 16 0 25 179 topology 204 4323
+> 15 0 24 179 topology 460 4324
+> 16 0 24 179 topology 242 4324
+> 15 0 25 179 topology 242 4325
+> 16 0 25 179 topology 240 4325
+> 15 0 24 179 topology 460 4326
+> 16 0 24 179 topology 278 4326
+> 15 0 25 179 topology 278 4327
+> 16 0 25 179 topology 276 4327
+> 15 0 24 179 topology 460 4328
+> 16 0 24 179 topology 362 4328
+> 15 0 25 179 topology 362 4329
+> 16 0 25 179 topology 360 4329
+> 15 0 24 179 topology 460 4330
+> 16 0 24 179 topology 230 4330
+> 15 0 25 179 topology 230 4331
+> 16 0 25 179 topology 228 4331
+> 15 0 24 179 topology 460 4332
+> 16 0 24 179 topology 314 4332
+> 15 0 25 179 topology 314 4333
+> 16 0 25 179 topology 312 4333
+> 15 0 24 179 topology 460 4334
+> 16 0 24 179 topology 398 4334
+> 15 0 25 179 topology 398 4335
+> 16 0 25 179 topology 396 4335
+> 15 0 24 179 topology 460 4336
+> 16 0 24 179 topology 266 4336
+> 15 0 25 179 topology 266 4337
+> 16 0 25 179 topology 264 4337
+> 15 0 24 179 topology 460 4338
+> 16 0 24 179 topology 350 4338
+> 15 0 25 179 topology 350 4339
+> 16 0 25 179 topology 348 4339
+> 15 0 24 179 topology 460 4340
+> 16 0 24 179 topology 434 4340
+> 15 0 25 179 topology 434 4341
+> 16 0 25 179 topology 432 4341
+> 15 0 24 179 topology 460 4342
+> 16 0 24 179 topology 386 4342
+> 15 0 25 179 topology 386 4343
+> 16 0 25 179 topology 384 4343
+> 15 0 24 179 topology 460 4344
+> 16 0 24 179 topology 197 4344
+> 15 0 25 179 topology 197 4345
+> 16 0 25 179 topology 195 4345
+> 15 0 24 179 topology 460 4346
+> 16 0 24 179 topology 269 4346
+> 15 0 25 179 topology 269 4347
+> 16 0 25 179 topology 267 4347
+> 15 0 24 179 topology 460 4348
+> 16 0 24 179 topology 221 4348
+> 15 0 25 179 topology 221 4349
+> 16 0 25 179 topology 219 4349
+> 15 0 24 179 topology 460 4350
+> 16 0 24 179 topology 305 4350
+> 15 0 25 179 topology 305 4351
+> 16 0 25 179 topology 303 4351
+> 15 0 24 179 topology 460 4352
+> 16 0 24 179 topology 389 4352
+> 15 0 25 179 topology 389 4353
+> 16 0 25 179 topology 387 4353
+> 15 0 24 179 topology 460 4354
+> 16 0 24 179 topology 257 4354
+> 15 0 25 179 topology 257 4355
+> 16 0 25 179 topology 255 4355
+> 15 0 24 179 topology 460 4356
+> 16 0 24 179 topology 341 4356
+> 15 0 25 179 topology 341 4357
+> 16 0 25 179 topology 339 4357
+> 15 0 24 179 topology 460 4358
+> 16 0 24 179 topology 425 4358
+> 15 0 25 179 topology 425 4359
+> 16 0 25 179 topology 423 4359
+> 15 0 24 179 topology 460 4360
+> 16 0 24 179 topology 293 4360
+> 15 0 25 179 topology 293 4361
+> 16 0 25 179 topology 291 4361
+> 15 0 24 179 topology 460 4362
+> 16 0 24 179 topology 377 4362
+> 15 0 25 179 topology 377 4363
+> 16 0 25 179 topology 375 4363
+> 15 0 24 179 topology 460 4364
+> 16 0 24 179 topology 413 4364
+> 15 0 25 179 topology 413 4365
+> 16 0 25 179 topology 411 4365
+> 15 0 24 179 topology 460 4366
+> 16 0 24 179 topology 188 4366
+> 15 0 25 179 topology 188 4367
+> 16 0 25 179 topology 186 4367
+> 15 0 24 179 topology 460 4368
+> 16 0 24 179 topology 212 4368
+> 15 0 25 179 topology 212 4369
+> 16 0 25 179 topology 210 4369
+> 15 0 24 179 topology 460 4370
+> 16 0 24 179 topology 248 4370
+> 15 0 25 179 topology 248 4371
+> 16 0 25 179 topology 246 4371
+> 15 0 24 179 topology 460 4372
+> 16 0 24 179 topology 332 4372
+> 15 0 25 179 topology 332 4373
+> 16 0 25 179 topology 330 4373
+> 15 0 24 179 topology 460 4374
+> 16 0 24 179 topology 284 4374
+> 15 0 25 179 topology 284 4375
+> 16 0 25 179 topology 282 4375
+> 15 0 24 179 topology 460 4376
+> 16 0 24 179 topology 368 4376
+> 15 0 25 179 topology 368 4377
+> 16 0 25 179 topology 366 4377
+> 15 0 24 179 topology 460 4378
+> 16 0 24 179 topology 236 4378
+> 15 0 25 179 topology 236 4379
+> 16 0 25 179 topology 234 4379
+> 15 0 24 179 topology 460 4380
+> 16 0 24 179 topology 452 4380
+> 15 0 25 179 topology 452 4381
+> 16 0 25 179 topology 450 4381
+> 15 0 24 179 topology 460 4382
+> 16 0 24 179 topology 320 4382
+> 15 0 25 179 topology 320 4383
+> 16 0 25 179 topology 318 4383
+> 15 0 24 179 topology 460 4384
+> 16 0 24 179 topology 404 4384
+> 15 0 25 179 topology 404 4385
+> 16 0 25 179 topology 402 4385
+> 15 0 24 179 topology 460 4386
+> 16 0 24 179 topology 356 4386
+> 15 0 25 179 topology 356 4387
+> 16 0 25 179 topology 354 4387
+> 15 0 24 179 topology 460 4388
+> 16 0 24 179 topology 440 4388
+> 15 0 25 179 topology 440 4389
+> 16 0 25 179 topology 438 4389
+> 15 0 24 179 topology 460 4390
+> 16 0 24 179 topology 203 4390
+> 15 0 25 179 topology 203 4391
+> 16 0 25 179 topology 201 4391
+> 15 0 24 179 topology 460 4392
+> 16 0 24 179 topology 239 4392
+> 15 0 25 179 topology 239 4393
+> 16 0 25 179 topology 237 4393
+> 15 0 24 179 topology 460 4394
+> 16 0 24 179 topology 275 4394
+> 15 0 25 179 topology 275 4395
+> 16 0 25 179 topology 273 4395
+> 15 0 24 179 topology 460 4396
+> 16 0 24 179 topology 359 4396
+> 15 0 25 179 topology 359 4397
+> 16 0 25 179 topology 357 4397
+> 15 0 24 179 topology 460 4398
+> 16 0 24 179 topology 227 4398
+> 15 0 25 179 topology 227 4399
+> 16 0 25 179 topology 225 4399
+> 15 0 24 179 topology 460 4400
+> 16 0 24 179 topology 311 4400
+> 15 0 25 179 topology 311 4401
+> 16 0 25 179 topology 309 4401
+> 15 0 24 179 topology 460 4402
+> 16 0 24 179 topology 395 4402
+> 15 0 25 179 topology 395 4403
+> 16 0 25 179 topology 393 4403
+> 15 0 24 179 topology 460 4404
+> 16 0 24 179 topology 263 4404
+> 15 0 25 179 topology 263 4405
+> 16 0 25 179 topology 261 4405
+> 15 0 24 179 topology 460 4406
+> 16 0 24 179 topology 347 4406
+> 15 0 25 179 topology 347 4407
+> 16 0 25 179 topology 345 4407
+> 15 0 24 179 topology 460 4408
+> 16 0 24 179 topology 431 4408
+> 15 0 25 179 topology 431 4409
+> 16 0 25 179 topology 429 4409
+> 15 0 24 179 topology 460 4410
+> 16 0 24 179 topology 383 4410
+> 15 0 25 179 topology 383 4411
+> 16 0 25 179 topology 381 4411
+> 15 0 24 179 topology 460 4412
+> 16 0 24 179 topology 194 4412
+> 15 0 25 179 topology 194 4413
+> 16 0 25 179 topology 192 4413
+> 15 0 24 179 topology 460 4414
+> 16 0 24 179 topology 218 4414
+> 15 0 25 179 topology 218 4415
+> 16 0 25 179 topology 216 4415
+> 15 0 24 179 topology 460 4416
+> 16 0 24 179 topology 302 4416
+> 15 0 25 179 topology 302 4417
+> 16 0 25 179 topology 300 4417
+> 15 0 24 179 topology 460 4418
+> 16 0 24 179 topology 254 4418
+> 15 0 25 179 topology 254 4419
+> 16 0 25 179 topology 252 4419
+> 15 0 24 179 topology 460 4420
+> 16 0 24 179 topology 338 4420
+> 15 0 25 179 topology 338 4421
+> 16 0 25 179 topology 336 4421
+> 15 0 24 179 topology 460 4422
+> 16 0 24 179 topology 422 4422
+> 15 0 25 179 topology 422 4423
+> 16 0 25 179 topology 420 4423
+> 15 0 24 179 topology 460 4424
+> 16 0 24 179 topology 290 4424
+> 15 0 25 179 topology 290 4425
+> 16 0 25 179 topology 288 4425
+> 15 0 24 179 topology 460 4426
+> 16 0 24 179 topology 374 4426
+> 15 0 25 179 topology 374 4427
+> 16 0 25 179 topology 372 4427
+> 15 0 24 179 topology 460 4428
+> 16 0 24 179 topology 458 4428
+> 15 0 25 179 topology 458 4429
+> 16 0 25 179 topology 456 4429
+> 15 0 24 179 topology 460 4430
+> 16 0 24 179 topology 326 4430
+> 15 0 25 179 topology 326 4431
+> 16 0 25 179 topology 324 4431
+> 15 0 24 179 topology 460 4432
+> 16 0 24 179 topology 410 4432
+> 15 0 25 179 topology 410 4433
+> 16 0 25 179 topology 408 4433
+> 15 0 24 179 topology 460 4434
+> 16 0 24 179 topology 446 4434
+> 15 0 25 179 topology 446 4435
+> 16 0 25 179 topology 444 4435
+> 15 0 24 179 topology 460 4436
+> 16 0 24 179 topology 185 4436
+> 15 0 25 179 topology 185 4437
+> 16 0 25 179 topology 183 4437
+> 15 0 24 179 topology 460 4438
+> 16 0 24 179 topology 209 4438
+> 15 0 25 179 topology 209 4439
+> 16 0 25 179 topology 207 4439
+> 15 0 24 179 topology 460 4440
+> 16 0 24 179 topology 245 4440
+> 15 0 25 179 topology 245 4441
+> 16 0 25 179 topology 243 4441
+> 15 0 24 179 topology 460 4442
+> 16 0 24 179 topology 329 4442
+> 15 0 25 179 topology 329 4443
+> 16 0 25 179 topology 327 4443
+> 15 0 24 179 topology 460 4444
+> 16 0 24 179 topology 281 4444
+> 15 0 25 179 topology 281 4445
+> 16 0 25 179 topology 279 4445
+> 15 0 24 179 topology 460 4446
+> 16 0 24 179 topology 365 4446
+> 15 0 25 179 topology 365 4447
+> 16 0 25 179 topology 363 4447
+> 15 0 24 179 topology 460 4448
+> 16 0 24 179 topology 233 4448
+> 15 0 25 179 topology 233 4449
+> 16 0 25 179 topology 231 4449
+> 15 0 24 179 topology 460 4450
+> 16 0 24 179 topology 449 4450
+> 15 0 25 179 topology 449 4451
+> 16 0 25 179 topology 447 4451
+> 15 0 24 179 topology 460 4452
+> 16 0 24 179 topology 317 4452
+> 15 0 25 179 topology 317 4453
+> 16 0 25 179 topology 315 4453
+> 15 0 24 179 topology 460 4454
+> 16 0 24 179 topology 401 4454
+> 15 0 25 179 topology 401 4455
+> 16 0 25 179 topology 399 4455
+> 15 0 24 179 topology 460 4456
+> 16 0 24 179 topology 353 4456
+> 15 0 25 179 topology 353 4457
+> 16 0 25 179 topology 351 4457
+> 15 0 24 179 topology 460 4458
+> 16 0 24 179 topology 437 4458
+> 15 0 25 179 topology 437 4459
+> 16 0 25 179 topology 435 4459
+> 15 0 24 179 topology 460 4460
+> 16 0 24 179 topology 200 4460
+> 15 0 25 179 topology 200 4461
+> 16 0 25 179 topology 198 4461
+> 15 0 24 179 topology 460 4462
+> 16 0 24 179 topology 272 4462
+> 15 0 25 179 topology 272 4463
+> 16 0 25 179 topology 270 4463
+> 15 0 24 179 topology 460 4464
+> 16 0 24 179 topology 224 4464
+> 15 0 25 179 topology 224 4465
+> 16 0 25 179 topology 222 4465
+> 15 0 24 179 topology 460 4466
+> 16 0 24 179 topology 308 4466
+> 15 0 25 179 topology 308 4467
+> 16 0 25 179 topology 306 4467
+> 15 0 24 179 topology 460 4468
+> 16 0 24 179 topology 392 4468
+> 15 0 25 179 topology 392 4469
+> 16 0 25 179 topology 390 4469
+> 15 0 24 179 topology 460 4470
+> 16 0 24 179 topology 260 4470
+> 15 0 25 179 topology 260 4471
+> 16 0 25 179 topology 258 4471
+> 15 0 24 179 topology 460 4472
+> 16 0 24 179 topology 344 4472
+> 15 0 25 179 topology 344 4473
+> 16 0 25 179 topology 342 4473
+> 15 0 24 179 topology 460 4474
+> 16 0 24 179 topology 428 4474
+> 15 0 25 179 topology 428 4475
+> 16 0 25 179 topology 426 4475
+> 15 0 24 179 topology 460 4476
+> 16 0 24 179 topology 296 4476
+> 15 0 25 179 topology 296 4477
+> 16 0 25 179 topology 294 4477
+> 15 0 26 179 topology 460 4478
+> 16 0 26 179 topology 459 4478
+> 15 0 24 179 topology 460 4479
+> 16 0 24 179 topology 380 4479
+> 15 0 25 179 topology 380 4480
+> 16 0 25 179 topology 378 4480
+> 15 0 24 179 topology 460 4481
+> 16 0 24 179 topology 416 4481
+> 15 0 25 179 topology 416 4482
+> 16 0 25 179 topology 414 4482
+> 15 0 24 179 topology 460 4483
+> 16 0 24 179 topology 191 4483
+> 15 0 25 179 topology 191 4484
+> 16 0 25 179 topology 189 4484
+> 15 0 24 179 topology 460 4485
+> 16 0 24 179 topology 215 4485
+> 15 0 25 179 topology 215 4486
+> 16 0 25 179 topology 213 4486
+> 15 0 24 179 topology 460 4487
+> 16 0 24 179 topology 299 4487
+> 15 0 25 179 topology 299 4488
+> 16 0 25 179 topology 297 4488
+> 15 0 24 179 topology 460 4489
+> 16 0 24 179 topology 251 4489
+> 15 0 25 179 topology 251 4490
+> 16 0 25 179 topology 249 4490
+> 15 0 24 179 topology 460 4491
+> 16 0 24 179 topology 335 4491
+> 15 0 25 179 topology 335 4492
+> 16 0 25 179 topology 333 4492
+> 15 0 24 179 topology 460 4493
+> 16 0 24 179 topology 419 4493
+> 15 0 25 179 topology 419 4494
+> 16 0 25 179 topology 417 4494
+> 15 0 24 179 topology 460 4495
+> 16 0 24 179 topology 287 4495
+> 15 0 25 179 topology 287 4496
+> 16 0 25 179 topology 285 4496
+> 15 0 24 179 topology 460 4497
+> 16 0 24 179 topology 371 4497
+> 15 0 25 179 topology 371 4498
+> 16 0 25 179 topology 369 4498
+> 15 0 24 179 topology 460 4499
+> 16 0 24 179 topology 455 4499
+> 15 0 25 179 topology 455 4500
+> 16 0 25 179 topology 453 4500
+> 15 0 24 179 topology 460 4501
+> 16 0 24 179 topology 323 4501
+> 15 0 25 179 topology 323 4502
+> 16 0 25 179 topology 321 4502
+> 15 0 24 179 topology 460 4503
+> 16 0 24 179 topology 407 4503
+> 15 0 25 179 topology 407 4504
+> 16 0 25 179 topology 405 4504
+> 15 0 23 179 topology 180 4505
+> 16 0 23 179 topology 181 4505
+> 15 0 24 179 topology 181 4506
+> 16 0 24 179 topology 460 4506
+> 15 0 24 179 topology 460 4507
+> 16 0 24 179 topology 443 4507
+> 15 0 25 179 topology 443 4508
+> 16 0 25 179 topology 441 4508
+> 15 0 23 179 topology 204 4509
+> 16 0 23 179 topology 205 4509
+> 15 0 24 179 topology 205 4510
+> 16 0 24 179 topology 460 4510
+> 15 0 23 179 topology 240 4511
+> 16 0 23 179 topology 241 4511
+> 15 0 24 179 topology 241 4512
+> 16 0 24 179 topology 460 4512
+> 15 0 23 179 topology 276 4513
+> 16 0 23 179 topology 277 4513
+> 15 0 24 179 topology 277 4514
+> 16 0 24 179 topology 460 4514
+> 15 0 23 179 topology 360 4515
+> 16 0 23 179 topology 361 4515
+> 15 0 24 179 topology 361 4516
+> 16 0 24 179 topology 460 4516
+> 15 0 23 179 topology 228 4517
+> 16 0 23 179 topology 229 4517
+> 15 0 24 179 topology 229 4518
+> 16 0 24 179 topology 460 4518
+> 15 0 23 179 topology 312 4519
+> 16 0 23 179 topology 313 4519
+> 15 0 24 179 topology 313 4520
+> 16 0 24 179 topology 460 4520
+> 15 0 23 179 topology 396 4521
+> 16 0 23 179 topology 397 4521
+> 15 0 24 179 topology 397 4522
+> 16 0 24 179 topology 460 4522
+> 15 0 23 179 topology 264 4523
+> 16 0 23 179 topology 265 4523
+> 15 0 24 179 topology 265 4524
+> 16 0 24 179 topology 460 4524
+> 15 0 23 179 topology 348 4525
+> 16 0 23 179 topology 349 4525
+> 15 0 24 179 topology 349 4526
+> 16 0 24 179 topology 460 4526
+> 15 0 23 179 topology 432 4527
+> 16 0 23 179 topology 433 4527
+> 15 0 24 179 topology 433 4528
+> 16 0 24 179 topology 460 4528
+> 15 0 23 179 topology 384 4529
+> 16 0 23 179 topology 385 4529
+> 15 0 24 179 topology 385 4530
+> 16 0 24 179 topology 460 4530
+> 15 0 23 179 topology 195 4531
+> 16 0 23 179 topology 196 4531
+> 15 0 24 179 topology 196 4532
+> 16 0 24 179 topology 460 4532
+> 15 0 23 179 topology 267 4533
+> 16 0 23 179 topology 268 4533
+> 15 0 24 179 topology 268 4534
+> 16 0 24 179 topology 460 4534
+> 15 0 23 179 topology 219 4535
+> 16 0 23 179 topology 220 4535
+> 15 0 24 179 topology 220 4536
+> 16 0 24 179 topology 460 4536
+> 15 0 23 179 topology 303 4537
+> 16 0 23 179 topology 304 4537
+> 15 0 24 179 topology 304 4538
+> 16 0 24 179 topology 460 4538
+> 15 0 23 179 topology 387 4539
+> 16 0 23 179 topology 388 4539
+> 15 0 24 179 topology 388 4540
+> 16 0 24 179 topology 460 4540
+> 15 0 23 179 topology 255 4541
+> 16 0 23 179 topology 256 4541
+> 15 0 24 179 topology 256 4542
+> 16 0 24 179 topology 460 4542
+> 15 0 23 179 topology 339 4543
+> 16 0 23 179 topology 340 4543
+> 15 0 24 179 topology 340 4544
+> 16 0 24 179 topology 460 4544
+> 15 0 23 179 topology 423 4545
+> 16 0 23 179 topology 424 4545
+> 15 0 24 179 topology 424 4546
+> 16 0 24 179 topology 460 4546
+> 15 0 23 179 topology 291 4547
+> 16 0 23 179 topology 292 4547
+> 15 0 24 179 topology 292 4548
+> 16 0 24 179 topology 460 4548
+> 15 0 23 179 topology 375 4549
+> 16 0 23 179 topology 376 4549
+> 15 0 24 179 topology 376 4550
+> 16 0 24 179 topology 460 4550
+> 15 0 23 179 topology 411 4551
+> 16 0 23 179 topology 412 4551
+> 15 0 24 179 topology 412 4552
+> 16 0 24 179 topology 460 4552
+> 15 0 23 179 topology 186 4553
+> 16 0 23 179 topology 187 4553
+> 15 0 24 179 topology 187 4554
+> 16 0 24 179 topology 460 4554
+> 15 0 23 179 topology 210 4555
+> 16 0 23 179 topology 211 4555
+> 15 0 24 179 topology 211 4556
+> 16 0 24 179 topology 460 4556
+> 15 0 23 179 topology 246 4557
+> 16 0 23 179 topology 247 4557
+> 15 0 24 179 topology 247 4558
+> 16 0 24 179 topology 460 4558
+> 15 0 23 179 topology 330 4559
+> 16 0 23 179 topology 331 4559
+> 15 0 24 179 topology 331 4560
+> 16 0 24 179 topology 460 4560
+> 15 0 23 179 topology 282 4561
+> 16 0 23 179 topology 283 4561
+> 15 0 24 179 topology 283 4562
+> 16 0 24 179 topology 460 4562
+> 15 0 23 179 topology 366 4563
+> 16 0 23 179 topology 367 4563
+> 15 0 24 179 topology 367 4564
+> 16 0 24 179 topology 460 4564
+> 15 0 23 179 topology 234 4565
+> 16 0 23 179 topology 235 4565
+> 15 0 24 179 topology 235 4566
+> 16 0 24 179 topology 460 4566
+> 15 0 23 179 topology 450 4567
+> 16 0 23 179 topology 451 4567
+> 15 0 24 179 topology 451 4568
+> 16 0 24 179 topology 460 4568
+> 15 0 23 179 topology 318 4569
+> 16 0 23 179 topology 319 4569
+> 15 0 24 179 topology 319 4570
+> 16 0 24 179 topology 460 4570
+> 15 0 23 179 topology 402 4571
+> 16 0 23 179 topology 403 4571
+> 15 0 24 179 topology 403 4572
+> 16 0 24 179 topology 460 4572
+> 15 0 23 179 topology 354 4573
+> 16 0 23 179 topology 355 4573
+> 15 0 24 179 topology 355 4574
+> 16 0 24 179 topology 460 4574
+> 15 0 23 179 topology 438 4575
+> 16 0 23 179 topology 439 4575
+> 15 0 24 179 topology 439 4576
+> 16 0 24 179 topology 460 4576
+> 15 0 23 179 topology 201 4577
+> 16 0 23 179 topology 202 4577
+> 15 0 24 179 topology 202 4578
+> 16 0 24 179 topology 460 4578
+> 15 0 23 179 topology 237 4579
+> 16 0 23 179 topology 238 4579
+> 15 0 24 179 topology 238 4580
+> 16 0 24 179 topology 460 4580
+> 15 0 23 179 topology 273 4581
+> 16 0 23 179 topology 274 4581
+> 15 0 24 179 topology 274 4582
+> 16 0 24 179 topology 460 4582
+> 15 0 23 179 topology 357 4583
+> 16 0 23 179 topology 358 4583
+> 15 0 24 179 topology 358 4584
+> 16 0 24 179 topology 460 4584
+> 15 0 23 179 topology 225 4585
+> 16 0 23 179 topology 226 4585
+> 15 0 24 179 topology 226 4586
+> 16 0 24 179 topology 460 4586
+> 15 0 23 179 topology 309 4587
+> 16 0 23 179 topology 310 4587
+> 15 0 24 179 topology 310 4588
+> 16 0 24 179 topology 460 4588
+> 15 0 23 179 topology 393 4589
+> 16 0 23 179 topology 394 4589
+> 15 0 24 179 topology 394 4590
+> 16 0 24 179 topology 460 4590
+> 15 0 23 179 topology 261 4591
+> 16 0 23 179 topology 262 4591
+> 15 0 24 179 topology 262 4592
+> 16 0 24 179 topology 460 4592
+> 15 0 23 179 topology 345 4593
+> 16 0 23 179 topology 346 4593
+> 15 0 24 179 topology 346 4594
+> 16 0 24 179 topology 460 4594
+> 15 0 23 179 topology 429 4595
+> 16 0 23 179 topology 430 4595
+> 15 0 24 179 topology 430 4596
+> 16 0 24 179 topology 460 4596
+> 15 0 23 179 topology 381 4597
+> 16 0 23 179 topology 382 4597
+> 15 0 24 179 topology 382 4598
+> 16 0 24 179 topology 460 4598
+> 15 0 23 179 topology 192 4599
+> 16 0 23 179 topology 193 4599
+> 15 0 24 179 topology 193 4600
+> 16 0 24 179 topology 460 4600
+> 15 0 23 179 topology 216 4601
+> 16 0 23 179 topology 217 4601
+> 15 0 24 179 topology 217 4602
+> 16 0 24 179 topology 460 4602
+> 15 0 23 179 topology 300 4603
+> 16 0 23 179 topology 301 4603
+> 15 0 24 179 topology 301 4604
+> 16 0 24 179 topology 460 4604
+> 15 0 23 179 topology 252 4605
+> 16 0 23 179 topology 253 4605
+> 15 0 24 179 topology 253 4606
+> 16 0 24 179 topology 460 4606
+> 15 0 23 179 topology 336 4607
+> 16 0 23 179 topology 337 4607
+> 15 0 24 179 topology 337 4608
+> 16 0 24 179 topology 460 4608
+> 15 0 23 179 topology 420 4609
+> 16 0 23 179 topology 421 4609
+> 15 0 24 179 topology 421 4610
+> 16 0 24 179 topology 460 4610
+> 15 0 23 179 topology 288 4611
+> 16 0 23 179 topology 289 4611
+> 15 0 24 179 topology 289 4612
+> 16 0 24 179 topology 460 4612
+> 15 0 23 179 topology 372 4613
+> 16 0 23 179 topology 373 4613
+> 15 0 24 179 topology 373 4614
+> 16 0 24 179 topology 460 4614
+> 15 0 23 179 topology 456 4615
+> 16 0 23 179 topology 457 4615
+> 15 0 24 179 topology 457 4616
+> 16 0 24 179 topology 460 4616
+> 15 0 23 179 topology 324 4617
+> 16 0 23 179 topology 325 4617
+> 15 0 24 179 topology 325 4618
+> 16 0 24 179 topology 460 4618
+> 15 0 23 179 topology 408 4619
+> 16 0 23 179 topology 409 4619
+> 15 0 24 179 topology 409 4620
+> 16 0 24 179 topology 460 4620
+> 15 0 23 179 topology 444 4621
+> 16 0 23 179 topology 445 4621
+> 15 0 24 179 topology 445 4622
+> 16 0 24 179 topology 460 4622
+> 15 0 23 179 topology 183 4623
+> 16 0 23 179 topology 184 4623
+> 15 0 24 179 topology 184 4624
+> 16 0 24 179 topology 460 4624
+> 15 0 23 179 topology 207 4625
+> 16 0 23 179 topology 208 4625
+> 15 0 24 179 topology 208 4626
+> 16 0 24 179 topology 460 4626
+> 15 0 23 179 topology 243 4627
+> 16 0 23 179 topology 244 4627
+> 15 0 24 179 topology 244 4628
+> 16 0 24 179 topology 460 4628
+> 15 0 23 179 topology 327 4629
+> 16 0 23 179 topology 328 4629
+> 15 0 24 179 topology 328 4630
+> 16 0 24 179 topology 460 4630
+> 15 0 23 179 topology 279 4631
+> 16 0 23 179 topology 280 4631
+> 15 0 24 179 topology 280 4632
+> 16 0 24 179 topology 460 4632
+> 15 0 23 179 topology 363 4633
+> 16 0 23 179 topology 364 4633
+> 15 0 24 179 topology 364 4634
+> 16 0 24 179 topology 460 4634
+> 15 0 23 179 topology 231 4635
+> 16 0 23 179 topology 232 4635
+> 15 0 24 179 topology 232 4636
+> 16 0 24 179 topology 460 4636
+> 15 0 23 179 topology 447 4637
+> 16 0 23 179 topology 448 4637
+> 15 0 24 179 topology 448 4638
+> 16 0 24 179 topology 460 4638
+> 15 0 23 179 topology 315 4639
+> 16 0 23 179 topology 316 4639
+> 15 0 24 179 topology 316 4640
+> 16 0 24 179 topology 460 4640
+> 15 0 23 179 topology 399 4641
+> 16 0 23 179 topology 400 4641
+> 15 0 24 179 topology 400 4642
+> 16 0 24 179 topology 460 4642
+> 15 0 23 179 topology 351 4643
+> 16 0 23 179 topology 352 4643
+> 15 0 24 179 topology 352 4644
+> 16 0 24 179 topology 460 4644
+> 15 0 23 179 topology 435 4645
+> 16 0 23 179 topology 436 4645
+> 15 0 24 179 topology 436 4646
+> 16 0 24 179 topology 460 4646
+> 15 0 23 179 topology 198 4647
+> 16 0 23 179 topology 199 4647
+> 15 0 24 179 topology 199 4648
+> 16 0 24 179 topology 460 4648
+> 15 0 23 179 topology 270 4649
+> 16 0 23 179 topology 271 4649
+> 15 0 24 179 topology 271 4650
+> 16 0 24 179 topology 460 4650
+> 15 0 23 179 topology 222 4651
+> 16 0 23 179 topology 223 4651
+> 15 0 24 179 topology 223 4652
+> 16 0 24 179 topology 460 4652
+> 15 0 23 179 topology 306 4653
+> 16 0 23 179 topology 307 4653
+> 15 0 24 179 topology 307 4654
+> 16 0 24 179 topology 460 4654
+> 15 0 23 179 topology 390 4655
+> 16 0 23 179 topology 391 4655
+> 15 0 24 179 topology 391 4656
+> 16 0 24 179 topology 460 4656
+> 15 0 23 179 topology 258 4657
+> 16 0 23 179 topology 259 4657
+> 15 0 24 179 topology 259 4658
+> 16 0 24 179 topology 460 4658
+> 15 0 23 179 topology 342 4659
+> 16 0 23 179 topology 343 4659
+> 15 0 24 179 topology 343 4660
+> 16 0 24 179 topology 460 4660
+> 15 0 23 179 topology 426 4661
+> 16 0 23 179 topology 427 4661
+> 15 0 24 179 topology 427 4662
+> 16 0 24 179 topology 460 4662
+> 15 0 23 179 topology 294 4663
+> 16 0 23 179 topology 295 4663
+> 15 0 24 179 topology 295 4664
+> 16 0 24 179 topology 460 4664
+> 15 0 23 179 topology 378 4665
+> 16 0 23 179 topology 379 4665
+> 15 0 24 179 topology 379 4666
+> 16 0 24 179 topology 460 4666
+> 15 0 23 179 topology 414 4667
+> 16 0 23 179 topology 415 4667
+> 15 0 24 179 topology 415 4668
+> 16 0 24 179 topology 460 4668
+> 15 0 23 179 topology 189 4669
+> 16 0 23 179 topology 190 4669
+> 15 0 24 179 topology 190 4670
+> 16 0 24 179 topology 460 4670
+> 15 0 23 179 topology 213 4671
+> 16 0 23 179 topology 214 4671
+> 15 0 24 179 topology 214 4672
+> 16 0 24 179 topology 460 4672
+> 15 0 23 179 topology 297 4673
+> 16 0 23 179 topology 298 4673
+> 15 0 24 179 topology 298 4674
+> 16 0 24 179 topology 460 4674
+> 15 0 23 179 topology 249 4675
+> 16 0 23 179 topology 250 4675
+> 15 0 24 179 topology 250 4676
+> 16 0 24 179 topology 460 4676
+> 15 0 23 179 topology 333 4677
+> 16 0 23 179 topology 334 4677
+> 15 0 24 179 topology 334 4678
+> 16 0 24 179 topology 460 4678
+> 15 0 23 179 topology 417 4679
+> 16 0 23 179 topology 418 4679
+> 15 0 24 179 topology 418 4680
+> 16 0 24 179 topology 460 4680
+> 15 0 23 179 topology 285 4681
+> 16 0 23 179 topology 286 4681
+> 15 0 24 179 topology 286 4682
+> 16 0 24 179 topology 460 4682
+> 15 0 23 179 topology 369 4683
+> 16 0 23 179 topology 370 4683
+> 15 0 24 179 topology 370 4684
+> 16 0 24 179 topology 460 4684
+> 15 0 23 179 topology 453 4685
+> 16 0 23 179 topology 454 4685
+> 15 0 24 179 topology 454 4686
+> 16 0 24 179 topology 460 4686
+> 15 0 23 179 topology 321 4687
+> 16 0 23 179 topology 322 4687
+> 15 0 24 179 topology 322 4688
+> 16 0 24 179 topology 460 4688
+> 15 0 23 179 topology 405 4689
+> 16 0 23 179 topology 406 4689
+> 15 0 24 179 topology 406 4690
+> 16 0 24 179 topology 460 4690
+> 15 0 27 21 topology 493 4691
+> 16 0 27 21 topology 495 4691
+> 15 0 21 21 topology 495 4692
+> 16 0 21 21 topology 178 4692
+> 15 0 28 21 topology 178 4693
+> 16 0 28 21 topology 176 4693
+> 15 0 28 21 topology 495 4694
+> 16 0 28 21 topology 497 4694
+> 15 0 21 21 topology 495 4695
+> 16 0 21 21 topology 461 4695
+> 15 0 28 21 topology 461 4696
+> 16 0 28 21 topology 459 4696
+> 15 0 28 21 topology 178 4697
+> 16 0 28 21 topology 497 4697
+> 15 0 21 21 topology 178 4698
+> 16 0 21 21 topology 461 4698
+> 15 0 27 21 topology 497 4699
+> 16 0 27 21 topology 461 4699
+> 15 0 23 1362 topology 1375 4700
+> 16 0 23 1362 topology 1376 4700
+> 15 0 24 1362 topology 1376 4701
+> 16 0 24 1362 topology 1601 4701
+> 15 0 24 1362 topology 1601 4702
+> 16 0 24 1362 topology 1425 4702
+> 15 0 25 1362 topology 1425 4703
+> 16 0 25 1362 topology 1423 4703
+> 15 0 24 1362 topology 1601 4704
+> 16 0 24 1362 topology 1401 4704
+> 15 0 25 1362 topology 1401 4705
+> 16 0 25 1362 topology 1399 4705
+> 15 0 24 1362 topology 1601 4706
+> 16 0 24 1362 topology 1545 4706
+> 15 0 25 1362 topology 1545 4707
+> 16 0 25 1362 topology 1543 4707
+> 15 0 24 1362 topology 1601 4708
+> 16 0 24 1362 topology 1521 4708
+> 15 0 25 1362 topology 1521 4709
+> 16 0 25 1362 topology 1519 4709
+> 15 0 24 1362 topology 1601 4710
+> 16 0 24 1362 topology 1497 4710
+> 15 0 25 1362 topology 1497 4711
+> 16 0 25 1362 topology 1495 4711
+> 15 0 24 1362 topology 1601 4712
+> 16 0 24 1362 topology 1473 4712
+> 15 0 25 1362 topology 1473 4713
+> 16 0 25 1362 topology 1471 4713
+> 15 0 24 1362 topology 1601 4714
+> 16 0 24 1362 topology 1449 4714
+> 15 0 25 1362 topology 1449 4715
+> 16 0 25 1362 topology 1447 4715
+> 15 0 24 1362 topology 1601 4716
+> 16 0 24 1362 topology 1593 4716
+> 15 0 25 1362 topology 1593 4717
+> 16 0 25 1362 topology 1591 4717
+> 15 0 24 1362 topology 1601 4718
+> 16 0 24 1362 topology 1569 4718
+> 15 0 25 1362 topology 1569 4719
+> 16 0 25 1362 topology 1567 4719
+> 15 0 24 1362 topology 1601 4720
+> 16 0 24 1362 topology 1380 4720
+> 15 0 25 1362 topology 1380 4721
+> 16 0 25 1362 topology 1378 4721
+> 15 0 24 1362 topology 1601 4722
+> 16 0 24 1362 topology 1452 4722
+> 15 0 25 1362 topology 1452 4723
+> 16 0 25 1362 topology 1450 4723
+> 15 0 24 1362 topology 1601 4724
+> 16 0 24 1362 topology 1428 4724
+> 15 0 25 1362 topology 1428 4725
+> 16 0 25 1362 topology 1426 4725
+> 15 0 24 1362 topology 1601 4726
+> 16 0 24 1362 topology 1404 4726
+> 15 0 25 1362 topology 1404 4727
+> 16 0 25 1362 topology 1402 4727
+> 15 0 24 1362 topology 1601 4728
+> 16 0 24 1362 topology 1572 4728
+> 15 0 25 1362 topology 1572 4729
+> 16 0 25 1362 topology 1570 4729
+> 15 0 24 1362 topology 1601 4730
+> 16 0 24 1362 topology 1548 4730
+> 15 0 25 1362 topology 1548 4731
+> 16 0 25 1362 topology 1546 4731
+> 15 0 24 1362 topology 1601 4732
+> 16 0 24 1362 topology 1524 4732
+> 15 0 25 1362 topology 1524 4733
+> 16 0 25 1362 topology 1522 4733
+> 15 0 24 1362 topology 1601 4734
+> 16 0 24 1362 topology 1500 4734
+> 15 0 25 1362 topology 1500 4735
+> 16 0 25 1362 topology 1498 4735
+> 15 0 24 1362 topology 1601 4736
+> 16 0 24 1362 topology 1476 4736
+> 15 0 25 1362 topology 1476 4737
+> 16 0 25 1362 topology 1474 4737
+> 15 0 24 1362 topology 1601 4738
+> 16 0 24 1362 topology 1596 4738
+> 15 0 25 1362 topology 1596 4739
+> 16 0 25 1362 topology 1594 4739
+> 15 0 24 1362 topology 1601 4740
+> 16 0 24 1362 topology 1383 4740
+> 15 0 25 1362 topology 1383 4741
+> 16 0 25 1362 topology 1381 4741
+> 15 0 24 1362 topology 1601 4742
+> 16 0 24 1362 topology 1455 4742
+> 15 0 25 1362 topology 1455 4743
+> 16 0 25 1362 topology 1453 4743
+> 15 0 24 1362 topology 1601 4744
+> 16 0 24 1362 topology 1431 4744
+> 15 0 25 1362 topology 1431 4745
+> 16 0 25 1362 topology 1429 4745
+> 15 0 24 1362 topology 1601 4746
+> 16 0 24 1362 topology 1407 4746
+> 15 0 25 1362 topology 1407 4747
+> 16 0 25 1362 topology 1405 4747
+> 15 0 24 1362 topology 1601 4748
+> 16 0 24 1362 topology 1575 4748
+> 15 0 25 1362 topology 1575 4749
+> 16 0 25 1362 topology 1573 4749
+> 15 0 24 1362 topology 1601 4750
+> 16 0 24 1362 topology 1551 4750
+> 15 0 25 1362 topology 1551 4751
+> 16 0 25 1362 topology 1549 4751
+> 15 0 24 1362 topology 1601 4752
+> 16 0 24 1362 topology 1527 4752
+> 15 0 25 1362 topology 1527 4753
+> 16 0 25 1362 topology 1525 4753
+> 15 0 24 1362 topology 1601 4754
+> 16 0 24 1362 topology 1503 4754
+> 15 0 25 1362 topology 1503 4755
+> 16 0 25 1362 topology 1501 4755
+> 15 0 24 1362 topology 1601 4756
+> 16 0 24 1362 topology 1479 4756
+> 15 0 25 1362 topology 1479 4757
+> 16 0 25 1362 topology 1477 4757
+> 15 0 24 1362 topology 1601 4758
+> 16 0 24 1362 topology 1599 4758
+> 15 0 25 1362 topology 1599 4759
+> 16 0 25 1362 topology 1597 4759
+> 15 0 24 1362 topology 1601 4760
+> 16 0 24 1362 topology 1386 4760
+> 15 0 25 1362 topology 1386 4761
+> 16 0 25 1362 topology 1384 4761
+> 15 0 26 1362 topology 1601 4762
+> 16 0 26 1362 topology 1600 4762
+> 15 0 24 1362 topology 1601 4763
+> 16 0 24 1362 topology 1482 4763
+> 15 0 25 1362 topology 1482 4764
+> 16 0 25 1362 topology 1480 4764
+> 15 0 24 1362 topology 1601 4765
+> 16 0 24 1362 topology 1458 4765
+> 15 0 25 1362 topology 1458 4766
+> 16 0 25 1362 topology 1456 4766
+> 15 0 24 1362 topology 1601 4767
+> 16 0 24 1362 topology 1434 4767
+> 15 0 25 1362 topology 1434 4768
+> 16 0 25 1362 topology 1432 4768
+> 15 0 24 1362 topology 1601 4769
+> 16 0 24 1362 topology 1410 4769
+> 15 0 25 1362 topology 1410 4770
+> 16 0 25 1362 topology 1408 4770
+> 15 0 24 1362 topology 1601 4771
+> 16 0 24 1362 topology 1578 4771
+> 15 0 25 1362 topology 1578 4772
+> 16 0 25 1362 topology 1576 4772
+> 15 0 24 1362 topology 1601 4773
+> 16 0 24 1362 topology 1554 4773
+> 15 0 25 1362 topology 1554 4774
+> 16 0 25 1362 topology 1552 4774
+> 15 0 24 1362 topology 1601 4775
+> 16 0 24 1362 topology 1530 4775
+> 15 0 25 1362 topology 1530 4776
+> 16 0 25 1362 topology 1528 4776
+> 15 0 24 1362 topology 1601 4777
+> 16 0 24 1362 topology 1506 4777
+> 15 0 25 1362 topology 1506 4778
+> 16 0 25 1362 topology 1504 4778
+> 15 0 24 1362 topology 1601 4779
+> 16 0 24 1362 topology 1365 4779
+> 15 0 25 1362 topology 1365 4780
+> 16 0 25 1362 topology 1363 4780
+> 15 0 24 1362 topology 1601 4781
+> 16 0 24 1362 topology 1389 4781
+> 15 0 25 1362 topology 1389 4782
+> 16 0 25 1362 topology 1387 4782
+> 15 0 24 1362 topology 1601 4783
+> 16 0 24 1362 topology 1485 4783
+> 15 0 25 1362 topology 1485 4784
+> 16 0 25 1362 topology 1483 4784
+> 15 0 24 1362 topology 1601 4785
+> 16 0 24 1362 topology 1461 4785
+> 15 0 25 1362 topology 1461 4786
+> 16 0 25 1362 topology 1459 4786
+> 15 0 24 1362 topology 1601 4787
+> 16 0 24 1362 topology 1437 4787
+> 15 0 25 1362 topology 1437 4788
+> 16 0 25 1362 topology 1435 4788
+> 15 0 24 1362 topology 1601 4789
+> 16 0 24 1362 topology 1413 4789
+> 15 0 25 1362 topology 1413 4790
+> 16 0 25 1362 topology 1411 4790
+> 15 0 24 1362 topology 1601 4791
+> 16 0 24 1362 topology 1581 4791
+> 15 0 25 1362 topology 1581 4792
+> 16 0 25 1362 topology 1579 4792
+> 15 0 24 1362 topology 1601 4793
+> 16 0 24 1362 topology 1557 4793
+> 15 0 25 1362 topology 1557 4794
+> 16 0 25 1362 topology 1555 4794
+> 15 0 24 1362 topology 1601 4795
+> 16 0 24 1362 topology 1533 4795
+> 15 0 25 1362 topology 1533 4796
+> 16 0 25 1362 topology 1531 4796
+> 15 0 24 1362 topology 1601 4797
+> 16 0 24 1362 topology 1509 4797
+> 15 0 25 1362 topology 1509 4798
+> 16 0 25 1362 topology 1507 4798
+> 15 0 24 1362 topology 1601 4799
+> 16 0 24 1362 topology 1368 4799
+> 15 0 25 1362 topology 1368 4800
+> 16 0 25 1362 topology 1366 4800
+> 15 0 24 1362 topology 1601 4801
+> 16 0 24 1362 topology 1392 4801
+> 15 0 25 1362 topology 1392 4802
+> 16 0 25 1362 topology 1390 4802
+> 15 0 24 1362 topology 1601 4803
+> 16 0 24 1362 topology 1512 4803
+> 15 0 25 1362 topology 1512 4804
+> 16 0 25 1362 topology 1510 4804
+> 15 0 24 1362 topology 1601 4805
+> 16 0 24 1362 topology 1488 4805
+> 15 0 25 1362 topology 1488 4806
+> 16 0 25 1362 topology 1486 4806
+> 15 0 24 1362 topology 1601 4807
+> 16 0 24 1362 topology 1464 4807
+> 15 0 25 1362 topology 1464 4808
+> 16 0 25 1362 topology 1462 4808
+> 15 0 24 1362 topology 1601 4809
+> 16 0 24 1362 topology 1440 4809
+> 15 0 25 1362 topology 1440 4810
+> 16 0 25 1362 topology 1438 4810
+> 15 0 24 1362 topology 1601 4811
+> 16 0 24 1362 topology 1416 4811
+> 15 0 25 1362 topology 1416 4812
+> 16 0 25 1362 topology 1414 4812
+> 15 0 24 1362 topology 1601 4813
+> 16 0 24 1362 topology 1584 4813
+> 15 0 25 1362 topology 1584 4814
+> 16 0 25 1362 topology 1582 4814
+> 15 0 24 1362 topology 1601 4815
+> 16 0 24 1362 topology 1560 4815
+> 15 0 25 1362 topology 1560 4816
+> 16 0 25 1362 topology 1558 4816
+> 15 0 24 1362 topology 1601 4817
+> 16 0 24 1362 topology 1536 4817
+> 15 0 25 1362 topology 1536 4818
+> 16 0 25 1362 topology 1534 4818
+> 15 0 24 1362 topology 1601 4819
+> 16 0 24 1362 topology 1371 4819
+> 15 0 25 1362 topology 1371 4820
+> 16 0 25 1362 topology 1369 4820
+> 15 0 24 1362 topology 1601 4821
+> 16 0 24 1362 topology 1395 4821
+> 15 0 25 1362 topology 1395 4822
+> 16 0 25 1362 topology 1393 4822
+> 15 0 24 1362 topology 1601 4823
+> 16 0 24 1362 topology 1515 4823
+> 15 0 25 1362 topology 1515 4824
+> 16 0 25 1362 topology 1513 4824
+> 15 0 24 1362 topology 1601 4825
+> 16 0 24 1362 topology 1491 4825
+> 15 0 25 1362 topology 1491 4826
+> 16 0 25 1362 topology 1489 4826
+> 15 0 24 1362 topology 1601 4827
+> 16 0 24 1362 topology 1467 4827
+> 15 0 25 1362 topology 1467 4828
+> 16 0 25 1362 topology 1465 4828
+> 15 0 24 1362 topology 1601 4829
+> 16 0 24 1362 topology 1443 4829
+> 15 0 25 1362 topology 1443 4830
+> 16 0 25 1362 topology 1441 4830
+> 15 0 24 1362 topology 1601 4831
+> 16 0 24 1362 topology 1419 4831
+> 15 0 25 1362 topology 1419 4832
+> 16 0 25 1362 topology 1417 4832
+> 15 0 24 1362 topology 1601 4833
+> 16 0 24 1362 topology 1587 4833
+> 15 0 25 1362 topology 1587 4834
+> 16 0 25 1362 topology 1585 4834
+> 15 0 24 1362 topology 1601 4835
+> 16 0 24 1362 topology 1563 4835
+> 15 0 25 1362 topology 1563 4836
+> 16 0 25 1362 topology 1561 4836
+> 15 0 24 1362 topology 1601 4837
+> 16 0 24 1362 topology 1539 4837
+> 15 0 25 1362 topology 1539 4838
+> 16 0 25 1362 topology 1537 4838
+> 15 0 24 1362 topology 1601 4839
+> 16 0 24 1362 topology 1374 4839
+> 15 0 25 1362 topology 1374 4840
+> 16 0 25 1362 topology 1372 4840
+> 15 0 24 1362 topology 1601 4841
+> 16 0 24 1362 topology 1422 4841
+> 15 0 25 1362 topology 1422 4842
+> 16 0 25 1362 topology 1420 4842
+> 15 0 24 1362 topology 1601 4843
+> 16 0 24 1362 topology 1398 4843
+> 15 0 25 1362 topology 1398 4844
+> 16 0 25 1362 topology 1396 4844
+> 15 0 24 1362 topology 1601 4845
+> 16 0 24 1362 topology 1542 4845
+> 15 0 25 1362 topology 1542 4846
+> 16 0 25 1362 topology 1540 4846
+> 15 0 24 1362 topology 1601 4847
+> 16 0 24 1362 topology 1518 4847
+> 15 0 25 1362 topology 1518 4848
+> 16 0 25 1362 topology 1516 4848
+> 15 0 24 1362 topology 1601 4849
+> 16 0 24 1362 topology 1494 4849
+> 15 0 25 1362 topology 1494 4850
+> 16 0 25 1362 topology 1492 4850
+> 15 0 24 1362 topology 1601 4851
+> 16 0 24 1362 topology 1470 4851
+> 15 0 25 1362 topology 1470 4852
+> 16 0 25 1362 topology 1468 4852
+> 15 0 24 1362 topology 1601 4853
+> 16 0 24 1362 topology 1446 4853
+> 15 0 25 1362 topology 1446 4854
+> 16 0 25 1362 topology 1444 4854
+> 15 0 24 1362 topology 1601 4855
+> 16 0 24 1362 topology 1590 4855
+> 15 0 25 1362 topology 1590 4856
+> 16 0 25 1362 topology 1588 4856
+> 15 0 24 1362 topology 1601 4857
+> 16 0 24 1362 topology 1566 4857
+> 15 0 25 1362 topology 1566 4858
+> 16 0 25 1362 topology 1564 4858
+> 15 0 23 1362 topology 1423 4859
+> 16 0 23 1362 topology 1424 4859
+> 15 0 24 1362 topology 1424 4860
+> 16 0 24 1362 topology 1601 4860
+> 15 0 24 1362 topology 1601 4861
+> 16 0 24 1362 topology 1377 4861
+> 15 0 25 1362 topology 1377 4862
+> 16 0 25 1362 topology 1375 4862
+> 15 0 23 1362 topology 1399 4863
+> 16 0 23 1362 topology 1400 4863
+> 15 0 24 1362 topology 1400 4864
+> 16 0 24 1362 topology 1601 4864
+> 15 0 23 1362 topology 1543 4865
+> 16 0 23 1362 topology 1544 4865
+> 15 0 24 1362 topology 1544 4866
+> 16 0 24 1362 topology 1601 4866
+> 15 0 23 1362 topology 1519 4867
+> 16 0 23 1362 topology 1520 4867
+> 15 0 24 1362 topology 1520 4868
+> 16 0 24 1362 topology 1601 4868
+> 15 0 23 1362 topology 1495 4869
+> 16 0 23 1362 topology 1496 4869
+> 15 0 24 1362 topology 1496 4870
+> 16 0 24 1362 topology 1601 4870
+> 15 0 23 1362 topology 1471 4871
+> 16 0 23 1362 topology 1472 4871
+> 15 0 24 1362 topology 1472 4872
+> 16 0 24 1362 topology 1601 4872
+> 15 0 23 1362 topology 1447 4873
+> 16 0 23 1362 topology 1448 4873
+> 15 0 24 1362 topology 1448 4874
+> 16 0 24 1362 topology 1601 4874
+> 15 0 23 1362 topology 1591 4875
+> 16 0 23 1362 topology 1592 4875
+> 15 0 24 1362 topology 1592 4876
+> 16 0 24 1362 topology 1601 4876
+> 15 0 23 1362 topology 1567 4877
+> 16 0 23 1362 topology 1568 4877
+> 15 0 24 1362 topology 1568 4878
+> 16 0 24 1362 topology 1601 4878
+> 15 0 23 1362 topology 1378 4879
+> 16 0 23 1362 topology 1379 4879
+> 15 0 24 1362 topology 1379 4880
+> 16 0 24 1362 topology 1601 4880
+> 15 0 23 1362 topology 1450 4881
+> 16 0 23 1362 topology 1451 4881
+> 15 0 24 1362 topology 1451 4882
+> 16 0 24 1362 topology 1601 4882
+> 15 0 23 1362 topology 1426 4883
+> 16 0 23 1362 topology 1427 4883
+> 15 0 24 1362 topology 1427 4884
+> 16 0 24 1362 topology 1601 4884
+> 15 0 23 1362 topology 1402 4885
+> 16 0 23 1362 topology 1403 4885
+> 15 0 24 1362 topology 1403 4886
+> 16 0 24 1362 topology 1601 4886
+> 15 0 23 1362 topology 1570 4887
+> 16 0 23 1362 topology 1571 4887
+> 15 0 24 1362 topology 1571 4888
+> 16 0 24 1362 topology 1601 4888
+> 15 0 23 1362 topology 1546 4889
+> 16 0 23 1362 topology 1547 4889
+> 15 0 24 1362 topology 1547 4890
+> 16 0 24 1362 topology 1601 4890
+> 15 0 23 1362 topology 1522 4891
+> 16 0 23 1362 topology 1523 4891
+> 15 0 24 1362 topology 1523 4892
+> 16 0 24 1362 topology 1601 4892
+> 15 0 23 1362 topology 1498 4893
+> 16 0 23 1362 topology 1499 4893
+> 15 0 24 1362 topology 1499 4894
+> 16 0 24 1362 topology 1601 4894
+> 15 0 23 1362 topology 1474 4895
+> 16 0 23 1362 topology 1475 4895
+> 15 0 24 1362 topology 1475 4896
+> 16 0 24 1362 topology 1601 4896
+> 15 0 23 1362 topology 1594 4897
+> 16 0 23 1362 topology 1595 4897
+> 15 0 24 1362 topology 1595 4898
+> 16 0 24 1362 topology 1601 4898
+> 15 0 23 1362 topology 1381 4899
+> 16 0 23 1362 topology 1382 4899
+> 15 0 24 1362 topology 1382 4900
+> 16 0 24 1362 topology 1601 4900
+> 15 0 23 1362 topology 1453 4901
+> 16 0 23 1362 topology 1454 4901
+> 15 0 24 1362 topology 1454 4902
+> 16 0 24 1362 topology 1601 4902
+> 15 0 23 1362 topology 1429 4903
+> 16 0 23 1362 topology 1430 4903
+> 15 0 24 1362 topology 1430 4904
+> 16 0 24 1362 topology 1601 4904
+> 15 0 23 1362 topology 1405 4905
+> 16 0 23 1362 topology 1406 4905
+> 15 0 24 1362 topology 1406 4906
+> 16 0 24 1362 topology 1601 4906
+> 15 0 23 1362 topology 1573 4907
+> 16 0 23 1362 topology 1574 4907
+> 15 0 24 1362 topology 1574 4908
+> 16 0 24 1362 topology 1601 4908
+> 15 0 23 1362 topology 1549 4909
+> 16 0 23 1362 topology 1550 4909
+> 15 0 24 1362 topology 1550 4910
+> 16 0 24 1362 topology 1601 4910
+> 15 0 23 1362 topology 1525 4911
+> 16 0 23 1362 topology 1526 4911
+> 15 0 24 1362 topology 1526 4912
+> 16 0 24 1362 topology 1601 4912
+> 15 0 23 1362 topology 1501 4913
+> 16 0 23 1362 topology 1502 4913
+> 15 0 24 1362 topology 1502 4914
+> 16 0 24 1362 topology 1601 4914
+> 15 0 23 1362 topology 1477 4915
+> 16 0 23 1362 topology 1478 4915
+> 15 0 24 1362 topology 1478 4916
+> 16 0 24 1362 topology 1601 4916
+> 15 0 23 1362 topology 1597 4917
+> 16 0 23 1362 topology 1598 4917
+> 15 0 24 1362 topology 1598 4918
+> 16 0 24 1362 topology 1601 4918
+> 15 0 23 1362 topology 1384 4919
+> 16 0 23 1362 topology 1385 4919
+> 15 0 24 1362 topology 1385 4920
+> 16 0 24 1362 topology 1601 4920
+> 15 0 23 1362 topology 1480 4921
+> 16 0 23 1362 topology 1481 4921
+> 15 0 24 1362 topology 1481 4922
+> 16 0 24 1362 topology 1601 4922
+> 15 0 23 1362 topology 1456 4923
+> 16 0 23 1362 topology 1457 4923
+> 15 0 24 1362 topology 1457 4924
+> 16 0 24 1362 topology 1601 4924
+> 15 0 23 1362 topology 1432 4925
+> 16 0 23 1362 topology 1433 4925
+> 15 0 24 1362 topology 1433 4926
+> 16 0 24 1362 topology 1601 4926
+> 15 0 23 1362 topology 1408 4927
+> 16 0 23 1362 topology 1409 4927
+> 15 0 24 1362 topology 1409 4928
+> 16 0 24 1362 topology 1601 4928
+> 15 0 23 1362 topology 1576 4929
+> 16 0 23 1362 topology 1577 4929
+> 15 0 24 1362 topology 1577 4930
+> 16 0 24 1362 topology 1601 4930
+> 15 0 23 1362 topology 1552 4931
+> 16 0 23 1362 topology 1553 4931
+> 15 0 24 1362 topology 1553 4932
+> 16 0 24 1362 topology 1601 4932
+> 15 0 23 1362 topology 1528 4933
+> 16 0 23 1362 topology 1529 4933
+> 15 0 24 1362 topology 1529 4934
+> 16 0 24 1362 topology 1601 4934
+> 15 0 23 1362 topology 1504 4935
+> 16 0 23 1362 topology 1505 4935
+> 15 0 24 1362 topology 1505 4936
+> 16 0 24 1362 topology 1601 4936
+> 15 0 23 1362 topology 1363 4937
+> 16 0 23 1362 topology 1364 4937
+> 15 0 24 1362 topology 1364 4938
+> 16 0 24 1362 topology 1601 4938
+> 15 0 23 1362 topology 1387 4939
+> 16 0 23 1362 topology 1388 4939
+> 15 0 24 1362 topology 1388 4940
+> 16 0 24 1362 topology 1601 4940
+> 15 0 23 1362 topology 1483 4941
+> 16 0 23 1362 topology 1484 4941
+> 15 0 24 1362 topology 1484 4942
+> 16 0 24 1362 topology 1601 4942
+> 15 0 23 1362 topology 1459 4943
+> 16 0 23 1362 topology 1460 4943
+> 15 0 24 1362 topology 1460 4944
+> 16 0 24 1362 topology 1601 4944
+> 15 0 23 1362 topology 1435 4945
+> 16 0 23 1362 topology 1436 4945
+> 15 0 24 1362 topology 1436 4946
+> 16 0 24 1362 topology 1601 4946
+> 15 0 23 1362 topology 1411 4947
+> 16 0 23 1362 topology 1412 4947
+> 15 0 24 1362 topology 1412 4948
+> 16 0 24 1362 topology 1601 4948
+> 15 0 23 1362 topology 1579 4949
+> 16 0 23 1362 topology 1580 4949
+> 15 0 24 1362 topology 1580 4950
+> 16 0 24 1362 topology 1601 4950
+> 15 0 23 1362 topology 1555 4951
+> 16 0 23 1362 topology 1556 4951
+> 15 0 24 1362 topology 1556 4952
+> 16 0 24 1362 topology 1601 4952
+> 15 0 23 1362 topology 1531 4953
+> 16 0 23 1362 topology 1532 4953
+> 15 0 24 1362 topology 1532 4954
+> 16 0 24 1362 topology 1601 4954
+> 15 0 23 1362 topology 1507 4955
+> 16 0 23 1362 topology 1508 4955
+> 15 0 24 1362 topology 1508 4956
+> 16 0 24 1362 topology 1601 4956
+> 15 0 23 1362 topology 1366 4957
+> 16 0 23 1362 topology 1367 4957
+> 15 0 24 1362 topology 1367 4958
+> 16 0 24 1362 topology 1601 4958
+> 15 0 23 1362 topology 1390 4959
+> 16 0 23 1362 topology 1391 4959
+> 15 0 24 1362 topology 1391 4960
+> 16 0 24 1362 topology 1601 4960
+> 15 0 23 1362 topology 1510 4961
+> 16 0 23 1362 topology 1511 4961
+> 15 0 24 1362 topology 1511 4962
+> 16 0 24 1362 topology 1601 4962
+> 15 0 23 1362 topology 1486 4963
+> 16 0 23 1362 topology 1487 4963
+> 15 0 24 1362 topology 1487 4964
+> 16 0 24 1362 topology 1601 4964
+> 15 0 23 1362 topology 1462 4965
+> 16 0 23 1362 topology 1463 4965
+> 15 0 24 1362 topology 1463 4966
+> 16 0 24 1362 topology 1601 4966
+> 15 0 23 1362 topology 1438 4967
+> 16 0 23 1362 topology 1439 4967
+> 15 0 24 1362 topology 1439 4968
+> 16 0 24 1362 topology 1601 4968
+> 15 0 23 1362 topology 1414 4969
+> 16 0 23 1362 topology 1415 4969
+> 15 0 24 1362 topology 1415 4970
+> 16 0 24 1362 topology 1601 4970
+> 15 0 23 1362 topology 1582 4971
+> 16 0 23 1362 topology 1583 4971
+> 15 0 24 1362 topology 1583 4972
+> 16 0 24 1362 topology 1601 4972
+> 15 0 23 1362 topology 1558 4973
+> 16 0 23 1362 topology 1559 4973
+> 15 0 24 1362 topology 1559 4974
+> 16 0 24 1362 topology 1601 4974
+> 15 0 23 1362 topology 1534 4975
+> 16 0 23 1362 topology 1535 4975
+> 15 0 24 1362 topology 1535 4976
+> 16 0 24 1362 topology 1601 4976
+> 15 0 23 1362 topology 1369 4977
+> 16 0 23 1362 topology 1370 4977
+> 15 0 24 1362 topology 1370 4978
+> 16 0 24 1362 topology 1601 4978
+> 15 0 23 1362 topology 1393 4979
+> 16 0 23 1362 topology 1394 4979
+> 15 0 24 1362 topology 1394 4980
+> 16 0 24 1362 topology 1601 4980
+> 15 0 23 1362 topology 1513 4981
+> 16 0 23 1362 topology 1514 4981
+> 15 0 24 1362 topology 1514 4982
+> 16 0 24 1362 topology 1601 4982
+> 15 0 23 1362 topology 1489 4983
+> 16 0 23 1362 topology 1490 4983
+> 15 0 24 1362 topology 1490 4984
+> 16 0 24 1362 topology 1601 4984
+> 15 0 23 1362 topology 1465 4985
+> 16 0 23 1362 topology 1466 4985
+> 15 0 24 1362 topology 1466 4986
+> 16 0 24 1362 topology 1601 4986
+> 15 0 23 1362 topology 1441 4987
+> 16 0 23 1362 topology 1442 4987
+> 15 0 24 1362 topology 1442 4988
+> 16 0 24 1362 topology 1601 4988
+> 15 0 23 1362 topology 1417 4989
+> 16 0 23 1362 topology 1418 4989
+> 15 0 24 1362 topology 1418 4990
+> 16 0 24 1362 topology 1601 4990
+> 15 0 23 1362 topology 1585 4991
+> 16 0 23 1362 topology 1586 4991
+> 15 0 24 1362 topology 1586 4992
+> 16 0 24 1362 topology 1601 4992
+> 15 0 23 1362 topology 1561 4993
+> 16 0 23 1362 topology 1562 4993
+> 15 0 24 1362 topology 1562 4994
+> 16 0 24 1362 topology 1601 4994
+> 15 0 23 1362 topology 1537 4995
+> 16 0 23 1362 topology 1538 4995
+> 15 0 24 1362 topology 1538 4996
+> 16 0 24 1362 topology 1601 4996
+> 15 0 23 1362 topology 1372 4997
+> 16 0 23 1362 topology 1373 4997
+> 15 0 24 1362 topology 1373 4998
+> 16 0 24 1362 topology 1601 4998
+> 15 0 23 1362 topology 1420 4999
+> 16 0 23 1362 topology 1421 4999
+> 15 0 24 1362 topology 1421 5000
+> 16 0 24 1362 topology 1601 5000
+> 15 0 23 1362 topology 1396 5001
+> 16 0 23 1362 topology 1397 5001
+> 15 0 24 1362 topology 1397 5002
+> 16 0 24 1362 topology 1601 5002
+> 15 0 23 1362 topology 1540 5003
+> 16 0 23 1362 topology 1541 5003
+> 15 0 24 1362 topology 1541 5004
+> 16 0 24 1362 topology 1601 5004
+> 15 0 23 1362 topology 1516 5005
+> 16 0 23 1362 topology 1517 5005
+> 15 0 24 1362 topology 1517 5006
+> 16 0 24 1362 topology 1601 5006
+> 15 0 23 1362 topology 1492 5007
+> 16 0 23 1362 topology 1493 5007
+> 15 0 24 1362 topology 1493 5008
+> 16 0 24 1362 topology 1601 5008
+> 15 0 23 1362 topology 1468 5009
+> 16 0 23 1362 topology 1469 5009
+> 15 0 24 1362 topology 1469 5010
+> 16 0 24 1362 topology 1601 5010
+> 15 0 23 1362 topology 1444 5011
+> 16 0 23 1362 topology 1445 5011
+> 15 0 24 1362 topology 1445 5012
+> 16 0 24 1362 topology 1601 5012
+> 15 0 23 1362 topology 1588 5013
+> 16 0 23 1362 topology 1589 5013
+> 15 0 24 1362 topology 1589 5014
+> 16 0 24 1362 topology 1601 5014
+> 15 0 23 1362 topology 1564 5015
+> 16 0 23 1362 topology 1565 5015
+> 15 0 24 1362 topology 1565 5016
+> 16 0 24 1362 topology 1601 5016
+> 15 0 23 1190 topology 1221 5017
+> 16 0 23 1190 topology 1222 5017
+> 15 0 24 1190 topology 1222 5018
+> 16 0 24 1190 topology 1360 5018
+> 15 0 24 1190 topology 1360 5019
+> 16 0 24 1190 topology 1283 5019
+> 15 0 25 1190 topology 1283 5020
+> 16 0 25 1190 topology 1281 5020
+> 15 0 24 1190 topology 1360 5021
+> 16 0 24 1190 topology 1259 5021
+> 15 0 25 1190 topology 1259 5022
+> 16 0 25 1190 topology 1257 5022
+> 15 0 24 1190 topology 1360 5023
+> 16 0 24 1190 topology 1235 5023
+> 15 0 25 1190 topology 1235 5024
+> 16 0 25 1190 topology 1233 5024
+> 15 0 24 1190 topology 1360 5025
+> 16 0 24 1190 topology 1343 5025
+> 15 0 25 1190 topology 1343 5026
+> 16 0 25 1190 topology 1341 5026
+> 15 0 24 1190 topology 1360 5027
+> 16 0 24 1190 topology 1319 5027
+> 15 0 25 1190 topology 1319 5028
+> 16 0 25 1190 topology 1317 5028
+> 15 0 24 1190 topology 1360 5029
+> 16 0 24 1190 topology 1295 5029
+> 15 0 25 1190 topology 1295 5030
+> 16 0 25 1190 topology 1293 5030
+> 15 0 24 1190 topology 1360 5031
+> 16 0 24 1190 topology 1271 5031
+> 15 0 25 1190 topology 1271 5032
+> 16 0 25 1190 topology 1269 5032
+> 15 0 24 1190 topology 1360 5033
+> 16 0 24 1190 topology 1247 5033
+> 15 0 25 1190 topology 1247 5034
+> 16 0 25 1190 topology 1245 5034
+> 15 0 24 1190 topology 1360 5035
+> 16 0 24 1190 topology 1355 5035
+> 15 0 25 1190 topology 1355 5036
+> 16 0 25 1190 topology 1353 5036
+> 15 0 24 1190 topology 1360 5037
+> 16 0 24 1190 topology 1331 5037
+> 15 0 25 1190 topology 1331 5038
+> 16 0 25 1190 topology 1329 5038
+> 15 0 24 1190 topology 1360 5039
+> 16 0 24 1190 topology 1307 5039
+> 15 0 25 1190 topology 1307 5040
+> 16 0 25 1190 topology 1305 5040
+> 15 0 24 1190 topology 1360 5041
+> 16 0 24 1190 topology 1193 5041
+> 15 0 25 1190 topology 1193 5042
+> 16 0 25 1190 topology 1191 5042
+> 15 0 24 1190 topology 1360 5043
+> 16 0 24 1190 topology 1205 5043
+> 15 0 25 1190 topology 1205 5044
+> 16 0 25 1190 topology 1203 5044
+> 15 0 24 1190 topology 1360 5045
+> 16 0 24 1190 topology 1217 5045
+> 15 0 25 1190 topology 1217 5046
+> 16 0 25 1190 topology 1215 5046
+> 15 0 26 1190 topology 1360 5047
+> 16 0 26 1190 topology 1359 5047
+> 15 0 24 1190 topology 1360 5048
+> 16 0 24 1190 topology 1250 5048
+> 15 0 25 1190 topology 1250 5049
+> 16 0 25 1190 topology 1248 5049
+> 15 0 24 1190 topology 1360 5050
+> 16 0 24 1190 topology 1226 5050
+> 15 0 25 1190 topology 1226 5051
+> 16 0 25 1190 topology 1224 5051
+> 15 0 24 1190 topology 1360 5052
+> 16 0 24 1190 topology 1310 5052
+> 15 0 25 1190 topology 1310 5053
+> 16 0 25 1190 topology 1308 5053
+> 15 0 24 1190 topology 1360 5054
+> 16 0 24 1190 topology 1286 5054
+> 15 0 25 1190 topology 1286 5055
+> 16 0 25 1190 topology 1284 5055
+> 15 0 24 1190 topology 1360 5056
+> 16 0 24 1190 topology 1262 5056
+> 15 0 25 1190 topology 1262 5057
+> 16 0 25 1190 topology 1260 5057
+> 15 0 24 1190 topology 1360 5058
+> 16 0 24 1190 topology 1238 5058
+> 15 0 25 1190 topology 1238 5059
+> 16 0 25 1190 topology 1236 5059
+> 15 0 24 1190 topology 1360 5060
+> 16 0 24 1190 topology 1346 5060
+> 15 0 25 1190 topology 1346 5061
+> 16 0 25 1190 topology 1344 5061
+> 15 0 24 1190 topology 1360 5062
+> 16 0 24 1190 topology 1322 5062
+> 15 0 25 1190 topology 1322 5063
+> 16 0 25 1190 topology 1320 5063
+> 15 0 24 1190 topology 1360 5064
+> 16 0 24 1190 topology 1298 5064
+> 15 0 25 1190 topology 1298 5065
+> 16 0 25 1190 topology 1296 5065
+> 15 0 24 1190 topology 1360 5066
+> 16 0 24 1190 topology 1274 5066
+> 15 0 25 1190 topology 1274 5067
+> 16 0 25 1190 topology 1272 5067
+> 15 0 24 1190 topology 1360 5068
+> 16 0 24 1190 topology 1358 5068
+> 15 0 25 1190 topology 1358 5069
+> 16 0 25 1190 topology 1356 5069
+> 15 0 24 1190 topology 1360 5070
+> 16 0 24 1190 topology 1334 5070
+> 15 0 25 1190 topology 1334 5071
+> 16 0 25 1190 topology 1332 5071
+> 15 0 24 1190 topology 1360 5072
+> 16 0 24 1190 topology 1196 5072
+> 15 0 25 1190 topology 1196 5073
+> 16 0 25 1190 topology 1194 5073
+> 15 0 24 1190 topology 1360 5074
+> 16 0 24 1190 topology 1208 5074
+> 15 0 25 1190 topology 1208 5075
+> 16 0 25 1190 topology 1206 5075
+> 15 0 24 1190 topology 1360 5076
+> 16 0 24 1190 topology 1253 5076
+> 15 0 25 1190 topology 1253 5077
+> 16 0 25 1190 topology 1251 5077
+> 15 0 24 1190 topology 1360 5078
+> 16 0 24 1190 topology 1229 5078
+> 15 0 25 1190 topology 1229 5079
+> 16 0 25 1190 topology 1227 5079
+> 15 0 24 1190 topology 1360 5080
+> 16 0 24 1190 topology 1313 5080
+> 15 0 25 1190 topology 1313 5081
+> 16 0 25 1190 topology 1311 5081
+> 15 0 24 1190 topology 1360 5082
+> 16 0 24 1190 topology 1289 5082
+> 15 0 25 1190 topology 1289 5083
+> 16 0 25 1190 topology 1287 5083
+> 15 0 24 1190 topology 1360 5084
+> 16 0 24 1190 topology 1265 5084
+> 15 0 25 1190 topology 1265 5085
+> 16 0 25 1190 topology 1263 5085
+> 15 0 24 1190 topology 1360 5086
+> 16 0 24 1190 topology 1241 5086
+> 15 0 25 1190 topology 1241 5087
+> 16 0 25 1190 topology 1239 5087
+> 15 0 24 1190 topology 1360 5088
+> 16 0 24 1190 topology 1349 5088
+> 15 0 25 1190 topology 1349 5089
+> 16 0 25 1190 topology 1347 5089
+> 15 0 24 1190 topology 1360 5090
+> 16 0 24 1190 topology 1325 5090
+> 15 0 25 1190 topology 1325 5091
+> 16 0 25 1190 topology 1323 5091
+> 15 0 24 1190 topology 1360 5092
+> 16 0 24 1190 topology 1301 5092
+> 15 0 25 1190 topology 1301 5093
+> 16 0 25 1190 topology 1299 5093
+> 15 0 24 1190 topology 1360 5094
+> 16 0 24 1190 topology 1277 5094
+> 15 0 25 1190 topology 1277 5095
+> 16 0 25 1190 topology 1275 5095
+> 15 0 24 1190 topology 1360 5096
+> 16 0 24 1190 topology 1337 5096
+> 15 0 25 1190 topology 1337 5097
+> 16 0 25 1190 topology 1335 5097
+> 15 0 24 1190 topology 1360 5098
+> 16 0 24 1190 topology 1199 5098
+> 15 0 25 1190 topology 1199 5099
+> 16 0 25 1190 topology 1197 5099
+> 15 0 24 1190 topology 1360 5100
+> 16 0 24 1190 topology 1211 5100
+> 15 0 25 1190 topology 1211 5101
+> 16 0 25 1190 topology 1209 5101
+> 15 0 24 1190 topology 1360 5102
+> 16 0 24 1190 topology 1220 5102
+> 15 0 25 1190 topology 1220 5103
+> 16 0 25 1190 topology 1218 5103
+> 15 0 24 1190 topology 1360 5104
+> 16 0 24 1190 topology 1280 5104
+> 15 0 25 1190 topology 1280 5105
+> 16 0 25 1190 topology 1278 5105
+> 15 0 24 1190 topology 1360 5106
+> 16 0 24 1190 topology 1256 5106
+> 15 0 25 1190 topology 1256 5107
+> 16 0 25 1190 topology 1254 5107
+> 15 0 24 1190 topology 1360 5108
+> 16 0 24 1190 topology 1232 5108
+> 15 0 25 1190 topology 1232 5109
+> 16 0 25 1190 topology 1230 5109
+> 15 0 24 1190 topology 1360 5110
+> 16 0 24 1190 topology 1340 5110
+> 15 0 25 1190 topology 1340 5111
+> 16 0 25 1190 topology 1338 5111
+> 15 0 24 1190 topology 1360 5112
+> 16 0 24 1190 topology 1316 5112
+> 15 0 25 1190 topology 1316 5113
+> 16 0 25 1190 topology 1314 5113
+> 15 0 24 1190 topology 1360 5114
+> 16 0 24 1190 topology 1292 5114
+> 15 0 25 1190 topology 1292 5115
+> 16 0 25 1190 topology 1290 5115
+> 15 0 24 1190 topology 1360 5116
+> 16 0 24 1190 topology 1268 5116
+> 15 0 25 1190 topology 1268 5117
+> 16 0 25 1190 topology 1266 5117
+> 15 0 24 1190 topology 1360 5118
+> 16 0 24 1190 topology 1244 5118
+> 15 0 25 1190 topology 1244 5119
+> 16 0 25 1190 topology 1242 5119
+> 15 0 24 1190 topology 1360 5120
+> 16 0 24 1190 topology 1352 5120
+> 15 0 25 1190 topology 1352 5121
+> 16 0 25 1190 topology 1350 5121
+> 15 0 24 1190 topology 1360 5122
+> 16 0 24 1190 topology 1328 5122
+> 15 0 25 1190 topology 1328 5123
+> 16 0 25 1190 topology 1326 5123
+> 15 0 24 1190 topology 1360 5124
+> 16 0 24 1190 topology 1304 5124
+> 15 0 25 1190 topology 1304 5125
+> 16 0 25 1190 topology 1302 5125
+> 15 0 24 1190 topology 1360 5126
+> 16 0 24 1190 topology 1202 5126
+> 15 0 25 1190 topology 1202 5127
+> 16 0 25 1190 topology 1200 5127
+> 15 0 24 1190 topology 1360 5128
+> 16 0 24 1190 topology 1214 5128
+> 15 0 25 1190 topology 1214 5129
+> 16 0 25 1190 topology 1212 5129
+> 15 0 23 1190 topology 1281 5130
+> 16 0 23 1190 topology 1282 5130
+> 15 0 24 1190 topology 1282 5131
+> 16 0 24 1190 topology 1360 5131
+> 15 0 24 1190 topology 1360 5132
+> 16 0 24 1190 topology 1223 5132
+> 15 0 25 1190 topology 1223 5133
+> 16 0 25 1190 topology 1221 5133
+> 15 0 23 1190 topology 1257 5134
+> 16 0 23 1190 topology 1258 5134
+> 15 0 24 1190 topology 1258 5135
+> 16 0 24 1190 topology 1360 5135
+> 15 0 23 1190 topology 1233 5136
+> 16 0 23 1190 topology 1234 5136
+> 15 0 24 1190 topology 1234 5137
+> 16 0 24 1190 topology 1360 5137
+> 15 0 23 1190 topology 1341 5138
+> 16 0 23 1190 topology 1342 5138
+> 15 0 24 1190 topology 1342 5139
+> 16 0 24 1190 topology 1360 5139
+> 15 0 23 1190 topology 1317 5140
+> 16 0 23 1190 topology 1318 5140
+> 15 0 24 1190 topology 1318 5141
+> 16 0 24 1190 topology 1360 5141
+> 15 0 23 1190 topology 1293 5142
+> 16 0 23 1190 topology 1294 5142
+> 15 0 24 1190 topology 1294 5143
+> 16 0 24 1190 topology 1360 5143
+> 15 0 23 1190 topology 1269 5144
+> 16 0 23 1190 topology 1270 5144
+> 15 0 24 1190 topology 1270 5145
+> 16 0 24 1190 topology 1360 5145
+> 15 0 23 1190 topology 1245 5146
+> 16 0 23 1190 topology 1246 5146
+> 15 0 24 1190 topology 1246 5147
+> 16 0 24 1190 topology 1360 5147
+> 15 0 23 1190 topology 1353 5148
+> 16 0 23 1190 topology 1354 5148
+> 15 0 24 1190 topology 1354 5149
+> 16 0 24 1190 topology 1360 5149
+> 15 0 23 1190 topology 1329 5150
+> 16 0 23 1190 topology 1330 5150
+> 15 0 24 1190 topology 1330 5151
+> 16 0 24 1190 topology 1360 5151
+> 15 0 23 1190 topology 1305 5152
+> 16 0 23 1190 topology 1306 5152
+> 15 0 24 1190 topology 1306 5153
+> 16 0 24 1190 topology 1360 5153
+> 15 0 23 1190 topology 1191 5154
+> 16 0 23 1190 topology 1192 5154
+> 15 0 24 1190 topology 1192 5155
+> 16 0 24 1190 topology 1360 5155
+> 15 0 23 1190 topology 1203 5156
+> 16 0 23 1190 topology 1204 5156
+> 15 0 24 1190 topology 1204 5157
+> 16 0 24 1190 topology 1360 5157
+> 15 0 23 1190 topology 1215 5158
+> 16 0 23 1190 topology 1216 5158
+> 15 0 24 1190 topology 1216 5159
+> 16 0 24 1190 topology 1360 5159
+> 15 0 23 1190 topology 1248 5160
+> 16 0 23 1190 topology 1249 5160
+> 15 0 24 1190 topology 1249 5161
+> 16 0 24 1190 topology 1360 5161
+> 15 0 23 1190 topology 1224 5162
+> 16 0 23 1190 topology 1225 5162
+> 15 0 24 1190 topology 1225 5163
+> 16 0 24 1190 topology 1360 5163
+> 15 0 23 1190 topology 1308 5164
+> 16 0 23 1190 topology 1309 5164
+> 15 0 24 1190 topology 1309 5165
+> 16 0 24 1190 topology 1360 5165
+> 15 0 23 1190 topology 1284 5166
+> 16 0 23 1190 topology 1285 5166
+> 15 0 24 1190 topology 1285 5167
+> 16 0 24 1190 topology 1360 5167
+> 15 0 23 1190 topology 1260 5168
+> 16 0 23 1190 topology 1261 5168
+> 15 0 24 1190 topology 1261 5169
+> 16 0 24 1190 topology 1360 5169
+> 15 0 23 1190 topology 1236 5170
+> 16 0 23 1190 topology 1237 5170
+> 15 0 24 1190 topology 1237 5171
+> 16 0 24 1190 topology 1360 5171
+> 15 0 23 1190 topology 1344 5172
+> 16 0 23 1190 topology 1345 5172
+> 15 0 24 1190 topology 1345 5173
+> 16 0 24 1190 topology 1360 5173
+> 15 0 23 1190 topology 1320 5174
+> 16 0 23 1190 topology 1321 5174
+> 15 0 24 1190 topology 1321 5175
+> 16 0 24 1190 topology 1360 5175
+> 15 0 23 1190 topology 1296 5176
+> 16 0 23 1190 topology 1297 5176
+> 15 0 24 1190 topology 1297 5177
+> 16 0 24 1190 topology 1360 5177
+> 15 0 23 1190 topology 1272 5178
+> 16 0 23 1190 topology 1273 5178
+> 15 0 24 1190 topology 1273 5179
+> 16 0 24 1190 topology 1360 5179
+> 15 0 23 1190 topology 1356 5180
+> 16 0 23 1190 topology 1357 5180
+> 15 0 24 1190 topology 1357 5181
+> 16 0 24 1190 topology 1360 5181
+> 15 0 23 1190 topology 1332 5182
+> 16 0 23 1190 topology 1333 5182
+> 15 0 24 1190 topology 1333 5183
+> 16 0 24 1190 topology 1360 5183
+> 15 0 23 1190 topology 1194 5184
+> 16 0 23 1190 topology 1195 5184
+> 15 0 24 1190 topology 1195 5185
+> 16 0 24 1190 topology 1360 5185
+> 15 0 23 1190 topology 1206 5186
+> 16 0 23 1190 topology 1207 5186
+> 15 0 24 1190 topology 1207 5187
+> 16 0 24 1190 topology 1360 5187
+> 15 0 23 1190 topology 1251 5188
+> 16 0 23 1190 topology 1252 5188
+> 15 0 24 1190 topology 1252 5189
+> 16 0 24 1190 topology 1360 5189
+> 15 0 23 1190 topology 1227 5190
+> 16 0 23 1190 topology 1228 5190
+> 15 0 24 1190 topology 1228 5191
+> 16 0 24 1190 topology 1360 5191
+> 15 0 23 1190 topology 1311 5192
+> 16 0 23 1190 topology 1312 5192
+> 15 0 24 1190 topology 1312 5193
+> 16 0 24 1190 topology 1360 5193
+> 15 0 23 1190 topology 1287 5194
+> 16 0 23 1190 topology 1288 5194
+> 15 0 24 1190 topology 1288 5195
+> 16 0 24 1190 topology 1360 5195
+> 15 0 23 1190 topology 1263 5196
+> 16 0 23 1190 topology 1264 5196
+> 15 0 24 1190 topology 1264 5197
+> 16 0 24 1190 topology 1360 5197
+> 15 0 23 1190 topology 1239 5198
+> 16 0 23 1190 topology 1240 5198
+> 15 0 24 1190 topology 1240 5199
+> 16 0 24 1190 topology 1360 5199
+> 15 0 23 1190 topology 1347 5200
+> 16 0 23 1190 topology 1348 5200
+> 15 0 24 1190 topology 1348 5201
+> 16 0 24 1190 topology 1360 5201
+> 15 0 23 1190 topology 1323 5202
+> 16 0 23 1190 topology 1324 5202
+> 15 0 24 1190 topology 1324 5203
+> 16 0 24 1190 topology 1360 5203
+> 15 0 23 1190 topology 1299 5204
+> 16 0 23 1190 topology 1300 5204
+> 15 0 24 1190 topology 1300 5205
+> 16 0 24 1190 topology 1360 5205
+> 15 0 23 1190 topology 1275 5206
+> 16 0 23 1190 topology 1276 5206
+> 15 0 24 1190 topology 1276 5207
+> 16 0 24 1190 topology 1360 5207
+> 15 0 23 1190 topology 1335 5208
+> 16 0 23 1190 topology 1336 5208
+> 15 0 24 1190 topology 1336 5209
+> 16 0 24 1190 topology 1360 5209
+> 15 0 23 1190 topology 1197 5210
+> 16 0 23 1190 topology 1198 5210
+> 15 0 24 1190 topology 1198 5211
+> 16 0 24 1190 topology 1360 5211
+> 15 0 23 1190 topology 1209 5212
+> 16 0 23 1190 topology 1210 5212
+> 15 0 24 1190 topology 1210 5213
+> 16 0 24 1190 topology 1360 5213
+> 15 0 23 1190 topology 1218 5214
+> 16 0 23 1190 topology 1219 5214
+> 15 0 24 1190 topology 1219 5215
+> 16 0 24 1190 topology 1360 5215
+> 15 0 23 1190 topology 1278 5216
+> 16 0 23 1190 topology 1279 5216
+> 15 0 24 1190 topology 1279 5217
+> 16 0 24 1190 topology 1360 5217
+> 15 0 23 1190 topology 1254 5218
+> 16 0 23 1190 topology 1255 5218
+> 15 0 24 1190 topology 1255 5219
+> 16 0 24 1190 topology 1360 5219
+> 15 0 23 1190 topology 1230 5220
+> 16 0 23 1190 topology 1231 5220
+> 15 0 24 1190 topology 1231 5221
+> 16 0 24 1190 topology 1360 5221
+> 15 0 23 1190 topology 1338 5222
+> 16 0 23 1190 topology 1339 5222
+> 15 0 24 1190 topology 1339 5223
+> 16 0 24 1190 topology 1360 5223
+> 15 0 23 1190 topology 1314 5224
+> 16 0 23 1190 topology 1315 5224
+> 15 0 24 1190 topology 1315 5225
+> 16 0 24 1190 topology 1360 5225
+> 15 0 23 1190 topology 1290 5226
+> 16 0 23 1190 topology 1291 5226
+> 15 0 24 1190 topology 1291 5227
+> 16 0 24 1190 topology 1360 5227
+> 15 0 23 1190 topology 1266 5228
+> 16 0 23 1190 topology 1267 5228
+> 15 0 24 1190 topology 1267 5229
+> 16 0 24 1190 topology 1360 5229
+> 15 0 23 1190 topology 1242 5230
+> 16 0 23 1190 topology 1243 5230
+> 15 0 24 1190 topology 1243 5231
+> 16 0 24 1190 topology 1360 5231
+> 15 0 23 1190 topology 1350 5232
+> 16 0 23 1190 topology 1351 5232
+> 15 0 24 1190 topology 1351 5233
+> 16 0 24 1190 topology 1360 5233
+> 15 0 23 1190 topology 1326 5234
+> 16 0 23 1190 topology 1327 5234
+> 15 0 24 1190 topology 1327 5235
+> 16 0 24 1190 topology 1360 5235
+> 15 0 23 1190 topology 1302 5236
+> 16 0 23 1190 topology 1303 5236
+> 15 0 24 1190 topology 1303 5237
+> 16 0 24 1190 topology 1360 5237
+> 15 0 23 1190 topology 1200 5238
+> 16 0 23 1190 topology 1201 5238
+> 15 0 24 1190 topology 1201 5239
+> 16 0 24 1190 topology 1360 5239
+> 15 0 23 1190 topology 1212 5240
+> 16 0 23 1190 topology 1213 5240
+> 15 0 24 1190 topology 1213 5241
+> 16 0 24 1190 topology 1360 5241
+> 15 0 27 1189 topology 1600 5242
+> 16 0 27 1189 topology 1602 5242
+> 15 0 28 1189 topology 1602 5243
+> 16 0 28 1189 topology 1604 5243
+> 15 0 21 1189 topology 1602 5244
+> 16 0 21 1189 topology 1361 5244
+> 15 0 28 1189 topology 1361 5245
+> 16 0 28 1189 topology 1359 5245
+> 15 0 27 1189 topology 1604 5246
+> 16 0 27 1189 topology 1361 5246
+> 15 0 23 1016 topology 1059 5247
+> 16 0 23 1016 topology 1060 5247
+> 15 0 24 1016 topology 1060 5248
+> 16 0 24 1016 topology 1156 5248
+> 15 0 24 1016 topology 1156 5249
+> 16 0 24 1016 topology 1124 5249
+> 15 0 25 1016 topology 1124 5250
+> 16 0 25 1016 topology 1122 5250
+> 15 0 24 1016 topology 1156 5251
+> 16 0 24 1016 topology 1073 5251
+> 15 0 25 1016 topology 1073 5252
+> 16 0 25 1016 topology 1071 5252
+> 15 0 24 1016 topology 1156 5253
+> 16 0 24 1016 topology 1019 5253
+> 15 0 25 1016 topology 1019 5254
+> 16 0 25 1016 topology 1017 5254
+> 15 0 24 1016 topology 1156 5255
+> 16 0 24 1016 topology 1031 5255
+> 15 0 25 1016 topology 1031 5256
+> 16 0 25 1016 topology 1029 5256
+> 15 0 24 1016 topology 1156 5257
+> 16 0 24 1016 topology 1043 5257
+> 15 0 25 1016 topology 1043 5258
+> 16 0 25 1016 topology 1041 5258
+> 15 0 26 1016 topology 1156 5259
+> 16 0 26 1016 topology 1155 5259
+> 15 0 24 1016 topology 1156 5260
+> 16 0 24 1016 topology 1076 5260
+> 15 0 25 1016 topology 1076 5261
+> 16 0 25 1016 topology 1074 5261
+> 15 0 24 1016 topology 1156 5262
+> 16 0 24 1016 topology 1139 5262
+> 15 0 25 1016 topology 1139 5263
+> 16 0 25 1016 topology 1137 5263
+> 15 0 24 1016 topology 1156 5264
+> 16 0 24 1016 topology 1088 5264
+> 15 0 25 1016 topology 1088 5265
+> 16 0 25 1016 topology 1086 5265
+> 15 0 24 1016 topology 1156 5266
+> 16 0 24 1016 topology 1151 5266
+> 15 0 25 1016 topology 1151 5267
+> 16 0 25 1016 topology 1149 5267
+> 15 0 24 1016 topology 1156 5268
+> 16 0 24 1016 topology 1100 5268
+> 15 0 25 1016 topology 1100 5269
+> 16 0 25 1016 topology 1098 5269
+> 15 0 24 1016 topology 1156 5270
+> 16 0 24 1016 topology 1052 5270
+> 15 0 25 1016 topology 1052 5271
+> 16 0 25 1016 topology 1050 5271
+> 15 0 24 1016 topology 1156 5272
+> 16 0 24 1016 topology 1115 5272
+> 15 0 25 1016 topology 1115 5273
+> 16 0 25 1016 topology 1113 5273
+> 15 0 24 1016 topology 1156 5274
+> 16 0 24 1016 topology 1064 5274
+> 15 0 25 1016 topology 1064 5275
+> 16 0 25 1016 topology 1062 5275
+> 15 0 24 1016 topology 1156 5276
+> 16 0 24 1016 topology 1127 5276
+> 15 0 25 1016 topology 1127 5277
+> 16 0 25 1016 topology 1125 5277
+> 15 0 24 1016 topology 1156 5278
+> 16 0 24 1016 topology 1022 5278
+> 15 0 25 1016 topology 1022 5279
+> 16 0 25 1016 topology 1020 5279
+> 15 0 24 1016 topology 1156 5280
+> 16 0 24 1016 topology 1034 5280
+> 15 0 25 1016 topology 1034 5281
+> 16 0 25 1016 topology 1032 5281
+> 15 0 24 1016 topology 1156 5282
+> 16 0 24 1016 topology 1079 5282
+> 15 0 25 1016 topology 1079 5283
+> 16 0 25 1016 topology 1077 5283
+> 15 0 24 1016 topology 1156 5284
+> 16 0 24 1016 topology 1142 5284
+> 15 0 25 1016 topology 1142 5285
+> 16 0 25 1016 topology 1140 5285
+> 15 0 24 1016 topology 1156 5286
+> 16 0 24 1016 topology 1091 5286
+> 15 0 25 1016 topology 1091 5287
+> 16 0 25 1016 topology 1089 5287
+> 15 0 24 1016 topology 1156 5288
+> 16 0 24 1016 topology 1154 5288
+> 15 0 25 1016 topology 1154 5289
+> 16 0 25 1016 topology 1152 5289
+> 15 0 24 1016 topology 1156 5290
+> 16 0 24 1016 topology 1103 5290
+> 15 0 25 1016 topology 1103 5291
+> 16 0 25 1016 topology 1101 5291
+> 15 0 24 1016 topology 1156 5292
+> 16 0 24 1016 topology 1106 5292
+> 15 0 25 1016 topology 1106 5293
+> 16 0 25 1016 topology 1104 5293
+> 15 0 24 1016 topology 1156 5294
+> 16 0 24 1016 topology 1055 5294
+> 15 0 25 1016 topology 1055 5295
+> 16 0 25 1016 topology 1053 5295
+> 15 0 24 1016 topology 1156 5296
+> 16 0 24 1016 topology 1118 5296
+> 15 0 25 1016 topology 1118 5297
+> 16 0 25 1016 topology 1116 5297
+> 15 0 24 1016 topology 1156 5298
+> 16 0 24 1016 topology 1067 5298
+> 15 0 25 1016 topology 1067 5299
+> 16 0 25 1016 topology 1065 5299
+> 15 0 24 1016 topology 1156 5300
+> 16 0 24 1016 topology 1130 5300
+> 15 0 25 1016 topology 1130 5301
+> 16 0 25 1016 topology 1128 5301
+> 15 0 24 1016 topology 1156 5302
+> 16 0 24 1016 topology 1025 5302
+> 15 0 25 1016 topology 1025 5303
+> 16 0 25 1016 topology 1023 5303
+> 15 0 24 1016 topology 1156 5304
+> 16 0 24 1016 topology 1037 5304
+> 15 0 25 1016 topology 1037 5305
+> 16 0 25 1016 topology 1035 5305
+> 15 0 24 1016 topology 1156 5306
+> 16 0 24 1016 topology 1082 5306
+> 15 0 25 1016 topology 1082 5307
+> 16 0 25 1016 topology 1080 5307
+> 15 0 24 1016 topology 1156 5308
+> 16 0 24 1016 topology 1145 5308
+> 15 0 25 1016 topology 1145 5309
+> 16 0 25 1016 topology 1143 5309
+> 15 0 24 1016 topology 1156 5310
+> 16 0 24 1016 topology 1094 5310
+> 15 0 25 1016 topology 1094 5311
+> 16 0 25 1016 topology 1092 5311
+> 15 0 24 1016 topology 1156 5312
+> 16 0 24 1016 topology 1046 5312
+> 15 0 25 1016 topology 1046 5313
+> 16 0 25 1016 topology 1044 5313
+> 15 0 24 1016 topology 1156 5314
+> 16 0 24 1016 topology 1109 5314
+> 15 0 25 1016 topology 1109 5315
+> 16 0 25 1016 topology 1107 5315
+> 15 0 24 1016 topology 1156 5316
+> 16 0 24 1016 topology 1058 5316
+> 15 0 25 1016 topology 1058 5317
+> 16 0 25 1016 topology 1056 5317
+> 15 0 24 1016 topology 1156 5318
+> 16 0 24 1016 topology 1121 5318
+> 15 0 25 1016 topology 1121 5319
+> 16 0 25 1016 topology 1119 5319
+> 15 0 24 1016 topology 1156 5320
+> 16 0 24 1016 topology 1070 5320
+> 15 0 25 1016 topology 1070 5321
+> 16 0 25 1016 topology 1068 5321
+> 15 0 24 1016 topology 1156 5322
+> 16 0 24 1016 topology 1133 5322
+> 15 0 25 1016 topology 1133 5323
+> 16 0 25 1016 topology 1131 5323
+> 15 0 24 1016 topology 1156 5324
+> 16 0 24 1016 topology 1028 5324
+> 15 0 25 1016 topology 1028 5325
+> 16 0 25 1016 topology 1026 5325
+> 15 0 24 1016 topology 1156 5326
+> 16 0 24 1016 topology 1040 5326
+> 15 0 25 1016 topology 1040 5327
+> 16 0 25 1016 topology 1038 5327
+> 15 0 24 1016 topology 1156 5328
+> 16 0 24 1016 topology 1136 5328
+> 15 0 25 1016 topology 1136 5329
+> 16 0 25 1016 topology 1134 5329
+> 15 0 24 1016 topology 1156 5330
+> 16 0 24 1016 topology 1085 5330
+> 15 0 25 1016 topology 1085 5331
+> 16 0 25 1016 topology 1083 5331
+> 15 0 24 1016 topology 1156 5332
+> 16 0 24 1016 topology 1148 5332
+> 15 0 25 1016 topology 1148 5333
+> 16 0 25 1016 topology 1146 5333
+> 15 0 24 1016 topology 1156 5334
+> 16 0 24 1016 topology 1097 5334
+> 15 0 25 1016 topology 1097 5335
+> 16 0 25 1016 topology 1095 5335
+> 15 0 24 1016 topology 1156 5336
+> 16 0 24 1016 topology 1049 5336
+> 15 0 25 1016 topology 1049 5337
+> 16 0 25 1016 topology 1047 5337
+> 15 0 24 1016 topology 1156 5338
+> 16 0 24 1016 topology 1112 5338
+> 15 0 25 1016 topology 1112 5339
+> 16 0 25 1016 topology 1110 5339
+> 15 0 23 1016 topology 1122 5340
+> 16 0 23 1016 topology 1123 5340
+> 15 0 24 1016 topology 1123 5341
+> 16 0 24 1016 topology 1156 5341
+> 15 0 24 1016 topology 1156 5342
+> 16 0 24 1016 topology 1061 5342
+> 15 0 25 1016 topology 1061 5343
+> 16 0 25 1016 topology 1059 5343
+> 15 0 23 1016 topology 1071 5344
+> 16 0 23 1016 topology 1072 5344
+> 15 0 24 1016 topology 1072 5345
+> 16 0 24 1016 topology 1156 5345
+> 15 0 23 1016 topology 1017 5346
+> 16 0 23 1016 topology 1018 5346
+> 15 0 24 1016 topology 1018 5347
+> 16 0 24 1016 topology 1156 5347
+> 15 0 23 1016 topology 1029 5348
+> 16 0 23 1016 topology 1030 5348
+> 15 0 24 1016 topology 1030 5349
+> 16 0 24 1016 topology 1156 5349
+> 15 0 23 1016 topology 1041 5350
+> 16 0 23 1016 topology 1042 5350
+> 15 0 24 1016 topology 1042 5351
+> 16 0 24 1016 topology 1156 5351
+> 15 0 23 1016 topology 1074 5352
+> 16 0 23 1016 topology 1075 5352
+> 15 0 24 1016 topology 1075 5353
+> 16 0 24 1016 topology 1156 5353
+> 15 0 23 1016 topology 1137 5354
+> 16 0 23 1016 topology 1138 5354
+> 15 0 24 1016 topology 1138 5355
+> 16 0 24 1016 topology 1156 5355
+> 15 0 23 1016 topology 1086 5356
+> 16 0 23 1016 topology 1087 5356
+> 15 0 24 1016 topology 1087 5357
+> 16 0 24 1016 topology 1156 5357
+> 15 0 23 1016 topology 1149 5358
+> 16 0 23 1016 topology 1150 5358
+> 15 0 24 1016 topology 1150 5359
+> 16 0 24 1016 topology 1156 5359
+> 15 0 23 1016 topology 1098 5360
+> 16 0 23 1016 topology 1099 5360
+> 15 0 24 1016 topology 1099 5361
+> 16 0 24 1016 topology 1156 5361
+> 15 0 23 1016 topology 1050 5362
+> 16 0 23 1016 topology 1051 5362
+> 15 0 24 1016 topology 1051 5363
+> 16 0 24 1016 topology 1156 5363
+> 15 0 23 1016 topology 1113 5364
+> 16 0 23 1016 topology 1114 5364
+> 15 0 24 1016 topology 1114 5365
+> 16 0 24 1016 topology 1156 5365
+> 15 0 23 1016 topology 1062 5366
+> 16 0 23 1016 topology 1063 5366
+> 15 0 24 1016 topology 1063 5367
+> 16 0 24 1016 topology 1156 5367
+> 15 0 23 1016 topology 1125 5368
+> 16 0 23 1016 topology 1126 5368
+> 15 0 24 1016 topology 1126 5369
+> 16 0 24 1016 topology 1156 5369
+> 15 0 23 1016 topology 1020 5370
+> 16 0 23 1016 topology 1021 5370
+> 15 0 24 1016 topology 1021 5371
+> 16 0 24 1016 topology 1156 5371
+> 15 0 23 1016 topology 1032 5372
+> 16 0 23 1016 topology 1033 5372
+> 15 0 24 1016 topology 1033 5373
+> 16 0 24 1016 topology 1156 5373
+> 15 0 23 1016 topology 1077 5374
+> 16 0 23 1016 topology 1078 5374
+> 15 0 24 1016 topology 1078 5375
+> 16 0 24 1016 topology 1156 5375
+> 15 0 23 1016 topology 1140 5376
+> 16 0 23 1016 topology 1141 5376
+> 15 0 24 1016 topology 1141 5377
+> 16 0 24 1016 topology 1156 5377
+> 15 0 23 1016 topology 1089 5378
+> 16 0 23 1016 topology 1090 5378
+> 15 0 24 1016 topology 1090 5379
+> 16 0 24 1016 topology 1156 5379
+> 15 0 23 1016 topology 1152 5380
+> 16 0 23 1016 topology 1153 5380
+> 15 0 24 1016 topology 1153 5381
+> 16 0 24 1016 topology 1156 5381
+> 15 0 23 1016 topology 1101 5382
+> 16 0 23 1016 topology 1102 5382
+> 15 0 24 1016 topology 1102 5383
+> 16 0 24 1016 topology 1156 5383
+> 15 0 23 1016 topology 1104 5384
+> 16 0 23 1016 topology 1105 5384
+> 15 0 24 1016 topology 1105 5385
+> 16 0 24 1016 topology 1156 5385
+> 15 0 23 1016 topology 1053 5386
+> 16 0 23 1016 topology 1054 5386
+> 15 0 24 1016 topology 1054 5387
+> 16 0 24 1016 topology 1156 5387
+> 15 0 23 1016 topology 1116 5388
+> 16 0 23 1016 topology 1117 5388
+> 15 0 24 1016 topology 1117 5389
+> 16 0 24 1016 topology 1156 5389
+> 15 0 23 1016 topology 1065 5390
+> 16 0 23 1016 topology 1066 5390
+> 15 0 24 1016 topology 1066 5391
+> 16 0 24 1016 topology 1156 5391
+> 15 0 23 1016 topology 1128 5392
+> 16 0 23 1016 topology 1129 5392
+> 15 0 24 1016 topology 1129 5393
+> 16 0 24 1016 topology 1156 5393
+> 15 0 23 1016 topology 1023 5394
+> 16 0 23 1016 topology 1024 5394
+> 15 0 24 1016 topology 1024 5395
+> 16 0 24 1016 topology 1156 5395
+> 15 0 23 1016 topology 1035 5396
+> 16 0 23 1016 topology 1036 5396
+> 15 0 24 1016 topology 1036 5397
+> 16 0 24 1016 topology 1156 5397
+> 15 0 23 1016 topology 1080 5398
+> 16 0 23 1016 topology 1081 5398
+> 15 0 24 1016 topology 1081 5399
+> 16 0 24 1016 topology 1156 5399
+> 15 0 23 1016 topology 1143 5400
+> 16 0 23 1016 topology 1144 5400
+> 15 0 24 1016 topology 1144 5401
+> 16 0 24 1016 topology 1156 5401
+> 15 0 23 1016 topology 1092 5402
+> 16 0 23 1016 topology 1093 5402
+> 15 0 24 1016 topology 1093 5403
+> 16 0 24 1016 topology 1156 5403
+> 15 0 23 1016 topology 1044 5404
+> 16 0 23 1016 topology 1045 5404
+> 15 0 24 1016 topology 1045 5405
+> 16 0 24 1016 topology 1156 5405
+> 15 0 23 1016 topology 1107 5406
+> 16 0 23 1016 topology 1108 5406
+> 15 0 24 1016 topology 1108 5407
+> 16 0 24 1016 topology 1156 5407
+> 15 0 23 1016 topology 1056 5408
+> 16 0 23 1016 topology 1057 5408
+> 15 0 24 1016 topology 1057 5409
+> 16 0 24 1016 topology 1156 5409
+> 15 0 23 1016 topology 1119 5410
+> 16 0 23 1016 topology 1120 5410
+> 15 0 24 1016 topology 1120 5411
+> 16 0 24 1016 topology 1156 5411
+> 15 0 23 1016 topology 1068 5412
+> 16 0 23 1016 topology 1069 5412
+> 15 0 24 1016 topology 1069 5413
+> 16 0 24 1016 topology 1156 5413
+> 15 0 23 1016 topology 1131 5414
+> 16 0 23 1016 topology 1132 5414
+> 15 0 24 1016 topology 1132 5415
+> 16 0 24 1016 topology 1156 5415
+> 15 0 23 1016 topology 1026 5416
+> 16 0 23 1016 topology 1027 5416
+> 15 0 24 1016 topology 1027 5417
+> 16 0 24 1016 topology 1156 5417
+> 15 0 23 1016 topology 1038 5418
+> 16 0 23 1016 topology 1039 5418
+> 15 0 24 1016 topology 1039 5419
+> 16 0 24 1016 topology 1156 5419
+> 15 0 23 1016 topology 1134 5420
+> 16 0 23 1016 topology 1135 5420
+> 15 0 24 1016 topology 1135 5421
+> 16 0 24 1016 topology 1156 5421
+> 15 0 23 1016 topology 1083 5422
+> 16 0 23 1016 topology 1084 5422
+> 15 0 24 1016 topology 1084 5423
+> 16 0 24 1016 topology 1156 5423
+> 15 0 23 1016 topology 1146 5424
+> 16 0 23 1016 topology 1147 5424
+> 15 0 24 1016 topology 1147 5425
+> 16 0 24 1016 topology 1156 5425
+> 15 0 23 1016 topology 1095 5426
+> 16 0 23 1016 topology 1096 5426
+> 15 0 24 1016 topology 1096 5427
+> 16 0 24 1016 topology 1156 5427
+> 15 0 23 1016 topology 1047 5428
+> 16 0 23 1016 topology 1048 5428
+> 15 0 24 1016 topology 1048 5429
+> 16 0 24 1016 topology 1156 5429
+> 15 0 23 1016 topology 1110 5430
+> 16 0 23 1016 topology 1111 5430
+> 15 0 24 1016 topology 1111 5431
+> 16 0 24 1016 topology 1156 5431
+> 15 0 23 952 topology 989 5432
+> 16 0 23 952 topology 990 5432
+> 15 0 24 952 topology 990 5433
+> 16 0 24 952 topology 1014 5433
+> 15 0 24 952 topology 1014 5434
+> 16 0 24 952 topology 997 5434
+> 15 0 25 952 topology 997 5435
+> 16 0 25 952 topology 995 5435
+> 15 0 24 952 topology 1014 5436
+> 16 0 24 952 topology 1003 5436
+> 15 0 25 952 topology 1003 5437
+> 16 0 25 952 topology 1001 5437
+> 15 0 24 952 topology 1014 5438
+> 16 0 24 952 topology 1009 5438
+> 15 0 25 952 topology 1009 5439
+> 16 0 25 952 topology 1007 5439
+> 15 0 24 952 topology 1014 5440
+> 16 0 24 952 topology 1012 5440
+> 15 0 25 952 topology 1012 5441
+> 16 0 25 952 topology 1010 5441
+> 15 0 24 952 topology 1014 5442
+> 16 0 24 952 topology 955 5442
+> 15 0 25 952 topology 955 5443
+> 16 0 25 952 topology 953 5443
+> 15 0 24 952 topology 1014 5444
+> 16 0 24 952 topology 961 5444
+> 15 0 25 952 topology 961 5445
+> 16 0 25 952 topology 959 5445
+> 15 0 24 952 topology 1014 5446
+> 16 0 24 952 topology 967 5446
+> 15 0 25 952 topology 967 5447
+> 16 0 25 952 topology 965 5447
+> 15 0 24 952 topology 1014 5448
+> 16 0 24 952 topology 973 5448
+> 15 0 25 952 topology 973 5449
+> 16 0 25 952 topology 971 5449
+> 15 0 24 952 topology 1014 5450
+> 16 0 24 952 topology 979 5450
+> 15 0 25 952 topology 979 5451
+> 16 0 25 952 topology 977 5451
+> 15 0 24 952 topology 1014 5452
+> 16 0 24 952 topology 982 5452
+> 15 0 25 952 topology 982 5453
+> 16 0 25 952 topology 980 5453
+> 15 0 24 952 topology 1014 5454
+> 16 0 24 952 topology 988 5454
+> 15 0 25 952 topology 988 5455
+> 16 0 25 952 topology 986 5455
+> 15 0 24 952 topology 1014 5456
+> 16 0 24 952 topology 994 5456
+> 15 0 25 952 topology 994 5457
+> 16 0 25 952 topology 992 5457
+> 15 0 24 952 topology 1014 5458
+> 16 0 24 952 topology 1000 5458
+> 15 0 25 952 topology 1000 5459
+> 16 0 25 952 topology 998 5459
+> 15 0 24 952 topology 1014 5460
+> 16 0 24 952 topology 1006 5460
+> 15 0 25 952 topology 1006 5461
+> 16 0 25 952 topology 1004 5461
+> 15 0 26 952 topology 1014 5462
+> 16 0 26 952 topology 1013 5462
+> 15 0 24 952 topology 1014 5463
+> 16 0 24 952 topology 958 5463
+> 15 0 25 952 topology 958 5464
+> 16 0 25 952 topology 956 5464
+> 15 0 24 952 topology 1014 5465
+> 16 0 24 952 topology 964 5465
+> 15 0 25 952 topology 964 5466
+> 16 0 25 952 topology 962 5466
+> 15 0 24 952 topology 1014 5467
+> 16 0 24 952 topology 970 5467
+> 15 0 25 952 topology 970 5468
+> 16 0 25 952 topology 968 5468
+> 15 0 24 952 topology 1014 5469
+> 16 0 24 952 topology 976 5469
+> 15 0 25 952 topology 976 5470
+> 16 0 25 952 topology 974 5470
+> 15 0 24 952 topology 1014 5471
+> 16 0 24 952 topology 985 5471
+> 15 0 25 952 topology 985 5472
+> 16 0 25 952 topology 983 5472
+> 15 0 23 952 topology 995 5473
+> 16 0 23 952 topology 996 5473
+> 15 0 24 952 topology 996 5474
+> 16 0 24 952 topology 1014 5474
+> 15 0 24 952 topology 1014 5475
+> 16 0 24 952 topology 991 5475
+> 15 0 25 952 topology 991 5476
+> 16 0 25 952 topology 989 5476
+> 15 0 23 952 topology 1001 5477
+> 16 0 23 952 topology 1002 5477
+> 15 0 24 952 topology 1002 5478
+> 16 0 24 952 topology 1014 5478
+> 15 0 23 952 topology 1007 5479
+> 16 0 23 952 topology 1008 5479
+> 15 0 24 952 topology 1008 5480
+> 16 0 24 952 topology 1014 5480
+> 15 0 23 952 topology 1010 5481
+> 16 0 23 952 topology 1011 5481
+> 15 0 24 952 topology 1011 5482
+> 16 0 24 952 topology 1014 5482
+> 15 0 23 952 topology 953 5483
+> 16 0 23 952 topology 954 5483
+> 15 0 24 952 topology 954 5484
+> 16 0 24 952 topology 1014 5484
+> 15 0 23 952 topology 959 5485
+> 16 0 23 952 topology 960 5485
+> 15 0 24 952 topology 960 5486
+> 16 0 24 952 topology 1014 5486
+> 15 0 23 952 topology 965 5487
+> 16 0 23 952 topology 966 5487
+> 15 0 24 952 topology 966 5488
+> 16 0 24 952 topology 1014 5488
+> 15 0 23 952 topology 971 5489
+> 16 0 23 952 topology 972 5489
+> 15 0 24 952 topology 972 5490
+> 16 0 24 952 topology 1014 5490
+> 15 0 23 952 topology 977 5491
+> 16 0 23 952 topology 978 5491
+> 15 0 24 952 topology 978 5492
+> 16 0 24 952 topology 1014 5492
+> 15 0 23 952 topology 980 5493
+> 16 0 23 952 topology 981 5493
+> 15 0 24 952 topology 981 5494
+> 16 0 24 952 topology 1014 5494
+> 15 0 23 952 topology 986 5495
+> 16 0 23 952 topology 987 5495
+> 15 0 24 952 topology 987 5496
+> 16 0 24 952 topology 1014 5496
+> 15 0 23 952 topology 992 5497
+> 16 0 23 952 topology 993 5497
+> 15 0 24 952 topology 993 5498
+> 16 0 24 952 topology 1014 5498
+> 15 0 23 952 topology 998 5499
+> 16 0 23 952 topology 999 5499
+> 15 0 24 952 topology 999 5500
+> 16 0 24 952 topology 1014 5500
+> 15 0 23 952 topology 1004 5501
+> 16 0 23 952 topology 1005 5501
+> 15 0 24 952 topology 1005 5502
+> 16 0 24 952 topology 1014 5502
+> 15 0 23 952 topology 956 5503
+> 16 0 23 952 topology 957 5503
+> 15 0 24 952 topology 957 5504
+> 16 0 24 952 topology 1014 5504
+> 15 0 23 952 topology 962 5505
+> 16 0 23 952 topology 963 5505
+> 15 0 24 952 topology 963 5506
+> 16 0 24 952 topology 1014 5506
+> 15 0 23 952 topology 968 5507
+> 16 0 23 952 topology 969 5507
+> 15 0 24 952 topology 969 5508
+> 16 0 24 952 topology 1014 5508
+> 15 0 23 952 topology 974 5509
+> 16 0 23 952 topology 975 5509
+> 15 0 24 952 topology 975 5510
+> 16 0 24 952 topology 1014 5510
+> 15 0 23 952 topology 983 5511
+> 16 0 23 952 topology 984 5511
+> 15 0 24 952 topology 984 5512
+> 16 0 24 952 topology 1014 5512
+> 15 0 23 1158 topology 1159 5513
+> 16 0 23 1158 topology 1160 5513
+> 15 0 24 1158 topology 1160 5514
+> 16 0 24 1158 topology 1184 5514
+> 15 0 24 1158 topology 1184 5515
+> 16 0 24 1158 topology 1167 5515
+> 15 0 25 1158 topology 1167 5516
+> 16 0 25 1158 topology 1165 5516
+> 15 0 24 1158 topology 1184 5517
+> 16 0 24 1158 topology 1173 5517
+> 15 0 25 1158 topology 1173 5518
+> 16 0 25 1158 topology 1171 5518
+> 15 0 24 1158 topology 1184 5519
+> 16 0 24 1158 topology 1179 5519
+> 15 0 25 1158 topology 1179 5520
+> 16 0 25 1158 topology 1177 5520
+> 15 0 26 1158 topology 1184 5521
+> 16 0 26 1158 topology 1183 5521
+> 15 0 24 1158 topology 1184 5522
+> 16 0 24 1158 topology 1164 5522
+> 15 0 25 1158 topology 1164 5523
+> 16 0 25 1158 topology 1162 5523
+> 15 0 24 1158 topology 1184 5524
+> 16 0 24 1158 topology 1170 5524
+> 15 0 25 1158 topology 1170 5525
+> 16 0 25 1158 topology 1168 5525
+> 15 0 24 1158 topology 1184 5526
+> 16 0 24 1158 topology 1176 5526
+> 15 0 25 1158 topology 1176 5527
+> 16 0 25 1158 topology 1174 5527
+> 15 0 24 1158 topology 1184 5528
+> 16 0 24 1158 topology 1182 5528
+> 15 0 25 1158 topology 1182 5529
+> 16 0 25 1158 topology 1180 5529
+> 15 0 23 1158 topology 1165 5530
+> 16 0 23 1158 topology 1166 5530
+> 15 0 24 1158 topology 1166 5531
+> 16 0 24 1158 topology 1184 5531
+> 15 0 24 1158 topology 1184 5532
+> 16 0 24 1158 topology 1161 5532
+> 15 0 25 1158 topology 1161 5533
+> 16 0 25 1158 topology 1159 5533
+> 15 0 23 1158 topology 1171 5534
+> 16 0 23 1158 topology 1172 5534
+> 15 0 24 1158 topology 1172 5535
+> 16 0 24 1158 topology 1184 5535
+> 15 0 23 1158 topology 1177 5536
+> 16 0 23 1158 topology 1178 5536
+> 15 0 24 1158 topology 1178 5537
+> 16 0 24 1158 topology 1184 5537
+> 15 0 23 1158 topology 1162 5538
+> 16 0 23 1158 topology 1163 5538
+> 15 0 24 1158 topology 1163 5539
+> 16 0 24 1158 topology 1184 5539
+> 15 0 23 1158 topology 1168 5540
+> 16 0 23 1158 topology 1169 5540
+> 15 0 24 1158 topology 1169 5541
+> 16 0 24 1158 topology 1184 5541
+> 15 0 23 1158 topology 1174 5542
+> 16 0 23 1158 topology 1175 5542
+> 15 0 24 1158 topology 1175 5543
+> 16 0 24 1158 topology 1184 5543
+> 15 0 23 1158 topology 1180 5544
+> 16 0 23 1158 topology 1181 5544
+> 15 0 24 1158 topology 1181 5545
+> 16 0 24 1158 topology 1184 5545
+> 15 0 23 870 topology 931 5546
+> 16 0 23 870 topology 932 5546
+> 15 0 24 870 topology 932 5547
+> 16 0 24 870 topology 950 5547
+> 15 0 24 870 topology 950 5548
+> 16 0 24 870 topology 939 5548
+> 15 0 25 870 topology 939 5549
+> 16 0 25 870 topology 937 5549
+> 15 0 24 870 topology 950 5550
+> 16 0 24 870 topology 945 5550
+> 15 0 25 870 topology 945 5551
+> 16 0 25 870 topology 943 5551
+> 15 0 24 870 topology 950 5552
+> 16 0 24 870 topology 876 5552
+> 15 0 25 870 topology 876 5553
+> 16 0 25 870 topology 874 5553
+> 15 0 24 870 topology 950 5554
+> 16 0 24 870 topology 882 5554
+> 15 0 25 870 topology 882 5555
+> 16 0 25 870 topology 880 5555
+> 15 0 24 870 topology 950 5556
+> 16 0 24 870 topology 888 5556
+> 15 0 25 870 topology 888 5557
+> 16 0 25 870 topology 886 5557
+> 15 0 24 870 topology 950 5558
+> 16 0 24 870 topology 894 5558
+> 15 0 25 870 topology 894 5559
+> 16 0 25 870 topology 892 5559
+> 15 0 24 870 topology 950 5560
+> 16 0 24 870 topology 903 5560
+> 15 0 25 870 topology 903 5561
+> 16 0 25 870 topology 901 5561
+> 15 0 24 870 topology 950 5562
+> 16 0 24 870 topology 909 5562
+> 15 0 25 870 topology 909 5563
+> 16 0 25 870 topology 907 5563
+> 15 0 24 870 topology 950 5564
+> 16 0 24 870 topology 915 5564
+> 15 0 25 870 topology 915 5565
+> 16 0 25 870 topology 913 5565
+> 15 0 26 870 topology 950 5566
+> 16 0 26 870 topology 949 5566
+> 15 0 24 870 topology 950 5567
+> 16 0 24 870 topology 921 5567
+> 15 0 25 870 topology 921 5568
+> 16 0 25 870 topology 919 5568
+> 15 0 24 870 topology 950 5569
+> 16 0 24 870 topology 927 5569
+> 15 0 25 870 topology 927 5570
+> 16 0 25 870 topology 925 5570
+> 15 0 24 870 topology 950 5571
+> 16 0 24 870 topology 930 5571
+> 15 0 25 870 topology 930 5572
+> 16 0 25 870 topology 928 5572
+> 15 0 24 870 topology 950 5573
+> 16 0 24 870 topology 936 5573
+> 15 0 25 870 topology 936 5574
+> 16 0 25 870 topology 934 5574
+> 15 0 24 870 topology 950 5575
+> 16 0 24 870 topology 942 5575
+> 15 0 25 870 topology 942 5576
+> 16 0 25 870 topology 940 5576
+> 15 0 24 870 topology 950 5577
+> 16 0 24 870 topology 948 5577
+> 15 0 25 870 topology 948 5578
+> 16 0 25 870 topology 946 5578
+> 15 0 24 870 topology 950 5579
+> 16 0 24 870 topology 873 5579
+> 15 0 25 870 topology 873 5580
+> 16 0 25 870 topology 871 5580
+> 15 0 24 870 topology 950 5581
+> 16 0 24 870 topology 879 5581
+> 15 0 25 870 topology 879 5582
+> 16 0 25 870 topology 877 5582
+> 15 0 24 870 topology 950 5583
+> 16 0 24 870 topology 885 5583
+> 15 0 25 870 topology 885 5584
+> 16 0 25 870 topology 883 5584
+> 15 0 24 870 topology 950 5585
+> 16 0 24 870 topology 891 5585
+> 15 0 25 870 topology 891 5586
+> 16 0 25 870 topology 889 5586
+> 15 0 24 870 topology 950 5587
+> 16 0 24 870 topology 897 5587
+> 15 0 25 870 topology 897 5588
+> 16 0 25 870 topology 895 5588
+> 15 0 24 870 topology 950 5589
+> 16 0 24 870 topology 900 5589
+> 15 0 25 870 topology 900 5590
+> 16 0 25 870 topology 898 5590
+> 15 0 24 870 topology 950 5591
+> 16 0 24 870 topology 906 5591
+> 15 0 25 870 topology 906 5592
+> 16 0 25 870 topology 904 5592
+> 15 0 24 870 topology 950 5593
+> 16 0 24 870 topology 912 5593
+> 15 0 25 870 topology 912 5594
+> 16 0 25 870 topology 910 5594
+> 15 0 24 870 topology 950 5595
+> 16 0 24 870 topology 918 5595
+> 15 0 25 870 topology 918 5596
+> 16 0 25 870 topology 916 5596
+> 15 0 24 870 topology 950 5597
+> 16 0 24 870 topology 924 5597
+> 15 0 25 870 topology 924 5598
+> 16 0 25 870 topology 922 5598
+> 15 0 23 870 topology 937 5599
+> 16 0 23 870 topology 938 5599
+> 15 0 24 870 topology 938 5600
+> 16 0 24 870 topology 950 5600
+> 15 0 24 870 topology 950 5601
+> 16 0 24 870 topology 933 5601
+> 15 0 25 870 topology 933 5602
+> 16 0 25 870 topology 931 5602
+> 15 0 23 870 topology 943 5603
+> 16 0 23 870 topology 944 5603
+> 15 0 24 870 topology 944 5604
+> 16 0 24 870 topology 950 5604
+> 15 0 23 870 topology 874 5605
+> 16 0 23 870 topology 875 5605
+> 15 0 24 870 topology 875 5606
+> 16 0 24 870 topology 950 5606
+> 15 0 23 870 topology 880 5607
+> 16 0 23 870 topology 881 5607
+> 15 0 24 870 topology 881 5608
+> 16 0 24 870 topology 950 5608
+> 15 0 23 870 topology 886 5609
+> 16 0 23 870 topology 887 5609
+> 15 0 24 870 topology 887 5610
+> 16 0 24 870 topology 950 5610
+> 15 0 23 870 topology 892 5611
+> 16 0 23 870 topology 893 5611
+> 15 0 24 870 topology 893 5612
+> 16 0 24 870 topology 950 5612
+> 15 0 23 870 topology 901 5613
+> 16 0 23 870 topology 902 5613
+> 15 0 24 870 topology 902 5614
+> 16 0 24 870 topology 950 5614
+> 15 0 23 870 topology 907 5615
+> 16 0 23 870 topology 908 5615
+> 15 0 24 870 topology 908 5616
+> 16 0 24 870 topology 950 5616
+> 15 0 23 870 topology 913 5617
+> 16 0 23 870 topology 914 5617
+> 15 0 24 870 topology 914 5618
+> 16 0 24 870 topology 950 5618
+> 15 0 23 870 topology 919 5619
+> 16 0 23 870 topology 920 5619
+> 15 0 24 870 topology 920 5620
+> 16 0 24 870 topology 950 5620
+> 15 0 23 870 topology 925 5621
+> 16 0 23 870 topology 926 5621
+> 15 0 24 870 topology 926 5622
+> 16 0 24 870 topology 950 5622
+> 15 0 23 870 topology 928 5623
+> 16 0 23 870 topology 929 5623
+> 15 0 24 870 topology 929 5624
+> 16 0 24 870 topology 950 5624
+> 15 0 23 870 topology 934 5625
+> 16 0 23 870 topology 935 5625
+> 15 0 24 870 topology 935 5626
+> 16 0 24 870 topology 950 5626
+> 15 0 23 870 topology 940 5627
+> 16 0 23 870 topology 941 5627
+> 15 0 24 870 topology 941 5628
+> 16 0 24 870 topology 950 5628
+> 15 0 23 870 topology 946 5629
+> 16 0 23 870 topology 947 5629
+> 15 0 24 870 topology 947 5630
+> 16 0 24 870 topology 950 5630
+> 15 0 23 870 topology 871 5631
+> 16 0 23 870 topology 872 5631
+> 15 0 24 870 topology 872 5632
+> 16 0 24 870 topology 950 5632
+> 15 0 23 870 topology 877 5633
+> 16 0 23 870 topology 878 5633
+> 15 0 24 870 topology 878 5634
+> 16 0 24 870 topology 950 5634
+> 15 0 23 870 topology 883 5635
+> 16 0 23 870 topology 884 5635
+> 15 0 24 870 topology 884 5636
+> 16 0 24 870 topology 950 5636
+> 15 0 23 870 topology 889 5637
+> 16 0 23 870 topology 890 5637
+> 15 0 24 870 topology 890 5638
+> 16 0 24 870 topology 950 5638
+> 15 0 23 870 topology 895 5639
+> 16 0 23 870 topology 896 5639
+> 15 0 24 870 topology 896 5640
+> 16 0 24 870 topology 950 5640
+> 15 0 23 870 topology 898 5641
+> 16 0 23 870 topology 899 5641
+> 15 0 24 870 topology 899 5642
+> 16 0 24 870 topology 950 5642
+> 15 0 23 870 topology 904 5643
+> 16 0 23 870 topology 905 5643
+> 15 0 24 870 topology 905 5644
+> 16 0 24 870 topology 950 5644
+> 15 0 23 870 topology 910 5645
+> 16 0 23 870 topology 911 5645
+> 15 0 24 870 topology 911 5646
+> 16 0 24 870 topology 950 5646
+> 15 0 23 870 topology 916 5647
+> 16 0 23 870 topology 917 5647
+> 15 0 24 870 topology 917 5648
+> 16 0 24 870 topology 950 5648
+> 15 0 23 870 topology 922 5649
+> 16 0 23 870 topology 923 5649
+> 15 0 24 870 topology 923 5650
+> 16 0 24 870 topology 950 5650
+> 15 0 27 869 topology 1155 5651
+> 16 0 27 869 topology 1157 5651
+> 15 0 21 869 topology 1157 5652
+> 16 0 21 869 topology 1015 5652
+> 15 0 28 869 topology 1015 5653
+> 16 0 28 869 topology 1013 5653
+> 15 0 21 869 topology 1157 5654
+> 16 0 21 869 topology 1185 5654
+> 15 0 28 869 topology 1185 5655
+> 16 0 28 869 topology 1183 5655
+> 15 0 28 869 topology 1157 5656
+> 16 0 28 869 topology 1187 5656
+> 15 0 21 869 topology 1157 5657
+> 16 0 21 869 topology 951 5657
+> 15 0 28 869 topology 951 5658
+> 16 0 28 869 topology 949 5658
+> 15 0 21 869 topology 1015 5659
+> 16 0 21 869 topology 1185 5659
+> 15 0 28 869 topology 1015 5660
+> 16 0 28 869 topology 1187 5660
+> 15 0 21 869 topology 1015 5661
+> 16 0 21 869 topology 951 5661
+> 15 0 28 869 topology 1185 5662
+> 16 0 28 869 topology 1187 5662
+> 15 0 21 869 topology 1185 5663
+> 16 0 21 869 topology 951 5663
+> 15 0 27 869 topology 1187 5664
+> 16 0 27 869 topology 951 5664
+> 15 0 23 3922 topology 3989 5665
+> 16 0 23 3922 topology 3990 5665
+> 15 0 24 3922 topology 3990 5666
+> 16 0 24 3922 topology 4092 5666
+> 15 0 24 3922 topology 4092 5667
+> 16 0 24 3922 topology 4051 5667
+> 15 0 25 3922 topology 4051 5668
+> 16 0 25 3922 topology 4049 5668
+> 15 0 24 3922 topology 4092 5669
+> 16 0 24 3922 topology 3973 5669
+> 15 0 25 3922 topology 3973 5670
+> 16 0 25 3922 topology 3971 5670
+> 15 0 24 3922 topology 4092 5671
+> 16 0 24 3922 topology 4033 5671
+> 15 0 25 3922 topology 4033 5672
+> 16 0 25 3922 topology 4031 5672
+> 15 0 24 3922 topology 4092 5673
+> 16 0 24 3922 topology 3931 5673
+> 15 0 25 3922 topology 3931 5674
+> 16 0 25 3922 topology 3929 5674
+> 15 0 24 3922 topology 4092 5675
+> 16 0 24 3922 topology 3958 5675
+> 15 0 25 3922 topology 3958 5676
+> 16 0 25 3922 topology 3956 5676
+> 15 0 24 3922 topology 4092 5677
+> 16 0 24 3922 topology 4018 5677
+> 15 0 25 3922 topology 4018 5678
+> 16 0 25 3922 topology 4016 5678
+> 15 0 24 3922 topology 4092 5679
+> 16 0 24 3922 topology 4078 5679
+> 15 0 25 3922 topology 4078 5680
+> 16 0 25 3922 topology 4076 5680
+> 15 0 24 3922 topology 4092 5681
+> 16 0 24 3922 topology 4000 5681
+> 15 0 25 3922 topology 4000 5682
+> 16 0 25 3922 topology 3998 5682
+> 15 0 24 3922 topology 4092 5683
+> 16 0 24 3922 topology 4060 5683
+> 15 0 25 3922 topology 4060 5684
+> 16 0 25 3922 topology 4058 5684
+> 15 0 24 3922 topology 4092 5685
+> 16 0 24 3922 topology 3940 5685
+> 15 0 25 3922 topology 3940 5686
+> 16 0 25 3922 topology 3938 5686
+> 15 0 24 3922 topology 4092 5687
+> 16 0 24 3922 topology 3985 5687
+> 15 0 25 3922 topology 3985 5688
+> 16 0 25 3922 topology 3983 5688
+> 15 0 24 3922 topology 4092 5689
+> 16 0 24 3922 topology 4045 5689
+> 15 0 25 3922 topology 4045 5690
+> 16 0 25 3922 topology 4043 5690
+> 15 0 24 3922 topology 4092 5691
+> 16 0 24 3922 topology 3967 5691
+> 15 0 25 3922 topology 3967 5692
+> 16 0 25 3922 topology 3965 5692
+> 15 0 24 3922 topology 4092 5693
+> 16 0 24 3922 topology 4027 5693
+> 15 0 25 3922 topology 4027 5694
+> 16 0 25 3922 topology 4025 5694
+> 15 0 24 3922 topology 4092 5695
+> 16 0 24 3922 topology 4087 5695
+> 15 0 25 3922 topology 4087 5696
+> 16 0 25 3922 topology 4085 5696
+> 15 0 24 3922 topology 4092 5697
+> 16 0 24 3922 topology 4009 5697
+> 15 0 25 3922 topology 4009 5698
+> 16 0 25 3922 topology 4007 5698
+> 15 0 24 3922 topology 4092 5699
+> 16 0 24 3922 topology 4069 5699
+> 15 0 25 3922 topology 4069 5700
+> 16 0 25 3922 topology 4067 5700
+> 15 0 24 3922 topology 4092 5701
+> 16 0 24 3922 topology 3925 5701
+> 15 0 25 3922 topology 3925 5702
+> 16 0 25 3922 topology 3923 5702
+> 15 0 24 3922 topology 4092 5703
+> 16 0 24 3922 topology 3949 5703
+> 15 0 25 3922 topology 3949 5704
+> 16 0 25 3922 topology 3947 5704
+> 15 0 24 3922 topology 4092 5705
+> 16 0 24 3922 topology 3952 5705
+> 15 0 25 3922 topology 3952 5706
+> 16 0 25 3922 topology 3950 5706
+> 15 0 24 3922 topology 4092 5707
+> 16 0 24 3922 topology 4012 5707
+> 15 0 25 3922 topology 4012 5708
+> 16 0 25 3922 topology 4010 5708
+> 15 0 24 3922 topology 4092 5709
+> 16 0 24 3922 topology 4072 5709
+> 15 0 25 3922 topology 4072 5710
+> 16 0 25 3922 topology 4070 5710
+> 15 0 24 3922 topology 4092 5711
+> 16 0 24 3922 topology 3994 5711
+> 15 0 25 3922 topology 3994 5712
+> 16 0 25 3922 topology 3992 5712
+> 15 0 24 3922 topology 4092 5713
+> 16 0 24 3922 topology 4054 5713
+> 15 0 25 3922 topology 4054 5714
+> 16 0 25 3922 topology 4052 5714
+> 15 0 24 3922 topology 4092 5715
+> 16 0 24 3922 topology 3976 5715
+> 15 0 25 3922 topology 3976 5716
+> 16 0 25 3922 topology 3974 5716
+> 15 0 24 3922 topology 4092 5717
+> 16 0 24 3922 topology 4036 5717
+> 15 0 25 3922 topology 4036 5718
+> 16 0 25 3922 topology 4034 5718
+> 15 0 24 3922 topology 4092 5719
+> 16 0 24 3922 topology 3934 5719
+> 15 0 25 3922 topology 3934 5720
+> 16 0 25 3922 topology 3932 5720
+> 15 0 24 3922 topology 4092 5721
+> 16 0 24 3922 topology 3961 5721
+> 15 0 25 3922 topology 3961 5722
+> 16 0 25 3922 topology 3959 5722
+> 15 0 24 3922 topology 4092 5723
+> 16 0 24 3922 topology 4021 5723
+> 15 0 25 3922 topology 4021 5724
+> 16 0 25 3922 topology 4019 5724
+> 15 0 24 3922 topology 4092 5725
+> 16 0 24 3922 topology 4081 5725
+> 15 0 25 3922 topology 4081 5726
+> 16 0 25 3922 topology 4079 5726
+> 15 0 24 3922 topology 4092 5727
+> 16 0 24 3922 topology 4003 5727
+> 15 0 25 3922 topology 4003 5728
+> 16 0 25 3922 topology 4001 5728
+> 15 0 24 3922 topology 4092 5729
+> 16 0 24 3922 topology 4063 5729
+> 15 0 25 3922 topology 4063 5730
+> 16 0 25 3922 topology 4061 5730
+> 15 0 24 3922 topology 4092 5731
+> 16 0 24 3922 topology 3943 5731
+> 15 0 25 3922 topology 3943 5732
+> 16 0 25 3922 topology 3941 5732
+> 15 0 24 3922 topology 4092 5733
+> 16 0 24 3922 topology 3988 5733
+> 15 0 25 3922 topology 3988 5734
+> 16 0 25 3922 topology 3986 5734
+> 15 0 24 3922 topology 4092 5735
+> 16 0 24 3922 topology 4048 5735
+> 15 0 25 3922 topology 4048 5736
+> 16 0 25 3922 topology 4046 5736
+> 15 0 24 3922 topology 4092 5737
+> 16 0 24 3922 topology 3970 5737
+> 15 0 25 3922 topology 3970 5738
+> 16 0 25 3922 topology 3968 5738
+> 15 0 24 3922 topology 4092 5739
+> 16 0 24 3922 topology 4030 5739
+> 15 0 25 3922 topology 4030 5740
+> 16 0 25 3922 topology 4028 5740
+> 15 0 24 3922 topology 4092 5741
+> 16 0 24 3922 topology 4090 5741
+> 15 0 25 3922 topology 4090 5742
+> 16 0 25 3922 topology 4088 5742
+> 15 0 24 3922 topology 4092 5743
+> 16 0 24 3922 topology 3928 5743
+> 15 0 25 3922 topology 3928 5744
+> 16 0 25 3922 topology 3926 5744
+> 15 0 26 3922 topology 4092 5745
+> 16 0 26 3922 topology 4091 5745
+> 15 0 24 3922 topology 4092 5746
+> 16 0 24 3922 topology 3955 5746
+> 15 0 25 3922 topology 3955 5747
+> 16 0 25 3922 topology 3953 5747
+> 15 0 24 3922 topology 4092 5748
+> 16 0 24 3922 topology 4015 5748
+> 15 0 25 3922 topology 4015 5749
+> 16 0 25 3922 topology 4013 5749
+> 15 0 24 3922 topology 4092 5750
+> 16 0 24 3922 topology 4075 5750
+> 15 0 25 3922 topology 4075 5751
+> 16 0 25 3922 topology 4073 5751
+> 15 0 24 3922 topology 4092 5752
+> 16 0 24 3922 topology 3997 5752
+> 15 0 25 3922 topology 3997 5753
+> 16 0 25 3922 topology 3995 5753
+> 15 0 24 3922 topology 4092 5754
+> 16 0 24 3922 topology 4057 5754
+> 15 0 25 3922 topology 4057 5755
+> 16 0 25 3922 topology 4055 5755
+> 15 0 24 3922 topology 4092 5756
+> 16 0 24 3922 topology 3979 5756
+> 15 0 25 3922 topology 3979 5757
+> 16 0 25 3922 topology 3977 5757
+> 15 0 24 3922 topology 4092 5758
+> 16 0 24 3922 topology 4039 5758
+> 15 0 25 3922 topology 4039 5759
+> 16 0 25 3922 topology 4037 5759
+> 15 0 24 3922 topology 4092 5760
+> 16 0 24 3922 topology 3937 5760
+> 15 0 25 3922 topology 3937 5761
+> 16 0 25 3922 topology 3935 5761
+> 15 0 24 3922 topology 4092 5762
+> 16 0 24 3922 topology 3982 5762
+> 15 0 25 3922 topology 3982 5763
+> 16 0 25 3922 topology 3980 5763
+> 15 0 24 3922 topology 4092 5764
+> 16 0 24 3922 topology 4042 5764
+> 15 0 25 3922 topology 4042 5765
+> 16 0 25 3922 topology 4040 5765
+> 15 0 24 3922 topology 4092 5766
+> 16 0 24 3922 topology 3964 5766
+> 15 0 25 3922 topology 3964 5767
+> 16 0 25 3922 topology 3962 5767
+> 15 0 24 3922 topology 4092 5768
+> 16 0 24 3922 topology 4024 5768
+> 15 0 25 3922 topology 4024 5769
+> 16 0 25 3922 topology 4022 5769
+> 15 0 24 3922 topology 4092 5770
+> 16 0 24 3922 topology 4084 5770
+> 15 0 25 3922 topology 4084 5771
+> 16 0 25 3922 topology 4082 5771
+> 15 0 24 3922 topology 4092 5772
+> 16 0 24 3922 topology 4006 5772
+> 15 0 25 3922 topology 4006 5773
+> 16 0 25 3922 topology 4004 5773
+> 15 0 24 3922 topology 4092 5774
+> 16 0 24 3922 topology 4066 5774
+> 15 0 25 3922 topology 4066 5775
+> 16 0 25 3922 topology 4064 5775
+> 15 0 24 3922 topology 4092 5776
+> 16 0 24 3922 topology 3946 5776
+> 15 0 25 3922 topology 3946 5777
+> 16 0 25 3922 topology 3944 5777
+> 15 0 23 3922 topology 4049 5778
+> 16 0 23 3922 topology 4050 5778
+> 15 0 24 3922 topology 4050 5779
+> 16 0 24 3922 topology 4092 5779
+> 15 0 24 3922 topology 4092 5780
+> 16 0 24 3922 topology 3991 5780
+> 15 0 25 3922 topology 3991 5781
+> 16 0 25 3922 topology 3989 5781
+> 15 0 23 3922 topology 3971 5782
+> 16 0 23 3922 topology 3972 5782
+> 15 0 24 3922 topology 3972 5783
+> 16 0 24 3922 topology 4092 5783
+> 15 0 23 3922 topology 4031 5784
+> 16 0 23 3922 topology 4032 5784
+> 15 0 24 3922 topology 4032 5785
+> 16 0 24 3922 topology 4092 5785
+> 15 0 23 3922 topology 3929 5786
+> 16 0 23 3922 topology 3930 5786
+> 15 0 24 3922 topology 3930 5787
+> 16 0 24 3922 topology 4092 5787
+> 15 0 23 3922 topology 3956 5788
+> 16 0 23 3922 topology 3957 5788
+> 15 0 24 3922 topology 3957 5789
+> 16 0 24 3922 topology 4092 5789
+> 15 0 23 3922 topology 4016 5790
+> 16 0 23 3922 topology 4017 5790
+> 15 0 24 3922 topology 4017 5791
+> 16 0 24 3922 topology 4092 5791
+> 15 0 23 3922 topology 4076 5792
+> 16 0 23 3922 topology 4077 5792
+> 15 0 24 3922 topology 4077 5793
+> 16 0 24 3922 topology 4092 5793
+> 15 0 23 3922 topology 3998 5794
+> 16 0 23 3922 topology 3999 5794
+> 15 0 24 3922 topology 3999 5795
+> 16 0 24 3922 topology 4092 5795
+> 15 0 23 3922 topology 4058 5796
+> 16 0 23 3922 topology 4059 5796
+> 15 0 24 3922 topology 4059 5797
+> 16 0 24 3922 topology 4092 5797
+> 15 0 23 3922 topology 3938 5798
+> 16 0 23 3922 topology 3939 5798
+> 15 0 24 3922 topology 3939 5799
+> 16 0 24 3922 topology 4092 5799
+> 15 0 23 3922 topology 3983 5800
+> 16 0 23 3922 topology 3984 5800
+> 15 0 24 3922 topology 3984 5801
+> 16 0 24 3922 topology 4092 5801
+> 15 0 23 3922 topology 4043 5802
+> 16 0 23 3922 topology 4044 5802
+> 15 0 24 3922 topology 4044 5803
+> 16 0 24 3922 topology 4092 5803
+> 15 0 23 3922 topology 3965 5804
+> 16 0 23 3922 topology 3966 5804
+> 15 0 24 3922 topology 3966 5805
+> 16 0 24 3922 topology 4092 5805
+> 15 0 23 3922 topology 4025 5806
+> 16 0 23 3922 topology 4026 5806
+> 15 0 24 3922 topology 4026 5807
+> 16 0 24 3922 topology 4092 5807
+> 15 0 23 3922 topology 4085 5808
+> 16 0 23 3922 topology 4086 5808
+> 15 0 24 3922 topology 4086 5809
+> 16 0 24 3922 topology 4092 5809
+> 15 0 23 3922 topology 4007 5810
+> 16 0 23 3922 topology 4008 5810
+> 15 0 24 3922 topology 4008 5811
+> 16 0 24 3922 topology 4092 5811
+> 15 0 23 3922 topology 4067 5812
+> 16 0 23 3922 topology 4068 5812
+> 15 0 24 3922 topology 4068 5813
+> 16 0 24 3922 topology 4092 5813
+> 15 0 23 3922 topology 3923 5814
+> 16 0 23 3922 topology 3924 5814
+> 15 0 24 3922 topology 3924 5815
+> 16 0 24 3922 topology 4092 5815
+> 15 0 23 3922 topology 3947 5816
+> 16 0 23 3922 topology 3948 5816
+> 15 0 24 3922 topology 3948 5817
+> 16 0 24 3922 topology 4092 5817
+> 15 0 23 3922 topology 3950 5818
+> 16 0 23 3922 topology 3951 5818
+> 15 0 24 3922 topology 3951 5819
+> 16 0 24 3922 topology 4092 5819
+> 15 0 23 3922 topology 4010 5820
+> 16 0 23 3922 topology 4011 5820
+> 15 0 24 3922 topology 4011 5821
+> 16 0 24 3922 topology 4092 5821
+> 15 0 23 3922 topology 4070 5822
+> 16 0 23 3922 topology 4071 5822
+> 15 0 24 3922 topology 4071 5823
+> 16 0 24 3922 topology 4092 5823
+> 15 0 23 3922 topology 3992 5824
+> 16 0 23 3922 topology 3993 5824
+> 15 0 24 3922 topology 3993 5825
+> 16 0 24 3922 topology 4092 5825
+> 15 0 23 3922 topology 4052 5826
+> 16 0 23 3922 topology 4053 5826
+> 15 0 24 3922 topology 4053 5827
+> 16 0 24 3922 topology 4092 5827
+> 15 0 23 3922 topology 3974 5828
+> 16 0 23 3922 topology 3975 5828
+> 15 0 24 3922 topology 3975 5829
+> 16 0 24 3922 topology 4092 5829
+> 15 0 23 3922 topology 4034 5830
+> 16 0 23 3922 topology 4035 5830
+> 15 0 24 3922 topology 4035 5831
+> 16 0 24 3922 topology 4092 5831
+> 15 0 23 3922 topology 3932 5832
+> 16 0 23 3922 topology 3933 5832
+> 15 0 24 3922 topology 3933 5833
+> 16 0 24 3922 topology 4092 5833
+> 15 0 23 3922 topology 3959 5834
+> 16 0 23 3922 topology 3960 5834
+> 15 0 24 3922 topology 3960 5835
+> 16 0 24 3922 topology 4092 5835
+> 15 0 23 3922 topology 4019 5836
+> 16 0 23 3922 topology 4020 5836
+> 15 0 24 3922 topology 4020 5837
+> 16 0 24 3922 topology 4092 5837
+> 15 0 23 3922 topology 4079 5838
+> 16 0 23 3922 topology 4080 5838
+> 15 0 24 3922 topology 4080 5839
+> 16 0 24 3922 topology 4092 5839
+> 15 0 23 3922 topology 4001 5840
+> 16 0 23 3922 topology 4002 5840
+> 15 0 24 3922 topology 4002 5841
+> 16 0 24 3922 topology 4092 5841
+> 15 0 23 3922 topology 4061 5842
+> 16 0 23 3922 topology 4062 5842
+> 15 0 24 3922 topology 4062 5843
+> 16 0 24 3922 topology 4092 5843
+> 15 0 23 3922 topology 3941 5844
+> 16 0 23 3922 topology 3942 5844
+> 15 0 24 3922 topology 3942 5845
+> 16 0 24 3922 topology 4092 5845
+> 15 0 23 3922 topology 3986 5846
+> 16 0 23 3922 topology 3987 5846
+> 15 0 24 3922 topology 3987 5847
+> 16 0 24 3922 topology 4092 5847
+> 15 0 23 3922 topology 4046 5848
+> 16 0 23 3922 topology 4047 5848
+> 15 0 24 3922 topology 4047 5849
+> 16 0 24 3922 topology 4092 5849
+> 15 0 23 3922 topology 3968 5850
+> 16 0 23 3922 topology 3969 5850
+> 15 0 24 3922 topology 3969 5851
+> 16 0 24 3922 topology 4092 5851
+> 15 0 23 3922 topology 4028 5852
+> 16 0 23 3922 topology 4029 5852
+> 15 0 24 3922 topology 4029 5853
+> 16 0 24 3922 topology 4092 5853
+> 15 0 23 3922 topology 4088 5854
+> 16 0 23 3922 topology 4089 5854
+> 15 0 24 3922 topology 4089 5855
+> 16 0 24 3922 topology 4092 5855
+> 15 0 23 3922 topology 3926 5856
+> 16 0 23 3922 topology 3927 5856
+> 15 0 24 3922 topology 3927 5857
+> 16 0 24 3922 topology 4092 5857
+> 15 0 23 3922 topology 3953 5858
+> 16 0 23 3922 topology 3954 5858
+> 15 0 24 3922 topology 3954 5859
+> 16 0 24 3922 topology 4092 5859
+> 15 0 23 3922 topology 4013 5860
+> 16 0 23 3922 topology 4014 5860
+> 15 0 24 3922 topology 4014 5861
+> 16 0 24 3922 topology 4092 5861
+> 15 0 23 3922 topology 4073 5862
+> 16 0 23 3922 topology 4074 5862
+> 15 0 24 3922 topology 4074 5863
+> 16 0 24 3922 topology 4092 5863
+> 15 0 23 3922 topology 3995 5864
+> 16 0 23 3922 topology 3996 5864
+> 15 0 24 3922 topology 3996 5865
+> 16 0 24 3922 topology 4092 5865
+> 15 0 23 3922 topology 4055 5866
+> 16 0 23 3922 topology 4056 5866
+> 15 0 24 3922 topology 4056 5867
+> 16 0 24 3922 topology 4092 5867
+> 15 0 23 3922 topology 3977 5868
+> 16 0 23 3922 topology 3978 5868
+> 15 0 24 3922 topology 3978 5869
+> 16 0 24 3922 topology 4092 5869
+> 15 0 23 3922 topology 4037 5870
+> 16 0 23 3922 topology 4038 5870
+> 15 0 24 3922 topology 4038 5871
+> 16 0 24 3922 topology 4092 5871
+> 15 0 23 3922 topology 3935 5872
+> 16 0 23 3922 topology 3936 5872
+> 15 0 24 3922 topology 3936 5873
+> 16 0 24 3922 topology 4092 5873
+> 15 0 23 3922 topology 3980 5874
+> 16 0 23 3922 topology 3981 5874
+> 15 0 24 3922 topology 3981 5875
+> 16 0 24 3922 topology 4092 5875
+> 15 0 23 3922 topology 4040 5876
+> 16 0 23 3922 topology 4041 5876
+> 15 0 24 3922 topology 4041 5877
+> 16 0 24 3922 topology 4092 5877
+> 15 0 23 3922 topology 3962 5878
+> 16 0 23 3922 topology 3963 5878
+> 15 0 24 3922 topology 3963 5879
+> 16 0 24 3922 topology 4092 5879
+> 15 0 23 3922 topology 4022 5880
+> 16 0 23 3922 topology 4023 5880
+> 15 0 24 3922 topology 4023 5881
+> 16 0 24 3922 topology 4092 5881
+> 15 0 23 3922 topology 4082 5882
+> 16 0 23 3922 topology 4083 5882
+> 15 0 24 3922 topology 4083 5883
+> 16 0 24 3922 topology 4092 5883
+> 15 0 23 3922 topology 4004 5884
+> 16 0 23 3922 topology 4005 5884
+> 15 0 24 3922 topology 4005 5885
+> 16 0 24 3922 topology 4092 5885
+> 15 0 23 3922 topology 4064 5886
+> 16 0 23 3922 topology 4065 5886
+> 15 0 24 3922 topology 4065 5887
+> 16 0 24 3922 topology 4092 5887
+> 15 0 23 3922 topology 3944 5888
+> 16 0 23 3922 topology 3945 5888
+> 15 0 24 3922 topology 3945 5889
+> 16 0 24 3922 topology 4092 5889
+> 15 0 23 4248 topology 4273 5890
+> 16 0 23 4248 topology 4274 5890
+> 15 0 24 4248 topology 4274 5891
+> 16 0 24 4248 topology 4385 5891
+> 15 0 24 4248 topology 4385 5892
+> 16 0 24 4248 topology 4281 5892
+> 15 0 25 4248 topology 4281 5893
+> 16 0 25 4248 topology 4279 5893
+> 15 0 24 4248 topology 4385 5894
+> 16 0 24 4248 topology 4311 5894
+> 15 0 25 4248 topology 4311 5895
+> 16 0 25 4248 topology 4309 5895
+> 15 0 24 4248 topology 4385 5896
+> 16 0 24 4248 topology 4341 5896
+> 15 0 25 4248 topology 4341 5897
+> 16 0 25 4248 topology 4339 5897
+> 15 0 24 4248 topology 4385 5898
+> 16 0 24 4248 topology 4371 5898
+> 15 0 25 4248 topology 4371 5899
+> 16 0 25 4248 topology 4369 5899
+> 15 0 24 4248 topology 4385 5900
+> 16 0 24 4248 topology 4293 5900
+> 15 0 25 4248 topology 4293 5901
+> 16 0 25 4248 topology 4291 5901
+> 15 0 24 4248 topology 4385 5902
+> 16 0 24 4248 topology 4323 5902
+> 15 0 25 4248 topology 4323 5903
+> 16 0 25 4248 topology 4321 5903
+> 15 0 24 4248 topology 4385 5904
+> 16 0 24 4248 topology 4353 5904
+> 15 0 25 4248 topology 4353 5905
+> 16 0 25 4248 topology 4351 5905
+> 15 0 24 4248 topology 4385 5906
+> 16 0 24 4248 topology 4383 5906
+> 15 0 25 4248 topology 4383 5907
+> 16 0 25 4248 topology 4381 5907
+> 15 0 24 4248 topology 4385 5908
+> 16 0 24 4248 topology 4305 5908
+> 15 0 25 4248 topology 4305 5909
+> 16 0 25 4248 topology 4303 5909
+> 15 0 24 4248 topology 4385 5910
+> 16 0 24 4248 topology 4335 5910
+> 15 0 25 4248 topology 4335 5911
+> 16 0 25 4248 topology 4333 5911
+> 15 0 24 4248 topology 4385 5912
+> 16 0 24 4248 topology 4365 5912
+> 15 0 25 4248 topology 4365 5913
+> 16 0 25 4248 topology 4363 5913
+> 15 0 24 4248 topology 4385 5914
+> 16 0 24 4248 topology 4260 5914
+> 15 0 25 4248 topology 4260 5915
+> 16 0 25 4248 topology 4258 5915
+> 15 0 24 4248 topology 4385 5916
+> 16 0 24 4248 topology 4272 5916
+> 15 0 25 4248 topology 4272 5917
+> 16 0 25 4248 topology 4270 5917
+> 15 0 24 4248 topology 4385 5918
+> 16 0 24 4248 topology 4278 5918
+> 15 0 25 4248 topology 4278 5919
+> 16 0 25 4248 topology 4276 5919
+> 15 0 24 4248 topology 4385 5920
+> 16 0 24 4248 topology 4308 5920
+> 15 0 25 4248 topology 4308 5921
+> 16 0 25 4248 topology 4306 5921
+> 15 0 24 4248 topology 4385 5922
+> 16 0 24 4248 topology 4338 5922
+> 15 0 25 4248 topology 4338 5923
+> 16 0 25 4248 topology 4336 5923
+> 15 0 24 4248 topology 4385 5924
+> 16 0 24 4248 topology 4368 5924
+> 15 0 25 4248 topology 4368 5925
+> 16 0 25 4248 topology 4366 5925
+> 15 0 24 4248 topology 4385 5926
+> 16 0 24 4248 topology 4290 5926
+> 15 0 25 4248 topology 4290 5927
+> 16 0 25 4248 topology 4288 5927
+> 15 0 24 4248 topology 4385 5928
+> 16 0 24 4248 topology 4320 5928
+> 15 0 25 4248 topology 4320 5929
+> 16 0 25 4248 topology 4318 5929
+> 15 0 24 4248 topology 4385 5930
+> 16 0 24 4248 topology 4350 5930
+> 15 0 25 4248 topology 4350 5931
+> 16 0 25 4248 topology 4348 5931
+> 15 0 24 4248 topology 4385 5932
+> 16 0 24 4248 topology 4380 5932
+> 15 0 25 4248 topology 4380 5933
+> 16 0 25 4248 topology 4378 5933
+> 15 0 24 4248 topology 4385 5934
+> 16 0 24 4248 topology 4302 5934
+> 15 0 25 4248 topology 4302 5935
+> 16 0 25 4248 topology 4300 5935
+> 15 0 24 4248 topology 4385 5936
+> 16 0 24 4248 topology 4332 5936
+> 15 0 25 4248 topology 4332 5937
+> 16 0 25 4248 topology 4330 5937
+> 15 0 24 4248 topology 4385 5938
+> 16 0 24 4248 topology 4362 5938
+> 15 0 25 4248 topology 4362 5939
+> 16 0 25 4248 topology 4360 5939
+> 15 0 24 4248 topology 4385 5940
+> 16 0 24 4248 topology 4257 5940
+> 15 0 25 4248 topology 4257 5941
+> 16 0 25 4248 topology 4255 5941
+> 15 0 24 4248 topology 4385 5942
+> 16 0 24 4248 topology 4269 5942
+> 15 0 25 4248 topology 4269 5943
+> 16 0 25 4248 topology 4267 5943
+> 15 0 26 4248 topology 4385 5944
+> 16 0 26 4248 topology 4384 5944
+> 15 0 24 4248 topology 4385 5945
+> 16 0 24 4248 topology 4287 5945
+> 15 0 25 4248 topology 4287 5946
+> 16 0 25 4248 topology 4285 5946
+> 15 0 24 4248 topology 4385 5947
+> 16 0 24 4248 topology 4317 5947
+> 15 0 25 4248 topology 4317 5948
+> 16 0 25 4248 topology 4315 5948
+> 15 0 24 4248 topology 4385 5949
+> 16 0 24 4248 topology 4347 5949
+> 15 0 25 4248 topology 4347 5950
+> 16 0 25 4248 topology 4345 5950
+> 15 0 24 4248 topology 4385 5951
+> 16 0 24 4248 topology 4377 5951
+> 15 0 25 4248 topology 4377 5952
+> 16 0 25 4248 topology 4375 5952
+> 15 0 24 4248 topology 4385 5953
+> 16 0 24 4248 topology 4299 5953
+> 15 0 25 4248 topology 4299 5954
+> 16 0 25 4248 topology 4297 5954
+> 15 0 24 4248 topology 4385 5955
+> 16 0 24 4248 topology 4329 5955
+> 15 0 25 4248 topology 4329 5956
+> 16 0 25 4248 topology 4327 5956
+> 15 0 24 4248 topology 4385 5957
+> 16 0 24 4248 topology 4359 5957
+> 15 0 25 4248 topology 4359 5958
+> 16 0 25 4248 topology 4357 5958
+> 15 0 24 4248 topology 4385 5959
+> 16 0 24 4248 topology 4254 5959
+> 15 0 25 4248 topology 4254 5960
+> 16 0 25 4248 topology 4252 5960
+> 15 0 24 4248 topology 4385 5961
+> 16 0 24 4248 topology 4266 5961
+> 15 0 25 4248 topology 4266 5962
+> 16 0 25 4248 topology 4264 5962
+> 15 0 24 4248 topology 4385 5963
+> 16 0 24 4248 topology 4284 5963
+> 15 0 25 4248 topology 4284 5964
+> 16 0 25 4248 topology 4282 5964
+> 15 0 24 4248 topology 4385 5965
+> 16 0 24 4248 topology 4314 5965
+> 15 0 25 4248 topology 4314 5966
+> 16 0 25 4248 topology 4312 5966
+> 15 0 24 4248 topology 4385 5967
+> 16 0 24 4248 topology 4344 5967
+> 15 0 25 4248 topology 4344 5968
+> 16 0 25 4248 topology 4342 5968
+> 15 0 24 4248 topology 4385 5969
+> 16 0 24 4248 topology 4374 5969
+> 15 0 25 4248 topology 4374 5970
+> 16 0 25 4248 topology 4372 5970
+> 15 0 24 4248 topology 4385 5971
+> 16 0 24 4248 topology 4296 5971
+> 15 0 25 4248 topology 4296 5972
+> 16 0 25 4248 topology 4294 5972
+> 15 0 24 4248 topology 4385 5973
+> 16 0 24 4248 topology 4326 5973
+> 15 0 25 4248 topology 4326 5974
+> 16 0 25 4248 topology 4324 5974
+> 15 0 24 4248 topology 4385 5975
+> 16 0 24 4248 topology 4356 5975
+> 15 0 25 4248 topology 4356 5976
+> 16 0 25 4248 topology 4354 5976
+> 15 0 24 4248 topology 4385 5977
+> 16 0 24 4248 topology 4251 5977
+> 15 0 25 4248 topology 4251 5978
+> 16 0 25 4248 topology 4249 5978
+> 15 0 24 4248 topology 4385 5979
+> 16 0 24 4248 topology 4263 5979
+> 15 0 25 4248 topology 4263 5980
+> 16 0 25 4248 topology 4261 5980
+> 15 0 23 4248 topology 4279 5981
+> 16 0 23 4248 topology 4280 5981
+> 15 0 24 4248 topology 4280 5982
+> 16 0 24 4248 topology 4385 5982
+> 15 0 24 4248 topology 4385 5983
+> 16 0 24 4248 topology 4275 5983
+> 15 0 25 4248 topology 4275 5984
+> 16 0 25 4248 topology 4273 5984
+> 15 0 23 4248 topology 4309 5985
+> 16 0 23 4248 topology 4310 5985
+> 15 0 24 4248 topology 4310 5986
+> 16 0 24 4248 topology 4385 5986
+> 15 0 23 4248 topology 4339 5987
+> 16 0 23 4248 topology 4340 5987
+> 15 0 24 4248 topology 4340 5988
+> 16 0 24 4248 topology 4385 5988
+> 15 0 23 4248 topology 4369 5989
+> 16 0 23 4248 topology 4370 5989
+> 15 0 24 4248 topology 4370 5990
+> 16 0 24 4248 topology 4385 5990
+> 15 0 23 4248 topology 4291 5991
+> 16 0 23 4248 topology 4292 5991
+> 15 0 24 4248 topology 4292 5992
+> 16 0 24 4248 topology 4385 5992
+> 15 0 23 4248 topology 4321 5993
+> 16 0 23 4248 topology 4322 5993
+> 15 0 24 4248 topology 4322 5994
+> 16 0 24 4248 topology 4385 5994
+> 15 0 23 4248 topology 4351 5995
+> 16 0 23 4248 topology 4352 5995
+> 15 0 24 4248 topology 4352 5996
+> 16 0 24 4248 topology 4385 5996
+> 15 0 23 4248 topology 4381 5997
+> 16 0 23 4248 topology 4382 5997
+> 15 0 24 4248 topology 4382 5998
+> 16 0 24 4248 topology 4385 5998
+> 15 0 23 4248 topology 4303 5999
+> 16 0 23 4248 topology 4304 5999
+> 15 0 24 4248 topology 4304 6000
+> 16 0 24 4248 topology 4385 6000
+> 15 0 23 4248 topology 4333 6001
+> 16 0 23 4248 topology 4334 6001
+> 15 0 24 4248 topology 4334 6002
+> 16 0 24 4248 topology 4385 6002
+> 15 0 23 4248 topology 4363 6003
+> 16 0 23 4248 topology 4364 6003
+> 15 0 24 4248 topology 4364 6004
+> 16 0 24 4248 topology 4385 6004
+> 15 0 23 4248 topology 4258 6005
+> 16 0 23 4248 topology 4259 6005
+> 15 0 24 4248 topology 4259 6006
+> 16 0 24 4248 topology 4385 6006
+> 15 0 23 4248 topology 4270 6007
+> 16 0 23 4248 topology 4271 6007
+> 15 0 24 4248 topology 4271 6008
+> 16 0 24 4248 topology 4385 6008
+> 15 0 23 4248 topology 4276 6009
+> 16 0 23 4248 topology 4277 6009
+> 15 0 24 4248 topology 4277 6010
+> 16 0 24 4248 topology 4385 6010
+> 15 0 23 4248 topology 4306 6011
+> 16 0 23 4248 topology 4307 6011
+> 15 0 24 4248 topology 4307 6012
+> 16 0 24 4248 topology 4385 6012
+> 15 0 23 4248 topology 4336 6013
+> 16 0 23 4248 topology 4337 6013
+> 15 0 24 4248 topology 4337 6014
+> 16 0 24 4248 topology 4385 6014
+> 15 0 23 4248 topology 4366 6015
+> 16 0 23 4248 topology 4367 6015
+> 15 0 24 4248 topology 4367 6016
+> 16 0 24 4248 topology 4385 6016
+> 15 0 23 4248 topology 4288 6017
+> 16 0 23 4248 topology 4289 6017
+> 15 0 24 4248 topology 4289 6018
+> 16 0 24 4248 topology 4385 6018
+> 15 0 23 4248 topology 4318 6019
+> 16 0 23 4248 topology 4319 6019
+> 15 0 24 4248 topology 4319 6020
+> 16 0 24 4248 topology 4385 6020
+> 15 0 23 4248 topology 4348 6021
+> 16 0 23 4248 topology 4349 6021
+> 15 0 24 4248 topology 4349 6022
+> 16 0 24 4248 topology 4385 6022
+> 15 0 23 4248 topology 4378 6023
+> 16 0 23 4248 topology 4379 6023
+> 15 0 24 4248 topology 4379 6024
+> 16 0 24 4248 topology 4385 6024
+> 15 0 23 4248 topology 4300 6025
+> 16 0 23 4248 topology 4301 6025
+> 15 0 24 4248 topology 4301 6026
+> 16 0 24 4248 topology 4385 6026
+> 15 0 23 4248 topology 4330 6027
+> 16 0 23 4248 topology 4331 6027
+> 15 0 24 4248 topology 4331 6028
+> 16 0 24 4248 topology 4385 6028
+> 15 0 23 4248 topology 4360 6029
+> 16 0 23 4248 topology 4361 6029
+> 15 0 24 4248 topology 4361 6030
+> 16 0 24 4248 topology 4385 6030
+> 15 0 23 4248 topology 4255 6031
+> 16 0 23 4248 topology 4256 6031
+> 15 0 24 4248 topology 4256 6032
+> 16 0 24 4248 topology 4385 6032
+> 15 0 23 4248 topology 4267 6033
+> 16 0 23 4248 topology 4268 6033
+> 15 0 24 4248 topology 4268 6034
+> 16 0 24 4248 topology 4385 6034
+> 15 0 23 4248 topology 4285 6035
+> 16 0 23 4248 topology 4286 6035
+> 15 0 24 4248 topology 4286 6036
+> 16 0 24 4248 topology 4385 6036
+> 15 0 23 4248 topology 4315 6037
+> 16 0 23 4248 topology 4316 6037
+> 15 0 24 4248 topology 4316 6038
+> 16 0 24 4248 topology 4385 6038
+> 15 0 23 4248 topology 4345 6039
+> 16 0 23 4248 topology 4346 6039
+> 15 0 24 4248 topology 4346 6040
+> 16 0 24 4248 topology 4385 6040
+> 15 0 23 4248 topology 4375 6041
+> 16 0 23 4248 topology 4376 6041
+> 15 0 24 4248 topology 4376 6042
+> 16 0 24 4248 topology 4385 6042
+> 15 0 23 4248 topology 4297 6043
+> 16 0 23 4248 topology 4298 6043
+> 15 0 24 4248 topology 4298 6044
+> 16 0 24 4248 topology 4385 6044
+> 15 0 23 4248 topology 4327 6045
+> 16 0 23 4248 topology 4328 6045
+> 15 0 24 4248 topology 4328 6046
+> 16 0 24 4248 topology 4385 6046
+> 15 0 23 4248 topology 4357 6047
+> 16 0 23 4248 topology 4358 6047
+> 15 0 24 4248 topology 4358 6048
+> 16 0 24 4248 topology 4385 6048
+> 15 0 23 4248 topology 4252 6049
+> 16 0 23 4248 topology 4253 6049
+> 15 0 24 4248 topology 4253 6050
+> 16 0 24 4248 topology 4385 6050
+> 15 0 23 4248 topology 4264 6051
+> 16 0 23 4248 topology 4265 6051
+> 15 0 24 4248 topology 4265 6052
+> 16 0 24 4248 topology 4385 6052
+> 15 0 23 4248 topology 4282 6053
+> 16 0 23 4248 topology 4283 6053
+> 15 0 24 4248 topology 4283 6054
+> 16 0 24 4248 topology 4385 6054
+> 15 0 23 4248 topology 4312 6055
+> 16 0 23 4248 topology 4313 6055
+> 15 0 24 4248 topology 4313 6056
+> 16 0 24 4248 topology 4385 6056
+> 15 0 23 4248 topology 4342 6057
+> 16 0 23 4248 topology 4343 6057
+> 15 0 24 4248 topology 4343 6058
+> 16 0 24 4248 topology 4385 6058
+> 15 0 23 4248 topology 4372 6059
+> 16 0 23 4248 topology 4373 6059
+> 15 0 24 4248 topology 4373 6060
+> 16 0 24 4248 topology 4385 6060
+> 15 0 23 4248 topology 4294 6061
+> 16 0 23 4248 topology 4295 6061
+> 15 0 24 4248 topology 4295 6062
+> 16 0 24 4248 topology 4385 6062
+> 15 0 23 4248 topology 4324 6063
+> 16 0 23 4248 topology 4325 6063
+> 15 0 24 4248 topology 4325 6064
+> 16 0 24 4248 topology 4385 6064
+> 15 0 23 4248 topology 4354 6065
+> 16 0 23 4248 topology 4355 6065
+> 15 0 24 4248 topology 4355 6066
+> 16 0 24 4248 topology 4385 6066
+> 15 0 23 4248 topology 4249 6067
+> 16 0 23 4248 topology 4250 6067
+> 15 0 24 4248 topology 4250 6068
+> 16 0 24 4248 topology 4385 6068
+> 15 0 23 4248 topology 4261 6069
+> 16 0 23 4248 topology 4262 6069
+> 15 0 24 4248 topology 4262 6070
+> 16 0 24 4248 topology 4385 6070
+> 15 0 23 4094 topology 4095 6071
+> 16 0 23 4094 topology 4096 6071
+> 15 0 24 4094 topology 4096 6072
+> 16 0 24 4094 topology 4246 6072
+> 15 0 24 4094 topology 4246 6073
+> 16 0 24 4094 topology 4109 6073
+> 15 0 25 4094 topology 4109 6074
+> 16 0 25 4094 topology 4107 6074
+> 15 0 24 4094 topology 4246 6075
+> 16 0 24 4094 topology 4121 6075
+> 15 0 25 4094 topology 4121 6076
+> 16 0 25 4094 topology 4119 6076
+> 15 0 24 4094 topology 4246 6077
+> 16 0 24 4094 topology 4130 6077
+> 15 0 25 4094 topology 4130 6078
+> 16 0 25 4094 topology 4128 6078
+> 15 0 24 4094 topology 4246 6079
+> 16 0 24 4094 topology 4160 6079
+> 15 0 25 4094 topology 4160 6080
+> 16 0 25 4094 topology 4158 6080
+> 15 0 24 4094 topology 4246 6081
+> 16 0 24 4094 topology 4190 6081
+> 15 0 25 4094 topology 4190 6082
+> 16 0 25 4094 topology 4188 6082
+> 15 0 24 4094 topology 4246 6083
+> 16 0 24 4094 topology 4220 6083
+> 15 0 25 4094 topology 4220 6084
+> 16 0 25 4094 topology 4218 6084
+> 15 0 24 4094 topology 4246 6085
+> 16 0 24 4094 topology 4142 6085
+> 15 0 25 4094 topology 4142 6086
+> 16 0 25 4094 topology 4140 6086
+> 15 0 24 4094 topology 4246 6087
+> 16 0 24 4094 topology 4172 6087
+> 15 0 25 4094 topology 4172 6088
+> 16 0 25 4094 topology 4170 6088
+> 15 0 24 4094 topology 4246 6089
+> 16 0 24 4094 topology 4202 6089
+> 15 0 25 4094 topology 4202 6090
+> 16 0 25 4094 topology 4200 6090
+> 15 0 24 4094 topology 4246 6091
+> 16 0 24 4094 topology 4232 6091
+> 15 0 25 4094 topology 4232 6092
+> 16 0 25 4094 topology 4230 6092
+> 15 0 24 4094 topology 4246 6093
+> 16 0 24 4094 topology 4106 6093
+> 15 0 25 4094 topology 4106 6094
+> 16 0 25 4094 topology 4104 6094
+> 15 0 24 4094 topology 4246 6095
+> 16 0 24 4094 topology 4118 6095
+> 15 0 25 4094 topology 4118 6096
+> 16 0 25 4094 topology 4116 6096
+> 15 0 24 4094 topology 4246 6097
+> 16 0 24 4094 topology 4127 6097
+> 15 0 25 4094 topology 4127 6098
+> 16 0 25 4094 topology 4125 6098
+> 15 0 24 4094 topology 4246 6099
+> 16 0 24 4094 topology 4157 6099
+> 15 0 25 4094 topology 4157 6100
+> 16 0 25 4094 topology 4155 6100
+> 15 0 24 4094 topology 4246 6101
+> 16 0 24 4094 topology 4187 6101
+> 15 0 25 4094 topology 4187 6102
+> 16 0 25 4094 topology 4185 6102
+> 15 0 24 4094 topology 4246 6103
+> 16 0 24 4094 topology 4217 6103
+> 15 0 25 4094 topology 4217 6104
+> 16 0 25 4094 topology 4215 6104
+> 15 0 24 4094 topology 4246 6105
+> 16 0 24 4094 topology 4139 6105
+> 15 0 25 4094 topology 4139 6106
+> 16 0 25 4094 topology 4137 6106
+> 15 0 24 4094 topology 4246 6107
+> 16 0 24 4094 topology 4169 6107
+> 15 0 25 4094 topology 4169 6108
+> 16 0 25 4094 topology 4167 6108
+> 15 0 24 4094 topology 4246 6109
+> 16 0 24 4094 topology 4199 6109
+> 15 0 25 4094 topology 4199 6110
+> 16 0 25 4094 topology 4197 6110
+> 15 0 24 4094 topology 4246 6111
+> 16 0 24 4094 topology 4229 6111
+> 15 0 25 4094 topology 4229 6112
+> 16 0 25 4094 topology 4227 6112
+> 15 0 24 4094 topology 4246 6113
+> 16 0 24 4094 topology 4151 6113
+> 15 0 25 4094 topology 4151 6114
+> 16 0 25 4094 topology 4149 6114
+> 15 0 24 4094 topology 4246 6115
+> 16 0 24 4094 topology 4181 6115
+> 15 0 25 4094 topology 4181 6116
+> 16 0 25 4094 topology 4179 6116
+> 15 0 24 4094 topology 4246 6117
+> 16 0 24 4094 topology 4211 6117
+> 15 0 25 4094 topology 4211 6118
+> 16 0 25 4094 topology 4209 6118
+> 15 0 24 4094 topology 4246 6119
+> 16 0 24 4094 topology 4241 6119
+> 15 0 25 4094 topology 4241 6120
+> 16 0 25 4094 topology 4239 6120
+> 15 0 24 4094 topology 4246 6121
+> 16 0 24 4094 topology 4103 6121
+> 15 0 25 4094 topology 4103 6122
+> 16 0 25 4094 topology 4101 6122
+> 15 0 24 4094 topology 4246 6123
+> 16 0 24 4094 topology 4115 6123
+> 15 0 25 4094 topology 4115 6124
+> 16 0 25 4094 topology 4113 6124
+> 15 0 24 4094 topology 4246 6125
+> 16 0 24 4094 topology 4124 6125
+> 15 0 25 4094 topology 4124 6126
+> 16 0 25 4094 topology 4122 6126
+> 15 0 26 4094 topology 4246 6127
+> 16 0 26 4094 topology 4245 6127
+> 15 0 24 4094 topology 4246 6128
+> 16 0 24 4094 topology 4154 6128
+> 15 0 25 4094 topology 4154 6129
+> 16 0 25 4094 topology 4152 6129
+> 15 0 24 4094 topology 4246 6130
+> 16 0 24 4094 topology 4184 6130
+> 15 0 25 4094 topology 4184 6131
+> 16 0 25 4094 topology 4182 6131
+> 15 0 24 4094 topology 4246 6132
+> 16 0 24 4094 topology 4214 6132
+> 15 0 25 4094 topology 4214 6133
+> 16 0 25 4094 topology 4212 6133
+> 15 0 24 4094 topology 4246 6134
+> 16 0 24 4094 topology 4136 6134
+> 15 0 25 4094 topology 4136 6135
+> 16 0 25 4094 topology 4134 6135
+> 15 0 24 4094 topology 4246 6136
+> 16 0 24 4094 topology 4244 6136
+> 15 0 25 4094 topology 4244 6137
+> 16 0 25 4094 topology 4242 6137
+> 15 0 24 4094 topology 4246 6138
+> 16 0 24 4094 topology 4166 6138
+> 15 0 25 4094 topology 4166 6139
+> 16 0 25 4094 topology 4164 6139
+> 15 0 24 4094 topology 4246 6140
+> 16 0 24 4094 topology 4196 6140
+> 15 0 25 4094 topology 4196 6141
+> 16 0 25 4094 topology 4194 6141
+> 15 0 24 4094 topology 4246 6142
+> 16 0 24 4094 topology 4226 6142
+> 15 0 25 4094 topology 4226 6143
+> 16 0 25 4094 topology 4224 6143
+> 15 0 24 4094 topology 4246 6144
+> 16 0 24 4094 topology 4148 6144
+> 15 0 25 4094 topology 4148 6145
+> 16 0 25 4094 topology 4146 6145
+> 15 0 24 4094 topology 4246 6146
+> 16 0 24 4094 topology 4178 6146
+> 15 0 25 4094 topology 4178 6147
+> 16 0 25 4094 topology 4176 6147
+> 15 0 24 4094 topology 4246 6148
+> 16 0 24 4094 topology 4208 6148
+> 15 0 25 4094 topology 4208 6149
+> 16 0 25 4094 topology 4206 6149
+> 15 0 24 4094 topology 4246 6150
+> 16 0 24 4094 topology 4238 6150
+> 15 0 25 4094 topology 4238 6151
+> 16 0 25 4094 topology 4236 6151
+> 15 0 24 4094 topology 4246 6152
+> 16 0 24 4094 topology 4100 6152
+> 15 0 25 4094 topology 4100 6153
+> 16 0 25 4094 topology 4098 6153
+> 15 0 24 4094 topology 4246 6154
+> 16 0 24 4094 topology 4112 6154
+> 15 0 25 4094 topology 4112 6155
+> 16 0 25 4094 topology 4110 6155
+> 15 0 24 4094 topology 4246 6156
+> 16 0 24 4094 topology 4133 6156
+> 15 0 25 4094 topology 4133 6157
+> 16 0 25 4094 topology 4131 6157
+> 15 0 24 4094 topology 4246 6158
+> 16 0 24 4094 topology 4163 6158
+> 15 0 25 4094 topology 4163 6159
+> 16 0 25 4094 topology 4161 6159
+> 15 0 24 4094 topology 4246 6160
+> 16 0 24 4094 topology 4193 6160
+> 15 0 25 4094 topology 4193 6161
+> 16 0 25 4094 topology 4191 6161
+> 15 0 24 4094 topology 4246 6162
+> 16 0 24 4094 topology 4223 6162
+> 15 0 25 4094 topology 4223 6163
+> 16 0 25 4094 topology 4221 6163
+> 15 0 24 4094 topology 4246 6164
+> 16 0 24 4094 topology 4145 6164
+> 15 0 25 4094 topology 4145 6165
+> 16 0 25 4094 topology 4143 6165
+> 15 0 24 4094 topology 4246 6166
+> 16 0 24 4094 topology 4175 6166
+> 15 0 25 4094 topology 4175 6167
+> 16 0 25 4094 topology 4173 6167
+> 15 0 24 4094 topology 4246 6168
+> 16 0 24 4094 topology 4205 6168
+> 15 0 25 4094 topology 4205 6169
+> 16 0 25 4094 topology 4203 6169
+> 15 0 24 4094 topology 4246 6170
+> 16 0 24 4094 topology 4235 6170
+> 15 0 25 4094 topology 4235 6171
+> 16 0 25 4094 topology 4233 6171
+> 15 0 23 4094 topology 4107 6172
+> 16 0 23 4094 topology 4108 6172
+> 15 0 24 4094 topology 4108 6173
+> 16 0 24 4094 topology 4246 6173
+> 15 0 24 4094 topology 4246 6174
+> 16 0 24 4094 topology 4097 6174
+> 15 0 25 4094 topology 4097 6175
+> 16 0 25 4094 topology 4095 6175
+> 15 0 23 4094 topology 4119 6176
+> 16 0 23 4094 topology 4120 6176
+> 15 0 24 4094 topology 4120 6177
+> 16 0 24 4094 topology 4246 6177
+> 15 0 23 4094 topology 4128 6178
+> 16 0 23 4094 topology 4129 6178
+> 15 0 24 4094 topology 4129 6179
+> 16 0 24 4094 topology 4246 6179
+> 15 0 23 4094 topology 4158 6180
+> 16 0 23 4094 topology 4159 6180
+> 15 0 24 4094 topology 4159 6181
+> 16 0 24 4094 topology 4246 6181
+> 15 0 23 4094 topology 4188 6182
+> 16 0 23 4094 topology 4189 6182
+> 15 0 24 4094 topology 4189 6183
+> 16 0 24 4094 topology 4246 6183
+> 15 0 23 4094 topology 4218 6184
+> 16 0 23 4094 topology 4219 6184
+> 15 0 24 4094 topology 4219 6185
+> 16 0 24 4094 topology 4246 6185
+> 15 0 23 4094 topology 4140 6186
+> 16 0 23 4094 topology 4141 6186
+> 15 0 24 4094 topology 4141 6187
+> 16 0 24 4094 topology 4246 6187
+> 15 0 23 4094 topology 4170 6188
+> 16 0 23 4094 topology 4171 6188
+> 15 0 24 4094 topology 4171 6189
+> 16 0 24 4094 topology 4246 6189
+> 15 0 23 4094 topology 4200 6190
+> 16 0 23 4094 topology 4201 6190
+> 15 0 24 4094 topology 4201 6191
+> 16 0 24 4094 topology 4246 6191
+> 15 0 23 4094 topology 4230 6192
+> 16 0 23 4094 topology 4231 6192
+> 15 0 24 4094 topology 4231 6193
+> 16 0 24 4094 topology 4246 6193
+> 15 0 23 4094 topology 4104 6194
+> 16 0 23 4094 topology 4105 6194
+> 15 0 24 4094 topology 4105 6195
+> 16 0 24 4094 topology 4246 6195
+> 15 0 23 4094 topology 4116 6196
+> 16 0 23 4094 topology 4117 6196
+> 15 0 24 4094 topology 4117 6197
+> 16 0 24 4094 topology 4246 6197
+> 15 0 23 4094 topology 4125 6198
+> 16 0 23 4094 topology 4126 6198
+> 15 0 24 4094 topology 4126 6199
+> 16 0 24 4094 topology 4246 6199
+> 15 0 23 4094 topology 4155 6200
+> 16 0 23 4094 topology 4156 6200
+> 15 0 24 4094 topology 4156 6201
+> 16 0 24 4094 topology 4246 6201
+> 15 0 23 4094 topology 4185 6202
+> 16 0 23 4094 topology 4186 6202
+> 15 0 24 4094 topology 4186 6203
+> 16 0 24 4094 topology 4246 6203
+> 15 0 23 4094 topology 4215 6204
+> 16 0 23 4094 topology 4216 6204
+> 15 0 24 4094 topology 4216 6205
+> 16 0 24 4094 topology 4246 6205
+> 15 0 23 4094 topology 4137 6206
+> 16 0 23 4094 topology 4138 6206
+> 15 0 24 4094 topology 4138 6207
+> 16 0 24 4094 topology 4246 6207
+> 15 0 23 4094 topology 4167 6208
+> 16 0 23 4094 topology 4168 6208
+> 15 0 24 4094 topology 4168 6209
+> 16 0 24 4094 topology 4246 6209
+> 15 0 23 4094 topology 4197 6210
+> 16 0 23 4094 topology 4198 6210
+> 15 0 24 4094 topology 4198 6211
+> 16 0 24 4094 topology 4246 6211
+> 15 0 23 4094 topology 4227 6212
+> 16 0 23 4094 topology 4228 6212
+> 15 0 24 4094 topology 4228 6213
+> 16 0 24 4094 topology 4246 6213
+> 15 0 23 4094 topology 4149 6214
+> 16 0 23 4094 topology 4150 6214
+> 15 0 24 4094 topology 4150 6215
+> 16 0 24 4094 topology 4246 6215
+> 15 0 23 4094 topology 4179 6216
+> 16 0 23 4094 topology 4180 6216
+> 15 0 24 4094 topology 4180 6217
+> 16 0 24 4094 topology 4246 6217
+> 15 0 23 4094 topology 4209 6218
+> 16 0 23 4094 topology 4210 6218
+> 15 0 24 4094 topology 4210 6219
+> 16 0 24 4094 topology 4246 6219
+> 15 0 23 4094 topology 4239 6220
+> 16 0 23 4094 topology 4240 6220
+> 15 0 24 4094 topology 4240 6221
+> 16 0 24 4094 topology 4246 6221
+> 15 0 23 4094 topology 4101 6222
+> 16 0 23 4094 topology 4102 6222
+> 15 0 24 4094 topology 4102 6223
+> 16 0 24 4094 topology 4246 6223
+> 15 0 23 4094 topology 4113 6224
+> 16 0 23 4094 topology 4114 6224
+> 15 0 24 4094 topology 4114 6225
+> 16 0 24 4094 topology 4246 6225
+> 15 0 23 4094 topology 4122 6226
+> 16 0 23 4094 topology 4123 6226
+> 15 0 24 4094 topology 4123 6227
+> 16 0 24 4094 topology 4246 6227
+> 15 0 23 4094 topology 4152 6228
+> 16 0 23 4094 topology 4153 6228
+> 15 0 24 4094 topology 4153 6229
+> 16 0 24 4094 topology 4246 6229
+> 15 0 23 4094 topology 4182 6230
+> 16 0 23 4094 topology 4183 6230
+> 15 0 24 4094 topology 4183 6231
+> 16 0 24 4094 topology 4246 6231
+> 15 0 23 4094 topology 4212 6232
+> 16 0 23 4094 topology 4213 6232
+> 15 0 24 4094 topology 4213 6233
+> 16 0 24 4094 topology 4246 6233
+> 15 0 23 4094 topology 4134 6234
+> 16 0 23 4094 topology 4135 6234
+> 15 0 24 4094 topology 4135 6235
+> 16 0 24 4094 topology 4246 6235
+> 15 0 23 4094 topology 4242 6236
+> 16 0 23 4094 topology 4243 6236
+> 15 0 24 4094 topology 4243 6237
+> 16 0 24 4094 topology 4246 6237
+> 15 0 23 4094 topology 4164 6238
+> 16 0 23 4094 topology 4165 6238
+> 15 0 24 4094 topology 4165 6239
+> 16 0 24 4094 topology 4246 6239
+> 15 0 23 4094 topology 4194 6240
+> 16 0 23 4094 topology 4195 6240
+> 15 0 24 4094 topology 4195 6241
+> 16 0 24 4094 topology 4246 6241
+> 15 0 23 4094 topology 4224 6242
+> 16 0 23 4094 topology 4225 6242
+> 15 0 24 4094 topology 4225 6243
+> 16 0 24 4094 topology 4246 6243
+> 15 0 23 4094 topology 4146 6244
+> 16 0 23 4094 topology 4147 6244
+> 15 0 24 4094 topology 4147 6245
+> 16 0 24 4094 topology 4246 6245
+> 15 0 23 4094 topology 4176 6246
+> 16 0 23 4094 topology 4177 6246
+> 15 0 24 4094 topology 4177 6247
+> 16 0 24 4094 topology 4246 6247
+> 15 0 23 4094 topology 4206 6248
+> 16 0 23 4094 topology 4207 6248
+> 15 0 24 4094 topology 4207 6249
+> 16 0 24 4094 topology 4246 6249
+> 15 0 23 4094 topology 4236 6250
+> 16 0 23 4094 topology 4237 6250
+> 15 0 24 4094 topology 4237 6251
+> 16 0 24 4094 topology 4246 6251
+> 15 0 23 4094 topology 4098 6252
+> 16 0 23 4094 topology 4099 6252
+> 15 0 24 4094 topology 4099 6253
+> 16 0 24 4094 topology 4246 6253
+> 15 0 23 4094 topology 4110 6254
+> 16 0 23 4094 topology 4111 6254
+> 15 0 24 4094 topology 4111 6255
+> 16 0 24 4094 topology 4246 6255
+> 15 0 23 4094 topology 4131 6256
+> 16 0 23 4094 topology 4132 6256
+> 15 0 24 4094 topology 4132 6257
+> 16 0 24 4094 topology 4246 6257
+> 15 0 23 4094 topology 4161 6258
+> 16 0 23 4094 topology 4162 6258
+> 15 0 24 4094 topology 4162 6259
+> 16 0 24 4094 topology 4246 6259
+> 15 0 23 4094 topology 4191 6260
+> 16 0 23 4094 topology 4192 6260
+> 15 0 24 4094 topology 4192 6261
+> 16 0 24 4094 topology 4246 6261
+> 15 0 23 4094 topology 4221 6262
+> 16 0 23 4094 topology 4222 6262
+> 15 0 24 4094 topology 4222 6263
+> 16 0 24 4094 topology 4246 6263
+> 15 0 23 4094 topology 4143 6264
+> 16 0 23 4094 topology 4144 6264
+> 15 0 24 4094 topology 4144 6265
+> 16 0 24 4094 topology 4246 6265
+> 15 0 23 4094 topology 4173 6266
+> 16 0 23 4094 topology 4174 6266
+> 15 0 24 4094 topology 4174 6267
+> 16 0 24 4094 topology 4246 6267
+> 15 0 23 4094 topology 4203 6268
+> 16 0 23 4094 topology 4204 6268
+> 15 0 24 4094 topology 4204 6269
+> 16 0 24 4094 topology 4246 6269
+> 15 0 23 4094 topology 4233 6270
+> 16 0 23 4094 topology 4234 6270
+> 15 0 24 4094 topology 4234 6271
+> 16 0 24 4094 topology 4246 6271
+> 15 0 27 3921 topology 4091 6272
+> 16 0 27 3921 topology 4093 6272
+> 15 0 28 3921 topology 4093 6273
+> 16 0 28 3921 topology 4388 6273
+> 15 0 21 3921 topology 4093 6274
+> 16 0 21 3921 topology 4386 6274
+> 15 0 28 3921 topology 4386 6275
+> 16 0 28 3921 topology 4384 6275
+> 15 0 21 3921 topology 4093 6276
+> 16 0 21 3921 topology 4247 6276
+> 15 0 28 3921 topology 4247 6277
+> 16 0 28 3921 topology 4245 6277
+> 15 0 27 3921 topology 4388 6278
+> 16 0 27 3921 topology 4386 6278
+> 15 0 27 3921 topology 4388 6279
+> 16 0 27 3921 topology 4247 6279
+> 15 0 21 3921 topology 4386 6280
+> 16 0 21 3921 topology 4247 6280
+> 15 0 38 0 topology 10 6281
+> 16 0 38 0 topology 4797 6281
+> 15 0 28 4390 topology 4797 6282
+> 16 0 28 4390 topology 4796 6282
+> 15 0 38 0 topology 5 6283
+> 16 0 38 0 topology 3920 6283
+> 15 0 28 3415 topology 3920 6284
+> 16 0 28 3415 topology 3919 6284
+> 15 0 38 0 topology 8 6285
+> 16 0 38 0 topology 868 6285
+> 15 0 28 499 topology 868 6286
+> 16 0 28 499 topology 867 6286
+> 15 0 38 0 topology 3 6287
+> 16 0 38 0 topology 3414 6287
+> 15 0 28 2349 topology 3414 6288
+> 16 0 28 2349 topology 3413 6288
+> 15 0 38 0 topology 4 6289
+> 16 0 38 0 topology 2348 6289
+> 15 0 28 1606 topology 2348 6290
+> 16 0 28 1606 topology 2347 6290
+> 15 0 38 0 topology 7 6291
+> 16 0 38 0 topology 498 6291
+> 15 0 28 21 topology 498 6292
+> 16 0 28 21 topology 497 6292
+> 15 0 38 0 topology 6 6293
+> 16 0 38 0 topology 1605 6293
+> 15 0 28 1189 topology 1605 6294
+> 16 0 28 1189 topology 1604 6294
+> 15 0 38 0 topology 2 6295
+> 16 0 38 0 topology 1188 6295
+> 15 0 28 869 topology 1188 6296
+> 16 0 28 869 topology 1187 6296
+> 15 0 38 0 topology 11 6297
+> 16 0 38 0 topology 4389 6297
+> 15 0 28 3921 topology 4389 6298
+> 16 0 28 3921 topology 4388 6298
+> 15 0 39 0 topology 4797 6299
+> 16 0 39 0 topology 20 6299
+> 15 0 39 0 topology 14 6300
+> 16 0 39 0 topology 3920 6300
+> 15 0 39 0 topology 17 6301
+> 16 0 39 0 topology 868 6301
+> 15 0 39 0 topology 15 6302
+> 16 0 39 0 topology 3414 6302
+> 15 0 39 0 topology 13 6303
+> 16 0 39 0 topology 2348 6303
+> 15 0 39 0 topology 16 6304
+> 16 0 39 0 topology 498 6304
+> 15 0 39 0 topology 18 6305
+> 16 0 39 0 topology 1605 6305
+> 15 0 39 0 topology 12 6306
+> 16 0 39 0 topology 1188 6306
+> 15 0 39 0 topology 19 6307
+> 16 0 39 0 topology 4389 6307
+> 15 0 39 0 topology 14 6308
+> 16 0 39 0 topology 3414 6308
+> 15 0 39 0 topology 15 6309
+> 16 0 39 0 topology 1605 6309
+> 15 0 39 0 topology 17 6310
+> 16 0 39 0 topology 1605 6310
+> 15 0 39 0 topology 3414 6311
+> 16 0 39 0 topology 13 6311
+> 15 0 39 0 topology 3414 6312
+> 16 0 39 0 topology 12 6312
+> 15 0 39 0 topology 16 6313
+> 16 0 39 0 topology 1605 6313
 > 7 0 2 9
 > 7 0 3 18
 > 7 0 3 19
index 65697ff..0ec8ebf 100644 (file)
@@ -100,9 +100,9 @@ int main(int argc, char *argv[])
     xbt_dynar_free (&link_variables);
   }
 
-  //create a customized triva graph configuration file
+  //create a customized viva graph configuration file
   FILE *fp;
-  fp = fopen ("triva_graph.plist", "w");
+  fp = fopen ("viva_graph.plist", "w");
   if (!fp){
     return 1;
   }
index 621494f..168ba8e 100644 (file)
@@ -16,7 +16,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/user_variables$EXEEXT --cfg=tracing:1 --cf
 > [0.004078] [msg_test/INFO] 0-HOST1-LINK3
 > [0.004078] [msg_test/INFO] 0-LINK3-HOST1
 
-$ rm triva_graph.plist
+$ rm viva_graph.plist
 
 p Not tracing user variables
 $ $SG_TEST_EXENV ${bindir:=.}/tracing/user_variables$EXEEXT ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml
index 5385d66..fad5a1f 100644 (file)
 -rw-r--r-- 1 user user 705 2011-10-05 16:04 ./doc/simgrid/examples/smpi/split.c
 -rw-r--r-- 1 user user 1970 2011-10-05 16:04 ./doc/simgrid/examples/xbt/sem_basic.c
 -rw-r--r-- 1 user user 7207 2011-10-05 16:04 ./doc/simgrid/examples/xbt/sem_sched.c
--rw-r--r-- 1 user user 271 2011-10-05 16:04 ./doc/simgrid/examples/gras/properties/properties.xml
--rw-r--r-- 1 user user 2229 2011-10-05 16:04 ./doc/simgrid/examples/gras/properties/_properties_simulator.c
--rw-r--r-- 1 user user 811 2011-10-05 16:04 ./doc/simgrid/examples/gras/properties/_properties_alice.c
--rw-r--r-- 1 user user 805 2011-10-05 16:04 ./doc/simgrid/examples/gras/properties/_properties_bob.c
--rw-r--r-- 1 user user 3072 2011-10-05 16:04 ./doc/simgrid/examples/gras/properties/properties.c
--rw-r--r-- 1 user user 263 2011-10-05 16:04 ./doc/simgrid/examples/gras/synchro/synchro.xml
--rw-r--r-- 1 user user 4199 2011-10-05 16:04 ./doc/simgrid/examples/gras/synchro/philosopher.c
--rw-r--r-- 1 user user 817 2011-10-05 16:04 ./doc/simgrid/examples/gras/synchro/_synchro_philosopher.c
--rw-r--r-- 1 user user 1774 2011-10-05 16:04 ./doc/simgrid/examples/gras/synchro/_synchro_simulator.c
--rw-r--r-- 1 user user 3281 2011-10-05 16:04 ./doc/simgrid/examples/gras/mmrpc/mmrpc_client.c
--rw-r--r-- 1 user user 2223 2011-10-05 16:04 ./doc/simgrid/examples/gras/mmrpc/_mmrpc_simulator.c
--rw-r--r-- 1 user user 5437 2011-10-05 16:04 ./doc/simgrid/examples/gras/mmrpc/mmrpc.c
--rw-r--r-- 1 user user 925 2011-10-05 16:04 ./doc/simgrid/examples/gras/mmrpc/mmrpc_common.c
--rw-r--r-- 1 user user 794 2011-10-05 16:04 ./doc/simgrid/examples/gras/mmrpc/_mmrpc_server.c
--rw-r--r-- 1 user user 2174 2011-10-05 16:04 ./doc/simgrid/examples/gras/mmrpc/mmrpc_server.c
--rw-r--r-- 1 user user 416 2011-10-05 16:04 ./doc/simgrid/examples/gras/mmrpc/mmrpc.xml
--rw-r--r-- 1 user user 716 2011-10-05 16:04 ./doc/simgrid/examples/gras/mmrpc/mmrpc.h
--rw-r--r-- 1 user user 794 2011-10-05 16:04 ./doc/simgrid/examples/gras/mmrpc/_mmrpc_client.c
--rw-r--r-- 1 user user 794 2011-10-05 16:04 ./doc/simgrid/examples/gras/spawn/_spawn_server.c
--rw-r--r-- 1 user user 322 2011-10-05 16:04 ./doc/simgrid/examples/gras/spawn/spawn.xml
--rw-r--r-- 1 user user 3857 2011-10-05 16:04 ./doc/simgrid/examples/gras/spawn/spawn.c
--rw-r--r-- 1 user user 1732 2011-10-05 16:04 ./doc/simgrid/examples/gras/spawn/_spawn_simulator.c
--rw-r--r-- 1 user user 786 2011-10-05 16:04 ./doc/simgrid/examples/gras/pmm/_pmm_master.c
--rw-r--r-- 1 user user 783 2011-10-05 16:04 ./doc/simgrid/examples/gras/pmm/_pmm_slave.c
--rw-r--r-- 1 user user 1222 2011-10-05 16:04 ./doc/simgrid/examples/gras/pmm/pmm.xml
--rw-r--r-- 1 user user 2205 2011-10-05 16:04 ./doc/simgrid/examples/gras/pmm/_pmm_simulator.c
--rw-r--r-- 1 user user 13241 2011-10-05 16:04 ./doc/simgrid/examples/gras/pmm/pmm.c
--rw-r--r-- 1 user user 36437 2011-10-05 16:04 ./doc/simgrid/examples/gras/pmm/pmm_plateform.xml
--rw-r--r-- 1 user user 2205 2011-10-05 16:04 ./doc/simgrid/examples/gras/chrono/chrono.c
--rw-r--r-- 1 user user 2131 2011-10-05 16:04 ./doc/simgrid/examples/gras/chrono/chrono2.c
--rw-r--r-- 1 user user 180 2011-10-05 16:04 ./doc/simgrid/examples/gras/chrono/chrono.xml
--rw-r--r-- 1 user user 810 2011-10-05 16:04 ./doc/simgrid/examples/gras/chrono/_chrono_multiplier.c
--rw-r--r-- 1 user user 1762 2011-10-05 16:04 ./doc/simgrid/examples/gras/chrono/_chrono_simulator.c
--rw-r--r-- 1 user user 790 2011-10-05 16:04 ./doc/simgrid/examples/gras/ping/_ping_client.c
--rw-r--r-- 1 user user 729 2011-10-05 16:04 ./doc/simgrid/examples/gras/ping/ping_common.c
--rw-r--r-- 1 user user 3217 2011-10-05 16:04 ./doc/simgrid/examples/gras/ping/ping_server.c
--rw-r--r-- 1 user user 646 2011-10-05 16:04 ./doc/simgrid/examples/gras/ping/ping.h
--rw-r--r-- 1 user user 416 2011-10-05 16:04 ./doc/simgrid/examples/gras/ping/ping.xml
--rw-r--r-- 1 user user 2746 2011-10-05 16:04 ./doc/simgrid/examples/gras/ping/ping_client.c
--rw-r--r-- 1 user user 790 2011-10-05 16:04 ./doc/simgrid/examples/gras/ping/_ping_server.c
--rw-r--r-- 1 user user 2217 2011-10-05 16:04 ./doc/simgrid/examples/gras/ping/_ping_simulator.c
--rw-r--r-- 1 user user 795 2011-10-05 16:04 ./doc/simgrid/examples/gras/rpc/rpc.xml
--rw-r--r-- 1 user user 12213 2011-10-05 16:04 ./doc/simgrid/examples/gras/rpc/rpc.c
--rw-r--r-- 1 user user 786 2011-10-05 16:04 ./doc/simgrid/examples/gras/rpc/_rpc_client.c
--rw-r--r-- 1 user user 795 2011-10-05 16:04 ./doc/simgrid/examples/gras/rpc/_rpc_forwarder.c
--rw-r--r-- 1 user user 786 2011-10-05 16:04 ./doc/simgrid/examples/gras/rpc/_rpc_server.c
--rw-r--r-- 1 user user 2720 2011-10-05 16:04 ./doc/simgrid/examples/gras/rpc/_rpc_simulator.c
--rw-r--r-- 1 user user 446 2011-10-05 16:04 ./doc/simgrid/examples/gras/console/_ping_client.c
--rw-r--r-- 1 user user 243 2011-10-05 16:04 ./doc/simgrid/examples/gras/console/ping_generator.lua
--rw-r--r-- 1 user user 729 2011-10-05 16:04 ./doc/simgrid/examples/gras/console/ping_common.c
--rw-r--r-- 1 user user 2103 2011-10-05 16:04 ./doc/simgrid/examples/gras/console/gras_platform_script.lua
--rw-r--r-- 1 user user 3217 2011-10-05 16:04 ./doc/simgrid/examples/gras/console/ping_server.c
--rw-r--r-- 1 user user 646 2011-10-05 16:04 ./doc/simgrid/examples/gras/console/ping.h
--rw-r--r-- 1 user user 2754 2011-10-05 16:04 ./doc/simgrid/examples/gras/console/ping_client.c
--rw-r--r-- 1 user user 446 2011-10-05 16:04 ./doc/simgrid/examples/gras/console/_ping_server.c
--rw-r--r-- 1 user user 1656 2011-10-05 16:04 ./doc/simgrid/examples/gras/console/_ping_simulator.c
--rw-r--r-- 1 user user 1457 2011-10-05 16:04 ./doc/simgrid/examples/gras/mutual_exclusion/simple_token/simple_token.xml
--rw-r--r-- 1 user user 850 2011-10-05 16:04 ./doc/simgrid/examples/gras/mutual_exclusion/simple_token/_simple_token_node.c
--rw-r--r-- 1 user user 5984 2011-10-05 16:04 ./doc/simgrid/examples/gras/mutual_exclusion/simple_token/simple_token.c
--rw-r--r-- 1 user user 1813 2011-10-05 16:04 ./doc/simgrid/examples/gras/mutual_exclusion/simple_token/_simple_token_simulator.c
--rw-r--r-- 1 user user 808 2011-10-05 16:04 ./doc/simgrid/examples/gras/all2all/_all2all_receiver.c
--rw-r--r-- 1 user user 2269 2011-10-05 16:04 ./doc/simgrid/examples/gras/all2all/all2all.xml
--rw-r--r-- 1 user user 802 2011-10-05 16:04 ./doc/simgrid/examples/gras/all2all/_all2all_sender.c
--rw-r--r-- 1 user user 4200 2011-10-05 16:04 ./doc/simgrid/examples/gras/all2all/all2all.c
--rw-r--r-- 1 user user 2247 2011-10-05 16:04 ./doc/simgrid/examples/gras/all2all/_all2all_simulator.c
--rw-r--r-- 1 user user 7311 2011-10-05 16:04 ./doc/simgrid/examples/gras/p2p/chord/chord.xml
--rw-r--r-- 1 user user 11076 2011-10-05 16:04 ./doc/simgrid/examples/gras/p2p/chord/chord.c
--rw-r--r-- 1 user user 1548 2011-10-05 16:04 ./doc/simgrid/examples/gras/p2p/can/can.xml
--rw-r--r-- 1 user user 12616 2011-10-05 16:04 ./doc/simgrid/examples/gras/p2p/can/can.c
--rw-r--r-- 1 user user 7176 2011-10-05 16:04 ./doc/simgrid/examples/gras/p2p/can/can_tests.c
--rw-r--r-- 1 user user 1732 2011-10-05 16:04 ./doc/simgrid/examples/gras/timer/_timer_simulator.c
--rw-r--r-- 1 user user 183 2011-10-05 16:04 ./doc/simgrid/examples/gras/timer/timer.xml
--rw-r--r-- 1 user user 794 2011-10-05 16:04 ./doc/simgrid/examples/gras/timer/_timer_client.c
--rw-r--r-- 1 user user 2823 2011-10-05 16:04 ./doc/simgrid/examples/gras/timer/timer.c
--rw-r--r-- 1 user user 8864 2011-10-05 16:04 ./doc/simgrid/examples/gras/replay/replay.c
--rw-r--r-- 1 user user 9663 2011-10-05 16:04 ./doc/simgrid/examples/gras/replay/Strassen.xml
--rw-r--r-- 1 user user 23087 2011-10-05 16:04 ./doc/simgrid/examples/gras/replay/Montage_25.xml
--rw-r--r-- 1 user user 6219 2011-10-05 16:04 ./doc/simgrid/examples/gras/replay/xbt_workload.c
--rw-r--r-- 1 user user 2523 2011-10-05 16:04 ./doc/simgrid/examples/gras/replay/replay.xml
--rw-r--r-- 1 user user 2088 2011-10-05 16:04 ./doc/simgrid/examples/gras/replay/_replay_simulator.c
--rw-r--r-- 1 user user 704 2011-10-05 16:04 ./doc/simgrid/examples/gras/replay/_replay_worker.c
--rw-r--r-- 1 user user 9358 2011-10-05 16:04 ./doc/simgrid/examples/gras/replay/ForkJoin_10_2.xml
--rw-r--r-- 1 user user 704 2011-10-05 16:04 ./doc/simgrid/examples/gras/replay/_replay_master.c
--rw-r--r-- 1 user user 289 2011-10-05 16:04 ./doc/simgrid/examples/gras/replay/sagittaire.xml
--rw-r--r-- 1 user user 810 2011-10-05 16:04 ./doc/simgrid/examples/amok/bandwidth/_bandwidth_sensor.c
--rw-r--r-- 1 user user 813 2011-10-05 16:04 ./doc/simgrid/examples/amok/bandwidth/_bandwidth_maestro.c
--rw-r--r-- 1 user user 476 2011-10-05 16:04 ./doc/simgrid/examples/amok/bandwidth/bandwidth.xml
--rw-r--r-- 1 user user 2253 2011-10-05 16:04 ./doc/simgrid/examples/amok/bandwidth/_bandwidth_simulator.c
--rw-r--r-- 1 user user 3977 2011-10-05 16:04 ./doc/simgrid/examples/amok/bandwidth/bandwidth.c
--rw-r--r-- 1 user user 592 2011-10-05 16:04 ./doc/simgrid/examples/amok/saturate/saturate.xml
--rw-r--r-- 1 user user 806 2011-10-05 16:04 ./doc/simgrid/examples/amok/saturate/_saturate_sensor.c
--rw-r--r-- 1 user user 4326 2011-10-05 16:04 ./doc/simgrid/examples/amok/saturate/env.c
--rw-r--r-- 1 user user 97357 2011-10-05 16:04 ./doc/simgrid/examples/amok/saturate/medium_platform.xml
--rw-r--r-- 1 user user 2247 2011-10-05 16:04 ./doc/simgrid/examples/amok/saturate/_saturate_simulator.c
--rw-r--r-- 1 user user 809 2011-10-05 16:04 ./doc/simgrid/examples/amok/saturate/_saturate_maestro.c
--rw-r--r-- 1 user user 7897 2011-10-05 16:04 ./doc/simgrid/examples/amok/saturate/saturate.c
--rw-r--r-- 1 user user 2844 2011-10-05 16:04 ./doc/simgrid/examples/amok/saturate/medium_deployment.xml
--rw-r--r-- 1 user user 7625 2011-10-05 16:04 ./doc/simgrid/examples/amok/alnem/alnem.c
--rw-r--r-- 1 user user 1295 2011-10-05 16:04 ./doc/simgrid/examples/amok/alnem/alnem_builder.c
 -rw-r--r-- 1 user user 4582 2011-10-05 16:04 ./doc/simgrid/examples/msg/small_platform.xml
 -rw-r--r-- 1 user user 4805 2011-10-05 16:04 ./doc/simgrid/examples/msg/README
 -rw-r--r-- 1 user user 272 2011-10-05 16:04 ./doc/simgrid/examples/msg/properties/deployment_properties.xml
 -rw-r--r-- 1 user user 222 2011-10-05 16:04 ./doc/simgrid/examples/platforms/multicore_machine.xml
 -rw-r--r-- 1 user user 36192 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__str.html
 -rw-r--r-- 1 user user 14505 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__cfg__decl.html
--rw-r--r-- 1 user user 16787 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__dd__cb__full.html
--rw-r--r-- 1 user user 35143 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_simpledata.html
 -rw-r--r-- 1 user user 2130 2011-10-05 16:04 ./doc/simgrid/html/bug.html
--rw-r--r-- 1 user user 7780 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__sock__file.html
 -rw-r--r-- 1 user user 10658 2011-10-05 16:04 ./doc/simgrid/html/group__MSG__C.html
 -rw-r--r-- 1 user user 2512 2011-10-05 16:04 ./doc/simgrid/html/structs__xbt__strbuff__t.html
 -rw-r--r-- 1 user user 4803 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_master_slave_lua_bypass.html
 -rw-r--r-- 1 user user 11932 2011-10-05 16:04 ./doc/simgrid/html/simgrid_modules2.png
 -rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1Msg.html
--rw-r--r-- 1 user user 251 2011-10-05 16:04 ./doc/simgrid/html/amok.html
 -rw-r--r-- 1 user user 13562 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__actions.html
--rw-r--r-- 1 user user 2555 2011-10-05 16:04 ./doc/simgrid/html/structs__gras__dd__cat__ref.html
 -rw-r--r-- 1 user user 435 2011-10-05 16:04 ./doc/simgrid/html/publis_intra.html
 -rw-r--r-- 1 user user 8326 2011-10-05 16:04 ./doc/simgrid/html/simgrid_logo_small.png
 -rw-r--r-- 1 user user 4203 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__resources.html
 -rw-r--r-- 1 user user 2751 2011-10-05 16:04 ./doc/simgrid/html/structsurf__cpu__model__extension__public.html
 -rw-r--r-- 1 user user 1095 2011-10-05 16:04 ./doc/simgrid/html/tabs.css
 -rw-r--r-- 1 user user 6991 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__set.html
--rw-r--r-- 1 user user 5827 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_manualdatadef.html
 -rw-r--r-- 1 user user 9653 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__set__curs.html
 -rw-r--r-- 1 user user 10014 2011-10-05 16:04 ./doc/simgrid/html/structxbt__ex__t.html
 -rw-r--r-- 1 user user 5794 2011-10-05 16:04 ./doc/simgrid/html/pages.html
--rw-r--r-- 1 user user 27003 2011-10-05 16:04 ./doc/simgrid/html/GRAS_ex_mmrpc.html
--rw-r--r-- 1 user user 38103 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_rpc.html
 -rw-r--r-- 1 user user 30160 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_master_slave_scrip_lua.html
 -rw-r--r-- 1 user user 6276 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__API.html
--rw-r--r-- 1 user user 14654 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_args.html
--rw-r--r-- 1 user user 8654 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__dd__basic.html
 -rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1MsgException.html
--rw-r--r-- 1 user user 9124 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__globals.html
--rw-r--r-- 1 user user 13293 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__API.html
 -rw-r--r-- 1 user user 3202 2011-10-05 16:04 ./doc/simgrid/html/todo.html
 -rw-r--r-- 1 user user 159 2011-10-05 16:04 ./doc/simgrid/html/nav_f.png
--rw-r--r-- 1 user user 23741 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_globals.html
 -rw-r--r-- 1 user user 23050 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__queue.html
 -rw-r--r-- 1 user user 9876 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo__cons.html
--rw-r--r-- 1 user user 7197 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__msg.html
 -rw-r--r-- 1 user user 17707 2011-10-05 16:04 ./doc/simgrid/html/structsurf__model.html
 -rw-r--r-- 1 user user 43212 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_asynchronous_communications.html
 -rw-r--r-- 1 user user 30326 2011-10-05 16:04 ./doc/simgrid/html/Paje_MSG_screenshot_thn.jpg
--rw-r--r-- 1 user user 0 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut.html
--rw-r--r-- 1 user user 244 2011-10-05 16:04 ./doc/simgrid/html/gras.html
--rw-r--r-- 1 user user 17605 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_callbacks.html
 -rw-r--r-- 1 user user 2783 2011-10-05 16:04 ./doc/simgrid/html/structsurf__network__model__extension__public.html
 -rw-r--r-- 1 user user 2621 2011-10-05 16:04 ./doc/simgrid/html/structsurf__model__description.html
 -rw-r--r-- 1 user user 19042 2011-10-05 16:04 ./doc/simgrid/html/group__m__host__management.html
--rw-r--r-- 1 user user 2757 2011-10-05 16:04 ./doc/simgrid/html/structs__gras__msg__t.html
 -rw-r--r-- 1 user user 14045 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo__perl.html
 -rw-r--r-- 1 user user 12734 2011-10-05 16:04 ./doc/simgrid/html/modules.html
 -rw-r--r-- 1 user user 7707 2011-10-05 16:04 ./doc/simgrid/html/annotated.html
--rw-r--r-- 1 user user 5114 2011-10-05 16:04 ./doc/simgrid/html/group__AMOK__API.html
--rw-r--r-- 1 user user 16572 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__msg__exchangeadv.html
 -rw-r--r-- 1 user user 6191 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo.html
 -rw-r--r-- 1 user user 3765 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__parmap.html
 -rw-r--r-- 1 user user 58483 2011-10-05 16:04 ./doc/simgrid/html/tracing.html
--rw-r--r-- 1 user user 31768 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_timers.html
 -rw-r--r-- 1 user user 2523 2011-10-05 16:04 ./doc/simgrid/html/structs__surf__metric__t.html
 -rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1Task.html
--rw-r--r-- 1 user user 13124 2011-10-05 16:04 ./doc/simgrid/html/GRAS_ex_timer.html
 -rw-r--r-- 1 user user 5923 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__swag.html
--rw-r--r-- 1 user user 3308 2011-10-05 16:04 ./doc/simgrid/html/structDataDescriptorStruct.html
--rw-r--r-- 1 user user 17299 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__dd__cb__simple.html
--rw-r--r-- 1 user user 19321 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_simpleexchange.html
--rw-r--r-- 1 user user 2619 2011-10-05 16:04 ./doc/simgrid/html/structs__gras__dd__cat__field.html
 -rw-r--r-- 1 user user 11436 2011-10-05 16:04 ./doc/simgrid/html/functions_vars.html
--rw-r--r-- 1 user user 14097 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__sock__meas.html
--rw-r--r-- 1 user user 7974 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__dd.html
 -rw-r--r-- 1 user user 8194 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__swag__type.html
 -rw-r--r-- 1 user user 60084 2011-10-05 16:04 ./doc/simgrid/html/win_install_02.png
 -rw-r--r-- 1 user user 8309 2011-10-05 16:04 ./doc/simgrid/html/simgrid_modules.png
 -rw-r--r-- 1 user user 8348 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__error.html
 -rw-r--r-- 1 user user 15743 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__cons.html
 -rw-r--r-- 1 user user 21536 2011-10-05 16:04 ./doc/simgrid/html/simgrid_logo.png
--rw-r--r-- 1 user user 17791 2011-10-05 16:04 ./doc/simgrid/html/group__AMOK__pm.html
 -rw-r--r-- 1 user user 7717 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo__misc.html
--rw-r--r-- 1 user user 17203 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__sock__create.html
--rw-r--r-- 1 user user 3720 2011-10-05 16:04 ./doc/simgrid/html/amok_bw_test.png
 -rw-r--r-- 1 user user 3460 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__context.html
--rw-r--r-- 1 user user 5845 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_staticstruct.html
 -rw-r--r-- 1 user user 8963 2011-10-05 16:04 ./doc/simgrid/html/group__m__channel__management.html
--rw-r--r-- 1 user user 3909 2011-10-05 16:04 ./doc/simgrid/html/GRAS_howto.html
--rw-r--r-- 1 user user 17822 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__msg__exchange.html
 -rw-r--r-- 1 user user 4188 2011-10-05 16:04 ./doc/simgrid/html/structm__task.html
 -rw-r--r-- 1 user user 8561 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__swag__curs.html
 -rw-r--r-- 1 user user 60965 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__log.html
 -rw-r--r-- 1 user user 11976 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__cursor.html
 -rw-r--r-- 1 user user 5102 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__log__cats.html
 -rw-r--r-- 1 user user 55802 2011-10-05 16:04 ./doc/simgrid/html/win_install_03.png
--rw-r--r-- 1 user user 2583 2011-10-05 16:04 ./doc/simgrid/html/structs__gras__msg__cb__ctx.html
 -rw-r--r-- 1 user user 3249 2011-10-05 16:04 ./doc/simgrid/html/poster_thumbnail.png
 -rw-r--r-- 1 user user 7557 2011-10-05 16:04 ./doc/simgrid/html/group__m__datatypes__management__details.html
 -rw-r--r-- 1 user user 24314 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__set__basic.html
--rw-r--r-- 1 user user 2559 2011-10-05 16:04 ./doc/simgrid/html/structs__gras__dd__cat__union.html
 -rw-r--r-- 1 user user 61053 2011-10-05 16:04 ./doc/simgrid/html/win_install_01.png
 -rw-r--r-- 1 user user 126 2011-10-05 16:04 ./doc/simgrid/html/closed.png
--rw-r--r-- 1 user user 5388 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__run.html
 -rw-r--r-- 1 user user 6958 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__adt.html
 -rw-r--r-- 1 user user 9659 2011-10-05 16:04 ./doc/simgrid/html/index.html
 -rw-r--r-- 1 user user 17867 2011-10-05 16:04 ./doc/simgrid/html/group__SD__link__management.html
 -rw-r--r-- 1 user user 5443 2011-10-05 16:04 ./doc/simgrid/html/group__MSG__JAVA.html
--rw-r--r-- 1 user user 31365 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_logs.html
 -rw-r--r-- 1 user user 10385 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__simulation.html
--rw-r--r-- 1 user user 2560 2011-10-05 16:04 ./doc/simgrid/html/structs__gras__dd__cat__array.html
 -rw-r--r-- 1 user user 4188 2011-10-05 16:04 ./doc/simgrid/html/structm__host.html
--rw-r--r-- 1 user user 2605 2011-10-05 16:04 ./doc/simgrid/html/structamok__result__t.html
 -rw-r--r-- 1 user user 22436 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__array.html
--rw-r--r-- 1 user user 2792 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_dynar.html
 -rw-r--r-- 1 user user 386 2011-10-05 16:04 ./doc/simgrid/html/simgrid.css
 -rw-r--r-- 1 user user 15389 2011-10-05 16:04 ./doc/simgrid/html/group__SD__task__dependency__management.html
 -rw-r--r-- 1 user user 7225 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__grounding.html
--rw-r--r-- 1 user user 43266 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_explicitwait.html
 -rw-r--r-- 1 user user 11863 2011-10-05 16:04 ./doc/simgrid/html/pls.html
--rw-r--r-- 1 user user 2564 2011-10-05 16:04 ./doc/simgrid/html/structs__gras__dd__cat__struct.html
 -rw-r--r-- 1 user user 12693 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__ctn.html
 -rw-r--r-- 1 user user 11564 2011-10-05 16:04 ./doc/simgrid/html/functions.html
--rw-r--r-- 1 user user 19281 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__dd__auto.html
 -rw-r--r-- 1 user user 9616 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__speed.html
 -rw-r--r-- 1 user user 24837 2011-10-05 16:04 ./doc/simgrid/html/installSimgrid.html
 -rw-r--r-- 1 user user 59769 2011-10-05 16:04 ./doc/simgrid/html/triva-graph_configuration.png
 -rw-r--r-- 1 user user 55335 2011-10-05 16:04 ./doc/simgrid/html/triva-graph_visualization.png
 -rw-r--r-- 1 user user 51294 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_master_slave.html
--rw-r--r-- 1 user user 14504 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__emul.html
 -rw-r--r-- 1 user user 3942 2011-10-05 16:04 ./doc/simgrid/html/doxygen.png
 -rw-r--r-- 1 user user 10757 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__mallocator__cons.html
--rw-r--r-- 1 user user 5187 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__ex.html
 -rw-r--r-- 1 user user 125324 2011-10-05 16:04 ./doc/simgrid/html/group__API__index.html
 -rw-r--r-- 1 user user 9746 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__cons.html
 -rw-r--r-- 1 user user 19885 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__swag__func.html
 -rw-r--r-- 1 user user 4674 2011-10-05 16:04 ./doc/simgrid/html/group__SimGrid__API.html
--rw-r--r-- 1 user user 30207 2011-10-05 16:04 ./doc/simgrid/html/group__AMOK__bw.html
 -rw-r--r-- 1 user user 9591 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__misc.html
 -rw-r--r-- 1 user user 5121 2011-10-05 16:04 ./doc/simgrid/html/structxbt__set__elm__.html
--rw-r--r-- 1 user user 13708 2011-10-05 16:04 ./doc/simgrid/html/GRAS_howto_design.html
--rw-r--r-- 1 user user 2652 2011-10-05 16:04 ./doc/simgrid/html/unionu__gras__datadesc__category.html
--rw-r--r-- 1 user user 2986 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_dynars.html
--rw-r--r-- 1 user user 10092 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__sock__info.html
--rw-r--r-- 1 user user 4499 2011-10-05 16:04 ./doc/simgrid/html/amok_bw_sat.png
 -rw-r--r-- 1 user user 19320 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__cfg__get.html
 -rw-r--r-- 1 user user 23685 2011-10-05 16:04 ./doc/simgrid/html/bindings.html
--rw-r--r-- 1 user user 2552 2011-10-05 16:04 ./doc/simgrid/html/structs__gras__cblist.html
 -rw-r--r-- 1 user user 6916 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict.html
--rw-r--r-- 1 user user 44307 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__dd__manual.html
 -rw-r--r-- 1 user user 3904 2011-10-05 16:04 ./doc/simgrid/html/use.html
--rw-r--r-- 1 user user 9361 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__timer.html
 -rw-r--r-- 1 user user 20935 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__basic.html
 -rw-r--r-- 1 user user 23682 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__graph.html
 -rw-r--r-- 1 user user 6444 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__mallocator.html
 -rw-r--r-- 1 user user 11076 2011-10-05 16:04 ./doc/simgrid/html/structsurf__workstation__model__extension__public.html
 -rw-r--r-- 1 user user 435 2011-10-05 16:04 ./doc/simgrid/html/publis.html
 -rw-r--r-- 1 user user 4663 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__misc.html
--rw-r--r-- 1 user user 23635 2011-10-05 16:04 ./doc/simgrid/html/GRAS_ex_token.html
 -rw-r--r-- 1 user user 226 2011-10-05 16:04 ./doc/simgrid/html/simdag.html
 -rw-r--r-- 1 user user 340759 2011-10-05 16:04 ./doc/simgrid/html/Paje_MSG_screenshot.jpg
 -rw-r--r-- 1 user user 65293 2011-10-05 16:04 ./doc/simgrid/html/group__msg__gos__functions.html
 -rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1Host.html
 -rw-r--r-- 1 user user 435 2011-10-05 16:04 ./doc/simgrid/html/publis_extern.html
--rw-r--r-- 1 user user 2599 2011-10-05 16:04 ./doc/simgrid/html/structgras__procdata__t.html
--rw-r--r-- 1 user user 19523 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour.html
 -rw-r--r-- 1 user user 5094 2011-10-05 16:04 ./doc/simgrid/html/group__MSG__LUA.html
--rw-r--r-- 1 user user 5680 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_install.html
 -rw-r--r-- 1 user user 14081 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar.html
--rw-r--r-- 1 user user 19084 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_message_recaping.html
 -rw-r--r-- 1 user user 2480 2011-10-05 16:04 ./doc/simgrid/html/structs__model__type.html
 -rw-r--r-- 1 user user 19296 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__synchro.html
 -rw-r--r-- 1 user user 677 2011-10-05 16:04 ./doc/simgrid/html/bc_s.png
--rw-r--r-- 1 user user 29084 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_exceptions.html
 -rw-r--r-- 1 user user 6934 2011-10-05 16:04 ./doc/simgrid/html/classes.html
 -rw-r--r-- 1 user user 29778 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__fifo__direct.html
 -rw-r--r-- 1 user user 37757 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__cfg__use.html
--rw-r--r-- 1 user user 2613 2011-10-05 16:04 ./doc/simgrid/html/structs__gras__datadesc__type.html
 -rw-r--r-- 1 user user 9306 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__mallocator__objects.html
 -rw-r--r-- 1 user user 1519 2011-10-05 16:04 ./doc/simgrid/html/classsimgrid_1_1msg_1_1Process.html
 -rw-r--r-- 1 user user 18525 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__multi.html
 -rw-r--r-- 1 user user 16459 2011-10-05 16:04 ./doc/simgrid/html/group__m__datatypes__management.html
 -rw-r--r-- 1 user user 178 2011-10-05 16:04 ./doc/simgrid/html/tab_b.png
--rw-r--r-- 1 user user 14983 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__virtu.html
 -rw-r--r-- 1 user user 45009 2011-10-05 16:04 ./doc/simgrid/html/group__SD__simulation.html
--rw-r--r-- 1 user user 14562 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__msg__decl.html
--rw-r--r-- 1 user user 27476 2011-10-05 16:04 ./doc/simgrid/html/GRAS_ex_ping.html
--rw-r--r-- 1 user user 6763 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_pointers.html
 -rw-r--r-- 1 user user 50885 2011-10-05 16:04 ./doc/simgrid/html/group__msg__easier__life.html
 -rw-r--r-- 1 user user 35307 2011-10-05 16:04 ./doc/simgrid/html/group__m__task__management.html
 -rw-r--r-- 1 user user 140 2011-10-05 16:04 ./doc/simgrid/html/tab_a.png
 -rw-r--r-- 1 user user 52033 2011-10-05 16:04 ./doc/simgrid/html/win_install_04.png
 -rw-r--r-- 1 user user 8353 2011-10-05 16:04 ./doc/simgrid/html/structsurf__action.html
 -rw-r--r-- 1 user user 32537 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__ex.html
--rw-r--r-- 1 user user 15294 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__msg__cb.html
 -rw-r--r-- 1 user user 6659 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__API.html
 -rw-r--r-- 1 user user 12350 2011-10-05 16:04 ./doc/simgrid/html/doxygen.css
--rw-r--r-- 1 user user 7857 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__tut.html
 -rw-r--r-- 1 user user 7965 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__set__cons.html
--rw-r--r-- 1 user user 5998 2011-10-05 16:04 ./doc/simgrid/html/gras_comm.png
 -rw-r--r-- 1 user user 7821 2011-10-05 16:04 ./doc/simgrid/html/group__SURF__build__api.html
 -rw-r--r-- 1 user user 47169 2011-10-05 16:04 ./doc/simgrid/html/group__m__process__management.html
 -rw-r--r-- 1 user user 19747 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dict__curs.html
 -rw-r--r-- 1 user user 12131 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__dynar__perl.html
 -rw-r--r-- 1 user user 15874 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__cfg__register.html
 -rw-r--r-- 1 user user 435 2011-10-05 16:04 ./doc/simgrid/html/publis_core.html
--rw-r--r-- 1 user user 6349 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__sock.html
--rw-r--r-- 1 user user 16627 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__msg__rpc.html
 -rw-r--r-- 1 user user 46397 2011-10-05 16:04 ./doc/simgrid/html/group__SD__workstation__management.html
 -rw-r--r-- 1 user user 4794 2011-10-05 16:04 ./doc/simgrid/html/MSG_ex_master_slave_lua.html
--rw-r--r-- 1 user user 6204 2011-10-05 16:04 ./doc/simgrid/html/group__GRAS__comm.html
 -rw-r--r-- 1 user user 6026 2011-10-05 16:04 ./doc/simgrid/html/group__MSG__API.html
 -rw-r--r-- 1 user user 227 2011-10-05 16:04 ./doc/simgrid/html/msg.html
--rw-r--r-- 1 user user 30163 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_intro.html
 -rw-r--r-- 1 user user 60347 2011-10-05 16:04 ./doc/simgrid/html/group__SD__task__management.html
 -rw-r--r-- 1 user user 10095 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__syscall.html
--rw-r--r-- 1 user user 2570 2011-10-05 16:04 ./doc/simgrid/html/structs__gras__msgtype.html
 -rw-r--r-- 1 user user 18482 2011-10-05 16:04 ./doc/simgrid/html/group__XBT__heap.html
--rw-r--r-- 1 user user 5819 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_exchangecb.html
 -rw-r--r-- 1 user user 7301 2011-10-05 16:04 ./doc/simgrid/html/structsurf__action__state.html
 -rw-r--r-- 1 user user 189 2011-10-05 16:04 ./doc/simgrid/html/tab_s.png
--rw-r--r-- 1 user user 19444 2011-10-05 16:04 ./doc/simgrid/html/GRAS_tut_tour_setup.html
 -rw-r--r-- 1 user user 192 2011-10-05 16:04 ./doc/simgrid/html/tab_h.png
 -rw-r--r-- 1 user user 97 2011-10-05 16:04 ./doc/simgrid/html/nav_h.png
 -rw-r--r-- 1 user user 4826 2011-10-05 16:04 ./include/smpi/mpif.h
 -rw-r--r-- 1 user user 510 2011-10-05 16:04 ./include/smpi/mpi.h
 -rw-r--r-- 1 user user 3187 2011-10-05 16:04 ./include/smpi/smpi_cocci.h
 -rw-r--r-- 1 user user 24101 2011-10-05 16:04 ./include/smpi/smpi.h
--rw-r--r-- 1 user user 896 2011-10-05 16:04 ./include/gras.h
 -rw-r--r-- 1 user user 3626 2011-10-05 16:04 ./include/xbt/fifo.h
 -rw-r--r-- 1 user user 7459 2011-10-05 16:04 ./include/xbt/dict.h
 -rw-r--r-- 1 user user 2111 2011-10-05 16:04 ./include/xbt/str.h
 -rw-r--r-- 1 user user 648 2011-10-05 16:04 ./include/xbt/module.h
 -rw-r--r-- 1 user user 5523 2011-10-05 16:04 ./include/xbt/cunit.h
 -rw-r--r-- 1 user user 1166 2011-10-05 16:04 ./include/xbt/parmap.h
--rw-r--r-- 1 user user 845 2011-10-05 16:04 ./include/xbt/synchro.h
 -rw-r--r-- 1 user user 2296 2011-10-05 16:04 ./include/xbt/mallocator.h
 -rw-r--r-- 1 user user 9553 2011-10-05 16:04 ./include/xbt/dynar.h
 -rw-r--r-- 1 user user 1444 2011-10-05 16:04 ./include/xbt/heap.h
 -rw-r--r-- 1 user user 876 2011-10-05 16:04 ./include/xbt.h
--rw-r--r-- 1 user user 2023 2011-10-05 16:04 ./include/gras/timer.h
--rw-r--r-- 1 user user 5531 2011-10-05 16:04 ./include/gras/transport.h
--rw-r--r-- 1 user user 27038 2011-10-05 16:04 ./include/gras/datadesc.h
--rw-r--r-- 1 user user 2475 2011-10-05 16:04 ./include/gras/process.h
--rw-r--r-- 1 user user 2680 2011-10-05 16:04 ./include/gras/virtu.h
--rw-r--r-- 1 user user 7119 2011-10-05 16:04 ./include/gras/emul.h
--rw-r--r-- 1 user user 981 2011-10-05 16:04 ./include/gras/module.h
--rw-r--r-- 1 user user 12302 2011-10-05 16:04 ./include/gras/messages.h
--rw-r--r-- 1 user user 3571 2011-10-05 16:04 ./include/amok/peermanagement.h
--rw-r--r-- 1 user user 6945 2011-10-05 16:04 ./include/amok/bandwidth.h
 -rw-r--r-- 1 user user 4635 2011-10-05 16:04 ./include/msg/datatypes.h
 -rw-r--r-- 1 user user 12038 2011-10-05 16:04 ./include/msg/msg.h
 -rw-r--r-- 1 user user 3641 2012-03-13 14:44 ./include/simgrid_config.h
 -rw-r--r-- 1 user user 3346 2011-10-05 16:04 ./include/simix/datatypes.h
 -rw-r--r-- 1 user user 4040 2011-10-05 16:04 ./include/simix/context.h
 -rw-r--r-- 1 user user 12710497 2012-03-13 14:44 ./lib/libsimgrid.so.3.6.2
--rw-r--r-- 1 user user 5550818 2012-03-13 14:44 ./lib/libgras.so.3.6.2
 -rwxr-xr-x 1 user user 918 2012-03-13 14:44 ./bin/smpicc
 -rwxr-xr-x 1 user user 7292 2012-03-13 14:44 ./bin/smpirun
 -rwxr-xr-x 1 user user 1990 2012-03-13 14:44 ./bin/smpif2c
 -rwxr-xr-x 1 user user 5018 2011-10-05 16:04 ./bin/simgrid_update_xml
 -rwxr-xr-x 1 user user 66986 2012-03-13 14:44 ./bin/graphicator
--rwxr-xr-x 1 user user 322217 2012-03-13 14:45 ./bin/gras_stub_generator
 -rwxr-xr-x 1 user user 2993 2011-10-05 16:04 ./bin/simgrid-colorizer
 -rwxr-xr-x 1 user user 820 2012-03-13 14:44 ./bin/smpiff
 -rwxr-xr-x 1 user user 356434 2012-03-13 14:44 ./bin/tesh
index b41fe4d..ac206ca 100644 (file)
@@ -5,12 +5,6 @@
       to define some properties on hosts, processes and links. 
       It is used in several regression cases on properties -->
  
- <!-- Some properties' name is prefixed by SG_TEST_ only to simplify
-      the test of GRAS on real life: we don't want to display the whole
-      user's environment here, only the ones related to the test.
-      
-      Of course, this restriction is not needed in your own platforms. -->
  <platform version="3">
  <AS  id="AS0"  routing="Full">
    <prop id="filename" value="prop.xml"/>
    
    <AS  id="AS4"  routing="Full">
           <host id="host1" power="1000000000">
-            <prop id="SG_TEST_Hdd" value="180"/>
-            <prop id="SG_TEST_mem" value="4"/>
+            <prop id="Hdd" value="180"/>
+            <prop id="mem" value="4"/>
           </host>
           
           <host id="host2" power="1000000000">
-            <prop id="SG_TEST_Hdd" value="120"/>
+            <prop id="Hdd" value="120"/>
           </host>
           
           <link id="l1" bandwidth="125000000" latency="0.000100">
index 02e1579..a3525c5 100644 (file)
@@ -32,7 +32,7 @@ if(NOT WIN32)
     PROPERTIES
     ADDITIONAL_MAKE_CLEAN_FILES "${extra_clean_files};${CMAKE_CURRENT_BINARY_DIR}/sd_test")
 
-else(NOT WIN32)
+else()
   target_link_libraries(ex_sd_test simgrid)
   target_link_libraries(sd_test2 simgrid)
   target_link_libraries(sd_fail simgrid)
@@ -51,7 +51,7 @@ else(NOT WIN32)
   set_directory_properties(
     PROPERTIES
     ADDITIONAL_MAKE_CLEAN_FILES "${extra_clean_files};${CMAKE_CURRENT_BINARY_DIR}/sd_test.exe")
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index 5711972..585e989 100644 (file)
@@ -7,9 +7,9 @@ add_executable(dax_test dax_test.c)
 ### Add definitions for compile
 if(NOT WIN32)
   target_link_libraries(dax_test simgrid pthread m )
-else(NOT WIN32)
+else()
   target_link_libraries(dax_test simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index 42c8194..531d82d 100644 (file)
@@ -100,24 +100,24 @@ $ $SG_TEST_EXENV ${bindir:=.}/dax_test --log=no_loc ../2clusters.xml ./smalldax.
 > [0.000000] [sd_task/INFO]     3@task1_o3_end
 > [0.000000] [test/INFO] ------------------- Schedule tasks ---------------------------
 > [0.000000] [test/INFO] ------------------- Run the schedule ---------------------------
-> [84.185919] [test/INFO] ------------------- Produce the trace file---------------------------
-> [84.185919] [test/INFO] Producing the trace of the run into ./smalldax.trace
+> [84.066238] [test/INFO] ------------------- Produce the trace file---------------------------
+> [84.066238] [test/INFO] Producing the trace of the run into ./smalldax.trace
 
 $ cat ./smalldax.trace
 > [0.000000] C1-00 compute 0.000000 # root
-> [0.030300] C1-01 compute 42000000000.000000 # 1@task1
-> [0.030300] C1-02 compute 42000000000.000000 # 2@task2
-> [42.060600] C1-03 compute 42000000000.000000 # 3@task1
+> [0.016300] C1-01 compute 42000000000.000000 # 1@task1
+> [0.016300] C1-02 compute 42000000000.000000 # 2@task2
+> [42.032600] C1-03 compute 42000000000.000000 # 3@task1
 > [0.000000] C1-00 send C1-02 1000000.000000 # root_i2_2@task2
-> [0.030300] C1-02 recv C1-00 1000000.000000 # root_i2_2@task2
-> [42.030300] C1-01 send C1-03 1000000.000000 # 1@task1_o1_3@task1
-> [42.060600] C1-03 recv C1-01 1000000.000000 # 1@task1_o1_3@task1
-> [42.030300] C1-02 send C1-03 1000000.000000 # 2@task2_o2_3@task1
-> [42.060600] C1-03 recv C1-02 1000000.000000 # 2@task2_o2_3@task1
-> [84.060600] C1-03 send C1-00 4167312.000000 # 3@task1_o3_end
-> [84.185919] C1-00 recv C1-03 4167312.000000 # 3@task1_o3_end
+> [0.016300] C1-02 recv C1-00 1000000.000000 # root_i2_2@task2
+> [42.016300] C1-01 send C1-03 1000000.000000 # 1@task1_o1_3@task1
+> [42.032600] C1-03 recv C1-01 1000000.000000 # 1@task1_o1_3@task1
+> [42.016300] C1-02 send C1-03 1000000.000000 # 2@task2_o2_3@task1
+> [42.032600] C1-03 recv C1-02 1000000.000000 # 2@task2_o2_3@task1
+> [84.032600] C1-03 send C1-00 4167312.000000 # 3@task1_o3_end
+> [84.066238] C1-00 recv C1-03 4167312.000000 # 3@task1_o3_end
 > [0.000000] C1-00 send C1-01 1000000.000000 # root_i1_1@task1
-> [0.030300] C1-01 recv C1-00 1000000.000000 # root_i1_1@task1
-> [84.185919] C1-00 compute 0.000000 # end
+> [0.016300] C1-01 recv C1-00 1000000.000000 # root_i1_1@task1
+> [84.066238] C1-00 compute 0.000000 # end
 
 $ cmake -E remove -f ./dax.dot ./smalldax.trace
index f48f53b..eaabdf8 100644 (file)
@@ -18,15 +18,15 @@ if(HAVE_GRAPHVIZ)
       PROPERTIES
       ADDITIONAL_MAKE_CLEAN_FILES "${extra_clean_files};${CMAKE_CURRENT_BINARY_DIR}/dot_test; ${CMAKE_CURRENT_BINARY_DIR}/simulate_dot;")
 
-  else(NOT WIN32)
+  else()
     target_link_libraries(dot_test simgrid)    #target_link_libraries(<name_of_targe> <dependencies>)
     target_link_libraries(simulate_dot simgrid)        #target_link_libraries(<name_of_targe> <dependencies>)
     target_link_libraries(dot_test2 simgrid)   #target_link_libraries(<name_of_targe> <dependencies>)
     set_directory_properties(
       PROPERTIES
       ADDITIONAL_MAKE_CLEAN_FILES "${extra_clean_files};${CMAKE_CURRENT_BINARY_DIR}/dot_test; ${CMAKE_CURRENT_BINARY_DIR}/simulate_dot;")
-  endif(NOT WIN32)
-endif(HAVE_GRAPHVIZ)
+  endif()
+endif()
 
 set(tesh_files
   ${tesh_files}
@@ -54,6 +54,5 @@ set(txt_files
   ${CMAKE_CURRENT_SOURCE_DIR}/dag_with_cycle.dot
   ${CMAKE_CURRENT_SOURCE_DIR}/dag_with_good_schedule.dot
   ${CMAKE_CURRENT_SOURCE_DIR}/dag.dot
-  ${CMAKE_CURRENT_SOURCE_DIR}/dag.trace
   PARENT_SCOPE
   )
index 3380667..fc54486 100644 (file)
@@ -186,38 +186,38 @@ $ $SG_TEST_EXENV ./dot_test ${srcdir:=.}/../2clusters.xml ${srcdir:=.}/dag.dot
 > [0.000000] [sd_task/INFO]     7->end
 > [0.000000] [test/INFO] ------------------- Schedule tasks ---------------------------
 > [0.000000] [test/INFO] ------------------- Run the schedule ---------------------------
-> [131.443480] [test/INFO] ------------------- Produce the trace file---------------------------
-> [131.443480] [test/INFO] Producing the trace of the run into dag.trace
+> [60.002281] [test/INFO] ------------------- Produce the trace file---------------------------
+> [60.002281] [test/INFO] Producing the trace of the run into dag.trace
 
 $ cat ${srcdir:=.}/dag.trace
 > [0.000000] C2-05 compute 0.000000 # root
 > [0.000000] C2-06 compute 10000000129.452715 # 0
-> [2.000600] C2-07 compute 10000000131.133657 # 1
-> [4.001200] C2-08 compute 10000000121.124870 # 2
-> [6.001800] C2-09 compute 10000000230.608025 # 3
-> [8.001800] C1-00 compute 10000000004.994019 # 4
-> [50.721440] C1-01 compute 10000000046.016401 # 5
-> [60.721440] C1-02 compute 10000000091.598791 # 6
-> [70.722040] C1-03 compute 10000000040.679438 # 7
-> [80.722640] C1-04 compute 10000000250.490017 # 8
-> [90.722641] C2-05 compute 10000000079.267649 # 9
-> [6.001200] C2-08 send C2-09 10001.781645 # 2->3
-> [6.001800] C2-09 recv C2-08 10001.781645 # 2->3
-> [70.721440] C1-02 send C1-03 10004.920415 # 6->7
-> [70.722040] C1-03 recv C1-02 10004.920415 # 6->7
+> [2.000380] C2-07 compute 10000000131.133657 # 1
+> [4.000760] C2-08 compute 10000000121.124870 # 2
+> [6.001140] C2-09 compute 10000000230.608025 # 3
+> [8.001140] C1-00 compute 10000000004.994019 # 4
+> [18.001520] C1-01 compute 10000000046.016401 # 5
+> [28.001520] C1-02 compute 10000000091.598791 # 6
+> [38.001901] C1-03 compute 10000000040.679438 # 7
+> [48.002281] C1-04 compute 10000000250.490017 # 8
+> [58.002281] C2-05 compute 10000000079.267649 # 9
+> [6.000760] C2-08 send C2-09 10001.781645 # 2->3
+> [6.001140] C2-09 recv C2-08 10001.781645 # 2->3
+> [38.001521] C1-02 send C1-03 10004.920415 # 6->7
+> [38.001901] C1-03 recv C1-02 10004.920415 # 6->7
 > [0.000000] C2-05 send C1-01 10014000.000000 # root->5
-> [50.721440] C1-01 recv C2-05 10014000.000000 # root->5
-> [4.000600] C2-07 send C2-08 10004.164631 # 1->2
-> [4.001200] C2-08 recv C2-07 10004.164631 # 1->2
-> [80.722040] C1-03 send C2-05 10014000.000000 # 7->end
-> [131.443480] C2-05 recv C1-03 10014000.000000 # 7->end
+> [0.292217] C1-01 recv C2-05 10014000.000000 # root->5
+> [4.000380] C2-07 send C2-08 10004.164631 # 1->2
+> [4.000760] C2-08 recv C2-07 10004.164631 # 1->2
+> [48.001901] C1-03 send C2-05 10014000.000000 # 7->end
+> [48.294118] C2-05 recv C1-03 10014000.000000 # 7->end
 > [2.000000] C2-06 send C2-07 10001.389601 # 0->1
-> [2.000600] C2-07 recv C2-06 10001.389601 # 0->1
-> [18.001800] C1-00 send C1-01 10029.262823 # 4->5
-> [18.002401] C1-01 recv C1-00 10029.262823 # 4->5
-> [80.722040] C1-03 send C1-04 10000.234049 # 7->8
-> [80.722640] C1-04 recv C1-03 10000.234049 # 7->8
-> [131.443480] C2-05 compute 0.000000 # end
+> [2.000380] C2-07 recv C2-06 10001.389601 # 0->1
+> [18.001140] C1-00 send C1-01 10029.262823 # 4->5
+> [18.001520] C1-01 recv C1-00 10029.262823 # 4->5
+> [48.001901] C1-03 send C1-04 10000.234049 # 7->8
+> [48.002281] C1-04 recv C1-03 10000.234049 # 7->8
+> [60.002281] C2-05 compute 0.000000 # end
 
 $ rm -f dag.trace
 
@@ -436,38 +436,39 @@ $ $SG_TEST_EXENV ./simulate_dot --log=no_loc ${srcdir:=.}/../2clusters.xml ${src
 > [0.000000] [sd_task/INFO]     7->end
 > [0.000000] [sd_task/INFO]     7
 > [0.000000] [test/INFO] ------------------- Run the schedule ---------------------------
-> [18.001306] [test/INFO] ------------------- Produce the trace file---------------------------
-> [18.001306] [test/INFO] Producing the trace of the run into dag_with_good_schedule.trace
+> [18.000866] [test/INFO] ------------------- Produce the trace file---------------------------
+> [18.000866] [test/INFO] Producing the trace of the run into dag_with_good_schedule.trace
 
 $ cat ${srcdir:=.}/dag_with_good_schedule.trace
 > [0.000000] C2-05 compute 0.000000 # root
 > [0.000000] C2-06 compute 10000000129.452715 # 0
 > [0.000000] C2-05 compute 10000000131.133657 # 1
-> [2.000600] C2-06 compute 10000000121.124870 # 2
-> [4.000635] C2-06 compute 10000000230.608025 # 3
-> [6.000635] C2-05 compute 10000000004.994019 # 4
-> [8.000670] C2-05 compute 10000000046.016401 # 5
-> [10.000670] C2-05 compute 10000000091.598791 # 6
-> [12.000706] C2-05 compute 10000000040.679438 # 7
-> [14.001306] C2-06 compute 10000000250.490017 # 8
-> [16.001306] C2-06 compute 10000000079.267649 # 9
-> [4.000600] C2-06 send C2-06 10001.781645 # 2->3
-> [4.000635] C2-06 recv C2-06 10001.781645 # 2->3
-> [12.000670] C2-05 send C2-05 10004.920415 # 6->7
-> [12.000706] C2-05 recv C2-05 10004.920415 # 6->7
+> [2.000380] C2-06 compute 10000000121.124870 # 2
+> [4.000415] C2-06 compute 10000000230.608025 # 3
+> [6.000415] C2-05 compute 10000000004.994019 # 4
+> [8.000450] C2-05 compute 10000000046.016401 # 5
+> [10.000450] C2-05 compute 10000000091.598791 # 6
+> [12.000485] C2-05 compute 10000000040.679438 # 7
+> [14.000865] C2-06 compute 10000000250.490017 # 8
+> [16.000866] C2-06 compute 10000000079.267649 # 9
+> [4.000380] C2-06 send C2-06 10001.781645 # 2->3
+> [4.000415] C2-06 recv C2-06 10001.781645 # 2->3
+> [12.000450] C2-05 send C2-05 10004.920415 # 6->7
+> [12.000485] C2-05 recv C2-05 10004.920415 # 6->7
 > [0.000000] C2-05 send C2-05 10014000.000000 # root->5
 > [0.020123] C2-05 recv C2-05 10014000.000000 # root->5
 > [2.000000] C2-05 send C2-06 10004.164631 # 1->2
-> [2.000600] C2-06 recv C2-05 10004.164631 # 1->2
-> [14.000706] C2-05 send C2-05 10014000.000000 # 7->end
-> [14.020829] C2-05 recv C2-05 10014000.000000 # 7->end
+> [2.000380] C2-06 recv C2-05 10004.164631 # 1->2
+> [14.000485] C2-05 send C2-05 10014000.000000 # 7->end
+> [14.020609] C2-05 recv C2-05 10014000.000000 # 7->end
 > [2.000000] C2-06 send C2-06 10001.389601 # 0->2
 > [2.000035] C2-06 recv C2-06 10001.389601 # 0->2
-> [8.000635] C2-05 send C2-05 10029.262823 # 4->5
-> [8.000670] C2-05 recv C2-05 10029.262823 # 4->5
-> [14.000706] C2-05 send C2-06 10000.234049 # 7->8
-> [14.001306] C2-06 recv C2-05 10000.234049 # 7->8
-> [18.001306] C2-05 compute 0.000000 # end
+> [8.000415] C2-05 send C2-05 10029.262823 # 4->5
+> [8.000450] C2-05 recv C2-05 10029.262823 # 4->5
+> [14.000485] C2-05 send C2-06 10000.234049 # 7->8
+> [14.000865] C2-06 recv C2-05 10000.234049 # 7->8
+> [18.000866] C2-05 compute 0.000000 # end
+
 
 $ rm -f ${srcdir:=.}/dag_with_good_schedule.trace
 
index feab054..c6267e4 100644 (file)
@@ -7,9 +7,9 @@ add_executable(goal_test goal_test.c)
 ### Add definitions for compile
 if(NOT WIN32)
   target_link_libraries(goal_test simgrid pthread m )
-else(NOT WIN32)
+else()
   target_link_libraries(goal_test simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index ab76bc6..e7b6270 100644 (file)
@@ -94,7 +94,7 @@ int main(int argc, char **argv) {
     done=SD_simulate(-1);
   } while(!xbt_dynar_is_empty(done));
   xbt_os_timer_stop(timer);
-  printf("parse_time:%lf\n", xbt_os_timer_elapsed(timer) );
+  printf("exec_time:%lf\n", xbt_os_timer_elapsed(timer) );
 
   xbt_dynar_free(&done);
   xbt_dynar_free(&reclaimed);
index a7150cd..3f0417f 100644 (file)
@@ -7,9 +7,9 @@ add_executable(sd_meta sd_meta.c)
 ### Add definitions for compile
 if(NOT WIN32)
   target_link_libraries(sd_meta simgrid pthread m )
-else(NOT WIN32)
+else()
   target_link_libraries(sd_meta simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index 369da0f..a03e902 100644 (file)
@@ -15,7 +15,6 @@
 #include "xbt/log.h"
 #include "xbt/dynar.h"
 #include "xbt/dict.h"
-#include "xbt/time.h"
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(sd_test,
                              "Logging specific to this SimDag example");
index c7b5192..04e4cce 100644 (file)
@@ -7,9 +7,9 @@ add_executable(sd_prop sd_prop.c)
 ### Add definitions for compile
 if(NOT WIN32)
   target_link_libraries(sd_prop simgrid pthread m )
-else(NOT WIN32)
+else()
   target_link_libraries(sd_prop simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index 06f4e75..67c3951 100644 (file)
@@ -26,7 +26,7 @@ int main(int argc, char **argv)
   char *key, *data;
   char noexist[] = "NoProp";
   const char *value;
-  char exist[] = "SG_TEST_Hdd";
+  char exist[] = "Hdd";
 
   /* initialisation of SD */
   SD_init(&argc, argv);
index f08e9b9..6def7e0 100755 (executable)
@@ -5,19 +5,19 @@ p Simple test of simdag with properties
 $ $SG_TEST_EXENV properties/sd_prop ${srcdir:=.}/../platforms/prop.xml
 > [0.000000] [surf_workstation/INFO] surf_workstation_model_init_ptask_L07
 > [0.000000] [test/INFO] Property list for workstation host1
+> [0.000000] [test/INFO]       Property: mem has value: 4
 > [0.000000] [test/INFO]       Property: NewProp has value: newValue
-> [0.000000] [test/INFO]       Property: SG_TEST_Hdd has value: 180
-> [0.000000] [test/INFO]       Property: SG_TEST_mem has value: 4
+> [0.000000] [test/INFO]       Property: Hdd has value: 180
 > [0.000000] [test/INFO]       Property: NoProp is undefined
 > [0.000000] [test/INFO] Property list for workstation host2
-> [0.000000] [test/INFO]       Property: SG_TEST_Hdd on host: 120
+> [0.000000] [test/INFO]       Property: Hdd on host: 120
 > [0.000000] [test/INFO] Modify an existing property
-> [0.000000] [test/INFO]       Property: SG_TEST_Hdd old value: 120
-> [0.000000] [test/INFO]       Property: SG_TEST_Hdd new value: 250
+> [0.000000] [test/INFO]       Property: Hdd old value: 120
+> [0.000000] [test/INFO]       Property: Hdd new value: 250
 > [0.000000] [sd_workstation/INFO] Displaying workstation host2
 > [0.000000] [sd_workstation/INFO]   - power: 1000000000
 > [0.000000] [sd_workstation/INFO]   - available power: 1.00
 > [0.000000] [sd_workstation/INFO]   - access mode: Exclusive
 > [0.000000] [sd_workstation/INFO]     no task running
 > [0.000000] [sd_workstation/INFO]   - properties:
-> [0.000000] [sd_workstation/INFO]     SG_TEST_Hdd->250
+> [0.000000] [sd_workstation/INFO]     Hdd->250
index 7e07f06..c562c14 100644 (file)
@@ -7,9 +7,9 @@ add_executable(minmin_test minmin_test.c)
 ### Add definitions for compile
 if(NOT WIN32)
   target_link_libraries(minmin_test simgrid pthread m)
-else(NOT WIN32)
+else()
   target_link_libraries(minmin_test simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index 2e3f1a2..f45121a 100644 (file)
@@ -7,31 +7,32 @@ $ $SG_TEST_EXENV ${bindir:=.}/minmin_test --log=sd_daxparse.thresh:critical ${sr
 > [0.000000] [test/INFO] Schedule ID00002@mProjectPP on Host 27
 > [0.000105] [test/INFO] Schedule ID00000@mProjectPP on Host 26
 > [0.000120] [test/INFO] Schedule ID00003@mProjectPP on Host 30
-> [0.000327] [test/INFO] Schedule ID00004@mProjectPP on Host 27
-> [0.000434] [test/INFO] Schedule ID00001@mProjectPP on Host 32
-> [14.576439] [test/INFO] Schedule ID00010@mDiffFit on Host 26
+> [0.000325] [test/INFO] Schedule ID00004@mProjectPP on Host 27
+> [0.000433] [test/INFO] Schedule ID00001@mProjectPP on Host 32
+> [14.576312] [test/INFO] Schedule ID00010@mDiffFit on Host 26
 > [17.049690] [test/INFO] Schedule ID00008@mDiffFit on Host 27
-> [29.541537] [test/INFO] Schedule ID00013@mDiffFit on Host 26
-> [32.637908] [test/INFO] Schedule ID00009@mDiffFit on Host 30
-> [32.638114] [test/INFO] Schedule ID00011@mDiffFit on Host 27
-> [32.638217] [test/INFO] Schedule ID00005@mDiffFit on Host 26
-> [32.638233] [test/INFO] Schedule ID00006@mDiffFit on Host 32
-> [32.638445] [test/INFO] Schedule ID00012@mDiffFit on Host 31
-> [32.638548] [test/INFO] Schedule ID00007@mDiffFit on Host 28
-> [60.428541] [test/INFO] Schedule ID00014@mConcatFit on Host 27
-> [61.220372] [test/INFO] Schedule ID00015@mBgModel on Host 27
-> [62.762602] [test/INFO] Schedule ID00016@mBackground on Host 27
-> [62.762618] [test/INFO] Schedule ID00017@mBackground on Host 26
-> [62.762724] [test/INFO] Schedule ID00020@mBackground on Host 30
-> [62.762824] [test/INFO] Schedule ID00018@mBackground on Host 27
-> [62.762840] [test/INFO] Schedule ID00019@mBackground on Host 32
-> [88.556582] [test/INFO] Schedule ID00021@mImgTbl on Host 27
-> [90.149741] [test/INFO] Schedule ID00022@mAdd on Host 27
-> [93.440428] [test/INFO] Schedule ID00023@mShrink on Host 27
-> [97.725800] [test/INFO] Schedule ID00024@mJPEG on Host 27
-> [98.218253] [test/INFO] Schedule end on Host 27
-> [98.218679] [test/INFO] Simulation Time: 98.218679
-> [98.218679] [test/INFO] ------------------- Produce the trace file---------------------------
-> [98.218679] [test/INFO] Producing the trace of the run into ./Montage_25.jed
+> [29.541409] [test/INFO] Schedule ID00013@mDiffFit on Host 26
+> [32.620710] [test/INFO] Schedule ID00009@mDiffFit on Host 30
+> [32.620912] [test/INFO] Schedule ID00011@mDiffFit on Host 27
+> [32.621015] [test/INFO] Schedule ID00005@mDiffFit on Host 26
+> [32.621030] [test/INFO] Schedule ID00006@mDiffFit on Host 32
+> [32.621243] [test/INFO] Schedule ID00012@mDiffFit on Host 31
+> [32.621345] [test/INFO] Schedule ID00007@mDiffFit on Host 28
+> [60.411166] [test/INFO] Schedule ID00014@mConcatFit on Host 27
+> [61.202997] [test/INFO] Schedule ID00015@mBgModel on Host 27
+> [62.745225] [test/INFO] Schedule ID00016@mBackground on Host 27
+> [62.745241] [test/INFO] Schedule ID00017@mBackground on Host 26
+> [62.745347] [test/INFO] Schedule ID00020@mBackground on Host 30
+> [62.745447] [test/INFO] Schedule ID00018@mBackground on Host 27
+> [62.745463] [test/INFO] Schedule ID00019@mBackground on Host 32
+> [88.539205] [test/INFO] Schedule ID00021@mImgTbl on Host 27
+> [90.115680] [test/INFO] Schedule ID00022@mAdd on Host 27
+> [93.406367] [test/INFO] Schedule ID00023@mShrink on Host 27
+> [97.691739] [test/INFO] Schedule ID00024@mJPEG on Host 27
+> [98.184192] [test/INFO] Schedule end on Host 27
+> [98.184618] [test/INFO] Simulation Time: 98.184618
+> [98.184618] [test/INFO] ------------------- Produce the trace file---------------------------
+> [98.184618] [test/INFO] Producing the trace of the run into ./Montage_25.jed
+
 
 $ cmake -E remove -f ${srcdir:=.}/Montage_25.jed
\ No newline at end of file
index 1bfccc1..a345cff 100644 (file)
@@ -16,5 +16,5 @@ $ $SG_TEST_EXENV ./sd_test ${srcdir:=.}/../msg/msg_platform.xml
 > [0.000000] [sd_test/INFO] Communication time for 2000000.000000 bytes between Jacquelin and Intel: 4.306781
 > [0.000000] [sd_test/INFO] Communication time for 3000000.000000 bytes between Intel and Jacquelin: 6.424864
 > [0.000000] [sd_test/INFO] Estimated time for 'Task D': 6.432146
-> [42.510099] [sd_test/INFO] Task 'Task D' start time: 0.000000, finish time: 21.255050
-> [42.510099] [sd_test/INFO] Task 'Task B' start time: 21.255050, finish time: 42.510099
+> [21.322061] [sd_test/INFO] Task 'Task D' start time: 0.000000, finish time: 10.661030
+> [21.322061] [sd_test/INFO] Task 'Task B' start time: 10.661030, finish time: 21.322061
index 7a64e2f..7a4d4e7 100644 (file)
@@ -4,4 +4,4 @@ p Simple test of simdag
 
 $ $SG_TEST_EXENV ./sd_test2 ${srcdir:=.}/2clusters.xml
 > [0.000000] [surf_workstation/INFO] surf_workstation_model_init_ptask_L07
-> [9.811800] [sd_test/INFO] Simulation time: 9.811800
+> [3.251960] [sd_test/INFO] Simulation time: 3.251960
index eac2bdc..6de37ed 100644 (file)
@@ -35,26 +35,26 @@ $ $SG_TEST_EXENV ./sd_seq_access ${srcdir:=.}/2clusters.xml
 > [4.000000] [sd_workstation/INFO]   - power: 5000000000
 > [4.000000] [sd_workstation/INFO]   - available power: 1.00
 > [4.000000] [sd_workstation/INFO]   - access mode: Space shared
-> [10.000300] [sd_seq_access/INFO]  Simulation was suspended, check workstation states
-> [10.000300] [sd_workstation/INFO] Displaying workstation C2-05
-> [10.000300] [sd_workstation/INFO]   - power: 5000000000
-> [10.000300] [sd_workstation/INFO]   - available power: 1.00
-> [10.000300] [sd_workstation/INFO]   - access mode: Exclusive
-> [10.000300] [sd_workstation/INFO]     no task running
-> [10.000300] [sd_workstation/INFO] Displaying workstation C2-06
-> [10.000300] [sd_workstation/INFO]   - power: 5000000000
-> [10.000300] [sd_workstation/INFO]   - available power: 1.00
-> [10.000300] [sd_workstation/INFO]   - access mode: Space shared
-> [14.000300] [sd_seq_access/INFO]  Simulation was suspended, check workstation states
-> [14.000300] [sd_workstation/INFO] Displaying workstation C2-05
-> [14.000300] [sd_workstation/INFO]   - power: 5000000000
-> [14.000300] [sd_workstation/INFO]   - available power: 1.00
-> [14.000300] [sd_workstation/INFO]   - access mode: Exclusive
-> [14.000300] [sd_workstation/INFO]     no task running
-> [14.000300] [sd_workstation/INFO] Displaying workstation C2-06
-> [14.000300] [sd_workstation/INFO]   - power: 5000000000
-> [14.000300] [sd_workstation/INFO]   - available power: 1.00
-> [14.000300] [sd_workstation/INFO]   - access mode: Space shared
+> [5.600300] [sd_seq_access/INFO]  Simulation was suspended, check workstation states
+> [5.600300] [sd_workstation/INFO] Displaying workstation C2-05
+> [5.600300] [sd_workstation/INFO]   - power: 5000000000
+> [5.600300] [sd_workstation/INFO]   - available power: 1.00
+> [5.600300] [sd_workstation/INFO]   - access mode: Exclusive
+> [5.600300] [sd_workstation/INFO]     no task running
+> [5.600300] [sd_workstation/INFO] Displaying workstation C2-06
+> [5.600300] [sd_workstation/INFO]   - power: 5000000000
+> [5.600300] [sd_workstation/INFO]   - available power: 1.00
+> [5.600300] [sd_workstation/INFO]   - access mode: Space shared
+> [9.600300] [sd_seq_access/INFO]  Simulation was suspended, check workstation states
+> [9.600300] [sd_workstation/INFO] Displaying workstation C2-05
+> [9.600300] [sd_workstation/INFO]   - power: 5000000000
+> [9.600300] [sd_workstation/INFO]   - available power: 1.00
+> [9.600300] [sd_workstation/INFO]   - access mode: Exclusive
+> [9.600300] [sd_workstation/INFO]     no task running
+> [9.600300] [sd_workstation/INFO] Displaying workstation C2-06
+> [9.600300] [sd_workstation/INFO]   - power: 5000000000
+> [9.600300] [sd_workstation/INFO]   - available power: 1.00
+> [9.600300] [sd_workstation/INFO]   - access mode: Space shared
 > [22.000000] [sd_seq_access/INFO]  Simulation was suspended, check workstation states
 > [22.000000] [sd_workstation/INFO] Displaying workstation C2-05
 > [22.000000] [sd_workstation/INFO]   - power: 5000000000
index 06da7a3..2f7e3b8 100644 (file)
@@ -12,10 +12,10 @@ $ $SG_TEST_EXENV ./simdag_tracing --cfg=tracing:1 --cfg=tracing/categorized:1 ${
 > [0.000000] [sd_seq_access/INFO] There is no task running on C2-06
 > [0.400000] [sd_seq_access/INFO] Task B is currently running on C2-05 (SD_TASK_COMM_E2E)
 > [0.400000] [sd_seq_access/INFO] Task B is currently running on C2-06 (SD_TASK_COMM_E2E)
-> [30.400300] [sd_seq_access/INFO] Task C is currently running on C2-05 (SD_TASK_COMP_SEQ)
-> [30.400300] [sd_seq_access/INFO] There is no task running on C2-06
-> [30.800300] [sd_seq_access/INFO] There is no task running on C2-05
-> [30.800300] [sd_seq_access/INFO] There is no task running on C2-06
+> [8.400300] [sd_seq_access/INFO] Task C is currently running on C2-05 (SD_TASK_COMP_SEQ)
+> [8.400300] [sd_seq_access/INFO] There is no task running on C2-06
+> [8.800300] [sd_seq_access/INFO] There is no task running on C2-05
+> [8.800300] [sd_seq_access/INFO] There is no task running on C2-06
 
 $ tail -n +3 ./simgrid.trace
 > %EventDef PajeDefineContainerType 0
@@ -199,84 +199,84 @@ $ tail -n +3 ./simgrid.trace
 > 8 0 5 24 0.000100
 > 8 0 4 25 125000000.000000
 > 8 0 5 25 0.000100
-> 15 0 6 0 G 10 0
-> 16 0 6 0 G 25 0
-> 15 0 7 0 G 25 1
-> 16 0 7 0 G 12 1
-> 15 0 7 0 G 12 2
-> 16 0 7 0 G 11 2
-> 15 0 8 0 G 11 3
-> 16 0 8 0 G 1 3
-> 15 0 7 0 G 12 4
-> 16 0 7 0 G 14 4
-> 15 0 8 0 G 14 5
-> 16 0 8 0 G 3 5
-> 15 0 7 0 G 12 6
-> 16 0 7 0 G 19 6
-> 15 0 8 0 G 19 7
-> 16 0 8 0 G 6 7
-> 15 0 7 0 G 12 8
-> 16 0 7 0 G 15 8
-> 15 0 8 0 G 15 9
-> 16 0 8 0 G 4 9
-> 15 0 7 0 G 12 10
-> 16 0 7 0 G 23 10
-> 15 0 7 0 G 23 11
-> 16 0 7 0 G 18 11
-> 15 0 7 0 G 18 12
-> 16 0 7 0 G 16 12
-> 15 0 7 0 G 16 13
-> 16 0 7 0 G 24 13
-> 15 0 7 0 G 24 14
-> 16 0 7 0 G 22 14
-> 15 0 8 0 G 22 15
-> 16 0 8 0 G 9 15
-> 15 0 7 0 G 24 16
-> 16 0 7 0 G 20 16
-> 15 0 8 0 G 20 17
-> 16 0 8 0 G 7 17
-> 15 0 7 0 G 24 18
-> 16 0 7 0 G 17 18
-> 15 0 8 0 G 17 19
-> 16 0 8 0 G 5 19
-> 15 0 7 0 G 24 20
-> 16 0 7 0 G 13 20
-> 15 0 8 0 G 13 21
-> 16 0 8 0 G 2 21
-> 15 0 7 0 G 24 22
-> 16 0 7 0 G 21 22
-> 15 0 8 0 G 21 23
-> 16 0 8 0 G 8 23
+> 15 0 6 0 topology 10 0
+> 16 0 6 0 topology 25 0
+> 15 0 7 0 topology 25 1
+> 16 0 7 0 topology 12 1
+> 15 0 7 0 topology 12 2
+> 16 0 7 0 topology 11 2
+> 15 0 8 0 topology 11 3
+> 16 0 8 0 topology 1 3
+> 15 0 7 0 topology 12 4
+> 16 0 7 0 topology 14 4
+> 15 0 8 0 topology 14 5
+> 16 0 8 0 topology 3 5
+> 15 0 7 0 topology 12 6
+> 16 0 7 0 topology 19 6
+> 15 0 8 0 topology 19 7
+> 16 0 8 0 topology 6 7
+> 15 0 7 0 topology 12 8
+> 16 0 7 0 topology 15 8
+> 15 0 8 0 topology 15 9
+> 16 0 8 0 topology 4 9
+> 15 0 7 0 topology 12 10
+> 16 0 7 0 topology 23 10
+> 15 0 7 0 topology 23 11
+> 16 0 7 0 topology 18 11
+> 15 0 7 0 topology 18 12
+> 16 0 7 0 topology 16 12
+> 15 0 7 0 topology 16 13
+> 16 0 7 0 topology 24 13
+> 15 0 7 0 topology 24 14
+> 16 0 7 0 topology 22 14
+> 15 0 8 0 topology 22 15
+> 16 0 8 0 topology 9 15
+> 15 0 7 0 topology 24 16
+> 16 0 7 0 topology 20 16
+> 15 0 8 0 topology 20 17
+> 16 0 8 0 topology 7 17
+> 15 0 7 0 topology 24 18
+> 16 0 7 0 topology 17 18
+> 15 0 8 0 topology 17 19
+> 16 0 8 0 topology 5 19
+> 15 0 7 0 topology 24 20
+> 16 0 7 0 topology 13 20
+> 15 0 8 0 topology 13 21
+> 16 0 8 0 topology 2 21
+> 15 0 7 0 topology 24 22
+> 16 0 7 0 topology 21 22
+> 15 0 8 0 topology 21 23
+> 16 0 8 0 topology 8 23
 > 1 9 3 btaskA "0.000000 0.000985 0.041631"
 > 1 10 1 ptaskA "0.000000 0.000985 0.041631"
 > 1 11 3 btaskB "0.176643 0.364602 0.091331"
 > 1 12 1 ptaskB "0.176643 0.364602 0.091331"
 > 1 13 3 btaskC "0.092298 0.487217 0.526750"
 > 1 14 1 ptaskC "0.092298 0.487217 0.526750"
-> 7 30.800300 1 10
-> 7 30.800300 1 1
-> 7 30.800300 1 3
-> 7 30.800300 1 6
-> 7 30.800300 1 4
-> 7 30.800300 1 9
-> 7 30.800300 3 24
-> 7 30.800300 1 7
-> 7 30.800300 3 12
-> 7 30.800300 1 5
-> 7 30.800300 3 16
-> 7 30.800300 1 2
-> 7 30.800300 3 23
-> 7 30.800300 1 8
-> 7 30.800300 3 18
-> 7 30.800300 3 22
-> 7 30.800300 3 20
-> 7 30.800300 3 17
-> 7 30.800300 3 13
-> 7 30.800300 3 21
-> 7 30.800300 3 25
-> 7 30.800300 3 11
-> 7 30.800300 3 14
-> 7 30.800300 3 19
-> 7 30.800300 3 15
+> 7 8.800300 1 10
+> 7 8.800300 1 1
+> 7 8.800300 1 3
+> 7 8.800300 1 6
+> 7 8.800300 1 4
+> 7 8.800300 1 9
+> 7 8.800300 3 24
+> 7 8.800300 1 7
+> 7 8.800300 3 12
+> 7 8.800300 1 5
+> 7 8.800300 3 16
+> 7 8.800300 1 2
+> 7 8.800300 3 23
+> 7 8.800300 1 8
+> 7 8.800300 3 18
+> 7 8.800300 3 22
+> 7 8.800300 3 20
+> 7 8.800300 3 17
+> 7 8.800300 3 13
+> 7 8.800300 3 21
+> 7 8.800300 3 25
+> 7 8.800300 3 11
+> 7 8.800300 3 14
+> 7 8.800300 3 19
+> 7 8.800300 3 15
 
 $ rm -f simgrid.trace
index ad50c21..4f8d621 100644 (file)
@@ -1,7 +1,11 @@
 cmake_minimum_required(VERSION 2.6)
 
 if(enable_smpi)
-  set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/bin/smpicc")
+  if(WIN32)
+    set(CMAKE_C_FLAGS "-include ${CMAKE_HOME_DIRECTORY}/include/smpi/smpi_main.h")
+  else()
+    set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc")
+  endif()
 
   set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
 
@@ -24,7 +28,7 @@ if(enable_smpi)
   target_link_libraries(mc_bugged2 m simgrid smpi )
   target_link_libraries(smpi_replay m simgrid smpi )
 
-endif(enable_smpi)
+endif()
 
 set(tesh_files
   ${tesh_files}
@@ -61,4 +65,4 @@ set(txt_files
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/one_trace
   ${CMAKE_CURRENT_SOURCE_DIR}/replay/split_traces
   PARENT_SCOPE
-  )  
\ No newline at end of file
+  )  
index f61e470..ece8c47 100644 (file)
@@ -1,21 +1,16 @@
 cmake_minimum_required(VERSION 2.6)
 
 if(enable_smpi)
-  set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/bin/smpicc")
-
+  set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc")
   set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
 
-add_executable(MM_mpi MM_mpi.c 2.5D_MM.c Summa.c Matrix_init.c)
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(MM_mpi simgrid pthread m smpi)
-else(NOT WIN32)
-  target_link_libraries(MM_mpi simgrid smpi)
-endif(NOT WIN32)
-endif(enable_smpi)
+  if(NOT WIN32)
+    add_executable(MM_mpi MM_mpi.c 2.5D_MM.c Summa.c Matrix_init.c)
+    ### Add definitions for compile
+    target_link_libraries(MM_mpi simgrid pthread m smpi)
+  endif()
+endif()
 
 set(tesh_files
   ${tesh_files}
index df0b9bc..d112cde 100644 (file)
 /*int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
   int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
  */
+#include <stdio.h>
+#include <string.h>
 #include <mpi.h>
 #include <math.h>
 #include <getopt.h>
-#include <stdio.h>
-#include <string.h>
 
  XBT_LOG_NEW_DEFAULT_CATEGORY(MM_mpi,
                              "Messages specific for this msg example");
index d2cbfb8..4cb7f06 100644 (file)
@@ -1,8 +1,6 @@
+#include <stdlib.h>
 #include "mpi.h"
 #include "wtime.h"
-#include <stdlib.h>
-
-
 
 void  mpi_error( void )
 {
index 75defac..5cd2f64 100644 (file)
@@ -8,6 +8,11 @@
 #include <stdlib.h>
 #include <mpi.h>
 
+#ifdef _WIN32
+  #define srandom srand
+  #define random rand
+#endif
+
 #define GETTIMEOFDAY_ERROR 1
 
 #define N_START 1
index 3aad3c2..f508f9d 100644 (file)
@@ -4,6 +4,7 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+#include <stdio.h>
 #include "smpi/smpi.h"
 
 int main(int argc, char *argv[])
index f23bb7b..6c9e8fe 100644 (file)
@@ -4,8 +4,8 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "mpi.h"
 #include <stdio.h>
+#include "mpi.h"
 #include "instr/instr.h"
 
 #define DATATOSENT 100000
index ac93a45..84923e1 100644 (file)
@@ -43,8 +43,8 @@ $ ../../bin/smpirun -trace -trace-grouped -trace-file smpi_traced.trace -hostfil
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/smpi/group' to '1'
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
 
-p Testing generation of triva configuration files
-$ ../../bin/smpirun -trace -trace-resource -trace-triva -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced_simple
+p Testing generation of viva configuration files
+$ ../../bin/smpirun -trace -trace-resource -trace-viva -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced_simple
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'maxmin/precision' to '1e-9'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/model' to 'SMPI'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/TCP_gamma' to '4194304'
@@ -53,13 +53,13 @@ $ ../../bin/smpirun -trace -trace-resource -trace-triva -trace-file smpi_traced.
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/smpi' to '1'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/categorized' to '1'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/uncategorized' to '1'
-> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'triva/categorized' to 'smpi_cat.plist'
-> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'triva/uncategorized' to 'smpi_uncat.plist'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/categorized' to 'smpi_cat.plist'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'viva/uncategorized' to 'smpi_uncat.plist'
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
-> [0.013981] [instr_config/INFO] No categories declared, ignoring generation of triva graph configuration
+> [0.013981] [instr_config/INFO] No categories declared, ignoring generation of viva graph configuration
 
 p Testing with parameters but without activating them with the safe switch (-trace)
-$ ../../bin/smpirun -trace-resource -trace-triva -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced_simple
+$ ../../bin/smpirun -trace-resource -trace-viva -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced_simple
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'maxmin/precision' to '1e-9'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/model' to 'SMPI'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/TCP_gamma' to '4194304'
index 1de1115..ff92c0e 100644 (file)
@@ -3,8 +3,9 @@
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
-#include <mpi.h>
+
 #include <stdio.h>
+#include <mpi.h>
 
 int main(int argc, char *argv[])
 {
diff --git a/examples/temps-gras-stub.mk b/examples/temps-gras-stub.mk
deleted file mode 100644 (file)
index 76447d6..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-## Generate the temp source files on need
-##
-
-$(foreach proc, $(PROCESSES), _$(NAME)_$(proc).c) _$(NAME)_simulator.c: $(srcdir)/$(NAME).xml $(top_builddir)/tools/gras/gras_stub_generator@EXEEXT@
-       [ x@EXEEXT@ = x ] || exenv=wine; $$exenv $(top_builddir)/tools/gras/gras_stub_generator@EXEEXT@ $(NAME) $(srcdir)/$(NAME).xml
-
-$(top_builddir)/tools/gras/gras_stub_generator@EXEEXT@:
-       make -C $(top_builddir)/tools/gras/ gras_stub_generator@EXEEXT@
-
-##
-## Cleanups
-CLEANFILES = _$(NAME)_simulator.c $(NAME).mk $(NAME).Makefile.local $(NAME).Makefile.remote $(NAME).deploy.sh \
-             $(foreach proc, $(PROCESSES), _$(NAME)_$(proc).c)
-
-MOSTLYCLEANFILES = $(NAME).trace
diff --git a/include/amok/bandwidth.h b/include/amok/bandwidth.h
deleted file mode 100644 (file)
index 6f5ff0b..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/* amok_bandwidth - Bandwidth test facilities                               */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef AMOK_BANDWIDTH_H
-#define AMOK_BANDWIDTH_H
-
-/** \addtogroup AMOK_bw
- *  \brief Test the bandwidth between two nodes
- *
- *  This module allows you to retrieve the bandwidth between to arbitrary hosts
- *  and saturating the links leading to them, provided that they run some GRAS 
- *  process which initialized this module.
- * 
- * \htmlonly <h3>Bandwidth measurement</h3>\endhtmlonly
- * 
- *  Retrieving the bandwidth is usually done by active measurment: one send
- *  a packet of known size, time how long it needs to go back and forth,
- *  and you get the bandwidth in Kb/s available on the wire.
- * 
- *  This is not as easy as it first seems to do so in GRAS. The first issue
- *  is that GRAS messages can get buffered, or the receiver cannot be
- *  waiting for the message when it arrives. This results in extra delays
- *  impacting the measurement quality. You thus have to setup a rendez-vous
- *  protocol. The second issue is that GRAS message do have an header, so
- *  figuring out their size is not trivial. Moreover, they get converted
- *  when the sender and receiver processor architecture are different,
- *  inducing extra delays. For this, GRAS provide the so-called measurement
- *  sockets. On them, you can send raw data which is not converted (see
- *  \ref XBT_sock_meas). 
- *
- *  Solving all these problems is quite error prone and anoying, so we
- *  implemented this in the current module so that you don't have to do it
- *  yourself. The API is very simple. Use amok_bw_test() to get the BW
- *  between the local host and the specified peer, or amok_bw_request() to
- *  get the BW between two remote hosts. The elapsed time, as long as the
- *  achieved bandwidth is returned in the last arguments of the functions.
- * 
- *  All sizes are in bytes. The \a buf_size is the size of the buffer
- *   (this is a socket parameter set automatically). The \a exp_size is the
- *   amount of data to send during an experiment. \a msg_size is the size
- *   of each message sent. These values allow you to study phenomenon such
- *   as TCP slow start (which are not correctly modelized by \ref SURF_API,
- *   yet). They are mimicked from the NWS API, and default values could be
- *   buf_size=32k, msg_size=16k and exp_size=64k. That means that the
- *   socket will be prepared to accept 32k in its buffer and then four
- *   messages of 16k will be sent (so that the total amount of data equals
- *   64k). Of course, you can use other values if you want to. 
- * 
- *  \htmlonly
- * <center><img align=center src="amok_bw_test.png" alt="amok bandwidth measurement protocol"><br>
- * Fig 1: AMOK bandwidth measurement protocol.</center>
- * <h3>Link saturation</h3>
- * \endhtmlonly
- * 
- *  You sometimes want to try saturating some link during the network
- *  related experiments (at least, we did ;). This also can turn quite
- *  untrivial to do, unless you use this great module. You can either ask
- *  for the saturation between the current host and a distant one with
- *  amok_bw_saturate_begin() or between two distant hosts with
- *  amok_bw_saturate_start(). In any case, remember that gras actors
- *  (processes) are not interruptible. It means that an actor you
- *  instructed to participate to a link saturation experiment will not do
- *  anything else until it is to its end (either because the asked duration
- *  was done or because someone used amok_bw_saturate_stop() on the emitter
- *  end of the experiment).
- * 
- *  The following figure depicts the used protocol. Note that any
- *  handshaking messages internal messages are omitted for sake of
- *  simplicity. In this example, the experiment ends before the planned
- *  experiment duration is over because one host use the
- *  amok_bw_saturate_stop() function, but things are not really different
- *  if the experiment stops alone. Also, it is not mandatory that the host
- *  calling amok_bw_saturate_stop() is the same than the one which called
- *  amok_bw_saturate_start(), despite what is depicted here.
- * 
- *  \htmlonly
- * <center><img align=center src="amok_bw_sat.png" alt="amok bandwidth saturation protocol"><br>
- * Fig 2: AMOK link saturation protocol.</center>
- * \endhtmlonly
- *
- *  @{
- */
-
-/* module handling */
-
-XBT_PUBLIC(void) amok_bw_init(void);
-XBT_PUBLIC(void) amok_bw_exit(void);
-
-XBT_PUBLIC(void) amok_bw_test(xbt_socket_t peer,
-                              unsigned long int buf_size,
-                              unsigned long int msg_size,
-                              unsigned long int msg_amount,
-                              double min_duration,
-                              /*OUT*/ double *sec, double *bw);
-
-XBT_PUBLIC(void) amok_bw_request(const char *from_name,
-                                 unsigned int from_port,
-                                 const char *to_name, unsigned int to_port,
-                                 unsigned long int buf_size,
-                                 unsigned long int msg_size,
-                                 unsigned long int msg_amount,
-                                 double min_duration, /*OUT*/ double *sec,
-                                 double *bw);
-
-XBT_PUBLIC(double *) amok_bw_matrix(xbt_dynar_t hosts,  /* dynar of xbt_host_t */
-                                    int buf_size_bw, int msg_size_bw,
-                                    int msg_amount_bw,
-                                    double min_duration);
-
-/* ***************************************************************************
- * Link saturation
- * ***************************************************************************/
-
-
-XBT_PUBLIC(void) amok_bw_saturate_start(const char *from_name,
-                                        unsigned int from_port,
-                                        const char *to_name,
-                                        unsigned int to_port,
-                                        unsigned int msg_size,
-                                        double duration);
-
-XBT_PUBLIC(void) amok_bw_saturate_begin(const char *to_name,
-                                        unsigned int to_port,
-                                        unsigned int msg_size,
-                                        double duration,
-                                        /*out */ double *elapsed,
-                                        double *bw);
-
-XBT_PUBLIC(void) amok_bw_saturate_stop(const char *from_name,
-                                       unsigned int from_port,
-                                       /*out */ double *time, double *bw);
-
-/** @} */
-
-#endif                          /* AMOK_BANDWIDTH_H */
diff --git a/include/amok/base.h b/include/amok/base.h
deleted file mode 100644 (file)
index 8d115ac..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/* amok_base - things needed in amok, but too small to constitute a module  */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef AMOK_BASE_H
-#define AMOK_BASE_H
-
-#include "gras/messages.h"
-
-/* ****************************************************************************
- * The common types used as payload in the messages and their definitions
- * ****************************************************************************/
-
-/**
- * amok_result_t:
- *
- * how to report the result of an experiment
- */
-
-typedef struct {
-  unsigned int timestamp;
-  double value;
-} amok_result_t;
-
-XBT_PUBLIC(void) amok_base_init(void);
-XBT_PUBLIC(void) amok_base_exit(void);
-
-
-#endif                          /* AMOK_BASE_H */
diff --git a/include/amok/peermanagement.h b/include/amok/peermanagement.h
deleted file mode 100644 (file)
index 1f2fd7a..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/* amok peer management - servers main loop and remote peer stopping        */
-
-/* Copyright (c) 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef AMOK_PEER_MANAGEMENT_H
-#define AMOK_PEER_MANAGEMENT_H
-
-#include <gras.h>
-
-/** \addtogroup AMOK_pm
- *  \brief Managing remote servers
- * 
- * This module provide the main loop of servers designed to answer to
- * callbacks. They can furthermore be stopped remotely.  
- * 
- * This module is especially useful to program following the centralized
- * master/slave architecture. In this architecture, one of the processes
- * acts as a master dispatching orders to the others, which are called
- * slaves. 
-  
- * The source code of the <b>slaves</b> then only consists in:
- *   - declaring the gras datatypes (see \ref GRAS_dd)
- *   - declaring the messages (with gras_msgtype_declare() or gras_msgtype_declare_rpc())
- *   - attaching the right callbacks to the messages (with gras_cb_register())
- *   - declaring the right repetitive actions (see \ref GRAS_timer)
- *   - joining the group (with amok_pm_group_join(), so that the master now it)
- *   - entering the endless loop (with amok_pm_mainloop()). 
- * The <b>master</b>, on its side, should create declare the datatypes and
- * messages just like slaves. It should then create a group with
- * amok_pm_group_new().
- * Afterward, there is two solutions. 
- *   - If your master is a deamon which never stops itself (just like regular UNIX daemons), it should: 
- *      - register the needed callbacks to messages comming from slaves
- *      - register repetitive actions 
- *      - entering the main loop.
- *   - If the master is not a deamon, it should:
- *      - wait a moment for the slaves registration (using gras_msg_handleall())
- *      - run its algoritpm. For this, it may call RPC on slaves, or explicitely wait (with gras_msg_wait()) for the answers it expects.
-
- * \section AMOK_pm_compat Compatibility issues
- * 
- * The API described here is as of SimGrid 3.2 and higher. In version 3.1
- * (where this module were introduced), all functions were named amok_hm_*
- * This was because the module used to be named HostManagement, but it was
- * renamed before being released to betterly express its purpose.
- * Unfortunately, the rename was not done properly before version 3.2.
- * 
- * @{
- */
-
-/* module handling */
-XBT_PUBLIC(void) amok_pm_init(void);
-XBT_PUBLIC(void) amok_pm_exit(void);
-
-XBT_PUBLIC(void) amok_pm_mainloop(double timeOut);
-
-XBT_PUBLIC(void) amok_pm_kill_hp(char *name, int port);
-XBT_PUBLIC(void) amok_pm_kill(xbt_socket_t buddy);
-XBT_PUBLIC(void) amok_pm_kill_sync(xbt_socket_t buddy);
-
-XBT_PUBLIC(xbt_dynar_t) amok_pm_group_new(const char *group_name);
-XBT_PUBLIC(xbt_dynar_t) amok_pm_group_get(xbt_socket_t master,
-                                          const char *group_name);
-
-XBT_PUBLIC(int) amok_pm_group_join(xbt_socket_t master,
-                                   const char *group_name);
-XBT_PUBLIC(void) amok_pm_group_leave(xbt_socket_t master,
-                                     const char *group_name);
-
-
-XBT_PUBLIC(void) amok_pm_group_shutdown(const char *group_name);
-XBT_PUBLIC(void) amok_pm_group_shutdown_remote(xbt_socket_t master,
-                                               const char *group_name);
-
-
-/** @} */
-#endif                          /* AMOK_peer_MANAGEMENT_H */
diff --git a/include/gras.h b/include/gras.h
deleted file mode 100644 (file)
index ba1cd5a..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/* gras.h - Public interface to the GRAS                                    */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_H
-#define GRAS_H
-
-#include <xbt.h>                /* our toolbox */
-#include <xbt/ex.h>             /* There's a whole bunch of exception handling in GRAS */
-
-#include <gras/process.h>
-#include <gras/module.h>
-#include <gras/virtu.h>
-#include <gras/emul.h>
-
-#include <gras/transport.h>
-#include <gras/messages.h>
-#include <gras/timer.h>
-
-XBT_PUBLIC(void) gras_init(int *argc, char **argv);
-XBT_PUBLIC(void) gras_exit(void);
-
-#endif                          /* GRAS_H */
diff --git a/include/gras/emul.h b/include/gras/emul.h
deleted file mode 100644 (file)
index b71ee1f..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-/* gras/emul.h - public interface to emulation support                      */
-/*                (specific parts for SG or RL)                             */
-
-/* Copyright (c) 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_COND_H
-#define GRAS_COND_H
-
-#include "xbt/misc.h"           /* SG_BEGIN_DECL */
-
-SG_BEGIN_DECL()
-/** @addtogroup GRAS_emul
- *  @brief Code execution "emulation" and "virtualization".
- * 
- *  Emulation and virtualization words have a lot of different meanings in
- *  computer science. Here is what we mean, and what this module allows you
- *  to do (if it does not match your personal beliefs, I'm sorry):
- * 
- *  - Virtualization: Having some specific code for the simulation or for the reality
- *  - Emulation: Report within the simulator the execution time of your code
- * 
- *  \section GRAS_emul_virtualization Virtualization 
- * 
- *  The whole idea of GRAS is to share the same code between the simulator
- *  and the real implementation. But it is sometimes impossible, such as
- *  when you want to deal with the OS. As an example, you may want to add
- *  some extra delay before initiating a communication in RL to ensure that
- *  the receiver is listening. This is usually useless in SG since you have
- *  a much better control on process launch time.
- * 
- *  This would be done with the following snipet:
- *  \verbatim if (gras_if_RL()) 
-   gras_os_sleep(1);\endverbatim
- * 
- *  Please note that those are real functions and not pre-processor
- *  defines. This is to ensure that the same object code can be linked
- *  against the SG library or the RL one without recompilation.
- * 
- *  @{
- */
-/** \brief Returns true only if the program runs on real life */
-XBT_PUBLIC(int) gras_if_RL(void);
-
-/** \brief Returns true only if the program runs within the simulator */
-XBT_PUBLIC(int) gras_if_SG(void);
-
-/** @} */
-
-XBT_PUBLIC(int) gras_bench_always_begin(const char *location, int line);
-XBT_PUBLIC(int) gras_bench_always_end(void);
-XBT_PUBLIC(int) gras_bench_once_begin(const char *location, int line);
-XBT_PUBLIC(int) gras_bench_once_end(void);
-
-/** @addtogroup GRAS_emul
- *  \section GRAS_emul_timing Emulation
- *  
- *  For simulation accuracy, it is mandatory to report the execution time
- *  of your code into the simulator. For example, if your application is a
- *  parallel matrix multiplication, you naturally have to slow down the
- *  simulated hosts actually doing the computation.
- *  
- *  If you know beforehands how long each task will last, simply add a call
- *  to the gras_bench_fixed function described below. If not, you can have
- *  GRAS benchmarking your code automatically. Simply enclose the code to
- *  time between a macro GRAS_BENCH_*_BEGIN and GRAS_BENCH_*_END, and
- *  you're done. There is three pair of such macros, whose characteristics
- *  are summarized in the following table. 
- * 
- *  <table>
- *   <tr>
- *    <td><b>Name</b></td> 
- *    <td><b>Run on host machine?</b></td>
- *    <td><b>Benchmarked?</b></td>
- *    <td><b>Corresponding time reported to simulation?</b></td>
- *   </tr> 
- *   <tr>
- *    <td>GRAS_BENCH_ALWAYS_BEGIN()<br> 
- *        GRAS_BENCH_ALWAYS_END()</td> 
- *    <td>Each time</td>
- *    <td>Each time</td>
- *    <td>Each time</td>
- *   </tr>
- *   <tr>
- *    <td>GRAS_BENCH_ONCE_RUN_ONCE_BEGIN()<br> 
- *        GRAS_BENCH_ONCE_RUN_ONCE_END()</td>
- *    <td>Only first time</td>
- *    <td>Only first time</td>
- *    <td>Each time (with stored value)</td>
- *   </tr>
- *   <tr>
- *    <td>GRAS_BENCH_ONCE_RUN_ALWAYS_BEGIN()<br> 
- *        GRAS_BENCH_ONCE_RUN_ALWAYS_END()</td>
- *    <td>Each time</td>
- *    <td>Only first time</td>
- *    <td>Each time (with stored value)</td>
- *   </tr>
- *  </table>
- *  
- *  As you can see, whatever macro pair you use, the corresponding value is
- *  repported to the simulator. After all, that's what those macro are
- *  about ;)
- * 
- *  The GRAS_BENCH_ALWAYS_* macros are the simplest ones. Each time the
- *  corresponding block is encountered, the corresponding code is executed
- *  and timed. Then, the simulated host is given the corresponding amount
- *  of work.
- * 
- *  The GRAS_BENCH_ONCE_RUN_ONCE_* macros are good for cases where you know
- *  that your execution time is constant and where you don't care about the
- *  result in simulation mode. In our example, each sub-block
- *  multiplication takes exactly the same amount of work (time depends only
- *  on size, not on content), and the operation result can safely be
- *  ignored for algorithm result. Doing so allows you to considerably
- *  reduce the amount of computation needed when running on simulator.
- * 
- *  The GRAS_BENCH_ONCE_RUN_ALWAYS_* macros are good for cases where you
- *  know that each block will induce the same amount of work (you thus
- *  don't want to bench it each time), but you actually need the result (so
- *  you have to run it each time). You may ask why you don't use
- *  GRAS_BENCH_ONCE_RUN_ONCE_* macros in this case (why you save the
- *  benchmarking time).  The timing operation is not very intrusive by
- *  itself, but it has to be done in an exclusive way between the several
- *  GRAS threads (protected by mutex). So, the day where there will be
- *  threads in GRAS, this will do a big difference. Ok, I agree. For now,
- *  it makes no difference.
- * 
- *  <b>Caveats</b>
- * 
- *   - Blocks are automatically differenciated using the filename and line
- *     position at which the *_BEGIN part was called. Don't put two of them
- *     on the same line.
- * 
- *   - You cannot nest blocks. It would make no sense, either.
- * 
- *   - By the way, GRAS is not exactly designed for parallel algorithm such
- *     as parallel matrix multiplication but for distributed ones, you weirdo.
- *     But it's just an example ;)
- *  
- * @{
- */
-/** \brief Start benchmarking this code block
-    \hideinitializer */
-#define GRAS_BENCH_ALWAYS_BEGIN()           gras_bench_always_begin(__FILE__, __LINE__)
-/** \brief Stop benchmarking this code block
-    \hideinitializer */
-#define GRAS_BENCH_ALWAYS_END()             gras_bench_always_end()
-
-/** \brief Start benchmarking this code block if it has never been benchmarked, run it in any case
- *  \hideinitializer */
-#define GRAS_BENCH_ONCE_RUN_ALWAYS_BEGIN()  gras_bench_once_begin(__FILE__, __LINE__)
-/** \brief Stop benchmarking this part of the code
-    \hideinitializer */
-#define GRAS_BENCH_ONCE_RUN_ALWAYS_END()    gras_bench_once_end()
-
-/** \brief Start benchmarking this code block if it has never been benchmarked, ignore it if it was
-    \hideinitializer */
-#define GRAS_BENCH_ONCE_RUN_ONCE_BEGIN()    if (gras_bench_once_begin(__FILE__, __LINE__)) {
-/** \brief Stop benchmarking this part of the code
-    \hideinitializer */
-#define GRAS_BENCH_ONCE_RUN_ONCE_END()      } gras_bench_once_end()
-
-XBT_PUBLIC(void) gras_cpu_burn(double flops);
-/** @} */
-
-SG_END_DECL()
-#endif                          /* GRAS_COND_H */
diff --git a/include/gras/messages.h b/include/gras/messages.h
deleted file mode 100644 (file)
index 56dde92..0000000
+++ /dev/null
@@ -1,307 +0,0 @@
-/* messaging - high level communication (send/receive messages)             */
-/* module's public interface exported to end user.                          */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_MESSAGES_H
-#define GRAS_MESSAGES_H
-
-#include "gras/transport.h"
-#include "xbt/datadesc.h"
-#include "xbt/socket.h"
-
-SG_BEGIN_DECL()
-
-/** @addtogroup GRAS_msg
- *  @brief Defining messages and callbacks, and exchanging messages
- * 
- *  There is two way to receive messages in GRAS. The first one is to
- *  register a given function as callback to a given type of messages (see
- *  \ref gras_cb_register and associated section). But you can also
- *  explicitely wait for a given message with the \ref gras_msg_wait
- *  function.
- * 
- *  Usually, both ways are not intended to be mixed of a given type of
- *  messages. But if you do so, it shouldn't trigger any issue.  If the
- *  message arrives when gras_msg_wait is blocked, then it will be routed to
- *  it. If it arrives when before or after \ref gras_msg_wait, it will be
- *  passed to the callback.
- * 
- *  For an example of use, please refer to \ref GRAS_ex_ping. The archive
- *  contains much more examples, but their are not properly integrated into
- *  this documentation yet. 
- */
-/** @defgroup GRAS_msg_decl Message declaration and retrival 
- *  @ingroup  GRAS_msg
- *  
- *  GRAS messages can only accept one type of payload. See \ref GRAS_dd for
- *  more information on how to describe data in GRAS.
- *
- *  If you absolutely want use a message able to convey several datatypes,
- *  you can always say that it conveys a generic reference (see
- *  \ref xbt_datadesc_ref_generic).
- * 
- *  In order to ease the upgrade of GRAS applications, it is possible to \e
- *  version the messages, ie to add a version number to the message (by
- *  default, the version is set to 0). Any messages of the wrong version will
- *  be ignored by the applications not providing any specific callback for
- *  them.
- *  
- *  This mechanism (stolen from the dynamic loader one) should ensure you to
- *  change the semantic of a given message while still understanding the old
- *  one.
- */
-/** @{ */
-/** \brief Opaque type */
-typedef struct s_gras_msgtype *gras_msgtype_t;
-
-XBT_PUBLIC(void) gras_msgtype_declare(const char *name,
-                                      xbt_datadesc_type_t payload);
-XBT_PUBLIC(void) gras_msgtype_declare_v(const char *name,
-                                        short int version,
-                                        xbt_datadesc_type_t payload);
-
-XBT_PUBLIC(gras_msgtype_t) gras_msgtype_by_name(const char *name);
-XBT_PUBLIC(gras_msgtype_t) gras_msgtype_by_name_or_null(const char *name);
-XBT_PUBLIC(gras_msgtype_t) gras_msgtype_by_namev(const char *name,
-                                                 short int version);
-XBT_PUBLIC(gras_msgtype_t) gras_msgtype_by_id(int id);
-XBT_PUBLIC(const char *) gras_msgtype_get_name(gras_msgtype_t type);
-
-XBT_PUBLIC(void) gras_msgtype_dumpall(void);
-
-
-/** @} */
-/** @defgroup GRAS_msg_cb Callback declaration and use
- *  @ingroup  GRAS_msg
- * 
- *
- * This is how to register a given function so that it gets called when a
- * given type of message arrives.
- * 
- * You can register several callbacks to the same kind of messages, and
- * they will get stacked. The lastly added callback gets the message first.
- * If it consumes the message, it should return a true value when done. If
- * not, it should return 0, and the message will be passed to the second
- * callback of the stack, if any.
- * 
- * @{
- */
-
-  /** \brief Context of callbacks (opaque structure, created by the middleware only, never by user) */
-typedef struct s_gras_msg_cb_ctx *gras_msg_cb_ctx_t;
-
-XBT_PUBLIC(void) gras_msg_cb_ctx_free(gras_msg_cb_ctx_t ctx);
-XBT_PUBLIC(xbt_socket_t) gras_msg_cb_ctx_from(gras_msg_cb_ctx_t ctx);
-
-  /** \brief Type of message callback functions. 
-   *
-   * \param expeditor: a socket to contact who sent this message
-   * \param payload: the message itself
-   *
-   * \return true if the message was consumed by the callback, 
-   *  false if the message was refused by the callback (and should be 
-   *  passed to the next callback of the stack for this message)
-   *
-   * Once a such a function is registered to handle messages of a given
-   * type with \ref gras_cb_register(), it will be called each time such
-   * a message arrives (unless a gras_msg_wait() intercepts it on arrival).
-   *
-   * If the callback accepts the message, it should free it after use.
-   */
-typedef int (*gras_msg_cb_t) (gras_msg_cb_ctx_t ctx, void *payload);
-
- /**
-  * @brief Bind the given callback to the given message type (described by its name)
-  * @hideinitializer
-  * 
-  * Several callbacks can be attached to a given message type. The lastly added one will get the message first, and
-  * if it returns a non-null value, the message will be passed to the second one.
-  * And so on until one of the callbacks accepts the message.
-  * 
-  * Using gras_cb_register is a bit slower than using gras_cb_register_ since GRAS
-  * has to search for the given msgtype in the hash table, but you don't care in most case.
-  */
-#define gras_cb_register(msgtype_name, cb)   gras_cb_register_(gras_msgtype_by_name(msgtype_name),cb)
-
- /**
-  * @brief Unbind the given callback to the given message type (described by its name)
-  * @hideinitializer
-  * 
-  * Using gras_cb_unregister is a bit slower than using gras_cb_unregister_ since GRAS
-  * has to search for the given msgtype in the hash table, but you don't care in most case.
-  */
-#define gras_cb_unregister(msgtype_name, cb) gras_cb_unregister_(gras_msgtype_by_name(msgtype_name),cb)
-
-XBT_PUBLIC(void) gras_cb_register_(gras_msgtype_t msgtype,
-                                   gras_msg_cb_t cb);
-XBT_PUBLIC(void) gras_cb_unregister_(gras_msgtype_t msgtype,
-                                     gras_msg_cb_t cb);
-
-/** @} */
-
-/** @defgroup GRAS_msg_exchange Message exchange 
- *  @ingroup  GRAS_msg
- *
- */
-/** @{ */
-
-/** \brief Send the data pointed by \a payload as a message \a msgname on the \a sock
- *  @hideinitializer
- *
- * Using gras_msg_wait() is a bit slower than using gras_msg_wait_() since GRAS
- * has to search for the given msgtype in the hash table.
- */
-#define gras_msg_send(sock,name,payload) gras_msg_send_(sock,gras_msgtype_by_name(name),payload)
-XBT_PUBLIC(void) gras_msg_send_(xbt_socket_t sock,
-                                gras_msgtype_t msgtype, void *payload);
-
-/** \brief Waits for a message to come in over a given socket
- *  @hideinitializer
- * @param timeout: How long should we wait for this message.
- * @param msgt_want: type of awaited msg
- * @param[out] expeditor: where to create a socket to answer the incoming message
- * @param[out] payload: where to write the payload of the incoming message
- * @return the error code (or no_error).
- *
- * Every message of another type received before the one waited will be queued
- * and used by subsequent call to this function or gras_msg_handle().
- *
- * Using gras_msg_wait() is a bit slower than using gras_msg_wait_() since GRAS
- * has to search for the given msgtype in the hash table.
- */
-
-#define gras_msg_wait(timeout,msgt_want,expeditor,payload) gras_msg_wait_(timeout,gras_msgtype_by_name(msgt_want),expeditor,payload)
-XBT_PUBLIC(void) gras_msg_wait_(double timeout,
-                                gras_msgtype_t msgt_want,
-                                xbt_socket_t * expeditor, void *payload);
-XBT_PUBLIC(void) gras_msg_handleall(double period);
-XBT_PUBLIC(void) gras_msg_handle(double timeOut);
-
-/** @} */
-
-/** @defgroup GRAS_msg_rpc RPC specific functions
- *  @ingroup  GRAS_msg
- *
- * Remote Procedure Call (RPC) are a classical mecanism to request a service
- * from a remote host. Using this set of functions, you let GRAS doing most of
- * the work of sending the request, wait for an answer, make sure it is the
- * right answer from the right host and so on.  Any exception raised on the
- * server is also passed over the network to the client.
- * 
- * Callbacks are attached to RPC incoming messages the regular way using
- * \ref gras_cb_register.
- * 
- * For an example of use, check the examples/gras/rpc directory of the distribution.
- */
-/** @{ */
-
-/* declaration */
-XBT_PUBLIC(void) gras_msgtype_declare_rpc(const char *name,
-                                          xbt_datadesc_type_t
-                                          payload_request,
-                                          xbt_datadesc_type_t
-                                          payload_answer);
-
-XBT_PUBLIC(void) gras_msgtype_declare_rpc_v(const char *name,
-                                            short int version,
-                                            xbt_datadesc_type_t
-                                            payload_request,
-                                            xbt_datadesc_type_t
-                                            payload_answer);
-
-/* client side */
-
-/** @brief Conduct a RPC call
- *  @hideinitializer
- */
-#define gras_msg_rpccall(server,timeout,msg,req,ans) gras_msg_rpccall_(server,timeout,gras_msgtype_by_name(msg),req,ans)
-XBT_PUBLIC(void) gras_msg_rpccall_(xbt_socket_t server,
-                                   double timeOut,
-                                   gras_msgtype_t msgtype,
-                                   void *request, void *answer);
-XBT_PUBLIC(gras_msg_cb_ctx_t)
-
-/** @brief Launch a RPC call, but do not block for the answer
- *  @hideinitializer
- */
-#define gras_msg_rpc_async_call(server,timeout,msg,req) gras_msg_rpc_async_call_(server,timeout,gras_msgtype_by_name(msg),req)
-    gras_msg_rpc_async_call_(xbt_socket_t server,
-                         double timeOut,
-                         gras_msgtype_t msgtype, void *request);
-XBT_PUBLIC(void) gras_msg_rpc_async_wait(gras_msg_cb_ctx_t ctx,
-                                         void *answer);
-
-/* server side */
-XBT_PUBLIC(void) gras_msg_rpcreturn(double timeOut, gras_msg_cb_ctx_t ctx,
-                                    void *answer);
-
-
-/** @} */
-
-/** @defgroup GRAS_msg_exchangeadv Message exchange (advanced interface)
- *  @ingroup  GRAS_msg
- *
- */
-/** @{ */
-
-/** @brief Message kind (internal enum) */
-typedef enum {
-  e_gras_msg_kind_unknown = 0,
-
-  e_gras_msg_kind_oneway = 1,
-                               /**< good old regular messages */
-
-  e_gras_msg_kind_rpccall = 2,
-                               /**< RPC request */
-  /* HACK: e_gras_msg_kind_rpccall also designate RPC message *type* in 
-     msgtype_t, not only in msg_t */
-  e_gras_msg_kind_rpcanswer = 3,
-                               /**< RPC successful answer */
-  e_gras_msg_kind_rpcerror = 4,
-                               /**< RPC failure on server (payload=exception); should not leak to user-space */
-
-  /* future:
-     call cancel, and others
-     even after:
-     forwarding request and other application level routing stuff
-     group communication
-   */
-
-  e_gras_msg_kind_count = 5     /* sentinel, don't mess with */
-} e_gras_msg_kind_t;
-
-
-/** @brief Message instance (internal struct) */
-typedef struct {
-  xbt_socket_t expe;
-  e_gras_msg_kind_t kind;
-  gras_msgtype_t type;
-  unsigned long int ID;
-  void *payl;
-  int payl_size;
-} s_gras_msg_t, *gras_msg_t;
-
-typedef int (*gras_msg_filter_t) (gras_msg_t msg, void *ctx);
-
-#define gras_msg_wait_ext(timeout, msg, expe, filter, fctx,got) gras_msg_wait_ext_(timeout, gras_msgtype_by_name(msg), expe, filter, fctx,got)
-XBT_PUBLIC(void) gras_msg_wait_ext_(double timeout,
-                                    gras_msgtype_t msgt_want,
-                                    xbt_socket_t expe_want,
-                                    gras_msg_filter_t filter,
-                                    void *filter_ctx, gras_msg_t msg_got);
-
-XBT_PUBLIC(void) gras_msg_wait_or(double timeout,
-                                  xbt_dynar_t msgt_want,
-                                  gras_msg_cb_ctx_t * ctx,
-                                  int *msgt_got, void *payload);
-
-
-/* @} */
-
-SG_END_DECL()
-#endif                          /* GRAS_MSG_H */
diff --git a/include/gras/module.h b/include/gras/module.h
deleted file mode 100644 (file)
index d318e49..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright (c) 2004, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-
-#ifndef GRAS_MODULE_H
-#define GRAS_MODULE_H
-
-#include <xbt.h>
-
-/* Function users of module should use */
-XBT_PUBLIC(void) gras_module_join(const char *name);
-XBT_PUBLIC(void) gras_module_leave(const char *name);
-
-
-/* Functions module implementor should use */
-XBT_PUBLIC(void) gras_module_add(const char *name, unsigned int data_size,
-                                 int *ID, void_f_void_t init_f,
-                                 void_f_void_t exit_f,
-                                 void_f_pvoid_t join_f,
-                                 void_f_pvoid_t leave_f);
-
-
-XBT_PUBLIC(void *) gras_moddata_by_id(unsigned int ID);
-
-
-#endif                          /* GRAS_MODULE_H */
diff --git a/include/gras/process.h b/include/gras/process.h
deleted file mode 100644 (file)
index 073df64..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/* gras/process.h - Manipulating data related to an host.                   */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_PROCESS_H
-#define GRAS_PROCESS_H
-
-#include "xbt/misc.h"           /* SG_BEGIN_DECL */
-#include "xbt/dict.h"
-
-SG_BEGIN_DECL()
-
-/** \addtogroup GRAS_globals
- * @{ */
-
-/** \brief Create a new thread */
-void gras_agent_spawn(const char *name, xbt_main_func_t code,
-                      int argc, char *argv[], xbt_dict_t properties);
-
-/** @} */
-
-/****************************************************************************/
-/* Manipulating User Data                                                   */
-/****************************************************************************/
-
-/** \addtogroup GRAS_globals
- *  \brief Handling global variables so that it works on simulator.
- * 
- * In GRAS, using globals is forbidden since the "processes" will
- * sometimes run as a thread inside the same process (namely, in
- * simulation mode). So, you have to put all globals in a structure, and
- * let GRAS handle it.
- * 
- * Use the \ref gras_userdata_new macro to create a new user data (or malloc it
- * and use \ref gras_userdata_set yourself), and \ref gras_userdata_get to
- * retrieve a reference to it.
- * 
- * 
- * For more info on this, you may want to check the relevant lesson of the GRAS tutorial online
- */
-/* @{ */
-
-/**
- * \brief Get the data associated with the current process.
- * \ingroup GRAS_globals
- */
-XBT_PUBLIC(void *) gras_userdata_get(void);
-
-/**
- * \brief Set the data associated with the current process.
- * \ingroup GRAS_globals
- */
-XBT_PUBLIC(void *) gras_userdata_set(void *ud);
-
-/** \brief Malloc and set the data associated with the current process.
- *
- * @warning gras_userdata_new() expects the pointed type, not the
- * pointer type. We know it'a a bit troublesome, but it seems like
- * the only solution since this macro has to compute the size to
- * malloc and should thus know the pointed type. 
- *
- * You'll find an example in the tutorial
- */
-#define gras_userdata_new(type) ((type*)gras_userdata_set(xbt_new0(type,1)))
-/* @} */
-
-SG_END_DECL()
-#endif                          /* GRAS_PROCESS_H */
diff --git a/include/gras/timer.h b/include/gras/timer.h
deleted file mode 100644 (file)
index 40c3062..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* timer - delayed and repetitive tasks                                     */
-/* module's public interface exported to end user.                          */
-
-/* Copyright (c) 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_TIMER_H
-#define GRAS_TIMER_H
-
-#include "xbt/misc.h"
-
-SG_BEGIN_DECL()
-
-/** @addtogroup GRAS_timer
- *  @brief Delayed and repetitive tasks
- *
- *  This is how to have a specific function called only once after the
- *  specified amount of time or a function executed every 5 mn until it gets 
- *  removed. In the UNIX world, this is comparable to <tt>at</tt> and 
- *  <tt>cron</tt>.
- *
- *  Note that this is very soft timers: the execution of the processes won't
- *  get interrupted at all. This is on purpose: the GRAS programming model
- *  is distributed sequential, so that users don't have to deal with mutexes
- *  and such within a specific process.
- *
- *  Timers are served by the gras_handle() function: if there is an elapsed 
- *  timer, the associated code gets executed before any incoming connexion 
- *  are checked. 
- *
- *  The section \ref GRAS_ex_timer constitutes a perfect example of these features.
- * 
- *  @{
- */
-XBT_PUBLIC(void) gras_timer_delay(double delay, void_f_void_t action);
-XBT_PUBLIC(void) gras_timer_repeat(double interval, void_f_void_t action);
-
-XBT_PUBLIC(void) gras_timer_cancel_delay(double interval,
-                                         void_f_void_t action);
-XBT_PUBLIC(void) gras_timer_cancel_repeat(double interval,
-                                          void_f_void_t action);
-
-XBT_PUBLIC(void) gras_timer_cancel_delay_all(void);
-XBT_PUBLIC(void) gras_timer_cancel_repeat_all(void);
-
-XBT_PUBLIC(void) gras_timer_cancel_all(void);
-
-/** @} */
-
-SG_END_DECL()
-#endif                          /* GRAS_TIMER_H */
diff --git a/include/gras/transport.h b/include/gras/transport.h
deleted file mode 100644 (file)
index cdddc2d..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-
-/* transport - low level communication (send/receive bunches of bytes)      */
-/* module's public interface exported to end user.                          */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_TRANSPORT_H
-#define GRAS_TRANSPORT_H
-
-#include "xbt/socket.h"
-
-/** \addtogroup GRAS_sock
- *  \brief Socket handling
- *
- * The model of communications in GRAS is very close to the BSD socket one.
- * To get two hosts exchanging data, one of them need to open a
- * <i>server</i> socket on which it can listen for incoming messages and the
- * other one must connect a <i>client</i> socket onto the server one.
- *
- * The main difference is that you cannot exchange arbitrary bytes on
- * sockets, but messages. See the \ref GRAS_msg section for details.
- *
- * If you need an example of how to use sockets, check \ref GRAS_ex_ping.
- *
- */
-
-/** \defgroup GRAS_sock_create Socket creation functions
- *  \ingroup GRAS_sock
- *
- */
-/* @{*/
-
-/** \brief Simply create a client socket (to speak to a remote host) */
-XBT_PUBLIC(xbt_socket_t) gras_socket_client(const char *host,
-                                             unsigned short port);
-XBT_PUBLIC(xbt_socket_t) gras_socket_client_from_string(const char *host);
-/** \brief Simply create a server socket (to ear from remote hosts speaking to you) */
-XBT_PUBLIC(xbt_socket_t) gras_socket_server(unsigned short port);
-XBT_PUBLIC(void) gras_socket_close(xbt_socket_t sd);
-XBT_PUBLIC(void) gras_socket_close_voidp(void *sock);
-
-/** \brief Create a client socket, full interface to all relevant settings */
-XBT_PUBLIC(xbt_socket_t) gras_socket_client_ext(const char *host,
-                                                unsigned short port,
-                                                unsigned long int bufSize,
-                                                int measurement);
-/** \brief Create a server socket, full interface to all relevant settings */
-XBT_PUBLIC(xbt_socket_t) gras_socket_server_ext(unsigned short port,
-                                                unsigned long int bufSize,
-                                                int measurement);
-XBT_PUBLIC(xbt_socket_t)
-    gras_socket_server_range(unsigned short minport, unsigned short maxport,
-                             unsigned long int buf_size, int measurement);
-
-/* @}*/
-
-/** \defgroup GRAS_sock_file Using files as sockets
- *  \ingroup GRAS_sock
- * 
- *
- * For debugging purpose, it is possible to deal with files as if they were sockets.
- * It can even be useful to store stuff in a portable manner, but writing messages to a file
- * may be strange...
- * 
- * \bug Don't use '-' on windows. this file represents stdin or stdout, but I failed to deal with it on windows.
- */
-/* @{*/
-/* debuging functions */
-XBT_PUBLIC(xbt_socket_t) gras_socket_client_from_file(const char *path);
-XBT_PUBLIC(xbt_socket_t) gras_socket_server_from_file(const char *path);
-
-/* @} */
-
-void gras_trp_sg_setup(xbt_trp_plugin_t plug);
-void gras_trp_file_setup(xbt_trp_plugin_t plug);
-
-#endif                          /* GRAS_TRANSPORT_H */
diff --git a/include/gras/virtu.h b/include/gras/virtu.h
deleted file mode 100644 (file)
index d4b80ca..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/* gras/virtu.h - public interface to virtualization (cross-OS portability) */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_VIRTU_H
-#define GRAS_VIRTU_H
-
-#include "xbt/misc.h"           /* SG_BEGIN_DECL */
-#include "xbt/time.h"
-#include "xbt/dict.h"
-
-SG_BEGIN_DECL()
-
-/* Initialization of the simulation world. Do not call them in RL. 
-   Indeed, do not call them at all. Let gras_stub_generator do it for you. */
-void gras_global_init(int *argc, char **argv);
-void gras_create_environment(const char *file);
-void gras_function_register(const char *name, xbt_main_func_t code);
-void gras_function_register_default(xbt_main_func_t code);
-void gras_launch_application(const char *file);
-void gras_load_environment_script(const char *file);
-void gras_clean(void);
-void gras_main(void);
-
-
-/** @addtogroup GRAS_virtu  
- *  @brief System call abstraction layer.
- *
- *
- *  @{
- */
-
-/** @brief Get the current time
- *  @return number of second since the Epoch.
- *  (00:00:00 UTC, January 1, 1970 in Real Life, and begining of simulation in SG)
- */
-#define gras_os_time() xbt_time()
-/** @brief sleeps for the given amount of time.
- *  @param sec: number of seconds to sleep
- */
-#define gras_os_sleep(sec) xbt_sleep(sec)
-/** @brief get the fully-qualified name of the current host
- *
- * Returns the fully-qualified name of the host machine, or "localhost" if the name
- * cannot be determined.  Always returns the same value, so multiple calls
- * cause no problems.
- */
-XBT_PUBLIC(const char *) gras_os_myname(void);
-
-/** @brief returns the number on which this process is listening for incoming messages */
-XBT_PUBLIC(int) gras_os_myport(void);
-
-/** @brief get the uri of the current process
- *
- * Returns the concatenation of gras_os_myname():gras_os_myport(). Please do not free the result.
- */
-XBT_PUBLIC(const char *) gras_os_hostport(void);
-
-/** @brief get process identification
- *
- * Returns the process ID of the current process.  (This is often used
-   by routines that generate unique temporary file names.)
- */
-XBT_PUBLIC(int) gras_os_getpid(void);
-
-
-/* Properties related */
-XBT_PUBLIC(xbt_dict_t) gras_process_properties(void);
-XBT_PUBLIC(const char *) gras_process_property_value(const char *name);
-
-XBT_PUBLIC(xbt_dict_t) gras_os_host_properties(void);
-XBT_PUBLIC(const char *) gras_os_host_property_value(const char *name);
-
-/** @} */
-SG_END_DECL()
-#endif                          /* GRAS_VIRTU_H */
index 4ed246e..3ff225e 100644 (file)
@@ -90,7 +90,7 @@ XBT_PUBLIC(void) TRACE_host_push_state (const char *host, const char *state, con
 XBT_PUBLIC(void) TRACE_host_pop_state (const char *host, const char *state);
 XBT_PUBLIC(void) TRACE_host_reset_state (const char *host, const char *state);
 
-/* for creating graph configuration files for Triva by hand */
+/* for creating graph configuration files for Viva by hand */
 XBT_PUBLIC(xbt_dynar_t) TRACE_get_node_types (void);
 XBT_PUBLIC(xbt_dynar_t) TRACE_get_edge_types (void);
 XBT_PUBLIC(void) TRACE_pause (void);
index fd86ffa..cedd660 100644 (file)
@@ -105,6 +105,12 @@ typedef struct msg_file {
  */
 typedef struct msg_file *msg_file_t;
 
+
+/** @brief File datatype.
+    @ingroup msg_file_management
+
+    You should consider this as an opaque object.
+ */
 typedef s_file_stat_t s_msg_stat_t, *msg_stat_t;
 
 
index 38bad94..faa4e01 100644 (file)
@@ -151,6 +151,8 @@ XBT_PUBLIC(int) MSG_process_self_PID(void);
 XBT_PUBLIC(int) MSG_process_self_PPID(void);
 XBT_PUBLIC(msg_process_t) MSG_process_self(void);
 XBT_PUBLIC(xbt_dynar_t) MSG_processes_as_dynar(void);
+XBT_PUBLIC(int) MSG_process_get_number(void);
+
 XBT_PUBLIC(msg_error_t) MSG_process_set_kill_time(msg_process_t process, double kill_time);
 
 /*property handlers*/
@@ -273,7 +275,7 @@ void MSG_mailbox_set_async(const char *alias);
 
 
 /************************** Action handling **********************************/
-msg_error_t MSG_action_trace_run(char *path);
+XBT_PUBLIC(msg_error_t) MSG_action_trace_run(char *path);
 
 #ifdef MSG_USE_DEPRECATED
 
index 52b2ed7..d5f8bca 100644 (file)
@@ -21,6 +21,8 @@ extern int _surf_do_model_check; /* please don't use directly: we inline MC_is_a
 XBT_PUBLIC(void) MC_assert(int);
 XBT_PUBLIC(int) MC_random(int min, int max);
 XBT_PUBLIC(void) MC_automaton_new_propositional_symbol(const char* id, void* fct);
+XBT_PUBLIC(void *) MC_snapshot(void);
+XBT_PUBLIC(int) MC_compare_snapshots(void *s1, void *s2);
 
 #else
 
index bc7dc42..e12eb21 100644 (file)
@@ -161,6 +161,7 @@ typedef void (*smx_ctx_factory_initializer_t)(smx_context_factory_t*);
 XBT_PUBLIC(smx_ctx_factory_initializer_t) smx_factory_initializer_to_use;
 extern char* smx_context_factory_name;
 extern int smx_context_stack_size;
+extern int smx_context_stack_size_was_set;
 
 #ifdef HAVE_THREAD_LOCAL_STORAGE
 extern __thread smx_context_t smx_current_context;
@@ -467,6 +468,10 @@ XBT_PUBLIC(xbt_dict_t) SIMIX_asr_get_properties(const char *name);
 /************************** AS router simcalls ***************************/
 XBT_PUBLIC(xbt_dict_t) simcall_asr_get_properties(const char *name);
 
+/************************** MC simcalls   **********************************/
+XBT_PUBLIC(void *) simcall_mc_snapshot(void);
+XBT_PUBLIC(int) simcall_mc_compare_snapshots(void *s1, void *s2);
+
 /************************** New API simcalls **********************************/
 /* TUTORIAL: New API                                                          */
 /******************************************************************************/
index b08f1ce..0e64fdb 100644 (file)
@@ -9,6 +9,9 @@
 
 #define SEED 221238
 
+#define sleep(x) smpi_sleep(x)
+#define gettimeofday(x, y) smpi_gettimeofday(x)
+
 #include <smpi/smpi.h>
 #include <xbt/sysdep.h>
 #include <xbt/log.h>
index 5222b5c..6c71f11 100644 (file)
@@ -77,7 +77,7 @@
      >        MPI_INTEGER8, MPI_REAL, MPI_REAL4, MPI_REAL8,
      >        MPI_DOUBLE_PRECISION, MPI_COMPLEX, MPI_DOUBLE_COMPLEX,
      >        MPI_2INTEGER, MPI_LOGICAL1, MPI_LOGICAL2, MPI_LOGICAL4,
-     >        MPI_LOGICAL8
+     >        MPI_LOGICAL8, MPI_2REAL, MPI_2DOUBLE_PRECISION
       parameter(MPI_DATATYPE_NULL=-1)
       parameter(MPI_BYTE=0)
       parameter(MPI_CHARACTER=1)
@@ -98,6 +98,8 @@
       parameter(MPI_LOGICAL2=16)
       parameter(MPI_LOGICAL4=17)
       parameter(MPI_LOGICAL8=18)
+      parameter(MPI_2REAL=19)
+      parameter(MPI_2DOUBLE_PRECISION=19)
 
 ! These should be ordered as in smpi_f77.c
       integer MPI_OP_NULL,MPI_MAX, MPI_MIN, MPI_MAXLOC, MPI_MINLOC,
      >         MPI_ALLTOALL
 
       external MPI_WTIME
+      external MPI_WTICK
+
       double precision MPI_WTIME
+      double precision MPI_WTICK
index 50e61d1..3259705 100644 (file)
 #include <xbt/misc.h>
 #include <xbt/function_types.h>
 
-#define sleep(x) smpi_sleep(x)
-#define gettimeofday(x, y) smpi_gettimeofday(x, y)
 
+#ifdef _WIN32
+#define MPI_CALL(type,name,args) \
+  type name args; \
+  type P##name args
+#else
 #define MPI_CALL(type,name,args) \
   type name args __attribute__((weak)); \
   type P##name args
+#endif
 
 SG_BEGIN_DECL()
 #define MPI_THREAD_SINGLE     0
@@ -53,6 +57,8 @@ SG_BEGIN_DECL()
 #define MPI_ERR_GROUP    10
 #define MPI_ERR_OP       11
 #define MPI_ERR_OTHER    12
+#define MPI_ERR_IN_STATUS 13
+#define MPI_ERR_PENDING   14
 #define MPI_IDENT     0
 #define MPI_SIMILAR   1
 #define MPI_UNEQUAL   2
@@ -61,6 +67,13 @@ SG_BEGIN_DECL()
 #define MPI_TAG_UB           1000000
 #define MPI_HOST             0
 #define MPI_IO               0
+#define MPI_BSEND_OVERHEAD   0
+
+typedef enum MPIR_Topo_type {
+  MPI_GRAPH=1,
+  MPI_CART=2,
+  MPI_DIST_GRAPH=3
+} MPIR_Topo_type;
 
 typedef ptrdiff_t MPI_Aint;
 typedef long long MPI_Offset;
@@ -79,47 +92,49 @@ typedef struct {
 #define MPI_STATUSES_IGNORE NULL
 
 #define MPI_DATATYPE_NULL NULL
-extern MPI_Datatype MPI_CHAR;
-extern MPI_Datatype MPI_SHORT;
-extern MPI_Datatype MPI_INT;
-extern MPI_Datatype MPI_LONG;
-extern MPI_Datatype MPI_LONG_LONG;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_CHAR;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_SHORT;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_INT;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_LONG;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_LONG_LONG;
 #define MPI_LONG_LONG_INT MPI_LONG_LONG
-extern MPI_Datatype MPI_SIGNED_CHAR;
-extern MPI_Datatype MPI_UNSIGNED_CHAR;
-extern MPI_Datatype MPI_UNSIGNED_SHORT;
-extern MPI_Datatype MPI_UNSIGNED;
-extern MPI_Datatype MPI_UNSIGNED_LONG;
-extern MPI_Datatype MPI_UNSIGNED_LONG_LONG;
-extern MPI_Datatype MPI_FLOAT;
-extern MPI_Datatype MPI_DOUBLE;
-extern MPI_Datatype MPI_LONG_DOUBLE;
-extern MPI_Datatype MPI_WCHAR;
-extern MPI_Datatype MPI_C_BOOL;
-extern MPI_Datatype MPI_INT8_T;
-extern MPI_Datatype MPI_INT16_T;
-extern MPI_Datatype MPI_INT32_T;
-extern MPI_Datatype MPI_INT64_T;
-extern MPI_Datatype MPI_UINT8_T;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_SIGNED_CHAR;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UNSIGNED_CHAR;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UNSIGNED_SHORT;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UNSIGNED;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UNSIGNED_LONG;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UNSIGNED_LONG_LONG;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_FLOAT;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_DOUBLE;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_LONG_DOUBLE;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_WCHAR;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_C_BOOL;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_INT8_T;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_INT16_T;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_INT32_T;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_INT64_T;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UINT8_T;
 #define MPI_BYTE MPI_UINT8_T
-extern MPI_Datatype MPI_UINT16_T;
-extern MPI_Datatype MPI_UINT32_T;
-extern MPI_Datatype MPI_UINT64_T;
-extern MPI_Datatype MPI_C_FLOAT_COMPLEX;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UINT16_T;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UINT32_T;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UINT64_T;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_C_FLOAT_COMPLEX;
 #define MPI_C_COMPLEX MPI_C_FLOAT_COMPLEX
-extern MPI_Datatype MPI_C_DOUBLE_COMPLEX;
-extern MPI_Datatype MPI_C_LONG_DOUBLE_COMPLEX;
-extern MPI_Datatype MPI_AINT;
-extern MPI_Datatype MPI_OFFSET;
-extern MPI_Datatype MPI_LB;
-extern MPI_Datatype MPI_UB;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_C_DOUBLE_COMPLEX;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_C_LONG_DOUBLE_COMPLEX;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_AINT;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_OFFSET;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_LB;
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UB;
 //The following are datatypes for the MPI functions MPI_MAXLOC  and MPI_MINLOC.
-extern MPI_Datatype MPI_FLOAT_INT;
-extern MPI_Datatype MPI_LONG_INT;
-extern MPI_Datatype MPI_DOUBLE_INT;
-extern MPI_Datatype MPI_SHORT_INT;
-extern MPI_Datatype MPI_2INT;
-extern MPI_Datatype MPI_LONG_DOUBLE_INT;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_FLOAT_INT;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_LONG_INT;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_DOUBLE_INT;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_SHORT_INT;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_2INT;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_LONG_DOUBLE_INT;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_2FLOAT;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_2DOUBLE;
 
 typedef void MPI_User_function(void *invec, void *inoutvec, int *len,
                                MPI_Datatype * datatype);
@@ -127,31 +142,31 @@ struct s_smpi_mpi_op;
 typedef struct s_smpi_mpi_op *MPI_Op;
 
 #define MPI_OP_NULL NULL
-extern MPI_Op MPI_MAX;
-extern MPI_Op MPI_MIN;
-extern MPI_Op MPI_MAXLOC;
-extern MPI_Op MPI_MINLOC;
-extern MPI_Op MPI_SUM;
-extern MPI_Op MPI_PROD;
-extern MPI_Op MPI_LAND;
-extern MPI_Op MPI_LOR;
-extern MPI_Op MPI_LXOR;
-extern MPI_Op MPI_BAND;
-extern MPI_Op MPI_BOR;
-extern MPI_Op MPI_BXOR;
+XBT_PUBLIC_DATA( MPI_Op ) MPI_MAX;
+XBT_PUBLIC_DATA( MPI_Op ) MPI_MIN;
+XBT_PUBLIC_DATA( MPI_Op ) MPI_MAXLOC;
+XBT_PUBLIC_DATA( MPI_Op ) MPI_MINLOC;
+XBT_PUBLIC_DATA( MPI_Op ) MPI_SUM;
+XBT_PUBLIC_DATA( MPI_Op ) MPI_PROD;
+XBT_PUBLIC_DATA( MPI_Op ) MPI_LAND;
+XBT_PUBLIC_DATA( MPI_Op ) MPI_LOR;
+XBT_PUBLIC_DATA( MPI_Op ) MPI_LXOR;
+XBT_PUBLIC_DATA( MPI_Op ) MPI_BAND;
+XBT_PUBLIC_DATA( MPI_Op ) MPI_BOR;
+XBT_PUBLIC_DATA( MPI_Op ) MPI_BXOR;
 
 struct s_smpi_mpi_group;
 typedef struct s_smpi_mpi_group *MPI_Group;
 
 #define MPI_GROUP_NULL NULL
 
-extern MPI_Group MPI_GROUP_EMPTY;
+XBT_PUBLIC_DATA( MPI_Group ) MPI_GROUP_EMPTY;
 
 struct s_smpi_mpi_communicator;
 typedef struct s_smpi_mpi_communicator *MPI_Comm;
 
 #define MPI_COMM_NULL NULL
-extern MPI_Comm MPI_COMM_WORLD;
+XBT_PUBLIC_DATA( MPI_Comm ) MPI_COMM_WORLD;
 #define MPI_COMM_SELF smpi_process_comm_self()
 
 struct s_smpi_mpi_request;
@@ -391,7 +406,12 @@ typedef int MPI_Copy_function(MPI_Comm oldcomm, int keyval, void* extra_state, v
                               void* attribute_val_out, int* flag);
 typedef int MPI_Delete_function(MPI_Comm comm, int keyval, void* attribute_val, void* extra_state);
 
-XBT_PUBLIC(MPI_Datatype)  MPI_PACKED;
+XBT_PUBLIC_DATA(MPI_Datatype)  MPI_PACKED;
+XBT_PUBLIC_DATA(MPI_Errhandler*)  MPI_ERRORS_RETURN;
+XBT_PUBLIC_DATA(MPI_Errhandler*)  MPI_ERRORS_ARE_FATAL;
+XBT_PUBLIC_DATA(MPI_Errhandler*)  MPI_ERRHANDLER_NULL;
+
+
 MPI_CALL(XBT_PUBLIC(int), MPI_Pack_size, (int incount, MPI_Datatype datatype, MPI_Comm comm, int* size));
 MPI_CALL(XBT_PUBLIC(int), MPI_Cart_coords, (MPI_Comm comm, int rank, int maxdims, int* coords));
 MPI_CALL(XBT_PUBLIC(int), MPI_Cart_create, (MPI_Comm comm_old, int ndims, int* dims, int* periods, int reorder, MPI_Comm* comm_cart));
@@ -448,14 +468,13 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Pcontrol, (const int level ));
 //FIXME: End of all the not yet implemented stuff
 
 // smpi functions
-XBT_IMPORT_NO_EXPORT(int) smpi_simulated_main(int argc, char **argv);
 XBT_PUBLIC(MPI_Comm) smpi_process_comm_self(void);
 /*
 XBT_PUBLIC(void) smpi_exit(int);
 */
 
 XBT_PUBLIC(unsigned int) smpi_sleep(unsigned int secs);
-XBT_PUBLIC(int) smpi_gettimeofday(struct timeval *tv, struct timezone *tz);
+XBT_PUBLIC(int) smpi_gettimeofday(struct timeval *tv);
 XBT_PUBLIC(unsigned long long) smpi_rastro_resolution (void);
 XBT_PUBLIC(unsigned long long) smpi_rastro_timestamp (void);
 XBT_PUBLIC(void) smpi_sample_1(int global, const char *file, int line,
@@ -489,7 +508,9 @@ XBT_PUBLIC(void*) smpi_shared_set_call(const char* func, const char* input, void
                                          : smpi_shared_set_call(#func, input, func(__VA_ARGS__)))
 
 /* Fortran specific stuff */
-XBT_PUBLIC(int) MAIN__(void);
+XBT_PUBLIC(int) __attribute__((weak)) smpi_simulated_main(int argc, char** argv);
+XBT_PUBLIC(int) __attribute__((weak)) MAIN__(void);
+XBT_PUBLIC(int) smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[]);
 
 XBT_PUBLIC(int) smpi_process_index(void);
 
diff --git a/include/smpi/smpi_main.h b/include/smpi/smpi_main.h
new file mode 100644 (file)
index 0000000..0e5d259
--- /dev/null
@@ -0,0 +1,6 @@
+#define main smpi_simulated_main(int argc, char **argv);\
+int main(int argc, char **argv){\
+MAIN__(&smpi_simulated_main,&argc,argv);\
+return 0;\
+}\
+int smpi_simulated_main
index 2d0e95e..86379ba 100644 (file)
 #include "xbt/lib.h"
 #include "simgrid/platf_interface.h"
 
-extern xbt_lib_t host_lib;
-extern int ROUTING_HOST_LEVEL; //Routing level
-extern int  SURF_CPU_LEVEL;    //Surf cpu level
-extern int SURF_WKS_LEVEL;    //Surf workstation level
-extern int SIMIX_HOST_LEVEL;  //Simix level
-extern int  MSG_HOST_LEVEL;    //Msg level
-extern int  SD_HOST_LEVEL;    //Simdag level
-extern int  COORD_HOST_LEVEL;  //Coordinates level
-extern int NS3_HOST_LEVEL;    //host node for ns3
-
-extern xbt_lib_t link_lib;
-extern int SD_LINK_LEVEL;    //Simdag level
-extern int SURF_LINK_LEVEL;  //Surf level
-extern int NS3_LINK_LEVEL;    //link for ns3
-
-extern xbt_lib_t as_router_lib;
-extern int ROUTING_ASR_LEVEL;  //Routing level
-extern int COORD_ASR_LEVEL;  //Coordinates level
-extern int NS3_ASR_LEVEL;    //host node for ns3
-extern int ROUTING_PROP_ASR_LEVEL; //Properties for AS and router
-
-extern xbt_lib_t storage_lib;
-extern int ROUTING_STORAGE_LEVEL;        //Routing storage level
-extern int ROUTING_STORAGE_HOST_LEVEL;
-extern int SURF_STORAGE_LEVEL;
-
-extern xbt_lib_t storage_type_lib;
-extern int ROUTING_STORAGE_TYPE_LEVEL;   //Routing storage_type level
+XBT_PUBLIC(xbt_lib_t) host_lib;
+XBT_PUBLIC(int) ROUTING_HOST_LEVEL; //Routing level
+XBT_PUBLIC(int)  SURF_CPU_LEVEL;    //Surf cpu level
+XBT_PUBLIC(int) SURF_WKS_LEVEL;    //Surf workstation level
+XBT_PUBLIC(int) SIMIX_HOST_LEVEL;  //Simix level
+XBT_PUBLIC(int)  MSG_HOST_LEVEL;    //Msg level
+XBT_PUBLIC(int)  SD_HOST_LEVEL;    //Simdag level
+XBT_PUBLIC(int)  COORD_HOST_LEVEL;  //Coordinates level
+XBT_PUBLIC(int) NS3_HOST_LEVEL;    //host node for ns3
+
+XBT_PUBLIC(xbt_lib_t) link_lib;
+XBT_PUBLIC(int) SD_LINK_LEVEL;    //Simdag level
+XBT_PUBLIC(int) SURF_LINK_LEVEL;  //Surf level
+XBT_PUBLIC(int) NS3_LINK_LEVEL;    //link for ns3
+
+XBT_PUBLIC(xbt_lib_t) as_router_lib;
+XBT_PUBLIC(int) ROUTING_ASR_LEVEL;  //Routing level
+XBT_PUBLIC(int) COORD_ASR_LEVEL;  //Coordinates level
+XBT_PUBLIC(int) NS3_ASR_LEVEL;    //host node for ns3
+XBT_PUBLIC(int) ROUTING_PROP_ASR_LEVEL; //Properties for AS and router
+
+XBT_PUBLIC(xbt_lib_t) storage_lib;
+XBT_PUBLIC(int) ROUTING_STORAGE_LEVEL;        //Routing storage level
+XBT_PUBLIC(int) ROUTING_STORAGE_HOST_LEVEL;
+XBT_PUBLIC(int) SURF_STORAGE_LEVEL;
+
+XBT_PUBLIC(xbt_lib_t) storage_type_lib;
+XBT_PUBLIC(int) ROUTING_STORAGE_TYPE_LEVEL;   //Routing storage_type level
 
 /* The callbacks to register for the routing to work */
 void routing_AS_begin(sg_platf_AS_cbarg_t AS);
index 9502ec7..1893481 100644 (file)
@@ -1,7 +1,6 @@
-/* xbt.h - Public interface to the xbt (gras's toolbox)                   */
+/* xbt.h - Public interface to the xbt (SimGrid's toolbox)                  */
 
-/* Copyright (c) 2004, 2005, 2006, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2004-2012. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -29,8 +28,9 @@
 #include <xbt/parmap.h>
 
 #include <xbt/peer.h>
-#include <xbt/datadesc.h>
 #include <xbt/config.h>
 #include <xbt/cunit.h>
 
+#include <xbt/xbt_os_thread.h>
+
 #endif                          /* xbt_H */
index 49df463..9f57747 100644 (file)
@@ -60,6 +60,7 @@ typedef struct xbt_propositional_symbol* xbt_propositional_symbol_t;
 
 
 XBT_PUBLIC(xbt_automaton_t) xbt_automaton_new(void);
+
 XBT_PUBLIC(void) xbt_automaton_load(xbt_automaton_t automaton, const char *file);
 
 XBT_PUBLIC(xbt_state_t) xbt_automaton_new_state(xbt_automaton_t a, int type, char* id);
@@ -74,12 +75,6 @@ XBT_PUBLIC(xbt_dynar_t) xbt_automaton_get_transitions(xbt_automaton_t a);
 
 XBT_PUBLIC(xbt_transition_t) xbt_automaton_get_transition(xbt_automaton_t a, xbt_state_t src, xbt_state_t dst);
 
-XBT_PUBLIC(void) xbt_automaton_free_automaton(xbt_automaton_t a, void_f_pvoid_t transition_free_function);
-
-XBT_PUBLIC(void) xbt_automaton_free_state(xbt_automaton_t a, xbt_state_t s, void_f_pvoid_t transition_free_function);
-
-XBT_PUBLIC(void) xbt_automaton_free_transition(xbt_automaton_t a, xbt_transition_t t, void_f_pvoid_t transition_free_function);
-
 XBT_PUBLIC(xbt_state_t) xbt_automaton_transition_get_source(xbt_transition_t t);
 
 XBT_PUBLIC(xbt_state_t) xbt_automaton_transition_get_destination(xbt_transition_t t);
@@ -110,6 +105,17 @@ XBT_PUBLIC(int) automaton_transition_compare(const void *t1, const void *t2);
 
 XBT_PUBLIC(int) automaton_label_transition_compare(xbt_exp_label_t l1, xbt_exp_label_t l2);
 
+XBT_PUBLIC(void) xbt_state_free_voidp(void *s);
+
+XBT_PUBLIC(void) xbt_state_free(xbt_state_t s);
+
+XBT_PUBLIC(void) xbt_transition_free_voidp(void *t);
+
+XBT_PUBLIC(void) xbt_exp_label_free_voidp(void *e);
+
+XBT_PUBLIC(void) xbt_propositional_symbol_free_voidp(void *ps);
+
+XBT_PUBLIC(void) xbt_automaton_free(xbt_automaton_t a);
 
 SG_END_DECL()
 
diff --git a/include/xbt/datadesc.h b/include/xbt/datadesc.h
deleted file mode 100644 (file)
index 32d20cb..0000000
+++ /dev/null
@@ -1,605 +0,0 @@
-/* xbt/datadesc.h - Describing the data you want to exchange               */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef XBT_DATADESC_H
-#define XBT_DATADESC_H
-
-#include "xbt/misc.h"           /* SG_BEGIN_DECL */
-#include "xbt/dynar.h"          /* void_f_pvoid_t */
-
-SG_BEGIN_DECL()
-
-/** @addtogroup XBT_dd Data description
- *  @brief Describing data to be exchanged
- *
- * Since XBT takes care of potential representation conversion when the platform is heterogeneous,
- * any data which transits on the network must be described beforehand.
- * 
- * There are several possible interfaces for this, ranging from the really completely automatic parsing to
- * completely manual. Let's study each of them from the simplest to the more advanced:
- * 
- *   - Section \ref XBT_dd_basic presents how to retrieve and use an already described type.
- *   - Section \ref XBT_dd_auto shows how to make XBT parse your type description automagically. This
- *     is unfortunately not always possible (only works for some structures), but if it is for your data,
- *     this is definitely the way to go.
- *   - Section \ref XBT_dd_manual presents how to build a description manually. This is useful when you want
- *     to describe an array or a pointer of pre-defined structures.
- *   - You sometimes need to exchange informations between descriptions at send or receive time. This is 
- *     for example useful when your structure contains an array which size is given by another field of the 
- *     structure.
- *     - Section \ref XBT_dd_cb_simple provides a simple interface to do so, allowing to share integers stored on a stack.
- *     - Section \ref XBT_dd_cb_full provides a full featured interface to do so, but it may reveal somehow difficult to use.
- **/
-/** @defgroup XBT_dd_basic Basic operations on data descriptions
- *  @ingroup XBT_dd
- * \htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Basics" --> \endhtmlonly
- *
- * If you only want to send pre-existing types, simply retrieve the pre-defined description with 
- * the \ref xbt_datadesc_by_name function. Existing types entail:
- *  - char (both signed and unsigned)
- *  - int (short, regular, long and long long, both signed and unsigned)
- *  - float and double
- *  - string (which is indeed a reference to a dynamically sized array of char, strlen being used to retrieve the size)
- * 
- * Example:\verbatim xbt_datadesc_type_t i = xbt_datadesc_by_name("int");
- xbt_datadesc_type_t uc = xbt_datadesc_by_name("unsigned char");
- xbt_datadesc_type_t str = xbt_datadesc_by_name("string");\endverbatim
- *
- */
-/* @{ */
-/** @brief Opaque type describing a type description. */
-typedef struct s_xbt_datadesc_type *xbt_datadesc_type_t;
-
-/** \brief Search a type description from its name */
-XBT_PUBLIC(xbt_datadesc_type_t) xbt_datadesc_by_name(const char *name);
-XBT_PUBLIC(xbt_datadesc_type_t) xbt_datadesc_by_name_or_null(const char
-                                                               *name);
-
-/* @} */
-
-/** @defgroup XBT_dd_auto Automatic parsing of data descriptions
- *  @ingroup XBT_dd
- * \htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Automatic parsing" --> \endhtmlonly
- * 
- *  If you need to declare a new datatype, this is the simplest way to describe it to XBT. Simply
- *  enclose its type definition  into a \ref XBT_DEFINE_TYPE macro call, and you're set. Here is 
- *  an type declaration  example: \verbatim XBT_DEFINE_TYPE(mytype,struct mytype {
-   int myfirstfield;
-   char mysecondfield;
- });\endverbatim
- *  The type is then both copied verbatim into your source file and stored for further parsing. This allows
- *  you to let XBT parse the exact version you are actually using in your program.
- *  You can then retrieve the corresponding type description with \ref xbt_datadesc_by_symbol.
- *  Don't worry too much for the performances, the type is only parsed once and a binary representation 
- *  is stored and used in any subsequent calls.
- * 
- *  If your structure contains any pointer, you have to explain XBT the size of the pointed array. This
- *  can be 1 in the case of simple references, or more in the case of regular arrays. For that, use the 
- *  \ref XBT_ANNOTE macro within the type declaration you are passing to \ref XBT_DEFINE_TYPE. This macro
- *  rewrites itself to nothing in the declaration (so they won't pollute the type definition copied verbatim
- *  into your code), and give some information to XBT about your pointer. 
- *  XBT_ANNOTE takes two arguments being the key name and the key value. For now, the only accepted key name 
- *  is "size", to specify the length of the pointed array. It can either be:
- *    - the string "1" (without the quote),
- *    - the name of another field of the structure
- *    - a sort of computed expression for multidimensional arrays (see below -- pay attention to the warnings below).
- *  
- *  Here is an example:\verbatim XBT_DEFINE_TYPE(s_clause,
-  struct s_array {
-    xbt_string_t name;
-    struct s_array *father XBT_ANNOTE(size,1);
-    int length;
-    int *data XBT_ANNOTE(size,length);
-    int rows;
-    int cols;
-    int *matrix XBT_ANNOTE(size,rows*cols);
- }
-;)\endverbatim
- * It specifies that the structure s_array contains six fields, that the \a name field is a classical null-terminated 
- * char* string (#xbt_string_t is just an helper type defined exactly to help the parsing macro to specify the semantic of the pointer),
- * that \a father field is a simple reference, that the size of the array pointed by \a data is the \a length field, and that the 
- * \a matrix field is an arraywhich size is the result of \a rows times \a cols.
- *
- *  \warning Since XBT_DEFINE_TYPE is a macro, you shouldn't put any comma in your type definition 
- *  (comma separates macro args). For example, change \verbatim int a, b;\endverbatim to \verbatim int a;
-int b;\endverbatim
- * 
- * \section xbt_dd_define \#define and fixed size array
- *
- * If you want to exchange arrays which size is given at compilation time by a
- * \#defined constant, you need to keep XBT informed. It would be done the
- * following way:
-
-\verbatim #define BLOCK_SIZE 32
-XBT_DEFINE_TYPE(s_toto,
-struct {
-  double data[BLOCK_SIZE];
-} s_toto;)
-
-void register_messages() { 
-  xbt_datadesc_type_t toto_type;
-
-  xbt_datadesc_set_const("BLOCK_SIZE",BLOCK_SIZE);
-  toto_type = xbt_datadesc_by_symbol(s_toto);
-}\endverbatim
- *
- * The form <tt>xbt_datadesc_set_const("BLOCK_SIZE",BLOCK_SIZE);</tt> ensures
- * that when you change the definition of the constant, XBT keeps informed of
- * the right value. Passing the numerical value of the constant as second
- * argument would be a bad idea to that regard. Of course, the call to
- * xbt_datadesc_set_const() should come before any xbt_datadesc_by_symbol()
- * containing references to it.
- *
- * \section XBT_dd_multidim Defining multidimentional arrays
- * 
- *  The mecanism for multidimensional arrays is known to be fragile and cumbersome. If you want to use it,
- *  you have to understand how it is implemented: the multiplication is performed using the sizes stack. In previous example,
- *  a \ref xbt_datadesc_cb_push_int callback is added to the \a rows field and a \ref xbt_datadesc_cb_push_int_mult one is
- *  added to \a cols. So, when the structure is sent, the \a rows field push its value onto the stack, then the \a cols field
- *  retrieve this value from the stack, compute (and push) the multiplication value. The \a matrix field can then retrieve this
- *  value by poping the array. There is several ways for this to go wrong:
- *   - if the matrix field is placed before the sizes, the right value won't get pushed into the stack soon enough.
- *     Reorder your structure fields if needed.
- *   - if you write XBT_ANNOTE(size,cols*rows); in previous example (inverting rows and cols in annotation),
- *     \a rows will be given a \ref xbt_datadesc_cb_push_int_mult. This cannot work since it will try to
- *     pop the value which will be pushed by \a cols <i>afterward</i>.
- *   - if you have more than one matrix in your structure, don't interleave the size. They are pushed/poped in the structure order.
- *   - if some of the sizes are used in more than one matrix, you cannot use this mecanism -- sorry.
- *
- * If you cannot express your datadescs with this mechanism, you'll have to use the more advanced
- * (and somehow complex) one described in the \ref XBT_dd_cb_full.
- *
- * \section XBT_dd_multifile Projects spanning over multiple files
- * 
- * XBT_DEFINE_TYPE declares some symbols to work, it needs some special
- * care when used in several files. In such case, you want the regular type
- * definition in all files, but the xbt specific symbol defined in only
- * one file. For example, consider the following xbt project sketch.
- * 
-\verbatim #include <xbt/datadesc.h>
-
-XBT_DEFINE_TYPE(my_type,struct my_type {
-  int a;
-  int b;
-  double c;
-});
-
-int client(int argc, char *argv[]) {
- ...
-}
-
-int server(int argc, char *argv[]) {
- ...
-}\endverbatim
- * 
- * If you want to split this in two files (one for each kind of processes),
- * you need to put the XBT_DEFINE_TYPE block in a separate header (so that
- * each process kind see the associated C type definition). But
- * then you cannot include this right away in all files because the extra
- * symbols containing the XBT definition would be dupplicated.
- * 
- * You thus have to decide in which C file the symbols will live. In that
- * file, include the header without restriction:
- * 
-\verbatim #include "my_header.h"
-
-int client(int argc, char *argv[]) {
-  ...
-}\endverbatim
-
- * And in the other files needing the C definitions without the extra XBT
- * symbols, declare the symbol XBT_DEFINE_TYPE_EXTERN before loading
- * xbt/datadesc.h:
- * 
-\verbatim #define XBT_DEFINE_TYPE_EXTERN
-#include <xbt/datadesc.h>
-#include "my_header.h"
-
-int server(int argc, char *argv[]) {
-  ...
-}\endverbatim
-
- * 
- * Sometimes, the situation is even more complicated: There is some shared
- * messages that you want to see from every file, and some private messages 
- * that you want to be defined only in one C file.
- * In that case, use the previous trick for common messages, and use 
- * #XBT_DEFINE_TYPE_LOCAL for the private messages.
- *
- * For now, there is no way to have semi-private symbols (for example shared 
- * in all files of a library), sorry. Use functions as interface to your 
- * library instead of publishing directly the messages.
- * 
- */
-/** @{ */
-
-
-/**   @brief Automatically parse C code
- *    @hideinitializer
- */
-#define XBT_DEFINE_TYPE(name,def) \
-  const char * _xbt_this_type_symbol_does_not_exist__##name=#def; def
-
-#ifndef DOXYGEN_SKIP            /* doxygen don't like macro fun too much */
-#  ifdef XBT_DEFINE_TYPE_EXTERN
-#    undef  XBT_DEFINE_TYPE
-#    define XBT_DEFINE_TYPE(name,def)  def
-#    undef XBT_DEFINE_TYPE_EXTERN
-#  endif
-#endif
-
-/**   @brief if this symbol is defined, the \a XBT_DEFINE_TYPE symbols live in another file.
- *    @hideinitializer
- */
-#define XBT_DEFINE_TYPE_EXTERN 1
-/* leave the fun of declaring this to the user */
-#undef XBT_DEFINE_TYPE_EXTERN
-
-/** @brief Define a symbol to be automatically parsed, disregarding #XBT_DEFINE_TYPE_EXTERN
- *  @hideinitializer
- * 
- *  Call this macro instead of #XBT_DEFINE_TYPE if you had to define #XBT_DEFINE_TYPE_EXTERN
- *  to load some external symbols, but if you now want to automatically parse the content of 
- *  your private messages.
- */
-#define XBT_DEFINE_TYPE_LOCAL(name, def) \
-  const char * _xbt_this_type_symbol_does_not_exist__##name=#def; def
-
-/** @brief Retrieve a datadesc which was previously parsed 
- *  @hideinitializer
- */
-#define xbt_datadesc_by_symbol(name)  \
-  (xbt_datadesc_by_name_or_null(#name) ?      \
-   xbt_datadesc_by_name_or_null(#name) :      \
-     xbt_datadesc_parse(#name,        \
-       _xbt_this_type_symbol_does_not_exist__##name) \
-  )
-
-/** @def XBT_ANNOTE
- *  @brief Add an annotation to a type to be automatically parsed
- */
-#define XBT_ANNOTE(key,val)
-
-/** @brief Defines the value of a define to the datatype parsing infrastructure
- */
-XBT_PUBLIC(void) xbt_datadesc_set_const(const char *name, int value);
-
-/* @} */
-
-XBT_PUBLIC(xbt_datadesc_type_t)
-    xbt_datadesc_parse(const char *name, const char *C_statement);
-
-/** @defgroup XBT_dd_manual Simple manual data description
- *  @ingroup XBT_dd
- * 
- * Here are the functions to use if you want to declare your description manually. 
- * The function names should be self-explanatory in most cases.
- * 
- * You can add callbacks to the datatypes doing any kind of action you may want. Usually, 
- * pre-send callbacks are used to prepare the type expedition while post-receive callbacks 
- * are used to fix any issue after the receive.
- * 
- * If your types are dynamic, you'll need to add some extra callback. For example, there is a
- * specific callback for the string type which is in charge of computing the length of the char
- * array. This is done with the cbps mechanism, explained in next section.
- * 
- * If your types may contain pointer cycle, you must specify it to XBT using the @ref xbt_datadesc_cycle_set.
- * 
- * Example:\verbatim
- typedef struct {
-   unsigned char c1;
-   unsigned long int l1;
-   unsigned char c2;
-   unsigned long int l2;
- } mystruct;
- [...]
-  my_type=xbt_datadesc_struct("mystruct");
-  xbt_datadesc_struct_append(my_type,"c1", xbt_datadesc_by_name("unsigned char"));
-  xbt_datadesc_struct_append(my_type,"l1", xbt_datadesc_by_name("unsigned long"));
-  xbt_datadesc_struct_append(my_type,"c2", xbt_datadesc_by_name("unsigned char"));
-  xbt_datadesc_struct_append(my_type,"l2", xbt_datadesc_by_name("unsigned long int"));
-  xbt_datadesc_struct_close(my_type);
-
-  my_type=xbt_datadesc_ref("mystruct*", xbt_datadesc_by_name("mystruct"));
-
-  [Use my_type to send pointers to mystruct data]\endverbatim
- */
-/* @{ */
-
-
-/** \brief Opaque type describing a type description callback persistent state. */
-typedef struct s_xbt_cbps *xbt_cbps_t;
-
-/* callbacks prototypes */
-/** \brief Prototype of type callbacks returning nothing. */
-typedef void (*xbt_datadesc_type_cb_void_t) (xbt_datadesc_type_t
-                                              typedesc, xbt_cbps_t vars,
-                                              void *data);
-/** \brief Prototype of type callbacks returning an int. */
-typedef int (*xbt_datadesc_type_cb_int_t) (xbt_datadesc_type_t
-                                           typedesc, xbt_cbps_t vars,
-                                           void *data);
-/** \brief Prototype of type callbacks selecting a type. */
-typedef
-
-
-
-
-
-xbt_datadesc_type_t(*xbt_datadesc_selector_t) (xbt_datadesc_type_t
-                                                 typedesc,
-                                                 xbt_cbps_t vars,
-                                                 void *data);
-
-
-/******************************************
- **** Declare datadescription yourself ****
- ******************************************/
-
-XBT_PUBLIC(xbt_datadesc_type_t) xbt_datadesc_struct(const char *name);
-XBT_PUBLIC(void) xbt_datadesc_struct_append(xbt_datadesc_type_t
-                                             struct_type, const char *name,
-                                             xbt_datadesc_type_t
-                                             field_type);
-XBT_PUBLIC(void) xbt_datadesc_struct_close(xbt_datadesc_type_t
-                                            struct_type);
-
-
-XBT_PUBLIC(xbt_datadesc_type_t) xbt_datadesc_union(const char *name,
-                                                     xbt_datadesc_type_cb_int_t
-                                                     selector);
-XBT_PUBLIC(void) xbt_datadesc_union_append(xbt_datadesc_type_t
-                                            union_type, const char *name,
-                                            xbt_datadesc_type_t
-                                            field_type);
-XBT_PUBLIC(void) xbt_datadesc_union_close(xbt_datadesc_type_t
-                                           union_type);
-
-
-XBT_PUBLIC(xbt_datadesc_type_t)
-    xbt_datadesc_ref(const char *name, xbt_datadesc_type_t referenced_type);
-XBT_PUBLIC(xbt_datadesc_type_t)
-    xbt_datadesc_copy(const char *name, xbt_datadesc_type_t copied_type);
-XBT_PUBLIC(xbt_datadesc_type_t)
-    xbt_datadesc_ref_generic(const char *name,
-                          xbt_datadesc_selector_t selector);
-
-XBT_PUBLIC(xbt_datadesc_type_t)
-    xbt_datadesc_array_fixed(const char *name,
-                          xbt_datadesc_type_t element_type,
-                          long int fixed_size);
-XBT_PUBLIC(xbt_datadesc_type_t)
-    xbt_datadesc_array_dyn(const char *name,
-                        xbt_datadesc_type_t element_type,
-                        xbt_datadesc_type_cb_int_t dynamic_size);
-XBT_PUBLIC(xbt_datadesc_type_t)
-    xbt_datadesc_ref_pop_arr(xbt_datadesc_type_t element_type);
-
-XBT_PUBLIC(xbt_datadesc_type_t)
-    xbt_datadesc_dynar(xbt_datadesc_type_t elm_t, void_f_pvoid_t free_func);
-XBT_PUBLIC(xbt_datadesc_type_t)
-    xbt_datadesc_matrix(xbt_datadesc_type_t elm_t,
-                     void_f_pvoid_t const free_f);
-
-/*********************************
- * Change stuff within datadescs *
- *********************************/
-
-/** \brief Specify that this type may contain cycles */
-XBT_PUBLIC(void) xbt_datadesc_cycle_set(xbt_datadesc_type_t type);
-/** \brief Specify that this type do not contain any cycles (default) */
-XBT_PUBLIC(void) xbt_datadesc_cycle_unset(xbt_datadesc_type_t type);
-/** \brief Add a pre-send callback to this datadesc. */
-XBT_PUBLIC(void) xbt_datadesc_cb_send(xbt_datadesc_type_t type,
-                                      xbt_datadesc_type_cb_void_t pre);
-/** \brief Add a post-receive callback to this datadesc.*/
-XBT_PUBLIC(void) xbt_datadesc_cb_recv(xbt_datadesc_type_t type,
-                                      xbt_datadesc_type_cb_void_t post);
-/** \brief Add a pre-send callback to the given field of the datadesc */
-XBT_PUBLIC(void) xbt_datadesc_cb_field_send(xbt_datadesc_type_t type,
-                                            const char *field_name,
-                                            xbt_datadesc_type_cb_void_t
-                                            pre);
-/** \brief Add a post-receive callback to the given field of the datadesc */
-XBT_PUBLIC(void) xbt_datadesc_cb_field_recv(xbt_datadesc_type_t type,
-                                            const char *field_name,
-                                            xbt_datadesc_type_cb_void_t
-                                            post);
-/** \brief Add a pre-send callback to the given field resulting in its value to be pushed */
-XBT_PUBLIC(void) xbt_datadesc_cb_field_push(xbt_datadesc_type_t type,
-                                            const char *field_name);
-/** \brief Add a pre-send callback to the given field resulting in its value multiplied to any previously pushed value and then pushed back */
-XBT_PUBLIC(void)
-xbt_datadesc_cb_field_push_multiplier(xbt_datadesc_type_t type,
-                                      const char
-                                      *field_name);
-
-/******************************
- * Get stuff within datadescs *
- ******************************/
-/** \brief Returns the name of a datadescription */
-XBT_PUBLIC(const char *) xbt_datadesc_get_name(xbt_datadesc_type_t ddt);
-/** \brief Returns the identifier of a datadescription */
-XBT_PUBLIC(int) xbt_datadesc_get_id(xbt_datadesc_type_t ddt);
-
-/* @} */
-
-/** @defgroup XBT_dd_cb_simple Data description with Callback Persistant State: Simple push/pop mechanism
- *  @ingroup XBT_dd
- * 
- * Sometimes, one of the callbacks need to leave information for the next ones. If this is a simple integer (such as
- * an array size), you can use the functions described here. If not, you'll have to play with the complete cbps interface.
- *
- * \htmlonly <!--  DOXYGEN_NAVBAR_LABEL="Simple push/pop Callback State" -->\endhtmlonly      
- * 
- * Here is an example:\verbatim
-struct s_array {
-  int length;
-  int *data;
-}
-[...]
-my_type=xbt_datadesc_struct("s_array");
-xbt_datadesc_struct_append(my_type,"length", xbt_datadesc_by_name("int"));
-xbt_datadesc_cb_field_send (my_type, "length", xbt_datadesc_cb_push_int);
-
-xbt_datadesc_struct_append(my_type,"data",
-                            xbt_datadesc_array_dyn ("s_array::data",xbt_datadesc_by_name("int"), xbt_datadesc_cb_pop));
-xbt_datadesc_struct_close(my_type);
-\endverbatim
-
- *
- * The *_mult versions are intended for multi-dimensional arrays: They multiply their value to the previously pushed one 
- * (by another field callback) and push the result of the multiplication back. An example of use follows. Please note
- * that the first field needs a regular push callback, not a multiplier one. Think of it as a stacked calculator (man dc(1)).\verbatim
-struct s_matrix {
-  int row;
-  int col;
-  int *data;
-}
-[...]
-my_type=xbt_datadesc_struct("s_matrix");
-xbt_datadesc_struct_append(my_type,"row", xbt_datadesc_by_name("int"));
-xbt_datadesc_cb_field_send (my_type, "length", xbt_datadesc_cb_push_int);
-xbt_datadesc_struct_append(my_type,"col", xbt_datadesc_by_name("int"));
-xbt_datadesc_cb_field_send (my_type, "length", xbt_datadesc_cb_push_int_mult);
-
-xbt_datadesc_struct_append(my_type,"data",
-                            xbt_datadesc_array_dyn ("s_matrix::data",xbt_datadesc_by_name("int"), xbt_datadesc_cb_pop));
-xbt_datadesc_struct_close(my_type);
-\endverbatim
- */
-/* @{ */
-
-XBT_PUBLIC(void) xbt_cbps_i_push(xbt_cbps_t ps, int val);
-XBT_PUBLIC(int) xbt_cbps_i_pop(xbt_cbps_t ps);
-
-XBT_PUBLIC(int) xbt_datadesc_cb_pop(xbt_datadesc_type_t typedesc,
-                                     xbt_cbps_t vars, void *data);
-
-XBT_PUBLIC(void) xbt_datadesc_cb_push_int(xbt_datadesc_type_t typedesc,
-                                           xbt_cbps_t vars, void *data);
-XBT_PUBLIC(void) xbt_datadesc_cb_push_uint(xbt_datadesc_type_t typedesc,
-                                            xbt_cbps_t vars, void *data);
-XBT_PUBLIC(void) xbt_datadesc_cb_push_lint(xbt_datadesc_type_t typedesc,
-                                            xbt_cbps_t vars, void *data);
-XBT_PUBLIC(void) xbt_datadesc_cb_push_ulint(xbt_datadesc_type_t typedesc,
-                                             xbt_cbps_t vars, void *data);
-
-XBT_PUBLIC(void) xbt_datadesc_cb_push_int_mult(xbt_datadesc_type_t
-                                                typedesc, xbt_cbps_t vars,
-                                                void *data);
-XBT_PUBLIC(void) xbt_datadesc_cb_push_uint_mult(xbt_datadesc_type_t
-                                                 typedesc,
-                                                 xbt_cbps_t vars,
-                                                 void *data);
-XBT_PUBLIC(void) xbt_datadesc_cb_push_lint_mult(xbt_datadesc_type_t
-                                                 typedesc,
-                                                 xbt_cbps_t vars,
-                                                 void *data);
-XBT_PUBLIC(void) xbt_datadesc_cb_push_ulint_mult(xbt_datadesc_type_t
-                                                  typedesc,
-                                                  xbt_cbps_t vars,
-                                                  void *data);
-
-
-/* @} */
-
-/** @defgroup XBT_dd_cb_full Data description with Callback Persistant State: Full featured interface
- *  @ingroup XBT_dd
- * 
- * Sometimes, one of the callbacks need to leave information for the next
- * ones. If the simple push/pop mechanism introduced in previous section
- * isn't enough, you can always use this full featured one. The bad point is
- * that it is quite badly documented...
- *
- * \htmlonly <!--  DOXYGEN_NAVBAR_LABEL="Full featured Callback State" -->\endhtmlonly      
- *
- */
-
-/* @{ */
-
-XBT_PUBLIC(void) xbt_cbps_v_pop(xbt_cbps_t ps, const char *name,
-                                 /* OUT */ xbt_datadesc_type_t * ddt,
-                                 /* OUT */ void **res);
-XBT_PUBLIC(void) xbt_cbps_v_push(xbt_cbps_t ps,
-                                  const char *name,
-                                  void *data, xbt_datadesc_type_t ddt);
-XBT_PUBLIC(void) xbt_cbps_v_set(xbt_cbps_t ps,
-                                 const char *name,
-                                 void *data, xbt_datadesc_type_t ddt);
-
-XBT_PUBLIC(void *) xbt_cbps_v_get(xbt_cbps_t ps, const char *name,
-                                   /* OUT */ xbt_datadesc_type_t * ddt);
-
-XBT_PUBLIC(void) xbt_cbps_block_begin(xbt_cbps_t ps);
-XBT_PUBLIC(void) xbt_cbps_block_end(xbt_cbps_t ps);
-
-/* @} */
-/* @} */
-
-
-/*******************************
- **** About data convertion ****
- *******************************/
-XBT_PUBLIC(int) xbt_arch_selfid(void); /* ID of this arch */
-
-
-/*****************************
- **** NWS datadescription * FIXME: obsolete?
- *****************************/
-
-/**
- * Basic types we can embeed in DataDescriptors.
- */
-typedef enum
-    { CHAR_TYPE, DOUBLE_TYPE, FLOAT_TYPE, INT_TYPE, LONG_TYPE, SHORT_TYPE,
-  UNSIGNED_INT_TYPE, UNSIGNED_LONG_TYPE, UNSIGNED_SHORT_TYPE, STRUCT_TYPE
-} DataTypes;
-#define SIMPLE_TYPE_COUNT 9
-
-/**  \brief Describe a collection of data.
- * 
-** A description of a collection of \a type data.  \a repetitions is used only
-** for arrays; it contains the number of elements.  \a offset is used only for
-** struct members in host format; it contains the offset of the member from the
-** beginning of the struct, taking into account internal padding added by the
-** compiler for alignment purposes.  \a members, \a length, and \a tailPadding are
-** used only for STRUCT_TYPE data; the \a length -long array \a members describes
-** the members of the nested struct, and \a tailPadding indicates how many
-** padding bytes the compiler adds to the end of the structure.
-*/
-
-typedef struct DataDescriptorStruct {
-  DataTypes type;
-  size_t repetitions;
-  size_t offset;
-  /*@null@ */ struct DataDescriptorStruct *members;
-  size_t length;
-  size_t tailPadding;
-} DataDescriptor;
-/** DataDescriptor for an array */
-#define SIMPLE_DATA(type,repetitions) \
-  {type, repetitions, 0, NULL, 0, 0}
-/** DataDescriptor for an structure member */
-#define SIMPLE_MEMBER(type,repetitions,offset) \
-  {type, repetitions, offset, NULL, 0, 0}
-/** DataDescriptor for padding bytes */
-#define PAD_BYTES(structType,lastMember,memberType,repetitions) \
-  sizeof(structType) - offsetof(structType, lastMember) - \
-  sizeof(memberType) * repetitions
-
-XBT_PUBLIC(xbt_datadesc_type_t)
-    xbt_datadesc_import_nws(const char *name,
-                         const DataDescriptor * desc,
-                         unsigned long howmany);
-
-
-SG_END_DECL()
-#endif                          /* XBT_DATADESC_H */
index 34ca2ba..79b590d 100644 (file)
@@ -224,7 +224,6 @@ typedef struct xbt_dynar_s {
   unsigned long elmsize;
   void *data;
   void_f_pvoid_t free_f;
-  xbt_mutex_t mutex;
 } s_xbt_dynar_t;
 
 static XBT_INLINE void
@@ -232,8 +231,6 @@ _xbt_dynar_cursor_first(const xbt_dynar_t dynar,
                         unsigned int *const cursor)
 {
   /* iterating over a NULL dynar is a no-op (but we don't want to have uninitialized counters) */
-  if (dynar && dynar->mutex)             /* ie _dynar_lock(dynar) but not public */
-    xbt_mutex_acquire(dynar->mutex);
 
   //XBT_DEBUG("Set cursor on %p to the first position", (void *) dynar);
   *cursor = 0;
@@ -248,8 +245,6 @@ _xbt_dynar_cursor_get(const xbt_dynar_t dynar,
 
   if (idx >= dynar->used) {
     //XBT_DEBUG("Cursor on %p already on last elem", (void *) dynar);
-    if (dynar->mutex)           /* unlock */
-      xbt_mutex_release(dynar->mutex);
     return FALSE;
   }
   //  XBT_DEBUG("Cash out cursor on %p at %u", (void *) dynar, *idx);
index a6db6fc..909af2c 100644 (file)
@@ -297,7 +297,7 @@ typedef struct {
  */
 typedef struct {
   __ex_mctx_t *ctx_mctx;        /* permanent machine context of enclosing try/catch */
-  volatile int ctx_caught;      /* temporary flag whether exception was caught */
+  int ctx_caught;               /* temporary flag whether exception was caught */
   volatile xbt_ex_t exception;  /* temporary exception storage */
 } xbt_running_ctx_t;
 
@@ -313,12 +313,12 @@ XBT_PUBLIC_DATA(const xbt_running_ctx_t) __xbt_ex_ctx_initializer;
 /* the exception context */
 typedef xbt_running_ctx_t *(*xbt_running_ctx_fetcher_t) (void);
 XBT_PUBLIC_DATA(xbt_running_ctx_fetcher_t) __xbt_running_ctx_fetch;
-extern xbt_running_ctx_t *__xbt_ex_ctx_default(void);
+XBT_PUBLIC( xbt_running_ctx_t *)__xbt_ex_ctx_default(void);
 
 /* the termination handler */
 typedef void (*ex_term_cb_t) (xbt_ex_t *);
 XBT_PUBLIC_DATA(ex_term_cb_t) __xbt_ex_terminate;
-extern void __xbt_ex_terminate_default(xbt_ex_t * e);
+XBT_PUBLIC( void )__xbt_ex_terminate_default(xbt_ex_t * e);
 
 /** @brief Introduce a block where exception may be dealed with 
  *  @hideinitializer
index ee3832c..aaf2a37 100644 (file)
@@ -7,6 +7,7 @@
 #ifndef _XBT_FIFO_H
 #define _XBT_FIFO_H
 #include "xbt/misc.h"           /* SG_BEGIN_DECL */
+#include "xbt/function_types.h" /* int_f_pvoid_pvoid_t */
 
 SG_BEGIN_DECL()
 
@@ -45,6 +46,7 @@ XBT_PUBLIC(xbt_fifo_item_t) xbt_fifo_unshift(xbt_fifo_t, void *);
 XBT_PUBLIC(void *) xbt_fifo_shift(xbt_fifo_t);
 XBT_PUBLIC(int) xbt_fifo_size(xbt_fifo_t);
 XBT_PUBLIC(int) xbt_fifo_is_in(xbt_fifo_t, void *);
+XBT_PUBLIC(xbt_fifo_item_t) xbt_fifo_search_item(xbt_fifo_t f, int_f_pvoid_pvoid_t cmp_fun, void *closure);
 /** @} */
 
 /** @defgroup XBT_fifo_direct Direct access to fifo elements
index 7bdd3ac..4e323dc 100644 (file)
@@ -10,6 +10,9 @@
 
 #include "xbt/sysdep.h"
 
+/** \ingroup msg_file_management
+  \brief Strucure containing information on file like stat on POSIX
+ */
 typedef struct file_stat {
   char *user_rights;
   char *user;
index 529bfc6..a3062a1 100644 (file)
@@ -1,4 +1,4 @@
-/* xbt.h - Public interface to the xbt (gras's toolbox)                     */
+/* xbt.h - Public interface to the xbt (simgrid's toolbox)                     */
 
 /* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
  * All rights reserved.                                                     */
index 6963c4a..e3b5b10 100644 (file)
 typedef struct mdesc *xbt_mheap_t;
 
 /* Allocate SIZE bytes of memory (and memset it to 0).  */
-extern void *mmalloc(xbt_mheap_t md, size_t size);
+XBT_PUBLIC( void ) *mmalloc(xbt_mheap_t md, size_t size);
 
 /* Allocate SIZE bytes of memory (and don't mess with it) */
 void *mmalloc_no_memset(xbt_mheap_t mdp, size_t size);
 
 /* Re-allocate the previously allocated block in void*, making the new block
    SIZE bytes long.  */
-extern void *mrealloc(xbt_mheap_t md, void *ptr, size_t size);
+XBT_PUBLIC( void ) *mrealloc(xbt_mheap_t md, void *ptr, size_t size);
 
 /* Free a block allocated by `mmalloc', `mrealloc' or `mcalloc'.  */
-extern void mfree(xbt_mheap_t md, void *ptr);
+XBT_PUBLIC( void ) mfree(xbt_mheap_t md, void *ptr);
 
 /* Allocate SIZE bytes allocated to ALIGNMENT bytes.  */
-extern void *mmemalign(xbt_mheap_t md, size_t alignment, size_t size);
+XBT_PUBLIC( void ) *mmemalign(xbt_mheap_t md, size_t alignment, size_t size);
 
 /* Allocate SIZE bytes on a page boundary.  */
-extern void *mvalloc(xbt_mheap_t md, size_t size);
+XBT_PUBLIC( void ) *mvalloc(xbt_mheap_t md, size_t size);
 
-extern xbt_mheap_t xbt_mheap_new(int fd, void *baseaddr);
+XBT_PUBLIC( xbt_mheap_t ) xbt_mheap_new(int fd, void *baseaddr);
 
-extern void xbt_mheap_destroy_no_free(xbt_mheap_t md);
+XBT_PUBLIC( void ) xbt_mheap_destroy_no_free(xbt_mheap_t md);
 
-extern void *xbt_mheap_destroy(xbt_mheap_t md);
+XBT_PUBLIC( void ) *xbt_mheap_destroy(xbt_mheap_t md);
 
 /* return the heap used when NULL is passed as first argument to any mm* function */
-extern xbt_mheap_t mmalloc_get_default_md(void);
+XBT_PUBLIC( xbt_mheap_t ) mmalloc_get_default_md(void);
 
 /* To change the heap used when using the legacy version malloc/free/realloc and such */
 void mmalloc_set_current_heap(xbt_mheap_t new_heap);
@@ -70,6 +70,8 @@ void mmalloc_backtrace_display(void *addr);
 
 int is_free_area(void *area, xbt_mheap_t heap);
 
+size_t mmalloc_get_chunks_used(xbt_mheap_t);
+
 
 
 #endif                          /* MMALLOC_H */
index af66946..3fc85f9 100644 (file)
@@ -11,8 +11,6 @@
 
 #include <xbt/misc.h>           /* XBT_PUBLIC */
 
-extern char *xbt_binary_name;
-
 XBT_PUBLIC(void) xbt_init(int *argc, char **argv);
 XBT_PUBLIC(void) xbt_exit(void);
 #endif                          /* _XBT_MODULE_H */
diff --git a/include/xbt/socket.h b/include/xbt/socket.h
deleted file mode 100644 (file)
index 3d568a7..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-/* transport - low level communication (send/receive bunches of bytes)      */
-/* module's public interface exported to end user.                          */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef XBT_SOCKET_H
-#define XBT_SOCKET_H
-
-#include "xbt/misc.h"
-
-/** \addtogroup XBT_sock
- *  \brief Socket handling
- *
- * The model of communications in XBT is very close to the BSD socket one.
- * To get two hosts exchanging data, one of them needs to open a
- * <i>server</i> socket on which it can listen for incoming messages and the
- * other one must connect a <i>client</i> socket onto the server one.
- *
- * The main difference is that you cannot exchange arbitrary bytes on
- * sockets, but messages. See the \ref GRAS_msg section for details.
- *
- * If you need an example of how to use sockets, check \ref GRAS_ex_ping.
- */
-
-/** \defgroup XBT_sock_create Socket creation functions
- *  \ingroup XBT_sock
- *
- */
-/* @{*/
-/** \brief Opaque type describing a socket */
-typedef struct s_xbt_socket *xbt_socket_t;
-typedef struct s_xbt_trp_plugin s_xbt_trp_plugin_t, *xbt_trp_plugin_t;
-
-XBT_PUBLIC(void) xbt_socket_new(int incoming, xbt_socket_t* dst);
-XBT_PUBLIC(void) xbt_socket_new_ext(int incoming,
-                                    xbt_socket_t* dst,
-                                    xbt_trp_plugin_t plugin,
-                                    unsigned long int buf_size,
-                                    int measurement);
-XBT_PUBLIC(void*) xbt_socket_get_data(xbt_socket_t sock);
-XBT_PUBLIC(void) xbt_socket_set_data(xbt_socket_t sock, void* data);
-
-/** \brief Simply create a client socket (to speak to a remote host) */
-XBT_PUBLIC(xbt_socket_t) xbt_socket_tcp_client(const char *host,
-                                               unsigned short port);
-XBT_PUBLIC(xbt_socket_t) xbt_socket_tcp_client_from_string(const char *host);
-/** \brief Simply create a server socket (to ear from remote hosts speaking to you) */
-XBT_PUBLIC(xbt_socket_t) xbt_socket_tcp_server(unsigned short port);
-
-/** \brief Create a client socket, full interface to all relevant settings */
-XBT_PUBLIC(xbt_socket_t) xbt_socket_tcp_client_ext(const char *host,
-                                                   unsigned short port,
-                                                   unsigned long int bufSize,
-                                                   int measurement);
-/** \brief Create a server socket, full interface to all relevant settings */
-XBT_PUBLIC(xbt_socket_t) xbt_socket_tcp_server_ext(unsigned short portcp_t,
-                                                   unsigned long int bufSize,
-                                                   int measurement);
-XBT_PUBLIC(xbt_socket_t)
-    xbt_socket_tcp_server_range(unsigned short minport, unsigned short maxport,
-                                unsigned long int buf_size, int measurement);
-
-XBT_PUBLIC(void) xbt_socket_close(xbt_socket_t sd);
-XBT_PUBLIC(void) xbt_socket_close_voidp(void *sock);
-
-/* @}*/
-/** \defgroup XBT_sock_info Retrieving data about sockets and peers
- *  \ingroup XBT_sock
- * 
- * Who are you talking to? 
- */
-/* @{*/
-
-/** Get the port number on which this socket is connected on my side */
-XBT_PUBLIC(int) xbt_socket_my_port(xbt_socket_t sock);
-
-/** @brief Get the port number on which this socket is connected on remote side 
- *
- * This is the port declared on remote side with the
- * gras_socket_master() function (if any, or a random number being unique on
- * the remote host). If remote used gras_socket_master() more than once, the 
- * lastly declared number will be used here.
- *
- * Note to BSD sockets experts: With BSD sockets, the sockaddr 
- * structure allows you to retrieve the port of the client socket on
- * remote side, but it is of no use (from user perspective, it is
- * some random number above 6000). That is why XBT sockets differ
- * from BSD ones here. 
- */
-XBT_PUBLIC(int) xbt_socket_peer_port(xbt_socket_t sock);
-/** Get the host name of the remote side */
-XBT_PUBLIC(const char *) xbt_socket_peer_name(xbt_socket_t sock);
-/** Get the process name of the remote side */
-XBT_PUBLIC(const char *) xbt_socket_peer_proc(xbt_socket_t sock);
-/* @}*/
-
-/** \defgroup XBT_sock_meas Using measurement sockets
- *  \ingroup XBT_sock
- * 
- * You may want to use sockets not to exchange valuable data (in messages), 
- * but to conduct some bandwidth measurements and related experiments. If so, try those measurement sockets.
- * 
- * You can only use those functions on sockets opened with the "measurement" boolean set to true.
- * 
- */
-/* @{*/
-
-XBT_PUBLIC(int) xbt_socket_is_meas(xbt_socket_t sock);
-XBT_PUBLIC(void) xbt_socket_meas_send(xbt_socket_t peer,
-                                      unsigned int timeout,
-                                      unsigned long int msgSize,
-                                      unsigned long int msgAmount);
-XBT_PUBLIC(void) xbt_socket_meas_recv(xbt_socket_t peer,
-                                      unsigned int timeout,
-                                      unsigned long int msgSize,
-                                      unsigned long int msgAmount);
-XBT_PUBLIC(xbt_socket_t) xbt_socket_meas_accept(xbt_socket_t peer);
-
-/* @}*/
-
-/***
- *** Main user functions
- ***/
-/* stable if we know the storage will keep as is until the next trp_flush */
-XBT_PUBLIC(void) xbt_trp_send(xbt_socket_t sd, char *data, long int size,
-                             int stable);
-XBT_PUBLIC(void) xbt_trp_recv(xbt_socket_t sd, char *data, long int size);
-XBT_PUBLIC(void) xbt_trp_flush(xbt_socket_t sd);
-
-/* Find which socket needs to be read next */
-XBT_PUBLIC(xbt_socket_t) xbt_trp_select(double timeout);
-
-/* Set the peer process name (used by messaging layer) */
-XBT_PUBLIC(void) xbt_socket_peer_proc_set(xbt_socket_t sock,
-                                          char *peer_proc);
-
-/** \defgroup XBT_sock_plugin Plugin mechanism
- *  \ingroup XBT_sock
- *
- * XBT provides a TCP plugin that implements TCP sockets.
- * You can also write your own plugin if you need another socket
- * implementation.
- */
-/* @{*/
-
-/* A plugin type */
-
-struct s_xbt_trp_plugin {
-  char *name;
-
-  /* dst pointers are created and initialized with default values
-     before call to socket_client/server.
-     Retrieve the info you need from there. */
-  void (*socket_client) (xbt_trp_plugin_t self, const char *host, int port, xbt_socket_t dst);
-  void (*socket_server) (xbt_trp_plugin_t self, int port, xbt_socket_t dst);
-
-  xbt_socket_t (*socket_accept) (xbt_socket_t from);
-
-  /* Getting info about who's speaking */
-  int (*my_port) (xbt_socket_t sd);
-  int (*peer_port) (xbt_socket_t sd);
-  const char* (*peer_name) (xbt_socket_t sd);
-  const char* (*peer_proc) (xbt_socket_t sd);
-  void (*peer_proc_set) (xbt_socket_t sd, char* peer_proc);
-
-  /* socket_close() is responsible of telling the OS that the socket is over,
-     but should not free the socket itself (beside the specific part) */
-  void (*socket_close) (xbt_socket_t sd);
-
-  /* send/recv may be buffered */
-  void (*send) (xbt_socket_t sd,
-                const char *data,
-                unsigned long int size,
-                int stable /* storage will survive until flush */ );
-  int (*recv) (xbt_socket_t sd, char *data, unsigned long int size);
-  /* raw_send/raw_recv is never buffered (use it for measurement stuff) */
-  void (*raw_send) (xbt_socket_t sd,
-                    const char *data, unsigned long int size);
-  int (*raw_recv) (xbt_socket_t sd, char *data, unsigned long int size);
-
-  /* flush has to make sure that the pending communications are achieved */
-  void (*flush) (xbt_socket_t sd);
-
-  void *data;                   /* plugin-specific data */
-
-  /* exit is responsible for freeing data and telling to the OS that
-     this plugin is gone.
-     If exit is NULL, data gets brutally freed by the generic interface.
-     (i.e. an exit function is only needed when data contains pointers) */
-  void (*exit) (xbt_trp_plugin_t);
-};
-
-typedef void (*xbt_trp_setup_t) (xbt_trp_plugin_t dst);
-
-XBT_PUBLIC(void) xbt_trp_plugin_new(const char *name, xbt_trp_setup_t setup);
-XBT_PUBLIC(xbt_trp_plugin_t)
-    xbt_trp_plugin_get_by_name(const char *name);
-
-/* @}*/
-
-#endif                          /* XBT_SOCKET_H */
index 39ecbd6..fb2bc39 100644 (file)
@@ -134,12 +134,6 @@ static XBT_INLINE unsigned int xbt_str_hash(const char *str)
   return hash;
 }
                                                       
-/** @brief Classical alias to (char*)
- *
- * This of almost no use, beside cosmetics and the XBT datadesc parsing macro (see \ref XBT_dd_auto).
- */
-typedef char *xbt_string_t;
-
 /**@}*/
 
 SG_END_DECL()
diff --git a/include/xbt/synchro.h b/include/xbt/synchro.h
deleted file mode 100644 (file)
index e735325..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/* xbt/synchro.h -- Synchronization tools                                   */
-/* Usable in simulator, (or in real life when mixing with GRAS)             */
-
-/* Copyright (c) 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-/* synchro_core.h is splited away since it is used by dynar.h, and we use dynar here */
-
-#ifndef SYNCHRO_H_
-#define SYNCHRO_H_
-#include "xbt/misc.h"           /* SG_BEGIN_DECL */
-#include "xbt/dynar.h"
-SG_BEGIN_DECL()
-
-XBT_PUBLIC(void) xbt_dynar_dopar(xbt_dynar_t datas,
-                                 void_f_int_pvoid_t function);
-
-SG_END_DECL()
-#endif                          /* SYNCHRO_H_ */
index 51fee8e..afa9207 100644 (file)
@@ -1,4 +1,4 @@
-/* xbt/synchro.h -- Synchronization tools                                   */
+/* xbt/synchro_core.h -- Synchronization tools                              */
 /* Usable in simulator, (or in real life when mixing with GRAS)             */
 
 /* Copyright (c) 2009, 2010. The SimGrid Team.
diff --git a/include/xbt/time.h b/include/xbt/time.h
deleted file mode 100644 (file)
index 6795b05..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* xbt/time.h -- Time tools                                                  */
-/* Usable in simulator, (or in real life when mixing with GRAS)             */
-
-/* Copyright (c) 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/misc.h"           /* SG_BEGIN_DECL */
-
-SG_BEGIN_DECL()
-
-/**
- *
- * Time management functions, returns the system time or sleeps a process. They work both on the simulated and real systems(GRAS). 
- */
-XBT_PUBLIC(double) xbt_time(void);
-XBT_PUBLIC(void) xbt_sleep(double sec);
-
-SG_END_DECL()
index e960c4a..1d8f1af 100644 (file)
 #include "xbt/misc.h"
 #include "xbt/sysdep.h"
 #include "xbt/function_types.h"
+#include "xbt/dynar.h"
 
 SG_BEGIN_DECL()
 
-    /* Get the PID of the current process */
-    XBT_PUBLIC_DATA(int_f_void_t) xbt_getpid;
+/* Get the PID of the current (simulated) process */
+XBT_PUBLIC_DATA(int_f_void_t) xbt_getpid;
+
+/* Current time */
+XBT_PUBLIC(double) xbt_time(void);
+
+    /* Get the name of the UNIX process englobing the world */
+    XBT_PUBLIC_DATA(char*) xbt_binary_name;
+
+    /** Contains all the parameters we got from the command line (including argv[0]) */
+    XBT_PUBLIC_DATA(xbt_dynar_t) xbt_cmdline;
+
+    /**
+     *
+     * Time management functions, returns the system time or sleeps a process. They work both on the simulated and real systems(GRAS).
+     */
+    XBT_PUBLIC(double) xbt_time(void);
+    XBT_PUBLIC(void) xbt_sleep(double sec);
+
 
 SG_END_DECL()
 #endif                          /* __XBT_VIRTU_H__ */
index 866958a..7d7bd29 100644 (file)
@@ -66,7 +66,7 @@ XBT_PUBLIC(void) xbt_os_thread_join(xbt_os_thread_t thread,
 XBT_PUBLIC(void) xbt_os_thread_yield(void);
 XBT_PUBLIC(void) xbt_os_thread_cancel(xbt_os_thread_t thread);
 XBT_PUBLIC(void *) xbt_os_thread_getparam(void);
-
+XBT_PUBLIC(void) xbt_os_thread_setstacksize(int stack_size);
 
   /** \brief Thread mutex data type (opaque structure) */
 typedef struct xbt_os_mutex_ *xbt_os_mutex_t;
diff --git a/src/amok/Bandwidth/bandwidth.c b/src/amok/Bandwidth/bandwidth.c
deleted file mode 100644 (file)
index 05ebc4e..0000000
+++ /dev/null
@@ -1,544 +0,0 @@
-/* amok_bandwidth - Bandwidth tests facilities                              */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "amok/Bandwidth/bandwidth_private.h"
-#include "gras/messages.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(amok_bw, amok, "Bandwidth testing");
-
-
-/******************************
- * Stuff global to the module *
- ******************************/
-
-static short _amok_bw_initialized = 0;
-
-/** @brief module initialization; all participating nodes must run this */
-void amok_bw_init(void)
-{
-
-  if (!_amok_bw_initialized) {
-    amok_bw_bw_init();
-    amok_bw_sat_init();
-  }
-
-  amok_bw_bw_join();
-  amok_bw_sat_join();
-
-  _amok_bw_initialized++;
-}
-
-/** @brief module finalization */
-void amok_bw_exit(void)
-{
-  if (!_amok_bw_initialized)
-    return;
-
-  amok_bw_bw_leave();
-  amok_bw_sat_leave();
-
-  _amok_bw_initialized--;
-}
-
-/* ***************************************************************************
- * Bandwidth tests
- * ***************************************************************************/
-static int amok_bw_cb_bw_handshake(gras_msg_cb_ctx_t ctx, void *payload);
-static int amok_bw_cb_bw_request(gras_msg_cb_ctx_t ctx, void *payload);
-
-void amok_bw_bw_init()
-{
-  xbt_datadesc_type_t bw_request_desc, bw_res_desc;
-
-  /* Build the Bandwidth datatype descriptions */
-  bw_request_desc = xbt_datadesc_struct("s_bw_request_t");
-  xbt_datadesc_struct_append(bw_request_desc, "peer",
-                              xbt_datadesc_by_name("s_xbt_peer_t"));
-  xbt_datadesc_struct_append(bw_request_desc, "buf_size",
-                              xbt_datadesc_by_name("unsigned long int"));
-  xbt_datadesc_struct_append(bw_request_desc, "msg_size",
-                              xbt_datadesc_by_name("unsigned long int"));
-  xbt_datadesc_struct_append(bw_request_desc, "msg_amount",
-                              xbt_datadesc_by_name("unsigned long int"));
-  xbt_datadesc_struct_append(bw_request_desc, "min_duration",
-                              xbt_datadesc_by_name("double"));
-  xbt_datadesc_struct_close(bw_request_desc);
-  bw_request_desc = xbt_datadesc_ref("bw_request_t", bw_request_desc);
-
-  bw_res_desc = xbt_datadesc_struct("s_bw_res_t");
-  xbt_datadesc_struct_append(bw_res_desc, "timestamp",
-                              xbt_datadesc_by_name("unsigned int"));
-  xbt_datadesc_struct_append(bw_res_desc, "seconds",
-                              xbt_datadesc_by_name("double"));
-  xbt_datadesc_struct_append(bw_res_desc, "bw",
-                              xbt_datadesc_by_name("double"));
-  xbt_datadesc_struct_close(bw_res_desc);
-  bw_res_desc = xbt_datadesc_ref("bw_res_t", bw_res_desc);
-
-  gras_msgtype_declare_rpc("BW handshake", bw_request_desc,
-                           bw_request_desc);
-
-  gras_msgtype_declare_rpc("BW reask", bw_request_desc, NULL);
-  gras_msgtype_declare("BW stop", NULL);
-
-  gras_msgtype_declare_rpc("BW request", bw_request_desc, bw_res_desc);
-}
-
-void amok_bw_bw_join()
-{
-  gras_cb_register("BW request", &amok_bw_cb_bw_request);
-  gras_cb_register("BW handshake", &amok_bw_cb_bw_handshake);
-}
-
-void amok_bw_bw_leave()
-{
-  gras_cb_unregister("BW request", &amok_bw_cb_bw_request);
-  gras_cb_unregister("BW handshake", &amok_bw_cb_bw_handshake);
-}
-
-/**
- * \brief bandwidth measurement between localhost and \e peer
- * 
- * \arg peer: A (regular) socket at which the the host with which we should conduct the experiment can be contacted
- * \arg buf_size: Size of the socket buffer. If 0, a sain default is used (32k, but may change)
- * \arg msg_size: Size of each message sent. 
- * \arg msg_amount: Amount of such messages to exchange 
- * \arg min_duration: The minimum wanted duration. When the test message is too little, you tend to measure the latency. This argument allows you to force the test to take at least, say one second.
- * \arg sec: where the result (in seconds) should be stored. If the experiment was done several times because the first one was too short, this is the timing of the last run only.
- * \arg bw: observed Bandwidth (in byte/s) 
- *
- * Conduct a bandwidth test from the local process to the given peer.
- * This call is blocking until the end of the experiment.
- *
- * If the asked experiment lasts less than \a min_duration, another one will be
- * launched (and others, if needed). msg_size will be multiplicated by
- * MIN(20, (\a min_duration / measured_duration) *1.1) (plus 10% to be sure to eventually
- * reach the \a min_duration). In that case, the reported bandwidth and
- * duration are the ones of the last run. \a msg_size cannot go over 64Mb
- * because we need to malloc a block of this size in RL to conduct the
- * experiment, and we still don't want to visit the swap. In such case, the 
- * number of messages is increased instead of their size.
- *
- * Results are reported in last args, and sizes are in byte.
- * 
- * @warning: in SimGrid version 3.1 and previous, the experiment size were specified
- *           as the total amount of data to send and the msg_size. This
- *           was changed for the fool wanting to send more than MAXINT
- *           bytes in a fat pipe.
- * 
- */
-void amok_bw_test(xbt_socket_t peer,
-                  unsigned long int buf_size,
-                  unsigned long int msg_size,
-                  unsigned long int msg_amount,
-                  double min_duration, /*OUT*/ double *sec, double *bw)
-{
-
-  /* Measurement sockets for the experiments */
-  volatile xbt_socket_t measMasterIn = NULL, measIn, measOut = NULL;
-  volatile int port;
-  bw_request_t request, request_ack;
-  xbt_ex_t e;
-  int first_pass;
-
-  for (port = 5000; port < 10000 && measMasterIn == NULL; port++) {
-    TRY {
-      measMasterIn = gras_socket_server_ext(++port, buf_size, 1);
-    }
-    CATCH(e) {
-      measMasterIn = NULL;
-      if (port == 10000 - 1) {
-        RETHROWF("Error caught while opening a measurement socket: %s");
-      } else {
-        xbt_ex_free(e);
-      }
-    }
-  }
-
-  request = xbt_new0(s_bw_request_t, 1);
-  request->buf_size = buf_size;
-  request->msg_size = msg_size;
-  request->msg_amount = msg_amount;
-  request->peer.name = NULL;
-  request->peer.port = xbt_socket_my_port(measMasterIn);
-  XBT_DEBUG
-      ("Handshaking with %s:%d to connect it back on my %d (bufsize=%lu, msg_size=%lu, msg_amount=%lu)",
-       xbt_socket_peer_name(peer), xbt_socket_peer_port(peer),
-       request->peer.port, request->buf_size, request->msg_size,
-       request->msg_amount);
-
-  TRY {
-    gras_msg_rpccall(peer, 15, "BW handshake", &request, &request_ack);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Error encountered while sending the BW request: %s");
-  }
-  measIn = xbt_socket_meas_accept(measMasterIn);
-
-  TRY {
-    measOut = gras_socket_client_ext(xbt_socket_peer_name(peer),
-                                     request_ack->peer.port,
-                                     request->buf_size, 1);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF
-        ("Error encountered while opening the measurement socket to %s:%d for BW test: %s",
-         xbt_socket_peer_name(peer), request_ack->peer.port);
-  }
-  XBT_DEBUG
-      ("Got ACK; conduct the experiment (msg_size = %lu, msg_amount=%lu)",
-       request->msg_size, request->msg_amount);
-
-  *sec = 0;
-  first_pass = 1;
-  do {
-    if (first_pass == 0) {
-      double meas_duration = *sec;
-      double increase;
-      if (*sec != 0.0) {
-        increase = (min_duration / meas_duration) * 1.1;
-      } else {
-        increase = 4;
-      }
-      /* Do not increase the exp size too fast since our decision would be based on wrong measurements */
-      if (increase > 20)
-        increase = 20;
-
-      request->msg_size = request->msg_size * increase;
-
-      /* Do not do too large experiments messages or the sensors 
-         will start to swap to store one of them.
-         And then increase the number of messages to compensate (check for overflow there, too) */
-      if (request->msg_size > 64 * 1024 * 1024) {
-        unsigned long int new_amount =
-            ((request->msg_size / ((double) 64 * 1024 * 1024))
-             * request->msg_amount) + 1;
-
-        xbt_assert(new_amount > request->msg_amount,
-                    "Overflow on the number of messages! You must have a *really* fat pipe. Please fix your platform");
-        request->msg_amount = new_amount;
-
-        request->msg_size = 64 * 1024 * 1024;
-      }
-
-      XBT_VERB
-          ("The experiment was too short (%f sec<%f sec). Redo it with msg_size=%lu (nb_messages=%lu) (got %fMb/s)",
-           meas_duration, min_duration, request->msg_size,
-           request->msg_amount,
-           ((double) request->msg_size) * ((double) request->msg_amount /
-                                           (*sec) / 1024.0 / 1024.0));
-
-      gras_msg_rpccall(peer, 60, "BW reask", &request, NULL);
-    }
-
-    first_pass = 0;
-    *sec = gras_os_time();
-    TRY {
-      xbt_socket_meas_send(measOut, 120, request->msg_size,
-                            request->msg_amount);
-      XBT_DEBUG("Data sent. Wait ACK");
-      xbt_socket_meas_recv(measIn, 120, 1, 1);
-    }
-    CATCH_ANONYMOUS {
-      gras_socket_close(measOut);
-      gras_socket_close(measMasterIn);
-      gras_socket_close(measIn);
-      RETHROWF("Unable to conduct the experiment: %s");
-    }
-    *sec = gras_os_time() - *sec;
-    if (*sec != 0.0) {
-      *bw =
-          ((double) request->msg_size) * ((double) request->msg_amount) /
-          (*sec);
-    }
-    XBT_DEBUG("Experiment done ; it took %f sec", *sec);
-    if (*sec <= 0) {
-      XBT_CRITICAL("Nonpositive value (%f) found for BW test time.", *sec);
-    }
-
-  } while (*sec < min_duration);
-
-  XBT_DEBUG
-      ("This measurement was long enough (%f sec; found %f b/s). Stop peer",
-       *sec, *bw);
-  gras_msg_send(peer, "BW stop", NULL);
-
-  free(request_ack);
-  free(request);
-  if (measIn != measMasterIn)
-    gras_socket_close(measIn);
-  gras_socket_close(measMasterIn);
-  gras_socket_close(measOut);
-}
-
-
-/* Callback to the "BW handshake" message: 
-   opens a server measurement socket,
-   indicate its port in an "BW handshaked" message,
-   receive the corresponding data on the measurement socket, 
-   close the measurement socket
-
-   sizes are in byte
-*/
-int amok_bw_cb_bw_handshake(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-  volatile xbt_socket_t measMasterIn = NULL,  measIn = NULL, measOut = NULL;
-  volatile bw_request_t request = *(bw_request_t *) payload;
-  bw_request_t answer;
-  xbt_ex_t e;
-  volatile int port;
-  volatile int tooshort = 1;
-  gras_msg_cb_ctx_t ctx_reask;
-  static xbt_dynar_t msgtwaited = NULL;
-
-  XBT_DEBUG
-      ("Handshaked to connect to %s:%d (sizes: buf=%lu msg=%lu msg_amount=%lu)",
-       xbt_socket_peer_name(expeditor), request->peer.port,
-       request->buf_size, request->msg_size, request->msg_amount);
-
-  /* Build our answer */
-  answer = xbt_new0(s_bw_request_t, 1);
-
-  for (port = 6000; port <= 10000 && measMasterIn == NULL; port++) {
-    TRY {
-      measMasterIn = gras_socket_server_ext(port, request->buf_size, 1);
-    }
-    CATCH(e) {
-      measMasterIn = NULL;
-      if (port < 10000)
-        xbt_ex_free(e);
-      else
-        /* FIXME: tell error to remote */
-        RETHROWF
-            ("Error encountered while opening a measurement server socket: %s");
-    }
-  }
-
-  answer->buf_size = request->buf_size;
-  answer->msg_size = request->msg_size;
-  answer->msg_amount = request->msg_amount;
-  answer->peer.port = xbt_socket_my_port(measMasterIn);
-
-  TRY {
-    gras_msg_rpcreturn(60, ctx, &answer);
-  }
-  CATCH_ANONYMOUS {
-    gras_socket_close(measMasterIn);
-    /* FIXME: tell error to remote */
-    RETHROWF("Error encountered while sending the answer: %s");
-  }
-
-
-  /* Don't connect asap to leave time to other side to enter the accept() */
-  TRY {
-    measOut = gras_socket_client_ext(xbt_socket_peer_name(expeditor),
-                                     request->peer.port,
-                                     request->buf_size, 1);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF
-        ("Error encountered while opening a measurement socket back to %s:%d : %s",
-         xbt_socket_peer_name(expeditor), request->peer.port);
-    /* FIXME: tell error to remote */
-  }
-
-  TRY {
-    measIn = xbt_socket_meas_accept(measMasterIn);
-    XBT_DEBUG
-        ("BW handshake answered. buf_size=%lu msg_size=%lu msg_amount=%lu port=%d",
-         answer->buf_size, answer->msg_size, answer->msg_amount,
-         answer->peer.port);
-  }
-  CATCH_ANONYMOUS {
-    gras_socket_close(measMasterIn);
-    gras_socket_close(measIn);
-    gras_socket_close(measOut);
-    /* FIXME: tell error to remote ? */
-    RETHROWF("Error encountered while opening the meas socket: %s");
-  }
-
-  if (!msgtwaited) {
-    msgtwaited = xbt_dynar_new(sizeof(gras_msgtype_t), NULL);
-    xbt_dynar_push(msgtwaited, gras_msgtype_by_name("BW stop"));
-    xbt_dynar_push(msgtwaited, gras_msgtype_by_name("BW reask"));
-  }
-
-  while (tooshort) {
-    void *payloadgot;
-    int msggot;
-    TRY {
-      xbt_socket_meas_recv(measIn, 120, request->msg_size,
-                            request->msg_amount);
-      xbt_socket_meas_send(measOut, 120, 1, 1);
-    }
-    CATCH_ANONYMOUS {
-      gras_socket_close(measMasterIn);
-      gras_socket_close(measIn);
-      gras_socket_close(measOut);
-      /* FIXME: tell error to remote ? */
-      RETHROWF("Error encountered while receiving the experiment: %s");
-    }
-    gras_msg_wait_or(60, msgtwaited, &ctx_reask, &msggot, &payloadgot);
-    switch (msggot) {
-    case 0:                    /* BW stop */
-      tooshort = 0;
-      break;
-    case 1:                    /* BW reask */
-      tooshort = 1;
-      free(request);
-      request = (bw_request_t) payloadgot;
-      XBT_VERB("Return the reasking RPC");
-      gras_msg_rpcreturn(60, ctx_reask, NULL);
-    }
-    gras_msg_cb_ctx_free(ctx_reask);
-  }
-
-  if (measIn != measMasterIn)
-    gras_socket_close(measMasterIn);
-  gras_socket_close(measIn);
-  gras_socket_close(measOut);
-  free(answer);
-  free(request);
-  XBT_VERB("BW experiment done.");
-  return 0;
-}
-
-/**
- * \brief request a bandwidth measurement between two remote peers
- *
- * \arg from_name: Name of the first peer 
- * \arg from_port: port on which the first process is listening for messages
- * \arg to_name: Name of the second peer 
- * \arg to_port: port on which the second process is listening (for messages, do not 
- * give a measurement socket here. The needed measurement sockets will be created 
- * automatically and negociated between the peers)
- * \arg buf_size: Size of the socket buffer. If 0, a sain default is used (32k, but may change)
- * \arg msg_size: Size of each message sent. 
- * \arg msg_amount: Amount of such data to exchange
- * \arg sec: where the result (in seconds) should be stored.
- * \arg bw: observed Bandwidth (in byte/s)
- *
- * Conduct a bandwidth test from the process from_peer:from_port to to_peer:to_port.
- * This call is blocking until the end of the experiment.
- *
- * @warning: in SimGrid version 3.1 and previous, the experiment size were specified
- *           as the total amount of data to send and the msg_size. This
- *           was changed for the fool wanting to send more than MAXINT
- *           bytes in a fat pipe.
- * 
- * Results are reported in last args, and sizes are in bytes.
- */
-void amok_bw_request(const char *from_name, unsigned int from_port,
-                     const char *to_name, unsigned int to_port,
-                     unsigned long int buf_size,
-                     unsigned long int msg_size,
-                     unsigned long int msg_amount,
-                     double min_duration, /*OUT*/ double *sec, double *bw)
-{
-
-  xbt_socket_t sock;
-  /* The request */
-  bw_request_t request;
-  bw_res_t result;
-  request = xbt_new0(s_bw_request_t, 1);
-  request->buf_size = buf_size;
-  request->msg_size = msg_size;
-  request->msg_amount = msg_amount;
-  request->min_duration = min_duration;
-
-
-  request->peer.name = (char *) to_name;
-  request->peer.port = to_port;
-
-
-  sock = gras_socket_client(from_name, from_port);
-
-
-
-  XBT_DEBUG("Ask for a BW test between %s:%u and %s:%u", from_name, from_port,
-         to_name, to_port);
-  gras_msg_rpccall(sock, 20 * 60, "BW request", &request, &result);
-
-  if (sec)
-    *sec = result->sec;
-  if (bw)
-    *bw = result->bw;
-
-  XBT_VERB("BW test (%s:%u -> %s:%u) took %f sec (%f kb/s)",
-        from_name, from_port, to_name, to_port,
-        result->sec, ((double) result->bw) / 1024.0);
-
-  gras_socket_close(sock);
-  free(result);
-  free(request);
-}
-
-int amok_bw_cb_bw_request(gras_msg_cb_ctx_t ctx, void *payload)
-{
-
-  /* specification of the test to run, and our answer */
-  bw_request_t request = *(bw_request_t *) payload;
-  bw_res_t result = xbt_new0(s_bw_res_t, 1);
-  xbt_socket_t peer, asker;
-
-  asker = gras_msg_cb_ctx_from(ctx);
-  XBT_VERB("Asked by %s:%d to conduct a bw XP with %s:%d (request: %lu %lu)",
-        xbt_socket_peer_name(asker), xbt_socket_peer_port(asker),
-        request->peer.name, request->peer.port,
-        request->msg_size, request->msg_amount);
-  peer = gras_socket_client(request->peer.name, request->peer.port);
-  amok_bw_test(peer,
-               request->buf_size, request->msg_size, request->msg_amount,
-               request->min_duration, &(result->sec), &(result->bw));
-
-  gras_msg_rpcreturn(240, ctx, &result);
-
-  gras_os_sleep(1);
-  gras_socket_close(peer);      /* FIXME: it should be blocking in RL until everything is sent */
-  free(request->peer.name);
-  free(request);
-  free(result);
-
-  return 0;
-}
-
-/** \brief builds a matrix of results of bandwidth measurement
- * 
- * @warning: in SimGrid version 3.1 and previous, the experiment size were specified
- *           as the total amount of data to send and the msg_size. This
- *           was changed for the fool wanting to send more than MAXINT
- *           bytes in a fat pipe.
- */
-double *amok_bw_matrix(xbt_dynar_t peers,
-                       int buf_size_bw, int msg_size_bw, int msg_amount_bw,
-                       double min_duration)
-{
-  double sec;
-  /* construction of matrices for bandwith and latency */
-
-
-  unsigned int i, j;
-  int len = xbt_dynar_length(peers);
-
-  double *matrix_res = xbt_new0(double, len * len);
-  xbt_peer_t p1, p2;
-
-  xbt_dynar_foreach(peers, i, p1) {
-    xbt_dynar_foreach(peers, j, p2) {
-      if (i != j) {
-        /* Mesurements of Bandwidth */
-        amok_bw_request(p1->name, p1->port, p2->name, p2->port,
-                        buf_size_bw, msg_size_bw, msg_amount_bw,
-                        min_duration, &sec, &matrix_res[i * len + j]);
-      }
-    }
-  }
-  return matrix_res;
-}
diff --git a/src/amok/Bandwidth/bandwidth_private.h b/src/amok/Bandwidth/bandwidth_private.h
deleted file mode 100644 (file)
index aa3097a..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/* bandwidth - network bandwidth tests facilities                           */
-
-/* module's private interface masked even to other parts of AMOK.           */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-
-#ifndef AMOK_BANDWIDTH_PRIVATE_H
-#define AMOK_BANDWIDTH_PRIVATE_H
-
-#include "gras.h"
-#include "amok/bandwidth.h"
-
-void amok_bw_bw_init(void);     /* Must be called only once per node */
-void amok_bw_bw_join(void);     /* Each process must run it */
-void amok_bw_bw_leave(void);    /* Each process must run it */
-
-void amok_bw_sat_init(void);    /* Must be called only once per node */
-void amok_bw_sat_join(void);    /* Each process must run it */
-void amok_bw_sat_leave(void);   /* Each process must run it */
-
-/***
- * Plain bandwidth measurement stuff
- ***/
-
-/* Request for a BW experiment.
- * If peer==NULL, it should be between the sender and the receiver.
- * If not, it should be between between the receiver and peer (3-tiers).
- */
-typedef struct {
-  s_xbt_peer_t peer;            /* peer+raw socket to use */
-  unsigned long int buf_size;
-  unsigned long int msg_size;
-  unsigned long int msg_amount;
-  double min_duration;
-} s_bw_request_t, *bw_request_t;
-
-/* Result of a BW experiment (payload when answering). */
-typedef struct {
-  unsigned int timestamp;
-  double sec;
-  double bw;
-} s_bw_res_t, *bw_res_t;
-
-
-/***
- * Saturation stuff
- ***/
-
-/* Description of a saturation experiment (payload asking some peer to collaborate for that)
- */
-typedef struct {
-  s_xbt_peer_t peer;            /* peer+raw socket to use */
-  unsigned int msg_size;
-  unsigned int duration;
-} s_sat_request_t, *sat_request_t;
-
-void amok_bw_sat_start(const char *from_name, unsigned int from_port,
-                       const char *to_name, unsigned int to_port,
-                       unsigned int msg_size, unsigned int duration);
-
-#endif                          /* AMOK_BANDWIDTH_PRIVATE_H */
diff --git a/src/amok/Bandwidth/saturate.c b/src/amok/Bandwidth/saturate.c
deleted file mode 100644 (file)
index fc374dd..0000000
+++ /dev/null
@@ -1,348 +0,0 @@
-/* amok_saturate - Link saturating facilities (for ALNeM's BW testing)      */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "amok/Bandwidth/bandwidth_private.h"
-#include "gras/Msg/msg_private.h"       /* FIXME: This mucks with contextes to answer RPC directly */
-#include "xbt/ex.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(amok_bw_sat, amok_bw,
-                                "Everything concerning the SATuration part of the amok_bw module");
-
-static int amok_bw_cb_sat_start(gras_msg_cb_ctx_t ctx, void *payload);
-static int amok_bw_cb_sat_begin(gras_msg_cb_ctx_t ctx, void *payload);
-
-
-void amok_bw_sat_init(void)
-{
-  xbt_datadesc_type_t bw_res_desc = xbt_datadesc_by_name("bw_res_t");
-  xbt_datadesc_type_t sat_request_desc;
-  /* Build the saturation datatype descriptions */
-
-  sat_request_desc = xbt_datadesc_struct("s_sat_request_desc_t");
-  xbt_datadesc_struct_append(sat_request_desc, "peer",
-                              xbt_datadesc_by_name("s_xbt_peer_t"));
-  xbt_datadesc_struct_append(sat_request_desc, "msg_size",
-                              xbt_datadesc_by_name("unsigned int"));
-  xbt_datadesc_struct_append(sat_request_desc, "duration",
-                              xbt_datadesc_by_name("unsigned int"));
-  xbt_datadesc_struct_close(sat_request_desc);
-  sat_request_desc = xbt_datadesc_ref("sat_request_t", sat_request_desc);
-
-  /* Register the saturation messages */
-  gras_msgtype_declare_rpc("amok_bw_sat start", sat_request_desc, NULL);
-  gras_msgtype_declare_rpc("amok_bw_sat begin", sat_request_desc,
-                           sat_request_desc);
-  gras_msgtype_declare_rpc("amok_bw_sat stop", NULL, bw_res_desc);
-
-}
-
-void amok_bw_sat_join(void)
-{
-  gras_cb_register("amok_bw_sat start", &amok_bw_cb_sat_start);
-  gras_cb_register("amok_bw_sat begin", &amok_bw_cb_sat_begin);
-}
-
-void amok_bw_sat_leave(void)
-{
-  gras_cb_unregister("amok_bw_sat start", &amok_bw_cb_sat_start);
-  gras_cb_unregister("amok_bw_sat begin", &amok_bw_cb_sat_begin);
-}
-
-/* ***************************************************************************
- * Link saturation
- * ***************************************************************************/
-
-/**
- * @brief Ask 'from_name:from_port' to stop saturating going to to_name:to_name.
- *
- * @param from_name: Name of the peer we are asking to do a experiment with (to_name:to_port)
- * @param from_port: port on which the process we are asking for an experiment is listening
- * (for message, do not give a raw socket here. The needed raw socket will be negociated 
- * between the peers)
- * @param to_name: Name of the peer with which we should conduct the experiment
- * @param to_port: port on which the peer process is listening for message
- * @param msg_size: Size of each message sent.
- * @param duration: How long in maximum should be the saturation.
- *
- * Ask the process 'from_name:from_port' to start to saturate the link between itself
- * and to_name:to_name.
- */
-void amok_bw_saturate_start(const char *from_name, unsigned int from_port,
-                            const char *to_name, unsigned int to_port,
-                            unsigned int msg_size, double duration)
-{
-  xbt_socket_t sock;
-  sat_request_t request = xbt_new(s_sat_request_t, 1);
-
-  XBT_VERB("Start from_name %s:%u -> to_name %s:%u",
-        from_name, from_port, to_name, to_port);
-  sock = gras_socket_client(from_name, from_port);
-
-  request->peer.name = (char *) to_name;
-  request->peer.port = to_port;
-
-  request->duration = duration;
-  request->msg_size = msg_size;
-
-  gras_msg_rpccall(sock, 60, "amok_bw_sat start", &request, NULL);
-
-  free(request);
-  gras_socket_close(sock);
-}
-
-/* Asked to begin a saturation */
-static int amok_bw_cb_sat_start(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  sat_request_t request = *(sat_request_t *) payload;
-  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-
-  XBT_VERB("Asked by %s:%d to start a saturation to %s:%d",
-        xbt_socket_peer_name(expeditor), xbt_socket_peer_port(expeditor),
-        request->peer.name, request->peer.port);
-
-  gras_msg_rpcreturn(60, ctx, NULL);
-
-  amok_bw_saturate_begin(request->peer.name, request->peer.port,
-                         request->msg_size, request->duration, NULL, NULL);
-
-  free(request->peer.name);
-
-  free(request);
-  return 0;
-}
-
-/**
- * @brief Start saturating between the current process and the designated peer
- *
- * Note that the only way to break this function before the end of the timeout
- * is to have a remote peer calling amok_bw_saturate_stop to this process.
- *
- * If duration=0, the experiment will never timeout (you then have to manually
- * stop it).
- * 
- * If msg_size=0, the size will be automatically computed to make sure that
- * each of the messages occupy the connexion one second
- */
-void amok_bw_saturate_begin(const char *to_name, unsigned int to_port,
-                            volatile unsigned int msg_size, double duration,
-                            /*out */ double *elapsed_res, double *bw_res)
-{
-
-  xbt_ex_t e;
-
-  xbt_socket_t peer_cmd = gras_socket_client(to_name, to_port);
-  gras_msg_cb_ctx_t ctx;
-
-  xbt_socket_t meas;
-
-  s_gras_msg_t msg_got;
-
-  volatile unsigned int packet_sent = 0;
-  double start, elapsed = -1;   /* timer */
-  double bw;
-
-  volatile int saturate_further;        /* boolean in the main loop */
-
-  /* Negociate the saturation with the peer */
-  sat_request_t request = xbt_new(s_sat_request_t, 1);
-
-  XBT_DEBUG("Begin to saturate to %s:%u", to_name, to_port);
-  memset(&msg_got, 0, sizeof(msg_got));
-
-  request->msg_size = msg_size;
-  request->duration = duration;
-  request->peer.name = NULL;
-  request->peer.port = 0;
-
-
-  /* Size autodetection on need */
-  if (!msg_size) {
-    double bw;
-    double sec;
-    amok_bw_test(peer_cmd, 0,   /* check buffsize yourself */
-                 512 * 1024,    /* 512k as first guess */
-                 1,             /* One packet only */
-                 1,             /* at least one sec */
-                 &sec, &bw);
-    msg_size = request->msg_size = (int) bw;
-    XBT_DEBUG("Saturate with packets of %u bytes", request->msg_size);
-  }
-
-  /* Launch the saturation */
-
-  ctx =
-      gras_msg_rpc_async_call(peer_cmd, 60, "amok_bw_sat begin", &request);
-  free(request);
-  gras_msg_rpc_async_wait(ctx, &request);
-  meas = gras_socket_client_ext(to_name, request->peer.port,
-                                0 /*bufsize: auto */ ,
-                                1 /*meas: true */ );
-
-  free(request);
-
-  gras_socket_close(peer_cmd);
-  XBT_INFO("Saturation(%s:%d->%s:%u) started", gras_os_myname(),
-        gras_os_myport(), to_name, to_port);
-
-  /* Start experiment */
-  start = gras_os_time();
-
-  do {
-    /* do send it */
-    xbt_socket_meas_send(meas, 120, msg_size, 1);
-    packet_sent++;
-
-    /* Check whether someone asked us to stop saturation */
-    saturate_further = 0;
-    TRY {
-      gras_msg_wait_ext(0 /*no wait */ , "amok_bw_sat stop",
-                        NULL /* accept any sender */ ,
-                        NULL, NULL,     /* No specific filter */
-                        &msg_got);
-    }
-    CATCH(e) {
-      if (e.category == timeout_error) {
-        saturate_further = 1;
-        memset(&msg_got, 0, sizeof(msg_got));   /* may be overprotectiv here */
-      }
-      xbt_ex_free(e);
-    }
-
-    /* Check whether the experiment has to be terminated by now */
-    elapsed = gras_os_time() - start;
-    XBT_DEBUG("elapsed %f duration %f (msg_size=%u)", elapsed, duration,
-           msg_size);
-
-  } while (saturate_further && (duration == 0 || elapsed < duration));
-
-  bw = ((double) (packet_sent * msg_size)) / elapsed;
-
-  if (elapsed_res)
-    *elapsed_res = elapsed;
-  if (bw_res)
-    *bw_res = bw;
-
-  /* If someone stopped us, inform him about the achieved bandwidth */
-  if (msg_got.expe) {
-    bw_res_t answer = xbt_new(s_bw_res_t, 1);
-    s_gras_msg_cb_ctx_t ctx;
-
-    XBT_INFO("Saturation from %s:%d to %s:%u stopped by %s:%d",
-          gras_os_myname(), gras_os_myport(), to_name, to_port,
-          xbt_socket_peer_name(msg_got.expe),
-          xbt_socket_peer_port(msg_got.expe));
-    answer->timestamp = gras_os_time();
-    answer->sec = elapsed;
-    answer->bw = bw;
-
-    ctx.expeditor = msg_got.expe;
-    ctx.ID = msg_got.ID;
-    ctx.msgtype = msg_got.type;
-
-    gras_msg_rpcreturn(60, &ctx, &answer);
-    free(answer);
-  } else {
-    XBT_INFO
-        ("Saturation from %s:%d to %s:%u elapsed after %f sec (achieving %f kb/s)",
-         gras_os_myname(), gras_os_myport(), to_name, to_port, elapsed,
-         bw / 1024.0);
-  }
-
-  gras_socket_close(meas);
-}
-
-/* Sender will saturate link to us */
-static int amok_bw_cb_sat_begin(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  sat_request_t request = *(sat_request_t *) payload;
-  sat_request_t answer = xbt_new0(s_sat_request_t, 1);
-  volatile int saturate_further = 1;
-  xbt_ex_t e;
-  volatile xbt_socket_t measMaster = NULL, meas = NULL;
-  volatile xbt_socket_t from = gras_msg_cb_ctx_from(ctx);
-
-  volatile int port = 6000;
-  while (port <= 10000 && measMaster == NULL) {
-    TRY {
-      measMaster = gras_socket_server_ext(port, 0 /*bufsize: auto */ ,
-                                          1 /*meas: true */ );
-    }
-    CATCH(e) {
-      measMaster = NULL;
-      if (port < 10000)
-        xbt_ex_free(e);
-      else
-        RETHROWF
-            ("Error encountered while opening a measurement server socket: %s");
-    }
-    if (measMaster == NULL)
-      port++;                   /* prepare for a new loop */
-  }
-  answer->peer.port = port;
-
-  gras_msg_rpcreturn(60, ctx, &answer);
-  free(answer);
-
-  gras_os_sleep(5);             /* Wait for the accept */
-
-  TRY {
-    meas = xbt_socket_meas_accept(measMaster);
-    XBT_DEBUG("saturation handshake answered");
-  }
-  CATCH_ANONYMOUS {
-    gras_socket_close(measMaster);
-    RETHROWF("Error during saturation handshake: %s");
-  }
-
-  while (saturate_further) {
-    TRY {
-      xbt_socket_meas_recv(meas, 5, request->msg_size, 1);
-    }
-    CATCH(e) {
-      saturate_further = 0;
-      xbt_ex_free(e);
-    }
-  }
-  XBT_INFO("Saturation comming from %s:%d stopped on %s:%d",
-        xbt_socket_peer_name(from), xbt_socket_peer_port(from),
-        gras_os_myname(), gras_os_myport());
-
-  gras_socket_close(meas);
-  if (gras_if_RL())             /* On SG, accepted=master */
-    gras_socket_close(measMaster);
-  free(request);
-  return 0;
-}
-
-/**
- * @brief Ask 'from_name:from_port' to stop any saturation experiments
- * @param from_name: Name of the peer we are asking to do a experiment with (to_name:to_port)
- * @param from_port: port on which the process we are asking for an experiment is listening
- * @param time: the duration of the experiment
- * @param bw: the achieved bandwidth
- *
- */
-void amok_bw_saturate_stop(const char *from_name, unsigned int from_port,
-                           /*out */ double *time, double *bw)
-{
-  xbt_socket_t sock = gras_socket_client(from_name, from_port);
-  bw_res_t answer;
-  XBT_VERB("Ask %s:%u to stop the saturation", from_name, from_port);
-  TRY {
-    gras_msg_rpccall(sock, 60, "amok_bw_sat stop", NULL, &answer);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Cannot ask %s:%u to stop saturation: %s", from_name, from_port);
-  }
-  gras_socket_close(sock);
-  if (time)
-    *time = answer->sec;
-  if (bw)
-    *bw = answer->bw;
-  free(answer);
-}
diff --git a/src/amok/PeerManagement/peermanagement.c b/src/amok/PeerManagement/peermanagement.c
deleted file mode 100644 (file)
index a04cfc9..0000000
+++ /dev/null
@@ -1,322 +0,0 @@
-/* amok peer management - servers main loop and remote peer stopping        */
-
-/* Copyright (c) 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/sysdep.h"
-#include "xbt/peer.h"
-#include "amok/peermanagement.h"
-
-#include "amok/amok_modinter.h" /* prototype of my module declaration */
-#include "gras/module.h"        /* module mecanism */
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(amok_pm, amok, "peer management");
-
-
-/* data management */
-int amok_pm_moddata_id = -1;
-typedef struct {
-  int done;
-  xbt_dict_t groups;
-} s_amok_pm_moddata_t, *amok_pm_moddata_t;
-
-/* Message callbacks */
-static int amok_pm_cb_kill(gras_msg_cb_ctx_t ctx, void *payload_data)
-{
-
-  amok_pm_moddata_t g = gras_moddata_by_id(amok_pm_moddata_id);
-  g->done = 1;
-  return 0;
-}
-
-static int amok_pm_cb_killrpc(gras_msg_cb_ctx_t ctx, void *payload_data)
-{
-
-  amok_pm_moddata_t g = gras_moddata_by_id(amok_pm_moddata_id);
-  g->done = 1;
-  gras_msg_rpcreturn(30, ctx, NULL);
-  return 0;
-}
-
-static int amok_pm_cb_get(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  amok_pm_moddata_t g = gras_moddata_by_id(amok_pm_moddata_id);
-  char *name = *(void **) payload;
-  xbt_dynar_t res = xbt_dict_get(g->groups, name);
-
-  gras_msg_rpcreturn(30, ctx, &res);
-  return 0;
-}
-
-static int amok_pm_cb_join(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  amok_pm_moddata_t g = gras_moddata_by_id(amok_pm_moddata_id);
-  char *group_name = *(char **) payload;
-  xbt_dynar_t group = xbt_dict_get(g->groups, group_name);
-  int rank;
-
-  xbt_socket_t exp = gras_msg_cb_ctx_from(ctx);
-  xbt_peer_t dude = xbt_peer_new(xbt_socket_peer_name(exp),
-                                 xbt_socket_peer_port(exp));
-
-  rank = xbt_dynar_length(group);
-  xbt_dynar_push(group, &dude);
-  XBT_VERB("Contacted by %s:%d. Give it rank #%d", dude->name, dude->port,
-        rank);
-
-  gras_msg_rpcreturn(10, ctx, &rank);
-  free(group_name);
-  return 0;
-}
-
-static int amok_pm_cb_leave(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  amok_pm_moddata_t g = gras_moddata_by_id(amok_pm_moddata_id);
-  char *name = *(void **) payload;
-  xbt_dynar_t group = xbt_dict_get(g->groups, name);
-
-  xbt_socket_t exp = gras_msg_cb_ctx_from(ctx);
-  xbt_peer_t dude = xbt_peer_new(xbt_socket_peer_name(exp),
-                                 xbt_socket_peer_port(exp));
-
-  unsigned int cpt;
-  xbt_peer_t peer_it;
-
-  xbt_dynar_foreach(group, cpt, peer_it) {
-    if (!strcmp(peer_it->name, dude->name) && peer_it->port == dude->port) {
-      xbt_dynar_cursor_rm(group, &cpt);
-      goto end;
-    }
-  }
-  XBT_WARN("Asked to remove %s:%d from group '%s', but not found. Ignoring",
-        dude->name, dude->port, name);
-
-end:
-  gras_msg_rpcreturn(30, ctx, NULL);
-  return 0;
-}
-
-static int amok_pm_cb_shutdown(gras_msg_cb_ctx_t ctx, void *payload)
-{
-  char *name = *(void **) payload;
-  amok_pm_group_shutdown(name);
-
-  gras_msg_rpcreturn(30, ctx, NULL);
-  return 0;
-}
-
-/** \brief Enter the main loop of the program. It won't return until we get a kill message. */
-void amok_pm_mainloop(double timeOut)
-{
-  amok_pm_moddata_t g = gras_moddata_by_id(amok_pm_moddata_id);
-
-  while (!g->done) {
-    gras_msg_handle(timeOut);
-  }
-}
-
-/** \brief kill a buddy identified by its peername and port. Note that it is not removed from any group it may belong to. */
-void amok_pm_kill_hp(char *name, int port)
-{
-  xbt_socket_t sock = gras_socket_client(name, port);
-  amok_pm_kill(sock);
-  gras_socket_close(sock);
-}
-
-/** \brief kill a buddy to which we have a socket already. Note that it is not removed from any group it may belong to. */
-void amok_pm_kill(xbt_socket_t buddy)
-{
-  gras_msg_send(buddy, "amok_pm_kill", NULL);
-}
-
-/** \brief kill syncronously a buddy (do not return before its death). Note that it is not removed from any group it may belong to. */
-void amok_pm_kill_sync(xbt_socket_t buddy)
-{
-  gras_msg_rpccall(buddy, 30, "amok_pm_killrpc", NULL, NULL);
-}
-
-
-/** \brief create a new peermanagement group located on local peer 
- *
- * The dynar elements are of type xbt_peer_t
- */
-xbt_dynar_t amok_pm_group_new(const char *group_name)
-{
-  amok_pm_moddata_t g;
-  xbt_dynar_t res = xbt_dynar_new(sizeof(xbt_peer_t),
-                                  xbt_peer_free_voidp);
-
-  xbt_assert(amok_pm_moddata_id != -1, "Run amok_pm_init first!");
-  g = gras_moddata_by_id(amok_pm_moddata_id);
-
-  XBT_DEBUG("retrieved groups=%p", g->groups);
-
-  xbt_dict_set(g->groups, group_name, res, NULL);       /*FIXME: leaking xbt_dynar_free_voidp); */
-  XBT_VERB("Group %s created", group_name);
-
-  return res;
-}
-
-/** \brief retrieve all members of the given remote group */
-xbt_dynar_t amok_pm_group_get(xbt_socket_t master, const char *group_name)
-{
-  xbt_dynar_t res;
-
-  gras_msg_rpccall(master, 30, "amok_pm_get", &group_name, &res);
-  return res;
-}
-
-/** \brief add current peer to the given remote group 
- *
- * Returns the rank of the process in the group.
- */
-int amok_pm_group_join(xbt_socket_t master, const char *group_name)
-{
-  int rank;
-  XBT_VERB("Join group '%s' on %s:%d",
-        group_name, xbt_socket_peer_name(master),
-        xbt_socket_peer_port(master));
-  gras_msg_rpccall(master, 30, "amok_pm_join", &group_name, &rank);
-  XBT_VERB("Joined group '%s' on %s:%d. Got rank %d",
-        group_name, xbt_socket_peer_name(master),
-        xbt_socket_peer_port(master), rank);
-  return rank;
-}
-
-/** \brief remove current peer from the given remote group if found
- *
- * If not found, call is ignored 
- */
-void amok_pm_group_leave(xbt_socket_t master, const char *group_name)
-{
-  gras_msg_rpccall(master, 30, "amok_pm_leave", &group_name, NULL);
-  XBT_VERB("Leaved group '%s' on %s:%d",
-        group_name, xbt_socket_peer_name(master),
-        xbt_socket_peer_port(master));
-}
-
-/** \brief stops all members of the given local group */
-void amok_pm_group_shutdown(const char *group_name)
-{
-  amok_pm_moddata_t g = gras_moddata_by_id(amok_pm_moddata_id);
-  xbt_dynar_t group = xbt_dict_get(g->groups, group_name);
-
-  unsigned int cpt;
-  xbt_peer_t peer_it;
-
-  xbt_dynar_foreach(group, cpt, peer_it) {
-    amok_pm_kill_hp(peer_it->name, peer_it->port);
-  }
-
-  xbt_dynar_free(&group);
-  xbt_dict_remove(g->groups, group_name);
-}
-
-/** \brief stops all members of the given remote group */
-void amok_pm_group_shutdown_remote(xbt_socket_t master,
-                                   const char *group_name)
-{
-  gras_msg_rpccall(master, 30, "amok_pm_shutdown", &group_name, NULL);
-}
-
-
-/* *
- * *
- * * Module management functions
- * *
- * */
-
-
-
-static void _amok_pm_init(void)
-{
-  /* no world-wide globals */
-  /* Datatype and message declarations */
-  xbt_datadesc_type_t pm_group_type =
-      xbt_datadesc_dynar(xbt_datadesc_by_name("xbt_peer_t"),
-                          xbt_peer_free_voidp);
-
-  gras_msgtype_declare("amok_pm_kill", NULL);
-  gras_msgtype_declare_rpc("amok_pm_killrpc", NULL, NULL);
-
-  gras_msgtype_declare_rpc("amok_pm_get",
-                           xbt_datadesc_by_name("string"), pm_group_type);
-  gras_msgtype_declare_rpc("amok_pm_join", xbt_datadesc_by_name("string"),
-                           xbt_datadesc_by_name("int"));
-  gras_msgtype_declare_rpc("amok_pm_leave",
-                           xbt_datadesc_by_name("string"), NULL);
-
-  gras_msgtype_declare_rpc("amok_pm_shutdown",
-                           xbt_datadesc_by_name("string"), NULL);
-}
-
-static void _amok_pm_join(void *p)
-{
-  /* moddata management */
-  amok_pm_moddata_t mod = (amok_pm_moddata_t) p;
-
-  mod->groups = NULL;
-
-  mod->done = 0;
-  mod->groups = xbt_dict_new_homogeneous(NULL);
-
-  /* callbacks */
-  gras_cb_register("amok_pm_kill", &amok_pm_cb_kill);
-  gras_cb_register("amok_pm_killrpc", &amok_pm_cb_killrpc);
-
-  gras_cb_register("amok_pm_get", &amok_pm_cb_get);
-  gras_cb_register("amok_pm_join", &amok_pm_cb_join);
-  gras_cb_register("amok_pm_leave", &amok_pm_cb_leave);
-  gras_cb_register("amok_pm_shutdown", &amok_pm_cb_shutdown);
-}
-
-static void _amok_pm_exit(void)
-{
-  /* no world-wide globals */
-}
-
-static void _amok_pm_leave(void *p)
-{
-  /* moddata */
-  amok_pm_moddata_t mod = (amok_pm_moddata_t) p;
-
-  xbt_dict_free(&mod->groups);
-
-  /* callbacks */
-  gras_cb_unregister("amok_pm_kill", &amok_pm_cb_kill);
-  gras_cb_unregister("amok_pm_killrpc", &amok_pm_cb_killrpc);
-
-  gras_cb_unregister("amok_pm_get", &amok_pm_cb_get);
-  gras_cb_unregister("amok_pm_join", &amok_pm_cb_join);
-  gras_cb_unregister("amok_pm_leave", &amok_pm_cb_leave);
-  gras_cb_unregister("amok_pm_shutdown", &amok_pm_cb_shutdown);
-}
-
-void amok_pm_modulecreate()
-{
-  gras_module_add("amok_pm", sizeof(s_amok_pm_moddata_t),
-                  &amok_pm_moddata_id, _amok_pm_init, _amok_pm_exit,
-                  _amok_pm_join, _amok_pm_leave);
-}
-
-
-
-/* *
- * *
- * * Old module functions (kept for compatibility)
- * *
- * */
-/** \brief Initialize the peer management module. Every process must run it before use */
-void amok_pm_init()
-{
-  gras_module_join("amok_pm");
-}
-
-/** \brief Finalize the peer management module. Every process should run it after use */
-void amok_pm_exit()
-{
-  gras_module_leave("amok_pm");
-}
diff --git a/src/amok/amok_base.c b/src/amok/amok_base.c
deleted file mode 100644 (file)
index a1a8602..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/* base - several addons to do specific stuff not in GRAS itself            */
-
-/* Copyright (c) 2006, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
-#include "amok/amok_modinter.h"
-
-XBT_LOG_NEW_SUBCATEGORY(amok, XBT_LOG_ROOT_CAT, "All AMOK categories");
-
-void amok_init(void)
-{
-
-  /* Create all the modules */
-  amok_pm_modulecreate();
-}
-
-void amok_exit(void)
-{
-  /* FIXME: No real module mechanism in GRAS so far, nothing to do. */
-}
diff --git a/src/amok/amok_modinter.h b/src/amok/amok_modinter.h
deleted file mode 100644 (file)
index 96c8374..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* amok modinter - interface to AMOK modules initialization and such        */
-
-/* Copyright (c) 2006, 2007, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef AMOK_BASE_H
-#define AMOK_BASE_H
-
-void amok_init(void);
-void amok_exit(void);
-
-/* module creation functions */
-void amok_pm_modulecreate(void);
-
-#endif                          /* AMOK_BASE_H */
diff --git a/src/bindings/lua/lua_stub_generator.c b/src/bindings/lua/lua_stub_generator.c
deleted file mode 100644 (file)
index 0b13f26..0000000
+++ /dev/null
@@ -1,356 +0,0 @@
-/* lua_stub_generator - creates the main() to use a GRAS program           */
-
-/* Copyright (c) 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "simgrid_lua.h"
-#include "xbt.h"
-#include <stdio.h>
-#include <string.h>
-
-#define WARN "/***********\n * DO NOT EDIT! THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM %s BY gras_stub_generator\n ***********/\n"
-#define SIM_SOURCENAME  "_%s_simulator.c"
-#define SIM_OBJNAME  "_%s_simulator.o"
-#define SIM_BINARYNAME  "%s_simulator"
-#define SIM_SOURCENAME_LDADD  "%s_simulator_LDADD"
-#define SIM_SOURCENAME_SOURCES  "%s_simulator_SOURCES"
-#define RL_SOURCENAME  "_%s_%s.c"
-#define RL_OBJNAME  "_%s_%s.o"
-#define RL_BINARYNAME  "%s_%s"
-#define RL_SOURCENAME_LDADD  "%s_%s_LDADD"
-#define RL_SOURCENAME_SOURCES  "%s_%s_SOURCES"
-#define MAKEFILE_FILENAME_AM  "%s.Makefile.am"
-#define MAKEFILE_FILENAME_LOCAL  "%s.mk"
-#define MAKEFILE_FILENAME_REMOTE  "%s.Makefile.remote"
-#define DEPLOYMENT  "%s.deploy.sh"
-
-/**********************************************/
-/**** Generate the file for the simulator *****/
-/**********************************************/
-
-const char *SIM_PREEMBULE =
-    "/* specific to Borland Compiler */\n"
-    "#ifdef __BORLANDC__\n"
-    "#pragma hdrstop\n"
-    "#endif\n\n"
-    "#include <stdlib.h>\n"
-    "#include <stdio.h>\n"
-    "#include \"msg/msg.h\"\n"
-    "#include <gras.h>\n" "\n" "char *gras_log=NULL;\n";
-
-
-#define SIM_LAUNCH_FUNC  \
-"int launch_%s(int argc, char **argv) {\n" \
-"  char **myargv=argv;\n" \
-"  int myargc=argc;\n" \
-"  int i;\n" \
-"  int retcode;\n"\
-"    \n"\
-"  if (gras_log) {\n"\
-"    myargv=malloc((argc+1) * sizeof(char**));\n" \
-"    for (i=0; i<argc; i++)\n" \
-"      myargv[i] = argv[i];\n" \
-"    myargv[myargc++] = gras_log;\n" \
-"  }\n" \
-"  retcode = %s(myargc,myargv);\n" \
-"  if (myargv != argv)\n" \
-"    free(myargv);\n" \
-"  return retcode;\n" \
-"}\n"
-
-const char *SIM_MAIN_POSTEMBULE = "\n"
-    "\n"
-    "  gras_load_environment_script(argv[1]);\n"
-    "\n"
-    "  /*  Run the simulation */\n"
-    "  gras_main();\n"
-    "\n"
-    "  /* cleanup the place */\n"
-    "  gras_clean();\n"
-    "  free(gras_log);\n"
-    "  return 0;\n"
-    "}\n";
-
-
-/***************************************
- * generator functions
- ***************************************/
-
-void generate_sim(const char *project)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *key = NULL;
-  void *data = NULL;
-  char *filename = NULL;
-  FILE *OUT = NULL;
-
-  /* Output file: <projet>_simulator.c */
-  filename = xbt_new(char, strlen(project) + strlen(SIM_SOURCENAME));
-  sprintf(filename, SIM_SOURCENAME, project);
-
-  OUT = fopen(filename, "w");
-
-  xbt_assert(OUT, "Unable to open %s for writing", filename);
-
-  fprintf(OUT, "%s", SIM_PREEMBULE);
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(OUT, "int %s(int argc,char *argv[]);\n", key);
-  }
-
-  fprintf(OUT, "\n");
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(OUT, "int launch_%s(int argc,char *argv[]);\n", key);
-  }
-
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(OUT, SIM_LAUNCH_FUNC, key, key);
-  }
-
-  fprintf(OUT, "%s", "/* specific to Borland Compiler */\n"
-          "#ifdef __BORLANDDC__\n" "#pragma argsused\n" "#endif\n\n");
-
-  fprintf(OUT, "%s", "int main (int argc,char *argv[]) {\n"
-          "\n"
-          "  /*  Simulation setup */\n"
-          "  gras_global_init(&argc,argv);\n"
-          "  if (argc != 2) {\n"
-          "    fprintf(stderr, \"Usage: lua platform_script.lua [--log=...]\\n\");\n"
-          "    exit(1);\n" "  }\n" "\n");
-  fprintf(OUT, "\n" "  /*  Application deployment */\n");
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(OUT, "  gras_function_register(\"%s\", launch_%s);\n", key,
-            key);
-  }
-  fprintf(OUT, "%s", SIM_MAIN_POSTEMBULE);
-  fclose(OUT);
-  free(filename);
-}
-
-/**********************************************/
-/**** Generate the file for the real life *****/
-/**********************************************/
-
-void generate_rl(const char *project)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *key = NULL;
-  void *data = NULL;
-  char *filename = NULL;
-  FILE *OUT = NULL;
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    filename =
-        xbt_new(char,
-                strlen(project) + strlen(RL_SOURCENAME) + strlen(key));
-
-    sprintf(filename, RL_SOURCENAME, project, key);
-
-    OUT = fopen(filename, "w");
-    xbt_assert(OUT, "Unable to open %s for writing", filename);
-
-    fprintf(OUT, "/* specific to Borland Compiler */\n"
-            "#ifdef __BORLANDC__\n"
-            "#pragma hdrstop\n"
-            "#endif\n\n"
-            "#include <stdio.h>\n"
-            "#include <signal.h>\n"
-            "#include <gras.h>\n"
-            "\n"
-            "XBT_PUBLIC_DATA(const char *) _gras_procname;\n"
-            "/* user code */\n"
-            "int %s(int argc, char *argv[]);\n"
-            "\n"
-            "/* specific to Borland Compiler */\n"
-            "#ifdef __BORLANDC__\n"
-            "#pragma argsused\n"
-            "#endif\n\n"
-            "int main(int argc, char *argv[]){\n"
-            "  int errcode;\n"
-            "\n"
-            "  _gras_procname = \"%s\";\n"
-            "  errcode=%s(argc,argv);\n"
-            " \n" "  return errcode;\n" "}\n", key, key, key);
-    fclose(OUT);
-    free(filename);
-  }
-}
-
-void generate_makefile_am(const char *project)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *key = NULL;
-  void *data = NULL;
-  char *filename = NULL;
-  FILE *OUT = NULL;
-
-  filename = xbt_new(char, strlen(project) + strlen(MAKEFILE_FILENAME_AM));
-  sprintf(filename, MAKEFILE_FILENAME_AM, project);
-
-  OUT = fopen(filename, "w");
-  xbt_assert(OUT, "Unable to open %s for writing", filename);
-
-  fprintf(OUT, "# AUTOMAKE variable definition\n");
-  fprintf(OUT, "INCLUDES= @CFLAGS_SimGrid@\n\n");
-  fprintf(OUT, "PROGRAMS=");
-  fprintf(OUT, SIM_BINARYNAME, project);
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(OUT, " ");
-    fprintf(OUT, RL_BINARYNAME, project, key);
-  }
-
-  fprintf(OUT, "\n\n");
-  fprintf(OUT, SIM_SOURCENAME_SOURCES, project);
-  fprintf(OUT, "=\t");
-  fprintf(OUT, SIM_SOURCENAME, project);
-  fprintf(OUT, " %s.c\n", project);
-  fprintf(OUT, SIM_SOURCENAME_LDADD, project);
-  fprintf(OUT, "=\tpath/to/libsimgrid.a\n\n");
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(OUT, RL_SOURCENAME_SOURCES, project, key);
-    fprintf(OUT, "=\t");
-    fprintf(OUT, RL_SOURCENAME, project, key);
-    fprintf(OUT, " %s.c\n", project);
-    fprintf(OUT, RL_SOURCENAME_LDADD, project, key);
-    fprintf(OUT, "=\tpath/to/libgras.a\n\n");
-  }
-
-  fprintf(OUT,
-          "\n# cleanup temps (allowing the user to add extra clean files)\n");
-  fprintf(OUT, "CLEANFILES?= \n");
-  fprintf(OUT, "CLEANFILES+= ");
-  fprintf(OUT, SIM_SOURCENAME, project);
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(OUT, " ");
-    fprintf(OUT, RL_SOURCENAME, project, key);
-  }
-  fprintf(OUT, "\n");
-
-  fprintf(OUT, "\n# generate temps\n");
-  fprintf(OUT,
-          "\n# A rule to generate the source file each time the deployment file changes\n");
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(OUT, RL_SOURCENAME, project, key);
-    fprintf(OUT, " ");
-  }
-  fprintf(OUT, SIM_SOURCENAME, project);
-  fclose(OUT);
-}
-
-void generate_makefile_local(const char *project)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *key = NULL;
-  void *data = NULL;
-  char *filename = NULL;
-  FILE *OUT = NULL;
-
-  filename =
-      xbt_new(char, strlen(project) + strlen(MAKEFILE_FILENAME_LOCAL));
-  sprintf(filename, MAKEFILE_FILENAME_LOCAL, project);
-
-  OUT = fopen(filename, "w");
-  xbt_assert(OUT, "Unable to open %s for writing", filename);
-  free(filename);
-
-  fprintf(OUT,
-          "\n"
-          "####\n"
-          "#### THIS FILE WAS GENERATED, DO NOT EDIT BEFORE RENAMING IT\n"
-          "####\n\n\n");
-
-  fprintf(OUT, "## Variable declarations\n"
-          "PROJECT_NAME=%s\n" "DISTDIR=gras-$(PROJECT_NAME)\n\n", project);
-
-  fprintf(OUT,
-          "# Set the GRAS_ROOT environment variable to the path under which you installed SimGrid\n"
-          "# Compilation will fail if you don't do so\n"
-          "GRAS_ROOT?= $(shell if [ -e /usr/local/lib/libgras.so ] ; then echo /usr/local ; else echo \"\\\"<<<< GRAS_ROOT undefined !!! >>>>\\\"\"; fi)\n\n"
-          "# You can fiddle the following to make it fit your taste\n"
-          "INCLUDES = -I$(GRAS_ROOT)/include\n"
-          "CFLAGS ?= -O3 -w -g -Wall\n"
-          "LIBS_SIM = -lm  -L$(GRAS_ROOT)/lib/ -lsimgrid\n"
-          "LIBS_RL = -lm  -L$(GRAS_ROOT)/lib/ -lgras\n" "LIBS = \n" "\n");
-
-  fprintf(OUT, "PRECIOUS_C_FILES ?= %s.c\n", project);
-
-  fprintf(OUT, "GENERATED_C_FILES = ");
-  fprintf(OUT, SIM_SOURCENAME " ", project);
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(OUT, RL_SOURCENAME " ", project, key);
-  }
-  fprintf(OUT, "\n");
-
-  fprintf(OUT, "OBJ_FILES = $(patsubst %%.c,%%.o,$(PRECIOUS_C_FILES))\n");
-
-  fprintf(OUT, "BIN_FILES = ");
-
-  fprintf(OUT, SIM_BINARYNAME " ", project);
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(OUT, RL_BINARYNAME " ", project, key);
-  }
-  fprintf(OUT, "\n");
-
-  fprintf(OUT,
-          "\n"
-          "## By default, build all the binaries\n"
-          "all: $(BIN_FILES)\n" "\n");
-
-  //No Need to generate source files, already done.
-
-  fprintf(OUT, "\n## Generate the binaries\n");
-  fprintf(OUT, SIM_BINARYNAME ": " SIM_OBJNAME " $(OBJ_FILES)\n", project,
-          project);
-  fprintf(OUT,
-          "\t$(CC) $(INCLUDES) $(DEFS) $(CFLAGS) $^ $(LIBS_SIM) $(LIBS) $(LDADD) -o $@ \n");
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(OUT, RL_BINARYNAME " : " RL_OBJNAME " $(OBJ_FILES)\n", project,
-            key, project, key);
-    fprintf(OUT,
-            "\t$(CC) $(INCLUDES) $(DEFS) $(CFLAGS) $^ $(LIBS_RL) $(LIBS) $(LDADD) -o $@ \n");
-  }
-  fprintf(OUT,
-          "\n"
-          "%%: %%.o\n"
-          "\t$(CC) $(INCLUDES) $(DEFS) $(CFLAGS) $^ $(LIBS) $(LDADD) -o $@ \n"
-          "\n"
-          "%%.o: %%.c\n"
-          "\t$(CC) $(INCLUDES) $(DEFS) $(CFLAGS) -c -o $@ $<\n" "\n");
-
-  fprintf(OUT,
-          "## Rules for tarballs and cleaning\n"
-          "DIST_FILES= $(EXTRA_DIST) $(GENERATED_C_FILES) $(PRECIOUS_C_FILES) "
-          MAKEFILE_FILENAME_LOCAL " " /*MAKEFILE_FILENAME_REMOTE */ "\n"
-          "distdir: $(DIST_FILES)\n" "\trm -rf $(DISTDIR)\n"
-          "\tmkdir -p $(DISTDIR)\n" "\tcp $^ $(DISTDIR)\n" "\n"
-          "dist: clean distdir\n"
-          "\ttar c $(DISTDIR) | gzip -c9 > $(DISTDIR).tar.gz\n" "\n",
-          project /*, project */ );
-
-  fprintf(OUT,
-          "clean:\n"
-          "\trm -f $(CLEANFILES) $(BIN_FILES) $(OBJ_FILES) *~ %s.o "
-          SIM_OBJNAME, project, project);
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(OUT, " " RL_OBJNAME, project, key);
-  }
-  fprintf(OUT,
-          "\n"
-          "\trm -rf $(DISTDIR)\n"
-          "\n" ".SUFFIXES:\n" ".PHONY : clean\n" "\n");
-  fclose(OUT);
-}
-
-static void print(void *p)
-{
-  printf("%p", p);
-}
index 6eb8d7e..05e9584 100644 (file)
@@ -13,7 +13,6 @@
 #include "msg/msg.h"
 #include "simdag/simdag.h"
 #include "surf/surfxml_parse.h"
-#include "gras.h"
 #include <lauxlib.h>
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lua, bindings, "Lua Bindings");
@@ -24,74 +23,6 @@ int luaopen_simgrid(lua_State *L);
 static void sglua_register_c_functions(lua_State *L);
 static int run_lua_code(int argc, char **argv);
 
-/* ********************************************************************************* */
-/*                           lua_stub_generator functions                            */
-/* ********************************************************************************* */
-
-xbt_dict_t process_function_set;
-xbt_dynar_t process_list;
-xbt_dict_t machine_set;
-static s_process_t process;
-
-void s_process_free(void *process)
-{
-  s_process_t *p = (s_process_t *) process;
-  int i;
-  for (i = 0; i < p->argc; i++)
-    free(p->argv[i]);
-  free(p->argv);
-  free(p->host);
-}
-
-static int gras_add_process_function(lua_State * L)
-{
-  const char *arg;
-  const char *process_host = luaL_checkstring(L, 1);
-  const char *process_function = luaL_checkstring(L, 2);
-
-  if (xbt_dict_is_empty(machine_set)
-      || xbt_dict_is_empty(process_function_set)
-      || xbt_dynar_is_empty(process_list)) {
-    process_function_set = xbt_dict_new_homogeneous(NULL);
-    process_list = xbt_dynar_new(sizeof(s_process_t), s_process_free);
-    machine_set = xbt_dict_new_homogeneous(NULL);
-  }
-
-  xbt_dict_set(machine_set, process_host, NULL, NULL);
-  xbt_dict_set(process_function_set, process_function, NULL, NULL);
-
-  process.argc = 1;
-  process.argv = xbt_new(char *, 1);
-  process.argv[0] = xbt_strdup(process_function);
-  process.host = strdup(process_host);
-
-  lua_pushnil(L);
-  while (lua_next(L, 3) != 0) {
-    arg = lua_tostring(L, -1);
-    process.argc++;
-    process.argv =
-        xbt_realloc(process.argv, (process.argc) * sizeof(char *));
-    process.argv[(process.argc) - 1] = xbt_strdup(arg);
-
-    XBT_DEBUG("index = %f , arg = %s \n", lua_tonumber(L, -2),
-           lua_tostring(L, -1));
-    lua_pop(L, 1);
-  }
-  lua_pop(L, 1);
-  //add to the process list
-  xbt_dynar_push(process_list, &process);
-  return 0;
-}
-
-static int gras_generate(lua_State * L)
-{
-  const char *project_name = luaL_checkstring(L, 1);
-  generate_sim(project_name);
-  generate_rl(project_name);
-  generate_makefile_local(project_name);
-  return 0;
-}
-
 /* ********************************************************************************* */
 /*                                  simgrid API                                      */
 /* ********************************************************************************* */
@@ -216,17 +147,6 @@ static int sd_register_platform(lua_State * L)
   return 0;
 }
 
-/*
- * Register platform for gras
- */
-static int gras_register_platform(lua_State * L)
-{
-  //surf_parse = console_parse_platform;
-  surf_parse_reset_callbacks();
-  gras_create_environment(NULL);
-  return 0;
-}
-
 /**
  * Register applicaiton for MSG
  */
@@ -238,17 +158,6 @@ static int msg_register_application(lua_State * L)
   return 0;
 }
 
-/*
- * Register application for gras
- */
-static int gras_register_application(lua_State * L)
-{
-  gras_function_register_default(run_lua_code);
-  //surf_parse = console_parse_application;
-  gras_launch_application(NULL);
-  return 0;
-}
-
 static const luaL_Reg simgrid_functions[] = {
   {"create_environment", create_environment},
   {"launch_application", launch_application},
@@ -263,11 +172,6 @@ static const luaL_Reg simgrid_functions[] = {
   {"msg_register_platform", msg_register_platform},
   {"sd_register_platform", sd_register_platform},
   {"msg_register_application", msg_register_application},
-  {"gras_register_platform", gras_register_platform},
-  {"gras_register_application", gras_register_application},
-  /* gras sub generator method */
-  {"gras_set_process_function", gras_add_process_function},
-  {"gras_generate", gras_generate},
   {NULL, NULL}
 };
 
index 5a426dd..2400d7f 100644 (file)
@@ -8,7 +8,6 @@
 #include "xbt/dynar.h"
 #include <lua.h>
 
-extern xbt_dict_t process_function_set;
 extern xbt_dynar_t process_list;
 extern xbt_dict_t machine_set;
 
diff --git a/src/gras/Msg/gras_msg_exchange.c b/src/gras/Msg/gras_msg_exchange.c
deleted file mode 100644 (file)
index 3491586..0000000
+++ /dev/null
@@ -1,487 +0,0 @@
-/* gras message exchanges                                                   */
-
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "xbt/ex_interface.h"
-#include "xbt/socket.h"
-#include "gras/Msg/msg_private.h"
-#include "gras/Virtu/virtu_interface.h"
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(gras_msg);
-
-
-char _GRAS_header[6];
-const char *e_gras_msg_kind_names[e_gras_msg_kind_count] =
-    { "UNKNOWN", "ONEWAY", "RPC call", "RPC answer", "RPC error" };
-
-
-/** \brief Waits for a message to come in over a given socket.
- *
- * @param timeout: How long should we wait for this message.
- * @param msgt_want: type of awaited msg (or NULL if I'm enclined to accept any message)
- * @param expe_want: awaited expeditot (match on hostname, not port; NULL if not relevant)
- * @param filter: function returning true or false when passed a payload. Messages for which it returns false are not selected. (NULL if not relevant)
- * @param filter_ctx: context passed as second argument of the filter (a pattern to match?)
- * @param[out] msg_got: where to write the message we got
- *
- * Every message of another type received before the one waited will be queued
- * and used by subsequent call to this function or gras_msg_handle().
- */
-
-void
-gras_msg_wait_ext_(double timeout,
-                   gras_msgtype_t msgt_want,
-                   xbt_socket_t expe_want,
-                   gras_msg_filter_t filter,
-                   void *filter_ctx, gras_msg_t msg_got)
-{
-
-  s_gras_msg_t msg;
-  double start, now;
-  gras_msg_procdata_t pd =
-      (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
-  unsigned int cpt;
-
-  xbt_assert(msg_got, "msg_got is an output parameter");
-
-  start = gras_os_time();
-  XBT_VERB("Waiting for message '%s' for %fs",
-        msgt_want ? msgt_want->name : "(any)", timeout);
-
-  xbt_dynar_foreach(pd->msg_waitqueue, cpt, msg) {
-    if ((!msgt_want || (msg.type->code == msgt_want->code))
-        && (!expe_want || (!strcmp(xbt_socket_peer_name(msg.expe),
-                                   xbt_socket_peer_name(expe_want))))
-        && (!filter || filter(&msg, filter_ctx))) {
-
-      memcpy(msg_got, &msg, sizeof(s_gras_msg_t));
-      xbt_dynar_cursor_rm(pd->msg_waitqueue, &cpt);
-      XBT_VERB("The waited message was queued");
-      return;
-    }
-  }
-
-  xbt_dynar_foreach(pd->msg_queue, cpt, msg) {
-    if ((!msgt_want || (msg.type->code == msgt_want->code))
-        && (!expe_want || (!strcmp(xbt_socket_peer_name(msg.expe),
-                                   xbt_socket_peer_name(expe_want))))
-        && (!filter || filter(&msg, filter_ctx))) {
-
-      memcpy(msg_got, &msg, sizeof(s_gras_msg_t));
-      xbt_dynar_cursor_rm(pd->msg_queue, &cpt);
-      XBT_VERB("The waited message was queued");
-      return;
-    }
-  }
-
-  while (1) {
-    int need_restart;
-    xbt_ex_t e;
-
-  restart_receive:             /* Goto here when the receive of a message failed */
-    need_restart = 0;
-    now = gras_os_time();
-    memset(&msg, 0, sizeof(msg));
-
-    TRY {
-      xbt_queue_shift_timed(pd->msg_received, &msg,
-                            timeout ? timeout - now + start : 0);
-    }
-    CATCH(e) {
-      if (e.category == system_error &&
-          !strncmp("Socket closed by remote side", e.msg,
-                   strlen("Socket closed by remote side"))) {
-        xbt_ex_free(e);
-        need_restart = 1;
-      } else {
-        RETHROW;
-      }
-    }
-    if (need_restart)
-      goto restart_receive;
-
-    XBT_DEBUG("Got a message from the socket");
-
-    if ((!msgt_want || (msg.type->code == msgt_want->code))
-        && (!expe_want || (!strcmp(xbt_socket_peer_name(msg.expe),
-                                   xbt_socket_peer_name(expe_want))))
-        && (!filter || filter(&msg, filter_ctx))) {
-
-      memcpy(msg_got, &msg, sizeof(s_gras_msg_t));
-      XBT_DEBUG("Message matches expectations. Use it.");
-      return;
-    }
-    XBT_DEBUG("Message does not match expectations. Queue it.");
-
-    /* not expected msg type. Queue it for later */
-    xbt_dynar_push(pd->msg_queue, &msg);
-
-    now = gras_os_time();
-    if (now - start + 0.001 > timeout) {
-      THROWF(timeout_error, now - start + 0.001 - timeout,
-             "Timeout while waiting for msg '%s'",
-             msgt_want ? msgt_want->name : "(any)");
-    }
-  }
-
-  THROW_IMPOSSIBLE;
-}
-
-/** \brief Waits for a message to come in over a given socket.
- *
- * @param timeout: How long should we wait for this message.
- * @param msgt_want: type of awaited msg
- * @param[out] expeditor: where to create a socket to answer the incoming message
- * @param[out] payload: where to write the payload of the incoming message
- * @return the error code (or no_error).
- *
- * Every message of another type received before the one waited will be queued
- * and used by subsequent call to this function or gras_msg_handle().
- */
-void
-gras_msg_wait_(double timeout,
-               gras_msgtype_t msgt_want,
-               xbt_socket_t * expeditor, void *payload)
-{
-  s_gras_msg_t msg;
-
-  gras_msg_wait_ext_(timeout, msgt_want, NULL, NULL, NULL, &msg);
-
-  if (msgt_want->ctn_type) {
-    xbt_assert(payload,
-                "Message type '%s' convey a payload that you must accept",
-                msgt_want->name);
-  } else {
-    xbt_assert(!payload,
-                "No payload was declared for message type '%s' (don't expect one)",
-                msgt_want->name);
-  }
-
-  if (payload) {
-    memcpy(payload, msg.payl, msg.payl_size);
-    free(msg.payl);
-  }
-
-  if (expeditor)
-    *expeditor = msg.expe;
-}
-
-static int gras_msg_wait_or_filter(gras_msg_t msg, void *ctx)
-{
-  xbt_dynar_t dyn = (xbt_dynar_t) ctx;
-  int res = xbt_dynar_member(dyn, msg->type);
-  if (res)
-    XBT_VERB("Got matching message (type=%s)", msg->type->name);
-  else
-    XBT_VERB("Got message not matching our expectations");
-  return res;
-}
-
-/** \brief Waits for a message to come in over a given socket.
- *
- * @param timeout: How long should we wait for this message.
- * @param msgt_want: a dynar containing all accepted message type
- * @param[out] ctx: the context of received message (in case it's a RPC call we want to answer to)
- * @param[out] msgt_got: indice in the dynar of the type of the received message
- * @param[out] payload: where to write the payload of the incoming message
- * @return the error code (or no_error).
- *
- * Every message of a type not in the accepted list received before the one
- * waited will be queued and used by subsequent call to this function or
- * gras_msg_handle().
- *
- * If you are interested in the context, pass the address of a s_gras_msg_cb_ctx_t variable.
- */
-void gras_msg_wait_or(double timeout,
-                      xbt_dynar_t msgt_want,
-                      gras_msg_cb_ctx_t * ctx, int *msgt_got,
-                      void *payload)
-{
-  s_gras_msg_t msg;
-
-  XBT_VERB("Wait %f seconds for several message types", timeout);
-  gras_msg_wait_ext_(timeout,
-                     NULL, NULL,
-                     &gras_msg_wait_or_filter, (void *) msgt_want, &msg);
-
-  if (msg.type->ctn_type) {
-    xbt_assert(payload,
-                "Message type '%s' convey a payload you must accept",
-                msg.type->name);
-  }
-  /* don't check the other side since some of the types may have a payload */
-  if (payload && msg.type->ctn_type) {
-    memcpy(payload, msg.payl, msg.payl_size);
-    free(msg.payl);
-  }
-
-  if (ctx)
-    *ctx = gras_msg_cb_ctx_new(msg.expe, msg.type, msg.ID,
-                               (msg.kind == e_gras_msg_kind_rpccall), 60);
-
-  if (msgt_got)
-    *msgt_got = xbt_dynar_search(msgt_want, msg.type);
-}
-
-
-/** \brief Send the data pointed by \a payload as a message of type
- * \a msgtype to the peer \a sock */
-void gras_msg_send_(xbt_socket_t sock, gras_msgtype_t msgtype,
-                    void *payload)
-{
-
-  if (msgtype->ctn_type) {
-    xbt_assert(payload,
-                "Message type '%s' convey a payload you must provide",
-                msgtype->name);
-  } else {
-    xbt_assert(!payload,
-                "No payload was declared for message type '%s'",
-                msgtype->name);
-  }
-
-  XBT_DEBUG("Send a oneway message of type '%s'. Payload=%p",
-         msgtype->name, payload);
-  gras_msg_send_ext(sock, e_gras_msg_kind_oneway, 0, msgtype, payload);
-  XBT_VERB("Sent a oneway message of type '%s'. Payload=%p",
-        msgtype->name, payload);
-}
-
-/** @brief Handle all messages arriving within the given period
- *
- * @param period: How long to wait for incoming messages (in seconds)
- *
- * Messages are dealed with just like gras_msg_handle() would do. The
- * difference is that gras_msg_handle() handles at most one message (or wait up
- * to timeout second when no message arrives) while this function handles any
- * amount of messages, and lasts the given period in any case.
- */
-void gras_msg_handleall(double period)
-{
-  xbt_ex_t e;
-  double begin = gras_os_time();
-  double now;
-
-  do {
-    now = gras_os_time();
-    TRY {
-      if (period - now + begin > 0)
-        gras_msg_handle(period - now + begin);
-    }
-    CATCH(e) {
-      if (e.category != timeout_error)
-        RETHROWF("Error while waiting for messages: %s");
-      xbt_ex_free(e);
-    }
-    /* Epsilon to avoid numerical stability issues were the waited interval is so small that the global clock cannot notice the increment */
-  } while (period - now + begin > 0);
-}
-
-/** @brief Handle an incoming message or timer (or wait up to \a timeOut seconds)
- *
- * @param timeOut: How long to wait for incoming messages (in seconds)
- * @return the error code (or no_error).
- *
- * Any message arriving in the given interval is passed to the callbacks.
- *
- * @sa gras_msg_handleall().
- */
-void gras_msg_handle(volatile double timeOut)
-{
-
-  double untiltimer;
-
-  unsigned int cpt;
-  volatile int ran_ok;
-
-  s_gras_msg_t msg;
-
-  gras_msg_procdata_t pd =
-      (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
-  gras_cblist_t *list = NULL;
-  gras_msg_cb_t cb;
-  s_gras_msg_cb_ctx_t ctx;
-
-  volatile int timerexpected, timeouted;
-  xbt_ex_t e;
-
-  XBT_VERB("Handling message within the next %.2fs", timeOut);
-
-  untiltimer = gras_msg_timer_handle();
-  XBT_DEBUG("Next timer in %f sec", untiltimer);
-  if (untiltimer == 0.0) {
-    /* A timer was already elapsed and handled */
-    return;
-  }
-  if (untiltimer != -1.0) {
-    timerexpected = 1;
-    timeOut = MIN(timeOut, untiltimer);
-  } else {
-    timerexpected = 0;
-  }
-
-  /* get a message (from the queue or from the net) */
-  timeouted = 0;
-  if (!xbt_dynar_is_empty(pd->msg_queue)) {
-    XBT_DEBUG("Get a message from the queue");
-    xbt_dynar_shift(pd->msg_queue, &msg);
-  } else {
-    TRY {
-      xbt_queue_shift_timed(pd->msg_received, &msg, timeOut);
-      //      msg.expe = gras_trp_select(timeOut);
-    }
-    CATCH(e) {
-      if (e.category != timeout_error)
-        RETHROW;
-      XBT_DEBUG("Damn. Timeout while getting a message from the queue");
-      xbt_ex_free(e);
-      timeouted = 1;
-    }
-  }
-
-  if (timeouted) {
-    if (timerexpected) {
-
-      /* A timer elapsed before the arrival of any message even if we select()ed a bit */
-      untiltimer = gras_msg_timer_handle();
-      if (untiltimer == 0.0) {
-        /* we served a timer, we're done */
-        return;
-      } else {
-        xbt_assert(untiltimer > 0, "Negative timer (%f). I'm 'puzzeled'",
-                    untiltimer);
-        XBT_WARN
-            ("No timer elapsed, in contrary to expectations (next in %f sec)",
-             untiltimer);
-        THROWF(timeout_error, 0,
-               "No timer elapsed, in contrary to expectations (next in %f sec)",
-               untiltimer);
-      }
-
-    } else {
-      /* select timeouted, and no timer elapsed. Nothing to do */
-      THROWF(timeout_error, 0, "No new message or timer (delay was %f)",
-             timeOut);
-    }
-
-  }
-
-  /* A message was already there or arrived in the meanwhile. handle it */
-  xbt_dynar_foreach(pd->cbl_list, cpt, list) {
-    if (list->id == msg.type->code) {
-      break;
-    } else {
-      list = NULL;
-    }
-  }
-  if (!list) {
-    XBT_INFO
-        ("No callback for message '%s' (type:%s) from %s:%d. Queue it for later gras_msg_wait() use.",
-         msg.type->name, e_gras_msg_kind_names[msg.kind],
-         xbt_socket_peer_name(msg.expe), xbt_socket_peer_port(msg.expe));
-    xbt_dynar_push(pd->msg_waitqueue, &msg);
-    return;                     /* FIXME: maybe we should call ourselves again until the end of the timer or a proper msg is got */
-  }
-
-  ctx.expeditor = msg.expe;
-  ctx.ID = msg.ID;
-  ctx.msgtype = msg.type;
-  ctx.answer_due = (msg.kind == e_gras_msg_kind_rpccall);
-
-  switch (msg.kind) {
-  case e_gras_msg_kind_oneway:
-  case e_gras_msg_kind_rpccall:
-    ran_ok = 0;
-    TRY {
-      xbt_dynar_foreach(list->cbs, cpt, cb) {
-        volatile unsigned int cpt2 = cpt;
-        if (!ran_ok) {
-          XBT_DEBUG
-              ("Use the callback #%u (@%p) for incoming msg '%s' (payload_size=%d)",
-               cpt + 1, cb, msg.type->name, msg.payl_size);
-          if (!cb(&ctx, msg.payl)) {
-            /* cb handled the message */
-            free(msg.payl);
-            ran_ok = 1;
-          }
-        }
-        cpt = cpt2;
-      }
-    }
-    CATCH(e) {
-      free(msg.payl);
-      if (msg.type->kind == e_gras_msg_kind_rpccall) {
-        char *old_file = e.file;
-        /* The callback raised an exception, propagate it on the network */
-        if (!e.remote) {
-          /* Make sure we reduce the file name to its basename to avoid issues in tests */
-          char *new_file = strrchr(e.file, '/');
-          if (new_file)
-            e.file = new_file;
-          /* the exception is born on this machine */
-          e.host = (char *) gras_os_myname();
-          xbt_ex_setup_backtrace(&e);
-        }
-        XBT_VERB
-            ("Propagate %s exception ('%s') from '%s' RPC cb back to %s:%d",
-             (e.remote ? "remote" : "local"), e.msg, msg.type->name,
-             xbt_socket_peer_name(msg.expe),
-             xbt_socket_peer_port(msg.expe));
-        if (XBT_LOG_ISENABLED(gras_msg, xbt_log_priority_verbose))
-          xbt_ex_display(&e);
-        gras_msg_send_ext(msg.expe, e_gras_msg_kind_rpcerror,
-                          msg.ID, msg.type, &e);
-        e.file = old_file;
-        xbt_ex_free(e);
-        ctx.answer_due = 0;
-        ran_ok = 1;
-      } else {
-        RETHROWF
-            ("Callback #%u (@%p) to message '%s' (payload size: %d) raised an exception: %s",
-             cpt + 1, cb, msg.type->name, msg.payl_size);
-      }
-    }
-
-    xbt_assert(!ctx.answer_due,
-                "Bug in user code: RPC callback to message '%s' didn't call gras_msg_rpcreturn",
-                msg.type->name);
-    if (ctx.answer_due)
-      XBT_CRITICAL
-          ("BUGS BOTH IN USER CODE (RPC callback to message '%s' didn't call gras_msg_rpcreturn) "
-           "AND IN SIMGRID (process wasn't killed by an assert)",
-           msg.type->name);
-    if (!ran_ok)
-      THROWF(mismatch_error, 0,
-             "Message '%s' refused by all registered callbacks (maybe your callback misses a 'return 0' at the end)",
-             msg.type->name);
-    /* FIXME: xbt_datadesc_free not implemented => leaking the payload */
-    break;
-
-
-  case e_gras_msg_kind_rpcanswer:
-    XBT_INFO("Unexpected RPC answer discarded (type: %s; from:%s:%d)",
-          msg.type->name, xbt_socket_peer_name(msg.expe),
-          xbt_socket_peer_port(msg.expe));
-    XBT_WARN
-        ("FIXME: xbt_datadesc_free not implemented => leaking the payload");
-    return;
-
-  case e_gras_msg_kind_rpcerror:
-    XBT_INFO("Unexpected RPC error discarded (type: %s; from:%s:%d)",
-          msg.type->name, xbt_socket_peer_name(msg.expe),
-          xbt_socket_peer_port(msg.expe));
-    XBT_WARN
-        ("FIXME: xbt_datadesc_free not implemented => leaking the payload");
-    return;
-
-  default:
-    THROWF(unknown_error, 0,
-           "Cannot handle messages of kind %d yet", (int)msg.type->kind);
-  }
-
-}
diff --git a/src/gras/Msg/gras_msg_listener.c b/src/gras/Msg/gras_msg_listener.c
deleted file mode 100644 (file)
index 0dcc36f..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-/* Thread in charge of listening the network and queuing incoming messages  */
-
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras/Msg/msg_private.h"
-#include "gras/Transport/transport_private.h"
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_msg_read, gras_msg,
-                                "Message reader thread");
-
-#include "xbt/ex.h"
-#include "xbt/queue.h"
-#include "xbt/synchro.h"
-
-#include "gras/Transport/transport_interface.h" /* gras_select */
-
-typedef struct s_gras_msg_listener_ {
-  xbt_thread_t listener; /* keep this first, gras_socket_im_the_server() does funky transtyping in sg_msg.c */
-  xbt_queue_t incoming_messages;       /* messages received from the wire and still to be used by master */
-  xbt_queue_t socks_to_close;   /* let the listener close the sockets, since it may be selecting on them. Darwin don't like this trick */
-  xbt_socket_t wakeup_sock_listener_side;
-  xbt_socket_t wakeup_sock_master_side;
-  int port; /* The port on which the listener opened the command socket */
-  xbt_mutex_t init_mutex;       /* both this mutex and condition are used at initialization to make sure that */
-  xbt_cond_t init_cond;         /* the main thread speaks to the listener only once it is started (FIXME: It would be easier using a semaphore, if only semaphores were in xbt_synchro) */
-} s_gras_msg_listener_t;
-
-#include "gras/Virtu/virtu_private.h" /* gras_procdata_t */
-static void listener_function(void *p)
-{
-  gras_msg_listener_t me = (gras_msg_listener_t) p;
-  gras_msg_t msg;
-  xbt_ex_t e;
-  gras_msgtype_t msg_wakeup_listener_t =
-      gras_msgtype_by_name("_wakeup_listener");
-  XBT_DEBUG("I'm the listener");
-
-  /* get a free socket for the receiving part of the listener */
-  me->wakeup_sock_listener_side =NULL;
-  for (me->port = 5000; me->port < 6000; me->port++) {
-    TRY {
-      me->wakeup_sock_listener_side = gras_socket_server_ext(me->port, -1, 0);
-    }
-    CATCH(e) {
-      if (me->port == 6000)
-        RETHROW;
-      xbt_ex_free(e);
-    }
-    if (me->wakeup_sock_listener_side)
-      break;
-  }
-
-  /* wake up the launcher */
-  xbt_mutex_acquire(me->init_mutex);
-  xbt_cond_signal(me->init_cond);
-  xbt_mutex_release(me->init_mutex);
-
-  /* Main loop */
-  while (1) {
-    msg = gras_msg_recv_any();
-    if (msg->type != msg_wakeup_listener_t) {
-    /* Cannot display who sent this since in SG, xbt_socket_peer_* wont work:
-       I'm not the user process but I'm just the listener. Too bad */
-      XBT_VERB("Got a '%s' message (%s) from sock %p. Queue it for handling by main thread",
-            gras_msgtype_get_name(msg->type),e_gras_msg_kind_names[msg->kind],msg->expe);
-      xbt_queue_push(me->incoming_messages, msg);
-    } else {
-      char got = *(char *) msg->payl;
-      if (got == '1') {
-        XBT_VERB("Asked to get awake");
-        free(msg->payl);
-        free(msg);
-      } else {
-        XBT_VERB("Asked to die");
-        //gras_socket_close(me->wakeup_sock_listener_side);
-        free(msg->payl);
-        free(msg);
-        return;
-      }
-    }
-    /* empty the list of sockets to trash */
-    TRY {
-      while (1) {
-        int sock;
-        xbt_queue_shift_timed(me->socks_to_close, &sock, 0);
-        if (tcp_close(sock) < 0) {
-#ifdef _XBT_WIN32
-          XBT_WARN("error while closing tcp socket %d: %d\n", sock,
-                sock_errno);
-#else
-          XBT_WARN("error while closing tcp socket %d: %d (%s)\n",
-                sock, sock_errno, sock_errstr(sock_errno));
-#endif
-        }
-      }
-    }
-    CATCH(e) {
-      if (e.category != timeout_error)
-        RETHROW;
-      xbt_ex_free(e);
-    }
-  }
-}
-
-gras_msg_listener_t gras_msg_listener_launch(xbt_queue_t msg_received)
-{
-  gras_msg_listener_t arg = xbt_new0(s_gras_msg_listener_t, 1);
-
-  XBT_VERB("Launch listener");
-  arg->incoming_messages = msg_received;
-  arg->socks_to_close = xbt_queue_new(0, sizeof(int));
-  arg->init_mutex = xbt_mutex_init();
-  arg->init_cond = xbt_cond_init();
-
-  /* declare the message used to awake the listener from the master */
-  gras_msgtype_declare("_wakeup_listener", xbt_datadesc_by_name("char"));
-
-  /* actually start the thread, and */
-  /* wait for the listener to initialize before we connect to its socket */
-  xbt_mutex_acquire(arg->init_mutex);
-  arg->listener =
-      xbt_thread_create("listener", listener_function, arg,
-                        1 /*joinable */ );
-  xbt_cond_wait(arg->init_cond, arg->init_mutex);
-  xbt_mutex_release(arg->init_mutex);
-  xbt_cond_destroy(arg->init_cond);
-  xbt_mutex_destroy(arg->init_mutex);
-
-  /* Connect the other part of the socket */
-  arg->wakeup_sock_master_side =
-      gras_socket_client(gras_os_myname(),
-                         arg->port);
-  return arg;
-}
-
-#include "gras/Virtu/virtu_private.h"   /* procdata_t content */
-void gras_msg_listener_shutdown()
-{
-  gras_procdata_t *pd = gras_procdata_get();
-  char kill = '0';
-  XBT_DEBUG("Listener quit");
-
-  if (pd->listener)
-    gras_msg_send(pd->listener->wakeup_sock_master_side,
-                  "_wakeup_listener", &kill);
-
-  xbt_thread_join(pd->listener->listener);
-
-  //  gras_socket_close(pd->listener->wakeup_sock_master_side); FIXME: uncommenting this leads to deadlock at terminaison
-  xbt_queue_free(&pd->listener->incoming_messages);
-  xbt_queue_free(&pd->listener->socks_to_close);
-  xbt_free(pd->listener);
-}
-
-void gras_msg_listener_awake()
-{
-  gras_procdata_t *pd;
-  char c = '1';
-
-  XBT_DEBUG("Awaking the listener");
-  pd = gras_procdata_get();
-  if (pd->listener) {
-    gras_msg_send(pd->listener->wakeup_sock_master_side,
-                  "_wakeup_listener", &c);
-  }
-}
-
-void gras_msg_listener_close_socket(int sd)
-{
-  gras_procdata_t *pd = gras_procdata_get();
-  if (pd->listener) {
-    xbt_queue_push(pd->listener->socks_to_close, &sd);
-    gras_msg_listener_awake();
-  } else {
-    /* do it myself */
-    tcp_close(sd);
-  }
-}
diff --git a/src/gras/Msg/gras_msg_mod.c b/src/gras/Msg/gras_msg_mod.c
deleted file mode 100644 (file)
index 04f3718..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/* gras message types handling                                              */
-
-/* Copyright (c) 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "gras/Msg/msg_private.h"
-#include "gras/Virtu/virtu_interface.h"
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(gras_msg);
-
-extern xbt_set_t _gras_msgtype_set;
-
-/*
- * Creating procdata for this module
- */
-static void *gras_msg_procdata_new(void)
-{
-  gras_msg_procdata_t res = xbt_new(s_gras_msg_procdata_t, 1);
-
-  res->name = xbt_strdup("gras_msg");
-  res->name_len = 0;
-  res->msg_queue = xbt_dynar_new(sizeof(s_gras_msg_t), NULL);
-  res->msg_waitqueue = xbt_dynar_new(sizeof(s_gras_msg_t), NULL);
-  res->cbl_list = xbt_dynar_new(sizeof(gras_cblist_t *), gras_cbl_free);
-  res->timers = xbt_dynar_new(sizeof(s_gras_timer_t), NULL);
-  res->msg_to_receive_queue = xbt_fifo_new();
-  res->msg_to_receive_queue_meas = xbt_fifo_new();
-  res->msg_received = xbt_queue_new(0, sizeof(s_gras_msg_t));
-
-  return (void *) res;
-}
-
-/*
- * Freeing procdata for this module
- */
-static void gras_msg_procdata_free(void *data)
-{
-  gras_msg_procdata_t res = (gras_msg_procdata_t) data;
-
-  xbt_dynar_free(&(res->msg_queue));
-  xbt_dynar_free(&(res->msg_waitqueue));
-  xbt_dynar_free(&(res->cbl_list));
-  xbt_dynar_free(&(res->timers));
-  xbt_fifo_free(res->msg_to_receive_queue);
-  xbt_fifo_free(res->msg_to_receive_queue_meas);
-
-  free(res->name);
-  free(res);
-}
-
-/*
- * Module registration
- */
-int gras_msg_libdata_id;
-void gras_msg_register()
-{
-  gras_msg_libdata_id =
-      gras_procdata_add("gras_msg", gras_msg_procdata_new,
-                        gras_msg_procdata_free);
-}
-
-/*
- * Initialize this submodule.
- */
-void gras_msg_init(void)
-{
-  /* only initialize once */
-  if (_gras_msgtype_set != NULL)
-    return;
-
-  XBT_VERB("Initializing Msg");
-
-  _gras_msgtype_set = xbt_set_new();
-
-  memcpy(_GRAS_header, "GRAS", 4);
-  _GRAS_header[4] = GRAS_PROTOCOL_VERSION;
-  _GRAS_header[5] = (char) GRAS_THISARCH;
-
-  gras_msg_ctx_mallocator =
-      xbt_mallocator_new(1000,
-                         gras_msg_ctx_mallocator_new_f,
-                         gras_msg_ctx_mallocator_free_f,
-                         gras_msg_ctx_mallocator_reset_f);
-}
-
-/*
- * Finalize the msg module
- */
-void gras_msg_exit(void)
-{
-  XBT_VERB("Exiting Msg");
-  xbt_set_free(&_gras_msgtype_set);
-
-  xbt_mallocator_free(gras_msg_ctx_mallocator);
-}
diff --git a/src/gras/Msg/gras_msg_types.c b/src/gras/Msg/gras_msg_types.c
deleted file mode 100644 (file)
index 8d43297..0000000
+++ /dev/null
@@ -1,325 +0,0 @@
-/* gras message types and callback registering and retrieving               */
-
-/* Copyright (c) 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "gras/Msg/msg_private.h"
-#include "gras/Virtu/virtu_interface.h"
-#include "xbt/datadesc/datadesc_interface.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_msg, gras, "High level messaging");
-
-xbt_set_t _gras_msgtype_set = NULL;
-
-
-/* ******************************************************************** */
-/*                      MESSAGE TYPES                                   */
-/* ******************************************************************** */
-
-
-/* Reclamed memory */
-void gras_msgtype_free(void *t)
-{
-  gras_msgtype_t msgtype = (gras_msgtype_t) t;
-  if (msgtype) {
-    free(msgtype->name);
-    free(msgtype);
-  }
-}
-
-/**
- * Dump all declared message types (debugging purpose)
- */
-void gras_msgtype_dumpall(void)
-{
-  xbt_set_cursor_t cursor;
-  gras_msgtype_t msgtype = NULL;
-
-  XBT_INFO("Dump of all registered messages:");
-  xbt_set_foreach(_gras_msgtype_set, cursor, msgtype) {
-    XBT_INFO("  Message name: %s (v%d) %s; %s%s%s",
-          msgtype->name, msgtype->version,
-          e_gras_msg_kind_names[msgtype->kind],
-          xbt_datadesc_get_name(msgtype->ctn_type),
-          (msgtype->kind == e_gras_msg_kind_rpccall ? " -> " : ""),
-          (msgtype->kind ==
-           e_gras_msg_kind_rpccall ?
-           xbt_datadesc_get_name(msgtype->answer_type) : ""));
-  }
-}
-
-
-/**
- * make_namev:
- *
- * Returns the versionned name of the message.
- *   It's a newly allocated string, make sure to free it.
- */
-static char *make_namev(const char *name, short int ver)
-{
-  if (!ver)
-    return xbt_strdup(name);
-
-  return bprintf("%s_v%d", name, ver);
-}
-
-/* Internal function doing the crude work of registering messages */
-void
-gras_msgtype_declare_ext(const char *name,
-                         short int version,
-                         e_gras_msg_kind_t kind,
-                         xbt_datadesc_type_t payload_request,
-                         xbt_datadesc_type_t payload_answer)
-{
-
-  gras_msgtype_t msgtype = NULL;
-  char *namev = make_namev(name, version);
-
-  msgtype = (gras_msgtype_t) xbt_set_get_by_name_or_null(
-      _gras_msgtype_set, (const char*) namev);
-
-  if (msgtype != NULL) {
-    XBT_DEBUG
-        ("Re-register version %d of message '%s' (same kind & payload, ignored).",
-         version, name);
-    xbt_assert(msgtype->kind == kind,
-                "Message %s re-registered as a %s (it was known as a %s)",
-                namev, e_gras_msg_kind_names[kind],
-                e_gras_msg_kind_names[msgtype->kind]);
-    xbt_assert(!xbt_datadesc_type_cmp
-                (msgtype->ctn_type, payload_request),
-                "Message %s re-registered with another payload (%s was %s)",
-                namev, xbt_datadesc_get_name(payload_request),
-                xbt_datadesc_get_name(msgtype->ctn_type));
-
-    xbt_assert(!xbt_datadesc_type_cmp
-                (msgtype->answer_type, payload_answer),
-                "Message %s re-registered with another answer payload (%s was %s)",
-                namev, xbt_datadesc_get_name(payload_answer),
-                xbt_datadesc_get_name(msgtype->answer_type));
-
-    xbt_free(namev);
-    return;                     /* do really ignore it */
-  }
-
-  XBT_VERB("Register version %d of message '%s' "
-        "(payload: %s; answer payload: %s).",
-        version, name, xbt_datadesc_get_name(payload_request),
-        xbt_datadesc_get_name(payload_answer));
-
-  msgtype = xbt_new(s_gras_msgtype_t, 1);
-  msgtype->name = namev;
-  msgtype->name_len = strlen(namev);
-  msgtype->version = version;
-  msgtype->kind = kind;
-  msgtype->ctn_type = payload_request;
-  msgtype->answer_type = payload_answer;
-
-  xbt_set_add(_gras_msgtype_set, (xbt_set_elm_t) msgtype,
-              &gras_msgtype_free);
-}
-
-
-/** @brief declare a new message type of the given name. It only accepts the given datadesc as payload
- *
- * @param name: name as it should be used for logging messages (must be uniq)
- * @param payload: datadescription of the payload
- */
-void gras_msgtype_declare(const char *name, xbt_datadesc_type_t payload)
-{
-  gras_msgtype_declare_ext(name, 0, e_gras_msg_kind_oneway, payload, NULL);
-}
-
-
-
-/** @brief declare a new versionned message type of the given name and payload
- *
- * @param name: name as it should be used for logging messages (must be uniq)
- * @param version: something like versionning symbol
- * @param payload: datadescription of the payload
- *
- * Registers a message to the GRAS mechanism. Use this version instead of
- * gras_msgtype_declare when you change the semantic or syntax of a message and
- * want your programs to be able to deal with both versions. Internally, each
- * will be handled as an independent message type, so you can register
- * differents for each of them.
- */
-void
-gras_msgtype_declare_v(const char *name,
-                       short int version, xbt_datadesc_type_t payload)
-{
-
-  gras_msgtype_declare_ext(name, version,
-                           e_gras_msg_kind_oneway, payload, NULL);
-}
-
-/** @brief retrieve an existing message type from its name (raises an exception if it does not exist). */
-gras_msgtype_t gras_msgtype_by_name(const char *name)
-{
-  return gras_msgtype_by_namev(name, 0);
-}
-
-/** @brief retrieve an existing message type from its name (or NULL if it does not exist). */
-gras_msgtype_t gras_msgtype_by_name_or_null(const char *name)
-{
-  xbt_ex_t e;
-  gras_msgtype_t res = NULL;
-
-  TRY {
-    res = gras_msgtype_by_namev(name, 0);
-  }
-  CATCH(e) {
-    res = NULL;
-    xbt_ex_free(e);
-  }
-  return res;
-}
-
-/** @brief retrieve an existing message type from its name and version. */
-gras_msgtype_t gras_msgtype_by_namev(const char *name, short int version)
-{
-  gras_msgtype_t res = NULL;
-  char *namev = make_namev(name, version);
-
-  res = (gras_msgtype_t) xbt_set_get_by_name_or_null(_gras_msgtype_set, namev);
-  free(namev);
-
-  if (res == NULL)
-    THROWF(not_found_error, 0, "No registered message of that name: %s",
-           name);
-
-  return res;
-}
-
-/** @brief retrieve an existing message type from its name and version. */
-gras_msgtype_t gras_msgtype_by_id(int id)
-{
-  return (gras_msgtype_t) xbt_set_get_by_id(_gras_msgtype_set, id);
-}
-
-/* ******************************************************************** */
-/*                         GETTERS                                      */
-/* ******************************************************************** */
-
-XBT_INLINE const char *gras_msgtype_get_name(gras_msgtype_t type)
-{
-  return type->name;
-}
-
-
-/* ******************************************************************** */
-/*                        CALLBACKS                                     */
-/* ******************************************************************** */
-void gras_cbl_free(void *data)
-{
-  gras_cblist_t *list = *(void **) data;
-  if (list) {
-    xbt_dynar_free(&(list->cbs));
-    free(list);
-  }
-}
-
-/** \brief Bind the given callback to the given message type
- *
- * Several callbacks can be attached to a given message type.
- * The lastly added one will get the message first, and
- * if it returns a non-null value, the message will be passed to the
- * second one. And so on until one of the callbacks accepts the message.
- */
-void gras_cb_register_(gras_msgtype_t msgtype, gras_msg_cb_t cb)
-{
-  gras_msg_procdata_t pd =
-      (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
-  gras_cblist_t *list = NULL;
-  unsigned int cpt;
-
-  XBT_DEBUG("Register %p as callback to '%s'", cb, msgtype->name);
-
-  /* search the list of cb for this message on this host (creating if NULL) */
-  xbt_dynar_foreach(pd->cbl_list, cpt, list) {
-    if (list->id == msgtype->code) {
-      break;
-    } else {
-      list = NULL;
-    }
-  }
-  if (!list) {
-    /* First cb? Create room */
-    list = xbt_new(gras_cblist_t, 1);
-    list->id = msgtype->code;
-    list->cbs = xbt_dynar_new(sizeof(gras_msg_cb_t), NULL);
-    xbt_dynar_push(pd->cbl_list, &list);
-  }
-
-  /* Insert the new one into the set */
-  xbt_dynar_insert_at(list->cbs, 0, &cb);
-}
-
-/** \brief Unbind the given callback from the given message type */
-void gras_cb_unregister_(gras_msgtype_t msgtype, gras_msg_cb_t cb)
-{
-
-  gras_msg_procdata_t pd =
-      (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
-  gras_cblist_t *list;
-  gras_msg_cb_t cb_cpt;
-  unsigned int cpt;
-  int found = 0;
-
-  /* search the list of cb for this message on this host */
-  xbt_dynar_foreach(pd->cbl_list, cpt, list) {
-    if (list->id == msgtype->code) {
-      break;
-    } else {
-      list = NULL;
-    }
-  }
-
-  /* Remove it from the set */
-  if (list) {
-    xbt_dynar_foreach(list->cbs, cpt, cb_cpt) {
-      if (cb == cb_cpt) {
-        xbt_dynar_cursor_rm(list->cbs, &cpt);
-        found = 1;
-      }
-    }
-  }
-  if (!found)
-    XBT_VERB("Ignoring removal of unexisting callback to msg id %u",
-          msgtype->code);
-}
-
-/** \brief Retrieve the expeditor of the message */
-xbt_socket_t gras_msg_cb_ctx_from(gras_msg_cb_ctx_t ctx)
-{
-  return ctx->expeditor;
-}
-
-/* \brief Creates a new message exchange context (user should never have to) */
-gras_msg_cb_ctx_t gras_msg_cb_ctx_new(xbt_socket_t expe,
-                                      gras_msgtype_t msgtype,
-                                      unsigned long int ID,
-                                      int answer_due, double timeout)
-{
-  gras_msg_cb_ctx_t res = xbt_new(s_gras_msg_cb_ctx_t, 1);
-  res->expeditor = expe;
-  res->msgtype = msgtype;
-  res->ID = ID;
-  res->timeout = timeout;
-  res->answer_due = answer_due;
-
-  return res;
-}
-
-/* \brief Frees a message exchange context
- *
- * This function is mainly useful with \ref gras_msg_wait_or, ie seldom.
- */
-void gras_msg_cb_ctx_free(gras_msg_cb_ctx_t ctx)
-{
-  free(ctx);
-}
diff --git a/src/gras/Msg/msg_interface.h b/src/gras/Msg/msg_interface.h
deleted file mode 100644 (file)
index 68d1399..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/* messaging - high level communication (send/receive messages)             */
-
-/* module's public interface exported within GRAS, but not to end user.     */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_MSG_INTERFACE_H
-#define GRAS_MSG_INTERFACE_H
-
-#include "gras/transport.h"
-#include "xbt/fifo.h"
-#include "xbt/dynar.h"
-#include "xbt/queue.h"
-
-/*
- * Data of this module specific to each process
- * (used by sg_process.c to check some usual errors at the end of the simulation)
- * FIXME: it could be cleaned up ?
- */
-typedef struct {
-  /* set headers */
-  unsigned int ID;
-  char *name;
-  unsigned int name_len;
-
-  /* queue storing the msgs got while msg_wait'ing for something else. Reuse them ASAP. */
-  xbt_dynar_t msg_queue;        /* elm type: s_gras_msg_t */
-
-  /* queue storing the msgs without callback got when handling. Feed them to wait() */
-  xbt_dynar_t msg_waitqueue;    /* elm type: s_gras_msg_t */
-
-  /* registered callbacks for each message */
-  xbt_dynar_t cbl_list;         /* elm type: gras_cblist_t */
-
-  /* registered timers */
-  xbt_dynar_t timers;           /* elm type: s_gras_timer_t */
-
-  /* queue storing the msgs that have to received and the process synchronization made (wait the surf action done) */
-  xbt_fifo_t msg_to_receive_queue;      /* elm type: s_gras_msg_t */
-  xbt_fifo_t msg_to_receive_queue_meas; /* elm type: s_gras_msg_t */
-  xbt_queue_t msg_received;
-
-} s_gras_msg_procdata_t, *gras_msg_procdata_t;
-
-
-void gras_msg_send_namev(xbt_socket_t sock,
-                         const char *namev, void *payload);
-void gras_msg_listener_awake(void);
-void gras_msg_listener_close_socket(int sd);
-
-#define GRAS_PROTOCOL_VERSION '\2';
-/* The difference between GRAS_PROTOCOL_VERSION=\1 (in SimGrid 3.6.1) and \2 (afterward) is that 
-   the architectures were renumbered (GRAS_THISARCH were shifted by 1) to insert WIN64 near to WIN32. 
-   See commit 27cbb00affed384593925fc5af6d5533d0a7ef09 */
-
-
-#endif                          /* GRAS_MSG_INTERFACE_H */
diff --git a/src/gras/Msg/msg_private.h b/src/gras/Msg/msg_private.h
deleted file mode 100644 (file)
index b79897a..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-/* messaging - high level communication (send/receive messages)             */
-
-/* module's private interface masked even to other parts of GRAS.           */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_MESSAGE_PRIVATE_H
-#define GRAS_MESSAGE_PRIVATE_H
-
-#include "portable.h"
-
-#include "xbt/sysdep.h"
-#include "xbt/log.h"
-#include "xbt/dynar.h"
-#include "xbt/queue.h"
-#include "xbt/set.h"
-#include "gras/transport.h"
-#include "xbt/datadesc.h"
-#include "gras/virtu.h"
-
-#include "gras/messages.h"
-#include "gras/timer.h"
-#include "gras_modinter.h"
-
-#include "gras/Msg/msg_interface.h"
-
-extern char _GRAS_header[6];
-
-extern int gras_msg_libdata_id; /* The identifier of our libdata */
-
-extern const char *e_gras_msg_kind_names[e_gras_msg_kind_count];
-
-/* declare either regular messages or RPC or whatever */
-void
-gras_msgtype_declare_ext(const char *name,
-                         short int version,
-                         e_gras_msg_kind_t kind,
-                         xbt_datadesc_type_t payload_request,
-                         xbt_datadesc_type_t payload_answer);
-
-/**
- * gras_msgtype_t:
- *
- * Message type descriptor. There one of these for each registered version.
- */
-typedef struct s_gras_msgtype {
-  /* headers for the data set */
-  unsigned int code;
-  char *name;
-  unsigned int name_len;
-
-  /* payload */
-  short int version;
-  e_gras_msg_kind_t kind;
-  xbt_datadesc_type_t ctn_type;
-  xbt_datadesc_type_t answer_type;     /* only used for RPC */
-} s_gras_msgtype_t;
-
-extern xbt_set_t _gras_msgtype_set;     /* of gras_msgtype_t */
-void gras_msgtype_free(void *msgtype);
-
-
-/* functions to extract msg from socket or put it on wire (depend RL vs SG) */
-gras_msg_t gras_msg_recv_any(void);     /* Get first message arriving */
-void gras_msg_recv(xbt_socket_t sock, gras_msg_t msg /*OUT*/);
-void gras_msg_send_ext(xbt_socket_t sock,
-                       e_gras_msg_kind_t kind,
-                       unsigned long int ID,
-                       gras_msgtype_t msgtype, void *payload);
-
-/* The thread in charge of receiving messages and queuing them */
-typedef struct s_gras_msg_listener_ *gras_msg_listener_t;
-gras_msg_listener_t gras_msg_listener_launch(xbt_queue_t msg_exchange);
-/* The caller has the responsability to cleanup the queues himself */
-void gras_msg_listener_shutdown(void);
-
-/**
- * gras_cblist_t:
- *
- * association between msg ID and cb list for a given process
- */
-struct s_gras_cblist {
-  long int id;
-  xbt_dynar_t cbs;              /* of gras_msg_cb_t */
-};
-
-typedef struct s_gras_cblist gras_cblist_t;
-void gras_cbl_free(void *);     /* used to free the memory at the end */
-void gras_cblist_free(void *cbl);
-
-/**
- * gras_msg_cb_ctx_t:
- *
- * Context associated to a given callback (to either regular message or RPC)
- */
-struct s_gras_msg_cb_ctx {
-  xbt_socket_t expeditor;
-  gras_msgtype_t msgtype;
-  unsigned long int ID;
-  double timeout;
-  int answer_due;               /* Whether the callback is expected to return a result (for sanity checks) */
-};
-typedef struct s_gras_msg_cb_ctx s_gras_msg_cb_ctx_t;
-
-/* ********* *
- * * TIMER * *
- * ********* */
-typedef struct {
-  double expiry;
-  double period;
-  void_f_void_t action;
-  int repeat;
-} s_gras_timer_t, *gras_timer_t;
-
-/* returns 0 if it handled a timer, or the delay until next timer, or -1 if no armed timer */
-double gras_msg_timer_handle(void);
-
-gras_msg_cb_ctx_t gras_msg_cb_ctx_new(xbt_socket_t expe,
-                                      gras_msgtype_t msgtype,
-                                      unsigned long int ID,
-                                      int answer_due, double timeout);
-
-
-
-/* We deploy a mallocator on the RPC contextes */
-#include "xbt/mallocator.h"
-extern xbt_mallocator_t gras_msg_ctx_mallocator;
-void *gras_msg_ctx_mallocator_new_f(void);
-#define gras_msg_ctx_mallocator_free_f xbt_free_f
-void gras_msg_ctx_mallocator_reset_f(void *dict);
-
-
-#endif                          /* GRAS_MESSAGE_PRIVATE_H */
diff --git a/src/gras/Msg/rl_msg.c b/src/gras/Msg/rl_msg.c
deleted file mode 100644 (file)
index d19d7bb..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/* messaging - Function related to messaging code specific to RL            */
-
-/* Copyright (c) 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "xbt/datadesc.h"
-#include "xbt/datadesc/datadesc_interface.h"
-#include "xbt/socket.h"
-#include "gras/Msg/msg_private.h"
-#include "gras/Transport/transport_interface.h"
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(gras_msg);
-
-void gras_msg_recv(xbt_socket_t sock, gras_msg_t msg);
-
-gras_msg_t gras_msg_recv_any(void)
-{
-  gras_msg_t msg = xbt_new0(s_gras_msg_t, 1);
-  msg->expe = gras_trp_select(-1);
-  XBT_DEBUG("Select returned something");
-  gras_msg_recv(msg->expe, msg);
-  return msg;
-}
-
-void gras_msg_send_ext(xbt_socket_t sock,
-                       e_gras_msg_kind_t kind,
-                       unsigned long int ID,
-                       gras_msgtype_t msgtype, void *payload)
-{
-
-  static xbt_datadesc_type_t string_type = NULL;
-  static xbt_datadesc_type_t ulong_type = NULL;
-  char c_kind = (char) kind;
-
-  xbt_assert(msgtype, "Cannot send the NULL message");
-
-  if (!string_type) {
-    string_type = xbt_datadesc_by_name("string");
-    xbt_assert(string_type);
-  }
-  if (!ulong_type) {
-    ulong_type = xbt_datadesc_by_name("unsigned long int");
-    xbt_assert(ulong_type);
-  }
-
-  XBT_DEBUG("send '%s' to %s:%d", msgtype->name,
-         xbt_socket_peer_name(sock), xbt_socket_peer_port(sock));
-  xbt_trp_send(sock, _GRAS_header, 6, 1 /* stable */ );
-  xbt_trp_send(sock, &c_kind, 1, 1 /* stable */ );
-  switch (kind) {
-  case e_gras_msg_kind_oneway:
-    break;
-
-  case e_gras_msg_kind_rpccall:
-  case e_gras_msg_kind_rpcanswer:
-  case e_gras_msg_kind_rpcerror:
-    xbt_datadesc_send(sock, ulong_type, &ID);
-    break;
-
-  default:
-    THROWF(unknown_error, 0, "Unknown msg kind %d", (int)kind);
-  }
-
-  xbt_datadesc_send(sock, string_type, &msgtype->name);
-  if (kind == e_gras_msg_kind_rpcerror) {
-    /* error on remote host, carfull, payload is an exception */
-    xbt_datadesc_send(sock, xbt_datadesc_by_name("ex_t"), payload);
-  } else if (kind == e_gras_msg_kind_rpcanswer) {
-    if (msgtype->answer_type)
-      xbt_datadesc_send(sock, msgtype->answer_type, payload);
-  } else {
-    /* regular message */
-    if (msgtype->ctn_type)
-      xbt_datadesc_send(sock, msgtype->ctn_type, payload);
-  }
-
-  xbt_trp_flush(sock);
-}
-
-const char *hexa_str(unsigned char *data, int size, int downside);
-
-
-/*
- * receive the next message on the given socket.
- */
-void gras_msg_recv(xbt_socket_t sock, gras_msg_t msg)
-{
-
-  xbt_ex_t e;
-  static xbt_datadesc_type_t string_type = NULL;
-  static xbt_datadesc_type_t ulong_type = NULL;
-  char header[6];
-  int cpt;
-  int r_arch;
-  char *msg_name = NULL;
-  char c_kind;
-
-  xbt_assert(!xbt_socket_is_meas(sock),
-              "Asked to receive a message on the measurement socket %p",
-              sock);
-  if (!string_type) {
-    string_type = xbt_datadesc_by_name("string");
-    xbt_assert(string_type);
-  }
-  if (!ulong_type) {
-    ulong_type = xbt_datadesc_by_name("unsigned long int");
-    xbt_assert(ulong_type);
-  }
-
-
-  TRY {
-    xbt_trp_recv(sock, header, 6);
-    xbt_trp_recv(sock, &c_kind, 1);
-    msg->kind = (e_gras_msg_kind_t) c_kind;
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF
-        ("Exception caught while trying to get the message header: %s");
-  }
-
-  for (cpt = 0; cpt < 4; cpt++)
-    if (header[cpt] != _GRAS_header[cpt])
-      THROWF(mismatch_error, 0,
-             "Incoming bytes do not look like a GRAS message (header='%s'  not '%.4s')",
-             hexa_str((unsigned char *) header, 4, 0), _GRAS_header);
-  if (header[4] != _GRAS_header[4])
-    THROWF(mismatch_error, 0, "GRAS protocol mismatch (got %d, use %d)",
-           (int) header[4], (int) _GRAS_header[4]);
-  r_arch = (int) header[5];
-
-  switch (msg->kind) {
-  case e_gras_msg_kind_oneway:
-    break;
-
-  case e_gras_msg_kind_rpccall:
-  case e_gras_msg_kind_rpcanswer:
-  case e_gras_msg_kind_rpcerror:
-    xbt_datadesc_recv(sock, ulong_type, r_arch, &msg->ID);
-    break;
-
-  default:
-    THROW_IMPOSSIBLE;
-  }
-
-  xbt_datadesc_recv(sock, string_type, r_arch, &msg_name);
-  XBT_DEBUG
-      ("Handle an incoming message '%s' (%s) using protocol %d (remote is %s)",
-       msg_name, e_gras_msg_kind_names[msg->kind], (int) header[4],
-       xbt_datadesc_arch_name(r_arch));
-
-  TRY {
-    msg->type =
-        (gras_msgtype_t) xbt_set_get_by_name(_gras_msgtype_set, msg_name);
-  }
-  CATCH(e) {
-    /* FIXME: Survive unknown messages */
-    if (e.category == not_found_error) {
-      xbt_ex_free(e);
-      THROWF(not_found_error, 0,
-             "Received an unknown message: %s (FIXME: should survive to these)",
-             msg_name);
-    } else
-      RETHROWF
-          ("Exception caught while retrieving the type associated to messages '%s' : %s",
-           msg_name);
-  }
-  free(msg_name);
-
-  if (msg->kind == e_gras_msg_kind_rpcerror) {
-    /* error on remote host. Carfull with that exception, eugene */
-    msg->payl_size = xbt_datadesc_size(xbt_datadesc_by_name("ex_t"));
-    msg->payl = xbt_malloc(msg->payl_size);
-    xbt_datadesc_recv(sock, xbt_datadesc_by_name("ex_t"), r_arch,
-                       msg->payl);
-
-  } else if (msg->kind == e_gras_msg_kind_rpcanswer) {
-    /* answer to RPC */
-    if (msg->type->answer_type) {
-      msg->payl_size = xbt_datadesc_size(msg->type->answer_type);
-      xbt_assert(msg->payl_size > 0,
-                  "%s %s",
-                  "Dynamic array as payload is forbided for now (FIXME?).",
-                  "Reference to dynamic array is allowed.");
-      msg->payl = xbt_malloc(msg->payl_size);
-      xbt_datadesc_recv(sock, msg->type->answer_type, r_arch, msg->payl);
-    } else {
-      msg->payl = NULL;
-      msg->payl_size = 0;
-    }
-  } else {
-    /* regular message */
-    if (msg->type->ctn_type) {
-      msg->payl_size = xbt_datadesc_size(msg->type->ctn_type);
-      xbt_assert(msg->payl_size > 0,
-                  "%s %s",
-                  "Dynamic array as payload is forbided for now (FIXME?).",
-                  "Reference to dynamic array is allowed.");
-      msg->payl = xbt_malloc(msg->payl_size);
-      xbt_datadesc_recv(sock, msg->type->ctn_type, r_arch, msg->payl);
-    } else {
-      msg->payl = NULL;
-      msg->payl_size = 0;
-    }
-  }
-}
diff --git a/src/gras/Msg/rpc.c b/src/gras/Msg/rpc.c
deleted file mode 100644 (file)
index 53fffc3..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-/* rpc - RPC implementation on top of GRAS messages                         */
-
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras/Msg/msg_private.h"
-
-xbt_set_t _gras_rpctype_set = NULL;
-xbt_dynar_t _gras_rpc_cancelled = NULL;
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_msg_rpc, gras_msg, "RPC mecanism");
-
-
-/** @brief declare a new versionned RPC type of the given name and payloads
- *
- * @param name: name as it should be used for logging messages (must be uniq)
- * @param payload_request: datatype of request
- * @param payload_answer: datatype of answer
- *
- * Registers a new RPC message to the GRAS mechanism. RPC are constituted of a pair
- * of messages.
- */
-void
-gras_msgtype_declare_rpc(const char *name,
-                         xbt_datadesc_type_t payload_request,
-                         xbt_datadesc_type_t payload_answer)
-{
-
-  gras_msgtype_declare_ext(name, 0,
-                           e_gras_msg_kind_rpccall,
-                           payload_request, payload_answer);
-
-}
-
-/** @brief declare a new versionned RPC type of the given name and payloads
- *
- * @param name: name as it should be used for logging messages (must be uniq)
- * @param version: something like versionning symbol
- * @param payload_request: datatype of request
- * @param payload_answer: datatype of answer
- *
- * Registers a new RPC message to the GRAS mechanism. RPC are constituted of a pair
- * of messages.
- *
- * Use this version instead of gras_rpctype_declare when you change the
- * semantic or syntax of a message and want your programs to be able to deal
- * with both versions. Internally, each will be handled as an independent
- * message type, so you can register differents for each of them.
- */
-void
-gras_msgtype_declare_rpc_v(const char *name,
-                           short int version,
-                           xbt_datadesc_type_t payload_request,
-                           xbt_datadesc_type_t payload_answer)
-{
-
-  gras_msgtype_declare_ext(name, version,
-                           e_gras_msg_kind_rpccall,
-                           payload_request, payload_answer);
-
-}
-
-static unsigned long int last_msg_ID = 0;
-
-static int msgfilter_rpcID(gras_msg_t msg, void *ctx)
-{
-  unsigned long int ID = *(unsigned long int *) ctx;
-  int res = msg->ID == ID &&
-      (msg->kind == e_gras_msg_kind_rpcanswer
-       || msg->kind == e_gras_msg_kind_rpcerror);
-  unsigned int cursor;
-  gras_msg_cb_ctx_t rpc_ctx;
-
-
-  XBT_DEBUG
-      ("Filter a message of ID %lu, type '%s' and kind '%s'. Waiting for ID=%lu. %s",
-       msg->ID, msg->type->name, e_gras_msg_kind_names[msg->kind], ID,
-       res ? "take it" : "reject");
-
-  if (res && !_gras_rpc_cancelled)
-    return res;
-
-  /* Check whether it is an old answer to a message we already canceled */
-  xbt_dynar_foreach(_gras_rpc_cancelled, cursor, rpc_ctx) {
-    if (msg->ID == rpc_ctx->ID && msg->kind == e_gras_msg_kind_rpcanswer) {
-      XBT_VERB
-          ("Got an answer to the already canceled (timeouted?) RPC %lu. Ignore it (leaking the payload!).",
-           msg->ID);
-      xbt_dynar_cursor_rm(_gras_rpc_cancelled, &cursor);
-      return 1;
-    }
-  }
-
-  return res;
-}
-
-/* Mallocator cruft */
-xbt_mallocator_t gras_msg_ctx_mallocator = NULL;
-void *gras_msg_ctx_mallocator_new_f(void)
-{
-  return xbt_new0(s_gras_msg_cb_ctx_t, 1);
-}
-
-void gras_msg_ctx_mallocator_reset_f(void *ctx)
-{
-  memset(ctx, 0, sizeof(s_gras_msg_cb_ctx_t));
-}
-
-/** @brief Launch a RPC call, but do not block for the answer */
-gras_msg_cb_ctx_t
-gras_msg_rpc_async_call_(xbt_socket_t server,
-                         double timeOut,
-                         gras_msgtype_t msgtype, void *request)
-{
-  gras_msg_cb_ctx_t ctx = xbt_mallocator_get(gras_msg_ctx_mallocator);
-
-  if (msgtype->ctn_type) {
-    xbt_assert(request,
-                "RPC type '%s' convey a payload you must provide",
-                msgtype->name);
-  } else {
-    xbt_assert(!request,
-                "No payload was declared for RPC type '%s'",
-                msgtype->name);
-  }
-
-  ctx->ID = last_msg_ID++;
-  ctx->expeditor = server;
-  ctx->msgtype = msgtype;
-  ctx->timeout = timeOut;
-
-  XBT_VERB("Send to %s:%d a RPC of type '%s' (ID=%lu)",
-        xbt_socket_peer_name(server),
-        xbt_socket_peer_port(server), msgtype->name, ctx->ID);
-
-  gras_msg_send_ext(server, e_gras_msg_kind_rpccall, ctx->ID, msgtype,
-                    request);
-
-  return ctx;
-}
-
-/** @brief Wait the answer of a RPC call previously launched asynchronously */
-void gras_msg_rpc_async_wait(gras_msg_cb_ctx_t ctx, void *answer)
-{
-  xbt_ex_t e;
-  s_gras_msg_t received;
-
-  if (ctx->msgtype->answer_type) {
-    xbt_assert(answer,
-                "Answers to RPC '%s' convey a payload you must accept",
-                ctx->msgtype->name);
-  } else {
-    xbt_assert(!answer,
-                "No payload was declared for answers to RPC '%s'",
-                ctx->msgtype->name);
-  }
-
-  TRY {
-    /* The filter returns 1 when we eat an old RPC answer to something canceled */
-    do {
-      gras_msg_wait_ext_(ctx->timeout,
-                         ctx->msgtype, NULL, msgfilter_rpcID, &ctx->ID,
-                         &received);
-    } while (received.ID != ctx->ID);
-
-  }
-  CATCH(e) {
-    if (!_gras_rpc_cancelled)
-      _gras_rpc_cancelled = xbt_dynar_new(sizeof(ctx), NULL);
-    xbt_dynar_push(_gras_rpc_cancelled, &ctx);
-    XBT_INFO
-        ("canceled RPC %lu pushed onto the stack (%s from %s:%d) Reason: %s",
-         ctx->ID, ctx->msgtype->name,
-         xbt_socket_peer_name(ctx->expeditor),
-         xbt_socket_peer_port(ctx->expeditor), e.msg);
-    RETHROW;
-  }
-
-  xbt_mallocator_release(gras_msg_ctx_mallocator, ctx);
-  if (received.kind == e_gras_msg_kind_rpcerror) {
-    xbt_ex_t e;
-    memcpy(&e, received.payl, received.payl_size);
-    free(received.payl);
-    XBT_VERB("Raise a remote exception cat:%d coming from %s (%s)",
-             (int)e.category, e.host, e.msg);
-    __xbt_running_ctx_fetch()->exception.msg = e.msg;
-    __xbt_running_ctx_fetch()->exception.category = e.category;
-    __xbt_running_ctx_fetch()->exception.value = e.value;
-    __xbt_running_ctx_fetch()->exception.remote = 1;
-    __xbt_running_ctx_fetch()->exception.host = e.host;
-    __xbt_running_ctx_fetch()->exception.procname = e.procname;
-    __xbt_running_ctx_fetch()->exception.pid = e.pid;
-    __xbt_running_ctx_fetch()->exception.file = e.file;
-    __xbt_running_ctx_fetch()->exception.line = e.line;
-    __xbt_running_ctx_fetch()->exception.func = e.func;
-    __xbt_running_ctx_fetch()->exception.used = e.used;
-    __xbt_running_ctx_fetch()->exception.bt_strings = e.bt_strings;
-    memset((void*)&__xbt_running_ctx_fetch()->exception.bt, 0,
-           sizeof(__xbt_running_ctx_fetch()->exception.bt));
-    DO_THROW(__xbt_running_ctx_fetch());
-  }
-  memcpy(answer, received.payl, received.payl_size);
-  free(received.payl);
-}
-
-/** @brief Conduct a RPC call */
-void gras_msg_rpccall_(xbt_socket_t server,
-                       double timeout,
-                       gras_msgtype_t msgtype, void *request, void *answer)
-{
-
-  gras_msg_cb_ctx_t ctx;
-
-  ctx = gras_msg_rpc_async_call_(server, timeout, msgtype, request);
-  gras_msg_rpc_async_wait(ctx, answer);
-}
-
-
-/** @brief Return the result of a RPC call
- *
- * It done before the actual return of the callback so that the callback can do
- * some cleanups before leaving.
- */
-
-void gras_msg_rpcreturn(double timeOut, gras_msg_cb_ctx_t ctx,
-                        void *answer)
-{
-  xbt_assert(ctx->answer_due,
-              "RPC return not allowed here. Either not a RPC message or already returned a result");
-  ctx->answer_due = 0;
-  XBT_DEBUG("Return to RPC '%s' from %s:%d (tOut=%f, payl=%p)",
-         ctx->msgtype->name,
-         xbt_socket_peer_name(ctx->expeditor),
-         xbt_socket_peer_port(ctx->expeditor), timeOut, answer);
-  gras_msg_send_ext(ctx->expeditor, e_gras_msg_kind_rpcanswer, ctx->ID,
-                    ctx->msgtype, answer);
-}
diff --git a/src/gras/Msg/sg_msg.c b/src/gras/Msg/sg_msg.c
deleted file mode 100644 (file)
index 78d510d..0000000
+++ /dev/null
@@ -1,277 +0,0 @@
-/* messaging - Function related to messaging code specific to SG            */
-
-/* Copyright (c) 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "xbt/xbt_socket_private.h" /* FIXME */
-#include "xbt/datadesc.h"
-#include "xbt/datadesc/datadesc_interface.h" /* FIXME */
-#include "gras/Virtu/virtu_sg.h"
-#include "gras/Msg/msg_private.h"
-#include "gras/Transport/transport_interface.h" /* gras_trp_chunk_send/recv */
-#include "gras/Transport/transport_private.h"   /* sock->data */
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(gras_msg);
-
-typedef void *gras_trp_bufdata_;
-#include "simgrid/simix.h"
-#include "simix/smx_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(xbt_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;
-
-  XBT_VERB("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()) {
-    XBT_VERB("I am the server");
-    return 1;
-  }
-  if (sock_data->client == SIMIX_process_self()) {
-    XBT_VERB("I am the client");
-    return 0;
-  }
-  XBT_VERB("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()) {
-      XBT_VERB("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()) {
-  XBT_VERB("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()))){}
-  XBT_INFO("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)");
-  XBT_INFO("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)
-{
-  gras_trp_procdata_t trp_proc =
-      (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_action_t), NULL);
-  unsigned int cursor = 0;
-  int got = 0;
-  xbt_socket_t sock = NULL;
-  gras_trp_sg_sock_data_t sock_data;
-  xbt_dynar_foreach(trp_proc->sockets, cursor, sock) {
-    sock_data = (gras_trp_sg_sock_data_t) sock->data;
-
-
-    XBT_DEBUG
-        ("Consider socket %p (data:%p; Here rdv: %p; Remote rdv: %p; Comm %p) to get a message",
-         sock, sock_data,
-         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);
-
-
-    /* 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
-     *                                (B) every sockets has a posted irecv in comms
-     *
-     * This is not trivial because we need that alignment to hold after the waitany(), so
-     * after other processes get scheduled.
-     *
-     * I cannot think of conditions where they get desynchronized (A violated) as long as
-     *    1) only the listener calls that function
-     *    2) Nobody but the listener removes sockets from that set (in main listener loop)
-     *    3) New sockets are added at the end, and signified ASAP to the listener (by awaking him)
-     * The throw bellow ensures that B is never violated without failing out loudly.
-     *
-     * We cannot search by comparing the comm object pointer that object got
-     *    freed by the waiting process (down in smx_network, in
-     *    comm_wait_for_completion or comm_cleanup). So, actually, we could
-     *    use that pointer since that's a dangling pointer, but no one changes it.
-     * I still feel unconfortable with using dangling pointers, even if that would
-     *    let the code work even if A and/or B are violated, provided that
-     *    (C) the new irecv is never posted before we return from waitany to that function.
-     *
-     * Another approach, robust to B violation would be to retraverse the socks dynar with
-     *    an iterator, incremented only when the socket has a comm. And we've the right socket
-     *    when that iterator is equal to "got", the result of waitany. Not needed if B holds.
-     */
-    xbt_assert(sock_data->comm_recv,
-                "Comm_recv of socket %p is empty; please report that nasty bug",
-                sock);
-    /* End of paranoia */
-
-    XBT_VERB("Consider receiving messages from on comm_recv %p rdv:%p (other rdv:%p)",
-          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);
-    xbt_dynar_push(comms, &(sock_data->comm_recv));
-  }
-  XBT_VERB("Wait on %lu 'sockets'", xbt_dynar_length(comms));
-  /* Wait for the end of any of these communications */
-  got = simcall_comm_waitany(comms);
-
-  /* retrieve the message sent in that communication */
-  sock = xbt_dynar_get_as(trp_proc->sockets, got, xbt_socket_t);
-  sock_data = (gras_trp_sg_sock_data_t) sock->data;
-  msg = sock_data->msg;
-  XBT_VERB("Got something. Communication over rdv_server=%p, rdv_client=%p",
-      sock_data->rdv_server,sock_data->rdv_client);
-
-  /* Reinstall a waiting communication on that rdv */
-/*  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->comm_recv =
-      simcall_comm_irecv(gras_socket_im_the_server(sock) ?
-                          sock_data->rdv_server : sock_data->rdv_client,
-                          &sock_data->msg, NULL, NULL, NULL);
-
-  return msg;
-}
-
-
-void gras_msg_send_ext(xbt_socket_t sock,
-                       e_gras_msg_kind_t kind,
-                       unsigned long int ID,
-                       gras_msgtype_t msgtype, void *payload)
-{
-  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_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;
-
-  /*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;
-  XBT_PUBLIC(xbt_datadesc_type_t) xbt_datadesc_by_id(long int code);
-
-  /* to debug */
-  XBT_PUBLIC(void) xbt_datadesc_type_dump(const xbt_datadesc_type_t ddt);
-  XBT_PUBLIC(const char *) xbt_datadesc_arch_name(int code);
-
-  /* compare two data type description */
-  XBT_PUBLIC(int)
-  xbt_datadesc_type_cmp(const xbt_datadesc_type_t d1,
-                         const xbt_datadesc_type_t d2);
-
-  /* Access function */
-  XBT_PUBLIC(int) xbt_datadesc_size(xbt_datadesc_type_t type);
-  /* Described data exchanges: direct use */
-  XBT_PUBLIC(int) xbt_datadesc_memcpy(xbt_datadesc_type_t type, void *src,
-                                       void *dst);
-  XBT_PUBLIC(void) xbt_datadesc_send(xbt_socket_t sock,
-                                      xbt_datadesc_type_t type, void *src);
-  XBT_PUBLIC(void) xbt_datadesc_recv(xbt_socket_t sock,
-                                      xbt_datadesc_type_t type, int r_arch,
-                                      void *dst);
-
-  /* Described data exchanges: IDL compilation FIXME: not implemented*/
-  void xbt_datadesc_gen_cpy(xbt_datadesc_type_t type, void *src,
-                             void **dst);
-  void xbt_datadesc_gen_send(xbt_socket_t sock,
-                              xbt_datadesc_type_t type, void *src);
-  void xbt_datadesc_gen_recv(xbt_socket_t sock,
-                              xbt_datadesc_type_t type, int r_arch,
-                              void *dst);
-
-
-  XBT_VERB("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 */
-    msg->payl_size = xbt_datadesc_size(xbt_datadesc_by_name("ex_t"));
-    msg->payl = xbt_malloc(msg->payl_size);
-    whole_payload_size =
-        xbt_datadesc_memcpy(xbt_datadesc_by_name("ex_t"), payload,
-                             msg->payl);
-  } else if (kind == e_gras_msg_kind_rpcanswer) {
-    msg->payl_size = xbt_datadesc_size(msgtype->answer_type);
-    if (msg->payl_size)
-      msg->payl = xbt_malloc(msg->payl_size);
-    else
-      msg->payl = NULL;
-
-    if (msgtype->answer_type)
-      whole_payload_size = xbt_datadesc_memcpy(msgtype->answer_type,
-                                                payload, msg->payl);
-  } else {
-    msg->payl_size = xbt_datadesc_size(msgtype->ctn_type);
-    msg->payl = msg->payl_size ? xbt_malloc(msg->payl_size) : NULL;
-    if (msgtype->ctn_type)
-      whole_payload_size = xbt_datadesc_memcpy(msgtype->ctn_type,
-                                                payload, msg->payl);
-  }
-
-  comm = simcall_comm_isend(target_rdv, whole_payload_size, -1, msg, sizeof(void *), NULL,NULL, msg, 0);
-  simcall_comm_wait(comm, -1);
-
-  XBT_VERB("Message sent (and received)");
-
-}
diff --git a/src/gras/Msg/timer.c b/src/gras/Msg/timer.c
deleted file mode 100644 (file)
index 1fff6ea..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-/* timer - Delayed and repetitive actions                                   */
-
-/* Copyright (c) 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "gras/Msg/msg_private.h"
-#include "gras/timer.h"
-#include "gras/Virtu/virtu_interface.h"
-
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_timer, gras,
-                                "Delayed and repetitive actions");
-
-/** @brief Request \a action to be called once in \a delay seconds */
-void gras_timer_delay(double delay, void_f_void_t action)
-{
-  gras_msg_procdata_t pd =
-      (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
-
-  gras_timer_t timer = xbt_dynar_push_ptr(pd->timers);
-
-  XBT_VERB("Register delayed action %p", action);
-  timer->period = delay;
-  timer->expiry = delay + gras_os_time();
-  timer->action = action;
-  timer->repeat = FALSE;
-}
-
-/** @brief Request \a action to be called every \a interval seconds */
-void gras_timer_repeat(double interval, void_f_void_t action)
-{
-  gras_msg_procdata_t pd =
-      (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
-
-  gras_timer_t timer = xbt_dynar_push_ptr(pd->timers);
-
-  XBT_VERB("Register repetitive action %p", action);
-  timer->period = interval;
-  timer->expiry = interval + gras_os_time();
-  timer->action = action;
-  timer->repeat = TRUE;
-}
-
-/** @brief Cancel a delayed task */
-void gras_timer_cancel_delay(double interval, void_f_void_t action)
-{
-  gras_msg_procdata_t pd =
-      (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
-  unsigned int cursor;
-  int found;
-  s_gras_timer_t timer;
-
-  found = FALSE;
-  xbt_dynar_foreach(pd->timers, cursor, timer) {
-    if (timer.repeat == FALSE &&
-        timer.period == interval && timer.action == action) {
-
-      found = TRUE;
-      xbt_dynar_cursor_rm(pd->timers, &cursor);
-    }
-  }
-
-  if (!found)
-    THROWF(mismatch_error, 0,
-           "Cannot remove the action %p delayed of %f second: not found",
-           action, interval);
-
-}
-
-/** @brief Cancel a repetitive task */
-void gras_timer_cancel_repeat(double interval, void_f_void_t action)
-{
-  gras_msg_procdata_t pd =
-      (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
-  unsigned int cursor;
-  int found;
-  s_gras_timer_t timer;
-
-  found = FALSE;
-  xbt_dynar_foreach(pd->timers, cursor, timer) {
-    if (timer.repeat == TRUE &&
-        timer.period == interval && timer.action == action) {
-
-      found = TRUE;
-      xbt_dynar_cursor_rm(pd->timers, &cursor);
-    }
-  }
-
-  if (!found)
-    THROWF(mismatch_error, 0,
-           "Cannot remove the action %p delayed of %f second: not found",
-           action, interval);
-}
-
-/** @brief Cancel all delayed tasks */
-void gras_timer_cancel_delay_all(void)
-{
-  gras_msg_procdata_t pd =
-      (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
-  unsigned int cursor;
-  int found;
-  s_gras_timer_t timer;
-
-  found = FALSE;
-  xbt_dynar_foreach(pd->timers, cursor, timer) {
-    if (timer.repeat == FALSE) {
-
-      found = TRUE;
-      xbt_dynar_cursor_rm(pd->timers, &cursor);
-    }
-  }
-
-  if (!found)
-    THROWF(mismatch_error, 0, "No delayed action to remove");
-
-}
-
-/** @brief Cancel all repetitive tasks */
-void gras_timer_cancel_repeat_all(void)
-{
-  gras_msg_procdata_t pd =
-      (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
-  unsigned int cursor;
-  int found;
-  s_gras_timer_t timer;
-
-  found = FALSE;
-  xbt_dynar_foreach(pd->timers, cursor, timer) {
-    if (timer.repeat == FALSE) {
-
-      found = TRUE;
-      xbt_dynar_cursor_rm(pd->timers, &cursor);
-    }
-  }
-
-  if (!found)
-    THROWF(mismatch_error, 0, "No repetitive action to remove");
-}
-
-/** @brief Cancel all delayed and repetitive tasks */
-void gras_timer_cancel_all(void)
-{
-  gras_msg_procdata_t pd =
-      (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
-  xbt_dynar_reset(pd->timers);
-}
-
-
-/* returns 0 if it handled a timer, or the delay until next timer, or -1 if no armed timer */
-double gras_msg_timer_handle(void)
-{
-  gras_msg_procdata_t pd =
-      (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
-  unsigned int cursor;
-  gras_timer_t timer;
-  double now = gras_os_time();
-  double untilnext = -1.0;
-
-  for (cursor = 0; cursor < xbt_dynar_length(pd->timers); cursor++) {
-    double untilthis;
-
-    timer = xbt_dynar_get_ptr(pd->timers, cursor);
-    untilthis = timer->expiry - now;
-
-    XBT_DEBUG("Action %p expires in %f", timer->action, untilthis);
-
-    if (untilthis <= 0.0) {
-      void_f_void_t action = timer->action;
-
-      XBT_DEBUG("[%.0f] Serve %s action %p (%f<%f)", gras_os_time(),
-             timer->repeat ? "repetitive" : "delayed", timer->action,
-             timer->expiry, now);
-
-      if (timer->repeat) {
-        timer->expiry = now + timer->period;
-        XBT_DEBUG("[%.0f] Re-arm repetitive action %p for %f (period=%f)",
-               gras_os_time(), timer->action, timer->expiry,
-               timer->period);
-      } else {
-        XBT_DEBUG("[%.0f] Remove %p now that it's done", gras_os_time(),
-               timer->action);
-        xbt_dynar_cursor_rm(pd->timers, &cursor);
-      }
-      action();
-      return 0.0;
-    } else if (untilthis < untilnext || untilnext == -1) {
-      untilnext = untilthis;
-    }
-  }
-  return untilnext;
-}
diff --git a/src/gras/Transport/README b/src/gras/Transport/README
deleted file mode 100644 (file)
index e883290..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-There is a plugin mechanism in here, and the selection is automatic
-
-If you open a socket in SG realm, you'll get a SG socket.
-If you open a socket in RL realm, you'll get a TCP socket.
-
-To get a file socket, you'll have to build it manually using
-gras_socket_client_from_file() to read from it, or
-gras_socket_server_from_file() to write to it.
-
-There is no way (yet?) to build a pipe socket, so threads have to
-discuss using network sockets, or xbt_queue_t structures.
-
-IMPLEMENTATION NOTES ABOUT THE SG SIDE
-
-This area is quite messy. The thing is that I strived too much to keep
-the existing interface, which is loosely inspired from BSD sockets.
-
-Vocabulary: 
-  Server is the one who created the master socket. 
-  Client is the one connecting to that from a remote host. 
-  Their roles keep the same for the whole connection duration. 
-  Sender and Receiver denote the roles during one message exchange.
-  If the server answers to the client, it becomes the sender while the
-  client becomes the receiver. 
-  All this seems trivial, but confusion is easy and dangerous.
-
-
-The connection story goes that way. When we create a master socket, we
-look whether the given port is free on that host or not. For that, we
-traverse the gras_hostdata_t->ports dynar, which contains
-gras_sg_portrec_t records. If it's free, we create a socket with a
-gras_trp_sg_sock_data_t structure. Here is that struct:
-
-typedef struct { 
-  smx_process_t server; 
-  smx_process_t client;
-    
-  smx_rdv_t rdv_server; /* The rendez-vous point to use */
-  smx_rdv_t rdv_client; /* The rendez-vous point to use */
-  smx_action_t comm_recv; /* The comm of irecv on receiver side */
-} s_gras_trp_sg_sock_data_t,*gras_trp_sg_sock_data_t;
-
-In GRAS, there is a listener process, in charge of pumping everything
-coming from the network and post that to the main user thread. That
-to overlap (incoming) communications and computations.
-In SG, this is done by ensuring that a receive is posted on every
-opened socket, and having the listener doing a smx_sem_waitany() to
-find the first ending one (in RL, a select+ddt_recv does the same).
-
-Another extra complexity is due to the fact that when the user
-receives a message, it gets a socket being a mean to contact the
-sender of that message. In RL, that's easy since sockets are
-full-duplex. In SG, I have to either create a new socket for each
-message (slow and leak-prone), or maintain a set of opened sockets on
-receiver side and check if the one I need is there or create it. The
-approach used currently is to give to the receiver a pointer to the
-structure created on the sender side directly.
-
-At the end of the day, everything is as if there were master socket
-and working sockets, just like in BSD. There is no explicit accept.
-Master sockets get created by gras_socket_server() and friends. You
-can recognize them by the fact that the rdv_client field is always
-NULL. Such sockets are not really used to exchange data, but more to
-establish connections. For actual exchanges, you need a working socket
-created by gras_socket_client() and friends. So, they are created on
-client side, but the master side will see it as message expeditor when
-getting a message.
-
-You can see which side of the socket you are with the
-gras_socket_im_the_server() function, which is designed for that.
diff --git a/src/gras/Transport/rl_transport.c b/src/gras/Transport/rl_transport.c
deleted file mode 100644 (file)
index f142dfc..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-/* rl_transport - RL specific functions for transport                       */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "xbt/xbt_socket_private.h" /* FIXME */
-#include "portable.h"
-#include "gras/Transport/transport_private.h"
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(gras_trp);
-
-/* check transport_private.h for an explanation of this variable */
-xbt_socket_t _gras_lastly_selected_socket = NULL;
-
-/**
- * gras_trp_select:
- *
- * Returns the next socket to service because it receives a message.
- *
- * if timeout<0, we ought to implement the adaptative timeout (FIXME)
- *
- *
- * if timeout>0 and no message there, wait at most that amount of time before giving up.
- */
-xbt_socket_t gras_trp_select(double timeout)
-{
-  xbt_dynar_t sockets =
-      ((gras_trp_procdata_t)
-       gras_libdata_by_id(gras_trp_libdata_id))->sockets;
-  int done = -1;
-  double wakeup = gras_os_time() + timeout;
-  double now = 0;
-  /* nextToService used to make sure socket with high number do not starve */
-  /*  static int nextToService = 0; */
-  struct timeval tout, *p_tout;
-
-  int max_fds = 0;              /* first arg of select: number of existing sockets */
-  /* but accept() of winsock returns sockets bigger than the limit, so don't bother 
-     with this tiny optimisation on BillWare */
-  fd_set FDS;
-  int ready;                    /* return of select: number of socket ready to be serviced */
-  static int fd_setsize = -1;   /* FD_SETSIZE not always defined. Get this portably */
-
-  xbt_socket_t sock_iter;      /* iterating over all sockets */
-  unsigned int cursor;          /* iterating over all sockets */
-
-  /* Check whether there is more data to read from the socket we selected last time.
-     This can happen with tcp buffered sockets since we try to get as much data as we can for them */
-  if (_gras_lastly_selected_socket
-      && _gras_lastly_selected_socket->moredata) {
-    XBT_VERB
-        ("Returning _gras_lastly_selected_socket since there is more data on it");
-    return _gras_lastly_selected_socket;
-  }
-
-  /* Compute FD_SETSIZE on need */
-  if (fd_setsize < 0) {
-#ifdef HAVE_SYSCONF
-    fd_setsize = sysconf(_SC_OPEN_MAX);
-#else
-#  ifdef HAVE_GETDTABLESIZE
-    fd_setsize = getdtablesize();
-#  else
-    fd_setsize = FD_SETSIZE;
-#  endif                        /* !USE_SYSCONF */
-#endif
-  }
-
-  while (done == -1) {
-    if (timeout > 0) {          /* did we timeout already? */
-      now = gras_os_time();
-      XBT_DEBUG("wakeup=%f now=%f", wakeup, now);
-      if (now == -1 || now >= wakeup) {
-        /* didn't find anything; no need to update _gras_lastly_selected_socket since its moredata is 0 (or we would have returned it directly) */
-        THROWF(timeout_error, 0,
-               "Timeout (%f) elapsed with selecting for incoming connections",
-               timeout);
-      }
-    }
-
-    /* construct the set of socket to ear from */
-    FD_ZERO(&FDS);
-    max_fds = -1;
-    xbt_dynar_foreach(sockets, cursor, sock_iter) {
-      if (!sock_iter->valid)
-        continue;
-
-      if (sock_iter->incoming) {
-        //XBT_DEBUG("Considering socket %d for select", sock_iter->sd);
-#ifndef HAVE_WINSOCK_H
-        if (max_fds < sock_iter->sd)
-          max_fds = sock_iter->sd;
-#else
-        max_fds = 0;
-
-#endif
-        FD_SET(sock_iter->sd, &FDS);
-      } else {
-        XBT_DEBUG("Not considering socket %d for select", sock_iter->sd);
-      }
-    }
-
-
-    if (max_fds == -1) {
-      if (timeout > 0) {
-        XBT_DEBUG("No socket to select onto. Sleep %f sec instead.", timeout);
-        gras_os_sleep(timeout);
-        THROWF(timeout_error, 0,
-               "No socket to select onto. Sleep %f sec instead", timeout);
-      } else {
-        XBT_DEBUG("No socket to select onto. Return directly.");
-        THROWF(timeout_error, 0,
-               "No socket to select onto. Return directly.");
-      }
-    }
-#ifndef HAVE_WINSOCK_H
-    /* we cannot have more than FD_SETSIZE sockets 
-       ... but with WINSOCK which returns sockets higher than the limit (killing this optim) */
-    if (++max_fds > fd_setsize && fd_setsize > 0) {
-      XBT_WARN("too many open sockets (%d).", max_fds);
-      done = 0;
-      break;
-    }
-#else
-    max_fds = fd_setsize;
-#endif
-
-    tout.tv_sec = tout.tv_usec = 0;
-    if (timeout > 0) {
-      /* set the timeout */
-      tout.tv_sec = (unsigned long) (wakeup - now);
-      tout.tv_usec =
-          ((wakeup - now) - ((unsigned long) (wakeup - now))) * 1000000;
-      p_tout = &tout;
-    } else if (timeout == 0) {
-      /* polling only */
-      tout.tv_sec = 0;
-      tout.tv_usec = 0;
-      p_tout = &tout;
-      /* we just do one loop around */
-      done = 0;
-    } else {
-      /* no timeout: good luck! */
-      p_tout = NULL;
-    }
-
-    XBT_DEBUG("Selecting over %d socket(s); timeout=%f", max_fds - 1,
-           timeout);
-    ready = select(max_fds, &FDS, NULL, NULL, p_tout);
-    XBT_DEBUG("select returned %d", ready);
-    if (ready == -1) {
-      switch (errno) {
-      case EINTR:              /* a signal we don't care about occured. we don't care */
-        /* if we cared, we would have set an handler */
-        continue;
-      case EINVAL:             /* invalid value */
-        THROWF(system_error, EINVAL,
-               "invalid select: nb fds: %d, timeout: %d.%d", max_fds,
-               (int) tout.tv_sec, (int) tout.tv_usec);
-      case ENOMEM:
-        xbt_die("Malloc error during the select");
-      default:
-        THROWF(system_error, errno, "Error during select: %s (%d)",
-               strerror(errno), errno);
-      }
-      THROW_IMPOSSIBLE;
-    } else if (ready == 0) {
-      continue;                 /* this was a timeout */
-    }
-
-    xbt_dynar_foreach(sockets, cursor, sock_iter) {
-      if (!FD_ISSET(sock_iter->sd, &FDS)) {     /* this socket is not ready */
-        continue;
-      }
-
-      /* Got a socket to serve */
-      ready--;
-
-      if (sock_iter->accepting && sock_iter->plugin->socket_accept) {
-        /* not a socket but an ear. accept on it and serve next socket */
-        xbt_socket_t accepted = NULL;
-
-        /* release mutex before accept; it will change the sockets dynar, so we have to break the foreach asap */
-        xbt_dynar_cursor_unlock(sockets);
-        accepted = (sock_iter->plugin->socket_accept) (sock_iter);
-
-        XBT_DEBUG("accepted=%p,&accepted=%p", accepted, &accepted);
-        accepted->meas = sock_iter->meas;
-        break;
-
-      } else {
-        /* Make sure the socket is still alive by reading the first byte */
-        int recvd;
-
-        if (sock_iter->recvd) {
-          /* Socket wasn't used since last time! Don't bother checking whether it's still alive */
-          recvd = 1;
-        } else {
-          recvd = read(sock_iter->sd, &sock_iter->recvd_val, 1);
-        }
-
-        if (recvd < 0) {
-          XBT_WARN("socket %d failed: %s", sock_iter->sd, strerror(errno));
-          /* done with this socket; remove it and break the foreach since it will change the dynar */
-          xbt_dynar_cursor_unlock(sockets);
-          gras_socket_close(sock_iter);
-          break;
-        } else if (recvd == 0) {
-          /* Connection reset (=closed) by peer. */
-          XBT_DEBUG("Connection %d reset by peer", sock_iter->sd);
-          sock_iter->valid = 0; /* don't close it. User may keep references to it */
-        } else {
-          /* Got a suited socket ! */
-          XBT_OUT();
-          sock_iter->recvd = 1;
-          XBT_DEBUG("Filled little buffer (%c %x %d)", sock_iter->recvd_val,
-                 sock_iter->recvd_val, recvd);
-          _gras_lastly_selected_socket = sock_iter;
-          /* break sync dynar iteration */
-          xbt_dynar_cursor_unlock(sockets);
-          return sock_iter;
-        }
-      }
-
-      /* if we're here, the socket we found wasn't really ready to be served */
-      if (ready == 0) {         /* exausted all sockets given by select. Request new ones */
-
-        xbt_dynar_cursor_unlock(sockets);
-        break;
-      }
-    }
-
-  }
-
-  /* No socket found. Maybe we had timeout=0 and nothing to do */
-  XBT_DEBUG("TIMEOUT");
-  THROWF(timeout_error, 0, "Timeout");
-}
-
-/* to make the linker happy in SG mode */
-void gras_trp_sg_setup(xbt_trp_plugin_t plug)
-{
-  THROWF(mismatch_error, 0, "No SG transport on live platforms");
-}
diff --git a/src/gras/Transport/sg_transport.c b/src/gras/Transport/sg_transport.c
deleted file mode 100644 (file)
index d8bf5b0..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/* sg_transport - SG specific functions for transport                       */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "gras/Transport/transport_private.h"
-#include "gras/Virtu/virtu_sg.h"
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(gras_trp);
-
-/* check transport_private.h for an explanation of this variable;
- * this just need to be defined to NULL in SG */
-xbt_socket_t _gras_lastly_selected_socket = NULL;
-
-#ifdef KILLME
-/**  
- * gras_trp_select:
- *
- * Returns the next socket to service having a message awaiting.
- *
- * if timeout<0, we ought to implement the adaptative timeout (FIXME)
- *
- * if timeout=0, do not wait for new message, only handle the ones already there.
- *
- * if timeout>0 and no message there, wait at most that amount of time before giving up.
- */
-gras_socket_t gras_trp_select(double timeout)
-{
-  gras_socket_t res;
-  gras_trp_procdata_t pd =
-      (gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id);
-  gras_trp_sg_sock_data_t *sockdata;
-  gras_trp_plugin_t trp;
-  gras_socket_t active_socket = NULL;
-  gras_trp_sg_sock_data_t *active_socket_data;
-  gras_socket_t sock_iter;      /* iterating over all sockets */
-  unsigned int cursor;
-
-  XBT_DEBUG("select on %s@%s with timeout=%f",
-         SIMIX_process_self_get_name(),
-         SIMIX_host_self_get_name(), timeout);
-  if (timeout >= 0) {
-    xbt_queue_shift_timed(pd->msg_selectable_sockets,
-                          &active_socket, timeout);
-  } else {
-    xbt_queue_shift(pd->msg_selectable_sockets, &active_socket);
-  }
-
-  if (active_socket == NULL) {
-    XBT_DEBUG("TIMEOUT");
-    THROWF(timeout_error, 0, "Timeout");
-  }
-  active_socket_data = (gras_trp_sg_sock_data_t *) active_socket->data;
-
-  /* Ok, got something. Open a socket back to the expeditor */
-
-  /* Try to reuse an already openned socket to that expeditor */
-  XBT_DEBUG("Open sockets size %lu", xbt_dynar_length(pd->sockets));
-  xbt_dynar_foreach(pd->sockets, cursor, sock_iter) {
-    gras_trp_sg_sock_data_t *sock_data;
-    XBT_DEBUG("Consider %p as outgoing socket to expeditor", sock_iter);
-
-    if (sock_iter->meas || !sock_iter->outgoing)
-      continue;
-    sock_data = ((gras_trp_sg_sock_data_t *) sock_iter->data);
-
-    if ((sock_data->to_socket == active_socket) &&
-        (sock_data->to_host ==
-         simcall_process_get_host(active_socket_data->from_process))) {
-      xbt_dynar_cursor_unlock(pd->sockets);
-      return sock_iter;
-    }
-  }
-
-  /* Socket to expeditor not created yet */
-  XBT_DEBUG("Create a socket to the expeditor");
-
-  trp = gras_trp_plugin_get_by_name("sg");
-
-  gras_trp_socket_new(1, &res);
-  res->plugin = trp;
-
-  res->incoming = 1;
-  res->outgoing = 1;
-  res->accepting = 0;
-  res->sd = -1;
-
-  res->port = -1;
-
-  /* initialize the ports */
-  //res->peer_port = active_socket->port;
-  res->port = active_socket->peer_port;
-
-  /* create sockdata */
-  sockdata = xbt_new(gras_trp_sg_sock_data_t, 1);
-  sockdata->from_process = SIMIX_process_self();
-  sockdata->to_process = active_socket_data->from_process;
-
-  res->peer_port = ((gras_trp_procdata_t)
-                    gras_libdata_by_name_from_remote("gras_trp",
-                                                     sockdata->to_process))->
-      myport;
-  sockdata->to_socket = active_socket;
-  /*update the peer to_socket  variable */
-  active_socket_data->to_socket = res;
-  sockdata->cond = simcall_cond_init();
-  sockdata->mutex = simcall_mutex_init();
-
-  sockdata->to_host =
-      simcall_process_get_host(active_socket_data->from_process);
-
-  res->data = sockdata;
-  res->peer_name = strdup(simcall_host_get_name(sockdata->to_host));
-
-  gras_trp_buf_init_sock(res);
-
-  XBT_DEBUG("Create socket to process:%s(Port %d) from process: %s(Port %d)",
-         simcall_process_get_name(sockdata->from_process),
-         res->peer_port,
-         simcall_process_get_name(sockdata->to_process), res->port);
-
-  return res;
-}
-#endif
diff --git a/src/gras/Transport/transport.c b/src/gras/Transport/transport.c
deleted file mode 100644 (file)
index 1c86966..0000000
+++ /dev/null
@@ -1,291 +0,0 @@
-/* transport - low level communication                                      */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-/***
- *** Options
- ***/
-#ifndef NDEBUG
-static int gras_opt_trp_nomoredata_on_close = 0;
-#endif
-
-#include "xbt/ex.h"
-#include "xbt/peer.h"
-#include "xbt/socket.h"
-#include "xbt/xbt_socket_private.h" /* FIXME */
-#include "portable.h"
-#include "gras/Transport/transport_private.h"
-#include "gras/Msg/msg_interface.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_trp, gras,
-                                "Conveying bytes over the network");
-
-/**
- * @brief Opens a server socket and makes it ready to be listened to.
- * @param port: port on which you want to listen
- * @param buf_size: size of the buffer (in byte) on the socket (for TCP sockets only). If 0, a sain default is used (32k, but may change)
- * @param measurement: whether this socket is meant to convey measurement (if you don't know, use 0 to exchange regular messages)
- *
- * In real life, you'll get a TCP socket.
- */
-xbt_socket_t
-gras_socket_server_ext(unsigned short port,
-                       unsigned long int buf_size, int measurement)
-{
-  xbt_trp_plugin_t trp;
-  xbt_socket_t sock;
-
-  XBT_DEBUG("Create a server socket from plugin %s on port %d",
-         gras_if_RL() ? "tcp" : "sg", port);
-  trp = xbt_trp_plugin_get_by_name(gras_if_SG() ? "sg" : "tcp");
-
-  /* defaults settings */
-  xbt_socket_new_ext(1,
-                     &sock,
-                     trp,
-                     (buf_size > 0 ? buf_size : 32 * 1024),
-                     measurement);
-
-  /* Call plugin socket creation function */
-  XBT_DEBUG("Prepare socket with plugin (fct=%p)", trp->socket_server);
-  TRY {
-    trp->socket_server(trp, port, sock);
-  }
-  CATCH_ANONYMOUS {
-    free(sock);
-    RETHROW;
-  }
-
-  if (!measurement)
-    ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->myport
-        = port;
-  xbt_dynar_push(((gras_trp_procdata_t)
-                  gras_libdata_by_id(gras_trp_libdata_id))->sockets,
-                 &sock);
-
-  gras_msg_listener_awake();
-  return sock;
-}
-
-/**
- * @brief Opens a server socket on any port in the given range
- *
- * @param minport: first port we will try
- * @param maxport: last port we will try
- * @param buf_size: size of the buffer (in byte) on the socket (for TCP sockets only). If 0, a sain default is used (32k, but may change)
- * @param measurement: whether this socket is meant to convey measurement (if you don't know, use 0 to exchange regular messages)
- *
- * If none of the provided ports works, raises the exception got when trying the last possibility
- */
-xbt_socket_t
-gras_socket_server_range(unsigned short minport, unsigned short maxport,
-                         unsigned long int buf_size, int measurement)
-{
-  volatile int port;
-  xbt_socket_t res = NULL;
-  xbt_ex_t e;
-
-  for (port = minport; port < maxport; port++) {
-    TRY {
-      res = gras_socket_server_ext(port, buf_size, measurement);
-    }
-    CATCH(e) {
-      if (port == maxport)
-        RETHROW;
-      xbt_ex_free(e);
-    }
-    if (res)
-      return res;
-  }
-  THROW_IMPOSSIBLE;
-}
-
-/**
- * @brief Opens a client socket to a remote host.
- * @param host: who you want to connect to
- * @param port: where you want to connect to on this host
- * @param buf_size: size of the buffer (in bytes) on the socket (for TCP sockets only). If 0, a sain default is used (32k, but may change)
- * @param measurement: whether this socket is meant to convey measurement (if you don't know, use 0 to exchange regular messages)
- *
- * In real life, you'll get a TCP socket.
- */
-xbt_socket_t
-gras_socket_client_ext(const char *host,
-                       unsigned short port,
-                       unsigned long int buf_size, int measurement)
-{
-  xbt_trp_plugin_t trp;
-  xbt_socket_t sock;
-
-  trp = xbt_trp_plugin_get_by_name(gras_if_SG() ? "sg" : "tcp");
-
-  XBT_DEBUG("Create a client socket from plugin %s",
-         gras_if_RL()? "tcp" : "sg");
-  /* defaults settings */
-  xbt_socket_new_ext(0,
-                     &sock,
-                     trp,
-                     (buf_size > 0 ? buf_size : 32 * 1024),
-                     measurement);
-
-  /* plugin-specific */
-  TRY {
-    (*trp->socket_client) (trp, host, port, sock);
-  }
-  CATCH_ANONYMOUS {
-    free(sock);
-    RETHROW;
-  }
-  xbt_dynar_push(((gras_trp_procdata_t)
-                  gras_libdata_by_id(gras_trp_libdata_id))->sockets,
-                 &sock);
-  gras_msg_listener_awake();
-  return sock;
-}
-
-/**
- * @brief Opens a server socket and make it ready to be listened to.
- *
- * In real life, you'll get a TCP socket.
- */
-xbt_socket_t gras_socket_server(unsigned short port)
-{
-  return gras_socket_server_ext(port, 32 * 1024, 0);
-}
-
-/** @brief Opens a client socket to a remote host */
-xbt_socket_t gras_socket_client(const char *host, unsigned short port)
-{
-  return gras_socket_client_ext(host, port, 0, 0);
-}
-
-/** @brief Opens a client socket to a remote host specified as '\a host:\a port' */
-xbt_socket_t gras_socket_client_from_string(const char *host)
-{
-  xbt_peer_t p = xbt_peer_from_string(host);
-  xbt_socket_t res = gras_socket_client_ext(p->name, p->port, 0, 0);
-  xbt_peer_free(p);
-  return res;
-}
-
-void gras_socket_close_voidp(void *sock)
-{
-  gras_socket_close((xbt_socket_t) sock);
-}
-
-/** \brief Close socket */
-void gras_socket_close(xbt_socket_t sock)
-{
-  if (--sock->refcount)
-    return;
-
-  xbt_dynar_t sockets =
-      ((gras_trp_procdata_t)
-       gras_libdata_by_id(gras_trp_libdata_id))->sockets;
-  xbt_socket_t sock_iter = NULL;
-  unsigned int cursor;
-
-  XBT_IN();
-  XBT_VERB("Close %p", sock);
-  if (sock == _gras_lastly_selected_socket) {
-    xbt_assert(!gras_opt_trp_nomoredata_on_close || !sock->moredata,
-                "Closing a socket having more data in buffer while the nomoredata_on_close option is activated");
-
-    if (sock->moredata)
-      XBT_CRITICAL
-          ("Closing a socket having more data in buffer. Option nomoredata_on_close disabled, so continuing.");
-    _gras_lastly_selected_socket = NULL;
-  }
-
-  /* FIXME: Issue an event when the socket is closed */
-  XBT_DEBUG("sockets pointer before %p", sockets);
-  if (sock) {
-    /* FIXME: Cannot get the dynar mutex, because it can be already locked */
-//              _xbt_dynar_foreach(sockets,cursor,sock_iter) {
-    for (cursor = 0; cursor < xbt_dynar_length(sockets); cursor++) {
-      _xbt_dynar_cursor_get(sockets, cursor, &sock_iter);
-      if (sock == sock_iter) {
-        XBT_DEBUG("remove sock cursor %u dize %lu\n", cursor,
-               xbt_dynar_length(sockets));
-        xbt_dynar_cursor_rm(sockets, &cursor);
-        if (sock->plugin->socket_close)
-          (*sock->plugin->socket_close) (sock);
-
-        /* free the memory */
-        free(sock);
-        XBT_OUT();
-        return;
-      }
-    }
-    XBT_WARN
-        ("Ignoring request to free an unknown socket (%p). Execution stack:",
-         sock);
-    xbt_backtrace_display_current();
-  }
-  XBT_OUT();
-}
-
-/*
- * Creating procdata for this module
- */
-static void *gras_trp_procdata_new(void)
-{
-  gras_trp_procdata_t res = xbt_new(s_gras_trp_procdata_t, 1);
-
-  res->name = xbt_strdup("gras_trp");
-  res->name_len = 0;
-  res->sockets = xbt_dynar_new_sync(sizeof(xbt_socket_t *), NULL);
-  res->myport = 0;
-
-  return (void *) res;
-}
-
-/*
- * Freeing procdata for this module
- */
-static void gras_trp_procdata_free(void *data)
-{
-  gras_trp_procdata_t res = (gras_trp_procdata_t) data;
-
-  xbt_dynar_free(&(res->sockets));
-  free(res->name);
-  free(res);
-}
-
-void gras_trp_socketset_dump(const char *name)
-{
-  gras_trp_procdata_t procdata =
-      (gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id);
-
-  unsigned int it;
-  xbt_socket_t s;
-
-  XBT_INFO("** Dump the socket set %s", name);
-  xbt_dynar_foreach(procdata->sockets, it, s) {
-    XBT_INFO("  %p -> %s:%d %s",
-          s, xbt_socket_peer_name(s), xbt_socket_peer_port(s),
-          s->valid ? "(valid)" : "(peer dead)");
-  }
-  XBT_INFO("** End of socket set %s", name);
-}
-
-/*
- * Module registration
- */
-int gras_trp_libdata_id;
-void gras_trp_register()
-{
-  gras_trp_libdata_id =
-      gras_procdata_add("gras_trp", gras_trp_procdata_new,
-                        gras_trp_procdata_free);
-}
-
-int gras_os_myport(void)
-{
-  return ((gras_trp_procdata_t)
-          gras_libdata_by_id(gras_trp_libdata_id))->myport;
-}
diff --git a/src/gras/Transport/transport_interface.h b/src/gras/Transport/transport_interface.h
deleted file mode 100644 (file)
index c0bb894..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/* transport - low level communication (send/receive bunches of bytes)      */
-
-/* module's public interface exported within GRAS, but not to end user.     */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_TRP_INTERFACE_H
-#define GRAS_TRP_INTERFACE_H
-
-#include "portable.h"           /* sometimes needed for fd_set */
-#include "simgrid/simix.h"
-#include "xbt/queue.h"
-
-/* Data of this module specific to each process
- * (used by sg_process.c to cleanup the SG channel cruft)
- */
-typedef struct {
-  /* set headers */
-  unsigned int ID;
-  char *name;
-  unsigned int name_len;
-
-  int myport;                   /* Port on which I listen myself */
-
-  xbt_dynar_t sockets;          /* all sockets known to this process */
-
-  /* SG only elements. In RL, they are part of the OS ;) */
-
-  /* List of sockets ready to be select()ed */
-  xbt_queue_t msg_selectable_sockets;   /* regular sockets  */
-  xbt_queue_t meas_selectable_sockets;  /* measurement ones */
-
-} s_gras_trp_procdata_t, *gras_trp_procdata_t;
-
-/* Display the content of our socket set (debugging purpose) */
-XBT_PUBLIC(void) gras_trp_socketset_dump(const char *name);
-
-XBT_PUBLIC(xbt_socket_t) gras_trp_select(double timeout);
-
-#endif                          /* GRAS_TRP_INTERFACE_H */
diff --git a/src/gras/Transport/transport_plugin_file.c b/src/gras/Transport/transport_plugin_file.c
deleted file mode 100644 (file)
index 0951ef7..0000000
+++ /dev/null
@@ -1,274 +0,0 @@
-/* File transport - send/receive a bunch of bytes from a file               */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "portable.h"
-#include "gras/Transport/transport_private.h"
-#include "xbt/ex.h"
-#include "xbt/xbt_socket_private.h"
-#include "gras/Msg/msg_interface.h"     /* gras_msg_listener_awake */
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_trp_file, gras_trp,
-                                "Pseudo-transport to write to/read from a file");
-
-/***
- *** Prototypes
- ***/
-void gras_trp_file_close(xbt_socket_t sd);
-
-void gras_trp_file_chunk_send_raw(xbt_socket_t sd,
-                                  const char *data,
-                                  unsigned long int size);
-void gras_trp_file_chunk_send(xbt_socket_t sd, const char *data,
-                              unsigned long int size, int stable_ignored);
-
-int gras_trp_file_chunk_recv(xbt_socket_t sd,
-                             char *data, unsigned long int size);
-
-/***
- *** Specific plugin part
- ***/
-
-typedef struct {
-  fd_set incoming_socks;
-} gras_trp_file_plug_data_t;
-
-/***
- *** Specific socket part
- ***/
-
-/***
- *** Info about who's speaking
- ***/
-static int gras_trp_file_my_port(xbt_socket_t s) {
-  THROW_UNIMPLEMENTED;
-}
-static int gras_trp_file_peer_port(xbt_socket_t s) {
-  THROW_UNIMPLEMENTED;
-}
-static const char* gras_trp_file_peer_name(xbt_socket_t s) {
-  THROW_UNIMPLEMENTED;
-}
-static const char* gras_trp_file_peer_proc(xbt_socket_t s) {
-  THROW_UNIMPLEMENTED;
-}
-static void gras_trp_file_peer_proc_set(xbt_socket_t s,char *name) {
-  THROW_UNIMPLEMENTED;
-}
-
-/***
- *** Code
- ***/
-void gras_trp_file_setup(xbt_trp_plugin_t plug)
-{
-
-  gras_trp_file_plug_data_t *file = xbt_new(gras_trp_file_plug_data_t, 1);
-
-  FD_ZERO(&(file->incoming_socks));
-
-  plug->my_port = gras_trp_file_my_port;
-  plug->peer_port = gras_trp_file_peer_port;
-  plug->peer_name = gras_trp_file_peer_name;
-  plug->peer_proc = gras_trp_file_peer_proc;
-  plug->peer_proc_set = gras_trp_file_peer_proc_set;
-
-  plug->socket_close = gras_trp_file_close;
-
-  plug->raw_send = gras_trp_file_chunk_send_raw;
-  plug->send = gras_trp_file_chunk_send;
-
-  plug->raw_recv = plug->recv = gras_trp_file_chunk_recv;
-
-  plug->data = (void *) file;
-}
-
-/**
- * gras_socket_client_from_file:
- *
- * Create a client socket from a file path.
- *
- * This only possible in RL, and is mainly for debugging.
- */
-xbt_socket_t gras_socket_client_from_file(const char *path)
-{
-  xbt_socket_t res;
-
-  xbt_assert(gras_if_RL(), "Cannot use file as socket in the simulator");
-
-  xbt_socket_new_ext(0, &res, xbt_trp_plugin_get_by_name("file"), 0, 0);
-
-  if (strcmp("-", path)) {
-    res->sd =
-        open(path, O_TRUNC | O_WRONLY | O_CREAT | O_BINARY,
-             S_IRUSR | S_IWUSR | S_IRGRP);
-
-    if (res->sd < 0) {
-      THROWF(system_error, 0,
-             "Cannot create a client socket from file %s: %s",
-             path, strerror(errno));
-    }
-  } else {
-    res->sd = 1;                /* stdout */
-  }
-
-  XBT_DEBUG("sock_client_from_file(%s): sd=%d in=%c out=%c accept=%c",
-         path,
-         res->sd,
-         res->incoming ? 'y' : 'n',
-         res->outgoing ? 'y' : 'n', res->accepting ? 'y' : 'n');
-
-  xbt_dynar_push(((gras_trp_procdata_t)
-                  gras_libdata_by_id(gras_trp_libdata_id))->sockets, &res);
-  return res;
-}
-
-/**
- * gras_socket_server_from_file:
- *
- * Create a server socket from a file path.
- *
- * This only possible in RL, and is mainly for debugging.
- */
-xbt_socket_t gras_socket_server_from_file(const char *path)
-{
-  xbt_socket_t res;
-
-  xbt_assert(gras_if_RL(), "Cannot use file as socket in the simulator");
-
-  xbt_socket_new_ext(1, &res, xbt_trp_plugin_get_by_name("file"), 0, 0);
-
-  if (strcmp("-", path)) {
-    res->sd = open(path, O_RDONLY | O_BINARY);
-
-    if (res->sd < 0) {
-      THROWF(system_error, 0,
-             "Cannot create a server socket from file %s: %s",
-             path, strerror(errno));
-    }
-  } else {
-    res->sd = 0;                /* stdin */
-  }
-
-  XBT_DEBUG("sd=%d in=%c out=%c accept=%c",
-         res->sd,
-         res->incoming ? 'y' : 'n',
-         res->outgoing ? 'y' : 'n', res->accepting ? 'y' : 'n');
-
-  xbt_dynar_push(((gras_trp_procdata_t)
-                  gras_libdata_by_id(gras_trp_libdata_id))->sockets, &res);
-  gras_msg_listener_awake();
-  return res;
-}
-
-void gras_trp_file_close(xbt_socket_t sock)
-{
-  gras_trp_file_plug_data_t *data;
-
-  if (!sock)
-    return;                     /* close only once */
-  data = sock->plugin->data;
-
-  if (sock->sd == 0) {
-    XBT_DEBUG("Do not close stdin");
-  } else if (sock->sd == 1) {
-    XBT_DEBUG("Do not close stdout");
-  } else {
-    XBT_DEBUG("close file connection %d", sock->sd);
-
-    /* forget about the socket */
-    FD_CLR(sock->sd, &(data->incoming_socks));
-
-    /* close the socket */
-    if (close(sock->sd) < 0) {
-      XBT_WARN("error while closing file %d: %s", sock->sd, strerror(errno));
-    }
-  }
-}
-
-/**
- * gras_trp_file_chunk_send:
- *
- * Send data on a file pseudo-socket
- */
-void
-gras_trp_file_chunk_send(xbt_socket_t sock,
-                         const char *data,
-                         unsigned long int size, int stable_ignored)
-{
-  gras_trp_file_chunk_send_raw(sock, data, size);
-}
-
-void
-gras_trp_file_chunk_send_raw(xbt_socket_t sock,
-                             const char *data, unsigned long int size)
-{
-
-  xbt_assert(sock->outgoing, "Cannot write on client file socket");
-
-  while (size) {
-    int status = 0;
-
-    XBT_DEBUG("write(%d, %p, %ld);", sock->sd, data, (long int) size);
-    status = write(sock->sd, data, (long int) size);
-
-    if (status == -1) {
-      THROWF(system_error, 0, "write(%d,%p,%d) failed: %s",
-             sock->sd, data, (int) size, strerror(errno));
-    }
-
-    if (status) {
-      size -= status;
-      data += status;
-    } else {
-      THROWF(system_error, 0, "file descriptor closed");
-    }
-  }
-}
-
-/**
- * gras_trp_file_chunk_recv:
- *
- * Receive data on a file pseudo-socket.
- */
-int
-gras_trp_file_chunk_recv(xbt_socket_t sock,
-                         char *data, unsigned long int size)
-{
-
-  int got = 0;
-
-  xbt_assert(sock, "Cannot recv on an NULL socket");
-  xbt_assert(sock->incoming, "Cannot recv on client file socket");
-
-  if (sock->recvd) {
-    data[0] = sock->recvd_val;
-    sock->recvd = 0;
-    got++;
-    size--;
-  }
-
-  while (size) {
-    int status = 0;
-
-    status = read(sock->sd, data + got, (long int) size);
-    XBT_DEBUG("read(%d, %p, %lu);", sock->sd, data + got, size);
-
-    if (status < 0) {
-      THROWF(system_error, 0, "read(%d,%p,%d) failed: %s",
-             sock->sd, data + got, (int) size, strerror(errno));
-    }
-
-    if (status) {
-      size -= status;
-      got += status;
-    } else {
-      THROWF(system_error, errno, "file descriptor closed after %d bytes",
-             got);
-    }
-  }
-  return got;
-}
diff --git a/src/gras/Transport/transport_plugin_sg.c b/src/gras/Transport/transport_plugin_sg.c
deleted file mode 100644 (file)
index 6dbffd0..0000000
+++ /dev/null
@@ -1,383 +0,0 @@
-/* file trp (transport) - send/receive a bunch of bytes in SG realm         */
-
-/* Note that this is only used to debug other parts of GRAS since message   */
-/*  exchange in SG realm is implemented directly without mimicing real life */
-/*  This would be terribly unefficient.                                     */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-
-#include "simgrid/simix.h"
-#include "gras/Msg/msg_private.h"
-#include "gras/Transport/transport_private.h"
-#include "gras/Virtu/virtu_sg.h"
-#include "xbt/xbt_socket_private.h" /* FIXME */
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_trp_sg, gras_trp,
-                                "SimGrid pseudo-transport");
-
-/***
- *** Prototypes 
- ***/
-
-/* retrieve the port record associated to a numerical port on an host */
-static gras_sg_portrec_t find_port(gras_hostdata_t * hd, int port);
-
-void gras_trp_sg_socket_client(xbt_trp_plugin_t self,
-                               const char*host,
-                               int port,
-                               /* OUT */ xbt_socket_t sock);
-void gras_trp_sg_socket_server(xbt_trp_plugin_t self,
-                               int port,
-                               /* OUT */ xbt_socket_t sock);
-void gras_trp_sg_socket_close(xbt_socket_t sd);
-
-void gras_trp_sg_chunk_send_raw(xbt_socket_t sd,
-                                const char *data, unsigned long int size);
-void gras_trp_sg_chunk_send(xbt_socket_t sd,
-                            const char *data,
-                            unsigned long int size, int stable_ignored);
-
-int gras_trp_sg_chunk_recv(xbt_socket_t sd,
-                           char *data, unsigned long int size);
-
-/***
- *** Specific plugin part
- ***/
-typedef struct {
-  int placeholder;              /* nothing plugin specific so far */
-} gras_trp_sg_plug_data_t;
-
-
-/***
- *** Code
- ***/
-static gras_sg_portrec_t find_port(gras_hostdata_t * hd, int port)
-{
-  unsigned int cpt;
-  gras_sg_portrec_t pr;
-
-  xbt_assert(hd, "Please run gras_process_init on each process");
-
-  xbt_dynar_foreach(hd->ports, cpt, pr) {
-    if (pr->port == port)
-      return pr;
-  }
-  return NULL;
-}
-
-/***
- *** Info about who's speaking
- ***/
-static int gras_trp_sg_my_port(xbt_socket_t s)
-{
-  gras_trp_sg_sock_data_t sockdata = xbt_socket_get_data(s);
-  if (gras_socket_im_the_server(s))
-    return sockdata->server_port;
-  else
-    return sockdata->client_port;
-}
-static int gras_trp_sg_peer_port(xbt_socket_t s)
-{
-  gras_trp_sg_sock_data_t sockdata = xbt_socket_get_data(s);
-  if (gras_socket_im_the_server(s))
-    return sockdata->client_port;
-  else
-    return sockdata->server_port;
-}
-
-static const char* gras_trp_sg_peer_name(xbt_socket_t s)
-{
-  gras_trp_sg_sock_data_t sockdata = xbt_socket_get_data(s);
-  if (gras_socket_im_the_server(s))
-    return SIMIX_host_get_name(simcall_process_get_host(sockdata->client));
-  else {
-    return SIMIX_host_get_name(simcall_process_get_host(sockdata->server));
-  }
-}
-static const char* gras_trp_sg_peer_proc(xbt_socket_t s) {
-  THROW_UNIMPLEMENTED;
-}
-static void gras_trp_sg_peer_proc_set(xbt_socket_t s,char *name) {
-  THROW_UNIMPLEMENTED;
-}
-
-void gras_trp_sg_setup(xbt_trp_plugin_t plug)
-{
-  plug->my_port = gras_trp_sg_my_port;
-  plug->peer_port = gras_trp_sg_peer_port;
-  plug->peer_name = gras_trp_sg_peer_name;
-  plug->peer_proc = gras_trp_sg_peer_proc;
-  plug->peer_proc_set = gras_trp_sg_peer_proc_set;
-
-  gras_trp_sg_plug_data_t *data = xbt_new(gras_trp_sg_plug_data_t, 1);
-
-  plug->data = data;
-
-  plug->socket_client = gras_trp_sg_socket_client;
-  plug->socket_server = gras_trp_sg_socket_server;
-  plug->socket_close = gras_trp_sg_socket_close;
-
-  plug->raw_send = gras_trp_sg_chunk_send_raw;
-  plug->send = gras_trp_sg_chunk_send;
-  plug->raw_recv = plug->recv = gras_trp_sg_chunk_recv;
-
-  plug->flush = NULL;           /* nothing cached */
-}
-
-void gras_trp_sg_socket_client(xbt_trp_plugin_t self,
-                               const char*host,
-                               int port,
-                               /* OUT */ xbt_socket_t sock)
-{
-
-  smx_host_t peer;
-  gras_hostdata_t *hd;
-  gras_trp_sg_sock_data_t data;
-  gras_sg_portrec_t pr;
-
-  /* make sure this socket will reach someone */
-  if (!(peer = simcall_host_get_by_name(host)))
-    THROWF(mismatch_error, 0,
-           "Can't connect to %s: no such host.\n", host);
-
-  if (!(hd = (gras_hostdata_t *) simcall_host_get_data(peer)))
-    THROWF(mismatch_error, 0,
-           "can't connect to %s: no process on this host",
-           host);
-
-  pr = find_port(hd, port);
-
-  if (pr == NULL) {
-    THROWF(mismatch_error, 0,
-           "can't connect to %s:%d, no process listen on this port",
-           host, port);
-  }
-
-  /* Ensure that the listener is expecting the kind of stuff we want to send */
-  if (pr->meas && !sock->meas) {
-    THROWF(mismatch_error, 0,
-           "can't connect to %s:%d in regular mode, the process listen "
-           "in measurement mode on this port", host,
-           port);
-  }
-  if (!pr->meas && sock->meas) {
-    THROWF(mismatch_error, 0,
-           "can't connect to %s:%d in measurement mode, the process listen "
-           "in regular mode on this port", host,
-           port);
-  }
-
-  /* create simulation data of the socket */
-  data = xbt_new0(s_gras_trp_sg_sock_data_t, 1);
-  data->client = SIMIX_process_self();
-  data->server = pr->server;
-  data->server_port = port;
-  data->client_port = gras_os_myport();
-
-  /* initialize synchronization stuff on the socket */
-  data->rdv_server = pr->rdv;
-  data->rdv_client = simcall_rdv_create(NULL);
-  data->comm_recv = simcall_comm_irecv(data->rdv_client, &data->msg, NULL, NULL, NULL);
-
-  /* connect that simulation data to the socket */
-  sock->data = data;
-  sock->incoming = 1;
-
-  XBT_DEBUG("%s (PID %d) connects in %s mode to %s:%d (rdv_ser:%p, rdv_cli:%p, comm:%p)",
-         simcall_process_get_name(SIMIX_process_self()), gras_os_getpid(),
-         sock->meas ? "meas" : "regular", host, port,
-         data->rdv_server,data->rdv_client,data->comm_recv);
-}
-
-void gras_trp_sg_socket_server(xbt_trp_plugin_t self, int port, xbt_socket_t sock)
-{
-
-  gras_hostdata_t *hd =
-      (gras_hostdata_t *) SIMIX_host_self_get_data();
-  gras_sg_portrec_t pr;
-  gras_trp_sg_sock_data_t data;
-
-  xbt_assert(hd, "Please run gras_process_init on each process");
-
-  sock->accepting = 1;
-
-  /* Check whether a server is already listening on that port or not */
-  pr = find_port(hd, port);
-
-  if (pr)
-    THROWF(mismatch_error, 0,
-           "can't listen on address %s:%d: port already in use.",
-           SIMIX_host_self_get_name(), port);
-
-  /* This port is free, let's take it */
-  pr = xbt_new(s_gras_sg_portrec_t, 1);
-  pr->port = port;
-  pr->meas = sock->meas;
-  pr->server = SIMIX_process_self();
-  xbt_dynar_push(hd->ports, &pr);
-  pr->rdv = simcall_rdv_create(NULL);
-
-  /* Create the socket */
-  data = xbt_new0(s_gras_trp_sg_sock_data_t, 1);
-  data->server = SIMIX_process_self();
-  data->server_port = port;
-  data->client = NULL;
-  data->rdv_server = pr->rdv;
-  data->rdv_client = NULL;
-  data->comm_recv = simcall_comm_irecv(pr->rdv, &data->msg, NULL, NULL, NULL);
-
-  sock->data = data;
-
-  XBT_VERB
-      ("'%s' (%d) ears on %s:%d%s (%p; data:%p); Here rdv: %p; Remote rdv: %p; Comm %p",
-       simcall_process_get_name(SIMIX_process_self()), gras_os_getpid(),
-       SIMIX_host_self_get_name(), port,
-       sock->meas ? " (mode meas)" : "", sock, data,
-       (data->server ==
-        SIMIX_process_self())? data->rdv_server : data->rdv_client,
-       (data->server ==
-        SIMIX_process_self())? data->rdv_client : data->rdv_server,
-       data->comm_recv);
-
-}
-
-void gras_trp_sg_socket_close(xbt_socket_t sock)
-{
-  gras_hostdata_t *hd =
-      (gras_hostdata_t *) SIMIX_host_self_get_data();
-  unsigned int cpt;
-  gras_sg_portrec_t pr;
-
-  XBT_IN(" (sock=%p)", sock);
-
-  if (!sock)
-    return;
-
-  xbt_assert(hd, "Please run gras_process_init on each process");
-
-  gras_trp_sg_sock_data_t sockdata = sock->data;
-
-  if (sock->incoming && !sock->outgoing && sockdata->server_port >= 0) {
-    /* server mode socket. Unregister it from 'OS' tables */
-    xbt_dynar_foreach(hd->ports, cpt, pr) {
-      XBT_DEBUG("Check pr %u of %lu", cpt, xbt_dynar_length(hd->ports));
-      if (pr->port == sockdata->server_port) {
-        xbt_dynar_cursor_rm(hd->ports, &cpt);
-        XBT_OUT();
-        return;
-      }
-    }
-    XBT_WARN
-        ("socket_close called on the unknown incoming socket %p (port=%d)",
-         sock, sockdata->server_port);
-  }
-  /* FIXME: kill the rdv point if receiver side */
-  free(sock->data);
-  XBT_OUT();
-}
-
-typedef struct {
-  int size;
-  void *data;
-} sg_task_data_t;
-
-void gras_trp_sg_chunk_send(xbt_socket_t sock,
-                            const char *data,
-                            unsigned long int size, int stable_ignored)
-{
-  gras_trp_sg_chunk_send_raw(sock, data, size);
-}
-
-void gras_trp_sg_chunk_send_raw(xbt_socket_t sock,
-                                const char *data, unsigned long int size)
-{
-#ifdef KILLME
-  char name[256];
-  static unsigned int count = 0;
-
-  smx_action_t act;             /* simix action */
-  gras_trp_procdata_t trp_remote_proc;
-  gras_msg_procdata_t msg_remote_proc;
-  gras_msg_t msg;               /* message to send */
-
-  //gras_trp_sg_sock_data_t sock_data = (gras_trp_sg_sock_data_t) sock->data;
-  xbt_assert(sock->meas,
-              "SG chunk exchange shouldn't be used on non-measurement sockets");
-
-
-  /* creates simix action and waits its ends, waits in the sender host
-     condition */
-  /*
-  if (XBT_LOG_ISENABLED(gras_trp_sg, xbt_log_priority_debug)) {
-    smx_process_t remote_dude =
-        (sock_data->server ==
-         SIMIX_process_self())? (sock_data->client) : (sock_data->server);
-    smx_host_t remote_host = simcall_process_get_host(remote_dude);
-  }
-  */
-  //SIMIX_network_send(sock_data->rdv,size,1,-1,NULL,0,NULL,NULL);
-#endif
-  THROW_UNIMPLEMENTED;
-}
-
-int gras_trp_sg_chunk_recv(xbt_socket_t sock,
-                           char *data, unsigned long int size)
-{
-  //gras_trp_sg_sock_data_t *sock_data =
-  //    (gras_trp_sg_sock_data_t *) sock->data;
-
-  //simcall_comm_recv(sock_data->rdv,-1,NULL,0,NULL);
-  THROW_UNIMPLEMENTED;
-#ifdef KILLME
-  gras_trp_sg_sock_data_t *remote_sock_data;
-  xbt_socket_t remote_socket = NULL;
-  gras_msg_t msg_got;
-  gras_msg_procdata_t msg_procdata =
-      (gras_msg_procdata_t) gras_libdata_by_name("gras_msg");
-  gras_trp_procdata_t trp_proc =
-      (gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id);
-
-  xbt_assert(sock->meas,
-              "SG chunk exchange shouldn't be used on non-measurement sockets");
-  xbt_queue_shift_timed(trp_proc->meas_selectable_sockets,
-                        &remote_socket, 60);
-
-  if (remote_socket == NULL) {
-    THROWF(timeout_error, 0, "Timeout");
-  }
-
-  remote_sock_data = (gras_trp_sg_sock_data_t *) remote_socket->data;
-  msg_got = xbt_fifo_shift(msg_procdata->msg_to_receive_queue_meas);
-
-  sock_data = (gras_trp_sg_sock_data_t *) sock->data;
-
-  /* ok, I'm here, you can continue the communication */
-  simcall_cond_signal(remote_sock_data->cond);
-
-  simcall_mutex_lock(remote_sock_data->mutex);
-  /* wait for communication end */
-  simcall_cond_wait(remote_sock_data->cond, remote_sock_data->mutex);
-
-  if (msg_got->payl_size != size)
-    THROWF(mismatch_error, 0,
-           "Got %d bytes when %ld where expected (in %s->%s:%d)",
-           msg_got->payl_size, size,
-           simcall_host_get_name(sock_data->to_host),
-           SIMIX_host_self_get_name(), sock->peer_port);
-
-  if (data)
-    memcpy(data, msg_got->payl, size);
-
-  xbt_free(msg_got->payl);
-
-  xbt_free(msg_got);
-  simcall_mutex_unlock(remote_sock_data->mutex);
-#endif
-  return 0;
-}
diff --git a/src/gras/Transport/transport_private.h b/src/gras/Transport/transport_private.h
deleted file mode 100644 (file)
index 9f67861..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* transport - low level communication (send/receive bunches of bytes)      */
-
-/* module's private interface masked even to other parts of GRAS.           */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_TRP_PRIVATE_H
-#define GRAS_TRP_PRIVATE_H
-
-#include "xbt/sysdep.h"
-#include "xbt/log.h"
-#include "xbt/dynar.h"
-#include "xbt/dict.h"
-
-#include "gras/emul.h"          /* gras_if_RL() */
-
-#include "gras_modinter.h"      /* module init/exit */
-#include "gras/transport.h"     /* rest of module interface */
-
-#include "gras/Transport/transport_interface.h" /* semi-public API */
-#include "gras/Virtu/virtu_interface.h" /* libdata management */
-
-extern int gras_trp_libdata_id; /* our libdata identifier */
-
-/* The function that select returned the last time we asked. We need this
-   because the TCP read are greedy and try to get as much data in their 
-   buffer as possible (to avoid subsequent syscalls).
-   (measurement sockets are not buffered and thus not concerned).
-  
-   So, we can get more than one message in one shoot. And when this happens,
-   we have to handle the same socket again afterward without select()ing at
-   all. 
-   Then, this data is not a static of the TCP driver because we want to
-   zero it when it gets closed by the user. If not, we use an already freed 
-   pointer, which is bad.
-   It gets tricky since gras_socket_close is part of the common API, not 
-   only the RL one. */
-extern xbt_socket_t _gras_lastly_selected_socket;
-
-#endif                          /* GRAS_TRP_PRIVATE_H */
diff --git a/src/gras/Virtu/gras_module.c b/src/gras/Virtu/gras_module.c
deleted file mode 100644 (file)
index cd48084..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-/* module - module handling, along with module dependencies and local state */
-
-/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt.h"
-#include "gras/module.h"
-#include "virtu_private.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_modules, gras,
-                                "Module and moddata handling");
-
-/* IMPLEMENTATION NOTE
-
-The goal of this module is quite difficult. We want to have several modules,
-each of them having globals which have to be initialized in any unix
-process. Let's call them world-wide globals. An example may be the messages
-dictionnary, which is world-wide to detect definition discrepencies when
-running in SG.
-
-And then, the module may want to have some globals specific to a gras process,
-just like userdata stuff allows to have per-process globals. Let's call them
-process-wide globals. An example may be the list of attached callbacks.
-
-That is why we have 4 functions per module: the join function is called by any
-process, and is in charge of creating the process-wide globals. If it is the
-first time a process uses the module, it also calls the init function, in
-charge of initializing the world-wide globals. We have the symmetric functions
-leave, called by any process not using the module anymore, and exit, in charge
-of freeing the world-wide globals when no process use it anymore.
-
-One can see this as a factory of factories. the init function is a factory
-creating the module, which contains a factory (the join function) able to
-create process-wide globals. The fact that indeed the calling sequence goes
-from join to init and not the other side is just an implementation bias ;)
-
-Then again, we want these functionalities to be quick. We want to access
-the process-wide globals by providing their rank in a dynar, we don't want to
-search them in a dictionary. This is especially true in the module
-implementation, where each functions is likely to require them to work. The
-position could be a stored in a global variable only visible from the module
-implementation.
-
-The need for an array in which to store the globals does not hold for
-world-wide globals: only one instance of them can exist in the same unix naming
-space. Thus, there is no need to put them in an array, we can actually declare
-them as regular C globals.
-
-The next trick comes from the fact that the user may (and will) mess up and not
-get all modules initialized in the same order in every process. So, the rank of
-module data cannot be the order in which a process called the join
-function. This has to be a world-wide global instead.
-
-And finally, if we want to get the ability to destroy modules (one day, they
-will load their code in as plugin), we want to give the module handling library
-(ie, this file) to modify the variable containing the rank of module in the
-tables. This is why we have the ID field in the module structure: it points
-exactly to the implementation side global.
-
-Yeah, I know. All this is not that clear. But at least, writing this helped me
-to design that crap ;)
-
-*/
-
-typedef struct s_gras_module {
-  XBT_SET_HEADERS;
-
-  unsigned int datasize;
-  int refcount;                 /* Number of processes using this module */
-  /* FIXME: we should keep a count of references within a given process to
-     allow modules initializing other modules while tracking dependencies
-     properly and leave() only when needed. This would allow dynamic module
-     loading/unloading */
-
-  int *p_id;                    /* where the module stores the libdata ID (a global somewhere), to tweak it on need */
-  void_f_void_t init_f;         /* First time the module is referenced. */
-  void_f_void_t exit_f;         /* When last process referencing it stops doing so. */
-  void_f_pvoid_t join_f;        /* Called by each process in initialization phase (init_f called once for all processes) */
-  void_f_pvoid_t leave_f;       /* Called by each process in finalization phase. Should free moddata passed */
-} s_gras_module_t, *gras_module_t;
-
-static xbt_set_t _gras_modules = NULL;  /* content: s_gras_module_t */
-
-static void gras_module_freep(void *p)
-{
-  free(((gras_module_t) p)->name);
-  free(p);
-}
-
-
-/**
- * @brief Declaring a new GRAS module
- * @param name: name of the module, of course (beware of dupplicates!)
- * @param datasize: the size of your data, ie of the state this module has on each process
- * @param ID: address of a global you use as parameter to gras_module_data_by_id
- * @param init_f: function called the first time a module gets by a process of the naming space.
- *                A classical use is to declare some messages the module uses, as well as the initialization
- *                of module constants (accross processes boundaries in SG).
- * @param exit_f: function called when the last process of this naming space unref this module.
- * @param join_f: function called each time a process references the module.
- *                It is passed the moddata already malloced, and should initialize the fields as it wants.
- *                It can also attach some callbacks to the module messages.
- * @param leave_f: function called each time a process unrefs the module.
- *                 It is passed the moddata, and should free any memory allocated by init_f.
- *                 It should alse disconnect any attached callbacks.
- */
-
-void gras_module_add(const char *name, unsigned int datasize, int *ID,
-                     void_f_void_t init_f, void_f_void_t exit_f,
-                     void_f_pvoid_t join_f, void_f_pvoid_t leave_f)
-{
-  gras_module_t mod = NULL;
-  xbt_ex_t e;
-  volatile int found = 0;
-
-  if (!_gras_modules)
-    _gras_modules = xbt_set_new();
-
-  TRY {
-    mod = (gras_module_t) xbt_set_get_by_name(_gras_modules, name);
-    found = 1;
-  }
-  CATCH(e) {
-    if (e.category != not_found_error)
-      RETHROW;
-    xbt_ex_free(e);
-  }
-
-  if (found) {
-    xbt_assert(mod->init_f == init_f,
-                "Module %s reregistered with a different init_f!", name);
-    xbt_assert(mod->exit_f == exit_f,
-                "Module %s reregistered with a different exit_f!", name);
-    xbt_assert(mod->join_f == join_f,
-                "Module %s reregistered with a different join_f!", name);
-    xbt_assert(mod->leave_f == leave_f,
-                "Module %s reregistered with a different leave_f!", name);
-    xbt_assert(mod->datasize == datasize,
-                "Module %s reregistered with a different datasize!", name);
-    xbt_assert(mod->p_id == ID,
-                "Module %s reregistered with a different p_id field!",
-                name);
-
-    XBT_DEBUG("Module %s already registered. Ignoring re-registration", name);
-    return;
-  }
-
-  XBT_VERB("Register module %s", name);
-  mod = xbt_new(s_gras_module_t, 1);
-  mod->name = xbt_strdup(name);
-  mod->name_len = strlen(name);
-
-  mod->datasize = datasize;
-  mod->p_id = ID;
-  mod->init_f = init_f;
-  mod->exit_f = exit_f;
-  mod->join_f = join_f;
-  mod->leave_f = leave_f;
-  mod->refcount = 0;
-
-  *mod->p_id = xbt_set_length(_gras_modules);
-
-  xbt_set_add(_gras_modules, (void *) mod, gras_module_freep);
-}
-
-/* shutdown the module mechanism (world-wide cleanups) */
-void gras_moddata_exit(void)
-{
-  xbt_set_free(&_gras_modules);
-}
-
-/* frees the moddata on this host (process-wide cleanups) */
-void gras_moddata_leave(void)
-{
-  gras_procdata_t *pd = gras_procdata_get();
-
-  xbt_dynar_free(&pd->moddata);
-}
-
-/* Removes & frees a given moddata from the current host */
-static void moddata_freep(void *p)
-{
-  gras_procdata_t *pd = gras_procdata_get();
-  int id = xbt_dynar_search(pd->moddata, p);
-  gras_module_t mod = (gras_module_t) xbt_set_get_by_id(_gras_modules, id);
-
-  mod->leave_f(gras_moddata_by_id(id));
-}
-
-void gras_module_join(const char *name)
-{
-  gras_procdata_t *pd;
-  void *moddata;
-  gras_module_t mod =
-      (gras_module_t) xbt_set_get_by_name(_gras_modules, name);
-
-  XBT_VERB("Join to module %s (%p)", name, mod);
-
-  /* NEW */
-  if (mod->refcount == 0) {
-    XBT_VERB("Init module %s", name);
-    mod->name = xbt_strdup(name);
-
-    mod->init_f();
-  } else {
-    XBT_DEBUG("Module %s already inited. Refcount=%d ID=%d",
-           mod->name, mod->refcount, *(mod->p_id));
-  }
-  mod->refcount++;
-
-  /* JOIN */
-  pd = gras_procdata_get();
-
-  if (!pd->moddata)             /* Damn. I must be the first module on this process. Scary ;) */
-    pd->moddata = xbt_dynar_new(sizeof(gras_module_t), &moddata_freep);
-
-  moddata = xbt_malloc(mod->datasize);
-
-  xbt_dynar_set(pd->moddata, *(mod->p_id), &moddata);
-
-  mod->join_f(moddata);
-
-  XBT_DEBUG("Module %s joined successfully (ID=%d)", name, *(mod->p_id));
-}
-
-void gras_module_leave(const char *name)
-{
-  void *moddata;
-  gras_module_t mod =
-      (gras_module_t) xbt_set_get_by_name(_gras_modules, name);
-
-  XBT_VERB("Leave module %s", name);
-
-  /* LEAVE */
-  moddata = gras_moddata_by_id(*(mod->p_id));
-  mod->leave_f(moddata);
-
-  /* EXIT */
-  mod->refcount--;
-  if (!mod->refcount) {
-    XBT_VERB("Exit module %s", name);
-
-    mod->exit_f();
-
-    /* Don't remove the module for real, sets don't allow to
-
-       free(mod->name);
-       free(mod);
-     */
-  }
-}
-
-
-void *gras_moddata_by_id(unsigned int ID)
-{
-  gras_procdata_t *pd = gras_procdata_get();
-  void *p;
-
-  xbt_dynar_get_cpy(pd->moddata, ID, &p);
-  return p;
-}
diff --git a/src/gras/Virtu/process.c b/src/gras/Virtu/process.c
deleted file mode 100644 (file)
index b2d442c..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-/* process - GRAS process handling (common code for RL and SG)              */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "xbt/sysdep.h"
-#include "xbt/log.h"
-#include "gras/transport.h"
-#include "xbt/datadesc.h"
-#include "gras/messages.h"
-#include "gras_modinter.h"
-
-#include "gras/Virtu/virtu_private.h"
-
-XBT_LOG_NEW_SUBCATEGORY(gras_virtu, gras, "Virtualization code");
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_virtu_process, gras_virtu,
-                                "Process manipulation code");
-
-/* Functions to handle gras_procdata_t->libdata cells*/
-typedef struct {
-  char *name;
-  pvoid_f_void_t constructor;
-  void_f_pvoid_t destructor;
-} s_gras_procdata_fabric_t, *gras_procdata_fabric_t;
-
-static xbt_dynar_t _gras_procdata_fabrics = NULL;       /* content: s_gras_procdata_fabric_t */
-
-static void gras_procdata_fabric_free(void *fab)
-{
-  free(((gras_procdata_fabric_t) fab)->name);
-}
-
-/** @brief declare the functions in charge of creating/destructing the procdata of a module
- *  
- *  This is intended to be called from the gras_<module>_register function.
- *  This returns the module ID you can use for gras_libdata_by_id()
- */
-int gras_procdata_add(const char *name, pvoid_f_void_t constructor,
-                      void_f_pvoid_t destructor)
-{
-
-  gras_procdata_fabric_t fab;
-
-  if (!_gras_procdata_fabrics) {
-    /* create the dynar if needed */
-    _gras_procdata_fabrics =
-        xbt_dynar_new(sizeof(s_gras_procdata_fabric_t),
-                      gras_procdata_fabric_free);
-  }
-
-  fab = xbt_dynar_push_ptr(_gras_procdata_fabrics);
-
-  fab->name = xbt_strdup(name);
-  fab->constructor = constructor;
-  fab->destructor = destructor;
-
-  return xbt_dynar_length(_gras_procdata_fabrics) - 1;
-}
-
-/* **************************************************************************
- * Process data
- * **************************************************************************/
-void *gras_userdata_get(void)
-{
-  gras_procdata_t *pd = gras_procdata_get();
-  return pd->userdata;
-}
-
-void *gras_userdata_set(void *ud)
-{
-  gras_procdata_t *pd = gras_procdata_get();
-
-  pd->userdata = ud;
-  return ud;
-}
-
-void *gras_libdata_by_name(const char *name)
-{
-  gras_procdata_t *pd = gras_procdata_get();
-  return gras_libdata_by_name_from_procdata(name, pd);
-}
-
-/* this function is splitted from previous to allow SG to get libdata from remote hosts */
-void *gras_libdata_by_name_from_procdata(const char *name,
-                                         gras_procdata_t * pd)
-{
-  void *res = NULL;
-  if (xbt_set_length(pd->libdata) <
-      xbt_dynar_length(_gras_procdata_fabrics)) {
-    /* Damn, some new modules were added since procdata_init(). Amok? */
-    /* Get 'em all */
-    gras_procdata_init();
-  }
-  TRY {
-    res = xbt_set_get_by_name(pd->libdata, name);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Cannot retrieve the libdata associated to %s: %s", name);
-  }
-  return res;
-}
-
-void *gras_libdata_by_id(int id)
-{
-  gras_procdata_t *pd = gras_procdata_get();
-  if (xbt_set_length(pd->libdata) <
-      xbt_dynar_length(_gras_procdata_fabrics)) {
-    /* Damn, some new modules were added since procdata_init(). Amok? */
-    /* Get 'em all */
-    gras_procdata_init();
-  }
-  return xbt_set_get_by_id(pd->libdata, id);
-}
-
-
-void gras_procdata_init()
-{
-  gras_procdata_t *pd = gras_procdata_get();
-  s_gras_procdata_fabric_t fab;
-
-  unsigned int cursor;
-
-  xbt_set_elm_t elem;
-
-  if (!pd->libdata) {
-    pd->userdata = NULL;
-    pd->libdata = xbt_set_new();
-  }
-
-  xbt_dynar_foreach(_gras_procdata_fabrics, cursor, fab) {
-
-    if (cursor + 1 <= xbt_set_length(pd->libdata)) {
-      XBT_DEBUG("Skip fabric %u: there is already %lu libdata",
-             cursor, xbt_set_length(pd->libdata));
-      continue;                 /* allow to recall this function to get recently added fabrics */
-    }
-    XBT_DEBUG("Go ahead for cursor %u, there is %lu libdata",
-           cursor, xbt_set_length(pd->libdata));
-
-    xbt_assert(fab.name, "Name of fabric #%u is NULL!", cursor);
-    XBT_DEBUG("Create the procdata for %s", fab.name);
-    /* Check for our own errors */
-
-    if (xbt_set_get_by_name_or_null(pd->libdata, fab.name) != NULL)
-      THROWF(unknown_error, 0,
-             "MayDay: two modules use '%s' as libdata name", fab.name);
-
-    /* Add the data in place, after some more sanity checking */
-    elem = fab.constructor();
-    if (elem->name_len && elem->name_len != strlen(elem->name)) {
-      elem->name_len = strlen(elem->name);
-      XBT_WARN
-          ("Module '%s' constructor is borken: it does not set elem->name_len",
-           fab.name);
-    }
-    xbt_set_add(pd->libdata, elem, fab.destructor);
-  }
-}
-
-void gras_procdata_exit()
-{
-  int len;
-  gras_procdata_t *pd = gras_procdata_get();
-
-  xbt_set_free(&(pd->libdata));
-
-  /* Remove procdata in reverse order wrt creation */
-  while ((len = xbt_dynar_length(_gras_procdata_fabrics))) {
-    xbt_dynar_remove_at(_gras_procdata_fabrics, len - 1, NULL);
-  }
-  xbt_dynar_free(&_gras_procdata_fabrics);
-}
-
-
-const char *gras_os_hostport()
-{
-  static char *res = NULL;
-  free(res);                  /* my port may have changed */
-  res = bprintf("%s:%d", gras_os_myname(), gras_os_myport());
-  return (const char *) res;
-}
diff --git a/src/gras/Virtu/rl_dns.c b/src/gras/Virtu/rl_dns.c
deleted file mode 100644 (file)
index 8e7f9e9..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/* rl_dns - name resolution (real life)                                     */
-
-/* Copyright (c) 2005, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras/Virtu/virtu_rl.h"
-#include "portable.h"
-
-/* A portable DNS resolver is a nightmare to do in a portable manner.
-   keep it simple/stupid for now. */
-
-const char *gras_os_myname(void)
-{
-  static char myname[255];
-  static int initialized = 0;
-
-  if (initialized)
-    return myname;
-
-  if (gethostname(myname, 255) == -1) {
-#ifdef HAVE_SYS_SOCKET_H
-    /* gethostname() failed! Trying with localhost instead. 
-       We first need to query the DNS to make sure localhost is resolved 
-       See the note in nws/Portability/dnsutil.c about {end,set}hostent() */
-    struct hostent *tmp;
-    sethostent(0);
-    tmp = gethostbyname("localhost");
-    endhostent();
-
-    if (tmp) {
-      strncpy(myname, tmp->h_name, 255);
-    } else {
-      /* Erm. localhost cannot be resolved. There's something wrong in the user DNS setting */
-      sprintf(myname, "(misconfigured host)");
-    }
-#else
-    sprintf(myname, "(misconfigured windows host)");
-#endif
-  }
-
-  myname[254] = '\0';
-
-  initialized = 1;
-  return myname;
-}
diff --git a/src/gras/Virtu/rl_emul.c b/src/gras/Virtu/rl_emul.c
deleted file mode 100644 (file)
index 5ed5a65..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/* rl_emul - Emulation support (real life)                                  */
-
-/* Copyright (c) 2005, 2006, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras/emul.h"
-#include "gras/Virtu/virtu_rl.h"
-#include "gras_modinter.h"
-
-XBT_LOG_NEW_SUBCATEGORY(gras_virtu_emul, gras_virtu, "Emulation support");
-
-/*** CPU burning */
-void gras_cpu_burn(double flops)
-{
-  while (flops > 0) {
-    flops -= 2;
-  }
-}
-
-
-/*** Timing macros: nothing to do in RL. Actually do the job and shutup ***/
-
-void gras_emul_init(void)
-{
-}
-
-void gras_emul_exit(void)
-{
-}
-
-int gras_bench_always_begin(const char *location, int line)
-{
-  return 0;
-}
-
-int gras_bench_always_end(void)
-{
-  return 0;
-}
-
-int gras_bench_once_begin(const char *location, int line)
-{
-  return 1;
-}
-
-int gras_bench_once_end(void)
-{
-  return 0;
-}
-
-/*** Conditional execution support ***/
-
-int gras_if_RL(void)
-{
-  return 1;
-}
-
-int gras_if_SG(void)
-{
-  return 0;
-}
diff --git a/src/gras/Virtu/rl_process.c b/src/gras/Virtu/rl_process.c
deleted file mode 100644 (file)
index cc364ce..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-/* process_rl - GRAS process handling on real life                          */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras_modinter.h"      /* module initialization interface */
-#include "gras/Virtu/virtu_rl.h"
-#include "portable.h"
-#include "xbt/xbt_os_thread.h"
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(gras_virtu_process);
-
-/* globals */
-static gras_procdata_t *_gras_procdata = NULL;
-XBT_EXPORT_NO_IMPORT(char const *) _gras_procname = NULL;
-static xbt_dict_t _process_properties = NULL;
-static xbt_dict_t _host_properties = NULL;
-
-# ifdef __APPLE__
-        /* under darwin, the environment gets added to the process at startup time. So, it's not defined at library link time, forcing us to extra tricks */
-# include <crt_externs.h>
-# define environ (*_NSGetEnviron())
-# else
-#ifdef _XBT_WIN32
-                 /* the environment, as specified by the opengroup, used to initialize the process properties */
-extern char **wenviron;
-#else
-extern char **environ;
-#endif
-# endif
-
-void gras_process_init()
-{
-  char **env_iter;
-  _gras_procdata = xbt_new0(gras_procdata_t, 1);
-  gras_procdata_init();
-
-  /* initialize the host & process properties */
-  _host_properties = xbt_dict_new_homogeneous(xbt_free_f);
-  _process_properties = xbt_dict_new_homogeneous(xbt_free_f);
-  env_iter = environ;
-  while (*env_iter) {
-    char *equal, *buf = xbt_strdup(*env_iter);
-    equal = strchr(buf, '=');
-    if (!equal) {
-      XBT_WARN
-          ("The environment contains an entry without '=' char: %s (ignore it)",
-           *env_iter);
-      continue;
-    }
-    *equal = '\0';
-    xbt_dict_set(_process_properties, buf, xbt_strdup(equal + 1), NULL);
-    free(buf);
-    env_iter++;
-  }
-}
-
-void gras_process_exit()
-{
-  gras_procdata_exit();
-  free(_gras_procdata);
-  xbt_dict_free(&_process_properties);
-  xbt_dict_free(&_host_properties);
-}
-
-const char *xbt_procname(void)
-{
-  if (_gras_procname)
-    return _gras_procname;
-  else
-    return "";
-}
-
-int gras_os_getpid(void)
-{
-#ifdef _XBT_WIN32
-  return (long int) GetCurrentProcessId();
-#else
-  return (long int) getpid();
-#endif
-}
-
-/* **************************************************************************
- * Process data
- * **************************************************************************/
-
-gras_procdata_t *gras_procdata_get(void)
-{
-  xbt_assert(_gras_procdata, "Run gras_process_init (ie, gras_init)!");
-
-  return _gras_procdata;
-}
-
-typedef struct {
-  xbt_main_func_t code;
-  int argc;
-  char **argv;
-} spawner_wrapper_args;
-
-static void *spawner_wrapper(void *data) {
-  spawner_wrapper_args *a = data;
-  a->code(a->argc, a->argv);
-  free(a);
-  return NULL;
-}
-
-void gras_agent_spawn(const char *name,
-                      xbt_main_func_t code, int argc, char *argv[],
-                      xbt_dict_t properties)
-{
-  spawner_wrapper_args *args =malloc(sizeof(spawner_wrapper_args));
-  args->argc=argc;
-  args->argv=argv;
-  args->code=code;
-  xbt_os_thread_create(name,spawner_wrapper,args, NULL);
-}
-
-/* **************************************************************************
- * Properties
- * **************************************************************************/
-
-const char *gras_process_property_value(const char *name)
-{
-  return xbt_dict_get_or_null(_process_properties, name);
-}
-
-xbt_dict_t gras_process_properties(void)
-{
-  return _process_properties;
-}
-
-const char *gras_os_host_property_value(const char *name)
-{
-  return xbt_dict_get_or_null(_host_properties, name);
-}
-
-xbt_dict_t gras_os_host_properties(void)
-{
-  return _host_properties;
-}
diff --git a/src/gras/Virtu/sg_dns.c b/src/gras/Virtu/sg_dns.c
deleted file mode 100644 (file)
index cf15311..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/* sg_dns - name resolution (simulator)                                     */
-
-/* Copyright (c) 2005, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-
-#include "gras/Virtu/virtu_sg.h"
-
-const char *gras_os_myname(void)
-{
-  return SIMIX_host_self_get_name();
-}
diff --git a/src/gras/Virtu/sg_emul.c b/src/gras/Virtu/sg_emul.c
deleted file mode 100644 (file)
index 1fce177..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-/* sg_emul - Emulation support (simulation)                                 */
-
-/* Copyright (c) 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdio.h>              /* sprintf */
-#include "gras/emul.h"
-#include "gras/Virtu/virtu_sg.h"
-#include "gras_modinter.h"
-
-#include "xbt/xbt_os_time.h"    /* timers */
-#include "xbt/dict.h"
-#include "xbt/ex.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_virtu_emul, gras_virtu,
-                                "Emulation support");
-/*** CPU burning */
-void gras_cpu_burn(double flops)
-{
-  smx_action_t execution;
-
-  if (flops > 0){
-    execution = simcall_host_execute("task", SIMIX_host_self(), flops, 1);
-    simcall_host_execution_wait(execution);
-  }
-}
-
-/*** Timing macros ***/
-static xbt_os_timer_t timer;
-static int benchmarking = 0;
-static xbt_dict_t benchmark_set = NULL;
-static double reference = .00000000523066250047108838;  /* FIXME: we should benchmark host machine to set this; unit=s/flop */
-static double duration = 0.0;
-
-static char *locbuf = NULL;
-static unsigned int locbufsize;
-
-void gras_emul_init(void)
-{
-  if (!benchmark_set) {
-    benchmark_set = xbt_dict_new_homogeneous(xbt_free_f);
-    timer = xbt_os_timer_new();
-  }
-}
-
-void gras_emul_exit(void)
-{
-  free(locbuf);
-  xbt_dict_free(&benchmark_set);
-  xbt_os_timer_free(timer);
-}
-
-
-static void store_in_dict(xbt_dict_t dict, const char *key, double value)
-{
-  double *ir;
-
-  ir = xbt_dict_get_or_null(dict, key);
-  if (!ir) {
-    ir = xbt_new0(double, 1);
-    xbt_dict_set(dict, key, ir, NULL);
-  }
-  *ir = value;
-}
-
-static double get_from_dict(xbt_dict_t dict, const char *key)
-{
-  double *ir = xbt_dict_get(dict, key);
-
-  return *ir;
-}
-
-int gras_bench_always_begin(const char *location, int line)
-{
-  xbt_assert(!benchmarking, "Already benchmarking");
-  benchmarking = 1;
-
-  if (!timer)
-    xbt_os_timer_start(timer);
-  return 0;
-}
-
-int gras_bench_always_end(void)
-{
-  xbt_assert(benchmarking, "Not benchmarking yet");
-  benchmarking = 0;
-  xbt_os_timer_stop(timer);
-  duration = xbt_os_timer_elapsed(timer);
-
-  gras_cpu_burn(duration / reference);
-
-  return 0;
-}
-
-int gras_bench_once_begin(const char *location, int line)
-{
-  double *ir = NULL;
-  xbt_assert(!benchmarking, "Already benchmarking");
-  benchmarking = 1;
-
-  if (!locbuf || locbufsize < strlen(location) + 64) {
-    locbufsize = strlen(location) + 64;
-    locbuf = xbt_realloc(locbuf, locbufsize);
-  }
-  sprintf(locbuf, "%s:%d", location, line);
-
-  ir = xbt_dict_get_or_null(benchmark_set, locbuf);
-  if (!ir) {
-    XBT_DEBUG("%s", locbuf);
-    duration = 1;
-    xbt_os_timer_start(timer);
-    return 1;
-  } else {
-    duration = -1.0;
-    return 0;
-  }
-}
-
-int gras_bench_once_end(void)
-{
-  xbt_assert(benchmarking, "Not benchmarking yet");
-  benchmarking = 0;
-  if (duration > 0) {
-    xbt_os_timer_stop(timer);
-    duration = xbt_os_timer_elapsed(timer);
-    store_in_dict(benchmark_set, locbuf, duration);
-  } else {
-    duration = get_from_dict(benchmark_set, locbuf);
-  }
-  XBT_DEBUG("Simulate the run of a task of %f sec for %s", duration, locbuf);
-  gras_cpu_burn(duration / reference);
-  return 0;
-}
-
-
-/*** Conditional execution support ***/
-
-int gras_if_RL(void)
-{
-  return 0;
-}
-
-int gras_if_SG(void)
-{
-  return 1;
-}
diff --git a/src/gras/Virtu/sg_process.c b/src/gras/Virtu/sg_process.c
deleted file mode 100644 (file)
index 96773db..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-/* process_sg - GRAS process handling on simulator                          */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "xbt/dict.h"
-#include "gras_modinter.h"      /* module initialization interface */
-#include "gras/Virtu/virtu_sg.h"
-#include "gras/Msg/msg_interface.h"     /* For some checks at simulation end */
-#include "gras/Transport/transport_interface.h" /* For some checks at simulation end */
-#if HAVE_LUA
-#include <lua.h>
-#include <lauxlib.h>
-#include <lualib.h>
-#endif
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(gras_virtu_process);
-
-static long int PID = 1;
-
-
-void gras_agent_spawn(const char *name,
-                      xbt_main_func_t code, int argc, char *argv[],
-                      xbt_dict_t properties)
-{
-
-  smx_process_t process;
-  simcall_process_create(&process, name, code, NULL,
-                           gras_os_myname(), -1.0, argc, argv, properties, 0);
-}
-
-/* **************************************************************************
- * Process constructor/destructor (semi-public interface)
- * **************************************************************************/
-
-void gras_process_init()
-{
-  smx_process_t self = SIMIX_process_self();
-  gras_hostdata_t *hd =
-      (gras_hostdata_t *) SIMIX_host_self_get_data();
-  gras_procdata_t *pd = xbt_new0(gras_procdata_t, 1);
-  gras_trp_procdata_t trp_pd;
-  long int pid = PID++; /* make sure the first process gets the first id */
-
-  if (!hd) {
-    /* First process on this host (FIXME: does not work if the SIMIX user contexts are truly parallel) */
-    hd = xbt_new(gras_hostdata_t, 1);
-    hd->refcount = 1;
-    hd->ports = xbt_dynar_new(sizeof(gras_sg_portrec_t), NULL);
-    SIMIX_host_self_set_data((void *) hd);
-  } else {
-    hd->refcount++;
-  }
-
-  SIMIX_process_self_set_data(self, (void *) pd);
-  gras_procdata_init();
-
-  trp_pd = (gras_trp_procdata_t) gras_libdata_by_name("gras_trp");
-  pd->pid = pid;
-
-  if (self != NULL) {
-    pd->ppid = gras_os_getpid();
-  } else
-    pd->ppid = -1;
-
-  trp_pd->msg_selectable_sockets = xbt_queue_new(0, sizeof(xbt_socket_t));
-
-  trp_pd->meas_selectable_sockets =
-      xbt_queue_new(0, sizeof(xbt_socket_t));
-
-  XBT_VERB("Creating process '%s' (%d)", SIMIX_process_self_get_name(),
-      gras_os_getpid());
-}
-
-void gras_process_exit()
-{
-  xbt_dynar_t sockets =
-      ((gras_trp_procdata_t) gras_libdata_by_name("gras_trp"))->sockets;
-  xbt_socket_t sock_iter;
-  unsigned int cursor;
-  gras_hostdata_t *hd =
-      (gras_hostdata_t *) SIMIX_host_self_get_data();
-  gras_procdata_t *pd =
-      (gras_procdata_t *) simcall_process_get_data(SIMIX_process_self());
-
-  gras_msg_procdata_t msg_pd =
-      (gras_msg_procdata_t) gras_libdata_by_name("gras_msg");
-  gras_trp_procdata_t trp_pd =
-      (gras_trp_procdata_t) gras_libdata_by_name("gras_trp");
-
-  xbt_queue_free(&trp_pd->msg_selectable_sockets);
-
-  xbt_queue_free(&trp_pd->meas_selectable_sockets);
-
-
-  xbt_assert(hd, "Run gras_process_init (ie, gras_init)!!");
-
-  XBT_VERB("GRAS: Finalizing process '%s' (%d)",
-        simcall_process_get_name(SIMIX_process_self()), gras_os_getpid());
-
-  if (!xbt_dynar_is_empty(msg_pd->msg_queue)) {
-    unsigned int cpt;
-    s_gras_msg_t msg;
-    XBT_WARN
-        ("process %d terminated, but %lu messages are still queued. Message list:",
-         gras_os_getpid(), xbt_dynar_length(msg_pd->msg_queue));
-    xbt_dynar_foreach(msg_pd->msg_queue, cpt, msg) {
-      XBT_WARN("   Message %s (%s) from %s@%s:%d", msg.type->name,
-            e_gras_msg_kind_names[msg.kind],
-            xbt_socket_peer_proc(msg.expe),
-            xbt_socket_peer_name(msg.expe),
-            xbt_socket_peer_port(msg.expe));
-    }
-  }
-
-  /* if each process has its sockets list, we need to close them when the
-     process finish */
-  xbt_dynar_foreach(sockets, cursor, sock_iter) {
-    XBT_VERB("Closing the socket %p left open on exit. Maybe a socket leak?",
-          sock_iter);
-    gras_socket_close(sock_iter);
-  }
-  if (!--(hd->refcount)) {
-    xbt_dynar_free(&hd->ports);
-    free(hd);
-  }
-  gras_procdata_exit();
-  free(pd);
-}
-
-/* **************************************************************************
- * Process data (public interface)
- * **************************************************************************/
-
-gras_procdata_t *gras_procdata_get(void)
-{
-  gras_procdata_t *pd =
-      (gras_procdata_t *) simcall_process_get_data(SIMIX_process_self());
-
-  xbt_assert(pd, "Run gras_process_init! (ie, gras_init)");
-
-  return pd;
-}
-
-void *gras_libdata_by_name_from_remote(const char *name, smx_process_t p)
-{
-  gras_procdata_t *pd = (gras_procdata_t *) simcall_process_get_data(p);
-
-  xbt_assert(pd,
-              "process '%s' on '%s' didn't run gras_process_init! (ie, gras_init)",
-              simcall_process_get_name(p),
-              simcall_host_get_name(simcall_process_get_host(p)));
-
-  return gras_libdata_by_name_from_procdata(name, pd);
-}
-
-/** @brief retrieve the value of a given process property (or NULL if not defined) */
-const char *gras_process_property_value(const char *name)
-{
-  return xbt_dict_get_or_null(simcall_process_get_properties
-                             (SIMIX_process_self()), name);
-}
-
-/** @brief retrieve the process properties dictionnary
- *  @warning it's the original one, not a copy. Don't mess with it
- */
-xbt_dict_t gras_process_properties(void)
-{
-  return simcall_process_get_properties(SIMIX_process_self());
-}
-
-/* **************************************************************************
- * OS virtualization function
- * **************************************************************************/
-
-
-int gras_os_getpid(void)
-{
-  gras_procdata_t *data;
-  data = (gras_procdata_t *) SIMIX_process_self_get_data(SIMIX_process_self());
-  if (data != NULL)
-    return data->pid;
-
-  return 0;
-}
-
-/** @brief retrieve the value of a given host property (or NULL if not defined) */
-const char *gras_os_host_property_value(const char *name)
-{
-  return
-      xbt_dict_get_or_null(simcall_host_get_properties
-                           (simcall_process_get_host(SIMIX_process_self())),
-                           name);
-}
-
-/** @brief retrieve the host properties dictionary
- *  @warning it's the original one, not a copy. Don't mess with it
- */
-xbt_dict_t gras_os_host_properties(void)
-{
-  return
-      simcall_host_get_properties(simcall_process_get_host
-                                (SIMIX_process_self()));
-}
-
-/* **************************************************************************
- * Interface with SIMIX
- * (these functions are called by the stuff generated by gras_stub_generator)
- * **************************************************************************/
-
-void gras_global_init(int *argc, char **argv)
-{
-  SIMIX_global_init(argc, argv);
-}
-
-void gras_create_environment(const char *file)
-{
-  SIMIX_create_environment(file);
-}
-
-void gras_function_register(const char *name, xbt_main_func_t code)
-{
-  SIMIX_function_register(name, code);
-}
-
-void gras_function_register_default(xbt_main_func_t code)
-{
-  SIMIX_function_register_default(code);
-}
-
-void gras_main()
-{
-  /* Clean IO before the run */
-  fflush(stdout);
-  fflush(stderr);
-  SIMIX_run();
-
-  return;
-}
-
-void gras_launch_application(const char *file)
-{
-  SIMIX_launch_application(file);
-}
-
-void gras_load_environment_script(const char *script_file)
-{
-#ifdef HAVE_LUA
-  lua_State *L = lua_open();
-  luaL_openlibs(L);
-
-  if (luaL_loadfile(L, script_file) || lua_pcall(L, 0, 0, 0)) {
-    printf("error: %s\n", lua_tostring(L, -1));
-    return;
-  }
-#else
-  xbt_die
-      ("Lua is not available!! to call gras_load_environment_script, lua should be available...");
-#endif
-  return;
-}
-
-void gras_clean(){ /* this function is not needed anymore and could be removed, but I feel so lazy */
-}
diff --git a/src/gras/Virtu/virtu_interface.h b/src/gras/Virtu/virtu_interface.h
deleted file mode 100644 (file)
index 8df85bc..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/* virtu[alization] - speciafic parts for each OS and for SG                */
-
-/* module's public interface exported within GRAS, but not to end user.     */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_VIRTU_INTERFACE_H
-#define GRAS_VIRTU_INTERFACE_H
-
-
-#include "xbt/function_types.h"
-#include "xbt/sysdep.h"
-#include "xbt/log.h"
-#include "xbt/set.h"
-#include "gras/virtu.h"
-#include "gras/process.h"
-
-SG_BEGIN_DECL()
-
-/* shutdown the module mechanism (world-wide cleanups) */
-void gras_moddata_exit(void);
-/* shutdown this process wrt module mecanism (process-wide cleanups) */
-void gras_moddata_leave(void);
-
-
-/* Perform the various intialisations needed by gras. Each process must run it */
-XBT_PUBLIC(void) gras_process_init(void);
-
-/* Frees the memory allocated by gras. Processes should run it */
-XBT_PUBLIC(void) gras_process_exit(void);
-
-
-/* This is the old interface (deprecated) */
-
-/* declare a new process specific data 
-   (used by gras_<module>_register to make sure that gras_process_init will create it) */
-int gras_procdata_add(const char *name, pvoid_f_void_t creator,
-                      void_f_pvoid_t destructor);
-
-void *gras_libdata_by_name(const char *name);
-void *gras_libdata_by_id(int id);
-
-SG_END_DECL()
-#endif                          /* GRAS_VIRTU_INTERFACE_H */
diff --git a/src/gras/Virtu/virtu_private.h b/src/gras/Virtu/virtu_private.h
deleted file mode 100644 (file)
index 462f500..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/* virtu[alization] - speciafic parts for each OS and for SG                */
-
-/* module's private interface.                                              */
-
-/* Copyright (c) 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-
-#ifndef GRAS_VIRTU_PRIVATE_H
-#define GRAS_VIRTU_PRIVATE_H
-
-#include "xbt/dynar.h"
-#include "gras/Virtu/virtu_interface.h"
-#include "simgrid/simix.h"
-#include "gras/Msg/msg_private.h"
-
-/** @brief Data for each process */
-typedef struct {
-  /* globals of the process */
-  void *userdata;
-
-  /* data specific to each process for each module. 
-   * Registered with gras_procdata_add(), retrieved with gras_libdata_get() 
-   * This is the old interface, and will disapear before 3.2
-   */
-  xbt_set_t libdata;
-
-  /* data specific to each process for each module. 
-   * Registered with gras_module_add(), retrieved with gras_moddata_get() 
-   * This is the new interface
-   */
-  xbt_dynar_t moddata;
-
-  int pid;                      /* pid of process, only for SG */
-  int ppid;                     /* ppid of process, only for SG */
-
-  gras_msg_listener_t listener; /* the thread in charge of the incoming communication for this process */
-} gras_procdata_t;
-
-gras_procdata_t *gras_procdata_get(void);
-void *gras_libdata_by_name_from_procdata(const char *name,
-                                         gras_procdata_t * pd);
-
-#endif                          /* GRAS_VIRTU_PRIVATE_H */
diff --git a/src/gras/Virtu/virtu_rl.h b/src/gras/Virtu/virtu_rl.h
deleted file mode 100644 (file)
index e402bc7..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/* virtu_rl - specific GRAS implementation for real life                    */
-
-/* Copyright (c) 2004, 2005, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef VIRTU_RL_H
-#define VIRTU_RL_H
-
-#include "gras/Virtu/virtu_private.h"
-
-#endif                          /* VIRTU_RL_H */
diff --git a/src/gras/Virtu/virtu_sg.h b/src/gras/Virtu/virtu_sg.h
deleted file mode 100644 (file)
index 7554d19..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/* virtu_sg - specific GRAS implementation for simulator                    */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef VIRTU_SG_H
-#define VIRTU_SG_H
-
-#include "gras/Virtu/virtu_private.h"
-#include "xbt/dynar.h"
-#include "simgrid/simix.h"        /* SimGrid header */
-#include "gras/Transport/transport_private.h"
-
-typedef struct {
-  int port;                     /* list of ports used by a server socket */
-  unsigned meas:1;              /* (boolean) the channel is for measurements or for messages */
-  smx_process_t server;
-  smx_rdv_t rdv;
-} s_gras_sg_portrec_t, *gras_sg_portrec_t;
-
-/* Data for each host */
-typedef struct {
-  int refcount;
-
-  xbt_dynar_t ports;
-
-} gras_hostdata_t;
-
-/* data for each socket (FIXME: find a better location for that) */
-typedef struct {
-  smx_process_t server;
-  smx_process_t client;
-
-  smx_rdv_t rdv_server;         /* The rendez-vous point to use */
-  smx_rdv_t rdv_client;         /* The rendez-vous point to use */
-  smx_action_t comm_recv;       /* The comm of irecv on receiver side */
-  gras_msg_t msg;               /* The destination buffer of the comm data */
-
-  int server_port;
-  int client_port;
-} s_gras_trp_sg_sock_data_t, *gras_trp_sg_sock_data_t;
-
-
-/** \brief Returns if I am on the server side of this socket (either server or listener of server) */
-/* FIXME make an im_the_server function in each socket plugin */
-int gras_socket_im_the_server(xbt_socket_t sock);
-
-
-void *gras_libdata_by_name_from_remote(const char *name, smx_process_t p);
-/* The same function by id would be really dangerous.
- * 
- * Indeed, it would rely on the fact that all process register libdatas in
- * the same order, which is wrong if they init amok modules in different
- * order.
- */
-
-#endif                          /* VIRTU_SG_H */
diff --git a/src/gras/gras.c b/src/gras/gras.c
deleted file mode 100644 (file)
index 9267a50..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-/* gras.c -- generic functions not fitting anywhere else                    */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/log.h"
-#include "xbt/virtu.h"          /* set the XBT virtualization to use GRAS */
-#include "xbt/module.h"         /* xbt_init/exit */
-#include "xbt/xbt_os_time.h"    /* xbt_os_time */
-#include "xbt/synchro.h"
-#include "xbt/socket.h"
-
-#include "Virtu/virtu_interface.h"      /* Module mechanism FIXME: deplace&rename */
-#include "Virtu/virtu_private.h"
-#include "gras_modinter.h"      /* module init/exit */
-#include "amok/amok_modinter.h" /* module init/exit */
-#include "xbt_modinter.h"       /* module init/exit */
-
-#include "gras.h"
-#include "gras/process.h"       /* FIXME: killme and put process_init in modinter */
-#include "gras/transport.h"
-#include "gras/Msg/msg_private.h"
-#include "portable.h"           /* hexa_*(); signalling stuff */
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(gras,
-                             "All GRAS categories (cf. section \\ref GRAS_API)");
-static int gras_running_process = 0;
-#if defined(HAVE_SIGNAL) && defined(HAVE_SIGNAL_H)
-static void gras_sigusr_handler(int sig)
-{
-  XBT_INFO("SIGUSR1 received. Display the backtrace");
-  xbt_backtrace_display_current();
-}
-
-static void gras_sigint_handler(int sig)
-{
-  static double lastone = 0;
-  if (lastone == 0 || xbt_os_time() - lastone > 5) {
-    if (gras_if_RL())
-      xbt_backtrace_display_current();
-    else
-      SIMIX_display_process_status();
-    fprintf(stderr,
-            "\nBacktrace displayed because Ctrl-C was pressed. Press again (within 5 sec) to abort the process.\n");
-    lastone = xbt_os_time();
-  } else {
-    exit(1);
-  }
-}
-#endif
-
-/**
- * @ingroup GRAS_API
- * \brief Initialize the gras mechanisms.
- */
-void gras_init(int *argc, char **argv)
-{
-  int first = 0;
-  gras_procdata_t *pd;
-  gras_msg_procdata_t msg_pd;
-
-  xbt_getpid = gras_os_getpid;
-  /* First initialize the XBT */
-  xbt_init(argc, argv);
-
-  XBT_VERB("Initialize GRAS");
-
-  /* module registrations:
-   *    - declare process specific data we need (without creating them)
-   */
-  if (gras_running_process == 0) {
-    first = 1;
-
-    if (!getenv("GRAS_NO_WARN_EXPERIMENTAL"))
-      XBT_WARN("GRAS is not well maintained anymore. We consider it to be experimental (and not stable anymore) since SimGrid 3.6. Sorry about it, please consider contributing to improve this situation");
-
-    gras_trp_register();
-    gras_msg_register();
-
-    xbt_trp_plugin_new("file", gras_trp_file_setup);
-    if (gras_if_SG()) {
-      xbt_trp_plugin_new("sg", gras_trp_sg_setup);
-    }
-    /* the TCP plugin (used in RL mode) is automatically loaded by XBT */
-  }
-  gras_running_process++;
-
-  /*
-   * Initialize the process specific stuff
-   */
-  gras_process_init();          /* calls procdata_init, which creates process specific data for each module */
-
-  /*
-   * Initialize the global stuff if it's not the first process created
-   */
-  if (first) {
-    gras_emul_init();
-    gras_msg_init();
-#if defined(HAVE_SIGNAL) && defined(HAVE_SIGNAL_H)
-# ifdef SIGUSR1
-    signal(SIGUSR1, gras_sigusr_handler);
-# endif
-    signal(SIGINT, gras_sigint_handler);
-#endif
-  }
-
-  /* and then init amok */
-  amok_init();
-
-  /* And finally, launch the listener thread */
-  pd = gras_procdata_get();
-  msg_pd = gras_libdata_by_name("gras_msg");
-  pd->listener = gras_msg_listener_launch(msg_pd->msg_received);
-}
-
-/**
- * @ingroup GRAS_API
- * @brief Finalize the gras mechanisms.
- * */
-void gras_exit(void)
-{
-  XBT_INFO("Exiting GRAS");
-  amok_exit();
-  gras_moddata_leave();
-  gras_msg_listener_shutdown();
-  gras_process_exit();
-  if (--gras_running_process == 0) {
-    gras_msg_exit();
-    gras_emul_exit();
-    gras_moddata_exit();
-  }
-}
-
-const char *hexa_str(unsigned char *data, int size, int downside)
-{
-  static char *buff = NULL;
-  static int buffsize = 0;
-  int i, pos = 0;
-  int begin, increment;
-
-  if (buffsize < 5 * (size + 1)) {
-    free(buff);
-    buffsize = 5 * (size + 1);
-    buff = xbt_malloc(buffsize);
-  }
-
-
-  if (downside) {
-    begin = size - 1;
-    increment = -1;
-  } else {
-    begin = 0;
-    increment = 1;
-  }
-
-  for (i = begin; 0 <= i && i < size; i += increment) {
-    if (data[i] < 32 || data[i] > 126)
-      sprintf(buff + pos, ".");
-    else
-      sprintf(buff + pos, "%c", data[i]);
-    while (buff[++pos]);
-  }
-  sprintf(buff + pos, "(");
-  while (buff[++pos]);
-  for (i = begin; 0 <= i && i < size; i += increment) {
-    sprintf(buff + pos, "%02x", data[i]);
-    while (buff[++pos]);
-  }
-  sprintf(buff + pos, ")");
-  while (buff[++pos]);
-  buff[pos] = '\0';
-  return buff;
-}
-
-void hexa_print(const char *name, unsigned char *data, int size)
-{
-  printf("%s: %s\n", name, hexa_str(data, size, 0));
-}
diff --git a/src/gras/rl_stubs.c b/src/gras/rl_stubs.c
deleted file mode 100644 (file)
index a9d5ddf..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/* rl_stubs.c -- empty body of functions used in SG, but harmful in RL       */
-
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt_modinter.h"
-#include "xbt/sysdep.h"
-#include "simgrid/simix.h"
-
-void SIMIX_display_process_status(void)
-{
-}
diff --git a/src/gras_modinter.h b/src/gras_modinter.h
deleted file mode 100644 (file)
index cbc2621..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/* gras_modinter.h - How to init/exit the GRAS modules                      */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_MODINTER_H
-#define GRAS_MODINTER_H
-#include <xbt/misc.h>           /* XBT_PUBLIC */
-
-/* modules initialization functions */
-void gras_emul_init(void);
-void gras_emul_exit(void);
-
-void gras_msg_register(void);
-void gras_msg_init(void);
-void gras_msg_exit(void);
-void gras_trp_register(void);
-
-void gras_procdata_init(void);
-void gras_procdata_exit(void);
-
-#endif                          /* GRAS_MODINTER_H */
index a31625a..d21613c 100644 (file)
@@ -18,12 +18,22 @@ typedef struct s_mc_transition *mc_transition_t;
 
 /*********** Structures for snapshot comparison **************************/
 
-typedef struct s_mc_ignore_region{
+typedef struct s_mc_heap_ignore_region{
   int block;
   int fragment;
   void *address;
   size_t size;
-}s_mc_ignore_region_t, *mc_ignore_region_t;
+}s_mc_heap_ignore_region_t, *mc_heap_ignore_region_t;
+
+typedef struct s_mc_stack_ignore_variable{
+  char *var_name;
+  char *frame;
+}s_mc_stack_ignore_variable_t, *mc_stack_ignore_variable_t;
+
+typedef struct s_mc_data_bss_ignore_variable{
+  void *address;
+  size_t size;
+}s_mc_data_bss_ignore_variable_t, *mc_data_bss_ignore_variable_t;
 
 typedef struct s_stack_region{
   void *address;
@@ -37,5 +47,8 @@ typedef struct s_heap_equality{
   void *address2;
 }s_heap_equality_t, *heap_equality_t;
 
+void heap_equality_free_voidp(void *e);
+void stack_region_free_voidp(void *s);
+
 SG_END_DECL()
 #endif                          /* _MC_MC_H */
index 920739d..ed3a990 100644 (file)
@@ -22,35 +22,38 @@ SG_BEGIN_DECL()
 
 extern char*_surf_mc_property_file; /* fixme: better location? */
 
-extern xbt_dynar_t mc_comparison_ignore;
+extern xbt_dynar_t mc_heap_comparison_ignore;
 extern xbt_dynar_t stacks_areas;
 
 /********************************* Global *************************************/
 void _mc_cfg_cb_reduce(const char *name, int pos);
 void _mc_cfg_cb_checkpoint(const char *name, int pos);
 void _mc_cfg_cb_property(const char *name, int pos);
+void _mc_cfg_cb_timeout(const char *name, int pos);
+void _mc_cfg_cb_max_depth(const char *name, int pos);
+void _mc_cfg_cb_visited(const char *name, int pos);
 
 XBT_PUBLIC(void) MC_do_the_modelcheck_for_real(void);
 
-XBT_PUBLIC(void) MC_init_safety(void);
+XBT_PUBLIC(void) MC_init(void);
 XBT_PUBLIC(void) MC_exit(void);
 XBT_PUBLIC(void) MC_exit_liveness(void);
-XBT_PUBLIC(void) MC_modelcheck(void);
+XBT_PUBLIC(void) MC_modelcheck_safety(void);
 XBT_PUBLIC(void) MC_modelcheck_liveness(void);
 XBT_PUBLIC(void) MC_process_clock_add(smx_process_t, double);
 XBT_PUBLIC(double) MC_process_clock_get(smx_process_t);
 void MC_automaton_load(const char *file);
 
-XBT_PUBLIC(void) MC_ignore(void *address, size_t size);
-void MC_new_stack_area(void *stack, char *name, void *context);
+/****************************** MC ignore **********************************/
+XBT_PUBLIC(void) MC_ignore_heap(void *address, size_t size);
+XBT_PUBLIC(void) MC_ignore_stack(const char *var_name, const char *frame);
+XBT_PUBLIC(void) MC_ignore_data_bss(void *address, size_t size);
+void MC_new_stack_area(void *stack, char *name, void *context, size_t size);
 
 /********************************* Memory *************************************/
 XBT_PUBLIC(void) MC_memory_init(void);  /* Initialize the memory subsystem */
 XBT_PUBLIC(void) MC_memory_exit(void);
 
-/********************************* Snapshot comparison test *************************************/
-void MC_test_heap_comparison(void);
-
 /* Trigger for state equality detection (check potential cycle in application) */
 void MC_compare(void);
 
index 691f238..63cff21 100644 (file)
@@ -13,8 +13,8 @@
 #include "xbt/RngStream.h"
 
 /* Module management functions */
-void sg_platf_init(void);
-void sg_platf_exit(void);
+XBT_PUBLIC(void) sg_platf_init(void);
+XBT_PUBLIC(void) sg_platf_exit(void);
 
 /* Managing the parsing callbacks */
 
@@ -42,43 +42,42 @@ typedef void (*sg_platf_mstorage_cb_t)(sg_platf_mstorage_cbarg_t);
 /* TUTORIAL: New TAG                         */
 
 typedef void (*sg_platf_gpu_cb_t)(sg_platf_gpu_cbarg_t);
-void sg_platf_gpu_add_cb(sg_platf_gpu_cb_t);
+XBT_PUBLIC(void) sg_platf_gpu_add_cb(sg_platf_gpu_cb_t);
 /* ***************************************** */
 
-
-void sg_platf_host_add_cb(sg_platf_host_cb_t);
-void sg_platf_host_link_add_cb(sg_platf_host_link_cb_t);
-void sg_platf_router_add_cb(sg_platf_router_cb_t);
-void sg_platf_link_add_cb(sg_platf_link_cb_t);
-void sg_platf_peer_add_cb(sg_platf_peer_cb_t fct);
-void sg_platf_cluster_add_cb(sg_platf_cluster_cb_t fct);
-void sg_platf_cabinet_add_cb(sg_platf_cabinet_cb_t fct);
-void sg_platf_postparse_add_cb(void_f_void_t fct);
-void sg_platf_AS_begin_add_cb(sg_platf_AS_cb_t fct);
-void sg_platf_AS_end_add_cb(sg_platf_AS_cb_t fct);
-void sg_platf_prop_add_cb(sg_platf_prop_cb_t fct);
-
-void sg_platf_route_add_cb(sg_platf_route_cb_t);
-void sg_platf_ASroute_add_cb(sg_platf_route_cb_t);
-void sg_platf_bypassRoute_add_cb(sg_platf_route_cb_t);
-void sg_platf_bypassASroute_add_cb(sg_platf_route_cb_t);
-
-void sg_platf_trace_add_cb(sg_platf_trace_cb_t);
-void sg_platf_trace_connect_add_cb(sg_platf_trace_connect_cb_t);
-
-void sg_platf_storage_add_cb(sg_platf_storage_cb_t fct);
-void sg_platf_mstorage_add_cb(sg_platf_mstorage_cb_t fct);
-void sg_platf_storage_type_add_cb(sg_platf_storage_type_cb_t fct);
-void sg_platf_mount_add_cb(sg_platf_mount_cb_t fct);
+XBT_PUBLIC(void) sg_platf_host_add_cb(sg_platf_host_cb_t);
+XBT_PUBLIC(void) sg_platf_host_link_add_cb(sg_platf_host_link_cb_t);
+XBT_PUBLIC(void) sg_platf_router_add_cb(sg_platf_router_cb_t);
+XBT_PUBLIC(void) sg_platf_link_add_cb(sg_platf_link_cb_t);
+XBT_PUBLIC(void) sg_platf_peer_add_cb(sg_platf_peer_cb_t fct);
+XBT_PUBLIC(void) sg_platf_cluster_add_cb(sg_platf_cluster_cb_t fct);
+XBT_PUBLIC(void) sg_platf_cabinet_add_cb(sg_platf_cabinet_cb_t fct);
+XBT_PUBLIC(void) sg_platf_postparse_add_cb(void_f_void_t fct);
+XBT_PUBLIC(void) sg_platf_AS_begin_add_cb(sg_platf_AS_cb_t fct);
+XBT_PUBLIC(void) sg_platf_AS_end_add_cb(sg_platf_AS_cb_t fct);
+XBT_PUBLIC(void) sg_platf_prop_add_cb(sg_platf_prop_cb_t fct);
+
+XBT_PUBLIC(void) sg_platf_route_add_cb(sg_platf_route_cb_t);
+XBT_PUBLIC(void) sg_platf_ASroute_add_cb(sg_platf_route_cb_t);
+XBT_PUBLIC(void) sg_platf_bypassRoute_add_cb(sg_platf_route_cb_t);
+XBT_PUBLIC(void) sg_platf_bypassASroute_add_cb(sg_platf_route_cb_t);
+
+XBT_PUBLIC(void) sg_platf_trace_add_cb(sg_platf_trace_cb_t);
+XBT_PUBLIC(void) sg_platf_trace_connect_add_cb(sg_platf_trace_connect_cb_t);
+
+XBT_PUBLIC(void) sg_platf_storage_add_cb(sg_platf_storage_cb_t fct);
+XBT_PUBLIC(void) sg_platf_mstorage_add_cb(sg_platf_mstorage_cb_t fct);
+XBT_PUBLIC(void) sg_platf_storage_type_add_cb(sg_platf_storage_type_cb_t fct);
+XBT_PUBLIC(void) sg_platf_mount_add_cb(sg_platf_mount_cb_t fct);
 
 /** \brief Pick the right models for CPU, net and workstation, and call their model_init_preparse
  *
  * Must be called within parsing/creating the environment (after the <config>s, if any, and before <AS> or friends such as <cluster>)
  */
-void surf_config_models_setup(void);
+XBT_PUBLIC(void) surf_config_models_setup(void);
 
 /* RngStream management functions */
-void sg_platf_rng_stream_init(unsigned long seed[6]);
-RngStream sg_platf_rng_stream_get(const char* id);
+XBT_PUBLIC(void) sg_platf_rng_stream_init(unsigned long seed[6]);
+XBT_PUBLIC(RngStream) sg_platf_rng_stream_get(const char* id);
 
 #endif                          /* SG_PLATF_INTERFACE_H */
index 9fd51c0..5445c62 100644 (file)
@@ -46,7 +46,7 @@ XBT_PUBLIC(lmm_variable_t) lmm_variable_new(lmm_system_t sys, void *id,
                                             double weight_value,
                                             double bound,
                                             int number_of_constraints);
-void lmm_variable_free(lmm_system_t sys, lmm_variable_t var);
+XBT_PUBLIC(void) lmm_variable_free(lmm_system_t sys, lmm_variable_t var);
 XBT_PUBLIC(double) lmm_variable_getvalue(lmm_variable_t var);
 XBT_PUBLIC(double) lmm_variable_getbound(lmm_variable_t var);
 
index 2790a3d..f5de074 100644 (file)
@@ -673,6 +673,11 @@ XBT_PUBLIC_DATA(xbt_dynar_t) model_list;
 /*** SURF Globals **************************/
 /*******************************************/
 XBT_PUBLIC_DATA(xbt_cfg_t) _surf_cfg_set;
+XBT_PUBLIC(int) surf_cfg_get_int(const char* name);
+XBT_PUBLIC(double) surf_cfg_get_double(const char* name);
+XBT_PUBLIC(char*) surf_cfg_get_string(const char* name);
+XBT_PUBLIC(void) surf_cfg_get_peer(const char *name, char **peer, int *port);
+XBT_PUBLIC(xbt_dynar_t) surf_cfg_get_dynar(const char* name);
 
 /** \ingroup SURF_simulation
  *  \brief Initialize SURF
index 3498cec..a86bcdd 100644 (file)
@@ -15,8 +15,7 @@
 /** @brief get time in seconds 
 
   * gives  the  number  of  seconds since the Epoch (00:00:00 UTC, January 1, 1970).
-  * Most users should use gras_os_time and should not use this function unless 
-    they really know what they are doing. */
+  */
 XBT_PUBLIC(double) xbt_os_time(void);
 XBT_PUBLIC(void) xbt_os_sleep(double sec);
 
index 510dd55..268c643 100644 (file)
@@ -14,6 +14,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_config, instr, "Configuration");
 
 #define OPT_TRACING               "tracing"
 #define OPT_TRACING_PLATFORM      "tracing/platform"
+#define OPT_TRACING_TOPOLOGY      "tracing/platform/topology"
 #define OPT_TRACING_SMPI          "tracing/smpi"
 #define OPT_TRACING_SMPI_GROUP    "tracing/smpi/group"
 #define OPT_TRACING_SMPI_COMPUTING "tracing/smpi/computing"
@@ -28,13 +29,12 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_config, instr, "Configuration");
 #define OPT_TRACING_BASIC         "tracing/basic"
 #define OPT_TRACING_COMMENT       "tracing/comment"
 #define OPT_TRACING_COMMENT_FILE  "tracing/comment_file"
-#define OPT_TRIVA_UNCAT_CONF      "triva/uncategorized"
-#define OPT_TRIVA_CAT_CONF        "triva/categorized"
 #define OPT_VIVA_UNCAT_CONF      "viva/uncategorized"
 #define OPT_VIVA_CAT_CONF        "viva/categorized"
 
 static int trace_enabled;
 static int trace_platform;
+static int trace_platform_topology;
 static int trace_smpi_enabled;
 static int trace_smpi_grouped;
 static int trace_smpi_computing;
@@ -54,6 +54,7 @@ static void TRACE_getopts(void)
 {
   trace_enabled = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING);
   trace_platform = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_PLATFORM);
+  trace_platform_topology = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_TOPOLOGY);
   trace_smpi_enabled = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_SMPI);
   trace_smpi_grouped = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_SMPI_GROUP);
   trace_smpi_computing = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_SMPI_COMPUTING);
@@ -106,8 +107,6 @@ int TRACE_end()
   if (!trace_active)
     return 1;
 
-  TRACE_generate_triva_uncat_conf();
-  TRACE_generate_triva_cat_conf();
   TRACE_generate_viva_uncat_conf();
   TRACE_generate_viva_cat_conf();
 
@@ -159,6 +158,11 @@ int TRACE_platform(void)
   return trace_platform;
 }
 
+int TRACE_platform_topology(void)
+{
+  return trace_platform_topology;
+}
+
 int TRACE_is_configured(void)
 {
   return trace_configured;
@@ -237,16 +241,6 @@ char *TRACE_get_filename(void)
   return xbt_cfg_get_string(_surf_cfg_set, OPT_TRACING_FILENAME);
 }
 
-char *TRACE_get_triva_uncat_conf (void)
-{
-  return xbt_cfg_get_string(_surf_cfg_set, OPT_TRIVA_UNCAT_CONF);
-}
-
-char *TRACE_get_triva_cat_conf (void)
-{
-  return xbt_cfg_get_string(_surf_cfg_set, OPT_TRIVA_CAT_CONF);
-}
-
 char *TRACE_get_viva_uncat_conf (void)
 {
   return xbt_cfg_get_string(_surf_cfg_set, OPT_VIVA_UNCAT_CONF);
@@ -276,10 +270,17 @@ void TRACE_global_init(int *argc, char **argv)
   /* register platform in the trace */
   int default_tracing_platform = 0;
   xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_PLATFORM,
-                   "Register the platform in the trace as a graph.",
+                   "Register the platform in the trace as a hierarchy.",
                    xbt_cfgelm_int, &default_tracing_platform, 0, 1,
                    NULL, NULL);
 
+  /* register platform in the trace */
+  int default_tracing_platform_topology = 1;
+  xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_TOPOLOGY,
+                   "Register the platform topology in the trace as a graph.",
+                   xbt_cfgelm_int, &default_tracing_platform_topology, 0, 1,
+                   NULL, NULL);
+
   /* smpi */
   int default_tracing_smpi = 0;
   xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_SMPI,
@@ -371,20 +372,6 @@ void TRACE_global_init(int *argc, char **argv)
                    xbt_cfgelm_string, &default_tracing_comment_file, 1, 1,
                    NULL, NULL);
 
-  /* Triva graph configuration for uncategorized tracing */
-  char *default_triva_uncat_conf_file = xbt_strdup ("");
-  xbt_cfg_register(&_surf_cfg_set, OPT_TRIVA_UNCAT_CONF,
-                   "Triva Graph configuration file for uncategorized resource utilization traces.",
-                   xbt_cfgelm_string, &default_triva_uncat_conf_file, 1, 1,
-                   NULL, NULL);
-
-  /* Triva graph configuration for uncategorized tracing */
-  char *default_triva_cat_conf_file = xbt_strdup ("");
-  xbt_cfg_register(&_surf_cfg_set, OPT_TRIVA_CAT_CONF,
-                   "Triva Graph configuration file for categorized resource utilization traces.",
-                   xbt_cfgelm_string, &default_triva_cat_conf_file, 1, 1,
-                   NULL, NULL);
-
   /* Viva graph configuration for uncategorized tracing */
   char *default_viva_uncat_conf_file = xbt_strdup ("");
   xbt_cfg_register(&_surf_cfg_set, OPT_VIVA_UNCAT_CONF,
@@ -434,9 +421,10 @@ void TRACE_help (int detailed)
       detailed);
   print_line (OPT_TRACING_FILENAME, "Filename to register traces",
       "  A file with this name will be created to register the simulation. The file\n"
-      "  is in the Paje format and can be analyzed using Triva or Paje visualization\n"
+      "  is in the Paje format and can be analyzed using Viva, Paje, and PajeNG visualization\n"
       "  tools. More information can be found in these webpages:\n"
-      "     http://triva.gforge.inria.fr/\n"
+      "     http://github.com/schnorr/viva/\n"
+      "     http://github.com/schnorr/pajeng/\n"
       "     http://paje.sourceforge.net/",
       detailed);
   print_line (OPT_TRACING_SMPI, "Trace the MPI Interface (SMPI)",
@@ -489,20 +477,6 @@ void TRACE_help (int detailed)
   print_line (OPT_TRACING_COMMENT_FILE, "File contents added to trace file as comment.",
       "  Use this to add the contents of a file to the top of the trace file as comment.",
       detailed);
-  print_line (OPT_TRIVA_UNCAT_CONF, "Generate graph configuration for Triva",
-      "  This option can be used in all types of simulators build with SimGrid\n"
-      "  to generate a uncategorized resource utilization graph to be used as\n"
-      "  configuration for the Triva visualization analysis. This option\n"
-      "  can be used with tracing/categorized:1 and tracing:1 options to\n"
-      "  analyze an unmodified simulator before changing it to contain\n"
-      "  categories.",
-      detailed);
-  print_line (OPT_TRIVA_CAT_CONF, "generate uncategorized graph configuration for Triva",
-      "  This option can be used if this simulator uses tracing categories\n"
-      "  in its code. The file specified by this option holds a graph configuration\n"
-      "  file for the Triva visualization tool that can be used to analyze a categorized\n"
-      "  resource utilization.",
-      detailed);
   print_line (OPT_VIVA_UNCAT_CONF, "Generate a graph configuration for Viva",
       "  This option can be used in all types of simulators build with SimGrid\n"
       "  to generate a uncategorized resource utilization graph to be used as\n"
@@ -517,6 +491,12 @@ void TRACE_help (int detailed)
       "  file for the Viva visualization tool that can be used to analyze a categorized\n"
       "  resource utilization.",
       detailed);
+  print_line (OPT_TRACING_TOPOLOGY, "Register the platform topology as a graph",
+        "  This option (enabled by default) can be used to disable the tracing of\n"
+        "  the platform topology in the trace file. Sometimes, such task is really\n"
+        "  time consuming, since it must get the route from each host ot other hosts\n"
+        "  within the same Autonomous System (AS).",
+        detailed);
 }
 
 static void output_types (const char *name, xbt_dynar_t types, FILE *file)
@@ -634,16 +614,6 @@ static void generate_cat_configuration (const char *output, const char *name, in
   }
 }
 
-void TRACE_generate_triva_uncat_conf (void)
-{
-  generate_uncat_configuration (TRACE_get_triva_uncat_conf (), "triva", 1);
-}
-
-void TRACE_generate_triva_cat_conf (void)
-{
-  generate_cat_configuration (TRACE_get_triva_cat_conf(), "triva", 1);
-}
-
 void TRACE_generate_viva_uncat_conf (void)
 {
   generate_uncat_configuration (TRACE_get_viva_uncat_conf (), "viva", 0);
@@ -687,6 +657,7 @@ void instr_resume_tracing (void)
 
 #undef OPT_TRACING
 #undef OPT_TRACING_PLATFORM
+#undef OPT_TRACING_TOPOLOGY
 #undef OPT_TRACING_SMPI
 #undef OPT_TRACING_SMPI_GROUP
 #undef OPT_TRACING_CATEGORIZED
@@ -699,8 +670,6 @@ void instr_resume_tracing (void)
 #undef OPT_TRACING_BASIC
 #undef OPT_TRACING_COMMENT
 #undef OPT_TRACING_COMMENT_FILE
-#undef OPT_TRIVA_UNCAT_CONF
-#undef OPT_TRIVA_CAT_CONF
 #undef OPT_VIVA_UNCAT_CONF
 #undef OPT_VIVA_CAT_CONF
 
index a2d8901..29d321b 100644 (file)
@@ -5,6 +5,7 @@
   * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
+#include "mc/mc.h"
 
 #ifdef HAVE_TRACING
 
@@ -28,6 +29,10 @@ void TRACE_msg_process_change_host(msg_process_t process, msg_host_t old_host, m
 {
   if (TRACE_msg_process_is_enabled()){
     static long long int counter = 0;
+
+    if(MC_is_active())
+      MC_ignore_data_bss(&counter, sizeof(counter));
+
     char key[INSTR_DEFAULT_STR_SIZE];
     snprintf (key, INSTR_DEFAULT_STR_SIZE, "%lld", counter++);
 
index 75b05ba..39da9d7 100644 (file)
@@ -5,6 +5,7 @@
   * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
+#include "mc/mc.h"
 
 #ifdef HAVE_TRACING
 
@@ -34,6 +35,12 @@ void TRACE_msg_task_create(msg_task_t task)
   static long long counter = 0;
   task->counter = counter++;
   task->category = NULL;
+  
+  if(MC_is_active()){
+    MC_ignore_data_bss(&counter, sizeof(counter));
+    MC_ignore_heap(&(task->counter), sizeof(task->counter));
+  }
+
   XBT_DEBUG("CREATE %p, %lld", task, task->counter);
 }
 
index 04110ab..555ac02 100644 (file)
@@ -5,6 +5,7 @@
   * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
+#include "xbt/virtu.h" /* sg_cmdline */
 
 #ifdef HAVE_TRACING
 
@@ -181,7 +182,7 @@ void TRACE_paje_start(void)
   fprintf (tracing_file, "#[");
   unsigned int cpt;
   char *str;
-  xbt_dynar_foreach (sg_cmdline, cpt, str){
+  xbt_dynar_foreach (xbt_cmdline, cpt, str){
     fprintf(tracing_file, "%s ",str);
   }
   fprintf (tracing_file, "]\n");
index fa969a3..f746bbc 100644 (file)
@@ -200,6 +200,7 @@ int TRACE_end (void);
 int TRACE_needs_platform (void);
 int TRACE_is_enabled(void);
 int TRACE_platform(void);
+int TRACE_platform_topology(void);
 int TRACE_is_configured(void);
 int TRACE_smpi_is_enabled(void);
 int TRACE_smpi_is_grouped(void);
@@ -214,14 +215,10 @@ int TRACE_basic (void);
 char *TRACE_get_comment (void);
 char *TRACE_get_comment_file (void);
 char *TRACE_get_filename(void);
-char *TRACE_get_triva_uncat_conf (void);
-char *TRACE_get_triva_cat_conf (void);
 char *TRACE_get_viva_uncat_conf (void);
 char *TRACE_get_viva_cat_conf (void);
 void TRACE_global_init(int *argc, char **argv);
 void TRACE_help(int detailed);
-void TRACE_generate_triva_uncat_conf (void);
-void TRACE_generate_triva_cat_conf (void);
 void TRACE_generate_viva_uncat_conf (void);
 void TRACE_generate_viva_cat_conf (void);
 void instr_pause_tracing (void);
index 2261801..36ef196 100644 (file)
@@ -5,6 +5,7 @@
   * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
+#include "mc/mc.h"
 
 #ifdef HAVE_TRACING
 #include "surf/surf_private.h"
@@ -117,10 +118,14 @@ static void linkContainers (container_t src, container_t dst, xbt_dict_t filter)
 
   //create the link
   static long long counter = 0;
+
+  if(MC_is_active())
+    MC_ignore_data_bss(&counter, sizeof(counter));
+
   char key[INSTR_DEFAULT_STR_SIZE];
   snprintf (key, INSTR_DEFAULT_STR_SIZE, "%lld", counter++);
-  new_pajeStartLink(SIMIX_get_clock(), father, link_type, src, "G", key);
-  new_pajeEndLink(SIMIX_get_clock(), father, link_type, dst, "G", key);
+  new_pajeStartLink(SIMIX_get_clock(), father, link_type, src, "topology", key);
+  new_pajeEndLink(SIMIX_get_clock(), father, link_type, dst, "topology", key);
 
   XBT_DEBUG ("  linkContainers %s <-> %s", src->name, dst->name);
 }
@@ -139,6 +144,10 @@ static int graph_extraction_filter_out (container_t c1, container_t c2)
 
 static void recursiveGraphExtraction (AS_t rc, container_t container, xbt_dict_t filter)
 {
+  if (!TRACE_platform_topology()){
+    XBT_DEBUG("Graph extracing disable by user.");
+    return;
+  }
   XBT_DEBUG ("Graph extraction for routing_component = %s", rc->name);
   if (!xbt_dict_is_empty(rc->routing_sons)){
     xbt_dict_cursor_t cursor = NULL;
index 65086bd..cd30016 100644 (file)
@@ -5,6 +5,7 @@
   * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
+#include "mc/mc.h"
 #include <ctype.h>
 #include <wchar.h>
 
@@ -87,6 +88,10 @@ static char *TRACE_smpi_put_key(int src, int dst, char *key, int n)
   }
   //generate the key
   static unsigned long long counter = 0;
+  
+  if(MC_is_active())
+    MC_ignore_data_bss(&counter, sizeof(counter));
+
   snprintf(key, n, "%d_%d_%llu", src, dst, counter++);
 
   //push it
index 112ffd8..5c094fb 100644 (file)
@@ -18,8 +18,10 @@ void *start_text_libsimgrid;
 void *start_plt_libsimgrid, *end_plt_libsimgrid;
 void *start_plt_binary, *end_plt_binary;
 char *libsimgrid_path;
-void *start_data_libsimgrid;
+void *start_data_libsimgrid, *start_bss_libsimgrid;
+void *start_data_binary, *start_bss_binary;
 void *start_text_binary;
+void *end_raw_heap;
 
 static mc_mem_region_t MC_region_new(int type, void *start_addr, size_t size);
 static void MC_region_restore(mc_mem_region_t reg);
@@ -33,6 +35,8 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap)
 static void print_local_variables_values(xbt_dynar_t all_variables);
 static void *get_stack_pointer(void *stack_context, void *heap);
 
+static void snapshot_stack_free(mc_snapshot_stack_t s);
+
 static mc_mem_region_t MC_region_new(int type, void *start_addr, size_t size)
 {
   mc_mem_region_t new_reg = xbt_new0(s_mc_mem_region_t, 1);
@@ -72,46 +76,110 @@ static void MC_snapshot_add_region(mc_snapshot_t snapshot, int type, void *start
   return;
 } 
 
-void MC_take_snapshot(mc_snapshot_t snapshot)
-{
+/* void MC_take_snapshot(mc_snapshot_t snapshot) */
+/* { */
+/*   unsigned int i = 0; */
+/*   s_map_region_t reg; */
+/*   memory_map_t maps = get_memory_map(); */
+
+/*   /\* Save the std heap and the writable mapped pages of libsimgrid *\/ */
+/*   while (i < maps->mapsize) { */
+/*     reg = maps->regions[i]; */
+/*     if ((reg.prot & PROT_WRITE)){ */
+/*       if (maps->regions[i].pathname == NULL){ */
+/*         if (reg.start_addr == std_heap){ // only save the std heap (and not the raw one) */
+/*           MC_snapshot_add_region(snapshot, 0, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr); */
+/*         } */
+/*         i++; */
+/*       } else { */
+/*         if (!memcmp(basename(maps->regions[i].pathname), "libsimgrid", 10)){ */
+/*           MC_snapshot_add_region(snapshot, 1, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr); */
+/*           i++; */
+/*           reg = maps->regions[i]; */
+/*           while(reg.pathname == NULL && (reg.prot & PROT_WRITE) && i < maps->mapsize){ */
+/*             MC_snapshot_add_region(snapshot, 1, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr); */
+/*             i++; */
+/*             reg = maps->regions[i]; */
+/*           } */
+/*         }else{ */
+/*           i++; */
+/*         }  */
+/*       } */
+/*     }else{ */
+/*       i++; */
+/*     } */
+/*   } */
+
+/*   free_memory_map(maps); */
+/* } */
+
+void MC_init_memory_map_info(){
+
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+
+  MC_SET_RAW_MEM;
+  
   unsigned int i = 0;
   s_map_region_t reg;
   memory_map_t maps = get_memory_map();
 
-  /* Save the std heap and the writable mapped pages of libsimgrid */
   while (i < maps->mapsize) {
     reg = maps->regions[i];
     if ((reg.prot & PROT_WRITE)){
       if (maps->regions[i].pathname == NULL){
-        if (reg.start_addr == std_heap){ // only save the std heap (and not the raw one)
-          MC_snapshot_add_region(snapshot, 0, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr);
+        if(reg.start_addr == raw_heap){
+          end_raw_heap = reg.end_addr;
         }
-        i++;
       } else {
         if (!memcmp(basename(maps->regions[i].pathname), "libsimgrid", 10)){
-          MC_snapshot_add_region(snapshot, 1, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr);
+          start_data_libsimgrid = reg.start_addr;
           i++;
           reg = maps->regions[i];
-          while(reg.pathname == NULL && (reg.prot & PROT_WRITE) && i < maps->mapsize){
-            MC_snapshot_add_region(snapshot, 1, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr);
+          if(reg.pathname == NULL && (reg.prot & PROT_WRITE) && i < maps->mapsize)
+            start_bss_libsimgrid = reg.start_addr;
+        }else if (!memcmp(basename(maps->regions[i].pathname), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){
+          start_data_binary = reg.start_addr;
+          i++;
+          reg = maps->regions[i];
+          if(reg.pathname == NULL && (reg.prot & PROT_WRITE) && reg.start_addr != std_heap && reg.start_addr != raw_heap && i < maps->mapsize){
+            start_bss_binary = reg.start_addr;
             i++;
-            reg = maps->regions[i];
           }
+        }
+      }
+    }else if ((reg.prot & PROT_READ)){
+      if (maps->regions[i].pathname != NULL){
+        if (!memcmp(basename(maps->regions[i].pathname), "libsimgrid", 10)){
+          start_text_libsimgrid = reg.start_addr;
+          libsimgrid_path = strdup(maps->regions[i].pathname);
         }else{
-          i++;
-        } 
+          if (!memcmp(basename(maps->regions[i].pathname), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){
+            start_text_binary = reg.start_addr;
+          }
+        }
       }
-    }else{
-      i++;
     }
+    i++;
   }
-
+  
   free_memory_map(maps);
+
+  MC_UNSET_RAW_MEM;
+
+  if(raw_mem_set)
+    MC_SET_RAW_MEM;
+
 }
 
-void MC_take_snapshot_liveness(mc_snapshot_t snapshot)
+mc_snapshot_t MC_take_snapshot()
 {
 
+  int raw_mem = (mmalloc_get_current_heap() == raw_heap);
+  
+  MC_SET_RAW_MEM;
+
+  mc_snapshot_t snapshot = xbt_new0(s_mc_snapshot_t, 1);
+
   unsigned int i = 0;
   s_map_region_t reg;
   memory_map_t maps = get_memory_map();
@@ -127,6 +195,8 @@ void MC_take_snapshot_liveness(mc_snapshot_t snapshot)
           MC_snapshot_add_region(snapshot, 0, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr);
           heap = snapshot->regions[nb_reg]->data;
           nb_reg++;
+        }else if(reg.start_addr == raw_heap){
+          end_raw_heap = reg.end_addr;
         }
         i++;
       } else {
@@ -136,18 +206,26 @@ void MC_take_snapshot_liveness(mc_snapshot_t snapshot)
           nb_reg++;
           i++;
           reg = maps->regions[i];
-          while(reg.pathname == NULL && (reg.prot & PROT_WRITE) && i < maps->mapsize){
+          if(reg.pathname == NULL && (reg.prot & PROT_WRITE) && i < maps->mapsize){
             MC_snapshot_add_region(snapshot, 1, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr);
-            i++;
             reg = maps->regions[i];
+            i++;
             nb_reg++;
           }
         } else {
           if (!memcmp(basename(maps->regions[i].pathname), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){
             MC_snapshot_add_region(snapshot, 2, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr);
             nb_reg++;
+            i++;
+            reg = maps->regions[i];
+            if(reg.pathname == NULL && (reg.prot & PROT_WRITE) && reg.start_addr != std_heap && reg.start_addr != raw_heap && i < maps->mapsize){
+              MC_snapshot_add_region(snapshot, 2, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr);
+              reg = maps->regions[i];
+              nb_reg++;
+            }
+          }else{
+            i++;
           }
-          i++;
         }
       }
     }else if ((reg.prot & PROT_READ)){
@@ -167,10 +245,18 @@ void MC_take_snapshot_liveness(mc_snapshot_t snapshot)
     }
   }
 
-  snapshot->stacks = take_snapshot_stacks(heap);
+  if(_surf_mc_visited > 0 || strcmp(_surf_mc_property_file,""))
+    snapshot->stacks = take_snapshot_stacks(heap);
   
   free_memory_map(maps);
 
+  MC_UNSET_RAW_MEM;
+
+  if(raw_mem)
+    MC_SET_RAW_MEM;
+
+  return snapshot;
+
 }
 
 void MC_restore_snapshot(mc_snapshot_t snapshot)
@@ -188,6 +274,7 @@ void MC_free_snapshot(mc_snapshot_t snapshot)
   for(i=0; i < snapshot->num_reg; i++)
     MC_region_destroy(snapshot->regions[i]);
 
+  xbt_dynar_free(&(snapshot->stacks));
   xbt_free(snapshot);
 }
 
@@ -203,12 +290,17 @@ void get_libsimgrid_plt_section(){
   int i, plt_not_found = 1;
   unsigned long int size, offset;
 
-  char *command = bprintf( "objdump --section-headers %s", libsimgrid_path);
+  if(libsimgrid_path == NULL)
+    libsimgrid_path = get_libsimgrid_path();
+
+  char *command = bprintf("objdump --section-headers %s", libsimgrid_path);
 
   fp = popen(command, "r");
 
-  if(fp == NULL)
+  if(fp == NULL){
     perror("popen failed");
+    xbt_abort();
+  }
 
   while ((read = getline(&line, &n, fp)) != -1 && plt_not_found == 1) {
 
@@ -223,7 +315,7 @@ void get_libsimgrid_plt_section(){
     if(lfields[0] == NULL)
       continue;
 
-    if(strcmp(lfields[0], "Sections:") == 0 || strcmp(lfields[0], "Idx") == 0 || strcmp(lfields[0], "libsimgrid.so:") == 0)
+    if(strcmp(lfields[0], "Sections:") == 0 || strcmp(lfields[0], "Idx") == 0 || strncmp(lfields[0], libsimgrid_path, strlen(libsimgrid_path)) == 0)
       continue;
 
     for (i = 1; i < 7 && lfields[i - 1] != NULL; i++) {
@@ -240,7 +332,6 @@ void get_libsimgrid_plt_section(){
       }
     }
     
-    
   }
 
   free(command);
@@ -264,8 +355,10 @@ void get_binary_plt_section(){
 
   fp = popen(command, "r");
 
-  if(fp == NULL)
+  if(fp == NULL){
     perror("popen failed");
+    xbt_abort();
+  }
 
   while ((read = getline(&line, &n, fp)) != -1 && plt_not_found == 1) {
 
@@ -280,7 +373,7 @@ void get_binary_plt_section(){
     if(lfields[0] == NULL)
       continue;
 
-    if(strcmp(lfields[0], "Sections:") == 0 || strcmp(lfields[0], "Idx") == 0 || strcmp(lfields[0], basename(xbt_binary_name)) == 0)
+    if(strcmp(lfields[0], "Sections:") == 0 || strcmp(lfields[0], "Idx") == 0 || strncmp(lfields[0], basename(xbt_binary_name), strlen(xbt_binary_name)) == 0)
       continue;
 
     for (i = 1; i < 7 && lfields[i - 1] != NULL; i++) {
@@ -327,7 +420,7 @@ static xbt_dynar_t take_snapshot_stacks(void *heap){
   xbt_dynar_foreach(stacks_areas, cursor1, current_stack){
     mc_snapshot_stack_t st = xbt_new(s_mc_snapshot_stack_t, 1);
     st->local_variables = get_local_variables_values(current_stack->context, heap);
-    st->stack_pointer = get_stack_pointer(current_stack, heap);
+    st->stack_pointer = get_stack_pointer(current_stack->context, heap);
     xbt_dynar_push(res, &st);
   }
 
@@ -359,7 +452,7 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap)
   int ret;
   //char *stack_name;
 
-  char buf[512], frame_name[256];
+  char frame_name[256];
   
   ret = unw_init_local(&c, (unw_context_t *)stack_context);
   if(ret < 0){
@@ -391,16 +484,9 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap)
     unw_get_reg(&c, UNW_REG_IP, &ip);
     unw_get_reg(&c, UNW_REG_SP, &sp);
 
-    buf[0] = '\0';
-    if (unw_get_proc_name (&c, frame_name, sizeof (frame_name), &off) == 0){
-      if (off)
-        snprintf (buf, sizeof (buf), "<%s+0x%lx>", frame_name, (long) off);
-      else
-        snprintf (buf, sizeof (buf), "<%s>", frame_name);
+    unw_get_proc_name (&c, frame_name, sizeof (frame_name), &off);
 
-    }
-
-    xbt_strbuff_append(variables, bprintf("ip=%-32s\n", buf));
+    xbt_strbuff_append(variables, bprintf("ip=%s\n", frame_name));
 
     frame = xbt_dict_get_or_null(mc_local_variables, frame_name);
 
@@ -491,16 +577,17 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap)
           }
           
           if(xbt_dynar_length(compose) > 0){
+            //XBT_INFO("Variable : %s", current_variable->name);
             if(strcmp(xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->type, "value") == 0){
               //XBT_INFO("Variable : %s - value : %lx", current_variable->name, xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.res);
               xbt_strbuff_append(variables, bprintf("%s=%lx\n", current_variable->name, xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.res));
             }else{
-              if(*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address) == NULL){
+              if((long)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address < 0 || *((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address) == NULL){
                 //XBT_INFO("Variable : %s - address : NULL", current_variable->name);
                 xbt_strbuff_append(variables, bprintf("%s=NULL\n", current_variable->name));
               }else if(((long)*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address) > 0xffffffff) || ((long)*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address) < (long)start_text_binary)){
                 //XBT_INFO("Variable : %s - value : %zd", current_variable->name, (size_t)*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address));
-                xbt_strbuff_append(variables, bprintf("%s=%zd\n", current_variable->name, (size_t)*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address)));
+                xbt_strbuff_append(variables, bprintf("%s=%d\n", current_variable->name, (int)(long)*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address)));
               }else{
                 //XBT_INFO("Variable : %s - address : %p", current_variable->name, *((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address));  
                 xbt_strbuff_append(variables, bprintf("%s=%p\n", current_variable->name, *((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address)));
@@ -542,3 +629,21 @@ static void print_local_variables_values(xbt_dynar_t all_variables){
   }
 }
 
+
+static void snapshot_stack_free(mc_snapshot_stack_t s){
+  if(s){
+    xbt_free(s->local_variables->data);
+    xbt_free(s->local_variables);
+    xbt_free(s);
+  }
+}
+
+void snapshot_stack_free_voidp(void *s){
+  snapshot_stack_free((mc_snapshot_stack_t) * (void **) s);
+}
+
+void *MC_snapshot(void){
+
+  return simcall_mc_snapshot();
+  
+}
index 1cbca27..15040a9 100644 (file)
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_compare, mc,
                                 "Logging specific to mc_compare");
 
-static int data_program_region_compare(void *d1, void *d2, size_t size);
-static int data_libsimgrid_region_compare(void *d1, void *d2, size_t size);
+static int data_bss_program_region_compare(void *d1, void *d2, size_t size);
+static int data_bss_libsimgrid_region_compare(void *d1, void *d2, size_t size);
 static int heap_region_compare(void *d1, void *d2, size_t size);
 
 static int compare_stack(stack_region_t s1, stack_region_t s2, void *sp1, void *sp2, void *heap1, void *heap2, xbt_dynar_t equals);
 static int is_heap_equality(xbt_dynar_t equals, void *a1, void *a2);
-static size_t ignore(void *address);
+static size_t heap_ignore_size(void *address);
+static size_t data_bss_ignore_size(void *address);
 
+static void stack_region_free(stack_region_t s);
+static void heap_equality_free(heap_equality_t e);
+
+static int is_stack_ignore_variable(char *frame, char *var_name);
 static int compare_local_variables(char *s1, char *s2, xbt_dynar_t heap_equals);
 
-static size_t ignore(void *address){
+static size_t heap_ignore_size(void *address){
   unsigned int cursor = 0;
   int start = 0;
-  int end = xbt_dynar_length(mc_comparison_ignore) - 1;
-  mc_ignore_region_t region;
+  int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1;
+  mc_heap_ignore_region_t region;
 
   while(start <= end){
     cursor = (start + end) / 2;
-    region = (mc_ignore_region_t)xbt_dynar_get_as(mc_comparison_ignore, cursor, mc_ignore_region_t);
+    region = (mc_heap_ignore_region_t)xbt_dynar_get_as(mc_heap_comparison_ignore, cursor, mc_heap_ignore_region_t);
     if(region->address == address)
       return region->size;
     if(region->address < address)
@@ -40,40 +45,75 @@ static size_t ignore(void *address){
   return 0;
 }
 
-static int data_program_region_compare(void *d1, void *d2, size_t size){
-  int distance = 0;
-  size_t i = 0;
+static size_t data_bss_ignore_size(void *address){
+  unsigned int cursor = 0;
+  int start = 0;
+  int end = xbt_dynar_length(mc_data_bss_comparison_ignore) - 1;
+  mc_data_bss_ignore_variable_t var;
+
+  while(start <= end){
+    cursor = (start + end) / 2;
+    var = (mc_data_bss_ignore_variable_t)xbt_dynar_get_as(mc_data_bss_comparison_ignore, cursor, mc_data_bss_ignore_variable_t);
+    if(var->address == address)
+      return var->size;
+    if(var->address < address){
+      if((void *)((char *)var->address + var->size) > address)
+        return (char *)var->address + var->size - (char*)address;
+      else
+        start = cursor + 1;
+    }
+    if(var->address > address)
+      end = cursor - 1;   
+  }
+
+  return 0;
+}
+
+static int data_bss_program_region_compare(void *d1, void *d2, size_t size){
+
+  size_t i = 0, ignore_size = 0;
   int pointer_align;
   void *addr_pointed1 = NULL, *addr_pointed2 = NULL;
   
   for(i=0; i<size; i++){
     if(memcmp(((char *)d1) + i, ((char *)d2) + i, 1) != 0){
+      if((ignore_size = data_bss_ignore_size((char *)start_data_binary+i)) > 0){
+        i = i + ignore_size;
+        continue;
+      }else if((ignore_size = data_bss_ignore_size((char *)start_bss_binary+i)) > 0){
+        i = i + ignore_size;
+        continue;
+      }
       pointer_align = (i / sizeof(void*)) * sizeof(void*);
       addr_pointed1 = *((void **)((char *)d1 + pointer_align));
       addr_pointed2 = *((void **)((char *)d2 + pointer_align));
       if((addr_pointed1 > start_plt_binary && addr_pointed1 < end_plt_binary) || (addr_pointed2 > start_plt_binary && addr_pointed2 < end_plt_binary)){
         continue;
       }else{
-        XBT_DEBUG("Different byte (offset=%zu) (%p - %p) in data program region", i, (char *)d1 + i, (char *)d2 + i);
-        distance++;
+        if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose)){
+          XBT_VERB("Different byte (offset=%zu) (%p - %p) in data program region", i, (char *)d1 + i, (char *)d2 + i);
+          XBT_VERB("Addresses pointed : %p - %p", addr_pointed1, addr_pointed2);
+        }
+        return 1;
       }
     }
   }
   
-  XBT_DEBUG("Hamming distance between data program regions : %d", distance);
-
-  return distance;
+  return 0;
 }
 
-static int data_libsimgrid_region_compare(void *d1, void *d2, size_t size){
-  int distance = 0;
+static int data_bss_libsimgrid_region_compare(void *d1, void *d2, size_t size){
+
   size_t i = 0, ignore_size = 0;
   int pointer_align;
   void *addr_pointed1 = NULL, *addr_pointed2 = NULL;
 
   for(i=0; i<size; i++){
     if(memcmp(((char *)d1) + i, ((char *)d2) + i, 1) != 0){
-      if((ignore_size = ignore((char *)start_data_libsimgrid+i)) > 0){
+      if((ignore_size = data_bss_ignore_size((char *)start_data_libsimgrid+i)) > 0){
+        i = i + ignore_size;
+        continue;
+      }else if((ignore_size = data_bss_ignore_size((char *)start_bss_libsimgrid+i)) > 0){
         i = i + ignore_size;
         continue;
       }
@@ -82,143 +122,434 @@ static int data_libsimgrid_region_compare(void *d1, void *d2, size_t size){
       addr_pointed2 = *((void **)((char *)d2 + pointer_align));
       if((addr_pointed1 > start_plt_libsimgrid && addr_pointed1 < end_plt_libsimgrid) || (addr_pointed2 > start_plt_libsimgrid && addr_pointed2 < end_plt_libsimgrid)){
         continue;
+      }else if(addr_pointed1 >= raw_heap && addr_pointed1 <= end_raw_heap && addr_pointed2 >= raw_heap && addr_pointed2 <= end_raw_heap){
+        continue;
       }else{
-        XBT_DEBUG("Different byte (offset=%zu) (%p - %p) in data libsimgrid region", i, (char *)d1 + i, (char *)d2 + i);
-        XBT_DEBUG("Addresses pointed : %p - %p\n", addr_pointed1, addr_pointed2);
-        distance++;
+        if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose)){
+          XBT_VERB("Different byte (offset=%zu) (%p - %p) in libsimgrid region", i, (char *)d1 + i, (char *)d2 + i);
+          XBT_VERB("Addresses pointed : %p - %p", addr_pointed1, addr_pointed2);
+        }
+        return 1;
       }
     }
   }
   
-  XBT_DEBUG("Hamming distance between data libsimgrid regions : %d", distance); fflush(NULL);
-  
-  return distance;
+  return 0;
 }
 
 static int heap_region_compare(void *d1, void *d2, size_t size){
   
-  int distance = 0;
   size_t i = 0;
   
   for(i=0; i<size; i++){
     if(memcmp(((char *)d1) + i, ((char *)d2) + i, 1) != 0){
-      XBT_DEBUG("Different byte (offset=%zu) (%p - %p) in heap region", i, (char *)d1 + i, (char *)d2 + i);
-      distance++;
+      if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose)){
+        XBT_VERB("Different byte (offset=%zu) (%p - %p) in heap region", i, (char *)d1 + i, (char *)d2 + i);
+      }
+      return 1;
     }
   }
   
-  XBT_DEBUG("Hamming distance between heap regions : %d (total size : %zu)", distance, size);
+  return 0;
+}
+
+static void stack_region_free(stack_region_t s){
+  if(s){
+    xbt_free(s->process_name);
+    xbt_free(s);
+  }
+}
 
-  return distance;
+void stack_region_free_voidp(void *s){
+  stack_region_free((stack_region_t) * (void **) s);
+}
+
+static void heap_equality_free(heap_equality_t e){
+  if(e){
+    xbt_free(e);
+  }
 }
 
-int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
+void heap_equality_free_voidp(void *e){
+  heap_equality_free((heap_equality_t) * (void **) e);
+}
 
-  int errors = 0, i;
-  xbt_dynar_t stacks1 = xbt_dynar_new(sizeof(stack_region_t), NULL);
-  xbt_dynar_t stacks2 = xbt_dynar_new(sizeof(stack_region_t), NULL);
-  xbt_dynar_t equals = xbt_dynar_new(sizeof(heap_equality_t), NULL);
+int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2, mc_comparison_times_t ct1, mc_comparison_times_t ct2){
 
-  void *heap1 = NULL, *heap2 = NULL;
+  int raw_mem = (mmalloc_get_current_heap() == raw_heap);
   
+  MC_SET_RAW_MEM;
+      
+  int errors = 0, i = 0;
+
   if(s1->num_reg != s2->num_reg){
-    XBT_INFO("Different num_reg (s1 = %u, s2 = %u)", s1->num_reg, s2->num_reg);
+    if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose)){
+      XBT_VERB("Different num_reg (s1 = %u, s2 = %u)", s1->num_reg, s2->num_reg);
+    }
+    if(!raw_mem)
+      MC_UNSET_RAW_MEM;
     return 1;
   }
 
-  for(i=0 ; i< s1->num_reg ; i++){
-    
-    if(s1->regions[i]->type != s2->regions[i]->type){
-      XBT_INFO("Different type of region");
-      errors++;
-    }
-    
+  int heap_index = 0, data_libsimgrid_index = 0, data_program_index = 0;
+
+  /* Get index of regions */
+  while(i < s1->num_reg){
     switch(s1->regions[i]->type){
-    case 0 :
-      /* Compare heapregion */
-      if(s1->regions[i]->size != s2->regions[i]->size){
-        XBT_INFO("Different size of heap (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
-        return 1;
-      }
-      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
-        XBT_INFO("Different start addr of heap (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
-        return 1;
-      }
-      if(mmalloc_compare_heap((xbt_mheap_t)s1->regions[i]->data, (xbt_mheap_t)s2->regions[i]->data, &stacks1, &stacks2, &equals)){
-        XBT_INFO("Different heap (mmalloc_compare)");
-        return 1; 
-      }
-      heap1 = s1->regions[i]->data;
-      heap2 = s2->regions[i]->data;
+    case 0:
+      heap_index = i;
+      i++;
       break;
-    case 1 :
-      /* Compare data libsimgrid region */
-      if(s1->regions[i]->size != s2->regions[i]->size){
-        XBT_INFO("Different size of libsimgrid (data) (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
-        return 1;
-      }
-      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
-        XBT_INFO("Different start addr of libsimgrid (data) (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
-        return 1;
-      }
-      if(data_libsimgrid_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
-        XBT_INFO("Different memcmp for data in libsimgrid");
-        return 1;
-      }
+    case 1:
+      data_libsimgrid_index = i;
+      i++;
+      while( i < s1->num_reg && s1->regions[i]->type == 1)
+        i++;
       break;
+    case 2:
+      data_program_index = i;
+      i++;
+      while( i < s1->num_reg && s1->regions[i]->type == 2)
+        i++;
+      break;
+    }
+  }
+
+  if(ct1 != NULL)
+    ct1->nb_comparisons++;
+  if(ct2 != NULL)
+    ct2->nb_comparisons++;
+
+  xbt_os_timer_t global_timer = xbt_os_timer_new();
+  xbt_os_timer_t timer = xbt_os_timer_new();
+
+  xbt_os_timer_start(global_timer);
+
+  if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug))
+    xbt_os_timer_start(timer);
+
+  /* Compare number of blocks/fragments used in each heap */
+  size_t chunks_used1 = mmalloc_get_chunks_used((xbt_mheap_t)s1->regions[heap_index]->data);
+  size_t chunks_used2 = mmalloc_get_chunks_used((xbt_mheap_t)s2->regions[heap_index]->data);
+  if(chunks_used1 != chunks_used2){
+    if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug)){
+      xbt_os_timer_stop(timer);
+      if(ct1 != NULL)
+        xbt_dynar_push_as(ct1->chunks_used_comparison_times, double, xbt_os_timer_elapsed(timer));
+      if(ct2 != NULL)
+        xbt_dynar_push_as(ct2->chunks_used_comparison_times, double, xbt_os_timer_elapsed(timer));
+      XBT_DEBUG("Different number of chunks used in each heap : %zu - %zu", chunks_used1, chunks_used2);
+      errors++;
+    }else{
+      if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose))
+        XBT_VERB("Different number of chunks used in each heap : %zu - %zu", chunks_used1, chunks_used2);
+     
+      xbt_os_timer_free(timer);
+      xbt_os_timer_stop(global_timer);
+      if(ct1 != NULL)
+        xbt_dynar_push_as(ct1->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+      if(ct2 != NULL)
+        xbt_dynar_push_as(ct2->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+      xbt_os_timer_free(global_timer);
+
+      if(!raw_mem)
+        MC_UNSET_RAW_MEM;
+
+      return 1;
+    }
+  }else{
+    if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug))
+      xbt_os_timer_stop(timer);
+  }
+  
+  if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug))
+    xbt_os_timer_start(timer);
+
+  /* Compare size of stacks */
+  unsigned int cursor = 0;
+  void *addr_stack1, *addr_stack2;
+  void *sp1, *sp2;
+  size_t size_used1, size_used2;
+  int is_diff = 0;
+  while(cursor < xbt_dynar_length(stacks_areas)){
+    addr_stack1 = (char *)s1->regions[heap_index]->data + ((char *)((stack_region_t)xbt_dynar_get_as(stacks_areas, cursor, stack_region_t))->address - (char *)std_heap);
+    addr_stack2 = (char *)s2->regions[heap_index]->data + ((char *)((stack_region_t)xbt_dynar_get_as(stacks_areas, cursor, stack_region_t))->address - (char *)std_heap);
+    sp1 = ((mc_snapshot_stack_t)xbt_dynar_get_as(s1->stacks, cursor, mc_snapshot_stack_t))->stack_pointer;
+    sp2 = ((mc_snapshot_stack_t)xbt_dynar_get_as(s2->stacks, cursor, mc_snapshot_stack_t))->stack_pointer;
+    size_used1 = ((stack_region_t)xbt_dynar_get_as(stacks_areas, cursor, stack_region_t))->size - ((char*)sp1 - (char*)addr_stack1);
+    size_used2 = ((stack_region_t)xbt_dynar_get_as(stacks_areas, cursor, stack_region_t))->size - ((char*)sp2 - (char*)addr_stack2);
+    if(size_used1 != size_used2){
+      if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug)){
+        if(is_diff == 0){
+          xbt_os_timer_stop(timer);
+          if(ct1 != NULL)
+            xbt_dynar_push_as(ct1->stacks_sizes_comparison_times, double, xbt_os_timer_elapsed(timer));
+          if(ct2 != NULL)
+            xbt_dynar_push_as(ct2->stacks_sizes_comparison_times, double, xbt_os_timer_elapsed(timer));
+        }
+        XBT_DEBUG("Different size used in stacks : %zu - %zu", size_used1, size_used2);
+        errors++;
+        is_diff = 1;
+      }else{
+        if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose))
+          XBT_VERB("Different size used in stacks : %zu - %zu", size_used1, size_used2);
+        xbt_os_timer_free(timer);
+        xbt_os_timer_stop(global_timer);
+        if(ct1 != NULL)
+          xbt_dynar_push_as(ct1->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+        if(ct2 != NULL)
+          xbt_dynar_push_as(ct2->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+        xbt_os_timer_free(global_timer);
+
+        if(!raw_mem)
+          MC_UNSET_RAW_MEM;
 
-    case 2 :
-      /* Compare data program region */
-      if(s1->regions[i]->size != s2->regions[i]->size){
-        XBT_INFO("Different size of data program (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
         return 1;
       }
-      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
-        XBT_INFO("Different start addr of data program (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
+    }
+    cursor++;
+  }
+
+  if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug)){
+    if(is_diff == 0)
+      xbt_os_timer_stop(timer);
+    xbt_os_timer_start(timer);
+  }
+  
+  /* Compare program data segment(s) */
+  is_diff = 0;
+  i = data_program_index;
+  while(i < s1->num_reg && s1->regions[i]->type == 2){
+    if(data_bss_program_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
+      if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug)){
+        if(is_diff == 0){
+          xbt_os_timer_stop(timer);
+          if(ct1 != NULL)
+            xbt_dynar_push_as(ct1->program_data_segment_comparison_times, double, xbt_os_timer_elapsed(timer));
+          if(ct2 != NULL)
+           xbt_dynar_push_as(ct2->program_data_segment_comparison_times, double, xbt_os_timer_elapsed(timer));
+        }
+        XBT_DEBUG("Different memcmp for data in program");
+        errors++;
+        is_diff = 1;
+      }else{
+        if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose))
+          XBT_VERB("Different memcmp for data in program"); 
+
+        xbt_os_timer_free(timer);
+        xbt_os_timer_stop(global_timer);
+        if(ct1 != NULL)
+          xbt_dynar_push_as(ct1->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+        if(ct2 != NULL)
+          xbt_dynar_push_as(ct2->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+        xbt_os_timer_free(global_timer);
+
+        if(!raw_mem)
+          MC_UNSET_RAW_MEM;
         return 1;
       }
-      if(data_program_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
-        XBT_INFO("Different memcmp for data in program");
+    }
+    i++;
+  }
+
+  if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug)){
+    if(is_diff == 0)
+      xbt_os_timer_stop(timer);
+    xbt_os_timer_start(timer);
+  }
+
+  /* Compare libsimgrid data segment(s) */
+  is_diff = 0;
+  i = data_libsimgrid_index;
+  while(i < s1->num_reg && s1->regions[i]->type == 1){
+    if(data_bss_libsimgrid_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
+      if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug)){
+        if(is_diff == 0){
+          xbt_os_timer_stop(timer);
+          if(ct1 != NULL)
+            xbt_dynar_push_as(ct1->libsimgrid_data_segment_comparison_times, double, xbt_os_timer_elapsed(timer));
+          if(ct2 != NULL)
+            xbt_dynar_push_as(ct2->libsimgrid_data_segment_comparison_times, double, xbt_os_timer_elapsed(timer));
+        }
+        XBT_DEBUG("Different memcmp for data in libsimgrid");
+        errors++;
+        is_diff = 1;
+      }else{
+        if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose))
+          XBT_VERB("Different memcmp for data in libsimgrid");
+         
+        xbt_os_timer_free(timer);
+        xbt_os_timer_stop(global_timer);
+        if(ct1 != NULL)
+          xbt_dynar_push_as(ct1->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+        if(ct2 != NULL)
+          xbt_dynar_push_as(ct2->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+        xbt_os_timer_free(global_timer);
+        
+        if(!raw_mem)
+          MC_UNSET_RAW_MEM;
         return 1;
       }
-      break;
     }
+    i++;
+  }
 
+  if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug)){
+    if(is_diff == 0)
+      xbt_os_timer_stop(timer);
+    xbt_os_timer_start(timer);
   }
 
+  /* Compare heap */
+  xbt_dynar_t stacks1 = xbt_dynar_new(sizeof(stack_region_t), stack_region_free_voidp);
+  xbt_dynar_t stacks2 = xbt_dynar_new(sizeof(stack_region_t), stack_region_free_voidp);
+  xbt_dynar_t equals = xbt_dynar_new(sizeof(heap_equality_t), heap_equality_free_voidp);
+  
+  void *heap1 = s1->regions[heap_index]->data, *heap2 = s2->regions[heap_index]->data;
+  if(mmalloc_compare_heap((xbt_mheap_t)s1->regions[heap_index]->data, (xbt_mheap_t)s2->regions[heap_index]->data, &stacks1, &stacks2, &equals)){
+
+    if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug)){
+      xbt_os_timer_stop(timer);
+      if(ct1 != NULL)
+        xbt_dynar_push_as(ct1->heap_comparison_times, double, xbt_os_timer_elapsed(timer));
+      if(ct2 != NULL)
+        xbt_dynar_push_as(ct2->heap_comparison_times, double, xbt_os_timer_elapsed(timer));
+      XBT_DEBUG("Different heap (mmalloc_compare)");
+      errors++;
+    }else{
+
+      xbt_os_timer_free(timer);
+      xbt_dynar_free(&stacks1);
+      xbt_dynar_free(&stacks2);
+      xbt_dynar_free(&equals);
+      if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose))
+        XBT_VERB("Different heap (mmalloc_compare)");
+       
+      xbt_os_timer_stop(global_timer);
+      if(ct1 != NULL)
+        xbt_dynar_push_as(ct1->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+      if(ct2 != NULL)
+        xbt_dynar_push_as(ct2->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+      xbt_os_timer_free(global_timer);
+
+      if(!raw_mem)
+        MC_UNSET_RAW_MEM;
+      return 1;
+    } 
+  }else{
+    if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug))
+      xbt_os_timer_stop(timer);
+  }
+
+  if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug))
+    xbt_os_timer_start(timer);
+
   /* Stacks comparison */
-  unsigned int cursor = 0;
+  cursor = 0;
   stack_region_t stack_region1, stack_region2;
-  void *sp1, *sp2;
   int diff = 0, diff_local = 0;
+  is_diff = 0;
 
   while(cursor < xbt_dynar_length(stacks1)){
-    XBT_INFO("Stack %d", cursor + 1); 
     stack_region1 = (stack_region_t)(xbt_dynar_get_as(stacks1, cursor, stack_region_t));
     stack_region2 = (stack_region_t)(xbt_dynar_get_as(stacks2, cursor, stack_region_t));
     sp1 = ((mc_snapshot_stack_t)xbt_dynar_get_as(s1->stacks, cursor, mc_snapshot_stack_t))->stack_pointer;
     sp2 = ((mc_snapshot_stack_t)xbt_dynar_get_as(s2->stacks, cursor, mc_snapshot_stack_t))->stack_pointer;
     diff = compare_stack(stack_region1, stack_region2, sp1, sp2, heap1, heap2, equals);
 
-    if(diff >0){  
+    if(diff > 0){ /* Differences may be due to padding */  
       diff_local = compare_local_variables(((mc_snapshot_stack_t)xbt_dynar_get_as(s1->stacks, cursor, mc_snapshot_stack_t))->local_variables->data, ((mc_snapshot_stack_t)xbt_dynar_get_as(s2->stacks, cursor, mc_snapshot_stack_t))->local_variables->data, equals);
       if(diff_local > 0){
-        XBT_INFO("Hamming distance between stacks : %d", diff);
-        return 1;
-      }else{
-        XBT_INFO("Local variables are equals in stack %d", cursor + 1);
+        if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug)){
+          if(is_diff == 0){
+            xbt_os_timer_stop(timer);
+            if(ct1 != NULL)
+              xbt_dynar_push_as(ct1->stacks_comparison_times, double, xbt_os_timer_elapsed(timer));
+            if(ct2 != NULL)
+              xbt_dynar_push_as(ct2->stacks_comparison_times, double, xbt_os_timer_elapsed(timer));
+          }
+          XBT_DEBUG("Different local variables between stacks %d", cursor + 1);
+          errors++;
+          is_diff = 1;
+        }else{
+          xbt_dynar_free(&stacks1);
+          xbt_dynar_free(&stacks2);
+          xbt_dynar_free(&equals);
+
+          if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose))
+            XBT_VERB("Different local variables between stacks %d", cursor + 1);
+          
+          xbt_os_timer_free(timer);
+          xbt_os_timer_stop(global_timer);
+          if(ct1 != NULL)
+            xbt_dynar_push_as(ct1->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+          if(ct2 != NULL)
+            xbt_dynar_push_as(ct2->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+          xbt_os_timer_free(global_timer);
+          
+          if(!raw_mem)
+            MC_UNSET_RAW_MEM;
+
+          return 1;
+        }
       }
-    }else{
-      XBT_INFO("Same stacks");
     }
     cursor++;
   }
 
-  return 0;
+  xbt_dynar_free(&stacks1);
+  xbt_dynar_free(&stacks2);
+  xbt_dynar_free(&equals);
+
+  if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug))    
+    xbt_os_timer_free(timer);
+
+  if(!XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_debug)){
+    xbt_os_timer_stop(global_timer);
+    if(ct1 != NULL)
+      xbt_dynar_push_as(ct1->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+    if(ct2 != NULL)
+      xbt_dynar_push_as(ct2->snapshot_comparison_times, double, xbt_os_timer_elapsed(global_timer));
+  }
+  xbt_os_timer_free(global_timer);
+
+  if(!raw_mem)
+    MC_UNSET_RAW_MEM;
+
+  return errors > 0;
   
 }
 
+static int is_stack_ignore_variable(char *frame, char *var_name){
+
+  unsigned int cursor = 0;
+  int start = 0;
+  int end = xbt_dynar_length(mc_stack_comparison_ignore) - 1;
+  mc_stack_ignore_variable_t current_var;
+
+  while(start <= end){
+    cursor = (start + end) / 2;
+    current_var = (mc_stack_ignore_variable_t)xbt_dynar_get_as(mc_stack_comparison_ignore, cursor, mc_stack_ignore_variable_t);
+    if(strcmp(current_var->frame, frame) == 0 || strcmp(current_var->frame, "*") == 0){
+      if(strcmp(current_var->var_name, var_name) == 0)
+        return 1;
+      if(strcmp(current_var->var_name, var_name) < 0)
+        start = cursor + 1;
+      if(strcmp(current_var->var_name, var_name) > 0)
+        end = cursor - 1;
+    }else if(strcmp(current_var->frame, frame) < 0){
+      start = cursor + 1;
+    }else if(strcmp(current_var->frame, frame) > 0){
+      end = cursor - 1; 
+    }
+  }
+
+  return 0;
+}
+
 static int compare_local_variables(char *s1, char *s2, xbt_dynar_t heap_equals){
   
   xbt_dynar_t tokens1 = xbt_str_split(s1, NULL);
@@ -227,26 +558,45 @@ static int compare_local_variables(char *s1, char *s2, xbt_dynar_t heap_equals){
   xbt_dynar_t s_tokens1, s_tokens2;
   unsigned int cursor = 0;
   void *addr1, *addr2;
-
-  int diff = 0;
+  char *ip1 = NULL, *ip2 = NULL;
   
   while(cursor < xbt_dynar_length(tokens1)){
     s_tokens1 = xbt_str_split(xbt_dynar_get_as(tokens1, cursor, char *), "=");
     s_tokens2 = xbt_str_split(xbt_dynar_get_as(tokens2, cursor, char *), "=");
     if(xbt_dynar_length(s_tokens1) > 1 && xbt_dynar_length(s_tokens2) > 1){
-      if(strcmp(xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *)) != 0){
+      if((strcmp(xbt_dynar_get_as(s_tokens1, 0, char *), "ip") == 0) && (strcmp(xbt_dynar_get_as(s_tokens2, 0, char *), "ip") == 0)){
+        ip1 = strdup(xbt_dynar_get_as(s_tokens1, 1, char *));
+        ip2 = strdup(xbt_dynar_get_as(s_tokens2, 1, char *));
+        /*if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose))
+          XBT_VERB("Instruction pointer : %s, Instruction pointer : %s", ip1, ip2);*/
+      }
+      if(strcmp(xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *)) != 0){   
+        /* Ignore this variable ?  */
+        if(is_stack_ignore_variable(ip1, xbt_dynar_get_as(s_tokens1, 0, char *)) && is_stack_ignore_variable(ip2, xbt_dynar_get_as(s_tokens2, 0, char *))){
+          xbt_dynar_free(&s_tokens1);
+          xbt_dynar_free(&s_tokens2);
+          cursor++;
+          continue;
+        }
         addr1 = (void *) strtoul(xbt_dynar_get_as(s_tokens1, 1, char *), NULL, 16);
         addr2 = (void *) strtoul(xbt_dynar_get_as(s_tokens2, 1, char *), NULL, 16);
         if(is_heap_equality(heap_equals, addr1, addr2) == 0){
-          XBT_INFO("Variable %s is different between stacks : %s - %s", xbt_dynar_get_as(s_tokens1, 0, char *), xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *));
-          diff++;
+          if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose))
+            XBT_VERB("Variable %s is different between stacks : %s - %s", xbt_dynar_get_as(s_tokens1, 0, char *), xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *));
+          xbt_dynar_free(&s_tokens1);
+          xbt_dynar_free(&s_tokens2);
+          return 1;
         }
       }
     }
+    xbt_dynar_free(&s_tokens1);
+    xbt_dynar_free(&s_tokens2);
     cursor++;
   }
 
-  return diff;
+  xbt_dynar_free(&tokens1);
+  xbt_dynar_free(&tokens2);
+  return 0;
   
 }
 
@@ -281,39 +631,36 @@ static int is_heap_equality(xbt_dynar_t equals, void *a1, void *a2){
 
 static int compare_stack(stack_region_t s1, stack_region_t s2, void *sp1, void *sp2, void *heap1, void *heap2, xbt_dynar_t equals){
   
-  size_t k = 0, nb_diff = 0;
+  size_t k = 0;
   size_t size_used1 = s1->size - ((char*)sp1 - (char*)s1->address);
   size_t size_used2 = s2->size - ((char*)sp2 - (char*)s2->address);
 
   int pointer_align;
   void *addr_pointed1 = NULL, *addr_pointed2 = NULL;  
-
-  if(size_used1 == size_used2){
+  
+  while(k < size_used1){
+    if(memcmp((char *)s1->address + s1->size - k, (char *)s2->address + s2->size - k, 1) != 0){
+      pointer_align = ((size_used1 - k) / sizeof(void*)) * sizeof(void*);
+      addr_pointed1 = *((void **)(((char*)s1->address + (s1->size - size_used1)) + pointer_align));
+      addr_pointed2 = *((void **)(((char*)s2->address + (s2->size - size_used2)) + pointer_align));
+      if(is_heap_equality(equals, addr_pointed1, addr_pointed2) == 0){
+        if((addr_pointed1 > std_heap) && (addr_pointed1 < (void *)((char *)std_heap + STD_HEAP_SIZE)) && (addr_pointed2 > std_heap) && (addr_pointed2 < (void *)((char *)std_heap + STD_HEAP_SIZE))){
+          if(is_free_area(addr_pointed1, (xbt_mheap_t)heap1) == 0 || is_free_area(addr_pointed2, (xbt_mheap_t)heap2) == 0){
+            return 1;
+          }
+        }else{
+          return 1;
+        } 
+      }
+    } 
+    k++;
+  }
  
-    while(k < size_used1){
-      if(memcmp((char *)s1->address + s1->size - k, (char *)s2->address + s2->size - k, 1) != 0){
-        pointer_align = ((size_used1 - k) / sizeof(void*)) * sizeof(void*);
-        addr_pointed1 = *((void **)(((char*)s1->address + (s1->size - size_used1)) + pointer_align));
-        addr_pointed2 = *((void **)(((char*)s2->address + (s2->size - size_used2)) + pointer_align));
-        if(is_heap_equality(equals, addr_pointed1, addr_pointed2) == 0){
-          if((addr_pointed1 > std_heap) && (addr_pointed1 < (void *)((char *)std_heap + STD_HEAP_SIZE)) && (addr_pointed2 > std_heap) && (addr_pointed2 < (void *)((char *)std_heap + STD_HEAP_SIZE))){
-            if(is_free_area(addr_pointed1, (xbt_mheap_t)heap1) == 0 || is_free_area(addr_pointed2, (xbt_mheap_t)heap2) == 0){
-              //XBT_INFO("Difference at offset %zu (%p - %p)", k, (char *)s1->address + s1->size - k, (char *)s2->address + s2->size - k);
-              nb_diff++;
-            }
-          }else{
-            //XBT_INFO("Difference at offset %zu (%p - %p)", k, (char *)s1->address + s1->size - k, (char *)s2->address + s2->size - k);
-            nb_diff++;
-          } 
-        }
-      } 
-      k++;
-    }
+  return 0;
+}
 
-  }else{
-    XBT_INFO("Different size used between stacks");
-    return 1;
-  }
+int MC_compare_snapshots(void *s1, void *s2){
+
+  return simcall_mc_compare_snapshots(s1, s2);
 
-  return nb_diff;
 }
index 3c56d0d..0947844 100644 (file)
@@ -8,20 +8,90 @@
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_dpor, mc,
                                 "Logging specific to MC DPOR exploration");
 
+xbt_dynar_t visited_states;
+
+static int is_visited_state(void);
+
+static int is_visited_state(){
+
+  if(_surf_mc_visited == 0)
+    return 0;
+
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+
+  MC_SET_RAW_MEM;
+
+  mc_snapshot_t new_state = NULL;
+  new_state = MC_take_snapshot();  
+
+  MC_UNSET_RAW_MEM;
+  
+  if(xbt_dynar_is_empty(visited_states)){
+
+    MC_SET_RAW_MEM;
+    xbt_dynar_push(visited_states, &new_state); 
+    MC_UNSET_RAW_MEM;
+
+    if(raw_mem_set)
+      MC_SET_RAW_MEM;
+    return 0;
+
+  }else{
+
+    MC_SET_RAW_MEM;
+    
+    unsigned int cursor = 0;
+    mc_snapshot_t state_test = NULL;
+     
+    xbt_dynar_foreach(visited_states, cursor, state_test){
+      if(XBT_LOG_ISENABLED(mc_dpor, xbt_log_priority_debug))
+        XBT_DEBUG("****** Pair visited #%d ******", cursor + 1);
+      if(snapshot_compare(new_state, state_test, NULL, NULL) == 0){
+        if(raw_mem_set)
+          MC_SET_RAW_MEM;
+        else
+          MC_UNSET_RAW_MEM;
+        
+        return 1;
+      }   
+    }
+
+    if(xbt_dynar_length(visited_states) == _surf_mc_visited){
+      mc_snapshot_t state_to_remove = NULL;
+      xbt_dynar_shift(visited_states, &state_to_remove);
+      MC_free_snapshot(state_to_remove);
+    }
+
+    xbt_dynar_push(visited_states, &new_state); 
+    
+    MC_UNSET_RAW_MEM;
+
+    if(raw_mem_set)
+      MC_SET_RAW_MEM;
+    
+    return 0;
+    
+  }
+}
+
 /**
  *  \brief Initialize the DPOR exploration algorithm
  */
 void MC_dpor_init()
 {
   
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
   mc_state_t initial_state = NULL;
   smx_process_t process;
   
   /* Create the initial state and push it into the exploration stack */
   MC_SET_RAW_MEM;
+
   initial_state = MC_state_new();
+  visited_states = xbt_dynar_new(sizeof(mc_snapshot_t), NULL);
+
   MC_UNSET_RAW_MEM;
 
   XBT_DEBUG("**************************************************");
@@ -31,6 +101,13 @@ void MC_dpor_init()
   MC_wait_for_requests();
 
   MC_SET_RAW_MEM;
+
+  xbt_swag_foreach(process, simix_global->process_list){
+    if(MC_process_is_enabled(process)){
+      XBT_DEBUG("Process %lu enabled with simcall : %d", process->pid, (&process->simcall)->call); 
+    }
+  }
+  
   /* Get an enabled process and insert it in the interleave set of the initial state */
   xbt_swag_foreach(process, simix_global->process_list){
     if(MC_process_is_enabled(process)){
@@ -62,8 +139,6 @@ void MC_dpor_init()
 void MC_dpor(void)
 {
 
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
-
   char *req_str;
   int value;
   smx_simcall_t req = NULL, prev_req = NULL;
@@ -88,7 +163,7 @@ void MC_dpor(void)
 
     /* If there are processes to interleave and the maximum depth has not been reached
        then perform one step of the exploration algorithm */
-    if (xbt_fifo_size(mc_stack_safety) < MAX_DEPTH &&
+    if (xbt_fifo_size(mc_stack_safety) < _surf_mc_max_depth &&
         (req = MC_state_get_request(state, &value))) {
 
       /* Debug information */
@@ -111,18 +186,25 @@ void MC_dpor(void)
       MC_SET_RAW_MEM;
 
       next_state = MC_state_new();
-      
-      /* Get an enabled process and insert it in the interleave set of the next state */
-      xbt_swag_foreach(process, simix_global->process_list){
-        if(MC_process_is_enabled(process)){
-          MC_state_interleave_process(next_state, process);
-          break;
+
+      if(!is_visited_state()){
+     
+        /* Get an enabled process and insert it in the interleave set of the next state */
+        xbt_swag_foreach(process, simix_global->process_list){
+          if(MC_process_is_enabled(process)){
+            MC_state_interleave_process(next_state, process);
+            XBT_DEBUG("Process %lu enabled with simcall : %d", process->pid, (&process->simcall)->call); 
+          }
         }
-      }
 
-      if(_surf_mc_checkpoint && ((xbt_fifo_size(mc_stack_safety) + 1) % _surf_mc_checkpoint == 0)){
-        next_state->system_state = xbt_new0(s_mc_snapshot_t, 1);
-        MC_take_snapshot(next_state->system_state);
+        if(_surf_mc_checkpoint && ((xbt_fifo_size(mc_stack_safety) + 1) % _surf_mc_checkpoint == 0)){
+          next_state->system_state = MC_take_snapshot();
+        }
+
+      }else{
+
+        XBT_DEBUG("State already visited !");
+        
       }
 
       xbt_fifo_unshift(mc_stack_safety, next_state);
@@ -136,7 +218,20 @@ void MC_dpor(void)
 
       /* The interleave set is empty or the maximum depth is reached, let's back-track */
     } else {
-      XBT_DEBUG("There are no more processes to interleave.");
+
+      if(xbt_fifo_size(mc_stack_safety) == _surf_mc_max_depth){
+        
+        XBT_WARN("/!\\ Max depth reached ! /!\\ ");
+        if(req != NULL){
+          XBT_WARN("/!\\ But, there are still processes to interleave. Model-checker will not be able to ensure the soundness of the verification from now. /!\\ "); 
+          XBT_WARN("Notice : the default value of max depth is 1000 but you can change it with cfg=model-check/max_depth:value.");
+        }
+
+      }else{
+
+        XBT_DEBUG("There are no more processes to interleave.");
+
+      }
 
       /* Trash the current state, no longer needed */
       MC_SET_RAW_MEM;
@@ -157,28 +252,35 @@ void MC_dpor(void)
          (from it's predecesor state), depends on any other previous request 
          executed before it. If it does then add it to the interleave set of the
          state that executed that previous request. */
+      
       while ((state = xbt_fifo_shift(mc_stack_safety)) != NULL) {
-        req = MC_state_get_internal_request(state);
-        xbt_fifo_foreach(mc_stack_safety, item, prev_state, mc_state_t) {
-          if(MC_request_depend(req, MC_state_get_internal_request(prev_state))){
-            if(XBT_LOG_ISENABLED(mc_dpor, xbt_log_priority_debug)){
-              XBT_DEBUG("Dependent Transitions:");
-              prev_req = MC_state_get_executed_request(prev_state, &value);
-              req_str = MC_request_to_string(prev_req, value);
-              XBT_DEBUG("%s (state=%p)", req_str, prev_state);
-              xbt_free(req_str);
-              prev_req = MC_state_get_executed_request(state, &value);
-              req_str = MC_request_to_string(prev_req, value);
-              XBT_DEBUG("%s (state=%p)", req_str, state);
-              xbt_free(req_str);              
-            }
+        if(MC_state_interleave_size(state) == 0){
+          req = MC_state_get_internal_request(state);
+          xbt_fifo_foreach(mc_stack_safety, item, prev_state, mc_state_t) {
+            if(MC_request_depend(req, MC_state_get_internal_request(prev_state))){
+              if(XBT_LOG_ISENABLED(mc_dpor, xbt_log_priority_debug)){
+                XBT_DEBUG("Dependent Transitions:");
+                prev_req = MC_state_get_executed_request(prev_state, &value);
+                req_str = MC_request_to_string(prev_req, value);
+                XBT_DEBUG("%s (state=%p)", req_str, prev_state);
+                xbt_free(req_str);
+                prev_req = MC_state_get_executed_request(state, &value);
+                req_str = MC_request_to_string(prev_req, value);
+                XBT_DEBUG("%s (state=%p)", req_str, state);
+                xbt_free(req_str);              
+              }
 
-            if(!MC_state_process_is_done(prev_state, req->issuer))
-              MC_state_interleave_process(prev_state, req->issuer);
-            else
-              XBT_DEBUG("Process %p is in done set", req->issuer);
+              break;
+
+            }else if(req->issuer == MC_state_get_executed_request(prev_state, &value)->issuer){
+
+              break;
+
+            }else{
+              
+              MC_state_remove_interleave_process(prev_state, req->issuer);
 
-            break;
+            }
           }
         }
         if (MC_state_interleave_size(state)) {
@@ -222,13 +324,7 @@ void MC_dpor(void)
     }
   }
   MC_print_statistics(mc_stats);
-  MC_UNSET_RAW_MEM;
-
-  if(raw_mem_set)
-    MC_SET_RAW_MEM;
-  else
-    MC_UNSET_RAW_MEM;
-  
+  MC_UNSET_RAW_MEM;  
 
   return;
 }
index 2efb2d0..924592a 100644 (file)
@@ -37,7 +37,6 @@ void _mc_cfg_cb_reduce(const char *name, int pos) {
   } else {
     xbt_die("configuration option %s can only take 'none' or 'dpor' as a value",name);
   }
-  xbt_cfg_set_int(_surf_cfg_set,"model-check",1);
 }
 
 void _mc_cfg_cb_checkpoint(const char *name, int pos) {
@@ -45,14 +44,33 @@ void _mc_cfg_cb_checkpoint(const char *name, int pos) {
     xbt_die("You are specifying a checkpointing value 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.");
   }
   _surf_mc_checkpoint = xbt_cfg_get_int(_surf_cfg_set, name);
-  xbt_cfg_set_int(_surf_cfg_set,"model-check",1);
 }
 void _mc_cfg_cb_property(const char *name, int pos) {
   if (_surf_init_status && !_surf_do_model_check) {
     xbt_die("You are specifying a property 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.");
   }
   _surf_mc_property_file= xbt_cfg_get_string(_surf_cfg_set, name);
-  xbt_cfg_set_int(_surf_cfg_set,"model-check",1);
+}
+
+void _mc_cfg_cb_timeout(const char *name, int pos) {
+  if (_surf_init_status && !_surf_do_model_check) {
+    xbt_die("You are specifying a value to enable/disable timeout for wait requests 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.");
+  }
+  _surf_mc_timeout= xbt_cfg_get_int(_surf_cfg_set, name);
+}
+
+void _mc_cfg_cb_max_depth(const char *name, int pos) {
+  if (_surf_init_status && !_surf_do_model_check) {
+    xbt_die("You are specifying a max depth value 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.");
+  }
+  _surf_mc_max_depth= xbt_cfg_get_int(_surf_cfg_set, name);
+}
+
+void _mc_cfg_cb_visited(const char *name, int pos) {
+  if (_surf_init_status && !_surf_do_model_check) {
+    xbt_die("You are specifying a number of stored visited states 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.");
+  }
+  _surf_mc_visited= xbt_cfg_get_int(_surf_cfg_set, name);
 }
 
 
@@ -61,26 +79,27 @@ void _mc_cfg_cb_property(const char *name, int pos) {
 mc_state_t mc_current_state = NULL;
 char mc_replay_mode = FALSE;
 double *mc_time = NULL;
-mc_snapshot_t initial_snapshot = NULL;
-int raw_mem_set;
 
 /* Safety */
 
 xbt_fifo_t mc_stack_safety = NULL;
 mc_stats_t mc_stats = NULL;
+mc_global_t initial_state_safety = NULL;
 
 /* Liveness */
 
 mc_stats_pair_t mc_stats_pair = NULL;
 xbt_fifo_t mc_stack_liveness = NULL;
-mc_snapshot_t initial_snapshot_liveness = NULL;
+mc_global_t initial_state_liveness = NULL;
 int compare;
 
 /* Local */
 xbt_dict_t mc_local_variables = NULL;
 
 /* Ignore mechanism */
-extern xbt_dynar_t mc_comparison_ignore;
+xbt_dynar_t mc_stack_comparison_ignore;
+xbt_dynar_t mc_data_bss_comparison_ignore;
+extern xbt_dynar_t mc_heap_comparison_ignore;
 extern xbt_dynar_t stacks_areas;
 
 xbt_automaton_t _mc_property_automaton = NULL;
@@ -90,6 +109,7 @@ xbt_automaton_t _mc_property_automaton = NULL;
 static void MC_assert_pair(int prop);
 static dw_location_t get_location(xbt_dict_t location_list, char *expr);
 static dw_frame_t get_frame_by_offset(xbt_dict_t all_variables, unsigned long int offset);
+static void ignore_coverage_variables(char *executable, int region_type);
 
 void MC_do_the_modelcheck_for_real() {
   if (!_surf_mc_property_file || _surf_mc_property_file[0]=='\0') {
@@ -97,7 +117,7 @@ void MC_do_the_modelcheck_for_real() {
       mc_reduce_kind=e_mc_reduce_dpor;
 
     XBT_INFO("Check a safety property");
-    MC_modelcheck();
+    MC_modelcheck_safety();
 
   } else  {
 
@@ -110,16 +130,73 @@ void MC_do_the_modelcheck_for_real() {
   }
 }
 
-/**
- *  \brief Initialize the model-checker data structures
- */
-void MC_init_safety(void)
-{
 
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+void MC_compare(void){
+  compare = 1;
+}
+
+void MC_init(){
+
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+  
+  mc_time = xbt_new0(double, simix_process_maxpid);
+
+  /* mc_time refers to clock for each process -> ignore it for heap comparison */
+  int i;
+  for(i = 0; i<simix_process_maxpid; i++)
+    MC_ignore_heap(&(mc_time[i]), sizeof(double));
+  
+  compare = 0;
+
+  /* Initialize the data structures that must be persistent across every
+     iteration of the model-checker (in RAW memory) */
+
+  MC_SET_RAW_MEM;
+
+  char *ls_path = get_libsimgrid_path(); 
+  
+  mc_local_variables = xbt_dict_new_homogeneous(NULL);
+
+  /* Get local variables in binary for state equality detection */
+  xbt_dict_t binary_location_list = MC_get_location_list(xbt_binary_name);
+  MC_get_local_variables(xbt_binary_name, binary_location_list, &mc_local_variables);
+
+  /* Get local variables in libsimgrid for state equality detection */
+  xbt_dict_t libsimgrid_location_list = MC_get_location_list(ls_path);
+  MC_get_local_variables(ls_path, libsimgrid_location_list, &mc_local_variables);
+
+  MC_init_memory_map_info();
+
+  /* Get .plt section (start and end addresses) for data libsimgrid and data program comparison */
+  get_libsimgrid_plt_section();
+  get_binary_plt_section();
+
+  ignore_coverage_variables(libsimgrid_path, 1);
+  ignore_coverage_variables(xbt_binary_name, 2);
+
+  MC_UNSET_RAW_MEM;
+
+   /* Ignore some variables from xbt/ex.h used by exception e for stacks comparison */
+  MC_ignore_stack("e", "*");
+  MC_ignore_stack("__ex_cleanup", "*");
+  MC_ignore_stack("__ex_mctx_en", "*");
+  MC_ignore_stack("__ex_mctx_me", "*");
+  MC_ignore_stack("_log_ev", "*");
+  MC_ignore_stack("_throw_ctx", "*");
+  MC_ignore_stack("ctx", "*");
+
+
+  if(raw_mem_set)
+    MC_SET_RAW_MEM;
+
+}
+
+void MC_modelcheck_safety(void)
+{
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
   /* Check if MC is already initialized */
-  if (initial_snapshot)
+  if (initial_state_safety)
     return;
 
   mc_time = xbt_new0(double, simix_process_maxpid);
@@ -138,75 +215,47 @@ void MC_init_safety(void)
 
   MC_UNSET_RAW_MEM;
 
+  if(_surf_mc_visited > 0){
+    MC_init();
+  }else{
+    MC_init_memory_map_info();
+    get_libsimgrid_plt_section();
+    get_binary_plt_section();
+  }
+
   MC_dpor_init();
 
   MC_SET_RAW_MEM;
   /* Save the initial state */
-  initial_snapshot = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot(initial_snapshot);
+  initial_state_safety = xbt_new0(s_mc_global_t, 1);
+  initial_state_safety->snapshot = MC_take_snapshot();
+  //MC_take_snapshot(initial_snapshot);
   MC_UNSET_RAW_MEM;
 
-
   if(raw_mem_set)
     MC_SET_RAW_MEM;
-  else
-    MC_UNSET_RAW_MEM;
-  
-}
-
-void MC_compare(void){
-  compare = 1;
-}
-
 
-void MC_modelcheck(void)
-{
-  MC_init_safety();
   MC_dpor();
+
   MC_exit();
 }
 
 void MC_modelcheck_liveness(){
 
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
-
-  /* init stuff */
-  XBT_INFO("Start init mc");
-  
-  mc_time = xbt_new0(double, simix_process_maxpid);
-
-  /* mc_time refers to clock for each process -> ignore it for heap comparison */
-  int i;
-  for(i = 0; i<simix_process_maxpid; i++)
-    MC_ignore(&(mc_time[i]), sizeof(double));
-  
-  compare = 0;
-
-  /* Initialize the data structures that must be persistent across every
-     iteration of the model-checker (in RAW memory) */
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
+  MC_init();
   MC_SET_RAW_MEM;
-
-  char *ls_path = get_libsimgrid_path(); 
-  
-  mc_local_variables = xbt_dict_new_homogeneous(NULL);
-
-  /* Get local variables in binary for state equality detection */
-  xbt_dict_t binary_location_list = MC_get_location_list(xbt_binary_name);
-  MC_get_local_variables(xbt_binary_name, binary_location_list, &mc_local_variables);
-
-  /* Get local variables in libsimgrid for state equality detection */
-  xbt_dict_t libsimgrid_location_list = MC_get_location_list(ls_path);
-  MC_get_local_variables(ls_path, libsimgrid_location_list, &mc_local_variables);
   
   /* Initialize statistics */
   mc_stats_pair = xbt_new0(s_mc_stats_pair_t, 1);
 
-  XBT_DEBUG("Creating stack");
-
   /* Create exploration stack */
   mc_stack_liveness = xbt_fifo_new();
 
+  initial_state_liveness = xbt_new0(s_mc_global_t, 1);
+
   MC_UNSET_RAW_MEM;
 
   MC_ddfs_init();
@@ -214,8 +263,10 @@ void MC_modelcheck_liveness(){
   /* We're done */
   MC_print_statistics_pairs(mc_stats_pair);
   xbt_free(mc_time);
-  MC_memory_exit();
-  exit(0);
+
+  if(raw_mem_set)
+    MC_SET_RAW_MEM;
+
 }
 
 
@@ -277,7 +328,7 @@ int MC_deadlock_check()
  */
 void MC_replay(xbt_fifo_t stack, int start)
 {
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+  int raw_mem = (mmalloc_get_current_heap() == raw_heap);
 
   int value, i = 1;
   char *req_str;
@@ -289,7 +340,7 @@ void MC_replay(xbt_fifo_t stack, int start)
 
   if(start == -1){
     /* Restore the initial state */
-    MC_restore_snapshot(initial_snapshot);
+    MC_restore_snapshot(initial_state_safety->snapshot);
     /* At the moment of taking the snapshot the raw heap was set, so restoring
      * it will set it back again, we have to unset it to continue  */
     MC_UNSET_RAW_MEM;
@@ -333,7 +384,7 @@ void MC_replay(xbt_fifo_t stack, int start)
   }
   XBT_DEBUG("**** End Replay ****");
 
-  if(raw_mem_set)
+  if(raw_mem)
     MC_SET_RAW_MEM;
   else
     MC_UNSET_RAW_MEM;
@@ -344,7 +395,7 @@ void MC_replay(xbt_fifo_t stack, int start)
 void MC_replay_liveness(xbt_fifo_t stack, int all_stack)
 {
 
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+  initial_state_liveness->raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
   int value;
   char *req_str;
@@ -357,10 +408,12 @@ void MC_replay_liveness(xbt_fifo_t stack, int all_stack)
   XBT_DEBUG("**** Begin Replay ****");
 
   /* Restore the initial state */
-  MC_restore_snapshot(initial_snapshot_liveness);
+  MC_restore_snapshot(initial_state_liveness->snapshot);
+
   /* At the moment of taking the snapshot the raw heap was set, so restoring
    * it will set it back again, we have to unset it to continue  */
-  MC_UNSET_RAW_MEM;
+  if(!initial_state_liveness->raw_mem_set)
+    MC_UNSET_RAW_MEM;
 
   if(all_stack){
 
@@ -446,7 +499,7 @@ void MC_replay_liveness(xbt_fifo_t stack, int all_stack)
 
   XBT_DEBUG("**** End Replay ****");
 
-  if(raw_mem_set)
+  if(initial_state_liveness->raw_mem_set)
     MC_SET_RAW_MEM;
   else
     MC_UNSET_RAW_MEM;
@@ -461,7 +514,7 @@ void MC_replay_liveness(xbt_fifo_t stack, int all_stack)
 void MC_dump_stack_safety(xbt_fifo_t stack)
 {
   
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
   MC_show_stack_safety(stack);
 
@@ -544,19 +597,17 @@ void MC_show_stack_liveness(xbt_fifo_t stack){
 
 void MC_dump_stack_liveness(xbt_fifo_t stack){
 
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
   mc_pair_stateless_t pair;
 
   MC_SET_RAW_MEM;
   while ((pair = (mc_pair_stateless_t) xbt_fifo_pop(stack)) != NULL)
-    MC_pair_stateless_delete(pair);
+    pair_stateless_free(pair);
   MC_UNSET_RAW_MEM;
 
   if(raw_mem_set)
     MC_SET_RAW_MEM;
-  else
-    MC_UNSET_RAW_MEM;
 
 }
 
@@ -580,8 +631,9 @@ void MC_print_statistics_pairs(mc_stats_pair_t stats)
   //XBT_INFO("Executed transitions = %lu", stats->executed_transitions);
   XBT_INFO("Expanded / Visited = %lf",
            (double) stats->visited_pairs / stats->expanded_pairs);
-  /*XBT_INFO("Exploration coverage = %lf",
-    (double)stats->expanded_states / stats->state_size); */
+
+  if(mmalloc_get_current_heap() == raw_heap)
+    MC_UNSET_RAW_MEM;
 }
 
 void MC_assert(int prop)
@@ -617,15 +669,19 @@ void MC_process_clock_add(smx_process_t process, double amount)
 
 double MC_process_clock_get(smx_process_t process)
 {
-  if(mc_time)
-    return mc_time[process->pid];
-  else
+  if(mc_time){
+    if(process != NULL)
+      return mc_time[process->pid];
+    else 
+      return -1;
+  }else{
     return 0;
+  }
 }
 
 void MC_automaton_load(const char *file){
 
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
   MC_SET_RAW_MEM;
 
@@ -638,14 +694,12 @@ void MC_automaton_load(const char *file){
 
   if(raw_mem_set)
     MC_SET_RAW_MEM;
-  else
-    MC_UNSET_RAW_MEM;
 
 }
 
 void MC_automaton_new_propositional_symbol(const char* id, void* fct) {
 
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
   MC_SET_RAW_MEM;
 
@@ -658,22 +712,86 @@ void MC_automaton_new_propositional_symbol(const char* id, void* fct) {
 
   if(raw_mem_set)
     MC_SET_RAW_MEM;
-  else
-    MC_UNSET_RAW_MEM;
   
 }
 
 /************ MC_ignore ***********/ 
 
-void MC_ignore(void *address, size_t size){
+static void ignore_coverage_variables(char *executable, int region_type){
+
+  FILE *fp;
+
+  char *command = bprintf("objdump --syms %s", executable);
+
+  fp = popen(command, "r");
+
+  if(fp == NULL){
+    perror("popen failed");
+    xbt_abort();
+  }
+
+  char *line = NULL;
+  ssize_t read;
+  size_t n = 0;
+
+  xbt_dynar_t line_tokens = NULL;
+  unsigned long int size, offset;
+  void *address;
+
+  while ((read = getline(&line, &n, fp)) != -1){
+
+    if(n == 0)
+      continue;
+
+     /* Wipeout the new line character */
+    line[read - 1] = '\0';
+
+    xbt_str_strip_spaces(line);
+    xbt_str_ltrim(line, NULL);
+
+    line_tokens = xbt_str_split(line, NULL);
+
+    if(xbt_dynar_length(line_tokens) < 3 || strcmp(xbt_dynar_get_as(line_tokens, 0, char *), "SYMBOL") == 0)
+      continue;
+
+    if(((strncmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char *), "gcov", 4) == 0)
+        || (strncmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char *), "__gcov", 6) == 0))
+       && (((strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 3, char *), ".bss") == 0) 
+            || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 3, char *), ".data") == 0)))){
+      if(region_type == 1){ /* libsimgrid */
+        offset = strtoul(xbt_dynar_get_as(line_tokens, 0, char*), NULL, 16);
+        size = strtoul(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 2, char *), NULL, 16);
+        //XBT_DEBUG("Add ignore at address %p (size %lu)", (char *)start_text_libsimgrid+offset, size);
+        MC_ignore_data_bss((char *)start_text_libsimgrid+offset, size);
+      }else{ /* binary */
+        address = (void *)strtoul(xbt_dynar_get_as(line_tokens, 0, char*), NULL, 16);
+        size = strtoul(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 2, char *), NULL, 16);
+        //XBT_DEBUG("Add ignore at address %p (size %lu)", address, size);
+        MC_ignore_data_bss(address, size);
+      }
+    }
+
+    xbt_dynar_free(&line_tokens);
+
+  }
+
+  free(command);
+  free(line);
+  pclose(fp);
+
+}
+
+void MC_ignore_heap(void *address, size_t size){
+
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
   MC_SET_RAW_MEM;
   
-  if(mc_comparison_ignore == NULL)
-    mc_comparison_ignore = xbt_dynar_new(sizeof(mc_ignore_region_t), NULL);
+  if(mc_heap_comparison_ignore == NULL)
+    mc_heap_comparison_ignore = xbt_dynar_new(sizeof(mc_heap_ignore_region_t), NULL);
 
-  mc_ignore_region_t region = NULL;
-  region = xbt_new0(s_mc_ignore_region_t, 1);
+  mc_heap_ignore_region_t region = NULL;
+  region = xbt_new0(s_mc_heap_ignore_region_t, 1);
   region->address = address;
   region->size = size;
 
@@ -690,30 +808,163 @@ void MC_ignore(void *address, size_t size){
   }
 
   unsigned int cursor = 0;
-  mc_ignore_region_t current_region;
-  xbt_dynar_foreach(mc_comparison_ignore, cursor, current_region){
+  mc_heap_ignore_region_t current_region;
+  xbt_dynar_foreach(mc_heap_comparison_ignore, cursor, current_region){
     if(current_region->address > address)
       break;
   }
 
-  xbt_dynar_insert_at(mc_comparison_ignore, cursor, &region);
+  xbt_dynar_insert_at(mc_heap_comparison_ignore, cursor, &region);
 
   MC_UNSET_RAW_MEM;
+
+  if(raw_mem_set)
+    MC_SET_RAW_MEM;
 }
 
-void MC_new_stack_area(void *stack, char *name, void* context){
+void MC_ignore_data_bss(void *address, size_t size){
 
-  if(stacks_areas == NULL)
-    stacks_areas = xbt_dynar_new(sizeof(stack_region_t), NULL);
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+
+  MC_SET_RAW_MEM;
+  
+  if(mc_data_bss_comparison_ignore == NULL)
+    mc_data_bss_comparison_ignore = xbt_dynar_new(sizeof(mc_data_bss_ignore_variable_t), NULL);
+
+  if(xbt_dynar_is_empty(mc_data_bss_comparison_ignore)){
+
+    mc_data_bss_ignore_variable_t var = NULL;
+    var = xbt_new0(s_mc_data_bss_ignore_variable_t, 1);
+    var->address = address;
+    var->size = size;
+
+    xbt_dynar_insert_at(mc_data_bss_comparison_ignore, 0, &var);
+
+  }else{
+    
+    unsigned int cursor = 0;
+    int start = 0;
+    int end = xbt_dynar_length(mc_data_bss_comparison_ignore) - 1;
+    mc_data_bss_ignore_variable_t current_var = NULL;
+
+    while(start <= end){
+      cursor = (start + end) / 2;
+      current_var = (mc_data_bss_ignore_variable_t)xbt_dynar_get_as(mc_data_bss_comparison_ignore, cursor, mc_data_bss_ignore_variable_t);
+      if(current_var->address == address){
+        MC_UNSET_RAW_MEM;
+        if(raw_mem_set)
+          MC_SET_RAW_MEM;
+        return;
+      }
+      if(current_var->address < address)
+        start = cursor + 1;
+      if(current_var->address > address)
+        end = cursor - 1;
+    }
+    mc_data_bss_ignore_variable_t var = NULL;
+    var = xbt_new0(s_mc_data_bss_ignore_variable_t, 1);
+    var->address = address;
+    var->size = size;
+
+    if(current_var->address < address)
+      xbt_dynar_insert_at(mc_data_bss_comparison_ignore, cursor + 1, &var);
+    else
+      xbt_dynar_insert_at(mc_data_bss_comparison_ignore, cursor, &var);
+
+  }
+
+  MC_UNSET_RAW_MEM;
+
+  if(raw_mem_set)
+    MC_SET_RAW_MEM;
+}
+
+void MC_ignore_stack(const char *var_name, const char *frame){
+  
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
   MC_SET_RAW_MEM;
+
+  if(mc_stack_comparison_ignore == NULL)
+    mc_stack_comparison_ignore = xbt_dynar_new(sizeof(mc_stack_ignore_variable_t), NULL);
+
+  if(xbt_dynar_is_empty(mc_stack_comparison_ignore)){
+
+    mc_stack_ignore_variable_t var = NULL;
+    var = xbt_new0(s_mc_stack_ignore_variable_t, 1);
+    var->var_name = strdup(var_name);
+    var->frame = strdup(frame);
+
+    xbt_dynar_insert_at(mc_stack_comparison_ignore, 0, &var);
+
+  }else{
+    
+    unsigned int cursor = 0;
+    int start = 0;
+    int end = xbt_dynar_length(mc_stack_comparison_ignore) - 1;
+    mc_stack_ignore_variable_t current_var = NULL;
+
+    while(start <= end){
+      cursor = (start + end) / 2;
+      current_var = (mc_stack_ignore_variable_t)xbt_dynar_get_as(mc_stack_comparison_ignore, cursor, mc_stack_ignore_variable_t);
+      if(strcmp(current_var->frame, frame) == 0){
+        if(strcmp(current_var->var_name, var_name) == 0){
+          MC_UNSET_RAW_MEM;
+          if(raw_mem_set)
+            MC_SET_RAW_MEM;
+          return;
+        }
+        if(strcmp(current_var->var_name, var_name) < 0)
+          start = cursor + 1;
+        if(strcmp(current_var->var_name, var_name) > 0)
+          end = cursor - 1;
+      }
+      if(strcmp(current_var->frame, frame) < 0)
+        start = cursor + 1;
+      if(strcmp(current_var->frame, frame) > 0)
+        end = cursor - 1;
+    }
+
+    mc_stack_ignore_variable_t var = NULL;
+    var = xbt_new0(s_mc_stack_ignore_variable_t, 1);
+    var->var_name = strdup(var_name);
+    var->frame = strdup(frame);
+
+    if(strcmp(current_var->frame, frame) < 0)
+      xbt_dynar_insert_at(mc_stack_comparison_ignore, cursor + 1, &var);
+    else
+      xbt_dynar_insert_at(mc_stack_comparison_ignore, cursor, &var);
+
+  }
+
+  MC_UNSET_RAW_MEM;
+  
+  if(raw_mem_set)
+    MC_SET_RAW_MEM;
+
+}
+
+void MC_new_stack_area(void *stack, char *name, void* context, size_t size){
+
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+
+  MC_SET_RAW_MEM;
+  if(stacks_areas == NULL)
+    stacks_areas = xbt_dynar_new(sizeof(stack_region_t), NULL);
+  
   stack_region_t region = NULL;
   region = xbt_new0(s_stack_region_t, 1);
   region->address = stack;
   region->process_name = strdup(name);
   region->context = context;
+  region->size = size;
   xbt_dynar_push(stacks_areas, &region);
+  
   MC_UNSET_RAW_MEM;
+
+  if(raw_mem_set)
+    MC_SET_RAW_MEM;
 }
 
 /************ DWARF ***********/
@@ -724,8 +975,10 @@ xbt_dict_t MC_get_location_list(const char *elf_file){
 
   FILE *fp = popen(command, "r");
 
-  if(fp == NULL)
+  if(fp == NULL){
     perror("popen for objdump failed");
+    xbt_abort();
+  }
 
   int debug = 0; /*Detect if the program has been compiled with -g */
 
@@ -824,8 +1077,11 @@ char *get_libsimgrid_path(){
   char *command = bprintf("ldd %s", xbt_binary_name);
   
   FILE *fp = popen(command, "r");
-  if(fp == NULL)
+
+  if(fp == NULL){
     perror("popen for ldd failed");
+    xbt_abort();
+  }
 
   char *line;
   ssize_t read;
@@ -1264,7 +1520,7 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr){
         dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
         new_element->type = e_dw_bregister_op;
         new_element->location.breg_op.reg = atoi(strtok(tok2, "DW_OP_breg"));
-        new_element->location.breg_op.offset = atoi(xbt_dynar_get_as(tokens2, 2, char*));
+        new_element->location.breg_op.offset = atoi(xbt_dynar_get_as(tokens2, 1, char*));
         xbt_dynar_push(loc->location.compose, &new_element);
       }else if(strncmp(tok2, "DW_OP_lit", 9) == 0){
         dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
index d111368..81f7120 100644 (file)
@@ -11,6 +11,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_liveness, mc,
                                 "Logging specific to algorithms for liveness properties verification");
 
 xbt_dynar_t reached_pairs;
+xbt_dynar_t visited_pairs;
 xbt_dynar_t successors;
 
 int create_dump(int pair)
@@ -50,9 +51,144 @@ int create_dump(int pair)
   return 0;
 }
 
+void MC_print_comparison_times_statistics(mc_comparison_times_t ct){
+
+  XBT_DEBUG("Comparisons done : %d", ct->nb_comparisons);
+  
+  double total, min, max;
+  unsigned int cursor;
+  
+  if(xbt_dynar_length(ct->chunks_used_comparison_times) > 0){
+    cursor = 0;
+    total = 0.0;
+    max = 0.0;
+    min = xbt_dynar_get_as(ct->chunks_used_comparison_times, cursor, double);
+    while(cursor < xbt_dynar_length(ct->chunks_used_comparison_times) - 1){
+      total += xbt_dynar_get_as(ct->chunks_used_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->chunks_used_comparison_times, cursor, double) > max)
+        max = xbt_dynar_get_as(ct->chunks_used_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->chunks_used_comparison_times, cursor, double) < min)
+        min = xbt_dynar_get_as(ct->chunks_used_comparison_times, cursor, double);
+      cursor++;
+    }
+    XBT_DEBUG("Chunks used comparison -- Different states : %lu/%d, time (in seconds) : average = %lf, max = %lf, min = %lf", xbt_dynar_length(ct->chunks_used_comparison_times), ct->nb_comparisons, total/xbt_dynar_length(ct->chunks_used_comparison_times), max, min);
+  }
+
+  if(xbt_dynar_length(ct->stacks_sizes_comparison_times) > 0){
+    cursor = 0;
+    total = 0.0;
+    max = 0.0;
+    min = xbt_dynar_get_as(ct->stacks_sizes_comparison_times, cursor, double);
+    while(cursor < xbt_dynar_length(ct->stacks_sizes_comparison_times) - 1){
+      total += xbt_dynar_get_as(ct->stacks_sizes_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->stacks_sizes_comparison_times, cursor, double) > max)
+        max = xbt_dynar_get_as(ct->stacks_sizes_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->stacks_sizes_comparison_times, cursor, double) < min)
+        min = xbt_dynar_get_as(ct->stacks_sizes_comparison_times, cursor, double);
+      cursor++;
+    }
+    XBT_DEBUG("Stacks sizes comparison -- Different states : %lu/%d, time (in seconds) : average = %lf, max = %lf, min = %lf", xbt_dynar_length(ct->stacks_sizes_comparison_times), ct->nb_comparisons, total/xbt_dynar_length(ct->stacks_sizes_comparison_times), max, min);
+  }
+
+  if(xbt_dynar_length(ct->program_data_segment_comparison_times) > 0){
+    cursor = 0;
+    total = 0.0;
+    max = 0.0;
+    min = xbt_dynar_get_as(ct->program_data_segment_comparison_times, cursor, double);
+    while(cursor < xbt_dynar_length(ct->program_data_segment_comparison_times) - 1){
+      total += xbt_dynar_get_as(ct->program_data_segment_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->program_data_segment_comparison_times, cursor, double) > max)
+        max = xbt_dynar_get_as(ct->program_data_segment_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->program_data_segment_comparison_times, cursor, double) < min)
+        min = xbt_dynar_get_as(ct->program_data_segment_comparison_times, cursor, double);
+      cursor++;
+    }
+    XBT_DEBUG("Program data/bss segments comparison -- Different states : %lu/%d, time (in seconds) : average = %lf, max = %lf, min = %lf", xbt_dynar_length(ct->program_data_segment_comparison_times), ct->nb_comparisons, total/xbt_dynar_length(ct->program_data_segment_comparison_times), max, min);
+  }
+
+  if(xbt_dynar_length(ct->libsimgrid_data_segment_comparison_times) > 0){
+    cursor = 0;
+    total = 0.0;
+    max = 0.0;
+    min = xbt_dynar_get_as(ct->libsimgrid_data_segment_comparison_times, cursor, double);
+    while(cursor < xbt_dynar_length(ct->libsimgrid_data_segment_comparison_times) - 1){
+      total += xbt_dynar_get_as(ct->libsimgrid_data_segment_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->libsimgrid_data_segment_comparison_times, cursor, double) > max)
+        max = xbt_dynar_get_as(ct->libsimgrid_data_segment_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->libsimgrid_data_segment_comparison_times, cursor, double) < min)
+        min = xbt_dynar_get_as(ct->libsimgrid_data_segment_comparison_times, cursor, double);
+      cursor++;
+    }
+    XBT_DEBUG("Libsimgrid data/bss segments comparison -- Different states : %lu/%d, time (in seconds) : average = %lf, max = %lf, min = %lf", xbt_dynar_length(ct->libsimgrid_data_segment_comparison_times), ct->nb_comparisons, total/xbt_dynar_length(ct->libsimgrid_data_segment_comparison_times), max, min);
+  }
+
+  if(xbt_dynar_length(ct->heap_comparison_times) > 0){
+    cursor = 0;
+    total = 0.0;
+    max = 0.0;
+    min = xbt_dynar_get_as(ct->heap_comparison_times, cursor, double);
+    while(cursor < xbt_dynar_length(ct->heap_comparison_times) - 1){
+      total += xbt_dynar_get_as(ct->heap_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->heap_comparison_times, cursor, double) > max)
+        max = xbt_dynar_get_as(ct->heap_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->heap_comparison_times, cursor, double) < min)
+        min = xbt_dynar_get_as(ct->heap_comparison_times, cursor, double);
+      cursor++;
+    }
+    XBT_DEBUG("Heap comparison -- Different states : %lu/%d, time (in seconds) : average = %lf, max = %lf, min = %lf", xbt_dynar_length(ct->heap_comparison_times), ct->nb_comparisons, total/xbt_dynar_length(ct->heap_comparison_times), max, min);
+  }
+
+  if(xbt_dynar_length(ct->stacks_comparison_times) > 0){
+    cursor = 0;
+    total = 0.0;
+    max = 0.0;
+    min = xbt_dynar_get_as(ct->stacks_comparison_times, cursor, double);
+    while(cursor < xbt_dynar_length(ct->stacks_comparison_times) - 1){
+      total += xbt_dynar_get_as(ct->stacks_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->stacks_comparison_times, cursor, double) > max)
+        max = xbt_dynar_get_as(ct->stacks_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->stacks_comparison_times, cursor, double) < min)
+        min = xbt_dynar_get_as(ct->stacks_comparison_times, cursor, double);
+      cursor++;
+    }
+    XBT_DEBUG("Stacks comparison -- Different states : %lu/%d, time (in seconds) : average = %lf, max = %lf, min = %lf", xbt_dynar_length(ct->stacks_comparison_times), ct->nb_comparisons, total/xbt_dynar_length(ct->stacks_comparison_times), max, min);
+  }
+
+  if(xbt_dynar_length(ct->snapshot_comparison_times) > 0){
+    cursor = 0;
+    total = 0.0;
+    max = 0.0;
+    min = xbt_dynar_get_as(ct->snapshot_comparison_times, cursor, double);
+    while(cursor < xbt_dynar_length(ct->snapshot_comparison_times) - 1){
+      total += xbt_dynar_get_as(ct->snapshot_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->snapshot_comparison_times, cursor, double) > max)
+        max = xbt_dynar_get_as(ct->snapshot_comparison_times, cursor, double);
+      if(xbt_dynar_get_as(ct->snapshot_comparison_times, cursor, double) < min)
+        min = xbt_dynar_get_as(ct->snapshot_comparison_times, cursor, double);
+      cursor++;
+    }
+    XBT_DEBUG("Snapshot comparison (Whole funnel) -- Different states : %lu/%d, time (in seconds) : average = %lf, max = %lf, min = %lf", xbt_dynar_length(ct->snapshot_comparison_times), ct->nb_comparisons, total/xbt_dynar_length(ct->snapshot_comparison_times), max, min);
+  }
+
+}
+
+mc_comparison_times_t new_comparison_times(){
+  mc_comparison_times_t ct = NULL;
+  ct = xbt_new0(s_mc_comparison_times_t, 1);
+  ct->nb_comparisons = 0;
+  ct->snapshot_comparison_times = xbt_dynar_new(sizeof(double), NULL);
+  ct->chunks_used_comparison_times = xbt_dynar_new(sizeof(double), NULL);
+  ct->stacks_sizes_comparison_times = xbt_dynar_new(sizeof(double), NULL);
+  ct->program_data_segment_comparison_times = xbt_dynar_new(sizeof(double), NULL);
+  ct->libsimgrid_data_segment_comparison_times = xbt_dynar_new(sizeof(double), NULL);
+  ct->heap_comparison_times = xbt_dynar_new(sizeof(double), NULL);
+  ct->stacks_comparison_times = xbt_dynar_new(sizeof(double), NULL);
+  return ct;
+}
+
 int reached(xbt_state_t st){
 
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
   MC_SET_RAW_MEM;
 
@@ -61,8 +197,8 @@ int reached(xbt_state_t st){
   new_pair->nb = xbt_dynar_length(reached_pairs) + 1;
   new_pair->automaton_state = st;
   new_pair->prop_ato = xbt_dynar_new(sizeof(int), NULL);
-  new_pair->system_state = xbt_new0(s_mc_snapshot_t, 1); 
-  MC_take_snapshot_liveness(new_pair->system_state);  
+  new_pair->comparison_times = new_comparison_times();
+  new_pair->system_state = MC_take_snapshot();  
   
   /* Get values of propositional symbols */
   int res;
@@ -77,12 +213,15 @@ int reached(xbt_state_t st){
   
   MC_UNSET_RAW_MEM;
   
-  if(xbt_dynar_is_empty(reached_pairs) || !compare){
+  if(xbt_dynar_is_empty(reached_pairs)/* || !compare*/){
 
     MC_SET_RAW_MEM;
     /* New pair reached */
     xbt_dynar_push(reached_pairs, &new_pair); 
     MC_UNSET_RAW_MEM;
+
+    if(raw_mem_set)
+      MC_SET_RAW_MEM;
  
     return 0;
 
@@ -94,10 +233,11 @@ int reached(xbt_state_t st){
     mc_pair_reached_t pair_test = NULL;
      
     xbt_dynar_foreach(reached_pairs, cursor, pair_test){
-      XBT_INFO("Pair reached #%d", pair_test->nb);
+      if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug))
+        XBT_DEBUG("****** Pair reached #%d ******", pair_test->nb);
       if(automaton_state_compare(pair_test->automaton_state, st) == 0){
         if(propositional_symbols_compare_value(pair_test->prop_ato, new_pair->prop_ato) == 0){
-          if(snapshot_compare(new_pair->system_state, pair_test->system_state) == 0){
+          if(snapshot_compare(new_pair->system_state, pair_test->system_state, new_pair->comparison_times, pair_test->comparison_times) == 0){
             
             if(raw_mem_set)
               MC_SET_RAW_MEM;
@@ -107,10 +247,14 @@ int reached(xbt_state_t st){
             return 1;
           }       
         }else{
-          XBT_INFO("Different values of propositional symbols");
+          XBT_DEBUG("Different values of propositional symbols");
         }
       }else{
-        XBT_INFO("Different automaton state");
+        XBT_DEBUG("Different automaton state");
+      }
+      if(pair_test->comparison_times != NULL && XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){
+        XBT_DEBUG("*** Comparison times statistics ***");
+        MC_print_comparison_times_statistics(pair_test->comparison_times);
       }
     }
 
@@ -121,9 +265,7 @@ int reached(xbt_state_t st){
 
     if(raw_mem_set)
       MC_SET_RAW_MEM;
-    else
-      MC_UNSET_RAW_MEM;
-
     compare = 0;
     
     return 0;
@@ -134,7 +276,7 @@ int reached(xbt_state_t st){
 
 void set_pair_reached(xbt_state_t st){
 
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
  
   MC_SET_RAW_MEM;
 
@@ -143,8 +285,8 @@ void set_pair_reached(xbt_state_t st){
   pair->nb = xbt_dynar_length(reached_pairs) + 1;
   pair->automaton_state = st;
   pair->prop_ato = xbt_dynar_new(sizeof(int), NULL);
-  pair->system_state = xbt_new0(s_mc_snapshot_t, 1); 
-  MC_take_snapshot_liveness(pair->system_state);
+  pair->comparison_times = new_comparison_times();
+  pair->system_state = MC_take_snapshot();
 
   /* Get values of propositional symbols */
   unsigned int cursor = 0;
@@ -164,9 +306,92 @@ void set_pair_reached(xbt_state_t st){
 
   if(raw_mem_set)
     MC_SET_RAW_MEM;
-  else
+    
+}
+
+int visited(xbt_state_t st){
+
+  if(_surf_mc_visited == 0)
+    return 0;
+
+  int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+
+  MC_SET_RAW_MEM;
+
+  mc_pair_visited_t new_pair = NULL;
+  new_pair = xbt_new0(s_mc_pair_visited_t, 1);
+  new_pair->automaton_state = st;
+  new_pair->prop_ato = xbt_dynar_new(sizeof(int), NULL);
+  new_pair->system_state = MC_take_snapshot();  
+  
+  /* Get values of propositional symbols */
+  int res;
+  int_f_void_t f;
+  unsigned int cursor = 0;
+  xbt_propositional_symbol_t ps = NULL;
+  xbt_dynar_foreach(_mc_property_automaton->propositional_symbols, cursor, ps){
+    f = (int_f_void_t)ps->function;
+    res = (*f)();
+    xbt_dynar_push_as(new_pair->prop_ato, int, res);
+  }
+  
+  MC_UNSET_RAW_MEM;
+  
+  if(xbt_dynar_is_empty(visited_pairs)){
+
+    MC_SET_RAW_MEM;
+    /* New pair visited */
+    xbt_dynar_push(visited_pairs, &new_pair); 
     MC_UNSET_RAW_MEM;
+
+    if(raw_mem_set)
+      MC_SET_RAW_MEM;
+    return 0;
+
+  }else{
+
+    MC_SET_RAW_MEM;
     
+    cursor = 0;
+    mc_pair_visited_t pair_test = NULL;
+     
+    xbt_dynar_foreach(visited_pairs, cursor, pair_test){
+      if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug))
+        XBT_DEBUG("****** Pair visited #%d ******", cursor + 1);
+      if(automaton_state_compare(pair_test->automaton_state, st) == 0){
+        if(propositional_symbols_compare_value(pair_test->prop_ato, new_pair->prop_ato) == 0){
+          if(snapshot_compare(new_pair->system_state, pair_test->system_state, NULL, NULL) == 0){
+            if(raw_mem_set)
+              MC_SET_RAW_MEM;
+            else
+              MC_UNSET_RAW_MEM;
+            
+            return 1;
+          }   
+        }else{
+          XBT_DEBUG("Different values of propositional symbols");
+        }
+      }else{
+        XBT_DEBUG("Different automaton state");
+      }
+    }
+
+    if(xbt_dynar_length(visited_pairs) == _surf_mc_visited){
+      xbt_dynar_remove_at(visited_pairs, 0, NULL);
+    }
+
+    /* New pair visited */
+    xbt_dynar_push(visited_pairs, &new_pair); 
+    
+    MC_UNSET_RAW_MEM;
+
+    if(raw_mem_set)
+      MC_SET_RAW_MEM;
+    
+    return 0;
+    
+  }
 }
 
 void MC_pair_delete(mc_pair_t pair){
@@ -217,12 +442,30 @@ int MC_automaton_evaluate_label(xbt_exp_label_t l){
 
 /********************* Double-DFS stateless *******************/
 
-void MC_pair_stateless_delete(mc_pair_stateless_t pair){
+void pair_visited_free(mc_pair_visited_t pair){
+  if(pair){
+    pair->automaton_state = NULL;
+    xbt_dynar_free(&(pair->prop_ato));
+    MC_free_snapshot(pair->system_state);
+    xbt_free(pair);
+  }
+}
+
+void pair_visited_free_voidp(void *p){
+  pair_visited_free((mc_pair_visited_t) * (void **) p);
+}
+
+void pair_stateless_free(mc_pair_stateless_t pair){
+  xbt_free(pair->graph_state->system_state);
   xbt_free(pair->graph_state->proc_status);
   xbt_free(pair->graph_state);
   xbt_free(pair);
 }
 
+void pair_stateless_free_voidp(void *p){
+  pair_stateless_free((mc_pair_stateless_t) * (void **) p);
+}
+
 mc_pair_stateless_t new_pair_stateless(mc_state_t sg, xbt_state_t st, int r){
   mc_pair_stateless_t p = NULL;
   p = xbt_new0(s_mc_pair_stateless_t, 1);
@@ -233,13 +476,35 @@ mc_pair_stateless_t new_pair_stateless(mc_state_t sg, xbt_state_t st, int r){
   return p;
 }
 
+void pair_reached_free(mc_pair_reached_t pair){
+  if(pair){
+    pair->automaton_state = NULL;
+    xbt_dynar_free(&(pair->prop_ato));
+    if(pair->comparison_times != NULL){
+      xbt_dynar_free(&(pair->comparison_times->snapshot_comparison_times));
+      xbt_dynar_free(&(pair->comparison_times->chunks_used_comparison_times));
+      xbt_dynar_free(&(pair->comparison_times->stacks_sizes_comparison_times));
+      xbt_dynar_free(&(pair->comparison_times->program_data_segment_comparison_times));
+      xbt_dynar_free(&(pair->comparison_times->libsimgrid_data_segment_comparison_times));
+      xbt_dynar_free(&(pair->comparison_times->heap_comparison_times));
+      xbt_dynar_free(&(pair->comparison_times->stacks_comparison_times));
+    }
+    MC_free_snapshot(pair->system_state);
+    xbt_free(pair);
+  }
+}
+
+void pair_reached_free_voidp(void *p){
+  pair_reached_free((mc_pair_reached_t) * (void **) p);
+}
+
 void MC_ddfs_init(void){
 
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+  initial_state_liveness->raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
-  XBT_INFO("**************************************************");
-  XBT_INFO("Double-DFS init");
-  XBT_INFO("**************************************************");
+  XBT_DEBUG("**************************************************");
+  XBT_DEBUG("Double-DFS init");
+  XBT_DEBUG("**************************************************");
 
   mc_pair_stateless_t mc_initial_pair = NULL;
   mc_state_t initial_graph_state = NULL;
@@ -257,19 +522,15 @@ void MC_ddfs_init(void){
     }
   }
 
-  reached_pairs = xbt_dynar_new(sizeof(mc_pair_reached_t), NULL);
+  reached_pairs = xbt_dynar_new(sizeof(mc_pair_reached_t), pair_reached_free_voidp);
+  visited_pairs = xbt_dynar_new(sizeof(mc_pair_visited_t), pair_visited_free_voidp);
   successors = xbt_dynar_new(sizeof(mc_pair_stateless_t), NULL);
 
   /* Save the initial state */
-  initial_snapshot_liveness = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(initial_snapshot_liveness);
+  initial_state_liveness->snapshot = MC_take_snapshot();
 
   MC_UNSET_RAW_MEM; 
-
-  /* Get .plt section (start and end addresses) for data libsimgrid and data program comparison */
-  get_libsimgrid_plt_section();
-  get_binary_plt_section();
-
+  
   unsigned int cursor = 0;
   xbt_state_t state;
 
@@ -282,7 +543,7 @@ void MC_ddfs_init(void){
       MC_UNSET_RAW_MEM;
       
       if(cursor != 0){
-        MC_restore_snapshot(initial_snapshot_liveness);
+        MC_restore_snapshot(initial_state_liveness->snapshot);
         MC_UNSET_RAW_MEM;
       }
 
@@ -299,7 +560,7 @@ void MC_ddfs_init(void){
         set_pair_reached(state);
 
         if(cursor != 0){
-          MC_restore_snapshot(initial_snapshot_liveness);
+          MC_restore_snapshot(initial_state_liveness->snapshot);
           MC_UNSET_RAW_MEM;
         }
   
@@ -309,7 +570,7 @@ void MC_ddfs_init(void){
     }
   }
 
-  if(raw_mem_set)
+  if(initial_state_liveness->raw_mem_set)
     MC_SET_RAW_MEM;
   else
     MC_UNSET_RAW_MEM;
@@ -320,7 +581,7 @@ void MC_ddfs_init(void){
 
 void MC_ddfs(int search_cycle){
 
-  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+  //initial_state_liveness->raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
   smx_process_t process;
   mc_pair_stateless_t current_pair = NULL;
@@ -336,7 +597,7 @@ void MC_ddfs(int search_cycle){
   _mc_property_automaton->current_state = current_pair->automaton_state;
 
  
-  XBT_INFO("********************* ( Depth = %d, search_cycle = %d )", xbt_fifo_size(mc_stack_liveness), search_cycle);
+  XBT_DEBUG("********************* ( Depth = %d, search_cycle = %d )", xbt_fifo_size(mc_stack_liveness), search_cycle);
  
   mc_stats_pair->visited_pairs++;
 
@@ -353,8 +614,11 @@ void MC_ddfs(int search_cycle){
 
   mc_pair_stateless_t next_pair = NULL;
   mc_pair_stateless_t pair_succ;
+
+  mc_pair_stateless_t remove_pair;
+  mc_pair_reached_t remove_pair_reached;
   
-  if(xbt_fifo_size(mc_stack_liveness) < MAX_DEPTH_LIVENESS){
+  if(xbt_fifo_size(mc_stack_liveness) < _surf_mc_max_depth){
 
     if(current_pair->requests > 0){
 
@@ -363,7 +627,7 @@ void MC_ddfs(int search_cycle){
         /* Debug information */
        
         req_str = MC_request_to_string(req, value);
-        XBT_INFO("Execute: %s", req_str);
+        XBT_DEBUG("Execute: %s", req_str);
         xbt_free(req_str);
 
         MC_state_set_executed_request(current_pair->graph_state, req, value);   
@@ -380,6 +644,12 @@ void MC_ddfs(int search_cycle){
         next_graph_state = MC_state_pair_new();
 
         /* Get enabled process and insert it in the interleave set of the next graph_state */
+        xbt_swag_foreach(process, simix_global->process_list){
+          if(MC_process_is_enabled(process)){
+            XBT_DEBUG("Process %lu enabled with simcall : %d", process->pid, (&process->simcall)->call); 
+          }
+        }
+
         xbt_swag_foreach(process, simix_global->process_list){
           if(MC_process_is_enabled(process)){
             MC_state_interleave_process(next_graph_state, process);
@@ -439,70 +709,96 @@ void MC_ddfs(int search_cycle){
                 MC_show_stack_liveness(mc_stack_liveness);
                 MC_dump_stack_liveness(mc_stack_liveness);
                 MC_print_statistics_pairs(mc_stats_pair);
-                exit(0);
+                xbt_abort();
 
               }else{
 
-                XBT_INFO("Next pair (depth =%d) -> Acceptance pair : graph=%p, automaton=%p(%s)", xbt_fifo_size(mc_stack_liveness) + 1, pair_succ->graph_state, pair_succ->automaton_state, pair_succ->automaton_state->id);
+                if(visited(pair_succ->automaton_state)){
 
-                XBT_INFO("Reached pairs : %lu", xbt_dynar_length(reached_pairs));
+                  XBT_DEBUG("Next pair already visited !");
+                  break;
+            
+                }else{
 
-                MC_SET_RAW_MEM;
-                xbt_fifo_unshift(mc_stack_liveness, pair_succ);
-                MC_UNSET_RAW_MEM;
+                  XBT_DEBUG("Next pair (depth =%d) -> Acceptance pair (%s)", xbt_fifo_size(mc_stack_liveness) + 1, pair_succ->automaton_state->id);
+
+                  XBT_DEBUG("Reached pairs : %lu", xbt_dynar_length(reached_pairs));
+
+                  MC_SET_RAW_MEM;
+                  xbt_fifo_unshift(mc_stack_liveness, pair_succ);
+                  MC_UNSET_RAW_MEM;
     
-                MC_ddfs(search_cycle);
+                  MC_ddfs(search_cycle);
+                
+                }
 
               }
 
             }else{
 
-              MC_SET_RAW_MEM;
-              xbt_fifo_unshift(mc_stack_liveness, pair_succ);
-              MC_UNSET_RAW_MEM;
-              
-              MC_ddfs(search_cycle);
+              if(visited(pair_succ->automaton_state)){
+
+                XBT_DEBUG("Next pair already visited !");
+                break;
+                
+              }else{
+
+                MC_SET_RAW_MEM;
+                xbt_fifo_unshift(mc_stack_liveness, pair_succ);
+                MC_UNSET_RAW_MEM;
+                
+                MC_ddfs(search_cycle);
+              }
                
             }
 
           }else{
+
+            if(visited(pair_succ->automaton_state)){
+
+              XBT_DEBUG("Next pair already visited !");
+              break;
+            
+            }else{
     
-            if(((pair_succ->automaton_state->type == 1) || (pair_succ->automaton_state->type == 2))){
+              if(((pair_succ->automaton_state->type == 1) || (pair_succ->automaton_state->type == 2))){
 
-              XBT_INFO("Next pair (depth =%d) -> Acceptance pair : graph=%p, automaton=%p(%s)", xbt_fifo_size(mc_stack_liveness) + 1, pair_succ->graph_state, pair_succ->automaton_state, pair_succ->automaton_state->id);
+                XBT_DEBUG("Next pair (depth =%d) -> Acceptance pair (%s)", xbt_fifo_size(mc_stack_liveness) + 1, pair_succ->automaton_state->id);
       
-              set_pair_reached(pair_succ->automaton_state); 
+                set_pair_reached(pair_succ->automaton_state); 
 
-              search_cycle = 1;
+                search_cycle = 1;
 
-              XBT_INFO("Reached pairs : %lu", xbt_dynar_length(reached_pairs));
+                XBT_DEBUG("Reached pairs : %lu", xbt_dynar_length(reached_pairs));
 
-            }
+              }
 
-            MC_SET_RAW_MEM;
-            xbt_fifo_unshift(mc_stack_liveness, pair_succ);
-            MC_UNSET_RAW_MEM;
+              MC_SET_RAW_MEM;
+              xbt_fifo_unshift(mc_stack_liveness, pair_succ);
+              MC_UNSET_RAW_MEM;
             
-            MC_ddfs(search_cycle);
+              MC_ddfs(search_cycle);
+
+            }
            
           }
 
-   
           /* Restore system before checking others successors */
           if(cursor != (xbt_dynar_length(successors) - 1))
             MC_replay_liveness(mc_stack_liveness, 1);
-  
-    
+            
         }
 
         if(MC_state_interleave_size(current_pair->graph_state) > 0){
-          XBT_INFO("Backtracking to depth %d", xbt_fifo_size(mc_stack_liveness));
+          XBT_DEBUG("Backtracking to depth %d", xbt_fifo_size(mc_stack_liveness));
           MC_replay_liveness(mc_stack_liveness, 0);
         }
       }
 
  
-    }else{  /*No request to execute, search evolution in Büchi automaton */
+    }else{
+      
+      XBT_DEBUG("No more request to execute in this state, search evolution in Büchi Automaton.");
 
       MC_SET_RAW_MEM;
 
@@ -562,11 +858,11 @@ void MC_ddfs(int search_cycle){
               MC_show_stack_liveness(mc_stack_liveness);
               MC_dump_stack_liveness(mc_stack_liveness);
               MC_print_statistics_pairs(mc_stats_pair);
-              exit(0);
+              xbt_abort();
 
             }else{
 
-              XBT_INFO("Next pair (depth = %d) -> Acceptance pair : graph=%p, automaton=%p(%s)", xbt_fifo_size(mc_stack_liveness) + 1, pair_succ->graph_state, pair_succ->automaton_state, pair_succ->automaton_state->id);
+              XBT_INFO("Next pair (depth = %d) -> Acceptance pair (%s)", xbt_fifo_size(mc_stack_liveness) + 1, pair_succ->automaton_state->id);
         
               XBT_INFO("Reached pairs : %lu", xbt_dynar_length(reached_pairs));
 
@@ -613,34 +909,39 @@ void MC_ddfs(int search_cycle){
         if(cursor != xbt_dynar_length(successors) - 1)
           MC_replay_liveness(mc_stack_liveness, 1);
 
-   
-      }
-           
+      }           
+
     }
     
   }else{
     
-    XBT_INFO("Max depth reached");
-
+    XBT_WARN("/!\\ Max depth reached ! /!\\ ");
+    if(current_pair->requests > 0){
+      XBT_WARN("/!\\ But, there are still processes to interleave. Model-checker will not be able to ensure the soundness of the verification from now. /!\\ "); 
+      XBT_WARN("Notice : the default value of max depth is 1000 but you can change it with cfg=model-check/max_depth:value.");
+    }
+    
   }
 
-  if(xbt_fifo_size(mc_stack_liveness) == MAX_DEPTH_LIVENESS ){
-    XBT_INFO("Pair (graph=%p, automaton =%p, search_cycle = %d, depth = %d) shifted in stack, maximum depth reached", current_pair->graph_state, current_pair->automaton_state, search_cycle, xbt_fifo_size(mc_stack_liveness) );
+  if(xbt_fifo_size(mc_stack_liveness) == _surf_mc_max_depth ){
+    XBT_DEBUG("Pair (depth = %d) shifted in stack, maximum depth reached", xbt_fifo_size(mc_stack_liveness) );
   }else{
-    XBT_INFO("Pair (graph=%p, automaton =%p, search_cycle = %d, depth = %d) shifted in stack", current_pair->graph_state, current_pair->automaton_state, search_cycle, xbt_fifo_size(mc_stack_liveness) );
+    XBT_DEBUG("Pair (depth = %d) shifted in stack", xbt_fifo_size(mc_stack_liveness) );
   }
 
   
   MC_SET_RAW_MEM;
-  xbt_fifo_shift(mc_stack_liveness);
+  remove_pair = xbt_fifo_shift(mc_stack_liveness);
+  xbt_fifo_remove(mc_stack_liveness, remove_pair);
+  remove_pair = NULL;
   if((current_pair->automaton_state->type == 1) || (current_pair->automaton_state->type == 2)){
-    xbt_dynar_pop(reached_pairs, NULL);
+    remove_pair_reached = xbt_dynar_pop_as(reached_pairs, mc_pair_reached_t);
+    pair_reached_free(remove_pair_reached);
+    remove_pair_reached = NULL;
   }
   MC_UNSET_RAW_MEM;
 
-  if(raw_mem_set)
-    MC_SET_RAW_MEM;
-  else
-    MC_UNSET_RAW_MEM;
+  /*if(initial_state_liveness->raw_mem_set)
+    MC_SET_RAW_MEM;*/
 
 }
index caff24d..fcf5333 100644 (file)
@@ -42,19 +42,20 @@ typedef struct s_mc_snapshot_stack{
   void *stack_pointer;
 }s_mc_snapshot_stack_t, *mc_snapshot_stack_t;
 
-void MC_take_snapshot(mc_snapshot_t);
-void MC_take_snapshot_liveness(mc_snapshot_t s);
+typedef struct s_mc_global_t{
+  mc_snapshot_t snapshot;
+  int raw_mem_set;
+}s_mc_global_t, *mc_global_t;
+
+//void MC_take_snapshot(mc_snapshot_t);
+mc_snapshot_t MC_take_snapshot(void);
 void MC_restore_snapshot(mc_snapshot_t);
 void MC_free_snapshot(mc_snapshot_t);
-
+void snapshot_stack_free_voidp(void *s);
 
 /********************************* MC Global **********************************/
 extern double *mc_time;
 
-/* Bound of the MC depth-first search algorithm */
-#define MAX_DEPTH 1000
-#define MAX_DEPTH_LIVENESS 500
-
 int MC_deadlock_check(void);
 void MC_replay(xbt_fifo_t stack, int start);
 void MC_replay_liveness(xbt_fifo_t stack, int all_stack);
@@ -113,6 +114,7 @@ void MC_state_set_executed_request(mc_state_t state, smx_simcall_t req, int valu
 smx_simcall_t MC_state_get_executed_request(mc_state_t state, int *value);
 smx_simcall_t MC_state_get_internal_request(mc_state_t state);
 smx_simcall_t MC_state_get_request(mc_state_t state, int *value);
+void MC_state_remove_interleave_process(mc_state_t state, smx_process_t process);
 
 /****************************** Statistics ************************************/
 typedef struct mc_stats {
@@ -159,8 +161,6 @@ extern void *raw_heap;
 #define MC_SET_RAW_MEM    mmalloc_set_current_heap(raw_heap)
 #define MC_UNSET_RAW_MEM  mmalloc_set_current_heap(std_heap)
 
-extern int raw_mem_set;
-
 /******************************* MEMORY MAPPINGS ***************************/
 /* These functions and data structures implements a binary interface for   */
 /* the proc maps ascii interface                                           */
@@ -193,6 +193,17 @@ void get_libsimgrid_plt_section(void);
 void get_binary_plt_section(void);
 
 extern void *start_data_libsimgrid;
+extern void *end_raw_heap;
+extern void *start_data_binary;
+extern void *start_bss_binary;
+extern char *libsimgrid_path;
+extern void *start_text_libsimgrid;
+extern void *start_bss_libsimgrid;
+extern void *start_plt_libsimgrid;
+extern void *end_plt_libsimgrid;
+extern void *start_plt_binary;
+extern void *end_plt_binary;
+
 
 /********************************** DPOR for safety  **************************************/
 typedef enum {
@@ -202,23 +213,23 @@ typedef enum {
 } e_mc_reduce_t;
 
 extern e_mc_reduce_t mc_reduce_kind;
+extern mc_global_t initial_state_safety;
 
 void MC_dpor_init(void);
 void MC_dpor(void);
 void MC_dpor_exit(void);
-void MC_init_safety(void);
+void MC_init(void);
 
 
 /********************************** Double-DFS for liveness property**************************************/
 
 extern xbt_fifo_t mc_stack_liveness;
-extern mc_snapshot_t initial_snapshot_liveness;
+extern mc_global_t initial_state_liveness;
 extern xbt_automaton_t _mc_property_automaton;
 extern int compare;
-extern void *start_plt_libsimgrid;
-extern void *end_plt_libsimgrid;
-extern void *start_plt_binary;
-extern void *end_plt_binary;
+extern xbt_dynar_t mc_stack_comparison_ignore;
+extern xbt_dynar_t mc_data_bss_comparison_ignore;
+
 
 typedef struct s_mc_pair{
   mc_snapshot_t system_state;
@@ -226,22 +237,49 @@ typedef struct s_mc_pair{
   xbt_state_t automaton_state;
 }s_mc_pair_t, *mc_pair_t;
 
+typedef struct s_mc_comparison_times{
+  int nb_comparisons;
+  xbt_dynar_t snapshot_comparison_times;
+  xbt_dynar_t chunks_used_comparison_times;
+  xbt_dynar_t stacks_sizes_comparison_times;
+  xbt_dynar_t program_data_segment_comparison_times;
+  xbt_dynar_t libsimgrid_data_segment_comparison_times;
+  xbt_dynar_t heap_comparison_times;
+  xbt_dynar_t stacks_comparison_times;
+}s_mc_comparison_times_t, *mc_comparison_times_t;
+
 typedef struct s_mc_pair_reached{
   int nb;
   xbt_state_t automaton_state;
   xbt_dynar_t prop_ato;
   mc_snapshot_t system_state;
+  mc_comparison_times_t comparison_times;
 }s_mc_pair_reached_t, *mc_pair_reached_t;
 
+typedef struct s_mc_pair_visited{
+  xbt_state_t automaton_state;
+  xbt_dynar_t prop_ato;
+  mc_snapshot_t system_state;
+}s_mc_pair_visited_t, *mc_pair_visited_t;
+
 int MC_automaton_evaluate_label(xbt_exp_label_t l);
 mc_pair_t new_pair(mc_snapshot_t sn, mc_state_t sg, xbt_state_t st);
+mc_comparison_times_t new_comparison_times(void);
 
 int reached(xbt_state_t st);
 void set_pair_reached(xbt_state_t st);
-int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2);
+int visited(xbt_state_t st);
+int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2, mc_comparison_times_t ct1, mc_comparison_times_t ct2);
 void MC_pair_delete(mc_pair_t pair);
 void MC_exit_liveness(void);
 mc_state_t MC_state_pair_new(void);
+void pair_reached_free(mc_pair_reached_t pair);
+void pair_reached_free_voidp(void *p);
+void pair_visited_free(mc_pair_visited_t pair);
+void pair_visited_free_voidp(void *p);
+void MC_init_liveness(void);
+void MC_init_memory_map_info(void);
+void MC_print_comparison_times_statistics(mc_comparison_times_t ct);
 
 /* **** Double-DFS stateless **** */
 
@@ -256,13 +294,17 @@ void MC_ddfs_init(void);
 void MC_ddfs(int search_cycle);
 void MC_show_stack_liveness(xbt_fifo_t stack);
 void MC_dump_stack_liveness(xbt_fifo_t stack);
-void MC_pair_stateless_delete(mc_pair_stateless_t pair);
+void pair_stateless_free(mc_pair_stateless_t pair);
+void pair_stateless_free_voidp(void *p);
 
 /********************************** Configuration of MC **************************************/
 extern xbt_fifo_t mc_stack_safety;
 
 extern int _surf_mc_checkpoint;
 extern char* _surf_mc_property_file;
+extern int _surf_mc_timeout;
+extern int _surf_mc_max_depth;
+extern int _surf_mc_visited;
 
 /****** Core dump ******/
 
index ec73bfd..332e857 100644 (file)
@@ -15,7 +15,6 @@ int MC_request_depend(smx_simcall_t r1, smx_simcall_t r2) {
   if(mc_reduce_kind == e_mc_reduce_none)
     return TRUE;
 
-
   if (r1->issuer == r2->issuer)
     return FALSE;
 
@@ -64,16 +63,16 @@ int MC_request_depend(smx_simcall_t r1, smx_simcall_t r2) {
   /* FIXME: the following rule assumes that the result of the
    * isend/irecv call is not stored in a buffer used in the
    * test call. */
-  if(   (r1->call == SIMCALL_COMM_ISEND || r1->call == SIMCALL_COMM_IRECV)
+  /*if(   (r1->call == SIMCALL_COMM_ISEND || r1->call == SIMCALL_COMM_IRECV)
         &&  r2->call == SIMCALL_COMM_TEST)
-    return FALSE;
+        return FALSE;*/
 
   /* FIXME: the following rule assumes that the result of the
    * isend/irecv call is not stored in a buffer used in the
    * test call.*/
-  if(   (r2->call == SIMCALL_COMM_ISEND || r2->call == SIMCALL_COMM_IRECV)
+  /*if(   (r2->call == SIMCALL_COMM_ISEND || r2->call == SIMCALL_COMM_IRECV)
         && r1->call == SIMCALL_COMM_TEST)
-    return FALSE;
+        return FALSE;*/
 
   if(r1->call == SIMCALL_COMM_ISEND && r2->call == SIMCALL_COMM_ISEND
      && r1->comm_isend.rdv != r2->comm_isend.rdv)
@@ -239,6 +238,16 @@ char *MC_request_to_string(smx_simcall_t req, int value)
     }
     break;
 
+  case SIMCALL_MC_SNAPSHOT:
+    type = xbt_strdup("MC_SNAPSHOT");
+    args = '\0';
+    break;
+
+  case SIMCALL_MC_COMPARE_SNAPSHOTS:
+    type = xbt_strdup("MC_COMPARE_SNAPSHOTS");
+    args = '\0';
+    break;
+
   default:
     THROW_UNIMPLEMENTED;
   }
@@ -271,7 +280,9 @@ int MC_request_is_visible(smx_simcall_t req)
     || req->call == SIMCALL_COMM_WAIT
     || req->call == SIMCALL_COMM_WAITANY
     || req->call == SIMCALL_COMM_TEST
-    || req->call == SIMCALL_COMM_TESTANY;
+    || req->call == SIMCALL_COMM_TESTANY
+    || req->call == SIMCALL_MC_SNAPSHOT
+    || req->call == SIMCALL_MC_COMPARE_SNAPSHOTS;
 }
 
 int MC_request_is_enabled(smx_simcall_t req)
@@ -288,7 +299,12 @@ int MC_request_is_enabled(smx_simcall_t req)
      * communication is not ready, it can timeout and won't block.
      * On the other hand if it hasn't a timeout, check if the comm is ready.*/
     if(req->comm_wait.timeout >= 0){
-      return TRUE;
+      if(_surf_mc_timeout == 1){
+        return TRUE;
+      }else{
+        act = req->comm_wait.comm;
+        return (act->comm.src_proc && act->comm.dst_proc);
+      }
     }else{
       act = req->comm_wait.comm;
       return (act->comm.src_proc && act->comm.dst_proc);
index 822d17a..39eef8a 100644 (file)
@@ -51,6 +51,12 @@ void MC_state_interleave_process(mc_state_t state, smx_process_t process)
   state->proc_status[process->pid].interleave_count = 0;
 }
 
+void MC_state_remove_interleave_process(mc_state_t state, smx_process_t process)
+{
+  if(state->proc_status[process->pid].state == MC_INTERLEAVE)
+    state->proc_status[process->pid].state = MC_DONE;
+}
+
 unsigned int MC_state_interleave_size(mc_state_t state)
 {
   unsigned int i, size=0;
diff --git a/src/mc/test/heap_comparison.c b/src/mc/test/heap_comparison.c
deleted file mode 100644 (file)
index 48d343d..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-#include "../mc_private.h"
-
-static void test1(void);
-static void test2(void);
-static void test2(void);
-static void test4(void);
-static void test5(void);
-static void test6(void);
-
-static void test1()
-{
-
-  fprintf(stderr, "\n**************** TEST 1 ****************\nNo modification (successive snapshot)\n");
-  MC_SET_RAW_MEM;
-
-  /* Save first snapshot */
-  mc_snapshot_t snapshot1 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot1);
-
-  /* Save second snapshot */
-  mc_snapshot_t snapshot2 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot2);
-
-  xbt_assert(snapshot_compare(snapshot1, snapshot2) == 0);
-
-  MC_UNSET_RAW_MEM;
-
-  fprintf(stderr, "\n**************** END TEST 1 ****************\n");
-
-  MC_SET_RAW_MEM;
-  
-  MC_free_snapshot(snapshot1);
-  MC_free_snapshot(snapshot2);
-
-  MC_UNSET_RAW_MEM;
-}
-
-static void test2()
-{
-
-  fprintf(stderr, "\n**************** TEST 2 ****************\nMalloc after first snapshot\n");
-
-  MC_SET_RAW_MEM;
-
-  /* Save first snapshot */
-  mc_snapshot_t snapshot1 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot1);
-
-  MC_UNSET_RAW_MEM;
-
-  char* t = malloc(50);
-  t = strdup("toto");
-  MC_SET_RAW_MEM;
-
-  /* Save second snapshot */
-  mc_snapshot_t snapshot2 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot2);
-
-  xbt_assert(snapshot_compare(snapshot1, snapshot2) != 0);
-
-  MC_UNSET_RAW_MEM;
-  
-  fprintf(stderr, "\n**************** END TEST 2 ****************\n");
-
-  free(t);
-
-  MC_SET_RAW_MEM;
-
-  MC_free_snapshot(snapshot1);
-  MC_free_snapshot(snapshot2);
-
-  MC_UNSET_RAW_MEM;
-}
-
-static void test3()
-{
-
-  fprintf(stderr, "\n**************** TEST 3 ****************\nMalloc and free after first snapshot\n");
-
-  MC_SET_RAW_MEM;
-
-  /* Save first snapshot */
-  mc_snapshot_t snapshot1 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot1);
-
-  MC_UNSET_RAW_MEM;
-
-  char *t = malloc(5);
-  t = strdup("toto");
-  free(t);
-
-  MC_SET_RAW_MEM;
-
-  /* Save second snapshot */
-  mc_snapshot_t snapshot2 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot2);
-
-  xbt_assert(snapshot_compare(snapshot1, snapshot2) == 0);
-  
-  MC_UNSET_RAW_MEM;
-  
-  fprintf(stderr, "\n**************** END TEST 3 ****************\n");
-
-  MC_SET_RAW_MEM;
-
-  MC_free_snapshot(snapshot1);
-  MC_free_snapshot(snapshot2);
-
-  MC_UNSET_RAW_MEM;
-}
-
-static void test4()
-{
-
-  fprintf(stderr, "\n**************** TEST 4 ****************\nMalloc before first snapshot and free after first snapshot\n");
-
-  char *t = malloc(5);
-  t = strdup("toto");
-
-  MC_SET_RAW_MEM;
-
-  /* Save first snapshot */
-  mc_snapshot_t snapshot1 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot1);
-
-  MC_UNSET_RAW_MEM;
-
-  free(t);
-
-  MC_SET_RAW_MEM;
-
-  /* Save second snapshot */
-  mc_snapshot_t snapshot2 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot2);
-
-  xbt_assert(snapshot_compare(snapshot1, snapshot2) != 0);
-  
-  MC_UNSET_RAW_MEM;
-  
-  fprintf(stderr, "\n**************** END TEST 4 ****************\n");
-  
-  MC_SET_RAW_MEM;
-
-  MC_free_snapshot(snapshot1);
-  MC_free_snapshot(snapshot2);
-
-  MC_UNSET_RAW_MEM;
-}
-
-
-static void test5()
-{
-
-  fprintf(stderr, "\n**************** TEST 5 ****************\nMalloc before first snapshot and increment pointer after first snapshot\n");
-
-  char *ptr1 = malloc(sizeof(char *));
-
-  MC_SET_RAW_MEM;
-
-  /* Save first snapshot */
-  mc_snapshot_t snapshot1 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot1);
-
-  MC_UNSET_RAW_MEM;
-
-  *ptr1 = *ptr1 + 1;
-
-  MC_SET_RAW_MEM;
-
-  /* Save second snapshot */
-  mc_snapshot_t snapshot2 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot2);
-
-  xbt_assert(snapshot_compare(snapshot1, snapshot2) != 0);
-  
-  MC_UNSET_RAW_MEM;
-  
-  fprintf(stderr, "\n**************** END TEST 5 ****************\n");
-
-  MC_SET_RAW_MEM;
-
-  MC_free_snapshot(snapshot1);
-  MC_free_snapshot(snapshot2);
-
-  MC_UNSET_RAW_MEM;
-}
-
-static void test6()
-{
-
-  fprintf(stderr, "\n**************** TEST 6 ****************\nMalloc before first snapshot and increment then decrement pointer after first snapshot\n");
-
-  char *ptr1 = malloc(sizeof(char *));
-
-  MC_SET_RAW_MEM;
-
-  /* Save first snapshot */
-  mc_snapshot_t snapshot1 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot1);
-
-  MC_UNSET_RAW_MEM;
-
-  *ptr1 = *ptr1 + 1;
-  *ptr1 = *ptr1 - 1;
-
-  MC_SET_RAW_MEM;
-
-  /* Save second snapshot */
-  mc_snapshot_t snapshot2 = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(snapshot2);
-
-  xbt_assert(snapshot_compare(snapshot1, snapshot2) == 0);
-  
-  MC_UNSET_RAW_MEM;
-  
-  fprintf(stderr, "\n**************** END TEST 6 ****************\n");
-
-  MC_SET_RAW_MEM;
-
-  MC_free_snapshot(snapshot1);
-  MC_free_snapshot(snapshot2);
-
-  MC_UNSET_RAW_MEM;
-}
-
-
-void MC_test_heap_comparison(){
-
-  MC_memory_init();
-
-  MC_SET_RAW_MEM;
-
-  mc_snapshot_t initial = xbt_new0(s_mc_snapshot_t, 1);
-  MC_take_snapshot_liveness(initial); 
-
-  MC_UNSET_RAW_MEM;
-
-  /* Get .plt section (start and end addresses) for data libsimgrid and data program comparison */
-  get_libsimgrid_plt_section();
-  get_binary_plt_section();
-
-  test1();
-
-  MC_restore_snapshot(initial);
-  MC_UNSET_RAW_MEM;
-  
-  test2();
-  
-  MC_restore_snapshot(initial);
-  MC_UNSET_RAW_MEM;
-
-  test3();
-
-  MC_restore_snapshot(initial);
-  MC_UNSET_RAW_MEM;
-
-  test4();
-
-  MC_restore_snapshot(initial);
-  MC_UNSET_RAW_MEM;
-  
-  test5();
-
-  MC_restore_snapshot(initial);
-  MC_UNSET_RAW_MEM;
-  
-  test6();
-
-  MC_restore_snapshot(initial);
-  MC_UNSET_RAW_MEM;
-}
index d333f8a..81abae0 100644 (file)
@@ -61,7 +61,7 @@ void MSG_init_nocheck(int *argc, char **argv) {
   
   if(MC_is_active()){
     /* Ignore total amount of messages sent during the simulation for heap comparison */
-    MC_ignore(&(msg_global->sent_msg), sizeof(msg_global->sent_msg));
+    MC_ignore_heap(&(msg_global->sent_msg), sizeof(msg_global->sent_msg));
   }
 
 #ifdef HAVE_TRACING
index a883deb..38b579d 100644 (file)
@@ -164,7 +164,7 @@ msg_error_t MSG_process_sleep(double nb_sec)
  *    sometime waiting on all these mailboxes using @ref MSG_comm_waitany. You can find
  *    an example of use of this function in the @ref MSG_examples section.
  *  - Provide a proper patch to implement this functionality back in MSG. That wouldn't be
- *    very difficult actually. Check the function #MSG_mailbox_get_task_ext. During its call to
+ *    very difficult actually. Check the function @ref MSG_mailbox_get_task_ext. During its call to
  *    simcall_comm_recv(), the 5th argument, match_fun, is NULL. Create a function that filters
  *    messages according to the host (that you will pass as sixth argument to simcall_comm_recv()
  *    and that your filtering function will receive as first parameter, and then, the filter could
@@ -433,6 +433,7 @@ int MSG_comm_test(msg_comm_t comm)
 {
   xbt_ex_t e;
   int finished = 0;
+
   TRY {
     finished = simcall_comm_test(comm->s_comm);
 
index 984df9d..17504f2 100644 (file)
@@ -56,6 +56,17 @@ msg_mailbox_t MSG_mailbox_get_by_alias(const char *alias)
   return mailbox;
 }
 
+/** \ingroup msg_mailbox_management
+ * \brief Set the mailbox to receive in asynchronous mode
+ *
+ * All messages sent to this mailbox will be transferred to 
+ * the receiver without waiting for the receive call. 
+ * The receive call will still be necessary to use the received data.
+ * If there is a need to receive some messages asynchronously, and some not, 
+ * two different mailboxes should be used.
+ *
+ * \param alias The name of the mailbox 
+ */
 void MSG_mailbox_set_async(const char *alias){
   msg_mailbox_t mailbox = MSG_mailbox_get_by_alias(alias);
 
@@ -64,6 +75,18 @@ void MSG_mailbox_set_async(const char *alias){
 
 }
 
+/** \ingroup msg_mailbox_management
+ * \brief Get a task from a mailbox on a given host
+ *
+ * \param mailbox The mailbox where the task was sent
+ * \param task a memory location for storing a #msg_task_t.
+ * \param host a #msg_host_t host from where the task was sent
+ * \param timeout a timeout
+
+ * \return Returns
+ * #MSG_OK if the task was successfully received,
+ * #MSG_HOST_FAILURE, or #MSG_TRANSFER_FAILURE otherwise.
+ */
 msg_error_t
 MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, msg_task_t * task,
                          msg_host_t host, double timeout)
@@ -76,7 +99,7 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, msg_task_t * task,
 
 #ifdef HAVE_TRACING
   TRACE_msg_task_get_start();
-  volatile double start_time = MSG_get_clock();
+  double start_time = MSG_get_clock();
 #endif
 
   /* Sanity check */
index 8c318c5..ddce625 100644 (file)
@@ -312,6 +312,12 @@ msg_process_t MSG_process_from_PID(int PID)
 xbt_dynar_t MSG_processes_as_dynar(void) {
   return SIMIX_processes_as_dynar();
 }
+/** @brief Return the current number MSG processes.
+ */
+int MSG_process_get_number(void)
+{
+  return SIMIX_process_count();
+}
 
 /** \ingroup m_process_management
  * \brief Set the kill time of a process.
index fce74f5..b280a7c 100644 (file)
@@ -312,7 +312,9 @@ msg_error_t MSG_task_cancel(msg_task_t task)
 
 /** \ingroup m_task_management
  * \brief Returns the computation amount needed to process a task #msg_task_t.
- *        Once a task has been processed, this amount is thus set to 0...
+ *
+ * Once a task has been processed, this amount is set to 0. If you want, you
+ * can reset this value with #MSG_task_set_compute_duration before restarting the task.
  */
 double MSG_task_get_compute_duration(msg_task_t task)
 {
@@ -325,6 +327,11 @@ double MSG_task_get_compute_duration(msg_task_t task)
 
 /** \ingroup m_task_management
  * \brief set the computation amount needed to process a task #msg_task_t.
+ *
+ * \warning If the computation is ongoing (already started and not finished),
+ * it is not modified by this call. And the termination of the ongoing task with
+ * set the computation_amount to zero, overriding any value set during the
+ * execution.
  */
 
 void MSG_task_set_compute_duration(msg_task_t task,
@@ -338,6 +345,9 @@ void MSG_task_set_compute_duration(msg_task_t task,
 /** \ingroup m_task_management
  * \brief Returns the remaining computation amount of a task #msg_task_t.
  *
+ * If the task is ongoing, this call retrieves the remaining amount of work.
+ * If it is not ongoing, it returns the total amount of work that will be
+ * executed when the task starts.
  */
 double MSG_task_get_remaining_computation(msg_task_t task)
 {
index 70701e0..c890d8c 100644 (file)
@@ -7,10 +7,10 @@
 /* This program is free software; you can redistribute it and/or modify it
   * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#ifndef GRAS_PORTABLE_H
-#define GRAS_PORTABLE_H
+#ifndef SIMGRID_PORTABLE_H
+#define SIMGRID_PORTABLE_H
 
-#include "gras_config.h"
+#include "internal_config.h"
 #include "xbt/misc.h"
 /* 
  * win32 or win64 (__XBT_WIN32 is defined for win32 and win64 applications, __TOS_WIN__ is defined by xlC).
@@ -160,4 +160,4 @@ extern int vasnprintf(char **ptr, size_t str_m, const char *fmt,
 void hexa_print(const char *name, unsigned char *data, int size);
 const char *hexa_str(unsigned char *data, int size, int downside);
 
-#endif                          /* GRAS_PORTABLE_H */
+#endif                          /* SIMGRID_PORTABLE_H */
index 7563cb9..4ad29b0 100644 (file)
@@ -59,7 +59,7 @@ Dark side: restrictions on user code
 
 The incredible performance of this approach comes at a price: using
 SimGrid this way is a *real* pain in the ass. You cannot use MSG nor
-GRAS nor SMPI nor nothing (because none of these interfaces were coded
+SMPI nor nothing (because none of these interfaces were coded
 with the *extrem* requirement of the state_machine in mind), and you
 can only rely on SIMIX. From SIMIX, you can only use simcalls (ie, the
 simcall_* functions). Moreover, you must know that each blocking
diff --git a/src/simix/simix_network.tla b/src/simix/simix_network.tla
new file mode 100644 (file)
index 0000000..9ff81f2
--- /dev/null
@@ -0,0 +1,244 @@
+---- MODULE simix_network ----
+(* This is a TLA module specifying the networking layer of SIMIX. 
+   It is used to verify the soundness of the DPOR reduction algorithm
+   used in the model-checker. 
+
+   If you think you found a new independence lemma, add it to this
+   file and relaunch TLC to check whether your lemma actually holds.
+   *)
+EXTENDS Naturals, Sequences, FiniteSets
+CONSTANTS RdV, Addr, Proc, ValTrue, ValFalse, SendIns, RecvIns, WaitIns, 
+          TestIns, LocalIns
+VARIABLES network, memory, pc
+
+NoProc == CHOOSE p : p \notin Proc
+NoAddr == CHOOSE a : a \notin Addr
+
+Partition(S) == \forall x,y \in S : x \cap y /= {} => x = y
+
+Comm == [id:Nat,
+         rdv:RdV,
+         status:{"send","recv","ready","done"},
+         src:Proc,
+         dst:Proc,
+         data_src:Addr,
+         data_dst:Addr]
+
+ASSUME ValTrue \in Nat
+ASSUME ValFalse \in Nat
+
+(* The set of all the instructions *)
+ASSUME Partition({SendIns, RecvIns, WaitIns, TestIns, LocalIns})
+Instr == UNION {SendIns, RecvIns, WaitIns, TestIns, LocalIns}
+
+------------------------------------------
+(* Independence operator *)
+I(A,B) == ENABLED A /\ ENABLED B => /\ A => (ENABLED B)'
+                                    /\ B => (ENABLED A)'
+                                    /\ A \cdot B \equiv B \cdot A
+
+(* Initially there are no messages in the network and the memory can have anything in their memories *)
+Init == /\ network = {}
+        /\ memory \in [Proc -> [Addr -> Nat]]
+        /\ pc = CHOOSE f : f \in [Proc -> Instr]
+
+(* Let's keep everything in the right domains *)
+TypeInv == /\ network \subseteq Comm
+           /\ memory \in [Proc -> [Addr -> Nat]]
+           /\ pc \in [Proc -> Instr]
+
+(* The set of all communications waiting at rdv *)
+mailbox(rdv) == {comm \in network : comm.rdv=rdv /\ comm.status \in {"send","recv"}}
+
+(* The set of memory addresses of a process being used in a communication *)
+CommBuffers(pid) == 
+  {c.data_src: c \in { y \in network: y.status /= "done" /\ (y.src = pid \/ y.dst = pid)}} 
+\cup {c.data_dst: c \in { y \in network: y.status /= "done" /\ (y.src = pid \/ y.dst = pid)}}
+
+(* This is a send step of the system *)
+(* pid: the process ID of the sender *)
+(* rdv: the rendez-vous point where the "send" communication request is going to be pushed *)
+(* data_r: the address in the sender's memory where the data is stored *)
+(* comm_r: the address in the sender's memory where to store the communication id *)
+Send(pid, rdv, data_r, comm_r) == 
+  /\ rdv \in RdV
+  /\ pid \in Proc
+  /\ data_r \in Addr
+  /\ comm_r \in Addr
+  /\ pc[pid] \in SendIns
+   
+     (* A matching recv request exists in the rendez-vous *)
+     (* Complete the sender fields and set the communication to the ready state *)
+  /\ \/ \exists c \in mailbox(rdv):
+          /\ c.status="recv"
+          /\ \forall d \in mailbox(rdv): d.status="recv" => c.id <= d.id
+          /\ network' = 
+               (network \ {c}) \cup {[c EXCEPT
+                                       !.status = "ready",
+                                       !.src = pid,
+                                       !.data_src = data_r]}
+          (* Use c's existing communication id *)
+          /\ memory' = [memory EXCEPT ![pid][comm_r] = c.id]
+               
+     
+     (* No matching recv communication request exists. *)
+     (* Create a send request and push it in the network. *)
+     \/ /\ ~ \exists c \in mailbox(rdv): c.status = "recv" 
+        /\ LET comm ==  
+                 [id |-> Cardinality(network)+1, 
+                  rdv |-> rdv,
+                  status |-> "send", 
+                  src |-> pid,
+                  dst |-> NoProc, 
+                  data_src |-> data_r,
+                  data_dst |-> NoAddr]
+           IN
+             /\ network' = network \cup {comm}
+             /\ memory' = [memory EXCEPT ![pid][comm_r] = comm.id]           
+  /\ \E ins \in Instr : pc' = [pc EXCEPT ![pid] = ins]
+
+(* This is a receive step of the system *)
+(* pid: the process ID of the receiver *)
+(* rdv: the Rendez-vous where the "receive" communication request is going to be pushed *)
+(* data_r: the address in the receivers's memory where the data is going to be stored *)
+(* comm_r: the address in the receivers's memory where to store the communication id *)
+Recv(pid, rdv, data_r, comm_r) == 
+  /\ rdv \in RdV
+  /\ pid \in Proc
+  /\ data_r \in Addr
+  /\ comm_r \in Addr
+  /\ pc[pid] \in RecvIns
+  
+     (* A matching send request exists in the rendez-vous *)
+     (* Complete the receiver fields and set the communication to the ready state *)
+  /\ \/ \exists c \in mailbox(rdv):
+          /\ c.status="send"
+          /\ \forall d \in mailbox(rdv): d.status="send" => c.id <= d.id
+          /\ network' = 
+               (network \ {c}) \cup {[c EXCEPT
+                                       !.status = "ready",
+                                       !.dst = pid,
+                                       !.data_dst = data_r]}
+          (* Use c's existing communication id *)
+          /\ memory' = [memory EXCEPT ![pid][comm_r] = c.id]
+               
+     
+     (* No matching send communication request exists. *)
+     (* Create a recv request and push it in the network. *)
+     \/ /\ ~ \exists c \in mailbox(rdv): c.status = "send" 
+        /\ LET comm ==  
+                 [id |-> Cardinality(network)+1,
+                  status |-> "recv", 
+                  dst |-> pid, 
+                  data_dst |-> data_r]
+           IN
+             /\ network' = network \cup {comm}
+             /\ memory' = [memory EXCEPT ![pid][comm_r] = comm.id]           
+  /\ \E ins \in Instr : pc' = [pc EXCEPT ![pid] = ins]
+
+(* Wait for at least one communication from a given list to complete *)
+(* pid: the process ID issuing the wait *)
+(* comms: the list of addresses in the process's memory where the communication ids are stored *)
+Wait(pid, comms) ==
+  /\ comms \subseteq Addr
+  /\ pid \in Proc
+  /\ pc[pid] \in WaitIns
+  /\ \E comm_r \in comms, c \in network: c.id = memory[pid][comm_r] /\
+     \/ /\ c.status = "ready"
+        /\ memory' = [memory EXCEPT ![c.dst][c.data_dst] = memory[c.src][c.data_src]]
+        /\ network' = (network \ {c}) \cup {[c EXCEPT !.status = "done"]}
+     \/ /\ c.status = "done"
+        /\ UNCHANGED <<memory,network>>
+  /\ \E ins \in Instr : pc' = [pc EXCEPT ![pid] = ins]
+
+(* Test if at least one communication from a given list has completed *)
+(* pid: the process ID issuing the wait *)
+(* comms: the list of addresses in the process's memory where the communication ids are stored *)
+(* ret_r: the address in the process's memory where the result is going to be stored *)
+Test(pid, comms, ret_r) ==
+  /\ comms \subseteq Addr
+  /\ ret_r \in Addr
+  /\ pid \in Proc
+  /\ pc[pid] \in TestIns
+  /\ \/ \E comm_r \in comms, c\in network: c.id = memory[pid][comm_r] /\
+        \/ /\ c.status = "ready"
+           /\ memory' = [memory EXCEPT ![c.dst][c.data_dst] = memory[c.src][c.data_src],
+                                        ![pid][ret_r] = ValTrue]
+           /\ network' = (network \ {c}) \cup {[c EXCEPT !.status = "done"]}
+        \/ /\ c.status = "done"
+           /\ memory' = [memory EXCEPT ![pid][ret_r] = ValTrue]
+           /\ UNCHANGED network
+     \/ ~ \exists comm_r \in comms, c \in network: c.id = memory[pid][comm_r]
+        /\ c.status \in {"ready","done"}
+        /\ memory' = [memory EXCEPT ![pid][ret_r] = ValFalse]
+        /\ UNCHANGED network 
+  /\ \E ins \in Instr : pc' = [pc EXCEPT ![pid] = ins]
+
+(* Local instruction execution *)
+Local(pid) ==
+    /\ pid \in Proc
+    /\ pc[pid] \in LocalIns
+    /\ memory' \in [Proc -> [Addr -> Nat]]
+    /\ \forall p \in Proc, a \in Addr: memory'[p][a] /= memory[p][a]
+       => p = pid /\ a \notin CommBuffers(pid)
+    /\ \E ins \in Instr : pc' = [pc EXCEPT ![pid] = ins]
+    /\ UNCHANGED network
+
+Next == \exists p \in Proc, data_r \in Addr, comm_r \in Addr, rdv \in RdV,
+                ret_r \in Addr, ids \in SUBSET network:
+          \/ Send(p, rdv, data_r, comm_r)
+          \/ Recv(p, rdv, data_r, comm_r)
+          \/ Wait(p, comm_r)
+          \/ Test(p, comm_r, ret_r)
+          \/ Local(p)
+          
+Spec == Init /\ [][Next]_<<network,memory>>
+-------------------------------
+(* Independence of iSend / iRecv steps *)
+THEOREM \forall p1, p2 \in Proc: \forall rdv1, rdv2 \in RdV: 
+        \forall data1, data2, comm1, comm2 \in Addr:
+        /\ p1 /= p2
+        /\ ENABLED Send(p1, rdv1, data1, comm1)
+        /\ ENABLED Recv(p2, rdv2, data2, comm2)
+        => I(Send(p1, rdv1, data1, comm1), Recv(p2, rdv2, data2, comm2))
+
+(* Independence of iSend and Wait *)
+THEOREM \forall p1, p2 \in Proc: \forall data, comm1, comm2 \in Addr:
+        \forall rdv \in RdV: \exists c \in network:
+        /\ p1 /= p2
+        /\ c.id = memory[p2][comm2]
+        /\ \/ (p1 /= c.dst /\ p1 /= c.src)
+           \/ (comm1 /= c.data_src /\ comm1 /= c.data_dst)
+        /\ ENABLED Send(p1, rdv, data, comm1)
+        /\ ENABLED Wait(p2, comm2)
+        => I(Send(p1, rdv, data, comm1), Wait(p2, comm2)) 
+
+(* Independence of iSend's in different rendez-vous *)
+THEOREM \forall p1, p2 \in Proc: \forall rdv1, rdv2 \in RdV: 
+        \forall data1, data2, comm1, comm2 \in Addr:
+        /\ p1 /= p2
+        /\ rdv1 /= rdv2
+        /\ ENABLED Send(p1, rdv1, data1, comm1)
+        /\ ENABLED Send(p2, rdv2, data2, comm2)
+        => I(Send(p1, rdv1, data1, comm1),
+             Send(p2, rdv2, data2, comm2))
+
+(* Independence of iRecv's in different rendez-vous *)
+THEOREM \forall p1, p2 \in Proc: \forall rdv1, rdv2 \in RdV: 
+        \forall data1, data2, comm1, comm2 \in Addr:
+        /\ p1 /= p2
+        /\ rdv1 /= rdv2
+        /\ ENABLED Recv(p1, rdv1, data1, comm1)
+        /\ ENABLED Recv(p2, rdv2, data2, comm2)
+        => I(Recv(p1, rdv1, data1, comm1),
+             Recv(p2, rdv2, data2, comm2))
+
+(* Independence of Wait of different processes on the same comm *)
+THEOREM \forall p1, p2 \in Proc: \forall comm1, comm2 \in Addr:
+        /\ p1 /= p2
+        /\ comm1 = comm2
+        /\ ENABLED Wait(p1, comm1)
+        /\ ENABLED Wait(p2, comm2)
+        => I(Wait(p1, comm1), Wait(p2, comm2))
+====
+\* Generated at Thu Feb 18 13:49:35 CET 2010
index 9e1a961..8c1e185 100644 (file)
@@ -11,7 +11,7 @@
 #include "xbt/swag.h"
 #include "xbt/xbt_os_thread.h"
 #include "smx_private.h"
-#include "gras_config.h"
+#include "internal_config.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_context, simix,
                                 "Context switching mechanism");
@@ -19,7 +19,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_context, simix,
 char* smx_context_factory_name = NULL; /* factory name specified by --cfg=contexts/factory:value */
 smx_ctx_factory_initializer_t smx_factory_initializer_to_use = NULL;
 int smx_context_stack_size = 128 * 1024;
-
+int smx_context_stack_size_was_set = 0;
 #ifdef HAVE_THREAD_LOCAL_STORAGE
 static __thread smx_context_t smx_current_context_parallel;
 #else
index 1f3161b..97cbb0c 100644 (file)
@@ -49,7 +49,7 @@ smx_ctx_base_factory_create_context_sized(size_t size,
 
   /* Store the address of the stack in heap to compare it apart of heap comparison */
   if(MC_is_active())
-    MC_ignore(context, size);
+    MC_ignore_heap(context, size);
 
   /* If the user provided a function for the process then use it.
      Otherwise, it is the context for maestro and we should set it as the
index c89d706..fd9058e 100644 (file)
@@ -328,7 +328,7 @@ smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv,
        raw_maestro_context = context;
 
        if(MC_is_active())
-         MC_ignore(&(raw_maestro_context->stack_top), sizeof(raw_maestro_context->stack_top));
+         MC_ignore_heap(&(raw_maestro_context->stack_top), sizeof(raw_maestro_context->stack_top));
 
      }
 
index 7bdcfc3..9acbbd1 100644 (file)
@@ -10,7 +10,7 @@
 
 #include "xbt/parmap.h"
 #include "smx_private.h"
-#include "gras_config.h"
+#include "internal_config.h"
 #include "context_sysv_config.h"        /* loads context system definitions */
 #include "mc/mc.h"
 
@@ -169,7 +169,7 @@ smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
   }
 
   if(MC_is_active() && code)
-    MC_new_stack_area(context, ((smx_process_t)((smx_context_t)context)->data)->name, &(context->uc));
+    MC_new_stack_area(context, ((smx_process_t)((smx_context_t)context)->data)->name, &(context->uc), size);
 
   return (smx_context_t) context;
 }
@@ -232,6 +232,11 @@ static void smx_ctx_sysv_suspend_serial(smx_context_t context)
   smx_context_t next_context;
   unsigned long int i = sysv_process_index++;
 
+  if(MC_is_active()){
+    MC_ignore_stack("next_context", "smx_ctx_sysv_suspend_serial");
+    MC_ignore_stack("i", "smx_ctx_sysv_suspend_serial");
+  }
+
   if (i < xbt_dynar_length(simix_global->process_to_run)) {
     /* execute the next process */
     XBT_DEBUG("Run next process");
index c8260db..79652a5 100644 (file)
@@ -92,12 +92,16 @@ smx_ctx_thread_factory_create_context(xbt_main_func_t code, int argc,
   if (code) {
     context->begin = xbt_os_sem_init(0);
     context->end = xbt_os_sem_init(0);
+    if (smx_context_stack_size_was_set)
+      xbt_os_thread_setstacksize(smx_context_stack_size);
+
     /* create and start the process */
     /* NOTE: The first argument to xbt_os_thread_create used to be the process *
     * name, but now the name is stored at SIMIX level, so we pass a null  */
     context->thread =
       xbt_os_thread_create(NULL, smx_ctx_thread_wrapper, context, context);
 
+
     /* wait the starting of the newly created process */
     xbt_os_sem_acquire(context->end);
 
index 728da6f..3315b51 100644 (file)
@@ -92,7 +92,6 @@ void SIMIX_global_init(int *argc, char **argv)
     __xbt_running_ctx_fetch = SIMIX_process_get_running_context;
     __xbt_ex_terminate = SIMIX_process_exception_terminate;
 
-    /* Initialize the SIMIX network module */
     SIMIX_network_init();
 
     /* Prepare to display some more info when dying on Ctrl-C pressing */
@@ -107,7 +106,6 @@ void SIMIX_global_init(int *argc, char **argv)
     simix_timers = xbt_heap_new(8, &free);
   }
 
-  XBT_DEBUG("ADD SIMIX LEVELS");
   SIMIX_HOST_LEVEL = xbt_lib_add_level(host_lib,SIMIX_host_destroy);
 
   atexit(SIMIX_clean);
index 6a7a7a4..82313fb 100644 (file)
@@ -13,7 +13,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_network, simix,
                                 "Logging specific to SIMIX (network)");
 
 static xbt_dict_t rdv_points = NULL;
-unsigned long int smx_total_comms = 0;
+XBT_IMPORT_NO_EXPORT(unsigned long int) smx_total_comms = 0;
 
 static void SIMIX_waitany_remove_simcall_from_actions(smx_simcall_t simcall);
 static void SIMIX_comm_copy_data(smx_action_t comm);
@@ -31,7 +31,7 @@ void SIMIX_network_init(void)
 {
   rdv_points = xbt_dict_new_homogeneous(SIMIX_rdv_free);
   if(MC_is_active())
-    MC_ignore(&smx_total_comms, sizeof(smx_total_comms));
+    MC_ignore_data_bss(&smx_total_comms, sizeof(smx_total_comms));
 }
 
 void SIMIX_network_exit(void)
index 59f4342..257ea0e 100644 (file)
@@ -258,7 +258,8 @@ static XBT_INLINE smx_context_t SIMIX_context_new(xbt_main_func_t code,
                                                   void_pfn_smxprocess_t cleanup_func,
                                                   smx_process_t simix_process)
 {
-
+  if (!simix_global)
+    xbt_die("simix is not initialized, please call MSG_init first");
   return simix_global->context_factory->create_context(code,
                                                        argc, argv,
                                                        cleanup_func,
@@ -312,7 +313,6 @@ static XBT_INLINE smx_context_t SIMIX_context_self(void)
   if (simix_global && simix_global->context_factory) {
     return simix_global->context_factory->self();
   }
-
   return NULL;
 }
 
index 95bf7c7..e9418a4 100644 (file)
@@ -214,7 +214,7 @@ void SIMIX_process_create(smx_process_t *process,
   *process = NULL;
   smx_host_t host = SIMIX_host_get_by_name(hostname);
 
-  XBT_DEBUG("Start process %s on host %s", name, hostname);
+  XBT_DEBUG("Start process %s on host '%s'", name, hostname);
 
   if (!SIMIX_host_get_state(host)) {
     XBT_WARN("Cannot launch process '%s' on failed host '%s'", name,
@@ -709,6 +709,7 @@ void SIMIX_process_yield(smx_process_t self)
     self->doexception = 0;
     SMX_THROW();
   }
+
 }
 
 /* callback: context fetching */
index 973dd82..67dc288 100644 (file)
@@ -1,6 +1,7 @@
 #include "smx_private.h"
 #include "xbt/fifo.h"
 #include "xbt/xbt_os_thread.h"
+#include "../mc/mc_private.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_smurf, simix,
                                 "Logging specific to SIMIX (SMURF)");
@@ -24,6 +25,7 @@ void SIMIX_simcall_push(smx_process_t self)
               SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
     SIMIX_process_yield(self);
   } else {
+    XBT_DEBUG("I'm the maestro, execute the simcall directly");
     SIMIX_simcall_pre(&self->simcall, 0);
   }
 }
@@ -557,6 +559,19 @@ void SIMIX_simcall_pre(smx_simcall_t simcall, int value)
       SIMIX_simcall_answer(simcall);
       break;
 
+#ifdef HAVE_MC
+    case SIMCALL_MC_SNAPSHOT:
+      simcall->mc_snapshot.s = MC_take_snapshot();
+      SIMIX_simcall_answer(simcall);
+      break;
+
+    case SIMCALL_MC_COMPARE_SNAPSHOTS:
+      simcall->mc_compare_snapshots.result =
+        snapshot_compare(simcall->mc_compare_snapshots.snapshot1, simcall->mc_compare_snapshots.snapshot2, NULL, NULL);
+      SIMIX_simcall_answer(simcall);
+      break;
+#endif /* HAVE_MC */
+
     case SIMCALL_NONE:
       THROWF(arg_error,0,"Asked to do the noop syscall on %s@%s",
           SIMIX_process_get_name(simcall->issuer),
index adff451..ad7ef06 100644 (file)
@@ -120,8 +120,16 @@ SIMCALL_ENUM_ELEMENT(SIMCALL_NEW_API_INIT)
 #define SIMCALL_LIST3
 #endif
 
+#ifdef HAVE_MC
+#define SIMCALL_LIST4                                        \
+  ,SIMCALL_ENUM_ELEMENT(SIMCALL_MC_SNAPSHOT)                 \
+  ,SIMCALL_ENUM_ELEMENT(SIMCALL_MC_COMPARE_SNAPSHOTS)
+#else
+#define SIMCALL_LIST4
+#endif
+
 /* SIMCALL_LIST is the final macro to use */
-#define SIMCALL_LIST SIMCALL_LIST1 SIMCALL_LIST2 SIMCALL_LIST3
+#define SIMCALL_LIST SIMCALL_LIST1 SIMCALL_LIST2 SIMCALL_LIST3 SIMCALL_LIST4
 
 /* you can redefine the following macro differently to generate something else
  * with the list of enumeration values (e.g. a table of strings or a table of function pointers) */
@@ -607,6 +615,16 @@ typedef struct s_smx_simcall {
       xbt_dict_t result;
     } asr_get_properties;
 
+    struct{
+      void *s;
+    } mc_snapshot;
+
+    struct{
+      void *snapshot1;
+      void *snapshot2;
+      int result;
+    } mc_compare_snapshots;
+
     /* ****************************************************************************************** */
     /* TUTORIAL: New API                                                                        */
     /* ****************************************************************************************** */
index 7f32016..47d9021 100644 (file)
@@ -80,7 +80,7 @@ xbt_dict_t simcall_host_get_properties(smx_host_t host)
  * \ingroup simix_host_management
  * \brief Returns a dict of the properties assigned to a router or AS.
  *
- * \param asr name of the router or AS
+ * \param name The name of the router or AS
  * \return The properties
  */
 xbt_dict_t simcall_asr_get_properties(const char *name)
@@ -1268,7 +1268,7 @@ int simcall_comm_is_latency_bounded(smx_action_t comm)
 smx_mutex_t simcall_mutex_init(void)
 {
   if(!simix_global) {
-    fprintf(stderr,"You must run MSG_init or gras_init before using MSG or GRAS\n"); // I would have loved using xbt_die but I can't since it is not initialized yet... :)
+    fprintf(stderr,"You must run MSG_init before using MSG\n"); // We can't use xbt_die since we may get there before the initialization
     xbt_abort();
   }
   smx_simcall_t simcall = SIMIX_simcall_mine();
@@ -1651,6 +1651,35 @@ xbt_dict_t simcall_file_ls(const char* mount, const char* path)
   return simcall->file_ls.result;
 }
 
+#ifdef HAVE_MC
+
+void *simcall_mc_snapshot(void)
+{
+  smx_simcall_t simcall = SIMIX_simcall_mine();
+  simcall->call = SIMCALL_MC_SNAPSHOT;
+  
+  SIMIX_simcall_push(simcall->issuer);
+
+  return simcall->mc_snapshot.s;
+}
+
+int simcall_mc_compare_snapshots(void *s1, void *s2){
+  
+  smx_simcall_t simcall = SIMIX_simcall_mine();
+  simcall->call = SIMCALL_MC_COMPARE_SNAPSHOTS;
+  simcall->mc_compare_snapshots.snapshot1 = s1;
+  simcall->mc_compare_snapshots.snapshot2 = s2;
+  
+  if(MC_is_active()) /* Initialize result to a default value for snapshot comparison done during simcall */
+    simcall->mc_compare_snapshots.result = -1;
+  
+  SIMIX_simcall_push(simcall->issuer);
+  
+  return simcall->mc_compare_snapshots.result;
+}
+
+#endif /* HAVE_MC */
+
 /* ****************************************************************************************** */
 /* TUTORIAL: New API                                                                          */
 /* All functions for simcall                                                                  */
index 74b3568..4219adb 100644 (file)
@@ -95,6 +95,7 @@ MPI_Aint smpi_datatype_lb(MPI_Datatype datatype);
 MPI_Aint smpi_datatype_ub(MPI_Datatype datatype);
 int smpi_datatype_extent(MPI_Datatype datatype, MPI_Aint * lb,
                          MPI_Aint * extent);
+MPI_Aint smpi_datatype_get_extent(MPI_Datatype datatype);
 int smpi_datatype_copy(void *sendbuf, int sendcount, MPI_Datatype sendtype,
                        void *recvbuf, int recvcount,
                        MPI_Datatype recvtype);
@@ -112,7 +113,7 @@ int smpi_datatype_hindexed(int count, int* blocklens, MPI_Aint* indices,
 int smpi_datatype_struct(int count, int* blocklens, MPI_Aint* indices,
                     MPI_Datatype* old_types, MPI_Datatype* new_type);
 
-void smpi_datatype_create(MPI_Datatype* new_type, int size,int realsize, int has_subtype, void *struct_type, int flags);
+void smpi_datatype_create(MPI_Datatype* new_type, int size,int lb, int ub, int has_subtype, void *struct_type, int flags);
 
 
 void smpi_datatype_free(MPI_Datatype* type);
@@ -177,7 +178,7 @@ int smpi_mpi_get_count(MPI_Status * status, MPI_Datatype datatype);
 void smpi_mpi_wait(MPI_Request * request, MPI_Status * status);
 int smpi_mpi_waitany(int count, MPI_Request requests[],
                      MPI_Status * status);
-void smpi_mpi_waitall(int count, MPI_Request requests[],
+int smpi_mpi_waitall(int count, MPI_Request requests[],
                       MPI_Status status[]);
 int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices,
                       MPI_Status status[]);
@@ -250,6 +251,7 @@ void mpi_abort__(int* comm, int* errorcode, int* ierr);
 void mpi_comm_rank__(int* comm, int* rank, int* ierr);
 void mpi_comm_size__(int* comm, int* size, int* ierr);
 double mpi_wtime__(void);
+double mpi_wtick__(void);
 
 void mpi_comm_dup__(int* comm, int* newcomm, int* ierr);
 void mpi_comm_split__(int* comm, int* color, int* key, int* comm_out, int* ierr);
@@ -287,9 +289,20 @@ void mpi_gather__(void* sendbuf, int* sendcount, int* sendtype,
 void mpi_allgather__(void* sendbuf, int* sendcount, int* sendtype,
                      void* recvbuf, int* recvcount, int* recvtype,
                      int* comm, int* ierr);
+void mpi_allgatherv__(void* sendbuf, int* sendcount, int* sendtype,
+                     void* recvbuf, int* recvcount,int* displs, int* recvtype,
+                     int* comm, int* ierr) ;
+void mpi_type_size__(int* datatype, int *size, int* ierr);
+
 void mpi_scan__(void* sendbuf, void* recvbuf, int* count, int* datatype,
                 int* op, int* comm, int* ierr);
 void mpi_alltoall__(void* sendbuf, int* sendcount, int* sendtype,
                     void* recvbuf, int* recvcount, int* recvtype, int* comm, int* ierr);
+void mpi_get_processor_name__(char *name, int *resultlen, int* ierr);
+void mpi_test__ (int * request, int *flag, MPI_Status * status, int* ierr);
+void mpi_get_count__(MPI_Status * status, int* datatype, int *count, int* ierr);
+void mpi_type_extent__(int* datatype, MPI_Aint * extent, int* ierr);
+void mpi_type_lb__(int* datatype, MPI_Aint * extent, int* ierr);
+void mpi_type_ub__(int* datatype, MPI_Aint * extent, int* ierr);
 
 #endif
index 9ad302a..a534910 100644 (file)
@@ -5,7 +5,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "private.h"
-#include "xbt/time.h"
+#include "xbt/virtu.h"
 #include "mc/mc.h"
 #include "xbt/replay.h"
 #include <errno.h>
@@ -152,7 +152,7 @@ void smpi_mpi_start(MPI_Request request)
              "Cannot (re)start a non-finished communication");
   if(request->flags & RECV) {
     print_request("New recv", request);
-    if (request->size < xbt_cfg_get_int(_surf_cfg_set, "smpi/async_small_thres"))
+    if (request->size < surf_cfg_get_int("smpi/async_small_thres"))
       mailbox = smpi_process_mailbox_small();
     else
       mailbox = smpi_process_mailbox();
@@ -167,7 +167,7 @@ void smpi_mpi_start(MPI_Request request)
 /*      return;*/
 /*    }*/
     print_request("New send", request);
-    if (request->size < xbt_cfg_get_int(_surf_cfg_set, "smpi/async_small_thres")) { // eager mode
+    if (request->size < surf_cfg_get_int("smpi/async_small_thres")) { // eager mode
       mailbox = smpi_process_remote_mailbox_small(receiver);
     }else{
       XBT_DEBUG("Send request %p is not in the permanent receive mailbox (buf: %p)",request,request->buf);
@@ -306,6 +306,7 @@ static void finish_wait(MPI_Request * request, MPI_Status * status)
 {
   MPI_Request req = *request;
   // if we have a sender, we should use its data, and not the data from the receive
+  //FIXME : mail fail if req->action has already been freed, the pointer being invalid
   if((req->action)&&
      (req->src==MPI_ANY_SOURCE || req->tag== MPI_ANY_TAG))
     req = (MPI_Request)SIMIX_comm_get_src_data((*request)->action);
@@ -313,7 +314,10 @@ static void finish_wait(MPI_Request * request, MPI_Status * status)
   if(status != MPI_STATUS_IGNORE) {
     status->MPI_SOURCE = req->src;
     status->MPI_TAG = req->tag;
+    //if((*request)->action && ((MPI_Request)SIMIX_comm_get_src_data((*request)->action))->size == (*request)->size)
     status->MPI_ERROR = MPI_SUCCESS;
+    //else status->MPI_ERROR = MPI_ERR_TRUNCATE;
+    // this handles the case were size in receive differs from size in send
     // FIXME: really this should just contain the count of receive-type blocks,
     // right?
     status->count = req->size;
@@ -440,7 +444,7 @@ void smpi_mpi_iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status*
 
   print_request("New iprobe", request);
   // We have to test both mailboxes as we don't know if we will receive one one or another
-    if (xbt_cfg_get_int(_surf_cfg_set, "smpi/async_small_thres")>0){
+    if (surf_cfg_get_int("smpi/async_small_thres")>0){
         mailbox = smpi_process_mailbox_small();
         XBT_DEBUG("trying to probe the perm recv mailbox");
         request->action = simcall_comm_iprobe(mailbox, request->src, request->tag, &match_recv, (void*)request);
@@ -518,12 +522,13 @@ int smpi_mpi_waitany(int count, MPI_Request requests[],
   return index;
 }
 
-void smpi_mpi_waitall(int count, MPI_Request requests[],
+int smpi_mpi_waitall(int count, MPI_Request requests[],
                       MPI_Status status[])
 {
   int  index, c;
   MPI_Status stat;
   MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat;
+  int retvalue=MPI_SUCCESS;
   //tag invalid requests in the set
   for(c = 0; c < count; c++) {
     if(requests[c]==MPI_REQUEST_NULL || requests[c]->dst == MPI_PROC_NULL ){
@@ -548,10 +553,12 @@ void smpi_mpi_waitall(int count, MPI_Request requests[],
        }
       if(status != MPI_STATUSES_IGNORE) {
         memcpy(&status[index], pstat, sizeof(*pstat));
+        if(status[index].MPI_ERROR==MPI_ERR_TRUNCATE)retvalue=MPI_ERR_IN_STATUS;
 
       }
     }
   }
+  return retvalue;
 }
 
 int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices,
index 58c8c5a..2732ec9 100644 (file)
@@ -136,14 +136,13 @@ void smpi_execute_flops(double flops) {
 static void smpi_execute(double duration)
 {
   /* FIXME: a global variable would be less expensive to consult than a call to xbt_cfg_get_double() right on the critical path */
-  if (duration >= xbt_cfg_get_double(_surf_cfg_set, "smpi/cpu_threshold")) {
+  if (duration >= surf_cfg_get_double("smpi/cpu_threshold")) {
     XBT_DEBUG("Sleep for %f to handle real computation time", duration);
     smpi_execute_flops(duration *
-                       xbt_cfg_get_double(_surf_cfg_set,
-                                          "smpi/running_power"));
+               surf_cfg_get_double("smpi/running_power"));
   } else {
     XBT_DEBUG("Real computation took %f while option smpi/cpu_threshold is set to %f => ignore it",
-        duration, xbt_cfg_get_double(_surf_cfg_set, "smpi/cpu_threshold"));
+        duration, surf_cfg_get_double("smpi/cpu_threshold"));
   }
 }
 
@@ -169,7 +168,7 @@ unsigned int smpi_sleep(unsigned int secs)
   return secs;
 }
 
-int smpi_gettimeofday(struct timeval *tv, struct timezone *tz)
+int smpi_gettimeofday(struct timeval *tv)
 {
   double now;
   smpi_bench_end();
index c467cc8..ffe8916 100644 (file)
@@ -101,6 +101,9 @@ void mpi_init__(int* ierr) {
    new_datatype(MPI_UINT16_T);
    new_datatype(MPI_UINT32_T);
    new_datatype(MPI_UINT64_T);
+   new_datatype(MPI_2FLOAT);
+   new_datatype(MPI_2DOUBLE);
+
 
    op_lookup = xbt_dynar_new(sizeof(MPI_Op), NULL);
    new_op(MPI_MAX);
@@ -148,6 +151,10 @@ double mpi_wtime__(void) {
    return MPI_Wtime();
 }
 
+double mpi_wtick__(void) {
+  return MPI_Wtick();
+}
+
 void mpi_comm_dup__(int* comm, int* newcomm, int* ierr) {
   MPI_Comm tmp;
 
@@ -311,6 +318,13 @@ void mpi_allgather__(void* sendbuf, int* sendcount, int* sendtype,
                         recvbuf, *recvcount, get_datatype(*recvtype), get_comm(*comm));
 }
 
+void mpi_allgatherv__(void* sendbuf, int* sendcount, int* sendtype,
+                     void* recvbuf, int* recvcount,int* displs, int* recvtype,
+                     int* comm, int* ierr) {
+  *ierr = MPI_Allgatherv(sendbuf, *sendcount, get_datatype(*sendtype),
+                        recvbuf, recvcount, displs, get_datatype(*recvtype), get_comm(*comm));
+}
+
 void mpi_scan__(void* sendbuf, void* recvbuf, int* count, int* datatype,
                 int* op, int* comm, int* ierr) {
   *ierr = MPI_Scan(sendbuf, recvbuf, *count, get_datatype(*datatype),
@@ -322,3 +336,32 @@ void mpi_alltoall__(void* sendbuf, int* sendcount, int* sendtype,
   *ierr = MPI_Alltoall(sendbuf, *sendcount, get_datatype(*sendtype),
                        recvbuf, *recvcount, get_datatype(*recvtype), get_comm(*comm));
 }
+
+void mpi_test__ (int * request, int *flag, MPI_Status * status, int* ierr){
+  MPI_Request req = find_request(*request);
+  *ierr= MPI_Test(&req, flag, status);
+}
+void mpi_get_processor_name__(char *name, int *resultlen, int* ierr){
+  *ierr = MPI_Get_processor_name(name, resultlen);
+}
+
+void mpi_get_count__(MPI_Status * status, int* datatype, int *count, int* ierr){
+  *ierr = MPI_Get_count(status, get_datatype(*datatype), count);
+}
+
+void mpi_type_extent__(int* datatype, MPI_Aint * extent, int* ierr){
+  *ierr= MPI_Type_extent(get_datatype(*datatype),  extent);
+}
+
+void mpi_type_ub__(int* datatype, MPI_Aint * disp, int* ierr){
+  *ierr= MPI_Type_ub(get_datatype(*datatype), disp);
+}
+
+void mpi_type_lb__(int* datatype, MPI_Aint * extent, int* ierr){
+  *ierr= MPI_Type_extent(get_datatype(*datatype), extent);
+}
+
+void mpi_type_size__(int* datatype, int *size, int* ierr)
+{
+  *ierr = MPI_Type_size(get_datatype(*datatype), size);
+}
index 8c02fb4..4ee0b81 100644 (file)
@@ -35,6 +35,10 @@ static int process_count = 0;
 
 MPI_Comm MPI_COMM_WORLD = MPI_COMM_NULL;
 
+MPI_Errhandler* MPI_ERRORS_RETURN = NULL;
+MPI_Errhandler* MPI_ERRORS_ARE_FATAL = NULL;
+MPI_Errhandler* MPI_ERRHANDLER_NULL = NULL;
+
 #define MAILBOX_NAME_MAXLEN (5 + sizeof(int) * 2 + 1)
 
 static char* get_mailbox_name(char* str, int index) {
@@ -282,33 +286,24 @@ void smpi_global_destroy(void)
 /* Fortran specific stuff */
 /* With smpicc, the following weak symbols are used */
 /* With smpiff, the following weak symbols are replaced by those in libf2c */
+
 int __attribute__((weak)) xargc;
 char** __attribute__((weak)) xargv;
 
-int __attribute__((weak)) main(int argc, char** argv) {
-   xargc = argc;
-   xargv = argv;
-   return MAIN__();
-}
-
-#ifdef WIN32
-#include <windows.h>
-
 int __attribute__((weak)) smpi_simulated_main(int argc, char** argv) {
   xbt_die("Should not be in this smpi_simulated_main");
   return 1;
 }
 
-/* TODO FOR WIN32 */
-/* Dummy prototype to make gcc happy */
-int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE hInst2,LPSTR lpstr01,int nCmdShow)
-{
-       return MAIN__();
+int __attribute__((weak)) main(int argc, char** argv) {
+   return smpi_main(smpi_simulated_main,argc,argv);
 }
 
-#endif
+int __attribute__((weak)) MAIN__(){
+  return smpi_main(smpi_simulated_main,xargc, xargv);
+};
 
-int MAIN__(void)
+int smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[])
 {
   srand(SMPI_RAND_SEED);
 
@@ -332,20 +327,20 @@ int MAIN__(void)
   XBT_LOG_CONNECT(smpi_replay);
 
 #ifdef HAVE_TRACING
-  TRACE_global_init(&xargc, xargv);
+  TRACE_global_init(&argc, argv);
 #endif
 
-  SIMIX_global_init(&xargc, xargv);
+  SIMIX_global_init(&argc, argv);
 
 #ifdef HAVE_TRACING
   TRACE_start();
 #endif
 
   // parse the platform file: get the host list
-  SIMIX_create_environment(xargv[1]);
+  SIMIX_create_environment(argv[1]);
 
-  SIMIX_function_register_default(smpi_simulated_main);
-  SIMIX_launch_application(xargv[2]);
+  SIMIX_function_register_default(realmain);
+  SIMIX_launch_application(argv[2]);
 
   smpi_global_init();
 
@@ -354,11 +349,11 @@ int MAIN__(void)
   fflush(stderr);
 
   if (MC_is_active())
-    MC_modelcheck();
+    MC_modelcheck_safety();
   else
     SIMIX_run();
 
-  if (xbt_cfg_get_int(_surf_cfg_set, "smpi/display_timing"))
+  if (surf_cfg_get_int("smpi/display_timing"))
     XBT_INFO("Simulation time: %g seconds.", SIMIX_get_clock());
 
   smpi_global_destroy();
index efc7f6b..17e7614 100644 (file)
@@ -44,6 +44,14 @@ typedef struct {
   float value;
   int index;
 } float_int;
+typedef struct {
+  float value;
+  float index;
+} float_float;
+typedef struct {
+  double value;
+  double index;
+} double_double;
 typedef struct {
   long value;
   int index;
@@ -101,6 +109,9 @@ CREATE_MPI_DATATYPE(MPI_LONG_INT, long_int);
 CREATE_MPI_DATATYPE(MPI_DOUBLE_INT, double_int);
 CREATE_MPI_DATATYPE(MPI_SHORT_INT, short_int);
 CREATE_MPI_DATATYPE(MPI_2INT, int_int);
+CREATE_MPI_DATATYPE(MPI_2FLOAT, float_float);
+CREATE_MPI_DATATYPE(MPI_2DOUBLE, double_double);
+
 CREATE_MPI_DATATYPE(MPI_LONG_DOUBLE_INT, long_double_int);
 
 CREATE_MPI_DATATYPE_NULL(MPI_UB);
@@ -130,16 +141,13 @@ MPI_Aint smpi_datatype_ub(MPI_Datatype datatype)
 int smpi_datatype_extent(MPI_Datatype datatype, MPI_Aint * lb,
                          MPI_Aint * extent)
 {
-  int retval;
+  *lb = datatype->lb;
+  *extent = datatype->ub - datatype->lb;
+  return MPI_SUCCESS;
+}
 
-  if ((datatype->flags & DT_FLAG_COMMITED) != DT_FLAG_COMMITED) {
-    retval = MPI_ERR_TYPE;
-  } else {
-    *lb = datatype->lb;
-    *extent = datatype->ub - datatype->lb;
-    retval = MPI_SUCCESS;
-  }
-  return retval;
+MPI_Aint smpi_datatype_get_extent(MPI_Datatype datatype){
+  return datatype->ub - datatype->lb;
 }
 
 int smpi_datatype_copy(void *sendbuf, int sendcount, MPI_Datatype sendtype,
@@ -207,11 +215,17 @@ void serialize_vector( const void *noncontiguous_vector,
   char* noncontiguous_vector_char = (char*)noncontiguous_vector;
 
   for (i = 0; i < type_c->block_count * count; i++) {
-    memcpy(contiguous_vector_char,
-           noncontiguous_vector_char, type_c->block_length * type_c->size_oldtype);
+      if (type_c->old_type->has_subtype == 0)
+        memcpy(contiguous_vector_char,
+               noncontiguous_vector_char, type_c->block_length * type_c->size_oldtype);
+      else
+        ((s_smpi_subtype_t*)type_c->old_type->substruct)->serialize( noncontiguous_vector_char,
+                                                                     contiguous_vector_char,
+                                                                     type_c->block_length,
+                                                                     type_c->old_type->substruct);
 
     contiguous_vector_char += type_c->block_length*type_c->size_oldtype;
-    noncontiguous_vector_char += type_c->block_stride*type_c->size_oldtype;
+    noncontiguous_vector_char += type_c->block_stride*smpi_datatype_get_extent(type_c->old_type);
   }
 }
 
@@ -236,11 +250,16 @@ void unserialize_vector( const void *contiguous_vector,
   char* noncontiguous_vector_char = (char*)noncontiguous_vector;
 
   for (i = 0; i < type_c->block_count * count; i++) {
-    memcpy(noncontiguous_vector_char,
-           contiguous_vector_char, type_c->block_length * type_c->size_oldtype);
-
+    if (type_c->old_type->has_subtype == 0)
+      memcpy(noncontiguous_vector_char,
+             contiguous_vector_char, type_c->block_length * type_c->size_oldtype);
+    else
+      ((s_smpi_subtype_t*)type_c->old_type->substruct)->unserialize( contiguous_vector_char,
+                                                                     noncontiguous_vector_char,
+                                                                     type_c->block_length,
+                                                                     type_c->old_type->substruct);
     contiguous_vector_char += type_c->block_length*type_c->size_oldtype;
-    noncontiguous_vector_char += type_c->block_stride*type_c->size_oldtype;
+    noncontiguous_vector_char += type_c->block_stride*smpi_datatype_get_extent(type_c->old_type);
   }
 }
 
@@ -267,13 +286,13 @@ s_smpi_mpi_vector_t* smpi_datatype_vector_create( int block_stride,
   return new_t;
 }
 
-void smpi_datatype_create(MPI_Datatype* new_type, int size,int extent, int has_subtype,
+void smpi_datatype_create(MPI_Datatype* new_type, int size,int lb, int ub, int has_subtype,
                           void *struct_type, int flags){
   MPI_Datatype new_t= xbt_new(s_smpi_mpi_datatype_t,1);
   new_t->size = size;
   new_t->has_subtype = has_subtype;
-  new_t->lb = 0;
-  new_t->ub = extent;
+  new_t->lb = lb;
+  new_t->ub = ub;
   new_t->flags = flags;
   new_t->substruct = struct_type;
   *new_type = new_t;
@@ -289,9 +308,14 @@ void smpi_datatype_free(MPI_Datatype* type){
 int smpi_datatype_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_type)
 {
   int retval;
-  smpi_datatype_create(new_type, count *
-                       smpi_datatype_size(old_type),count *
-                       smpi_datatype_size(old_type),0,NULL, DT_FLAG_CONTIGUOUS);
+  if(old_type->has_subtype){
+         //handle this case as a hvector with stride equals to the extent of the datatype
+         return smpi_datatype_hvector(count, 1, smpi_datatype_get_extent(old_type), old_type, new_type);
+  }
+  smpi_datatype_create(new_type,
+                                         count * smpi_datatype_size(old_type),
+                                         0,count * smpi_datatype_size(old_type),
+                                         0,NULL, DT_FLAG_CONTIGUOUS);
   retval=MPI_SUCCESS;
   return retval;
 }
@@ -300,17 +324,23 @@ int smpi_datatype_vector(int count, int blocklen, int stride, MPI_Datatype old_t
 {
   int retval;
   if (blocklen<=0) return MPI_ERR_ARG;
-  if(stride != blocklen){
-  if (old_type->has_subtype == 1)
-    XBT_WARN("vector contains a complex type - not yet handled");
+  MPI_Aint lb = 0;
+  MPI_Aint ub = 0;
+  if(count>0){
+    lb=smpi_datatype_lb(old_type);
+    ub=((count-1)*stride+blocklen-1)*smpi_datatype_get_extent(old_type)+smpi_datatype_ub(old_type);
+  }
+  if(old_type->has_subtype || stride != blocklen){
+
+
     s_smpi_mpi_vector_t* subtype = smpi_datatype_vector_create( stride,
                                                                 blocklen,
                                                                 count,
                                                                 old_type,
                                                                 smpi_datatype_size(old_type));
-    smpi_datatype_create(new_type, count * (blocklen) *
-                         smpi_datatype_size(old_type),
-                        ((count -1) * stride + blocklen) * smpi_datatype_size(old_type),
+    smpi_datatype_create(new_type,
+                         count * (blocklen) * smpi_datatype_size(old_type), lb,
+                         ub,
                          1,
                          subtype,
                          DT_FLAG_VECTOR);
@@ -319,7 +349,7 @@ int smpi_datatype_vector(int count, int blocklen, int stride, MPI_Datatype old_t
     /* in this situation the data are contignous thus it's not
      * required to serialize and unserialize it*/
     smpi_datatype_create(new_type, count * blocklen *
-                         smpi_datatype_size(old_type), ((count -1) * stride + blocklen)*
+                         smpi_datatype_size(old_type), 0, ((count -1) * stride + blocklen)*
                          smpi_datatype_size(old_type),
                          0,
                          NULL,
@@ -357,8 +387,14 @@ void serialize_hvector( const void *noncontiguous_hvector,
   char* noncontiguous_vector_char = (char*)noncontiguous_hvector;
 
   for (i = 0; i < type_c->block_count * count; i++) {
-    memcpy(contiguous_vector_char,
+    if (type_c->old_type->has_subtype == 0)
+      memcpy(contiguous_vector_char,
            noncontiguous_vector_char, type_c->block_length * type_c->size_oldtype);
+    else
+      ((s_smpi_subtype_t*)type_c->old_type->substruct)->serialize( noncontiguous_vector_char,
+                                                                   contiguous_vector_char,
+                                                                   type_c->block_length,
+                                                                   type_c->old_type->substruct);
 
     contiguous_vector_char += type_c->block_length*type_c->size_oldtype;
     noncontiguous_vector_char += type_c->block_stride;
@@ -385,9 +421,14 @@ void unserialize_hvector( const void *contiguous_vector,
   char* noncontiguous_vector_char = (char*)noncontiguous_vector;
 
   for (i = 0; i < type_c->block_count * count; i++) {
-    memcpy(noncontiguous_vector_char,
+    if (type_c->old_type->has_subtype == 0)
+      memcpy(noncontiguous_vector_char,
            contiguous_vector_char, type_c->block_length * type_c->size_oldtype);
-
+    else
+      ((s_smpi_subtype_t*)type_c->old_type->substruct)->unserialize( contiguous_vector_char,
+                                                                     noncontiguous_vector_char,
+                                                                     type_c->block_length,
+                                                                     type_c->old_type->substruct);
     contiguous_vector_char += type_c->block_length*type_c->size_oldtype;
     noncontiguous_vector_char += type_c->block_stride;
   }
@@ -424,25 +465,28 @@ int smpi_datatype_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype
 {
   int retval;
   if (blocklen<=0) return MPI_ERR_ARG;
-  if (old_type->has_subtype == 1)
-      XBT_WARN("hvector contains a complex type - not yet handled");
-  if(stride != blocklen*smpi_datatype_size(old_type)){
+  MPI_Aint lb = 0;
+  MPI_Aint ub = 0;
+  if(count>0){
+    lb=smpi_datatype_lb(old_type);
+    ub=((count-1)*stride)+(blocklen-1)*smpi_datatype_get_extent(old_type)+smpi_datatype_ub(old_type);
+  }
+  if(old_type->has_subtype || stride != blocklen*smpi_datatype_get_extent(old_type)){
     s_smpi_mpi_hvector_t* subtype = smpi_datatype_hvector_create( stride,
                                                                   blocklen,
                                                                   count,
                                                                   old_type,
                                                                   smpi_datatype_size(old_type));
 
-    smpi_datatype_create(new_type, count * blocklen *
-                         smpi_datatype_size(old_type), (count-1) * stride + blocklen *
-                         smpi_datatype_size(old_type),
+    smpi_datatype_create(new_type, count * blocklen * smpi_datatype_size(old_type),
+                                                lb,ub,
                          1,
                          subtype,
                          DT_FLAG_VECTOR);
     retval=MPI_SUCCESS;
   }else{
     smpi_datatype_create(new_type, count * blocklen *
-                                             smpi_datatype_size(old_type),count * blocklen *
+                                             smpi_datatype_size(old_type),0,count * blocklen *
                                              smpi_datatype_size(old_type),
                                             0,
                                             NULL,
@@ -477,12 +521,19 @@ void serialize_indexed( const void *noncontiguous_indexed,
   char* noncontiguous_indexed_char = (char*)noncontiguous_indexed;
   for(j=0; j<count;j++){
     for (i = 0; i < type_c->block_count; i++) {
-      memcpy(contiguous_indexed_char,
-             noncontiguous_indexed_char, type_c->block_lengths[i] * type_c->size_oldtype);
+      if (type_c->old_type->has_subtype == 0)
+        memcpy(contiguous_indexed_char,
+                     noncontiguous_indexed_char, type_c->block_lengths[i] * type_c->size_oldtype);
+      else
+        ((s_smpi_subtype_t*)type_c->old_type->substruct)->serialize( noncontiguous_indexed_char,
+                                                                     contiguous_indexed_char,
+                                                                     type_c->block_lengths[i],
+                                                                     type_c->old_type->substruct);
+
 
       contiguous_indexed_char += type_c->block_lengths[i]*type_c->size_oldtype;
-      if (i<type_c->block_count-1)noncontiguous_indexed_char = (char*)noncontiguous_indexed + type_c->block_indices[i+1]*type_c->size_oldtype;
-      else noncontiguous_indexed_char += type_c->block_lengths[i]*type_c->size_oldtype;
+      if (i<type_c->block_count-1)noncontiguous_indexed_char = (char*)noncontiguous_indexed + type_c->block_indices[i+1]*smpi_datatype_get_extent(type_c->old_type);
+      else noncontiguous_indexed_char += type_c->block_lengths[i]*smpi_datatype_get_extent(type_c->old_type);
     }
     noncontiguous_indexed=(void*)noncontiguous_indexed_char;
   }
@@ -508,12 +559,19 @@ void unserialize_indexed( const void *contiguous_indexed,
   char* noncontiguous_indexed_char = (char*)noncontiguous_indexed;
   for(j=0; j<count;j++){
     for (i = 0; i < type_c->block_count; i++) {
-      memcpy(noncontiguous_indexed_char,
+      if (type_c->old_type->has_subtype == 0)
+        memcpy(noncontiguous_indexed_char,
              contiguous_indexed_char, type_c->block_lengths[i] * type_c->size_oldtype);
+      else
+        ((s_smpi_subtype_t*)type_c->old_type->substruct)->unserialize( contiguous_indexed_char,
+                                                                       noncontiguous_indexed_char,
+                                                                       type_c->block_lengths[i],
+                                                                       type_c->old_type->substruct);
 
       contiguous_indexed_char += type_c->block_lengths[i]*type_c->size_oldtype;
-      if (i<type_c->block_count-1)noncontiguous_indexed_char = (char*)noncontiguous_indexed + type_c->block_indices[i+1]*type_c->size_oldtype;
-      else noncontiguous_indexed_char += type_c->block_lengths[i]*type_c->size_oldtype;
+      if (i<type_c->block_count-1)
+        noncontiguous_indexed_char = (char*)noncontiguous_indexed + type_c->block_indices[i+1]*smpi_datatype_get_extent(type_c->old_type);
+      else noncontiguous_indexed_char += type_c->block_lengths[i]*smpi_datatype_get_extent(type_c->old_type);
     }
     noncontiguous_indexed=(void*)noncontiguous_indexed_char;
   }
@@ -559,15 +617,27 @@ int smpi_datatype_indexed(int count, int* blocklens, int* indices, MPI_Datatype
   int retval;
   int size = 0;
   int contiguous=1;
+  MPI_Aint lb = 0;
+  MPI_Aint ub = 0;
+  if(count>0){
+    lb=indices[0]*smpi_datatype_get_extent(old_type);
+    ub=indices[0]*smpi_datatype_get_extent(old_type) + blocklens[0]*smpi_datatype_ub(old_type);
+  }
+
   for(i=0; i< count; i++){
     if   (blocklens[i]<=0)
       return MPI_ERR_ARG;
     size += blocklens[i];
 
+    if(indices[i]*smpi_datatype_get_extent(old_type)+smpi_datatype_lb(old_type)<lb)
+       lb = indices[i]*smpi_datatype_get_extent(old_type)+smpi_datatype_lb(old_type);
+    if(indices[i]*smpi_datatype_get_extent(old_type)+blocklens[i]*smpi_datatype_ub(old_type)>ub)
+       ub = indices[i]*smpi_datatype_get_extent(old_type)+blocklens[i]*smpi_datatype_ub(old_type);
+
     if ( (i< count -1) && (indices[i]+blocklens[i] != indices[i+1]) )contiguous=0;
   }
   if (old_type->has_subtype == 1)
-    XBT_WARN("indexed contains a complex type - not yet handled");
+    contiguous=0;
 
   if(!contiguous){
     s_smpi_mpi_indexed_t* subtype = smpi_datatype_indexed_create( blocklens,
@@ -576,10 +646,10 @@ int smpi_datatype_indexed(int count, int* blocklens, int* indices, MPI_Datatype
                                                                   old_type,
                                                                   smpi_datatype_size(old_type));
      smpi_datatype_create(new_type,  size *
-                         smpi_datatype_size(old_type),(indices[count-1]+blocklens[count-1])*smpi_datatype_size(old_type),1, subtype, DT_FLAG_DATA);
+                         smpi_datatype_size(old_type),lb,ub,1, subtype, DT_FLAG_DATA);
   }else{
     smpi_datatype_create(new_type,  size *
-                         smpi_datatype_size(old_type),size *
+                         smpi_datatype_size(old_type),0,size *
                          smpi_datatype_size(old_type),0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
   }
   retval=MPI_SUCCESS;
@@ -611,12 +681,18 @@ void serialize_hindexed( const void *noncontiguous_hindexed,
   char* noncontiguous_hindexed_char = (char*)noncontiguous_hindexed;
   for(j=0; j<count;j++){
     for (i = 0; i < type_c->block_count; i++) {
-      memcpy(contiguous_hindexed_char,
-             noncontiguous_hindexed_char, type_c->block_lengths[i] * type_c->size_oldtype);
+      if (type_c->old_type->has_subtype == 0)
+        memcpy(contiguous_hindexed_char,
+                     noncontiguous_hindexed_char, type_c->block_lengths[i] * type_c->size_oldtype);
+      else
+        ((s_smpi_subtype_t*)type_c->old_type->substruct)->serialize( noncontiguous_hindexed_char,
+                                                                     contiguous_hindexed_char,
+                                                                     type_c->block_lengths[i],
+                                                                     type_c->old_type->substruct);
 
       contiguous_hindexed_char += type_c->block_lengths[i]*type_c->size_oldtype;
       if (i<type_c->block_count-1)noncontiguous_hindexed_char = (char*)noncontiguous_hindexed + type_c->block_indices[i+1];
-      else noncontiguous_hindexed_char += type_c->block_lengths[i]*type_c->size_oldtype;
+      else noncontiguous_hindexed_char += type_c->block_lengths[i]*smpi_datatype_get_extent(type_c->old_type);
     }
     noncontiguous_hindexed=(void*)noncontiguous_hindexed_char;
   }
@@ -642,12 +718,18 @@ void unserialize_hindexed( const void *contiguous_hindexed,
   char* noncontiguous_hindexed_char = (char*)noncontiguous_hindexed;
   for(j=0; j<count;j++){
     for (i = 0; i < type_c->block_count; i++) {
-      memcpy(noncontiguous_hindexed_char,
-             contiguous_hindexed_char, type_c->block_lengths[i] * type_c->size_oldtype);
+      if (type_c->old_type->has_subtype == 0)
+        memcpy(noncontiguous_hindexed_char,
+               contiguous_hindexed_char, type_c->block_lengths[i] * type_c->size_oldtype);
+      else
+        ((s_smpi_subtype_t*)type_c->old_type->substruct)->unserialize( contiguous_hindexed_char,
+                                                                       noncontiguous_hindexed_char,
+                                                                       type_c->block_lengths[i],
+                                                                       type_c->old_type->substruct);
 
       contiguous_hindexed_char += type_c->block_lengths[i]*type_c->size_oldtype;
       if (i<type_c->block_count-1)noncontiguous_hindexed_char = (char*)noncontiguous_hindexed + type_c->block_indices[i+1];
-      else noncontiguous_hindexed_char += type_c->block_lengths[i]*type_c->size_oldtype;
+      else noncontiguous_hindexed_char += type_c->block_lengths[i]*smpi_datatype_get_extent(type_c->old_type);
     }
     noncontiguous_hindexed=(void*)noncontiguous_hindexed_char;
   }
@@ -693,27 +775,39 @@ int smpi_datatype_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Dat
   int retval;
   int size = 0;
   int contiguous=1;
+  MPI_Aint lb = 0;
+  MPI_Aint ub = 0;
+  if(count>0){
+    lb=indices[0] + smpi_datatype_lb(old_type);
+    ub=indices[0] + blocklens[0]*smpi_datatype_ub(old_type);
+  }
   for(i=0; i< count; i++){
     if   (blocklens[i]<=0)
       return MPI_ERR_ARG;
     size += blocklens[i];
+
+    if(indices[i]+smpi_datatype_lb(old_type)<lb) lb = indices[i]+smpi_datatype_lb(old_type);
+    if(indices[i]+blocklens[i]*smpi_datatype_ub(old_type)>ub) ub = indices[i]+blocklens[i]*smpi_datatype_ub(old_type);
+
     if ( (i< count -1) && (indices[i]+blocklens[i]*smpi_datatype_size(old_type) != indices[i+1]) )contiguous=0;
   }
-  if (old_type->has_subtype == 1)
-    XBT_WARN("hindexed contains a complex type - not yet handled");
+  if (old_type->has_subtype == 1 || lb!=0)
+    contiguous=0;
+
   if(!contiguous){
     s_smpi_mpi_hindexed_t* subtype = smpi_datatype_hindexed_create( blocklens,
                                                                   indices,
                                                                   count,
                                                                   old_type,
                                                                   smpi_datatype_size(old_type));
-    smpi_datatype_create(new_type,  size *
-                         smpi_datatype_size(old_type),indices[count-1]+blocklens[count-1]*smpi_datatype_size(old_type)
+    smpi_datatype_create(new_type,  size * smpi_datatype_size(old_type),
+                                                lb,
+                         ub
                          ,1, subtype, DT_FLAG_DATA);
   }else{
-    smpi_datatype_create(new_type,  size *
-                         smpi_datatype_size(old_type),size *
-                         smpi_datatype_size(old_type),0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
+    smpi_datatype_create(new_type,  size * smpi_datatype_size(old_type),
+                                            0,size * smpi_datatype_size(old_type),
+                                            0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
   }
   retval=MPI_SUCCESS;
   return retval;
@@ -744,11 +838,19 @@ void serialize_struct( const void *noncontiguous_struct,
   char* noncontiguous_struct_char = (char*)noncontiguous_struct;
   for(j=0; j<count;j++){
     for (i = 0; i < type_c->block_count; i++) {
-      memcpy(contiguous_struct_char,
+      if (type_c->old_types[i]->has_subtype == 0)
+        memcpy(contiguous_struct_char,
              noncontiguous_struct_char, type_c->block_lengths[i] * smpi_datatype_size(type_c->old_types[i]));
+      else
+        ((s_smpi_subtype_t*)type_c->old_types[i]->substruct)->serialize( noncontiguous_struct_char,
+                                                                         contiguous_struct_char,
+                                                                         type_c->block_lengths[i],
+                                                                         type_c->old_types[i]->substruct);
+
+
       contiguous_struct_char += type_c->block_lengths[i]*smpi_datatype_size(type_c->old_types[i]);
       if (i<type_c->block_count-1)noncontiguous_struct_char = (char*)noncontiguous_struct + type_c->block_indices[i+1];
-      else noncontiguous_struct_char += type_c->block_lengths[i]*smpi_datatype_size(type_c->old_types[i]);//let's hope this is MPI_UB ?
+      else noncontiguous_struct_char += type_c->block_lengths[i]*smpi_datatype_get_extent(type_c->old_types[i]);//let's hope this is MPI_UB ?
     }
     noncontiguous_struct=(void*)noncontiguous_struct_char;
   }
@@ -774,11 +876,18 @@ void unserialize_struct( const void *contiguous_struct,
   char* noncontiguous_struct_char = (char*)noncontiguous_struct;
   for(j=0; j<count;j++){
     for (i = 0; i < type_c->block_count; i++) {
-      memcpy(noncontiguous_struct_char,
+      if (type_c->old_types[i]->has_subtype == 0)
+        memcpy(noncontiguous_struct_char,
              contiguous_struct_char, type_c->block_lengths[i] * smpi_datatype_size(type_c->old_types[i]));
+      else
+        ((s_smpi_subtype_t*)type_c->old_types[i]->substruct)->unserialize( contiguous_struct_char,
+                                                                           noncontiguous_struct_char,
+                                                                           type_c->block_lengths[i],
+                                                                           type_c->old_types[i]->substruct);
+
       contiguous_struct_char += type_c->block_lengths[i]*smpi_datatype_size(type_c->old_types[i]);
       if (i<type_c->block_count-1)noncontiguous_struct_char =  (char*)noncontiguous_struct + type_c->block_indices[i+1];
-      else noncontiguous_struct_char += type_c->block_lengths[i]*smpi_datatype_size(type_c->old_types[i]);
+      else noncontiguous_struct_char += type_c->block_lengths[i]*smpi_datatype_get_extent(type_c->old_types[i]);
     }
     noncontiguous_struct=(void*)noncontiguous_struct_char;
     
@@ -828,12 +937,32 @@ int smpi_datatype_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datat
   size_t size = 0;
   int contiguous=1;
   size = 0;
+  MPI_Aint lb = 0;
+  MPI_Aint ub = 0;
+  if(count>0){
+    lb=indices[0] + smpi_datatype_lb(old_types[0]);
+    ub=indices[0] + blocklens[0]*smpi_datatype_ub(old_types[0]);
+  }
+  int forced_lb=0;
+  int forced_ub=0;
   for(i=0; i< count; i++){
     if (blocklens[i]<=0)
       return MPI_ERR_ARG;
     if (old_types[i]->has_subtype == 1)
-      XBT_WARN("Struct contains a complex type - not yet handled");
+      contiguous=0;
+
     size += blocklens[i]*smpi_datatype_size(old_types[i]);
+    if (old_types[i]==MPI_LB){
+      lb=indices[i];
+      forced_lb=1;
+    }
+    if (old_types[i]==MPI_UB){
+      ub=indices[i];
+      forced_ub=1;
+    }
+
+    if(!forced_lb && indices[i]+smpi_datatype_lb(old_types[i])<lb) lb = indices[i];
+    if(!forced_ub && indices[i]+blocklens[i]*smpi_datatype_ub(old_types[i])>ub) ub = indices[i]+blocklens[i]*smpi_datatype_ub(old_types[i]);
 
     if ( (i< count -1) && (indices[i]+blocklens[i]*smpi_datatype_size(old_types[i]) != indices[i+1]) )contiguous=0;
   }
@@ -844,9 +973,9 @@ int smpi_datatype_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datat
                                                               count,
                                                               old_types);
 
-    smpi_datatype_create(new_type,  size, indices[count-1] + blocklens[count-1]*smpi_datatype_size(old_types[count-1]),1, subtype, DT_FLAG_DATA);
+    smpi_datatype_create(new_type,  size, lb, ub,1, subtype, DT_FLAG_DATA);
   }else{
-    smpi_datatype_create(new_type,  size, indices[count-1] + blocklens[count-1]*smpi_datatype_size(old_types[count-1]),0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
+    smpi_datatype_create(new_type,  size, lb, ub,0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
   }
   return MPI_SUCCESS;
 }
@@ -1148,6 +1277,10 @@ static void minloc_func(void *a, void *b, int *length,
     APPLY_FUNC(a, b, length, int_int, MINLOC_OP);
   } else if (*datatype == MPI_LONG_DOUBLE_INT) {
     APPLY_FUNC(a, b, length, long_double_int, MINLOC_OP);
+  } else if (*datatype == MPI_2FLOAT) {
+    APPLY_FUNC(a, b, length, float_float, MINLOC_OP);
+  } else if (*datatype == MPI_2DOUBLE) {
+    APPLY_FUNC(a, b, length, double_double, MINLOC_OP);
   }
 }
 
@@ -1166,6 +1299,10 @@ static void maxloc_func(void *a, void *b, int *length,
     APPLY_FUNC(a, b, length, int_int, MAXLOC_OP);
   } else if (*datatype == MPI_LONG_DOUBLE_INT) {
     APPLY_FUNC(a, b, length, long_double_int, MAXLOC_OP);
+  } else if (*datatype == MPI_2FLOAT) {
+    APPLY_FUNC(a, b, length, float_float, MAXLOC_OP);
+  } else if (*datatype == MPI_2DOUBLE) {
+    APPLY_FUNC(a, b, length, double_double, MAXLOC_OP);
   }
 }
 
index 0db0452..5d85a89 100644 (file)
@@ -182,7 +182,6 @@ int PMPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent
 int PMPI_Type_extent(MPI_Datatype datatype, MPI_Aint * extent)
 {
   int retval;
-  MPI_Aint dummy;
 
   smpi_bench_end();
   if (datatype == MPI_DATATYPE_NULL) {
@@ -190,7 +189,8 @@ int PMPI_Type_extent(MPI_Datatype datatype, MPI_Aint * extent)
   } else if (extent == NULL) {
     retval = MPI_ERR_ARG;
   } else {
-    retval = smpi_datatype_extent(datatype, &dummy, extent);
+    *extent = smpi_datatype_get_extent(datatype);
+    retval = MPI_SUCCESS;
   }
   smpi_bench_begin();
   return retval;
@@ -394,7 +394,7 @@ int PMPI_Group_union(MPI_Group group1, MPI_Group group2,
 int PMPI_Group_intersection(MPI_Group group1, MPI_Group group2,
                            MPI_Group * newgroup)
 {
-  int retval, i, proc1, proc2, size, size2;
+  int retval, i, proc1, proc2, size;
 
   smpi_bench_end();
   if (group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
@@ -402,9 +402,8 @@ int PMPI_Group_intersection(MPI_Group group1, MPI_Group group2,
   } else if (newgroup == NULL) {
     retval = MPI_ERR_ARG;
   } else {
-    size = smpi_group_size(group1);
-    size2 = smpi_group_size(group2);
-    for (i = 0; i < size2; i++) {
+    size = smpi_group_size(group2);
+    for (i = 0; i < size; i++) {
       proc2 = smpi_group_index(group2, i);
       proc1 = smpi_group_rank(group1, proc2);
       if (proc1 == MPI_UNDEFINED) {
@@ -415,12 +414,13 @@ int PMPI_Group_intersection(MPI_Group group1, MPI_Group group2,
       *newgroup = MPI_GROUP_EMPTY;
     } else {
       *newgroup = smpi_group_new(size);
-      size2 = smpi_group_size(group1);
-      for (i = 0; i < size2; i++) {
-        proc1 = smpi_group_index(group1, i);
-        proc2 = smpi_group_rank(group2, proc1);
-        if (proc2 != MPI_UNDEFINED) {
-          smpi_group_set_mapping(*newgroup, proc1, i);
+      int j=0;
+      for (i = 0; i < smpi_group_size(group2); i++) {
+        proc2 = smpi_group_index(group2, i);
+        proc1 = smpi_group_rank(group1, proc2);
+        if (proc1 != MPI_UNDEFINED) {
+          smpi_group_set_mapping(*newgroup, proc2, j);
+          j++;
         }
       }
     }
@@ -498,7 +498,7 @@ int PMPI_Group_incl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup)
 
 int PMPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup)
 {
-  int retval, i, size, rank, index;
+  int retval, i, j, newsize, oldsize, index;
 
   smpi_bench_end();
   if (group == MPI_GROUP_NULL) {
@@ -511,21 +511,26 @@ int PMPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup)
     } else if (n == smpi_group_size(group)) {
       *newgroup = MPI_GROUP_EMPTY;
     } else {
-      size = smpi_group_size(group) - n;
-      *newgroup = smpi_group_new(size);
-      rank = 0;
-      while (rank < size) {
-        for (i = 0; i < n; i++) {
-          if (ranks[i] == rank) {
-            break;
-          }
-        }
-        if (i >= n) {
-          index = smpi_group_index(group, rank);
-          smpi_group_set_mapping(*newgroup, index, rank);
-          rank++;
+      oldsize=smpi_group_size(group);
+      newsize = oldsize - n;
+      *newgroup = smpi_group_new(newsize);
+
+      int* to_exclude=xbt_new(int, smpi_group_size(group));
+      for(i=0; i<oldsize; i++)
+        to_exclude[i]=0;
+      for(i=0; i<n; i++)
+        to_exclude[ranks[i]]=1;
+
+      j=0;
+      for(i=0; i<oldsize; i++){
+        if(to_exclude[i]==0){
+          index = smpi_group_index(group, i);
+          smpi_group_set_mapping(*newgroup, index, j);
+          j++;
         }
       }
+
+      xbt_free(to_exclude);
     }
     smpi_group_use(*newgroup);
     retval = MPI_SUCCESS;
@@ -622,6 +627,7 @@ int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3],
               smpi_group_set_mapping(*newgroup, index, newrank);
             }
           }
+          newrank++; //added to avoid looping, need to be checked ..
         }
       }
     }
@@ -1151,15 +1157,23 @@ int PMPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype,
 {
   //TODO: suboptimal implementation
   void *recvbuf;
-  int retval, size;
+  int retval;
+  if ((datatype == MPI_DATATYPE_NULL)||(datatype->has_subtype==1)) {
+      retval = MPI_ERR_TYPE;
+  } else if (count < 0) {
+      retval = MPI_ERR_COUNT;
+  } else {
+    int size = smpi_datatype_size(datatype) * count;
+    recvbuf = xbt_new(char, size);
+    retval =
+        MPI_Sendrecv(buf, count, datatype, dst, sendtag, recvbuf, count,
+                     datatype, src, recvtag, comm, status);
+    if(retval==MPI_SUCCESS){
+        memcpy(buf, recvbuf, size * sizeof(char));
+    }
+    xbt_free(recvbuf);
 
-  size = smpi_datatype_size(datatype) * count;
-  recvbuf = xbt_new(char, size);
-  retval =
-      MPI_Sendrecv(buf, count, datatype, dst, sendtag, recvbuf, count,
-                   datatype, src, recvtag, comm, status);
-  memcpy(buf, recvbuf, size * sizeof(char));
-  xbt_free(recvbuf);
+  }
   return retval;
 }
 
@@ -1404,7 +1418,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[])
 
   TRACE_smpi_ptp_in(rank_traced, -1, -1, __FUNCTION__);
 #endif
-  smpi_mpi_waitall(count, requests, status);
+  int retval = smpi_mpi_waitall(count, requests, status);
 #ifdef HAVE_TRACING
   for (i = 0; i < count; i++) {
     int src_traced, dst_traced, is_wait_for_receive;
@@ -1423,7 +1437,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[])
   TRACE_smpi_computing_in(rank_traced);
 #endif
   smpi_bench_begin();
-  return MPI_SUCCESS;
+  return retval;
 }
 
 int PMPI_Waitsome(int incount, MPI_Request requests[], int *outcount,
@@ -1914,7 +1928,9 @@ int PMPI_Get_processor_name(char *name, int *resultlen)
 
   smpi_bench_end();
   strncpy(name, SIMIX_host_get_name(SIMIX_host_self()),
-          MPI_MAX_PROCESSOR_NAME - 1);
+          strlen(SIMIX_host_get_name(SIMIX_host_self())) < MPI_MAX_PROCESSOR_NAME - 1 ?
+          strlen(SIMIX_host_get_name(SIMIX_host_self())) +1 :
+          MPI_MAX_PROCESSOR_NAME - 1 );
   *resultlen =
       strlen(name) >
       MPI_MAX_PROCESSOR_NAME ? MPI_MAX_PROCESSOR_NAME : strlen(name);
@@ -2051,6 +2067,11 @@ int PMPI_Type_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype*
   smpi_bench_begin();
   return retval;}
 
+int PMPI_Error_class(int errorcode, int* errorclass) {
+  // assume smpi uses only standard mpi error codes
+  *errorclass=errorcode;
+  return MPI_SUCCESS;
+}
 
 /* The following calls are not yet implemented and will fail at runtime. */
 /* Once implemented, please move them above this notice. */
@@ -2124,10 +2145,6 @@ int PMPI_Topo_test(MPI_Comm comm, int* top_type) {
    return not_yet_implemented();
 }
 
-int PMPI_Error_class(int errorcode, int* errorclass) {
-   return not_yet_implemented();
-}
-
 int PMPI_Errhandler_create(MPI_Handler_function* function, MPI_Errhandler* errhandler) {
    return not_yet_implemented();
 }
index dc35a68..7214b99 100644 (file)
@@ -70,8 +70,11 @@ static void action_comm_size(const char *const *action)
 
   communicator_size = parse_double(action[2]);
 
-  XBT_VERB("%s %f", xbt_str_join_array(action, " "),
-           smpi_process_simulated_elapsed()-clock);
+  if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){
+    char *name = xbt_str_join_array(action, " ");
+    XBT_VERB("%s %f", name, smpi_process_simulated_elapsed()-clock);
+    free(name);
+  }
 }
 
 
@@ -80,8 +83,11 @@ static void action_compute(const char *const *action)
   double clock = smpi_process_simulated_elapsed();
   smpi_execute_flops(parse_double(action[2]));
 
-  XBT_VERB("%s %f", xbt_str_join_array(action, " "),
-           smpi_process_simulated_elapsed()-clock);
+  if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){
+    char *name = xbt_str_join_array(action, " ");
+    XBT_VERB("%s %f", name, smpi_process_simulated_elapsed()-clock);
+    free(name);
+  }
 }
 
 static void action_send(const char *const *action)
@@ -98,9 +104,14 @@ static void action_send(const char *const *action)
 #endif
 
   smpi_mpi_send(NULL, size, MPI_BYTE, to , 0, MPI_COMM_WORLD);
-  XBT_VERB("%s %f", xbt_str_join_array(action, " "),
-           smpi_process_simulated_elapsed()-clock);
-#ifdef HAVE_TRACING
+
+  if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){
+    char *name = xbt_str_join_array(action, " ");
+    XBT_VERB("%s %f", name, smpi_process_simulated_elapsed()-clock);
+    free(name);
+  }
+
+  #ifdef HAVE_TRACING
   TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__);
   TRACE_smpi_computing_in(rank);
 #endif
@@ -133,8 +144,11 @@ static void action_Isend(const char *const *action)
   xbt_dynar_push(globals->isends,&request);
 
   //TODO do the asynchronous cleanup
-  XBT_VERB("%s %f", xbt_str_join_array(action, " "),
-           smpi_process_simulated_elapsed()-clock);
+  if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){
+    char *name = xbt_str_join_array(action, " ");
+    XBT_VERB("%s %f", name, smpi_process_simulated_elapsed()-clock);
+    free(name);
+  }
 }
 
 static void action_recv(const char *const *action) {
@@ -158,8 +172,11 @@ static void action_recv(const char *const *action) {
   TRACE_smpi_computing_in(rank);
 #endif
 
-  XBT_VERB("%s %f", xbt_str_join_array(action, " "),
-           smpi_process_simulated_elapsed()-clock);
+  if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){
+    char *name = xbt_str_join_array(action, " ");
+    XBT_VERB("%s %f", name, smpi_process_simulated_elapsed()-clock);
+    free(name);
+  }
 }
 
 static void action_Irecv(const char *const *action)
@@ -185,8 +202,11 @@ static void action_Irecv(const char *const *action)
   xbt_dynar_push(globals->irecvs,&request);
 
   //TODO do the asynchronous cleanup
-  XBT_VERB("%s %f", xbt_str_join_array(action, " "),
-           smpi_process_simulated_elapsed()-clock);
+  if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){
+    char *name = xbt_str_join_array(action, " ");
+    XBT_VERB("%s %f", name, smpi_process_simulated_elapsed()-clock);
+    free(name);
+  }
 }
 
 static void action_wait(const char *const *action){
@@ -221,8 +241,11 @@ static void action_wait(const char *const *action){
   TRACE_smpi_computing_in(rank);
 #endif
 
-  XBT_VERB("%s %f", xbt_str_join_array(action, " "),
-           smpi_process_simulated_elapsed()-clock);
+  if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){
+    char *name = xbt_str_join_array(action, " ");
+    XBT_VERB("%s %f", name, smpi_process_simulated_elapsed()-clock);
+    free(name);
+  }
 }
 
 static void action_barrier(const char *const *action){
@@ -238,8 +261,11 @@ static void action_barrier(const char *const *action){
   TRACE_smpi_computing_in(rank);
 #endif
 
-  XBT_VERB("%s %f", xbt_str_join_array(action, " "),
-           smpi_process_simulated_elapsed()-clock);
+  if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){
+    char *name = xbt_str_join_array(action, " ");
+    XBT_VERB("%s %f", name, smpi_process_simulated_elapsed()-clock);
+    free(name);
+  }
 }
 
 static void action_bcast(const char *const *action)
@@ -259,8 +285,11 @@ static void action_bcast(const char *const *action)
   TRACE_smpi_computing_in(rank);
 #endif
 
-  XBT_VERB("%s %f", xbt_str_join_array(action, " "),
-           smpi_process_simulated_elapsed()-clock);
+  if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){
+    char *name = xbt_str_join_array(action, " ");
+    XBT_VERB("%s %f", name, smpi_process_simulated_elapsed()-clock);
+    free(name);
+  }
 }
 
 static void action_reduce(const char *const *action)
@@ -279,8 +308,11 @@ static void action_reduce(const char *const *action)
   TRACE_smpi_computing_in(rank);
 #endif
 
-  XBT_VERB("%s %f", xbt_str_join_array(action, " "),
-           smpi_process_simulated_elapsed()-clock);
+  if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){
+    char *name = xbt_str_join_array(action, " ");
+    XBT_VERB("%s %f", name, smpi_process_simulated_elapsed()-clock);
+    free(name);
+  }
 }
 
 static void action_allReduce(const char *const *action) {
@@ -299,31 +331,38 @@ static void action_allReduce(const char *const *action) {
   TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
   TRACE_smpi_computing_in(rank);
 #endif
-  XBT_VERB("%s %f", xbt_str_join_array(action, " "),
-           smpi_process_simulated_elapsed()-clock);
+
+  if (XBT_LOG_ISENABLED(smpi_replay, xbt_log_priority_verbose)){
+    char *name = xbt_str_join_array(action, " ");
+    XBT_VERB("%s %f", name, smpi_process_simulated_elapsed()-clock);
+    free(name);
+  }
 }
 
 void smpi_replay_init(int *argc, char***argv){
   PMPI_Init(argc, argv);
-  _xbt_replay_action_init();
-
-  xbt_replay_action_register("init",     action_init);
-  xbt_replay_action_register("finalize", action_finalize);
-  xbt_replay_action_register("comm_size",action_comm_size);
-  xbt_replay_action_register("send",     action_send);
-  xbt_replay_action_register("Isend",    action_Isend);
-  xbt_replay_action_register("recv",     action_recv);
-  xbt_replay_action_register("Irecv",    action_Irecv);
-  xbt_replay_action_register("wait",     action_wait);
-  xbt_replay_action_register("barrier",  action_barrier);
-  xbt_replay_action_register("bcast",    action_bcast);
-  xbt_replay_action_register("reduce",   action_reduce);
-  xbt_replay_action_register("allReduce",action_allReduce);
-  xbt_replay_action_register("compute",  action_compute);
+  if (!smpi_process_index()){
+    _xbt_replay_action_init();
+    xbt_replay_action_register("init",     action_init);
+    xbt_replay_action_register("finalize", action_finalize);
+    xbt_replay_action_register("comm_size",action_comm_size);
+    xbt_replay_action_register("send",     action_send);
+    xbt_replay_action_register("Isend",    action_Isend);
+    xbt_replay_action_register("recv",     action_recv);
+    xbt_replay_action_register("Irecv",    action_Irecv);
+    xbt_replay_action_register("wait",     action_wait);
+    xbt_replay_action_register("barrier",  action_barrier);
+    xbt_replay_action_register("bcast",    action_bcast);
+    xbt_replay_action_register("reduce",   action_reduce);
+    xbt_replay_action_register("allReduce",action_allReduce);
+    xbt_replay_action_register("compute",  action_compute);
+  }
 
   xbt_replay_action_runner(*argc, *argv);
 }
 
 int smpi_replay_finalize(){
+  if(!smpi_process_index())
+     _xbt_replay_action_exit();
   return PMPI_Finalize();
 }
index a1d1de1..29fa702 100755 (executable)
@@ -1,11 +1,17 @@
 #! /bin/bash
 
 CC=@CMAKE_C_COMPILER@
-CFLAGS="-O2 -Dmain=smpi_simulated_main"
 
-INCLUDEARGS="-I@includedir@ -I@includedir@/smpi"
-CMAKE_LINKARGS="-L@CMAKE_LINKARGS@"
-LINKARGS="-lsimgrid -lsmpi -lm"
+INCLUDEARGS="@includeflag@"
+CMAKE_LINKARGS="-L@libdir@"
+
+if [ "@WIN32@" != "1" ]; then
+  CFLAGS="-O2 -Dmain=smpi_simulated_main"
+  LINKARGS="-lsimgrid -lsmpi -lm"
+else
+  CFLAGS="-O2 -include @includedir@/smpi/smpi_main.h"
+  LINKARGS="@libdir@\libsimgrid.dll @libdir@\libsmpi.dll"
+fi
 
 CMDLINE=""
 while [ -n "$1" ]; do
@@ -13,6 +19,7 @@ while [ -n "$1" ]; do
   shift
   case "${ARG}" in
    -c)
+      CMAKE_LINKARGS=""
       LINKARGS=""
       CMDLINE="${CMDLINE} -c "
       ;;
index bdcbe86..c620b38 100755 (executable)
@@ -5,16 +5,25 @@ use strict;
 use File::Temp;
 use File::Copy;
 
-my $include="-I@top_srcdir@/include -I@top_srcdir@/include/smpi -I@includedir@ -I@includedir@/smpi";
+my $include="@includeflag@@f2cflags@";
 
 foreach my $fortran (@ARGV) {
    my $output = $fortran;
    $output =~ s/.f$/.c/;
+
+   #print "F2C INPUT : ".$fortran."\n";
+   #print "F2C OUTPUT: ".$output."\n";
+
+   my$outputdir = $output;
+   $outputdir=~s/[^\/]*\.c$//g;
+   #print "F2C DIR   : ".$outputdir."\n";
+
    my $tmp = new File::Temp;
    $tmp->autoflush(1);
-   `f2c $include -w -a $fortran`;
+   #print "f2c -d$outputdir $include -w -a $fortran\n";
+   `f2c -d$outputdir $include -w -a $fortran`;
    die "F2C failed\n" if $?;
-   open F2C,"<$output";
+   open F2C,"<$output" or die "Unable to open file $output";
    my $started = 0;
    my $cutext = 0;
    print $tmp "#ifndef INTEGER_STAR_8\n";
index d1d395e..cb94bd6 100755 (executable)
@@ -31,7 +31,7 @@ Options:
   -trace-comment-file <file> # put file contents on the top of the trace file as comment
   -trace-grouped             # group MPI processes by location
   -trace-resource            # trace resource utilization
-  -trace-triva               # generate configuration for Triva's GraphView
+  -trace-viva               # generate configuration for Viva's GraphView
   -trace-file <tracefile>    # name of the tracefile (simgrid_smpi.trace)
   -ext <value>               # additional parameter (reserved)
 
@@ -121,8 +121,8 @@ while true; do
       shift 1
    ;;
 
-   "-trace-triva")
-       TRACE_TRIVA="true"
+   "-trace-viva")
+       TRACE_VIVA="true"
          shift 1
    ;;
 
@@ -168,7 +168,7 @@ if [ -z "${HOSTFILE}" ] ; then
 fi
 
 # Don't use wc -l to compute it to avoid issues with trailing \n at EOF
-hostfile_procs=`grep -c [a-zA-Z0-9] $HOSTFILE`
+hostfile_procs=`grep -c "[a-zA-Z0-9]" $HOSTFILE`
 
 if [ -z "${NUMPROCS}" ] ; then
     # Use the amount of processes in the hostfile as default value for the -np parameter
@@ -323,8 +323,8 @@ if [ -n "${TRACE_ACTIVE}" ]; then
     TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1"
   fi
 
-  if [ -n "${TRACE_TRIVA}" ]; then
-    TRACEOPTIONS="${TRACEOPTIONS} --cfg=triva/categorized:smpi_cat.plist --cfg=triva/uncategorized:smpi_uncat.plist"
+  if [ -n "${TRACE_VIVA}" ]; then
+    TRACEOPTIONS="${TRACEOPTIONS} --cfg=viva/categorized:smpi_cat.plist --cfg=viva/uncategorized:smpi_uncat.plist"
   fi
 fi
 ##---------------------- end SMPI TRACING OPTIONS ---------------------------------
index e295c73..b6f836b 100644 (file)
@@ -118,7 +118,7 @@ static double smpi_bandwidth_factor(double size)
 {
   if (!smpi_bw_factor)
     smpi_bw_factor =
-        parse_factor(xbt_cfg_get_string(_surf_cfg_set, "smpi/bw_factor"));
+        parse_factor(surf_cfg_get_string("smpi/bw_factor"));
 
   unsigned int iter = 0;
   s_smpi_factor_t fact;
@@ -139,7 +139,7 @@ static double smpi_latency_factor(double size)
 {
   if (!smpi_lat_factor)
     smpi_lat_factor =
-        parse_factor(xbt_cfg_get_string(_surf_cfg_set, "smpi/lat_factor"));
+        parse_factor(surf_cfg_get_string("smpi/lat_factor"));
 
   unsigned int iter = 0;
   s_smpi_factor_t fact;
index d87ce7b..07cac22 100644 (file)
@@ -6,7 +6,7 @@
 
 #include "surf/random_mgr.h"
 #include "xbt/sysdep.h"
-#include "gras_config.h" /*_XBT_WIN32*/
+#include "internal_config.h" /*_XBT_WIN32*/
 #include <math.h>
 #include <stdlib.h>
 
index 9e8ceff..f28667b 100644 (file)
@@ -6929,7 +6929,6 @@ case 219:
 YY_RULE_SETUP
 {
   AX_surfxml_gpu_name = 0;
-  surfxml_gpu_name_isset = 0;
   ENTER(AL_surfxml_gpu); pushbuffer(0);
   }
        YY_BREAK
@@ -6937,12 +6936,12 @@ YY_RULE_SETUP
 case 220:
 /* rule 220 can match eol */
 YY_RULE_SETUP
-if (surfxml_gpu_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_gpu>");} surfxml_gpu_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_gpu_name);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_gpu_name);
        YY_BREAK
 case 221:
 /* rule 221 can match eol */
 YY_RULE_SETUP
-if (surfxml_gpu_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_gpu>");}  surfxml_gpu_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_gpu_name);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_gpu_name);
        YY_BREAK
 case 222:
 YY_RULE_SETUP
@@ -7151,82 +7150,118 @@ YY_RULE_SETUP
 case 246:
 /* rule 246 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id);
+=======
 if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 247:
 /* rule 247 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id);
+=======
 if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");}  surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 248:
 /* rule 248 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix);
+=======
 if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 249:
 /* rule 249 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix);
+=======
 if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");}  surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 250:
 /* rule 250 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix);
+=======
 if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 251:
 /* rule 251 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");}  surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix);
        YY_BREAK
 case 252:
 /* rule 252 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical);
        YY_BREAK
 case 253:
 /* rule 253 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");}  surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical);
        YY_BREAK
 case 254:
 /* rule 254 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");} surfxml_cluster_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power);
        YY_BREAK
 case 255:
 /* rule 255 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");}  surfxml_cluster_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power);
        YY_BREAK
 case 256:
 /* rule 256 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core);
        YY_BREAK
 case 257:
 /* rule 257 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core);
+=======
 if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");}  surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 258:
 /* rule 258 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw);
+=======
 if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 259:
 /* rule 259 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw);
+=======
 if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");}  surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 260:
 /* rule 260 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
+=======
 if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 261:
 /* rule 261 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");}  surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat);
        YY_BREAK
 case 262:
 /* rule 262 can match eol */
@@ -7252,22 +7287,34 @@ A_surfxml_cluster_sharing_policy = A_surfxml_cluster_sharing_policy_FATPIPE;
 case 268:
 /* rule 268 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb_bw);
+=======
 if (surfxml_cluster_bb_bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");} surfxml_cluster_bb_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb_bw);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 269:
 /* rule 269 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb_bw);
+=======
 if (surfxml_cluster_bb_bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");}  surfxml_cluster_bb_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb_bw);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 270:
 /* rule 270 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb_lat);
+=======
 if (surfxml_cluster_bb_lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");} surfxml_cluster_bb_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb_lat);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 271:
 /* rule 271 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_bb_lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");}  surfxml_cluster_bb_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb_lat);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb_lat);
        YY_BREAK
 case 272:
 /* rule 272 can match eol */
@@ -7286,32 +7333,32 @@ A_surfxml_cluster_bb_sharing_policy = A_surfxml_cluster_bb_sharing_policy_FATPIP
 case 276:
 /* rule 276 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_availability_file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");} surfxml_cluster_availability_file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability_file);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability_file);
        YY_BREAK
 case 277:
 /* rule 277 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_availability_file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");}  surfxml_cluster_availability_file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability_file);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability_file);
        YY_BREAK
 case 278:
 /* rule 278 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_state_file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");} surfxml_cluster_state_file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state_file);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state_file);
        YY_BREAK
 case 279:
 /* rule 279 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_state_file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");}  surfxml_cluster_state_file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state_file);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state_file);
        YY_BREAK
 case 280:
 /* rule 280 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_router_id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");} surfxml_cluster_router_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router_id);
+ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router_id);
        YY_BREAK
 case 281:
 /* rule 281 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_router_id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");}  surfxml_cluster_router_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router_id);
+ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router_id);
        YY_BREAK
 case 282:
 YY_RULE_SETUP
@@ -8004,7 +8051,11 @@ if (surfxml_link_latency_file_isset != 0) {FAIL("Multiple definition of attribut
 case 376:
 /* rule 376 can match eol */
 YY_RULE_SETUP
+<<<<<<< HEAD
+ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency_file);
+=======
 if (surfxml_link_latency_file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");}  surfxml_link_latency_file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency_file);
+>>>>>>> 52c07f4b6c9ba2b0af928b8e83c48f819e1c9fc0
        YY_BREAK
 case 377:
 /* rule 377 can match eol */
index cf54feb..5dd92c0 100644 (file)
@@ -36,6 +36,7 @@ static xbt_dynar_t storage_list;
 #define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action
 
 static xbt_dict_t parse_storage_content(char *filename, unsigned long *used_size);
+static int storage_action_unref(surf_action_t action);
 static void storage_action_state_set(surf_action_t action, e_surf_action_state_t state);
 static surf_action_t storage_action_execute (void *storage, double size, e_surf_action_storage_type_t type);
 static void free_storage_content(void *p);
@@ -140,6 +141,16 @@ static surf_action_t storage_action_close(void *storage, surf_file_t fp)
 {
   char *filename = fp->name;
   XBT_DEBUG("\tClose file '%s' size '%f'",filename,fp->content->stat.size);
+  // unref write actions from storage
+  surf_action_storage_t write_action;
+  unsigned int i;
+  xbt_dynar_foreach(((storage_t)storage)->write_actions,i,write_action) {
+    if ((write_action->generic_lmm_action.generic_action.file) == fp) {
+      xbt_dynar_cursor_rm(((storage_t)storage)->write_actions, &i);
+      storage_action_unref((surf_action_t) write_action);
+    }
+  }
+
   free(fp->name);
   fp->content = NULL;
   xbt_free(fp);
@@ -209,6 +220,7 @@ static surf_action_t storage_action_execute (void *storage, double size, e_surf_
     lmm_expand(storage_maxmin_system, STORAGE->constraint_write,
                GENERIC_LMM_ACTION(action).variable, 1.0);
     xbt_dynar_push(((storage_t)storage)->write_actions,&action);
+    surf_action_ref((surf_action_t) action);
     break;
   }
   action->type = type;
index 136390e..5309c43 100644 (file)
@@ -55,6 +55,26 @@ static const char *disk_drives_letter_table[MAX_DRIVE] = {
 };
 #endif                          /* #ifdef _XBT_WIN32 */
 
+int surf_cfg_get_int(const char* name)
+{
+       return xbt_cfg_get_int(_surf_cfg_set,name);
+}
+double surf_cfg_get_double(const char* name)
+{
+       return xbt_cfg_get_double(_surf_cfg_set,name);
+}
+char* surf_cfg_get_string(const char* name)
+{
+       return xbt_cfg_get_string(_surf_cfg_set,name);
+}
+void surf_cfg_get_peer(const char *name, char **peer, int *port)
+{
+       xbt_cfg_get_peer(_surf_cfg_set,name, peer, port);
+}
+xbt_dynar_t surf_cfg_get_dynar(const char* name)
+{
+       return xbt_cfg_get_dynar(_surf_cfg_set,name);
+}
 /*
  * Returns the initial path. On Windows the initial path is
  * the current directory for the current process in the other
@@ -391,8 +411,6 @@ void sg_version(int *ver_major,int *ver_minor,int *ver_patch) {
   *ver_patch = SIMGRID_VERSION_PATCH;
 }
 
-xbt_dynar_t sg_cmdline = NULL;
-
 void surf_init(int *argc, char **argv)
 {
   XBT_DEBUG("Create all Libs");
@@ -413,11 +431,6 @@ void surf_init(int *argc, char **argv)
   SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
   SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_resource_free);
 
-  sg_cmdline = xbt_dynar_new(sizeof(char*),NULL);
-  int i;
-  for (i=0;i<*argc;i++) {
-    xbt_dynar_push(sg_cmdline,&(argv[i]));
-  }
   xbt_init(argc, argv);
   if (!model_list)
     model_list = xbt_dynar_new(sizeof(surf_model_private_t), NULL);
@@ -425,6 +438,7 @@ void surf_init(int *argc, char **argv)
     history = tmgr_history_new();
 
   surf_config_init(argc, argv);
+
   surf_action_init();
   if (MC_is_active())
     MC_memory_init();
@@ -489,7 +503,6 @@ void surf_exit(void)
 #endif
 
   xbt_dynar_free(&surf_path);
-  xbt_dynar_free(&sg_cmdline);
 
   xbt_lib_free(&host_lib);
   xbt_lib_free(&link_lib);
index e05e199..59e775f 100644 (file)
@@ -374,8 +374,7 @@ void generic_update_actions_state_lazy(double now, double delta, surf_model_t mo
   while ((xbt_heap_size(model->model_private->action_heap) > 0)
          && (double_equals(xbt_heap_maxkey(model->model_private->action_heap), now))) {
     action = xbt_heap_pop(model->model_private->action_heap);
-    XBT_DEBUG("Action %p: finish", action);
-    action->generic_action.finish = surf_get_clock();
+    XBT_DEBUG("Something happened to action %p", action);
 #ifdef HAVE_TRACING
     if (TRACE_is_enabled()) {
       if(model == surf_cpu_model){
@@ -411,6 +410,9 @@ void generic_update_actions_state_lazy(double now, double delta, surf_model_t mo
 #endif
 
     if(model == surf_cpu_model){
+      action->generic_action.finish = surf_get_clock();
+      XBT_DEBUG("Action %p finished", action);
+
       /* set the remains to 0 due to precision problems when updating the remaining amount */
       action->generic_action.remains = 0;
       surf_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
@@ -419,6 +421,7 @@ void generic_update_actions_state_lazy(double now, double delta, surf_model_t mo
     else{
       // if I am wearing a latency hat
       if (action->hat == LATENCY) {
+        XBT_DEBUG("Latency paid for action %p. Activating", action);
         lmm_update_variable_weight(model->model_private->maxmin_system, action->variable,
             ((surf_action_network_CM02_t)(action))->weight);
         surf_action_lmm_heap_remove(model->model_private->action_heap,action);
@@ -429,7 +432,9 @@ void generic_update_actions_state_lazy(double now, double delta, surf_model_t mo
           action->hat == NORMAL) {
         // no need to communicate anymore
         // assume that flows that reached max_duration have remaining of 0
-        action->generic_action.remains = 0;
+       action->generic_action.finish = surf_get_clock();
+       XBT_DEBUG("Action %p finished", action);
+       action->generic_action.remains = 0;
         ((surf_action_t)action)->finish = surf_get_clock();
         model->action_state_set((surf_action_t) action,
                                              SURF_ACTION_DONE);
index ebc30f7..debb767 100644 (file)
@@ -20,6 +20,12 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_config, surf,
 
 xbt_cfg_t _surf_cfg_set = NULL;
 
+int _surf_init_status = 0;      /* 0: beginning of time (config cannot be changed yet);
+                                   1: initialized: cfg_set created (config can now be changed);
+                                   2: configured: command line parsed and config part of platform file was integrated also, platform construction ongoing or done.
+                                      (Config cannot be changed anymore!) */
+
+
 /* Parse the command line, looking for options */
 static void surf_config_cmd_line(int *argc, char **argv)
 {
@@ -81,16 +87,13 @@ static void surf_config_cmd_line(int *argc, char **argv)
     argv[j] = NULL;
     *argc = j;
   }
-  if (shall_exit)
+  if (shall_exit) {
+    _surf_init_status=1; // get everything cleanly cleaned on exit
     exit(0);
+  }
 }
 
 
-int _surf_init_status = 0;      /* 0: beginning of time (config cannot be changed yet);
-                                   1: initialized: cfg_set created (config can now be changed);
-                                   2: configured: command line parsed and config part of platform file was integrated also, platform construction ongoing or done.
-                                      (Config cannot be changed anymore!) */
-
 /* callback of the workstation/model variable */
 static void _surf_cfg_cb__workstation_model(const char *name, int pos)
 {
@@ -254,6 +257,7 @@ static void _surf_cfg_cb_context_factory(const char *name, int pos) {
 
 static void _surf_cfg_cb_context_stack_size(const char *name, int pos)
 {
+  smx_context_stack_size_was_set = 1;
   smx_context_stack_size = xbt_cfg_get_int(_surf_cfg_set, name) * 1024;
 }
 
@@ -440,7 +444,7 @@ void surf_config_init(int *argc, char **argv)
                      "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, NULL, 1, 1,
                      _surf_cfg_cb__tcp_gamma, NULL);
-    xbt_cfg_setdefault_double(_surf_cfg_set, "network/TCP_gamma", 20000.0);
+    xbt_cfg_setdefault_double(_surf_cfg_set, "network/TCP_gamma", 4194304.0);
 
     xbt_cfg_register(&_surf_cfg_set, "maxmin/precision",
                      "Numerical precision used when updating simulation models (epsilon in double comparisons)",
@@ -490,33 +494,54 @@ void surf_config_init(int *argc, char **argv)
 
 #ifdef HAVE_MC
     /* do model-checking */
-    default_value_int = 0;
     xbt_cfg_register(&_surf_cfg_set, "model-check",
                      "Verify the system through model-checking instead of simulating it (EXPERIMENTAL)",
-                     xbt_cfgelm_int, &default_value_int, 0, 1,
+                     xbt_cfgelm_int, NULL, 0, 1,
                      _surf_cfg_cb_model_check, NULL);
+    xbt_cfg_setdefault_int(_surf_cfg_set, "model-check", 0);
 
     /* do stateful model-checking */
-    default_value_int = 0;
     xbt_cfg_register(&_surf_cfg_set, "model-check/checkpoint",
                      "Specify the amount of steps between checkpoints during stateful model-checking (default: 0 => stateless verification). "
                      "If value=1, one checkpoint is saved for each step => faster verification, but huge memory consumption; higher values are good compromises between speed and memory consumption.",
-                     xbt_cfgelm_int, &default_value_int, 0, 1,
+                     xbt_cfgelm_int, NULL, 0, 1,
                      _mc_cfg_cb_checkpoint, NULL);
+    xbt_cfg_setdefault_int(_surf_cfg_set, "model-check/checkpoint", 0);
     
     /* do liveness model-checking */
-    default_value = xbt_strdup("");
     xbt_cfg_register(&_surf_cfg_set, "model-check/property",
                      "Specify the name of the file containing the property. It must be the result of the ltl2ba program.",
-                     xbt_cfgelm_string, &default_value, 0, 1,
+                     xbt_cfgelm_string, NULL, 0, 1,
                      _mc_cfg_cb_property, NULL);
+    xbt_cfg_setdefault_string(_surf_cfg_set, "model-check/property", "");
 
     /* Specify the kind of model-checking reduction */
-    default_value = xbt_strdup("unset");
     xbt_cfg_register(&_surf_cfg_set, "model-check/reduction",
                      "Specify the kind of exploration reduction (either none or DPOR)",
-                     xbt_cfgelm_string, &default_value, 0, 1,
+                     xbt_cfgelm_string, NULL, 0, 1,
                      _mc_cfg_cb_reduce, NULL);
+    xbt_cfg_setdefault_string(_surf_cfg_set, "model-check/reduction", "dpor");
+
+    /* Enable/disable timeout for wait requests with model-checking */
+    xbt_cfg_register(&_surf_cfg_set, "model-check/timeout",
+                     "Enable/Disable timeout for wait requests",
+                     xbt_cfgelm_int, NULL, 0, 1,
+                     _mc_cfg_cb_timeout, NULL);
+    xbt_cfg_setdefault_int(_surf_cfg_set, "model-check/timeout", 0);
+
+    /* Set max depth exploration */
+    xbt_cfg_register(&_surf_cfg_set, "model-check/max_depth",
+                     "Specify the max depth of exploration (default : 1000)",
+                     xbt_cfgelm_int, NULL, 0, 1,
+                     _mc_cfg_cb_max_depth, NULL);
+    xbt_cfg_setdefault_int(_surf_cfg_set, "model-check/max_depth", 1000);
+
+    /* Set number of visited state stored for state comparison reduction*/
+    xbt_cfg_register(&_surf_cfg_set, "model-check/visited",
+                     "Specify the number of visited state stored for state comparison reduction. If value=5, the last 5 visited states are stored",
+                     xbt_cfgelm_int, NULL, 0, 1,
+                     _mc_cfg_cb_visited, NULL);
+    xbt_cfg_setdefault_int(_surf_cfg_set, "model-check/visited", 0);
 #endif
 
     /* do verbose-exit */
index 5490781..cdc5fb4 100644 (file)
@@ -8,7 +8,7 @@
 #define _SURF_SURF_ROUTING_PRIVATE_H
 
 #include <float.h>
-#include "gras_config.h"
+#include "internal_config.h"
 
 #include "surf_private.h"
 #include "xbt/dynar.h"
index 92040f0..b3fdf29 100644 (file)
@@ -25,8 +25,8 @@ int surfxml_bufferstack_size = 2048;
 
 static char *old_buff = NULL;
 
-unsigned int surfxml_buffer_stack_stack_ptr;
-unsigned int surfxml_buffer_stack_stack[1024];
+XBT_IMPORT_NO_EXPORT(unsigned int) surfxml_buffer_stack_stack_ptr;
+XBT_IMPORT_NO_EXPORT(unsigned int) surfxml_buffer_stack_stack[1024];
 
 
 void surfxml_bufferstack_push(int new)
index 686579b..37714fb 100644 (file)
@@ -15,7 +15,7 @@
 */
 #if defined(__GNUC__)
         /* data comes from autoconf when using gnuc (cross-compiling?) */
-  # include "gras_config.h"
+  # include "internal_config.h"
   #ifndef _XBT_WIN32
     typedef unsigned int uint32_t;
   #endif
index 97c397c..6cfff43 100644 (file)
@@ -11,9 +11,9 @@
 xbt_automaton_t xbt_automaton_new(){
   xbt_automaton_t automaton = NULL;
   automaton = xbt_new0(struct xbt_automaton, 1);
-  automaton->states = xbt_dynar_new(sizeof(xbt_state_t), NULL);
-  automaton->transitions = xbt_dynar_new(sizeof(xbt_transition_t), NULL);
-  automaton->propositional_symbols = xbt_dynar_new(sizeof(xbt_propositional_symbol_t), NULL);
+  automaton->states = xbt_dynar_new(sizeof(xbt_state_t), xbt_state_free_voidp);
+  automaton->transitions = xbt_dynar_new(sizeof(xbt_transition_t), xbt_transition_free_voidp);
+  automaton->propositional_symbols = xbt_dynar_new(sizeof(xbt_propositional_symbol_t), xbt_propositional_symbol_free_voidp);
   return automaton;
 }
 
@@ -22,8 +22,8 @@ xbt_state_t xbt_automaton_new_state(xbt_automaton_t a, int type, char* id){
   state = xbt_new0(struct xbt_state, 1);
   state->type = type;
   state->id = strdup(id);
-  state->in = xbt_dynar_new(sizeof(xbt_transition_t), NULL);
-  state->out = xbt_dynar_new(sizeof(xbt_transition_t), NULL); 
+  state->in = xbt_dynar_new(sizeof(xbt_transition_t), xbt_transition_free_voidp);
+  state->out = xbt_dynar_new(sizeof(xbt_transition_t), xbt_transition_free_voidp); 
   xbt_dynar_push(a->states, &state);
   return state;
 }
@@ -100,85 +100,6 @@ xbt_transition_t xbt_automaton_get_transition(xbt_automaton_t a, xbt_state_t src
   return NULL;
 }
 
-void xbt_automaton_free_automaton(xbt_automaton_t a, void_f_pvoid_t transition_free_function){
-  unsigned int cursor = 0;
-  xbt_state_t state = NULL;
-  xbt_transition_t transition = NULL;
-
-  xbt_dynar_foreach(a->states, cursor, state){
-    xbt_dynar_free(&(state->out));
-    xbt_dynar_free(&(state->in));
-  }
-
-  xbt_dynar_foreach(a->transitions, cursor, transition){
-    if(transition_free_function) 
-      (*transition_free_function) (transition->label);
-  }
-
-  xbt_dynar_foreach(a->states, cursor, state)
-    free(state);
-  xbt_dynar_free(&(a->states));
-
-  xbt_dynar_foreach(a->transitions, cursor, state)
-    free(transition);
-  xbt_dynar_free(&(a->transitions));
-
-  free(a);
-
-  return;
-}
-
-void xbt_automaton_free_state(xbt_automaton_t a, xbt_state_t s, void_f_pvoid_t transition_free_function){
-  unsigned long nbr;
-  unsigned long i;
-  unsigned int cursor = 0;
-  xbt_state_t state = NULL;
-  xbt_transition_t transition = NULL;
-
-  nbr = xbt_dynar_length(a->transitions);
-  for(i = 0; i <nbr; i++){
-    xbt_dynar_get_cpy(a->transitions, cursor, &transition);
-    if((transition->src == s) || (transition->dst == s)){
-      xbt_automaton_free_transition(a, transition, transition_free_function);
-    }else{
-      cursor++;
-    }
-  }
-
-  cursor = 0;
-  xbt_dynar_foreach(a->states, cursor, state)
-    if(state == s)
-      xbt_dynar_cursor_rm(a->states, &cursor);
-
-  xbt_dynar_free(&(s->in));
-  xbt_dynar_free(&(s->out));
-
-  free(s);
-
-  return;
-}
-
-void xbt_automaton_free_transition(xbt_automaton_t a, xbt_transition_t t, void_f_pvoid_t transition_free_function){
-  int index;
-  unsigned int cursor = 0;
-  xbt_transition_t transition = NULL;
-
-  if((transition_free_function) && (t->label))
-    (*transition_free_function) (t->label);
-
-  xbt_dynar_foreach(a->transitions, cursor, transition) {
-    if(transition == t){
-      index = __xbt_find_in_dynar(transition->dst->in, transition);
-      xbt_dynar_remove_at(transition->dst->in, index, NULL);
-      index = __xbt_find_in_dynar(transition->src->out, transition);
-      xbt_dynar_remove_at(transition->src->out, index, NULL);
-      xbt_dynar_cursor_rm(a->transitions, & cursor);
-      free(transition);
-      break;
-    }  
-  }
-} 
-
 xbt_state_t xbt_automaton_transition_get_source(xbt_transition_t t){
   return t->src;
 }
@@ -364,3 +285,84 @@ int propositional_symbols_compare_value(xbt_dynar_t s1, xbt_dynar_t s2){
 
   return 0;
 }
+
+/************ Free functions ****************/
+
+static void xbt_transition_free(xbt_transition_t t);
+static void xbt_exp_label_free(xbt_exp_label_t e);
+static void xbt_propositional_symbol_free(xbt_propositional_symbol_t ps);
+
+void xbt_state_free(xbt_state_t s){
+  if(s){
+    xbt_free(s->id);
+    xbt_dynar_free(&(s->in));
+    xbt_dynar_free(&(s->out));
+    xbt_free(s);
+    s = NULL;
+  }
+}
+
+void xbt_state_free_voidp(void *s){
+  xbt_state_free((xbt_state_t) * (void **) s);
+}
+
+static void xbt_transition_free(xbt_transition_t t){
+  if(t){
+    xbt_exp_label_free(t->label);
+    xbt_free(t);
+    t = NULL;
+  }
+}
+
+void xbt_transition_free_voidp(void *t){
+  xbt_transition_free((xbt_transition_t) * (void **) t);
+}
+
+static void xbt_exp_label_free(xbt_exp_label_t e){
+  if(e){
+    switch(e->type){
+    case 0:
+    case 1:
+      xbt_exp_label_free(e->u.or_and.left_exp);
+      xbt_exp_label_free(e->u.or_and.right_exp);
+      break;
+    case 2:
+      xbt_exp_label_free(e->u.exp_not);
+      break;
+    case 3:
+      xbt_free(e->u.predicat);
+      break;
+    default:
+      break;
+    }
+    xbt_free(e);
+    e = NULL;
+  }
+}
+
+void xbt_exp_label_free_voidp(void *e){
+  xbt_exp_label_free((xbt_exp_label_t) * (void **) e);
+}
+
+static void xbt_propositional_symbol_free(xbt_propositional_symbol_t ps){
+  if(ps){
+    xbt_free(ps->pred);
+    xbt_free(ps);
+    ps = NULL;
+  }
+}
+
+void xbt_propositional_symbol_free_voidp(void *ps){
+  xbt_propositional_symbol_free((xbt_propositional_symbol_t) * (void **) ps);
+}
+
+void xbt_automaton_free(xbt_automaton_t a){
+  if(a){
+    xbt_dynar_free(&(a->propositional_symbols));
+    xbt_dynar_free(&(a->transitions));
+    xbt_dynar_free(&(a->states));
+    xbt_state_free(a->current_state);
+    xbt_free(a);
+    a = NULL;
+  }
+}
index 5a5d379..8477155 100644 (file)
@@ -805,143 +805,138 @@ do_action:      /* This label is used only to access EOF actions. */
 case 1:
 YY_RULE_SETUP
 #line 30 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (NEVER); }
+{ return (NEVER); }
        YY_BREAK
 case 2:
 YY_RULE_SETUP
 #line 31 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (IF); }
+{ return (IF); }
        YY_BREAK
 case 3:
 YY_RULE_SETUP
 #line 32 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); 
-               return (FI); }
+{ return (FI); }
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 34 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (IMPLIES); }
+#line 33 "parserPromela.lex"
+{ return (IMPLIES); }
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 35 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (GOTO); }
+#line 34 "parserPromela.lex"
+{ return (GOTO); }
        YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 36 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (AND); }
+#line 35 "parserPromela.lex"
+{ return (AND); }
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 37 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (OR); }
+#line 36 "parserPromela.lex"
+{ return (OR); }
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 38 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (NOT); }
+#line 37 "parserPromela.lex"
+{ return (NOT); }
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 39 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (LEFT_PAR); }
+#line 38 "parserPromela.lex"
+{ return (LEFT_PAR); }
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 40 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (RIGHT_PAR); }
+#line 39 "parserPromela.lex"
+{ return (RIGHT_PAR); }
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 41 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (CASE); }
+#line 40 "parserPromela.lex"
+{ return (CASE); }
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 42 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (COLON); }
+#line 41 "parserPromela.lex"
+{ return (COLON); }
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 43 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (SEMI_COLON); }
+#line 42 "parserPromela.lex"
+{ return (SEMI_COLON); }
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 44 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (CASE_TRUE); }
+#line 43 "parserPromela.lex"
+{ return (CASE_TRUE); }
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 45 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (LEFT_BRACE); }
+#line 44 "parserPromela.lex"
+{ return (LEFT_BRACE); }
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 46 "parserPromela.lex"
-{ printf("%s", xbt_automaton_parser_text); return (RIGHT_BRACE); }
+#line 45 "parserPromela.lex"
+{ return (RIGHT_BRACE); }
        YY_BREAK
 case 17:
 /* rule 17 can match eol */
 YY_RULE_SETUP
-#line 49 "parserPromela.lex"
-{ printf(" ");}
+#line 48 "parserPromela.lex"
+{ }
        YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 51 "parserPromela.lex"
-{ printf("%s",xbt_automaton_parser_text); }
+#line 50 "parserPromela.lex"
+{ }
        YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 54 "parserPromela.lex"
-{ printf("%s",xbt_automaton_parser_text); 
-                            sscanf(xbt_automaton_parser_text,"%lf",&yylval.real); 
+#line 53 "parserPromela.lex"
+{ sscanf(xbt_automaton_parser_text,"%lf",&yylval.real); 
                             return (LITT_REEL); }
        YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 58 "parserPromela.lex"
-{ printf("%s",xbt_automaton_parser_text); 
-                            sscanf(xbt_automaton_parser_text,"%d",&yylval.integer); 
+#line 56 "parserPromela.lex"
+{ sscanf(xbt_automaton_parser_text,"%d",&yylval.integer); 
                             return (LITT_ENT); }
        YY_BREAK
 case 21:
 /* rule 21 can match eol */
 YY_RULE_SETUP
-#line 62 "parserPromela.lex"
-{ printf("%s",xbt_automaton_parser_text);  
-                            yylval.string=(char *)malloc(strlen(xbt_automaton_parser_text)+1);
+#line 59 "parserPromela.lex"
+{ yylval.string=(char *)malloc(strlen(xbt_automaton_parser_text)+1);
                             sscanf(xbt_automaton_parser_text,"%s",yylval.string); 
                             return (LITT_CHAINE); }
        YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 67 "parserPromela.lex"
-{ printf("%s",xbt_automaton_parser_text); 
-                           yylval.string=(char *)malloc(strlen(xbt_automaton_parser_text)+1);
-                           sscanf(xbt_automaton_parser_text,"%s",yylval.string);
-                           return (ID); }
+#line 63 "parserPromela.lex"
+{ yylval.string=(char *)malloc(strlen(xbt_automaton_parser_text)+1);
+                            sscanf(xbt_automaton_parser_text,"%s",yylval.string);
+                                             return (ID); }
        YY_BREAK
 case 23:
 /* rule 23 can match eol */
 YY_RULE_SETUP
-#line 72 "parserPromela.lex"
-{ printf("\n"); }
+#line 67 "parserPromela.lex"
+{ }
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 74 "parserPromela.lex"
-{ printf("caractère inconnu\n"); }
+#line 69 "parserPromela.lex"
+{ }
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 76 "parserPromela.lex"
+#line 71 "parserPromela.lex"
 ECHO;
        YY_BREAK
-#line 945 "automaton_lexer.yy.c"
+#line 940 "automaton_lexer.yy.c"
 case YY_STATE_EOF(INITIAL):
        yyterminate();
 
@@ -1939,7 +1934,7 @@ void xbt_automaton_parser_free (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 76 "parserPromela.lex"
+#line 71 "parserPromela.lex"
 
 
 
index 921940f..7b64a62 100644 (file)
@@ -27,51 +27,46 @@ commentaire  "/*"([^\*\/]*{nouv_ligne}*[^\*\/]*)*"*/"
 
 %%
 
-"never"      { printf("%s", yytext); return (NEVER); }
-"if"         { printf("%s", yytext); return (IF); }
-"fi"         { printf("%s", yytext); 
-               return (FI); }
-"->"         { printf("%s", yytext); return (IMPLIES); }
-"goto"       { printf("%s", yytext); return (GOTO); }
-"&&"         { printf("%s", yytext); return (AND); }
-"||"         { printf("%s", yytext); return (OR); }
-"!"          { printf("%s", yytext); return (NOT); }
-"("          { printf("%s", yytext); return (LEFT_PAR); }
-")"          { printf("%s", yytext); return (RIGHT_PAR); }
-"::"         { printf("%s", yytext); return (CASE); }
-":"          { printf("%s", yytext); return (COLON); }
-";"          { printf("%s", yytext); return (SEMI_COLON); }
-"1"          { printf("%s", yytext); return (CASE_TRUE); }
-"{"          { printf("%s", yytext); return (LEFT_BRACE); }
-"}"          { printf("%s", yytext); return (RIGHT_BRACE); }
-
-
-{commentaire}             { printf(" ");}
-
-{blancs}                  { printf("%s",yytext); }
-
-
-{reel}                    { printf("%s",yytext); 
-                            sscanf(yytext,"%lf",&yylval.real); 
+"never"      { return (NEVER); }
+"if"         { return (IF); }
+"fi"         { return (FI); }
+"->"         { return (IMPLIES); }
+"goto"       { return (GOTO); }
+"&&"         { return (AND); }
+"||"         { return (OR); }
+"!"          { return (NOT); }
+"("          { return (LEFT_PAR); }
+")"          { return (RIGHT_PAR); }
+"::"         { return (CASE); }
+":"          { return (COLON); }
+";"          { return (SEMI_COLON); }
+"1"          { return (CASE_TRUE); }
+"{"          { return (LEFT_BRACE); }
+"}"          { return (RIGHT_BRACE); }
+
+
+{commentaire}             { }
+
+{blancs}                  { }
+
+
+{reel}                    { sscanf(yytext,"%lf",&yylval.real); 
                             return (LITT_REEL); }
 
-{entier}                  { printf("%s",yytext); 
-                            sscanf(yytext,"%d",&yylval.integer); 
+{entier}                  { sscanf(yytext,"%d",&yylval.integer); 
                             return (LITT_ENT); }
 
-{chaine}                  { printf("%s",yytext);  
-                            yylval.string=(char *)malloc(strlen(yytext)+1);
+{chaine}                  { yylval.string=(char *)malloc(strlen(yytext)+1);
                             sscanf(yytext,"%s",yylval.string); 
                             return (LITT_CHAINE); }
 
-[a-zA-Z]{caractere}*      { printf("%s",yytext); 
-                           yylval.string=(char *)malloc(strlen(yytext)+1);
-                           sscanf(yytext,"%s",yylval.string);
-                           return (ID); }
+[a-zA-Z]{caractere}*      { yylval.string=(char *)malloc(strlen(yytext)+1);
+                            sscanf(yytext,"%s",yylval.string);
+                                             return (ID); }
                   
-{numl}                    { printf("\n"); }
+{numl}                    { }
 
-.                         { printf("caractère inconnu\n"); }
+.                         { }
 
 %%
 
index e9dbed5..898069a 100644 (file)
@@ -116,7 +116,7 @@ void xbt_ex_setup_backtrace(xbt_ex_t * e) //FIXME: This code could be greatly im
 
   e->bt_strings = NULL;
 
-  if (!xbt_binary_name) /* no binary name, nothing to do */
+  if (xbt_binary_name != NULL) /* no binary name, nothing to do */
     return;
 
   if (e->used <= 1)
diff --git a/src/xbt/datadesc/cbps.c b/src/xbt/datadesc/cbps.c
deleted file mode 100644 (file)
index b258d3a..0000000
+++ /dev/null
@@ -1,405 +0,0 @@
-/* cbps - persistent states for callbacks                                   */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "xbt/datadesc/datadesc_private.h"
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ddt_cbps, xbt_ddt,
-                                "callback persistent state");
-
-typedef struct {
-  xbt_datadesc_type_t type;
-  void *data;
-} s_xbt_cbps_elm_t, *xbt_cbps_elm_t;
-
-typedef struct s_xbt_cbps {
-  xbt_dynar_t lints;            /* simple stack of long integers (easy interface) */
-
-  xbt_dict_t space;             /* varname x dynar of xbt_cbps_elm_t */
-  xbt_dynar_t frames;           /* of dynar of names defined within this frame
-                                   (and to pop when we leave it) */
-  xbt_dynar_t globals;
-} s_xbt_cbps_t;
-
-xbt_cbps_t xbt_cbps_new(void)
-{
-  xbt_cbps_t res;
-
-  res = xbt_new(s_xbt_cbps_t, 1);
-
-  res->lints = xbt_dynar_new(sizeof(int), NULL);
-  res->space = xbt_dict_new_homogeneous(NULL);
-  /* no leak, the content is freed manually on block_end */
-  res->frames = xbt_dynar_new(sizeof(xbt_dynar_t), NULL);
-  res->globals = xbt_dynar_new(sizeof(char *), NULL);
-
-  xbt_cbps_block_begin(res);
-
-  return res;
-}
-
-void xbt_cbps_free(xbt_cbps_t * state)
-{
-
-  xbt_dynar_free(&((*state)->lints));
-
-  xbt_cbps_block_end(*state);
-  xbt_dict_free(&((*state)->space));
-  xbt_dynar_free(&((*state)->frames));
-  xbt_dynar_free(&((*state)->globals));
-
-  free(*state);
-  *state = NULL;
-}
-
-void xbt_cbps_reset(xbt_cbps_t state)
-{
-
-  xbt_dynar_reset(state->lints);
-
-  xbt_dict_reset(state->space);
-
-  xbt_dynar_reset(state->frames);
-  xbt_dynar_reset(state->globals);
-}
-
-/** \brief Declare a new element in the PS, and give it a value.
- *
- * If an element of that
- * name already exists, it is masked by the one given here, and will be
- * seeable again only after a pop to remove the value this push adds.
- */
-void
-xbt_cbps_v_push(xbt_cbps_t ps,
-                 const char *name, void *data, xbt_datadesc_type_t ddt)
-{
-
-  xbt_dynar_t varstack = NULL, frame;
-  xbt_cbps_elm_t var;
-  char *varname = (char *) xbt_strdup(name);
-  xbt_ex_t e;
-
-  XBT_DEBUG("push(%s,%p)", name, (void *) data);
-
-  TRY {
-    varstack = xbt_dict_get(ps->space, name);
-  }
-  CATCH(e) {
-    if (e.category != mismatch_error)
-      RETHROW;
-
-    XBT_DEBUG("Create a new variable stack for '%s' into the space", name);
-    varstack = xbt_dynar_new(sizeof(xbt_cbps_elm_t *), NULL);
-    xbt_dict_set(ps->space, name, (void **) varstack, NULL);
-    xbt_ex_free(e);
-    /* leaking, you think? only if you do not close all the openned blocks ;) */
-  }
-
-  var = xbt_new0(s_xbt_cbps_elm_t, 1);
-  var->type = ddt;
-  var->data = data;
-
-  xbt_dynar_push(varstack, &var);
-
-  xbt_dynar_pop(ps->frames, &frame);
-  XBT_DEBUG("Push %s (%p @%p) into frame %p", varname, (void *) varname,
-         (void *) &varname, (void *) frame);
-  xbt_dynar_push(frame, &varname);
-  xbt_dynar_push(ps->frames, &frame);
-}
-
-/** \brief Retrieve an element from the PS, and remove it from the PS.
- *
- * If it's not present in the current block, it will fail (throwing not_found)
- * and not search in upper blocks since this denotes a programmation error.
- */
-void
-xbt_cbps_v_pop(xbt_cbps_t ps,
-                const char *name, xbt_datadesc_type_t * ddt, void **res)
-{
-  xbt_dynar_t varstack = NULL, frame = NULL;
-  xbt_cbps_elm_t var = NULL;
-  void *data = NULL;
-  xbt_ex_t e;
-
-  XBT_DEBUG("pop(%s)", name);
-  TRY {
-    varstack = xbt_dict_get(ps->space, name);
-  }
-  CATCH(e) {
-    if (e.category != mismatch_error)
-      RETHROW;
-
-    xbt_ex_free(e);
-    THROWF(not_found_error, 1, "Asked to pop the non-existant %s", name);
-  }
-  xbt_dynar_pop(varstack, &var);
-
-  if (xbt_dynar_is_empty(varstack)) {
-    XBT_DEBUG("Last incarnation of %s poped. Kill it", name);
-    xbt_dict_remove(ps->space, name);
-    xbt_dynar_free(&varstack);
-  }
-
-  if (ddt)
-    *ddt = var->type;
-  data = var->data;
-
-  free(var);
-
-  xbt_dynar_pop(ps->frames, &frame);
-  {
-    int l = xbt_dynar_length(frame);
-
-    while (l--) {
-      char *_name = NULL;
-
-      _name = xbt_dynar_get_as(frame, l, char *);
-      if (!strcmp(name, _name)) {
-        xbt_dynar_remove_at(frame, l, &_name);
-        free(_name);
-        break;
-      }
-    }
-  }
-  xbt_dynar_push(ps->frames, &frame);
-
-  *res = data;
-}
-
-/** \brief Change the value of an element in the PS.
- *
- * If it's not present in the current block, look in the upper ones.
- * If it's not present in any of them, modify in the globals
- * If not present there neither, the code may segfault (Oli?).
- *
- * Once a reference to an element of that name is found somewhere in the PS,
- *   its value is changed.
- */
-void
-xbt_cbps_v_set(xbt_cbps_t ps,
-                const char *name, void *data, xbt_datadesc_type_t ddt)
-{
-
-  xbt_dynar_t dynar = NULL;
-  xbt_cbps_elm_t elm = NULL;
-
-  XBT_DEBUG("set(%s)", name);
-  dynar = xbt_dict_get_or_null(ps->space, name);
-
-  if (dynar == NULL) {
-    dynar = xbt_dynar_new(sizeof(xbt_cbps_elm_t), NULL);
-    xbt_dict_set(ps->space, name, (void **) dynar, NULL);
-
-    elm = xbt_new0(s_xbt_cbps_elm_t, 1);
-    xbt_dynar_push(ps->globals, &name);
-  } else {
-    xbt_dynar_pop(dynar, &elm);
-  }
-
-  elm->type = ddt;
-  elm->data = data;
-
-  xbt_dynar_push(dynar, &elm);
-
-}
-
-/** \brief Get the value of an element in the PS without modifying it.
- *
- * (note that you get the content of the data struct and not a copy to it)
- * If it's not present in the current block, look in the upper ones.
- * If it's not present in any of them, look in the globals
- * If not present there neither, the code may segfault (Oli?).
- */
-void *xbt_cbps_v_get(xbt_cbps_t ps, const char *name,
-                      /* OUT */ xbt_datadesc_type_t * ddt)
-{
-
-  xbt_dynar_t dynar = NULL;
-  xbt_cbps_elm_t elm = NULL;
-
-  XBT_DEBUG("get(%s)", name);
-  dynar = xbt_dict_get(ps->space, name);
-  xbt_dynar_pop(dynar, &elm);
-  xbt_dynar_push(dynar, &elm);
-
-  if (ddt) {
-    *ddt = elm->type;
-  }
-
-  return elm->data;
-
-}
-
-/** \brief Begins a new block.
- *
- * Blocks are usefull to remove a whole set of declarations you don't even know
- *
- * E.g., they constitute an elegent solution to recursive data structures.
- *
- * push/pop may be used in some cases for that, but if your recursive data
- * struct contains other structs needing themselves callbacks, you have to
- * use block_{begin,end} to do the trick.
- */
-
-void xbt_cbps_block_begin(xbt_cbps_t ps)
-{
-
-  xbt_dynar_t dynar = NULL;
-
-  XBT_DEBUG(">>> Block begin");
-  dynar = xbt_dynar_new(sizeof(char *), NULL);
-  xbt_dynar_push(ps->frames, &dynar);
-}
-
-/** \brief End the current block, and go back to the upper one. */
-void xbt_cbps_block_end(xbt_cbps_t ps)
-{
-
-  xbt_dynar_t frame = NULL;
-  unsigned int cursor = 0;
-  char *name = NULL;
-
-  xbt_assert(xbt_dynar_length(ps->frames),
-              "More block_end than block_begin");
-  xbt_dynar_pop(ps->frames, &frame);
-
-  xbt_dynar_foreach(frame, cursor, name) {
-
-    xbt_dynar_t varstack = NULL;
-    xbt_cbps_elm_t var = NULL;
-
-    XBT_DEBUG("Get ride of %s (%p)", name, (void *) name);
-    varstack = xbt_dict_get(ps->space, name);
-    xbt_dynar_pop(varstack, &var);
-
-    if (xbt_dynar_is_empty(varstack)) {
-      xbt_dict_remove(ps->space, name);
-      xbt_dynar_free_container(&varstack);      /*already empty, save a test ;) */
-    }
-
-    free(var->data);
-    free(var);
-    free(name);
-  }
-  xbt_dynar_free_container(&frame);     /* we just emptied it */
-  XBT_DEBUG("<<< Block end");
-}
-
-
-/** \brief Push a new integer value into the cbps. */
-void xbt_cbps_i_push(xbt_cbps_t ps, int val)
-{
-  XBT_DEBUG("push %d as a size", val);
-  xbt_dynar_push_as(ps->lints, int, val);
-}
-
-/** \brief Pop the lastly pushed integer value from the cbps. */
-int xbt_cbps_i_pop(xbt_cbps_t ps)
-{
-  int ret;
-
-  xbt_assert(!xbt_dynar_is_empty(ps->lints),
-              "xbt_cbps_i_pop: no value to pop");
-  ret = xbt_dynar_pop_as(ps->lints, int);
-  XBT_DEBUG("pop %d as a size", ret);
-  return ret;
-}
-
-/** \brief Generic cb returning the lastly pushed value
- *
- * Used by \ref xbt_datadesc_ref_pop_arr
- */
-int xbt_datadesc_cb_pop(xbt_datadesc_type_t ignored, xbt_cbps_t vars,
-                         void *data)
-{
-  return xbt_cbps_i_pop(vars);
-}
-
-/* ************************* */
-/* **** PUSHy callbacks **** */
-/* ************************* */
-
-/** \brief Cb to push an integer. Must be attached to the field you want to push */
-void xbt_datadesc_cb_push_int(xbt_datadesc_type_t ignored,
-                               xbt_cbps_t vars, void *data)
-{
-  int *i = (int *) data;
-  xbt_cbps_i_push(vars, (int) *i);
-}
-
-/** \brief Cb to push an unsigned integer. Must be attached to the field you want to push */
-void xbt_datadesc_cb_push_uint(xbt_datadesc_type_t ignored,
-                                xbt_cbps_t vars, void *data)
-{
-  unsigned int *i = (unsigned int *) data;
-  xbt_cbps_i_push(vars, (int) *i);
-}
-
-/** \brief Cb to push an long integer. Must be attached to the field you want to push
- */
-void xbt_datadesc_cb_push_lint(xbt_datadesc_type_t ignored,
-                                xbt_cbps_t vars, void *data)
-{
-  long int *i = (long int *) data;
-  xbt_cbps_i_push(vars, (int) *i);
-}
-
-/** \brief Cb to push an unsigned long integer. Must be attached to the field you want to push
- */
-void xbt_datadesc_cb_push_ulint(xbt_datadesc_type_t ignored,
-                                 xbt_cbps_t vars, void *data)
-{
-  unsigned long int *i = (unsigned long int *) data;
-  xbt_cbps_i_push(vars, (int) *i);
-}
-
-/* ************************************ */
-/* **** PUSHy multiplier callbacks **** */
-/* ************************************ */
-/** \brief Cb to push an integer as multiplier. Must be attached to the field you want to push */
-void xbt_datadesc_cb_push_int_mult(xbt_datadesc_type_t ignored,
-                                    xbt_cbps_t vars, void *data)
-{
-  int old = *(int *) data;
-  int new = xbt_cbps_i_pop(vars);
-  XBT_DEBUG("push %d x %d as a size", old, new);
-  xbt_cbps_i_push(vars, old * new);
-}
-
-/** \brief Cb to push an unsigned integer as multiplier. Must be attached to the field you want to push */
-void xbt_datadesc_cb_push_uint_mult(xbt_datadesc_type_t ignored,
-                                     xbt_cbps_t vars, void *data)
-{
-  unsigned int old = *(unsigned int *) data;
-  unsigned int new = xbt_cbps_i_pop(vars);
-
-  XBT_DEBUG("push %u x %u as a size", old, new);
-  xbt_cbps_i_push(vars, (int) (old * new));
-}
-
-/** \brief Cb to push an long integer as multiplier. Must be attached to the field you want to push
- */
-void xbt_datadesc_cb_push_lint_mult(xbt_datadesc_type_t ignored,
-                                     xbt_cbps_t vars, void *data)
-{
-  long int i = *(long int *) data;
-  i *= xbt_cbps_i_pop(vars);
-  xbt_cbps_i_push(vars, (int) i);
-}
-
-/** \brief Cb to push an unsigned long integer as multiplier. Must be attached to the field you want to push
- */
-void xbt_datadesc_cb_push_ulint_mult(xbt_datadesc_type_t ignored,
-                                      xbt_cbps_t vars, void *data)
-{
-  unsigned long int old = *(unsigned long int *) data;
-  unsigned long int new = xbt_cbps_i_pop(vars);
-
-  XBT_DEBUG("push %lu x %lu as a size", old, new);
-  xbt_cbps_i_push(vars, (int) (old * new));
-}
diff --git a/src/xbt/datadesc/datadesc.c b/src/xbt/datadesc/datadesc.c
deleted file mode 100644 (file)
index 40856a5..0000000
+++ /dev/null
@@ -1,256 +0,0 @@
-/* datadesc - data description in order to send/recv it in XBT             */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "datadesc_private.h"
-#include "portable.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ddt, xbt, "Data description");
-/* FIXME: make this host-dependent using a trick such as UserData*/
-/*@null@*/ xbt_set_t xbt_datadesc_set_local = NULL;
-
-
-/* callback for array size when sending strings */
-static int _strlen_cb( /*@unused@ */ xbt_datadesc_type_t type, /*@unused@ */
-                      xbt_cbps_t vars, void *data)
-{
-
-  return 1 + (int) strlen(data);
-}
-
-
-/**
- * xbt_datadesc_init:
- *
- * Initialize the datadesc module.
- * FIXME: We assume that when neither signed nor unsigned is given,
- *    that means signed. To be checked by configure.
- **/
-void xbt_datadesc_preinit(void)
-{
-  xbt_datadesc_type_t ddt;     /* What to add */
-
-  /* only initialize once */
-  if (xbt_datadesc_set_local != NULL)
-    return;
-
-  XBT_VERB("Initializing DataDesc");
-
-  xbt_datadesc_set_local = xbt_set_new();
-
-
-  /* all known datatypes */
-
-  ddt = xbt_datadesc_scalar("signed char",
-                             xbt_ddt_scalar_char,
-                             e_xbt_dd_scalar_encoding_sint);
-  ddt = xbt_datadesc_scalar("char",
-                             xbt_ddt_scalar_char,
-                             e_xbt_dd_scalar_encoding_sint);
-  ddt = xbt_datadesc_scalar("unsigned char",
-                             xbt_ddt_scalar_char,
-                             e_xbt_dd_scalar_encoding_uint);
-
-  ddt = xbt_datadesc_scalar("signed short int",
-                             xbt_ddt_scalar_short,
-                             e_xbt_dd_scalar_encoding_sint);
-  ddt = xbt_datadesc_scalar("short int",
-                             xbt_ddt_scalar_short,
-                             e_xbt_dd_scalar_encoding_sint);
-  ddt = xbt_datadesc_scalar("short",
-                             xbt_ddt_scalar_short,
-                             e_xbt_dd_scalar_encoding_sint);
-  ddt = xbt_datadesc_scalar("unsigned short int",
-                             xbt_ddt_scalar_short,
-                             e_xbt_dd_scalar_encoding_uint);
-
-  ddt = xbt_datadesc_scalar("signed int",
-                             xbt_ddt_scalar_int,
-                             e_xbt_dd_scalar_encoding_sint);
-  ddt = xbt_datadesc_scalar("int",
-                             xbt_ddt_scalar_int,
-                             e_xbt_dd_scalar_encoding_sint);
-  ddt = xbt_datadesc_scalar("unsigned int",
-                             xbt_ddt_scalar_int,
-                             e_xbt_dd_scalar_encoding_uint);
-
-  ddt = xbt_datadesc_scalar("signed long int",
-                             xbt_ddt_scalar_long,
-                             e_xbt_dd_scalar_encoding_sint);
-  ddt = xbt_datadesc_scalar("long int",
-                             xbt_ddt_scalar_long,
-                             e_xbt_dd_scalar_encoding_sint);
-  ddt = xbt_datadesc_scalar("long",
-                             xbt_ddt_scalar_long,
-                             e_xbt_dd_scalar_encoding_sint);
-  ddt = xbt_datadesc_scalar("unsigned long int",
-                             xbt_ddt_scalar_long,
-                             e_xbt_dd_scalar_encoding_uint);
-
-  ddt = xbt_datadesc_scalar("signed long long int",
-                             xbt_ddt_scalar_long_long,
-                             e_xbt_dd_scalar_encoding_sint);
-  ddt = xbt_datadesc_scalar("long long int",
-                             xbt_ddt_scalar_long_long,
-                             e_xbt_dd_scalar_encoding_sint);
-  ddt = xbt_datadesc_scalar("unsigned long long int",
-                             xbt_ddt_scalar_long_long,
-                             e_xbt_dd_scalar_encoding_uint);
-
-  ddt = xbt_datadesc_scalar("data pointer",
-                             xbt_ddt_scalar_pdata,
-                             e_xbt_dd_scalar_encoding_uint);
-  ddt = xbt_datadesc_scalar("function pointer",
-                             xbt_ddt_scalar_pfunc,
-                             e_xbt_dd_scalar_encoding_uint);
-
-  ddt = xbt_datadesc_scalar("float",
-                             xbt_ddt_scalar_float,
-                             e_xbt_dd_scalar_encoding_float);
-  ddt = xbt_datadesc_scalar("double",
-                             xbt_ddt_scalar_double,
-                             e_xbt_dd_scalar_encoding_float);
-
-  ddt = xbt_datadesc_array_dyn("char[]",
-                                xbt_datadesc_by_name("char"), _strlen_cb);
-  xbt_datadesc_ref("string", ddt);
-  xbt_datadesc_ref("xbt_string_t", ddt);
-
-  /* specific datatype: the exception type (for RPC) */
-  ddt = xbt_datadesc_struct("ex_t");
-  xbt_datadesc_struct_append(ddt, "msg", xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_append(ddt, "category",
-                              xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_append(ddt, "value", xbt_datadesc_by_name("int"));
-
-  xbt_datadesc_struct_append(ddt, "remote",
-                              xbt_datadesc_by_name("short int"));
-
-  xbt_datadesc_struct_append(ddt, "host",
-                              xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_append(ddt, "procname",
-                              xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_append(ddt, "pid",
-                              xbt_datadesc_by_name("long int"));
-  xbt_datadesc_struct_append(ddt, "file",
-                              xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_append(ddt, "line", xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_append(ddt, "func",
-                              xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_append(ddt, "used", xbt_datadesc_by_name("int"));
-  xbt_datadesc_cb_field_push(ddt, "used");
-  xbt_datadesc_struct_append(ddt, "bt_strings",
-                              xbt_datadesc_ref_pop_arr
-                              (xbt_datadesc_by_name("string")));
-
-  xbt_datadesc_struct_close(ddt);
-
-  /* specific datatype: xbt_peer_t */
-  ddt = xbt_datadesc_struct("s_xbt_peer_t");
-  xbt_datadesc_struct_append(ddt, "name",
-                              xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_append(ddt, "port", xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_close(ddt);
-
-  ddt = xbt_datadesc_ref("xbt_peer_t", ddt);
-
-  /* Dict containing the constant value (for the parsing macro) */
-  xbt_dd_constants = xbt_dict_new_homogeneous(xbt_free_f);
-
-}
-
-/**
- * xbt_datadesc_exit:
- *
- * Finalize the datadesc module
- **/
-void xbt_datadesc_postexit(void)
-{
-  xbt_set_free(&xbt_datadesc_set_local);
-  xbt_dict_free(&xbt_dd_constants);
-}
-
-/** This is mainly to debug */
-const char *xbt_datadesc_get_name(xbt_datadesc_type_t ddt)
-{
-  return ddt ? (const char *) ddt->name : "(null)";
-}
-
-/** This is mainly to debug */
-int xbt_datadesc_get_id(xbt_datadesc_type_t ddt)
-{
-  return ddt->code;
-}
-
-/**
- * xbt_datadesc_size:
- *
- * Returns the size occuped by data of this type (on the current arch).
- *
- */
-int xbt_datadesc_size(xbt_datadesc_type_t type)
-{
-  return type ? type->size[GRAS_THISARCH] : 0;
-}
-
-/**
- * xbt_datadesc_type_dump:
- *
- * For debugging purpose
- */
-void xbt_datadesc_type_dump(const xbt_datadesc_type_t ddt)
-{
-  unsigned int cpt;
-
-  printf("DataDesc dump:");
-  if (!ddt) {
-    printf("(null)\n");
-    return;
-  }
-  printf("%s (ID:%d)\n", ddt->name, ddt->code);
-  printf("  category: %s\n", xbt_datadesc_cat_names[ddt->category_code]);
-
-  printf("  size[");
-  for (cpt = 0; cpt < xbt_arch_count; cpt++) {
-    printf("%s%s%ld%s",
-           cpt > 0 ? ", " : "",
-           cpt == GRAS_THISARCH ? ">" : "",
-           ddt->size[cpt], cpt == GRAS_THISARCH ? "<" : "");
-  }
-  printf("]\n");
-
-  printf("  alignment[");
-  for (cpt = 0; cpt < xbt_arch_count; cpt++) {
-    printf("%s%s%lu%s",
-           cpt > 0 ? ", " : "",
-           cpt == GRAS_THISARCH ? ">" : "",
-           ddt->alignment[cpt], cpt == GRAS_THISARCH ? "<" : "");
-  }
-  printf("]\n");
-
-  printf("  aligned_size[");
-  for (cpt = 0; cpt < xbt_arch_count; cpt++) {
-    printf("%s%s%lu%s",
-           cpt > 0 ? ", " : "",
-           cpt == GRAS_THISARCH ? ">" : "",
-           ddt->aligned_size[cpt], cpt == GRAS_THISARCH ? "<" : "");
-  }
-  printf("]\n");
-  if (ddt->category_code == e_xbt_datadesc_type_cat_struct) {
-    xbt_dd_cat_struct_t struct_data;
-    xbt_dd_cat_field_t field;
-
-    struct_data = ddt->category.struct_data;
-    xbt_dynar_foreach(struct_data.fields, cpt, field) {
-      printf(">>> Dump field #%u (%s) (offset=%ld)\n",
-             cpt, field->name, field->offset[GRAS_THISARCH]);
-      xbt_datadesc_type_dump(field->type);
-      printf("<<< end dump field #%u (%s)\n", cpt, field->name);
-    }
-  }
-  fflush(stdout);
-}
diff --git a/src/xbt/datadesc/datadesc_interface.h b/src/xbt/datadesc/datadesc_interface.h
deleted file mode 100644 (file)
index 7568c45..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* datadesc - describing the data to exchange                               */
-
-/* module's public interface exported within XBT, but not to end user.     */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef XBT_DATADESC_INTERFACE_H
-#define XBT_DATADESC_INTERFACE_H
-
-#include "xbt/datadesc.h"
-#include "xbt/misc.h"
-#include "xbt/socket.h"
-
-XBT_PUBLIC(xbt_datadesc_type_t) xbt_datadesc_by_id(long int code);
-
-/* to debug */
-XBT_PUBLIC(void) xbt_datadesc_type_dump(const xbt_datadesc_type_t ddt);
-XBT_PUBLIC(const char *) xbt_datadesc_arch_name(int code);
-
-/* compare two data type description */
-XBT_PUBLIC(int)
-xbt_datadesc_type_cmp(const xbt_datadesc_type_t d1,
-                       const xbt_datadesc_type_t d2);
-
-/* Access function */
-XBT_PUBLIC(int) xbt_datadesc_size(xbt_datadesc_type_t type);
-/* Described data exchanges: direct use */
-XBT_PUBLIC(int) xbt_datadesc_memcpy(xbt_datadesc_type_t type, void *src,
-                                     void *dst);
-XBT_PUBLIC(void) xbt_datadesc_send(xbt_socket_t sock,
-                                    xbt_datadesc_type_t type, void *src);
-XBT_PUBLIC(void) xbt_datadesc_recv(xbt_socket_t sock,
-                                    xbt_datadesc_type_t type, int r_arch,
-                                    void *dst);
-
-/* Described data exchanges: IDL compilation FIXME: not implemented*/
-void xbt_datadesc_gen_cpy(xbt_datadesc_type_t type, void *src,
-                           void **dst);
-void xbt_datadesc_gen_send(xbt_socket_t sock,
-                            xbt_datadesc_type_t type, void *src);
-void xbt_datadesc_gen_recv(xbt_socket_t sock,
-                            xbt_datadesc_type_t type, int r_arch,
-                            void *dst);
-
-#endif                          /* XBT_DATADESC_INTERFACE_H */
diff --git a/src/xbt/datadesc/datadesc_private.h b/src/xbt/datadesc/datadesc_private.h
deleted file mode 100644 (file)
index 1faf92e..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-/* datadesc - describing the data to exchange                               */
-
-/* module's private interface masked even to other parts of XBT.           */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef XBT_DATADESC_PRIVATE_H
-#define XBT_DATADESC_PRIVATE_H
-
-#include "xbt/sysdep.h"
-#include "xbt/log.h"
-#include "xbt/dynar.h"
-#include "xbt/dict.h"
-#include "xbt/set.h"
-
-#include "gras_config.h"        /* XBT_THISARCH */
-#include "xbt_modinter.h"       /* module init/exit */
-#include "datadesc_interface.h" /* semi-public API */
-
-/**
- * ddt_aligned:
- *
- * Align the data v on the boundary a.
- */
-#define ddt_aligned(v, a) (((v) + (a - 1)) & ~(a - 1))
-
-/*@null@*/ extern xbt_set_t xbt_datadesc_set_local;
-void xbt_ddt_freev(void *ddt);
-/*******************************************
- * Descriptions of all known architectures *
- *******************************************/
-
-#define xbt_arch_count 12
-typedef enum {
-  xbt_ddt_scalar_char = 0,
-  xbt_ddt_scalar_short = 1,
-  xbt_ddt_scalar_int = 2,
-  xbt_ddt_scalar_long = 3,
-  xbt_ddt_scalar_long_long = 4,
-
-  xbt_ddt_scalar_pdata = 5,
-  xbt_ddt_scalar_pfunc = 6,
-
-  xbt_ddt_scalar_float = 7,
-  xbt_ddt_scalar_double = 8
-} xbt_ddt_scalar_type_t;
-
-typedef struct {
-  const char *name;
-
-  int endian;
-
-  int sizeofs[9];               /* char,short,int,long,long_long,pdata,pfunc,float,double */
-  int boundaries[9];            /* idem */
-} xbt_arch_desc_t;
-
-extern const xbt_arch_desc_t xbt_arches[xbt_arch_count];
-extern const char *xbt_datadesc_cat_names[9];
-
-/**********************************************************/
-/* Actual definitions of the stuff in the type descriptor */
-/**********************************************************/
-
-/**
- * e_xbt_datadesc_type_category:
- *
- * Defines all possible type categories.
- */
-typedef enum e_xbt_datadesc_type_category {
-
-  /* if you edit this, also fix xbt_datadesc_cat_names in ddt_exchange.c */
-
-  e_xbt_datadesc_type_cat_undefined = 0,
-
-  e_xbt_datadesc_type_cat_scalar = 1,
-  e_xbt_datadesc_type_cat_struct = 2,
-  e_xbt_datadesc_type_cat_union = 3,
-  e_xbt_datadesc_type_cat_ref = 4,     /* ref to an uniq element */
-  e_xbt_datadesc_type_cat_array = 5,
-
-  e_xbt_datadesc_type_cat_invalid = 6
-} xbt_datadesc_type_category_t;
-
-/*------------------------------------------------*/
-/* definitions of specific data for each category */
-/*------------------------------------------------*/
-/**
- * s_xbt_dd_cat_field:
- *
- * Fields of struct and union
- */
-typedef struct s_xbt_dd_cat_field {
-
-  char *name;
-  long int offset[xbt_arch_count];
-  xbt_datadesc_type_t type;
-
-  xbt_datadesc_type_cb_void_t send;
-  xbt_datadesc_type_cb_void_t recv;
-
-} s_xbt_dd_cat_field_t, *xbt_dd_cat_field_t;
-
-void xbt_dd_cat_field_free(void *f);
-
-/**
- * xbt_dd_cat_scalar_t:
- *
- * Specific fields of a scalar
- */
-enum e_xbt_dd_scalar_encoding {
-  e_xbt_dd_scalar_encoding_undefined = 0,
-
-  e_xbt_dd_scalar_encoding_uint,
-  e_xbt_dd_scalar_encoding_sint,
-  e_xbt_dd_scalar_encoding_float,
-
-  e_xbt_dd_scalar_encoding_invalid
-};
-typedef struct s_xbt_dd_cat_scalar {
-  enum e_xbt_dd_scalar_encoding encoding;
-  xbt_ddt_scalar_type_t type;  /* to check easily that redefinition matches */
-} xbt_dd_cat_scalar_t;
-
-/**
- * xbt_dd_cat_struct_t:
- *
- * Specific fields of a struct
- */
-typedef struct s_xbt_dd_cat_struct {
-  xbt_dynar_t fields;           /* elm type = xbt_dd_cat_field_t */
-  int closed;                   /* xbt_datadesc_declare_struct_close() was called */
-} xbt_dd_cat_struct_t;
-
-/**
- * xbt_dd_cat_union_t:
- *
- * Specific fields of a union
- */
-typedef struct s_xbt_dd_cat_union {
-  xbt_datadesc_type_cb_int_t selector;
-  xbt_dynar_t fields;           /* elm type = xbt_dd_cat_field_t */
-  int closed;                   /* xbt_datadesc_declare_union_close() was called */
-} xbt_dd_cat_union_t;
-
-/**
- * xbt_dd_cat_ref_t:
- *
- * Specific fields of a reference
- */
-typedef struct s_xbt_dd_cat_ref {
-  xbt_datadesc_type_t type;
-
-  /* callback used to return the referenced type number  */
-  xbt_datadesc_selector_t selector;
-} xbt_dd_cat_ref_t;
-
-
-/**
- * xbt_dd_cat_array_t:
- *
- * Specific fields of an array
- */
-typedef struct s_xbt_dd_cat_array {
-  xbt_datadesc_type_t type;
-
-  /* element_count == -1 means dynamically defined */
-  long int fixed_size;
-
-  /* callback used to return the dynamic length */
-  xbt_datadesc_type_cb_int_t dynamic_size;
-
-} xbt_dd_cat_array_t;
-
-/**
- * u_xbt_datadesc_category:
- *
- * Specific data to each possible category
- */
-union u_xbt_datadesc_category {
-  void *undefined_data;
-  xbt_dd_cat_scalar_t scalar_data;
-  xbt_dd_cat_struct_t struct_data;
-  xbt_dd_cat_union_t union_data;
-  xbt_dd_cat_ref_t ref_data;
-  xbt_dd_cat_array_t array_data;
-};
-
-/****************************************/
-/* The holy grail: type descriptor type */
-/****************************************/
-/**
- * s_xbt_datadesc_type:
- *
- * Type descriptor.
- */
-typedef struct s_xbt_datadesc_type {
-  /* headers for the data set */
-  int code;
-  char *name;
-  unsigned int name_len;
-
-  /* payload */
-  long int size[xbt_arch_count];       /* Cannot be unsigned: -1 means dynamic */
-
-  unsigned long int alignment[xbt_arch_count];
-  unsigned long int aligned_size[xbt_arch_count];
-
-  enum e_xbt_datadesc_type_category category_code;
-  union u_xbt_datadesc_category category;
-
-  xbt_datadesc_type_cb_void_t send;
-  xbt_datadesc_type_cb_void_t recv;
-
-  /* flags */
-  unsigned cycle:1;
-
-  /* random value for users (like default value or whatever) */
-  char extra[SIZEOF_MAX];
-
-} s_xbt_datadesc_type_t;
-
-/***************************
- * constructor/desctructor *
- ***************************/
-void xbt_datadesc_free(xbt_datadesc_type_t * type);
-
-xbt_datadesc_type_t
-xbt_datadesc_scalar(const char *name,
-                     xbt_ddt_scalar_type_t type,
-                     enum e_xbt_dd_scalar_encoding encoding);
-
-/****************************************************
- * Callback persistent state constructor/destructor *
- ****************************************************/
-xbt_cbps_t xbt_cbps_new(void);
-void xbt_cbps_free(xbt_cbps_t * state);
-void xbt_cbps_reset(xbt_cbps_t state);
-
-/***************
- * Convertions *
- ***************/
-void
-xbt_dd_convert_elm(xbt_datadesc_type_t type, int count,
-                    int r_arch, void *src, void *dst);
-
-/********************************************************************
- * Dictionnary containing the constant values for the parsing macro *
- ********************************************************************/
-extern xbt_dict_t xbt_dd_constants;    /* lives in ddt_parse.c of course */
-
-#endif                          /* XBT_DATADESC_PRIVATE_H */
diff --git a/src/xbt/datadesc/ddt_convert.c b/src/xbt/datadesc/ddt_convert.c
deleted file mode 100644 (file)
index 2c6758c..0000000
+++ /dev/null
@@ -1,271 +0,0 @@
-/* ddt_remote - Stuff needed to get datadescs about remote hosts            */
-
-/* Copyright (c) 2004, 2005, 2006, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-/************************************************************************/
-/* C combines the power of assembler with the portability of assembler. */
-/************************************************************************/
-
-#include "datadesc_private.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ddt_convert, xbt_ddt,
-                                "Inter-architecture convertions");
-
-/***
- *** Table of all known architectures:
- ***
-l_C:1/1:_I:2/1:4/1:4/1:8/1:_P:4/1:4/1:_D:4/1:8/1: #xbt_arch=0;  xbt_size=32; xbt_arch_name=little32_1;
-l_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2: #xbt_arch=1;  xbt_size=32; xbt_arch_name=little32_2;
-l_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4: #xbt_arch=2;  xbt_size=32; xbt_arch_name=little32_4;
-l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8: #xbt_arch=3;  xbt_size=32; xbt_arch_name=little32_8;
-l_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8: #xbt_arch=4;  xbt_size=64; xbt_arch_name=little64;
-l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:8/8:8/8:_D:4/4:8/8: #xbt_arch=5;  xbt_size=64; xbt_arch_name=little64_2;
-
-B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8: #xbt_arch=6;  xbt_size=32; xbt_arch_name=big32_8;
-B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/4: #xbt_arch=7;  xbt_size=32; xbt_arch_name=big32_8_4;
-B_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4: #xbt_arch=8;  xbt_size=32; xbt_arch_name=big32_4;
-B_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2: #xbt_arch=9;  xbt_size=32; xbt_arch_name=big32_2;
-B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8: #xbt_arch=10; xbt_size=64; xbt_arch_name=big64;
-B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/4: #xbt_arch=11; xbt_size=64; xbt_arch_name=big64_8_4;
-
-  PLEASE DO NOT MESS WITH THESE HARDCODED VALUES
-  
-  
-  Grep GRAS_THISARCH in buildtools/Cmake/CompleteInFiles.cmake for details
-  
- ***/
-
-const xbt_arch_desc_t xbt_arches[xbt_arch_count] = {
-
-  {"little32_1", 0, {1, 2, 4, 4, 8, 4, 4, 4, 8},        /* little endian, 1 byte alignement (win32) */
-   {1, 1, 1, 1, 1, 1, 1, 1, 1}},
-
-  {"little32_2", 0, {1, 2, 4, 4, 8, 4, 4, 4, 8},        /* little endian, 2 bytes alignements (win32) */
-   {1, 2, 2, 2, 2, 2, 2, 2, 2}},
-
-  {"little32_4", 0, {1, 2, 4, 4, 8, 4, 4, 4, 8},        /* little endian, 4 bytes alignements (win32 and linux x86) */
-   {1, 2, 4, 4, 4, 4, 4, 4, 4}},
-
-  {"little32_8", 0, {1, 2, 4, 4, 8, 4, 4, 4, 8},        /* little endian, 8 bytes alignement (win32) */
-   {1, 2, 4, 4, 8, 4, 4, 4, 8}},
-
-  {"little64", 0, {1, 2, 4, 8, 8, 8, 8, 4, 8},  /* alpha, ia64 */
-   {1, 2, 4, 8, 8, 8, 8, 4, 8}},
-
-  {"little64_2", 0, {1, 2, 4, 4, 8, 8, 8, 4, 8},  /* win64 */
-   {1, 2, 4, 4, 8, 8, 8, 4, 8}},
-
-  {"big32_8", 1, {1, 2, 4, 4, 8, 4, 4, 4, 8},
-   {1, 2, 4, 4, 8, 4, 4, 4, 8}},
-
-  {"big32_8_4", 1, {1, 2, 4, 4, 8, 4, 4, 4, 8}, /* AIX */
-   {1, 2, 4, 4, 8, 4, 4, 4, 4}},
-
-  {"big32_4", 1, {1, 2, 4, 4, 8, 4, 4, 4, 8},   /* G5 */
-   {1, 2, 4, 4, 4, 4, 4, 4, 4}},
-
-  {"big32_2", 1, {1, 2, 4, 4, 8, 4, 4, 4, 8},   /* ARM */
-   {1, 2, 2, 2, 2, 2, 2, 2, 2}},
-
-  {"big64", 1, {1, 2, 4, 8, 8, 8, 8, 4, 8},     /* sparc */
-   {1, 2, 4, 8, 8, 8, 8, 4, 8}},
-
-  {"big64_8_4", 1, {1, 2, 4, 8, 8, 8, 8, 4, 8}, /* aix with -maix64 */
-   {1, 2, 4, 8, 8, 8, 8, 4, 4}}
-};
-
-const char *xbt_datadesc_arch_name(int code)
-{
-  if (code < 0 || code >= xbt_arch_count)
-    return "[unknown arch]";
-  return xbt_arches[code].name;
-}
-
-
-/**
- * Local function doing the grunt work
- */
-static void xbt_dd_reverse_bytes(void *to, const void *from,
-                                  size_t length);
-
-/**
- * xbt_dd_convert_elm:
- *
- * Convert the element described by @type comming from architecture @r_arch.
- * The data to be converted is stored in @src, and is to be stored in @dst.
- * Both pointers may be the same location if no resizing is needed.
- */
-void
-xbt_dd_convert_elm(xbt_datadesc_type_t type, int count,
-                    int r_arch, void *src, void *dst)
-{
-  xbt_dd_cat_scalar_t scal = type->category.scalar_data;
-  int cpt;
-  const void *r_data;
-  void *l_data;
-  unsigned long r_size, l_size;
-  /* Hexadecimal displayer
-     union {
-     char c[sizeof(int)];
-     int i;
-     } tester;
-   */
-
-  xbt_assert(type->category_code == e_xbt_datadesc_type_cat_scalar);
-  xbt_assert(r_arch != GRAS_THISARCH);
-
-  r_size = type->size[r_arch];
-  l_size = type->size[GRAS_THISARCH];
-  XBT_DEBUG("r_size=%lu l_size=%lu,    src=%p dst=%p", r_size, l_size, src,
-         dst);
-
-  XBT_DEBUG("remote=%c local=%c", xbt_arches[r_arch].endian ? 'B' : 'l',
-         xbt_arches[GRAS_THISARCH].endian ? 'B' : 'l');
-
-  if (r_size != l_size) {
-    for (cpt = 0, r_data = src, l_data = dst;
-         cpt < count;
-         cpt++,
-         r_data = (char *) r_data + r_size,
-         l_data = (char *) l_data + l_size) {
-
-      /*
-         fprintf(stderr,"r_data=");
-         for (cpt=0; cpt<r_size; cpt++) {
-         tester.i=0;
-         tester.c[0]= ((char*)r_data)[cpt];
-         fprintf(stderr,"\\%02x", tester.i);
-         }
-         fprintf(stderr,"\n");
-       */
-
-      /* Resize that damn integer, pal */
-
-      unsigned char *l_sign, *r_sign;
-      int padding;
-      int sizeChange = l_size - r_size;
-      int lowOrderFirst = !xbt_arches[r_arch].endian ||
-          xbt_arches[r_arch].endian == xbt_arches[GRAS_THISARCH].endian;
-
-      XBT_DEBUG("Resize integer %d from %lu @%p to %lu @%p",
-             cpt, r_size, r_data, l_size, l_data);
-      xbt_assert(r_data != l_data, "Impossible to resize in place");
-
-      if (sizeChange < 0) {
-        XBT_DEBUG("Truncate %d bytes (%s,%s)", -sizeChange,
-               lowOrderFirst ? "lowOrderFirst" : "bigOrderFirst",
-               scal.encoding ==
-               e_xbt_dd_scalar_encoding_sint ? "signed" : "unsigned");
-        /* Truncate high-order bytes. */
-        memcpy(l_data,
-               xbt_arches[r_arch].endian ? ((char *) r_data - sizeChange)
-               : r_data, l_size);
-
-        if (scal.encoding == e_xbt_dd_scalar_encoding_sint) {
-          XBT_DEBUG("This is signed");
-          /* Make sure the high order bit of r_data and l_data are the same */
-          l_sign = xbt_arches[GRAS_THISARCH].endian
-              ? ((unsigned char *) l_data + l_size - 1)
-              : (unsigned char *) l_data;
-          r_sign = xbt_arches[r_arch].endian
-              ? ((unsigned char *) r_data + r_size - 1)
-              : (unsigned char *) r_data;
-          XBT_DEBUG("This is signed (r_sign=%c l_sign=%c", *r_sign, *l_sign);
-
-          if ((*r_sign > 127) != (*l_sign > 127)) {
-            if (*r_sign > 127)
-              *l_sign += 128;
-            else
-              *l_sign -= 128;
-          }
-        }
-      } else {
-        XBT_DEBUG("Extend %d bytes", sizeChange);
-        if (scal.encoding != e_xbt_dd_scalar_encoding_sint) {
-          XBT_DEBUG("This is signed");
-          padding = 0;          /* pad unsigned with 0 */
-        } else {
-          /* extend sign */
-          r_sign =
-              xbt_arches[r_arch].endian ? ((unsigned char *) r_data +
-                                            r_size - 1)
-              : (unsigned char *) r_data;
-          padding = (*r_sign > 127) ? 0xff : 0;
-        }
-
-        if (l_size != 0) {
-          memset(l_data, padding, l_size);
-        }
-        memcpy(!xbt_arches[r_arch].endian ? l_data
-               : ((char *) l_data + sizeChange), r_data, r_size);
-
-        /*
-           fprintf(stderr,"r_data=");
-           for (cpt=0; cpt<r_size; cpt++) {
-           tester.i=0;
-           tester.c[0] = ((char*)r_data)[cpt];
-           fprintf(stderr,"\\%02x", tester.i);
-           }
-           fprintf(stderr,"\n");
-
-           fprintf(stderr,"l_data=");
-           for (cpt=0; cpt<l_size; cpt++) {
-           tester.i=0;
-           tester.c[0]= ((char*)l_data)[cpt];
-           fprintf(stderr,"\\%02x", tester.i);
-           } fprintf(stderr,"\n");
-         */
-      }
-    }
-  }
-
-  /* flip bytes if needed */
-  if (xbt_arches[r_arch].endian != xbt_arches[GRAS_THISARCH].endian &&
-      (l_size * count) > 1) {
-
-    for (cpt = 0, r_data = dst, l_data = dst; cpt < count; cpt++, r_data = (char *) r_data + l_size,    /* resizing already done */
-         l_data = (char *) l_data + l_size) {
-
-      XBT_DEBUG("Flip elm %d", cpt);
-      xbt_dd_reverse_bytes(l_data, r_data, l_size);
-    }
-  }
-
-}
-
-static void xbt_dd_reverse_bytes(void *to, const void *from,
-                                  size_t length)
-{
-
-  char charBegin;
-  const char *fromBegin;
-  const char *fromEnd;
-  char *toBegin;
-  char *toEnd;
-
-  for (fromBegin = (const char *) from,
-       fromEnd = fromBegin + length - 1,
-       toBegin = (char *) to,
-       toEnd = toBegin + length - 1;
-       fromBegin <= fromEnd; fromBegin++, fromEnd--, toBegin++, toEnd--) {
-
-    charBegin = *fromBegin;
-    *toBegin = *fromEnd;
-    *toEnd = charBegin;
-  }
-}
-
-
-/**
- * xbt_arch_selfid:
- *
- * returns the ID of the architecture the process is running on
- */
-int xbt_arch_selfid(void)
-{
-  return GRAS_THISARCH;
-}
diff --git a/src/xbt/datadesc/ddt_create.c b/src/xbt/datadesc/ddt_create.c
deleted file mode 100644 (file)
index e1cf03b..0000000
+++ /dev/null
@@ -1,1140 +0,0 @@
-/* ddt_new - creation/deletion of datatypes structs (private to this module)*/
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/misc.h"           /* min()/max() */
-#include "xbt/ex.h"
-#include "datadesc_private.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ddt_create, xbt_ddt,
-                                "Creating new data descriptions");
-
-/*** prototypes ***/
-static xbt_dd_cat_field_t
-xbt_dd_find_field(xbt_datadesc_type_t type, const char *field_name);
-/**
- * xbt_ddt_freev:
- *
- * gime that memory back, dude. I mean it.
- */
-void xbt_ddt_freev(void *ddt)
-{
-  xbt_datadesc_type_t type = (xbt_datadesc_type_t) ddt;
-
-  if (type) {
-    xbt_datadesc_free(&type);
-  }
-}
-
-static xbt_datadesc_type_t xbt_ddt_new(const char *name)
-{
-  xbt_datadesc_type_t res;
-
-  XBT_IN("(%s)", name);
-  res = xbt_new0(s_xbt_datadesc_type_t, 1);
-
-  res->name = (char *) strdup(name);
-  res->name_len = strlen(name);
-  res->cycle = 0;
-
-  xbt_set_add(xbt_datadesc_set_local, (xbt_set_elm_t) res,
-              xbt_ddt_freev);
-  XBT_OUT();
-  return res;
-}
-
-/** @brief retrieve an existing message type from its name (or NULL if it does not exist). */
-xbt_datadesc_type_t xbt_datadesc_by_name_or_null(const char *name)
-{
-  xbt_ex_t e;
-  xbt_datadesc_type_t res = NULL;
-
-  TRY {
-    res = xbt_datadesc_by_name(name);
-  }
-  CATCH(e) {
-    res = NULL;
-    xbt_ex_free(e);
-  }
-  return res;
-}
-
-/**
- * Search the given datadesc (or raises an exception if it can't be found)
- */
-xbt_datadesc_type_t xbt_datadesc_by_name(const char *name)
-{
-  xbt_ex_t e;
-  xbt_datadesc_type_t res = NULL;
-  volatile int found = 0;
-  TRY {
-    res =
-        (xbt_datadesc_type_t) xbt_set_get_by_name(xbt_datadesc_set_local,
-                                                   name);
-    found = 1;
-  }
-  CATCH(e) {
-    if (e.category != not_found_error)
-      RETHROW;
-    xbt_ex_free(e);
-  }
-  if (!found)
-    THROWF(not_found_error, 0, "No registred datatype of that name: %s",
-           name);
-
-  return res;
-}
-
-/**
- * Retrieve a type from its code (or NULL if not found)
- */
-xbt_datadesc_type_t xbt_datadesc_by_id(long int code)
-{
-  xbt_ex_t e;
-  xbt_datadesc_type_t res = NULL;
-  TRY {
-    res =
-        (xbt_datadesc_type_t) xbt_set_get_by_id(xbt_datadesc_set_local,
-                                                 code);
-  }
-  CATCH(e) {
-    if (e.category != not_found_error)
-      RETHROW;
-    xbt_ex_free(e);
-    res = NULL;
-  }
-  return res;
-}
-
-/**
- * Create a new scalar and give a pointer to it
- */
-xbt_datadesc_type_t
-xbt_datadesc_scalar(const char *name,
-                     xbt_ddt_scalar_type_t type,
-                     enum e_xbt_dd_scalar_encoding encoding)
-{
-
-  xbt_datadesc_type_t res;
-  long int arch;
-
-  XBT_IN();
-  res = xbt_datadesc_by_name_or_null(name);
-  if (res) {
-    xbt_assert(res->category_code == e_xbt_datadesc_type_cat_scalar,
-                "Redefinition of type %s does not match", name);
-    xbt_assert(res->category.scalar_data.encoding == encoding,
-                "Redefinition of type %s does not match", name);
-    xbt_assert(res->category.scalar_data.type == type,
-                "Redefinition of type %s does not match", name);
-    XBT_VERB("Discarding redefinition of %s", name);
-    return res;
-  }
-  res = xbt_ddt_new(name);
-
-  for (arch = 0; arch < xbt_arch_count; arch++) {
-    res->size[arch] = xbt_arches[arch].sizeofs[type];
-    res->alignment[arch] = xbt_arches[arch].boundaries[type];
-    res->aligned_size[arch] =
-        ddt_aligned(res->size[arch], res->alignment[arch]);
-  }
-
-  res->category_code = e_xbt_datadesc_type_cat_scalar;
-  res->category.scalar_data.encoding = encoding;
-  res->category.scalar_data.type = type;
-  XBT_OUT();
-
-  return res;
-}
-
-
-/** Frees one struct or union field */
-void xbt_dd_cat_field_free(void *f)
-{
-  xbt_dd_cat_field_t field = *(xbt_dd_cat_field_t *) f;
-  XBT_IN();
-  if (field) {
-    free(field->name);
-    free(field);
-  }
-  XBT_OUT();
-}
-
-/** \brief Declare a new structure description */
-xbt_datadesc_type_t xbt_datadesc_struct(const char *name)
-{
-
-  xbt_datadesc_type_t res;
-  long int arch;
-
-  XBT_IN("(%s)", name);
-  res = xbt_datadesc_by_name_or_null(name);
-  if (res) {
-    /* FIXME: Check that field redefinition matches */
-    xbt_assert(res->category_code == e_xbt_datadesc_type_cat_struct,
-                "Redefinition of type %s does not match", name);
-    XBT_DEBUG("Discarding redefinition of %s", name);
-    return res;
-  }
-  res = xbt_ddt_new(name);
-
-  for (arch = 0; arch < xbt_arch_count; arch++) {
-    res->size[arch] = 0;
-    res->alignment[arch] = 0;
-    res->aligned_size[arch] = 0;
-  }
-  res->category_code = e_xbt_datadesc_type_cat_struct;
-  res->category.struct_data.fields =
-      xbt_dynar_new(sizeof(xbt_dd_cat_field_t), xbt_dd_cat_field_free);
-
-  XBT_OUT();
-  return res;
-}
-
-/** \brief Append a new field to a structure description */
-void
-xbt_datadesc_struct_append(xbt_datadesc_type_t struct_type,
-                            const char *name,
-                            xbt_datadesc_type_t field_type)
-{
-
-  xbt_dd_cat_field_t field;
-  int arch;
-
-  xbt_assert(field_type,
-              "Cannot add the field '%s' into struct '%s': its type is NULL",
-              name, struct_type->name);
-  XBT_IN("(%s %s.%s;)", field_type->name, struct_type->name, name);
-  if (struct_type->category.struct_data.closed) {
-    XBT_DEBUG
-        ("Ignoring request to add field to struct %s (closed. Redefinition?)",
-         struct_type->name);
-    return;
-  }
-
-  xbt_assert(field_type->size[GRAS_THISARCH] >= 0,
-              "Cannot add a dynamically sized field in structure %s",
-              struct_type->name);
-
-  field = xbt_new(s_xbt_dd_cat_field_t, 1);
-  field->name = (char *) strdup(name);
-
-  XBT_DEBUG("----------------");
-  XBT_DEBUG("PRE s={size=%ld,align=%lu,asize=%lu}",
-         struct_type->size[GRAS_THISARCH],
-         struct_type->alignment[GRAS_THISARCH],
-         struct_type->aligned_size[GRAS_THISARCH]);
-
-
-  for (arch = 0; arch < xbt_arch_count; arch++) {
-    field->offset[arch] = ddt_aligned(struct_type->size[arch],
-                                      field_type->alignment[arch]);
-
-    struct_type->size[arch] = field->offset[arch] + field_type->size[arch];
-    struct_type->alignment[arch] = max(struct_type->alignment[arch],
-                                       field_type->alignment[arch]);
-    struct_type->aligned_size[arch] = ddt_aligned(struct_type->size[arch],
-                                                  struct_type->alignment
-                                                  [arch]);
-  }
-  field->type = field_type;
-  field->send = NULL;
-  field->recv = NULL;
-
-  xbt_dynar_push(struct_type->category.struct_data.fields, &field);
-
-  XBT_DEBUG("Push a %s into %s at offset %ld.",
-         field_type->name, struct_type->name,
-         field->offset[GRAS_THISARCH]);
-  XBT_DEBUG("  f={size=%ld,align=%lu,asize=%lu}",
-         field_type->size[GRAS_THISARCH],
-         field_type->alignment[GRAS_THISARCH],
-         field_type->aligned_size[GRAS_THISARCH]);
-  XBT_DEBUG("  s={size=%ld,align=%lu,asize=%lu}",
-         struct_type->size[GRAS_THISARCH],
-         struct_type->alignment[GRAS_THISARCH],
-         struct_type->aligned_size[GRAS_THISARCH]);
-  XBT_OUT();
-}
-
-/** \brief Close a structure description
- *
- * No new field can be added afterward, and it is mandatory to close the structure before using it.
- */
-void xbt_datadesc_struct_close(xbt_datadesc_type_t struct_type)
-{
-  int arch;
-  XBT_IN();
-  struct_type->category.struct_data.closed = 1;
-  for (arch = 0; arch < xbt_arch_count; arch++) {
-    struct_type->size[arch] = struct_type->aligned_size[arch];
-  }
-  XBT_DEBUG("structure %s closed. size=%ld,align=%lu,asize=%lu",
-         struct_type->name,
-         struct_type->size[GRAS_THISARCH],
-         struct_type->alignment[GRAS_THISARCH],
-         struct_type->aligned_size[GRAS_THISARCH]);
-}
-
-/**
- * xbt_datadesc_cycle_set:
- *
- * Tell XBT that the pointers of the type described by ddt may present
- * some loop, and that the cycle detection mechanism is needed.
- *
- * Note that setting this option when not needed have a rather bad effect
- * on the performance (several times slower on big data).
- */
-void xbt_datadesc_cycle_set(xbt_datadesc_type_t ddt)
-{
-  ddt->cycle = 1;
-}
-
-/**
- * xbt_datadesc_cycle_unset:
- *
- * Tell XBT that the pointers of the type described by ddt do not present
- * any loop and that cycle detection mechanism are not needed.
- * (default)
- */
-void xbt_datadesc_cycle_unset(xbt_datadesc_type_t ddt)
-{
-  ddt->cycle = 0;
-}
-
-/** \brief Declare a new union description */
-xbt_datadesc_type_t
-xbt_datadesc_union(const char *name, xbt_datadesc_type_cb_int_t selector)
-{
-
-  xbt_datadesc_type_t res;
-  int arch;
-
-  XBT_IN("(%s)", name);
-  xbt_assert(selector,
-              "Attempt to creat an union without field_count function");
-
-  res = xbt_datadesc_by_name_or_null(name);
-  if (res) {
-    /* FIXME: Check that field redefinition matches */
-    xbt_assert(res->category_code == e_xbt_datadesc_type_cat_union,
-                "Redefinition of type %s does not match", name);
-    xbt_assert(res->category.union_data.selector == selector,
-                "Redefinition of type %s does not match", name);
-    XBT_VERB("Discarding redefinition of %s", name);
-    return res;
-  }
-
-  res = xbt_ddt_new(name);
-
-  for (arch = 0; arch < xbt_arch_count; arch++) {
-    res->size[arch] = 0;
-    res->alignment[arch] = 0;
-    res->aligned_size[arch] = 0;
-  }
-
-  res->category_code = e_xbt_datadesc_type_cat_union;
-  res->category.union_data.fields =
-      xbt_dynar_new(sizeof(xbt_dd_cat_field_t *), xbt_dd_cat_field_free);
-  res->category.union_data.selector = selector;
-
-  return res;
-}
-
-/** \brief Append a new field to an union description */
-void xbt_datadesc_union_append(xbt_datadesc_type_t union_type,
-                                const char *name,
-                                xbt_datadesc_type_t field_type)
-{
-
-  xbt_dd_cat_field_t field;
-  int arch;
-
-  XBT_IN("(%s %s.%s;)", field_type->name, union_type->name, name);
-  xbt_assert(field_type->size[GRAS_THISARCH] >= 0,
-              "Cannot add a dynamically sized field in union %s",
-              union_type->name);
-
-  if (union_type->category.union_data.closed) {
-    XBT_VERB("Ignoring request to add field to union %s (closed)",
-          union_type->name);
-    return;
-  }
-
-  field = xbt_new0(s_xbt_dd_cat_field_t, 1);
-
-  field->name = (char *) strdup(name);
-  field->type = field_type;
-  /* All offset are left to 0 in an union */
-
-  xbt_dynar_push(union_type->category.union_data.fields, &field);
-
-  for (arch = 0; arch < xbt_arch_count; arch++) {
-    union_type->size[arch] = max(union_type->size[arch],
-                                 field_type->size[arch]);
-    union_type->alignment[arch] = max(union_type->alignment[arch],
-                                      field_type->alignment[arch]);
-    union_type->aligned_size[arch] = ddt_aligned(union_type->size[arch],
-                                                 union_type->alignment
-                                                 [arch]);
-  }
-}
-
-
-/** \brief Close an union description
- *
- * No new field can be added afterward, and it is mandatory to close the union before using it.
- */
-void xbt_datadesc_union_close(xbt_datadesc_type_t union_type)
-{
-  union_type->category.union_data.closed = 1;
-}
-
-/** \brief Copy a type under another name
- *
- * This may reveal useful to circumvent parsing macro limitations
- */
-xbt_datadesc_type_t
-xbt_datadesc_copy(const char *name, xbt_datadesc_type_t copied)
-{
-
-  xbt_datadesc_type_t res = xbt_ddt_new(name);
-  char *name_cpy = res->name;
-
-  memcpy(res, copied, sizeof(s_xbt_datadesc_type_t));
-  res->name = name_cpy;
-  return res;
-}
-
-/** \brief Declare a new type being a reference to the one passed in arg */
-xbt_datadesc_type_t
-xbt_datadesc_ref(const char *name, xbt_datadesc_type_t referenced_type)
-{
-
-  xbt_datadesc_type_t res;
-  xbt_datadesc_type_t pointer_type =
-      xbt_datadesc_by_name("data pointer");
-  int arch;
-
-  XBT_IN("(%s)", name);
-  res = xbt_datadesc_by_name_or_null(name);
-  if (res) {
-    xbt_assert(res->category_code == e_xbt_datadesc_type_cat_ref,
-                "Redefinition of %s does not match", name);
-    xbt_assert(res->category.ref_data.type == referenced_type,
-                "Redefinition of %s does not match", name);
-    xbt_assert(res->category.ref_data.selector == NULL,
-                "Redefinition of %s does not match", name);
-    XBT_DEBUG("Discarding redefinition of %s", name);
-    return res;
-  }
-
-  res = xbt_ddt_new(name);
-
-  xbt_assert(pointer_type, "Cannot get the description of data pointer");
-
-  for (arch = 0; arch < xbt_arch_count; arch++) {
-    res->size[arch] = pointer_type->size[arch];
-    res->alignment[arch] = pointer_type->alignment[arch];
-    res->aligned_size[arch] = pointer_type->aligned_size[arch];
-  }
-
-  res->category_code = e_xbt_datadesc_type_cat_ref;
-  res->category.ref_data.type = referenced_type;
-  res->category.ref_data.selector = NULL;
-
-  return res;
-}
-
-/** \brief Declare a new type being a generic reference.
- *
- * The callback passed in argument is to be used to select which type is currently used.
- * So, when XBT wants to send a generic reference, it passes the current data to the selector
- * callback and expects it to return the type description to use.
- */
-xbt_datadesc_type_t
-xbt_datadesc_ref_generic(const char *name,
-                          xbt_datadesc_selector_t selector)
-{
-
-  xbt_datadesc_type_t res;
-  xbt_datadesc_type_t pointer_type =
-      xbt_datadesc_by_name("data pointer");
-  int arch;
-
-  XBT_IN("(%s)", name);
-  res = xbt_datadesc_by_name_or_null(name);
-
-  if (res) {
-    xbt_assert(res->category_code == e_xbt_datadesc_type_cat_ref,
-                "Redefinition of type %s does not match", name);
-    xbt_assert(res->category.ref_data.type == NULL,
-                "Redefinition of type %s does not match", name);
-    xbt_assert(res->category.ref_data.selector == selector,
-                "Redefinition of type %s does not match", name);
-    XBT_VERB("Discarding redefinition of %s", name);
-    return res;
-  }
-  res = xbt_ddt_new(name);
-
-  xbt_assert(pointer_type, "Cannot get the description of data pointer");
-
-  for (arch = 0; arch < xbt_arch_count; arch++) {
-    res->size[arch] = pointer_type->size[arch];
-    res->alignment[arch] = pointer_type->alignment[arch];
-    res->aligned_size[arch] = pointer_type->aligned_size[arch];
-  }
-
-  res->category_code = e_xbt_datadesc_type_cat_ref;
-
-  res->category.ref_data.type = NULL;
-  res->category.ref_data.selector = selector;
-
-  return res;
-}
-
-/** \brief Declare a new type being an array of fixed size and content */
-xbt_datadesc_type_t
-xbt_datadesc_array_fixed(const char *name,
-                          xbt_datadesc_type_t element_type,
-                          long int fixed_size)
-{
-
-  xbt_datadesc_type_t res;
-  int arch;
-
-  XBT_IN("(%s)", name);
-  res = xbt_datadesc_by_name_or_null(name);
-  if (res) {
-    xbt_assert(res->category_code == e_xbt_datadesc_type_cat_array,
-                "Redefinition of type %s does not match", name);
-
-    if (res->category.array_data.type != element_type) {
-      XBT_ERROR
-          ("Redefinition of type %s does not match: array elements differ",
-           name);
-      xbt_datadesc_type_dump(res->category.array_data.type);
-      xbt_datadesc_type_dump(element_type);
-    }
-
-    xbt_assert(res->category.array_data.fixed_size == fixed_size,
-                "Redefinition of type %s does not match", name);
-    xbt_assert(res->category.array_data.dynamic_size == NULL,
-                "Redefinition of type %s does not match", name);
-    XBT_VERB("Discarding redefinition of %s", name);
-
-    return res;
-  }
-  res = xbt_ddt_new(name);
-
-  xbt_assert(fixed_size >= 0, "'%s' is a array of negative fixed size",
-              name);
-  for (arch = 0; arch < xbt_arch_count; arch++) {
-    res->size[arch] = fixed_size * element_type->aligned_size[arch];
-    res->alignment[arch] = element_type->alignment[arch];
-    res->aligned_size[arch] = res->size[arch];
-  }
-
-  res->category_code = e_xbt_datadesc_type_cat_array;
-
-  res->category.array_data.type = element_type;
-  res->category.array_data.fixed_size = fixed_size;
-  res->category.array_data.dynamic_size = NULL;
-
-  return res;
-}
-
-/** \brief Declare a new type being an array of fixed size, but accepting several content types. */
-xbt_datadesc_type_t xbt_datadesc_array_dyn(const char *name,
-                                             xbt_datadesc_type_t
-                                             element_type,
-                                             xbt_datadesc_type_cb_int_t
-                                             dynamic_size)
-{
-
-  xbt_datadesc_type_t res;
-  int arch;
-
-  XBT_IN("(%s)", name);
-  xbt_assert(dynamic_size,
-              "'%s' is a dynamic array without size discriminant", name);
-
-  res = xbt_datadesc_by_name_or_null(name);
-  if (res) {
-    xbt_assert(res->category_code == e_xbt_datadesc_type_cat_array,
-                "Redefinition of type %s does not match", name);
-    xbt_assert(res->category.array_data.type == element_type,
-                "Redefinition of type %s does not match", name);
-    xbt_assert(res->category.array_data.fixed_size == -1,
-                "Redefinition of type %s does not match", name);
-    xbt_assert(res->category.array_data.dynamic_size == dynamic_size,
-                "Redefinition of type %s does not match", name);
-    XBT_VERB("Discarding redefinition of %s", name);
-
-    return res;
-  }
-
-  res = xbt_ddt_new(name);
-
-  for (arch = 0; arch < xbt_arch_count; arch++) {
-    res->size[arch] = 0;        /* make sure it indicates "dynamic" */
-    res->alignment[arch] = element_type->alignment[arch];
-    res->aligned_size[arch] = 0;        /*FIXME: That was so in GS, but looks stupid */
-  }
-
-  res->category_code = e_xbt_datadesc_type_cat_array;
-
-  res->category.array_data.type = element_type;
-  res->category.array_data.fixed_size = -1;
-  res->category.array_data.dynamic_size = dynamic_size;
-
-  return res;
-}
-
-/** \brief Declare a new type being an array which size can be found with \ref xbt_cbps_i_pop
- *
- * Most of the time, you want to include a reference in your structure which
- * is a pointer to a dynamic array whose size is fixed by another field of
- * your structure.
- *
- * This case pops up so often that this function was created to take care of
- * this case. It creates a dynamic array type whose size is poped from the
- * current cbps, and then create a reference to it.
- *
- * The name of the created datatype will be the name of the element type, with
- * '[]*' appended to it.
- *
- * Then to use it, you just have to make sure that your structure pre-callback
- * does push the size of the array in the cbps (using #xbt_cbps_i_push), and
- * you are set.
- *
- * But be remember that this is a stack. If you have two different pop_arr, you
- * should push the second one first, so that the first one is on the top of the
- * list when the first field gets transfered.
- *
- */
-xbt_datadesc_type_t
-xbt_datadesc_ref_pop_arr(xbt_datadesc_type_t element_type)
-{
-  int cpt = 0;
-  xbt_datadesc_type_t res, ddt2;
-  char *name = (char *) xbt_malloc(strlen(element_type->name) + 4);
-
-  sprintf(name, "%s[]", element_type->name);
-  /* Make sure we are not trying to redefine a ddt with the same name */
-  ddt2 = xbt_datadesc_by_name_or_null(name);
-
-  while (ddt2) {
-    free(name);
-    name = bprintf("%s[]_%d", element_type->name, cpt++);
-    ddt2 = xbt_datadesc_by_name_or_null(name);
-  }
-
-  res = xbt_datadesc_array_dyn(name, element_type, xbt_datadesc_cb_pop);
-
-  sprintf(name, "%s[]*", element_type->name);
-  cpt = 0;
-  ddt2 = xbt_datadesc_by_name_or_null(name);
-  while (ddt2) {
-    free(name);
-    name = bprintf("%s[]*_%d", element_type->name, cpt++);
-    ddt2 = xbt_datadesc_by_name_or_null(name);
-  }
-
-  res = xbt_datadesc_ref(name, res);
-
-  free(name);
-
-  return res;
-}
-
-/*
- *##
- *## Constructor of container datatypes
- *##
- */
-
-static void xbt_datadesc_dynar_cb(xbt_datadesc_type_t typedesc,
-                                   xbt_cbps_t vars, void *data)
-{
-  xbt_datadesc_type_t subtype;
-  xbt_dynar_t dynar = (xbt_dynar_t) data;
-
-  memcpy(&dynar->free_f, &typedesc->extra, sizeof(dynar->free_f));
-
-  /* search for the elemsize in what we have. If elements are "int", typedesc got is "int[]*" */
-  subtype = xbt_dd_find_field(typedesc, "data")->type;
-
-  /* this is now a ref to array of what we're looking for */
-  subtype = subtype->category.ref_data.type;
-  subtype = subtype->category.array_data.type;
-
-  XBT_DEBUG("subtype is %s", subtype->name);
-
-  dynar->elmsize = subtype->size[GRAS_THISARCH];
-  dynar->size = dynar->used;
-  dynar->mutex = NULL;
-}
-
-/** \brief Declare a new type being a dynar in which each elements are of the given type
- *
- *  The type gets registered under the name "dynar(%s)_s", where %s is the name of the subtype.
- *  For example, a dynar of doubles will be called "dynar(double)_s" and a dynar of dynar of
- *  strings will be called "dynar(dynar(string)_s)_s".
- *
- *  \param elm_t: the datadesc of the elements
- *  \param free_func: the function to use to free the elements when the dynar gets freed
- */
-xbt_datadesc_type_t
-xbt_datadesc_dynar(xbt_datadesc_type_t elm_t, void_f_pvoid_t free_func)
-{
-
-  char *buffname;
-  xbt_datadesc_type_t res;
-
-  buffname = bprintf("s_xbt_dynar_of_%s", elm_t->name);
-
-  res = xbt_datadesc_struct(buffname);
-
-  xbt_datadesc_struct_append(res, "size",
-                              xbt_datadesc_by_name("unsigned long int"));
-
-  xbt_datadesc_struct_append(res, "used",
-                              xbt_datadesc_by_name("unsigned long int"));
-
-  xbt_datadesc_struct_append(res, "elmsize",
-                              xbt_datadesc_by_name("unsigned long int"));
-
-  xbt_datadesc_struct_append(res, "data",
-                              xbt_datadesc_ref_pop_arr(elm_t));
-
-  xbt_datadesc_struct_append(res, "free_f",
-                              xbt_datadesc_by_name("function pointer"));
-  memcpy(res->extra, &free_func, sizeof(free_func));
-
-  xbt_datadesc_struct_append(res, "mutex",
-                              xbt_datadesc_by_name("data pointer"));
-
-  xbt_datadesc_struct_close(res);
-
-  xbt_datadesc_cb_field_push(res, "used");
-  xbt_datadesc_cb_recv(res, &xbt_datadesc_dynar_cb);
-
-  /* build a ref to it */
-  free(buffname);
-  buffname = bprintf("xbt_dynar_of_%s", elm_t->name);
-  res = xbt_datadesc_ref(buffname, res);
-  free(buffname);
-  return res;
-}
-
-#include "xbt/matrix.h"
-static void xbt_datadesc_matrix_cb(xbt_datadesc_type_t typedesc,
-                                    xbt_cbps_t vars, void *data)
-{
-  xbt_datadesc_type_t subtype;
-  xbt_matrix_t matrix = (xbt_matrix_t) data;
-
-  memcpy(&matrix->free_f, &typedesc->extra, sizeof(matrix->free_f));
-
-  /* search for the elemsize in what we have. If elements are "int", typedesc got is "int[]*" */
-  subtype = xbt_dd_find_field(typedesc, "data")->type;
-
-  /* this is now a ref to array of what we're looking for */
-  subtype = subtype->category.ref_data.type;
-  subtype = subtype->category.array_data.type;
-
-  XBT_DEBUG("subtype is %s", subtype->name);
-
-  matrix->elmsize = subtype->size[GRAS_THISARCH];
-}
-
-xbt_datadesc_type_t
-xbt_datadesc_matrix(xbt_datadesc_type_t elm_t,
-                     void_f_pvoid_t const free_f)
-{
-  char *buffname;
-  xbt_datadesc_type_t res;
-
-  buffname = bprintf("s_xbt_matrix_t(%s)", elm_t->name);
-  res = xbt_datadesc_struct(buffname);
-
-  xbt_datadesc_struct_append(res, "lines",
-                              xbt_datadesc_by_name("unsigned int"));
-  xbt_datadesc_struct_append(res, "rows",
-                              xbt_datadesc_by_name("unsigned int"));
-
-  xbt_datadesc_struct_append(res, "elmsize",
-                              xbt_datadesc_by_name("unsigned long int"));
-
-  xbt_datadesc_struct_append(res, "data",
-                              xbt_datadesc_ref_pop_arr(elm_t));
-  xbt_datadesc_struct_append(res, "free_f",
-                              xbt_datadesc_by_name("function pointer"));
-  xbt_datadesc_struct_close(res);
-
-  xbt_datadesc_cb_field_push(res, "lines");
-  xbt_datadesc_cb_field_push_multiplier(res, "rows");
-
-  xbt_datadesc_cb_recv(res, &xbt_datadesc_matrix_cb);
-  memcpy(res->extra, &free_f, sizeof(free_f));
-
-  /* build a ref to it */
-  free(buffname);
-  buffname = bprintf("xbt_matrix_t(%s)", elm_t->name);
-  res = xbt_datadesc_ref(buffname, res);
-  free(buffname);
-  return res;
-}
-
-xbt_datadesc_type_t
-xbt_datadesc_import_nws(const char *name,
-                         const DataDescriptor * desc,
-                         unsigned long howmany)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-/**
- * (useful to push the sizes of the upcoming arrays, for example)
- */
-void xbt_datadesc_cb_send(xbt_datadesc_type_t type,
-                           xbt_datadesc_type_cb_void_t send)
-{
-  type->send = send;
-}
-
-/**
- * (useful to put the function pointers to the rigth value, for example)
- */
-void xbt_datadesc_cb_recv(xbt_datadesc_type_t type,
-                           xbt_datadesc_type_cb_void_t recv)
-{
-  type->recv = recv;
-}
-
-/*
- * xbt_dd_find_field:
- *
- * Returns the type descriptor of the given field. Abort on error.
- */
-static xbt_dd_cat_field_t
-xbt_dd_find_field(xbt_datadesc_type_t type, const char *field_name)
-{
-  xbt_dynar_t field_array;
-
-  xbt_dd_cat_field_t field = NULL;
-  unsigned int field_num;
-
-  if (type->category_code == e_xbt_datadesc_type_cat_union) {
-    field_array = type->category.union_data.fields;
-  } else if (type->category_code == e_xbt_datadesc_type_cat_struct) {
-    field_array = type->category.struct_data.fields;
-  } else {
-    XBT_ERROR("%s (%p) is not a struct nor an union. There is no field.",
-           type->name, (void *) type);
-    xbt_abort();
-  }
-  xbt_dynar_foreach(field_array, field_num, field) {
-    if (!strcmp(field_name, field->name)) {
-      return field;
-    }
-  }
-  XBT_ERROR("No field named '%s' in '%s'", field_name, type->name);
-  xbt_abort();
-
-}
-
-/**
- * The given datadesc must be a struct or union (abort if not).
- * (useful to push the sizes of the upcoming arrays, for example)
- */
-void xbt_datadesc_cb_field_send(xbt_datadesc_type_t type,
-                                 const char *field_name,
-                                 xbt_datadesc_type_cb_void_t send)
-{
-
-  xbt_dd_cat_field_t field = xbt_dd_find_field(type, field_name);
-  field->send = send;
-}
-
-
-/**
- * The value, which must be an int, unsigned int, long int or unsigned long int
- * is pushed to the stacks of sizes and can then be retrieved with
- * \ref xbt_datadesc_ref_pop_arr or directly with \ref xbt_cbps_i_pop.
- */
-void xbt_datadesc_cb_field_push(xbt_datadesc_type_t type,
-                                 const char *field_name)
-{
-
-  xbt_dd_cat_field_t field = xbt_dd_find_field(type, field_name);
-  xbt_datadesc_type_t sub_type = field->type;
-
-  XBT_DEBUG("add a PUSHy cb to '%s' field (type '%s') of '%s'",
-         field_name, sub_type->name, type->name);
-  if (!strcmp("int", sub_type->name)) {
-    field->send = xbt_datadesc_cb_push_int;
-  } else if (!strcmp("unsigned int", sub_type->name)) {
-    field->send = xbt_datadesc_cb_push_uint;
-  } else if (!strcmp("long int", sub_type->name)) {
-    field->send = xbt_datadesc_cb_push_lint;
-  } else if (!strcmp("unsigned long int", sub_type->name)) {
-    field->send = xbt_datadesc_cb_push_ulint;
-  } else {
-    XBT_ERROR
-        ("Field %s is not an int, unsigned int, long int neither unsigned long int",
-         sub_type->name);
-    xbt_abort();
-  }
-}
-
-/**
- * Any previously pushed value is poped and the field value is multiplied to
- * it. The result is then pushed back into the stack of sizes. It can then be
- * retrieved with \ref xbt_datadesc_ref_pop_arr or directly with \ref
- * xbt_cbps_i_pop.
- *
- * The field must be an int, unsigned int, long int or unsigned long int.
- */
-void xbt_datadesc_cb_field_push_multiplier(xbt_datadesc_type_t type,
-                                            const char *field_name)
-{
-
-  xbt_dd_cat_field_t field = xbt_dd_find_field(type, field_name);
-  xbt_datadesc_type_t sub_type = field->type;
-
-  XBT_DEBUG("add a MPUSHy cb to '%s' field (type '%s') of '%s'",
-         field_name, sub_type->name, type->name);
-  if (!strcmp("int", sub_type->name)) {
-    field->send = xbt_datadesc_cb_push_int_mult;
-  } else if (!strcmp("unsigned int", sub_type->name)) {
-    field->send = xbt_datadesc_cb_push_uint_mult;
-  } else if (!strcmp("long int", sub_type->name)) {
-    field->send = xbt_datadesc_cb_push_lint_mult;
-  } else if (!strcmp("unsigned long int", sub_type->name)) {
-    field->send = xbt_datadesc_cb_push_ulint_mult;
-  } else {
-    XBT_ERROR
-        ("Field %s is not an int, unsigned int, long int neither unsigned long int",
-         sub_type->name);
-    xbt_abort();
-  }
-}
-
-/**
- * The given datadesc must be a struct or union (abort if not).
- * (useful to put the function pointers to the right value, for example)
- */
-void xbt_datadesc_cb_field_recv(xbt_datadesc_type_t type,
-                                 const char *field_name,
-                                 xbt_datadesc_type_cb_void_t recv)
-{
-
-  xbt_dd_cat_field_t field = xbt_dd_find_field(type, field_name);
-  field->recv = recv;
-}
-
-/*
- * Free a datadesc. Should only be called at xbt_exit.
- */
-void xbt_datadesc_free(xbt_datadesc_type_t * type)
-{
-
-  XBT_DEBUG("Let's free ddt %s", (*type)->name);
-
-  switch ((*type)->category_code) {
-  case e_xbt_datadesc_type_cat_scalar:
-  case e_xbt_datadesc_type_cat_ref:
-  case e_xbt_datadesc_type_cat_array:
-    /* nothing to free in there */
-    break;
-
-  case e_xbt_datadesc_type_cat_struct:
-    xbt_dynar_free(&((*type)->category.struct_data.fields));
-    break;
-
-  case e_xbt_datadesc_type_cat_union:
-    xbt_dynar_free(&((*type)->category.union_data.fields));
-    break;
-
-  default:
-    /* datadesc was invalid. Killing it is like euthanasy, I guess */
-    break;
-  }
-  free((*type)->name);
-  free(*type);
-  type = NULL;
-}
-
-/**
- * xbt_datadesc_type_cmp:
- *
- * Compares two datadesc types with the same semantic than strcmp.
- *
- * This comparison does not take the set headers into account (name and ID),
- * but only the payload (actual type description).
- */
-int xbt_datadesc_type_cmp(const xbt_datadesc_type_t d1,
-                           const xbt_datadesc_type_t d2)
-{
-  int ret;
-  unsigned int cpt;
-  xbt_dd_cat_field_t field1, field2;
-  xbt_datadesc_type_t field_desc_1, field_desc_2;
-
-  if (d1 == d2)
-    return 0;                   /* easy optimization */
-
-  if (!d1 && d2) {
-    XBT_DEBUG("ddt_cmp: !d1 && d2 => 1");
-    return 1;
-  }
-  if (!d1 && !d2) {
-    XBT_DEBUG("ddt_cmp: !d1 && !d2 => 0");
-    return 0;
-  }
-  if (d1 && !d2) {
-    XBT_DEBUG("ddt_cmp: d1 && !d2 => -1");
-    return -1;
-  }
-
-  for (cpt = 0; cpt < xbt_arch_count; cpt++) {
-    if (d1->size[cpt] != d2->size[cpt]) {
-      XBT_DEBUG("ddt_cmp: %s->size=%ld  !=  %s->size=%ld (on %s)",
-             d1->name, d1->size[cpt], d2->name, d2->size[cpt],
-             xbt_arches[cpt].name);
-      return d1->size[cpt] > d2->size[cpt] ? 1 : -1;
-    }
-
-    if (d1->alignment[cpt] != d2->alignment[cpt]) {
-      XBT_DEBUG("ddt_cmp: %s->alignment=%lu  !=  %s->alignment=%lu (on %s)",
-             d1->name, d1->alignment[cpt], d2->name, d2->alignment[cpt],
-             xbt_arches[cpt].name);
-      return d1->alignment[cpt] > d2->alignment[cpt] ? 1 : -1;
-    }
-
-    if (d1->aligned_size[cpt] != d2->aligned_size[cpt]) {
-      XBT_DEBUG
-          ("ddt_cmp: %s->aligned_size=%lu  !=  %s->aligned_size=%lu (on %s)",
-           d1->name, d1->aligned_size[cpt], d2->name,
-           d2->aligned_size[cpt], xbt_arches[cpt].name);
-      return d1->aligned_size[cpt] > d2->aligned_size[cpt] ? 1 : -1;
-    }
-  }
-
-  if (d1->category_code != d2->category_code) {
-    XBT_DEBUG("ddt_cmp: %s->cat=%s  !=  %s->cat=%s",
-           d1->name, xbt_datadesc_cat_names[d1->category_code],
-           d2->name, xbt_datadesc_cat_names[d2->category_code]);
-    return d1->category_code > d2->category_code ? 1 : -1;
-  }
-
-  if (d1->send != d2->send) {
-    XBT_DEBUG("ddt_cmp: %s->send=%p  !=  %s->send=%p",
-           d1->name, (void *) d1->send, d2->name, (void *) d2->send);
-    return 1;                   /* ISO C forbids ordered comparisons of pointers to functions */
-  }
-
-  if (d1->recv != d2->recv) {
-    XBT_DEBUG("ddt_cmp: %s->recv=%p  !=  %s->recv=%p",
-           d1->name, (void *) d1->recv, d2->name, (void *) d2->recv);
-    return 1;                   /* ISO C forbids ordered comparisons of pointers to functions */
-  }
-
-  switch (d1->category_code) {
-  case e_xbt_datadesc_type_cat_scalar:
-    if (d1->category.scalar_data.encoding !=
-        d2->category.scalar_data.encoding)
-      return d1->category.scalar_data.encoding >
-          d2->category.scalar_data.encoding ? 1 : -1;
-    break;
-
-  case e_xbt_datadesc_type_cat_struct:
-    if (xbt_dynar_length(d1->category.struct_data.fields) !=
-        xbt_dynar_length(d2->category.struct_data.fields)) {
-      XBT_DEBUG("ddt_cmp: %s (having %lu fields) !=  %s (having %lu fields)",
-             d1->name, xbt_dynar_length(d1->category.struct_data.fields),
-             d2->name, xbt_dynar_length(d2->category.struct_data.fields));
-
-      return xbt_dynar_length(d1->category.struct_data.fields) >
-          xbt_dynar_length(d2->category.struct_data.fields) ? 1 : -1;
-    }
-    xbt_dynar_foreach(d1->category.struct_data.fields, cpt, field1) {
-
-      field2 =
-          xbt_dynar_get_as(d2->category.struct_data.fields, cpt,
-                           xbt_dd_cat_field_t);
-      field_desc_1 = field1->type;
-      field_desc_2 = field2->type;
-      ret = xbt_datadesc_type_cmp(field_desc_1, field_desc_2);
-      if (ret) {
-        XBT_DEBUG("%s->field[%u]=%s != %s->field[%u]=%s",
-               d1->name, cpt, field1->name, d2->name, cpt, field2->name);
-        return ret;
-      }
-
-    }
-    break;
-
-  case e_xbt_datadesc_type_cat_union:
-    if (d1->category.union_data.selector !=
-        d2->category.union_data.selector)
-      return 1;                 /* ISO C forbids ordered comparisons of pointers to functions */
-
-    if (xbt_dynar_length(d1->category.union_data.fields) !=
-        xbt_dynar_length(d2->category.union_data.fields))
-      return xbt_dynar_length(d1->category.union_data.fields) >
-          xbt_dynar_length(d2->category.union_data.fields) ? 1 : -1;
-
-    xbt_dynar_foreach(d1->category.union_data.fields, cpt, field1) {
-
-      field2 =
-          xbt_dynar_get_as(d2->category.union_data.fields, cpt,
-                           xbt_dd_cat_field_t);
-      field_desc_1 = field1->type;
-      field_desc_2 = field2->type;
-      ret = xbt_datadesc_type_cmp(field_desc_1, field_desc_2);
-      if (ret)
-        return ret;
-
-    }
-    break;
-
-
-  case e_xbt_datadesc_type_cat_ref:
-    if (d1->category.ref_data.selector != d2->category.ref_data.selector)
-      return 1;                 /* ISO C forbids ordered comparisons of pointers to functions */
-
-    if (d1->category.ref_data.type != d2->category.ref_data.type)
-      return d1->category.ref_data.type >
-          d2->category.ref_data.type ? 1 : -1;
-    break;
-
-  case e_xbt_datadesc_type_cat_array:
-    if (d1->category.array_data.type != d2->category.array_data.type)
-      return d1->category.array_data.type >
-          d2->category.array_data.type ? 1 : -1;
-
-    if (d1->category.array_data.fixed_size !=
-        d2->category.array_data.fixed_size)
-      return d1->category.array_data.fixed_size >
-          d2->category.array_data.fixed_size ? 1 : -1;
-
-    if (d1->category.array_data.dynamic_size !=
-        d2->category.array_data.dynamic_size)
-      return 1;                 /* ISO C forbids ordered comparisons of pointers to functions */
-
-    break;
-
-  default:
-    /* two stupidly created ddt are equally stupid ;) */
-    break;
-  }
-  return 0;
-
-}
diff --git a/src/xbt/datadesc/ddt_exchange.c b/src/xbt/datadesc/ddt_exchange.c
deleted file mode 100644 (file)
index b9fdb29..0000000
+++ /dev/null
@@ -1,990 +0,0 @@
-/* ddt_exchange - send/recv data described                                  */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "datadesc_private.h"
-#include "xbt/socket.h" /* xbt_trp_send/recv */
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ddt_exchange, xbt_ddt,
-                                "Sending data over the network");
-const char *xbt_datadesc_cat_names[9] = {
-  "undefined",
-  "scalar", "struct", "union", "ref", "array", "ignored",
-  "invalid"
-};
-
-static xbt_datadesc_type_t int_type = NULL;
-static xbt_datadesc_type_t pointer_type = NULL;
-
-static XBT_INLINE void
-xbt_dd_send_int(xbt_socket_t sock, int *i, int stable)
-{
-
-  if (!int_type) {
-    int_type = xbt_datadesc_by_name("int");
-    xbt_assert(int_type);
-  }
-
-  XBT_DEBUG("send_int(%d)", *i);
-  xbt_trp_send(sock, (char *) i, int_type->size[GRAS_THISARCH], stable);
-}
-
-static XBT_INLINE void
-xbt_dd_recv_int(xbt_socket_t sock, int r_arch, int *i)
-{
-
-  if (!int_type) {
-    int_type = xbt_datadesc_by_name("int");
-    xbt_assert(int_type);
-  }
-
-  if (int_type->size[GRAS_THISARCH] >= int_type->size[r_arch]) {
-    xbt_trp_recv(sock, (char *) i, int_type->size[r_arch]);
-    if (r_arch != GRAS_THISARCH)
-      xbt_dd_convert_elm(int_type, 1, r_arch, i, i);
-  } else {
-    void *ptr = xbt_malloc(int_type->size[r_arch]);
-
-    xbt_trp_recv(sock, (char *) ptr, int_type->size[r_arch]);
-    if (r_arch != GRAS_THISARCH)
-      xbt_dd_convert_elm(int_type, 1, r_arch, ptr, i);
-    free(ptr);
-  }
-  XBT_DEBUG("recv_int(%d)", *i);
-}
-
-/*
- * Note: here we suppose that the remote NULL is a sequence
- *       of 'length' bytes set to 0.
- * FIXME: Check in configure?
- */
-static XBT_INLINE int xbt_dd_is_r_null(char **r_ptr, long int length)
-{
-  int i;
-
-  for (i = 0; i < length; i++) {
-    if (((unsigned char *) r_ptr)[i]) {
-      return 0;
-    }
-  }
-
-  return 1;
-}
-
-static XBT_INLINE void xbt_dd_alloc_ref(xbt_dict_t refs, long int size, char **r_ref, long int r_len,  /* pointer_type->size[r_arch] */
-                                         char **l_ref, int detect_cycle)
-{
-  char *l_data = NULL;
-
-  xbt_assert(size > 0, "Cannot allocate %ld bytes!", size);
-  l_data = xbt_malloc((size_t) size);
-
-  *l_ref = l_data;
-  XBT_DEBUG
-      ("alloc_ref: l_data=%p, &l_data=%p; r_ref=%p; *r_ref=%p, r_len=%ld",
-       (void *) l_data, (void *) &l_data, (void *) r_ref,
-       (void *) (r_ref ? *r_ref : NULL), r_len);
-  if (detect_cycle && r_ref && !xbt_dd_is_r_null(r_ref, r_len)) {
-    void *ptr = xbt_malloc(sizeof(void *));
-
-    memcpy(ptr, l_ref, sizeof(void *));
-
-    XBT_DEBUG("Insert l_ref=%p under r_ref=%p", *(void **) ptr,
-           *(void **) r_ref);
-
-    if (detect_cycle)
-      xbt_dict_set_ext(refs, (const char *) r_ref, r_len, ptr, NULL);
-  }
-}
-
-static int
-xbt_datadesc_memcpy_rec(xbt_cbps_t state,
-                         xbt_dict_t refs,
-                         xbt_datadesc_type_t type,
-                         char *src, char *dst, int subsize,
-                         int detect_cycle)
-{
-
-
-  unsigned int cpt;
-  xbt_datadesc_type_t sub_type;        /* type on which we recurse */
-  int count = 0;
-
-  XBT_VERB("Copy a %s (%s) from %p to %p (local sizeof=%ld)",
-        type->name, xbt_datadesc_cat_names[type->category_code],
-        src, dst, type->size[GRAS_THISARCH]);
-
-  if (type->send) {
-    type->send(type, state, src);
-  }
-
-  switch (type->category_code) {
-  case e_xbt_datadesc_type_cat_scalar:
-    memcpy(dst, src, type->size[GRAS_THISARCH]);
-    count += type->size[GRAS_THISARCH];
-    break;
-
-  case e_xbt_datadesc_type_cat_struct:{
-      xbt_dd_cat_struct_t struct_data;
-      xbt_dd_cat_field_t field;
-      char *field_src;
-      char *field_dst;
-
-      struct_data = type->category.struct_data;
-      xbt_assert(struct_data.closed,
-                  "Please call xbt_datadesc_declare_struct_close on %s before copying it",
-                  type->name);
-      XBT_VERB(">> Copy all fields of the structure %s", type->name);
-      xbt_dynar_foreach(struct_data.fields, cpt, field) {
-        field_src = src + field->offset[GRAS_THISARCH];
-        field_dst = dst + field->offset[GRAS_THISARCH];
-
-        sub_type = field->type;
-
-        if (field->send)
-          field->send(type, state, field_src);
-
-        XBT_DEBUG("Copy field %s", field->name);
-        count +=
-            xbt_datadesc_memcpy_rec(state, refs, sub_type, field_src,
-                                     field_dst, 0, detect_cycle
-                                     || sub_type->cycle);
-
-        if (XBT_LOG_ISENABLED(xbt_ddt_exchange, xbt_log_priority_verbose)) {
-          if (sub_type == xbt_datadesc_by_name("unsigned int")) {
-            XBT_VERB("Copied value for field '%s': %u (type: unsigned int)",
-                  field->name, *(unsigned int *) field_dst);
-          } else if (sub_type == xbt_datadesc_by_name("int")) {
-            XBT_VERB("Copied value for field '%s': %d (type: int)",
-                  field->name, *(int *) field_dst);
-
-          } else if (sub_type ==
-                     xbt_datadesc_by_name("unsigned long int")) {
-            XBT_VERB
-                ("Copied value for field '%s': %lu (type: unsigned long int)",
-                 field->name, *(unsigned long int *) field_dst);
-          } else if (sub_type == xbt_datadesc_by_name("long int")) {
-            XBT_VERB("Copied value for field '%s': %ld (type: long int)",
-                  field->name, *(long int *) field_dst);
-
-          } else if (sub_type == xbt_datadesc_by_name("string")) {
-            XBT_VERB("Copied value for field '%s': '%s' (type: string)",
-                  field->name, *(char **) field_dst);
-          } else {
-            XBT_VERB("Copied a value for field '%s' (type not scalar?)",
-                  field->name);
-          }
-        }
-
-      }
-      XBT_VERB("<< Copied all fields of the structure %s", type->name);
-
-      break;
-    }
-
-  case e_xbt_datadesc_type_cat_union:{
-      xbt_dd_cat_union_t union_data;
-      xbt_dd_cat_field_t field = NULL;
-      unsigned int field_num;
-
-      union_data = type->category.union_data;
-
-      xbt_assert(union_data.closed,
-                  "Please call xbt_datadesc_declare_union_close on %s before copying it",
-                  type->name);
-      /* retrieve the field number */
-      field_num = union_data.selector(type, state, src);
-
-      xbt_assert(field_num > 0,
-                  "union field selector of %s gave a negative value",
-                  type->name);
-
-      xbt_assert(field_num < xbt_dynar_length(union_data.fields),
-                  "union field selector of %s returned %u but there is only %lu fields",
-                  type->name, field_num,
-                  xbt_dynar_length(union_data.fields));
-
-      /* Copy the content */
-      field =
-          xbt_dynar_get_as(union_data.fields, field_num,
-                           xbt_dd_cat_field_t);
-      sub_type = field->type;
-
-      if (field->send)
-        field->send(type, state, src);
-
-      count += xbt_datadesc_memcpy_rec(state, refs, sub_type, src, dst, 0,
-                                        detect_cycle || sub_type->cycle);
-
-      break;
-    }
-
-  case e_xbt_datadesc_type_cat_ref:{
-      xbt_dd_cat_ref_t ref_data;
-      char **o_ref = NULL;
-      char **n_ref = NULL;
-      int reference_is_to_cpy;
-
-      ref_data = type->category.ref_data;
-
-      /* Detect the referenced type */
-      sub_type = ref_data.type;
-      if (sub_type == NULL) {
-        sub_type = ref_data.selector(type, state, src);
-      }
-
-      /* Send the pointed data only if not already sent */
-      if (*(void **) src == NULL) {
-        XBT_VERB("Not copying NULL referenced data");
-        *(void **) dst = NULL;
-        break;
-      }
-      o_ref = (char **) src;
-
-      reference_is_to_cpy = 1;
-      if (detect_cycle &&
-          (n_ref =
-           xbt_dict_get_or_null_ext(refs, (char *) o_ref,
-                                    sizeof(char *)))) {
-        /* already known, no need to copy it */
-        //XBT_INFO("Cycle detected");
-        reference_is_to_cpy = 0;
-      }
-
-      if (reference_is_to_cpy) {
-        int subsubcount = -1;
-        void *l_referenced = NULL;
-        XBT_VERB("Copy a ref to '%s' referenced at %p", sub_type->name,
-              (void *) *o_ref);
-
-        if (!pointer_type) {
-          pointer_type = xbt_datadesc_by_name("data pointer");
-          xbt_assert(pointer_type);
-        }
-
-        if (sub_type->category_code == e_xbt_datadesc_type_cat_array) {
-          /* Damn. Reference to a dynamic array. Allocating the space for it is more complicated */
-          xbt_dd_cat_array_t array_data = sub_type->category.array_data;
-          xbt_datadesc_type_t subsub_type;
-
-          subsub_type = array_data.type;
-          subsubcount = array_data.fixed_size;
-          if (subsubcount == -1)
-            subsubcount =
-                array_data.dynamic_size(subsub_type, state, *o_ref);
-
-          if (subsubcount != 0)
-            xbt_dd_alloc_ref(refs,
-                              subsub_type->size[GRAS_THISARCH] *
-                              subsubcount, o_ref,
-                              pointer_type->size[GRAS_THISARCH],
-                              (char **) &l_referenced, detect_cycle);
-        } else {
-          xbt_dd_alloc_ref(refs, sub_type->size[GRAS_THISARCH],
-                            o_ref, pointer_type->size[GRAS_THISARCH],
-                            (char **) &l_referenced, detect_cycle);
-        }
-
-        count += xbt_datadesc_memcpy_rec(state, refs, sub_type,
-                                          *o_ref, (char *) l_referenced,
-                                          subsubcount, detect_cycle
-                                          || sub_type->cycle);
-
-        *(void **) dst = l_referenced;
-        XBT_VERB("'%s' previously referenced at %p now at %p",
-              sub_type->name, *(void **) o_ref, l_referenced);
-
-      } else {
-        XBT_VERB
-            ("NOT copying data previously referenced @%p (already done, @%p now)",
-             *(void **) o_ref, *(void **) n_ref);
-
-        *(void **) dst = *n_ref;
-
-      }
-      break;
-    }
-
-  case e_xbt_datadesc_type_cat_array:{
-      xbt_dd_cat_array_t array_data;
-      unsigned long int array_count;
-      char *src_ptr = src;
-      char *dst_ptr = dst;
-      long int elm_size;
-
-      array_data = type->category.array_data;
-
-      /* determine and send the element count */
-      array_count = array_data.fixed_size;
-      if (array_count == -1)
-        array_count = subsize;
-      if (array_count == -1)
-        array_count = array_data.dynamic_size(type, state, src);
-
-      /* send the content */
-      sub_type = array_data.type;
-      elm_size = sub_type->aligned_size[GRAS_THISARCH];
-      if (sub_type->category_code == e_xbt_datadesc_type_cat_scalar) {
-        XBT_VERB("Array of %lu scalars, copy it in one shot", array_count);
-        memcpy(dst, src,
-               sub_type->aligned_size[GRAS_THISARCH] * array_count);
-        count += sub_type->aligned_size[GRAS_THISARCH] * array_count;
-      } else if (sub_type->category_code == e_xbt_datadesc_type_cat_array
-                 && sub_type->category.array_data.fixed_size > 0
-                 && sub_type->category.array_data.type->category_code ==
-                 e_xbt_datadesc_type_cat_scalar) {
-
-        XBT_VERB("Array of %lu fixed array of scalars, copy it in one shot",
-              array_count);
-        memcpy(dst, src,
-               sub_type->category.array_data.
-               type->aligned_size[GRAS_THISARCH]
-               * array_count * sub_type->category.array_data.fixed_size);
-        count +=
-            sub_type->category.array_data.type->aligned_size[GRAS_THISARCH]
-            * array_count * sub_type->category.array_data.fixed_size;
-
-      } else {
-        XBT_VERB("Array of %lu stuff, copy it in one after the other",
-              array_count);
-        for (cpt = 0; cpt < array_count; cpt++) {
-          XBT_VERB("Copy the %uth stuff out of %lu", cpt, array_count);
-          count +=
-              xbt_datadesc_memcpy_rec(state, refs, sub_type, src_ptr,
-                                       dst_ptr, 0, detect_cycle
-                                       || sub_type->cycle);
-          src_ptr += elm_size;
-          dst_ptr += elm_size;
-        }
-      }
-      break;
-    }
-
-  default:
-    xbt_die("Invalid type");
-  }
-
-  return count;
-}
-
-/**
- * xbt_datadesc_memcpy:
- *
- * Copy the data pointed by src and described by type
- * to a new location, and store a pointer to it in dst.
- *
- */
-int xbt_datadesc_memcpy(xbt_datadesc_type_t type, void *src, void *dst)
-{
-  static xbt_cbps_t state = NULL;
-  static xbt_dict_t refs = NULL;        /* all references already sent */
-  int size = 0;
-
-  xbt_assert(type, "called with NULL type descriptor");
-
-  XBT_DEBUG("Memcopy a %s from %p to %p", xbt_datadesc_get_name(type), src,
-         dst);
-  if (!state) {
-    state = xbt_cbps_new();
-    refs = xbt_dict_new_homogeneous(xbt_free_f);
-  }
-
-  TRY {
-    size =
-        xbt_datadesc_memcpy_rec(state, refs, type, (char *) src,
-                                 (char *) dst, 0, type->cycle);
-  }
-  TRY_CLEANUP {
-    xbt_dict_reset(refs);
-    xbt_cbps_reset(state);
-  }
-  CATCH_ANONYMOUS {
-    RETHROW;
-  }
-  return size;
-}
-
-/***
- *** Direct use functions
- ***/
-
-static void
-xbt_datadesc_send_rec(xbt_socket_t sock,
-                       xbt_cbps_t state,
-                       xbt_dict_t refs,
-                       xbt_datadesc_type_t type,
-                       char *data, int detect_cycle)
-{
-
-  unsigned int cpt;
-  xbt_datadesc_type_t sub_type;        /* type on which we recurse */
-
-  XBT_VERB("Send a %s (%s)",
-        type->name, xbt_datadesc_cat_names[type->category_code]);
-
-  if (!strcmp(type->name, "string"))
-    XBT_VERB("value: '%s'", *(char **) data);
-
-  if (type->send) {
-    type->send(type, state, data);
-    XBT_DEBUG("Run the emission callback");
-  }
-
-  switch (type->category_code) {
-  case e_xbt_datadesc_type_cat_scalar:
-    xbt_trp_send(sock, data, type->size[GRAS_THISARCH], 1);
-    break;
-
-  case e_xbt_datadesc_type_cat_struct:{
-      xbt_dd_cat_struct_t struct_data;
-      xbt_dd_cat_field_t field;
-      char *field_data;
-
-      struct_data = type->category.struct_data;
-      xbt_assert(struct_data.closed,
-                  "Please call xbt_datadesc_declare_struct_close on %s before sending it",
-                  type->name);
-      XBT_VERB(">> Send all fields of the structure %s", type->name);
-      xbt_dynar_foreach(struct_data.fields, cpt, field) {
-        field_data = data;
-        field_data += field->offset[GRAS_THISARCH];
-
-        sub_type = field->type;
-
-        if (field->send) {
-          XBT_DEBUG("Run the emission callback of field %s", field->name);
-          field->send(type, state, field_data);
-        }
-
-        XBT_VERB("Send field %s", field->name);
-        xbt_datadesc_send_rec(sock, state, refs, sub_type, field_data,
-                               detect_cycle || sub_type->cycle);
-
-      }
-      XBT_VERB("<< Sent all fields of the structure %s", type->name);
-
-      break;
-    }
-
-  case e_xbt_datadesc_type_cat_union:{
-      xbt_dd_cat_union_t union_data;
-      xbt_dd_cat_field_t field = NULL;
-      int field_num;
-
-      union_data = type->category.union_data;
-
-      xbt_assert(union_data.closed,
-                  "Please call xbt_datadesc_declare_union_close on %s before sending it",
-                  type->name);
-      /* retrieve the field number */
-      field_num = union_data.selector(type, state, data);
-
-      xbt_assert(field_num > 0,
-                  "union field selector of %s gave a negative value",
-                  type->name);
-
-      xbt_assert(field_num < xbt_dynar_length(union_data.fields),
-                  "union field selector of %s returned %d but there is only %lu fields",
-                  type->name, field_num,
-                  xbt_dynar_length(union_data.fields));
-
-      /* Send the field number */
-      xbt_dd_send_int(sock, &field_num, 0 /* not stable */ );
-
-      /* Send the content */
-      field =
-          xbt_dynar_get_as(union_data.fields, field_num,
-                           xbt_dd_cat_field_t);
-      sub_type = field->type;
-
-      if (field->send)
-        field->send(type, state, data);
-
-      xbt_datadesc_send_rec(sock, state, refs, sub_type, data,
-                             detect_cycle || sub_type->cycle);
-
-      break;
-    }
-
-  case e_xbt_datadesc_type_cat_ref:{
-      xbt_dd_cat_ref_t ref_data;
-      void **ref = (void **) data;
-      int reference_is_to_send;
-
-      ref_data = type->category.ref_data;
-
-      /* Detect the referenced type and send it to peer if needed */
-      sub_type = ref_data.type;
-      if (sub_type == NULL) {
-        sub_type = ref_data.selector(type, state, data);
-        xbt_dd_send_int(sock, &(sub_type->code), 1 /*stable */ );
-      }
-
-      /* Send the actual value of the pointer for cycle handling */
-      if (!pointer_type) {
-        pointer_type = xbt_datadesc_by_name("data pointer");
-        xbt_assert(pointer_type);
-      }
-
-      xbt_trp_send(sock, (char *) data,
-                    pointer_type->size[GRAS_THISARCH], 1 /*stable */ );
-
-      /* Send the pointed data only if not already sent */
-      if (*(void **) data == NULL) {
-        XBT_VERB("Not sending NULL referenced data");
-        break;
-      }
-
-      reference_is_to_send = 1;
-      /* return ignored. Just checking whether it's known or not */
-      if (detect_cycle
-          && xbt_dict_get_or_null_ext(refs, (char *) ref,
-                                      sizeof(char *))) {
-        //XBT_INFO("Cycle detected");
-        reference_is_to_send = 0;
-      }
-
-      if (reference_is_to_send) {
-        XBT_VERB("Sending data referenced at %p", (void *) *ref);
-        if (detect_cycle)
-          xbt_dict_set_ext(refs, (char *) ref, sizeof(void *), ref, NULL);
-        xbt_datadesc_send_rec(sock, state, refs, sub_type, *ref,
-                               detect_cycle || sub_type->cycle);
-
-      } else {
-        XBT_VERB("Not sending data referenced at %p (already done)",
-              (void *) *ref);
-      }
-
-      break;
-    }
-
-  case e_xbt_datadesc_type_cat_array:{
-      xbt_dd_cat_array_t array_data;
-      int count;
-      char *ptr = data;
-      long int elm_size;
-
-      array_data = type->category.array_data;
-
-      /* determine and send the element count */
-      count = array_data.fixed_size;
-      if (count == -1) {
-        count = array_data.dynamic_size(type, state, data);
-        xbt_assert(count >= 0,
-                    "Invalid (negative) array size for type %s",
-                    type->name);
-        xbt_dd_send_int(sock, &count, 0 /*non-stable */ );
-      }
-
-      /* send the content */
-      sub_type = array_data.type;
-      elm_size = sub_type->aligned_size[GRAS_THISARCH];
-      if (sub_type->category_code == e_xbt_datadesc_type_cat_scalar) {
-        XBT_VERB("Array of %d scalars, send it in one shot", count);
-        xbt_trp_send(sock, data,
-                      sub_type->aligned_size[GRAS_THISARCH] * count,
-                      0 /* not stable */ );
-      } else if (sub_type->category_code == e_xbt_datadesc_type_cat_array
-                 && sub_type->category.array_data.fixed_size > 0
-                 && sub_type->category.array_data.type->category_code ==
-                 e_xbt_datadesc_type_cat_scalar) {
-
-        XBT_VERB("Array of %d fixed array of scalars, send it in one shot",
-              count);
-        xbt_trp_send(sock, data,
-                      sub_type->category.array_data.
-                      type->aligned_size[GRAS_THISARCH]
-                      * count * sub_type->category.array_data.fixed_size,
-                      0 /* not stable */ );
-
-      } else {
-        for (cpt = 0; cpt < count; cpt++) {
-          xbt_datadesc_send_rec(sock, state, refs, sub_type, ptr,
-                                 detect_cycle || sub_type->cycle);
-          ptr += elm_size;
-        }
-      }
-      break;
-    }
-
-  default:
-    xbt_die("Invalid type");
-  }
-}
-
-/**
- * xbt_datadesc_send:
- *
- * Copy the data pointed by src and described by type to the socket
- *
- */
-void xbt_datadesc_send(xbt_socket_t sock,
-                        xbt_datadesc_type_t type, void *src)
-{
-  static xbt_cbps_t state = NULL;
-  static xbt_dict_t refs = NULL;        /* all references already sent */
-
-  xbt_assert(type, "called with NULL type descriptor");
-
-  if (!state) {
-    state = xbt_cbps_new();
-    refs = xbt_dict_new_homogeneous(NULL);
-  }
-
-  TRY {
-    xbt_datadesc_send_rec(sock, state, refs, type, (char *) src,
-                           type->cycle);
-  }
-  TRY_CLEANUP {
-    xbt_dict_reset(refs);
-    xbt_cbps_reset(state);
-  }
-  CATCH_ANONYMOUS {
-    RETHROW;
-  }
-}
-
-/**
- * xbt_datadesc_recv_rec:
- *
- * Do the data reception job recursively.
- *
- * subsize used only to deal with vicious case of reference to dynamic array.
- *  This size is needed at the reference reception level (to allocate enough
- * space) and at the array reception level (to fill enough room).
- *
- * Having this size passed as an argument of the recursive function is a crude
- * hack, but I was told that working code is sometimes better than neat one ;)
- */
-static void
-xbt_datadesc_recv_rec(xbt_socket_t sock,
-                       xbt_cbps_t state,
-                       xbt_dict_t refs,
-                       xbt_datadesc_type_t type,
-                       int r_arch,
-                       char **r_data,
-                       long int r_lgr,
-                       char *l_data, int subsize, int detect_cycle)
-{
-
-  unsigned int cpt;
-  xbt_datadesc_type_t sub_type;
-
-  XBT_VERB("Recv a %s @%p", type->name, (void *) l_data);
-  xbt_assert(l_data);
-
-  switch (type->category_code) {
-  case e_xbt_datadesc_type_cat_scalar:
-    if (type->size[GRAS_THISARCH] == type->size[r_arch]) {
-      xbt_trp_recv(sock, (char *) l_data, type->size[r_arch]);
-      if (r_arch != GRAS_THISARCH)
-        xbt_dd_convert_elm(type, 1, r_arch, l_data, l_data);
-    } else {
-      void *ptr = xbt_malloc(type->size[r_arch]);
-
-      xbt_trp_recv(sock, (char *) ptr, type->size[r_arch]);
-      if (r_arch != GRAS_THISARCH)
-        xbt_dd_convert_elm(type, 1, r_arch, ptr, l_data);
-      free(ptr);
-    }
-    break;
-
-  case e_xbt_datadesc_type_cat_struct:{
-      xbt_dd_cat_struct_t struct_data;
-      xbt_dd_cat_field_t field;
-
-      struct_data = type->category.struct_data;
-
-      xbt_assert(struct_data.closed,
-                  "Please call xbt_datadesc_declare_struct_close on %s before receiving it",
-                  type->name);
-      XBT_VERB(">> Receive all fields of the structure %s", type->name);
-      xbt_dynar_foreach(struct_data.fields, cpt, field) {
-        char *field_data = l_data + field->offset[GRAS_THISARCH];
-
-        sub_type = field->type;
-
-        xbt_datadesc_recv_rec(sock, state, refs, sub_type,
-                               r_arch, NULL, 0,
-                               field_data, -1,
-                               detect_cycle || sub_type->cycle);
-
-        if (field->recv) {
-          XBT_DEBUG("Run the reception callback of field %s", field->name);
-          field->recv(type, state, (void *) l_data);
-        }
-
-      }
-      XBT_VERB("<< Received all fields of the structure %s", type->name);
-
-      break;
-    }
-
-  case e_xbt_datadesc_type_cat_union:{
-      xbt_dd_cat_union_t union_data;
-      xbt_dd_cat_field_t field = NULL;
-      int field_num;
-
-      union_data = type->category.union_data;
-
-      xbt_assert(union_data.closed,
-                  "Please call xbt_datadesc_declare_union_close on %s before receiving it",
-                  type->name);
-      /* retrieve the field number */
-      xbt_dd_recv_int(sock, r_arch, &field_num);
-      if (field_num < 0)
-        THROWF(mismatch_error, 0,
-               "Received union field for %s is negative", type->name);
-      if (field_num > xbt_dynar_length(union_data.fields))
-        THROWF(mismatch_error, 0,
-               "Received union field for %s is said to be #%d but there is only %lu fields",
-               type->name, field_num, xbt_dynar_length(union_data.fields));
-
-      /* Recv the content */
-      field =
-          xbt_dynar_get_as(union_data.fields, field_num,
-                           xbt_dd_cat_field_t);
-      sub_type = field->type;
-
-      xbt_datadesc_recv_rec(sock, state, refs, sub_type,
-                             r_arch, NULL, 0,
-                             l_data, -1, detect_cycle || sub_type->cycle);
-      if (field->recv)
-        field->recv(type, state, l_data);
-
-      break;
-    }
-
-  case e_xbt_datadesc_type_cat_ref:{
-      char **r_ref = NULL;
-      char **l_ref = NULL;
-      xbt_dd_cat_ref_t ref_data;
-      int reference_is_to_recv = 0;
-
-      ref_data = type->category.ref_data;
-
-      /* Get the referenced type locally or from peer */
-      sub_type = ref_data.type;
-      if (sub_type == NULL) {
-        int ref_code;
-        xbt_dd_recv_int(sock, r_arch, &ref_code);
-        sub_type = xbt_datadesc_by_id(ref_code);
-      }
-
-      /* Get the actual value of the pointer for cycle handling */
-      if (!pointer_type) {
-        pointer_type = xbt_datadesc_by_name("data pointer");
-        xbt_assert(pointer_type);
-      }
-
-      r_ref = xbt_malloc(pointer_type->size[r_arch]);
-
-      xbt_trp_recv(sock, (char *) r_ref, pointer_type->size[r_arch]);
-
-      /* Receive the pointed data only if not already sent */
-      if (xbt_dd_is_r_null(r_ref, pointer_type->size[r_arch])) {
-        XBT_VERB("Not receiving data remotely referenced @%p since it's NULL",
-              *(void **) r_ref);
-        *(void **) l_data = NULL;
-        free(r_ref);
-        break;
-      }
-
-      reference_is_to_recv = 1;
-      if (detect_cycle && (l_ref =
-                           xbt_dict_get_or_null_ext(refs, (char *) r_ref,
-                                                    pointer_type->size
-                                                    [r_arch]))) {
-        reference_is_to_recv = 0;
-        //XBT_INFO("Cycle detected");
-      }
-
-      if (reference_is_to_recv) {
-        int subsubcount = -1;
-        void *l_referenced = NULL;
-
-        XBT_VERB("Receiving a ref to '%s', remotely @%p",
-              sub_type->name, *(void **) r_ref);
-        if (sub_type->category_code == e_xbt_datadesc_type_cat_array) {
-          /* Damn. Reference to a dynamic array. Allocating the space for it is more complicated */
-          xbt_dd_cat_array_t array_data = sub_type->category.array_data;
-          xbt_datadesc_type_t subsub_type;
-
-          subsubcount = array_data.fixed_size;
-          if (subsubcount == -1)
-            xbt_dd_recv_int(sock, r_arch, &subsubcount);
-
-          subsub_type = array_data.type;
-
-          if (subsubcount != 0)
-            xbt_dd_alloc_ref(refs,
-                              subsub_type->size[GRAS_THISARCH] *
-                              subsubcount, r_ref,
-                              pointer_type->size[r_arch],
-                              (char **) &l_referenced, detect_cycle);
-          else
-            l_referenced = NULL;
-        } else {
-          xbt_dd_alloc_ref(refs, sub_type->size[GRAS_THISARCH],
-                            r_ref, pointer_type->size[r_arch],
-                            (char **) &l_referenced, detect_cycle);
-        }
-
-        if (l_referenced != NULL)
-          xbt_datadesc_recv_rec(sock, state, refs, sub_type,
-                                 r_arch, r_ref, pointer_type->size[r_arch],
-                                 (char *) l_referenced, subsubcount,
-                                 detect_cycle || sub_type->cycle);
-
-        *(void **) l_data = l_referenced;
-        XBT_VERB("'%s' remotely referenced at %p locally at %p",
-              sub_type->name, *(void **) r_ref, l_referenced);
-
-      } else {
-        XBT_VERB
-            ("NOT receiving data remotely referenced @%p (already done, @%p here)",
-             *(void **) r_ref, *(void **) l_ref);
-
-        *(void **) l_data = *l_ref;
-
-      }
-      free(r_ref);
-      break;
-    }
-
-  case e_xbt_datadesc_type_cat_array:{
-      xbt_dd_cat_array_t array_data;
-      int count;
-      char *ptr;
-      long int elm_size;
-
-      array_data = type->category.array_data;
-      /* determine element count locally, or from caller, or from peer */
-      count = array_data.fixed_size;
-      if (count == -1)
-        count = subsize;
-      if (count == -1)
-        xbt_dd_recv_int(sock, r_arch, &count);
-      if (count == -1)
-        THROWF(mismatch_error, 0,
-               "Invalid (=-1) array size for type %s", type->name);
-
-      /* receive the content */
-      sub_type = array_data.type;
-      if (sub_type->category_code == e_xbt_datadesc_type_cat_scalar) {
-        XBT_VERB("Array of %d scalars, get it in one shoot", count);
-        if (sub_type->aligned_size[GRAS_THISARCH] >=
-            sub_type->aligned_size[r_arch]) {
-          xbt_trp_recv(sock, (char *) l_data,
-                        sub_type->aligned_size[r_arch] * count);
-          if (r_arch != GRAS_THISARCH)
-            xbt_dd_convert_elm(sub_type, count, r_arch, l_data, l_data);
-        } else {
-          ptr = xbt_malloc(sub_type->aligned_size[r_arch] * count);
-
-          xbt_trp_recv(sock, (char *) ptr,
-                        sub_type->size[r_arch] * count);
-          if (r_arch != GRAS_THISARCH)
-            xbt_dd_convert_elm(sub_type, count, r_arch, ptr, l_data);
-          free(ptr);
-        }
-      } else if (sub_type->category_code == e_xbt_datadesc_type_cat_array
-                 && sub_type->category.array_data.fixed_size >= 0
-                 && sub_type->category.array_data.type->category_code ==
-                 e_xbt_datadesc_type_cat_scalar) {
-        xbt_datadesc_type_t subsub_type;
-        array_data = sub_type->category.array_data;
-        subsub_type = array_data.type;
-
-        XBT_VERB("Array of %d fixed array of scalars, get it in one shot",
-              count);
-        if (subsub_type->aligned_size[GRAS_THISARCH] >=
-            subsub_type->aligned_size[r_arch]) {
-          xbt_trp_recv(sock, (char *) l_data,
-                        subsub_type->aligned_size[r_arch] * count *
-                        array_data.fixed_size);
-          if (r_arch != GRAS_THISARCH)
-            xbt_dd_convert_elm(subsub_type, count * array_data.fixed_size,
-                                r_arch, l_data, l_data);
-        } else {
-          ptr =
-              xbt_malloc(subsub_type->aligned_size[r_arch] * count *
-                         array_data.fixed_size);
-
-          xbt_trp_recv(sock, (char *) ptr,
-                        subsub_type->size[r_arch] * count *
-                        array_data.fixed_size);
-          if (r_arch != GRAS_THISARCH)
-            xbt_dd_convert_elm(subsub_type, count * array_data.fixed_size,
-                                r_arch, ptr, l_data);
-          free(ptr);
-        }
-
-
-      } else {
-        /* not scalar content, get it recursively (may contain pointers) */
-        elm_size = sub_type->aligned_size[GRAS_THISARCH];
-        XBT_VERB("Receive a %d-long array of %s", count, sub_type->name);
-
-        ptr = l_data;
-        for (cpt = 0; cpt < count; cpt++) {
-          xbt_datadesc_recv_rec(sock, state, refs, sub_type,
-                                 r_arch, NULL, 0, ptr, -1,
-                                 detect_cycle || sub_type->cycle);
-
-          ptr += elm_size;
-        }
-      }
-      break;
-    }
-
-  default:
-    xbt_die("Invalid type");
-  }
-
-  if (type->recv)
-    type->recv(type, state, l_data);
-
-  if (!strcmp(type->name, "string"))
-    XBT_VERB("value: '%s'", *(char **) l_data);
-
-}
-
-/**
- * xbt_datadesc_recv:
- *
- * Get an instance of the datatype described by @type from the @socket,
- * and store a pointer to it in @dst
- *
- */
-void
-xbt_datadesc_recv(xbt_socket_t sock,
-                   xbt_datadesc_type_t type, int r_arch, void *dst)
-{
-  static xbt_cbps_t state = NULL;      /* callback persistent state */
-  static xbt_dict_t refs = NULL;        /* all references already sent */
-
-  if (!state) {
-    state = xbt_cbps_new();
-    refs = xbt_dict_new_homogeneous(xbt_free_f);
-  }
-
-  xbt_assert(type, "called with NULL type descriptor");
-  TRY {
-    xbt_datadesc_recv_rec(sock, state, refs, type,
-                           r_arch, NULL, 0, (char *) dst, -1, type->cycle);
-  }
-  TRY_CLEANUP {
-    xbt_dict_reset(refs);
-    xbt_cbps_reset(state);
-  }
-  CATCH_ANONYMOUS {
-    RETHROW;
-  }
-}
diff --git a/src/xbt/datadesc/ddt_parse.c b/src/xbt/datadesc/ddt_parse.c
deleted file mode 100644 (file)
index 166b5b7..0000000
+++ /dev/null
@@ -1,815 +0,0 @@
-/* DataDesc/ddt_parse.c -- automatic parsing of data structures             */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <ctype.h>              /* isdigit */
-
-#include "xbt/ex.h"
-#include "datadesc_private.h"
-#include "ddt_parse.yy.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ddt_parse, xbt_ddt,
-                                "Parsing C data structures to build XBT data description");
-
-typedef struct s_type_modifier {
-  short is_long;
-  unsigned is_unsigned:1;
-  unsigned is_short:1;
-
-  unsigned is_struct:1;
-  unsigned is_union:1;
-  unsigned is_enum:1;
-
-  unsigned is_ref:1;
-
-  int is_dynar:2;
-  int is_matrix:2;
-} s_type_modifier_t, *type_modifier_t;
-
-typedef struct s_field {
-  xbt_datadesc_type_t type;
-  char *type_name;
-  char *name;
-  s_type_modifier_t tm;
-} s_identifier_t;
-
-extern char *xbt_ddt_parse_text;       /* text being considered in the parser */
-
-/* local functions */
-static void parse_type_modifier(type_modifier_t type_modifier)
-{
-  XBT_IN();
-  do {
-    if (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_STAR) {
-      /* This only used when parsing 'short *' since this function returns when int, float, double,... is encountered */
-      XBT_DEBUG("This is a reference");
-      type_modifier->is_ref++;
-
-    } else if (!strcmp(xbt_ddt_parse_text, "unsigned")) {
-      XBT_DEBUG("This is an unsigned");
-      type_modifier->is_unsigned = 1;
-
-    } else if (!strcmp(xbt_ddt_parse_text, "short")) {
-      XBT_DEBUG("This is short");
-      type_modifier->is_short = 1;
-
-    } else if (!strcmp(xbt_ddt_parse_text, "long")) {
-      XBT_DEBUG("This is long");
-      type_modifier->is_long++; /* handle "long long" */
-
-    } else if (!strcmp(xbt_ddt_parse_text, "struct")) {
-      XBT_DEBUG("This is a struct");
-      type_modifier->is_struct = 1;
-
-    } else if (!strcmp(xbt_ddt_parse_text, "union")) {
-      XBT_DEBUG("This is an union");
-      type_modifier->is_union = 1;
-
-    } else if (!strcmp(xbt_ddt_parse_text, "enum")) {
-      XBT_DEBUG("This is an enum");
-      type_modifier->is_enum = 1;
-
-    } else if (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_EMPTY) {
-      XBT_DEBUG("Pass space");
-
-    } else {
-      XBT_DEBUG("Done with modifiers (got %s)", xbt_ddt_parse_text);
-      break;
-    }
-
-    xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump();
-    if ((xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_WORD) &&
-        (xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_STAR)) {
-      XBT_DEBUG("Done with modifiers (got %s,%d)", xbt_ddt_parse_text,
-             xbt_ddt_parse_tok_num);
-      break;
-    }
-  } while (1);
-  XBT_OUT();
-}
-
-static void print_type_modifier(s_type_modifier_t tm)
-{
-  int i;
-
-  XBT_IN();
-  if (tm.is_unsigned)
-    printf("(unsigned) ");
-  if (tm.is_short)
-    printf("(short) ");
-  for (i = 0; i < tm.is_long; i++)
-    printf("(long) ");
-
-  if (tm.is_struct)
-    printf("(struct) ");
-  if (tm.is_enum)
-    printf("(enum) ");
-  if (tm.is_union)
-    printf("(union) ");
-
-  for (i = 0; i < tm.is_ref; i++)
-    printf("(ref) ");
-  XBT_OUT();
-}
-
-static void change_to_fixed_array(xbt_dynar_t dynar, long int size)
-{
-  s_identifier_t former, array;
-  memset(&array, 0, sizeof(array));
-
-  XBT_IN();
-  xbt_dynar_pop(dynar, &former);
-  array.type_name = (char *) xbt_malloc(strlen(former.type->name) + 48);
-  XBT_DEBUG("Array specification (size=%ld, elm='%s'), change pushed type",
-         size, former.type_name);
-  sprintf(array.type_name, "%s%s%s%s[%ld]",
-          (former.tm.is_unsigned ? "u " : ""),
-          (former.tm.is_short ? "s " : ""),
-          (former.tm.is_long ? "l " : ""), former.type_name, size);
-  free(former.type_name);
-
-  array.type = xbt_datadesc_array_fixed(array.type_name, former.type, size);   /* redeclaration are ignored */
-  array.name = former.name;
-
-  xbt_dynar_push(dynar, &array);
-  XBT_OUT();
-}
-
-static void change_to_ref(xbt_dynar_t dynar)
-{
-  s_identifier_t former, ref;
-  memset(&ref, 0, sizeof(ref));
-
-  XBT_IN();
-  xbt_dynar_pop(dynar, &former);
-  ref.type_name = (char *) xbt_malloc(strlen(former.type->name) + 2);
-  XBT_DEBUG("Ref specification (elm='%s'), change pushed type",
-         former.type_name);
-  sprintf(ref.type_name, "%s*", former.type_name);
-  free(former.type_name);
-
-  ref.type = xbt_datadesc_ref(ref.type_name, former.type);     /* redeclaration are ignored */
-  ref.name = former.name;
-
-  xbt_dynar_push(dynar, &ref);
-  XBT_OUT();
-}
-
-static void change_to_ref_pop_array(xbt_dynar_t dynar)
-{
-  s_identifier_t former, ref;
-  memset(&ref, 0, sizeof(ref));
-
-  XBT_IN();
-  xbt_dynar_pop(dynar, &former);
-  ref.type = xbt_datadesc_ref_pop_arr(former.type);    /* redeclaration are ignored */
-  ref.type_name = (char *) strdup(ref.type->name);
-  ref.name = former.name;
-
-  free(former.type_name);
-
-  xbt_dynar_push(dynar, &ref);
-  XBT_OUT();
-}
-
-static void change_to_dynar_of(xbt_dynar_t dynar,
-                               xbt_datadesc_type_t subtype)
-{
-  s_identifier_t former, ref;
-  memset(&ref, 0, sizeof(ref));
-
-  XBT_IN();
-  xbt_dynar_pop(dynar, &former);
-  ref.type = xbt_datadesc_dynar(subtype, NULL);        /* redeclaration are ignored */
-  ref.type_name = (char *) strdup(ref.type->name);
-  ref.name = former.name;
-
-  free(former.type_name);
-
-  xbt_dynar_push(dynar, &ref);
-  XBT_OUT();
-}
-
-static void change_to_matrix_of(xbt_dynar_t dynar,
-                                xbt_datadesc_type_t subtype)
-{
-  s_identifier_t former, ref;
-  memset(&ref, 0, sizeof(ref));
-
-  XBT_IN();
-  xbt_dynar_pop(dynar, &former);
-  ref.type = xbt_datadesc_matrix(subtype, NULL);       /* redeclaration are ignored */
-  ref.type_name = (char *) strdup(ref.type->name);
-  ref.name = former.name;
-
-  free(former.type_name);
-
-  xbt_dynar_push(dynar, &ref);
-  XBT_OUT();
-}
-
-static void add_free_f(xbt_dynar_t dynar, void_f_pvoid_t free_f)
-{
-  s_identifier_t former, ref;
-  memset(&ref, 0, sizeof(ref));
-
-  XBT_IN();
-  xbt_dynar_pop(dynar, &former);
-  memcpy(former.type->extra, &free_f, sizeof(free_f));
-  xbt_dynar_push(dynar, &former);
-  XBT_OUT();
-}
-
-static void parse_statement(char *definition,
-                            xbt_dynar_t identifiers,
-                            xbt_dynar_t fields_to_push)
-{
-  char buffname[512];
-
-  s_identifier_t identifier;
-
-  int expect_id_separator = 0;
-
-  XBT_IN();
-  memset(&identifier, 0, sizeof(identifier));
-
-  xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump();
-  if (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_RA) {
-    XBT_OUT();
-    THROWF(mismatch_error, 0, "End of the englobing structure or union");
-  }
-
-  if (XBT_LOG_ISENABLED(xbt_ddt_parse, xbt_log_priority_debug)) {
-    int colon_pos;
-    for (colon_pos = xbt_ddt_parse_col_pos;
-         definition[colon_pos] != ';'; colon_pos++);
-    definition[colon_pos] = '\0';
-    XBT_DEBUG("Parse the statement \"%s%s;\" (col_pos=%d)",
-           xbt_ddt_parse_text,
-           definition + xbt_ddt_parse_col_pos, xbt_ddt_parse_col_pos);
-    definition[colon_pos] = ';';
-  }
-
-  if (xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_WORD)
-    PARSE_ERROR
-        ("Unparsable symbol: found a typeless statement (got '%s' instead)",
-         xbt_ddt_parse_text);
-
-        /**** get the type modifier of this statement ****/
-  parse_type_modifier(&identifier.tm);
-
-  /*  FIXME: This does not detect recursive definitions at all? */
-  if (identifier.tm.is_union || identifier.tm.is_enum
-      || identifier.tm.is_struct)
-    PARSE_ERROR
-        ("Unimplemented feature: XBT_DEFINE_TYPE cannot handle recursive type definition yet");
-
-        /**** get the base type, giving "short a" the needed love ****/
-  if (!identifier.tm.is_union &&
-      !identifier.tm.is_enum &&
-      !identifier.tm.is_struct &&
-      (identifier.tm.is_short || identifier.tm.is_long
-       || identifier.tm.is_unsigned) && strcmp(xbt_ddt_parse_text, "char")
-      && strcmp(xbt_ddt_parse_text, "float")
-      && strcmp(xbt_ddt_parse_text, "double")
-      && strcmp(xbt_ddt_parse_text, "int")) {
-
-    /* bastard user, they omited "int" ! */
-    identifier.type_name = (char *) strdup("int");
-    XBT_DEBUG("the base type is 'int', which were omited (you vicious user)");
-  } else {
-    identifier.type_name = (char *) strdup(xbt_ddt_parse_text);
-    XBT_DEBUG("the base type is '%s'", identifier.type_name);
-    xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump();
-  }
-
-        /**** build the base type for latter use ****/
-  if (identifier.tm.is_union) {
-    PARSE_ERROR
-        ("Unimplemented feature: XBT_DEFINE_TYPE cannot handle union yet (get callback from annotation?)");
-
-  } else if (identifier.tm.is_enum) {
-    PARSE_ERROR
-        ("Unimplemented feature: XBT_DEFINE_TYPE cannot handle enum yet");
-
-  } else if (identifier.tm.is_struct) {
-    sprintf(buffname, "struct %s", identifier.type_name);
-    identifier.type = xbt_datadesc_struct(buffname);   /* Get created when does not exist */
-
-  } else if (identifier.tm.is_unsigned) {
-    if (!strcmp(identifier.type_name, "int")) {
-      if (identifier.tm.is_long == 2) {
-        identifier.type = xbt_datadesc_by_name("unsigned long long int");
-      } else if (identifier.tm.is_long) {
-        identifier.type = xbt_datadesc_by_name("unsigned long int");
-      } else if (identifier.tm.is_short) {
-        identifier.type = xbt_datadesc_by_name("unsigned short int");
-      } else {
-        identifier.type = xbt_datadesc_by_name("unsigned int");
-      }
-
-    } else if (!strcmp(identifier.type_name, "char")) {
-      identifier.type = xbt_datadesc_by_name("unsigned char");
-
-    } else {                    /* impossible, gcc parses this shit before us */
-      THROW_IMPOSSIBLE;
-    }
-
-  } else if (!strcmp(identifier.type_name, "float")) {
-    /* no modificator allowed by gcc */
-    identifier.type = xbt_datadesc_by_name("float");
-
-  } else if (!strcmp(identifier.type_name, "double")) {
-    if (identifier.tm.is_long)
-      PARSE_ERROR("long double not portable and thus not handled");
-
-    identifier.type = xbt_datadesc_by_name("double");
-
-  } else {                      /* signed integer elemental */
-    if (!strcmp(identifier.type_name, "int")) {
-      if (identifier.tm.is_long == 2) {
-        identifier.type = xbt_datadesc_by_name("signed long long int");
-      } else if (identifier.tm.is_long) {
-        identifier.type = xbt_datadesc_by_name("signed long int");
-      } else if (identifier.tm.is_short) {
-        identifier.type = xbt_datadesc_by_name("signed short int");
-      } else {
-        identifier.type = xbt_datadesc_by_name("int");
-      }
-
-    } else if (!strcmp(identifier.type_name, "char")) {
-      identifier.type = xbt_datadesc_by_name("char");
-
-    } else {
-      XBT_DEBUG("Base type is a constructed one (%s)", identifier.type_name);
-      if (!strcmp(identifier.type_name, "xbt_matrix_t")) {
-        identifier.tm.is_matrix = 1;
-      } else if (!strcmp(identifier.type_name, "xbt_dynar_t")) {
-        identifier.tm.is_dynar = 1;
-      } else {
-        identifier.type = xbt_datadesc_by_name(identifier.type_name);
-        if (!identifier.type)
-          PARSE_ERROR("Unknown base type '%s'", identifier.type_name);
-      }
-    }
-  }
-  /* Now identifier.type and identifier.name speak about the base type.
-     Stars are not eaten unless 'int' was omitted.
-     We will have to enhance it if we are in fact asked for array or reference.
-
-     Dynars and matrices also need some extra love (prodiged as annotations)
-   */
-
-        /**** look for the symbols of this type ****/
-  for (expect_id_separator = 0; (       /*(xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_EMPTY) && FIXME */
-                                  (xbt_ddt_parse_tok_num !=
-                                   XBT_DDT_PARSE_TOKEN_SEMI_COLON));
-       xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump()) {
-
-    if (expect_id_separator) {
-      if (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_COLON) {
-        expect_id_separator = 0;
-        continue;
-
-      } else if (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_LB) {
-        /* Handle fixed size arrays */
-        xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump();
-        if (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_RB) {
-          PARSE_ERROR
-              ("Unimplemented feature: XBT_DEFINE_TYPE cannot deal with [] constructs (yet)");
-
-        } else if (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_WORD) {
-          char *end;
-          long int size = strtol(xbt_ddt_parse_text, &end, 10);
-
-          if (end == xbt_ddt_parse_text || *end != '\0') {
-            /* Not a number. Get the constant value, if any */
-            int *storage = xbt_dict_get_or_null(xbt_dd_constants,
-                                                xbt_ddt_parse_text);
-            if (storage) {
-              size = *storage;
-            } else {
-              PARSE_ERROR
-                  ("Unparsable size of array. Found '%s', expected number or known constant. Need to use xbt_datadesc_set_const(), huh?",
-                   xbt_ddt_parse_text);
-            }
-          }
-
-          /* replace the previously pushed type to an array of it */
-          change_to_fixed_array(identifiers, size);
-
-          /* eat the closing bracket */
-          xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump();
-          if (xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_RB)
-            PARSE_ERROR("Unparsable size of array");
-          XBT_DEBUG("Fixed size array, size=%ld", size);
-          continue;
-        } else {
-          PARSE_ERROR("Unparsable size of array");
-        }
-        /* End of fixed size arrays handling */
-
-      } else if (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_WORD) {
-        /* Handle annotation */
-        s_identifier_t array;
-        char *keyname = NULL;
-        char *keyval = NULL;
-        memset(&array, 0, sizeof(array));
-        if (strcmp(xbt_ddt_parse_text, "XBT_ANNOTE"))
-          PARSE_ERROR
-              ("Unparsable symbol: Expected 'XBT_ANNOTE', got '%s'",
-               xbt_ddt_parse_text);
-
-        xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump();
-        if (xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_LP)
-          PARSE_ERROR
-              ("Unparsable annotation: Expected parenthesis, got '%s'",
-               xbt_ddt_parse_text);
-
-        while ((xbt_ddt_parse_tok_num =
-                xbt_ddt_parse_lex_n_dump()) ==
-               XBT_DDT_PARSE_TOKEN_EMPTY);
-
-        if (xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_WORD)
-          PARSE_ERROR
-              ("Unparsable annotation: Expected key name, got '%s'",
-               xbt_ddt_parse_text);
-        keyname = (char *) strdup(xbt_ddt_parse_text);
-
-        while ((xbt_ddt_parse_tok_num =
-                xbt_ddt_parse_lex_n_dump()) ==
-               XBT_DDT_PARSE_TOKEN_EMPTY);
-
-        if (xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_COLON)
-          PARSE_ERROR
-              ("Unparsable annotation: expected ',' after the key name, got '%s'",
-               xbt_ddt_parse_text);
-
-        while ((xbt_ddt_parse_tok_num =
-                xbt_ddt_parse_lex_n_dump()) ==
-               XBT_DDT_PARSE_TOKEN_EMPTY);
-
-        /* get the value */
-
-        if (xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_WORD)
-          PARSE_ERROR
-              ("Unparsable annotation: Expected key value, got '%s'",
-               xbt_ddt_parse_text);
-        keyval = (char *) strdup(xbt_ddt_parse_text);
-
-        while ((xbt_ddt_parse_tok_num =
-                xbt_ddt_parse_lex_n_dump()) ==
-               XBT_DDT_PARSE_TOKEN_EMPTY);
-
-        /* Done with parsing the annotation. Now deal with it by replacing previously pushed type with the right one */
-
-        XBT_DEBUG("Anotation: %s=%s", keyname, keyval);
-        if (!strcmp(keyname, "size")) {
-          if (!identifier.tm.is_ref)
-            PARSE_ERROR
-                ("Size annotation for a field not being a reference");
-          identifier.tm.is_ref--;
-
-          if (!strcmp(keyval, "1")) {
-            change_to_ref(identifiers);
-            free(keyval);
-          } else {
-            char *p;
-            int fixed = 1;
-            for (p = keyval; *p != '\0'; p++)
-              if (!isdigit(*p))
-                fixed = 0;
-            if (fixed) {
-              change_to_fixed_array(identifiers, atoi(keyval));
-              change_to_ref(identifiers);
-              free(keyval);
-
-            } else {
-              change_to_ref_pop_array(identifiers);
-              xbt_dynar_push(fields_to_push, &keyval);
-            }
-          }
-        } else if (!strcmp(keyname, "subtype")) {
-          xbt_datadesc_type_t subtype = xbt_datadesc_by_name(keyval);
-          if (identifier.tm.is_matrix) {
-            change_to_matrix_of(identifiers, subtype);
-            identifier.tm.is_matrix = -1;
-          } else if (identifier.tm.is_dynar) {
-            change_to_dynar_of(identifiers, subtype);
-            identifier.tm.is_dynar = -1;
-          } else {
-            PARSE_ERROR
-                ("subtype annotation only accepted for dynars and matrices, but passed to '%s'",
-                 identifier.type_name);
-          }
-          free(keyval);
-        } else if (!strcmp(keyname, "free_f")) {
-          int *storage = xbt_dict_get_or_null(xbt_dd_constants, keyval);
-          if (!storage)
-            PARSE_ERROR
-                ("value for free_f annotation of field %s is not a known constant",
-                 identifier.name);
-          if (identifier.tm.is_matrix == -1) {
-            add_free_f(identifiers, *(void_f_pvoid_t *) storage);
-            identifier.tm.is_matrix = 0;
-          } else if (identifier.tm.is_dynar == -1) {
-            add_free_f(identifiers, *(void_f_pvoid_t *) storage);
-            identifier.tm.is_dynar = 0;
-          } else {
-            PARSE_ERROR
-                ("free_f annotation only accepted for dynars and matrices which subtype is already declared (field %s)",
-                 identifier.name);
-          }
-          free(keyval);
-        } else {
-          free(keyval);
-          PARSE_ERROR("Unknown annotation type: '%s'", keyname);
-        }
-        free(keyname);
-
-        /* Get all the multipliers */
-        while (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_STAR) {
-
-          xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump();
-
-          if (xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_WORD)
-            PARSE_ERROR
-                ("Unparsable annotation: Expected field name after '*', got '%s'",
-                 xbt_ddt_parse_text);
-
-          keyval = xbt_malloc(strlen(xbt_ddt_parse_text) + 2);
-          sprintf(keyval, "*%s", xbt_ddt_parse_text);
-
-          /* ask caller to push field as a multiplier */
-          xbt_dynar_push(fields_to_push, &keyval);
-
-          /* skip blanks after this block */
-          while ((xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump())
-                 == XBT_DDT_PARSE_TOKEN_EMPTY);
-        }
-
-        if (xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_RP)
-          PARSE_ERROR
-              ("Unparsable annotation: Expected parenthesis, got '%s'",
-               xbt_ddt_parse_text);
-
-        continue;
-
-        /* End of annotation handling */
-      } else {
-        PARSE_ERROR
-            ("Unparsable symbol: Got '%s' instead of expected comma (',')",
-             xbt_ddt_parse_text);
-      }
-    } else if (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_COLON) {
-      PARSE_ERROR("Unparsable symbol: Unexpected comma (',')");
-    }
-
-    if (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_STAR) {
-      identifier.tm.is_ref++;   /* We indeed deal with multiple references with multiple annotations */
-      continue;
-    }
-
-    /* found a symbol name. Build the type and push it to dynar */
-    if (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_WORD) {
-
-      identifier.name = (char *) strdup(xbt_ddt_parse_text);
-      XBT_DEBUG("Found the identifier \"%s\"", identifier.name);
-
-      xbt_dynar_push(identifiers, &identifier);
-      XBT_DEBUG("Dynar_len=%lu", xbt_dynar_length(identifiers));
-      expect_id_separator = 1;
-      continue;
-    }
-
-    PARSE_ERROR
-        ("Unparasable symbol (maybe a def struct in a def struct or a parser bug ;)");
-  }
-
-  if (identifier.tm.is_matrix > 0)
-    PARSE_ERROR("xbt_matrix_t field without 'subtype' annotation");
-  if (identifier.tm.is_dynar > 0)
-    PARSE_ERROR("xbt_dynar_t field without 'subtype' annotation");
-
-  XBT_OUT();
-}
-
-static xbt_datadesc_type_t parse_struct(char *definition)
-{
-
-  xbt_ex_t e;
-
-  char buffname[32];
-  static int anonymous_struct = 0;
-
-  xbt_dynar_t identifiers;
-  s_identifier_t field;
-  unsigned int iter;
-  int done;
-
-  xbt_dynar_t fields_to_push;
-  char *name;
-
-  volatile xbt_datadesc_type_t struct_type;
-
-  XBT_IN();
-  identifiers = xbt_dynar_new(sizeof(s_identifier_t), NULL);
-  fields_to_push = xbt_dynar_new(sizeof(char *), NULL);
-
-  /* Create the struct descriptor */
-  if (xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_WORD) {
-    struct_type = xbt_datadesc_struct(xbt_ddt_parse_text);
-    XBT_VERB("Parse the struct '%s'", xbt_ddt_parse_text);
-    xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump();
-  } else {
-    sprintf(buffname, "anonymous struct %d", anonymous_struct++);
-    XBT_VERB("Parse the anonymous struct nb %d", anonymous_struct);
-    struct_type = xbt_datadesc_struct(buffname);
-  }
-
-  if (xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_LA)
-    PARSE_ERROR
-        ("Unparasable symbol: Expecting struct definition, but got %s instead of '{'",
-         xbt_ddt_parse_text);
-
-  /* Parse the identifiers */
-  done = 0;
-  do {
-    TRY {
-      parse_statement(definition, identifiers, fields_to_push);
-    }
-    CATCH(e) {
-      if (e.category != mismatch_error)
-        RETHROW;
-      xbt_ex_free(e);
-      done = 1;
-    }
-
-    XBT_DEBUG("This statement contained %lu identifiers",
-           xbt_dynar_length(identifiers));
-    /* append the identifiers we've found */
-    xbt_dynar_foreach(identifiers, iter, field) {
-      if (field.tm.is_ref)
-        PARSE_ERROR
-            ("Not enough XBT_ANNOTATE to deal with all dereferencing levels of %s (%d '*' left)",
-             field.name, (int)field.tm.is_ref);
-
-      XBT_VERB("Append field '%s' to %p", field.name, (void *) struct_type);
-      xbt_datadesc_struct_append(struct_type, field.name, field.type);
-      free(field.name);
-      free(field.type_name);
-
-    }
-    xbt_dynar_reset(identifiers);
-    XBT_DEBUG("struct_type=%p", (void *) struct_type);
-
-    /* Make sure that all fields declaring a size push it into the cbps */
-    xbt_dynar_foreach(fields_to_push, iter, name) {
-      XBT_DEBUG("struct_type=%p", (void *) struct_type);
-      if (name[0] == '*') {
-        XBT_VERB("Push field '%s' as a multiplier into size stack of %p",
-              name + 1, (void *) struct_type);
-        xbt_datadesc_cb_field_push_multiplier(struct_type, name + 1);
-      } else {
-        XBT_VERB("Push field '%s' into size stack of %p",
-              name, (void *) struct_type);
-        xbt_datadesc_cb_field_push(struct_type, name);
-      }
-      free(name);
-    }
-    xbt_dynar_reset(fields_to_push);
-  } while (!done);
-  xbt_datadesc_struct_close(struct_type);
-
-  /* terminates */
-  if (xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_RA)
-    PARSE_ERROR
-        ("Unparasable symbol: Expected '}' at the end of struct definition, got '%s'",
-         xbt_ddt_parse_text);
-
-  xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump();
-
-  xbt_dynar_free(&identifiers);
-  xbt_dynar_free(&fields_to_push);
-  XBT_OUT();
-  return struct_type;
-}
-
-static xbt_datadesc_type_t parse_typedef(char *definition)
-{
-
-  s_type_modifier_t tm;
-
-  xbt_datadesc_type_t typedef_desc = NULL;
-
-  XBT_IN();
-  memset(&tm, 0, sizeof(tm));
-
-  /* get the aliased type */
-  parse_type_modifier(&tm);
-
-  if (tm.is_struct) {
-     parse_struct(definition);
-  }
-
-  parse_type_modifier(&tm);
-
-  if (tm.is_ref)
-    PARSE_ERROR
-        ("XBT_DEFINE_TYPE cannot handle reference without annotation");
-
-  /* get the aliasing name */
-  if (xbt_ddt_parse_tok_num != XBT_DDT_PARSE_TOKEN_WORD)
-    PARSE_ERROR
-        ("Unparsable typedef: Expected the alias name, and got '%s'",
-         xbt_ddt_parse_text);
-
-  /* (FIXME: should) build the alias */
-  PARSE_ERROR
-      ("Unimplemented feature: XBT_DEFINE_TYPE cannot handle typedef yet");
-
-  XBT_OUT();
-  return typedef_desc;
-}
-
-
-/**
- * xbt_datadesc_parse:
- *
- * Create a datadescription from the result of parsing the C type description
- */
-xbt_datadesc_type_t
-xbt_datadesc_parse(const char *name, const char *C_statement)
-{
-
-  xbt_datadesc_type_t res = NULL;
-  char *definition;
-  int semicolon_count = 0;
-  int def_count, C_count;
-
-  XBT_IN();
-  /* reput the \n in place for debug */
-  for (C_count = 0; C_statement[C_count] != '\0'; C_count++)
-    if (C_statement[C_count] == ';' || C_statement[C_count] == '{')
-      semicolon_count++;
-  definition = (char *) xbt_malloc(C_count + semicolon_count + 1);
-  for (C_count = 0, def_count = 0; C_statement[C_count] != '\0'; C_count++) {
-    definition[def_count++] = C_statement[C_count];
-    if (C_statement[C_count] == ';' || C_statement[C_count] == '{') {
-      definition[def_count++] = '\n';
-    }
-  }
-  definition[def_count] = '\0';
-
-  /* init */
-  XBT_VERB("_xbt_ddt_type_parse(%s) -> %d chars", definition, def_count);
-  xbt_ddt_parse_pointer_string_init(definition);
-
-  /* Do I have a typedef, or a raw struct ? */
-  xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump();
-
-  if ((xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_WORD)
-      && (!strcmp(xbt_ddt_parse_text, "struct"))) {
-    xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump();
-    res = parse_struct(definition);
-
-  } else if ((xbt_ddt_parse_tok_num == XBT_DDT_PARSE_TOKEN_WORD)
-             && (!strcmp(xbt_ddt_parse_text, "typedef"))) {
-    xbt_ddt_parse_tok_num = xbt_ddt_parse_lex_n_dump();
-    res = parse_typedef(definition);
-
-  } else {
-    XBT_ERROR
-        ("Failed to parse the following symbol (not a struct neither a typedef) :\n%s",
-         definition);
-    xbt_abort();
-  }
-
-  xbt_ddt_parse_pointer_string_close();
-  XBT_VERB("end of _xbt_ddt_type_parse()");
-  free(definition);
-  /* register it under the name provided as symbol */
-  if (strcmp(res->name, name)) {
-    XBT_ERROR
-        ("In XBT_DEFINE_TYPE, the provided symbol (here %s) must be the C type name (here %s)",
-         name, res->name);
-    xbt_abort();
-  }
-  xbt_ddt_parse_lex_destroy();
-  XBT_OUT();
-  return res;
-}
-
-xbt_dict_t xbt_dd_constants;
-/** \brief Declare a constant to the parsing mecanism. See the "\#define and fixed size array" section */
-void xbt_datadesc_set_const(const char *name, int value)
-{
-  int *stored = xbt_new(int, 1);
-  *stored = value;
-
-  xbt_dict_set(xbt_dd_constants, name, stored, NULL);
-}
diff --git a/src/xbt/datadesc/ddt_parse.yy.c b/src/xbt/datadesc/ddt_parse.yy.c
deleted file mode 100644 (file)
index a3a4c66..0000000
+++ /dev/null
@@ -1,2085 +0,0 @@
-
-#line 3 "src/xbt/datadesc/ddt_parse.yy.c"
-
-#define  YY_INT_ALIGNED short int
-
-/* A lexical scanner generated by flex */
-
-#define yy_create_buffer xbt_ddt_parse__create_buffer
-#define yy_delete_buffer xbt_ddt_parse__delete_buffer
-#define yy_flex_debug xbt_ddt_parse__flex_debug
-#define yy_init_buffer xbt_ddt_parse__init_buffer
-#define yy_flush_buffer xbt_ddt_parse__flush_buffer
-#define yy_load_buffer_state xbt_ddt_parse__load_buffer_state
-#define yy_switch_to_buffer xbt_ddt_parse__switch_to_buffer
-#define yyin xbt_ddt_parse_in
-#define yyleng xbt_ddt_parse_leng
-#define yylex xbt_ddt_parse_lex
-#define yylineno xbt_ddt_parse_lineno
-#define yyout xbt_ddt_parse_out
-#define yyrestart xbt_ddt_parse_restart
-#define yytext xbt_ddt_parse_text
-#define yywrap xbt_ddt_parse_wrap
-#define yyalloc xbt_ddt_parse_alloc
-#define yyrealloc xbt_ddt_parse_realloc
-#define yyfree xbt_ddt_parse_free
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 35
-#if YY_FLEX_SUBMINOR_VERSION > 0
-#define FLEX_BETA
-#endif
-
-/* First, we deal with  platform-specific or compiler-specific issues. */
-
-/* begin standard C headers. */
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-
-/* end standard C headers. */
-
-/* flex integer type definitions */
-
-#ifndef FLEXINT_H
-#define FLEXINT_H
-
-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-
-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types. 
- */
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS 1
-#endif
-
-#include <inttypes.h>
-typedef int8_t flex_int8_t;
-typedef uint8_t flex_uint8_t;
-typedef int16_t flex_int16_t;
-typedef uint16_t flex_uint16_t;
-typedef int32_t flex_int32_t;
-typedef uint32_t flex_uint32_t;
-#else
-typedef signed char flex_int8_t;
-typedef short int flex_int16_t;
-typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t; 
-typedef unsigned short int flex_uint16_t;
-typedef unsigned int flex_uint32_t;
-
-/* Limits of integral types. */
-#ifndef INT8_MIN
-#define INT8_MIN               (-128)
-#endif
-#ifndef INT16_MIN
-#define INT16_MIN              (-32767-1)
-#endif
-#ifndef INT32_MIN
-#define INT32_MIN              (-2147483647-1)
-#endif
-#ifndef INT8_MAX
-#define INT8_MAX               (127)
-#endif
-#ifndef INT16_MAX
-#define INT16_MAX              (32767)
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX              (2147483647)
-#endif
-#ifndef UINT8_MAX
-#define UINT8_MAX              (255U)
-#endif
-#ifndef UINT16_MAX
-#define UINT16_MAX             (65535U)
-#endif
-#ifndef UINT32_MAX
-#define UINT32_MAX             (4294967295U)
-#endif
-
-#endif /* ! C99 */
-
-#endif /* ! FLEXINT_H */
-
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else  /* ! __cplusplus */
-
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
-
-#define YY_USE_CONST
-
-#endif /* defined (__STDC__) */
-#endif /* ! __cplusplus */
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index.  If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* Enter a start condition.  This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN (yy_start) = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state.  The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START (((yy_start) - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE xbt_ddt_parse_restart(xbt_ddt_parse_in  )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#ifndef YY_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k.
- * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
- * Ditto for the __ia64__ case accordingly.
- */
-#define YY_BUF_SIZE 32768
-#else
-#define YY_BUF_SIZE 16384
-#endif /* __ia64__ */
-#endif
-
-/* The state buf must be large enough to hold one state per character in the main buffer.
- */
-#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
-
-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-#define YY_TYPEDEF_YY_BUFFER_STATE
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-#endif
-
-extern int xbt_ddt_parse_leng;
-
-extern FILE *xbt_ddt_parse_in, *xbt_ddt_parse_out;
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
-    #define YY_LESS_LINENO(n)
-    
-/* Return all but the first "n" matched characters back to the input stream. */
-#define yyless(n) \
-       do \
-               { \
-               /* Undo effects of setting up xbt_ddt_parse_text. */ \
-        int yyless_macro_arg = (n); \
-        YY_LESS_LINENO(yyless_macro_arg);\
-               *yy_cp = (yy_hold_char); \
-               YY_RESTORE_YY_MORE_OFFSET \
-               (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
-               YY_DO_BEFORE_ACTION; /* set up xbt_ddt_parse_text again */ \
-               } \
-       while ( 0 )
-
-#define unput(c) yyunput( c, (yytext_ptr)  )
-
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
-#ifndef YY_STRUCT_YY_BUFFER_STATE
-#define YY_STRUCT_YY_BUFFER_STATE
-struct yy_buffer_state
-       {
-       FILE *yy_input_file;
-
-       char *yy_ch_buf;                /* input buffer */
-       char *yy_buf_pos;               /* current position in input buffer */
-
-       /* Size of input buffer in bytes, not including room for EOB
-        * characters.
-        */
-       yy_size_t yy_buf_size;
-
-       /* Number of characters read into yy_ch_buf, not including EOB
-        * characters.
-        */
-       int yy_n_chars;
-
-       /* Whether we "own" the buffer - i.e., we know we created it,
-        * and can realloc() it to grow it, and should free() it to
-        * delete it.
-        */
-       int yy_is_our_buffer;
-
-       /* Whether this is an "interactive" input source; if so, and
-        * if we're using stdio for input, then we want to use getc()
-        * instead of fread(), to make sure we stop fetching input after
-        * each newline.
-        */
-       int yy_is_interactive;
-
-       /* Whether we're considered to be at the beginning of a line.
-        * If so, '^' rules will be active on the next match, otherwise
-        * not.
-        */
-       int yy_at_bol;
-
-    int yy_bs_lineno; /**< The line count. */
-    int yy_bs_column; /**< The column count. */
-    
-       /* Whether to try to fill the input buffer when we reach the
-        * end of it.
-        */
-       int yy_fill_buffer;
-
-       int yy_buffer_status;
-
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
-       /* When an EOF's been seen but there's still some text to process
-        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
-        * shouldn't try reading from the input source any more.  We might
-        * still have a bunch of tokens to match, though, because of
-        * possible backing-up.
-        *
-        * When we actually see the EOF, we change the status to "new"
-        * (via xbt_ddt_parse_restart()), so that the user can continue scanning by
-        * just pointing xbt_ddt_parse_in at a new input file.
-        */
-#define YY_BUFFER_EOF_PENDING 2
-
-       };
-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-
-/* Stack of input buffers. */
-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- *
- * Returns the top of the stack, or NULL.
- */
-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
-                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
-                          : NULL)
-
-/* Same as previous macro, but useful when we know that the buffer stack is not
- * NULL or when we need an lvalue. For internal use only.
- */
-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
-
-/* yy_hold_char holds the character lost when xbt_ddt_parse_text is formed. */
-static char yy_hold_char;
-static int yy_n_chars;         /* number of characters read into yy_ch_buf */
-int xbt_ddt_parse_leng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 0;                /* whether we need to initialize */
-static int yy_start = 0;       /* start state number */
-
-/* Flag which is used to allow xbt_ddt_parse_wrap()'s to do buffer switches
- * instead of setting up a fresh xbt_ddt_parse_in.  A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-
-void xbt_ddt_parse_restart (FILE *input_file  );
-void xbt_ddt_parse__switch_to_buffer (YY_BUFFER_STATE new_buffer  );
-YY_BUFFER_STATE xbt_ddt_parse__create_buffer (FILE *file,int size  );
-void xbt_ddt_parse__delete_buffer (YY_BUFFER_STATE b  );
-void xbt_ddt_parse__flush_buffer (YY_BUFFER_STATE b  );
-void xbt_ddt_parse_push_buffer_state (YY_BUFFER_STATE new_buffer  );
-void xbt_ddt_parse_pop_buffer_state (void );
-
-static void xbt_ddt_parse_ensure_buffer_stack (void );
-static void xbt_ddt_parse__load_buffer_state (void );
-static void xbt_ddt_parse__init_buffer (YY_BUFFER_STATE b,FILE *file  );
-
-#define YY_FLUSH_BUFFER xbt_ddt_parse__flush_buffer(YY_CURRENT_BUFFER )
-
-YY_BUFFER_STATE xbt_ddt_parse__scan_buffer (char *base,yy_size_t size  );
-YY_BUFFER_STATE xbt_ddt_parse__scan_string (yyconst char *yy_str  );
-YY_BUFFER_STATE xbt_ddt_parse__scan_bytes (yyconst char *bytes,int len  );
-
-void *xbt_ddt_parse_alloc (yy_size_t  );
-void *xbt_ddt_parse_realloc (void *,yy_size_t  );
-void xbt_ddt_parse_free (void *  );
-
-#define yy_new_buffer xbt_ddt_parse__create_buffer
-
-#define yy_set_interactive(is_interactive) \
-       { \
-       if ( ! YY_CURRENT_BUFFER ){ \
-        xbt_ddt_parse_ensure_buffer_stack (); \
-               YY_CURRENT_BUFFER_LVALUE =    \
-            xbt_ddt_parse__create_buffer(xbt_ddt_parse_in,YY_BUF_SIZE ); \
-       } \
-       YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
-       }
-
-#define yy_set_bol(at_bol) \
-       { \
-       if ( ! YY_CURRENT_BUFFER ){\
-        xbt_ddt_parse_ensure_buffer_stack (); \
-               YY_CURRENT_BUFFER_LVALUE =    \
-            xbt_ddt_parse__create_buffer(xbt_ddt_parse_in,YY_BUF_SIZE ); \
-       } \
-       YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
-       }
-
-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-
-/* Begin user sect3 */
-
-#define xbt_ddt_parse_wrap(n) 1
-#define YY_SKIP_YYWRAP
-
-typedef unsigned char YY_CHAR;
-
-FILE *xbt_ddt_parse_in = (FILE *) 0, *xbt_ddt_parse_out = (FILE *) 0;
-
-typedef int yy_state_type;
-
-extern int xbt_ddt_parse_lineno;
-
-int xbt_ddt_parse_lineno = 1;
-
-extern char *xbt_ddt_parse_text;
-#define yytext_ptr xbt_ddt_parse_text
-
-static yy_state_type yy_get_previous_state (void );
-static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
-static int yy_get_next_buffer (void );
-static void yy_fatal_error (yyconst char msg[]  );
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up xbt_ddt_parse_text.
- */
-#define YY_DO_BEFORE_ACTION \
-       (yytext_ptr) = yy_bp; \
-       xbt_ddt_parse_leng = (size_t) (yy_cp - yy_bp); \
-       (yy_hold_char) = *yy_cp; \
-       *yy_cp = '\0'; \
-       (yy_c_buf_p) = yy_cp;
-
-#define YY_NUM_RULES 26
-#define YY_END_OF_BUFFER 27
-/* This struct is not used in this scanner,
-   but its presence is necessary. */
-struct yy_trans_info
-       {
-       flex_int32_t yy_verify;
-       flex_int32_t yy_nxt;
-       };
-static yyconst flex_int16_t yy_accept[61] =
-    {   0,
-       14,   14,    7,    7,   10,   10,    0,    0,   27,   25,
-       24,   19,   20,   21,   23,   14,   25,   22,   17,   18,
-       15,   16,    7,    7,    6,    7,    7,   10,   12,   11,
-       26,   26,   14,    0,    1,    7,    7,    7,    5,    7,
-       10,   11,   11,   13,    0,    0,    2,    1,    4,    0,
-        3,    0,    2,    0,    3,    0,    0,    8,    9,    0
-    } ;
-
-static yyconst flex_int32_t yy_ec[256] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    2,    1,    1,    1,    1,    1,    1,    1,    4,
-        5,    6,    1,    7,    8,    8,    9,   10,   10,   10,
-       10,   10,   10,   10,   10,   10,   10,    1,   11,    1,
-        1,    1,    1,    1,    8,    8,    8,    8,    8,    8,
-        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
-        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
-       12,    1,   13,   14,    8,    1,    8,    8,    8,    8,
-
-        8,    8,   15,    8,    8,    8,    8,    8,    8,    8,
-        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
-        8,    8,   16,    1,   17,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1
-    } ;
-
-static yyconst flex_int32_t yy_meta[18] =
-    {   0,
-        1,    1,    2,    1,    1,    3,    1,    4,    1,    4,
-        1,    1,    1,    1,    4,    1,    1
-    } ;
-
-static yyconst flex_int16_t yy_base[69] =
-    {   0,
-        0,    0,   16,   30,   17,   18,   78,   77,   85,   88,
-       88,   88,   88,   88,   88,    0,   19,   88,   88,   88,
-       88,   88,    0,   24,   88,   75,   77,    0,   88,   21,
-       88,   76,    0,   22,    0,    0,   27,   75,    0,   71,
-        0,   29,   34,   88,   29,   65,   76,    0,    0,   63,
-       74,   60,   72,   56,   65,   51,   50,   88,   88,   88,
-       45,   49,   53,   55,   57,   61,   65,   69
-    } ;
-
-static yyconst flex_int16_t yy_def[69] =
-    {   0,
-       60,    1,   61,   61,   62,   62,   63,   63,   60,   60,
-       60,   60,   60,   60,   60,   64,   60,   60,   60,   60,
-       60,   60,   65,   65,   60,   65,   65,   66,   60,   67,
-       60,   60,   64,   60,   68,   65,   65,   65,   65,   65,
-       66,   67,   67,   60,   60,   60,   60,   68,   65,   60,
-       60,   60,   60,   60,   60,   60,   60,   60,   60,    0,
-       60,   60,   60,   60,   60,   60,   60,   60
-    } ;
-
-static yyconst flex_int16_t yy_nxt[106] =
-    {   0,
-       10,   10,   11,   12,   13,   14,   15,   16,   17,   16,
-       18,   19,   20,   10,   16,   21,   22,   24,   25,   29,
-       29,   26,   30,   30,   34,   37,   43,   35,   37,   44,
-       27,   24,   25,   46,   60,   26,   47,   60,   38,   43,
-       50,   38,   44,   51,   27,   23,   23,   23,   23,   28,
-       28,   28,   28,   31,   31,   31,   31,   36,   33,   36,
-       36,   41,   59,   58,   41,   42,   55,   42,   42,   48,
-       57,   48,   48,   53,   56,   55,   54,   53,   52,   49,
-       40,   45,   40,   39,   60,   32,   32,    9,   60,   60,
-       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
-
-       60,   60,   60,   60,   60
-    } ;
-
-static yyconst flex_int16_t yy_chk[106] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    3,    3,    5,
-        6,    3,    5,    6,   17,   24,   30,   17,   37,   30,
-        3,    4,    4,   34,   42,    4,   34,   42,   24,   43,
-       45,   37,   43,   45,    4,   61,   61,   61,   61,   62,
-       62,   62,   62,   63,   63,   63,   63,   65,   64,   65,
-       65,   66,   57,   56,   66,   67,   55,   67,   67,   68,
-       54,   68,   68,   53,   52,   51,   50,   47,   46,   40,
-       38,   32,   27,   26,    9,    8,    7,   60,   60,   60,
-       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
-
-       60,   60,   60,   60,   60
-    } ;
-
-static yy_state_type yy_last_accepting_state;
-static char *yy_last_accepting_cpos;
-
-extern int xbt_ddt_parse__flex_debug;
-int xbt_ddt_parse__flex_debug = 0;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-char *xbt_ddt_parse_text;
-/* datadesc/ddt_parse -- automatic parsing of data structures */
-/* Copyright (c) 2004 Arnaud Legrand, Martin Quinson. All rights reserved.  */
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-#include "xbt/datadesc/datadesc_private.h"
-#include "xbt/datadesc/ddt_parse.yy.h"
-#include <string.h>
-  YY_BUFFER_STATE xbt_ddt_input_buffer;
-  FILE *xbt_ddt_file_to_parse;
-
-  int xbt_ddt_parse_line_pos = 1;
-  int xbt_ddt_parse_col_pos = 0;
-  int xbt_ddt_parse_char_pos = 0;
-  int xbt_ddt_parse_tok_num = 0;
-  const char *definition;
-  XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ddt_lexer,xbt_ddt_parse,"The crude internals of the lexer used for type parsing");
-#define SHOW_WHERE XBT_DEBUG("%d:%d (char #%d): seen '%s'", xbt_ddt_parse_line_pos,xbt_ddt_parse_col_pos,xbt_ddt_parse_char_pos,xbt_ddt_parse_text)
-
-#define INITIAL 0
-#define annotate 1
-#define comment 2
-#define foo 3
-
-#ifndef YY_NO_UNISTD_H
-/* Special case for "unistd.h", since it is non-ANSI. We include it way
- * down here because we want the user's section 1 to have been scanned first.
- * The user has a chance to override it with an option.
- */
-#include <unistd.h>
-#endif
-
-#ifndef YY_EXTRA_TYPE
-#define YY_EXTRA_TYPE void *
-#endif
-
-static int yy_init_globals (void );
-
-/* Accessor methods to globals.
-   These are made visible to non-reentrant scanners for convenience. */
-
-int xbt_ddt_parse_lex_destroy (void );
-
-int xbt_ddt_parse_get_debug (void );
-
-void xbt_ddt_parse_set_debug (int debug_flag  );
-
-YY_EXTRA_TYPE xbt_ddt_parse_get_extra (void );
-
-void xbt_ddt_parse_set_extra (YY_EXTRA_TYPE user_defined  );
-
-FILE *xbt_ddt_parse_get_in (void );
-
-void xbt_ddt_parse_set_in  (FILE * in_str  );
-
-FILE *xbt_ddt_parse_get_out (void );
-
-void xbt_ddt_parse_set_out  (FILE * out_str  );
-
-int xbt_ddt_parse_get_leng (void );
-
-char *xbt_ddt_parse_get_text (void );
-
-int xbt_ddt_parse_get_lineno (void );
-
-void xbt_ddt_parse_set_lineno (int line_number  );
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int xbt_ddt_parse_wrap (void );
-#else
-extern int xbt_ddt_parse_wrap (void );
-#endif
-#endif
-
-    static void yyunput (int c,char *buf_ptr  );
-    
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int );
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * );
-#endif
-
-#ifndef YY_NO_INPUT
-
-#ifdef __cplusplus
-static int yyinput (void );
-#else
-static int input (void );
-#endif
-
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k */
-#define YY_READ_BUF_SIZE 16384
-#else
-#define YY_READ_BUF_SIZE 8192
-#endif /* __ia64__ */
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-#ifndef ECHO
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO do { if (fwrite( xbt_ddt_parse_text, xbt_ddt_parse_leng, 1, xbt_ddt_parse_out )) {} } while (0)
-#endif
-
-/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
-       if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
-               { \
-               int c = '*'; \
-               size_t n; \
-               for ( n = 0; n < max_size && \
-                            (c = getc( xbt_ddt_parse_in )) != EOF && c != '\n'; ++n ) \
-                       buf[n] = (char) c; \
-               if ( c == '\n' ) \
-                       buf[n++] = (char) c; \
-               if ( c == EOF && ferror( xbt_ddt_parse_in ) ) \
-                       YY_FATAL_ERROR( "input in flex scanner failed" ); \
-               result = n; \
-               } \
-       else \
-               { \
-               errno=0; \
-               while ( (result = fread(buf, 1, max_size, xbt_ddt_parse_in))==0 && ferror(xbt_ddt_parse_in)) \
-                       { \
-                       if( errno != EINTR) \
-                               { \
-                               YY_FATAL_ERROR( "input in flex scanner failed" ); \
-                               break; \
-                               } \
-                       errno=0; \
-                       clearerr(xbt_ddt_parse_in); \
-                       } \
-               }\
-\
-
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-#endif
-
-/* end tables serialization structures and prototypes */
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL_IS_OURS 1
-
-extern int xbt_ddt_parse_lex (void);
-
-#define YY_DECL int xbt_ddt_parse_lex (void)
-#endif /* !YY_DECL */
-
-/* Code executed at the beginning of each rule, after xbt_ddt_parse_text and xbt_ddt_parse_leng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-#define YY_RULE_SETUP \
-       YY_USER_ACTION
-
-/** The main scanner function which does all the work.
- */
-YY_DECL
-{
-       register yy_state_type yy_current_state;
-       register char *yy_cp, *yy_bp;
-       register int yy_act;
-    
-   int comment_caller=0;
-   int annotate_caller=0;
-
-       if ( !(yy_init) )
-               {
-               (yy_init) = 1;
-
-#ifdef YY_USER_INIT
-               YY_USER_INIT;
-#endif
-
-               if ( ! (yy_start) )
-                       (yy_start) = 1; /* first start state */
-
-               if ( ! xbt_ddt_parse_in )
-                       xbt_ddt_parse_in = stdin;
-
-               if ( ! xbt_ddt_parse_out )
-                       xbt_ddt_parse_out = stdout;
-
-               if ( ! YY_CURRENT_BUFFER ) {
-                       xbt_ddt_parse_ensure_buffer_stack ();
-                       YY_CURRENT_BUFFER_LVALUE =
-                               xbt_ddt_parse__create_buffer(xbt_ddt_parse_in,YY_BUF_SIZE );
-               }
-
-               xbt_ddt_parse__load_buffer_state( );
-               }
-
-       while ( 1 )             /* loops until end-of-file is reached */
-               {
-               yy_cp = (yy_c_buf_p);
-
-               /* Support of xbt_ddt_parse_text. */
-               *yy_cp = (yy_hold_char);
-
-               /* yy_bp points to the position in yy_ch_buf of the start of
-                * the current run.
-                */
-               yy_bp = yy_cp;
-
-               yy_current_state = (yy_start);
-yy_match:
-               do
-                       {
-                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
-                       if ( yy_accept[yy_current_state] )
-                               {
-                               (yy_last_accepting_state) = yy_current_state;
-                               (yy_last_accepting_cpos) = yy_cp;
-                               }
-                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-                               {
-                               yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 61 )
-                                       yy_c = yy_meta[(unsigned int) yy_c];
-                               }
-                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-                       ++yy_cp;
-                       }
-               while ( yy_base[yy_current_state] != 88 );
-
-yy_find_action:
-               yy_act = yy_accept[yy_current_state];
-               if ( yy_act == 0 )
-                       { /* have to back up */
-                       yy_cp = (yy_last_accepting_cpos);
-                       yy_current_state = (yy_last_accepting_state);
-                       yy_act = yy_accept[yy_current_state];
-                       }
-
-               YY_DO_BEFORE_ACTION;
-
-do_action:     /* This label is used only to access EOF actions. */
-
-               switch ( yy_act )
-       { /* beginning of action switch */
-                       case 0: /* must back up */
-                       /* undo the effects of YY_DO_BEFORE_ACTION */
-                       *yy_cp = (yy_hold_char);
-                       yy_cp = (yy_last_accepting_cpos);
-                       yy_current_state = (yy_last_accepting_state);
-                       goto yy_find_action;
-
-case 1:
-YY_RULE_SETUP
-
-       YY_BREAK
-case 2:
-YY_RULE_SETUP
-{ /****************** ANNOTATION ************************/
-  XBT_DEBUG("Begin annotation");
-  annotate_caller = INITIAL;
-  xbt_ddt_parse_char_pos+= strlen(xbt_ddt_parse_text);
-  xbt_ddt_parse_col_pos+= strlen(xbt_ddt_parse_text);
-  BEGIN(annotate);
-}
-       YY_BREAK
-case 3:
-YY_RULE_SETUP
-{ /* trim annotation */
-  XBT_DEBUG("Begin annotation");
-  annotate_caller = foo;
-  xbt_ddt_parse_char_pos+= strlen(xbt_ddt_parse_text);
-  xbt_ddt_parse_col_pos+= strlen(xbt_ddt_parse_text);
-  BEGIN(annotate);
-}
-       YY_BREAK
-case 4:
-YY_RULE_SETUP
-{
-  XBT_DEBUG("End annotation");
-  xbt_ddt_parse_char_pos+= strlen(xbt_ddt_parse_text);
-  xbt_ddt_parse_col_pos+= strlen(xbt_ddt_parse_text);
-  BEGIN(annotate_caller);
-}
-       YY_BREAK
-case 5:
-YY_RULE_SETUP
-{
-  PARSE_ERROR("``/*g'' construct closed by a regular ``*/''");
-}
-       YY_BREAK
-case 6:
-/* rule 6 can match eol */
-YY_RULE_SETUP
-{
-  PARSE_ERROR("Type annotation cannot spread over several lines");
-}
-       YY_BREAK
-case 7:
-YY_RULE_SETUP
-{ /* eat the rest */
-  xbt_ddt_parse_char_pos+= strlen(xbt_ddt_parse_text);
-  xbt_ddt_parse_col_pos+= strlen(xbt_ddt_parse_text);
-  return XBT_DDT_PARSE_TOKEN_ANNOTATE;
-}
-       YY_BREAK
-case 8:
-YY_RULE_SETUP
-{ /****************** COMMENTS ************************/
-  /* constructs like : */
-    /*g [string] g*/ 
-  /* are not comments but size annotations */
-  comment_caller = INITIAL;
-  BEGIN(comment);
-}
-       YY_BREAK
-case 9:
-YY_RULE_SETUP
-{
-  comment_caller = foo;
-  BEGIN(comment);
-}
-       YY_BREAK
-case 10:
-YY_RULE_SETUP
-{ /* eat anything that's not a '*' */
-}
-       YY_BREAK
-case 11:
-YY_RULE_SETUP
-{ /* eat up '*'s not followed by '/'s */
-}
-       YY_BREAK
-case 12:
-/* rule 12 can match eol */
-YY_RULE_SETUP
-{
-  ++xbt_ddt_parse_line_pos;
-  xbt_ddt_parse_col_pos=0;
-  xbt_ddt_parse_char_pos++;
-}
-       YY_BREAK
-case 13:
-YY_RULE_SETUP
-{
-  xbt_ddt_parse_char_pos+= strlen(xbt_ddt_parse_text);
-  xbt_ddt_parse_col_pos+= strlen(xbt_ddt_parse_text);
-  BEGIN(comment_caller);
-}
-       YY_BREAK
-case 14:
-YY_RULE_SETUP
-{  /****************** STATEMENTS ************************/
-  xbt_ddt_parse_char_pos += strlen(xbt_ddt_parse_text);
-  xbt_ddt_parse_col_pos += strlen(xbt_ddt_parse_text);
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_WORD);
-}
-       YY_BREAK
-case 15:
-YY_RULE_SETUP
-{ 
-  xbt_ddt_parse_char_pos++; 
-  xbt_ddt_parse_col_pos++; 
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_LA);
-}
-       YY_BREAK
-case 16:
-YY_RULE_SETUP
-{
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_RA);
-}
-       YY_BREAK
-case 17:
-YY_RULE_SETUP
-{ 
-  xbt_ddt_parse_char_pos++; 
-  xbt_ddt_parse_col_pos++; 
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_LB);
-}
-       YY_BREAK
-case 18:
-YY_RULE_SETUP
-{
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_RB);
-}
-       YY_BREAK
-case 19:
-YY_RULE_SETUP
-{ 
-  xbt_ddt_parse_char_pos++; 
-  xbt_ddt_parse_col_pos++; 
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_LP);
-}
-       YY_BREAK
-case 20:
-YY_RULE_SETUP
-{
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_RP);
-}
-       YY_BREAK
-case 21:
-YY_RULE_SETUP
-{
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_STAR);
-}
-       YY_BREAK
-case 22:
-YY_RULE_SETUP
-{
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_SEMI_COLON);
-}
-       YY_BREAK
-case 23:
-YY_RULE_SETUP
-{ 
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_COLON);
-}
-       YY_BREAK
-case 24:
-/* rule 24 can match eol */
-YY_RULE_SETUP
-{
- xbt_ddt_parse_line_pos++; 
- xbt_ddt_parse_char_pos++;
- xbt_ddt_parse_col_pos=0;
-  SHOW_WHERE;
-}
-       YY_BREAK
-case 25:
-YY_RULE_SETUP
-{ 
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-}
-       YY_BREAK
-case 26:
-YY_RULE_SETUP
-ECHO;
-       YY_BREAK
-case YY_STATE_EOF(INITIAL):
-case YY_STATE_EOF(annotate):
-case YY_STATE_EOF(comment):
-case YY_STATE_EOF(foo):
-       yyterminate();
-
-       case YY_END_OF_BUFFER:
-               {
-               /* Amount of text matched not including the EOB char. */
-               int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
-
-               /* Undo the effects of YY_DO_BEFORE_ACTION. */
-               *yy_cp = (yy_hold_char);
-               YY_RESTORE_YY_MORE_OFFSET
-
-               if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
-                       {
-                       /* We're scanning a new file or input source.  It's
-                        * possible that this happened because the user
-                        * just pointed xbt_ddt_parse_in at a new source and called
-                        * xbt_ddt_parse_lex().  If so, then we have to assure
-                        * consistency between YY_CURRENT_BUFFER and our
-                        * globals.  Here is the right place to do so, because
-                        * this is the first action (other than possibly a
-                        * back-up) that will match for the new input source.
-                        */
-                       (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-                       YY_CURRENT_BUFFER_LVALUE->yy_input_file = xbt_ddt_parse_in;
-                       YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
-                       }
-
-               /* Note that here we test for yy_c_buf_p "<=" to the position
-                * of the first EOB in the buffer, since yy_c_buf_p will
-                * already have been incremented past the NUL character
-                * (since all states make transitions on EOB to the
-                * end-of-buffer state).  Contrast this with the test
-                * in input().
-                */
-               if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
-                       { /* This was really a NUL. */
-                       yy_state_type yy_next_state;
-
-                       (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
-
-                       yy_current_state = yy_get_previous_state(  );
-
-                       /* Okay, we're now positioned to make the NUL
-                        * transition.  We couldn't have
-                        * yy_get_previous_state() go ahead and do it
-                        * for us because it doesn't know how to deal
-                        * with the possibility of jamming (and we don't
-                        * want to build jamming into it because then it
-                        * will run more slowly).
-                        */
-
-                       yy_next_state = yy_try_NUL_trans( yy_current_state );
-
-                       yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-
-                       if ( yy_next_state )
-                               {
-                               /* Consume the NUL. */
-                               yy_cp = ++(yy_c_buf_p);
-                               yy_current_state = yy_next_state;
-                               goto yy_match;
-                               }
-
-                       else
-                               {
-                               yy_cp = (yy_c_buf_p);
-                               goto yy_find_action;
-                               }
-                       }
-
-               else switch ( yy_get_next_buffer(  ) )
-                       {
-                       case EOB_ACT_END_OF_FILE:
-                               {
-                               (yy_did_buffer_switch_on_eof) = 0;
-
-                               if ( xbt_ddt_parse_wrap( ) )
-                                       {
-                                       /* Note: because we've taken care in
-                                        * yy_get_next_buffer() to have set up
-                                        * xbt_ddt_parse_text, we can now set up
-                                        * yy_c_buf_p so that if some total
-                                        * hoser (like flex itself) wants to
-                                        * call the scanner after we return the
-                                        * YY_NULL, it'll still work - another
-                                        * YY_NULL will get returned.
-                                        */
-                                       (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
-
-                                       yy_act = YY_STATE_EOF(YY_START);
-                                       goto do_action;
-                                       }
-
-                               else
-                                       {
-                                       if ( ! (yy_did_buffer_switch_on_eof) )
-                                               YY_NEW_FILE;
-                                       }
-                               break;
-                               }
-
-                       case EOB_ACT_CONTINUE_SCAN:
-                               (yy_c_buf_p) =
-                                       (yytext_ptr) + yy_amount_of_matched_text;
-
-                               yy_current_state = yy_get_previous_state(  );
-
-                               yy_cp = (yy_c_buf_p);
-                               yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-                               goto yy_match;
-
-                       case EOB_ACT_LAST_MATCH:
-                               (yy_c_buf_p) =
-                               &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
-
-                               yy_current_state = yy_get_previous_state(  );
-
-                               yy_cp = (yy_c_buf_p);
-                               yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-                               goto yy_find_action;
-                       }
-               break;
-               }
-
-       default:
-               YY_FATAL_ERROR(
-                       "fatal flex scanner internal error--no action found" );
-       } /* end of action switch */
-               } /* end of scanning one token */
-} /* end of xbt_ddt_parse_lex */
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- *     EOB_ACT_LAST_MATCH -
- *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- *     EOB_ACT_END_OF_FILE - end of file
- */
-static int yy_get_next_buffer (void)
-{
-       register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
-       register char *source = (yytext_ptr);
-       register int number_to_move, i;
-       int ret_val;
-
-       if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
-               YY_FATAL_ERROR(
-               "fatal flex scanner internal error--end of buffer missed" );
-
-       if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
-               { /* Don't try to fill the buffer, so this is an EOF. */
-               if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
-                       {
-                       /* We matched a single character, the EOB, so
-                        * treat this as a final EOF.
-                        */
-                       return EOB_ACT_END_OF_FILE;
-                       }
-
-               else
-                       {
-                       /* We matched some text prior to the EOB, first
-                        * process it.
-                        */
-                       return EOB_ACT_LAST_MATCH;
-                       }
-               }
-
-       /* Try to read more data. */
-
-       /* First move last chars to start of buffer. */
-       number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
-
-       for ( i = 0; i < number_to_move; ++i )
-               *(dest++) = *(source++);
-
-       if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
-               /* don't do the read, it's not guaranteed to return an EOF,
-                * just force an EOF
-                */
-               YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
-
-       else
-               {
-                       int num_to_read =
-                       YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
-
-               while ( num_to_read <= 0 )
-                       { /* Not enough room in the buffer - grow it. */
-
-                       /* just a shorter name for the current buffer */
-                       YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
-
-                       int yy_c_buf_p_offset =
-                               (int) ((yy_c_buf_p) - b->yy_ch_buf);
-
-                       if ( b->yy_is_our_buffer )
-                               {
-                               int new_size = b->yy_buf_size * 2;
-
-                               if ( new_size <= 0 )
-                                       b->yy_buf_size += b->yy_buf_size / 8;
-                               else
-                                       b->yy_buf_size *= 2;
-
-                               b->yy_ch_buf = (char *)
-                                       /* Include room in for 2 EOB chars. */
-                                       xbt_ddt_parse_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
-                               }
-                       else
-                               /* Can't grow it, we don't own it. */
-                               b->yy_ch_buf = 0;
-
-                       if ( ! b->yy_ch_buf )
-                               YY_FATAL_ERROR(
-                               "fatal error - scanner input buffer overflow" );
-
-                       (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
-
-                       num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
-                                               number_to_move - 1;
-
-                       }
-
-               if ( num_to_read > YY_READ_BUF_SIZE )
-                       num_to_read = YY_READ_BUF_SIZE;
-
-               /* Read in more data. */
-               YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-                       (yy_n_chars), (size_t) num_to_read );
-
-               YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-               }
-
-       if ( (yy_n_chars) == 0 )
-               {
-               if ( number_to_move == YY_MORE_ADJ )
-                       {
-                       ret_val = EOB_ACT_END_OF_FILE;
-                       xbt_ddt_parse_restart(xbt_ddt_parse_in  );
-                       }
-
-               else
-                       {
-                       ret_val = EOB_ACT_LAST_MATCH;
-                       YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
-                               YY_BUFFER_EOF_PENDING;
-                       }
-               }
-
-       else
-               ret_val = EOB_ACT_CONTINUE_SCAN;
-
-       if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
-               /* Extend the array by 50%, plus the number we really need. */
-               yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
-               YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) xbt_ddt_parse_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
-               if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
-                       YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
-       }
-
-       (yy_n_chars) += number_to_move;
-       YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
-       YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
-
-       (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
-
-       return ret_val;
-}
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
-    static yy_state_type yy_get_previous_state (void)
-{
-       register yy_state_type yy_current_state;
-       register char *yy_cp;
-    
-       yy_current_state = (yy_start);
-
-       for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
-               {
-               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
-               if ( yy_accept[yy_current_state] )
-                       {
-                       (yy_last_accepting_state) = yy_current_state;
-                       (yy_last_accepting_cpos) = yy_cp;
-                       }
-               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-                       {
-                       yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 61 )
-                               yy_c = yy_meta[(unsigned int) yy_c];
-                       }
-               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-               }
-
-       return yy_current_state;
-}
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- *     next_state = yy_try_NUL_trans( current_state );
- */
-    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
-{
-       register int yy_is_jam;
-       register char *yy_cp = (yy_c_buf_p);
-
-       register YY_CHAR yy_c = 1;
-       if ( yy_accept[yy_current_state] )
-               {
-               (yy_last_accepting_state) = yy_current_state;
-               (yy_last_accepting_cpos) = yy_cp;
-               }
-       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-               {
-               yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 61 )
-                       yy_c = yy_meta[(unsigned int) yy_c];
-               }
-       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 60);
-
-       return yy_is_jam ? 0 : yy_current_state;
-}
-
-    static void yyunput (int c, register char * yy_bp )
-{
-       register char *yy_cp;
-    
-    yy_cp = (yy_c_buf_p);
-
-       /* undo effects of setting up xbt_ddt_parse_text */
-       *yy_cp = (yy_hold_char);
-
-       if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
-               { /* need to shift things up to make room */
-               /* +2 for EOB chars. */
-               register int number_to_move = (yy_n_chars) + 2;
-               register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
-                                       YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
-               register char *source =
-                               &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
-
-               while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
-                       *--dest = *--source;
-
-               yy_cp += (int) (dest - source);
-               yy_bp += (int) (dest - source);
-               YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
-                       (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
-
-               if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
-                       YY_FATAL_ERROR( "flex scanner push-back overflow" );
-               }
-
-       *--yy_cp = (char) c;
-
-       (yytext_ptr) = yy_bp;
-       (yy_hold_char) = *yy_cp;
-       (yy_c_buf_p) = yy_cp;
-}
-
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
-    static int yyinput (void)
-#else
-    static int input  (void)
-#endif
-
-{
-       int c;
-    
-       *(yy_c_buf_p) = (yy_hold_char);
-
-       if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
-               {
-               /* yy_c_buf_p now points to the character we want to return.
-                * If this occurs *before* the EOB characters, then it's a
-                * valid NUL; if not, then we've hit the end of the buffer.
-                */
-               if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
-                       /* This was really a NUL. */
-                       *(yy_c_buf_p) = '\0';
-
-               else
-                       { /* need more input */
-                       int offset = (yy_c_buf_p) - (yytext_ptr);
-                       ++(yy_c_buf_p);
-
-                       switch ( yy_get_next_buffer(  ) )
-                               {
-                               case EOB_ACT_LAST_MATCH:
-                                       /* This happens because yy_g_n_b()
-                                        * sees that we've accumulated a
-                                        * token and flags that we need to
-                                        * try matching the token before
-                                        * proceeding.  But for input(),
-                                        * there's no matching to consider.
-                                        * So convert the EOB_ACT_LAST_MATCH
-                                        * to EOB_ACT_END_OF_FILE.
-                                        */
-
-                                       /* Reset buffer status. */
-                                       xbt_ddt_parse_restart(xbt_ddt_parse_in );
-
-                                       /*FALLTHROUGH*/
-
-                               case EOB_ACT_END_OF_FILE:
-                                       {
-                                       if ( xbt_ddt_parse_wrap( ) )
-                                               return EOF;
-
-                                       if ( ! (yy_did_buffer_switch_on_eof) )
-                                               YY_NEW_FILE;
-#ifdef __cplusplus
-                                       return yyinput();
-#else
-                                       return input();
-#endif
-                                       }
-
-                               case EOB_ACT_CONTINUE_SCAN:
-                                       (yy_c_buf_p) = (yytext_ptr) + offset;
-                                       break;
-                               }
-                       }
-               }
-
-       c = *(unsigned char *) (yy_c_buf_p);    /* cast for 8-bit char's */
-       *(yy_c_buf_p) = '\0';   /* preserve xbt_ddt_parse_text */
-       (yy_hold_char) = *++(yy_c_buf_p);
-
-       return c;
-}
-#endif /* ifndef YY_NO_INPUT */
-
-/** Immediately switch to a different input stream.
- * @param input_file A readable stream.
- * 
- * @note This function does not reset the start condition to @c INITIAL .
- */
-    void xbt_ddt_parse_restart  (FILE * input_file )
-{
-    
-       if ( ! YY_CURRENT_BUFFER ){
-        xbt_ddt_parse_ensure_buffer_stack ();
-               YY_CURRENT_BUFFER_LVALUE =
-            xbt_ddt_parse__create_buffer(xbt_ddt_parse_in,YY_BUF_SIZE );
-       }
-
-       xbt_ddt_parse__init_buffer(YY_CURRENT_BUFFER,input_file );
-       xbt_ddt_parse__load_buffer_state( );
-}
-
-/** Switch to a different input buffer.
- * @param new_buffer The new input buffer.
- * 
- */
-    void xbt_ddt_parse__switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
-{
-    
-       /* TODO. We should be able to replace this entire function body
-        * with
-        *              xbt_ddt_parse_pop_buffer_state();
-        *              xbt_ddt_parse_push_buffer_state(new_buffer);
-     */
-       xbt_ddt_parse_ensure_buffer_stack ();
-       if ( YY_CURRENT_BUFFER == new_buffer )
-               return;
-
-       if ( YY_CURRENT_BUFFER )
-               {
-               /* Flush out information for old buffer. */
-               *(yy_c_buf_p) = (yy_hold_char);
-               YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
-               YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-               }
-
-       YY_CURRENT_BUFFER_LVALUE = new_buffer;
-       xbt_ddt_parse__load_buffer_state( );
-
-       /* We don't actually know whether we did this switch during
-        * EOF (xbt_ddt_parse_wrap()) processing, but the only time this flag
-        * is looked at is after xbt_ddt_parse_wrap() is called, so it's safe
-        * to go ahead and always set it.
-        */
-       (yy_did_buffer_switch_on_eof) = 1;
-}
-
-static void xbt_ddt_parse__load_buffer_state  (void)
-{
-       (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-       (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
-       xbt_ddt_parse_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
-       (yy_hold_char) = *(yy_c_buf_p);
-}
-
-/** Allocate and initialize an input buffer state.
- * @param file A readable stream.
- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
- * 
- * @return the allocated buffer state.
- */
-    YY_BUFFER_STATE xbt_ddt_parse__create_buffer  (FILE * file, int  size )
-{
-       YY_BUFFER_STATE b;
-    
-       b = (YY_BUFFER_STATE) xbt_ddt_parse_alloc(sizeof( struct yy_buffer_state )  );
-       if ( ! b )
-               YY_FATAL_ERROR( "out of dynamic memory in xbt_ddt_parse__create_buffer()" );
-
-       b->yy_buf_size = size;
-
-       /* yy_ch_buf has to be 2 characters longer than the size given because
-        * we need to put in 2 end-of-buffer characters.
-        */
-       b->yy_ch_buf = (char *) xbt_ddt_parse_alloc(b->yy_buf_size + 2  );
-       if ( ! b->yy_ch_buf )
-               YY_FATAL_ERROR( "out of dynamic memory in xbt_ddt_parse__create_buffer()" );
-
-       b->yy_is_our_buffer = 1;
-
-       xbt_ddt_parse__init_buffer(b,file );
-
-       return b;
-}
-
-/** Destroy the buffer.
- * @param b a buffer created with xbt_ddt_parse__create_buffer()
- * 
- */
-    void xbt_ddt_parse__delete_buffer (YY_BUFFER_STATE  b )
-{
-    
-       if ( ! b )
-               return;
-
-       if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
-               YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
-
-       if ( b->yy_is_our_buffer )
-               xbt_ddt_parse_free((void *) b->yy_ch_buf  );
-
-       xbt_ddt_parse_free((void *) b  );
-}
-
-#ifndef __cplusplus
-extern int isatty (int );
-#endif /* __cplusplus */
-    
-/* Initializes or reinitializes a buffer.
- * This function is sometimes called more than once on the same buffer,
- * such as during a xbt_ddt_parse_restart() or at EOF.
- */
-    static void xbt_ddt_parse__init_buffer  (YY_BUFFER_STATE  b, FILE * file )
-
-{
-       int oerrno = errno;
-    
-       xbt_ddt_parse__flush_buffer(b );
-
-       b->yy_input_file = file;
-       b->yy_fill_buffer = 1;
-
-    /* If b is the current buffer, then xbt_ddt_parse__init_buffer was _probably_
-     * called from xbt_ddt_parse_restart() or through yy_get_next_buffer.
-     * In that case, we don't want to reset the lineno or column.
-     */
-    if (b != YY_CURRENT_BUFFER){
-        b->yy_bs_lineno = 1;
-        b->yy_bs_column = 0;
-    }
-
-        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-    
-       errno = oerrno;
-}
-
-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
- * 
- */
-    void xbt_ddt_parse__flush_buffer (YY_BUFFER_STATE  b )
-{
-       if ( ! b )
-               return;
-
-       b->yy_n_chars = 0;
-
-       /* We always need two end-of-buffer characters.  The first causes
-        * a transition to the end-of-buffer state.  The second causes
-        * a jam in that state.
-        */
-       b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
-       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
-       b->yy_buf_pos = &b->yy_ch_buf[0];
-
-       b->yy_at_bol = 1;
-       b->yy_buffer_status = YY_BUFFER_NEW;
-
-       if ( b == YY_CURRENT_BUFFER )
-               xbt_ddt_parse__load_buffer_state( );
-}
-
-/** Pushes the new state onto the stack. The new state becomes
- *  the current state. This function will allocate the stack
- *  if necessary.
- *  @param new_buffer The new state.
- *  
- */
-void xbt_ddt_parse_push_buffer_state (YY_BUFFER_STATE new_buffer )
-{
-       if (new_buffer == NULL)
-               return;
-
-       xbt_ddt_parse_ensure_buffer_stack();
-
-       /* This block is copied from xbt_ddt_parse__switch_to_buffer. */
-       if ( YY_CURRENT_BUFFER )
-               {
-               /* Flush out information for old buffer. */
-               *(yy_c_buf_p) = (yy_hold_char);
-               YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
-               YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-               }
-
-       /* Only push if top exists. Otherwise, replace top. */
-       if (YY_CURRENT_BUFFER)
-               (yy_buffer_stack_top)++;
-       YY_CURRENT_BUFFER_LVALUE = new_buffer;
-
-       /* copied from xbt_ddt_parse__switch_to_buffer. */
-       xbt_ddt_parse__load_buffer_state( );
-       (yy_did_buffer_switch_on_eof) = 1;
-}
-
-/** Removes and deletes the top of the stack, if present.
- *  The next element becomes the new top.
- *  
- */
-void xbt_ddt_parse_pop_buffer_state (void)
-{
-       if (!YY_CURRENT_BUFFER)
-               return;
-
-       xbt_ddt_parse__delete_buffer(YY_CURRENT_BUFFER );
-       YY_CURRENT_BUFFER_LVALUE = NULL;
-       if ((yy_buffer_stack_top) > 0)
-               --(yy_buffer_stack_top);
-
-       if (YY_CURRENT_BUFFER) {
-               xbt_ddt_parse__load_buffer_state( );
-               (yy_did_buffer_switch_on_eof) = 1;
-       }
-}
-
-/* Allocates the stack if it does not exist.
- *  Guarantees space for at least one push.
- */
-static void xbt_ddt_parse_ensure_buffer_stack (void)
-{
-       int num_to_alloc;
-    
-       if (!(yy_buffer_stack)) {
-
-               /* First allocation is just for 2 elements, since we don't know if this
-                * scanner will even need a stack. We use 2 instead of 1 to avoid an
-                * immediate realloc on the next call.
-         */
-               num_to_alloc = 1;
-               (yy_buffer_stack) = (struct yy_buffer_state**)xbt_ddt_parse_alloc
-                                                               (num_to_alloc * sizeof(struct yy_buffer_state*)
-                                                               );
-               if ( ! (yy_buffer_stack) )
-                       YY_FATAL_ERROR( "out of dynamic memory in xbt_ddt_parse_ensure_buffer_stack()" );
-                                                                 
-               memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-                               
-               (yy_buffer_stack_max) = num_to_alloc;
-               (yy_buffer_stack_top) = 0;
-               return;
-       }
-
-       if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
-
-               /* Increase the buffer to prepare for a possible push. */
-               int grow_size = 8 /* arbitrary grow size */;
-
-               num_to_alloc = (yy_buffer_stack_max) + grow_size;
-               (yy_buffer_stack) = (struct yy_buffer_state**)xbt_ddt_parse_realloc
-                                                               ((yy_buffer_stack),
-                                                               num_to_alloc * sizeof(struct yy_buffer_state*)
-                                                               );
-               if ( ! (yy_buffer_stack) )
-                       YY_FATAL_ERROR( "out of dynamic memory in xbt_ddt_parse_ensure_buffer_stack()" );
-
-               /* zero only the new slots.*/
-               memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
-               (yy_buffer_stack_max) = num_to_alloc;
-       }
-}
-
-/** Setup the input buffer state to scan directly from a user-specified character buffer.
- * @param base the character buffer
- * @param size the size in bytes of the character buffer
- * 
- * @return the newly allocated buffer state object. 
- */
-YY_BUFFER_STATE xbt_ddt_parse__scan_buffer  (char * base, yy_size_t  size )
-{
-       YY_BUFFER_STATE b;
-    
-       if ( size < 2 ||
-            base[size-2] != YY_END_OF_BUFFER_CHAR ||
-            base[size-1] != YY_END_OF_BUFFER_CHAR )
-               /* They forgot to leave room for the EOB's. */
-               return 0;
-
-       b = (YY_BUFFER_STATE) xbt_ddt_parse_alloc(sizeof( struct yy_buffer_state )  );
-       if ( ! b )
-               YY_FATAL_ERROR( "out of dynamic memory in xbt_ddt_parse__scan_buffer()" );
-
-       b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
-       b->yy_buf_pos = b->yy_ch_buf = base;
-       b->yy_is_our_buffer = 0;
-       b->yy_input_file = 0;
-       b->yy_n_chars = b->yy_buf_size;
-       b->yy_is_interactive = 0;
-       b->yy_at_bol = 1;
-       b->yy_fill_buffer = 0;
-       b->yy_buffer_status = YY_BUFFER_NEW;
-
-       xbt_ddt_parse__switch_to_buffer(b  );
-
-       return b;
-}
-
-/** Setup the input buffer state to scan a string. The next call to xbt_ddt_parse_lex() will
- * scan from a @e copy of @a str.
- * @param yystr a NUL-terminated string to scan
- * 
- * @return the newly allocated buffer state object.
- * @note If you want to scan bytes that may contain NUL values, then use
- *       xbt_ddt_parse__scan_bytes() instead.
- */
-YY_BUFFER_STATE xbt_ddt_parse__scan_string (yyconst char * yystr )
-{
-    
-       return xbt_ddt_parse__scan_bytes(yystr,strlen(yystr) );
-}
-
-/** Setup the input buffer state to scan the given bytes. The next call to xbt_ddt_parse_lex() will
- * scan from a @e copy of @a bytes.
- * @param yybytes the byte buffer to scan
- * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
- * 
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE xbt_ddt_parse__scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
-{
-       YY_BUFFER_STATE b;
-       char *buf;
-       yy_size_t n;
-       int i;
-    
-       /* Get memory for full buffer, including space for trailing EOB's. */
-       n = _yybytes_len + 2;
-       buf = (char *) xbt_ddt_parse_alloc(n  );
-       if ( ! buf )
-               YY_FATAL_ERROR( "out of dynamic memory in xbt_ddt_parse__scan_bytes()" );
-
-       for ( i = 0; i < _yybytes_len; ++i )
-               buf[i] = yybytes[i];
-
-       buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
-
-       b = xbt_ddt_parse__scan_buffer(buf,n );
-       if ( ! b )
-               YY_FATAL_ERROR( "bad buffer in xbt_ddt_parse__scan_bytes()" );
-
-       /* It's okay to grow etc. this buffer, and we should throw it
-        * away when we're done.
-        */
-       b->yy_is_our_buffer = 1;
-
-       return b;
-}
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-static void yy_fatal_error (yyconst char* msg )
-{
-       (void) fprintf( stderr, "%s\n", msg );
-       exit( YY_EXIT_FAILURE );
-}
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
-       do \
-               { \
-               /* Undo effects of setting up xbt_ddt_parse_text. */ \
-        int yyless_macro_arg = (n); \
-        YY_LESS_LINENO(yyless_macro_arg);\
-               xbt_ddt_parse_text[xbt_ddt_parse_leng] = (yy_hold_char); \
-               (yy_c_buf_p) = xbt_ddt_parse_text + yyless_macro_arg; \
-               (yy_hold_char) = *(yy_c_buf_p); \
-               *(yy_c_buf_p) = '\0'; \
-               xbt_ddt_parse_leng = yyless_macro_arg; \
-               } \
-       while ( 0 )
-
-/* Accessor  methods (get/set functions) to struct members. */
-
-/** Get the current line number.
- * 
- */
-int xbt_ddt_parse_get_lineno  (void)
-{
-        
-    return xbt_ddt_parse_lineno;
-}
-
-/** Get the input stream.
- * 
- */
-FILE *xbt_ddt_parse_get_in  (void)
-{
-        return xbt_ddt_parse_in;
-}
-
-/** Get the output stream.
- * 
- */
-FILE *xbt_ddt_parse_get_out  (void)
-{
-        return xbt_ddt_parse_out;
-}
-
-/** Get the length of the current token.
- * 
- */
-int xbt_ddt_parse_get_leng  (void)
-{
-        return xbt_ddt_parse_leng;
-}
-
-/** Get the current token.
- * 
- */
-
-char *xbt_ddt_parse_get_text  (void)
-{
-        return xbt_ddt_parse_text;
-}
-
-/** Set the current line number.
- * @param line_number
- * 
- */
-void xbt_ddt_parse_set_lineno (int  line_number )
-{
-    
-    xbt_ddt_parse_lineno = line_number;
-}
-
-/** Set the input stream. This does not discard the current
- * input buffer.
- * @param in_str A readable stream.
- * 
- * @see xbt_ddt_parse__switch_to_buffer
- */
-void xbt_ddt_parse_set_in (FILE *  in_str )
-{
-        xbt_ddt_parse_in = in_str ;
-}
-
-void xbt_ddt_parse_set_out (FILE *  out_str )
-{
-        xbt_ddt_parse_out = out_str ;
-}
-
-int xbt_ddt_parse_get_debug  (void)
-{
-        return xbt_ddt_parse__flex_debug;
-}
-
-void xbt_ddt_parse_set_debug (int  bdebug )
-{
-        xbt_ddt_parse__flex_debug = bdebug ;
-}
-
-static int yy_init_globals (void)
-{
-        /* Initialization is the same as for the non-reentrant scanner.
-     * This function is called from xbt_ddt_parse_lex_destroy(), so don't allocate here.
-     */
-
-    (yy_buffer_stack) = 0;
-    (yy_buffer_stack_top) = 0;
-    (yy_buffer_stack_max) = 0;
-    (yy_c_buf_p) = (char *) 0;
-    (yy_init) = 0;
-    (yy_start) = 0;
-
-/* Defined in main.c */
-#ifdef YY_STDINIT
-    xbt_ddt_parse_in = stdin;
-    xbt_ddt_parse_out = stdout;
-#else
-    xbt_ddt_parse_in = (FILE *) 0;
-    xbt_ddt_parse_out = (FILE *) 0;
-#endif
-
-    /* For future reference: Set errno on error, since we are called by
-     * xbt_ddt_parse_lex_init()
-     */
-    return 0;
-}
-
-/* xbt_ddt_parse_lex_destroy is for both reentrant and non-reentrant scanners. */
-int xbt_ddt_parse_lex_destroy  (void)
-{
-    
-    /* Pop the buffer stack, destroying each element. */
-       while(YY_CURRENT_BUFFER){
-               xbt_ddt_parse__delete_buffer(YY_CURRENT_BUFFER  );
-               YY_CURRENT_BUFFER_LVALUE = NULL;
-               xbt_ddt_parse_pop_buffer_state();
-       }
-
-       /* Destroy the stack itself. */
-       xbt_ddt_parse_free((yy_buffer_stack) );
-       (yy_buffer_stack) = NULL;
-
-    /* Reset the globals. This is important in a non-reentrant scanner so the next time
-     * xbt_ddt_parse_lex() is called, initialization will occur. */
-    yy_init_globals( );
-
-    return 0;
-}
-
-/*
- * Internal utility routines.
- */
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
-{
-       register int i;
-       for ( i = 0; i < n; ++i )
-               s1[i] = s2[i];
-}
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * s )
-{
-       register int n;
-       for ( n = 0; s[n]; ++n )
-               ;
-
-       return n;
-}
-#endif
-
-void *xbt_ddt_parse_alloc (yy_size_t  size )
-{
-       return (void *) malloc( size );
-}
-
-void *xbt_ddt_parse_realloc  (void * ptr, yy_size_t  size )
-{
-       /* The cast to (char *) in the following accommodates both
-        * implementations that use char* generic pointers, and those
-        * that use void* generic pointers.  It works with the latter
-        * because both ANSI C and C++ allow castless assignment from
-        * any pointer type to void*, and deal with argument conversions
-        * as though doing an assignment.
-        */
-       return (void *) realloc( (char *) ptr, size );
-}
-
-void xbt_ddt_parse_free (void * ptr )
-{
-       free( (char *) ptr );   /* see xbt_ddt_parse_realloc() for (char *) cast */
-}
-
-#define YYTABLES_NAME "yytables"
-
-/* {space}+                { return(TOKEN_SPACE);} */
-
-void xbt_ddt_parse_dump(void) {
-  switch(xbt_ddt_parse_tok_num) {
-  case XBT_DDT_PARSE_TOKEN_LA      : {printf("TOKEN_LA ");break;}
-  case XBT_DDT_PARSE_TOKEN_RA      : {printf("TOKEN_RA ");break;}
-  case XBT_DDT_PARSE_TOKEN_WORD    : {printf("TOKEN_WORD ");break;}
-    /*  case XBT_DDT_PARSE_TOKEN_SPACE   : {printf("TOKEN_SPACE ");break;}*/
-    /*  case XBT_DDT_PARSE_TOKEN_COMMENT : {printf("TOKEN_COMMENT ");break;}*/
-  case XBT_DDT_PARSE_TOKEN_NEWLINE : {printf("TOKEN_NEWLINE\n");return;}
-  case XBT_DDT_PARSE_TOKEN_EMPTY : {printf("TOKEN_EMPTY\n");return;}
-  default             : {printf("Unknown token %d\n", xbt_ddt_parse_tok_num);return;}
-  }
-  printf("-->%s<-- [line %d, pos %d]\n",xbt_ddt_parse_text,xbt_ddt_parse_line_pos,xbt_ddt_parse_char_pos);
-  return;
-}
-
-int xbt_ddt_parse_lex_n_dump(void) {
-  xbt_ddt_parse_tok_num = xbt_ddt_parse_lex();
-  /*  xbt_ddt_parse_char_pos += strlen(xbt_ddt_parse_text);*/
-  return(xbt_ddt_parse_tok_num);
-}
-
-void  xbt_ddt_parse_pointer_init(const char *file) {
-  xbt_ddt_file_to_parse = fopen(file,"r");
-  xbt_ddt_input_buffer = xbt_ddt_parse__create_buffer(xbt_ddt_file_to_parse,10 );
-  xbt_ddt_parse__switch_to_buffer(xbt_ddt_input_buffer);
-
-  xbt_ddt_parse_line_pos = 1;
-  xbt_ddt_parse_char_pos = 0;
-  xbt_ddt_parse_col_pos = 0;
-  xbt_ddt_parse_tok_num = 0;
-}
-
-void  xbt_ddt_parse_pointer_close(void) {
-  xbt_ddt_parse__delete_buffer(xbt_ddt_input_buffer);
-  fclose(xbt_ddt_file_to_parse);
-
-  xbt_ddt_parse_line_pos = 1;
-  xbt_ddt_parse_char_pos = 0;
-  xbt_ddt_parse_tok_num = 0;
-}
-
-void  xbt_ddt_parse_pointer_string_init(const char *string_to_parse) {
-  xbt_ddt_input_buffer = xbt_ddt_parse__scan_string (string_to_parse);
-  definition = string_to_parse;
-  xbt_ddt_parse__switch_to_buffer(xbt_ddt_input_buffer);
-
-  xbt_ddt_parse_line_pos = 1;
-  xbt_ddt_parse_char_pos = 0;
-  xbt_ddt_parse_tok_num = 0;
-}
-
-void  xbt_ddt_parse_pointer_string_close(void) {
-  xbt_ddt_parse__delete_buffer(xbt_ddt_input_buffer);
-
-  xbt_ddt_parse_line_pos = 1;
-  xbt_ddt_parse_char_pos = 0;
-  xbt_ddt_parse_tok_num = 0;
-
-  if (0)
-    yyunput('\0',NULL); /* fake a use of this function to calm gcc down */
-}
-
-/* Local variables:*/
-/* mode: c */
-/* End: */
-
diff --git a/src/xbt/datadesc/ddt_parse.yy.h b/src/xbt/datadesc/ddt_parse.yy.h
deleted file mode 100644 (file)
index ff15725..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/* ddt_parse.h -- automatic parsing of data structures                      */
-
-/* Copyright (c) 2004, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-typedef enum {
-  XBT_DDT_PARSE_TOKEN_EMPTY = 0,
-  XBT_DDT_PARSE_TOKEN_LA = 512,        /* { 'A' for the french "accolade" since there is a name conflict in english (braket/brace) */
-  XBT_DDT_PARSE_TOKEN_RA,      /* } */
-  XBT_DDT_PARSE_TOKEN_LB,      /* [ */
-  XBT_DDT_PARSE_TOKEN_RB,      /* ] */
-  XBT_DDT_PARSE_TOKEN_LP,      /* ( */
-  XBT_DDT_PARSE_TOKEN_RP,      /* ) */
-  XBT_DDT_PARSE_TOKEN_WORD,
-  XBT_DDT_PARSE_TOKEN_SPACE,
-  XBT_DDT_PARSE_TOKEN_COMMENT,
-  XBT_DDT_PARSE_TOKEN_ANNOTATE,
-  XBT_DDT_PARSE_TOKEN_NEWLINE,
-  XBT_DDT_PARSE_TOKEN_STAR,
-  XBT_DDT_PARSE_TOKEN_SEMI_COLON,
-  XBT_DDT_PARSE_TOKEN_COLON,   /* impossible since the macro think that it's a arg separator. 
-                                   But handle anyway for the *vicious* calling xbt_ddt_parse manually */
-  XBT_DDT_PARSE_TOKEN_ERROR
-} xbt_ddt_parse_token_t;
-
-#define XBT_DDT_PARSE_MAX_STR_CONST 4048
-
-extern int xbt_ddt_parse_line_pos;
-extern int xbt_ddt_parse_col_pos;
-extern int xbt_ddt_parse_char_pos;
-extern int xbt_ddt_parse_tok_num;
-
-void xbt_ddt_parse_dump(void);
-int xbt_ddt_parse_lex_n_dump(void);
-void xbt_ddt_parse_pointer_init(const char *file);
-void xbt_ddt_parse_pointer_close(void);
-void xbt_ddt_parse_pointer_string_init(const char *string_to_parse);
-void xbt_ddt_parse_pointer_string_close(void);
-
-/* prototypes of the functions offered by flex */
-int xbt_ddt_parse_lex(void);
-int xbt_ddt_parse_get_lineno(void);
-FILE *xbt_ddt_parse_get_in(void);
-FILE *xbt_ddt_parse_get_out(void);
-int xbt_ddt_parse_get_leng(void);
-char *xbt_ddt_parse_get_text(void);
-void xbt_ddt_parse_set_lineno(int line_number);
-void xbt_ddt_parse_set_in(FILE * in_str);
-void xbt_ddt_parse_set_out(FILE * out_str);
-int xbt_ddt_parse_get_debug(void);
-void xbt_ddt_parse_set_debug(int bdebug);
-int xbt_ddt_parse_lex_destroy(void);
-
-#define PARSE_ERROR(...)                                                \
-  PARSE_ERROR_(__VA_ARGS__,                                             \
-               xbt_ddt_parse_line_pos, xbt_ddt_parse_col_pos, definition)
-#define PARSE_ERROR_(fmt, ...)                           \
-  do {                                                   \
-    XBT_ERROR(fmt " at %d:%d of :\n%s", __VA_ARGS__);   \
-    xbt_abort();                                         \
-  } while (0)
diff --git a/src/xbt/datadesc/ddt_parse.yy.l b/src/xbt/datadesc/ddt_parse.yy.l
deleted file mode 100644 (file)
index a3a7493..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-/* datadesc/ddt_parse -- automatic parsing of data structures */
-
-/* Copyright (c) 2004 Arnaud Legrand, Martin Quinson. All rights reserved.  */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-%option noyywrap
-%{
-#include "xbt/datadesc/datadesc_private.h"
-#include "xbt/datadesc/ddt_parse.yy.h"
-#include <string.h>
-  YY_BUFFER_STATE xbt_ddt_input_buffer;
-  FILE *xbt_ddt_file_to_parse;
-
-  int xbt_ddt_parse_line_pos = 1;
-  int xbt_ddt_parse_col_pos = 0;
-  int xbt_ddt_parse_char_pos = 0;
-  int xbt_ddt_parse_tok_num = 0;
-  const char *definition;
-  XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ddt_lexer,xbt_ddt_parse,"The crude internals of the lexer used for type parsing");
-#define SHOW_WHERE XBT_DEBUG("%d:%d (char #%d): seen '%s'", xbt_ddt_parse_line_pos,xbt_ddt_parse_col_pos,xbt_ddt_parse_char_pos,yytext)
-%}
-
-%x annotate comment foo
-space           [ \t]
-letter          [A-Za-z._-]
-digit           [0-9]
-
-%%
-   int comment_caller=0;
-   int annotate_caller=0;
-
-"//"[^\n]*
-
-"/*g"{space}* { /****************** ANNOTATION ************************/
-  XBT_DEBUG("Begin annotation");
-  annotate_caller = INITIAL;
-  xbt_ddt_parse_char_pos+= strlen(yytext);
-  xbt_ddt_parse_col_pos+= strlen(yytext);
-  BEGIN(annotate);
-}
-<foo>"/*g"{space}* { /* trim annotation */
-  XBT_DEBUG("Begin annotation");
-  annotate_caller = foo;
-  xbt_ddt_parse_char_pos+= strlen(yytext);
-  xbt_ddt_parse_col_pos+= strlen(yytext);
-  BEGIN(annotate);
-}
-
-<annotate>{space}*"g*/" {
-  XBT_DEBUG("End annotation");
-  xbt_ddt_parse_char_pos+= strlen(yytext);
-  xbt_ddt_parse_col_pos+= strlen(yytext);
-  BEGIN(annotate_caller);
-}
-
-<annotate>"*/" {
-  PARSE_ERROR("``/*g'' construct closed by a regular ``*/''");
-}
-<annotate>\n  {
-  PARSE_ERROR("Type annotation cannot spread over several lines");
-}
-
-<annotate>.* { /* eat the rest */
-  xbt_ddt_parse_char_pos+= strlen(yytext);
-  xbt_ddt_parse_col_pos+= strlen(yytext);
-  return XBT_DDT_PARSE_TOKEN_ANNOTATE;
-}
-
-"/*[^g]"   { /****************** COMMENTS ************************/
-  /* constructs like : */
-    /*g [string] g*/ 
-  /* are not comments but size annotations */
-  comment_caller = INITIAL;
-  BEGIN(comment);
-}
-
-<foo>"/*[^g]"    {
-  comment_caller = foo;
-  BEGIN(comment);
-}
-
-<comment>[^*\n]*      { /* eat anything that's not a '*' */
-}
-<comment>"*"+[^*/\n]* { /* eat up '*'s not followed by '/'s */
-}
-<comment>\n             {
-  ++xbt_ddt_parse_line_pos;
-  xbt_ddt_parse_col_pos=0;
-  xbt_ddt_parse_char_pos++;
-}
-<comment>"*"+"/" {
-  xbt_ddt_parse_char_pos+= strlen(yytext);
-  xbt_ddt_parse_col_pos+= strlen(yytext);
-  BEGIN(comment_caller);
-}
-
-({letter}|{digit})* {  /****************** STATEMENTS ************************/
-  xbt_ddt_parse_char_pos += strlen(yytext);
-  xbt_ddt_parse_col_pos += strlen(yytext);
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_WORD);
-}
-"{"  { 
-  xbt_ddt_parse_char_pos++; 
-  xbt_ddt_parse_col_pos++; 
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_LA);
-}
-"}" {
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_RA);
-}
-"["  { 
-  xbt_ddt_parse_char_pos++; 
-  xbt_ddt_parse_col_pos++; 
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_LB);
-}
-"]" {
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_RB);
-}
-"("  { 
-  xbt_ddt_parse_char_pos++; 
-  xbt_ddt_parse_col_pos++; 
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_LP);
-}
-")" {
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_RP);
-}
-"*" {
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_STAR);
-}
-";" {
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_SEMI_COLON);
-}
-"," { 
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-  return(XBT_DDT_PARSE_TOKEN_COLON);
-}
-"\n" {
- xbt_ddt_parse_line_pos++; 
- xbt_ddt_parse_char_pos++;
- xbt_ddt_parse_col_pos=0;
-  SHOW_WHERE;
-}
-. { 
-  xbt_ddt_parse_char_pos++;
-  xbt_ddt_parse_col_pos++;
-  SHOW_WHERE;
-}
-%%
-/* {space}+                { return(TOKEN_SPACE);} */
-
-void xbt_ddt_parse_dump(void) {
-  switch(xbt_ddt_parse_tok_num) {
-  case XBT_DDT_PARSE_TOKEN_LA      : {printf("TOKEN_LA ");break;}
-  case XBT_DDT_PARSE_TOKEN_RA      : {printf("TOKEN_RA ");break;}
-  case XBT_DDT_PARSE_TOKEN_WORD    : {printf("TOKEN_WORD ");break;}
-    /*  case XBT_DDT_PARSE_TOKEN_SPACE   : {printf("TOKEN_SPACE ");break;}*/
-    /*  case XBT_DDT_PARSE_TOKEN_COMMENT : {printf("TOKEN_COMMENT ");break;}*/
-  case XBT_DDT_PARSE_TOKEN_NEWLINE : {printf("TOKEN_NEWLINE\n");return;}
-  case XBT_DDT_PARSE_TOKEN_EMPTY : {printf("TOKEN_EMPTY\n");return;}
-  default             : {printf("Unknown token %d\n", xbt_ddt_parse_tok_num);return;}
-  }
-  printf("-->%s<-- [line %d, pos %d]\n",yytext,xbt_ddt_parse_line_pos,xbt_ddt_parse_char_pos);
-  return;
-}
-
-int xbt_ddt_parse_lex_n_dump(void) {
-  xbt_ddt_parse_tok_num = xbt_ddt_parse_lex();
-  /*  xbt_ddt_parse_char_pos += strlen(yytext);*/
-  return(xbt_ddt_parse_tok_num);
-}
-
-void  xbt_ddt_parse_pointer_init(const char *file) {
-  xbt_ddt_file_to_parse = fopen(file,"r");
-  xbt_ddt_input_buffer = yy_create_buffer( xbt_ddt_file_to_parse, 10 );
-  yy_switch_to_buffer(xbt_ddt_input_buffer);
-
-  xbt_ddt_parse_line_pos = 1;
-  xbt_ddt_parse_char_pos = 0;
-  xbt_ddt_parse_col_pos = 0;
-  xbt_ddt_parse_tok_num = 0;
-}
-
-void  xbt_ddt_parse_pointer_close(void) {
-  yy_delete_buffer(xbt_ddt_input_buffer);
-  fclose(xbt_ddt_file_to_parse);
-
-  xbt_ddt_parse_line_pos = 1;
-  xbt_ddt_parse_char_pos = 0;
-  xbt_ddt_parse_tok_num = 0;
-}
-
-
-void  xbt_ddt_parse_pointer_string_init(const char *string_to_parse) {
-  xbt_ddt_input_buffer = yy_scan_string (string_to_parse);
-  definition = string_to_parse;
-  yy_switch_to_buffer(xbt_ddt_input_buffer);
-
-  xbt_ddt_parse_line_pos = 1;
-  xbt_ddt_parse_char_pos = 0;
-  xbt_ddt_parse_tok_num = 0;
-}
-
-void  xbt_ddt_parse_pointer_string_close(void) {
-  yy_delete_buffer(xbt_ddt_input_buffer);
-
-  xbt_ddt_parse_line_pos = 1;
-  xbt_ddt_parse_char_pos = 0;
-  xbt_ddt_parse_tok_num = 0;
-
-  if (0)
-    yyunput('\0',NULL); /* fake a use of this function to calm gcc down */
-}
-
-/* Local variables:*/
-/* mode: c */
-/* End: */
index 21dd9c4..0fa7f41 100644 (file)
 #include "xbt/dynar.h"
 #include <sys/types.h>
 
-/* IMPLEMENTATION NOTE ON SYNCHRONIZATION: every functions which name is prefixed by _
- * assumes that the dynar is already locked if we have to.
- * Other functions (public ones) check for this.
- */
-
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dyn, xbt, "Dynamic arrays");
 
-static XBT_INLINE void _dynar_lock(xbt_dynar_t dynar)
-{
-  if (dynar->mutex)
-    xbt_mutex_acquire(dynar->mutex);
-}
-
-static XBT_INLINE void _dynar_unlock(xbt_dynar_t dynar)
-{
-  if (dynar->mutex)
-    xbt_mutex_release(dynar->mutex);
-}
-
 static XBT_INLINE void _sanity_check_dynar(xbt_dynar_t dynar)
 {
   xbt_assert(dynar, "dynar is NULL");
@@ -45,7 +28,6 @@ static XBT_INLINE void _sanity_check_idx(int idx)
 static XBT_INLINE void _check_inbound_idx(xbt_dynar_t dynar, int idx)
 {
   if (idx < 0 || idx >= dynar->used) {
-    _dynar_unlock(dynar);
     THROWF(bound_error, idx,
            "dynar is not that long. You asked %d, but it's only %lu long",
            (int) (idx), (unsigned long) dynar->used);
@@ -56,7 +38,6 @@ static XBT_INLINE void _check_sloppy_inbound_idx(xbt_dynar_t dynar,
                                                  int idx)
 {
   if (idx > dynar->used) {
-    _dynar_unlock(dynar);
     THROWF(bound_error, idx,
            "dynar is not that long. You asked %d, but it's only %lu long (could have been equal to it)",
            (int) (idx), (unsigned long) dynar->used);
@@ -66,13 +47,10 @@ static XBT_INLINE void _check_sloppy_inbound_idx(xbt_dynar_t dynar,
 static XBT_INLINE void _check_populated_dynar(xbt_dynar_t dynar)
 {
   if (dynar->used == 0) {
-    _dynar_unlock(dynar);
     THROWF(bound_error, 0, "dynar %p is empty", dynar);
   }
 }
 
-static void _dynar_map(const xbt_dynar_t dynar, void_f_pvoid_t const op);
-
 static XBT_INLINE
 void _xbt_dynar_resize(xbt_dynar_t dynar, unsigned long new_size)
 {
@@ -125,35 +103,6 @@ _xbt_dynar_put_elm(const xbt_dynar_t dynar,
   memcpy(elm, src, elmsize);
 }
 
-static XBT_INLINE
-    void
-_xbt_dynar_remove_at(xbt_dynar_t const dynar,
-                     const unsigned long idx, void *const object)
-{
-
-  unsigned long nb_shift;
-  unsigned long offset;
-
-  _sanity_check_dynar(dynar);
-  _check_inbound_idx(dynar, idx);
-
-  if (object) {
-    _xbt_dynar_get_elm(object, dynar, idx);
-  } else if (dynar->free_f) {
-    dynar->free_f(_xbt_dynar_elm(dynar, idx));
-  }
-
-  nb_shift = dynar->used - 1 - idx;
-
-  if (nb_shift) {
-    offset = nb_shift * dynar->elmsize;
-    memmove(_xbt_dynar_elm(dynar, idx), _xbt_dynar_elm(dynar, idx + 1),
-            offset);
-  }
-
-  dynar->used--;
-}
-
 void xbt_dynar_dump(xbt_dynar_t dynar)
 {
   XBT_INFO("Dynar dump: size=%lu; used=%lu; elmsize=%lu; data=%p; free_f=%p",
@@ -181,25 +130,10 @@ xbt_dynar_new(const unsigned long elmsize, void_f_pvoid_t const free_f)
   dynar->elmsize = elmsize;
   dynar->data = NULL;
   dynar->free_f = free_f;
-  dynar->mutex = NULL;
 
   return dynar;
 }
 
-/** @brief Creates a synchronized dynar.
- *
- * Just like #xbt_dynar_new, but each access to the structure will be protected by a mutex
- *
- */
-xbt_dynar_t
-xbt_dynar_new_sync(const unsigned long elmsize,
-                   void_f_pvoid_t const free_f)
-{
-  xbt_dynar_t res = xbt_dynar_new(elmsize, free_f);
-  res->mutex = xbt_mutex_init();
-  return res;
-}
-
 /** @brief Destructor of the structure not touching to the content
  *
  * \param dynar poor victim
@@ -212,8 +146,6 @@ void xbt_dynar_free_container(xbt_dynar_t * dynar)
   if (dynar && *dynar) {
     xbt_dynar_t d = *dynar;
     free(d->data);
-    if (d->mutex)
-      xbt_mutex_destroy(d->mutex);
     free(d);
     *dynar = NULL;
   }
@@ -225,17 +157,13 @@ void xbt_dynar_free_container(xbt_dynar_t * dynar)
  */
 XBT_INLINE void xbt_dynar_reset(xbt_dynar_t const dynar)
 {
-  _dynar_lock(dynar);
-
   _sanity_check_dynar(dynar);
 
   XBT_DEBUG("Reset the dynar %p", (void *) dynar);
   if (dynar->free_f) {
-    _dynar_map(dynar, dynar->free_f);
+    xbt_dynar_map(dynar, dynar->free_f);
   }
   dynar->used = 0;
-
-  _dynar_unlock(dynar);
 }
 
 /** @brief Merge dynar d2 into d1
@@ -277,9 +205,7 @@ void xbt_dynar_merge(xbt_dynar_t *d1, xbt_dynar_t *d2)
  */
 void xbt_dynar_shrink(xbt_dynar_t dynar, int empty_slots_wanted)
 {
-  _dynar_lock(dynar);
   _xbt_dynar_resize(dynar, dynar->used + empty_slots_wanted);
-  _dynar_unlock(dynar);
 }
 
 /** @brief Destructor
@@ -333,12 +259,10 @@ XBT_INLINE void
 xbt_dynar_get_cpy(const xbt_dynar_t dynar,
                   const unsigned long idx, void *const dst)
 {
-  _dynar_lock(dynar);
   _sanity_check_dynar(dynar);
   _check_inbound_idx(dynar, idx);
 
   _xbt_dynar_get_elm(dst, dynar, idx);
-  _dynar_unlock(dynar);
 }
 
 /** @brief Retrieve a pointer to the Nth element of a dynar.
@@ -355,18 +279,15 @@ XBT_INLINE void *xbt_dynar_get_ptr(const xbt_dynar_t dynar,
 {
 
   void *res;
-  _dynar_lock(dynar);
   _sanity_check_dynar(dynar);
   _check_inbound_idx(dynar, idx);
 
   res = _xbt_dynar_elm(dynar, idx);
-  _dynar_unlock(dynar);
   return res;
 }
 
-/* not synchronized */
-static XBT_INLINE void *_xbt_dynar_set_at_ptr(const xbt_dynar_t dynar,
-                                              const unsigned long idx)
+XBT_INLINE void *xbt_dynar_set_at_ptr(const xbt_dynar_t dynar,
+                                      const unsigned long idx)
 {
   _sanity_check_dynar(dynar);
 
@@ -381,23 +302,6 @@ static XBT_INLINE void *_xbt_dynar_set_at_ptr(const xbt_dynar_t dynar,
   return _xbt_dynar_elm(dynar, idx);
 }
 
-XBT_INLINE void *xbt_dynar_set_at_ptr(const xbt_dynar_t dynar,
-                                      const unsigned long idx)
-{
-  void *res;
-  _dynar_lock(dynar);
-  res = _xbt_dynar_set_at_ptr(dynar, idx);
-  _dynar_unlock(dynar);
-  return res;
-}
-
-static void XBT_INLINE          /* not synchronized */
-_xbt_dynar_set(xbt_dynar_t dynar,
-               const unsigned long idx, const void *const src)
-{
-  memcpy(_xbt_dynar_set_at_ptr(dynar, idx), src, dynar->elmsize);
-}
-
 /** @brief Set the Nth element of a dynar (expanded if needed). Previous value at this position is NOT freed
  *
  * \param dynar information dealer
@@ -410,9 +314,7 @@ XBT_INLINE void xbt_dynar_set(xbt_dynar_t dynar, const int idx,
                               const void *const src)
 {
 
-  _dynar_lock(dynar);
-  _xbt_dynar_set(dynar, idx, src);
-  _dynar_unlock(dynar);
+  memcpy(xbt_dynar_set_at_ptr(dynar, idx), src, dynar->elmsize);
 }
 
 /** @brief Set the Nth element of a dynar (expanded if needed). Previous value is freed
@@ -429,7 +331,6 @@ void
 xbt_dynar_replace(xbt_dynar_t dynar,
                   const unsigned long idx, const void *const object)
 {
-  _dynar_lock(dynar);
   _sanity_check_dynar(dynar);
 
   if (idx < dynar->used && dynar->free_f) {
@@ -438,12 +339,15 @@ xbt_dynar_replace(xbt_dynar_t dynar,
     dynar->free_f(old_object);
   }
 
-  _xbt_dynar_set(dynar, idx, object);
-  _dynar_unlock(dynar);
+  xbt_dynar_set(dynar, idx, object);
 }
 
-static XBT_INLINE void *_xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar,
-                                                 const unsigned long idx)
+/** @brief Make room for a new element, and return a pointer to it
+ *
+ * You can then use regular affectation to set its value instead of relying
+ * on the slow memcpy. This is what xbt_dynar_insert_at_as() does.
+ */
+void *xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar, const int idx)
 {
   void *res;
   unsigned long old_used;
@@ -470,21 +374,6 @@ static XBT_INLINE void *_xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar,
   return res;
 }
 
-/** @brief Make room for a new element, and return a pointer to it
- *
- * You can then use regular affectation to set its value instead of relying
- * on the slow memcpy. This is what xbt_dynar_insert_at_as() does.
- */
-void *xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar, const int idx)
-{
-  void *res;
-
-  _dynar_lock(dynar);
-  res = _xbt_dynar_insert_at_ptr(dynar, idx);
-  _dynar_unlock(dynar);
-  return res;
-}
-
 /** @brief Set the Nth dynar's element, expanding the dynar and sliding the previous values to the right
  *
  * Set the Nth element of a dynar, expanding the dynar if needed, and
@@ -496,10 +385,8 @@ xbt_dynar_insert_at(xbt_dynar_t const dynar,
                     const int idx, const void *const src)
 {
 
-  _dynar_lock(dynar);
   /* checks done in xbt_dynar_insert_at_ptr */
-  memcpy(_xbt_dynar_insert_at_ptr(dynar, idx), src, dynar->elmsize);
-  _dynar_unlock(dynar);
+  memcpy(xbt_dynar_insert_at_ptr(dynar, idx), src, dynar->elmsize);
 }
 
 /** @brief Remove the Nth dynar's element, sliding the previous values to the left
@@ -515,10 +402,27 @@ void
 xbt_dynar_remove_at(xbt_dynar_t const dynar,
                     const int idx, void *const object)
 {
+  unsigned long nb_shift;
+  unsigned long offset;
 
-  _dynar_lock(dynar);
-  _xbt_dynar_remove_at(dynar, idx, object);
-  _dynar_unlock(dynar);
+  _sanity_check_dynar(dynar);
+  _check_inbound_idx(dynar, idx);
+
+  if (object) {
+    _xbt_dynar_get_elm(object, dynar, idx);
+  } else if (dynar->free_f) {
+    dynar->free_f(_xbt_dynar_elm(dynar, idx));
+  }
+
+  nb_shift = dynar->used - 1 - idx;
+
+  if (nb_shift) {
+    offset = nb_shift * dynar->elmsize;
+    memmove(_xbt_dynar_elm(dynar, idx), _xbt_dynar_elm(dynar, idx + 1),
+            offset);
+  }
+
+  dynar->used--;
 }
 
 /** @brief Returns the position of the element in the dynar
@@ -531,14 +435,11 @@ unsigned int xbt_dynar_search(xbt_dynar_t const dynar, void *const elem)
 {
   unsigned long it;
 
-  _dynar_lock(dynar);
   for (it = 0; it < dynar->used; it++)
     if (!memcmp(_xbt_dynar_elm(dynar, it), elem, dynar->elmsize)) {
-      _dynar_unlock(dynar);
       return it;
     }
 
-  _dynar_unlock(dynar);
   THROWF(not_found_error, 0, "Element %p not part of dynar %p", elem,
          dynar);
 }
@@ -552,14 +453,11 @@ signed int xbt_dynar_search_or_negative(xbt_dynar_t const dynar, void *const ele
 {
   unsigned long it;
 
-  _dynar_lock(dynar);
   for (it = 0; it < dynar->used; it++)
     if (!memcmp(_xbt_dynar_elm(dynar, it), elem, dynar->elmsize)) {
-      _dynar_unlock(dynar);
       return it;
     }
 
-  _dynar_unlock(dynar);
   return -1;
 }
 
@@ -589,26 +487,19 @@ int xbt_dynar_member(xbt_dynar_t const dynar, void *const elem)
  */
 XBT_INLINE void *xbt_dynar_push_ptr(xbt_dynar_t const dynar)
 {
-  void *res;
-
   /* we have to inline xbt_dynar_insert_at_ptr here to make sure that
      dynar->used don't change between reading it and getting the lock
      within xbt_dynar_insert_at_ptr */
-  _dynar_lock(dynar);
-  res = _xbt_dynar_insert_at_ptr(dynar, dynar->used);
-  _dynar_unlock(dynar);
-  return res;
+  return xbt_dynar_insert_at_ptr(dynar, dynar->used);
 }
 
 /** @brief Add an element at the end of the dynar */
 XBT_INLINE void xbt_dynar_push(xbt_dynar_t const dynar,
                                const void *const src)
 {
-  _dynar_lock(dynar);
   /* checks done in xbt_dynar_insert_at_ptr */
-  memcpy(_xbt_dynar_insert_at_ptr(dynar, dynar->used), src,
+  memcpy(xbt_dynar_insert_at_ptr(dynar, dynar->used), src,
          dynar->elmsize);
-  _dynar_unlock(dynar);
 }
 
 /** @brief Mark the last dynar's element as unused and return a pointer to it.
@@ -618,15 +509,10 @@ XBT_INLINE void xbt_dynar_push(xbt_dynar_t const dynar,
  */
 XBT_INLINE void *xbt_dynar_pop_ptr(xbt_dynar_t const dynar)
 {
-  void *res;
-
-  _dynar_lock(dynar);
   _check_populated_dynar(dynar);
   XBT_DEBUG("Pop %p", (void *) dynar);
   dynar->used--;
-  res = _xbt_dynar_elm(dynar, dynar->used);
-  _dynar_unlock(dynar);
-  return res;
+  return _xbt_dynar_elm(dynar, dynar->used);
 }
 
 /** @brief Get and remove the last element of the dynar */
@@ -635,9 +521,7 @@ XBT_INLINE void xbt_dynar_pop(xbt_dynar_t const dynar, void *const dst)
 
   /* sanity checks done by remove_at */
   XBT_DEBUG("Pop %p", (void *) dynar);
-  _dynar_lock(dynar);
-  _xbt_dynar_remove_at(dynar, dynar->used - 1, dst);
-  _dynar_unlock(dynar);
+  xbt_dynar_remove_at(dynar, dynar->used - 1, dst);
 }
 
 /** @brief Add an element at the begining of the dynar.
@@ -663,38 +547,25 @@ XBT_INLINE void xbt_dynar_shift(xbt_dynar_t const dynar, void *const dst)
   xbt_dynar_remove_at(dynar, 0, dst);
 }
 
-static void _dynar_map(const xbt_dynar_t dynar, void_f_pvoid_t const op)
-{
-  char *const data = (char *) dynar->data;
-  const unsigned long elmsize = dynar->elmsize;
-  const unsigned long used = dynar->used;
-  unsigned long i;
-
-  for (i = 0; i < used; i++) {
-    char* elm = (char*) data + i * elmsize;
-    op(elm);
-  }
-}
-
 /** @brief Apply a function to each member of a dynar
  *
  * The mapped function may change the value of the element itself,
  * but should not mess with the structure of the dynar.
- *
- * If the dynar is synchronized, it is locked during the whole map
- * operation, so make sure your function don't call any function
- * from xbt_dynar_* on it, or you'll get a deadlock.
  */
 XBT_INLINE void xbt_dynar_map(const xbt_dynar_t dynar,
                               void_f_pvoid_t const op)
 {
+  char *const data = (char *) dynar->data;
+  const unsigned long elmsize = dynar->elmsize;
+  const unsigned long used = dynar->used;
+  unsigned long i;
 
   _sanity_check_dynar(dynar);
-  _dynar_lock(dynar);
-
-  _dynar_map(dynar, op);
 
-  _dynar_unlock(dynar);
+  for (i = 0; i < used; i++) {
+    char* elm = (char*) data + i * elmsize;
+    op(elm);
+  }
 }
 
 
@@ -706,18 +577,7 @@ XBT_INLINE void xbt_dynar_cursor_rm(xbt_dynar_t dynar,
                                     unsigned int *const cursor)
 {
 
-  _xbt_dynar_remove_at(dynar, (*cursor)--, NULL);
-}
-
-/** @brief Unlocks a synchronized dynar when you want to break the traversal
- *
- * This function must be used if you <tt>break</tt> the
- * xbt_dynar_foreach loop, but shouldn't be called at the end of a
- * regular traversal reaching the end of the elements
- */
-XBT_INLINE void xbt_dynar_cursor_unlock(xbt_dynar_t dynar)
-{
-  _dynar_unlock(dynar);
+  xbt_dynar_remove_at(dynar, (*cursor)--, NULL);
 }
 
 /** @brief Sorts a dynar according to the function <tt>compar_fn</tt>
@@ -731,15 +591,11 @@ XBT_INLINE void xbt_dynar_cursor_unlock(xbt_dynar_t dynar)
 XBT_INLINE void xbt_dynar_sort(xbt_dynar_t dynar,
                                int_f_cpvoid_cpvoid_t compar_fn)
 {
-
-  _dynar_lock(dynar);
-
 #ifdef HAVE_MERGESORT
   mergesort(dynar->data, dynar->used, dynar->elmsize, compar_fn);
 #else
   qsort(dynar->data, dynar->used, dynar->elmsize, compar_fn);
 #endif
-  _dynar_unlock(dynar);
 }
 
 /** @brief Sorts a dynar according to their color assuming elements can have only three colors.
@@ -757,7 +613,6 @@ XBT_INLINE void xbt_dynar_sort(xbt_dynar_t dynar,
 XBT_PUBLIC(void) xbt_dynar_three_way_partition(xbt_dynar_t const dynar,
                                                int_f_pvoid_t color)
 {
-  _dynar_lock(dynar);
   unsigned long int i;
   unsigned long int p = -1;
   unsigned long int q = dynar->used;
@@ -785,7 +640,6 @@ XBT_PUBLIC(void) xbt_dynar_three_way_partition(xbt_dynar_t const dynar,
       }
     }
   }
-  _dynar_unlock(dynar);
   xbt_free(tmp);
 }
 
@@ -799,8 +653,6 @@ XBT_INLINE void * xbt_dynar_to_array (xbt_dynar_t dynar)
   xbt_dynar_shrink(dynar, 1);
   memset(xbt_dynar_push_ptr(dynar), 0, dynar->elmsize);
   res = dynar->data;
-  if (dynar->mutex)
-    xbt_mutex_destroy(dynar->mutex);
   free(dynar);
   return res;
 }
@@ -1350,57 +1202,4 @@ XBT_TEST_UNIT("string", test_dynar_string, "Dynars of strings")
   }
   xbt_dynar_free(&d);           /* end_of_doxygen */
 }
-
-
-/*******************************************************************************/
-/*******************************************************************************/
-/*******************************************************************************/
-#include "xbt/synchro.h"
-static void pusher_f(void *a)
-{
-  xbt_dynar_t d = (xbt_dynar_t) a;
-  int i;
-  for (i = 0; i < 500; i++) {
-    xbt_dynar_push(d, &i);
-  }
-}
-
-static void poper_f(void *a)
-{
-  xbt_dynar_t d = (xbt_dynar_t) a;
-  volatile int i;
-  int data;
-  xbt_ex_t e;
-
-  for (i = 0; i < 500; i++) {
-    TRY {
-      xbt_dynar_pop(d, &data);
-    }
-    CATCH(e) {
-      if (e.category == bound_error) {
-        xbt_ex_free(e);
-        i--;
-      } else {
-        RETHROW;
-      }
-    }
-  }
-}
-
-
-XBT_TEST_UNIT("synchronized int", test_dynar_sync_int, "Synchronized dynars of integers")
-{
-  /* Vars_decl [doxygen cruft] */
-  xbt_dynar_t d;
-  xbt_thread_t pusher, poper;
-
-  xbt_test_add("==== Have a pusher and a popper on the dynar");
-  d = xbt_dynar_new_sync(sizeof(int), NULL);
-  pusher = xbt_thread_create("pusher", pusher_f, d, 0 /*not joinable */ );
-  poper = xbt_thread_create("poper", poper_f, d, 0 /*not joinable */ );
-  xbt_thread_join(pusher);
-  xbt_thread_join(poper);
-  xbt_dynar_free(&d);
-}
-
 #endif                          /* SIMGRID_TEST */
index 1d15d7a..1017b5f 100644 (file)
 #include "portable.h"           /* execinfo when available */
 #include "xbt/ex.h"
 #include "xbt/str.h"
-#include "xbt/module.h"         /* xbt_binary_name */
 #include "xbt_modinter.h"       /* backtrace initialization headers */
-#include "xbt/synchro.h"        /* xbt_thread_self */
 
-#include "gras/Virtu/virtu_interface.h" /* gras_os_myname */
 #include "xbt/ex_interface.h"
 
 #undef HAVE_BACKTRACE
@@ -142,7 +139,7 @@ void xbt_ex_display(xbt_ex_t * e)
           "** SimGrid: UNCAUGHT EXCEPTION received on %s(%d): category: %s; value: %d\n"
           "** %s\n"
           "** Thrown by %s()%s\n",
-          gras_os_myname(), xbt_getpid(),
+          xbt_binary_name, xbt_getpid(),
           xbt_ex_catname(e->category), e->value, e->msg,
           e->procname, thrower ? thrower : " in this process");
   XBT_CRITICAL("%s", e->msg);
@@ -319,7 +316,8 @@ XBT_TEST_UNIT("variables", test_variables, "variable value preservation")
   xbt_ex_t ex;
   int r1;
   int _XBT_GNUC_UNUSED r2;
-  volatile int v1, v2;
+  int v1;
+  volatile int v2;
 
   r1 = r2 = v1 = v2 = 1234;
   TRY {
index f1ebf47..ca34f34 100644 (file)
@@ -1,6 +1,6 @@
 /* ex -- exception handling                                                 */
 /* This file is to loaded in any location defining exception handlers       */
-/* (such as context.c) or in gras transport layer, to exchange them.        */
+/* (such as context.c), to exchange them.        */
 
 /* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
  * All rights reserved.                                                     */
index 7a425f6..841aebe 100644 (file)
@@ -331,6 +331,42 @@ int xbt_fifo_is_in(xbt_fifo_t f, void *content)
   return 0;
 }
 
+/**
+ * @brief Search the given element in the fifo using a comparison function
+ *
+ * This function allows to search an item with a user provided function instead
+ * of the pointer comparison used elsewhere in this module. Assume for example that you have a fifo of
+ * strings. You cannot use xbt_fifo_remove() to remove, say, "TOTO" from it because internally, xbt_fifo_remove()
+ * will do something like "if (item->content == "toto"), then remove it". And the pointer to the item content
+ * and the pointer to "toto" will never match. As a solution, the current function provides a way to search elements
+ * that are semanticaly equivalent instead of only syntaxically. So, removing "Toto" from a fifo can be
+ * achieved this way:
+ *
+ *  @verbatim
+int my_comparison_function(void *searched, void *seen) {
+  return !strcmp(searched, seen);
+}
+
+  xbt_fifo_remove_item(fifo,
+                       xbt_fifo_search_item(fifo, my_comparison_function, "Toto"));
+@endverbatim
+ *
+ * \param f a fifo list
+ * \param cmp_fun the comparison function. Prototype: void *a,void *b -> int. Semantic: returns true iff a=b
+ * @param closure the element to search. It will be provided as first argument to each call of cmp_fun
+ * \return the first item matching the comparison function, or NULL if no such item exists
+ */
+xbt_fifo_item_t xbt_fifo_search_item(xbt_fifo_t f, int_f_pvoid_pvoid_t cmp_fun, void *closure) {
+  xbt_fifo_item_t item = xbt_fifo_get_first_item(f);
+  while (item) {
+    if (cmp_fun(closure, item->content))
+      return item;
+    item = item->next;
+  }
+  return NULL;
+
+}
+
 /**
  * \param f a list
  * \return a table with the objects stored in \a f.
index d26166b..f024b08 100644 (file)
@@ -11,6 +11,7 @@
 #include "heap_private.h"
 
 #include <stdio.h>
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_heap, xbt, "Heap");
 
 static void xbt_heap_max_heapify(xbt_heap_t H);
 static void xbt_heap_increase_key(xbt_heap_t H, int i);
@@ -103,6 +104,7 @@ void xbt_heap_push(xbt_heap_t H, void *content, double key)
   item->key = key;
   item->content = content;
   xbt_heap_increase_key(H, count - 1);
+  XBT_DEBUG("Heap has now %d elements and max elem is %g",xbt_heap_size(H),xbt_heap_maxkey(H));
   return;
 }
 
@@ -121,6 +123,8 @@ void *xbt_heap_pop(xbt_heap_t H)
   int size = H->size;
   void *max;
 
+  XBT_DEBUG("Heap has %d elements before extraction and max elem was %g",xbt_heap_size(H),xbt_heap_maxkey(H));
+
   if (H->count == 0)
     return NULL;
 
@@ -152,6 +156,8 @@ void *xbt_heap_pop(xbt_heap_t H)
  */
 void *xbt_heap_remove(xbt_heap_t H, int i)
 {
+  XBT_DEBUG("Heap has %d elements: extracting element %d",xbt_heap_size(H),i);
+
   if ((i < 0) || (i > H->count - 1))
     return NULL;
   /* put element i at head */
index 25d3f4e..0736592 100644 (file)
@@ -100,7 +100,7 @@ controlled by the <i>priority</i> concept (which should maybe be renamed to
 <i>severity</i>).
 
 Empirically, the user can specify that he wants to see every debugging message
-of GRAS while only being interested into the messages at level "error" or
+of MSG while only being interested into the messages at level "error" or
 higher about the XBT internals.
 
 \subsection log_app 1.3 Message appenders
@@ -187,7 +187,7 @@ format. This is usually a good idea.
 Here is an example of the most basic type of macro. This is a logging
 request with priority <i>warning</i>.
 
-<code>XBT_CLOG(MyCat, gras_log_priority_warning, "Values are: %d and '%s'", 5,
+<code>XBT_CLOG(MyCat, xbt_log_priority_warning, "Values are: %d and '%s'", 5,
 "oops");</code>
 
 A logging request is said to be enabled if its priority is higher than or
@@ -281,7 +281,7 @@ int main() {
 Although rarely done, it is possible to configure the logs during
 program initialization by invoking the xbt_log_control_set() method
 manually. A more conventional way is to use the --log command line
-argument. xbt_init() (called by MSG_init(), gras_init() and friends)
+argument. xbt_init() (called by MSG_init() and friends)
 checks and deals properly with such arguments.
 
 \subsection log_use_conf_thres 3.1.1 Threshold configuration
@@ -422,10 +422,10 @@ requires an a single comparison of a static variable to a constant.
 
 There is also compile time constant, \ref XBT_LOG_STATIC_THRESHOLD, which
 causes all logging requests with a lower priority to be optimized to 0 cost
-by the compiler. By setting it to gras_log_priority_infinite, all logging
+by the compiler. By setting it to xbt_log_priority_infinite, all logging
 requests are statically disabled at compile time and cost nothing. Released executables
 <i>might</i>  be compiled with (note that it will prevent users to debug their problems)
-\verbatim-DXBT_LOG_STATIC_THRESHOLD=gras_log_priority_infinite\endverbatim
+\verbatim-DXBT_LOG_STATIC_THRESHOLD=xbt_log_priority_infinite\endverbatim
 
 Compiling with the \verbatim-DNLOG\endverbatim option disables all logging
 requests at compilation time while the \verbatim-DNDEBUG\endverbatim disables
@@ -526,25 +526,6 @@ static void xbt_log_connect_categories(void)
   /* Connect our log channels: that must be done manually under windows */
   /* Also permit that they are correctly listed by xbt_log_help_categories() */
 
-  /* amok */
-  XBT_LOG_CONNECT(amok);
-  XBT_LOG_CONNECT(amok_bw);
-  XBT_LOG_CONNECT(amok_bw_sat);
-  XBT_LOG_CONNECT(amok_pm);
-
-  /* gras */
-  XBT_LOG_CONNECT(gras);
-  XBT_LOG_CONNECT(gras_modules);
-  XBT_LOG_CONNECT(gras_msg);
-  XBT_LOG_CONNECT(gras_msg_read);
-  XBT_LOG_CONNECT(gras_msg_rpc);
-  XBT_LOG_CONNECT(gras_timer);
-  XBT_LOG_CONNECT(gras_trp);
-  XBT_LOG_CONNECT(gras_trp_file);
-  XBT_LOG_CONNECT(gras_virtu);
-  XBT_LOG_CONNECT(gras_virtu_emul);
-  XBT_LOG_CONNECT(gras_virtu_process);
-
   /* xbt */
   XBT_LOG_CONNECT(xbt);
   XBT_LOG_CONNECT(graphxml_parse);
@@ -563,13 +544,6 @@ static void xbt_log_connect_categories(void)
 #ifdef XBT_USE_DEPRECATED
   XBT_LOG_CONNECT(xbt_dict_multi);
 #endif
-  XBT_LOG_CONNECT(xbt_ddt);
-  XBT_LOG_CONNECT(xbt_ddt_cbps);
-  XBT_LOG_CONNECT(xbt_ddt_convert);
-  XBT_LOG_CONNECT(xbt_ddt_create);
-  XBT_LOG_CONNECT(xbt_ddt_exchange);
-  XBT_LOG_CONNECT(xbt_ddt_parse);
-  XBT_LOG_CONNECT(xbt_ddt_lexer);
   XBT_LOG_CONNECT(xbt_dyn);
   XBT_LOG_CONNECT(xbt_ex);
   XBT_LOG_CONNECT(xbt_fifo);
@@ -583,16 +557,10 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(xbt_set);
   XBT_LOG_CONNECT(xbt_sync);
   XBT_LOG_CONNECT(xbt_sync_os);
-  XBT_LOG_CONNECT(xbt_trp);
-  XBT_LOG_CONNECT(xbt_trp_meas);
-  XBT_LOG_CONNECT(xbt_trp_tcp);
 
 #ifdef simgrid_EXPORTS
   /* The following categories are only defined in libsimgrid */
 
-  /* gras (sg) */
-  XBT_LOG_CONNECT(gras_trp_sg);
-
   /* bindings */
 #ifdef HAVE_LUA
   XBT_LOG_CONNECT(bindings);
index efec23c..9ffeac1 100644 (file)
@@ -13,9 +13,7 @@
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mm_diff, xbt,
                                 "Logging specific to mm_diff in mmalloc");
 
-extern char *xbt_binary_name;
-
-xbt_dynar_t mc_comparison_ignore;
+xbt_dynar_t mc_heap_comparison_ignore;
 xbt_dynar_t stacks_areas;
 
 static void heap_area_pair_free(heap_area_pair_t pair);
@@ -28,7 +26,7 @@ static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previ
 static void match_equals(xbt_dynar_t list, xbt_dynar_t *equals);
 
 static int in_mc_comparison_ignore(int block, int fragment);
-static size_t heap_comparison_ignore(void *address);
+static size_t heap_comparison_ignore_size(void *address);
 static void add_heap_equality(xbt_dynar_t *equals, void *a1, void *a2);
 static void remove_heap_equality(xbt_dynar_t *equals, int address, void *a);
 
@@ -117,11 +115,11 @@ void mmalloc_backtrace_display(void *addr){
 }
 
 
-void *s_heap, *heapbase1, *heapbase2;
-malloc_info *heapinfo1, *heapinfo2;
-size_t heaplimit, heapsize1, heapsize2;
+void *s_heap = NULL, *heapbase1 = NULL, *heapbase2 = NULL;
+malloc_info *heapinfo1 = NULL, *heapinfo2 = NULL;
+size_t heaplimit = 0, heapsize1 = 0, heapsize2 = 0;
 
-int ignore_done;
+int ignore_done = 0;
 
 int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stack1, xbt_dynar_t *stack2, xbt_dynar_t *equals){
 
@@ -154,27 +152,20 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
   void *addr_block1, *addr_block2, *addr_frag1, *addr_frag2;
   void *real_addr_block1, *real_addr_block2;
   char *stack_name;
-  int nb_block1=0, nb_frag1=0, nb_block2=0, nb_frag2=0;
 
   xbt_dynar_t previous = xbt_dynar_new(sizeof(heap_area_pair_t), heap_area_pair_free_voidp);
 
-  int equal, res_compare;
-
-  ignore_done = 0;
+  int equal, res_compare = 0;
 
   /* Init equal information */
   i1 = 1;
 
   while(i1<=heaplimit){
     if(heapinfo1[i1].type == 0){
-      if(heapinfo1[i1].busy_block.busy_size > 0)
-        nb_block1++;
       heapinfo1[i1].busy_block.equal_to = NULL;
     }
     if(heapinfo1[i1].type > 0){
       for(j1=0; j1 < (size_t) (BLOCKSIZE >> heapinfo1[i1].type); j1++){
-        if(heapinfo1[i1].busy_frag.frag_size[j1] > 0)
-          nb_frag1++;
         heapinfo1[i1].busy_frag.equal_to[j1] = NULL;
       }
     }
@@ -185,25 +176,16 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
 
   while(i2<=heaplimit){
     if(heapinfo2[i2].type == 0){
-      if(heapinfo2[i2].busy_block.busy_size > 0)
-        nb_block2++;
       heapinfo2[i2].busy_block.equal_to = NULL;
     }
     if(heapinfo2[i2].type > 0){
       for(j2=0; j2 < (size_t) (BLOCKSIZE >> heapinfo2[i2].type); j2++){
-        if(heapinfo2[i2].busy_frag.frag_size[j2] > 0)
-          nb_frag2++;
         heapinfo2[i2].busy_frag.equal_to[j2] = NULL;
       }
     }
     i2++; 
   }
 
-  if(nb_block1 != nb_block2 || nb_frag1 != nb_frag2){
-    XBT_DEBUG("Different number of busy blocks (%d - %d) or busy fragments (%d - %d)", nb_block1, nb_block2, nb_frag1, nb_frag2);
-    return 1;
-  }
-
   /* Check busy blocks*/
 
   i1 = 1;
@@ -228,6 +210,7 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
         stack->process_name = strdup(stack_name);
         stack->size = heapinfo1[i1].busy_block.busy_size;
         xbt_dynar_push(*stack1, &stack);
+        res_compare = -1;
       }
 
       if(heapinfo1[i1].busy_block.busy_size == 0){
@@ -242,6 +225,7 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
     
       i2 = 1;
       equal = 0;
+      res_compare = 0;
   
       /* Try first to associate to same block in the other heap */
       if(heapinfo2[current_block].type == heapinfo1[current_block].type){
@@ -259,20 +243,23 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
               stack->process_name = strdup(stack_name);
               stack->size = heapinfo2[current_block].busy_block.busy_size;
               xbt_dynar_push(*stack2, &stack);
+              res_compare = -1;
             }
         
             add_heap_area_pair(previous, current_block, -1, current_block, -1);
         
-            if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
-              if(in_mc_comparison_ignore((int)current_block, -1))
-                res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 1);
-              else
+            if(res_compare != -1){
+              if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){
+                if(in_mc_comparison_ignore((int)current_block, -1))
+                  res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 1);
+                else
+                  res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 0);
+              }else{
                 res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 0);
-            }else{
-              res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 0);
+              }
             }
         
-            if(res_compare == 0){
+            if(res_compare == 0 || res_compare == -1){
               for(k=1; k < heapinfo2[current_block].busy_block.size; k++)
                 heapinfo2[current_block+k].busy_block.equal_to = new_heap_area(i1, -1);
               for(k=1; k < heapinfo1[current_block].busy_block.size; k++)
@@ -301,6 +288,7 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
           stack->process_name = strdup(stack_name);
           stack->size = heapinfo2[i2].busy_block.busy_size;
           xbt_dynar_push(*stack2, &stack);
+          res_compare = -1;
         }
            
         if(i2 == current_block){
@@ -331,16 +319,18 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
         /* Comparison */
         add_heap_area_pair(previous, i1, -1, i2, -1);
         
-        if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
-          if(in_mc_comparison_ignore((int)i1, -1))
-            res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 1);
-          else
+        if(res_compare != -1){
+          if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){
+            if(in_mc_comparison_ignore((int)i1, -1))
+              res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 1);
+            else
+              res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 0);
+          }else{
             res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 0);
-        }else{
-          res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 0);
+          }
         }
         
-        if(res_compare == 0){
+        if(res_compare == 0 || res_compare == -1){
           for(k=1; k < heapinfo2[i2].busy_block.size; k++)
             heapinfo2[i2+k].busy_block.equal_to = new_heap_area(i1, -1);
           for(k=1; k < heapinfo1[i1].busy_block.size; k++)
@@ -388,7 +378,7 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
                
                 add_heap_area_pair(previous, current_block, current_fragment, current_block, current_fragment);
             
-                if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
+                if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){
                   if(in_mc_comparison_ignore((int)current_block, (int)current_fragment))
                     res_compare = compare_area(addr_frag1, addr_frag2, heapinfo1[current_block].busy_frag.frag_size[current_fragment], previous, 1);
                   else
@@ -435,7 +425,7 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
             /* Comparison */
             add_heap_area_pair(previous, i1, j1, i2, j2);
             
-            if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
+            if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){
               if(in_mc_comparison_ignore((int)i1, (int)j1))
                 res_compare = compare_area(addr_frag1, addr_frag2, heapinfo1[i1].busy_frag.frag_size[j1], previous, 1);
               else
@@ -480,6 +470,8 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
             mmalloc_backtrace_block_display((void*)heapinfo1, i);
           }
           nb_diff1++;
+        }else{
+          xbt_free(heapinfo1[i].busy_block.equal_to);
         }
       }
     }
@@ -494,6 +486,8 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
               mmalloc_backtrace_fragment_display((void*)heapinfo1, i, j);
             }
             nb_diff1++;
+          }else{
+            xbt_free(heapinfo1[i].busy_frag.equal_to[j]);
           }
         }
       }
@@ -516,6 +510,8 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
             mmalloc_backtrace_block_display((void*)heapinfo2, i);
           }
           nb_diff2++;
+        }else{
+          xbt_free(heapinfo2[i].busy_block.equal_to);
         }
       }
     }
@@ -530,6 +526,8 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
               mmalloc_backtrace_fragment_display((void*)heapinfo2, i, j);
             }
             nb_diff2++;
+          }else{
+            xbt_free(heapinfo2[i].busy_frag.equal_to[j]);
           }
         }
       }
@@ -540,7 +538,11 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
   XBT_DEBUG("Different blocks or fragments in heap2 : %d", nb_diff2);
 
   xbt_dynar_free(&previous);
+  ignore_done = 0;
+  s_heap = NULL, heapbase1 = NULL, heapbase2 = NULL;
+  heapinfo1 = NULL, heapinfo2 = NULL;
+  heaplimit = 0, heapsize1 = 0, heapsize2 = 0;
+
   return ((nb_diff1 > 0) || (nb_diff2 > 0));
 
 }
@@ -557,12 +559,12 @@ static int in_mc_comparison_ignore(int block, int fragment){
 
   unsigned int cursor = 0;
   int start = 0;
-  int end = xbt_dynar_length(mc_comparison_ignore) - 1;
-  mc_ignore_region_t region;
+  int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1;
+  mc_heap_ignore_region_t region;
 
   while(start <= end){
     cursor = (start + end) / 2;
-    region = (mc_ignore_region_t)xbt_dynar_get_as(mc_comparison_ignore, cursor, mc_ignore_region_t);
+    region = (mc_heap_ignore_region_t)xbt_dynar_get_as(mc_heap_comparison_ignore, cursor, mc_heap_ignore_region_t);
     if(region->block == block){
       if(region->fragment == fragment)
         return 1;
@@ -580,15 +582,15 @@ static int in_mc_comparison_ignore(int block, int fragment){
   return 0;
 }
 
-static size_t heap_comparison_ignore(void *address){
+static size_t heap_comparison_ignore_size(void *address){
   unsigned int cursor = 0;
   int start = 0;
-  int end = xbt_dynar_length(mc_comparison_ignore) - 1;
-  mc_ignore_region_t region;
+  int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1;
+  mc_heap_ignore_region_t region;
 
   while(start <= end){
     cursor = (start + end) / 2;
-    region = (mc_ignore_region_t)xbt_dynar_get_as(mc_comparison_ignore, cursor, mc_ignore_region_t);
+    region = (mc_heap_ignore_region_t)xbt_dynar_get_as(mc_heap_comparison_ignore, cursor, mc_heap_ignore_region_t);
     if(region->address == address)
       return region->size;
     if(region->address < address)
@@ -614,9 +616,9 @@ static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previ
     if(check_ignore){
 
       current_area1 = (char*)((xbt_mheap_t)s_heap)->heapbase + ((((char *)area1) + i) - (char *)heapbase1);
-      if((ignore1 = heap_comparison_ignore(current_area1)) > 0){
+      if((ignore1 = heap_comparison_ignore_size(current_area1)) > 0){
         current_area2 = (char*)((xbt_mheap_t)s_heap)->heapbase + ((((char *)area2) + i) - (char *)heapbase2);
-        if((ignore2 = heap_comparison_ignore(current_area2))  == ignore1){
+        if((ignore2 = heap_comparison_ignore_size(current_area2))  == ignore1){
           i = i + ignore2;
           ignore_done++;
           continue;
@@ -657,7 +659,7 @@ static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previ
 
           if(add_heap_area_pair(previous, block_pointed1, -1, block_pointed2, -1)){
 
-            if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
+            if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){
               if(in_mc_comparison_ignore(block_pointed1, -1))
                 res_compare = compare_area(addr_block_pointed1, addr_block_pointed2, heapinfo1[block_pointed1].busy_block.busy_size, previous, 1);
               else
@@ -685,7 +687,7 @@ static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previ
 
           if(add_heap_area_pair(previous, block_pointed1, frag_pointed1, block_pointed2, frag_pointed2)){
 
-            if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
+            if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){
               if(in_mc_comparison_ignore(block_pointed1, frag_pointed1))
                 res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous, 1);
               else
@@ -719,7 +721,7 @@ static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previ
 
           if(add_heap_area_pair(previous, block_pointed1, frag_pointed1, block_pointed2, frag_pointed2)){
 
-            if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
+            if(ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)){
               if(in_mc_comparison_ignore(block_pointed1, frag_pointed1))
                 res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous, 1);
               else
@@ -1008,12 +1010,12 @@ static char * is_stack(void *address){
 
 static void add_heap_equality(xbt_dynar_t *equals, void *a1, void *a2){
   
-  heap_equality_t he = xbt_new0(s_heap_equality_t, 1);
-  he->address1 = a1;
-  he->address2 = a2;
-
   if(xbt_dynar_is_empty(*equals)){
 
+    heap_equality_t he = xbt_new0(s_heap_equality_t, 1);
+    he->address1 = a1;
+    he->address2 = a2;
+
     xbt_dynar_insert_at(*equals, 0, &he);
   
   }else{
@@ -1039,6 +1041,10 @@ static void add_heap_equality(xbt_dynar_t *equals, void *a1, void *a2){
       if(current_equality->address1 > a1)
         end = cursor - 1; 
     }
+
+    heap_equality_t he = xbt_new0(s_heap_equality_t, 1);
+    he->address1 = a1;
+    he->address2 = a2;
   
     if(current_equality->address1 < a1)
       xbt_dynar_insert_at(*equals, cursor + 1 , &he);
index 96610ee..9ae3771 100644 (file)
@@ -7,7 +7,7 @@
 /* Redefine the classical malloc/free/realloc functions so that they fit well in the mmalloc framework */
 
 #include "mmprivate.h"
-#include "gras_config.h"
+#include "internal_config.h"
 #include <math.h>
 
 
index cd4ef27..de1942a 100644 (file)
@@ -339,3 +339,7 @@ void mmalloc_postexit(void)
   //  mmalloc_detach(__mmalloc_default_mdp);
   xbt_mheap_destroy_no_free(__mmalloc_default_mdp);
 }
+
+size_t mmalloc_get_chunks_used(xbt_mheap_t heap){
+  return ((struct mdesc *)heap)->heapstats.chunks_used;
+}
index 95c5db6..89d1ec6 100644 (file)
@@ -32,7 +32,7 @@ static void *align(struct mdesc *mdp, size_t size)
   result = mmorecore(mdp, size);
 
   /* if this reservation does not fill up the last block of our resa,
-   * complete the reservation by also asking for the full lastest block.
+   * complete the reservation by also asking for the full latest block.
    *
    * Also, the returned block is aligned to the end of block (but I've
    * no fucking idea of why, actually -- http://abstrusegoose.com/432 --
index c5d3524..e1175a7 100644 (file)
@@ -53,7 +53,7 @@ static size_t pagesize;
 
     It never returns NULL. Instead, it dies verbosely on errors. */
 
-void *mmorecore(struct mdesc *mdp, int size)
+void *mmorecore(struct mdesc *mdp, ssize_t size)
 {
   ssize_t test = 0;
   void *result; // please keep it uninitialized to track issues
index 4fce4c6..26feb7d 100644 (file)
@@ -263,16 +263,16 @@ struct mdesc {
 
 /* A default malloc descriptor for the single sbrk() managed region. */
 
-extern struct mdesc *__mmalloc_default_mdp;
+XBT_PUBLIC( struct mdesc ) *__mmalloc_default_mdp;
 
 /* Remap a mmalloc region that was previously mapped. */
 
-extern void *__mmalloc_remap_core(xbt_mheap_t mdp);
+XBT_PUBLIC( void *)__mmalloc_remap_core(xbt_mheap_t mdp);
 
 /*  Get core for the memory region specified by MDP, using SIZE as the
     amount to either add to or subtract from the existing region.  Works
     like sbrk(), but using mmap(). */
-extern void *mmorecore(struct mdesc *mdp, int size);
+XBT_PUBLIC( void *)mmorecore(struct mdesc *mdp, ssize_t size);
 
 /* Thread-safety (if the sem is already created)
  *
index d163965..6e0a728 100644 (file)
@@ -3,7 +3,7 @@
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
-#include "gras_config.h"
+#include "internal_config.h"
 #include <unistd.h>
 
 #ifndef _XBT_WIN32
@@ -484,7 +484,7 @@ static void xbt_parmap_busy_worker_wait(xbt_parmap_t parmap, unsigned round)
 #include "xbt/ex.h"
 #include "xbt/xbt_os_thread.h"
 #include "xbt/xbt_os_time.h"
-#include "gras_config.h"        /* HAVE_FUTEX_H */
+#include "internal_config.h"        /* HAVE_FUTEX_H */
 
 XBT_TEST_SUITE("parmap", "Parallel Map");
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(xbt_parmap_unit);
index 056fb82..33328fd 100644 (file)
@@ -3,7 +3,7 @@
 #include <string.h>
 #include "setset_private.h"
 #include "xbt/sysdep.h"
-#include "gras_config.h" /*_XBT_WIN32*/
+#include "internal_config.h" /*_XBT_WIN32*/
 
 /*The function ffs doesn't exist for windows*/
 #ifdef _XBT_WIN32
index dcee5ef..1a75c7f 100644 (file)
@@ -218,8 +218,9 @@ XBT_TEST_UNIT("basic", test_swag_basic, "Basic usage")
   xbt_swag_insert(obj2, setA);
   xbt_swag_insert(obj2, setB);
 
-  xbt_swag_remove(obj1, setB);
-  /*  xbt_swag_remove(obj2, setB); */
+  xbt_test_assert(xbt_swag_remove(NULL, setB) == NULL);
+  xbt_test_assert(xbt_swag_remove(obj1, setB) == obj1);
+  /*  xbt_test_assert(xbt_swag_remove(obj2, setB) == obj2); */
 
   xbt_test_add("Traverse set A");
   xbt_swag_foreach(obj, setA) {
index e19302c..651a2ff 100644 (file)
@@ -11,8 +11,8 @@
 #include "xbt/sysdep.h"
 #include "xbt/strbuff.h"
 #include "xbt/log_private.h"
-#include "gras/virtu.h"         /* gras_os_myname (KILLME) */
-#include "xbt/synchro.h"        /* xbt_thread_self_name */
+#include "simgrid/simix.h"      /* SIMIX_host_self_get_name */
+#include "surf/surf.h"
 #include <stdio.h>
 
 extern const char *xbt_log_priority_names[8];
@@ -126,7 +126,7 @@ static int xbt_log_layout_format_doit(xbt_log_layout_t l,
         show_string(xbt_log_priority_names[ev->priority]);
         break;
       case 'h':                 /* host name; SimGrid extension */
-        show_string(gras_os_myname());
+        show_string(SIMIX_host_self_get_name());
         break;
       case 't':                 /* thread name; LOG4J compliant */
         show_string(xbt_thread_self_name());
@@ -184,10 +184,10 @@ static int xbt_log_layout_format_doit(xbt_log_layout_t l,
 #endif
         break;
       case 'd':                 /* date; LOG4J compliant */
-        show_double(gras_os_time());
+        show_double(surf_get_clock());
         break;
       case 'r':                 /* application age; LOG4J compliant */
-        show_double(gras_os_time() - format_begin_of_time);
+        show_double(surf_get_clock() - format_begin_of_time);
         break;
       case 'm': {               /* user-provided message; LOG4J compliant */
         int len, sz;
@@ -223,7 +223,7 @@ xbt_log_layout_t xbt_log_layout_format_new(char *arg)
   res->data = xbt_strdup((char *) arg);
 
   if (format_begin_of_time < 0)
-    format_begin_of_time = gras_os_time();
+    format_begin_of_time = surf_get_clock();
 
   return res;
 }
index d42d7f5..be6b390 100644 (file)
@@ -9,9 +9,9 @@
 #include "xbt/sysdep.h"
 #include "xbt/strbuff.h"        /* For dynamic version when the static one fails */
 #include "xbt/log_private.h"
-#include "xbt/synchro.h"        /* xbt_thread_name */
 
-#include "gras/virtu.h"
+#include "simgrid/simix.h"      /* SIMIX_host_self_get_name */
+#include "surf/surf.h"
 #include <stdio.h>
 #include "portable.h"
 
@@ -42,18 +42,18 @@ static int xbt_log_layout_simple_doit(xbt_log_layout_t l,
   procname = xbt_procname();
   if (procname && *procname) {
     len = snprintf(p, rem_size, "%s:%s:(%d) ",
-                   gras_os_myname(), procname, xbt_getpid());
+                   SIMIX_host_self_get_name(), procname, xbt_getpid());
     check_overflow(len);
   }
   else if (!procname)  {
   len = snprintf(p, rem_size, "%s::(%d) ",
-           gras_os_myname(), xbt_getpid());
+                 SIMIX_host_self_get_name(), xbt_getpid());
   check_overflow(len);
   }
 
   /* Display the date */
   len = snprintf(p, rem_size, "%f] ",
-                 gras_os_time() - simple_begin_of_time);
+                 surf_get_clock() - simple_begin_of_time);
   check_overflow(len);
 
   /* Display file position if not INFO */
@@ -86,7 +86,7 @@ xbt_log_layout_t xbt_log_layout_simple_new(char *arg)
   res->do_layout = xbt_log_layout_simple_doit;
 
   if (simple_begin_of_time < 0)
-    simple_begin_of_time = gras_os_time();
+    simple_begin_of_time = surf_get_clock();
 
   return res;
 }
index 1dae308..93c8e5c 100644 (file)
@@ -1,14 +1,13 @@
 /* module handling                                                          */
 
-/* Copyright (c) 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2006-2012. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "xbt/misc.h"
 #include "simgrid_config.h"     /*HAVE_MMAP _XBT_WIN32 */
-#include "gras_config.h"        /* MMALLOC_WANT_OVERRIDE_LEGACY */
+#include "internal_config.h"        /* MMALLOC_WANT_OVERRIDE_LEGACY */
 #include "time.h"               /* to seed the random generator */
 
 #include "xbt/sysdep.h"
@@ -26,12 +25,17 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(module, xbt, "module handling");
 XBT_LOG_NEW_CATEGORY(smpi, "All SMPI categories"); /* lives here even if that's a bit odd to solve linking issues: this is used in xbt_log_file_appender to detect whether SMPI is used (and thus whether we should unbench the writing to disk) */
 
 
-char *xbt_binary_name = NULL;   /* Mandatory to retrieve neat backtraces */
+char *xbt_binary_name = NULL;   /* Name of the system process containing us (mandatory to retrieve neat backtraces) */
+xbt_dynar_t xbt_cmdline = NULL; /* all we got in argv */
+
 int xbt_initialized = 0;
 
 int _surf_do_model_check = 0;
 int _surf_mc_checkpoint=0;
 char* _surf_mc_property_file=NULL;
+int _surf_mc_timeout=0;
+int _surf_mc_max_depth=1000;
+int _surf_mc_visited=0;
 
 /* Declare xbt_preinit and xbt_postexit as constructor/destructor of the library.
  * This is crude and rather compiler-specific, unfortunately.
@@ -90,17 +94,12 @@ static void xbt_preinit(void)
   xbt_os_thread_mod_preinit();
   xbt_fifo_preinit();
   xbt_dict_preinit();
-  xbt_datadesc_preinit();
-  xbt_trp_preinit();
 
   atexit(xbt_postexit);
 }
 
 static void xbt_postexit(void)
 {
-  xbt_trp_postexit();
-  xbt_datadesc_postexit();
-
   xbt_backtrace_postexit();
 
   xbt_fifo_postexit();
@@ -110,6 +109,8 @@ static void xbt_postexit(void)
   xbt_os_thread_mod_postexit();
 
   free(xbt_binary_name);
+  xbt_dynar_free(&xbt_cmdline);
+
 #ifdef MMALLOC_WANT_OVERRIDE_LEGACY
   mmalloc_postexit();
 #endif
@@ -118,19 +119,25 @@ static void xbt_postexit(void)
 /** @brief Initialize the xbt mechanisms. */
 void xbt_init(int *argc, char **argv)
 {
-  // FIXME it would be nice to assert that this function is called only once. But each gras process do call it...
-  xbt_initialized++;
-
-  if (xbt_initialized > 1)
+  if (xbt_initialized++) {
+    XBT_DEBUG("XBT was initialized %d times.", xbt_initialized);
     return;
+  }
 
   xbt_binary_name = xbt_strdup(argv[0]);
+  xbt_cmdline = xbt_dynar_new(sizeof(char*),NULL);
+  int i;
+  for (i=0;i<*argc;i++) {
+    xbt_dynar_push(xbt_cmdline,&(argv[i]));
+  }
+
   srand((unsigned int) time(NULL));
 
   xbt_log_init(argc, argv);
 }
 
-/** @brief Finalize the xbt mechanisms. */
+/** @brief Finalize the xbt mechanisms.
+ *  @warning this function is deprecated. Just don't call it, there is nothing more to do to finalize xbt*/
 void xbt_exit()
 {
   XBT_WARN("This function is deprecated, you shouldn't use it");
index 08e82d5..05924d2 100644 (file)
@@ -8,7 +8,7 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "gras_config.h"
+#include "internal_config.h"
 #include "xbt/sysdep.h"
 #include "xbt/ex.h"
 #include "xbt/ex_interface.h"   /* We play crude games with exceptions */
@@ -53,6 +53,11 @@ static xbt_os_thread_t main_thread = NULL;
 static pthread_key_t xbt_self_thread_key;
 static int thread_mod_inited = 0;
 
+/* attribute structure to handle pthread stack size changing */
+//FIXME: find where to put this
+static pthread_attr_t attr;
+static int thread_attr_inited = 0;
+
 /* frees the xbt_os_thread_t corresponding to the current thread */
 static void xbt_os_thread_free_thread_data(xbt_os_thread_t thread)
 {
@@ -159,6 +164,7 @@ static void *wrapper_start_routine(void *s)
   return res;
 }
 
+
 xbt_os_thread_t xbt_os_thread_create(const char *name,
                                      pvoid_f_pvoid_t start_routine,
                                      void *param,
@@ -175,14 +181,33 @@ xbt_os_thread_t xbt_os_thread_create(const char *name,
   XBT_RUNNING_CTX_INITIALIZE(res_thread->running_ctx);
   res_thread->extra_data = extra_data;
   
-  if ((errcode = pthread_create(&(res_thread->t), NULL,
+  if ((errcode = pthread_create(&(res_thread->t), thread_attr_inited!=0? &attr: NULL,
                                 wrapper_start_routine, res_thread)))
     THROWF(system_error, errcode,
            "pthread_create failed: %s", strerror(errcode));
 
+
+
   return res_thread;
 }
 
+
+void xbt_os_thread_setstacksize(int stack_size)
+{
+  size_t def=0;
+  if(stack_size<0)xbt_die("stack size is negative, maybe it exceeds MAX_INT?\n");
+  pthread_attr_init(&attr);
+  pthread_attr_getstacksize (&attr, &def);
+  int res = pthread_attr_setstacksize (&attr, stack_size);
+  if ( res!=0 ) {
+    if(res==EINVAL)XBT_WARN("Thread stack size is either < PTHREAD_STACK_MIN, > the max limit of the system, or perhaps not a multiple of PTHREAD_STACK_MIN - The parameter was ignored");
+    else XBT_WARN("unknown error in pthread stacksize setting");
+
+    pthread_attr_setstacksize (&attr, def);
+  }
+  thread_attr_inited=1;
+}
+
 const char *xbt_os_thread_name(xbt_os_thread_t t)
 {
   return t->name;
@@ -643,7 +668,7 @@ typedef struct xbt_os_thread_ {
 
 /* the default size of the stack of the threads (in bytes)*/
 #define XBT_DEFAULT_THREAD_STACK_SIZE  4096
-
+static int stack_size=0;
 /* key to the TLS containing the xbt_os_thread_t structure */
 static unsigned long xbt_self_thread_key;
 
@@ -694,7 +719,7 @@ xbt_os_thread_t xbt_os_thread_create(const char *name,
   t->start_routine = start_routine;
   t->param = param;
   t->extra_data = extra_data;
-  t->handle = CreateThread(NULL, XBT_DEFAULT_THREAD_STACK_SIZE,
+  t->handle = CreateThread(NULL, stack_size==0 ? XBT_DEFAULT_THREAD_STACK_SIZE : stack_size,
                            (LPTHREAD_START_ROUTINE) wrapper_start_routine,
                            t, STACK_SIZE_PARAM_IS_A_RESERVATION, &(t->id));
 
@@ -706,6 +731,11 @@ xbt_os_thread_t xbt_os_thread_create(const char *name,
   return t;
 }
 
+void xbt_os_thread_setstacksize(int size)
+{
+  stack_size = size;
+}
+
 const char *xbt_os_thread_name(xbt_os_thread_t t)
 {
   return t->name;
index 05bf14d..6dc3c95 100644 (file)
@@ -12,9 +12,7 @@
 #include "xbt/log.h"
 #include "xbt/dynar.h"
 
-#include "xbt/synchro.h"
 #include "xbt/queue.h"          /* this module */
-#include "gras/virtu.h"
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_queue, xbt,
                                 "Message exchanging queue");
 
index 7cf78b0..cd6fa9a 100644 (file)
@@ -5,7 +5,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 #include "simgrid_config.h" //For getline, keep that include first
 
-#include "gras_config.h"
+#include "internal_config.h"
 #include <errno.h>
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
@@ -88,7 +88,7 @@ void xbt_replay_reader_free(xbt_replay_reader_t *reader)
  * \brief Registers a function to handle a kind of action
  *
  * Registers a function to handle a kind of action
- * This table is then used by #xbt_replay_action_runner
+ * This table is then used by \ref xbt_replay_action_runner
  *
  * The argument of the function is the line describing the action, splitted on spaces with xbt_str_split_quoted()
  *
@@ -123,15 +123,25 @@ void _xbt_replay_action_exit(void)
   free(action_line);
 }
 
+/**
+ * \ingroup XBT_replay
+ * \brief TODO
+
+ * \param argc argc .
+ * \param argv argv
+ */
 int xbt_replay_action_runner(int argc, char *argv[])
 {
   const char **evt;
+  int i;
   if (action_fp) {              // A unique trace file
 
     while ((evt = action_get_action(argv[0]))) {
       action_fun function =
         (action_fun)xbt_dict_get(action_funs, evt[1]);
       function(evt);
+      for (i=0;evt[i]!= NULL;i++)
+        free((char*)evt[i]);
       free(evt);
     }
   } else {                      // Should have got my trace file in argument
diff --git a/src/xbt/xbt_rl_synchro.c b/src/xbt/xbt_rl_synchro.c
deleted file mode 100644 (file)
index a0a855b..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-/* xbt_synchro -- Synchronization virtualized depending on whether we are   */
-/*                in simulation or real life (act on simulated processes)   */
-
-/* This is the real life implementation, using xbt_os_thread to be portable */
-/* to windows and linux.                                                    */
-
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/sysdep.h"
-#include "xbt/ex.h"
-#include "portable.h"
-
-#include "xbt/synchro.h"        /* This module */
-#include "xbt/xbt_os_thread.h"  /* The implementation we use */
-
-/* the implementation would be cleaner (and faster) with ELF symbol aliasing */
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_sync, xbt,
-                                "Synchronization mechanism");
-
-typedef struct s_xbt_thread_ {
-  xbt_os_thread_t os_thread;
-  void_f_pvoid_t code;
-  void *userparam;
-} s_xbt_thread_t;
-
-static void *xbt_thread_create_wrapper(void *p)
-{
-  xbt_thread_t t = (xbt_thread_t) p;
-  XBT_DEBUG("I'm thread %p", p);
-  t->code(t->userparam);
-  return NULL;
-}
-
-
-xbt_thread_t xbt_thread_create(const char *name, void_f_pvoid_t code,
-                               void *param, int joinable)
-{
-
-  xbt_thread_t res = xbt_new0(s_xbt_thread_t, 1);
-  res->userparam = param;
-  res->code = code;
-  XBT_DEBUG("Create thread %p", res);
-  res->os_thread =
-      xbt_os_thread_create(name, xbt_thread_create_wrapper, res, NULL);
-  return res;
-}
-
-const char *xbt_thread_name(xbt_thread_t t)
-{
-  return xbt_os_thread_name(t->os_thread);
-}
-
-const char *xbt_thread_self_name(void)
-{
-  return xbt_os_thread_self_name();
-}
-
-void xbt_thread_join(xbt_thread_t thread)
-{
-  XBT_DEBUG("Join thread %p", thread);
-  xbt_os_thread_join(thread->os_thread, NULL);
-  xbt_free(thread);
-}
-
-void xbt_thread_exit()
-{
-  XBT_DEBUG("Thread exits");
-  xbt_os_thread_exit(NULL);
-}
-
-xbt_thread_t xbt_thread_self(void)
-{
-  return (xbt_thread_t) xbt_os_thread_self();
-}
-
-void xbt_thread_yield(void)
-{
-  XBT_DEBUG("Thread yields");
-  xbt_os_thread_yield();
-}
-
-void xbt_thread_cancel(xbt_thread_t t)
-{
-  XBT_DEBUG("Cancel thread %p", t);
-  xbt_os_thread_cancel(t->os_thread);
-}
-
-/****** mutex related functions ******/
-struct xbt_mutex_ {
-  /* KEEP IT IN SYNC WITH OS IMPLEMENTATION (both win and lin) */
-#ifdef HAVE_PTHREAD_H
-  pthread_mutex_t m;
-#elif defined(_XBT_WIN32)
-  CRITICAL_SECTION lock;
-#endif
-};
-
-xbt_mutex_t xbt_mutex_init(void)
-{
-  xbt_mutex_t res = (xbt_mutex_t) xbt_os_mutex_init();
-  XBT_DEBUG("Create mutex %p", res);
-  return res;
-}
-
-void xbt_mutex_acquire(xbt_mutex_t mutex)
-{
-  XBT_DEBUG("Acquire mutex %p", mutex);
-  xbt_os_mutex_acquire((xbt_os_mutex_t) mutex);
-}
-
-void xbt_mutex_timedacquire(xbt_mutex_t mutex, double delay)
-{
-  XBT_DEBUG("Acquire mutex %p with delay %lf", mutex, delay);
-  xbt_os_mutex_timedacquire((xbt_os_mutex_t) mutex, delay);
-}
-
-void xbt_mutex_release(xbt_mutex_t mutex)
-{
-  XBT_DEBUG("Unlock mutex %p", mutex);
-  xbt_os_mutex_release((xbt_os_mutex_t) mutex);
-}
-
-void xbt_mutex_destroy(xbt_mutex_t mutex)
-{
-  XBT_DEBUG("Destroy mutex %p", mutex);
-  xbt_os_mutex_destroy((xbt_os_mutex_t) mutex);
-}
-
-#ifdef _XBT_WIN32
-enum {                          /* KEEP IT IN SYNC WITH OS IMPLEM */
-  SIGNAL = 0,
-  BROADCAST = 1,
-  MAX_EVENTS = 2
-};
-#endif
-
-/***** condition related functions *****/
-typedef struct xbt_cond_ {
-  /* KEEP IT IN SYNC WITH OS IMPLEMENTATION (both win and lin) */
-#ifdef HAVE_PTHREAD_H
-  pthread_cond_t c;
-#elif defined(_XBT_WIN32)
-  HANDLE events[MAX_EVENTS];
-
-  unsigned int waiters_count;   /* the number of waiters                        */
-  CRITICAL_SECTION waiters_count_lock;  /* protect access to waiters_count  */
-#endif
-} s_xbt_cond_t;
-
-xbt_cond_t xbt_cond_init(void)
-{
-  xbt_cond_t res = (xbt_cond_t) xbt_os_cond_init();
-  XBT_DEBUG("Create cond %p", res);
-  return res;
-}
-
-void xbt_cond_wait(xbt_cond_t cond, xbt_mutex_t mutex)
-{
-  XBT_DEBUG("Wait cond %p, mutex %p", cond, mutex);
-  xbt_os_cond_wait((xbt_os_cond_t) cond, (xbt_os_mutex_t) mutex);
-}
-
-void xbt_cond_timedwait(xbt_cond_t cond, xbt_mutex_t mutex, double delay)
-{
-  XBT_DEBUG("Wait cond %p, mutex %p for %f sec", cond, mutex, delay);
-  xbt_os_cond_timedwait((xbt_os_cond_t) cond, (xbt_os_mutex_t) mutex,
-                        delay);
-  XBT_DEBUG("Done waiting cond %p, mutex %p for %f sec", cond, mutex, delay);
-}
-
-void xbt_cond_signal(xbt_cond_t cond)
-{
-  XBT_DEBUG("Signal cond %p", cond);
-  xbt_os_cond_signal((xbt_os_cond_t) cond);
-}
-
-void xbt_cond_broadcast(xbt_cond_t cond)
-{
-  XBT_DEBUG("Broadcast cond %p", cond);
-  xbt_os_cond_broadcast((xbt_os_cond_t) cond);
-}
-
-void xbt_cond_destroy(xbt_cond_t cond)
-{
-  XBT_DEBUG("Destroy cond %p", cond);
-  xbt_os_cond_destroy((xbt_os_cond_t) cond);
-}
diff --git a/src/xbt/xbt_rl_time.c b/src/xbt/xbt_rl_time.c
deleted file mode 100644 (file)
index 5d36fd2..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* time - time related syscal wrappers                                      */
-
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "portable.h"
-
-#include "xbt/sysdep.h"
-#include "xbt/log.h"
-#include "gras/virtu.h"
-#include "xbt/xbt_os_time.h"    /* private */
-
-#include <math.h>               /* floor */
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(gras_virtu);
-double xbt_time(void)
-{
-  return xbt_os_time();
-}
-
-void xbt_sleep(double sec)
-{
-  xbt_os_sleep(sec);
-}
-
index 7e3bcba..f0f87ef 100644 (file)
@@ -11,8 +11,6 @@
 
 #include "xbt/ex.h"
 
-#include "xbt/synchro.h"        /* This module */
-
 #include "simgrid/simix.h"        /* used implementation */
 #include "../simix/smx_private.h" /* FIXME */
 
diff --git a/src/xbt/xbt_sg_time.c b/src/xbt/xbt_sg_time.c
deleted file mode 100644 (file)
index 8a3722f..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/* time - time related syscal wrappers                                      */
-
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras/Virtu/virtu_sg.h"
-#include "simgrid/simix.h"
-
-/*
- * Time elapsed since the begining of the simulation.
- */
-double xbt_time()
-{
-  /* FIXME: check if we should use the request mechanism or not */
-  return SIMIX_get_clock();
-}
-
-/*
- * Freeze the process for the specified amount of time
- */
-void xbt_sleep(double sec)
-{
-  simcall_process_sleep(sec);
-}
-
-const char *xbt_procname(void)
-{
-  return SIMIX_process_self_get_name();
-}
-
diff --git a/src/xbt/xbt_socket.c b/src/xbt/xbt_socket.c
deleted file mode 100644 (file)
index 4be4581..0000000
+++ /dev/null
@@ -1,394 +0,0 @@
-/* transport - low level communication                                      */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "xbt/peer.h"
-#include "xbt/dict.h"
-#include "xbt/socket.h"
-#include "xbt_modinter.h"
-#include "portable.h"
-#include "xbt_socket_private.h"
-#include "gras/Msg/msg_interface.h" /* FIXME */
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_trp, xbt,
-                                "Conveying bytes over the network");
-XBT_LOG_NEW_SUBCATEGORY(xbt_trp_meas, xbt_trp,
-                        "Conveying bytes over the network without formating for perf measurements");
-
-static short int xbt_trp_started = 0;
-static xbt_dict_t xbt_trp_plugins;          /* all registered plugins */
-static void xbt_trp_plugin_free(void *p);   /* free one of the plugins */
-
-void xbt_trp_plugin_new(const char *name, xbt_trp_setup_t setup)
-{
-  xbt_trp_plugin_t plug = xbt_new0(s_xbt_trp_plugin_t, 1);
-
-  XBT_DEBUG("Create plugin %s", name);
-
-  plug->name = xbt_strdup(name);
-  setup(plug);
-  xbt_dict_set(xbt_trp_plugins, name, plug, NULL);
-}
-
-void xbt_trp_preinit(void)
-{
-  if (!xbt_trp_started) {
-    /* make room for all plugins */
-    xbt_trp_plugins = xbt_dict_new_homogeneous(xbt_trp_plugin_free);
-
-#ifdef HAVE_WINSOCK2_H
-    /* initialize the windows mechanism */
-    {
-      WORD wVersionRequested;
-      WSADATA wsaData;
-
-      wVersionRequested = MAKEWORD(2, 0);
-      int res;
-      res = WSAStartup(wVersionRequested, &wsaData);
-      xbt_assert(res == 0, "Cannot find a usable WinSock DLL");
-
-      /* Confirm that the WinSock DLL supports 2.0. */
-      /* Note that if the DLL supports versions greater    */
-      /* than 2.0 in addition to 2.0, it will still return */
-      /* 2.0 in wVersion since that is the version we      */
-      /* requested.                                        */
-
-      xbt_assert(LOBYTE(wsaData.wVersion) == 2 &&
-                  HIBYTE(wsaData.wVersion) == 0,
-                  "Cannot find a usable WinSock DLL");
-      XBT_INFO("Found and initialized winsock2");
-    }                           /* The WinSock DLL is acceptable. Proceed. */
-#elif HAVE_WINSOCK_H
-    {
-      WSADATA wsaData;
-      int res;
-      res = WSAStartup(0x0101, &wsaData);
-      xbt_assert(res == 0, "Cannot find a usable WinSock DLL");
-      XBT_INFO("Found and initialized winsock");
-    }
-#endif
-
-    /* create the TCP transport plugin */
-    xbt_trp_plugin_new("tcp", xbt_trp_tcp_setup);
-  }
-
-  xbt_trp_started++;
-}
-
-void xbt_trp_postexit(void)
-{
-  XBT_DEBUG("xbt_trp value %d", xbt_trp_started);
-  if (xbt_trp_started == 0) {
-    return;
-  }
-
-  if (--xbt_trp_started == 0) {
-#ifdef HAVE_WINSOCK_H
-    if (WSACleanup() == SOCKET_ERROR) {
-      if (WSAGetLastError() == WSAEINPROGRESS) {
-        WSACancelBlockingCall();
-        WSACleanup();
-      }
-    }
-#endif
-
-    /* Delete the plugins */
-    xbt_dict_free(&xbt_trp_plugins);
-  }
-}
-
-void xbt_trp_plugin_free(void *p)
-{
-  xbt_trp_plugin_t plug = p;
-
-  if (plug) {
-    if (plug->exit) {
-      plug->exit(plug);
-    } else if (plug->data) {
-      XBT_DEBUG("Plugin %s lacks exit(). Free data anyway.", plug->name);
-      free(plug->data);
-    }
-
-    free(plug->name);
-    free(plug);
-  }
-}
-
-
-/**
- * xbt_trp_socket:
- *
- * Malloc a new socket with the TCP transport plugin and default parameters.
- */
-void xbt_socket_new(int incoming, xbt_socket_t* dst)
-{
-  xbt_socket_new_ext(incoming, dst, xbt_trp_plugin_get_by_name("tcp"), 0, 0);
-}
-
-/**
- * xbt_trp_socket_new:
- *
- * Malloc a new socket.
- */
-void xbt_socket_new_ext(int incoming,
-                        xbt_socket_t * dst,
-                        xbt_trp_plugin_t plugin,
-                        unsigned long int buf_size,
-                        int measurement)
-{
-  xbt_socket_t sock = xbt_new0(s_xbt_socket_t, 1);
-
-  XBT_VERB("Create a new socket (%p)", (void *) sock);
-
-  sock->plugin = plugin;
-
-  sock->incoming = incoming ? 1 : 0;
-  sock->outgoing = incoming ? 0 : 1;
-  sock->accepting = incoming ? 1 : 0;
-  sock->meas = measurement;
-  sock->recvd = 0;
-  sock->valid = 1;
-  sock->moredata = 0;
-
-  sock->refcount = 1;
-  sock->buf_size = buf_size;
-  sock->sd = -1;
-
-  sock->data = NULL;
-  sock->bufdata = NULL;
-
-  *dst = sock;
-
-  XBT_OUT();
-}
-
-XBT_INLINE void* xbt_socket_get_data(xbt_socket_t sock) {
-  return sock->data;
-}
-
-XBT_INLINE void xbt_socket_set_data(xbt_socket_t sock, void* data) {
-  sock->data = data;
-}
-
-/**
- * xbt_trp_send:
- *
- * Send a bunch of bytes from on socket
- * (stable if we know the storage will keep as is until the next trp_flush)
- */
-void xbt_trp_send(xbt_socket_t sd, char *data, long int size, int stable)
-{
-  xbt_assert(sd->outgoing, "Socket not suited for data send");
-  sd->plugin->send(sd, data, size, stable);
-}
-
-/**
- * xbt_trp_recv:
- *
- * Receive a bunch of bytes from a socket
- */
-void xbt_trp_recv(xbt_socket_t sd, char *data, long int size)
-{
-  xbt_assert(sd->incoming, "Socket not suited for data receive");
-  (sd->plugin->recv) (sd, data, size);
-}
-
-/**
- * gras_trp_flush:
- *
- * Make sure all pending communications are done
- */
-void xbt_trp_flush(xbt_socket_t sd)
-{
-  if (sd->plugin->flush)
-    (sd->plugin->flush) (sd);
-}
-
-xbt_trp_plugin_t xbt_trp_plugin_get_by_name(const char *name)
-{
-  return xbt_dict_get(xbt_trp_plugins, name);
-}
-
-int xbt_socket_my_port(xbt_socket_t sock)
-{
-  if (!sock->plugin->my_port)
-    THROWF(unknown_error, 0, "Function my_port unimplemented in plugin %s",sock->plugin->name);
-  return sock->plugin->my_port(sock);
-}
-
-int xbt_socket_peer_port(xbt_socket_t sock)
-{
-  if (!sock->plugin->peer_port)
-    THROWF(unknown_error, 0, "Function peer_port unimplemented in plugin %s",sock->plugin->name);
-  return sock->plugin->peer_port(sock);
-}
-
-const char *xbt_socket_peer_name(xbt_socket_t sock)
-{
-  xbt_assert(sock->plugin);
-  return sock->plugin->peer_name(sock);
-}
-
-const char *xbt_socket_peer_proc(xbt_socket_t sock)
-{
-  return sock->plugin->peer_proc(sock);
-}
-
-void xbt_socket_peer_proc_set(xbt_socket_t sock, char *peer_proc)
-{
-  return sock->plugin->peer_proc_set(sock,peer_proc);
-}
-
-/** \brief Check if the provided socket is a measurement one (or a regular one) */
-int xbt_socket_is_meas(xbt_socket_t sock)
-{
-  return sock->meas;
-}
-
-/** \brief Send a chunk of (random) data over a measurement socket
- *
- * @param peer measurement socket to use for the experiment
- * @param timeout timeout (in seconds)
- * @param msg_size size of each chunk sent over the socket (in bytes).
- * @param msg_amount how many of these packets you want to send.
- *
- * Calls to xbt_socket_meas_send() and xbt_socket_meas_recv() on
- * each side of the socket should be paired.
- *
- * The exchanged data is zeroed to make sure it's initialized, but
- * there is no way to control what is sent (ie, you cannot use these
- * functions to exchange data out of band).
- *
- * @warning: in SimGrid version 3.1 and previous, the numerical arguments
- *           were the total amount of data to send and the msg_size. This
- *           was changed for the fool wanting to send more than MAXINT
- *           bytes in a fat pipe.
- */
-void xbt_socket_meas_send(xbt_socket_t peer,
-                          unsigned int timeout,
-                          unsigned long int msg_size,
-                          unsigned long int msg_amount)
-{
-  char *chunk = NULL;
-  unsigned long int sent_sofar;
-
-  XBT_IN();
-  THROWF(unknown_error, 0, "measurement sockets were broken in this release of SimGrid and should be ported back in the future."
-      "If you depend on it, sorry, you have to use an older version, or wait for the future version using it...");
-
-  if (peer->plugin == xbt_trp_plugin_get_by_name("tcp")) {
-    chunk = xbt_malloc0(msg_size);
-  }
-
-  xbt_assert(peer->meas,
-              "Asked to send measurement data on a regular socket");
-  xbt_assert(peer->outgoing,
-              "Socket not suited for data send (this is a server socket)");
-
-  for (sent_sofar = 0; sent_sofar < msg_amount; sent_sofar++) {
-    XBT_CDEBUG(xbt_trp_meas,
-            "Sent %lu msgs of %lu (size of each: %lu) to %s:%d",
-            sent_sofar, msg_amount, msg_size, xbt_socket_peer_name(peer),
-            xbt_socket_peer_port(peer));
-    peer->plugin->raw_send(peer, chunk, msg_size);
-  }
-  XBT_CDEBUG(xbt_trp_meas,
-          "Sent %lu msgs of %lu (size of each: %lu) to %s:%d", sent_sofar,
-          msg_amount, msg_size, xbt_socket_peer_name(peer),
-          xbt_socket_peer_port(peer));
-
-  if (peer->plugin == xbt_trp_plugin_get_by_name("tcp")) {
-    free(chunk);
-  }
-
-  XBT_OUT();
-}
-
-/** \brief Receive a chunk of data over a measurement socket
- *
- * Calls to xbt_socket_meas_send() and xbt_socket_meas_recv() on
- * each side of the socket should be paired.
- *
- * @warning: in SimGrid version 3.1 and previous, the numerical arguments
- *           were the total amount of data to send and the msg_size. This
- *           was changed for the fool wanting to send more than MAXINT
- *           bytes in a fat pipe.
- */
-void xbt_socket_meas_recv(xbt_socket_t peer,
-                           unsigned int timeout,
-                           unsigned long int msg_size,
-                           unsigned long int msg_amount)
-{
-
-  char *chunk = NULL;
-  unsigned long int got_sofar;
-
-  XBT_IN();
-  THROWF(unknown_error,0,"measurement sockets were broken in this release of SimGrid and should be ported back in the future."
-      "If you depend on it, sorry, you have to use an older version, or wait for the future version using it...");
-
-  if (peer->plugin == xbt_trp_plugin_get_by_name("tcp")) {
-    chunk = xbt_malloc(msg_size);
-  }
-
-  xbt_assert(peer->meas,
-              "Asked to receive measurement data on a regular socket");
-  xbt_assert(peer->incoming, "Socket not suited for data receive");
-
-  for (got_sofar = 0; got_sofar < msg_amount; got_sofar++) {
-    XBT_CDEBUG(xbt_trp_meas,
-            "Recvd %lu msgs of %lu (size of each: %lu) from %s:%d",
-            got_sofar, msg_amount, msg_size, xbt_socket_peer_name(peer),
-            xbt_socket_peer_port(peer));
-    (peer->plugin->raw_recv) (peer, chunk, msg_size);
-  }
-  XBT_CDEBUG(xbt_trp_meas,
-          "Recvd %lu msgs of %lu (size of each: %lu) from %s:%d",
-          got_sofar, msg_amount, msg_size, xbt_socket_peer_name(peer),
-          xbt_socket_peer_port(peer));
-
-  if (peer->plugin == xbt_trp_plugin_get_by_name("tcp")) {
-    free(chunk);
-  }
-
-  XBT_OUT();
-}
-
-/**
- * \brief Something similar to the good old accept system call.
- *
- * Make sure that there is someone speaking to the provided server socket.
- * In RL, it does an accept(2) and return the result as last argument.
- * In SG, as accepts are useless, it returns the provided argument as result.
- * You should thus test whether (peer != accepted) before closing both of them.
- *
- * You should only call this on measurement sockets. It is automatically
- * done for regular sockets, but you usually want more control about
- * what's going on with measurement sockets.
- */
-xbt_socket_t xbt_socket_meas_accept(xbt_socket_t peer)
-{
-  xbt_socket_t res;
-  THROWF(unknown_error,0,"measurement sockets were broken in this release of SimGrid and should be ported back in the future."
-      "If you depend on it, sorry, you have to use an older version, or wait for the future version using it...");
-
-  xbt_assert(peer->meas,
-              "No need to accept on non-measurement sockets (it's automatic)");
-
-  if (!peer->accepting) {
-    /* nothing to accept here (must be in SG) */
-    /* BUG: FIXME: this is BAD! it makes tricky to free the accepted socket */
-    return peer;
-  }
-
-  res = (peer->plugin->socket_accept) (peer);
-  res->meas = peer->meas;
-  XBT_CDEBUG(xbt_trp_meas, "meas_accepted onto %d", res->sd);
-
-  return res;
-}
diff --git a/src/xbt/xbt_socket_private.h b/src/xbt/xbt_socket_private.h
deleted file mode 100644 (file)
index 5816b17..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/* transport - low level communication (send/receive bunches of bytes)      */
-
-/* module's private interface masked even to other parts of XBT.           */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef XBT_SOCKET_PRIVATE_H
-#define XBT_SOCKET_PRIVATE_H
-
-#include "xbt/sysdep.h"
-#include "xbt/log.h"
-#include "xbt/dynar.h"
-#include "xbt/dict.h"
-#include "xbt/socket.h"
-
-/**
- * s_xbt_trp_bufdata:
- * 
- * Description of a socket.
- */
-typedef struct s_xbt_trp_bufdata xbt_trp_bufdata_t;
-
-typedef struct s_xbt_socket {
-
-  xbt_trp_plugin_t plugin;
-
-  unsigned incoming:1;          /* true if we can read from this sock */
-  unsigned outgoing:1;          /* true if we can write on this sock */
-  unsigned accepting:1;         /* true if master incoming sock in tcp */
-  unsigned meas:1;              /* true if this is an experiment socket instead of messaging */
-  unsigned valid:1;             /* false if a select returned that the peer has left, forcing us to "close" the socket */
-  unsigned moredata:1;          /* TCP socket use a buffer and read operation get as much 
-                                   data as possible. It is possible that several messages
-                                   are received in one shoot, and select won't catch them 
-                                   afterward again. 
-                                   This boolean indicates that this is the case, so that we
-                                   don't call select in that case.  Note that measurement
-                                   sockets are not concerned since they use the TCP
-                                   interface directly, with no buffer. */
-
-  unsigned recvd:1;             /* true if the recvd_val field contains one byte of the stream (that we peek'ed to check the socket validity) */
-  char recvd_val;               /* what we peeked from the socket, if any */
-
-  int refcount;                 /* refcounting on shared sockets */
-
-  unsigned long int buf_size;   /* what to say to the OS. 
-                                   Field here to remember it when accepting */
-
-  int sd;
-
-  void *data;                   /* userdata */
-  xbt_trp_bufdata_t *bufdata;   /* buffer userdata */
-} s_xbt_socket_t;
-
-void xbt_trp_tcp_setup(xbt_trp_plugin_t plug);
-
-#endif                          /* XBT_SOCKET_PRIVATE_H */
index a8d06e7..e4ea184 100644 (file)
@@ -327,11 +327,14 @@ xbt_dynar_t xbt_str_split_str(const char *s, const char *sep)
  *
  * The string passed as argument must be writable (not const)
  * The elements of the dynar are just parts of the string passed as argument.
+ * So if you don't store that argument elsewhere, you should free it in addition
+ * to freeing the dynar. This can be done by simply freeing the first argument
+ * of the dynar:
+ *  free(xbt_dynar_get_ptr(dynar,0));
  *
- * To free the structure constructed by this function, free the first element and free the dynar:
- *
- * free(xbt_dynar_get_ptr(dynar,0));
- * xbt_dynar_free(&dynar);
+ * Actually this function puts a bunch of \0 in the memory area you passed as
+ * argument to separate the elements, and pushes the address of each chunk
+ * in the resulting dynar. Yes, that's uneven. Yes, that's gory. But that's efficient.
  */
 xbt_dynar_t xbt_str_split_quoted_in_place(char *s) {
   xbt_dynar_t res = xbt_dynar_new(sizeof(char *), NULL);
@@ -345,7 +348,7 @@ xbt_dynar_t xbt_str_split_quoted_in_place(char *s) {
 
   beg = s;
 
-  /* do not trim leading spaces: caller responsability to clean his cruft */
+  /* do not trim leading spaces: caller responsibility to clean his cruft */
   end = beg;
 
   while (!done) {
diff --git a/src/xbt/xbt_synchro.c b/src/xbt/xbt_synchro.c
deleted file mode 100644 (file)
index 7b2993d..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/* xbt_synchro -- advanced multithreaded features                           */
-/* Working on top of real threads in RL and of simulated processes in SG    */
-
-/* Copyright (c) 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/sysdep.h"
-#include "xbt/dynar.h"
-#include "xbt/synchro.h"
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(xbt_sync);
-
-typedef struct {
-  xbt_dynar_t data;
-  int rank;
-  void_f_int_pvoid_t function;
-  xbt_thread_t worker;
-} s_worker_data_t, *worker_data_t;
-
-static void worker_wait_n_free(void *w)
-{
-  worker_data_t worker = *(worker_data_t *) w;
-  xbt_thread_join(worker->worker);
-  xbt_free(worker);
-}
-
-static void worker_wrapper(void *w)
-{
-  worker_data_t me = (worker_data_t) w;
-  me->function(me->rank, xbt_dynar_get_ptr(me->data, me->rank));
-}
-
-void xbt_dynar_dopar(xbt_dynar_t datas, void_f_int_pvoid_t function)
-{
-  xbt_dynar_t workers =
-      xbt_dynar_new(sizeof(worker_data_t), worker_wait_n_free);
-  unsigned int cursor;
-  void *data;
-  if (xbt_dynar_is_empty(datas))
-    return;                     /* nothing to do */
-  if (xbt_dynar_length(datas) == 1) {
-    /* don't start any new thread, do it directly */
-    function(0, xbt_dynar_get_ptr(datas, 0));
-    return;
-  }
-  /* Start all workers */
-  XBT_DEBUG("Dopar for %lu elements", xbt_dynar_length(datas));
-  xbt_dynar_foreach(datas, cursor, data) {
-    worker_data_t w = xbt_new0(s_worker_data_t, 1);
-    w->data = datas;
-    w->function = function;
-    w->rank = cursor;
-    xbt_dynar_push(workers, &w);
-    w->worker =
-        xbt_thread_create("dopar worker", worker_wrapper, w,
-                          1 /*joinable */ );
-  }
-  /* wait them all */
-  xbt_dynar_free(&workers);
-}
-
-#ifdef SIMGRID_TEST
-#define NB_ELEM 50
-#include "xbt/synchro.h"
-
-XBT_TEST_SUITE("synchro", "Advanced synchronization mecanisms");
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(xbt_dyn);
-
-static void add100(int rank, void *data)
-{
-  //XBT_INFO("Thread%d: Add 100 to %d",rank,*(int*)data);
-  *(int *) data += 100;
-}
-
-XBT_TEST_UNIT("dopar", test_dynar_dopar, "do parallel on dynars of integers")
-{
-  xbt_dynar_t d;
-  int i, cpt;
-  unsigned int cursor;
-
-  xbt_test_add
-      ("==== Push %d int, add 100 to each of them in parallel and check the results",
-       NB_ELEM);
-  d = xbt_dynar_new(sizeof(int), NULL);
-  for (cpt = 0; cpt < NB_ELEM; cpt++) {
-    xbt_dynar_push_as(d, int, cpt);     /* This is faster (and possible only with scalars) */
-    xbt_test_log("Push %d, length=%lu", cpt, xbt_dynar_length(d));
-  }
-  xbt_dynar_dopar(d, add100);
-  cpt = 100;
-  xbt_dynar_foreach(d, cursor, i) {
-    xbt_test_assert(i == cpt,
-                     "The retrieved value is not the expected one (%d!=%d)",
-                     i, cpt);
-    cpt++;
-  }
-  xbt_dynar_free(&d);
-}
-
-#endif                          /* SIMGRID_TEST */
diff --git a/src/xbt/xbt_trp_plugin_tcp.c b/src/xbt/xbt_trp_plugin_tcp.c
deleted file mode 100644 (file)
index cf171bf..0000000
+++ /dev/null
@@ -1,887 +0,0 @@
-/* buffered transport using the TCP plugin or a custom one                  */
-
-/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdlib.h>
-#include <string.h>             /* memset */
-
-#include "portable.h"
-#include "xbt/misc.h"
-#include "xbt/sysdep.h"
-#include "xbt/ex.h"
-#include "xbt/xbt_socket_private.h"
-
-#include "gras/Transport/transport_interface.h" /* FIXME */
-#include "gras/Virtu/virtu_interface.h" /* FIXME */
-#include "gras/Msg/msg_interface.h" /* FIXME */
-extern int gras_trp_libdata_id; /* FIXME */
-
-/* FIXME maybe READV is sometime a good thing? */
-#undef HAVE_READV
-
-#ifdef HAVE_READV
-#include <sys/uio.h>
-#endif
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_trp_tcp, xbt_trp,
-                                "TCP buffered transport");
-
-/***
- *** Specific socket part
- ***/
-
-typedef struct {
-  int port;                     /* port on this side */
-  int peer_port;                /* port on the other side */
-  char *peer_name;              /* hostname of the other side */
-  char *peer_proc;              /* process on the other side */
-} s_xbt_trp_tcp_sock_data_t, *xbt_trp_tcp_sock_data_t;
-
-typedef enum { buffering_buf, buffering_iov } buffering_kind;
-
-typedef struct {
-  int size;
-  char *data;
-  int pos;                      /* for receive; not exchanged over the net */
-} xbt_trp_buf_t;
-
-struct s_xbt_trp_bufdata {
-  int buffsize;
-  xbt_trp_buf_t in_buf;
-  xbt_trp_buf_t out_buf;
-
-#ifdef HAVE_READV
-  xbt_dynar_t in_buf_v;
-  xbt_dynar_t out_buf_v;
-#endif
-
-  buffering_kind in;
-  buffering_kind out;
-};
-
-/*****************************/
-/****[ SOCKET MANAGEMENT ]****/
-/*****************************/
-
-/* we exchange port number on client side on socket creation,
-   so we need to be able to talk right now. */
-static XBT_INLINE void xbt_trp_tcp_send(xbt_socket_t sock,
-                                        const char *data,
-                                        unsigned long int size);
-static int xbt_trp_tcp_recv(xbt_socket_t sock, char *data,
-                            unsigned long int size);
-
-static int xbt_trp_tcp_proto_number(void);
-static void xbt_trp_sock_socket_close(xbt_socket_t sock);
-
-static XBT_INLINE
-void xbt_trp_sock_socket_client(xbt_trp_plugin_t ignored,
-                                const char *host,
-                                int port,
-                                /* OUT */ xbt_socket_t sock)
-{
-  xbt_trp_tcp_sock_data_t sockdata = xbt_new(s_xbt_trp_tcp_sock_data_t,1);
-  sockdata->port = port;
-  sockdata->peer_proc = NULL;
-  sockdata->peer_port = port;
-  sockdata->peer_name = (char *) xbt_strdup(host ? host : "localhost");
-  sock->data = sockdata;
-
-  struct sockaddr_in addr;
-  struct hostent *he;
-  struct in_addr *haddr;
-  int size = sock->buf_size;
-  uint32_t myport = htonl(((gras_trp_procdata_t)
-                           gras_libdata_by_id
-                           (gras_trp_libdata_id))->myport);
-
-  sock->incoming = 1;           /* TCP sockets are duplex'ed */
-
-  sock->sd = socket(AF_INET, SOCK_STREAM, 0);
-
-  if (sock->sd < 0) {
-    THROWF(system_error, 0, "Failed to create socket: %s",
-           sock_errstr(sock_errno));
-  }
-
-  if (setsockopt
-      (sock->sd, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof(size))
-      || setsockopt(sock->sd, SOL_SOCKET, SO_SNDBUF, (char *) &size,
-                    sizeof(size))) {
-    XBT_VERB("setsockopt failed, cannot set buffer size: %s",
-          sock_errstr(sock_errno));
-  }
-
-  he = gethostbyname(sockdata->peer_name);
-  if (he == NULL) {
-    THROWF(system_error, 0, "Failed to lookup hostname %s: %s",
-        sockdata->peer_name, sock_errstr(sock_errno));
-  }
-
-  haddr = ((struct in_addr *) (he->h_addr_list)[0]);
-
-  memset(&addr, 0, sizeof(struct sockaddr_in));
-  memcpy(&addr.sin_addr, haddr, sizeof(struct in_addr));
-  addr.sin_family = AF_INET;
-  addr.sin_port = htons(sockdata->peer_port);
-
-  if (connect(sock->sd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
-    tcp_close(sock->sd);
-    THROWF(system_error, 0,
-           "Failed to connect socket to %s:%d (%s)",
-           sockdata->peer_name, sockdata->peer_port, sock_errstr(sock_errno));
-  }
-
-  xbt_trp_tcp_send(sock, (char *) &myport, sizeof(uint32_t));
-  XBT_DEBUG("peerport sent to %d", sockdata->peer_port);
-
-  XBT_VERB("Connect to %s:%d (sd=%d, port %d here)",
-        sockdata->peer_name, sockdata->peer_port, sock->sd, sockdata->port);
-}
-
-/**
- * gras_trp_sock_socket_server:
- *
- * Open a socket used to receive messages.
- */
-static XBT_INLINE
-void xbt_trp_sock_socket_server(xbt_trp_plugin_t ignored,
-                                int port,
-                                xbt_socket_t sock)
-{
-  int size = sock->buf_size;
-  int on = 1;
-  struct sockaddr_in server;
-
-  xbt_trp_tcp_sock_data_t sockdata = xbt_new(s_xbt_trp_tcp_sock_data_t,1);
-  sockdata->port = port;
-  sockdata->peer_port = -1;
-  sockdata->peer_name = NULL;
-  sockdata->peer_proc = NULL;
-  sock->data = sockdata;
-
-  sock->outgoing = 1;           /* TCP => duplex mode */
-
-  server.sin_port = htons((u_short) sockdata->port);
-  server.sin_addr.s_addr = INADDR_ANY;
-  server.sin_family = AF_INET;
-  if ((sock->sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
-    THROWF(system_error, 0, "Socket allocation failed: %s",
-           sock_errstr(sock_errno));
-
-  if (setsockopt
-      (sock->sd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on)))
-    THROWF(system_error, 0,
-           "setsockopt failed, cannot condition the socket: %s",
-           sock_errstr(sock_errno));
-
-  if (setsockopt(sock->sd, SOL_SOCKET, SO_RCVBUF,
-                 (char *) &size, sizeof(size))
-      || setsockopt(sock->sd, SOL_SOCKET, SO_SNDBUF,
-                    (char *) &size, sizeof(size))) {
-    XBT_VERB("setsockopt failed, cannot set buffer size: %s",
-          sock_errstr(sock_errno));
-  }
-
-  if (bind(sock->sd, (struct sockaddr *) &server, sizeof(server)) == -1) {
-    tcp_close(sock->sd);
-    THROWF(system_error, 0,
-           "Cannot bind to port %d: %s", sockdata->port,
-           sock_errstr(sock_errno));
-  }
-
-  XBT_DEBUG("Listen on port %d (sd=%d)", sockdata->port, sock->sd);
-  if (listen(sock->sd, 5) < 0) {
-    tcp_close(sock->sd);
-    THROWF(system_error, 0,
-           "Cannot listen on port %d: %s",
-           sockdata->port, sock_errstr(sock_errno));
-  }
-
-  XBT_VERB("Openned a server socket on port %d (sd=%d)", sockdata->port,
-        sock->sd);
-}
-
-static xbt_socket_t xbt_trp_sock_socket_accept(xbt_socket_t sock)
-{
-  xbt_socket_t res;
-
-  struct sockaddr_in peer_in;
-  socklen_t peer_in_len = sizeof(peer_in);
-
-  int sd;
-  int tmp_errno;
-  int size;
-
-  int i = 1;
-  socklen_t s = sizeof(int);
-
-  uint32_t hisport;
-
-  int failed = 0;
-
-  XBT_IN();
-  xbt_socket_new_ext(1, &res, sock->plugin, sock->buf_size, 0);
-
-  sd = accept(sock->sd, (struct sockaddr *) &peer_in, &peer_in_len);
-  tmp_errno = sock_errno;
-
-  if (sd == -1) {
-    xbt_trp_sock_socket_close(sock);
-    THROWF(system_error, 0,
-           "Accept failed (%s). Droping server socket.",
-           sock_errstr(tmp_errno));
-  }
-
-  if (xbt_trp_tcp_proto_number() != -1)
-    if (setsockopt(sd, xbt_trp_tcp_proto_number(), TCP_NODELAY, (char *) &i,s))
-      failed = 1;
-
-  if (setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (char *) &i, s))
-    failed = 1;
-
-  if (failed)
-    THROWF(system_error, 0,
-           "setsockopt failed, cannot condition the socket: %s",
-           sock_errstr(tmp_errno));
-
-  size = sock->buf_size;
-  if (setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof(size))
-      || setsockopt(sd, SOL_SOCKET, SO_SNDBUF, (char *) &size,
-                    sizeof(size)))
-    XBT_VERB("setsockopt failed, cannot set buffer size: %s",
-          sock_errstr(tmp_errno));
-
-  res->plugin = sock->plugin;
-  res->incoming = sock->incoming;
-  res->outgoing = sock->outgoing;
-  res->accepting = 0;
-  res->sd = sd;
-  xbt_trp_tcp_sock_data_t sockdata = xbt_new(s_xbt_trp_tcp_sock_data_t, 1);
-  sockdata->port = -1;
-  res->data = sockdata;
-
-  xbt_trp_tcp_recv(res, (char *) &hisport, sizeof(hisport));
-  sockdata->peer_port = ntohl(hisport);
-  XBT_DEBUG("peerport %d received", sockdata->peer_port);
-
-  /* FIXME: Lock to protect inet_ntoa */
-  if (((struct sockaddr *) &peer_in)->sa_family != AF_INET) {
-    sockdata->peer_name = (char *) strdup("unknown");
-  } else {
-    struct in_addr addrAsInAddr;
-    char *tmp;
-
-    addrAsInAddr.s_addr = peer_in.sin_addr.s_addr;
-
-    tmp = inet_ntoa(addrAsInAddr);
-    if (tmp != NULL) {
-      sockdata->peer_name = (char *) strdup(tmp);
-    } else {
-      sockdata->peer_name = (char *) strdup("unknown");
-    }
-  }
-
-  XBT_VERB("Accepted from %s:%d (sd=%d)", sockdata->peer_name, sockdata->peer_port, sd);
-  xbt_dynar_push(((gras_trp_procdata_t)
-                  gras_libdata_by_id(gras_trp_libdata_id))->sockets, &res);
-  /* FIXME we depend on GRAS here */
-
-  XBT_OUT();
-  return res;
-}
-
-static void xbt_trp_sock_socket_close(xbt_socket_t sock)
-{
-  if (!sock)
-    return;                     /* close only once */
-
-  free(((xbt_trp_tcp_sock_data_t)sock->data)->peer_name);
-  free(sock->data);
-
-  XBT_VERB("close tcp connection %d", sock->sd);
-
-  gras_msg_listener_close_socket(sock->sd); /* FIXME */
-}
-
-/************************************/
-/****[ end of SOCKET MANAGEMENT ]****/
-/************************************/
-
-
-/************************************/
-/****[ UNBUFFERED DATA EXCHANGE ]****/
-/************************************/
-/* Temptation to merge this with file data exchange is great, 
-   but doesn't work on BillWare (see tcp_write() in portable.h) */
-static XBT_INLINE void xbt_trp_tcp_send(xbt_socket_t sock,
-                                        const char *data,
-                                        unsigned long int size)
-{
-  while (size) {
-    int status = 0;
-
-    status = tcp_write(sock->sd, data, (size_t) size);
-    XBT_DEBUG("write(%d, %p, %lu);", sock->sd, data, size);
-
-    if (status < 0) {
-#ifdef EWOULDBLOCK
-      if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
-#else
-      if (errno == EINTR || errno == EAGAIN)
-#endif
-        continue;
-
-      THROWF(system_error, 0, "write(%d,%p,%lu) failed: %s",
-             sock->sd, data, size, sock_errstr(sock_errno));
-    }
-
-    if (status) {
-      size -= status;
-      data += status;
-    } else {
-      THROWF(system_error, 0, "file descriptor closed (%s)",
-             sock_errstr(sock_errno));
-    }
-  }
-}
-
-static XBT_INLINE int
-xbt_trp_tcp_recv_withbuffer(xbt_socket_t sock,
-                            char *data,
-                            unsigned long int size,
-                            unsigned long int bufsize)
-{
-  int got = 0;
-
-  if (sock->recvd) {
-    data[0] = sock->recvd_val;
-    sock->recvd = 0;
-    got++;
-    bufsize--;
-  }
-
-  while (size > got) {
-    int status = 0;
-
-    XBT_DEBUG("read(%d, %p, %lu) got %d so far (%s)",
-           sock->sd, data + got, bufsize, got,
-           hexa_str((unsigned char *) data, got, 0));
-    status = tcp_read(sock->sd, data + got, (size_t) bufsize);
-
-    if (status < 0) {
-      THROWF(system_error, 0,
-             "read(%d,%p,%lu) from %s:%d failed: %s; got %d so far",
-             sock->sd, data + got, size, xbt_socket_peer_name(sock),
-             xbt_socket_peer_port(sock), sock_errstr(sock_errno), got);
-    }
-    XBT_DEBUG("Got %d more bytes (%s)", status,
-           hexa_str((unsigned char *) data + got, status, 0));
-
-    if (status) {
-      bufsize -= status;
-      got += status;
-    } else {
-      THROWF(system_error, errno,
-             "Socket closed by remote side (got %d bytes before this)",
-             got);
-    }
-  }
-
-  return got;
-}
-
-static int xbt_trp_tcp_recv(xbt_socket_t sock,
-                            char *data,
-                            unsigned long int size)
-{
-  return xbt_trp_tcp_recv_withbuffer(sock, data, size, size);
-
-}
-
-/*******************************************/
-/****[ end of UNBUFFERED DATA EXCHANGE ]****/
-/*******************************************/
-
-/**********************************/
-/****[ BUFFERED DATA EXCHANGE ]****/
-/**********************************/
-
-/* Make sure the data is sent */
-static void xbt_trp_bufiov_flush(xbt_socket_t sock)
-{
-#ifdef HAVE_READV
-  xbt_dynar_t vect;
-  int size;
-#endif
-  xbt_trp_bufdata_t *data = sock->bufdata;
-  XBT_IN();
-
-  XBT_DEBUG("Flush");
-  if (data->out == buffering_buf) {
-    if (XBT_LOG_ISENABLED(xbt_trp_tcp, xbt_log_priority_debug))
-      hexa_print("chunk to send ",
-                 (unsigned char *) data->out_buf.data, data->out_buf.size);
-    if ((data->out_buf.size - data->out_buf.pos) != 0) {
-      XBT_DEBUG("Send the chunk (size=%d) to %s:%d", data->out_buf.size,
-             xbt_socket_peer_name(sock), xbt_socket_peer_port(sock));
-      xbt_trp_tcp_send(sock, data->out_buf.data, data->out_buf.size);
-      XBT_VERB("Chunk sent (size=%d)", data->out_buf.size);
-      data->out_buf.size = 0;
-    }
-  }
-#ifdef HAVE_READV
-  if (data->out == buffering_iov) {
-    XBT_DEBUG("Flush out iov");
-    vect = sock->bufdata->out_buf_v;
-    if ((size = xbt_dynar_length(vect))) {
-      XBT_DEBUG("Flush %d chunks out of this socket", size);
-      writev(sock->sd, xbt_dynar_get_ptr(vect, 0), size);
-      xbt_dynar_reset(vect);
-    }
-    data->out_buf.size = 0;     /* reset the buffer containing non-stable data */
-  }
-
-  if (data->in == buffering_iov) {
-    XBT_DEBUG("Flush in iov");
-    vect = sock->bufdata->in_buf_v;
-    if ((size = xbt_dynar_length(vect))) {
-      XBT_DEBUG("Get %d chunks from of this socket", size);
-      readv(sock->sd, xbt_dynar_get_ptr(vect, 0), size);
-      xbt_dynar_reset(vect);
-    }
-  }
-#endif
-}
-
-static void
-xbt_trp_buf_send(xbt_socket_t sock,
-                 const char *chunk,
-                 unsigned long int size,
-                 int stable_ignored)
-{
-
-  xbt_trp_bufdata_t *data = (xbt_trp_bufdata_t *) sock->bufdata;
-  int chunk_pos = 0;
-
-  XBT_IN();
-
-  while (chunk_pos < size) {
-    /* size of the chunk to receive in that shot */
-    long int thissize =
-        min(size - chunk_pos, data->buffsize - data->out_buf.size);
-    XBT_DEBUG("Set the chars %d..%ld into the buffer; size=%lu, ctn=(%s)",
-           data->out_buf.size,
-           data->out_buf.size + thissize - 1, size,
-           hexa_str((unsigned char *) chunk, thissize, 0));
-
-    memcpy(data->out_buf.data + data->out_buf.size, chunk + chunk_pos,
-           thissize);
-
-    data->out_buf.size += thissize;
-    chunk_pos += thissize;
-    XBT_DEBUG("New pos = %d; Still to send = %lu of %lu; ctn sofar=(%s)",
-           data->out_buf.size, size - chunk_pos, size,
-           hexa_str((unsigned char *) chunk, chunk_pos, 0));
-
-    if (data->out_buf.size == data->buffsize)   /* out of space. Flush it */
-      xbt_trp_bufiov_flush(sock);
-  }
-
-  XBT_OUT();
-}
-
-static int
-xbt_trp_buf_recv(xbt_socket_t sock, char *chunk, unsigned long int size)
-{
-
-  xbt_trp_bufdata_t *data = sock->bufdata;
-  long int chunk_pos = 0;
-
-  XBT_IN();
-
-  while (chunk_pos < size) {
-    /* size of the chunk to receive in that shot */
-    long int thissize;
-
-    if (data->in_buf.size == data->in_buf.pos) {        /* out of data. Get more */
-
-      XBT_DEBUG("Get more data (size=%d,bufsize=%d)",
-             (int) MIN(size - chunk_pos, data->buffsize),
-             (int) data->buffsize);
-
-      data->in_buf.size =
-          xbt_trp_tcp_recv_withbuffer(sock, data->in_buf.data,
-                                      MIN(size - chunk_pos, data->buffsize),
-                                      data->buffsize);
-
-      data->in_buf.pos = 0;
-    }
-
-    thissize = min(size - chunk_pos, data->in_buf.size - data->in_buf.pos);
-    memcpy(chunk + chunk_pos, data->in_buf.data + data->in_buf.pos,
-           thissize);
-
-    data->in_buf.pos += thissize;
-    chunk_pos += thissize;
-    XBT_DEBUG("New pos = %d; Still to receive = %lu of %lu. Ctn so far=(%s)",
-           data->in_buf.pos, size - chunk_pos, size,
-           hexa_str((unsigned char *) chunk, chunk_pos, 0));
-  }
-  /* indicate on need to the gras_select function that there is more to read on this socket so that it does not actually select */
-  sock->moredata = (data->in_buf.size > data->in_buf.pos);
-  XBT_DEBUG("There is %smore data", (sock->moredata ? "" : "no "));
-
-  XBT_OUT();
-  return chunk_pos;
-}
-
-/*****************************************/
-/****[ end of BUFFERED DATA EXCHANGE ]****/
-/*****************************************/
-
-/********************************/
-/****[ VECTOR DATA EXCHANGE ]****/
-/********************************/
-#ifdef HAVE_READV
-static void
-xbt_trp_iov_send(xbt_socket_t sock,
-                 const char *chunk, unsigned long int size, int stable)
-{
-  struct iovec elm;
-  xbt_trp_bufdata_t *data = (xbt_trp_bufdata_t *) sock->bufdata;
-
-
-  XBT_DEBUG("Buffer one chunk to be sent later (%s)",
-      hexa_str((char *) chunk, size, 0));
-
-  elm.iov_len = (size_t) size;
-
-  if (!stable) {
-    /* data storage won't last until flush. Save it in a buffer if we can */
-
-    if (size > data->buffsize - data->out_buf.size) {
-      /* buffer too small: 
-         flush the socket, using data in its actual storage */
-      elm.iov_base = (void *) chunk;
-      xbt_dynar_push(data->out_buf_v, &elm);
-
-      xbt_trp_bufiov_flush(sock);
-      return;
-    } else {
-      /* buffer big enough: 
-         copy data into it, and chain it for upcoming writev */
-      memcpy(data->out_buf.data + data->out_buf.size, chunk, size);
-      elm.iov_base = (void *) (data->out_buf.data + data->out_buf.size);
-      data->out_buf.size += size;
-
-      xbt_dynar_push(data->out_buf_v, &elm);
-    }
-
-  } else {
-    /* data storage stable. Chain it */
-
-    elm.iov_base = (void *) chunk;
-    xbt_dynar_push(data->out_buf_v, &elm);
-  }
-}
-
-static int
-xbt_trp_iov_recv(gras_socket_t sock, char *chunk, unsigned long int size)
-{
-  struct iovec elm;
-
-  XBT_DEBUG("Buffer one chunk to be received later");
-  elm.iov_base = (void *) chunk;
-  elm.iov_len = (size_t) size;
-  xbt_dynar_push(sock->bufdata->in_buf_v, &elm);
-
-  return size;
-}
-
-#endif
-/***************************************/
-/****[ end of VECTOR DATA EXCHANGE ]****/
-/***************************************/
-
-
-/***
- *** Prototypes of BUFFERED
- ***/
-static xbt_socket_t xbt_trp_buf_init_sock(xbt_socket_t sock);
-static void xbt_trp_buf_socket_client(xbt_trp_plugin_t self,
-                               const char *host,
-                               int port,
-                               xbt_socket_t sock);
-static void xbt_trp_buf_socket_server(xbt_trp_plugin_t self,
-                                int port,
-                                xbt_socket_t sock);
-static xbt_socket_t xbt_trp_buf_socket_accept(xbt_socket_t sock);
-
-static void xbt_trp_buf_socket_close(xbt_socket_t sd);
-
-
-static xbt_socket_t xbt_trp_buf_init_sock(xbt_socket_t sock)
-{
-  xbt_trp_bufdata_t *data = xbt_new(xbt_trp_bufdata_t, 1);
-
-  data->buffsize = 100 * 1024;  /* 100k */
-
-  data->in_buf.size = 0;
-  data->in_buf.data = xbt_malloc(data->buffsize);
-  data->in_buf.pos = 0;         /* useless, indeed, since size==pos */
-
-  data->out_buf.size = 0;
-  data->out_buf.data = xbt_malloc(data->buffsize);
-  data->out_buf.pos = data->out_buf.size;
-
-#ifdef HAVE_READV
-  data->in_buf_v = data->out_buf_v = NULL;
-  data->in_buf_v = xbt_dynar_new(sizeof(struct iovec), NULL);
-  data->out_buf_v = xbt_dynar_new(sizeof(struct iovec), NULL);
-  data->out = buffering_iov;
-#else
-  data->out = buffering_buf;
-#endif
-
-  data->in = buffering_buf;
-
-  sock->bufdata = data;
-  return sock;
-}
-
-/***
- *** Info about who's speaking
- ***/
-static int xbt_trp_tcp_my_port(xbt_socket_t s) {
-  xbt_trp_tcp_sock_data_t sockdata = s->data;
-  return sockdata->port;
-}
-
-static int xbt_trp_tcp_peer_port(xbt_socket_t s) {
-  xbt_trp_tcp_sock_data_t sockdata = s->data;
-  return sockdata->peer_port;
-}
-
-static const char* xbt_trp_tcp_peer_name(xbt_socket_t s) {
-  xbt_trp_tcp_sock_data_t sockdata = s->data;
-  return sockdata->peer_name;
-}
-
-static const char* xbt_trp_tcp_peer_proc(xbt_socket_t s) {
-  xbt_trp_tcp_sock_data_t sockdata = s->data;
-  return sockdata->peer_proc;
-}
-
-static void xbt_trp_tcp_peer_proc_set(xbt_socket_t s,char *name) {
-  xbt_trp_tcp_sock_data_t sockdata = s->data;
-  sockdata->peer_proc = xbt_strdup(name);
-}
-
-/***
- *** Code
- ***/
-void xbt_trp_tcp_setup(xbt_trp_plugin_t plug)
-{
-  plug->my_port = xbt_trp_tcp_my_port;
-  plug->peer_port = xbt_trp_tcp_peer_port;
-  plug->peer_name = xbt_trp_tcp_peer_name;
-  plug->peer_proc = xbt_trp_tcp_peer_proc;
-  plug->peer_proc_set = xbt_trp_tcp_peer_proc_set;
-
-
-  plug->socket_client = xbt_trp_buf_socket_client;
-  plug->socket_server = xbt_trp_buf_socket_server;
-  plug->socket_accept = xbt_trp_buf_socket_accept;
-  plug->socket_close = xbt_trp_buf_socket_close;
-
-#ifdef HAVE_READV
-  plug->send = xbt_trp_iov_send;
-#else
-  plug->send = xbt_trp_buf_send;
-#endif
-  plug->recv = xbt_trp_buf_recv;
-
-  plug->raw_send = xbt_trp_tcp_send;
-  plug->raw_recv = xbt_trp_tcp_recv;
-
-  plug->flush = xbt_trp_bufiov_flush;
-
-  plug->data = NULL;
-  plug->exit = NULL;
-}
-
-static void xbt_trp_buf_socket_client(xbt_trp_plugin_t self,
-                               const char *host,
-                               int port,
-                               /* OUT */ xbt_socket_t sock)
-{
-  xbt_trp_sock_socket_client(NULL, host, port, sock);
-  xbt_trp_buf_init_sock(sock);
-}
-
-/**
- * xbt_trp_buf_socket_server:
- *
- * Open a socket used to receive messages.
- */
-static void xbt_trp_buf_socket_server(xbt_trp_plugin_t self,
-                               int port,
-                               /* OUT */ xbt_socket_t sock)
-{
-  xbt_trp_sock_socket_server(NULL, port, sock);
-  xbt_trp_buf_init_sock(sock);
-}
-
-static xbt_socket_t xbt_trp_buf_socket_accept(xbt_socket_t sock)
-{
-  return xbt_trp_buf_init_sock(xbt_trp_sock_socket_accept(sock));
-}
-
-static void xbt_trp_buf_socket_close(xbt_socket_t sock)
-{
-  xbt_trp_bufdata_t *data = sock->bufdata;
-
-  if (data->in_buf.size != data->in_buf.pos) {
-    XBT_WARN("Socket closed, but %d bytes were unread (size=%d,pos=%d)",
-        data->in_buf.size - data->in_buf.pos,
-        data->in_buf.size, data->in_buf.pos);
-  }
-  free(data->in_buf.data);
-
-  if (data->out_buf.size != data->out_buf.pos) {
-    XBT_DEBUG("Flush the socket before closing (in=%d,out=%d)",
-           data->in_buf.size, data->out_buf.size);
-    xbt_trp_bufiov_flush(sock);
-  }
-  free(data->out_buf.data);
-
-#ifdef HAVE_READV
-  if (data->in_buf_v) {
-    if (!xbt_dynar_is_empty(data->in_buf_v))
-      XBT_WARN("Socket closed, but some bytes were unread");
-    xbt_dynar_free(&data->in_buf_v);
-  }
-  if (data->out_buf_v) {
-    if (!xbt_dynar_is_empty(data->out_buf_v)) {
-      XBT_DEBUG("Flush the socket before closing");
-      xbt_trp_bufiov_flush(sock);
-    }
-    xbt_dynar_free(&data->out_buf_v);
-  }
-#endif
-
-  free(data);
-  xbt_trp_sock_socket_close(sock);
-}
-
-/****************************/
-/****[ HELPER FUNCTIONS ]****/
-/****************************/
-
-/*
- * Returns the tcp protocol number from the network protocol data base, or -1 if not found
- *
- * getprotobyname() is not thread safe. We need to lock it.
- */
-static int xbt_trp_tcp_proto_number(void)
-{
-  struct protoent *fetchedEntry;
-  static int returnValue = 0;
-
-  if (returnValue == 0) {
-    fetchedEntry = getprotobyname("tcp");
-    if (fetchedEntry == NULL) {
-      XBT_VERB("getprotobyname(tcp) gave NULL");
-      returnValue = -1;
-    } else {
-      returnValue = fetchedEntry->p_proto;
-    }
-  }
-
-  return returnValue;
-}
-
-#ifdef HAVE_WINSOCK_H
-#define RETSTR( x ) case x: return #x
-
-const char *xbt_wsa_err2string(int err)
-{
-  switch (err) {
-    RETSTR(WSAEINTR);
-    RETSTR(WSAEBADF);
-    RETSTR(WSAEACCES);
-    RETSTR(WSAEFAULT);
-    RETSTR(WSAEINVAL);
-    RETSTR(WSAEMFILE);
-    RETSTR(WSAEWOULDBLOCK);
-    RETSTR(WSAEINPROGRESS);
-    RETSTR(WSAEALREADY);
-    RETSTR(WSAENOTSOCK);
-    RETSTR(WSAEDESTADDRREQ);
-    RETSTR(WSAEMSGSIZE);
-    RETSTR(WSAEPROTOTYPE);
-    RETSTR(WSAENOPROTOOPT);
-    RETSTR(WSAEPROTONOSUPPORT);
-    RETSTR(WSAESOCKTNOSUPPORT);
-    RETSTR(WSAEOPNOTSUPP);
-    RETSTR(WSAEPFNOSUPPORT);
-    RETSTR(WSAEAFNOSUPPORT);
-    RETSTR(WSAEADDRINUSE);
-    RETSTR(WSAEADDRNOTAVAIL);
-    RETSTR(WSAENETDOWN);
-    RETSTR(WSAENETUNREACH);
-    RETSTR(WSAENETRESET);
-    RETSTR(WSAECONNABORTED);
-    RETSTR(WSAECONNRESET);
-    RETSTR(WSAENOBUFS);
-    RETSTR(WSAEISCONN);
-    RETSTR(WSAENOTCONN);
-    RETSTR(WSAESHUTDOWN);
-    RETSTR(WSAETOOMANYREFS);
-    RETSTR(WSAETIMEDOUT);
-    RETSTR(WSAECONNREFUSED);
-    RETSTR(WSAELOOP);
-    RETSTR(WSAENAMETOOLONG);
-    RETSTR(WSAEHOSTDOWN);
-    RETSTR(WSAEHOSTUNREACH);
-    RETSTR(WSAENOTEMPTY);
-    RETSTR(WSAEPROCLIM);
-    RETSTR(WSAEUSERS);
-    RETSTR(WSAEDQUOT);
-    RETSTR(WSAESTALE);
-    RETSTR(WSAEREMOTE);
-    RETSTR(WSASYSNOTREADY);
-    RETSTR(WSAVERNOTSUPPORTED);
-    RETSTR(WSANOTINITIALISED);
-    RETSTR(WSAEDISCON);
-
-#ifdef HAVE_WINSOCK2_H
-    RETSTR(WSAENOMORE);
-    RETSTR(WSAECANCELLED);
-    RETSTR(WSAEINVALIDPROCTABLE);
-    RETSTR(WSAEINVALIDPROVIDER);
-    RETSTR(WSASYSCALLFAILURE);
-    RETSTR(WSASERVICE_NOT_FOUND);
-    RETSTR(WSATYPE_NOT_FOUND);
-    RETSTR(WSA_E_NO_MORE);
-    RETSTR(WSA_E_CANCELLED);
-    RETSTR(WSAEREFUSED);
-#endif                          /* HAVE_WINSOCK2_H */
-
-    RETSTR(WSAHOST_NOT_FOUND);
-    RETSTR(WSATRY_AGAIN);
-    RETSTR(WSANO_RECOVERY);
-    RETSTR(WSANO_DATA);
-  }
-  return "unknown WSA error";
-}
-#endif                          /* HAVE_WINSOCK_H */
-
-/***********************************/
-/****[ end of HELPER FUNCTIONS ]****/
-/***********************************/
index 50ac952..664d87b 100644 (file)
@@ -9,6 +9,7 @@
 #include "xbt/misc.h"
 #include "xbt/virtu.h"
 #include "xbt/function_types.h"
+#include "simgrid/simix.h"
 
 static int xbt_fake_pid(void)
 {
@@ -16,3 +17,25 @@ static int xbt_fake_pid(void)
 }
 
 int_f_void_t xbt_getpid = xbt_fake_pid;
+
+/*
+ * Time elapsed since the beginning of the simulation.
+ */
+double xbt_time()
+{
+  /* FIXME: check if we should use the request mechanism or not */
+  return SIMIX_get_clock();
+}
+
+/*
+ * Freeze the process for the specified amount of time
+ */
+void xbt_sleep(double sec)
+{
+  simcall_process_sleep(sec);
+}
+
+const char *xbt_procname(void)
+{
+  return SIMIX_process_self_get_name();
+}
index 9e0892f..8e86bf8 100644 (file)
@@ -26,11 +26,6 @@ void xbt_dict_postexit(void);
 void xbt_os_thread_mod_preinit(void);
 void xbt_os_thread_mod_postexit(void);
 
-void xbt_trp_preinit(void);
-void xbt_trp_postexit(void);
-void xbt_datadesc_preinit(void);
-void xbt_datadesc_postexit(void);
-
 void *mmalloc_preinit(void);
 void mmalloc_postexit(void);
 
diff --git a/teshsuite/gras/CMakeLists.txt b/teshsuite/gras/CMakeLists.txt
deleted file mode 100644 (file)
index aa1ed39..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/gras.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  PARENT_SCOPE
-  )
-set(teshsuite_src
-  ${teshsuite_src}
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
-set(txt_files
-  ${txt_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/README
-  PARENT_SCOPE
-  )
diff --git a/teshsuite/gras/README b/teshsuite/gras/README
deleted file mode 100644 (file)
index 7cdf135..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-This directory contains several tests to the GRAS mecanism. The
-difference with the examples/gras directory is that what's in here
-tests some corner case that nobody would try in the first place. Here
-is a list of the directory content:
-
-empty_main/ Once upon a time, GRAS was broken when processes did
-           nothing. This test is here to ensure that this never
-           happen again.
-           
-msg_handle/ Ensures the wanted semantic for gras_msg_handle(i) when
-            i<0, i==0 and i>0.
-
-numerous_rpc/ Ensures that it is ok to have a very large amount of
-              very small RPC in real life (it used to be a race
-              condition in the socket mechanism stuff)
diff --git a/teshsuite/gras/datadesc/CMakeLists.txt b/teshsuite/gras/datadesc/CMakeLists.txt
deleted file mode 100644 (file)
index 7d80a67..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-if(NOT WIN32)
-  set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-
-  add_executable(datadesc_usage datadesc_usage.c datadesc_structs.c)
-
-  ### Add definitions for compile
-  target_link_libraries(datadesc_usage gras m pthread)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/datadesc_r_little32_4.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/datadesc_r_big32_8_4.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/datadesc_mem.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/datadesc_r_little64.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/datadesc.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/datadesc_rw.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  PARENT_SCOPE
-  )
-set(teshsuite_src
-  ${teshsuite_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/datadesc_usage.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/datadesc_structs.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/mk_datadesc_structs.pl
-  PARENT_SCOPE
-  )
-set(txt_files
-  ${txt_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/datadesc.big32_8_4
-  ${CMAKE_CURRENT_SOURCE_DIR}/datadesc.big64
-  ${CMAKE_CURRENT_SOURCE_DIR}/datadesc.little32_4
-  ${CMAKE_CURRENT_SOURCE_DIR}/datadesc.little64
-  PARENT_SCOPE
-  )
diff --git a/teshsuite/gras/datadesc/datadesc.big32_8_4 b/teshsuite/gras/datadesc/datadesc.big32_8_4
deleted file mode 100644 (file)
index f230874..0000000
Binary files a/teshsuite/gras/datadesc/datadesc.big32_8_4 and /dev/null differ
diff --git a/teshsuite/gras/datadesc/datadesc.big64 b/teshsuite/gras/datadesc/datadesc.big64
deleted file mode 100644 (file)
index 167f95d..0000000
Binary files a/teshsuite/gras/datadesc/datadesc.big64 and /dev/null differ
diff --git a/teshsuite/gras/datadesc/datadesc.little32_4 b/teshsuite/gras/datadesc/datadesc.little32_4
deleted file mode 100644 (file)
index 84dcda7..0000000
Binary files a/teshsuite/gras/datadesc/datadesc.little32_4 and /dev/null differ
diff --git a/teshsuite/gras/datadesc/datadesc.little64 b/teshsuite/gras/datadesc/datadesc.little64
deleted file mode 100644 (file)
index b3e5e7d..0000000
Binary files a/teshsuite/gras/datadesc/datadesc.little64 and /dev/null differ
diff --git a/teshsuite/gras/datadesc/datadesc.tesh b/teshsuite/gras/datadesc/datadesc.tesh
deleted file mode 100644 (file)
index deae085..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#! ./tesh
-
-# Description of this tesh file
-! D This tesh file contains all the tesh files relative with Gras
-
-# Gras datadesc suite
-
-! suite Checks the marshaling facilities of Gras
-! include datadesc_mem.tesh             Try to do a in-memory copy
-! include datadesc_rw.tesh              Try to read what we write
-! include datadesc_r_big32_2.tesh       Try to read the result of linux/mips?
-! include datadesc_r_big32_8.tesh       Try to read the result of ppc/sparc?
-! include datadesc_r_big32_8_4.tesh     Try to read the result of AIX
-! include datadesc_r_little32_4.tesh    Try to read the result of linux/x86
-! include datadesc_r_little64.tesh      Try to read the result of linux/amd64
diff --git a/teshsuite/gras/datadesc/datadesc_mem.tesh b/teshsuite/gras/datadesc/datadesc_mem.tesh
deleted file mode 100644 (file)
index b59d27f..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-
-p Check the marshaling facilities (trying to to do a in-memory copy)
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ gras/datadesc/datadesc_usage --copy "--log=root.fmt:%m%n"
-> Memory copy
-> ---- Test on integer ----
-> ---- Test on float ----
-> ---- Test on double ----
-> ---- Test on fixed array ----
-> ---- Test on a reference to an integer ----
-> ---- Test on string (ref to dynamic array) ----
-> ---- Test on dynar containing integers ----
-> ---- Test on empty dynar of integers ----
-> ---- Test on all possible struct having 4 fields (49 structs) ----
-> ---- Test on homogeneous structure ----
-> ---- Test on heterogeneous structure ----
-> ---- Test on nested structures ----
-> ---- Test on heterogeneous structure arrays ----
-> ---- Test on chained list ----
-> ---- Test on graph (cyclique chained list of 3 items) ----
-> ---- Test on dynar containing integers ----
-> ---- Test on the PBIO IEEE struct (also tests GRAS DEFINE TYPE) ----
-> ---- Test on struct containing dynamic array and its size (cbps test) ----
-> ---- Test on struct containing dynamic array and its size when size=0 (cbps test) ----
-> Exiting GRAS
diff --git a/teshsuite/gras/datadesc/datadesc_r_big32_8_4.tesh b/teshsuite/gras/datadesc/datadesc_r_big32_8_4.tesh
deleted file mode 100644 (file)
index 9653525..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-
-p Check the marshaling facilities (trying to read the result of AIX)
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ gras/datadesc/datadesc_usage --read ${srcdir:=.}/gras/datadesc/datadesc.big32_8_4 --log=test.thres:verbose --log=structs.thres:info "--log=root.fmt:%m%n"
-> Read from file datadesc.big32_8_4
-> This file was generated on big32_8_4 (7)
-> ---- Test on integer ----
-> ---- Test on float ----
-> ---- Test on double ----
-> ---- Test on fixed array ----
-> ---- Test on a reference to an integer ----
-> ---- Test on string (ref to dynamic array) ----
-> ---- Test on dynar containing integers ----
-> ---- Test on empty dynar of integers ----
-> ---- Test on all possible struct having 4 fields (49 structs) ----
-> ---- Test on homogeneous structure ----
-> ---- Test on heterogeneous structure ----
-> ---- Test on nested structures ----
-> ---- Test on heterogeneous structure arrays ----
-> ---- Test on chained list ----
-> ---- Test on graph (cyclique chained list of 3 items) ----
-> ---- Test on dynar containing integers ----
-> ---- Test on the PBIO IEEE struct (also tests GRAS DEFINE TYPE) ----
-> ---- Test on struct containing dynamic array and its size (cbps test) ----
-> ---- Test on struct containing dynamic array and its size when size=0 (cbps test) ----
-> Exiting GRAS
diff --git a/teshsuite/gras/datadesc/datadesc_r_little32_4.tesh b/teshsuite/gras/datadesc/datadesc_r_little32_4.tesh
deleted file mode 100644 (file)
index 326cf7a..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-
-p Check the marshaling facilities (trying to read the result of linux/x86)
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ gras/datadesc/datadesc_usage --read ${srcdir:=.}/gras/datadesc/datadesc.little32_4  --log=test.thres:verbose --log=structs.thres:info "--log=root.fmt:%m%n"
-> Read from file datadesc.little32_4
-> This file was generated on little32_4 (2)
-> ---- Test on integer ----
-> ---- Test on float ----
-> ---- Test on double ----
-> ---- Test on fixed array ----
-> ---- Test on a reference to an integer ----
-> ---- Test on string (ref to dynamic array) ----
-> ---- Test on dynar containing integers ----
-> ---- Test on empty dynar of integers ----
-> ---- Test on all possible struct having 4 fields (49 structs) ----
-> ---- Test on homogeneous structure ----
-> ---- Test on heterogeneous structure ----
-> ---- Test on nested structures ----
-> ---- Test on heterogeneous structure arrays ----
-> ---- Test on chained list ----
-> ---- Test on graph (cyclique chained list of 3 items) ----
-> ---- Test on dynar containing integers ----
-> ---- Test on the PBIO IEEE struct (also tests GRAS DEFINE TYPE) ----
-> ---- Test on struct containing dynamic array and its size (cbps test) ----
-> ---- Test on struct containing dynamic array and its size when size=0 (cbps test) ----
-> Exiting GRAS
diff --git a/teshsuite/gras/datadesc/datadesc_r_little64.tesh b/teshsuite/gras/datadesc/datadesc_r_little64.tesh
deleted file mode 100644 (file)
index e2fd6e6..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-
-p Check the marshaling facilities (trying to read the result of linux/amd64)
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV gras/datadesc/datadesc_usage --read ${srcdir:=.}/gras/datadesc/datadesc.little64  --log=test.thres:verbose --log=structs.thres:info "--log=root.fmt:%m%n"
-> Read from file datadesc.little64
-> This file was generated on little64 (4)
-> ---- Test on integer ----
-> ---- Test on float ----
-> ---- Test on double ----
-> ---- Test on fixed array ----
-> ---- Test on a reference to an integer ----
-> ---- Test on string (ref to dynamic array) ----
-> ---- Test on dynar containing integers ----
-> ---- Test on empty dynar of integers ----
-> ---- Test on all possible struct having 4 fields (49 structs) ----
-> ---- Test on homogeneous structure ----
-> ---- Test on heterogeneous structure ----
-> ---- Test on nested structures ----
-> ---- Test on heterogeneous structure arrays ----
-> ---- Test on chained list ----
-> ---- Test on graph (cyclique chained list of 3 items) ----
-> ---- Test on dynar containing integers ----
-> ---- Test on the PBIO IEEE struct (also tests GRAS DEFINE TYPE) ----
-> ---- Test on struct containing dynamic array and its size (cbps test) ----
-> ---- Test on struct containing dynamic array and its size when size=0 (cbps test) ----
-> Exiting GRAS
diff --git a/teshsuite/gras/datadesc/datadesc_rw.tesh b/teshsuite/gras/datadesc/datadesc_rw.tesh
deleted file mode 100644 (file)
index 0922f56..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-
-p Check the marshaling facilities (trying to read what we write)
-$ rm -f datadesc_usage.out
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ gras/datadesc/datadesc_usage --write "--log=root.fmt:%m%n"
-> Write to file datadesc_usage.out
-> ---- Test on integer ----
-> ---- Test on float ----
-> ---- Test on double ----
-> ---- Test on fixed array ----
-> ---- Test on a reference to an integer ----
-> ---- Test on string (ref to dynamic array) ----
-> ---- Test on dynar containing integers ----
-> ---- Test on empty dynar of integers ----
-> ---- Test on all possible struct having 4 fields (49 structs) ----
-> ---- Test on homogeneous structure ----
-> ---- Test on heterogeneous structure ----
-> ---- Test on nested structures ----
-> ---- Test on heterogeneous structure arrays ----
-> ---- Test on chained list ----
-> ---- Test on graph (cyclique chained list of 3 items) ----
-> ---- Test on dynar containing integers ----
-> ---- Test on the PBIO IEEE struct (also tests GRAS DEFINE TYPE) ----
-> ---- Test on struct containing dynamic array and its size (cbps test) ----
-> ---- Test on struct containing dynamic array and its size when size=0 (cbps test) ----
-> Exiting GRAS
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ gras/datadesc/datadesc_usage --read "--log=root.fmt:%m%n"
-> Read from file datadesc_usage.out
-> ---- Test on integer ----
-> ---- Test on float ----
-> ---- Test on double ----
-> ---- Test on fixed array ----
-> ---- Test on a reference to an integer ----
-> ---- Test on string (ref to dynamic array) ----
-> ---- Test on dynar containing integers ----
-> ---- Test on empty dynar of integers ----
-> ---- Test on all possible struct having 4 fields (49 structs) ----
-> ---- Test on homogeneous structure ----
-> ---- Test on heterogeneous structure ----
-> ---- Test on nested structures ----
-> ---- Test on heterogeneous structure arrays ----
-> ---- Test on chained list ----
-> ---- Test on graph (cyclique chained list of 3 items) ----
-> ---- Test on dynar containing integers ----
-> ---- Test on the PBIO IEEE struct (also tests GRAS DEFINE TYPE) ----
-> ---- Test on struct containing dynamic array and its size (cbps test) ----
-> ---- Test on struct containing dynamic array and its size when size=0 (cbps test) ----
-> Exiting GRAS
diff --git a/teshsuite/gras/datadesc/datadesc_structs.c b/teshsuite/gras/datadesc/datadesc_structs.c
deleted file mode 100644 (file)
index c9bb728..0000000
+++ /dev/null
@@ -1,609 +0,0 @@
-/* This file is perl-generated, of course */
-
-#include "gras.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(structs,test,"Logs about the gigantic struct test");
-
-#define READ  0
-#define WRITE 1
-#define RW    2
-
-void write_read(const char *type,void *src, void *dst, xbt_socket_t *sock, int direction);
-
-XBT_DEFINE_TYPE(cccc,struct cccc { char a; char b; char c;char d;};)
-XBT_DEFINE_TYPE(ccsc,struct ccsc { char a; char b; short int c;char d;};)
-XBT_DEFINE_TYPE(ccic,struct ccic { char a; char b; int c;char d;};)
-XBT_DEFINE_TYPE(cclc,struct cclc { char a; char b; long int c;char d;};)
-XBT_DEFINE_TYPE(ccLc,struct ccLc { char a; char b; long long int c;char d;};)
-XBT_DEFINE_TYPE(ccfc,struct ccfc { char a; char b; float c;char d;};)
-XBT_DEFINE_TYPE(ccdc,struct ccdc { char a; char b; double c;char d;};)
-XBT_DEFINE_TYPE(sccc,struct sccc { short int a; char b; char c;char d;};)
-XBT_DEFINE_TYPE(scsc,struct scsc { short int a; char b; short int c;char d;};)
-XBT_DEFINE_TYPE(scic,struct scic { short int a; char b; int c;char d;};)
-XBT_DEFINE_TYPE(sclc,struct sclc { short int a; char b; long int c;char d;};)
-XBT_DEFINE_TYPE(scLc,struct scLc { short int a; char b; long long int c;char d;};)
-XBT_DEFINE_TYPE(scfc,struct scfc { short int a; char b; float c;char d;};)
-XBT_DEFINE_TYPE(scdc,struct scdc { short int a; char b; double c;char d;};)
-XBT_DEFINE_TYPE(iccc,struct iccc { int a; char b; char c;char d;};)
-XBT_DEFINE_TYPE(icsc,struct icsc { int a; char b; short int c;char d;};)
-XBT_DEFINE_TYPE(icic,struct icic { int a; char b; int c;char d;};)
-XBT_DEFINE_TYPE(iclc,struct iclc { int a; char b; long int c;char d;};)
-XBT_DEFINE_TYPE(icLc,struct icLc { int a; char b; long long int c;char d;};)
-XBT_DEFINE_TYPE(icfc,struct icfc { int a; char b; float c;char d;};)
-XBT_DEFINE_TYPE(icdc,struct icdc { int a; char b; double c;char d;};)
-XBT_DEFINE_TYPE(lccc,struct lccc { long int a; char b; char c;char d;};)
-XBT_DEFINE_TYPE(lcsc,struct lcsc { long int a; char b; short int c;char d;};)
-XBT_DEFINE_TYPE(lcic,struct lcic { long int a; char b; int c;char d;};)
-XBT_DEFINE_TYPE(lclc,struct lclc { long int a; char b; long int c;char d;};)
-XBT_DEFINE_TYPE(lcLc,struct lcLc { long int a; char b; long long int c;char d;};)
-XBT_DEFINE_TYPE(lcfc,struct lcfc { long int a; char b; float c;char d;};)
-XBT_DEFINE_TYPE(lcdc,struct lcdc { long int a; char b; double c;char d;};)
-XBT_DEFINE_TYPE(Lccc,struct Lccc { long long int a; char b; char c;char d;};)
-XBT_DEFINE_TYPE(Lcsc,struct Lcsc { long long int a; char b; short int c;char d;};)
-XBT_DEFINE_TYPE(Lcic,struct Lcic { long long int a; char b; int c;char d;};)
-XBT_DEFINE_TYPE(Lclc,struct Lclc { long long int a; char b; long int c;char d;};)
-XBT_DEFINE_TYPE(LcLc,struct LcLc { long long int a; char b; long long int c;char d;};)
-XBT_DEFINE_TYPE(Lcfc,struct Lcfc { long long int a; char b; float c;char d;};)
-XBT_DEFINE_TYPE(Lcdc,struct Lcdc { long long int a; char b; double c;char d;};)
-XBT_DEFINE_TYPE(fccc,struct fccc { float a; char b; char c;char d;};)
-XBT_DEFINE_TYPE(fcsc,struct fcsc { float a; char b; short int c;char d;};)
-XBT_DEFINE_TYPE(fcic,struct fcic { float a; char b; int c;char d;};)
-XBT_DEFINE_TYPE(fclc,struct fclc { float a; char b; long int c;char d;};)
-XBT_DEFINE_TYPE(fcLc,struct fcLc { float a; char b; long long int c;char d;};)
-XBT_DEFINE_TYPE(fcfc,struct fcfc { float a; char b; float c;char d;};)
-XBT_DEFINE_TYPE(fcdc,struct fcdc { float a; char b; double c;char d;};)
-XBT_DEFINE_TYPE(dccc,struct dccc { double a; char b; char c;char d;};)
-XBT_DEFINE_TYPE(dcsc,struct dcsc { double a; char b; short int c;char d;};)
-XBT_DEFINE_TYPE(dcic,struct dcic { double a; char b; int c;char d;};)
-XBT_DEFINE_TYPE(dclc,struct dclc { double a; char b; long int c;char d;};)
-XBT_DEFINE_TYPE(dcLc,struct dcLc { double a; char b; long long int c;char d;};)
-XBT_DEFINE_TYPE(dcfc,struct dcfc { double a; char b; float c;char d;};)
-XBT_DEFINE_TYPE(dcdc,struct dcdc { double a; char b; double c;char d;};)
-
-#define test(a) xbt_assert(a)
-void register_structures(void);
-void register_structures(void) {
-  gras_msgtype_declare("cccc", xbt_datadesc_by_symbol(cccc));
-  gras_msgtype_declare("ccsc", xbt_datadesc_by_symbol(ccsc));
-  gras_msgtype_declare("ccic", xbt_datadesc_by_symbol(ccic));
-  gras_msgtype_declare("cclc", xbt_datadesc_by_symbol(cclc));
-  gras_msgtype_declare("ccLc", xbt_datadesc_by_symbol(ccLc));
-  gras_msgtype_declare("ccfc", xbt_datadesc_by_symbol(ccfc));
-  gras_msgtype_declare("ccdc", xbt_datadesc_by_symbol(ccdc));
-  gras_msgtype_declare("sccc", xbt_datadesc_by_symbol(sccc));
-  gras_msgtype_declare("scsc", xbt_datadesc_by_symbol(scsc));
-  gras_msgtype_declare("scic", xbt_datadesc_by_symbol(scic));
-  gras_msgtype_declare("sclc", xbt_datadesc_by_symbol(sclc));
-  gras_msgtype_declare("scLc", xbt_datadesc_by_symbol(scLc));
-  gras_msgtype_declare("scfc", xbt_datadesc_by_symbol(scfc));
-  gras_msgtype_declare("scdc", xbt_datadesc_by_symbol(scdc));
-  gras_msgtype_declare("iccc", xbt_datadesc_by_symbol(iccc));
-  gras_msgtype_declare("icsc", xbt_datadesc_by_symbol(icsc));
-  gras_msgtype_declare("icic", xbt_datadesc_by_symbol(icic));
-  gras_msgtype_declare("iclc", xbt_datadesc_by_symbol(iclc));
-  gras_msgtype_declare("icLc", xbt_datadesc_by_symbol(icLc));
-  gras_msgtype_declare("icfc", xbt_datadesc_by_symbol(icfc));
-  gras_msgtype_declare("icdc", xbt_datadesc_by_symbol(icdc));
-  gras_msgtype_declare("lccc", xbt_datadesc_by_symbol(lccc));
-  gras_msgtype_declare("lcsc", xbt_datadesc_by_symbol(lcsc));
-  gras_msgtype_declare("lcic", xbt_datadesc_by_symbol(lcic));
-  gras_msgtype_declare("lclc", xbt_datadesc_by_symbol(lclc));
-  gras_msgtype_declare("lcLc", xbt_datadesc_by_symbol(lcLc));
-  gras_msgtype_declare("lcfc", xbt_datadesc_by_symbol(lcfc));
-  gras_msgtype_declare("lcdc", xbt_datadesc_by_symbol(lcdc));
-  gras_msgtype_declare("Lccc", xbt_datadesc_by_symbol(Lccc));
-  gras_msgtype_declare("Lcsc", xbt_datadesc_by_symbol(Lcsc));
-  gras_msgtype_declare("Lcic", xbt_datadesc_by_symbol(Lcic));
-  gras_msgtype_declare("Lclc", xbt_datadesc_by_symbol(Lclc));
-  gras_msgtype_declare("LcLc", xbt_datadesc_by_symbol(LcLc));
-  gras_msgtype_declare("Lcfc", xbt_datadesc_by_symbol(Lcfc));
-  gras_msgtype_declare("Lcdc", xbt_datadesc_by_symbol(Lcdc));
-  gras_msgtype_declare("fccc", xbt_datadesc_by_symbol(fccc));
-  gras_msgtype_declare("fcsc", xbt_datadesc_by_symbol(fcsc));
-  gras_msgtype_declare("fcic", xbt_datadesc_by_symbol(fcic));
-  gras_msgtype_declare("fclc", xbt_datadesc_by_symbol(fclc));
-  gras_msgtype_declare("fcLc", xbt_datadesc_by_symbol(fcLc));
-  gras_msgtype_declare("fcfc", xbt_datadesc_by_symbol(fcfc));
-  gras_msgtype_declare("fcdc", xbt_datadesc_by_symbol(fcdc));
-  gras_msgtype_declare("dccc", xbt_datadesc_by_symbol(dccc));
-  gras_msgtype_declare("dcsc", xbt_datadesc_by_symbol(dcsc));
-  gras_msgtype_declare("dcic", xbt_datadesc_by_symbol(dcic));
-  gras_msgtype_declare("dclc", xbt_datadesc_by_symbol(dclc));
-  gras_msgtype_declare("dcLc", xbt_datadesc_by_symbol(dcLc));
-  gras_msgtype_declare("dcfc", xbt_datadesc_by_symbol(dcfc));
-  gras_msgtype_declare("dcdc", xbt_datadesc_by_symbol(dcdc));
-}
-void test_structures(xbt_socket_t *sock, int direction);
-void test_structures(xbt_socket_t *sock, int direction) {
-  struct cccc my_cccc = {'w'+(char)1,'w'+(char)2,'w'+(char)3,'w'+(char)4}, my_cccc2;
-  struct ccsc my_ccsc = {'w'+(char)1,'w'+(char)2,134+(short int)3,'w'+(char)4}, my_ccsc2;
-  struct ccic my_ccic = {'w'+(char)1,'w'+(char)2,-11249+(int)3,'w'+(char)4}, my_ccic2;
-  struct cclc my_cclc = {'w'+(char)1,'w'+(char)2,31319919+(long int)3,'w'+(char)4}, my_cclc2;
-  struct ccLc my_ccLc = {'w'+(char)1,'w'+(char)2,-232130010+(long long int)3,'w'+(char)4}, my_ccLc2;
-  struct ccfc my_ccfc = {'w'+(char)1,'w'+(char)2,-11313.1135+(float)3,'w'+(char)4}, my_ccfc2;
-  struct ccdc my_ccdc = {'w'+(char)1,'w'+(char)2,1424420.11331+(double)3,'w'+(char)4}, my_ccdc2;
-  struct sccc my_sccc = {134+(short int)1,'w'+(char)2,'w'+(char)3,'w'+(char)4}, my_sccc2;
-  struct scsc my_scsc = {134+(short int)1,'w'+(char)2,134+(short int)3,'w'+(char)4}, my_scsc2;
-  struct scic my_scic = {134+(short int)1,'w'+(char)2,-11249+(int)3,'w'+(char)4}, my_scic2;
-  struct sclc my_sclc = {134+(short int)1,'w'+(char)2,31319919+(long int)3,'w'+(char)4}, my_sclc2;
-  struct scLc my_scLc = {134+(short int)1,'w'+(char)2,-232130010+(long long int)3,'w'+(char)4}, my_scLc2;
-  struct scfc my_scfc = {134+(short int)1,'w'+(char)2,-11313.1135+(float)3,'w'+(char)4}, my_scfc2;
-  struct scdc my_scdc = {134+(short int)1,'w'+(char)2,1424420.11331+(double)3,'w'+(char)4}, my_scdc2;
-  struct iccc my_iccc = {-11249+(int)1,'w'+(char)2,'w'+(char)3,'w'+(char)4}, my_iccc2;
-  struct icsc my_icsc = {-11249+(int)1,'w'+(char)2,134+(short int)3,'w'+(char)4}, my_icsc2;
-  struct icic my_icic = {-11249+(int)1,'w'+(char)2,-11249+(int)3,'w'+(char)4}, my_icic2;
-  struct iclc my_iclc = {-11249+(int)1,'w'+(char)2,31319919+(long int)3,'w'+(char)4}, my_iclc2;
-  struct icLc my_icLc = {-11249+(int)1,'w'+(char)2,-232130010+(long long int)3,'w'+(char)4}, my_icLc2;
-  struct icfc my_icfc = {-11249+(int)1,'w'+(char)2,-11313.1135+(float)3,'w'+(char)4}, my_icfc2;
-  struct icdc my_icdc = {-11249+(int)1,'w'+(char)2,1424420.11331+(double)3,'w'+(char)4}, my_icdc2;
-  struct lccc my_lccc = {31319919+(long int)1,'w'+(char)2,'w'+(char)3,'w'+(char)4}, my_lccc2;
-  struct lcsc my_lcsc = {31319919+(long int)1,'w'+(char)2,134+(short int)3,'w'+(char)4}, my_lcsc2;
-  struct lcic my_lcic = {31319919+(long int)1,'w'+(char)2,-11249+(int)3,'w'+(char)4}, my_lcic2;
-  struct lclc my_lclc = {31319919+(long int)1,'w'+(char)2,31319919+(long int)3,'w'+(char)4}, my_lclc2;
-  struct lcLc my_lcLc = {31319919+(long int)1,'w'+(char)2,-232130010+(long long int)3,'w'+(char)4}, my_lcLc2;
-  struct lcfc my_lcfc = {31319919+(long int)1,'w'+(char)2,-11313.1135+(float)3,'w'+(char)4}, my_lcfc2;
-  struct lcdc my_lcdc = {31319919+(long int)1,'w'+(char)2,1424420.11331+(double)3,'w'+(char)4}, my_lcdc2;
-  struct Lccc my_Lccc = {-232130010+(long long int)1,'w'+(char)2,'w'+(char)3,'w'+(char)4}, my_Lccc2;
-  struct Lcsc my_Lcsc = {-232130010+(long long int)1,'w'+(char)2,134+(short int)3,'w'+(char)4}, my_Lcsc2;
-  struct Lcic my_Lcic = {-232130010+(long long int)1,'w'+(char)2,-11249+(int)3,'w'+(char)4}, my_Lcic2;
-  struct Lclc my_Lclc = {-232130010+(long long int)1,'w'+(char)2,31319919+(long int)3,'w'+(char)4}, my_Lclc2;
-  struct LcLc my_LcLc = {-232130010+(long long int)1,'w'+(char)2,-232130010+(long long int)3,'w'+(char)4}, my_LcLc2;
-  struct Lcfc my_Lcfc = {-232130010+(long long int)1,'w'+(char)2,-11313.1135+(float)3,'w'+(char)4}, my_Lcfc2;
-  struct Lcdc my_Lcdc = {-232130010+(long long int)1,'w'+(char)2,1424420.11331+(double)3,'w'+(char)4}, my_Lcdc2;
-  struct fccc my_fccc = {-11313.1135+(float)1,'w'+(char)2,'w'+(char)3,'w'+(char)4}, my_fccc2;
-  struct fcsc my_fcsc = {-11313.1135+(float)1,'w'+(char)2,134+(short int)3,'w'+(char)4}, my_fcsc2;
-  struct fcic my_fcic = {-11313.1135+(float)1,'w'+(char)2,-11249+(int)3,'w'+(char)4}, my_fcic2;
-  struct fclc my_fclc = {-11313.1135+(float)1,'w'+(char)2,31319919+(long int)3,'w'+(char)4}, my_fclc2;
-  struct fcLc my_fcLc = {-11313.1135+(float)1,'w'+(char)2,-232130010+(long long int)3,'w'+(char)4}, my_fcLc2;
-  struct fcfc my_fcfc = {-11313.1135+(float)1,'w'+(char)2,-11313.1135+(float)3,'w'+(char)4}, my_fcfc2;
-  struct fcdc my_fcdc = {-11313.1135+(float)1,'w'+(char)2,1424420.11331+(double)3,'w'+(char)4}, my_fcdc2;
-  struct dccc my_dccc = {1424420.11331+(double)1,'w'+(char)2,'w'+(char)3,'w'+(char)4}, my_dccc2;
-  struct dcsc my_dcsc = {1424420.11331+(double)1,'w'+(char)2,134+(short int)3,'w'+(char)4}, my_dcsc2;
-  struct dcic my_dcic = {1424420.11331+(double)1,'w'+(char)2,-11249+(int)3,'w'+(char)4}, my_dcic2;
-  struct dclc my_dclc = {1424420.11331+(double)1,'w'+(char)2,31319919+(long int)3,'w'+(char)4}, my_dclc2;
-  struct dcLc my_dcLc = {1424420.11331+(double)1,'w'+(char)2,-232130010+(long long int)3,'w'+(char)4}, my_dcLc2;
-  struct dcfc my_dcfc = {1424420.11331+(double)1,'w'+(char)2,-11313.1135+(float)3,'w'+(char)4}, my_dcfc2;
-  struct dcdc my_dcdc = {1424420.11331+(double)1,'w'+(char)2,1424420.11331+(double)3,'w'+(char)4}, my_dcdc2;
-  XBT_INFO("---- Test on all possible struct having 4 fields (49 structs) ----");
-  write_read("cccc", &my_cccc, &my_cccc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_cccc.a == my_cccc2.a);
-     test(my_cccc.b == my_cccc2.b);
-     test(my_cccc.c == my_cccc2.c);
-     test(my_cccc.d == my_cccc2.d);
-     if (!failed) XBT_VERB("Passed cccc");
-  }
-  write_read("ccsc", &my_ccsc, &my_ccsc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_ccsc.a == my_ccsc2.a);
-     test(my_ccsc.b == my_ccsc2.b);
-     test(my_ccsc.c == my_ccsc2.c);
-     test(my_ccsc.d == my_ccsc2.d);
-     if (!failed) XBT_VERB("Passed ccsc");
-  }
-  write_read("ccic", &my_ccic, &my_ccic2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_ccic.a == my_ccic2.a);
-     test(my_ccic.b == my_ccic2.b);
-     test(my_ccic.c == my_ccic2.c);
-     test(my_ccic.d == my_ccic2.d);
-     if (!failed) XBT_VERB("Passed ccic");
-  }
-  write_read("cclc", &my_cclc, &my_cclc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_cclc.a == my_cclc2.a);
-     test(my_cclc.b == my_cclc2.b);
-     test(my_cclc.c == my_cclc2.c);
-     test(my_cclc.d == my_cclc2.d);
-     if (!failed) XBT_VERB("Passed cclc");
-  }
-  write_read("ccLc", &my_ccLc, &my_ccLc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_ccLc.a == my_ccLc2.a);
-     test(my_ccLc.b == my_ccLc2.b);
-     test(my_ccLc.c == my_ccLc2.c);
-     test(my_ccLc.d == my_ccLc2.d);
-     if (!failed) XBT_VERB("Passed ccLc");
-  }
-  write_read("ccfc", &my_ccfc, &my_ccfc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_ccfc.a == my_ccfc2.a);
-     test(my_ccfc.b == my_ccfc2.b);
-     test(my_ccfc.c == my_ccfc2.c);
-     test(my_ccfc.d == my_ccfc2.d);
-     if (!failed) XBT_VERB("Passed ccfc");
-  }
-  write_read("ccdc", &my_ccdc, &my_ccdc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_ccdc.a == my_ccdc2.a);
-     test(my_ccdc.b == my_ccdc2.b);
-     test(my_ccdc.c == my_ccdc2.c);
-     test(my_ccdc.d == my_ccdc2.d);
-     if (!failed) XBT_VERB("Passed ccdc");
-  }
-  write_read("sccc", &my_sccc, &my_sccc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_sccc.a == my_sccc2.a);
-     test(my_sccc.b == my_sccc2.b);
-     test(my_sccc.c == my_sccc2.c);
-     test(my_sccc.d == my_sccc2.d);
-     if (!failed) XBT_VERB("Passed sccc");
-  }
-  write_read("scsc", &my_scsc, &my_scsc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_scsc.a == my_scsc2.a);
-     test(my_scsc.b == my_scsc2.b);
-     test(my_scsc.c == my_scsc2.c);
-     test(my_scsc.d == my_scsc2.d);
-     if (!failed) XBT_VERB("Passed scsc");
-  }
-  write_read("scic", &my_scic, &my_scic2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_scic.a == my_scic2.a);
-     test(my_scic.b == my_scic2.b);
-     test(my_scic.c == my_scic2.c);
-     test(my_scic.d == my_scic2.d);
-     if (!failed) XBT_VERB("Passed scic");
-  }
-  write_read("sclc", &my_sclc, &my_sclc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_sclc.a == my_sclc2.a);
-     test(my_sclc.b == my_sclc2.b);
-     test(my_sclc.c == my_sclc2.c);
-     test(my_sclc.d == my_sclc2.d);
-     if (!failed) XBT_VERB("Passed sclc");
-  }
-  write_read("scLc", &my_scLc, &my_scLc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_scLc.a == my_scLc2.a);
-     test(my_scLc.b == my_scLc2.b);
-     test(my_scLc.c == my_scLc2.c);
-     test(my_scLc.d == my_scLc2.d);
-     if (!failed) XBT_VERB("Passed scLc");
-  }
-  write_read("scfc", &my_scfc, &my_scfc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_scfc.a == my_scfc2.a);
-     test(my_scfc.b == my_scfc2.b);
-     test(my_scfc.c == my_scfc2.c);
-     test(my_scfc.d == my_scfc2.d);
-     if (!failed) XBT_VERB("Passed scfc");
-  }
-  write_read("scdc", &my_scdc, &my_scdc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_scdc.a == my_scdc2.a);
-     test(my_scdc.b == my_scdc2.b);
-     test(my_scdc.c == my_scdc2.c);
-     test(my_scdc.d == my_scdc2.d);
-     if (!failed) XBT_VERB("Passed scdc");
-  }
-  write_read("iccc", &my_iccc, &my_iccc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_iccc.a == my_iccc2.a);
-     test(my_iccc.b == my_iccc2.b);
-     test(my_iccc.c == my_iccc2.c);
-     test(my_iccc.d == my_iccc2.d);
-     if (!failed) XBT_VERB("Passed iccc");
-  }
-  write_read("icsc", &my_icsc, &my_icsc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_icsc.a == my_icsc2.a);
-     test(my_icsc.b == my_icsc2.b);
-     test(my_icsc.c == my_icsc2.c);
-     test(my_icsc.d == my_icsc2.d);
-     if (!failed) XBT_VERB("Passed icsc");
-  }
-  write_read("icic", &my_icic, &my_icic2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_icic.a == my_icic2.a);
-     test(my_icic.b == my_icic2.b);
-     test(my_icic.c == my_icic2.c);
-     test(my_icic.d == my_icic2.d);
-     if (!failed) XBT_VERB("Passed icic");
-  }
-  write_read("iclc", &my_iclc, &my_iclc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_iclc.a == my_iclc2.a);
-     test(my_iclc.b == my_iclc2.b);
-     test(my_iclc.c == my_iclc2.c);
-     test(my_iclc.d == my_iclc2.d);
-     if (!failed) XBT_VERB("Passed iclc");
-  }
-  write_read("icLc", &my_icLc, &my_icLc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_icLc.a == my_icLc2.a);
-     test(my_icLc.b == my_icLc2.b);
-     test(my_icLc.c == my_icLc2.c);
-     test(my_icLc.d == my_icLc2.d);
-     if (!failed) XBT_VERB("Passed icLc");
-  }
-  write_read("icfc", &my_icfc, &my_icfc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_icfc.a == my_icfc2.a);
-     test(my_icfc.b == my_icfc2.b);
-     test(my_icfc.c == my_icfc2.c);
-     test(my_icfc.d == my_icfc2.d);
-     if (!failed) XBT_VERB("Passed icfc");
-  }
-  write_read("icdc", &my_icdc, &my_icdc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_icdc.a == my_icdc2.a);
-     test(my_icdc.b == my_icdc2.b);
-     test(my_icdc.c == my_icdc2.c);
-     test(my_icdc.d == my_icdc2.d);
-     if (!failed) XBT_VERB("Passed icdc");
-  }
-  write_read("lccc", &my_lccc, &my_lccc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_lccc.a == my_lccc2.a);
-     test(my_lccc.b == my_lccc2.b);
-     test(my_lccc.c == my_lccc2.c);
-     test(my_lccc.d == my_lccc2.d);
-     if (!failed) XBT_VERB("Passed lccc");
-  }
-  write_read("lcsc", &my_lcsc, &my_lcsc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_lcsc.a == my_lcsc2.a);
-     test(my_lcsc.b == my_lcsc2.b);
-     test(my_lcsc.c == my_lcsc2.c);
-     test(my_lcsc.d == my_lcsc2.d);
-     if (!failed) XBT_VERB("Passed lcsc");
-  }
-  write_read("lcic", &my_lcic, &my_lcic2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_lcic.a == my_lcic2.a);
-     test(my_lcic.b == my_lcic2.b);
-     test(my_lcic.c == my_lcic2.c);
-     test(my_lcic.d == my_lcic2.d);
-     if (!failed) XBT_VERB("Passed lcic");
-  }
-  write_read("lclc", &my_lclc, &my_lclc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_lclc.a == my_lclc2.a);
-     test(my_lclc.b == my_lclc2.b);
-     test(my_lclc.c == my_lclc2.c);
-     test(my_lclc.d == my_lclc2.d);
-     if (!failed) XBT_VERB("Passed lclc");
-  }
-  write_read("lcLc", &my_lcLc, &my_lcLc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_lcLc.a == my_lcLc2.a);
-     test(my_lcLc.b == my_lcLc2.b);
-     test(my_lcLc.c == my_lcLc2.c);
-     test(my_lcLc.d == my_lcLc2.d);
-     if (!failed) XBT_VERB("Passed lcLc");
-  }
-  write_read("lcfc", &my_lcfc, &my_lcfc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_lcfc.a == my_lcfc2.a);
-     test(my_lcfc.b == my_lcfc2.b);
-     test(my_lcfc.c == my_lcfc2.c);
-     test(my_lcfc.d == my_lcfc2.d);
-     if (!failed) XBT_VERB("Passed lcfc");
-  }
-  write_read("lcdc", &my_lcdc, &my_lcdc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_lcdc.a == my_lcdc2.a);
-     test(my_lcdc.b == my_lcdc2.b);
-     test(my_lcdc.c == my_lcdc2.c);
-     test(my_lcdc.d == my_lcdc2.d);
-     if (!failed) XBT_VERB("Passed lcdc");
-  }
-  write_read("Lccc", &my_Lccc, &my_Lccc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_Lccc.a == my_Lccc2.a);
-     test(my_Lccc.b == my_Lccc2.b);
-     test(my_Lccc.c == my_Lccc2.c);
-     test(my_Lccc.d == my_Lccc2.d);
-     if (!failed) XBT_VERB("Passed Lccc");
-  }
-  write_read("Lcsc", &my_Lcsc, &my_Lcsc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_Lcsc.a == my_Lcsc2.a);
-     test(my_Lcsc.b == my_Lcsc2.b);
-     test(my_Lcsc.c == my_Lcsc2.c);
-     test(my_Lcsc.d == my_Lcsc2.d);
-     if (!failed) XBT_VERB("Passed Lcsc");
-  }
-  write_read("Lcic", &my_Lcic, &my_Lcic2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_Lcic.a == my_Lcic2.a);
-     test(my_Lcic.b == my_Lcic2.b);
-     test(my_Lcic.c == my_Lcic2.c);
-     test(my_Lcic.d == my_Lcic2.d);
-     if (!failed) XBT_VERB("Passed Lcic");
-  }
-  write_read("Lclc", &my_Lclc, &my_Lclc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_Lclc.a == my_Lclc2.a);
-     test(my_Lclc.b == my_Lclc2.b);
-     test(my_Lclc.c == my_Lclc2.c);
-     test(my_Lclc.d == my_Lclc2.d);
-     if (!failed) XBT_VERB("Passed Lclc");
-  }
-  write_read("LcLc", &my_LcLc, &my_LcLc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_LcLc.a == my_LcLc2.a);
-     test(my_LcLc.b == my_LcLc2.b);
-     test(my_LcLc.c == my_LcLc2.c);
-     test(my_LcLc.d == my_LcLc2.d);
-     if (!failed) XBT_VERB("Passed LcLc");
-  }
-  write_read("Lcfc", &my_Lcfc, &my_Lcfc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_Lcfc.a == my_Lcfc2.a);
-     test(my_Lcfc.b == my_Lcfc2.b);
-     test(my_Lcfc.c == my_Lcfc2.c);
-     test(my_Lcfc.d == my_Lcfc2.d);
-     if (!failed) XBT_VERB("Passed Lcfc");
-  }
-  write_read("Lcdc", &my_Lcdc, &my_Lcdc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_Lcdc.a == my_Lcdc2.a);
-     test(my_Lcdc.b == my_Lcdc2.b);
-     test(my_Lcdc.c == my_Lcdc2.c);
-     test(my_Lcdc.d == my_Lcdc2.d);
-     if (!failed) XBT_VERB("Passed Lcdc");
-  }
-  write_read("fccc", &my_fccc, &my_fccc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_fccc.a == my_fccc2.a);
-     test(my_fccc.b == my_fccc2.b);
-     test(my_fccc.c == my_fccc2.c);
-     test(my_fccc.d == my_fccc2.d);
-     if (!failed) XBT_VERB("Passed fccc");
-  }
-  write_read("fcsc", &my_fcsc, &my_fcsc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_fcsc.a == my_fcsc2.a);
-     test(my_fcsc.b == my_fcsc2.b);
-     test(my_fcsc.c == my_fcsc2.c);
-     test(my_fcsc.d == my_fcsc2.d);
-     if (!failed) XBT_VERB("Passed fcsc");
-  }
-  write_read("fcic", &my_fcic, &my_fcic2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_fcic.a == my_fcic2.a);
-     test(my_fcic.b == my_fcic2.b);
-     test(my_fcic.c == my_fcic2.c);
-     test(my_fcic.d == my_fcic2.d);
-     if (!failed) XBT_VERB("Passed fcic");
-  }
-  write_read("fclc", &my_fclc, &my_fclc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_fclc.a == my_fclc2.a);
-     test(my_fclc.b == my_fclc2.b);
-     test(my_fclc.c == my_fclc2.c);
-     test(my_fclc.d == my_fclc2.d);
-     if (!failed) XBT_VERB("Passed fclc");
-  }
-  write_read("fcLc", &my_fcLc, &my_fcLc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_fcLc.a == my_fcLc2.a);
-     test(my_fcLc.b == my_fcLc2.b);
-     test(my_fcLc.c == my_fcLc2.c);
-     test(my_fcLc.d == my_fcLc2.d);
-     if (!failed) XBT_VERB("Passed fcLc");
-  }
-  write_read("fcfc", &my_fcfc, &my_fcfc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_fcfc.a == my_fcfc2.a);
-     test(my_fcfc.b == my_fcfc2.b);
-     test(my_fcfc.c == my_fcfc2.c);
-     test(my_fcfc.d == my_fcfc2.d);
-     if (!failed) XBT_VERB("Passed fcfc");
-  }
-  write_read("fcdc", &my_fcdc, &my_fcdc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_fcdc.a == my_fcdc2.a);
-     test(my_fcdc.b == my_fcdc2.b);
-     test(my_fcdc.c == my_fcdc2.c);
-     test(my_fcdc.d == my_fcdc2.d);
-     if (!failed) XBT_VERB("Passed fcdc");
-  }
-  write_read("dccc", &my_dccc, &my_dccc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_dccc.a == my_dccc2.a);
-     test(my_dccc.b == my_dccc2.b);
-     test(my_dccc.c == my_dccc2.c);
-     test(my_dccc.d == my_dccc2.d);
-     if (!failed) XBT_VERB("Passed dccc");
-  }
-  write_read("dcsc", &my_dcsc, &my_dcsc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_dcsc.a == my_dcsc2.a);
-     test(my_dcsc.b == my_dcsc2.b);
-     test(my_dcsc.c == my_dcsc2.c);
-     test(my_dcsc.d == my_dcsc2.d);
-     if (!failed) XBT_VERB("Passed dcsc");
-  }
-  write_read("dcic", &my_dcic, &my_dcic2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_dcic.a == my_dcic2.a);
-     test(my_dcic.b == my_dcic2.b);
-     test(my_dcic.c == my_dcic2.c);
-     test(my_dcic.d == my_dcic2.d);
-     if (!failed) XBT_VERB("Passed dcic");
-  }
-  write_read("dclc", &my_dclc, &my_dclc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_dclc.a == my_dclc2.a);
-     test(my_dclc.b == my_dclc2.b);
-     test(my_dclc.c == my_dclc2.c);
-     test(my_dclc.d == my_dclc2.d);
-     if (!failed) XBT_VERB("Passed dclc");
-  }
-  write_read("dcLc", &my_dcLc, &my_dcLc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_dcLc.a == my_dcLc2.a);
-     test(my_dcLc.b == my_dcLc2.b);
-     test(my_dcLc.c == my_dcLc2.c);
-     test(my_dcLc.d == my_dcLc2.d);
-     if (!failed) XBT_VERB("Passed dcLc");
-  }
-  write_read("dcfc", &my_dcfc, &my_dcfc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_dcfc.a == my_dcfc2.a);
-     test(my_dcfc.b == my_dcfc2.b);
-     test(my_dcfc.c == my_dcfc2.c);
-     test(my_dcfc.d == my_dcfc2.d);
-     if (!failed) XBT_VERB("Passed dcfc");
-  }
-  write_read("dcdc", &my_dcdc, &my_dcdc2, sock,direction);
-  if (direction == READ || direction == RW) {
-     int failed = 0;
-     test(my_dcdc.a == my_dcdc2.a);
-     test(my_dcdc.b == my_dcdc2.b);
-     test(my_dcdc.c == my_dcdc2.c);
-     test(my_dcdc.d == my_dcdc2.d);
-     if (!failed) XBT_VERB("Passed dcdc");
-  }
-}
diff --git a/teshsuite/gras/datadesc/datadesc_usage.c b/teshsuite/gras/datadesc/datadesc_usage.c
deleted file mode 100644 (file)
index 2460d7f..0000000
+++ /dev/null
@@ -1,797 +0,0 @@
-/* datadesc: test of data description (using file transport).               */
-
-/* Copyright (c) 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifdef __BORLANDC__
-#pragma hdrstop
-#endif
-
-#include <stdio.h>
-#include "xbt/datadesc.h"
-#include "xbt/datadesc/datadesc_interface.h"
-#include "gras.h"
-XBT_LOG_NEW_DEFAULT_CATEGORY(test, "Logging specific to this test");
-
-#define READ  0
-#define WRITE 1
-#define COPY  2
-
-const char *filename = "datadesc_usage.out";
-
-void
-write_read(const char *msgtype, void *src, void *dst,
-           xbt_socket_t sock, int direction);
-
-void
-write_read(const char *msgtype, void *src, void *dst,
-           xbt_socket_t sock, int direction)
-{
-
-  switch (direction) {
-  case READ:
-    gras_msg_wait(15, msgtype, NULL, dst);
-    break;
-
-  case WRITE:
-    gras_msg_send(sock, msgtype, src);
-    break;
-
-  case COPY:
-    xbt_datadesc_memcpy(xbt_datadesc_by_name(msgtype), src, dst);
-    break;
-  }
-}
-
-
-/* defined in datadesc_structures.c, which in perl generated */
-void register_structures(void);
-void test_structures(xbt_socket_t sock, int direction);
-
-/************************
- * Each and every tests *
- ************************/
-
-static void test_int(xbt_socket_t sock, int direction)
-{
-  int i = 5, j;
-
-  XBT_INFO("---- Test on integer ----");
-  write_read("int", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY)
-    xbt_assert(i == j);
-}
-
-static void test_float(xbt_socket_t sock, int direction)
-{
-  float i = 5.0, j;
-
-  XBT_INFO("---- Test on float ----");
-  write_read("float", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY)
-    xbt_assert(i == j, "%f != %f", i, j);
-}
-
-static void test_double(xbt_socket_t sock, int direction)
-{
-  double i = -3252355.1234, j;
-
-  XBT_INFO("---- Test on double ----");
-  write_read("double", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY)
-    xbt_assert(i == j, "%f != %f", i, j);
-}
-
-#define FIXED_ARRAY_SIZE 5
-typedef int array[FIXED_ARRAY_SIZE];
-static void test_array(xbt_socket_t sock, int direction)
-{
-  array i = { 35212, -6226, 74337, 11414, 7733 };
-  array j;
-  int cpt;
-
-  XBT_INFO("---- Test on fixed array ----");
-
-  write_read("fixed int array", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-    for (cpt = 0; cpt < FIXED_ARRAY_SIZE; cpt++) {
-      XBT_DEBUG("Test spot %d", cpt);
-      xbt_assert(i[cpt] == j[cpt], "i[%d]=%d  !=  j[%d]=%d",
-                  cpt, i[cpt], cpt, j[cpt]);
-    }
-  }
-}
-
-/*** Dynar of scalar ***/
-
-static void test_dynar_scal(xbt_socket_t sock, int direction)
-{
-  xbt_dynar_t i, j;
-  int cpt;
-
-  XBT_INFO("---- Test on dynar containing integers ----");
-  i = xbt_dynar_new(sizeof(int), NULL);
-  for (cpt = 0; cpt < 64; cpt++) {
-    xbt_dynar_push_as(i, int, cpt);
-    XBT_DEBUG("Push %d, length=%lu", cpt, xbt_dynar_length(i));
-  }
-  /*  xbt_dynar_dump(i); */
-  write_read("xbt_dynar_of_int", &i, &j, sock, direction);
-  /*  xbt_dynar_dump(j); */
-  if (direction == READ || direction == COPY) {
-    for (cpt = 0; cpt < 64; cpt++) {
-      int ret = xbt_dynar_get_as(j, cpt, int);
-      if (cpt != ret) {
-        XBT_CRITICAL
-            ("The retrieved value for cpt=%d is not the same than the injected one (%d!=%d)",
-             cpt, ret, cpt);
-        xbt_abort();
-      }
-    }
-    xbt_dynar_free(&j);
-  }
-  xbt_dynar_free(&i);
-}
-
-/*** Empty dynar ***/
-
-static void test_dynar_empty(xbt_socket_t sock, int direction)
-{
-  xbt_dynar_t i, j;
-
-  XBT_INFO("---- Test on empty dynar of integers ----");
-  i = xbt_dynar_new(sizeof(int), NULL);
-  write_read("xbt_dynar_of_int", &i, &j, sock, direction);
-  /*  xbt_dynar_dump(j); */
-  if (direction == READ || direction == COPY) {
-    xbt_assert(xbt_dynar_is_empty(j));
-    xbt_dynar_free(&j);
-  }
-  xbt_dynar_free(&i);
-}
-
-static void test_intref(xbt_socket_t sock, int direction)
-{
-  int *i, *j;
-
-  i = xbt_new(int, 1);
-  *i = 12345;
-
-  XBT_INFO("---- Test on a reference to an integer ----");
-
-  write_read("int*", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-    xbt_assert(*i == *j, "*i != *j (%d != %d)", *i, *j);
-    free(j);
-  }
-  free(i);
-}
-
-/***
- *** string (dynamic array)
- ***/
-static void test_string(xbt_socket_t sock, int direction)
-{
-  char *i = xbt_strdup("Some data"), *j = NULL;
-  int cpt;
-
-  XBT_INFO("---- Test on string (ref to dynamic array) ----");
-  write_read("string", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-    for (cpt = 0; cpt < strlen(i); cpt++) {
-      xbt_assert(i[cpt] == j[cpt], "i[%d]=%c  !=  j[%d]=%c",
-                  cpt, i[cpt], cpt, j[cpt]);
-    }
-    free(j);
-  }
-  free(i);
-}
-
-
-/***
- *** homogeneous struct
- ***/
-typedef struct {
-  int a, b, c, d;
-} homostruct;
-static void test_homostruct(xbt_socket_t sock, int direction)
-{
-  homostruct *i, *j;
-
-  XBT_INFO("---- Test on homogeneous structure ----");
-  /* init a value, exchange it and check its validity */
-  i = xbt_new(homostruct, 1);
-  i->a = 2235;
-  i->b = 433425;
-  i->c = -23423;
-  i->d = -235235;
-
-  write_read("homostruct*", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-    xbt_assert(i->a == j->a, "i->a=%d != j->a=%d", i->a, j->a);
-    xbt_assert(i->b == j->b);
-    xbt_assert(i->c == j->c);
-    xbt_assert(i->d == j->d);
-    free(j);
-  }
-  free(i);
-}
-
-/***
- *** heterogeneous struct
- ***/
-typedef struct {
-  unsigned char c1;
-  unsigned long int l1;
-  unsigned char c2;
-  unsigned long int l2;
-} hetestruct;
-static void test_hetestruct(xbt_socket_t sock, int direction)
-{
-  hetestruct *i, *j;
-
-  XBT_INFO("---- Test on heterogeneous structure ----");
-  /* init a value, exchange it and check its validity */
-  i = xbt_new(hetestruct, 1);
-  i->c1 = 's';
-  i->l1 = 123455;
-  i->c2 = 'e';
-  i->l2 = 774531;
-
-  write_read("hetestruct*", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-    xbt_assert(i->c1 == j->c1);
-    xbt_assert(i->c2 == j->c2);
-    xbt_assert(i->l1 == j->l1, "i->l1(=%lu)  !=  j->l1(=%lu)", i->l1,
-                j->l1);
-    xbt_assert(i->l2 == j->l2);
-    free(j);
-  }
-  free(i);
-}
-
-static void test_hetestruct_array(xbt_socket_t sock, int direction)
-{
-  hetestruct *i, *j, *p, *q;
-  int cpt;
-
-  XBT_INFO("---- Test on heterogeneous structure arrays ----");
-  /* init a value, exchange it and check its validity */
-  i = xbt_malloc(sizeof(hetestruct) * 10);
-  for (cpt = 0, p = i; cpt < 10; cpt++, p++) {
-    p->c1 = 's' + cpt;
-    p->l1 = 123455 + cpt;
-    p->c2 = 'e' + cpt;
-    p->l2 = 774531 + cpt;
-  }
-
-  write_read("hetestruct[10]*", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-    for (cpt = 0, p = i, q = j; cpt < 10; cpt++, p++, q++) {
-      xbt_assert(p->c1 == q->c1);
-      xbt_assert(p->c2 == q->c2);
-      xbt_assert(p->l1 == p->l1,
-                  "for cpt=%d i->l1(=%lu)  !=  j->l1(=%lu)", cpt, p->l1,
-                  q->l1);
-      xbt_assert(q->l2 == p->l2);
-    }
-    free(j);
-  }
-  free(i);
-}
-
-/***
- *** nested struct
- ***/
-typedef struct {
-  hetestruct hete;
-  homostruct homo;
-} nestedstruct;
-static void test_nestedstruct(xbt_socket_t sock, int direction)
-{
-  nestedstruct *i, *j;
-
-  XBT_INFO("---- Test on nested structures ----");
-  /* init a value, exchange it and check its validity */
-  i = xbt_new(nestedstruct, 1);
-  i->homo.a = 235231;
-  i->homo.b = -124151;
-  i->homo.c = 211551;
-  i->homo.d = -664222;
-  i->hete.c1 = 's';
-  i->hete.l1 = 123455;
-  i->hete.c2 = 'e';
-  i->hete.l2 = 774531;
-
-  write_read("nestedstruct*", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-    xbt_assert(i->homo.a == j->homo.a);
-    xbt_assert(i->homo.b == j->homo.b);
-    xbt_assert(i->homo.c == j->homo.c);
-    xbt_assert(i->homo.d == j->homo.d);
-    xbt_assert(i->hete.c1 == j->hete.c1);
-    xbt_assert(i->hete.c2 == j->hete.c2);
-    xbt_assert(i->hete.l1 == j->hete.l1);
-    xbt_assert(i->hete.l2 == j->hete.l2);
-    free(j);
-  }
-  free(i);
-}
-
-/***
- *** chained list
- ***/
-typedef struct s_chained_list chained_list_t;
-struct s_chained_list {
-  int v;
-  chained_list_t *l;
-};
-chained_list_t *cons(int v, chained_list_t * l);
-void list_free(chained_list_t * l);
-int list_eq(chained_list_t * i, chained_list_t * j);
-
-chained_list_t *cons(int v, chained_list_t * l)
-{
-  chained_list_t *nl = xbt_new(chained_list_t, 1);
-
-  nl->v = v;
-  nl->l = l;
-
-  return nl;
-}
-
-void list_free(chained_list_t * l)
-{
-  if (l) {
-    list_free(l->l);
-    free(l);
-  }
-}
-
-int list_eq(chained_list_t * i, chained_list_t * j)
-{
-  if (!i || !j)
-    return i == j;
-  if (i->v != j->v)
-    return 0;
-  return list_eq(i->l, j->l);
-}
-
-static void test_chain_list(xbt_socket_t sock, int direction)
-{
-  chained_list_t *i, *j;
-
-  XBT_INFO("---- Test on chained list ----");
-
-  /* init a value, exchange it and check its validity */
-  i = cons(12355, cons(246264, cons(23263, NULL)));
-  j = NULL;
-
-  write_read("chained_list_t*", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-    xbt_assert(list_eq(i, j));
-    list_free(j);
-  }
-
-  list_free(i);
-}
-
-/***
- *** graph
- ***/
-static void test_graph(xbt_socket_t sock, int direction)
-{
-  chained_list_t *i, *j;
-
-  XBT_INFO("---- Test on graph (cyclique chained list of 3 items) ----");
-  /* init a value, exchange it and check its validity */
-  i = cons(1151515, cons(-232362, cons(222552, NULL)));
-  i->l->l->l = i;
-  j = NULL;
-
-  write_read("chained_list_t*", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-
-    XBT_DEBUG("i=%p", i);
-    XBT_DEBUG("i->l=%p", i->l);
-    XBT_DEBUG("i->l->l=%p", i->l->l);
-    XBT_DEBUG("i->l->l->l=%p", i->l->l->l);
-    XBT_DEBUG("j=%p", j);
-    XBT_DEBUG("j->l=%p", j->l);
-    XBT_DEBUG("j->l->l=%p", j->l->l);
-    XBT_DEBUG("j->l->l->l=%p", j->l->l->l);
-    xbt_assert(j->l->l->l == j,
-                "Received list is not cyclic. j=%p != j->l->l->l=%p\n"
-                "j=%p; &j=%p", j, j->l->l->l, j, &j);
-    j->l->l->l = NULL;
-    i->l->l->l = NULL;
-    xbt_assert(list_eq(i, j));
-
-    list_free(j);
-  }
-  i->l->l->l = NULL;            /* do this even in WRITE mode */
-  list_free(i);
-}
-
-
-/*** Dynar of references ***/
-static void free_string(void *d)
-{                               /* used to free the data in dynar */
-  free(*(void **) d);
-}
-
-static void test_dynar_ref(xbt_socket_t sock, int direction)
-{
-  xbt_dynar_t i, j;
-  char buf[1024];
-  char *s1, *s2;
-  int cpt;
-
-  XBT_INFO("---- Test on dynar containing integers ----");
-
-  i = xbt_dynar_new(sizeof(char *), &free_string);
-  for (cpt = 0; cpt < 64; cpt++) {
-    sprintf(buf, "%d", cpt);
-    s1 = strdup(buf);
-    xbt_dynar_push(i, &s1);
-  }
-
-  write_read("xbt_dynar_of_string", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-    for (cpt = 0; cpt < 64; cpt++) {
-      sprintf(buf, "%d", cpt);
-      xbt_dynar_shift(j, &s2);
-      xbt_assert(!strcmp(buf, s2),
-                  "The retrieved value is not the same than the injected one (%s!=%s)",
-                  buf, s2);
-      free(s2);
-    }
-    xbt_dynar_free(&j);
-  }
-  xbt_dynar_free(&i);
-}
-
-
-/**** PBIO *****/
-XBT_DEFINE_TYPE(s_pbio, struct s_pbio {        /* structure presented in the IEEE article */
-                int Cnstatv;
-                double Cstatev[12]; int Cnprops; double Cprops[110];
-                int Cndi[4];
-                int Cnshr;
-                int Cnpt; double Cdtime; double Ctime[2]; int Cntens;
-                double Cdfgrd0[373][3];
-                double Cdfgrd1[3][3]; double Cstress[106];
-                double Cddsdde[106][106];
-                };
-
-    )
-
-typedef struct s_pbio pbio_t;
-
-static void test_pbio(xbt_socket_t sock, int direction)
-{
-  int cpt;
-  int cpt2;
-  pbio_t i, j;
-
-  XBT_INFO
-      ("---- Test on the PBIO IEEE struct (also tests GRAS DEFINE TYPE) ----");
-  xbt_datadesc_by_symbol(s_pbio);
-
-  /* Fill in that damn struct */
-  i.Cnstatv = 325115;
-  for (cpt = 0; cpt < 12; cpt++)
-    i.Cstatev[cpt] = ((double) cpt) * -2361.11;
-  i.Cnprops = -37373;
-  for (cpt = 0; cpt < 110; cpt++)
-    i.Cprops[cpt] = cpt * 100.0;
-  for (cpt = 0; cpt < 4; cpt++)
-    i.Cndi[cpt] = cpt * 23262;
-  i.Cnshr = -4634;
-  i.Cnpt = 114142;
-  i.Cdtime = -11515.662;
-  i.Ctime[0] = 332523.226;
-  i.Ctime[1] = -26216.113;
-  i.Cntens = 235211411;
-
-  for (cpt = 0; cpt < 3; cpt++) {
-    for (cpt2 = 0; cpt2 < 373; cpt2++)
-      i.Cdfgrd0[cpt2][cpt] = ((double) cpt) * ((double) cpt2);
-    for (cpt2 = 0; cpt2 < 3; cpt2++)
-      i.Cdfgrd1[cpt][cpt2] = -((double) cpt) * ((double) cpt2);
-  }
-  for (cpt = 0; cpt < 106; cpt++) {
-    i.Cstress[cpt] = (double) cpt *22.113;
-    for (cpt2 = 0; cpt2 < 106; cpt2++)
-      i.Cddsdde[cpt][cpt2] = ((double) cpt) * ((double) cpt2);
-  }
-  write_read("s_pbio", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-    /* Check that the data match */
-    xbt_assert(i.Cnstatv == j.Cnstatv);
-    for (cpt = 0; cpt < 12; cpt++)
-      xbt_assert(i.Cstatev[cpt] == j.Cstatev[cpt],
-                  "i.Cstatev[%d] (=%f) != j.Cstatev[%d] (=%f)",
-                  cpt, i.Cstatev[cpt], cpt, j.Cstatev[cpt]);
-    xbt_assert(i.Cnprops == j.Cnprops);
-    for (cpt = 0; cpt < 110; cpt++)
-      xbt_assert(i.Cprops[cpt] == j.Cprops[cpt]);
-    for (cpt = 0; cpt < 4; cpt++)
-      xbt_assert(i.Cndi[cpt] == j.Cndi[cpt]);
-    xbt_assert(i.Cnshr == j.Cnshr);
-    xbt_assert(i.Cnpt == j.Cnpt);
-    xbt_assert(i.Cdtime == j.Cdtime);
-    xbt_assert(i.Ctime[0] == j.Ctime[0]);
-    xbt_assert(i.Ctime[1] == j.Ctime[1]);
-    xbt_assert(i.Cntens == j.Cntens);
-    for (cpt = 0; cpt < 3; cpt++) {
-      for (cpt2 = 0; cpt2 < 373; cpt2++)
-        xbt_assert(i.Cdfgrd0[cpt2][cpt] == j.Cdfgrd0[cpt2][cpt]);
-      for (cpt2 = 0; cpt2 < 3; cpt2++)
-        xbt_assert(i.Cdfgrd1[cpt][cpt2] == j.Cdfgrd1[cpt][cpt2]);
-    }
-    for (cpt = 0; cpt < 106; cpt++) {
-      xbt_assert(i.Cstress[cpt] == j.Cstress[cpt]);
-      for (cpt2 = 0; cpt2 < 106; cpt2++)
-        xbt_assert(i.Cddsdde[cpt][cpt2] == j.Cddsdde[cpt][cpt2],
-                    "%f=i.Cddsdde[%d][%d] != j.Cddsdde[cpt][cpt2]=%f",
-                    i.Cddsdde[cpt][cpt2], cpt, cpt2, j.Cddsdde[cpt][cpt2]);
-    }
-  }
-}
-
-XBT_DEFINE_TYPE(s_clause, struct s_clause {
-                int num_lits;
-                int *literals XBT_ANNOTE(size, num_lits);     /* Tells GRAS where to find the size */
-                };)
-
-typedef struct s_clause Clause;
-
-static void test_clause(xbt_socket_t sock, int direction)
-{
-  Clause *i, *j;
-  int cpt;
-
-  XBT_INFO
-      ("---- Test on struct containing dynamic array and its size (cbps test) ----");
-
-  /* create and fill the struct */
-  i = xbt_new(Clause, 1);
-
-  i->num_lits = 5432;
-  i->literals = xbt_new(int, i->num_lits);
-  for (cpt = 0; cpt < i->num_lits; cpt++)
-    i->literals[cpt] = cpt * cpt - ((cpt * cpt) / 2);
-  XBT_DEBUG("created data=%p (within %p @%p)", &(i->num_lits), i, &i);
-  XBT_DEBUG("created count=%d", i->num_lits);
-
-  write_read("Clause*", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-    xbt_assert(i->num_lits == j->num_lits);
-    for (cpt = 0; cpt < i->num_lits; cpt++)
-      xbt_assert(i->literals[cpt] == j->literals[cpt]);
-
-    free(j->literals);
-    free(j);
-  }
-  free(i->literals);
-  free(i);
-}
-
-static void test_clause_empty(xbt_socket_t sock, int direction)
-{
-  Clause *i, *j;
-
-  XBT_INFO
-      ("---- Test on struct containing dynamic array and its size when size=0 (cbps test) ----");
-
-  /* create and fill the struct */
-  i = xbt_new(Clause, 1);
-
-  i->num_lits = 0;
-  i->literals = NULL;
-  XBT_DEBUG("created data=%p (within %p @%p)", &(i->num_lits), i, &i);
-  XBT_DEBUG("created count=%d", i->num_lits);
-
-  write_read("Clause*", &i, &j, sock, direction);
-  if (direction == READ || direction == COPY) {
-    xbt_assert(i->num_lits == j->num_lits);
-
-    free(j->literals);
-    free(j);
-  }
-  free(i->literals);
-  free(i);
-}
-
-static void register_types(void)
-{
-  xbt_datadesc_type_t my_type, ref_my_type;
-
-  gras_msgtype_declare("char", xbt_datadesc_by_name("char"));
-  gras_msgtype_declare("int", xbt_datadesc_by_name("int"));
-  gras_msgtype_declare("float", xbt_datadesc_by_name("float"));
-  gras_msgtype_declare("double", xbt_datadesc_by_name("double"));
-
-  my_type = xbt_datadesc_array_fixed("fixed int array",
-                                      xbt_datadesc_by_name("int"),
-                                      FIXED_ARRAY_SIZE);
-  gras_msgtype_declare("fixed int array", my_type);
-
-  my_type = xbt_datadesc_dynar(xbt_datadesc_by_name("int"), NULL);
-  gras_msgtype_declare("xbt_dynar_of_int", my_type);
-
-  my_type = xbt_datadesc_ref("int*", xbt_datadesc_by_name("int"));
-  gras_msgtype_declare("int*", my_type);
-
-  gras_msgtype_declare("string", xbt_datadesc_by_name("string"));
-
-  my_type = xbt_datadesc_struct("homostruct");
-  xbt_datadesc_struct_append(my_type, "a",
-                              xbt_datadesc_by_name("signed int"));
-  xbt_datadesc_struct_append(my_type, "b", xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_append(my_type, "c", xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_append(my_type, "d", xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_close(my_type);
-  my_type =
-      xbt_datadesc_ref("homostruct*",
-                        xbt_datadesc_by_name("homostruct"));
-  gras_msgtype_declare("homostruct*", my_type);
-
-  my_type = xbt_datadesc_struct("hetestruct");
-  xbt_datadesc_struct_append(my_type, "c1",
-                              xbt_datadesc_by_name("unsigned char"));
-  xbt_datadesc_struct_append(my_type, "l1",
-                              xbt_datadesc_by_name("unsigned long int"));
-  xbt_datadesc_struct_append(my_type, "c2",
-                              xbt_datadesc_by_name("unsigned char"));
-  xbt_datadesc_struct_append(my_type, "l2",
-                              xbt_datadesc_by_name("unsigned long int"));
-  xbt_datadesc_struct_close(my_type);
-  my_type =
-      xbt_datadesc_ref("hetestruct*",
-                        xbt_datadesc_by_name("hetestruct"));
-  gras_msgtype_declare("hetestruct*", my_type);
-
-  my_type =
-      xbt_datadesc_array_fixed("hetestruct[10]",
-                                xbt_datadesc_by_name("hetestruct"), 10);
-  my_type = xbt_datadesc_ref("hetestruct[10]*", my_type);
-  gras_msgtype_declare("hetestruct[10]*", my_type);
-
-  my_type = xbt_datadesc_struct("nestedstruct");
-  xbt_datadesc_struct_append(my_type, "hete",
-                              xbt_datadesc_by_name("hetestruct"));
-  xbt_datadesc_struct_append(my_type, "homo",
-                              xbt_datadesc_by_name("homostruct"));
-  xbt_datadesc_struct_close(my_type);
-  my_type =
-      xbt_datadesc_ref("nestedstruct*",
-                        xbt_datadesc_by_name("nestedstruct"));
-  gras_msgtype_declare("nestedstruct*", my_type);
-
-  my_type = xbt_datadesc_struct("chained_list_t");
-  ref_my_type = xbt_datadesc_ref("chained_list_t*", my_type);
-  xbt_datadesc_struct_append(my_type, "v", xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_append(my_type, "l", ref_my_type);
-  xbt_datadesc_struct_close(my_type);
-  xbt_datadesc_cycle_set(xbt_datadesc_by_name("chained_list_t*"));
-  gras_msgtype_declare("chained_list_t", my_type);
-  gras_msgtype_declare("chained_list_t*", ref_my_type);
-
-  my_type =
-      xbt_datadesc_dynar(xbt_datadesc_by_name("string"), &free_string);
-  gras_msgtype_declare("xbt_dynar_of_string", my_type);
-
-  my_type = xbt_datadesc_by_symbol(s_pbio);
-  gras_msgtype_declare("s_pbio", my_type);
-
-  my_type = xbt_datadesc_by_symbol(s_clause);
-  my_type = xbt_datadesc_ref("Clause*", my_type);
-  gras_msgtype_declare("Clause*", my_type);
-
-}
-
-#ifdef __BORLANDC__
-#pragma argsused
-#endif
-
-int main(int argc, char *argv[])
-{
-  xbt_socket_t sock = NULL;
-  int direction = WRITE;
-  int cpt;
-  char local_arch, remote_arch;
-
-  gras_init(&argc, argv);
-  register_types();
-  register_structures();
-
-  for (cpt = 1; cpt < argc; cpt++) {
-    if (!strcmp(argv[cpt], "--arch")) {
-      XBT_INFO("We are on %s (#%d)",
-            xbt_datadesc_arch_name(xbt_arch_selfid()),
-            (int) xbt_arch_selfid());
-      exit(0);
-    } else if (!strcmp(argv[cpt], "--help")) {
-      printf("Usage: datadesc_usage [option] [filename]\n");
-      printf(" --arch: display the current architecture and quit.\n");
-      printf(" --read file: reads the description from the given file\n");
-      printf(" --write file: writes the description to the given file\n");
-      printf(" --copy: copy the description in memory\n");
-      printf
-          (" --regen: write the description to the file of the current architecture\n");
-      printf(" --help: displays this message\n");
-      exit(0);
-    } else if (!strcmp(argv[cpt], "--regen")) {
-      direction = WRITE;
-      filename =
-          bprintf("datadesc.%s",
-                  xbt_datadesc_arch_name(xbt_arch_selfid()));
-    } else if (!strcmp(argv[cpt], "--read")) {
-      direction = READ;
-    } else if (!strcmp(argv[cpt], "--write")) {
-      direction = WRITE;
-    } else if (!strcmp(argv[cpt], "--copy")) {
-      direction = COPY;
-    } else {
-      filename = argv[cpt];
-    }
-  }
-
-  if (direction == WRITE) {
-    XBT_INFO("Write to file %s",
-          strrchr(filename, '/') ? strrchr(filename, '/') + 1 : filename);
-    sock = gras_socket_client_from_file(filename);
-  }
-  if (direction == READ) {
-    XBT_INFO("Read from file %s",
-          strrchr(filename, '/') ? strrchr(filename, '/') + 1 : filename);
-    sock = gras_socket_server_from_file(filename);
-  }
-  if (direction == COPY) {
-    XBT_INFO("Memory copy");
-  }
-
-  local_arch = xbt_arch_selfid();
-  write_read("char", &local_arch, &remote_arch, sock, direction);
-  if (direction == READ)
-    XBT_VERB("This file was generated on %s (%d)",
-          xbt_datadesc_arch_name(remote_arch), (int) remote_arch);
-
-
-  test_int(sock, direction);
-  test_float(sock, direction);
-  test_double(sock, direction);
-  test_array(sock, direction);
-  test_intref(sock, direction);
-
-  test_string(sock, direction);
-  test_dynar_scal(sock, direction);
-  test_dynar_empty(sock, direction);
-
-  test_structures(sock, direction);
-
-  test_homostruct(sock, direction);
-  test_hetestruct(sock, direction);
-  test_nestedstruct(sock, direction);
-  test_hetestruct_array(sock, direction);
-
-  test_chain_list(sock, direction);
-  test_graph(sock, direction);
-  test_dynar_ref(sock, direction);
-
-  test_pbio(sock, direction);
-
-  test_clause(sock, direction);
-  test_clause_empty(sock, direction);
-
-  if (direction != COPY)
-    gras_socket_close(sock);
-
-  gras_exit();
-  return 0;
-}
diff --git a/teshsuite/gras/datadesc/mk_datadesc_structs.pl b/teshsuite/gras/datadesc/mk_datadesc_structs.pl
deleted file mode 100755 (executable)
index cc16f5a..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-#! /usr/bin/perl
-
-use strict;
-use warnings;
-
-my @types;
-my @abrev;
-my @val;
-
-push @types,"char";          push @abrev, "c"; push @val, "'w'";
-push @types,"short int";     push @abrev, "s"; push @val, '134';
-push @types,"int";           push @abrev, "i"; push @val, '-11249';
-push @types,"long int";      push @abrev, "l"; push @val, '31319919';
-push @types,"long long int"; push @abrev, "L"; push @val, '-232130010';
-push @types,"float";         push @abrev, "f"; push @val, '-11313.1135';
-push @types,"double";        push @abrev, "d"; push @val, '1424420.11331';
-
-die 'scalar @types != scalar @abrev' unless (scalar @types == scalar @abrev);
-
-print "/* This file is perl-generated, of course */\n\n";
-
-print "#include \"gras.h\"\n\n";
-
-print "XBT_LOG_NEW_DEFAULT_SUBCATEGORY(structs,test,\"Logs about the gigantic struct test\");\n\n";
-
-print "#define READ  0\n#define WRITE 1\n#define RW    2\n\n";
-  
-print "void write_read(const char *type,void *src, void *dst, xbt_socket_t *sock, int direction);\n\n";
-
-my ($i,$j,$k,$l);
-my $max=scalar @types;
-# Those max variables can be used to tune how much test you are ready to do.
-# But WARNING! changing them naturally invalidate any existing data file.
-my $max_i=$max-1;
-my $max_j=0;     
-my $max_k=$max-1;
-my $max_l=0;     
-for $i (0..$max_i) { for $j (0..$max_j) { for $k (0..$max_k) { for $l (0..$max_l) {
-    print "XBT_DEFINE_TYPE(".$abrev[$i].$abrev[$j].$abrev[$k].$abrev[$l].",".
-      "struct ".$abrev[$i].$abrev[$j].$abrev[$k].$abrev[$l]." { ".
-        $types[$i]." a; ".
-        $types[$j]." b; ".
-        $types[$k]." c;".
-        $types[$l]." d;".
-      "};)\n";
-}}}}
-
-# print "\n#define test(a) do {if (!(a)) { failed = 1; XBT_ERROR(\"%s failed\",#a);}} while (0)\n";
- print "\n#define test(a) xbt_assert(a)\n";
-
-print "void register_structures(void);\n";
-print "void register_structures(void) {\n";
-for $i (0..$max_i) { for $j (0..$max_j) { for $k (0..$max_k) { for $l (0..$max_l) {
-    my $struct=$abrev[$i].$abrev[$j].$abrev[$k].$abrev[$l];
-    print "  gras_msgtype_declare(\"$struct\", xbt_datadesc_by_symbol($struct));\n";
-}}}}
-print "}\n";
-
-print "void test_structures(xbt_socket_t *sock, int direction);\n";
-print "void test_structures(xbt_socket_t *sock, int direction) {\n";
-for $i (0..$max_i) { for $j (0..$max_j) { for $k (0..$max_k) { for $l (0..$max_l) {
-    my $struct=$abrev[$i].$abrev[$j].$abrev[$k].$abrev[$l];
-    print "  struct $struct my_$struct = {".$val[$i]."+(".$types[$i].")1,"
-                                           .$val[$j]."+(".$types[$j].")2,"
-                                           .$val[$k]."+(".$types[$k].")3,"
-                                           .$val[$l]."+(".$types[$l].")4}, my_${struct}2;\n";
-}}}}
-
-print "  XBT_INFO(\"---- Test on all possible struct having 4 fields (".(($max_i+1)*($max_j+1)*($max_k+1)*($max_l+1))." structs) ----\");\n";
-for $i (0..$max_i) { for $j (0..$max_j) { for $k (0..$max_k) { for $l (0..$max_l) {
-    my $struct=$abrev[$i].$abrev[$j].$abrev[$k].$abrev[$l];
-    print "  write_read(\"$struct\", &my_$struct, &my_${struct}2, sock,direction);\n";
-    print "  if (direction == READ || direction == RW) {\n";
-    print "     int failed = 0;\n";
-    print "     test(my_$struct.a == my_${struct}2.a);\n";
-    print "     test(my_$struct.b == my_${struct}2.b);\n";
-    print "     test(my_$struct.c == my_${struct}2.c);\n";
-    print "     test(my_$struct.d == my_${struct}2.d);\n";
-    print "     if (!failed) XBT_VERB(\"Passed $struct\");\n";
-    print "  }\n";
-}}}}
-    print "}\n";
-    ;
diff --git a/teshsuite/gras/empty_main/CMakeLists.txt b/teshsuite/gras/empty_main/CMakeLists.txt
deleted file mode 100644 (file)
index 49e5079..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/_empty_main_function.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_empty_main_simulator.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-
-add_executable(empty_main_function     ${CMAKE_CURRENT_SOURCE_DIR}/empty_main.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_empty_main_function.c)
-add_executable(empty_main_simulator    ${CMAKE_CURRENT_SOURCE_DIR}/empty_main.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_empty_main_simulator.c)
-
-add_custom_command(
-  OUTPUT       ${CMAKE_CURRENT_BINARY_DIR}/_empty_main_function.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_empty_main_simulator.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/empty_main.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator empty_main ${CMAKE_CURRENT_SOURCE_DIR}/empty_main.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(empty_main_simulator simgrid m pthread)
-  target_link_libraries(empty_main_function gras m pthread)
-else(NOT WIN32)
-  target_link_libraries(empty_main_simulator simgrid)
-  target_link_libraries(empty_main_function gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/empty_main.xml
-  PARENT_SCOPE
-  )
-set(teshsuite_src
-  ${teshsuite_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/empty_main.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
-set(txt_files
-  ${txt_files}
-  PARENT_SCOPE
-  )
diff --git a/teshsuite/gras/empty_main/empty_main.c b/teshsuite/gras/empty_main/empty_main.c
deleted file mode 100644 (file)
index 83e6d5c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* empty_main.c -- check what happens when the processes do nothing         */
-/* Thanks to Loris Marshal for reporting a problem in that case             */
-
-/* Copyright (c) 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-
-#include "gras.h"
-
-int function(int argc, char *argv[]);
-
-int function(int argc, char *argv[])
-{
-  gras_init(&argc, argv);
-  //  gras_os_sleep(3);
-  gras_exit();
-  return 0;
-}
diff --git a/teshsuite/gras/empty_main/empty_main.xml b/teshsuite/gras/empty_main/empty_main.xml
deleted file mode 100644 (file)
index cc4cf8e..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Tremblay" function="function" />
-</platform>
diff --git a/teshsuite/gras/empty_main/test_rl.tesh b/teshsuite/gras/empty_main/test_rl.tesh
deleted file mode 100755 (executable)
index b94f15c..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-
-! timeout 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_ENV ${bindir:=.}/empty_main_function$EXEEXT --log=root.fmt=%P:%t%e%m%n
-> function:main Exiting GRAS
diff --git a/teshsuite/gras/empty_main/test_sg.tesh b/teshsuite/gras/empty_main/test_sg.tesh
deleted file mode 100755 (executable)
index 285f80d..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-p Runs the 'empty_main' test within the simulator
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ${bindir:=.}/empty_main_simulator${EXEEXT:=} ${srcdir:=.}/../examples/msg/small_platform.xml ${srcdir:=.}/gras/empty_main/empty_main.xml
-> [Tremblay:function:(1) 0.000000] [gras/INFO] Exiting GRAS
diff --git a/teshsuite/gras/gras.tesh b/teshsuite/gras/gras.tesh
deleted file mode 100644 (file)
index 89a1f5f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#! ./tesh
-
-# Description of this tesh file
-! D This tesh file contains all the tesh files relative with Gras
-
-# includes the Gras marshaling facilities tesh suite
-! include datadesc.tesh
diff --git a/teshsuite/gras/msg_handle/CMakeLists.txt b/teshsuite/gras/msg_handle/CMakeLists.txt
deleted file mode 100644 (file)
index 63d5d19..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/_msg_handle_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_msg_handle_client.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_msg_handle_server.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-
-add_executable(msg_handle_simulator ${CMAKE_CURRENT_SOURCE_DIR}/msg_handle.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_msg_handle_simulator.c)
-add_executable(msg_handle_client       ${CMAKE_CURRENT_SOURCE_DIR}/msg_handle.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_msg_handle_client.c)
-add_executable(msg_handle_server       ${CMAKE_CURRENT_SOURCE_DIR}/msg_handle.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_msg_handle_server.c)
-
-add_custom_command(
-  OUTPUT       ${CMAKE_CURRENT_BINARY_DIR}/_msg_handle_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_msg_handle_client.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_msg_handle_server.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/msg_handle.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator msg_handle ${CMAKE_CURRENT_SOURCE_DIR}/msg_handle.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(msg_handle_simulator simgrid m pthread )
-  target_link_libraries(msg_handle_client gras m pthread )
-  target_link_libraries(msg_handle_server gras m pthread )
-else(NOT WIN32)
-  target_link_libraries(msg_handle_simulator simgrid)
-  target_link_libraries(msg_handle_client gras)
-  target_link_libraries(msg_handle_server gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_rl.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/msg_handle.xml
-  PARENT_SCOPE
-  )
-set(teshsuite_src
-  ${teshsuite_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/msg_handle.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
-set(txt_files
-  ${txt_files}
-  PARENT_SCOPE
-  )
diff --git a/teshsuite/gras/msg_handle/msg_handle.c b/teshsuite/gras/msg_handle/msg_handle.c
deleted file mode 100644 (file)
index 675cb00..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-/* msg_handle - ensures the semantic of gras_msg_handle(i) for i<0,=0 or >0 */
-
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-/* Thanks to Flavien Vernier for reporting an issue around this             */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(test, "Messages specific to this test");
-
-int server(int argc, char *argv[]);
-int client(int argc, char *argv[]);
-
-static int server_cb_hello_handler(gras_msg_cb_ctx_t ctx,
-                                   void *payload_data)
-{
-  XBT_INFO("Got the message");
-  return 0;
-}
-
-int server(int argc, char *argv[])
-{
-  volatile xbt_socket_t me = NULL, pal = NULL;
-  int myport;
-  char *palstr;
-
-  xbt_ex_t e;
-  _XBT_GNUC_UNUSED int got_expected;
-  _XBT_GNUC_UNUSED double now;
-
-
-  gras_init(&argc, argv);
-
-  xbt_assert(argc == 3, "Usage: server <myport> <client>");
-  myport = atoi(argv[1]);
-  palstr = argv[2];
-
-  gras_msgtype_declare("hello", NULL);
-  gras_cb_register("hello", &server_cb_hello_handler);
-
-  XBT_INFO("Launch server (port=%d)", myport);
-  TRY {
-    me = gras_socket_server(myport);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Unable to establish a server socket: %s");
-  }
-  gras_os_sleep(1);             /* Wait for pal to startup */
-  TRY {
-    pal = gras_socket_client_from_string(palstr);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Unable to establish a socket to %s: %s", palstr);
-  }
-  XBT_INFO("Initialization done.");
-  now = gras_os_time();
-
-  /* Launch handle(0) when there is no message. Timeout expected */
-  got_expected = 0;
-  TRY {
-    gras_msg_handle(0);
-  }
-  CATCH(e) {
-    if (e.category == timeout_error) {
-      got_expected = 1;
-      xbt_ex_free(e);
-    } else {
-      RETHROWF("Didn't got the expected timeout: %s");
-    }
-  }
-  xbt_assert(got_expected,
-              "gras_msg_handle(0) do not lead to any timeout exception");
-  xbt_assert(gras_os_time() - now < 0.01,
-              "gras_msg_handle(0) do not anwser immediately (%.4fsec)",
-              gras_os_time() - now);
-  XBT_INFO("gras_msg_handle(0) works as expected (immediate timeout)");
-  /* Launch handle(0) when there is no message. Timeout expected */
-  got_expected = 0;
-  TRY {
-    gras_msg_handle(1);
-  }
-  CATCH(e) {
-    if (e.category == timeout_error) {
-      got_expected = 1;
-      xbt_ex_free(e);
-    } else {
-      RETHROWF("Didn't got the expected timeout: %s");
-    }
-  }
-  xbt_assert(got_expected,
-              "gras_msg_handle(1) do not lead to any timeout exception");
-  xbt_assert(gras_os_time() - now < 1.5,
-              "gras_msg_handle(1) needs more than 1.5 sec to answer (%.4fsec)",
-              gras_os_time() - now);
-  xbt_assert(gras_os_time() - now >= 1.0,
-              "gras_msg_handle(1) answers in less than one second (%.4fsec)",
-              gras_os_time() - now);
-  XBT_INFO("gras_msg_handle(1) works as expected (delayed timeout)");
-  gras_os_sleep(3);
-
-  /* Send an hello to the client to unlock it */
-  XBT_INFO("Unlock pal");
-  gras_msg_send(pal, "hello", NULL);
-
-  /* Frees the allocated resources, and shut GRAS down */
-  gras_socket_close(me);
-  gras_socket_close(pal);
-  gras_exit();
-  return 0;
-}
-
-int client(int argc, char *argv[])
-{
-  volatile xbt_socket_t me = NULL, pal = NULL;
-  int myport;
-  char *palstr;
-
-  gras_init(&argc, argv);
-  xbt_assert(argc == 3, "Usage: client <myport> <server>");
-  myport = atoi(argv[1]);
-  palstr = argv[2];
-
-  gras_msgtype_declare("hello", NULL);
-  gras_cb_register("hello", &server_cb_hello_handler);
-
-  XBT_INFO("Launch client (port=%d)", myport);
-  TRY {
-    me = gras_socket_server(myport);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Unable to establish a server socket: %s");
-  }
-  gras_os_sleep(1);             /* Wait for pal to startup */
-  TRY {
-    pal = gras_socket_client_from_string(palstr);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("Unable to establish a socket to %s: %s", palstr);
-  }
-  XBT_INFO("Initialization done.");
-
-  /* Launch handle(-1). Lock until message from server expected */
-  TRY {
-    gras_msg_handle(-1);
-  }
-  CATCH_ANONYMOUS {
-    RETHROWF("No exception expected during handle(-1), but got %s");
-  }
-  XBT_INFO("gras_msg_handle(-1) works as expected (locked)");
-
-  /* Frees the allocated resources, and shut GRAS down */
-  gras_socket_close(me);
-  gras_socket_close(pal);
-  gras_exit();
-  return 0;
-}
diff --git a/teshsuite/gras/msg_handle/msg_handle.xml b/teshsuite/gras/msg_handle/msg_handle.xml
deleted file mode 100644 (file)
index df6f7f7..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Tremblay" function="server">
-     <argument value="4000"/>       <!-- my port number -->
-     <argument value="Fafard:4000"/>   <!-- client location -->
-  </process>
-  <process host="Fafard" function="client">
-     <argument value="4000"/>       <!-- my port number -->
-     <argument value="Tremblay:4000"/>   <!-- server location -->
-  </process>
-</platform>
diff --git a/teshsuite/gras/msg_handle/test_rl.tesh b/teshsuite/gras/msg_handle/test_rl.tesh
deleted file mode 100755 (executable)
index c0b34f4..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-
-! timeout 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_ENV gras/msg_handle/msg_handle_server$EXEEXT 4002 127.0.0.1:4003 --log=root.fmt=%P:%t%e%m%n
-> server:main Launch server (port=4002)
-> server:main Initialization done.
-> server:main gras_msg_handle(0) works as expected (immediate timeout)
-> server:main gras_msg_handle(1) works as expected (delayed timeout)
-> server:main Unlock pal
-> server:main Exiting GRAS
-
-! timeout 20
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-& $SG_TEST_ENV gras/msg_handle/msg_handle_client$EXEEXT 4003 127.0.0.1:4002 --log=root.fmt=%P:%t%e%m%n
-> client:main Launch client (port=4003)
-> client:main Initialization done.
-> client:main Got the message
-> client:main gras_msg_handle(-1) works as expected (locked)
-> client:main Exiting GRAS
diff --git a/teshsuite/gras/msg_handle/test_sg_32.tesh b/teshsuite/gras/msg_handle/test_sg_32.tesh
deleted file mode 100644 (file)
index 648ed08..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-p Runs the 'msg_handle' test within the simulator (simulation times valid for 32bits architectures)
-
-! output sort
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV gras/msg_handle/msg_handle_simulator$EXEEXT ${srcdir:=.}/../examples/msg/small_platform.xml ${srcdir:=.}/gras/msg_handle/msg_handle.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (1:server@Tremblay) Launch server (port=4000)
-> [  0.000000] (2:client@Fafard) Launch client (port=4000)
-> [  1.000390] (1:server@Tremblay) Initialization done.
-> [  1.000390] (1:server@Tremblay) gras_msg_handle(0) works as expected (immediate timeout)
-> [  1.000390] (2:client@Fafard) Initialization done.
-> [  2.000390] (1:server@Tremblay) gras_msg_handle(1) works as expected (delayed timeout)
-> [  5.000390] (1:server@Tremblay) Unlock pal
-> [  5.026098] (1:server@Tremblay) Exiting GRAS
-> [  5.026098] (2:client@Fafard) Got the message
-> [  5.026098] (2:client@Fafard) gras_msg_handle(-1) works as expected (locked)
-> [  5.026098] (2:client@Fafard) Exiting GRAS
diff --git a/teshsuite/gras/msg_handle/test_sg_64.tesh b/teshsuite/gras/msg_handle/test_sg_64.tesh
deleted file mode 100644 (file)
index aa927ab..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-p Runs the 'msg_handle' test within the simulator (simulation times valid for 64bits architectures)
-
-! output sort
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV gras/msg_handle/msg_handle_simulator$EXEEXT ${srcdir:=.}/../examples/msg/small_platform.xml ${srcdir:=.}/gras/msg_handle/msg_handle.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (1:server@Tremblay) Launch server (port=4000)
-> [  0.000000] (2:client@Fafard) Launch client (port=4000)
-> [  1.000390] (1:server@Tremblay) Initialization done.
-> [  1.000390] (1:server@Tremblay) gras_msg_handle(0) works as expected (immediate timeout)
-> [  1.000390] (2:client@Fafard) Initialization done.
-> [  2.000390] (1:server@Tremblay) gras_msg_handle(1) works as expected (delayed timeout)
-> [  5.000390] (1:server@Tremblay) Unlock pal
-> [  5.026098] (1:server@Tremblay) Exiting GRAS
-> [  5.026098] (2:client@Fafard) Got the message
-> [  5.026098] (2:client@Fafard) gras_msg_handle(-1) works as expected (locked)
-> [  5.026098] (2:client@Fafard) Exiting GRAS
diff --git a/teshsuite/gras/numerous_rpc/CMakeLists.txt b/teshsuite/gras/numerous_rpc/CMakeLists.txt
deleted file mode 100644 (file)
index 129d3e1..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/_numerous_rpc_simulator.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_numerous_rpc_client.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_numerous_rpc_server.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-
-add_executable(numerous_rpc_client    ${CMAKE_CURRENT_SOURCE_DIR}/numerous_rpc.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_numerous_rpc_client.c)
-add_executable(numerous_rpc_server    ${CMAKE_CURRENT_SOURCE_DIR}/numerous_rpc.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_numerous_rpc_server.c)
-
-add_custom_command(OUTPUT            ${CMAKE_CURRENT_BINARY_DIR}/_numerous_rpc_server.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_numerous_rpc_client.c
-  DEPENDS           gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/numerous_rpc.xml
-  COMMAND           ${CMAKE_BINARY_DIR}/bin/gras_stub_generator numerous_rpc ${CMAKE_CURRENT_SOURCE_DIR}/numerous_rpc.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(numerous_rpc_client gras m pthread )
-  target_link_libraries(numerous_rpc_server gras m pthread )
-else(NOT WIN32)
-  target_link_libraries(numerous_rpc_client gras)
-  target_link_libraries(numerous_rpc_server gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/numerous_rpc.xml
-  PARENT_SCOPE
-  )
-set(teshsuite_src
-  ${teshsuite_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/numerous_rpc.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
-set(txt_files
-  ${txt_files}
-  PARENT_SCOPE
-  )
-
-set(EXAMPLES_CMAKEFILES_TXT
-  ${EXAMPLES_CMAKEFILES_TXT}
-  ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
-  PARENT_SCOPE
-  )
diff --git a/teshsuite/gras/numerous_rpc/numerous_rpc.c b/teshsuite/gras/numerous_rpc/numerous_rpc.c
deleted file mode 100644 (file)
index 35d7649..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/* numerous_rpc -- ensures that no race condition occurs when there is a    */
-/*                 huge amount of very small messages                       */
-
-/* Copyright (c) 2012. The SimGrid Team. All rights reserved.               */
-/* Thanks to Soumeya Leila Hernane for reporting an issue around this       */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras.h"
-
-#define RPC_AMOUNT 50000 /* amount of RPC calls to do in a raw */
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(numerous_rpc,"logs attached to the RPC crash test");
-
-int give_hostname(gras_msg_cb_ctx_t ctx, void *payload);
-int server(int argc, char *argv[]);
-int client(int argc, char *argv[]);
-
-/*************************************/
-
-/* callback used for the test */
-int give_hostname(gras_msg_cb_ctx_t ctx, void *payload) {            /* rpc, return hostname */
-  const char* myself = gras_os_myname();
-
-  gras_msg_rpcreturn(-1,ctx,&myself);
-
-  gras_socket_close(gras_msg_cb_ctx_from(ctx));
-  return 0;
-}
-
-/*************************************/
-int server(int argc, char *argv[]) {
-  xbt_socket_t mysock;
-  int i;
-
-  gras_init(&argc, argv);
-  gras_msgtype_declare_rpc("give_hostname",xbt_datadesc_by_name("xbt_string_t"),xbt_datadesc_by_name("xbt_string_t"));
-  gras_cb_register("give_hostname", &give_hostname);
-
-  mysock = gras_socket_server(2222);
-
-  for (i=0;i<RPC_AMOUNT;i++)
-    gras_msg_handle(-1);
-
-  gras_socket_close(mysock);
-  gras_exit();
-  return 0;
-
-}
-
-/* ****************** Code of the client ****************************** */
-int client(int argc, char *argv[]) {
-  long int i;
-  xbt_socket_t server_sock,client_sock;
-  xbt_string_t myself = xbt_strdup(gras_os_myname());
-  xbt_string_t hostname = xbt_malloc(60);
-
-  gras_init(&argc, argv);
-  gras_msgtype_declare_rpc("give_hostname",xbt_datadesc_by_name("xbt_string_t"),xbt_datadesc_by_name("xbt_string_t"));
-
-  client_sock = gras_socket_server_range(1024, 10000, 0, 0);
-
-  for(i=0;i<RPC_AMOUNT;i++) {
-    server_sock = gras_socket_client(argv[1], 2222);
-    //if (i%1000==0)
-      XBT_INFO("iteration %ld",i);
-    gras_msg_rpccall(server_sock,-1,"give_hostname",&myself,&hostname);
-    gras_socket_close(server_sock) ;
-  }
-
-  gras_socket_close(client_sock);
-
-  xbt_free(hostname);
-  xbt_free(myself);
-  gras_exit();
-
-  return 0;
-}
-
-
-
-
-
-
-
-
diff --git a/teshsuite/gras/numerous_rpc/numerous_rpc.xml b/teshsuite/gras/numerous_rpc/numerous_rpc.xml
deleted file mode 100644 (file)
index 5308234..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-
-<!-- this file is not really intended to start the code in simulation
-     mode, but mainly to allow the use of the gras_stub_generator.
-     In particular, don't trust the argument passed here -->
-
-<process host='suno-9.sophia.grid5000.fr'  function='server'>
-  <argument value="Ressource_A:2222:1"/>
-  <argument value="owner"/>
-</process>
-
-<process        host='suno-9.sophia.grid5000.fr'  function='client'/>
-
-</platform>
diff --git a/teshsuite/gras/small_sleep/CMakeLists.txt b/teshsuite/gras/small_sleep/CMakeLists.txt
deleted file mode 100644 (file)
index 8820c5b..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/_small_sleep_function.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_small_sleep_simulator.c
-  PROPERTIES GENERATED true)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-
-add_executable(small_sleep_function    ${CMAKE_CURRENT_SOURCE_DIR}/small_sleep.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_small_sleep_function.c)
-add_executable(small_sleep_simulator   ${CMAKE_CURRENT_SOURCE_DIR}/small_sleep.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_small_sleep_simulator.c)
-
-add_custom_command(
-  OUTPUT       ${CMAKE_CURRENT_BINARY_DIR}/_small_sleep_function.c
-  ${CMAKE_CURRENT_BINARY_DIR}/_small_sleep_simulator.c
-  DEPENDS gras_stub_generator ${CMAKE_CURRENT_SOURCE_DIR}/small_sleep.xml
-  COMMAND ${CMAKE_BINARY_DIR}/bin/gras_stub_generator small_sleep ${CMAKE_CURRENT_SOURCE_DIR}/small_sleep.xml
-  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-  )
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(small_sleep_simulator simgrid m pthread)
-  target_link_libraries(small_sleep_function gras m pthread)
-else(NOT WIN32)
-  target_link_libraries(small_sleep_simulator simgrid)
-  target_link_libraries(small_sleep_function gras)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_32.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/test_sg_64.tesh
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/small_sleep.xml
-  PARENT_SCOPE
-  )
-set(teshsuite_src
-  ${teshsuite_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/small_sleep.c
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  PARENT_SCOPE
-  )
-set(txt_files
-  ${txt_files}
-  PARENT_SCOPE
-  )
diff --git a/teshsuite/gras/small_sleep/small_sleep.c b/teshsuite/gras/small_sleep/small_sleep.c
deleted file mode 100644 (file)
index e5fd687..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* small_sleep.c -- check what happens when the processes do sleeps very shortly*/
-
-/* Copyright (c) 2008, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-
-#include "gras.h"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(test, "Small sleep test");
-
-int function(int argc, char *argv[]);
-
-
-int function(int argc, char *argv[])
-{
-  gras_init(&argc, argv);
-  gras_msg_handleall(100);
-  XBT_INFO("Let's go 1E-5");
-  gras_msg_handleall(1E-5);
-  XBT_INFO("Let's go 1E-10");
-  gras_msg_handleall(1E-10);
-  XBT_INFO("Let's go 1E-15");
-  gras_msg_handleall(1E-15);
-  XBT_INFO("Let's go 1E-20");
-  gras_msg_handleall(1E-20);
-  XBT_INFO("done");
-  gras_exit();
-  return 0;
-}
diff --git a/teshsuite/gras/small_sleep/test_sg_32.tesh b/teshsuite/gras/small_sleep/test_sg_32.tesh
deleted file mode 100755 (executable)
index f56d806..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-p Runs the 'small_sleep' test within the simulator
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ${bindir:=.}/small_sleep_simulator${EXEEXT:=} ${srcdir:=.}/../examples/msg/small_platform.xml ${srcdir:=.}/gras/small_sleep/small_sleep.xml
-> [Tremblay:function:(1) 100.000000] [test/INFO] Let's go 1E-5
-> [Tremblay:function:(1) 100.000010] [test/INFO] Let's go 1E-10
-> [Tremblay:function:(1) 100.000020] [test/INFO] Let's go 1E-15
-> [Tremblay:function:(1) 100.000030] [test/INFO] Let's go 1E-20
-> [Tremblay:function:(1) 100.000030] [test/INFO] done
-> [Tremblay:function:(1) 100.000030] [gras/INFO] Exiting GRAS
diff --git a/teshsuite/gras/small_sleep/test_sg_64.tesh b/teshsuite/gras/small_sleep/test_sg_64.tesh
deleted file mode 100755 (executable)
index 6684c57..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-p Runs the 'empty_main' test within the simulator
-
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
-$ $SG_TEST_EXENV ${bindir:=.}/small_sleep_simulator${EXEEXT:=} ${srcdir:=.}/../examples/msg/small_platform.xml ${srcdir:=.}/gras/small_sleep/small_sleep.xml
-> [Tremblay:function:(1) 100.000000] [test/INFO] Let's go 1E-5
-> [Tremblay:function:(1) 100.000010] [test/INFO] Let's go 1E-10
-> [Tremblay:function:(1) 100.000020] [test/INFO] Let's go 1E-15
-> [Tremblay:function:(1) 100.000020] [test/INFO] Let's go 1E-20
-> [Tremblay:function:(1) 100.000020] [test/INFO] done
-> [Tremblay:function:(1) 100.000020] [gras/INFO] Exiting GRAS
index 8b0c5e3..4f22b3c 100644 (file)
@@ -7,9 +7,9 @@ add_executable(get_sender ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.c)
 ### Add definitions for compile
 if(NOT WIN32)
   target_link_libraries(get_sender simgrid m pthread )
-else(NOT WIN32)
+else()
   target_link_libraries(get_sender simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index c930be9..32d8334 100644 (file)
@@ -21,7 +21,7 @@ if(NOT WIN32)
   target_link_libraries(basic5 simgrid m pthread )
   target_link_libraries(basic6 simgrid m pthread )
   target_link_libraries(incomplete simgrid m pthread )
-else(NOT WIN32)
+else()
   target_link_libraries(basic0 simgrid)
   target_link_libraries(basic1 simgrid)
   target_link_libraries(basic2 simgrid)
@@ -30,7 +30,7 @@ else(NOT WIN32)
   target_link_libraries(basic5 simgrid)
   target_link_libraries(basic6 simgrid)
   target_link_libraries(incomplete simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index df85ce7..579b769 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2007-2012. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(basic0, sd, "SimDag test basic0");
 
+/* Basic SimDag Test 0
+ * Scenario:
+ *   - Create a no-op Init task
+ *   - Create two communication tasks: 100MB and 1B
+ *   - Schedule them concurrently on the two hosts of the platform
+ * The two communications occur simultaneously but one is so short that it has
+ * no impact on the other.
+ * Simulated time should be:
+ *          1e8/1.25e8 + 1e-4 = 0.8001 seconds
+ * This corresponds to paying latency once and having the full bandwidth for the
+ * big message.
+ */
 int main(int argc, char **argv)
 {
-
   SD_task_t taskInit;
   SD_task_t taskA;
   SD_task_t taskB;
@@ -21,7 +32,7 @@ int main(int argc, char **argv)
 
   /* scheduling parameters */
 
-  double communication_amount1[] = { 0, 100000000, 0, 0 };
+  double communication_amount1[] = { 0, 1e8, 0, 0 };
   double communication_amount2[] = { 0, 1, 0, 0 };
   const double no_cost[] = { 0.0, 0.0 };
 
@@ -36,9 +47,6 @@ int main(int argc, char **argv)
   taskA = SD_task_create("Task Comm 1", NULL, 1.0);
   taskB = SD_task_create("Task Comm 2", NULL, 1.0);
 
-
-
-
   /* let's launch the simulation! */
 
   SD_task_schedule(taskInit, 1, SD_workstation_get_list(), no_cost,
index a8eeb8d..0588808 100644 (file)
@@ -1,3 +1,3 @@
-$ simdag/basic0 ${srcdir:=.}/simdag/basic_platform.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (0:@) surf_workstation_model_init_ptask_L07
-> [  1.000100] (0:@) Simulation time: 1.000100
+$ simdag/basic0 ${srcdir:=.}/simdag/basic_platform.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e%m%n"
+> [  0.000000] surf_workstation_model_init_ptask_L07
+> [  0.800100] Simulation time: 0.800100
index 2077754..a3dcd3a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2007-2012. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(basic1, sd, "SimDag test basic1");
 
+/* Basic SimDag Test 1
+ * Scenario:
+ *   - Create a no-op Init task
+ *   - Create two communication tasks: 1GB and 1GB
+ *   - Schedule them concurrently on the two hosts of the platform
+ * The two communications occur simultaneously. They share the network for the
+ * whole duration of the simulation.
+ * Simulated time should be:
+ *          1e9/(1/2*1.25e8) + 1e-4 = 16.0001 seconds
+ */
 int main(int argc, char **argv)
 {
 
@@ -19,8 +29,8 @@ int main(int argc, char **argv)
   SD_task_t taskB;
   xbt_dynar_t ret;
 
-  double communication_amount1 = 1000000000;
-  double communication_amount2 = 1000000000;
+  double communication_amount1 = 1e9;
+  double communication_amount2 = 1e9;
   double no_cost = 0.0;
 
   const SD_workstation_t *workstation;
index e0bd0f1..6e4ac83 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2007-2012. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(basic2, sd, "SimDag test basic2");
 
+/* Basic SimDag Test 2
+ * Scenario:
+ *   - Create a no-op Init task
+ *   - Create two communication tasks: 1GB and 100MB
+ *   - Schedule them concurrently on the two hosts of the platform
+ * The two communications occur simultaneously. They share the network for the
+ * duration of the shortest one, then the longest one has the full bandwidth.
+ * Simulated time should be:
+ *          1e8/(1/2*1.25e8) + 9e8/1.25e8) + 1e-4 = 8.8001 seconds
+ */
 int main(int argc, char **argv)
 {
 
@@ -21,8 +31,8 @@ int main(int argc, char **argv)
 
   const SD_workstation_t *workstation;
 
-  double communication_amount1 = 1000000000;
-  double communication_amount2 = 100000000;
+  double communication_amount1 = 1e9;
+  double communication_amount2 = 1e8;
   double no_cost = 0.0;
 
   /* initialization of SD */
index 011f97e..2614e4e 100644 (file)
@@ -1,3 +1,3 @@
 $ simdag/basic2 ${srcdir:=.}/simdag/basic_platform.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (0:@) surf_workstation_model_init_ptask_L07
-> [ 10.600100] (0:@) Simulation time: 10.600100
+> [  8.800100] (0:@) Simulation time: 8.800100
\ No newline at end of file
index 9657e3a..7f747bc 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2007-2012. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(basic3, sd, "SimDag test basic3");
 
+/* Basic SimDag Test 3
+ * Scenario:
+ *   - Create a chain of tasks (Init, A, Fin)
+ * Verify that the tasks are actually simulated in the right order.
+ */
 int main(int argc, char **argv)
 {
 
index ac9a3c1..fb512da 100644 (file)
@@ -1,3 +1,11 @@
-$ simdag/basic3 ${srcdir:=.}/simdag/basic_platform.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (0:@) surf_workstation_model_init_ptask_L07
-> [  0.000000] (0:@) Simulation time: 0.000000
+$ simdag/basic3 ${srcdir:=.}/simdag/basic_platform.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e%m%n" --log=sd_kernel.thresh:verbose
+> [  0.000000] surf_workstation_model_init_ptask_L07
+> [  0.000000] Starting simulation...
+> [  0.000000] Run simulation for -1.000000 seconds
+> [  0.000000] Executing task 'Task Init'
+> [  0.000000] Task 'Task Init' done
+> [  0.000000] Executing task 'Task A'
+> [  0.000000] Task 'Task A' done
+> [  0.000000] Executing task 'Task Fin'
+> [  0.000000] Task 'Task Fin' done
+> [  0.000000] Simulation time: 0.000000
index ac09265..b6435cf 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2007-2012. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(basic4, sd, "SimDag test basic4");
 
+/* Basic SimDag Test 4
+ * Scenario:
+ *   - Create a chain of tasks (Init, A, Fin)
+ *   - Have a 1B communication between two no-op tasks.
+ * Verify that the tasks are actually simulated in the right order.
+ * The simulated time should be equal to the network latency: 0.0001 seconds.
+ */
 int main(int argc, char **argv)
 {
   /* creation of the tasks and their dependencies */
index b098d98..b6ca71a 100644 (file)
@@ -1,3 +1,11 @@
-$ simdag/basic4 ${srcdir:=.}/simdag/basic_platform.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (0:@) surf_workstation_model_init_ptask_L07
-> [  0.000100] (0:@) Simulation time: 0.000100
+$ simdag/basic4 ${srcdir:=.}/simdag/basic_platform.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e%m%n" --log=sd_kernel.thresh:verbose
+> [  0.000000] surf_workstation_model_init_ptask_L07
+> [  0.000000] Starting simulation...
+> [  0.000000] Run simulation for -1.000000 seconds
+> [  0.000000] Executing task 'Task Init'
+> [  0.000000] Task 'Task Init' done
+> [  0.000000] Executing task 'Task A'
+> [  0.000100] Task 'Task A' done
+> [  0.000100] Executing task 'Task Fin'
+> [  0.000100] Task 'Task Fin' done
+> [  0.000100] Simulation time: 0.000100
index b400701..1bf80b3 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2007-2012. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(basic5, sd, "SimDag test basic5");
 
+/* Basic SimDag Test 5
+ * Scenario:
+ *   - Create a no-op Init task
+ *   - Create two tasks: send 100kB and compute 10Mflops
+ *   - Schedule them concurrently
+ * The two tasks should overlap smoothly as they use different resources.
+ * Simulated time should be:
+ *          MAX(1e5/(1.25e8), 1e7/4e9) = MAX(.0009, .0025) = 0.0025 seconds
+ */
 int main(int argc, char **argv)
 {
 
index 21d5814..cdb06cb 100644 (file)
@@ -1,3 +1,3 @@
-$ simdag/basic5 ${srcdir:=.}/simdag/basic_platform.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (0:@) surf_workstation_model_init_ptask_L07
-> [  0.002500] (0:@) Simulation time: 0.002500
+$ simdag/basic5 ${srcdir:=.}/simdag/basic_platform.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e%m%n"
+> [  0.000000] surf_workstation_model_init_ptask_L07
+> [  0.002500] Simulation time: 0.002500
index f48f761..66e2d34 100644 (file)
@@ -1,6 +1,4 @@
-/* test scheduling 2 tasks at the same time without artificial dependencies */
-
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2007-2012. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 #include "xbt/log.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(basic6, sd, "SimDag test basic6");
+/* test scheduling 2 tasks at the same time without artificial dependencies */
+
+/* Basic SimDag Test 6
+ * Scenario:
+ *   - Schedule two parallel tasks concurrently on a P2P platform
+ *   - Hosts computes 1B per second
+ * Computing power is shared between tasks.
+ * Simulated time should be:
+ *          1/(1/2) = 2 seconds
+ */
 
 int main(int argc, char **argv)
 {
@@ -34,7 +42,8 @@ int main(int argc, char **argv)
 
   ret = SD_simulate(-1.0);
   xbt_assert(xbt_dynar_length(ret) == 2,
-      "I was expecting the terminaison of 2 tasks, but I got %lu instead", xbt_dynar_length(ret));
+      "I was expecting the terminaison of 2 tasks, but I got %lu instead",
+      xbt_dynar_length(ret));
   xbt_dynar_free(&ret);
   SD_task_destroy(taskA);
   SD_task_destroy(taskB);
index 5435cb2..a4478e0 100644 (file)
@@ -1,3 +1,3 @@
-$ simdag/basic6 ${srcdir:=.}/simdag/network/p2p/platform_2p_1sl.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (0:@) surf_workstation_model_init_ptask_L07
-> [  2.000000] (0:@) Simulation time: 2.000000
+$ simdag/basic6 ${srcdir:=.}/simdag/network/p2p/platform_2p_1sl.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e%m%n"
+> [  0.000000] surf_workstation_model_init_ptask_L07
+> [  2.000000] Simulation time: 2.000000
index 76c346e..696ab7b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2007-2012. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -9,8 +9,18 @@
 #include "simdag/simdag.h"
 #include "xbt/log.h"
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(basic2, sd, "SimDag test basic2");
-
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(incomplete, sd, "SimDag incomplete test");
+
+/* SimDag Incomplete Test
+ * Scenario:
+ *   - Create a bunch of tasks
+ *   - schedule only a subset of them (init, A and D)
+ *   - run the simulation
+ *   - Verify that we detect which tasks are not scheduled and show their state.
+ * The scheduled task A sends 1GB. Simulation time should be
+ *          1e9/1.25e8 + 1e-4 = 8.0001 seconds
+ * Task D is scheduled but depends on unscheduled task C.
+ */
 int main(int argc, char **argv)
 {
 
@@ -20,7 +30,7 @@ int main(int argc, char **argv)
 
   const SD_workstation_t *workstation;
 
-  double communication_amount1 = 1000000000;
+  double communication_amount1 = 1e9;
   double no_cost = 0.0;
 
   /* initialization of SD */
index b7f40b2..c237b85 100644 (file)
@@ -1,7 +1,7 @@
-$ simdag/incomplete ${srcdir:=.}/simdag/basic_platform.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (0:@) surf_workstation_model_init_ptask_L07
-> [ 10.000100] (0:@) Simulation is finished but 3 tasks are still not done
-> [ 10.000100] (0:@) Task C is in SD_NOT_SCHEDULED state
-> [ 10.000100] (0:@) Task B is in SD_SCHEDULABLE state
-> [ 10.000100] (0:@) Task D is in SD_SCHEDULED state
-> [ 10.000100] (0:@) Simulation time: 10.000100
+$ simdag/incomplete ${srcdir:=.}/simdag/basic_platform.xml --surf-path=${srcdir} "--log=root.fmt:[%10.6r]%e%m%n"
+> [  0.000000] surf_workstation_model_init_ptask_L07
+> [  8.000100] Simulation is finished but 3 tasks are still not done
+> [  8.000100] Task C is in SD_NOT_SCHEDULED state
+> [  8.000100] Task B is in SD_SCHEDULABLE state
+> [  8.000100] Task D is in SD_SCHEDULED state
+> [  8.000100] Simulation time: 8.000100
index 4417d10..a89ec1c 100644 (file)
@@ -7,9 +7,9 @@ add_executable(test_reinit_costs test_reinit_costs.c)
 ### Add definitions for compile
 if(NOT WIN32)
   target_link_libraries(test_reinit_costs simgrid m pthread )
-else(NOT WIN32)
+else()
   target_link_libraries(test_reinit_costs simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index 35fdb68..e25af1c 100644 (file)
@@ -11,11 +11,11 @@ if(NOT WIN32)
   target_link_libraries(test_intra_all2all simgrid m pthread )
   target_link_libraries(test_intra_independent_comm simgrid m pthread )
   target_link_libraries(test_intra_scatter simgrid m pthread )
-else(NOT WIN32)
+else()
   target_link_libraries(test_intra_all2all simgrid)
   target_link_libraries(test_intra_independent_comm simgrid)
   target_link_libraries(test_intra_scatter simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index f1a5abf..d511b08 100644 (file)
@@ -13,12 +13,12 @@ if(NOT WIN32)
   target_link_libraries(test_latency2 simgrid m pthread )
   target_link_libraries(test_latency3 simgrid m pthread )
   target_link_libraries(test_latency_bound simgrid m pthread )
-else(NOT WIN32)
+else()
   target_link_libraries(test_latency1 simgrid)
   target_link_libraries(test_latency2 simgrid)
   target_link_libraries(test_latency3 simgrid)
   target_link_libraries(test_latency_bound simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index 072a417..6470a9d 100644 (file)
@@ -2,24 +2,21 @@
  <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
  <platform version="3">
  <AS  id="AS0"  routing="Full">
-       
-       <host id="cpu0" power="1" />
-       <host id="cpu1" power="1" />
-       
-       <!-- 
-       large latency backbone
-       10000 because
-       20000 is MAX_TCP_WIN_SIZE
-       max bw = MAX_TCP_WIN_SIZE / ( 2 * latency )
-       which is then 1 and 1 is smallest possible
-        -->
-       
-       <link id="link0" bandwidth="2" latency="10000"
-               sharing_policy="SHARED" />
-       
-       <route src="cpu0" dst="cpu1">
-               <link_ctn id="link0" />
-       </route>
-       
+   <host id="cpu0" power="1" />
+   <host id="cpu1" power="1" />
+
+   <!-- 
+       large latency backbone
+       10000 because
+       20000 is MAX_TCP_WIN_SIZE
+       max bw = MAX_TCP_WIN_SIZE / ( 2 * latency )
+       which is then 1 and 1 is smallest possible
+   -->
+
+   <link id="link0" bandwidth="2" latency="10000" sharing_policy="SHARED" />
+
+   <route src="cpu0" dst="cpu1">
+      <link_ctn id="link0" />
+   </route>
  </AS>
  </platform>
index d6eeccb..6599c71 100644 (file)
@@ -2,8 +2,6 @@
  <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
  <platform version="3">
  <AS  id="AS0"  routing="Full">
    <host id="cpu0" power="1"/>
    <host id="cpu1" power="1"/>
    <link id="link0" bandwidth="1" latency=".5" sharing_policy="FATPIPE"/>
index fc0bde9..20f99a9 100644 (file)
@@ -2,8 +2,6 @@
  <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
  <platform version="3">
  <AS  id="AS0"  routing="Full">
    <host id="cpu0" power="1"/>
    <host id="cpu1" power="1"/>
    <link id="link0" bandwidth="1" latency=".5" sharing_policy="SHARED"/>
index a722639..b499f5c 100644 (file)
@@ -2,20 +2,17 @@
  <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
  <platform version="3">
  <AS  id="AS0"  routing="Full">
    <host id="cpu0" power="1"/>
    <host id="cpu1" power="1"/>
-   
+
    <link id="switch" bandwidth="2" latency="1" sharing_policy="FATPIPE"/>
    <link id="link0" bandwidth="1" latency=".5" sharing_policy="SHARED"/>
    <link id="link1" bandwidth="1" latency=".5" sharing_policy="SHARED"/>
-   
+
    <route src="cpu0" dst="cpu1">
      <link_ctn id="link0"/>
      <link_ctn id="switch"/>
      <link_ctn id="link1"/>
    </route>
-   
  </AS>
  </platform>
index 0a02f18..1d57c19 100644 (file)
@@ -9,10 +9,10 @@ add_executable(test_comp_only_par test_comp_only_par.c)
 if(NOT WIN32)
   target_link_libraries(test_comp_only_seq simgrid m pthread )
   target_link_libraries(test_comp_only_par simgrid m pthread )
-else(NOT WIN32)
+else()
   target_link_libraries(test_comp_only_seq simgrid)
   target_link_libraries(test_comp_only_par simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index 4a478fd..5c34236 100644 (file)
@@ -19,13 +19,13 @@ if(NOT WIN32)
   target_link_libraries(flatifier simgrid m)
   target_link_libraries(basic_tracing simgrid m)
   target_link_libraries(basic_link_test simgrid m)
-else(NOT WIN32)
+else()
   target_link_libraries(basic_parsing_test simgrid)
   target_link_libraries(is_router_test simgrid)
   target_link_libraries(flatifier simgrid)
   target_link_libraries(basic_tracing simgrid)
   target_link_libraries(basic_link_test simgrid)
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index c2e576d..dad86de 100644 (file)
 #include "xbt/log.h"
 #include "xbt/dict.h"
 #include "xbt/ex.h"
+#include "xbt/xbt_os_time.h"
 #include "surf/surf.h"
 #include "surf/surf_private.h"
 
-XBT_LOG_NEW_DEFAULT_CATEGORY(validator,
-                             "Logging specific to this SimDag example");
+static const char link_ctn_v2[] =  "link:ctn";
+static const char link_ctn_v3[] = "link_ctn";
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(flatifier,
+                             "Logging specific to this platform parsing tool");
 
 static int name_compare_hosts(const void *n1, const void *n2)
 {
@@ -43,10 +47,50 @@ static int name_compare_links(const void *n1, const void *n2)
   return strcmp(name1, name2);
 }
 
+static int parse_cmdline(int *timings, int *downgrade, char **platformFile, int argc, char **argv)
+{
+  int wrong_option = 0;
+  int i;
+  for (i = 1; i < argc; i++) {
+    if (strlen(argv[i]) > 1 && argv[i][0] == '-' && argv[i][1] == '-') {
+      if (!strcmp(argv[i], "--timings")) {
+        *timings = 1;
+      } else {
+        if (!strcmp(argv[i], "--downgrade")) {
+          *downgrade = 1;
+        } else {
+          wrong_option = 1;
+          break;
+        }
+      }
+    } else {
+      *platformFile = argv[i];
+    }
+  }
+  return wrong_option;
+}
+
+static void create_environment(xbt_os_timer_t parse_time, const char *platformFile)
+{
+  xbt_ex_t e;
+  TRY {
+    xbt_os_timer_start(parse_time);
+    SD_create_environment(platformFile);
+    xbt_os_timer_stop(parse_time);
+  }
+  CATCH(e) {
+    xbt_die("Error while loading %s: %s", platformFile, e.msg);
+  }
+}
+
 int main(int argc, char **argv)
 {
   char *platformFile = NULL;
   int totalHosts, totalLinks;
+  int timings=0;
+  int downgrade = 0;
+  int version = 3;
+  const char *link_ctn = link_ctn_v3;
   unsigned int i;
   xbt_dict_t props = NULL;
   xbt_dict_cursor_t cursor = NULL;
@@ -55,84 +99,93 @@ int main(int argc, char **argv)
   char *src,*dst,*key,*data;
   sg_routing_edge_t value1;
   sg_routing_edge_t value2;
-  xbt_ex_t e;
 
   const SD_workstation_t *hosts;
   const SD_link_t *links;
+  xbt_os_timer_t parse_time = xbt_os_timer_new();
 
   setvbuf(stdout, NULL, _IOLBF, 0);
 
   SD_init(&argc, argv);
 
-  platformFile = argv[1];
-  XBT_DEBUG("%s", platformFile);
-  TRY {
-    SD_create_environment(platformFile);
-  }
-  CATCH(e) {
-    xbt_die("Error while loading %s: %s",platformFile,e.msg);
+  if (parse_cmdline(&timings, &downgrade, &platformFile, argc, argv) || !platformFile) {
+    xbt_die("Invalid command line arguments: expected [--timings|--downgrade] platformFile");
   }
+  XBT_DEBUG("%d,%d,%s", timings, downgrade, platformFile);
 
-  printf("<?xml version='1.0'?>\n");
-  printf("<!DOCTYPE platform SYSTEM \"http://simgrid.gforge.inria.fr/simgrid.dtd\">\n");
-  printf("<platform version=\"3\">\n");
-  printf("<AS id=\"AS0\" routing=\"Full\">\n");
+  if (downgrade) {
+    version = 2;
+    link_ctn = link_ctn_v2;
+  }
 
-  // Hosts
-  totalHosts = SD_workstation_get_number();
-  hosts = SD_workstation_get_list();
-  qsort((void *) hosts, totalHosts, sizeof(SD_workstation_t),
+  create_environment(parse_time, platformFile);
+
+  if (timings) {
+    XBT_INFO("Parsing time: %fs (%d hosts, %d links)",
+          xbt_os_timer_elapsed(parse_time),SD_workstation_get_number(),SD_link_get_number());
+  } else {
+    printf("<?xml version='1.0'?>\n");
+    printf("<!DOCTYPE platform SYSTEM \"http://simgrid.gforge.inria.fr/simgrid.dtd\">\n");
+    printf("<platform version=\"%d\">\n", version);
+    if (!downgrade)
+      printf("<AS id=\"AS0\" routing=\"Full\">\n");
+
+    // Hosts
+    totalHosts = SD_workstation_get_number();
+    hosts = SD_workstation_get_list();
+    qsort((void *) hosts, totalHosts, sizeof(SD_workstation_t),
         name_compare_hosts);
 
-  for (i = 0; i < totalHosts; i++) {
-    printf("  <host id=\"%s\" power=\"%.0f\"",
-           SD_workstation_get_name(hosts[i]),
-           SD_workstation_get_power(hosts[i]));
-    props = SD_workstation_get_properties(hosts[i]);
-    if (props && !xbt_dict_is_empty(props)) {
-      printf(">\n");
-      xbt_dict_foreach(props, cursor, key, data) {
-        printf("    <prop id=\"%s\" value=\"%s\"/>\n", key, data);
+    for (i = 0; i < totalHosts; i++) {
+      printf("  <host id=\"%s\" power=\"%.0f\"",
+          SD_workstation_get_name(hosts[i]),
+          SD_workstation_get_power(hosts[i]));
+      props = SD_workstation_get_properties(hosts[i]);
+      if (props && !xbt_dict_is_empty(props)) {
+        printf(">\n");
+        xbt_dict_foreach(props, cursor, key, data) {
+          printf("    <prop id=\"%s\" value=\"%s\"/>\n", key, data);
+        }
+        printf("  </host>\n");
+      } else {
+        printf("/>\n");
       }
-      printf("  </host>\n");
-    } else {
-      printf("/>\n");
     }
-  }
 
-  // Routers
-  xbt_lib_foreach(as_router_lib, cursor_src, key, value1) {
-    if(((sg_routing_edge_t)xbt_lib_get_or_null(as_router_lib, key,
-        ROUTING_ASR_LEVEL))->rc_type == SURF_NETWORK_ELEMENT_ROUTER)
-    {
-      printf("  <router id=\"%s\"/>\n",key);
+    // Routers
+    xbt_lib_foreach(as_router_lib, cursor_src, key, value1) {
+      if(((sg_routing_edge_t)xbt_lib_get_or_null(as_router_lib, key,
+          ROUTING_ASR_LEVEL))->rc_type == SURF_NETWORK_ELEMENT_ROUTER)
+      {
+        printf("  <router id=\"%s\"/>\n",key);
+      }
     }
-  }
 
-  // Links
-  totalLinks = SD_link_get_number();
-  links = SD_link_get_list();
+    // Links
+    totalLinks = SD_link_get_number();
+    links = SD_link_get_list();
 
-  qsort((void *) links, totalLinks, sizeof(SD_link_t), name_compare_links);
+    qsort((void *) links, totalLinks, sizeof(SD_link_t), name_compare_links);
 
-  for (i = 0; i < totalLinks; i++) {
-    printf("  <link id=\"");
+    for (i = 0; i < totalLinks; i++) {
+      printf("  <link id=\"");
 
-    printf("%s\" bandwidth=\"%.0f\" latency=\"%.9f\"",
-           SD_link_get_name(links[i]),
-           SD_link_get_current_bandwidth(links[i]),
-           SD_link_get_current_latency(links[i]));
-    if (SD_link_get_sharing_policy(links[i]) == SD_LINK_SHARED) {
-      printf("/>\n");
-    } else {
-      printf(" sharing_policy=\"FATPIPE\"/>\n");
+      printf("%s\" bandwidth=\"%.0f\" latency=\"%.9f\"",
+          SD_link_get_name(links[i]),
+          SD_link_get_current_bandwidth(links[i]),
+          SD_link_get_current_latency(links[i]));
+      if (SD_link_get_sharing_policy(links[i]) == SD_LINK_SHARED) {
+        printf("/>\n");
+      } else {
+        printf(" sharing_policy=\"FATPIPE\"/>\n");
+      }
     }
-  }
 
 
-  xbt_lib_foreach(host_lib, cursor_src, src, value1) // Routes from host
-  {
-          value1 = xbt_lib_get_or_null(host_lib,src,ROUTING_HOST_LEVEL);
+    xbt_lib_foreach(host_lib, cursor_src, src, value1) // Routes from host
+    {
+      value1 = xbt_lib_get_or_null(host_lib,src,ROUTING_HOST_LEVEL);
       xbt_lib_foreach(host_lib, cursor_dst, dst, value2) //to host
       {
         printf("  <route src=\"%s\" dst=\"%s\">\n  "
@@ -146,79 +199,81 @@ int main(int argc, char **argv)
           void *link = xbt_dynar_get_as(route,i,void *);
 
           char *link_name = xbt_strdup(((surf_resource_t)link)->name);
-          printf("<link_ctn id=\"%s\"/>",link_name);
+          printf("<%s id=\"%s\"/>",link_ctn,link_name);
           free(link_name);
         }
         printf("\n  </route>\n");
       }
       xbt_lib_foreach(as_router_lib, cursor_dst, dst, value2) //to router
       {
-          if(routing_get_network_element_type(dst) == SURF_NETWORK_ELEMENT_ROUTER){
-        printf("  <route src=\"%s\" dst=\"%s\">\n  "
-            ,src
-            ,dst);
-        xbt_dynar_t route=NULL;
-        value2 = xbt_lib_get_or_null(as_router_lib,dst,ROUTING_ASR_LEVEL);
-        routing_get_route_and_latency((sg_routing_edge_t)value1,(sg_routing_edge_t)value2,&route,NULL);
-        for(i=0;i<xbt_dynar_length(route) ;i++)
-        {
-          void *link = xbt_dynar_get_as(route,i,void *);
-
-          char *link_name = xbt_strdup(((surf_resource_t)link)->name);
-          printf("<link_ctn id=\"%s\"/>",link_name);
-          free(link_name);
-        }
-        printf("\n  </route>\n");
+        if(routing_get_network_element_type(dst) == SURF_NETWORK_ELEMENT_ROUTER){
+          printf("  <route src=\"%s\" dst=\"%s\">\n  "
+              ,src
+              ,dst);
+          xbt_dynar_t route=NULL;
+          value2 = xbt_lib_get_or_null(as_router_lib,dst,ROUTING_ASR_LEVEL);
+          routing_get_route_and_latency((sg_routing_edge_t)value1,(sg_routing_edge_t)value2,&route,NULL);
+          for(i=0;i<xbt_dynar_length(route) ;i++)
+          {
+            void *link = xbt_dynar_get_as(route,i,void *);
+
+            char *link_name = xbt_strdup(((surf_resource_t)link)->name);
+            printf("<%s id=\"%s\"/>",link_ctn,link_name);
+            free(link_name);
           }
+          printf("\n  </route>\n");
+        }
       }
-  }
+    }
 
-  xbt_lib_foreach(as_router_lib, cursor_src, src, value1) // Routes from router
-  {
+    xbt_lib_foreach(as_router_lib, cursor_src, src, value1) // Routes from router
+    {
       value1 = xbt_lib_get_or_null(as_router_lib,src,ROUTING_ASR_LEVEL);
-    if(routing_get_network_element_type(src) == SURF_NETWORK_ELEMENT_ROUTER){
-      xbt_lib_foreach(as_router_lib, cursor_dst, dst, value2) //to router
-      {
-        if(routing_get_network_element_type(dst) == SURF_NETWORK_ELEMENT_ROUTER){
-        printf("  <route src=\"%s\" dst=\"%s\">\n  "
-            ,src
-            ,dst);
-        xbt_dynar_t route=NULL;
-        value2 = xbt_lib_get_or_null(as_router_lib,dst,ROUTING_ASR_LEVEL);
-        routing_get_route_and_latency((sg_routing_edge_t)value1,(sg_routing_edge_t)value2,&route,NULL);
-        for(i=0;i<xbt_dynar_length(route) ;i++)
-        {
-          void *link = xbt_dynar_get_as(route,i,void *);
-
-          char *link_name = xbt_strdup(((surf_resource_t)link)->name);
-          printf("<link_ctn id=\"%s\"/>",link_name);
-          free(link_name);
-        }
-        printf("\n  </route>\n");
-        }
-      }
-      xbt_lib_foreach(host_lib, cursor_dst, dst, value2) //to host
-      {
-        printf("  <route src=\"%s\" dst=\"%s\">\n  "
-            ,src, dst);
-        xbt_dynar_t route=NULL;
-        value2 = xbt_lib_get_or_null(host_lib,dst,ROUTING_HOST_LEVEL);
-        routing_get_route_and_latency((sg_routing_edge_t)value1,(sg_routing_edge_t)value2,&route, NULL);
-        for(i=0;i<xbt_dynar_length(route) ;i++)
+      if(routing_get_network_element_type(src) == SURF_NETWORK_ELEMENT_ROUTER){
+        xbt_lib_foreach(as_router_lib, cursor_dst, dst, value2) //to router
+          {
+          if(routing_get_network_element_type(dst) == SURF_NETWORK_ELEMENT_ROUTER){
+            printf("  <route src=\"%s\" dst=\"%s\">\n  "
+                ,src
+                ,dst);
+            xbt_dynar_t route=NULL;
+            value2 = xbt_lib_get_or_null(as_router_lib,dst,ROUTING_ASR_LEVEL);
+            routing_get_route_and_latency((sg_routing_edge_t)value1,(sg_routing_edge_t)value2,&route,NULL);
+            for(i=0;i<xbt_dynar_length(route) ;i++)
+            {
+              void *link = xbt_dynar_get_as(route,i,void *);
+
+              char *link_name = xbt_strdup(((surf_resource_t)link)->name);
+              printf("<%s id=\"%s\"/>",link_ctn,link_name);
+              free(link_name);
+            }
+            printf("\n  </route>\n");
+          }
+          }
+        xbt_lib_foreach(host_lib, cursor_dst, dst, value2) //to host
         {
-          void *link = xbt_dynar_get_as(route,i,void *);
-
-          char *link_name = xbt_strdup(((surf_resource_t)link)->name);
-          printf("<link_ctn id=\"%s\"/>",link_name);
-          free(link_name);
+          printf("  <route src=\"%s\" dst=\"%s\">\n  "
+              ,src, dst);
+          xbt_dynar_t route=NULL;
+          value2 = xbt_lib_get_or_null(host_lib,dst,ROUTING_HOST_LEVEL);
+          routing_get_route_and_latency((sg_routing_edge_t)value1,(sg_routing_edge_t)value2,&route, NULL);
+          for(i=0;i<xbt_dynar_length(route) ;i++)
+          {
+            void *link = xbt_dynar_get_as(route,i,void *);
+
+            char *link_name = xbt_strdup(((surf_resource_t)link)->name);
+            printf("<%s id=\"%s\"/>",link_ctn,link_name);
+            free(link_name);
+          }
+          printf("\n  </route>\n");
         }
-        printf("\n  </route>\n");
       }
     }
-  }
 
-  printf("</AS>\n");
-  printf("</platform>\n");
+    if (!downgrade)
+      printf("</AS>\n");
+    printf("</platform>\n");
+  }
   SD_exit();
 
   return 0;
index a743421..6484293 100644 (file)
@@ -1,10 +1,14 @@
 cmake_minimum_required(VERSION 2.6)
 
 if(enable_smpi)
-  set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/bin/smpicc")
-
+  if(WIN32)
+    set(CMAKE_C_FLAGS "-include ${CMAKE_HOME_DIRECTORY}/include/smpi/smpi_main.h")
+  else()
+    set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc")
+  endif()
+  
   set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-
+  
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
 
   add_executable(alltoall2 alltoall2.c )
@@ -19,7 +23,6 @@ if(enable_smpi)
   add_executable(scatter scatter.c)
   add_executable(reduce reduce.c)
   add_executable(split split.c)
-  add_executable(dsend dsend.c)
   add_executable(smpi_sendrecv sendrecv.c)
   add_executable(ttest01 ttest01.c)
   add_executable(vector_test vector_test.c)
@@ -39,7 +42,6 @@ if(enable_smpi)
   target_link_libraries(scatter m simgrid smpi )
   target_link_libraries(reduce m simgrid smpi )
   target_link_libraries(split m simgrid smpi )
-  target_link_libraries(dsend m simgrid smpi )
   target_link_libraries(smpi_sendrecv m simgrid smpi )
   target_link_libraries(ttest01 m simgrid smpi )
   target_link_libraries(vector_test m simgrid smpi )
@@ -48,7 +50,14 @@ if(enable_smpi)
   target_link_libraries(struct_test m simgrid smpi )
 
   set_target_properties(smpi_sendrecv PROPERTIES RENAME sendrecv)
-endif(enable_smpi)
+
+  if(NOT WIN32)
+    add_executable(dsend dsend.c)
+    target_link_libraries(dsend m simgrid smpi )
+  endif()
+
+endif()
+
 
 set(tesh_files
   ${tesh_files}
@@ -98,5 +107,6 @@ set(bin_files
   )
 set(txt_files
   ${txt_files}
+  
   PARENT_SCOPE
   )
index ef2068e..34e5912 100644 (file)
 
 ****************************************************************************
 */
-#include "mpi.h"
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
-
+#include "mpi.h"
 
 #define MAXLEN 10000
 
index 485752e..ad25e7a 100644 (file)
@@ -4,11 +4,11 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "mpi.h"
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
+#include "mpi.h"
 
 #ifndef EXIT_SUCCESS
 #define EXIT_SUCCESS 0
index 492db4e..f2717b9 100644 (file)
@@ -3,11 +3,11 @@
  *  (C) 2001 by Argonne National Laboratory.
  *      See COPYRIGHT in top-level directory.
  */
-#include "mpi.h"
 #include <string.h>
 
 #include <stdlib.h>
 #include <stdio.h>
+#include "mpi.h"
 
 /*
    This program tests MPI_Alltoallv by having processor i send different
diff --git a/teshsuite/smpi/compute.tesh b/teshsuite/smpi/compute.tesh
new file mode 100644 (file)
index 0000000..37439ba
--- /dev/null
@@ -0,0 +1,31 @@
+p Test compute
+! setenv LD_LIBRARY_PATH=../../lib
+! output sort
+! timeout 5
+$ ../../bin/smpirun -platform ${srcdir:=.}/../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir:=.}/hostfile -np 2 ./compute 0
+> 0 2.000000
+> 0 2.000000
+> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'maxmin/precision' to '1e-9'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/model' to 'SMPI'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/TCP_gamma' to '4194304'
+
+p Test compute and bench
+! setenv LD_LIBRARY_PATH=../../lib
+! output sort
+! timeout 45
+$ ../../bin/smpirun  -platform ${srcdir:=.}/../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir:=.}/hostfile -np 2 ./compute3
+> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'maxmin/precision' to '1e-9'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/model' to 'SMPI'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/TCP_gamma' to '4194304'
+> [0] The result of the computation is: 65536.000000
+> [1] The result of the computation is: 2.000000
+> [rank:0] Run the first computation. It's globally benched, and I want no more than 3 benchmarks (thres<0)
+> [rank:0] Run the first computation. It's globally benched, and I want no more than 3 benchmarks (thres<0)
+> [rank:0] Run the first (locally benched) computation. It's locally benched, and I want the standard error to go below 0.1 second (count is not >0)
+> [rank:0] Run the first (locally benched) computation. It's locally benched, and I want the standard error to go below 0.1 second (count is not >0)
+> [rank:1] Run the first computation. It's globally benched, and I want no more than 3 benchmarks (thres<0)
+> [rank:1] Run the first (locally benched) computation. It's locally benched, and I want the standard error to go below 0.1 second (count is not >0)
+> [rank:1] Run the first (locally benched) computation. It's locally benched, and I want the standard error to go below 0.1 second (count is not >0)
+
index ee2e281..8426f5a 100644 (file)
@@ -3,4 +3,3 @@ Jupiter
 Fafard
 Ginette
 Bourassa
-         
\ No newline at end of file
index 9eb822d..a4ea550 100644 (file)
@@ -1,4 +1,43 @@
-p Test indexed
+p Test hvector
 ! setenv LD_LIBRARY_PATH=../../lib
 ! output sort
-$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./indexed_test -q
+$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./hvector_test -q
+> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'maxmin/precision' to '1e-9'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/model' to 'SMPI'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/TCP_gamma' to '4194304'
+> [rank 0] -> Tremblay
+> [rank 1] -> Jupiter
+> rank= 0, a[0][0]=0.000000
+> rank= 0, a[0][1]=1.000000
+> rank= 0, a[0][2]=2.000000
+> rank= 0, a[0][3]=3.000000
+> rank= 0, a[1][0]=4.000000
+> rank= 0, a[1][1]=5.000000
+> rank= 0, a[1][2]=6.000000
+> rank= 0, a[1][3]=7.000000
+> rank= 0, a[2][0]=8.000000
+> rank= 0, a[2][1]=9.000000
+> rank= 0, a[2][2]=10.000000
+> rank= 0, a[2][3]=11.000000
+> rank= 0, a[3][0]=12.000000
+> rank= 0, a[3][1]=13.000000
+> rank= 0, a[3][2]=14.000000
+> rank= 0, a[3][3]=15.000000
+> rank= 1, a[0][0]=0.000000
+> rank= 1, a[0][1]=0.000000
+> rank= 1, a[0][2]=0.000000
+> rank= 1, a[0][3]=0.000000
+> rank= 1, a[1][0]=4.000000
+> rank= 1, a[1][1]=0.000000
+> rank= 1, a[1][2]=0.000000
+> rank= 1, a[1][3]=0.000000
+> rank= 1, a[2][0]=8.000000
+> rank= 1, a[2][1]=0.000000
+> rank= 1, a[2][2]=0.000000
+> rank= 1, a[2][3]=0.000000
+> rank= 1, a[3][0]=12.000000
+> rank= 1, a[3][1]=0.000000
+> rank= 1, a[3][2]=0.000000
+> rank= 1, a[3][3]=0.000000
+
index e557575..3afb440 100644 (file)
@@ -1,5 +1,5 @@
-#include "mpi.h"
 #include <stdio.h>
+#include "mpi.h"
 
 int main(int argc, char *argv[])
 {
diff --git a/teshsuite/smpi/mpich-test/.gitignore b/teshsuite/smpi/mpich-test/.gitignore
new file mode 100644 (file)
index 0000000..0fb5f04
--- /dev/null
@@ -0,0 +1,144 @@
+*.out
+*.stdo
+
+coll/allgatherf
+coll/allred
+coll/allred2
+coll/allredf
+coll/allredmany
+coll/alltoallv_mpich
+coll/assocf
+coll/barrier
+coll/bcast_mpich
+coll/bcastbug
+coll/bcastbug2
+coll/bcastlog
+coll/bcastvec
+coll/coll1
+coll/coll10
+coll/coll11
+coll/coll12
+coll/coll13
+coll/coll2
+coll/coll3
+coll/coll4
+coll/coll5
+coll/coll6
+coll/coll7
+coll/coll8
+coll/coll9
+coll/grouptest
+coll/longuser
+coll/redscat
+coll/redtst
+coll/scantst
+coll/scattern
+coll/scatterv
+context/attrerr
+context/groupcreate
+context/grouptest_mpich
+context/icdup
+context/ictest
+context/ictest2
+context/ictest3
+env/aborttest
+env/baseattr
+env/env.diff
+env/errhand
+env/getproc
+env/getprocf
+env/gtime
+env/init
+env/sigchk
+env/testerr
+env/timers
+env/timertest
+profile/colluses
+profile/ptest
+pt2pt/bsendtest
+pt2pt/cancel
+pt2pt/cancel2
+pt2pt/cancel3
+pt2pt/cancelibm
+pt2pt/cancelissend
+pt2pt/cancelmessages
+pt2pt/commit
+pt2pt/dataalign
+pt2pt/dtypelife
+pt2pt/dtyperecv
+pt2pt/exittest
+pt2pt/fifth
+pt2pt/flood
+pt2pt/flood2
+pt2pt/fourth
+pt2pt/getelm
+pt2pt/hindexed
+pt2pt/htmsg
+pt2pt/hvec
+pt2pt/hvectest
+pt2pt/hvectest2
+pt2pt/irecvtest
+pt2pt/irsend
+pt2pt/irsendinit
+pt2pt/isendf
+pt2pt/isendtest
+pt2pt/isndrcv
+pt2pt/issend2
+pt2pt/issendinit
+pt2pt/issendtest
+pt2pt/longmsgs
+pt2pt/nblock
+pt2pt/nbtest
+pt2pt/nullproc
+pt2pt/nullproc2
+pt2pt/order
+pt2pt/overtake
+pt2pt/pack
+pt2pt/persist
+pt2pt/persist2
+pt2pt/persistent
+pt2pt/pingpong_f
+pt2pt/probe
+pt2pt/probe1
+pt2pt/relrank
+pt2pt/reqcreate
+pt2pt/reqfree
+pt2pt/secondf
+pt2pt/self
+pt2pt/selfvsworld
+pt2pt/send1
+pt2pt/sendcplx
+pt2pt/sendfort
+pt2pt/sendmany
+pt2pt/sendorder
+pt2pt/sendrecv2
+pt2pt/sendrecv3
+pt2pt/sendrecv4
+pt2pt/sendrecv_mpich
+pt2pt/sixth
+pt2pt/sndrcv
+pt2pt/sndrcvrep
+pt2pt/sndrcvrpl2
+pt2pt/ssendtest
+pt2pt/ssendtest2
+pt2pt/structlb
+pt2pt/testall_mpich
+pt2pt/testsome
+pt2pt/testtest1
+pt2pt/testtypes
+pt2pt/third
+pt2pt/trunc
+pt2pt/truncmult
+pt2pt/typebase
+pt2pt/typebasef
+pt2pt/typecreate
+pt2pt/typelb
+pt2pt/typetest
+pt2pt/typeub
+pt2pt/typeub2
+pt2pt/typeub3
+pt2pt/waitall
+pt2pt/waitall2
+pt2pt/waitall3
+pt2pt/waitall4
+pt2pt/waitany
diff --git a/teshsuite/smpi/mpich-test/CMakeLists.txt b/teshsuite/smpi/mpich-test/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f5c12a7
--- /dev/null
@@ -0,0 +1,72 @@
+set(tesh_files
+  ${tesh_files}
+  PARENT_SCOPE
+  )
+set(xml_files
+  ${xml_files}
+  PARENT_SCOPE
+  )
+set(examples_src
+  ${examples_src}
+  PARENT_SCOPE
+  )
+set(bin_files
+  ${bin_files}
+  PARENT_SCOPE
+  )
+  
+set(stdo_std_smpi
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/context/attrt.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/context/attrerr.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/context/context.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/context/commnames.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/self.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/sndrcvrep.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/waitany.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/reqcreate.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/persistent.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/allpair2.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/typeub3.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/waitall.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/nullproc2.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/allpair.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/hindexed.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/ssendtest2.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/sendmany.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/nullproc.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/nbtest.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/sendcplx.stdo
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/hvec.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/typebase.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/typeub2.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/structf.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/typecreate.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/nblock.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/topol/cartmap.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/topol/graphtest.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/topol/cartf.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/env/aborttest.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/env/errstringsf.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/env/env.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/profile/ptest.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/coll/allredmany.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/coll/allred.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/coll/allredf.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/coll/scatterv.std
+)
+
+if("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
+else()
+    foreach(srcfile ${stdo_std_smpi})
+        set(dstfile ${srcfile})
+        string(REPLACE "${CMAKE_HOME_DIRECTORY}" "${CMAKE_BINARY_DIR}" dstfile "${dstfile}")
+        #message("copy ${srcfile} to ${dstfile}")
+        configure_file("${srcfile}" "${dstfile}" COPYONLY)
+    endforeach()
+endif()
+
+set(txt_files
+  ${txt_files}
+  ${stdo_std_smpi}
+  PARENT_SCOPE
+  )
diff --git a/teshsuite/smpi/mpich-test/README b/teshsuite/smpi/mpich-test/README
new file mode 100644 (file)
index 0000000..dcb011a
--- /dev/null
@@ -0,0 +1,75 @@
+This directory contains a variety of different test codes 
+of different types. This directory and many of the files in
+it are still undergoing active development and change. Please
+forgive (and report) any problems you have with these programs.
+
+These tests may be used with any MPI implementation.  In a few cases, 
+differences in error messages may be reported; these are not errors, of
+course.  However, the accuracy and detail of the messages should be evaluated.
+
+To build and run the tests, execute configure followed by make testing.  
+The options to configure for some MPI implementations follow:
+
+SGI:
+      ./configure -cc=cc -fc=f77
+IBM:
+      ./configure -cc=mpcc -fc=mpxlf 
+      (You also need a script called "mpirun" that takes a -np number-of-procs
+      argument, since there are so many different ways to run parallel 
+      programs on IBM systems)
+MPICH:
+      ./configure -mpichpath=<path to MPICH build bin directory>
+
+The directories are as follows:
+
+pt2pt  -       Test cases that generally cover various point to point
+               routines, such as send, isend, probe, etc... The
+               README in this directory contains some additional 
+               useful information about running the tests. The tests
+               in this directory are most complete.
+
+
+coll   -       Test programs for various collective operations
+
+context -       Test programs for context operations
+
+env     -       Test programs for the environment routines
+
+profile -       Test program(s) for MPI_Pcontrol
+
+topol   -       Test programs for the topology routines
+
+lederman-      A series of tests of various types written by Steve
+               Lederman
+
+
+Other directories and additional tests will be added in the future.
+
+To run the test, but not leave the executables around, do (in this directory)
+
+  make TESTARGS=-small testing >& testing.out
+
+If your MPI requires a boot step before running programs, use the target
+testing-boot instead of testint:
+
+  make TESTARGS=-small testing-boot >& testing.out
+
+This will boot any MPI startup demons, and it will stop them at the end of the 
+test.
+
+If you are NOT using the MPICH implementation, then you can run the configure
+script in this directory.  If you need to view the configure options, then type
+       configure -help
+and a list of configure options will be provided.
+
+You will probably also have to provide an "mpirun" program or script.
+This has roughly the form
+
+     mpirun -mvhome -np n -mvback "string" programname programargs
+
+The options -mvhome and -mvback "string" can be ignored; they are needed only
+on systems that do not share file systems with the system running the runtests
+script (yes, there is one such system).  The option "-np n" specifies that
+"n" processes are needed.  Note that this is not always a power of 2; systems
+must be prepared to accept any (small) value of n.
+
diff --git a/teshsuite/smpi/mpich-test/coll/CMakeLists.txt b/teshsuite/smpi/mpich-test/coll/CMakeLists.txt
new file mode 100644 (file)
index 0000000..7137203
--- /dev/null
@@ -0,0 +1,178 @@
+cmake_minimum_required(VERSION 2.6)
+
+if(enable_smpi)
+  set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc")
+  set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff")
+  set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
+  set(MPICH_FLAGS "-DHAVE_STDLIB_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DUSE_STDARG=1 -DHAVE_LONG_DOUBLE=1 -DHAVE_PROTOTYPES=1 -DHAVE_SIGNAL_H=1 -DHAVE_SIGACTION=1 -DHAVE_SLEEP=1 -DHAVE_SYSCONF=1")
+
+  include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
+  
+  add_executable(coll1 coll1.c test.c)
+  add_executable(coll2 coll2.c test.c)
+  add_executable(coll3 coll3.c test.c)
+  add_executable(coll4 coll4.c test.c)
+  add_executable(coll5 coll5.c test.c)
+  add_executable(coll6 coll6.c test.c)
+  add_executable(coll7 coll7.c test.c)
+  add_executable(coll8 coll8.c test.c)
+  add_executable(coll9 coll9.c test.c)
+  add_executable(coll10 coll10.c test.c)
+  add_executable(coll11 coll11.c test.c)
+  add_executable(coll12 coll12.c test.c)
+  add_executable(coll13 coll13.c)
+  add_executable(allredmany allredmany.c)
+  add_executable(bcastbug2 bcastbug2.c test.c) 
+  add_executable(bcastbug bcastbug.c test.c)
+  add_executable(bcastvec bcastvec.c test.c )
+  add_executable(grouptest grouptest.c test.c)
+  add_executable(redtst redtst.c test.c)
+  add_executable(barrier barrier.c test.c)
+  add_executable(bcast_mpich bcast.c test.c)
+  add_executable(allred allred.c ../pt2pt/gcomm.c)
+  add_executable(allred2 allred2.c ../pt2pt/gcomm.c)
+  add_executable(scatterv scatterv.c)
+  add_executable(scattern scattern.c)
+  add_executable(redscat redscat.c)
+  add_executable(alltoallv_mpich alltoallv.c)
+  add_executable(scantst scantst.c test.c)
+  add_executable(longuser longuser.c test.c)
+
+  if(SMPI_F2C)
+    add_executable(allredf allredf.f)
+    add_executable(assocf assocf.f)
+    add_executable(allgatherf allgatherf.f)
+    add_executable(bcastlog bcastlog.f)
+  endif()
+
+  target_link_libraries(coll1  m simgrid smpi )
+  target_link_libraries(coll2 m simgrid smpi )
+  target_link_libraries(coll3 m simgrid smpi )
+  target_link_libraries(coll4 m simgrid smpi )
+  target_link_libraries(coll5 m simgrid smpi )
+  target_link_libraries(coll6 m simgrid smpi )
+  target_link_libraries(coll7 m simgrid smpi )
+  target_link_libraries(coll8 m simgrid smpi )
+  target_link_libraries(coll9 m simgrid smpi )
+  target_link_libraries(coll10 m simgrid smpi )
+  target_link_libraries(coll11 m simgrid smpi )
+  target_link_libraries(coll12  m simgrid smpi )
+  target_link_libraries(coll13 m simgrid smpi )
+  target_link_libraries(allredmany m simgrid smpi )
+  target_link_libraries(bcastbug m simgrid smpi )
+  target_link_libraries(bcastbug2 m simgrid smpi )
+  target_link_libraries(bcastvec m simgrid smpi )
+  target_link_libraries(grouptest m simgrid smpi )
+  target_link_libraries(redtst m simgrid smpi )
+  target_link_libraries(barrier m simgrid smpi )
+  target_link_libraries(bcast_mpich m simgrid smpi )
+  target_link_libraries(allred m simgrid smpi )
+  target_link_libraries(allred2 m simgrid smpi )
+  target_link_libraries(scatterv m simgrid smpi )
+  target_link_libraries(scattern m simgrid smpi )
+  target_link_libraries(redscat m simgrid smpi )
+  target_link_libraries(longuser m simgrid smpi )
+  target_link_libraries(alltoallv_mpich m simgrid smpi )
+  target_link_libraries(scantst m simgrid smpi )
+  if(SMPI_F2C)
+    target_link_libraries(allredf m simgrid smpi )
+    target_link_libraries(assocf m simgrid smpi )
+    target_link_libraries(allgatherf m simgrid smpi )
+    target_link_libraries(bcastlog m simgrid smpi )
+  endif()
+
+  set_target_properties(coll1 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(coll2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(coll3 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(coll4 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(coll5 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(coll6 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(coll7 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(coll8 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(coll9 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(coll10 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(coll11 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(coll12 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(coll13 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(allredmany PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(bcastbug PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(bcastbug2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(bcastvec PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(grouptest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(redtst PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(barrier PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(bcast_mpich PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(allred PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(allred2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(scatterv PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(scattern PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(redscat PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(longuser PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(alltoallv_mpich PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(scantst PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  if(SMPI_F2C)
+    set_target_properties(allredf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+    set_target_properties(assocf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+    set_target_properties(allgatherf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+    set_target_properties(bcastlog PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  endif()
+
+endif()
+
+set(tesh_files
+  ${tesh_files}
+  PARENT_SCOPE
+  )
+set(xml_files
+  ${xml_files}
+  PARENT_SCOPE
+  )
+set(examples_src
+  ${examples_src}
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll1.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll3.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll4.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll5.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll6.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll7.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll8.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll9.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll10.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll11.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll12.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/coll13.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/allredmany.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/bcastbug.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/bcastbug2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/bcastvec.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/grouptest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/redtst.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/barrier.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/bcast.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/allred.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/allred2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/scatterv.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/scattern.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/redscat.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/longuser.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/alltoallv.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/scantst.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/test.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/test.h
+  ${CMAKE_CURRENT_SOURCE_DIR}/allgatherf.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/allredf.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/allredf.std
+  ${CMAKE_CURRENT_SOURCE_DIR}/assocf.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/bcastlog.f
+
+  PARENT_SCOPE
+  )
+set(bin_files
+  ${bin_files}
+  PARENT_SCOPE
+  )
+set(txt_files
+  ${txt_files}
+  PARENT_SCOPE
+  )
diff --git a/teshsuite/smpi/mpich-test/coll/allgatherf.f b/teshsuite/smpi/mpich-test/coll/allgatherf.f
new file mode 100644 (file)
index 0000000..462d3e0
--- /dev/null
@@ -0,0 +1,41 @@
+c
+c This test looks at sending some data with a count of zero.
+c
+      program testmpi
+      integer           mnprocs, lcwk1
+      parameter         ( mnprocs = 2, lcwk1 = 6 )
+      integer           comm, rc, myid, nprocs, ierr, i,
+     &                  recvts(0:mnprocs-1), displs(0:mnprocs-1)
+      double precision  wrkbuf(3), cwk1(lcwk1)
+      include           'mpif.h'
+c
+      call MPI_INIT( ierr )
+      comm = MPI_COMM_WORLD
+      call MPI_COMM_RANK( comm, myid, ierr )
+      call MPI_COMM_SIZE( comm, nprocs, ierr )
+c
+      do i = 1, lcwk1
+         cwk1(i) = -10
+      end do
+      do i=1,3
+         wrkbuf(i) = myid
+      end do
+      do i = 0, mnprocs-1
+         recvts(i) = 3
+         displs(i) = 3 * i
+      end do
+      recvts(mnprocs-1) = 0
+      displs(mnprocs-1) = 0
+c
+      call MPI_ALLGATHERV( wrkbuf, recvts(myid), 
+     &                     MPI_DOUBLE_PRECISION, cwk1, recvts, 
+     &                     displs, MPI_DOUBLE_PRECISION, comm, ierr )
+c 
+      do i = 1, lcwk1
+         print *, myid, i, cwk1(i)
+      end do
+c
+      call MPI_FINALIZE(rc)
+c
+      end
+c
diff --git a/teshsuite/smpi/mpich-test/coll/allred.c b/teshsuite/smpi/mpich-test/coll/allred.c
new file mode 100644 (file)
index 0000000..792565c
--- /dev/null
@@ -0,0 +1,2464 @@
+
+#include <math.h>
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "test.h"
+#include "../pt2pt/gcomm.h"
+
+int verbose = 1;
+int main( int argc, char **argv )
+{
+int count, errcnt = 0, gerr = 0, toterr, size, rank;
+MPI_Comm comm;
+
+int       world_rank;
+
+MPI_Init( &argc, &argv );
+MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+
+/* First tests */
+//MakeComms( comms, 10, &ncomm, 0 );
+//for (ii=0; ii<ncomm; ii++) {
+comm = MPI_COMM_WORLD;
+
+
+MPI_Comm_size( comm, &size );
+MPI_Comm_rank( comm, &rank );
+count = 10;
+
+/* Test sum */
+if (world_rank == 0 && verbose) printf( "Testing MPI_SUM...\n" );
+
+
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = i*size; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_SUM, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_SUM\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = i*size; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_SUM, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_SUM\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = i*size; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_SUM, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_SUM\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = i*size; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_SUM, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_SUM\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = i*size; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_SUM, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_SUM\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = i*size; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_SUM, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_SUM\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+float *in, *out, *sol;
+int  i, fnderr=0;
+in = (float *)malloc( count * sizeof(float) );
+out = (float *)malloc( count * sizeof(float) );
+sol = (float *)malloc( count * sizeof(float) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = i*size; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_FLOAT, MPI_SUM, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_FLOAT and op MPI_SUM\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+double *in, *out, *sol;
+int  i, fnderr=0;
+in = (double *)malloc( count * sizeof(double) );
+out = (double *)malloc( count * sizeof(double) );
+sol = (double *)malloc( count * sizeof(double) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = i*size; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_DOUBLE, MPI_SUM, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_DOUBLE and op MPI_SUM\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_SUM\n", errcnt, rank );
+errcnt = 0;
+
+/* Test product */
+if (world_rank == 0 && verbose) printf( "Testing MPI_PROD...\n" );
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = (i > 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_PROD, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_PROD\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = (i > 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_PROD, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_PROD\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = (i > 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_PROD, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_PROD\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = (i > 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_PROD, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_PROD\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = (i > 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_PROD, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_PROD\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = (i > 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_PROD, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_PROD\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+float *in, *out, *sol;
+int  i, fnderr=0;
+in = (float *)malloc( count * sizeof(float) );
+out = (float *)malloc( count * sizeof(float) );
+sol = (float *)malloc( count * sizeof(float) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = (i > 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_FLOAT, MPI_PROD, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_FLOAT and op MPI_PROD\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+double *in, *out, *sol;
+int  i, fnderr=0;
+in = (double *)malloc( count * sizeof(double) );
+out = (double *)malloc( count * sizeof(double) );
+sol = (double *)malloc( count * sizeof(double) );
+for (i=0; i<count; i++) { *(in + i) = i; *(sol + i) = (i > 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_DOUBLE, MPI_PROD, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_DOUBLE and op MPI_PROD\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_PROD\n", errcnt, rank );
+errcnt = 0;
+
+/* Test max */
+if (world_rank == 0 && verbose) printf( "Testing MPI_MAX...\n" );
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = (size - 1 + i); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_MAX, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_MAX\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = (size - 1 + i); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_MAX, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_MAX\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = (size - 1 + i); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_MAX, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_MAX\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = (size - 1 + i); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_MAX, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_MAX\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = (size - 1 + i); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_MAX, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_MAX\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = (size - 1 + i); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_MAX, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_MAX\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+float *in, *out, *sol;
+int  i, fnderr=0;
+in = (float *)malloc( count * sizeof(float) );
+out = (float *)malloc( count * sizeof(float) );
+sol = (float *)malloc( count * sizeof(float) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = (size - 1 + i); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_FLOAT, MPI_MAX, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_FLOAT and op MPI_MAX\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+double *in, *out, *sol;
+int  i, fnderr=0;
+in = (double *)malloc( count * sizeof(double) );
+out = (double *)malloc( count * sizeof(double) );
+sol = (double *)malloc( count * sizeof(double) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = (size - 1 + i); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_DOUBLE, MPI_MAX, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_DOUBLE and op MPI_MAX\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_MAX\n", errcnt, rank );
+errcnt = 0;
+
+/* Test min */
+if (world_rank == 0 && verbose) printf( "Testing MPI_MIN...\n" );
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_MIN, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_MIN\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_MIN, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_MIN\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_MIN, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_MIN\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_MIN, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_MIN\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_MIN, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_MIN\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_MIN, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_MIN\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+float *in, *out, *sol;
+int  i, fnderr=0;
+in = (float *)malloc( count * sizeof(float) );
+out = (float *)malloc( count * sizeof(float) );
+sol = (float *)malloc( count * sizeof(float) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_FLOAT, MPI_MIN, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_FLOAT and op MPI_MIN\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+double *in, *out, *sol;
+int  i, fnderr=0;
+in = (double *)malloc( count * sizeof(double) );
+out = (double *)malloc( count * sizeof(double) );
+sol = (double *)malloc( count * sizeof(double) );
+for (i=0; i<count; i++) { *(in + i) = (rank + i); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_DOUBLE, MPI_MIN, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_DOUBLE and op MPI_MIN\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_MIN\n", errcnt, rank );
+errcnt = 0;
+
+/* Test LOR */
+if (world_rank == 0 && verbose) printf( "Testing MPI_LOR...\n" );
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = (rank & 0x1); *(sol + i) = (size > 1); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_LOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_LOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = (rank & 0x1); *(sol + i) = (size > 1); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_LOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_LOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = (rank & 0x1); *(sol + i) = (size > 1); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_LOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_LOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = (rank & 0x1); *(sol + i) = (size > 1); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_LOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_LOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = (rank & 0x1); *(sol + i) = (size > 1); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_LOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_LOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = (rank & 0x1); *(sol + i) = (size > 1); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_LOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_LOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_LOR(1)\n", errcnt, rank );
+errcnt = 0;
+
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_LOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_LOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_LOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_LOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_LOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_LOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_LOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_LOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_LOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_LOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_LOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_LOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_LOR(0)\n", errcnt, rank );
+errcnt = 0;
+
+/* Test LXOR */
+if (world_rank == 0 && verbose) printf( "Testing MPI_LXOR...\n" );
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = (rank == 1); *(sol + i) = (size > 1); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = (rank == 1); *(sol + i) = (size > 1); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = (rank == 1); *(sol + i) = (size > 1); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = (rank == 1); *(sol + i) = (size > 1); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = (rank == 1); *(sol + i) = (size > 1); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = (rank == 1); *(sol + i) = (size > 1); 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_LXOR(1)\n", errcnt, rank );
+errcnt = 0;
+
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_LXOR(0)\n", errcnt, rank );
+errcnt = 0;
+
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = 1; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = 1; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = 1; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = 1; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = 1; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = 1; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_LXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_LXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_LXOR(1-0)\n", errcnt, rank );
+errcnt = 0;
+
+/* Test LAND */
+if (world_rank == 0 && verbose) printf( "Testing MPI_LAND...\n" );
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = (rank & 0x1); *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_LAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_LAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = (rank & 0x1); *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_LAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_LAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = (rank & 0x1); *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_LAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_LAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = (rank & 0x1); *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_LAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_LAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = (rank & 0x1); *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_LAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_LAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = (rank & 0x1); *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_LAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_LAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_LAND(0)\n", errcnt, rank );
+errcnt = 0;
+
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = 1; *(sol + i) = 1; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_LAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_LAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = 1; *(sol + i) = 1; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_LAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_LAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = 1; *(sol + i) = 1; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_LAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_LAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = 1; *(sol + i) = 1; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_LAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_LAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = 1; *(sol + i) = 1; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_LAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_LAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = 1; *(sol + i) = 1; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_LAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_LAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_LAND(1)\n", errcnt, rank );
+errcnt = 0;
+
+/* Test BOR */
+if (world_rank == 0 && verbose) printf( "Testing MPI_BOR...\n" );
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = rank & 0x3; *(sol + i) = (size < 3) ? size - 1 : 0x3; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_BOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_BOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = rank & 0x3; *(sol + i) = (size < 3) ? size - 1 : 0x3; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_BOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_BOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = rank & 0x3; *(sol + i) = (size < 3) ? size - 1 : 0x3; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_BOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_BOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = rank & 0x3; *(sol + i) = (size < 3) ? size - 1 : 0x3; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_BOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_BOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = rank & 0x3; *(sol + i) = (size < 3) ? size - 1 : 0x3; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_BOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_BOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = rank & 0x3; *(sol + i) = (size < 3) ? size - 1 : 0x3; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_BOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_BOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned char *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned char *)malloc( count * sizeof(unsigned char) );
+out = (unsigned char *)malloc( count * sizeof(unsigned char) );
+sol = (unsigned char *)malloc( count * sizeof(unsigned char) );
+for (i=0; i<count; i++) { *(in + i) = rank & 0x3; *(sol + i) = (size < 3) ? size - 1 : 0x3; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_BYTE, MPI_BOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_BYTE and op MPI_BOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_BOR(1)\n", errcnt, rank );
+errcnt = 0;
+
+/* Test BAND */
+if (world_rank == 0 && verbose) printf( "Testing MPI_BAND...\n" );
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : ~0); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : ~0); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : ~0); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : ~0); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : ~0); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : ~0); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned char *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned char *)malloc( count * sizeof(unsigned char) );
+out = (unsigned char *)malloc( count * sizeof(unsigned char) );
+sol = (unsigned char *)malloc( count * sizeof(unsigned char) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : ~0); *(sol + i) = i; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_BYTE, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_BYTE and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_BAND(1)\n", errcnt, rank );
+errcnt = 0;
+
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : 0); *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : 0); *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : 0); *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : 0); *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : 0); *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = (rank == size-1 ? i : 0); *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_BAND, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_BAND\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_BAND(0)\n", errcnt, rank );
+errcnt = 0;
+
+/* Test BXOR */
+if (world_rank == 0 && verbose) printf( "Testing MPI_BXOR...\n" );
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = (rank == 1)*0xf0 ; *(sol + i) = (size > 1)*0xf0 ; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = (rank == 1)*0xf0 ; *(sol + i) = (size > 1)*0xf0 ; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = (rank == 1)*0xf0 ; *(sol + i) = (size > 1)*0xf0 ; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = (rank == 1)*0xf0 ; *(sol + i) = (size > 1)*0xf0 ; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = (rank == 1)*0xf0 ; *(sol + i) = (size > 1)*0xf0 ; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = (rank == 1)*0xf0 ; *(sol + i) = (size > 1)*0xf0 ; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_BXOR(1)\n", errcnt, rank );
+errcnt = 0;
+
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = 0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_BXOR(0)\n", errcnt, rank );
+errcnt = 0;
+
+
+{
+int *in, *out, *sol;
+int  i, fnderr=0;
+in = (int *)malloc( count * sizeof(int) );
+out = (int *)malloc( count * sizeof(int) );
+sol = (int *)malloc( count * sizeof(int) );
+for (i=0; i<count; i++) { *(in + i) = ~0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_INT, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_INT and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+long *in, *out, *sol;
+int  i, fnderr=0;
+in = (long *)malloc( count * sizeof(long) );
+out = (long *)malloc( count * sizeof(long) );
+sol = (long *)malloc( count * sizeof(long) );
+for (i=0; i<count; i++) { *(in + i) = ~0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_LONG, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+short *in, *out, *sol;
+int  i, fnderr=0;
+in = (short *)malloc( count * sizeof(short) );
+out = (short *)malloc( count * sizeof(short) );
+sol = (short *)malloc( count * sizeof(short) );
+for (i=0; i<count; i++) { *(in + i) = ~0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_SHORT, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned short *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned short *)malloc( count * sizeof(unsigned short) );
+out = (unsigned short *)malloc( count * sizeof(unsigned short) );
+sol = (unsigned short *)malloc( count * sizeof(unsigned short) );
+for (i=0; i<count; i++) { *(in + i) = ~0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_SHORT and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned *)malloc( count * sizeof(unsigned) );
+out = (unsigned *)malloc( count * sizeof(unsigned) );
+sol = (unsigned *)malloc( count * sizeof(unsigned) );
+for (i=0; i<count; i++) { *(in + i) = ~0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+unsigned long *in, *out, *sol;
+int  i, fnderr=0;
+in = (unsigned long *)malloc( count * sizeof(unsigned long) );
+out = (unsigned long *)malloc( count * sizeof(unsigned long) );
+sol = (unsigned long *)malloc( count * sizeof(unsigned long) );
+for (i=0; i<count; i++) { *(in + i) = ~0; *(sol + i) = 0; 
+       *(out + i) = 0; }
+MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_BXOR, comm );
+for (i=0; i<count; i++) { if (*(out + i) != *(sol + i)) {errcnt++; fnderr++;}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_UNSIGNED_LONG and op MPI_BXOR\n", world_rank );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_BXOR(1-0)\n", errcnt, rank );
+errcnt = 0;
+
+/* Test Maxloc */
+if (world_rank == 0 && verbose) printf( "Testing MPI_MAXLOC...\n" );
+
+{
+struct int_test { int a; int b; } *in, *out, *sol;
+int  i,fnderr=0;
+in = (struct int_test *)malloc( count * sizeof(struct int_test) );
+out = (struct int_test *)malloc( count * sizeof(struct int_test) );
+sol = (struct int_test *)malloc( count * sizeof(struct int_test) );
+for (i=0; i<count; i++) { (in + i)->a = (rank + i); (in + i)->b = rank;
+        (sol + i)->a = (size - 1 + i); (sol + i)->b = (size-1);
+       (out + i)->a = 0; (out + i)->b = -1; }
+MPI_Allreduce( in, out, count, MPI_2INT, MPI_MAXLOC, comm );
+for (i=0; i<count; i++) { if ((out + i)->a != (sol + i)->a ||
+                             (out + i)->b != (sol + i)->b) {
+       errcnt++; fnderr++; 
+    fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank,
+       (int)((sol + i)->a),
+       (sol+i)->b, (int)((out+i)->a), (out+i)->b );
+}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_2INT and op MPI_MAXLOC (%d of %d wrong)\n",
+                     world_rank, fnderr, count );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+struct long_test { long a; int b; } *in, *out, *sol;
+int  i,fnderr=0;
+in = (struct long_test *)malloc( count * sizeof(struct long_test) );
+out = (struct long_test *)malloc( count * sizeof(struct long_test) );
+sol = (struct long_test *)malloc( count * sizeof(struct long_test) );
+for (i=0; i<count; i++) { (in + i)->a = (rank + i); (in + i)->b = rank;
+        (sol + i)->a = (size - 1 + i); (sol + i)->b = (size-1);
+       (out + i)->a = 0; (out + i)->b = -1; }
+MPI_Allreduce( in, out, count, MPI_LONG_INT, MPI_MAXLOC, comm );
+for (i=0; i<count; i++) { if ((out + i)->a != (sol + i)->a ||
+                             (out + i)->b != (sol + i)->b) {
+       errcnt++; fnderr++; 
+    fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank,
+       (int)((sol + i)->a),
+       (sol+i)->b, (int)((out+i)->a), (out+i)->b );
+}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG_INT and op MPI_MAXLOC (%d of %d wrong)\n",
+                     world_rank, fnderr, count );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+struct short_test { short a; int b; } *in, *out, *sol;
+int  i,fnderr=0;
+in = (struct short_test *)malloc( count * sizeof(struct short_test) );
+out = (struct short_test *)malloc( count * sizeof(struct short_test) );
+sol = (struct short_test *)malloc( count * sizeof(struct short_test) );
+for (i=0; i<count; i++) { (in + i)->a = (rank + i); (in + i)->b = rank;
+        (sol + i)->a = (size - 1 + i); (sol + i)->b = (size-1);
+       (out + i)->a = 0; (out + i)->b = -1; }
+MPI_Allreduce( in, out, count, MPI_SHORT_INT, MPI_MAXLOC, comm );
+for (i=0; i<count; i++) { if ((out + i)->a != (sol + i)->a ||
+                             (out + i)->b != (sol + i)->b) {
+       errcnt++; fnderr++; 
+    fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank,
+       (int)((sol + i)->a),
+       (sol+i)->b, (int)((out+i)->a), (out+i)->b );
+}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT_INT and op MPI_MAXLOC (%d of %d wrong)\n",
+                     world_rank, fnderr, count );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+struct float_test { float a; int b; } *in, *out, *sol;
+int  i,fnderr=0;
+in = (struct float_test *)malloc( count * sizeof(struct float_test) );
+out = (struct float_test *)malloc( count * sizeof(struct float_test) );
+sol = (struct float_test *)malloc( count * sizeof(struct float_test) );
+for (i=0; i<count; i++) { (in + i)->a = (rank + i); (in + i)->b = rank;
+        (sol + i)->a = (size - 1 + i); (sol + i)->b = (size-1);
+       (out + i)->a = 0; (out + i)->b = -1; }
+MPI_Allreduce( in, out, count, MPI_FLOAT_INT, MPI_MAXLOC, comm );
+for (i=0; i<count; i++) { if ((out + i)->a != (sol + i)->a ||
+                             (out + i)->b != (sol + i)->b) {
+       errcnt++; fnderr++; 
+    fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank,
+       (int)((sol + i)->a),
+       (sol+i)->b, (int)((out+i)->a), (out+i)->b );
+}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_FLOAT_INT and op MPI_MAXLOC (%d of %d wrong)\n",
+                     world_rank, fnderr, count );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+struct double_test { double a; int b; } *in, *out, *sol;
+int  i,fnderr=0;
+in = (struct double_test *)malloc( count * sizeof(struct double_test) );
+out = (struct double_test *)malloc( count * sizeof(struct double_test) );
+sol = (struct double_test *)malloc( count * sizeof(struct double_test) );
+for (i=0; i<count; i++) { (in + i)->a = (rank + i); (in + i)->b = rank;
+        (sol + i)->a = (size - 1 + i); (sol + i)->b = (size-1);
+       (out + i)->a = 0; (out + i)->b = -1; }
+MPI_Allreduce( in, out, count, MPI_DOUBLE_INT, MPI_MAXLOC, comm );
+for (i=0; i<count; i++) { if ((out + i)->a != (sol + i)->a ||
+                             (out + i)->b != (sol + i)->b) {
+       errcnt++; fnderr++; 
+    fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank,
+       (int)((sol + i)->a),
+       (sol+i)->b, (int)((out+i)->a), (out+i)->b );
+}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_DOUBLE_INT and op MPI_MAXLOC (%d of %d wrong)\n",
+                     world_rank, fnderr, count );
+free( in );
+free( out );
+free( sol );
+}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_MAXLOC\n", errcnt, rank );
+errcnt = 0;
+
+/* Test minloc */
+if (world_rank == 0 && verbose) printf( "Testing MPI_MINLOC...\n" );
+
+
+{
+struct int_test { int a; int b; } *in, *out, *sol;
+int  i,fnderr=0;
+in = (struct int_test *)malloc( count * sizeof(struct int_test) );
+out = (struct int_test *)malloc( count * sizeof(struct int_test) );
+sol = (struct int_test *)malloc( count * sizeof(struct int_test) );
+for (i=0; i<count; i++) { (in + i)->a = (rank + i); (in + i)->b = rank;
+        (sol + i)->a = i; (sol + i)->b = 0;
+       (out + i)->a = 0; (out + i)->b = -1; }
+MPI_Allreduce( in, out, count, MPI_2INT, MPI_MINLOC, comm );
+for (i=0; i<count; i++) { if ((out + i)->a != (sol + i)->a ||
+                             (out + i)->b != (sol + i)->b) {
+       errcnt++; fnderr++; 
+    fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank,
+       (int)((sol + i)->a),
+       (sol+i)->b, (int)((out+i)->a), (out+i)->b );
+}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_2INT and op MPI_MINLOC (%d of %d wrong)\n",
+                     world_rank, fnderr, count );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+struct long_test { long a; int b; } *in, *out, *sol;
+int  i,fnderr=0;
+in = (struct long_test *)malloc( count * sizeof(struct long_test) );
+out = (struct long_test *)malloc( count * sizeof(struct long_test) );
+sol = (struct long_test *)malloc( count * sizeof(struct long_test) );
+for (i=0; i<count; i++) { (in + i)->a = (rank + i); (in + i)->b = rank;
+        (sol + i)->a = i; (sol + i)->b = 0;
+       (out + i)->a = 0; (out + i)->b = -1; }
+MPI_Allreduce( in, out, count, MPI_LONG_INT, MPI_MINLOC, comm );
+for (i=0; i<count; i++) { if ((out + i)->a != (sol + i)->a ||
+                             (out + i)->b != (sol + i)->b) {
+       errcnt++; fnderr++; 
+    fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank,
+       (int)((sol + i)->a),
+       (sol+i)->b, (int)((out+i)->a), (out+i)->b );
+}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_LONG_INT and op MPI_MINLOC (%d of %d wrong)\n",
+                     world_rank, fnderr, count );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+struct short_test { short a; int b; } *in, *out, *sol;
+int  i,fnderr=0;
+in = (struct short_test *)malloc( count * sizeof(struct short_test) );
+out = (struct short_test *)malloc( count * sizeof(struct short_test) );
+sol = (struct short_test *)malloc( count * sizeof(struct short_test) );
+for (i=0; i<count; i++) { (in + i)->a = (rank + i); (in + i)->b = rank;
+        (sol + i)->a = i; (sol + i)->b = 0;
+       (out + i)->a = 0; (out + i)->b = -1; }
+MPI_Allreduce( in, out, count, MPI_SHORT_INT, MPI_MINLOC, comm );
+for (i=0; i<count; i++) { if ((out + i)->a != (sol + i)->a ||
+                             (out + i)->b != (sol + i)->b) {
+       errcnt++; fnderr++; 
+    fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank,
+       (int)((sol + i)->a),
+       (sol+i)->b, (int)((out+i)->a), (out+i)->b );
+}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_SHORT_INT and op MPI_MINLOC (%d of %d wrong)\n",
+                     world_rank, fnderr, count );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+struct float_test { float a; int b; } *in, *out, *sol;
+int  i,fnderr=0;
+in = (struct float_test *)malloc( count * sizeof(struct float_test) );
+out = (struct float_test *)malloc( count * sizeof(struct float_test) );
+sol = (struct float_test *)malloc( count * sizeof(struct float_test) );
+for (i=0; i<count; i++) { (in + i)->a = (rank + i); (in + i)->b = rank;
+        (sol + i)->a = i; (sol + i)->b = 0;
+       (out + i)->a = 0; (out + i)->b = -1; }
+MPI_Allreduce( in, out, count, MPI_FLOAT_INT, MPI_MINLOC, comm );
+for (i=0; i<count; i++) { if ((out + i)->a != (sol + i)->a ||
+                             (out + i)->b != (sol + i)->b) {
+       errcnt++; fnderr++; 
+    fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank,
+       (int)((sol + i)->a),
+       (sol+i)->b, (int)((out+i)->a), (out+i)->b );
+}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_FLOAT_INT and op MPI_MINLOC (%d of %d wrong)\n",
+                     world_rank, fnderr, count );
+free( in );
+free( out );
+free( sol );
+}
+
+
+{
+struct double_test { double a; int b; } *in, *out, *sol;
+int  i,fnderr=0;
+in = (struct double_test *)malloc( count * sizeof(struct double_test) );
+out = (struct double_test *)malloc( count * sizeof(struct double_test) );
+sol = (struct double_test *)malloc( count * sizeof(struct double_test) );
+for (i=0; i<count; i++) { (in + i)->a = (rank + i); (in + i)->b = rank;
+        (sol + i)->a = i; (sol + i)->b = 0;
+       (out + i)->a = 0; (out + i)->b = -1; }
+MPI_Allreduce( in, out, count, MPI_DOUBLE_INT, MPI_MINLOC, comm );
+for (i=0; i<count; i++) { if ((out + i)->a != (sol + i)->a ||
+                             (out + i)->b != (sol + i)->b) {
+       errcnt++; fnderr++; 
+    fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank,
+       (int)((sol + i)->a),
+       (sol+i)->b, (int)((out+i)->a), (out+i)->b );
+}}
+if (fnderr) fprintf( stderr, 
+       "(%d) Error for type MPI_DOUBLE_INT and op MPI_MINLOC (%d of %d wrong)\n",
+                     world_rank, fnderr, count );
+free( in );
+free( out );
+free( sol );
+//}
+
+
+gerr += errcnt;
+if (errcnt > 0)
+       printf( "Found %d errors on %d for MPI_MINLOC\n", errcnt, rank );
+errcnt = 0;
+
+}
+if (gerr > 0) {
+       MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+       printf( "Found %d errors overall on %d\n", gerr, rank );
+       }
+MPI_Allreduce( &gerr, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+ if (world_rank == 0) {
+     if (toterr == 0) {
+        printf( " No Errors\n" );
+     }
+     else {
+        printf (" Found %d errors\n", toterr );
+     }
+ }
+//FreeComms( comms, ncomm );
+MPI_Finalize( );
+return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/allred.std b/teshsuite/smpi/mpich-test/coll/allred.std
new file mode 100644 (file)
index 0000000..06d9e12
--- /dev/null
@@ -0,0 +1,13 @@
+Testing MPI_SUM...
+Testing MPI_PROD...
+Testing MPI_MAX...
+Testing MPI_MIN...
+Testing MPI_LOR...
+Testing MPI_LXOR...
+Testing MPI_LAND...
+Testing MPI_BOR...
+Testing MPI_BAND...
+Testing MPI_BXOR...
+Testing MPI_MAXLOC...
+Testing MPI_MINLOC...
+ No Errors
diff --git a/teshsuite/smpi/mpich-test/coll/allred2.c b/teshsuite/smpi/mpich-test/coll/allred2.c
new file mode 100644 (file)
index 0000000..a9dc98a
--- /dev/null
@@ -0,0 +1,50 @@
+/* 
+   This test checks for possible interference between 
+   successive calls to MPI_Allreduce.  Some users, on some MPI implementations
+   and platforms, have had to add MPI_Barrier before MPI_Allreduce calls.
+   */
+#include "mpi.h"
+#include <stdio.h>
+
+#define MAX_LOOP 1000
+
+int main( int argc, char *argv[] )
+{
+    int i, in_val, out_val;
+    int rank, size;
+    int errs = 0, toterrs;
+
+    MPI_Init( &argc, &argv );
+
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    for (i=0; i<MAX_LOOP; i++) {
+       in_val = (i & 0x1) ? 10 : -10;
+       MPI_Allreduce( &in_val, &out_val, 1, MPI_INT, MPI_SUM, 
+                      MPI_COMM_WORLD );
+       if (i & 0x1) {
+           if (out_val != 10 * size) {
+               errs++;
+               printf( "[%d] Error in out_val = %d\n", rank, out_val );
+           }
+       }
+       else {
+           if (-out_val != 10 * size) {
+               errs++;
+               printf( "[%d] Error in out_val = %d\n", rank, out_val );
+           }
+       }
+    }
+    MPI_Barrier( MPI_COMM_WORLD );
+    MPI_Allreduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    
+    if (rank == 0) {
+       if (toterrs) 
+           printf( " Found %d errors\n", toterrs );
+       else
+           printf( " No Errors\n" );
+    }
+
+    MPI_Finalize( );
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/allredf.f b/teshsuite/smpi/mpich-test/coll/allredf.f
new file mode 100644 (file)
index 0000000..5ea0b27
--- /dev/null
@@ -0,0 +1,894 @@
+
+        program main
+        include 'mpif.h'
+        integer count, errcnt, size, rank, ierr, i
+        integer comm
+        logical fnderr
+        integer max_size
+        integer world_rank
+        parameter (max_size=100)
+        integer intin(max_size), intout(max_size), intsol(max_size)
+        real    realin(max_size), realout(max_size), realsol(max_size)
+        double precision dblein(max_size), dbleout(max_size),
+     *                   dblesol(max_size)
+        complex cplxin(max_size), cplxout(max_size), cplxsol(max_size)
+        logical login(max_size), logout(max_size), logsol(max_size)
+C
+C
+C
+C       Declare work areas
+C
+        call MPI_INIT( ierr )
+
+        errcnt = 0
+        comm = MPI_COMM_WORLD
+        call MPI_COMM_RANK( comm, rank, ierr )
+        world_rank = rank
+        call MPI_COMM_SIZE( comm, size, ierr )
+        count = 10
+
+C Test sum 
+        if (world_rank .eq. 0) print *, ' MPI_SUM'
+
+       fnderr = .false.
+       do 23000 i=1,count
+        intin(i) = i
+        intsol(i) = i*size
+        intout(i) = 0
+23000   continue
+       call MPI_Allreduce( intin, intout, count, 
+     *      MPI_INTEGER, MPI_SUM, comm, ierr )
+              do 23001 i=1,count
+        if (intout(i).ne.intsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23001   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_INTEGER and op MPI_SUM'
+        endif
+
+
+       fnderr = .false.
+       do 23002 i=1,count
+        realin(i) = i
+        realsol(i) = i*size
+        realout(i) = 0
+23002   continue
+       call MPI_Allreduce( realin, realout, count, 
+     *      MPI_REAL, MPI_SUM, comm, ierr )
+              do 23003 i=1,count
+        if (realout(i).ne.realsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23003   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_REAL and op MPI_SUM'
+        endif
+
+
+       fnderr = .false.
+       do 23004 i=1,count
+        dblein(i) = i
+        dblesol(i) = i*size
+        dbleout(i) = 0
+23004   continue
+       call MPI_Allreduce( dblein, dbleout, count, 
+     *      MPI_DOUBLE_PRECISION, MPI_SUM, comm, ierr )
+              do 23005 i=1,count
+        if (dbleout(i).ne.dblesol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23005   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_DOUBLE_PRECISION and op MPI_SUM'
+        endif
+
+
+       fnderr = .false.
+       do 23006 i=1,count
+        cplxin(i) = i
+        cplxsol(i) = i*size
+        cplxout(i) = 0
+23006   continue
+       call MPI_Allreduce( cplxin, cplxout, count, 
+     *      MPI_COMPLEX, MPI_SUM, comm, ierr )
+              do 23007 i=1,count
+        if (cplxout(i).ne.cplxsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23007   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_COMPLEX and op MPI_SUM'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank, ' for MPI_SUM'
+        endif
+        errcnt = 0
+
+C Test product 
+        if (world_rank .eq. 0) print *, ' MPI_PROD'
+
+       fnderr = .false.
+       do 23008 i=1,count
+        intin(i) = i
+        intsol(i) = (i)**(size)
+        intout(i) = 0
+23008   continue
+       call MPI_Allreduce( intin, intout, count, 
+     *      MPI_INTEGER, MPI_PROD, comm, ierr )
+              do 23009 i=1,count
+        if (intout(i).ne.intsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23009   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_INTEGER and op MPI_PROD'
+        endif
+
+
+       fnderr = .false.
+       do 23010 i=1,count
+        realin(i) = i
+        realsol(i) = (i)**(size)
+        realout(i) = 0
+23010   continue
+       call MPI_Allreduce( realin, realout, count, 
+     *      MPI_REAL, MPI_PROD, comm, ierr )
+              do 23011 i=1,count
+        if (realout(i).ne.realsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23011   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_REAL and op MPI_PROD'
+        endif
+
+
+       fnderr = .false.
+       do 23012 i=1,count
+        dblein(i) = i
+        dblesol(i) = (i)**(size)
+        dbleout(i) = 0
+23012   continue
+       call MPI_Allreduce( dblein, dbleout, count, 
+     *      MPI_DOUBLE_PRECISION, MPI_PROD, comm, ierr )
+              do 23013 i=1,count
+        if (dbleout(i).ne.dblesol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23013   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_DOUBLE_PRECISION and op MPI_PROD'
+        endif
+
+
+       fnderr = .false.
+       do 23014 i=1,count
+        cplxin(i) = i
+        cplxsol(i) = (i)**(size)
+        cplxout(i) = 0
+23014   continue
+       call MPI_Allreduce( cplxin, cplxout, count, 
+     *      MPI_COMPLEX, MPI_PROD, comm, ierr )
+              do 23015 i=1,count
+        if (cplxout(i).ne.cplxsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23015   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_COMPLEX and op MPI_PROD'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank, ' for MPI_PROD'
+        endif
+        errcnt = 0
+
+C  Test max
+        if (world_rank .eq. 0) print *, ' MPI_MAX'
+
+       fnderr = .false.
+       do 23016 i=1,count
+        intin(i) = (rank + i)
+        intsol(i) = (size - 1 + i)
+        intout(i) = 0
+23016   continue
+       call MPI_Allreduce( intin, intout, count, 
+     *      MPI_INTEGER, MPI_MAX, comm, ierr )
+              do 23017 i=1,count
+        if (intout(i).ne.intsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23017   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_INTEGER and op MPI_MAX'
+        endif
+
+
+       fnderr = .false.
+       do 23018 i=1,count
+        realin(i) = (rank + i)
+        realsol(i) = (size - 1 + i)
+        realout(i) = 0
+23018   continue
+       call MPI_Allreduce( realin, realout, count, 
+     *      MPI_REAL, MPI_MAX, comm, ierr )
+              do 23019 i=1,count
+        if (realout(i).ne.realsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23019   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_REAL and op MPI_MAX'
+        endif
+
+
+       fnderr = .false.
+       do 23020 i=1,count
+        dblein(i) = (rank + i)
+        dblesol(i) = (size - 1 + i)
+        dbleout(i) = 0
+23020   continue
+       call MPI_Allreduce( dblein, dbleout, count, 
+     *      MPI_DOUBLE_PRECISION, MPI_MAX, comm, ierr )
+              do 23021 i=1,count
+        if (dbleout(i).ne.dblesol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23021   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_DOUBLE_PRECISION and op MPI_MAX'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank, ' for MPI_MAX'
+        endif
+        errcnt = 0
+
+C Test min 
+        if (world_rank .eq. 0) print *, ' MPI_MIN'
+
+       fnderr = .false.
+       do 23022 i=1,count
+        intin(i) = (rank + i)
+        intsol(i) = i
+        intout(i) = 0
+23022   continue
+       call MPI_Allreduce( intin, intout, count, 
+     *      MPI_INTEGER, MPI_MIN, comm, ierr )
+              do 23023 i=1,count
+        if (intout(i).ne.intsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23023   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_INTEGER and op MPI_MIN'
+        endif
+
+
+       fnderr = .false.
+       do 23024 i=1,count
+        realin(i) = (rank + i)
+        realsol(i) = i
+        realout(i) = 0
+23024   continue
+       call MPI_Allreduce( realin, realout, count, 
+     *      MPI_REAL, MPI_MIN, comm, ierr )
+              do 23025 i=1,count
+        if (realout(i).ne.realsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23025   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_REAL and op MPI_MIN'
+        endif
+
+
+       fnderr = .false.
+       do 23026 i=1,count
+        dblein(i) = (rank + i)
+        dblesol(i) = i
+        dbleout(i) = 0
+23026   continue
+       call MPI_Allreduce( dblein, dbleout, count, 
+     *      MPI_DOUBLE_PRECISION, MPI_MIN, comm, ierr )
+              do 23027 i=1,count
+        if (dbleout(i).ne.dblesol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23027   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_DOUBLE_PRECISION and op MPI_MIN'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank, ' for MPI_MIN'
+        endif
+        errcnt = 0
+
+C Test LOR
+        if (world_rank .eq. 0) print *, ' MPI_LOR'
+
+       fnderr = .false.
+       do 23028 i=1,count
+        login(i) = (mod(rank,2) .eq. 1)
+        logsol(i) = (size .gt. 1)
+        logout(i) = .FALSE.
+23028   continue
+       call MPI_Allreduce( login, logout, count, 
+     *      MPI_LOGICAL, MPI_LOR, comm, ierr )
+              do 23029 i=1,count
+        if (logout(i).neqv.logsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23029   continue
+        if (fnderr) then
+      print *, 'Error for type MPI_LOGICAL and op MPI_LOR'
+        endif
+
+
+        if (errcnt .gt. 0) then
+           print *, 'Found ', errcnt, ' errors on ', rank,
+     *          ' for MPI_LOR(0)' 
+        endif
+        errcnt = 0
+
+
+
+       fnderr = .false.
+       do 23030 i=1,count
+        login(i) = .false.
+        logsol(i) = .false.
+        logout(i) = .FALSE.
+23030   continue
+       call MPI_Allreduce( login, logout, count, 
+     *      MPI_LOGICAL, MPI_LOR, comm, ierr )
+              do 23031 i=1,count
+        if (logout(i).neqv.logsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23031   continue
+        if (fnderr) then
+      print *, 'Error for type MPI_LOGICAL and op MPI_LOR'
+        endif
+
+
+        if (errcnt .gt. 0) then
+           print *, 'Found ', errcnt, ' errors on ', rank,
+     *              ' for MPI_LOR(1)'
+        endif
+        errcnt = 0
+
+C Test LXOR 
+        if (world_rank .eq. 0) print *, ' MPI_LXOR'
+
+       fnderr = .false.
+       do 23032 i=1,count
+        login(i) = (rank .eq. 1)
+        logsol(i) = (size .gt. 1)
+        logout(i) = .FALSE.
+23032   continue
+       call MPI_Allreduce( login, logout, count, 
+     *      MPI_LOGICAL, MPI_LXOR, comm, ierr )
+              do 23033 i=1,count
+        if (logout(i).neqv.logsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23033   continue
+        if (fnderr) then
+      print *, 'Error for type MPI_LOGICAL and op MPI_LXOR'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ',errcnt,' errors on ', rank, ' for MPI_LXOR'
+        endif
+        errcnt = 0
+
+
+       fnderr = .false.
+       do 23034 i=1,count
+        login(i) = .false.
+        logsol(i) = .false.
+        logout(i) = .FALSE.
+23034   continue
+       call MPI_Allreduce( login, logout, count, 
+     *      MPI_LOGICAL, MPI_LXOR, comm, ierr )
+              do 23035 i=1,count
+        if (logout(i).neqv.logsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23035   continue
+        if (fnderr) then
+      print *, 'Error for type MPI_LOGICAL and op MPI_LXOR'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ',errcnt,' errors on ',rank,' for MPI_LXOR(0)'
+        endif
+        errcnt = 0
+
+
+       fnderr = .false.
+       do 23036 i=1,count
+        login(i) = .true.
+        logsol(i) = mod(size,2) .ne. 0 
+        logout(i) = .FALSE.
+23036   continue
+       call MPI_Allreduce( login, logout, count, 
+     *      MPI_LOGICAL, MPI_LXOR, comm, ierr )
+              do 23037 i=1,count
+        if (logout(i).neqv.logsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23037   continue
+        if (fnderr) then
+      print *, 'Error for type MPI_LOGICAL and op MPI_LXOR'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ',errcnt,' errors on ',rank,' for MPI_LXOR(1-0)'
+        endif
+        errcnt = 0
+
+C Test LAND 
+        if (world_rank .eq. 0) print *, ' MPI_LAND'
+
+       fnderr = .false.
+       do 23038 i=1,count
+        login(i) = (mod(rank,2) .eq. 1)
+        logsol(i) = .false.
+        logout(i) = .FALSE.
+23038   continue
+       call MPI_Allreduce( login, logout, count, 
+     *      MPI_LOGICAL, MPI_LAND, comm, ierr )
+              do 23039 i=1,count
+        if (logout(i).neqv.logsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23039   continue
+        if (fnderr) then
+      print *, 'Error for type MPI_LOGICAL and op MPI_LAND'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank, ' for MPI_LAND'
+        endif
+        errcnt = 0
+
+
+
+
+       fnderr = .false.
+       do 23040 i=1,count
+        login(i) = .true.
+        logsol(i) = .true.
+        logout(i) = .FALSE.
+23040   continue
+       call MPI_Allreduce( login, logout, count, 
+     *      MPI_LOGICAL, MPI_LAND, comm, ierr )
+              do 23041 i=1,count
+        if (logout(i).neqv.logsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23041   continue
+        if (fnderr) then
+      print *, 'Error for type MPI_LOGICAL and op MPI_LAND'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ',errcnt,' errors on ',rank,
+     *      ' for MPI_LAND(true)'
+        endif
+        errcnt = 0
+        
+C Test BOR
+        if (world_rank .eq. 0) print *, ' MPI_BOR'
+        if (size .lt. 3) then
+
+       fnderr = .false.
+       do 23042 i=1,count
+        intin(i) = mod(rank,4)
+        intsol(i) = size - 1
+        intout(i) = 0
+23042   continue
+       call MPI_Allreduce( intin, intout, count, 
+     *      MPI_INTEGER, MPI_BOR, comm, ierr )
+              do 23043 i=1,count
+        if (intout(i).ne.intsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23043   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_INTEGER and op MPI_BOR'
+        endif
+
+        else
+
+       fnderr = .false.
+       do 23044 i=1,count
+        intin(i) = mod(rank,4)
+        intsol(i) = 3
+        intout(i) = 0
+23044   continue
+       call MPI_Allreduce( intin, intout, count, 
+     *      MPI_INTEGER, MPI_BOR, comm, ierr )
+              do 23045 i=1,count
+        if (intout(i).ne.intsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23045   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_INTEGER and op MPI_BOR'
+        endif
+
+        endif
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank,
+     *           ' for MPI_BOR(1)'
+        endif
+        errcnt = 0
+
+C Test BAND 
+        if (world_rank .eq. 0) print *, ' MPI_BAND'
+C See bottom for function definitions
+
+       fnderr = .false.
+       do 23046 i=1,count
+        intin(i) = ibxandval(rank,size,i)
+        intsol(i) = i
+        intout(i) = 0
+23046   continue
+       call MPI_Allreduce( intin, intout, count, 
+     *      MPI_INTEGER, MPI_BAND, comm, ierr )
+              do 23047 i=1,count
+        if (intout(i).ne.intsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23047   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_INTEGER and op MPI_BAND'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank, 
+     *          ' for MPI_BAND(1)'
+        endif
+        errcnt = 0
+
+
+       fnderr = .false.
+       do 23048 i=1,count
+        intin(i) = ibxandval1(rank,size,i)
+        intsol(i) = 0
+        intout(i) = 0
+23048   continue
+       call MPI_Allreduce( intin, intout, count, 
+     *      MPI_INTEGER, MPI_BAND, comm, ierr )
+              do 23049 i=1,count
+        if (intout(i).ne.intsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23049   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_INTEGER and op MPI_BAND'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank, 
+     *          ' for MPI_BAND(0)'
+        endif
+        errcnt = 0
+
+C Test BXOR 
+        if (world_rank .eq. 0) print *, ' MPI_BXOR'
+C See below for function definitions
+
+       fnderr = .false.
+       do 23050 i=1,count
+        intin(i) = ibxorval1(rank)
+        intsol(i) = ibxorsol1(size)
+        intout(i) = 0
+23050   continue
+       call MPI_Allreduce( intin, intout, count, 
+     *      MPI_INTEGER, MPI_BXOR, comm, ierr )
+              do 23051 i=1,count
+        if (intout(i).ne.intsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23051   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_INTEGER and op MPI_BXOR'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank, 
+     *          ' for MPI_BXOR(1)'
+        endif
+        errcnt = 0
+
+
+       fnderr = .false.
+       do 23052 i=1,count
+        intin(i) = 0
+        intsol(i) = 0
+        intout(i) = 0
+23052   continue
+       call MPI_Allreduce( intin, intout, count, 
+     *      MPI_INTEGER, MPI_BXOR, comm, ierr )
+              do 23053 i=1,count
+        if (intout(i).ne.intsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23053   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_INTEGER and op MPI_BXOR'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank, 
+     *          ' for MPI_BXOR(0)'
+        endif
+        errcnt = 0
+
+C Assumes -1 == all bits set
+
+       fnderr = .false.
+       do 23054 i=1,count
+        intin(i) = (-1)
+        if (mod(size,2) .eq. 0) then
+            intsol(i) = 0
+        else
+            intsol(i) = -1
+        endif
+        intout(i) = 0
+23054   continue
+       call MPI_Allreduce( intin, intout, count, 
+     *      MPI_INTEGER, MPI_BXOR, comm, ierr )
+              do 23055 i=1,count
+        if (intout(i).ne.intsol(i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23055   continue
+        if (fnderr) then
+          print *, 'Error for type MPI_INTEGER and op MPI_BXOR'
+        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank, 
+     *          ' for MPI_BXOR(1-0)'
+        endif
+        errcnt = 0
+
+C Test Maxloc 
+        if (world_rank .eq. 0) print *, ' MPI_MAXLOC'
+
+        fnderr = .false.
+        do 23056 i=1, count
+           intin(2*i-1) = (rank + i)
+           intin(2*i)   = rank
+           intsol(2*i-1) = (size - 1 + i)
+           intsol(2*i) = (size-1)
+           intout(2*i-1) = 0
+           intout(2*i)   = 0
+23056   continue
+                call MPI_Allreduce( intin, intout, count, 
+     *      MPI_2INTEGER, MPI_MAXLOC, comm, ierr )
+        do 23057 i=1, count
+        if (intout(2*i-1) .ne. intsol(2*i-1) .or.
+     *      intout(2*i) .ne. intsol(2*i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23057   continue
+        if (fnderr) then
+        print *, 'Error for type MPI_2INTEGER and op MPI_MAXLOC'
+        endif
+
+
+        fnderr = .false.
+        do 23058 i=1, count
+           realin(2*i-1) = (rank + i)
+           realin(2*i)   = rank
+           realsol(2*i-1) = (size - 1 + i)
+           realsol(2*i) = (size-1)
+           realout(2*i-1) = 0
+           realout(2*i)   = 0
+23058   continue
+                call MPI_Allreduce( realin, realout, count, 
+     *      MPI_2REAL, MPI_MAXLOC, comm, ierr )
+        do 23059 i=1, count
+        if (realout(2*i-1) .ne. realsol(2*i-1) .or.
+     *      realout(2*i) .ne. realsol(2*i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23059   continue
+        if (fnderr) then
+        print *, 'Error for type MPI_2REAL and op MPI_MAXLOC'
+        endif
+
+
+!        fnderr = .false.
+!        do 23060 i=1, count
+!           dblein(2*i-1) = (rank + i)
+!           dblein(2*i)   = rank
+!           dblesol(2*i-1) = (size - 1 + i)
+!           dblesol(2*i) = (size-1)
+!           dbleout(2*i-1) = 0
+!           dbleout(2*i)   = 0
+!23060   continue
+!                call MPI_Allreduce( dblein, dbleout, count, 
+!     *      MPI_2DOUBLE_PRECISION, MPI_MAXLOC, comm, ierr )
+!        do 23061 i=1, count
+!        if (dbleout(2*i-1) .ne. dblesol(2*i-1) .or.
+!     *      dbleout(2*i) .ne. dblesol(2*i)) then
+!            errcnt = errcnt + 1
+!            fnderr = .true. 
+!        endif
+!23061   continue
+!        if (fnderr) then
+!           print *,
+!     *     'Error for type MPI_2DOUBLE_PRECISION and op MPI_MAXLOC'
+
+!        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank, 
+     *          ' for MPI_MAXLOC'
+        endif
+        errcnt = 0
+
+C Test minloc 
+        if (world_rank .eq. 0) print *, ' MPI_MINLOC'
+
+
+        fnderr = .false.
+        do 23062 i=1, count
+           intin(2*i-1) = (rank + i)
+           intin(2*i)   = rank
+           intsol(2*i-1) = i
+           intsol(2*i) = 0
+           intout(2*i-1) = 0
+           intout(2*i)   = 0
+23062   continue
+                call MPI_Allreduce( intin, intout, count, 
+     *      MPI_2INTEGER, MPI_MINLOC, comm, ierr )
+        do 23063 i=1, count
+        if (intout(2*i-1) .ne. intsol(2*i-1) .or.
+     *      intout(2*i) .ne. intsol(2*i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23063   continue
+        if (fnderr) then
+        print *, 'Error for type MPI_2INTEGER and op MPI_MINLOC'
+        endif
+
+
+        fnderr = .false.
+        do 23064 i=1, count
+           realin(2*i-1) = (rank + i)
+           realin(2*i)   = rank
+           realsol(2*i-1) = i
+           realsol(2*i) = 0
+           realout(2*i-1) = 0
+           realout(2*i)   = 0
+23064   continue
+                call MPI_Allreduce( realin, realout, count, 
+     *      MPI_2REAL, MPI_MINLOC, comm, ierr )
+        do 23065 i=1, count
+        if (realout(2*i-1) .ne. realsol(2*i-1) .or.
+     *      realout(2*i) .ne. realsol(2*i)) then
+            errcnt = errcnt + 1
+            fnderr = .true. 
+        endif
+23065   continue
+        if (fnderr) then
+        print *, 'Error for type MPI_2REAL and op MPI_MINLOC'
+        endif
+
+
+!        fnderr = .false.
+!        do 23066 i=1, count
+!           dblein(2*i-1) = (rank + i)
+!           dblein(2*i)   = rank
+!           dblesol(2*i-1) = i
+!           dblesol(2*i) = 0
+!           dbleout(2*i-1) = 0
+!           dbleout(2*i)   = 0
+!23066   continue
+!                call MPI_Allreduce( dblein, dbleout, count, 
+!     *      MPI_2DOUBLE_PRECISION, MPI_MINLOC, comm, ierr )
+!        do 23067 i=1, count
+!        if (dbleout(2*i-1) .ne. dblesol(2*i-1) .or.
+!     *      dbleout(2*i) .ne. dblesol(2*i)) then
+!            errcnt = errcnt + 1
+!            fnderr = .true. 
+!        endif
+!23067   continue
+!        if (fnderr) then
+!           print *,
+!     *      'Error for type MPI_2DOUBLE_PRECISION and op MPI_MINLOC'
+!        endif
+
+
+        if (errcnt .gt. 0) then
+        print *, 'Found ', errcnt, ' errors on ', rank, 
+     *          ' for MPI_MINLOC'
+        endif
+        errcnt = 0
+
+        call MPI_Finalize( ierr )
+        end
+
+        integer function ibxorval1( ir )
+        ibxorval1 = 0
+        if (ir .eq. 1) ibxorval1 = 16+32+64+128
+        return
+        end
+
+        integer function ibxorsol1( is )
+        ibxorsol1 = 0
+        if (is .gt. 1) ibxorsol1 = 16+32+64+128
+        return
+        end
+
+C
+C       Assumes -1 == all bits set
+        integer function ibxandval( ir, is, i )
+        integer ir, is, i
+        ibxandval = -1
+        if (ir .eq. is - 1) ibxandval = i
+        return
+        end
+C
+        integer function ibxandval1( ir, is, i )
+        integer ir, is, i
+        ibxandval1 = 0
+        if (ir .eq. is - 1) ibxandval1 = i
+        return
+        end
diff --git a/teshsuite/smpi/mpich-test/coll/allredf.std b/teshsuite/smpi/mpich-test/coll/allredf.std
new file mode 100644 (file)
index 0000000..36bd81c
--- /dev/null
@@ -0,0 +1,12 @@
+ MPI_SUM
+ MPI_PROD
+ MPI_MAX
+ MPI_MIN
+ MPI_LOR
+ MPI_LXOR
+ MPI_LAND
+ MPI_BOR
+ MPI_BAND
+ MPI_BXOR
+ MPI_MAXLOC
+ MPI_MINLOC
diff --git a/teshsuite/smpi/mpich-test/coll/allredmany.c b/teshsuite/smpi/mpich-test/coll/allredmany.c
new file mode 100644 (file)
index 0000000..9d6b283
--- /dev/null
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+
+/*
+ * This example should be run with 2 processes and tests the ability of the
+ * implementation to handle a flood of one-way messages.
+ */
+
+int main( int argc, char **argv )
+{
+  double wscale = 10.0, scale;
+  int numprocs, myid,i,namelen;
+  char processor_name[MPI_MAX_PROCESSOR_NAME];
+
+  MPI_Init(&argc,&argv);
+  MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
+  MPI_Comm_rank(MPI_COMM_WORLD,&myid);
+  MPI_Get_processor_name(processor_name,&namelen);
+
+  /* fprintf(stderr,"Process %d on %s\n",
+          myid, processor_name); */
+  for ( i=0; i<10000; i++) {
+    MPI_Allreduce(&wscale,&scale,1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
+  }
+  MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/allredmany.std b/teshsuite/smpi/mpich-test/coll/allredmany.std
new file mode 100644 (file)
index 0000000..e7c3f62
--- /dev/null
@@ -0,0 +1,22 @@
+*** allredmany ***
+*** allredmany run 0 ***
+*** allredmany run 1 ***
+*** allredmany run 2 ***
+*** allredmany run 3 ***
+*** allredmany run 4 ***
+*** allredmany run 5 ***
+*** allredmany run 6 ***
+*** allredmany run 7 ***
+*** allredmany run 8 ***
+*** allredmany run 9 ***
+*** allredmany run 10 ***
+*** allredmany run 11 ***
+*** allredmany run 12 ***
+*** allredmany run 13 ***
+*** allredmany run 14 ***
+*** allredmany run 15 ***
+*** allredmany run 16 ***
+*** allredmany run 17 ***
+*** allredmany run 18 ***
+*** allredmany run 19 ***
+*** allredmany ***
diff --git a/teshsuite/smpi/mpich-test/coll/alltoallv.c b/teshsuite/smpi/mpich-test/coll/alltoallv.c
new file mode 100644 (file)
index 0000000..b08979b
--- /dev/null
@@ -0,0 +1,97 @@
+#include "mpi.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include "test.h"
+
+/*
+  This program tests MPI_Alltoallv by having processor i send different
+  amounts of data to each processor.
+
+  Because there are separate send and receive types to alltoallv,
+  there need to be tests to rearrange data on the fly.  Not done yet.
+  
+  The first test sends i items to processor i from all processors.
+
+  Currently, the test uses only MPI_INT; this is adequate for testing systems
+  that use point-to-point operations
+ */
+
+int main( int argc, char **argv )
+{
+
+    MPI_Comm comm;
+    int      *sbuf, *rbuf;
+    int      rank, size;
+    int      *sendcounts, *recvcounts, *rdispls, *sdispls;
+    int      i, j, *p, err, toterr;
+    
+    MPI_Init( &argc, &argv );
+    err = 0;
+    
+    comm = MPI_COMM_WORLD;
+
+    /* Create the buffer */
+    MPI_Comm_size( comm, &size );
+    MPI_Comm_rank( comm, &rank );
+    sbuf = (int *)malloc( size * size * sizeof(int) );
+    rbuf = (int *)malloc( size * size * sizeof(int) );
+    if (!sbuf || !rbuf) {
+       fprintf( stderr, "Could not allocated buffers!\n" );
+       MPI_Abort( comm, 1 );
+    }
+    
+    /* Load up the buffers */
+    for (i=0; i<size*size; i++) {
+       sbuf[i] = i + 100*rank;
+       rbuf[i] = -i;
+    }
+
+    /* Create and load the arguments to alltoallv */
+    sendcounts = (int *)malloc( size * sizeof(int) );
+    recvcounts = (int *)malloc( size * sizeof(int) );
+    rdispls    = (int *)malloc( size * sizeof(int) );
+    sdispls    = (int *)malloc( size * sizeof(int) );
+    if (!sendcounts || !recvcounts || !rdispls || !sdispls) {
+       fprintf( stderr, "Could not allocate arg items!\n" );
+       MPI_Abort( comm, 1 );
+    }
+    for (i=0; i<size; i++) {
+       sendcounts[i] = i;
+       recvcounts[i] = rank;
+       rdispls[i]    = i * rank;
+       sdispls[i]    = (i * (i+1))/2;
+    }
+    MPI_Alltoallv( sbuf, sendcounts, sdispls, MPI_INT,
+                  rbuf, recvcounts, rdispls, MPI_INT, comm );
+
+    /* Check rbuf */
+    for (i=0; i<size; i++) {
+       p = rbuf + rdispls[i];
+       for (j=0; j<rank; j++) {
+           if (p[j] != i * 100 + (rank*(rank+1))/2 + j) {
+               fprintf( stderr, "[%d] got %d expected %d for %dth\n",
+                        rank, p[j],(i*(i+1))/2 + j, j );
+               err++;
+           }
+       }
+    }
+
+    free( sdispls );
+    free( rdispls );
+    free( recvcounts );
+    free( sendcounts );
+    free( rbuf );
+    free( sbuf );
+
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    if (rank == 0) {
+       if (toterr > 0) 
+           fprintf( stderr, "Test FAILED with %d errors\n", toterr );
+       else
+           fprintf( stderr, " No Errors\n" );
+    }
+       
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/assocf.f b/teshsuite/smpi/mpich-test/coll/assocf.f
new file mode 100644 (file)
index 0000000..f39747c
--- /dev/null
@@ -0,0 +1,73 @@
+C
+C Thanks to zollweg@tc.cornell.edu (John A. Zollweg) for this test 
+C which detected a problem in one version of the IBM product 
+C implementation of MPI.  The source of the problem in that implementation
+C was assuming that floating point arithmetic was associative (it isn't
+C even commutative on IBM hardware).
+C
+C This program was designed for IEEE and may be uninteresting on other
+C systems.  Note that since it is testing that the same VALUE is
+C delivered at each system, it will run correctly on all systems.
+C
+      PROGRAM ALLREDUCE
+      include 'mpif.h'
+      real*8 myval(4), sum, recvbuf(4)
+      integer ier, me, size, tsize, dtype, i, errors, toterr
+      data myval /-12830196119319614d0,9154042893114674d0,
+     &2371516219785616d0,1304637006419324.8d0/
+      call MPI_INIT(ier)
+      call MPI_COMM_SIZE(MPI_COMM_WORLD,size,ier)
+      if (size.ne.4) then
+         print *,"This test case must be run as a four-way job"
+         call MPI_FINALIZE(ier)
+         stop
+      end if   
+      call MPI_TYPE_SIZE( MPI_REAL, tsize, ier )
+      if (tsize .eq. 8) then
+         dtype = MPI_REAL
+      else 
+         call MPI_TYPE_SIZE( MPI_DOUBLE_PRECISION, tsize, ier )
+         if (tsize .ne. 8) then
+            print *, " Can not test allreduce without an 8 byte"
+            print *, " floating double type."
+            call MPI_FINALIZE(ier)
+            stop
+         endif
+         dtype = MPI_DOUBLE_PRECISION
+      endif
+      call MPI_COMM_RANK(MPI_COMM_WORLD,me,ier)
+      call MPI_ALLREDUCE(myval(me+1),sum,1,dtype,MPI_SUM,
+     &MPI_COMM_WORLD,ier)
+C
+C     collect the values and make sure that they are all the same BITWISE
+C     We could use Gather, but this gives us an added test.
+C
+      do 5 i=1,4
+         recvbuf(i) = i
+ 5    continue
+      call MPI_ALLGATHER( sum, 1, dtype, recvbuf, 1, dtype,
+     &                    MPI_COMM_WORLD, ier )
+      errors = 0
+      do 10 i=2,4
+C         print *, "recvbuf(",i,") = ", recvbuf(i), " on ", me
+         if (recvbuf(1) .ne. recvbuf(i)) then
+               errors = errors + 1
+               print *, "Inconsistent values for ", i, "th entry on ",
+     &                  me
+               print *, recvbuf(1), " not equal to ", recvbuf(i)
+          endif
+ 10   continue
+      call MPI_ALLREDUCE( errors, toterr, 1, MPI_INTEGER, MPI_SUM,
+     &                    MPI_COMM_WORLD, ier )
+      if (me .eq. 0) then
+         if (toterr .gt. 0) then
+            print *, " FAILED with ", toterr, " errors."
+         else
+            print *, " No Errors"
+         endif
+      endif
+C      print *," The value of the sum on node ",me,"is",sum
+      call MPI_FINALIZE(ier)
+C     Calling stop can generate unwanted noise on some systems, and is not
+C     required.
+      end
diff --git a/teshsuite/smpi/mpich-test/coll/barrier.c b/teshsuite/smpi/mpich-test/coll/barrier.c
new file mode 100644 (file)
index 0000000..94fd362
--- /dev/null
@@ -0,0 +1,88 @@
+/* This program provides some simple verification of the MPI_Barrier
+ * program.  All of the clients send a message to indicate that they
+ * are alive (a simple character string) and then the all of the
+ * clients enter an MPI_Barrier.  The server then Iprobes for a while
+ * to make sure that none of the "through barrier" messages that the
+ * clients send after leaving the barrier arive before the server enters 
+ * the barrier. The server then enters the barrier, and upon leaving,
+ * waits for a message from each client.
+ */
+
+#include "test.h"
+#include "mpi.h"
+
+#define WAIT_TIMES 500
+
+int
+main( int argc, char **argv)
+{
+    int rank, size, i, recv_flag, ret, passed;
+    MPI_Status Status;
+    char message[17];
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    if (rank == 0) {
+       Test_Init("barrier", rank);
+       /* Receive the startup messages from each of the 
+          other clients */
+       for (i = 0; i < size - 1; i++) {
+           MPI_Recv(message, 17, MPI_CHAR, MPI_ANY_SOURCE, 2000, 
+                    MPI_COMM_WORLD, &Status);
+       }
+
+       /* Now use Iprobe to make sure no more messages arive for a
+           while */
+       passed = 1;
+       for (i = 0; i < WAIT_TIMES; i++){
+           recv_flag = 0;
+           MPI_Iprobe(MPI_ANY_SOURCE, 2000, MPI_COMM_WORLD, 
+                      &recv_flag, &Status);
+           if (recv_flag)
+               passed = 0;
+       }
+
+       if (passed)
+           Test_Passed("Barrier Test 1");
+       else
+           Test_Failed("Barrier Test 1");
+
+       /* Now go into the barrier myself */
+       MPI_Barrier(MPI_COMM_WORLD);
+
+       /* And get everyones message who came out */
+       for (i = 0; i < size - 1; i++) {
+           MPI_Recv(message, 13, MPI_CHAR, MPI_ANY_SOURCE, 2000, 
+                    MPI_COMM_WORLD, &Status);
+       }
+
+       /* Now use Iprobe to make sure no more messages arive for a
+           while */
+       passed = 1;
+       for (i = 0; i < WAIT_TIMES; i++){
+           recv_flag = 0;
+           MPI_Iprobe(MPI_ANY_SOURCE, 2000, MPI_COMM_WORLD, 
+                      &recv_flag, &Status);
+           if (recv_flag)
+               passed = 0;
+       }
+       if (passed)
+           Test_Passed("Barrier Test 2");
+       else
+           Test_Failed("Barrier Test 2");
+
+       Test_Waitforall( );
+       ret = Summarize_Test_Results();
+       Test_Finalize();
+       MPI_Finalize();
+       return ret;
+    } else {
+       MPI_Send((char*)"Entering Barrier", 17, MPI_CHAR, 0, 2000, MPI_COMM_WORLD);
+       MPI_Barrier(MPI_COMM_WORLD);
+       MPI_Send((char*)"Past Barrier", 13, MPI_CHAR, 0, 2000, MPI_COMM_WORLD);
+       Test_Waitforall( );
+       MPI_Finalize();
+       return 0;
+    }
+}
diff --git a/teshsuite/smpi/mpich-test/coll/bcast.c b/teshsuite/smpi/mpich-test/coll/bcast.c
new file mode 100644 (file)
index 0000000..f8c983a
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * This program performs some simple tests of the MPI_Bcast broadcast
+ * functionality.
+ */
+
+#include "test.h"
+#include "mpi.h"
+#include <stdlib.h>
+
+int
+main( int argc, char **argv)
+{
+    int rank, size, ret, passed, i, *test_array;
+
+    /* Set up MPI */
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    /* Setup the tests */
+    Test_Init("bcast", rank);
+    test_array = (int *)malloc(size*sizeof(int));
+
+    /* Perform the test - this operation should really be done
+       with an allgather, but it makes a good test... */
+    passed = 1;
+    for (i=0; i < size; i++) {
+       if (i == rank)
+           test_array[i] = i;
+       MPI_Bcast(test_array, size, MPI_INT, i, MPI_COMM_WORLD);
+       if (test_array[i] != i)
+           passed = 0;
+    }
+    if (!passed)
+       Test_Failed("Simple Broadcast test");
+    else {
+       if (rank == 0)
+           Test_Passed("Simple Broadcast test");
+       }
+
+    /* Close down the tests */
+    free(test_array);
+    if (rank == 0)
+       ret = Summarize_Test_Results();
+    else
+       ret = 0;
+    Test_Finalize();
+
+    /* Close down MPI */
+    Test_Waitforall( );
+    MPI_Finalize();
+    return ret;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/bcast2.f b/teshsuite/smpi/mpich-test/coll/bcast2.f
new file mode 100644 (file)
index 0000000..25b6aa3
--- /dev/null
@@ -0,0 +1,36 @@
+      program test
+C
+C This program hangs when run with the version of MPICH (1.1.2) distributed
+C by Myricom using their ch_gm device.  I've added it to our collection
+C on general principle; note that it hasn't been put into a form usable
+C by our tests yet
+C
+      include 'mpif.h'
+      integer comm_size,comm_rank,status(mpi_status_size)
+      integer at_number,chunk
+      double precision T0,D
+      at_number=0
+      chunk=0
+      T0=3D3048.48883
+      D=3D3877.4888
+      call mpi_init(ierror)
+      call mpi_comm_size(mpi_comm_world,comm_size,ierror)
+      call mpi_comm_rank(mpi_comm_world,comm_rank,ierror)
+      CALL MPI_BCAST(at_number,1,mpi_integer,0,mpi_comm_world,ierr)
+      CALL MPI_BCAST(chunk,1,mpi_integer,0,mpi_comm_world,ierr)
+      CALL MPI_BCAST(T0,1,mpi_double_precision,0,mpi_comm_world,ierr)
+      CALL MPI_BCAST(D,1,mpi_double_precision,0,mpi_comm_world,ierr)
+
+      write(6,*) 'Rank=3D',comm_rank,' finished bcast'
+      do i=3D1,99999
+        T0=3Di*1.0d0
+        d=3Dt0**.987
+        do j=3D1,100
+           a=3Dj**.2
+        enddo
+      enddo
+      write(6,*) 'Rank=3D',comm_rank,' finished calculations'
+      call mpi_finalize(ierror)
+      end
+C 
+C Run with mpirun -np 16 test
diff --git a/teshsuite/smpi/mpich-test/coll/bcastbug.c b/teshsuite/smpi/mpich-test/coll/bcastbug.c
new file mode 100644 (file)
index 0000000..dc2d81a
--- /dev/null
@@ -0,0 +1,70 @@
+#include "mpi.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include "test.h"
+
+int main( int argc, char **argv )
+{
+  char *buf;
+  int rank, size, i;
+  MPI_Request req[10];
+  MPI_Status  stat[10];
+  MPI_Status  status;
+
+  buf = (char *)malloc(32*1024);
+  MPI_Init(&argc, &argv);
+  MPI_Comm_rank ( MPI_COMM_WORLD, &rank );
+  MPI_Comm_size ( MPI_COMM_WORLD, &size );
+
+  if (size > 10) return 1;
+  
+  if (rank == 0) {
+    for ( i = 1; i < size; i++ )
+      MPI_Isend(buf,1024,MPI_BYTE,i,0,MPI_COMM_WORLD,&req[i]);
+    MPI_Waitall(size-1, &req[1], &stat[1]); /* Core dumps here! */
+  }
+  else 
+    MPI_Recv(buf,1024,MPI_BYTE,0,0,MPI_COMM_WORLD,&status);
+
+    Test_Waitforall( );
+  MPI_Finalize();
+  return 0;
+}
+
+#if 0
+int MPIND_Waitall(count, array_of_requests, array_of_statuses )
+int         count;
+MPI_Request array_of_requests[];
+MPI_Status  array_of_statuses[];
+{
+  int i;
+  MPIR_BOOL completed;
+  
+  for (i = 0; i < count; i++) {
+    if (!array_of_requests[i]) continue;
+    MPID_complete_send(&array_of_requests[i]->shandle, 
+                       &(array_of_statuses[i]) );
+    
+    MPIND_Request_free( &array_of_requests[i] ); /* Core dumps here! */
+    array_of_requests[i]    = NULL;
+  }
+  return MPI_SUCCESS;
+}
+
+
+#define MPID_ND_free_send_handle( a )  if ((a)->buffer) {FREE((a)->buffer);}
+
+int MPIND_Request_free( request )
+MPI_Request *request;
+{
+  int errno = MPI_SUCCESS;
+  printf("Should be core dumping here (buffer = %d)...\n",
+         (&((*request)->shandle.dev_shandle))->buffer);
+  MPID_ND_free_send_handle(&((*request)->shandle.dev_shandle));
+  printf("and not reaching here!\n");
+  SBfree( MPIR_shandles, *request );
+
+  return MPI_SUCCESS;
+}
+#endif
diff --git a/teshsuite/smpi/mpich-test/coll/bcastbug2.c b/teshsuite/smpi/mpich-test/coll/bcastbug2.c
new file mode 100644 (file)
index 0000000..4870195
--- /dev/null
@@ -0,0 +1,29 @@
+#include "mpi.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include "test.h"
+
+int main( int argc, char **argv)
+{
+   char *buf;
+   int i, iam;
+   MPI_Init(&argc, &argv);
+   MPI_Barrier(MPI_COMM_WORLD);
+   buf = (char *)malloc(32*1024);
+   MPI_Comm_rank(MPI_COMM_WORLD, &iam);
+   for(i=1; i<=32; i++){
+      if (iam == 0){
+         *buf=i;
+         printf("Broadcasting %d bytes\n", i*64);
+         }
+      MPI_Bcast(buf, i*64, MPI_BYTE, 0, MPI_COMM_WORLD);
+      if (*buf != i) printf("Sanity check error on node %d\n", iam);
+/*      gsync();
+*/
+      MPI_Barrier(MPI_COMM_WORLD);
+      }
+   Test_Waitforall( );
+   MPI_Finalize();
+
+   return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/bcastlog.f b/teshsuite/smpi/mpich-test/coll/bcastlog.f
new file mode 100644 (file)
index 0000000..a36cc68
--- /dev/null
@@ -0,0 +1,39 @@
+      program main
+c     test bcast of logical
+c     works on suns, needs mpich fix and heterogeneous test on alpha with PC
+      include 'mpif.h'
+      integer myid, numprocs, rc, ierr
+      integer errs, toterrs
+      logical boo
+
+      call MPI_INIT( ierr )
+      call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
+      call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
+C
+      errs = 0
+      boo = .true.
+      call MPI_BCAST(boo,1,MPI_LOGICAL,0,MPI_COMM_WORLD,ierr)
+      if (boo .neqv. .true.) then 
+         print *, 'Did not broadcast Fortran logical (true)'
+         errs = errs + 1
+      endif
+C
+      boo = .false.
+      call MPI_BCAST(boo,1,MPI_LOGICAL,0,MPI_COMM_WORLD,ierr)
+      if (boo .neqv. .false.) then 
+         print *, 'Did not broadcast Fortran logical (false)'
+         errs = errs + 1
+      endif
+      call MPI_Reduce( errs, toterrs, 1, MPI_INTEGER, MPI_SUM, 
+     $                 0, MPI_COMM_WORLD, ierr )
+      if (myid .eq. 0) then
+         if (toterrs .eq. 0) then
+            print *, ' No Errors'
+         else
+            print *, ' Found ', toterrs, ' errors'
+         endif
+      endif
+      call MPI_FINALIZE(rc)
+C     stop
+C do not use stop with smpi, it causes errors, as does exit
+      end
diff --git a/teshsuite/smpi/mpich-test/coll/bcastvec.c b/teshsuite/smpi/mpich-test/coll/bcastvec.c
new file mode 100644 (file)
index 0000000..b587174
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * This program performs some simple tests of the MPI_Bcast broadcast
+ * functionality.
+ *
+ * It checks the handling of different datatypes by different participants
+ * (with matching type signatures, of course), as well as different
+ * roots and communicators.
+ */
+
+#include "test.h"
+#include "mpi.h"
+#include <stdlib.h>
+
+int main( int argc, char **argv )
+{
+    int rank, size, ret, passed, i, *test_array;
+    int stride, count, root;
+    MPI_Datatype newtype;
+    MPI_Comm     comm = MPI_COMM_WORLD;
+
+    /* Set up MPI */
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(comm, &rank);
+
+    /* Setup the tests */
+    Test_Init("bcastvec", rank);
+
+    /* Allow for additional communicators */
+    MPI_Comm_size(comm, &size);
+    /* MPI_Comm_rank(comm, &rank); */
+    stride = (rank + 1);
+    test_array = (int *)malloc(size*stride*sizeof(int));
+
+    /* Create the vector datatype EXCEPT for process 0 (vector of
+       stride 1 is contiguous) */
+    if (rank > 0) {
+       count = 1;
+        MPI_Type_vector( size, 1, stride, MPI_INT, &newtype);
+        MPI_Type_commit( &newtype );
+    }
+    else {
+       count = size;
+       newtype = MPI_INT;
+    }
+
+    /* Perform the test.  Each process in turn becomes the root.
+       After each operation, check that nothing has gone wrong */
+    passed = 1;
+    for (root = 0; root < size; root++) {
+       /* Fill the array with -1 for unset, rank + i * size for set */
+       for (i=0; i<size*stride; i++) test_array[i] = -1;
+       if (rank == root) 
+           for (i=0; i<size; i++) test_array[i*stride] = rank + i * size;
+       MPI_Bcast( test_array, count, newtype, root, comm );
+       for (i=0; i<size; i++) {
+           if (test_array[i*stride] != root + i * size) {
+               passed = 0;
+           }
+       }
+    }
+    free(test_array);
+    if (rank != 0) MPI_Type_free( &newtype );
+
+    if (!passed)
+       Test_Failed("Simple Broadcast test with datatypes");
+    else {
+       if (rank == 0)
+           Test_Passed("Simple Broadcast test with datatypes");
+       }
+
+    /* Close down the tests */
+    if (rank == 0)
+       ret = Summarize_Test_Results();
+    else {
+       ret = 0;
+    }
+    Test_Finalize();
+
+    /* Close down MPI */
+    Test_Waitforall( );
+    MPI_Finalize();
+    return ret;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/coll1.c b/teshsuite/smpi/mpich-test/coll/coll1.c
new file mode 100644 (file)
index 0000000..a15f6c2
--- /dev/null
@@ -0,0 +1,61 @@
+#include "mpi.h"
+#include "test.h"
+#include <stdlib.h>
+#include <stdio.h>
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i;
+    int             *table;
+    int              errors=0;
+    MPI_Aint         address;
+    MPI_Datatype     type, newtype;
+    int              lens;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* Make data table */
+    table = (int *) calloc (size, sizeof(int));
+    table[rank] = rank + 1;
+
+    MPI_Barrier ( MPI_COMM_WORLD );
+    /* Broadcast the data */
+    for ( i=0; i<size; i++ ) 
+      MPI_Bcast( &table[i], 1, MPI_INT, i, MPI_COMM_WORLD );
+
+    /* See if we have the correct answers */
+    for ( i=0; i<size; i++ )
+      if (table[i] != i+1) errors++;
+
+    MPI_Barrier ( MPI_COMM_WORLD );
+
+    /* Try the same thing, but with a derived datatype */
+    for ( i=0; i<size; i++ ) 
+       table[i] = 0;
+    table[rank] = rank + 1;
+    for ( i=0; i<size; i++ ) {
+       //MPI_Address( &table[i], &address );
+       address=0;
+  type = MPI_INT;
+       lens = 1;
+       MPI_Type_struct( 1, &lens, &address, &type, &newtype );
+       MPI_Type_commit( &newtype );
+       MPI_Bcast( &table[i], 1, newtype, i, MPI_COMM_WORLD );
+       MPI_Type_free( &newtype );
+       }
+    /* See if we have the correct answers */
+    for ( i=0; i<size; i++ )
+      if (table[i] != i+1) errors++;
+
+    MPI_Barrier ( MPI_COMM_WORLD );
+
+    Test_Waitforall( );
+    MPI_Finalize();
+    if (errors)
+      printf( "[%d] done with ERRORS!\n", rank );
+    return errors;
+}
+
+
diff --git a/teshsuite/smpi/mpich-test/coll/coll10.c b/teshsuite/smpi/mpich-test/coll/coll10.c
new file mode 100644 (file)
index 0000000..1935bce
--- /dev/null
@@ -0,0 +1,60 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+#define BAD_ANSWER 100000
+
+int assoc ( int *, int *, int *, MPI_Datatype * );
+
+/*
+    The operation is inoutvec[i] = invec[i] op inoutvec[i] 
+    (see 4.9.4).  The order is important.
+
+    Note that the computation is in process rank (in the communicator)
+    order, independant of the root.
+ */
+int assoc(invec, inoutvec, len, dtype)
+int *invec, *inoutvec, *len;
+MPI_Datatype *dtype;
+{
+  int i;
+  for ( i=0; i<*len; i++ )  {
+    if (inoutvec[i] <= invec[i] ) {
+      int rank;
+      MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+      fprintf( stderr, "[%d] inout[0] = %d, in[0] = %d\n", 
+              rank, inoutvec[0], invec[0] );
+      inoutvec[i] = BAD_ANSWER;
+      }
+    else 
+      inoutvec[i] = invec[i];
+  }
+  return (1);
+}
+
+int main( int argc, char **argv )
+{
+    int              rank, size;
+    int              data;
+    int              errors=0;
+    int              result = -100;
+    MPI_Op           op;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    data = rank;
+
+    MPI_Op_create( (MPI_User_function*)assoc, 0, &op );
+    MPI_Reduce ( &data, &result, 1, MPI_INT, op, size-1, MPI_COMM_WORLD );
+    MPI_Bcast  ( &result, 1, MPI_INT, size-1, MPI_COMM_WORLD );
+    MPI_Op_free( &op );
+    if (result == BAD_ANSWER) errors++;
+
+    if (errors)
+      printf( "[%d] done with ERRORS(%d)!\n", rank, errors );
+    Test_Waitforall( );
+    MPI_Finalize();
+
+    return errors;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/coll11.c b/teshsuite/smpi/mpich-test/coll/coll11.c
new file mode 100644 (file)
index 0000000..e3ce6c8
--- /dev/null
@@ -0,0 +1,110 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+void addem ( int *, int *, int *, MPI_Datatype * );
+void assoc ( int *, int *, int *, MPI_Datatype * );
+
+void addem(invec, inoutvec, len, dtype)
+int *invec, *inoutvec, *len;
+MPI_Datatype *dtype;
+{
+  int i;
+  for ( i=0; i<*len; i++ ) 
+    inoutvec[i] += invec[i];
+}
+
+#define BAD_ANSWER 100000
+
+/*
+    The operation is inoutvec[i] = invec[i] op inoutvec[i] 
+    (see 4.9.4).  The order is important.
+
+    Note that the computation is in process rank (in the communicator)
+    order, independant of the root.
+ */
+void assoc(invec, inoutvec, len, dtype)
+int *invec, *inoutvec, *len;
+MPI_Datatype *dtype;
+{
+  int i;
+  for ( i=0; i<*len; i++ )  {
+    if (inoutvec[i] <= invec[i] ) {
+      int rank;
+      MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+      fprintf( stderr, "[%d] inout[0] = %d, in[0] = %d\n", 
+             rank, inoutvec[0], invec[0] );
+      inoutvec[i] = BAD_ANSWER;
+      }
+    else 
+      inoutvec[i] = invec[i];
+  }
+}
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i;
+    int              data;
+    int              errors=0;
+    int              result = -100;
+    int              correct_result;
+    MPI_Op           op_assoc, op_addem;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    data = rank;
+
+    correct_result = 0;
+    for (i=0;i<=rank;i++)
+      correct_result += i;
+
+    MPI_Scan ( &data, &result, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (result != correct_result) {
+       fprintf( stderr, "[%d] Error suming ints with scan\n", rank );
+       errors++;
+       }
+
+    MPI_Scan ( &data, &result, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (result != correct_result) {
+       fprintf( stderr, "[%d] Error summing ints with scan (2)\n", rank );
+       errors++;
+       }
+
+    data = rank;
+    result = -100;
+    MPI_Op_create( (MPI_User_function *)assoc, 0, &op_assoc );
+    MPI_Op_create( (MPI_User_function *)addem, 1, &op_addem );
+    MPI_Scan ( &data, &result, 1, MPI_INT, op_addem, MPI_COMM_WORLD );
+    if (result != correct_result) {
+       fprintf( stderr, "[%d] Error summing ints with scan (userop)\n", 
+                rank );
+       errors++;
+       }
+
+    MPI_Scan ( &data, &result, 1, MPI_INT, op_addem, MPI_COMM_WORLD );
+    if (result != correct_result) {
+       fprintf( stderr, "[%d] Error summing ints with scan (userop2)\n", 
+                rank );
+       errors++;
+       }
+    /*result = -100;
+    data = rank;
+    MPI_Scan ( &data, &result, 1, MPI_INT, op_assoc, MPI_COMM_WORLD );
+    if (result == BAD_ANSWER) {
+       fprintf( stderr, "[%d] Error scanning with non-commutative op\n",
+                rank );
+       errors++;
+       }*/
+
+    MPI_Op_free( &op_assoc );
+    MPI_Op_free( &op_addem );
+
+    if (errors)
+      printf( "[%d] done with ERRORS(%d)!\n", rank, errors );
+
+    Test_Waitforall( );
+    MPI_Finalize();
+    return errors;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/coll12.c b/teshsuite/smpi/mpich-test/coll/coll12.c
new file mode 100644 (file)
index 0000000..b25b52c
--- /dev/null
@@ -0,0 +1,76 @@
+
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+
+#define TABLE_SIZE 2
+
+int main( int argc, char **argv )
+{
+  int    rank, size;
+  double a[TABLE_SIZE];
+  struct { double a; int b; } in[TABLE_SIZE], out[TABLE_SIZE];
+  int    i;
+  int    errors = 0, toterrors;
+
+  /* Initialize the environment and some variables */
+  MPI_Init( &argc, &argv );
+  MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+  MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+  /* Initialize the maxloc data */
+  for ( i=0; i<TABLE_SIZE; i++ ) a[i] = 0;
+  for ( i=rank; i<TABLE_SIZE; i++ ) a[i] = (double)rank + 1.0;
+
+  /* Copy data to the "in" buffer */
+  for (i=0; i<TABLE_SIZE; i++) { 
+       in[i].a = a[i];
+       in[i].b = rank;
+  }
+
+  /* Reduce it! */
+  MPI_Reduce( in, out, TABLE_SIZE, MPI_DOUBLE_INT, MPI_MAXLOC, 0, MPI_COMM_WORLD );
+  MPI_Bcast ( out, TABLE_SIZE, MPI_DOUBLE_INT, 0, MPI_COMM_WORLD );
+
+  /* Check to see that we got the right answers */
+  for (i=0; i<TABLE_SIZE; i++) 
+       if (i % size == rank)
+         if (out[i].b != rank) {
+        printf("MAX (ranks[%d] = %d != %d\n", i, out[i].b, rank );
+               errors++;
+      }
+
+  /* Initialize the minloc data */
+  for ( i=0; i<TABLE_SIZE; i++ ) a[i] = 0;
+  for ( i=rank; i<TABLE_SIZE; i++ ) a[i] = -(double)rank - 1.0;
+
+  /* Copy data to the "in" buffer */
+  for (i=0; i<TABLE_SIZE; i++)  {
+       in[i].a = a[i];
+       in[i].b = rank;
+  }
+
+  /* Reduce it! */
+  MPI_Allreduce( in, out, TABLE_SIZE, MPI_DOUBLE_INT, MPI_MINLOC, MPI_COMM_WORLD );
+
+  /* Check to see that we got the right answers */
+  for (i=0; i<TABLE_SIZE; i++) 
+       if (i % size == rank)
+         if (out[i].b != rank) {
+        printf("MIN (ranks[%d] = %d != %d\n", i, out[i].b, rank );
+               errors++;
+      }
+
+  /* Finish up! */
+  MPI_Allreduce( &errors, &toterrors, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+  if (toterrors) {
+      if (errors)
+         printf( "[%d] done with ERRORS(%d)!\n", rank, errors );
+  }
+  else {
+      if (rank == 0) printf( " No Errors\n" );
+  }
+      
+  MPI_Finalize();
+  return errors;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/coll13.c b/teshsuite/smpi/mpich-test/coll/coll13.c
new file mode 100644 (file)
index 0000000..f2518d3
--- /dev/null
@@ -0,0 +1,111 @@
+#include "mpi.h"
+#include "test.h"
+
+/* 
+From: hook@nas.nasa.gov (Edward C. Hook)
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <string.h>
+#include <errno.h>
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#define EXIT_FAILURE 1
+#endif
+
+int main( int argc, char *argv[] )
+{
+    int rank, size;
+    int i,j;
+    int *sb;
+    int *rb;
+    int status, gstatus, endstatus;
+    endstatus=0;
+    MPI_Init(&argc,&argv);
+    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
+    MPI_Comm_size(MPI_COMM_WORLD,&size);
+
+    for ( i=1 ; i < argc ; ++i ) {
+       if ( argv[i][0] != '-' )
+           continue;
+       switch(argv[i][1]) {
+       default:
+           fprintf(stderr,"Unrecognized argument %s\n",
+                   argv[i]);
+           MPI_Abort(MPI_COMM_WORLD,EXIT_FAILURE);
+       }
+    }
+     
+    
+    /*
+    SMPI addition: we want to test all three alltoall algorithms, thus we use
+    three different sizes.  This is the code that handles these cases:
+
+    if (sendsize < 200 && size > 12) {
+      retval =
+          smpi_coll_tuned_alltoall_bruck(sendbuf, sendcount, sendtype,
+                                         recvbuf, recvcount, recvtype,
+                                         comm);
+    } else if (sendsize < 3000) {
+      retval =
+          smpi_coll_tuned_alltoall_basic_linear(sendbuf, sendcount,
+                                                sendtype, recvbuf,
+                                                recvcount, recvtype, comm);
+    } else {
+      retval =
+          smpi_coll_tuned_alltoall_pairwise(sendbuf, sendcount, sendtype,
+                                            recvbuf, recvcount, recvtype,
+                                            comm);
+    }
+    */
+    
+    
+    int sizes [3] ={ 4096, 64, 32};
+    for ( j=0 ; j < 3 ; j++ ) {
+      sb = (int *)malloc(size*sizes[j]*sizeof(int));
+      if ( !sb ) {
+        perror( "can't allocate send buffer" );
+        MPI_Abort(MPI_COMM_WORLD,EXIT_FAILURE);
+      }
+      rb = (int *)malloc(size*sizes[j]*sizeof(int));
+      if ( !rb ) {
+        perror( "can't allocate recv buffer");
+        free(sb);
+        MPI_Abort(MPI_COMM_WORLD,EXIT_FAILURE);
+      }
+      for ( i=0 ; i < size*sizes[j] ; ++i ) {
+        sb[i] = rank + 1;
+        rb[i] = 0;
+      }
+
+      /* fputs("Before MPI_Alltoall\n",stdout); */
+      MPI_Barrier(MPI_COMM_WORLD );
+      /* This should really send MPI_CHAR, but since sb and rb were allocated
+       as chunk*size*sizeof(int), the buffers are large enough */
+      status = MPI_Alltoall(sb,sizes[j],MPI_INT,rb,sizes[j],MPI_INT,
+                            MPI_COMM_WORLD);
+
+      /* fputs("Before MPI_Allreduce\n",stdout); */
+      MPI_Allreduce( &status, &gstatus, 1, MPI_INT, MPI_SUM, 
+                    MPI_COMM_WORLD );
+
+      MPI_Barrier(MPI_COMM_WORLD );
+    /* fputs("After MPI_Allreduce\n",stdout); */
+      if (rank == 0 && gstatus != 0) endstatus ++;
+
+      free(sb);
+      free(rb);
+    }
+    
+    if (rank == 0) {
+      if (endstatus == 0) printf( " No Errors\n" );
+      else 
+        printf("all_to_all returned %d erros\n",endstatus);
+    }
+    MPI_Finalize();
+
+    return(EXIT_SUCCESS);
+}
+
diff --git a/teshsuite/smpi/mpich-test/coll/coll13.std b/teshsuite/smpi/mpich-test/coll/coll13.std
new file mode 100644 (file)
index 0000000..2d4993a
--- /dev/null
@@ -0,0 +1,2 @@
+You requested to use 14 processes, but there is only 5 processes in your hostfile...
+ No Errors
diff --git a/teshsuite/smpi/mpich-test/coll/coll2.c b/teshsuite/smpi/mpich-test/coll/coll2.c
new file mode 100644 (file)
index 0000000..d587171
--- /dev/null
@@ -0,0 +1,68 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+#define MAX_PROCESSES 10
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i,j;
+    int              table[MAX_PROCESSES][MAX_PROCESSES];
+    int              errors=0;
+    int              participants;
+    MPI_Comm         testcomm;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* A maximum of MAX_PROCESSES processes can participate */
+    if ( size > MAX_PROCESSES ) participants = MAX_PROCESSES;
+    else              participants = size;
+    /* Set the particpants so that it divides the MAX_PROCESSES */
+    while (MAX_PROCESSES % participants) participants--;
+    /* Create the communicator */
+    MPI_Comm_split( MPI_COMM_WORLD, rank < participants, rank, &testcomm );
+
+    if (MAX_PROCESSES % participants) {
+       fprintf( stderr, "Number of processors must divide %d\n",
+               MAX_PROCESSES );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+    if ( (rank < participants) ) {
+
+      /* Determine what rows are my responsibility */
+      int block_size = MAX_PROCESSES / participants;
+      int begin_row  = rank * block_size;
+      int end_row    = (rank+1) * block_size;
+      int send_count = block_size * MAX_PROCESSES;
+      int recv_count = send_count;
+
+      /* Paint my rows my color */
+      for (i=begin_row; i<end_row ;i++)
+       for (j=0; j<MAX_PROCESSES; j++)
+         table[i][j] = rank + 10;
+
+      /* Gather everybody's result together - sort of like an */
+      /* inefficient allgather */
+      for (i=0; i<participants; i++)
+       MPI_Gather(&table[begin_row][0], send_count, MPI_INT, 
+                  &table[0][0],         recv_count, MPI_INT, i, 
+                  testcomm );
+
+      /* Everybody should have the same table now,  */
+      /* This test does not in any way guarantee there are no errors */
+      /* Print out a table or devise a smart test to make sure it's correct */
+      for (i=0; i<MAX_PROCESSES;i++) {
+       if ( (table[i][0] - table[i][MAX_PROCESSES-1] !=0) ) 
+         errors++;
+      }
+    } 
+
+    MPI_Comm_free( &testcomm );
+    Test_Waitforall( );
+    MPI_Finalize();
+    if (errors)
+      printf( "[%d] done with ERRORS(%d)!\n", rank, errors );
+    return errors;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/coll3.c b/teshsuite/smpi/mpich-test/coll/coll3.c
new file mode 100644 (file)
index 0000000..31e0b74
--- /dev/null
@@ -0,0 +1,86 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+#define MAX_PROCESSES 10
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i,j;
+    int              table[MAX_PROCESSES][MAX_PROCESSES];
+    int              errors=0;
+    int              participants;
+    int              displs[MAX_PROCESSES];
+    int              recv_counts[MAX_PROCESSES];
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* A maximum of MAX_PROCESSES processes can participate */
+    if ( size > MAX_PROCESSES ) participants = MAX_PROCESSES;
+    else              participants = size;
+    /* while (MAX_PROCESSES % participants) participants--; */
+    if (MAX_PROCESSES % participants) {
+       fprintf( stderr, "Number of processors must divide %d\n",
+               MAX_PROCESSES );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+    if ( (rank < participants) ) {
+
+      /* Determine what rows are my responsibility */
+      int block_size = MAX_PROCESSES / participants;
+      int begin_row  = rank * block_size;
+      int end_row    = (rank+1) * block_size;
+      int send_count = block_size * MAX_PROCESSES;
+      
+      /* Fill in the displacements and recv_counts */
+      for (i=0; i<participants; i++) {
+       displs[i]      = i * block_size * MAX_PROCESSES;
+       recv_counts[i] = send_count;
+      }
+
+      /* Paint my rows my color */
+      for (i=begin_row; i<end_row ;i++)
+       for (j=0; j<MAX_PROCESSES; j++)
+         table[i][j] = rank + 10;
+      
+      /* Gather everybody's result together - sort of like an */
+      /* inefficient allgather */
+      for (i=0; i<participants; i++) {
+       MPI_Gatherv(&table[begin_row][0], send_count, MPI_INT, 
+                   &table[0][0], recv_counts, displs, MPI_INT, 
+                   i, MPI_COMM_WORLD);
+      }
+
+
+      /* Everybody should have the same table now.
+
+        The entries are:
+        Table[i][j] = (i/block_size) + 10;
+       */
+      for (i=0; i<MAX_PROCESSES;i++) 
+       if ( (table[i][0] - table[i][MAX_PROCESSES-1] !=0) ) 
+         errors++;
+      for (i=0; i<MAX_PROCESSES;i++) {
+         for (j=0; j<MAX_PROCESSES;j++) {
+             if (table[i][j] != (i/block_size) + 10) errors++;
+             }
+         }
+      if (errors) {
+         /* Print out table if there are any errors */
+         for (i=0; i<MAX_PROCESSES;i++) {
+             printf("\n");
+             for (j=0; j<MAX_PROCESSES; j++)
+                 printf("  %d",table[i][j]);
+             }
+         printf("\n");
+         }
+    } 
+
+    Test_Waitforall( );
+    MPI_Finalize();
+    if (errors)
+      printf( "[%d] done with ERRORS(%d)!\n", rank, errors );
+    return errors;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/coll4.c b/teshsuite/smpi/mpich-test/coll/coll4.c
new file mode 100644 (file)
index 0000000..e7a2290
--- /dev/null
@@ -0,0 +1,46 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+#define MAX_PROCESSES 10
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i,j;
+    int              table[MAX_PROCESSES][MAX_PROCESSES];
+    int              row[MAX_PROCESSES];
+    int              errors=0;
+    int              participants;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* A maximum of MAX_PROCESSES processes can participate */
+    if ( size > MAX_PROCESSES ) participants = MAX_PROCESSES;
+    else              participants = size;
+    if ( (rank < participants) ) {
+      int send_count = MAX_PROCESSES;
+      int recv_count = MAX_PROCESSES;
+
+      /* If I'm the root (process 0), then fill out the big table */
+      if (rank == 0) 
+       for ( i=0; i<participants; i++) 
+         for ( j=0; j<MAX_PROCESSES; j++ ) 
+           table[i][j] = i+j;
+      
+      /* Scatter the big table to everybody's little table */
+      MPI_Scatter(&table[0][0], send_count, MPI_INT, 
+                 &row[0]     , recv_count, MPI_INT, 0, MPI_COMM_WORLD);
+
+      /* Now see if our row looks right */
+      for (i=0; i<MAX_PROCESSES; i++) 
+       if ( row[i] != i+rank ) errors++;
+    } 
+
+    Test_Waitforall( );
+    MPI_Finalize();
+    if (errors)
+      printf( "[%d] done with ERRORS(%d)!\n", rank, errors );
+    return errors;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/coll5.c b/teshsuite/smpi/mpich-test/coll/coll5.c
new file mode 100644 (file)
index 0000000..971bca3
--- /dev/null
@@ -0,0 +1,51 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+#define MAX_PROCESSES 10
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i,j;
+    int              table[MAX_PROCESSES][MAX_PROCESSES];
+    int              row[MAX_PROCESSES];
+    int              errors=0;
+    int              participants;
+    int              displs[MAX_PROCESSES];
+    int              send_counts[MAX_PROCESSES];
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* A maximum of MAX_PROCESSES processes can participate */
+    if ( size > MAX_PROCESSES ) participants = MAX_PROCESSES;
+    else              participants = size;
+    if ( (rank < participants) ) {
+      int recv_count = MAX_PROCESSES;
+      
+      /* If I'm the root (process 0), then fill out the big table */
+      /* and setup  send_counts and displs arrays */
+      if (rank == 0) 
+       for ( i=0; i<participants; i++) {
+         send_counts[i] = recv_count;
+         displs[i] = i * MAX_PROCESSES;
+         for ( j=0; j<MAX_PROCESSES; j++ ) 
+           table[i][j] = i+j;
+       }
+      
+      /* Scatter the big table to everybody's little table */
+      MPI_Scatterv(&table[0][0], send_counts, displs, MPI_INT, 
+                  &row[0]     , recv_count, MPI_INT, 0, MPI_COMM_WORLD);
+
+      /* Now see if our row looks right */
+      for (i=0; i<MAX_PROCESSES; i++) 
+       if ( row[i] != i+rank ) errors++;
+    } 
+
+    Test_Waitforall( );
+    MPI_Finalize();
+    if (errors)
+      printf( "[%d] done with ERRORS(%d)!\n", rank, errors );
+    return errors;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/coll6.c b/teshsuite/smpi/mpich-test/coll/coll6.c
new file mode 100644 (file)
index 0000000..06e7363
--- /dev/null
@@ -0,0 +1,82 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+#define MAX_PROCESSES 10
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i,j;
+    int              table[MAX_PROCESSES][MAX_PROCESSES];
+    int              errors=0;
+    int              participants;
+    int              displs[MAX_PROCESSES];
+    int              recv_counts[MAX_PROCESSES];
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* A maximum of MAX_PROCESSES processes can participate */
+    if ( size > MAX_PROCESSES ) participants = MAX_PROCESSES;
+    else              participants = size;
+    /* while (MAX_PROCESSES % participants) participants--; */
+    if (MAX_PROCESSES % participants) {
+       fprintf( stderr, "Number of processors must divide %d\n",
+               MAX_PROCESSES );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+    if ( (rank < participants) ) {
+
+      /* Determine what rows are my responsibility */
+      int block_size = MAX_PROCESSES / participants;
+      int begin_row  = rank * block_size;
+      int end_row    = (rank+1) * block_size;
+      int send_count = block_size * MAX_PROCESSES;
+      
+      /* Fill in the displacements and recv_counts */
+      for (i=0; i<participants; i++) {
+       displs[i]      = i * block_size * MAX_PROCESSES;
+       recv_counts[i] = send_count;
+      }
+
+      /* Paint my rows my color */
+      for (i=begin_row; i<end_row ;i++)
+       for (j=0; j<MAX_PROCESSES; j++)
+         table[i][j] = rank + 10;
+      
+      /* Everybody gets the gathered data */
+      MPI_Allgatherv(&table[begin_row][0], send_count, MPI_INT, 
+                    &table[0][0], recv_counts, displs, 
+                    MPI_INT, MPI_COMM_WORLD);
+
+      /* Everybody should have the same table now.
+
+        The entries are:
+        Table[i][j] = (i/block_size) + 10;
+       */
+      for (i=0; i<MAX_PROCESSES;i++) 
+       if ( (table[i][0] - table[i][MAX_PROCESSES-1] !=0) ) 
+         errors++;
+      for (i=0; i<MAX_PROCESSES;i++) {
+         for (j=0; j<MAX_PROCESSES;j++) {
+             if (table[i][j] != (i/block_size) + 10) errors++;
+             }
+         }
+      if (errors) {
+         /* Print out table if there are any errors */
+         for (i=0; i<MAX_PROCESSES;i++) {
+             printf("\n");
+             for (j=0; j<MAX_PROCESSES; j++)
+                 printf("  %d",table[i][j]);
+             }
+         printf("\n");
+         }
+    } 
+
+    Test_Waitforall( );
+    MPI_Finalize();
+    if (errors)
+      printf( "[%d] done with ERRORS(%d)!\n", rank, errors );
+    return errors;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/coll7.c b/teshsuite/smpi/mpich-test/coll/coll7.c
new file mode 100644 (file)
index 0000000..0b17b7d
--- /dev/null
@@ -0,0 +1,59 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+#define MAX_PROCESSES 10
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i,j;
+    int              table[MAX_PROCESSES][MAX_PROCESSES];
+    int              errors=0;
+    int              participants;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* A maximum of MAX_PROCESSES processes can participate */
+    if ( size > MAX_PROCESSES ) participants = MAX_PROCESSES;
+    else              participants = size;
+    if (MAX_PROCESSES % participants) {
+       fprintf( stderr, "Number of processors must divide %d\n",
+               MAX_PROCESSES );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+    /* while (MAX_PROCESSES % participants) participants--; */
+    if ( (rank < participants) ) {
+
+      /* Determine what rows are my responsibility */
+      int block_size = MAX_PROCESSES / participants;
+      int begin_row  = rank * block_size;
+      int end_row    = (rank+1) * block_size;
+      int send_count = block_size * MAX_PROCESSES;
+      int recv_count = send_count;
+
+      /* Paint my rows my color */
+      for (i=begin_row; i<end_row ;i++)
+       for (j=0; j<MAX_PROCESSES; j++)
+         table[i][j] = rank + 10;
+
+      /* Everybody gets the gathered table */
+      MPI_Allgather(&table[begin_row][0], send_count, MPI_INT, 
+                  &table[0][0],          recv_count, MPI_INT, MPI_COMM_WORLD);
+
+      /* Everybody should have the same table now,  */
+      /* This test does not in any way guarantee there are no errors */
+      /* Print out a table or devise a smart test to make sure it's correct */
+      for (i=0; i<MAX_PROCESSES;i++) {
+       if ( (table[i][0] - table[i][MAX_PROCESSES-1] !=0) ) 
+         errors++;
+      }
+    } 
+
+    Test_Waitforall( );
+    MPI_Finalize();
+    if (errors)
+      printf( "[%d] done with ERRORS(%d)!\n", rank, errors );
+    return errors;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/coll8.c b/teshsuite/smpi/mpich-test/coll/coll8.c
new file mode 100644 (file)
index 0000000..6f81af3
--- /dev/null
@@ -0,0 +1,39 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i;
+    int              data;
+    int              errors=0;
+    int              result = -100;
+    int              correct_result;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    data = rank;
+
+    MPI_Reduce ( &data, &result, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD );
+    MPI_Bcast  ( &result, 1, MPI_INT, 0, MPI_COMM_WORLD );
+    correct_result = 0;
+    for(i=0;i<size;i++) 
+      correct_result += i;
+    if (result != correct_result) errors++;
+
+    MPI_Reduce ( &data, &result, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD );
+    MPI_Bcast  ( &result, 1, MPI_INT, 0, MPI_COMM_WORLD );
+    if (result != 0) errors++;
+
+    MPI_Reduce ( &data, &result, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD );
+    MPI_Bcast  ( &result, 1, MPI_INT, 0, MPI_COMM_WORLD );
+    if (result != (size-1)) errors++;
+
+    Test_Waitforall( );
+    MPI_Finalize();
+    if (errors)
+      printf( "[%d] done with ERRORS(%d)!\n", rank, errors );
+    return errors;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/coll9.c b/teshsuite/smpi/mpich-test/coll/coll9.c
new file mode 100644 (file)
index 0000000..4925254
--- /dev/null
@@ -0,0 +1,44 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+void addem ( int *, int *, int *, MPI_Datatype * );
+
+void addem(invec, inoutvec, len, dtype)
+int *invec, *inoutvec, *len;
+MPI_Datatype *dtype;
+{
+  int i;
+  for ( i=0; i<*len; i++ ) 
+    inoutvec[i] += invec[i];
+}
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i;
+    int              data;
+    int              errors=0;
+    int              result = -100;
+    int              correct_result;
+    MPI_Op           op;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    data = rank;
+    MPI_Op_create( (MPI_User_function *)addem, 1, &op );
+    MPI_Reduce ( &data, &result, 1, MPI_INT, op, 0, MPI_COMM_WORLD );
+    MPI_Bcast  ( &result, 1, MPI_INT, 0, MPI_COMM_WORLD );
+    MPI_Op_free( &op );
+    correct_result = 0;
+    for(i=0;i<size;i++) 
+      correct_result += i;
+    if (result != correct_result) errors++;
+
+    Test_Waitforall( );
+    MPI_Finalize();
+    if (errors)
+      printf( "[%d] done with ERRORS(%d)!\n", rank, errors );
+    return errors;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/grouptest.c b/teshsuite/smpi/mpich-test/coll/grouptest.c
new file mode 100644 (file)
index 0000000..f943795
--- /dev/null
@@ -0,0 +1,61 @@
+/*     $Id: grouptest.c,v 1.2 1998/11/28 04:04:56 gropp Exp $   */
+
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+int main( int argc, char **argv )
+{
+    int rank, size, i;
+    MPI_Group group1, group2, group3, groupall, groupunion, newgroup;
+    MPI_Comm newcomm;
+    int ranks1[100], ranks2[100], ranks3[100];
+    int nranks1=0, nranks2=0, nranks3=0;
+
+    MPI_Init( &argc, &argv );
+    MPI_Barrier( MPI_COMM_WORLD );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_group( MPI_COMM_WORLD, &groupall );
+
+    /* Divide groups */
+    for (i=0; i<size; i++) 
+      if ( (i%3)==0 )
+       ranks1[nranks1++] = i;
+      else if ( (i%3)==1 )
+       ranks2[nranks2++] = i;
+      else
+       ranks3[nranks3++] = i;
+
+    MPI_Group_incl ( groupall, nranks1, ranks1, &group1 );
+    MPI_Group_incl ( groupall, nranks2, ranks2, &group2 );
+    MPI_Group_incl ( groupall, nranks3, ranks3, &group3 );
+
+    MPI_Group_difference ( groupall, group2, &groupunion );
+
+    MPI_Comm_create ( MPI_COMM_WORLD, group3, &newcomm );
+    newgroup = MPI_GROUP_NULL;
+    if (newcomm != MPI_COMM_NULL)
+    {
+       /* If we don't belong to group3, this would fail */
+       MPI_Comm_group ( newcomm, &newgroup );
+    }
+
+    /* Free the groups */
+   /* MPI_Group_free( &groupall );
+    MPI_Group_free( &group1 );
+    MPI_Group_free( &group2 );
+    MPI_Group_free( &group3 );
+    MPI_Group_free( &groupunion );*/
+    if (newgroup != MPI_GROUP_NULL)
+    {
+       //MPI_Group_free( &newgroup );
+    }
+
+    /* Free the communicator */
+    if (newcomm != MPI_COMM_NULL)
+       //MPI_Comm_free( &newcomm );
+    Test_Waitforall( );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/longuser.c b/teshsuite/smpi/mpich-test/coll/longuser.c
new file mode 100644 (file)
index 0000000..9733836
--- /dev/null
@@ -0,0 +1,81 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "test.h"
+
+int add ( double *, double *, int *, MPI_Datatype * );
+/*
+ * User-defined operation on a long value (tests proper handling of
+ * possible pipelining in the implementation of reductions with user-defined
+ * operations).
+ */
+int add( invec, inoutvec, len, dtype )
+double       *invec, *inoutvec;
+int          *len;
+MPI_Datatype *dtype;
+{
+    int i, n = *len;
+    for (i=0; i<n; i++) {
+       inoutvec[i] = invec[i] + inoutvec[i];
+    }
+    return 0;
+}
+
+int main( int argc, char **argv )
+{
+    MPI_Op op;
+    int    i, rank, size, bufsize, errcnt = 0, toterr;
+    double *inbuf, *outbuf, value;
+    
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Op_create( (MPI_User_function *)add, 1, &op );
+    
+    bufsize = 1;
+    while (bufsize < 100000) {
+       inbuf  = (double *)malloc( bufsize * sizeof(double) );
+       outbuf = (double *)malloc( bufsize * sizeof(double) );
+       if (! inbuf || ! outbuf) {
+           fprintf( stderr, "Could not allocate buffers for size %d\n",
+                    bufsize );
+           errcnt++;
+           break;
+       }
+
+       value = (rank & 0x1) ? 1.0 : -1.0;
+       for (i=0; i<bufsize; i++) {
+           inbuf[i]  = value;
+           outbuf[i] = 100.0;
+       }
+       MPI_Allreduce( inbuf, outbuf, bufsize, MPI_DOUBLE, op, 
+                      MPI_COMM_WORLD );
+       /* Check values */
+       value = (size & 0x1) ? -1.0 : 0.0;
+       for (i=0; i<bufsize; i++) {
+           if (outbuf[i] != value) {
+               if (errcnt < 10) 
+                   printf( "outbuf[%d] = %f, should = %f\n", i, outbuf[i],
+                           value );
+               errcnt ++;
+           }
+       }
+       free( inbuf );
+       free( outbuf );
+       bufsize *= 2;
+    }
+    
+    MPI_Allreduce( &errcnt, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    if (rank == 0) {
+       if (toterr == 0) 
+           printf( " No Errors\n" );
+       else 
+           printf( "*! %d errors!\n", toterr );
+    }
+
+    MPI_Op_free( &op );
+    MPI_Finalize( );
+    return 0;
+}
+
diff --git a/teshsuite/smpi/mpich-test/coll/nbcoll.c b/teshsuite/smpi/mpich-test/coll/nbcoll.c
new file mode 100644 (file)
index 0000000..aad92b6
--- /dev/null
@@ -0,0 +1,75 @@
+#include "mpi.h"
+#include <stdio.h>
+
+int main( int argc, char *argv[] )
+{
+    int rank, size;
+    MPI_Comm local_comm;
+    MPI_Request r;
+    MPI_Status status;
+    double t0;
+
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    if (size < 3) {
+       fprintf( stderr, "Need at least 3 processors\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+    
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_split( MPI_COMM_WORLD, rank < 2, rank, &local_comm );
+
+    MPI_Barrier( MPI_COMM_WORLD );
+    if (rank == 0) {
+       /* First, ensure ssend works */
+       t0 = MPI_Wtime();
+       MPI_Ssend( MPI_BOTTOM, 0, MPI_INT, 1, 1, MPI_COMM_WORLD );
+       t0 = MPI_Wtime() - t0;
+       if (t0 < 1.0) {
+           fprintf( stderr, "Ssend does not wait for recv!\n" );
+           fflush( stderr );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+       MPI_Barrier( MPI_COMM_WORLD );
+       /* Start the ssend after process 1 is well into its barrier */
+       t0 = MPI_Wtime();
+       while (MPI_Wtime() - t0 < 1.0) ;
+       MPI_Ssend( MPI_BOTTOM, 0, MPI_INT, 1, 0, MPI_COMM_WORLD );
+       MPI_Barrier( local_comm );
+       /* Send process 2 an alls well */
+       MPI_Send( MPI_BOTTOM, 0, MPI_INT, 2, 0, MPI_COMM_WORLD );
+    }
+    else if (rank == 1) {
+       t0 = MPI_Wtime();
+       while (MPI_Wtime() - t0 < 2.0) ;
+       MPI_Recv( MPI_BOTTOM, 0, MPI_INT, 0, 1, MPI_COMM_WORLD, &status );
+       MPI_Barrier( MPI_COMM_WORLD );
+       MPI_Irecv( MPI_BOTTOM, 0, MPI_INT, 0, 0, MPI_COMM_WORLD, &r );
+       MPI_Barrier( local_comm );
+       MPI_Wait( &r, &status );
+    }
+    else if (rank == 2) {
+       int flag;
+
+       MPI_Barrier( MPI_COMM_WORLD );
+       MPI_Irecv( MPI_BOTTOM, 0, MPI_INT, 0, 0, MPI_COMM_WORLD, &r );
+       t0 = MPI_Wtime();
+       while (MPI_Wtime() - t0 < 3.0) ;
+       MPI_Test( &r, &flag, &status );
+       if (!flag) {
+           fprintf( stderr, "Test failed!\n" );
+           fflush( stderr );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+       else
+           fprintf( stderr, "Test succeeded\n" );
+    }
+    else {
+       MPI_Barrier( MPI_COMM_WORLD );
+    }
+
+    MPI_Comm_free( &local_comm );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/redscat.c b/teshsuite/smpi/mpich-test/coll/redscat.c
new file mode 100644 (file)
index 0000000..3cb057d
--- /dev/null
@@ -0,0 +1,53 @@
+/* 
+ * Test of reduce scatter.
+ *
+ * Each processor contributes its rank + the index to the reduction, 
+ * then receives the ith sum
+ *
+ * Can be called with any number of processors.
+ */
+
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "test.h"
+
+int main( int argc, char **argv )
+{
+    int      err = 0, toterr;
+    int      *sendbuf, *recvbuf, *recvcounts;
+    int      size, rank, i, sumval;
+    MPI_Comm comm;
+
+
+    MPI_Init( &argc, &argv );
+    comm = MPI_COMM_WORLD;
+
+    MPI_Comm_size( comm, &size );
+    MPI_Comm_rank( comm, &rank );
+    sendbuf = (int *) malloc( size * sizeof(int) );
+    for (i=0; i<size; i++) 
+       sendbuf[i] = rank + i;
+    recvcounts = (int *)malloc( size * sizeof(int) );
+        recvbuf = (int *)malloc( size * sizeof(int) );
+    for (i=0; i<size; i++) 
+       recvcounts[i] = 1;
+printf("rank : %d\n", rank);
+    MPI_Reduce_scatter( sendbuf, recvbuf, recvcounts, MPI_INT, MPI_SUM, comm );
+printf("rankt : %d\n", rank);
+    sumval = size * rank + ((size - 1) * size)/2;
+/* recvbuf should be size * (rank + i) */
+    if (recvbuf[0] != sumval) {
+       err++;
+       fprintf( stdout, "Did not get expected value for reduce scatter\n" );
+       fprintf( stdout, "[%d] Got %d expected %d\n", rank, recvbuf[0], sumval );
+    }
+
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (rank == 0 && toterr == 0) {
+       printf( " No Errors\n" );
+    }
+    MPI_Finalize( );
+
+    return toterr;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/redtst.c b/teshsuite/smpi/mpich-test/coll/redtst.c
new file mode 100644 (file)
index 0000000..b865e2a
--- /dev/null
@@ -0,0 +1,21 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+int main( int argc, char **argv )
+{
+  int rank, value, result;
+
+  MPI_Init (&argc, &argv);
+  MPI_Comm_rank (MPI_COMM_WORLD, &rank);
+
+  value = (rank == 0) ? 3 : 6;
+  MPI_Allreduce (&value, &result, 1, MPI_INT, MPI_BOR, MPI_COMM_WORLD);
+  if (rank == 0) printf ("Result of 3 BOR 6 is %d, result of 3|6 is %d\n", 
+                         result, 3|6);
+
+  Test_Waitforall( );
+  MPI_Finalize ();
+
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/runtests b/teshsuite/smpi/mpich-test/coll/runtests
new file mode 100755 (executable)
index 0000000..9cb6cf8
--- /dev/null
@@ -0,0 +1,188 @@
+#! /bin/sh
+# This version puts the output from each program into a separate file.
+# -mvhome is needed for the ANL SP, and is ignored by others
+args=
+device=
+MPICH_VERSION=
+STOPFILE=${MPITEST_STOPTEST:-"$HOME/.stopmpichtests"}
+
+MAKE="make --no-print-directory"
+MPIRUNMVBACK=''
+#
+
+# Set mpirun to the name/path of the mpirun program
+#FindMPIRUN
+#
+runtests=1
+makeeach=0
+writesummaryfile=no
+have_fortran=0
+quiet=0
+MAKE="make --no-print-directory"
+for arg in "$@" ; do
+    case $arg in
+    -basedir=* )
+       basedir=`echo $arg | sed 's/-basedir=//'`
+       ;; 
+    -srcdir=* )
+       srcdir=`echo $arg | sed 's/-srcdir=//'`
+       ;; 
+       -fort=* )
+       have_fortran=`echo $arg | sed 's/-fort=//'`
+       ;;
+       -checkonly )
+       runtests=0
+       ;;
+    -margs=*)
+       margs=`echo $arg | sed 's/-margs=//'`
+       args="$args $margs"
+       ;;
+       -small)
+       shift
+       makeeach=1
+       ;;
+       -summaryfile=*)
+       writesummaryfile=yes
+       summaryfile=`echo A$arg | sed 's/A-summaryfile=//'`
+       ;;
+       -quiet)
+       shift
+       quiet=1
+       ;;
+       -help|-u)
+       echo "runtests [-checkonly] [-margs='...']"
+       echo "run tests in this directory.  If -checkonly set, just run"
+       echo "the differences check (do NO rerun the test programs)."
+       echo "If -margs is used, these options are passed to mpirun."
+       echo "If -small is used, the examples are built, run, and deleted."
+       exit 1
+       ;;
+       *)
+       if test -n "$arg" ; then
+           echo "runtests: Unknown argument ($arg)"
+           exit 1
+        fi
+       ;;
+    esac
+done
+# Load basic procedures
+. ${srcdir}/../runbase
+#
+# If the programs are not available, run make.
+if [ ! -x coll1 -a $makeeach = 0 -a $runtests = 1 ] ; then
+    $MAKE
+fi
+
+mpirun=" ${basedir}/bin/smpirun -platform ${srcdir}/../../../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir}/../../hostfile  --log=root.thres:critical"
+testfiles=""
+if [ $runtests = 1 ] ; then
+echo '**** Testing MPI Collective routines ****'
+
+RunTest barrier 4 "*** Barrier Test ***" "" "barrier-0.out"
+
+RunTest bcast_mpich 4 "*** Broadcast Test ***" "" "bcast-0.out bcast-1.out bcast-2.out bcast-3.out"
+
+RunTest bcastvec 4 "*** Broadcast Datatype Test ***" "" "bcastvec-0.out bcastvec-1.out bcastvec-2.out bcastvec-3.out"
+
+
+#TODO : handle MPI_BOTTOM to allow som operations to use absolute addresses
+RunTest coll1 4
+
+RunTest coll2 5
+
+RunTest coll3 5
+
+RunTest coll4 4
+
+RunTest coll5 4
+
+RunTest coll6 5
+
+RunTest coll7 5
+
+RunTest coll8 4
+
+RunTest coll9 4
+
+#smpi does not handle non commutative operations, removed
+#RunTest coll10 4
+
+#smpi does not handle non commutative operations, removed
+RunTest coll11 4
+
+#weird manipulations of ranks in split, and comms -> deadlock, removed
+#RunTest scantst 4
+
+RunTest coll12 4
+
+# coll13 is very picky about arguments
+RunTest coll13 14
+
+RunTest longuser 4
+
+# Some implementations (e.g., IBM's) forget to handle the np = 1 case.
+#RunTest longuser 1 "*** longuser (np == 1) ***"
+MakeExe longuser
+cp longuser longuser1
+RunTest longuser1 1 '*** longuser (np == 1) ***'
+rm -f longuser1
+
+#OutTime
+#testfiles="$testfiles allredmany.out"
+#rm -f allredmany.out
+#MakeExe allredmany
+#echo '**** allredmany ****'
+#echo '*** allredmany ***' >> allredmany.out
+#cnt=0
+## Run several times to try and catch timing/race conditions in managing
+## the flood of one-way messages.
+#while [ $cnt -lt 20 ] ; do
+#    echo "*** allredmany run $cnt ***" >> allredmany.out
+#    $mpirun -np 2 $args allredmany >> allredmany.out 2>&1
+#    cnt=`expr $cnt + 1`
+#done
+#echo '*** allredmany ***' >> allredmany.out
+#CleanExe allredmany
+
+RunTest grouptest 4
+#uses MPI_Dims_create, MPI_Cart_create ... removed
+RunTest allred 4 "*** Allred ***"
+
+RunTest allred2 4 "*** Allred2 ***"
+#uses MPI_Dims_create, MPI_Cart_create ... removed
+#RunTest scatterv 4 "*** Scatterv ***"
+
+RunTest scattern 4 "*** Scattern ***"
+
+#fails, more debug needed to understand
+#RunTest redscat 4 "*** Reduce_scatter ***"
+
+RunTest alltoallv_mpich 4 "*** Alltoallv ***"
+echo "runtests: fortran ($have_fortran)"
+#
+# Run Fortran tests ONLY if Fortran available
+if [ $have_fortran -eq "1" ] ; then 
+    echo "FORTRAN TESTS"
+
+    RunTest allredf 4 "*** Testing allreduce from Fortran ***"
+
+    RunTest assocf 4 "*** Testing allreduce from Fortran (2) ***"
+
+    RunTest bcastlog 4 "*** Testing logical datatype in BCAST ***"
+    #buggy test, not available in original test, removed
+    #RunTest allgatherf 2 "*** Testing allgather from Fortran ***"
+    echo "END OF FORTRAN TESTS"
+fi
+
+else
+    # Just run checks
+    testfiles=`echo *.out`
+    if test "$testfiles" = "*.out" ; then
+       echo "No output files remain from previous test!"
+       exit 1
+    fi
+fi
+
+echo '*** Checking for differences from expected output ***'
+CheckAllOutput coll.diff
+exit 0
diff --git a/teshsuite/smpi/mpich-test/coll/scantst.c b/teshsuite/smpi/mpich-test/coll/scantst.c
new file mode 100644 (file)
index 0000000..63561be
--- /dev/null
@@ -0,0 +1,152 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+MPI_Comm GetNextComm( void );
+void addem ( int *, int *, int *, MPI_Datatype * );
+void assoc ( int *, int *, int *, MPI_Datatype * );
+
+void addem( int *invec, int *inoutvec, int *len, MPI_Datatype *dtype)
+{
+  int i;
+  for ( i=0; i<*len; i++ ) 
+    inoutvec[i] += invec[i];
+}
+
+#define BAD_ANSWER 100000
+
+/*
+    The operation is inoutvec[i] = invec[i] op inoutvec[i] 
+    (see 4.9.4).  The order is important.
+
+    Note that the computation is in process rank (in the communicator)
+    order, independant of the root.
+ */
+void assoc( int *invec, int *inoutvec, int *len, MPI_Datatype *dtype)
+{
+  int i;
+  for ( i=0; i<*len; i++ )  {
+    if (inoutvec[i] <= invec[i] ) {
+      int rank;
+      MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+      fprintf( stderr, "[%d] inout[0] = %d, in[0] = %d\n", 
+             rank, inoutvec[0], invec[0] );
+      inoutvec[i] = BAD_ANSWER;
+      }
+    else 
+      inoutvec[i] = invec[i];
+  }
+}
+
+MPI_Comm GetNextComm( void )
+{
+    MPI_Comm comm = MPI_COMM_NULL;
+    static int idx = 0;
+    int size, rank;
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+
+    switch (idx) {
+    case 0: 
+       MPI_Comm_dup( MPI_COMM_WORLD, &comm );
+       break;
+    case 1:
+       /* invert the rank order */
+       MPI_Comm_split( MPI_COMM_WORLD, 0, size - rank, &comm );
+       break;
+    case 2:
+       /* Divide into subsets */
+       MPI_Comm_split( MPI_COMM_WORLD, rank < (size/2), rank, &comm );
+       break;
+    case 3:
+       /* Another division */
+       MPI_Comm_split( MPI_COMM_WORLD, rank < (size/3), size-rank, &comm );
+       break;
+    case 4:
+       /* odd and even */
+       MPI_Comm_split( MPI_COMM_WORLD, (rank % 2) == 0, rank, &comm );
+       break;
+    case 5:
+       /* Last case: startover */
+       idx = -1;
+       break;
+    }
+    idx++;
+    return comm;
+}
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i;
+    int              data;
+    int              errors=0;
+    int              result = -100;
+    int              correct_result;
+    MPI_Op           op_assoc, op_addem;
+    MPI_Comm         comm;
+
+    MPI_Init( &argc, &argv );
+    MPI_Op_create( (MPI_User_function *)assoc, 0, &op_assoc );
+    MPI_Op_create( (MPI_User_function *)addem, 1, &op_addem );
+
+    /* Run this for a variety of communicator sizes */
+    while ((comm = GetNextComm()) != MPI_COMM_NULL) {
+       MPI_Comm_rank( comm, &rank );
+       MPI_Comm_size( comm, &size );
+
+       data = rank;
+       
+       correct_result = 0;
+       for (i=0;i<=rank;i++)
+           correct_result += i;
+
+       MPI_Scan ( &data, &result, 1, MPI_INT, MPI_SUM, comm );
+       if (result != correct_result) {
+           fprintf( stderr, "[%d] Error suming ints with scan\n", rank );
+           errors++;
+       }
+
+       MPI_Scan ( &data, &result, 1, MPI_INT, MPI_SUM, comm );
+       if (result != correct_result) {
+           fprintf( stderr, "[%d] Error summing ints with scan (2)\n", rank );
+           errors++;
+       }
+
+       data = rank;
+       result = -100;
+       MPI_Scan ( &data, &result, 1, MPI_INT, op_addem, comm );
+       if (result != correct_result) {
+           fprintf( stderr, "[%d] Error summing ints with scan (userop)\n", 
+                    rank );
+           errors++;
+       }
+
+       MPI_Scan ( &data, &result, 1, MPI_INT, op_addem, comm );
+       if (result != correct_result) {
+           fprintf( stderr, "[%d] Error summing ints with scan (userop2)\n", 
+                    rank );
+           errors++;
+       }
+/*     result = -100;*/
+/*     data = rank;*/
+/*     MPI_Scan ( &data, &result, 1, MPI_INT, op_assoc, comm );*/
+/*     if (result == BAD_ANSWER) {*/
+/*         fprintf( stderr, "[%d] Error scanning with non-commutative op\n",*/
+/*                  rank );*/
+/*         errors++;*/
+/*     }*/
+       MPI_Comm_free( &comm );
+    }
+
+    MPI_Op_free( &op_assoc );
+    MPI_Op_free( &op_addem );
+
+    if (errors) {
+       MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+       printf( "[%d] done with ERRORS(%d)!\n", rank, errors );
+    }
+
+    Test_Waitforall( );
+    MPI_Finalize();
+    return errors;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/scattern.c b/teshsuite/smpi/mpich-test/coll/scattern.c
new file mode 100644 (file)
index 0000000..082fe6a
--- /dev/null
@@ -0,0 +1,54 @@
+#include "mpi.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include "test.h" 
+
+/* This example sends a vector and receives individual elements */
+
+int main( int argc, char **argv )
+{
+    MPI_Datatype vec;
+    double *vecin, *vecout, ivalue;
+    int    root, i, n, stride, err = 0;
+    int    rank, size;
+
+    MPI_Init( &argc, &argv );
+    
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+
+    n = 12;
+    stride = 10;
+    vecin = (double *)malloc( n * stride * size * sizeof(double) );
+    vecout = (double *)malloc( n * sizeof(double) );
+    
+    MPI_Type_vector( n, 1, stride, MPI_DOUBLE, &vec );
+    MPI_Type_commit( &vec );
+
+    for (i=0; i<n*stride*size; i++) vecin[i] = (double)i;
+    for (root=0; root<size; root++) {
+       for (i=0; i<n; i++) vecout[i] = -1.0;
+       MPI_Scatter( vecin, 1, vec, vecout, n, MPI_DOUBLE, root, 
+                    MPI_COMM_WORLD );
+       ivalue = rank * ((n-1) * stride + 1);
+       for (i=0; i<n; i++) {
+           if (vecout[i] != ivalue) {
+               printf( "Expected %f but found %f\n", 
+                       ivalue, vecout[i] );
+               err++;
+           }
+           ivalue += stride;
+       }
+    }
+    i = err;
+    MPI_Allreduce( &i, &err, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (rank == 0) {
+       if (err > 0) printf( "Found %d errors!\n", err );
+       else         printf( " No Errors\n" );
+    }
+    MPI_Type_free( &vec );
+    MPI_Finalize();
+    return 0;
+       
+}
+
diff --git a/teshsuite/smpi/mpich-test/coll/scatterv.c b/teshsuite/smpi/mpich-test/coll/scatterv.c
new file mode 100644 (file)
index 0000000..aefcb2e
--- /dev/null
@@ -0,0 +1,167 @@
+#include "mpi.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include "test.h" 
+
+/* Prototypes for picky compilers */
+void SetData ( double *, double *, int, int, int, int, int, int );
+int CheckData ( double *, int, int, int, int, int );
+/* 
+   This is an example of using scatterv to send a matrix from one
+   process to all others, with the matrix stored in Fortran order.
+   Note the use of an explicit UB to enable the sources to overlap.
+
+   This tests scatterv to make sure that it uses the datatype size
+   and extent correctly.  It requires number of processors that
+   can be split with MPI_Dims_create.
+
+ */
+
+void SetData( sendbuf, recvbuf, nx, ny, myrow, mycol, nrow, ncol )
+double *sendbuf, *recvbuf;
+int    nx, ny, myrow, mycol, nrow, ncol;
+{
+int coldim, i, j, m, k;
+double *p;
+
+if (myrow == 0 && mycol == 0) {
+    coldim = nx * nrow;
+    for (j=0; j<ncol; j++) 
+       for (i=0; i<nrow; i++) {
+           p = sendbuf + i * nx + j * (ny * coldim);
+           for (m=0; m<ny; m++) {
+               for (k=0; k<nx; k++) {
+                   p[k] = 1000 * j + 100 * i + m * nx + k;
+                   }
+               p += coldim;
+               }
+           }
+    }
+for (i=0; i<nx*ny; i++) 
+    recvbuf[i] = -1.0;
+}
+
+int CheckData( recvbuf, nx, ny, myrow, mycol, nrow )
+double *recvbuf;
+int    nx, ny, myrow, mycol, nrow;
+{
+int coldim, m, k;
+double *p, val;
+int errs = 0;
+
+coldim = nx;
+p      = recvbuf;
+for (m=0; m<ny; m++) {
+    for (k=0; k<nx; k++) {
+       val = 1000 * mycol + 100 * myrow + m * nx + k;
+       if (p[k] != val) {
+           errs++;
+           if (errs < 10) {
+               printf( 
+                  "Error in (%d,%d) [%d,%d] location, got %f expected %f\n", 
+                       m, k, myrow, mycol, p[k], val );
+               }
+           else if (errs == 10) {
+               printf( "Too many errors; suppressing printing\n" );
+               }
+           }
+       }
+    p += coldim;
+    }
+return errs;
+}
+
+int main( int argc, char **argv )
+{
+    int rank, size, myrow, mycol, nx, ny, stride, cnt, i, j, errs, tot_errs;
+    double    *sendbuf, *recvbuf;
+    MPI_Datatype vec, block, types[2];
+    MPI_Aint displs[2];
+    int      *scdispls;
+    int      blens[2];
+    MPI_Comm comm2d;
+    int dims[2], periods[2], coords[2], lcoords[2];
+    int *sendcounts;
+       
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* Get a 2-d decomposition of the processes */
+    dims[0] = 0; dims[1] = 0;
+    MPI_Dims_create( size, 2, dims );
+    periods[0] = 0; periods[1] = 0;
+    MPI_Cart_create( MPI_COMM_WORLD, 2, dims, periods, 0, &comm2d );
+    MPI_Cart_get( comm2d, 2, dims, periods, coords );
+    myrow = coords[0];
+    mycol = coords[1];
+    if (rank == 0) 
+       printf( "Decomposition is [%d x %d]\n", dims[0], dims[1] );
+
+    /* Get the size of the matrix */
+    nx = 10;
+    ny = 8;
+    stride = nx * dims[0];
+
+    recvbuf = (double *)malloc( nx * ny * sizeof(double) );
+    if (!recvbuf) {
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+    sendbuf = 0;
+    if (myrow == 0 && mycol == 0) {
+       sendbuf = (double *)malloc( nx * ny * size * sizeof(double) );
+       if (!sendbuf) {
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+           }
+       }
+    sendcounts = (int *) malloc( size * sizeof(int) );
+    scdispls   = (int *)malloc( size * sizeof(int) );
+
+    MPI_Type_vector( ny, nx, stride, MPI_DOUBLE, &vec );
+    blens[0]  = 1;   blens[1] = 1;
+    types[0]  = vec; types[1] = MPI_UB;
+    displs[0] = 0;   displs[1] = nx * sizeof(double);
+    
+    MPI_Type_struct( 2, blens, displs, types, &block );
+    MPI_Type_free( &vec );
+    MPI_Type_commit( &block );
+
+    /* Set up the transfer */
+    cnt            = 0;
+    for (i=0; i<dims[1]; i++) {
+       for (j=0; j<dims[0]; j++) {
+           sendcounts[cnt] = 1;
+           /* Using Cart_coords makes sure that ranks (used by
+              sendrecv) matches the cartesian coordinates (used to
+              set data in the matrix) */
+           MPI_Cart_coords( comm2d, cnt, 2, lcoords );
+           scdispls[cnt++] = lcoords[0] + lcoords[1] * (dims[0] * ny);
+           }
+       }
+
+    SetData( sendbuf, recvbuf, nx, ny, myrow, mycol, dims[0], dims[1] );
+    MPI_Scatterv( sendbuf, sendcounts, scdispls, block, 
+                 recvbuf, nx * ny, MPI_DOUBLE, 0, comm2d );
+    if((errs = CheckData( recvbuf, nx, ny, myrow, mycol, dims[0] ))) {
+       fprintf( stdout, "Failed to transfer data\n" );
+       }
+    MPI_Allreduce( &errs, &tot_errs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (rank == 0) {
+       if (tot_errs == 0)
+           printf( "No errors\n" );
+       else
+           printf( "%d errors in use of MPI_SCATTERV\n", tot_errs );
+       }
+       
+    if (sendbuf) free( sendbuf );
+    free( recvbuf );
+    free( sendcounts );
+    free( scdispls );
+    MPI_Type_free( &block );
+    MPI_Comm_free( &comm2d );
+    MPI_Finalize();
+    return errs;
+}
+
+
diff --git a/teshsuite/smpi/mpich-test/coll/scatterv.std b/teshsuite/smpi/mpich-test/coll/scatterv.std
new file mode 100644 (file)
index 0000000..9abdbae
--- /dev/null
@@ -0,0 +1,4 @@
+*** Scatterv ***
+Decomposition is [2 x 2]
+No errors
+*** Scatterv ***
diff --git a/teshsuite/smpi/mpich-test/coll/shortint.c b/teshsuite/smpi/mpich-test/coll/shortint.c
new file mode 100644 (file)
index 0000000..02c7dce
--- /dev/null
@@ -0,0 +1,39 @@
+#include "mpi.h"
+#include <stdio.h>
+typedef struct { short a; int b } s1;
+
+main( int argc, char **argv )
+{
+s1 s[10], sout[10];
+int i, rank;
+MPI_Status status;
+
+MPI_Init( &argc, &argv );
+MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+for (i=0; i<10; i++) {
+    s[i].a = rank + i;
+    s[i].b = rank;
+    sout[i].a = -1;
+    sout[i].b = -1;
+    }
+/* MPI_Allreduce( s, sout, 10, MPI_SHORT_INT, MPI_MINLOC, MPI_COMM_WORLD ); */
+/* if (rank == 1) 
+    for (i=0; i<10; i++) 
+       sout[i] = s[i];
+ */
+MPI_Reduce( s, sout, 10, MPI_SHORT_INT, MPI_MINLOC, 1, MPI_COMM_WORLD );
+if (rank == 1)
+for (i=0; i<10; i++) {
+    printf( "[%d] (%x,%x)\n", rank, (int)sout[i].a, sout[i].b );
+    }
+if (rank == 1) 
+    MPI_Send( sout, 10, MPI_SHORT_INT, 0, 0, MPI_COMM_WORLD );
+else if (rank == 0)
+    MPI_Recv( sout, 10, MPI_SHORT_INT, 1, 0, MPI_COMM_WORLD, &status );
+/* MPI_Bcast( sout, 10, MPI_SHORT_INT, 1, MPI_COMM_WORLD ); */
+for (i=0; i<10; i++) {
+    printf( "[%d] (%x,%x)\n", rank, (int)sout[i].a, sout[i].b );
+    }
+MPI_Finalize();
+return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/coll/temprun b/teshsuite/smpi/mpich-test/coll/temprun
new file mode 100755 (executable)
index 0000000..4bcd93c
--- /dev/null
@@ -0,0 +1,269 @@
+#!/bin/sh
+# This version puts the output from each program into a separate file.
+# -mvhome is needed for the ANL SP, and is ignored by others
+args="-pg -mvhome"
+#
+runtests=1
+makeeach=0
+for arg in "$@" ; do
+    case $arg in 
+       -checkonly )
+       runtests=0
+       ;;
+        -margs=*)
+       margs=`echo $arg | sed 's/-margs=//'`
+       args="$args $margs"
+       ;;
+       -small)
+       makeeach=1
+       ;;
+       -help|-u)
+       echo "runtests [-checkonly] [-margs='...']"
+       echo "run tests in this directory.  If -checkonly set, just run"
+       echo "the differences check (do NO rerun the test programs)."
+       echo "If -margs is used, these options are passed to mpirun."
+       echo "If -small is used, the examples are built, run, and deleted."
+       exit 1
+       ;;
+       *)
+       if test -n "$arg" ; then
+           echo "runtests: Unknown argument ($arg)"
+           exit 1
+        fi
+       ;;
+    esac
+done
+
+MakeExe() {
+    if [ $makeeach = 1 -o ! -x $1 ] ; then
+       make $1
+    fi
+}
+CleanExe() {
+    if [ $makeeach = 1 ] ; then
+       /bin/rm -f $1 $1.o
+    fi
+}
+
+# If the programs are not available, run make.
+if [ ! -x coll1 -a $makeeach = 0 ] ; then
+    make 
+fi
+
+testfiles=""
+if [ $runtests = 1 ] ; then
+echo '**** Testing MPI Collective routines ****'
+
+testfiles="$testfiles barrier.out"
+/bin/rm -f barrier.out barrier-0.out
+MakeExe barrier
+echo '*** Barrier Test ***' >> barrier.out
+echo '**** Barrier Test ****'
+mpirun $args -np 4 -mvback "barrier-0.out" barrier $* >> barrier.out
+cat barrier-0.out >> barrier.out
+/bin/rm -f barrier-[01234].out
+echo '*** Barrier Test ***' >> barrier.out
+CleanExe barrier
+
+testfiles="$testfiles bcast.out"
+/bin/rm -f bcast.out bcast-[0-3].out
+MakeExe bcast
+echo '**** Broadcast Test ****'
+echo '*** Broadcast Test ***' >> bcast.out
+mpirun $args -np 4 \
+   -mvback "bcast-0.out bcast-1.out bcast-2.out bcast-3.out" \
+       bcast $* >> bcast.out
+cat bcast-[0123].out >> bcast.out
+/bin/rm -f bcast-[0123].out
+echo '*** Broadcast Test ***' >> bcast.out
+CleanExe bcast
+
+testfiles="$testfiles coll1.out"
+/bin/rm -f coll1.out
+MakeExe coll1
+echo '**** coll1 ****'
+echo '*** coll1 ***' >> coll1.out
+mpirun $args -np 4 coll1 $* >> coll1.out
+echo '*** coll1 ***' >> coll1.out
+CleanExe coll1
+
+testfiles="$testfiles coll2.out"
+/bin/rm -f coll2.out
+MakeExe coll2
+echo '**** coll2 ****'
+echo '*** coll2 ***' >> coll2.out
+# mpirun $args -np 5 coll2 $* >> coll2.out
+echo '*** coll2 ***' >> coll2.out
+CleanExe coll2
+
+testfiles="$testfiles coll3.out"
+/bin/rm -f coll3.out
+MakeExe coll3
+echo '**** coll3 ****'
+echo '*** coll3 ***' >> coll3.out
+mpirun $args -np 5 coll3 $* >> coll3.out
+echo '*** coll3 ***' >> coll3.out
+CleanExe coll3
+
+testfiles="$testfiles coll4.out"
+/bin/rm -f coll4.out
+MakeExe coll4
+echo '**** coll4 ****'
+echo '*** coll4 ***' >> coll4.out
+mpirun $args -np 4 coll4 $* >> coll4.out
+echo '*** coll4 ***' >> coll4.out
+CleanExe coll4
+
+testfiles="$testfiles coll5.out"
+/bin/rm -f coll5.out
+MakeExe coll5
+echo '**** coll5 ****'
+echo '*** coll5 ***' >> coll5.out
+mpirun $args -np 4 coll5 $* >> coll5.out
+echo '*** coll5 ***' >> coll5.out
+CleanExe coll5
+
+testfiles="$testfiles coll6.out"
+/bin/rm -f coll6.out
+MakeExe coll6
+echo '**** coll6 ****'
+echo '*** coll6 ***' >> coll6.out
+mpirun $args -np 5 coll6 $* >> coll6.out
+echo '*** coll6 ***' >> coll6.out
+CleanExe coll6
+
+testfiles="$testfiles coll7.out"
+/bin/rm -f coll7.out
+MakeExe coll7
+echo '**** coll7 ****'
+echo '*** coll7 ***' >> coll7.out
+mpirun $args -np 5 coll7 $* >> coll7.out
+echo '*** coll7 ***' >> coll7.out
+CleanExe coll7
+
+testfiles="$testfiles coll8.out"
+/bin/rm -f coll8.out
+MakeExe coll8
+echo '**** coll8 ****'
+echo '*** coll8 ***' >> coll8.out
+mpirun $args -np 4 coll8 $* >> coll8.out
+echo '*** coll8 ***' >> coll8.out
+CleanExe coll8
+
+testfiles="$testfiles coll9.out"
+/bin/rm -f coll9.out
+MakeExe coll9
+echo '**** coll9 ****'
+echo '*** coll9 ***' >> coll9.out
+mpirun $args -np 4 coll9 $* >>  coll9.out
+echo '*** coll9 ***' >> coll9.out
+CleanExe coll9
+
+testfiles="$testfiles coll10.out"
+/bin/rm -f coll10.out
+MakeExe coll10
+echo '**** coll10 ****'
+echo '*** coll10 ***' >> coll10.out
+mpirun -np 4 $args coll10 $* >> coll10.out
+echo '*** coll10 ***' >> coll10.out
+CleanExe coll10
+
+testfiles="$testfiles coll11.out"
+/bin/rm -f coll11.out
+MakeExe coll11
+echo '**** coll11 ****'
+echo '*** coll11 ***' >> coll11.out
+mpirun -np 4 $args coll11 $* >> coll11.out
+echo '*** coll11 ***' >> coll11.out
+CleanExe coll11
+
+testfiles="$testfiles coll12.out"
+/bin/rm -f coll12.out
+MakeExe coll12
+echo '**** coll12 ****'
+echo '*** coll12 ***' >> coll12.out
+mpirun -np 4 $args coll12 $* >> coll12.out
+echo '*** coll12 ***' >> coll12.out
+CleanExe coll12
+
+testfiles="$testfiles coll13.out"
+/bin/rm -f coll13.out
+MakeExe coll13
+echo '**** coll13 ****'
+echo '*** coll13 ***' >> coll13.out
+mpirun -np 4 $args coll13 $* >> coll13.out
+echo '*** coll13 ***' >> coll13.out
+CleanExe coll13
+
+testfiles="$testfiles grouptest.out"
+/bin/rm -f grouptest.out
+MakeExe grouptest
+echo '*** Grouptest ***'
+echo '*** grouptest ***' >> grouptest.out
+mpirun $args -np 4 grouptest  $* >> grouptest.out
+echo '*** grouptest ***' >> grouptest.out
+CleanExe grouptest
+
+testfiles="$testfiles allred.out"
+/bin/rm -f allred.out
+MakeExe allred
+echo '*** Allred ***'
+echo '*** Allred ***' >> allred.out
+mpirun $args -np 4 allred  $* >> allred.out
+echo '*** Allred ***' >> allred.out
+CleanExe allred
+
+testfiles="$testfiles scatterv.out"
+/bin/rm -f scatterv.out
+MakeExe scatterv
+echo '*** Scatterv ***'
+echo '*** Scatterv ***' >> scatterv.out
+mpirun $args -np 4 scatterv  $* >> scatterv.out
+echo '*** Scatterv ***' >> scatterv.out
+CleanExe scatterv
+
+#
+# Run Fortran tests ONLY if Fortran available
+if [ 1 = 1 ] ; then 
+    echo "FORTRAN TESTS"
+    #
+    testfiles="$testfiles allredf.out"
+    /bin/rm -f allredf.out
+    MakeExe allredf
+    echo '*** Testing allreduce from Fortran ***'
+    echo '*** Testing allreduce from Fortran ***' >> allredf.out
+    mpirun $args -np 4 allredf "$@" >> allredf.out
+    echo '*** Testing allreduce from Fortran ***' >> allredf.out
+    CleanExe allredf
+    #
+    echo "END OF FORTRAN TESTS"
+fi
+
+else
+    # Just run checks
+    testfiles=`echo *.out`
+    if test "$testfiles" = "*.out" ; then
+       echo "No output files remain from previous test!"
+       exit 1
+    fi
+fi
+
+echo '*** Differences from expected output ***'
+/bin/rm -f coll.diff
+for file in $testfiles ; do
+    stdfile=`basename $file .out`.std
+    if [ -s $stdfile ] ; then
+        if diff -b $file `basename $file .out`.std > /dev/null ; then
+           true
+       else
+           echo "Differences in `basename $file .out`" >> coll.diff
+           diff -b $file `basename $file .out`.std >> coll.diff
+       fi
+    else
+        echo "Can not find file $stdfile to compare against for test `basename $file .out`"
+    fi
+done
+if [ -s coll.diff ] ; then
+   cat coll.diff
+fi
+exit 0
diff --git a/teshsuite/smpi/mpich-test/coll/test.c b/teshsuite/smpi/mpich-test/coll/test.c
new file mode 100644 (file)
index 0000000..5a8d6f2
--- /dev/null
@@ -0,0 +1,97 @@
+/* Procedures for recording and printing test results */
+
+#include <stdio.h>
+#include <string.h>
+#include "test.h"
+#include "mpi.h"
+
+static int tests_passed = 0;
+static int tests_failed = 0;
+static char failed_tests[255][81];
+static char suite_name[255];
+FILE *fileout = NULL;
+
+void Test_Init( const char *suite, int rank)
+{
+    char filename[512];
+
+    sprintf(filename, "%s-%d.out", suite, rank);
+    strncpy(suite_name, suite, 255);
+    fileout = fopen(filename, "w");
+    if (!fileout) {
+       fprintf( stderr, "Could not open %s on node %d\n", filename, rank );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+}
+
+void Test_Message( const char *mess)
+{
+    fprintf(fileout, "[%s]: %s\n", suite_name, mess);
+    if(fileout)fflush(fileout);
+}
+
+void Test_Failed(const char *test)
+{
+    fprintf(fileout, "[%s]: *** Test '%s' Failed! ***\n", suite_name, test);
+    strncpy(failed_tests[tests_failed], test, 81);
+    if(fileout)fflush(fileout);
+    tests_failed++;
+}
+
+void Test_Passed(const char *test)
+{
+#ifdef VERBOSE
+    fprintf(fileout, "[%s]: Test '%s' Passed.\n", suite_name, test);
+    if(fileout)fflush(fileout);
+#endif
+    tests_passed++;
+}
+
+int Summarize_Test_Results(void)
+{
+#ifdef VERBOSE
+    fprintf(fileout, "For test suite '%s':\n", suite_name);
+#else
+    if (tests_failed > 0)
+#endif
+    {
+       fprintf(fileout, "Of %d attempted tests, %d passed, %d failed.\n", 
+               tests_passed + tests_failed, tests_passed, tests_failed);
+    }
+    if (tests_failed > 0) {
+       int i;
+
+       fprintf(fileout, "*** Tests Failed:\n");
+       for (i = 0; i < tests_failed; i++)
+           fprintf(fileout, "*** %s\n", failed_tests[i]);
+    }
+    return tests_failed;
+}
+
+void Test_Finalize(void)
+{
+    if(fileout)fflush(fileout);
+    //fclose(fileout);
+}
+
+#include "mpi.h"
+/* Wait for every process to pass through this point.  This test is used
+   to make sure that all processes complete, and that a test "passes" because
+   it executed, not because some process failed.  
+ */
+void Test_Waitforall(void)
+{
+    int m, one, myrank, n;
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
+    MPI_Comm_size( MPI_COMM_WORLD, &n );
+    one = 1;
+    MPI_Allreduce( &one, &m, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+
+    if (m != n) {
+       printf( "[%d] Expected %d processes to wait at end, got %d\n", myrank, 
+           n, m );
+    }
+    if (myrank == 0) 
+       printf( " No Errors\n" );
+}
diff --git a/teshsuite/smpi/mpich-test/coll/test.h b/teshsuite/smpi/mpich-test/coll/test.h
new file mode 100644 (file)
index 0000000..7360323
--- /dev/null
@@ -0,0 +1,18 @@
+/* Header for testing procedures */
+
+#ifndef _INCLUDED_TEST_H_
+#define _INCLUDED_TEST_H_
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+void Test_Init (const char *, int);
+void Test_Message (const char *);
+void Test_Failed (const char *);
+void Test_Passed (const char *);
+int Summarize_Test_Results (void);
+void Test_Finalize (void);
+void Test_Waitforall (void);
+
+#endif
diff --git a/teshsuite/smpi/mpich-test/context/CMakeLists.txt b/teshsuite/smpi/mpich-test/context/CMakeLists.txt
new file mode 100644 (file)
index 0000000..6097802
--- /dev/null
@@ -0,0 +1,92 @@
+cmake_minimum_required(VERSION 2.6)
+
+if(enable_smpi)
+  set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc")
+  set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff")
+  set(CMAKE_Fortran_LINKER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc")
+  set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
+  set(MPICH_FLAGS "-DHAVE_STDLIB_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DUSE_STDARG=1 -DHAVE_LONG_DOUBLE=1 -DHAVE_PROTOTYPES=1 -DHAVE_SIGNAL_H=1 -DHAVE_SIGACTION=1 -DHAVE_SLEEP=1 -DHAVE_SYSCONF=1")
+
+  include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
+  
+  add_executable(attrerr attrerr.c test.c)
+ # add_executable(attrt attrt.c test.c)
+ # add_executable(commnames commnames.c)
+  add_executable(groupcreate groupcreate.c)
+  add_executable(grouptest_mpich grouptest.c)
+  add_executable(icdup icdup.c)
+  add_executable(ictest ictest.c )
+  add_executable(ictest2 ictest2.c)
+  add_executable(ictest3 ictest3.c)
+  
+  if(SMPI_F2C)
+  #add_executable(attrtest_f attrtest.f)
+  #add_executable(commnames_f commnamesf.f)
+  endif()
+
+  target_link_libraries(attrerr m simgrid smpi )
+ # target_link_libraries(attrt m simgrid smpi )
+ # target_link_libraries(commnames m simgrid smpi )
+  target_link_libraries(groupcreate m simgrid smpi )
+  target_link_libraries(grouptest_mpich m simgrid smpi )
+  target_link_libraries(icdup m simgrid smpi )
+  target_link_libraries(ictest m simgrid smpi )
+  target_link_libraries(ictest2 m simgrid smpi )
+  target_link_libraries(ictest3 m simgrid smpi )
+
+  if(SMPI_F2C)
+  #target_link_libraries(attrtest_f m simgrid smpi f2c)
+  #target_link_libraries(commnames_f m simgrid smpi f2c)
+  endif()
+  
+  set_target_properties(attrerr PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+ # set_target_properties(attrt PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+ # set_target_properties(commnames PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(groupcreate PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(grouptest_mpich PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(icdup PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(ictest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(ictest2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(ictest3 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+   if(SMPI_F2C)
+  #set_target_properties(commnames_f PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}" )
+  #set_target_properties(attrtest_f PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}"  )
+  endif()
+
+endif()
+
+set(tesh_files
+  ${tesh_files}
+  PARENT_SCOPE
+  )
+set(xml_files
+  ${xml_files}
+  PARENT_SCOPE
+  )
+set(examples_src
+  ${examples_src}
+  ${CMAKE_CURRENT_SOURCE_DIR}/test.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/attrerr.c
+ # ${CMAKE_CURRENT_SOURCE_DIR}/attrt.c
+ # ${CMAKE_CURRENT_SOURCE_DIR}/commnames.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/groupcreate.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/grouptest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/icdup.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/ictest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/ictest2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/ictest3.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/attrtest.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/commnamesf.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/test.h
+  PARENT_SCOPE
+  )
+set(bin_files
+  ${bin_files}
+  PARENT_SCOPE
+  )
+set(txt_files
+  ${txt_files}
+  PARENT_SCOPE
+  )
diff --git a/teshsuite/smpi/mpich-test/context/attrerr.c b/teshsuite/smpi/mpich-test/context/attrerr.c
new file mode 100644 (file)
index 0000000..a73d0f0
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+
+  Exercise attribute routines.
+  This version checks for correct behavior of the copy and delete functions
+  on an attribute, particularly the correct behavior when the routine returns
+  failure.
+
+ */
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+
+int test_communicators ( void );
+void abort_msg ( const char *, int );
+int copybomb_fn ( MPI_Comm, int, void *, void *, void *, int * );
+int deletebomb_fn ( MPI_Comm, int, void *, void * );
+
+int main( int argc, char **argv )
+{
+    MPI_Init( &argc, &argv );
+    test_communicators();
+    Test_Waitforall( );
+    MPI_Finalize();
+    return 0;
+}
+
+/* 
+ * MPI 1.2 Clarification: Clarification of Error Behavior of 
+ *                        Attribute Callback Functions 
+ * Any return value other than MPI_SUCCESS is erroneous.  The specific value
+ * returned to the user is undefined (other than it can't be MPI_SUCCESS).
+ * Proposals to specify particular values (e.g., user's value) failed.
+ */
+/* Return an error as the value */
+int copybomb_fn( MPI_Comm oldcomm, int keyval, void *extra_state,
+                void *attribute_val_in, void *attribute_val_out, int *flag)
+{
+/* Note that if (sizeof(int) < sizeof(void *), just setting the int
+   part of attribute_val_out may leave some dirty bits
+ */
+    *flag = 1;
+    return MPI_ERR_OTHER;
+}
+
+/* Set delete flag to 1 to allow the attribute to be deleted */
+static int delete_flag = 0;
+int deletebomb_fn( MPI_Comm comm, int keyval, void *attribute_val, 
+                  void *extra_state)
+{
+    if (delete_flag) return MPI_SUCCESS;
+    return MPI_ERR_OTHER;
+}
+
+void abort_msg( const char *str, int code )
+{
+    fprintf( stderr, "%s, err = %d\n", str, code );
+    MPI_Abort( MPI_COMM_WORLD, code );
+}
+
+int test_communicators( void )
+{
+    MPI_Comm dup_comm_world, d2;
+    ptrdiff_t world_rank;
+    int world_size, key_1;
+    int err;
+    MPI_Aint value;
+    int rank;
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    world_rank=rank;
+    MPI_Comm_size( MPI_COMM_WORLD, &world_size );
+    if (world_rank == 0) {
+       printf( "*** Attribute copy/delete return codes ***\n" );
+    }
+
+    MPI_Comm_dup( MPI_COMM_WORLD, &dup_comm_world );
+    MPI_Barrier( dup_comm_world );
+
+    MPI_Errhandler_set( dup_comm_world, MPI_ERRORS_RETURN );
+
+    value = - 11;
+    if ((err=MPI_Keyval_create( copybomb_fn, deletebomb_fn, &key_1, &value )))
+       abort_msg( "Keyval_create", err );
+
+    err = MPI_Attr_put( dup_comm_world, key_1, (void *)world_rank );
+    if (err) {
+       printf( "Error with first put\n" );
+    }
+
+    err = MPI_Attr_put( dup_comm_world, key_1, (void *)(2*world_rank) );
+    if (err == MPI_SUCCESS) {
+       printf( "delete function return code was MPI_SUCCESS in put\n" );
+    }
+
+    /* Because the attribute delete function should fail, the attribute
+       should *not be removed* */
+    err = MPI_Attr_delete( dup_comm_world, key_1 );
+    if (err == MPI_SUCCESS) {
+       printf( "delete function return code was MPI_SUCCESS in delete\n" );
+    }
+    
+    err = MPI_Comm_dup( dup_comm_world, &d2 );
+    if (err == MPI_SUCCESS) {
+       printf( "copy function return code was MPI_SUCCESS in dup\n" );
+    }
+    if (err && d2 != MPI_COMM_NULL) {
+       printf( "dup did not return MPI_COMM_NULL on error\n" );
+    }
+
+    delete_flag = 1;
+    MPI_Comm_free( &dup_comm_world );
+
+    return 0;
+}
+
diff --git a/teshsuite/smpi/mpich-test/context/attrerr.std b/teshsuite/smpi/mpich-test/context/attrerr.std
new file mode 100644 (file)
index 0000000..9db5ec9
--- /dev/null
@@ -0,0 +1,4 @@
+*** Testing attributes (2) ***
+*** Attribute copy/delete return codes ***
+All processes completed test
+*** Testing attributes (2) ***
diff --git a/teshsuite/smpi/mpich-test/context/attrt.c b/teshsuite/smpi/mpich-test/context/attrt.c
new file mode 100644 (file)
index 0000000..858db14
--- /dev/null
@@ -0,0 +1,260 @@
+/*
+
+  Exercise communicator routines.
+
+  This C version derived from a Fortran test program from ....
+
+ */
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+
+int test_communicators ( void );
+int copy_fn ( MPI_Comm, int, void *, void *, void *, int * );
+int delete_fn ( MPI_Comm, int, void *, void * );
+
+int main( int argc, char **argv )
+{
+    MPI_Init( &argc, &argv );
+    test_communicators();
+    Test_Waitforall( );
+    MPI_Finalize();
+    return 0;
+}
+
+int copy_fn( MPI_Comm oldcomm, int keyval, void *extra_state,
+            void *attribute_val_in, void *attribute_val_out, 
+            int *flag)
+{
+/* Note that if (sizeof(int) < sizeof(void *), just setting the int
+   part of attribute_val_out may leave some dirty bits
+ */
+*(MPI_Aint *)attribute_val_out = (MPI_Aint)attribute_val_in;
+*flag = 1;
+return MPI_SUCCESS;
+}
+
+int delete_fn( MPI_Comm comm, int keyval, void *attribute_val, 
+              void *extra_state)
+{
+int world_rank;
+MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+if ((MPI_Aint)attribute_val != (MPI_Aint)world_rank) {
+    printf( "incorrect attribute value %d\n", *(int*)attribute_val );
+    MPI_Abort(MPI_COMM_WORLD, 1005 );
+    }
+return MPI_SUCCESS;
+}
+
+int test_communicators( void )
+{
+MPI_Comm dup_comm_world, lo_comm, rev_comm, dup_comm, split_comm, world_comm;
+MPI_Group world_group, lo_group, rev_group;
+void *vvalue;
+int ranges[1][3];
+int flag, world_rank, world_size, rank, size, n, key_1, key_3;
+int color, key, result;
+/*      integer n, ,
+     .        key_2
+
+  */
+MPI_Aint value;
+
+MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+MPI_Comm_size( MPI_COMM_WORLD, &world_size );
+if (world_rank == 0) {
+    printf( "*** Communicators ***\n" );
+    }
+
+MPI_Comm_dup( MPI_COMM_WORLD, &dup_comm_world );
+
+/*
+     Exercise Comm_create by creating an equivalent to dup_comm_world
+     (sans attributes) and a half-world communicator.
+ */
+
+if (world_rank == 0) 
+    printf( "    Comm_create\n" );
+
+MPI_Comm_group( dup_comm_world, &world_group );
+MPI_Comm_create( dup_comm_world, world_group, &world_comm );
+MPI_Comm_rank( world_comm, &rank );
+if (rank != world_rank) {
+    printf( "incorrect rank in world comm: %d\n", rank );
+    MPI_Abort(MPI_COMM_WORLD, 3001 );
+    }
+
+n = world_size / 2;
+
+ranges[0][0] = 0;
+ranges[0][1] = (world_size - n) - 1;
+ranges[0][2] = 1;
+
+MPI_Group_range_incl(world_group, 1, ranges, &lo_group );
+MPI_Comm_create(world_comm, lo_group, &lo_comm );
+MPI_Group_free( &lo_group );
+
+if (world_rank < (world_size - n)) {
+    MPI_Comm_rank(lo_comm, &rank );
+    if (rank == MPI_UNDEFINED) {
+       printf( "incorrect lo group rank: %d\n", rank );
+       MPI_Abort(MPI_COMM_WORLD, 3002 );
+       }
+    else {
+       MPI_Barrier(lo_comm );
+       }
+    }
+else {
+    if (lo_comm != MPI_COMM_NULL) {
+       printf( "incorrect lo comm:\n" );
+       MPI_Abort(MPI_COMM_WORLD, 3003 );
+       }
+    }
+      
+MPI_Barrier(world_comm);
+/*
+     Check Comm_dup by adding attributes to lo_comm & duplicating
+ */
+if (world_rank == 0) 
+    printf( "    Comm_dup\n" );
+
+if (lo_comm != MPI_COMM_NULL) {
+    value = 9;
+    MPI_Keyval_create(copy_fn,     delete_fn,   &key_1, &value );
+    value = 8;
+/*     MPI_Keyval_create(MPI_DUP_FN,  MPI_NULL_DELETE_FN,
+                              &key_2, &value );  */
+    value = 7;
+    MPI_Keyval_create(MPI_NULL_COPY_FN, MPI_NULL_DELETE_FN,
+                               &key_3, &value ); 
+
+    /* This may generate a compilation warning; it is, however, an
+       easy way to cache a value instead of a pointer */
+    MPI_Attr_put(lo_comm, key_1, (void *)world_rank );
+/*         MPI_Attr_put(lo_comm, key_2, world_size ) */
+    MPI_Attr_put(lo_comm, key_3, (void *)0 );
+
+    MPI_Comm_dup(lo_comm, &dup_comm );
+
+    /* Note that if sizeof(int) < sizeof(void *), we can't use
+       (void **)&value to get the value we passed into Attr_put.  To avoid 
+       problems (e.g., alignment errors), we recover the value into 
+       a (void *) and cast to int. Note that this may generate warning
+       messages from the compiler.  */
+    MPI_Attr_get(dup_comm, key_1, (void **)&vvalue, &flag );
+    value = (MPI_Aint)vvalue;
+
+    if (! flag) {
+       printf( "dup_comm key_1 not found on %d\n", world_rank );
+       MPI_Abort(MPI_COMM_WORLD, 3004 );
+       }
+
+    if (value != world_rank) {
+       printf( "dup_comm key_1 value incorrect: %ld\n", (long)value );
+       MPI_Abort(MPI_COMM_WORLD, 3005 );
+       }
+
+/*         MPI_Attr_get(dup_comm, key_2, (int *)&value, &flag ); */
+/*
+        if (! flag) {
+           printf( "dup_comm key_2 not found\n" );
+           MPI_Abort(MPI_COMM_WORLD, 3006 );
+           }
+
+       if (value != world_size) {
+           printf( "dup_comm key_2 value incorrect: %d\n", value );
+           MPI_Abort(MPI_COMM_WORLD, 3007 );
+          }
+ */
+    MPI_Attr_get(dup_comm, key_3, (void **)&vvalue, &flag );
+    value = (int)vvalue;
+    if (flag) {
+        printf( "dup_comm key_3 found!\n" );
+       MPI_Abort(MPI_COMM_WORLD, 3008 );
+       }
+    MPI_Keyval_free(&key_1 );
+/* 
+c        MPI_Keyval_free(&key_2 )
+ */
+    MPI_Keyval_free(&key_3 );
+    }
+/* 
+     Split the world into even & odd communicators with reversed ranks.
+ */
+      if (world_rank == 0) 
+         printf( "    Comm_split\n" );
+
+      color = world_rank % 2;
+      key   = world_size - world_rank;
+
+      MPI_Comm_split(dup_comm_world, color, key, &split_comm );
+      MPI_Comm_size(split_comm, &size );
+      MPI_Comm_rank(split_comm, &rank );
+      if (rank != ((size - world_rank/2) - 1)) {
+         printf( "incorrect split rank: %d\n", rank );
+         MPI_Abort(MPI_COMM_WORLD, 3009 );
+         }
+
+      MPI_Barrier(split_comm );
+/*
+     Test each possible Comm_compare result
+ */
+      if (world_rank == 0) 
+         printf( "    Comm_compare\n" );
+
+      MPI_Comm_compare(world_comm, world_comm, &result );
+      if (result != MPI_IDENT) {
+         printf( "incorrect ident result: %d\n", result );
+         MPI_Abort(MPI_COMM_WORLD, 3010 );
+        }
+
+      if (lo_comm != MPI_COMM_NULL) {
+         MPI_Comm_compare(lo_comm, dup_comm, &result );
+         if (result != MPI_CONGRUENT) {
+            printf( "incorrect congruent result: %d\n", result );
+            MPI_Abort(MPI_COMM_WORLD, 3011 );
+           }
+        }
+
+      ranges[0][0] = world_size - 1;
+      ranges[0][1] = 0;
+      ranges[0][2] = -1;
+
+      MPI_Group_range_incl(world_group, 1, ranges, &rev_group );
+      MPI_Comm_create(world_comm, rev_group, &rev_comm );
+      MPI_Comm_compare(world_comm, rev_comm, &result );
+      if (result != MPI_SIMILAR) {
+         printf( "incorrect similar result: %d\n", result );
+         MPI_Abort(MPI_COMM_WORLD, 3012 );
+        }
+
+      if (lo_comm != MPI_COMM_NULL) {
+         MPI_Comm_compare(world_comm, lo_comm, &result );
+         if (result != MPI_UNEQUAL) {
+             printf( "incorrect unequal result: %d\n", result );
+             MPI_Abort(MPI_COMM_WORLD, 3013 );
+             }
+         }
+/*
+     Free all communicators created
+ */
+    if (world_rank == 0) 
+       printf( "    Comm_free\n" );
+
+     MPI_Comm_free( &world_comm );
+     MPI_Comm_free( &dup_comm_world );
+
+     MPI_Comm_free( &rev_comm );
+     MPI_Comm_free( &split_comm );
+
+     MPI_Group_free( &world_group );
+     MPI_Group_free( &rev_group );
+
+     if (lo_comm != MPI_COMM_NULL) {
+        MPI_Comm_free( &lo_comm );
+        MPI_Comm_free( &dup_comm );
+       }
+
+     return 0;
+}
+
diff --git a/teshsuite/smpi/mpich-test/context/attrt.std b/teshsuite/smpi/mpich-test/context/attrt.std
new file mode 100644 (file)
index 0000000..4693c03
--- /dev/null
@@ -0,0 +1,9 @@
+*** Testing attributes ***
+*** Communicators ***
+    Comm_create
+    Comm_dup
+    Comm_split
+    Comm_compare
+    Comm_free
+All processes completed test
+*** Testing attributes ***
diff --git a/teshsuite/smpi/mpich-test/context/attrtest.f b/teshsuite/smpi/mpich-test/context/attrtest.f
new file mode 100644 (file)
index 0000000..6e63bca
--- /dev/null
@@ -0,0 +1,105 @@
+      PROGRAM MAIN
+
+      include 'mpif.h'
+
+C. Data layout
+C. Number of tests
+      integer PM_GLOBAL_ERROR, PM_NUM_NODES
+      integer PM_MAX_TESTS
+      parameter (PM_MAX_TESTS=3)
+C. Test data
+      integer PM_TEST_INTEGER, fuzzy, Error, FazAttr
+      integer PM_RANK_SELF
+      integer Faz_World, FazTag
+      integer errs
+      parameter (PM_TEST_INTEGER=12345)
+      logical FazFlag
+      external FazCreate, FazDelete
+C
+C. Initialize MPI
+      errs = 0
+      call MPI_INIT(PM_GLOBAL_ERROR)
+
+      PM_GLOBAL_ERROR = MPI_SUCCESS
+C. Find out the number of processes
+      call MPI_COMM_SIZE (MPI_COMM_WORLD,PM_NUM_NODES,PM_GLOBAL_ERROR)
+      call MPI_COMM_RANK (MPI_COMM_WORLD,PM_RANK_SELF,PM_GLOBAL_ERROR)
+
+      
+      call MPI_keyval_create ( FazCreate, FazDelete, FazTag,
+     &                         fuzzy, Error )
+
+C. Make sure that we can get an attribute that hasn't been set yet (flag
+C. is false)
+      call MPI_attr_get (MPI_COMM_WORLD, FazTag, FazAttr, 
+     &                   FazFlag, Error)
+
+      if (FazFlag) then
+         errs = errs + 1
+         print *, 'Did not get flag==false when attr_get of key that'
+         print *, 'had not had a value set with attr_put'
+      endif
+
+      FazAttr = 120
+      call MPI_attr_put (MPI_COMM_WORLD, FazTag, FazAttr, Error)
+
+C. Check that the put worked
+      call MPI_attr_get (MPI_COMM_WORLD, FazTag, FazAttr, 
+     &                   FazFlag, Error)
+
+      if (FazAttr .ne. 120) then
+         errs = errs + 1
+         print 1, ' Proc=',PM_Rank_self, ' ATTR=', FazAttr
+      endif
+C. Duplicate the Communicator and it's cached attributes
+
+      call MPI_Comm_Dup (MPI_COMM_WORLD, Faz_WORLD, Error)
+
+
+      call MPI_Attr_Get ( Faz_WORLD, FazTag, FazAttr, 
+     &                    FazFlag, Error)
+
+      if (FazFlag) then
+        if (FazAttr .ne. 121) then 
+           errs = errs + 1
+           print 1, ' T-Flag, Proc=',PM_Rank_self,' ATTR=', FazAttr
+        endif
+      else
+         errs = errs + 1
+         print 1, ' F-Flag, Proc=',PM_Rank_self,' ATTR=',FazAttr
+      end if
+ 1    format( a, i5, a, i5 )
+
+C. Clean up MPI
+      if (PM_Rank_self .eq. 0) then
+         if (errs .eq. 0) then
+            print *, ' No Errors'
+         else
+            print *, ' Found ', errs, ' errors'
+         endif
+      endif
+      call MPI_Comm_free( Faz_WORLD, Error )
+      call MPI_FINALIZE (PM_GLOBAL_ERROR)
+
+      end
+C
+C MPI 1.1 changed these from functions to subroutines.
+C
+      SUBROUTINE FazCreate (comm, keyval, fuzzy, 
+     &                    attr_in, attr_out, flag, ierr )
+      INTEGER comm, keyval, fuzzy, attr_in, attr_out
+      LOGICAL flag
+      include 'mpif.h'
+      attr_out = attr_in + 1
+      flag = .true.
+      ierr = MPI_SUCCESS
+      END
+
+      SUBROUTINE FazDelete (comm, keyval, attr, extra, ierr )
+      INTEGER comm, keyval, attr, extra, ierr
+      include 'mpif.h'
+      ierr = MPI_SUCCESS
+      if (keyval .ne. MPI_KEYVAL_INVALID)then
+         attr = attr -  1
+      end if 
+      END
diff --git a/teshsuite/smpi/mpich-test/context/commnames.c b/teshsuite/smpi/mpich-test/context/commnames.c
new file mode 100644 (file)
index 0000000..e552c23
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Check that we can put names on communicators and get them back.
+ */
+
+#include <stdio.h>
+
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int main( int argc, char **argv )
+{
+  char commName [MPI_MAX_NAME_STRING+1];
+  int namelen;
+
+  MPI_Init( &argc, &argv );
+  
+  if (MPI_Comm_get_name(MPI_COMM_WORLD, commName, &namelen) != MPI_SUCCESS)
+    {
+      printf("Failed to get a name from COMM_WORLD\n");
+      MPI_Abort(MPI_COMM_WORLD, -1);
+    }
+
+  if (strcmp("MPI_COMM_WORLD", commName))
+    {
+      printf("Name on MPI_COMM_WORLD is \"%s\" should be \"MPI_COMM_WORLD\"\n", commName);
+      MPI_Abort(MPI_COMM_WORLD, -1);
+    }
+  
+  if (namelen != strlen (commName))
+    {
+      printf("Length of name on MPI_COMM_WORLD is %d should be %d\n", 
+            namelen, (int) strlen(commName)); 
+      MPI_Abort(MPI_COMM_WORLD, -1);
+    }
+
+  /* Check that we can replace it */
+  if (MPI_Comm_set_name(MPI_COMM_WORLD,"foobar") != MPI_SUCCESS)
+    {
+      printf("Failed to put a name onto COMM_WORLD\n");
+      MPI_Abort(MPI_COMM_WORLD, -1);
+    }
+
+  if (MPI_Comm_get_name(MPI_COMM_WORLD, commName, &namelen) != MPI_SUCCESS)
+    {
+      printf("Failed to get a name from COMM_WORLD after changing it\n");
+      MPI_Abort(MPI_COMM_WORLD, -1);
+    }
+
+  if (strcmp("foobar", commName))
+    {
+      printf("Name on MPI_COMM_WORLD is \"%s\" should be \"foobar\"\n", 
+            commName );
+      MPI_Abort(MPI_COMM_WORLD, -1);
+    }
+
+  printf("Name tests OK\n");
+  MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/context/commnames.std b/teshsuite/smpi/mpich-test/context/commnames.std
new file mode 100644 (file)
index 0000000..819a2a6
--- /dev/null
@@ -0,0 +1,4 @@
+*** Testing Communicator Names ***
+Name tests OK
+Name tests OK
+*** Testing Communicator Names ***
diff --git a/teshsuite/smpi/mpich-test/context/commnamesf.f b/teshsuite/smpi/mpich-test/context/commnamesf.f
new file mode 100644 (file)
index 0000000..e816a8c
--- /dev/null
@@ -0,0 +1,75 @@
+C
+C Check the communicator naming functions from Fortran
+C
+
+      include 'mpif.h'
+
+      integer error, namelen
+      integer errcnt, rank
+      character*40 the_name
+      character*40 other_name
+
+      call mpi_init (error)
+      
+      errcnt = 0
+      call xify(the_name)
+
+      call mpi_comm_get_name (MPI_COMM_WORLD, the_name, namelen, error)
+      if (error .ne. mpi_success) then
+         errcnt = errcnt + 1
+         print *,'Failed to get the name from MPI_COMM_WORLD'
+         call MPI_Abort( MPI_COMM_WORLD, 1, error )
+      end if
+
+      if (the_name .ne. 'MPI_COMM_WORLD') then
+         errcnt = errcnt + 1
+         print *,'The name on MPI_COMM_WORLD is not "MPI_COMM_WORLD"'
+         call MPI_Abort( MPI_COMM_WORLD, 1, error )
+      end if
+
+      other_name = 'foobarH'
+      call mpi_comm_set_name(MPI_COMM_WORLD, other_name(1:6), error)
+
+      if (error .ne. mpi_success) then
+         errcnt = errcnt + 1
+         print *,'Failed to put a name onto MPI_COMM_WORLD'
+         call MPI_Abort( MPI_COMM_WORLD, 1, error )
+      end if
+      
+      call xify(the_name)
+
+      call mpi_comm_get_name (MPI_COMM_WORLD, the_name, namelen, error)
+      if (error .ne. mpi_success) then
+         errcnt = errcnt + 1
+         print *,'Failed to get the name from MPI_COMM_WORLD ',
+     $        'after setting it'
+         call MPI_Abort( MPI_COMM_WORLD, 1, error )
+      end if
+
+      if (the_name .ne. 'foobar') then
+         errcnt = errcnt + 1
+         print *,'The name on MPI_COMM_WORLD is not "foobar"'
+         print *, 'Got ', the_name
+         call MPI_Abort( MPI_COMM_WORLD, 1, error )
+      end if
+
+      call mpi_comm_rank( MPI_COMM_WORLD, rank, error )
+      if (errcnt .eq. 0 .and. rank .eq. 0) then
+         print *, ' No Errors'
+      endif
+      call mpi_finalize(error)
+      end
+
+
+      subroutine xify( string )
+      character*(*) string
+
+      integer i
+
+      do i = 1,len(string)
+         string(i:i) = 'X'
+      end do
+
+      end
+
+      
diff --git a/teshsuite/smpi/mpich-test/context/context.std b/teshsuite/smpi/mpich-test/context/context.std
new file mode 100644 (file)
index 0000000..6ab43a2
--- /dev/null
@@ -0,0 +1,3 @@
+FORTRAN TESTS
+*** attrtest ***
+END OF FORTRAN TESTS
diff --git a/teshsuite/smpi/mpich-test/context/groupcreate.c b/teshsuite/smpi/mpich-test/context/groupcreate.c
new file mode 100644 (file)
index 0000000..686fa9b
--- /dev/null
@@ -0,0 +1,67 @@
+#include "mpi.h"
+#include <stdio.h>
+/* stdlib.h Needed for malloc declaration */
+#include <stdlib.h>
+#include "test.h"
+
+int main( int argc, char **argv )
+{
+    int i, n, n_goal = 2048, n_all, rc, n_ranks, *ranks, rank, size, len;
+    MPI_Group *group_array, world_group;
+    char msg[MPI_MAX_ERROR_STRING];
+
+    MPI_Init( &argc, &argv );
+    MPI_Errhandler_set( MPI_COMM_WORLD, MPI_ERRORS_RETURN );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    n = n_goal;
+    
+    group_array = (MPI_Group *)malloc( n * sizeof(MPI_Group) );
+
+    MPI_Comm_group( MPI_COMM_WORLD, &world_group );
+
+    n_ranks = size;
+    ranks = (int *)malloc( size * sizeof(int) );
+    for (i=0; i<size; i++) ranks[i] = i;
+
+    for (i=0; i<n; i++) {
+       rc = MPI_Group_incl( world_group, n_ranks, ranks, group_array + i );
+       if (rc) {
+           fprintf( stderr, "Error when creating group number %d\n", i );
+           MPI_Error_string( rc, msg, &len );
+           fprintf( stderr, "%s\n", msg );
+           n = i + 1;
+           break;
+       }
+       
+    }
+
+    for (i=0; i<n; i++) {
+       rc = MPI_Group_free( group_array + i );
+       if (rc) {
+           fprintf( stderr, "Error when freeing group number %d\n", i );
+           MPI_Error_string( rc, msg, &len );
+           fprintf( stderr, "%s\n", msg );
+           break;
+       }
+    }
+    
+    MPI_Group_free( &world_group );
+
+    MPI_Reduce( &n, &n_all, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD );
+    if (rank == 0) {
+       /* printf( "Completed test of %d type creations\n", n_all ); */
+       if (n_all != n_goal) {
+           printf (
+"This MPI implementation limits the number of groups that can be created\n\
+This is allowed by the standard and is not a bug, but is a limit on the\n\
+implementation\n" );
+       }
+       else {
+           printf( " No Errors\n" );
+       }
+    }
+
+    MPI_Finalize( );
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/context/grouptest.c b/teshsuite/smpi/mpich-test/context/grouptest.c
new file mode 100644 (file)
index 0000000..228b9f8
--- /dev/null
@@ -0,0 +1,206 @@
+/*
+   Test the group routines
+   (some tested elsewere)
+
+MPI_Group_compare
+MPI_Group_excl
+MPI_Group_intersection
+MPI_Group_range_excl
+MPI_Group_rank
+MPI_Group_size
+MPI_Group_translate_ranks
+MPI_Group_union
+MPI_Group_range_incl
+MPI_Group_incl
+
+ */
+#include "mpi.h"
+#include <stdio.h>
+/* stdlib.h Needed for malloc declaration */
+#include <stdlib.h>
+#include "test.h"
+
+int main( int argc, char **argv )
+{
+    int errs=0, toterr;
+    MPI_Group basegroup;
+    MPI_Group g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12;
+    MPI_Comm  comm, newcomm, splitcomm, dupcomm;
+    int       i, grp_rank, rank, grp_size, size, result;
+    int       nranks, *ranks, *ranks_out;
+    int       range[2][3];
+    int       worldrank;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &worldrank );
+
+    comm = MPI_COMM_WORLD;
+
+    MPI_Comm_group( comm, &basegroup );
+
+/* Get the basic information on this group */
+    MPI_Group_rank( basegroup, &grp_rank );
+    MPI_Comm_rank( comm, &rank );
+    if (grp_rank != rank) {
+       errs++;
+       fprintf( stdout, "group rank %d != comm rank %d\n", grp_rank, rank );
+    }
+
+    MPI_Group_size( basegroup, &grp_size );
+    MPI_Comm_size( comm, &size );
+    if (grp_size != size) {
+       errs++;
+       fprintf( stdout, "group size %d != comm size %d\n", grp_size, size );
+    }
+
+
+/* Form a new communicator with inverted ranking */
+    MPI_Comm_split( comm, 0, size - rank, &newcomm );
+    MPI_Comm_group( newcomm, &g1 );
+    ranks        = (int *)malloc( size * sizeof(int) );
+    ranks_out = (int *)malloc( size * sizeof(int) );
+    for (i=0; i<size; i++) ranks[i] = i;
+    nranks = size;
+    MPI_Group_translate_ranks( g1, nranks, ranks, basegroup, ranks_out );
+    for (i=0; i<size; i++) {
+       if (ranks_out[i] != (size - 1) - i) {
+           errs++;
+           fprintf( stdout, "Translate ranks got %d expected %d\n", 
+                    ranks_out[i], (size - 1) - i );
+       }
+    }
+
+/* Check Compare */
+    MPI_Group_compare( basegroup, g1, &result );
+    if (result != MPI_SIMILAR) {
+       errs++;
+       fprintf( stdout, "Group compare should have been similar, was %d\n",
+                result );
+    }
+    MPI_Comm_dup( comm, &dupcomm );
+    MPI_Comm_group( dupcomm, &g2 );
+    MPI_Group_compare( basegroup, g2, &result );
+    if (result != MPI_IDENT) {
+       errs++;
+       fprintf( stdout, "Group compare should have been ident, was %d\n",
+                result );
+    }
+    MPI_Comm_split( comm, rank < size/2, rank, &splitcomm );
+    MPI_Comm_group( splitcomm, &g3 );
+    MPI_Group_compare( basegroup, g3, &result );
+    if (result != MPI_UNEQUAL) {
+       errs++;
+       fprintf( stdout, "Group compare should have been unequal, was %d\n",
+                result );
+    }
+MPI_Barrier(MPI_COMM_WORLD);
+/* Build two new groups by excluding members; use Union to put them
+   together again */
+
+/* Exclude 0 */
+    MPI_Group_excl( basegroup, 1, ranks, &g4 );
+/* Exclude 1-(size-1) */
+    MPI_Group_excl( basegroup, size-1, ranks+1, &g5 );
+    MPI_Group_union( g5, g4, &g6 );
+    MPI_Group_compare( basegroup, g6, &result );
+    if (result != MPI_IDENT) {
+       errs++;
+       /* See ordering requirements on union */
+       fprintf( stdout, "Group excl and union did not give ident groups\n" );
+    }
+    MPI_Group_union( basegroup, g4, &g7 );
+    MPI_Group_compare( basegroup, g7, &result );
+    if (result != MPI_IDENT) {
+       errs++;
+       fprintf( stdout, "Group union of overlapping groups failed\n" );
+    }
+
+/* Use range_excl instead of ranks */
+    range[0][0] = 1;
+    range[0][1] = size-1;
+    range[0][2] = 1;
+    MPI_Group_range_excl( basegroup, 1, range, &g8 );
+    MPI_Group_compare( g5, g8, &result );
+    if (result != MPI_IDENT) {
+       errs++;
+       fprintf( stdout, "Group range excl did not give ident groups\n" );
+    }
+
+    MPI_Group_intersection(g4, basegroup, &g9 );
+    MPI_Group_compare( g9, g4, &result );
+    if (result != MPI_IDENT) {
+       errs++;
+       fprintf( stdout, "Group intersection did not give ident groups\n" );
+    }
+    
+    MPI_Group_intersection(basegroup, g4 , &g9 );
+    MPI_Group_compare( g9, g4, &result );
+    if (result != MPI_IDENT) {
+       errs++;
+       fprintf( stdout, "Group intersection 2 did not give ident groups\n" );
+    }
+    
+        MPI_Group_intersection(basegroup, basegroup, &g9 );
+    MPI_Group_compare( g9, basegroup, &result );
+    if (result != MPI_IDENT) {
+       errs++;
+       fprintf( stdout, "Group intersection 3 did not give ident groups\n" );
+    }
+
+/* Exclude EVERYTHING and check against MPI_GROUP_EMPTY */
+    range[0][0] = 0;
+    range[0][1] = size-1;
+    range[0][2] = 1;
+    MPI_Group_range_excl( basegroup, 1, range, &g10 );
+    MPI_Group_compare( g10, MPI_GROUP_EMPTY, &result );
+    if (result != MPI_IDENT) {
+       errs++;
+       fprintf( stdout, 
+                "MPI_GROUP_EMPTY didn't compare against empty group\n");
+    }
+
+/* Grouptest usually runs with 4 processes.  Pick a range that specifies
+   1, size-1, but where "last" is size.  This checks for an 
+   error case that MPICH2 got wrong */
+    range[0][0] = 1;
+    range[0][1] = size ;
+    range[0][2] = size - 2;
+    MPI_Group_range_incl( basegroup, 1, range, &g11 );
+    ranks[0] = 1;
+    ranks[1] = size-1;
+    MPI_Group_incl( basegroup, 2, ranks, &g12 );
+    MPI_Group_compare( g11, g12, &result );
+    if (result != MPI_IDENT) {
+       errs++;
+       fprintf( stderr, 
+                "MPI_Group_range_incl didn't compare against MPI_Group_incl\n" );
+    }
+
+    MPI_Group_free( &basegroup );
+    MPI_Group_free( &g1 );
+    MPI_Group_free( &g2 );
+    MPI_Group_free( &g3 );
+    MPI_Group_free( &g4 );
+    MPI_Group_free( &g5 );
+    MPI_Group_free( &g6 );
+    MPI_Group_free( &g7 );
+    MPI_Group_free( &g8 );
+    MPI_Group_free( &g9 );
+    MPI_Group_free( &g10 );
+    MPI_Group_free( &g11 );
+    MPI_Group_free( &g12 );
+    MPI_Comm_free( &dupcomm );
+    MPI_Comm_free( &splitcomm );
+    MPI_Comm_free( &newcomm );
+
+    MPI_Allreduce( &errs, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (worldrank == 0) {
+       if (toterr == 0) 
+           printf( " No Errors\n" );
+       else
+           printf( "Found %d errors in MPI Group routines\n", toterr );
+    }
+
+    MPI_Finalize();
+    return toterr;
+}
diff --git a/teshsuite/smpi/mpich-test/context/icdup.c b/teshsuite/smpi/mpich-test/context/icdup.c
new file mode 100644 (file)
index 0000000..dff9942
--- /dev/null
@@ -0,0 +1,71 @@
+#include "mpi.h"
+#include <stdio.h>
+
+/*
+ * intended to be run with at least 3 procs
+ */
+int main(int argc, char ** argv)
+{
+    MPI_Comm new_intercomm;
+    MPI_Comm new_comm;
+    int my_rank, my_size;
+    int rrank;
+    int procA, procB;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
+    MPI_Comm_size( MPI_COMM_WORLD, &my_size );
+
+    if (my_size < 3) {
+       printf( "This test requires at least 3 processes: only %d provided\n",
+               my_size );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+#ifdef DBG
+       printf("%d: Entering main()\n", my_rank); fflush(stdout);
+#endif
+    /* pick one of the following two settings for procA,procB */
+
+       /* uncomment these and program will work */
+       /* procA = 0; procB = 2; */
+
+       /* uncomment these and program will hang */
+       procA = 1; procB = 2;
+    /* The SGI implementation of MPI fails this test */
+    if (my_rank == procA || my_rank == procB)
+    {
+       if (my_rank == procA)
+       {
+           rrank = procB;
+       }
+       else
+       {
+           rrank = procA;
+       }
+#ifdef DBG
+       printf("%d: Calling MPI_Intercomm_create()\n", my_rank); fflush(stdout);
+#endif
+       MPI_Intercomm_create(MPI_COMM_SELF, 0, 
+                           MPI_COMM_WORLD, rrank, 
+                           0, &new_intercomm);
+
+#ifdef DBG
+       printf("%d: Calling MPI_Comm_dup()\n", my_rank); fflush(stdout);
+#endif
+       MPI_Comm_dup(new_intercomm, &new_comm);
+
+       /* Free these new communicators */
+       MPI_Comm_free( &new_comm );
+       MPI_Comm_free( &new_intercomm );
+    }
+
+    MPI_Barrier( MPI_COMM_WORLD );
+    if (my_rank == 0) {
+       printf( " No Errors\n" );
+    }
+#ifdef DBG
+    printf("%d: Calling MPI_Finalize()\n", my_rank); fflush(stdout);
+#endif
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/context/ictest.c b/teshsuite/smpi/mpich-test/context/ictest.c
new file mode 100644 (file)
index 0000000..cba2522
--- /dev/null
@@ -0,0 +1,124 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/* ictest.c */
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+
+int verbose = 0;
+
+int main( int argc, char **argv )
+{
+  int size, rank, key, his_key, lrank, result;
+  MPI_Comm myComm;
+  MPI_Comm myFirstComm;
+  MPI_Comm mySecondComm;
+  int errors = 0, sum_errors;
+  MPI_Status status;
+  
+  /* Initialization */
+  MPI_Init ( &argc, &argv );
+  MPI_Comm_rank ( MPI_COMM_WORLD, &rank);
+  MPI_Comm_size ( MPI_COMM_WORLD, &size);
+
+  /* Only works for 2 or more processes */
+  if (size >= 2) {
+    MPI_Comm merge1, merge2, merge3, merge4;
+
+    /* Generate membership key in the range [0,1] */
+    key = rank % 2;
+    
+    MPI_Comm_split ( MPI_COMM_WORLD, key, rank, &myComm );
+    /* This creates an intercomm that is the size of comm world 
+       but has processes grouped by even and odd */
+    MPI_Intercomm_create (myComm, 0, MPI_COMM_WORLD, (key+1)%2, 1, 
+                          &myFirstComm );
+    /* Dup an intercomm */
+    MPI_Comm_dup ( myFirstComm, &mySecondComm );
+    MPI_Comm_rank( mySecondComm, &lrank );
+    his_key = -1;
+    
+    /* Leaders communicate with each other */
+    if (lrank == 0) {
+      MPI_Sendrecv (&key,     1, MPI_INT, 0, 0,
+                    &his_key, 1, MPI_INT, 0, 0, mySecondComm, &status);
+      if (key != (his_key+1)%2) {
+         printf( "Received %d but expected %d\n", his_key, (his_key+1)%2 );
+         errors++;
+      }
+    }
+    
+    if (errors)
+      printf("[%d] Failed!\n",rank);
+
+    if (verbose) printf( "About to merge intercommunicators\n" );
+    MPI_Intercomm_merge ( mySecondComm, key, &merge1 );
+    MPI_Intercomm_merge ( mySecondComm, (key+1)%2, &merge2 );
+    MPI_Intercomm_merge ( mySecondComm, 0, &merge3 );
+    MPI_Intercomm_merge ( mySecondComm, 1, &merge4 );
+
+    /* We should check that these are correct!  An easy test is that
+       the merged comms are all MPI_SIMILAR (unless 2 processes used, 
+       in which case MPI_CONGRUENT is ok */
+    MPI_Comm_compare( merge1, MPI_COMM_WORLD, &result );
+    if ((size > 2 && result != MPI_SIMILAR) ||
+       (size == 2 && result != MPI_CONGRUENT)) {
+       errors ++;
+       printf( "merge1 is not the same size as comm world\n" );
+    }
+    /* merge 2 isn't ordered the same way as the others, even for 2 processes */
+    MPI_Comm_compare( merge2, MPI_COMM_WORLD, &result );
+    if (result != MPI_SIMILAR) {
+       errors ++;
+       printf( "merge2 is not the same size as comm world\n" );
+    }
+    MPI_Comm_compare( merge3, MPI_COMM_WORLD, &result );
+    if ((size > 2 && result != MPI_SIMILAR) ||
+       (size == 2 && result != MPI_CONGRUENT)) {
+       errors ++;
+       printf( "merge3 is not the same size as comm world\n" );
+    }
+    MPI_Comm_compare( merge4, MPI_COMM_WORLD, &result );
+    if ((size > 2 && result != MPI_SIMILAR) ||
+       (size == 2 && result != MPI_CONGRUENT)) {
+       errors ++;
+       printf( "merge4 is not the same size as comm world\n" );
+    }
+
+    /* Free communicators */
+    if (verbose) printf( "About to free communicators\n" );
+    MPI_Comm_free( &myComm );
+    MPI_Comm_free( &myFirstComm );
+    MPI_Comm_free( &mySecondComm );
+    MPI_Comm_free( &merge1 );
+    MPI_Comm_free( &merge2 );
+    MPI_Comm_free( &merge3 );
+    MPI_Comm_free( &merge4 );
+  }
+  else {
+      errors ++;
+      printf("[%d] Failed - at least 2 nodes must be used\n",rank);
+  }
+
+  MPI_Barrier( MPI_COMM_WORLD );
+  MPI_Allreduce( &errors, &sum_errors, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+  if (sum_errors > 0) {
+      printf( "%d errors on process %d\n", errors, rank );
+      }
+  else if (rank == 0) {
+      printf( " No Errors\n" );
+      }
+  /* Finalize and end! */
+
+  MPI_Finalize();
+  return 0;
+}
+
+
+
+
+
+
+
+
+
+
diff --git a/teshsuite/smpi/mpich-test/context/ictest2.c b/teshsuite/smpi/mpich-test/context/ictest2.c
new file mode 100644 (file)
index 0000000..4b615bc
--- /dev/null
@@ -0,0 +1,209 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/* ictest2.c 
+   This is like ictest.c, but it creates communictors that are valid only
+   at the "leaders"; other members of the local communicator are NOT
+   in the remote communicator.  This is done by creating two communicators:
+   0, + odd rank and even rank.  Only 0 is in in both communicators.
+
+   This test originally tested the part of the standard that allowed the 
+   leader to be in both groups.  This has been disallowed.  This test was
+   recently changed to operate correctly under the new definition.
+
+   Note that it generates unordered printf output, and is not suitable for
+   automated testing.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+int verbose = 0;
+
+int main( int argc, char **argv )
+{
+  int size, rank, key, lrank, rsize, result, remLeader = 0;
+  MPI_Comm myComm;
+  MPI_Comm myFirstComm;
+  MPI_Comm mySecondComm;
+  MPI_Comm evenComm, oddComm, remComm;
+  int errors = 0, sum_errors;
+  MPI_Status status;
+  
+  /* Initialization */
+  MPI_Init ( &argc, &argv );
+  MPI_Comm_rank ( MPI_COMM_WORLD, &rank);
+  MPI_Comm_size ( MPI_COMM_WORLD, &size);
+
+  /* Only works for 2 or more processes */
+  if (size >= 2) {
+    MPI_Comm merge1, merge2, merge3, merge4;
+
+    /* Generate membership key in the range [0,1] */
+    key = rank % 2;
+    /* Create the even communicator */
+    MPI_Comm_split ( MPI_COMM_WORLD, key, rank, &evenComm );
+    if (key == 1) {
+       /* Odd rank communicator discarded */
+       MPI_Comm_free( &evenComm );
+    }
+    
+    /* Create the odd communicator */
+    MPI_Comm_split ( MPI_COMM_WORLD, key, rank, &oddComm );
+    if (key == 0) {
+       /* Even rank communicator discarded */
+       MPI_Comm_free( &oddComm );
+    }
+
+    /* Create the odd + 0 communicator */
+    if (rank == 0) key = 1;
+    MPI_Comm_split( MPI_COMM_WORLD, key, rank, &remComm );
+    if (key == 0) {
+       /* Even rank communicator discarded */
+       MPI_Comm_free( &remComm );
+    }
+    else {
+       MPI_Comm_rank( remComm, &lrank );
+       if (verbose) {
+           printf( "[%d] lrank in remComm is %d (color = %d, key=%d)\n", 
+                   rank, lrank, rank, key );
+       }
+       remLeader = (lrank == 0) ? 1 : 0;
+    }
+    /* Now, choose the local and remote communicators */
+    if (rank % 2) {
+       /* Odd */
+       myComm  = oddComm;
+    }
+    else {
+       myComm  = evenComm;
+    }
+
+    /* Check that the leader is who we think he is */
+    MPI_Comm_rank( myComm, &lrank );
+    if (verbose) {
+       printf( "[%d] local rank is %d\n", rank, lrank );
+    }
+    if (rank == 0) {
+       int trank;
+       MPI_Comm_rank( myComm, &trank );
+       if (trank != 0) {
+           printf( "[%d] Comm split improperly ordered group (myComm)\n",
+                   rank );
+           fflush(stdout);
+           errors++;
+       }
+       MPI_Comm_rank( remComm, &trank );
+       if (trank != 0) {
+           printf( "[%d] Comm split improperly ordered group (remComm)\n",
+                   rank );
+           fflush(stdout);
+           errors++;
+       }
+    }
+    /* Perform the intercomm create and test it */
+    /* local leader is first process in local_comm, i.e., has rank 0 */
+    /* remote leader is process 0 (if odd) or 1 (if even) in remComm */
+    MPI_Intercomm_create (myComm, 0, remComm, remLeader, 1, &myFirstComm );
+/* temp */
+    if (verbose) {
+       printf( "[%d] through intercom create\n", rank );
+       fflush( stdout );
+    }
+    MPI_Barrier( MPI_COMM_WORLD );
+    if (verbose) {
+       printf( "[%d] through barrier at end of intercom create\n", rank );
+       fflush( stdout );
+    }
+/* temp */
+
+    /* Try to dup this communicator */
+    MPI_Comm_dup ( myFirstComm, &mySecondComm );
+
+/* temp */
+    if (verbose) {
+       printf( "[%d] through comm dup\n", rank );
+       fflush( stdout );
+    }
+    MPI_Barrier( MPI_COMM_WORLD );
+    if (verbose) {
+       printf( "[%d] through barrier at end of comm dup\n", rank );
+       fflush( stdout );
+    }
+/* temp */
+
+    /* Each member shares data with his "partner".  Note that process 0 in
+       MPI_COMM_WORLD is sending to itself, since it is process 0 in both
+       remote groups */
+    MPI_Comm_rank( mySecondComm, &lrank );
+    MPI_Comm_remote_size( mySecondComm, &rsize );
+
+    if (verbose) {
+       printf( "[%d] lrank in secondcomm is %d and remote size is %d\n", 
+               rank, lrank, rsize );
+       fflush( stdout );
+    }
+
+    /* Send key * size + rank in communicator */
+    if (lrank < rsize) {
+      int myval, hisval;
+      key     = rank % 2;
+      myval   = key * size + lrank;
+      hisval  = -1;
+      if (verbose) {
+         printf( "[%d] exchanging %d with %d in intercomm\n", 
+                 rank, myval, lrank );
+         fflush( stdout );
+      }
+      MPI_Sendrecv (&myval,  1, MPI_INT, lrank, 0,
+                    &hisval, 1, MPI_INT, lrank, 0, mySecondComm, &status);
+      if (hisval != (lrank + (!key)*size)) {
+         printf( "[%d] expected %d but got %d\n", rank, lrank + (!key)*size,
+                 hisval );
+         errors++;
+         }
+      }
+    
+    if (errors) {
+       printf("[%d] Failed!\n",rank);
+       fflush(stdout);
+    }
+
+    /* Key is 1 for oddComm, 0 for evenComm (note both contain 0 in WORLD) */
+    MPI_Intercomm_merge ( mySecondComm, key, &merge1 );
+    MPI_Intercomm_merge ( mySecondComm, (key+1)%2, &merge2 );
+    MPI_Intercomm_merge ( mySecondComm, 0, &merge3 );
+    MPI_Intercomm_merge ( mySecondComm, 1, &merge4 );
+
+    MPI_Comm_compare( merge1, MPI_COMM_WORLD, &result );
+    if (result != MPI_SIMILAR && size > 2) {
+       printf( "[%d] comparision with merge1 failed\n", rank );
+       errors++;
+       }
+
+    /* Free communicators */
+    MPI_Comm_free( &myComm );
+    /* remComm may have been freed above */
+    if (remComm != MPI_COMM_NULL) 
+       MPI_Comm_free( &remComm );
+    MPI_Comm_free( &myFirstComm );
+    MPI_Comm_free( &mySecondComm );
+    MPI_Comm_free( &merge1 );
+    MPI_Comm_free( &merge2 );
+    MPI_Comm_free( &merge3 );
+    MPI_Comm_free( &merge4 );
+  }
+  else {
+      printf("[%d] Failed - at least 2 nodes must be used\n",rank);
+  }
+
+  MPI_Barrier( MPI_COMM_WORLD );
+  MPI_Allreduce( &errors, &sum_errors, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+  if (sum_errors > 0) {
+      printf( "%d errors on process %d\n", errors, rank );
+      }
+  else if (rank == 0) {
+      printf( " No Errors\n" );
+      }
+
+  MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/context/ictest3.c b/teshsuite/smpi/mpich-test/context/ictest3.c
new file mode 100644 (file)
index 0000000..26b2d97
--- /dev/null
@@ -0,0 +1,195 @@
+/* ictest3.c 
+   This is like ictest2.c, but it creates communictors that are valid only
+   at the "leaders"; other members of the local communicator are NOT
+   in the remote communicator.  A peer communicator is constructed that
+   contains both leaders.
+
+   
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+/* #define DEBUG */
+
+int verbose = 0;
+
+int main( int argc, char **argv )
+{
+  int size, rank, key, lrank, rsize, result;
+  MPI_Comm myFirstComm;
+  MPI_Comm mySecondComm;
+  MPI_Comm newComm, peerComm;
+  MPI_Group rgroup, lgroup, igroup;
+  int errors = 0, sum_errors;
+  int flag;
+  MPI_Status status;
+  
+  /* Initialization */
+  MPI_Init ( &argc, &argv );
+  MPI_Comm_rank ( MPI_COMM_WORLD, &rank);
+  MPI_Comm_size ( MPI_COMM_WORLD, &size);
+
+  /* Only works for 2 or more processes */
+  /* 
+     We create an even and odd communicator, then create an
+     intercommunicator out of them.  For this purpose, we use a 
+     "peer" communicator valid only at one member of each of the odd and
+     even communicators.
+   */
+  if (size >= 2) {
+    MPI_Comm merge1, merge2, merge3, merge4;
+
+    /* Generate membership key in the range [0,1] */
+    key = rank % 2;
+    /* Create the even communicator and odd communicators */
+    MPI_Comm_split ( MPI_COMM_WORLD, key, rank, &newComm );
+
+    MPI_Comm_test_inter( newComm, &flag );
+    if (flag) {
+       errors++;
+       printf( "[%d] got test_inter gave true for intra comm\n", rank );
+       }
+
+    /* Create the "peer" communicator */
+    key = 0;
+    if (rank < 2) key = 1;
+    MPI_Comm_split( MPI_COMM_WORLD, key, rank, &peerComm );
+    if (key == 0) {
+       MPI_Comm_free( &peerComm );
+       }
+#ifdef DEBUG
+    else {
+       MPI_Comm_rank( peerComm, &lrank );
+       printf( "[%d] lrank in peerComm is %d (color = %d, key=%d)\n", 
+               rank, lrank, key, rank );
+       }
+#endif
+
+    /* Check that the leader is who we think he is */
+    MPI_Comm_rank( newComm, &lrank );
+    /* printf( "[%d] local rank is %d\n", rank, lrank );
+    fflush(stdout); */
+    /* Perform the intercomm create and test it */
+    /* Local leader is always the one at rank 0.  */
+    /* If even, the remote leader is rank 1, if odd, the remote leader
+       is rank 0 in the peercomm */
+    MPI_Intercomm_create (newComm, 0, peerComm, !(rank % 2), 1, &myFirstComm );
+#ifdef DEBUG
+    printf( "[%d] through intercom create\n", rank );
+    fflush( stdout );
+    MPI_Barrier( MPI_COMM_WORLD );
+    printf( "[%d] through barrier at end of intercom create\n", rank );
+#endif
+    MPI_Comm_test_inter( myFirstComm, &flag );
+    if (!flag) {
+       errors++;
+       printf( "[%d] got test_inter gave false for inter comm\n", rank );
+       }
+
+    /* Try to dup this communicator */
+    MPI_Comm_dup ( myFirstComm, &mySecondComm );
+    MPI_Comm_test_inter( mySecondComm, &flag );
+    if (!flag) {
+       errors++;
+       printf( "[%d] got test_inter gave false for dup of inter comm\n", 
+               rank );
+       }
+
+#ifdef DEBUG
+    printf( "[%d] through comm dup\n", rank );
+    fflush( stdout );
+    MPI_Barrier( MPI_COMM_WORLD );
+    printf( "[%d] through barrier at end of comm dup\n", rank );
+#endif
+
+    /* Each member shares data with his "partner".  */
+    MPI_Comm_rank( mySecondComm, &lrank );
+    MPI_Comm_remote_size( mySecondComm, &rsize );
+
+#ifdef DEBUG
+    printf( "[%d] lrank in secondcomm is %d and remote size is %d\n", 
+          rank, lrank, rsize );
+    fflush( stdout ); 
+#endif
+
+    /* Check that the remote group is what we think */
+    MPI_Comm_remote_group( mySecondComm, &rgroup );
+    MPI_Comm_group( newComm, &lgroup );
+    MPI_Group_intersection( rgroup, lgroup, &igroup );
+    MPI_Group_compare( igroup, MPI_GROUP_EMPTY, &flag );
+    if (flag != MPI_IDENT) {
+       errors++;
+       printf( "[%d] intersection of remote and local group is not empty\n",
+               rank );
+       }
+    MPI_Group_free( &rgroup );
+    MPI_Group_free( &lgroup );
+    MPI_Group_free( &igroup );
+
+    /* Send key * size + rank in communicator */
+    if (lrank < rsize) {
+      int myval, hisval;
+      key = rank % 2;
+      myval   = key * size + lrank;
+      hisval  = -1;
+#ifdef DEBUG
+      printf( "[%d] exchanging %d with %d in intercomm\n", 
+            rank, myval, lrank );
+      fflush( stdout );
+#endif
+      MPI_Sendrecv (&myval,  1, MPI_INT, lrank, 0, 
+                    &hisval, 1, MPI_INT, lrank, 0, mySecondComm, &status);
+      if (hisval != (lrank + (!key)*size)) {
+         printf( "[%d] expected %d but got %d\n", rank, lrank + (!key)*size,
+                 hisval );
+         errors++;
+         }
+      }
+    
+    if (errors)
+      printf("[%d] Failed!\n",rank);
+
+    /* Key is 1 for oddComm, 0 for evenComm (note both contain 0 in WORLD) */
+#ifdef DEBUG
+    printf( "[%d] starting intercom merge\n", rank );
+    fflush( stdout );
+#endif
+    MPI_Intercomm_merge ( mySecondComm, key, &merge1 );
+    MPI_Intercomm_merge ( mySecondComm, (key+1)%2, &merge2 );
+    MPI_Intercomm_merge ( mySecondComm, 0, &merge3 );
+    MPI_Intercomm_merge ( mySecondComm, 1, &merge4 );
+
+    MPI_Comm_compare( merge1, MPI_COMM_WORLD, &result );
+    if (result != MPI_SIMILAR && size > 2) {
+       printf( "[%d] comparision with merge1 failed\n", rank );
+       errors++;
+       }
+
+    /* Free communicators */
+    if (verbose) printf( "about to free communicators\n" );
+    MPI_Comm_free( &newComm );
+    if (peerComm != MPI_COMM_NULL) MPI_Comm_free( &peerComm );
+    MPI_Comm_free( &myFirstComm );
+    MPI_Comm_free( &mySecondComm );
+    MPI_Comm_free( &merge1 );
+    MPI_Comm_free( &merge2 );
+    MPI_Comm_free( &merge3 );
+    MPI_Comm_free( &merge4 );
+  }
+  else 
+    printf("[%d] Failed - at least 2 nodes must be used\n",rank);
+
+  MPI_Barrier( MPI_COMM_WORLD );
+  MPI_Allreduce( &errors, &sum_errors, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+  if (sum_errors > 0) {
+      printf( "%d errors on process %d\n", errors, rank );
+      }
+  else if (rank == 0) {
+      printf( " No Errors\n" );
+      }
+  /* Finalize and end! */
+
+  MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/context/runtests b/teshsuite/smpi/mpich-test/context/runtests
new file mode 100755 (executable)
index 0000000..a71d79c
--- /dev/null
@@ -0,0 +1,136 @@
+#! /bin/sh
+#
+# Run some of the tests.  If any arguments are provided, pass them to the
+# test programs.
+#
+# -mvhome is needed for the ANL SP, and is ignored by others
+args=
+device=
+MPICH_VERSION=
+STOPFILE=${MPITEST_STOPTEST:-"$HOME/.stopmpichtests"}
+MAKE="make --no-print-directory"
+
+#
+# Set mpirun to the name/path of the mpirun program
+#FindMPIRUN
+#
+#
+test_mpi2=1
+runtests=1
+quiet=0
+makeeach=0
+have_fortran=0
+writesummaryfile=no
+MAKE="make --no-print-directory"
+for arg in "$@" ; do
+    case $arg in 
+    -basedir=* )
+       basedir=`echo $arg | sed 's/-basedir=//'`
+       ;; 
+    -srcdir=* )
+       srcdir=`echo $arg | sed 's/-srcdir=//'`
+       ;; 
+       -fort=* )
+       have_fortran=`echo $arg | sed 's/-fort=//'`
+       ;;
+       -checkonly )
+       runtests=0
+       ;;
+        -margs=*)
+       margs=`echo $arg | sed 's/-margs=//'`
+       args="$args $margs"
+       ;;
+       -summaryfile=*)
+       writesummaryfile=yes
+       summaryfile=`echo A$arg | sed 's/A-summaryfile=//'`
+       ;;
+       -small)
+       makeeach=1
+       ;;
+       -quiet)
+       shift
+       quiet=1
+       ;;
+       -help|-u)
+       echo "runtests [-checkonly] [-margs='...']"
+       echo "run tests in this directory.  If -checkonly set, just run"
+       echo "the differences check (do NO rerun the test programs)."
+       echo "If -margs is used, these options are passed to mpirun."
+       echo "If -small is used, the examples are built, run, and deleted."
+       exit 1
+       ;;
+       *)
+       if test -n "$arg" ; then
+           echo "runtests: Unknown argument ($arg)"
+           exit 1
+        fi
+       ;;
+    esac
+done
+
+#
+# Load basic procedures
+. ${srcdir}/../runbase
+
+# If the programs are not available, run make.
+if [ ! -x attrerr -a $makeeach = 0 -a $runtests = 1 ] ; then
+    $MAKE
+fi
+mpirun=" ${basedir}/bin/smpirun -platform ${srcdir}/../../../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir}/../../hostfile  --log=root.thres:critical"
+testfiles=""
+if [ $runtests = 1 ] ; then
+
+#
+# Run Fortran tests ONLY if Fortran available
+#no fortran tests compile with smpi at this time
+#if [ $have_fortran -eq "1" ] ; then 
+#    #RunTest attrtest 2 "*** Testing attributes from Fortran ***"
+
+#    if [ $test_mpi2 = 1 ] ; then
+#       RunTest commnamesf 1 "*** Testing Communicator Names from Fortran ***"
+#    fi
+#fi
+#uses attr, not implemented
+#RunTest attrt 2 "*** Testing attributes ***"
+#fails, uses MPI_Attr_get, et MPI_Attr_put
+#RunTest attrerr 1 "*** Testing attributes (2) ***"
+
+RunTest grouptest_mpich 4 "*** Testing Groups ***"
+
+RunTest groupcreate 4 "*** Testing Group creation ***"
+
+#uses MPI_Intercomm_create
+#RunTest ictest 4 "*** Testing Intercommunicators ***"
+
+RunTest icdup 3 "*** Testing dup of an intercommunicator ***"
+
+#
+# ictest2 relies on a inconsistency in the standard, to wit, that the
+# leader in both groups can be the same process.  This seems to be
+# essential in a dynamic setting, since the only process both groups can
+# access may be the single parent process (other than using client/server
+# intercommunicator creating routines, with the parent providing the common
+# information).
+#
+#testfiles="$testfiles ictest2.out"
+#rm -f ictest2.out
+#MakeExe ictest2
+#echo '*** Testing Intercommunicators (2) ***'
+#echo '*** Testing Intercommunicators (2) ***' >> ictest2.out
+#$mpirun $args -np 4 ictest2 $* >> ictest2.out 2>&1
+#echo '*** Testing Intercommunicators (2) ***' >> ictest2.out
+#CleanExe ictest2
+#uses MPI_Comm_test_inter and MPI_Intercomm_create
+#RunTest ictest3 4 "*** Testing Intercommunicators (3) ***"
+
+#if [ $have_fortran -eq "1" ]  ; then
+#    RunTest commnamesf 2 "*** Testing Communicator Names ***"
+#fi
+#else
+    # Just run checks
+#    testfiles=`echo *.out`
+fi
+
+echo '*** Checking for differences from expected output ***'
+CheckAllOutput context.diff
+exit 0
diff --git a/teshsuite/smpi/mpich-test/context/test.c b/teshsuite/smpi/mpich-test/context/test.c
new file mode 100644 (file)
index 0000000..f276bb6
--- /dev/null
@@ -0,0 +1,94 @@
+/* Procedures for recording and printing test results */
+
+#include <stdio.h>
+#include <string.h>
+#include "test.h"
+#include "mpi.h"
+
+static int tests_passed = 0;
+static int tests_failed = 0;
+static char failed_tests[255][81];
+static char suite_name[255];
+FILE *fileout = NULL;
+
+void Test_Init(suite, rank)
+const char *suite;
+int rank;
+{
+    char filename[512];
+
+    sprintf(filename, "%s-%d.out", suite, rank);
+    strncpy(suite_name, suite, 255);
+    fileout = fopen(filename, "w");
+    if (!fileout) {
+       fprintf( stderr, "Could not open %s on node %d\n", filename, rank );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+}
+
+void Test_Message(mess)
+const char *mess;
+{
+    fprintf(fileout, "[%s]: %s\n", suite_name, mess);
+    fflush(fileout);
+}
+
+void Test_Failed(test)
+const char *test;
+{
+    fprintf(fileout, "[%s]: *** Test '%s' Failed! ***\n", suite_name, test);
+    strncpy(failed_tests[tests_failed], test, 81);
+    fflush(fileout);
+    tests_failed++;
+}
+
+void Test_Passed(test)
+const char *test;
+{
+    fprintf(fileout, "[%s]: Test '%s' Passed.\n", suite_name, test);
+    fflush(fileout);
+    tests_passed++;
+}
+
+int Summarize_Test_Results()
+{
+    fprintf(fileout, "For test suite '%s':\n", suite_name);
+    fprintf(fileout, "Of %d attempted tests, %d passed, %d failed.\n", 
+           tests_passed + tests_failed, tests_passed, tests_failed);
+    if (tests_failed > 0) {
+       int i;
+
+       fprintf(fileout, "*** Tests Failed:\n");
+       for (i = 0; i < tests_failed; i++)
+           fprintf(fileout, "*** %s\n", failed_tests[i]);
+    }
+    return tests_failed;
+}
+
+void Test_Finalize()
+{
+    fflush(fileout);
+    fclose(fileout);
+}
+
+#include "mpi.h"
+/* Wait for every process to pass through this point.  This test is used
+   to make sure that all processes complete, and that a test "passes" because
+   it executed, not because it some process failed.  
+ */
+void Test_Waitforall( )
+{
+int m, one, myrank, n;
+
+MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
+MPI_Comm_size( MPI_COMM_WORLD, &n );
+one = 1;
+MPI_Allreduce( &one, &m, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+
+if (m != n) {
+    printf( "[%d] Expected %d processes to wait at end, got %d\n", myrank, 
+           n, m );
+    }
+if (myrank == 0) 
+    printf( "All processes completed test\n" );
+}
diff --git a/teshsuite/smpi/mpich-test/context/test.h b/teshsuite/smpi/mpich-test/context/test.h
new file mode 100644 (file)
index 0000000..1eaf6fc
--- /dev/null
@@ -0,0 +1,24 @@
+/* Header for testing procedures */
+
+#ifndef _INCLUDED_TEST_H_
+#define _INCLUDED_TEST_H_
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+void Test_Init (const char *, int);
+#ifdef USE_STDARG
+void Test_Printf (const char *, ...);
+#else
+/* No prototype */
+void Test_Printf();
+#endif
+void Test_Message (const char *);
+void Test_Failed (const char *);
+void Test_Passed (const char *);
+int Summarize_Test_Results (void);
+void Test_Finalize (void);
+void Test_Waitforall (void);
+
+#endif
diff --git a/teshsuite/smpi/mpich-test/env/CMakeLists.txt b/teshsuite/smpi/mpich-test/env/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f347298
--- /dev/null
@@ -0,0 +1,97 @@
+cmake_minimum_required(VERSION 2.6)
+
+if(enable_smpi)
+  set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc")
+  set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff")
+  set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
+  set(MPICH_FLAGS "-DHAVE_STDLIB_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DUSE_STDARG=1 -DHAVE_LONG_DOUBLE=1 -DHAVE_PROTOTYPES=1 -DHAVE_SIGNAL_H=1 -DHAVE_SIGACTION=1 -DHAVE_SLEEP=1 -DHAVE_SYSCONF=1")
+
+  include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
+  
+  add_executable(init init.c )
+  add_executable(timers timers.c test.c)
+  add_executable(timertest timertest.c test.c)
+  add_executable(baseattr baseattr.c test.c)
+  add_executable(gtime gtime.c test.c)
+  add_executable(errhand errhand.c test.c)
+  add_executable(sigchk sigchk.c test.c)
+  add_executable(aborttest aborttest.c)
+  add_executable(testerr testerr.c)
+  add_executable(getproc getproc.c)
+  if(SMPI_F2C)
+#    add_executable(baseattrf baseattrf.f)
+#    add_executable(errhandf errhandf.f)
+#    add_executable(errstringsf errstringsf.f)
+    add_executable(getprocf getprocf.f)
+  endif()
+  target_link_libraries(init m simgrid smpi )
+  target_link_libraries(timers m simgrid smpi )
+  target_link_libraries(timertest m simgrid smpi )
+  target_link_libraries(baseattr m simgrid smpi )
+  target_link_libraries(gtime m simgrid smpi )
+  target_link_libraries(errhand m simgrid smpi )
+  target_link_libraries(sigchk m simgrid smpi )
+  target_link_libraries(aborttest m simgrid smpi )
+  target_link_libraries(testerr m simgrid smpi )
+  target_link_libraries(getproc m simgrid smpi )
+  if(SMPI_F2C)
+#    target_link_libraries(baseattrf m simgrid smpi )
+#    target_link_libraries(errhandf m simgrid smpi )
+#    target_link_libraries(errstringsf m simgrid smpi )
+    target_link_libraries(getprocf m simgrid smpi )
+  endif()
+
+  set_target_properties(timers PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(timers PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(timertest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(baseattr PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(gtime PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(errhand PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(sigchk PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(aborttest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(testerr PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(getproc PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  if(SMPI_F2C)
+#    set_target_properties(baseattrf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+#    set_target_properties(errhandf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+#    set_target_properties(errstringsf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+    set_target_properties(getprocf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  endif()
+endif()
+
+set(tesh_files
+  ${tesh_files}
+  PARENT_SCOPE
+  )
+set(xml_files
+  ${xml_files}
+  PARENT_SCOPE
+  )
+set(examples_src
+  ${examples_src}
+  ${CMAKE_CURRENT_SOURCE_DIR}/test.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/init.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/timers.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/timertest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/baseattr.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/gtime.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/errhand.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/sigchk.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/aborttest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/testerr.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/getproc.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/test.h
+  ${CMAKE_CURRENT_SOURCE_DIR}/baseattrf.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/errhandf.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/errstringsf.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/getprocf.f
+  PARENT_SCOPE
+  )
+set(bin_files
+  ${bin_files}
+  PARENT_SCOPE
+  )
+set(txt_files
+  ${txt_files}
+  PARENT_SCOPE
+  )
diff --git a/teshsuite/smpi/mpich-test/env/aborttest.c b/teshsuite/smpi/mpich-test/env/aborttest.c
new file mode 100644 (file)
index 0000000..244cb9e
--- /dev/null
@@ -0,0 +1,34 @@
+#include "mpi.h"
+/* This  simple test checks that MPI_Abort kills all processes 
+ * There are two interesting cases:
+ * masternode == 0
+ * masternode != 0
+ */
+int main( int argc, char **argv )
+{
+  int node, size, i;
+  int masternode = 0;
+
+  MPI_Init(&argc, &argv);
+
+  MPI_Comm_rank(MPI_COMM_WORLD, &node);
+  MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+  /* Check for -altmaster */
+  for (i=1; i<argc; i++) {
+      if (argv[i] && strcmp( "-altmaster", argv[i] ) == 0) {
+         masternode = size-1;
+      }
+  }
+
+  if(node == masternode) {
+    MPI_Abort(MPI_COMM_WORLD, 99);
+  }
+  else {
+    /* barrier will hang since masternode never calls */
+    MPI_Barrier(MPI_COMM_WORLD);
+  }
+
+  MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/env/aborttest.std b/teshsuite/smpi/mpich-test/env/aborttest.std
new file mode 100644 (file)
index 0000000..1c27d13
--- /dev/null
@@ -0,0 +1,6 @@
+*** Tests of MPI_Abort ***
+All processes aborted
+*** Tests of MPI_Abort ***
+*** Tests of MPI_Abort (alt) ***
+All processes aborted
+*** Tests of MPI_Abort (alt) ***
diff --git a/teshsuite/smpi/mpich-test/env/argstest.c b/teshsuite/smpi/mpich-test/env/argstest.c
new file mode 100644 (file)
index 0000000..649977d
--- /dev/null
@@ -0,0 +1,19 @@
+#include <stdio.h>
+#include "mpi.h"
+
+int main( int argc, char **argv )
+{
+    int i;
+
+    fprintf(stdout,"Before MPI_Init\n");
+    for (i = 0; i < argc; i++)
+       fprintf(stdout,"arg %d is %s\n", i, argv[i]);
+
+    MPI_Init( &argc, &argv );
+
+    fprintf(stdout,"After MPI_Init\n");
+    for (i = 0; i < argc; i++)
+       fprintf(stdout,"arg %d is %s\n", i, argv[i]);
+
+    MPI_Finalize( );
+}
diff --git a/teshsuite/smpi/mpich-test/env/baseattr.c b/teshsuite/smpi/mpich-test/env/baseattr.c
new file mode 100644 (file)
index 0000000..9555fb7
--- /dev/null
@@ -0,0 +1,48 @@
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+
+int main( int argc, char **argv)
+{
+    int    err = 0;
+    void *v;
+    int  flag;
+    int  vval;
+    int  rank, size;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, &v, &flag );
+    if (!flag || (vval = *(int*)v)< 32767) {
+       err++;
+       fprintf( stderr, "Could not get TAG_UB or got too-small value\n" );
+    }
+    MPI_Attr_get( MPI_COMM_WORLD, MPI_HOST, &v, &flag );
+    vval = *(int*)v;
+    if (!flag || ((vval < 0 || vval >= size) && vval != MPI_PROC_NULL)) {
+       err++;
+       fprintf( stderr, "Could not get HOST or got invalid value\n" );
+    }
+    MPI_Attr_get( MPI_COMM_WORLD, MPI_IO, &v, &flag );
+    vval = *(int*)v;
+    if (!flag || ((vval < 0 || vval >= size) && vval != MPI_ANY_SOURCE &&
+                 vval != MPI_PROC_NULL)) {
+       err++;
+       fprintf( stderr, "Could not get IO or got invalid value\n" );
+    }
+    MPI_Attr_get( MPI_COMM_WORLD, MPI_WTIME_IS_GLOBAL, &v, &flag );
+    if (flag) {
+       /* Wtime need not be set */
+       vval = *(int*)v;
+       if (vval < 0 || vval > 1) {
+           err++;
+           fprintf( stderr, "Invalid value for WTIME_IS_GLOBAL (got %d)\n", 
+                    vval );
+       }
+    }
+    Test_Waitforall( );
+    MPI_Finalize( );
+    
+    return err;
+}
diff --git a/teshsuite/smpi/mpich-test/env/baseattrf.f b/teshsuite/smpi/mpich-test/env/baseattrf.f
new file mode 100644 (file)
index 0000000..b07935c
--- /dev/null
@@ -0,0 +1,35 @@
+
+      program main
+      integer err, ierr
+      integer v
+      logical  flag
+      integer  rank, size
+      include 'mpif.h'
+
+      err = 0
+      call MPI_Init( ierr )
+      call MPI_Comm_size( MPI_COMM_WORLD, size, ierr )
+      call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr )
+      call MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, v, flag, ierr )
+      if (.not. flag .or. v .lt. 32767) then
+         err = err + 1
+         print *, 'Could not get TAG_UB or got too-small value', v
+      endif
+c
+      call MPI_Attr_get( MPI_COMM_WORLD, MPI_HOST, v, flag, ierr )
+      if (.not. flag .or. ((v .lt. 0 .or. v .ge. size) .and.
+     *                     v .ne. MPI_PROC_NULL)) then
+         err = err + 1
+         print *, 'Could not get HOST or got invalid value', v
+      endif
+c
+      call MPI_Attr_get( MPI_COMM_WORLD, MPI_IO, v, flag, ierr )
+      if (.not. flag .or. (( v .lt. 0 .or. v .gt. size) .and.
+     *                       v .ne. MPI_PROC_NULL .and.
+     *                       v .ne. MPI_ANY_SOURCE)) then
+         err = err + 1
+         print *, 'Could not get IO or got invalid value', v
+      endif
+      call MPI_Finalize( ierr )
+
+      end
diff --git a/teshsuite/smpi/mpich-test/env/cmdline.c b/teshsuite/smpi/mpich-test/env/cmdline.c
new file mode 100644 (file)
index 0000000..87f62ed
--- /dev/null
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi.h"
+
+/* 
+   This is a test program to see if command line arguments are handled
+   well.  Note that MPI doesn't *require* anything here, so this is 
+   simply used to acess "quality of implementation"
+
+   run with arguments
+       a "b c" "d'e" 'f"g" h'
+ */
+int main( int argc, char *argv[] )
+{
+    int i, rank, toterr, err = 0;
+    static char *eargv[5];
+
+    eargv[1] = "a";
+    eargv[2] = "b c";
+    eargv[3] = "d'e";
+    eargv[4] = "f\"g\" h";
+
+    MPI_Init( &argc, &argv );
+    
+    for (i=1; i<=4; i++) {
+       if (!argv[i]) {
+           printf( "Argument %d is null!\n", i );
+           err++;
+       }
+    }
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (toterr) {
+       MPI_Abort( 1, MPI_COMM_WORLD );
+       return 0;
+    }
+
+    /* a "b c" "d'e" 'f"g" h' */
+    for (i=1; i<=4; i++) {
+       if (strcmp( argv[i], eargv[i] ) != 0) {
+           err++;
+           printf( "Found %s but expected %s\n", argv[i], eargv[i] );
+       }
+    }
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    if (rank == 0) {
+       if (toterr) printf( "Found %d errors\n", toterr );
+       else        printf( " No Errors\n" );
+    }
+    
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/env/env.std b/teshsuite/smpi/mpich-test/env/env.std
new file mode 100644 (file)
index 0000000..f421d7c
--- /dev/null
@@ -0,0 +1,10 @@
+Timer tests
+Basic attributes test
+Error handling test
+*** Error Handling ***
+    Three error messages (from two errors) are expected
+which should both show an error class of 13
+(first) 13 : Invalid group passed to function
+(errhandler) 13 : Invalid group passed to function
+(second) 13 : Invalid group passed to function
+Signal test
diff --git a/teshsuite/smpi/mpich-test/env/errhand.c b/teshsuite/smpi/mpich-test/env/errhand.c
new file mode 100644 (file)
index 0000000..fe7766c
--- /dev/null
@@ -0,0 +1,242 @@
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+
+int verbose = 0;
+int global_errors = 0;
+int Test_errorhandling (void);
+/* This is complicated by the fact that not all systems correctly 
+   implement stdargs (for the ...) declarations).  MPICH uses USE_STDARG
+   as the choice here, instead of the cases 
+ if defined(__STDC__) || defined(__cplusplus) || defined(HAVE_PROTOTYPES) 
+ */
+#if defined(USE_STDARG)
+void handler_a( MPI_Comm *, int *, ...);
+void handler_b( MPI_Comm *, int *, ...);
+void error_handler(MPI_Comm *, int *, ...);
+#else
+void handler_a ( MPI_Comm *, int * );
+void handler_b ( MPI_Comm *, int * );
+void error_handler ( MPI_Comm *, int * );
+#endif
+
+/* 
+   Test the error handers (based on a Fortran test program)
+ */
+int main( int argc, char **argv )
+{
+    MPI_Init( &argc, &argv );
+
+    Test_errorhandling();
+
+    Test_Waitforall( );
+    MPI_Finalize();
+    return 0;
+}
+
+static int a_errors, b_errors;
+
+int Test_errorhandling( void )
+{
+    char errstring[MPI_MAX_ERROR_STRING];
+    MPI_Comm dup_comm_world, dummy;
+    MPI_Comm tempcomm;
+    MPI_Errhandler errhandler_a, errhandler_b, errhandler, old_handler;
+    int  err, world_rank, class, resultlen;
+
+#ifdef FOO
+    logical test_default, test_abort
+#endif
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+    MPI_Comm_dup( MPI_COMM_WORLD, &dup_comm_world );
+
+    if (world_rank == 0 && verbose) {
+       printf( "*** Error Handling ***\n" );
+    }
+
+/*
+     Exercise save/restore of user error handlers.
+ */
+    a_errors = 0;
+    MPI_Errhandler_create(handler_a, &errhandler_a);
+
+    MPI_Errhandler_set(dup_comm_world, errhandler_a);
+    MPI_Errhandler_free(&errhandler_a);
+
+    if (verbose) printf( "create with null group 1\n" );
+    MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy);
+    if (a_errors != 1) {
+       Test_Failed( "    error handler A not invoked\n" );
+       global_errors ++;
+    }
+    b_errors = 0;
+    MPI_Errhandler_create(handler_b, &errhandler_b);
+    MPI_Errhandler_get(dup_comm_world, &old_handler);
+    /* The following is needed to preserve an old handler */
+    MPI_Comm_dup( MPI_COMM_SELF, &tempcomm );
+    MPI_Errhandler_set( tempcomm, old_handler );
+    MPI_Errhandler_set(dup_comm_world, errhandler_b);
+    MPI_Errhandler_free(&errhandler_b);
+    if (verbose) printf( "create with null group 2\n" );
+    MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy);
+    if (b_errors != 1) {
+       Test_Failed( "    error handler B not invoked\n" );
+       global_errors++;
+    }
+
+    MPI_Errhandler_set(dup_comm_world, old_handler);
+    MPI_Comm_free( &tempcomm );
+    /* MPI_Errhandler_free(&old_handler); */
+    if (verbose) printf( "create with null group 3\n" );
+    MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy);
+    if (a_errors != 2) {
+       Test_Failed( "    error handler A not re-invoked\n" );
+       global_errors++;
+    }
+/*
+      Exercise class & string interrogation.
+ */
+    MPI_Errhandler_set(dup_comm_world, MPI_ERRORS_ARE_FATAL);
+
+    if (verbose) 
+       printf( "    Three error messages (from two errors) are expected\n\
+which should both show an error class of %d\n", MPI_ERR_GROUP );
+
+    MPI_Errhandler_set(dup_comm_world, MPI_ERRORS_RETURN);
+    if (verbose) printf( "create with null group 4\n" );
+    err = MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy);
+    if (err != MPI_SUCCESS) {
+       MPI_Error_class(err, &class);
+       MPI_Error_string(err, errstring, &resultlen);
+       if (verbose)
+           printf( "(first) %d : %s\n", class, errstring );
+       else if (class != MPI_ERR_GROUP) {
+           Test_Failed( "(first) Class is not MPI_ERR_GROUP\n" );
+           global_errors++;
+       }
+    }
+    else {
+       MPI_Comm_free( &dummy );
+       Test_Failed( "Did not detect error when building communicator\n" );
+       global_errors++;
+    }
+    MPI_Errhandler_create(error_handler, &errhandler);
+    MPI_Errhandler_set(dup_comm_world, errhandler);
+    MPI_Errhandler_free(&errhandler);
+    if (verbose) printf( "create with null group 5\n" );
+    err = MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy);
+    if (err != MPI_SUCCESS) {
+       MPI_Error_class(err, &class);
+       MPI_Error_string(err, errstring, &resultlen);
+       if (verbose) 
+           printf( "(second) %d : %s\n", class, errstring );
+       else if (class != MPI_ERR_GROUP) {
+           Test_Failed( "(second) class was not MPI_ERR_GROUP" );
+           global_errors++;
+       }
+    }
+    else {
+       MPI_Comm_free( &dummy );
+       Test_Failed( "Did not detect error in building communicator\n" );
+       global_errors++;
+    }
+    MPI_Errhandler_set(dup_comm_world, MPI_ERRORS_ARE_FATAL);
+
+#ifdef FOO
+    if (test_default) {
+       printf("Forcing error for default handler...\n");
+       MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy);
+    }
+    if (test_abort) {
+       printf( "Calling MPI_Abort...\n" );
+       MPI_Abort(MPI_COMM_WORLD, 123456768);
+    }
+#endif
+
+    MPI_Comm_free( &dup_comm_world );
+
+#if 0
+    errs = global_errors;
+    MPI_Allreduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (world_rank == 0) {
+       if (toterrs == 0) 
+           printf( " No Errors\n" );
+       else
+           printf( " Found %d errors\n", toterrs );
+    }
+#endif    
+    return 0;
+}
+
+
+/*
+
+  Trivial error handler.  Note that FORTRAN error handlers can't
+  deal with the varargs stuff the C handlers can.
+ */
+#if defined(USE_STDARG)
+void error_handler(MPI_Comm *comm, int *err, ...)
+#else
+void error_handler(MPI_Comm *comm, int *err)
+#endif
+{
+    int class;
+    int resultlen;
+    char string[MPI_MAX_ERROR_STRING];
+    
+    MPI_Error_class(*err, &class);
+    MPI_Error_string(*err, string, &resultlen);
+    if (verbose) 
+       printf( "(errhandler) %d : %s\n", class, string );
+    else {
+       if (class != MPI_ERR_GROUP) {
+           printf( "(errhandler) class = %d, expected %d (MPI_ERR_GROUP)\n",
+                   class, MPI_ERR_GROUP );
+           printf( "   message %s\n", string );
+           global_errors++;
+       }
+    }
+}
+/* 
+  Error handler A, used for save/restore testing.
+ */
+
+#if defined(USE_STDARG)
+void handler_a( MPI_Comm *comm, int *err, ...)
+#else
+void handler_a(MPI_Comm *comm, int err)
+#endif
+{
+    int class;
+
+    MPI_Error_class(*err, &class);
+    if (class != MPI_ERR_GROUP) {
+       printf( "handler_a: incorrect error class %d\n", class );
+    }
+    *err = MPI_SUCCESS;
+    a_errors++;
+}
+
+/* 
+  Error handler B, used for save/restore testing.
+ */
+
+#if defined(USE_STDARG)
+void handler_b(MPI_Comm *comm, int *err, ...)
+#else
+void handler_b(comm, err)
+MPI_Comm *comm;
+int      *err;
+#endif
+{
+    int class;
+
+    MPI_Error_class(*err, &class);
+    if (class != MPI_ERR_GROUP) {
+       printf( "handler_b: incorrect error class %d\n", class );
+    }
+    *err = MPI_SUCCESS;
+    b_errors++;
+}
diff --git a/teshsuite/smpi/mpich-test/env/errhand2.c b/teshsuite/smpi/mpich-test/env/errhand2.c
new file mode 100644 (file)
index 0000000..7a9f4b9
--- /dev/null
@@ -0,0 +1,62 @@
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+
+#ifdef USE_STDARG
+void errfunc( MPI_Comm *, int *, ... );
+#else
+void errfunc( MPI_Comm *, int * );
+#endif
+
+/*
+ * Test the reference count semantics of error handlers.
+ */
+int main( int argc, char *argv[] )
+{
+    MPI_Errhandler errhandler, olderrhandler;
+    MPI_Comm       newcomm;
+    int            rc, errcnt = 0;
+
+    MPI_Init( &argc, &argv );
+
+    MPI_Comm_dup( MPI_COMM_WORLD, &newcomm );
+    MPI_Errhandler_create( errfunc, &errhandler );
+    MPI_Errhandler_set( newcomm, errhandler );
+    /* Once you set it, you should be able to free it */
+    MPI_Errhandler_free( &errhandler );
+    if (errhandler != MPI_ERRHANDLER_NULL) {
+       printf( "Freed errhandler is not set to NULL\n" );
+       errcnt++;
+    }
+    MPI_Errhandler_get( newcomm, &olderrhandler );
+    MPI_Comm_free( &newcomm );
+
+    /* olderrhandler should now be invalid.  Is it? */
+    /* This test is based on an interpretation of the MPI standard that
+       was subsequently overturned.  See the MPI-1.1 errata.  
+       An Errhandler_get is similar to an MPI_Comm_group (having the 
+       effect of creating a copy to the object). */
+    MPI_Errhandler_set( MPI_COMM_WORLD, MPI_ERRORS_RETURN );
+    rc = MPI_Errhandler_set( MPI_COMM_WORLD, olderrhandler );
+    /* In the old interpretation, the test is !rc */
+    if (rc) {
+       printf( "Olderrhandler invalid after get and comm freed!\n" );
+       errcnt ++;
+    }
+
+    if (errcnt) 
+       printf( "Found %d errors!\n", errcnt );
+    else
+       printf( " No Errors\n" );
+
+    MPI_Finalize( );
+    return 0;
+}
+
+#if defined(USE_STDARG)
+void errfunc( MPI_Comm *comm, int *err, ...)
+#else
+void errfunc( MPI_Comm *comm, int *err)
+#endif
+{
+}
diff --git a/teshsuite/smpi/mpich-test/env/errhandf.f b/teshsuite/smpi/mpich-test/env/errhandf.f
new file mode 100644 (file)
index 0000000..ad82413
--- /dev/null
@@ -0,0 +1,56 @@
+C
+C Test that error handlers can be applied and used through Fortran
+C
+      program main
+
+      include 'mpif.h'
+      integer ierr, errorclass
+      integer buf, errors, request
+C
+      call mpi_init(ierr)
+C 
+C  Try to set the errors-return handler
+C 
+      call mpi_errhandler_set(mpi_comm_world, mpi_errors_return, ierr)
+      errors = 0
+C
+C Activate the handler with a simple case
+C 
+      call mpi_send( buf, 1, MPI_INTEGER, -99, 0, MPI_COMM_WORLD, ierr )
+      if (IERR .eq. MPI_SUCCESS) then
+         errors = errors + 1
+         print *, 'MPI_Send of negative rank did not return error'
+      endif
+C
+C Check for a reasonable error message      
+      call mpi_error_class(ierr, errorclass, err)
+      if (errorclass .ne. MPI_ERR_RANK) then
+         errors = errors + 1
+         print *, 'Error class was not MPI_ERR_RANK, was ', errorclass
+      endif
+C
+C Activate the handler with a simple case
+C 
+      call mpi_irecv( buf, 1, MPI_INTEGER, -100, 2, MPI_COMM_WORLD, 
+     *                request, ierr )
+      if (IERR .eq. MPI_SUCCESS) then
+         errors = errors + 1
+         print *, 'MPI_Irecv of negative rank did not return error'
+      endif
+C
+C Check for a reasonable error message      
+      call mpi_error_class(ierr, errorclass, err)
+      if (errorclass .ne. MPI_ERR_RANK) then
+         errors = errors + 1
+         print *, 'Error class was not MPI_ERR_RANK, was ', errorclass
+      endif
+
+      if (errors .eq. 0) then
+         print *, ' No Errors'
+      else
+         print *, ' Found ', errors, ' errors'
+      endif
+C         
+      call mpi_finalize(ierr)
+C
+      end
diff --git a/teshsuite/smpi/mpich-test/env/errstringsf.f b/teshsuite/smpi/mpich-test/env/errstringsf.f
new file mode 100644 (file)
index 0000000..2f2167c
--- /dev/null
@@ -0,0 +1,48 @@
+c
+c Check the handling of error strings from Fortran
+c      
+
+      program errstringsf
+
+      include 'mpif.h'
+
+      character*(MPI_MAX_ERROR_STRING) errs
+      integer i, reslen, reserr, ierr
+
+c      
+c     Fill the string with 'x' to check that
+c     blank padding happens correctly.
+c
+      call MPI_Init( ierr )
+      do i = 1,MPI_MAX_ERROR_STRING
+         errs(i:i) = 'x'
+      end do
+
+      call mpi_error_string(mpi_err_buffer, errs, reslen, reserr)
+
+      if (errs(reslen+1:) .ne. ' ') then
+         print *,' Fortran strings are not correctly blank padded'
+         if (errs(reslen+1:reslen+1) .eq. char(0)) then
+c
+c           Very strictly interpreted, an since an error string must be 
+c           MPI_MAX_ERROR_STRING characters long, and the Fortran rules
+c           for such assignements is to blank pad them, there should not
+c           be a null character (C-like) in them.  However, the standard
+c           is ambiguous on this.  
+c
+            print *, ' Fortran strings have bogus null character'
+         end if
+      else
+         print *,' Fortran strings are assigned ok'
+      end if
+
+c     Check that the length was right
+      if (errs(reslen:reslen) .eq. ' ') then
+         print *,' Length of result is wrong'
+      else 
+         print *,' Length of result is correct'
+      end if
+
+      call MPI_Finalize( ierr )
+
+      end
diff --git a/teshsuite/smpi/mpich-test/env/errstringsf.std b/teshsuite/smpi/mpich-test/env/errstringsf.std
new file mode 100644 (file)
index 0000000..0b9177d
--- /dev/null
@@ -0,0 +1,4 @@
+*** Tests of  Fortran error strings ***
+ Fortran strings are assigned ok
+ Length of result is correct
+*** Tests of  Fortran error strings ***
diff --git a/teshsuite/smpi/mpich-test/env/getproc.c b/teshsuite/smpi/mpich-test/env/getproc.c
new file mode 100644 (file)
index 0000000..0553323
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Test get processor name
+ *
+ */
+#include "mpi.h"
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+
+int main( int argc, char *argv[] )
+{
+    char name[MPI_MAX_PROCESSOR_NAME+10];
+    int  resultlen;
+    int  err = 0;
+
+    MPI_Init( &argc, &argv );
+
+    memset( name, 0xFF, MPI_MAX_PROCESSOR_NAME+10 );
+    resultlen = 0;
+
+    MPI_Get_processor_name( name, &resultlen );
+    /* Test that name has only printing characters */
+    if (resultlen > MPI_MAX_PROCESSOR_NAME || resultlen <= 0) {
+       fprintf( stderr, "resultlen (%d) invalid\n", resultlen );
+       err++;
+    }
+    if (!err) {
+       int i;
+       for (i=0; i<resultlen; i++) {
+           if (!isprint(name[i])) {
+               fprintf( stderr, "Character number %d is not printable\n", i );
+               err++;
+           }
+       }
+       if (name[resultlen]) {
+           fprintf( stderr, "No null at end of name\n" );
+           err++;
+       }
+       for (i=resultlen+1; i<MPI_MAX_PROCESSOR_NAME+10; i++) {
+           unsigned char *usname = (unsigned char*)name;
+           if ((int)(usname[i]) != 0xFF) {
+               fprintf( stderr, "Characters changed at end of name\n" );
+               err++;
+           }
+       }
+    }
+
+    if (err) {
+       printf( " Found %d errors\n", err );
+    }
+    else {
+       printf( " No Errors\n" );
+    }
+       
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/env/getprocf.f b/teshsuite/smpi/mpich-test/env/getprocf.f
new file mode 100644 (file)
index 0000000..e7aaaa9
--- /dev/null
@@ -0,0 +1,28 @@
+      program main
+C
+C Test get processor name
+C
+      include 'mpif.h'
+      character*(MPI_MAX_PROCESSOR_NAME) name
+      integer  resultlen, ierr
+
+      call MPI_Init( ierr )
+      name = " "
+      call MPI_Get_processor_name( name, resultlen, ierr )
+C     Check that name contains only printing characters */
+C      do i=1, resultlen
+C      enddo
+      errs = 0
+      do i=resultlen+2, MPI_MAX_PROCESSOR_NAME
+         if (name(i:i) .ne. " ") then
+            print *, i
+            errs = errs + 1
+         endif
+      enddo
+      if (errs .gt. 0) then
+         print *, 'Non-blanks after name'
+      else
+         print *, ' No Errors'
+      endif
+      call MPI_Finalize( ierr )
+      end
diff --git a/teshsuite/smpi/mpich-test/env/gtime.c b/teshsuite/smpi/mpich-test/env/gtime.c
new file mode 100644 (file)
index 0000000..e755aef
--- /dev/null
@@ -0,0 +1,132 @@
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+#include <math.h>
+
+/* # define MPI_Wtime PMPI_Wtime */
+
+/*
+ * This program tests that if MPI_WTIME_IS_GLOBAL is set, the timer
+ * IS in fact global.  We have some suspicions about certain vendor systems
+ */
+
+int CheckTime( void );
+
+/*
+ * Check time tests that the timers are synchronized 
+ */
+int CheckTime( void )
+{
+    int        rank, size, i;
+    double     wtick, t1, t2, t3, delta_t;
+    int        ntest=20;
+    MPI_Status status;
+    int        err = 0;
+    double     max_diff = 0.0;
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    if (rank == 0) {
+       wtick = MPI_Wtick();
+#ifdef DEBUG
+       printf( "Wtick is %lf\n", wtick );
+#endif
+       while (ntest--) {
+           for (i=1; i<size; i++) {
+               MPI_Send( MPI_BOTTOM, 0, MPI_INT, i, 0, MPI_COMM_WORLD );
+               MPI_Recv( MPI_BOTTOM, 0, MPI_INT, i, 1, MPI_COMM_WORLD, 
+                         &status );
+               t1 = MPI_Wtime();
+               MPI_Send( &t1, 1, MPI_DOUBLE, i, 2, MPI_COMM_WORLD );
+               MPI_Recv( &t2, 1, MPI_DOUBLE, i, 3, MPI_COMM_WORLD, &status );
+               t3 = MPI_Wtime();
+#ifdef DEBUG
+               printf( "Process %d(%f) to 0(%f): diff= %f\n", 
+                       i, 0.5 * (t1 + t3), t2, 0.5*(t1+t3)-t2 );
+#endif
+               delta_t = fabs( 0.5 * (t1 + t3) - t2 );
+               if( delta_t > (t3 - t1 + wtick)) {
+                   err++;
+                   printf( "Process %d has %f; Process 0 has %f\n",
+                           i, t2, 0.5 * (t1 + t3) );
+               }
+               if (delta_t > max_diff) max_diff = delta_t;
+           }
+#ifdef DEBUG       
+           printf( "delta_t = %lf\n", delta_t );
+#endif
+           /* Release all process for the next pass */
+           for (i=1; i<size; i++) {
+               MPI_Send( MPI_BOTTOM, 0, MPI_INT, i, 3, MPI_COMM_WORLD );
+           }
+       }
+    }
+    else {
+       while (ntest--) {
+           MPI_Recv( MPI_BOTTOM, 0, MPI_INT, 0, 0, MPI_COMM_WORLD, &status );
+           MPI_Send( MPI_BOTTOM, 0, MPI_INT, 0, 1, MPI_COMM_WORLD );
+           /* Insure a symmetric transfer */
+           MPI_Recv( &t1, 1, MPI_DOUBLE, 0, 2, MPI_COMM_WORLD, &status );
+           t2 = MPI_Wtime();
+           MPI_Send( &t2, 1, MPI_DOUBLE, 0, 3, MPI_COMM_WORLD );
+           MPI_Recv( MPI_BOTTOM, 0, MPI_INT, 0, 3, MPI_COMM_WORLD, &status );
+       }
+    }
+    return err;
+}
+
+int main( int argc, char **argv )
+{
+    int    err = 0;
+    void *v;
+    int  flag;
+    int  vval;
+    int  rank;
+    double t1;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+
+    MPI_Attr_get( MPI_COMM_WORLD, MPI_WTIME_IS_GLOBAL, &v, &flag );
+#ifdef DEBUG
+    if (v) vval = *(int*)v; else vval = 0;
+    printf( "WTIME flag = %d; val = %d\n", flag, vval );
+#endif
+    if (flag) {
+       /* Wtime need not be set */
+       vval = *(int*)v;
+       if (vval < 0 || vval > 1) {
+           err++;
+           fprintf( stderr, "Invalid value for WTIME_IS_GLOBAL (got %d)\n", 
+                    vval );
+       }
+    }
+    if (flag && vval) {
+       /* Wtime is global is true.  Check it */
+#ifdef DEBUG
+       printf( "WTIME_IS_GLOBAL\n" );
+#endif 
+       err += CheckTime();
+       
+       /* Wait for 10 seconds */
+       t1 = MPI_Wtime();
+       while (MPI_Wtime() - t1 < 10.0) ;
+       
+       err += CheckTime();
+    }
+    if (rank == 0) {
+       if (err > 0) {
+           printf( "Errors in MPI_WTIME_IS_GLOBAL\n" );
+       }
+       else {
+           printf( " No Errors\n" );
+       }
+    }
+    /* The SGI implementation of MPI sometimes fails to flush stdout 
+       properly.  This fflush will work around that bug.  */
+    /* fflush( stdout ); */
+    MPI_Finalize( );
+    
+    return err;
+}
diff --git a/teshsuite/smpi/mpich-test/env/hang.c b/teshsuite/smpi/mpich-test/env/hang.c
new file mode 100644 (file)
index 0000000..36adc16
--- /dev/null
@@ -0,0 +1,15 @@
+
+#include <stdio.h>
+#include "mpi.h"
+
+int main( int argc, char **args )
+{
+  int mytid;
+    printf("doing mpi_init\n");
+    MPI_Init(&argc,&args);
+
+    MPI_Comm_rank(MPI_COMM_WORLD,&mytid);
+    if (mytid < 2) MPI_Abort( MPI_COMM_WORLD, 1 );
+    MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/env/init.c b/teshsuite/smpi/mpich-test/env/init.c
new file mode 100644 (file)
index 0000000..477494c
--- /dev/null
@@ -0,0 +1,30 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+int main( int argc, char **argv )
+{
+    int        flag;
+    MPI_Status status;
+    int        size, rank, partner, i;
+
+    for (i=0; i<2; i++ ) {
+       MPI_Initialized(&flag);
+       if(flag == 0)
+           MPI_Init(&argc,&argv);
+    }
+
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    if (size != 2) {
+       printf( "Test must be run with 2 processes\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    partner = (rank + 1) % size;
+    MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                 MPI_BOTTOM, 0, MPI_INT, partner, 0, 
+                 MPI_COMM_WORLD, &status );
+    if (rank == 0) printf( " No Errors\n" );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/env/runtests b/teshsuite/smpi/mpich-test/env/runtests
new file mode 100755 (executable)
index 0000000..3ee7e01
--- /dev/null
@@ -0,0 +1,235 @@
+#! /bin/sh
+#
+# Run some of the tests.  If any arguments are provided, pass them to the
+# test programs.
+#
+# -mvhome is needed for the ANL SP, and is ignored by others
+
+device=
+MPICH_VERSION=
+STOPFILE=${MPITEST_STOPTEST:-"$HOME/.stopmpichtests"}
+MAKE="make --no-print-directory"
+
+#
+# Set mpirun to the name/path of the mpirun program
+#FindMPIRUN
+#
+quiet=0
+runtests=1
+makeeach=0
+have_fortran=0
+writesummaryfile=no
+MAKE="make --no-print-directory"
+for arg in "$@" ; do
+    case $arg in 
+    -basedir=* )
+       basedir=`echo $arg | sed 's/-basedir=//'`
+       ;; 
+    -srcdir=* )
+       srcdir=`echo $arg | sed 's/-srcdir=//'`
+       ;; 
+       -fort=* )
+       have_fortran=`echo $arg | sed 's/-fort=//'`
+       ;;
+       -checkonly )
+       runtests=0
+       ;;
+        -margs=*)
+       margs=`echo $arg | sed 's/-margs=//'`
+       args="$args $margs"
+       ;;
+       -summaryfile=*)
+       writesummaryfile=yes
+       summaryfile=`echo A$arg | sed 's/A-summaryfile=//'`
+       ;;
+       -small)
+       makeeach=1
+       shift
+       ;;
+       -quiet)
+       shift
+       quiet=1
+       ;;
+       -help|-u)
+       echo "runtests [-checkonly] [-margs='...']"
+       echo "run tests in this directory.  If -checkonly set, just run"
+       echo "the differences check (do NO rerun the test programs)."
+       echo "If -margs is used, these options are passed to mpirun."
+       echo "If -small is used, the examples are built, run, and deleted."
+       exit 1
+       ;;
+       *)
+       if test -n "$arg" ; then
+           echo "runtests: Unknown argument ($arg)"
+           exit 1
+        fi
+       ;;
+    esac
+done
+
+mpirun=" ${basedir}/bin/smpirun -platform ${srcdir}/../../../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir}/../../hostfile  --log=root.thres:critical"
+#
+# Load basic procedures
+. ${srcdir}/../runbase
+
+# If the programs are not available, run make.
+if [ ! -x timers -a $makeeach = 0 -a $runtests = 1 ] ; then
+    $MAKE
+fi
+#
+testfiles=""
+if [ $runtests = 1 ] ; then
+
+#RunTest timers 1 "*** Timer tests ***"
+
+RunTest init 2 "*** MPI_Initialized tests ***"
+# uses MPI_Attr_get
+#RunTest baseattr 1 "*** Basic attributes ***"
+
+RunTest gtime 1 "*** WTIME_IS_GLOBAL ***"
+#uses errhandlers
+#RunTest errhand 1 "*** Tests of error handling ***"
+
+#RunTest errhand2 1 "*** Tests of error handling reference counting ***"
+
+# Do not run sigchk by default because it generates warnings that are not
+# errors, and the basic test should be clean
+if [ "$MPICH_TESTS_SIGCHK" = yes ] ; then
+    RunTest sigchk 1 "*** Tests of signals used ***"
+fi
+
+RunTest getproc 1 "*** Test Get Processor Name ***"
+
+#OutTime
+#testfiles="$testfiles cmdline.out"
+#rm -f cmdline.out
+#MakeExe cmdline
+#echo "*** Tests of command line handling ***"
+#echo "*** Tests of command line handling ***" >> cmdline.out
+#$mpirun $args -np 2 ./cmdline a "b c" "d'e" 'f"g" h' $* </dev/null l>> cmdline.out 2>&1
+#echo "*** Tests of command line handling ***" >> cmdline.out
+#CleanExe cmdline
+#if [ ! -s cmdline.stdo ] ; then
+#    cat >cmdline.stdo <<EOF
+#*** Tests of command line handling ***
+# No Errors
+#*** Tests of command line handling ***
+#EOF
+#fi
+
+#
+# If there was a Unix standard interface to ps, we could check for orphaned
+# processes...
+if ps -fwu $LOGNAME > /dev/null 2>&1 ; then
+   # This is a better choice than ps aux because it restricts the list of 
+   # processes to those of the running user.  The w is needed on some
+   # systems to get a long output for the command
+   PSPGM="ps -fwu $LOGNAME"
+elif ps -fu $LOGNAME > /dev/null 2>&1 ; then
+   # This is a better choice than ps aux because it restricts the list of 
+   # processes to those of the running user.
+   PSPGM="ps -fu $LOGNAME"
+else
+   PSPGM="ps auxww"
+fi
+OutTime
+testfiles="$testfiles aborttest.out"
+rm -f aborttest.out aborttest.p1 aborttest.p2 aborttest.out2
+MakeExe aborttest
+echo "*** Tests of MPI_Abort ***"
+echo "*** Tests of MPI_Abort ***" >> aborttest.out
+# We also remove lines that look like build lines in case this system
+# is being used for other tests.  This is incomplete, but
+# it may help reduce false positives
+$PSPGM | grep $LOGNAME | grep -v grep | grep -v runtests | \
+    grep -v 'make ' | grep -v ' /ld' | grep -v 'gcc' | \
+    grep -v 'collect2' > aborttest.p1
+# Send the output of aborttest to a file in case there is a problem
+$mpirun $args -np 2 ./aborttest $* < /dev/null >> aborttest.out2 2>&1
+# allow some time for processes to exit
+sleep 5
+$PSPGM | grep $LOGNAME | grep -v grep | grep -v runtests | \
+    grep -v 'make ' | grep -v ' /ld' | grep -v 'gcc' | \
+    grep -v 'collect2' > aborttest.p2
+# If there was a consistant format, we could process it ...
+ndiff="`cat aborttest.p1 | wc -l` - `cat aborttest.p2 | wc -l`"
+ndiff=`expr $ndiff`
+if test "$ndiff" = 0 ; then
+    echo "All processes aborted" >> aborttest.out    
+else
+    echo "Suspicious processes remain" >> aborttest.out
+    #echo "Processes before" >> aborttest.out
+    #cat aborttest.p1 >> aborttest.out
+    #echo "Processes after" >> aborttest.out
+    #cat aborttest.p2 >> aborttest.out
+    echo "Differences are" >> aborttest.out
+    diff -b aborttest.p1 aborttest.p2 >> aborttest.out
+    if [ -s aborttest.out2 ] ; then
+        echo "Output from mpirun was"
+        cat aborttest.out2 >> aborttest.out
+    fi
+    # Try to kill them
+    $PSPGM | grep $LOGNAME | grep aborttest | awk '{ print "kill ", $2 }' | sh
+fi
+echo "*** Tests of MPI_Abort ***" >> aborttest.out
+rm -f aborttest.p1 aborttest.p2 aborttest.out2
+
+OutTime
+rm -f aborttest.p1 aborttest.p2 aborttest.out2
+echo "*** Tests of MPI_Abort (alt) ***"
+echo "*** Tests of MPI_Abort (alt) ***" >> aborttest.out
+$PSPGM | grep $LOGNAME | grep -v grep | grep -v runtests | \
+    grep -v 'make ' | grep -v ' /ld' | grep -v 'gcc' | \
+    grep -v 'collect2' > aborttest.p1
+$mpirun $args -np 2 ./aborttest -altmaster $* >aborttest.out2 2>&1
+sleep 5
+$PSPGM | grep $LOGNAME | grep -v grep | grep -v runtests | \
+    grep -v 'make ' | grep -v ' /ld' | grep -v 'gcc' | \
+    grep -v 'collect2' > aborttest.p2
+ndiff="`cat aborttest.p1 | wc -l` - `cat aborttest.p2 | wc -l`"
+ndiff=`expr $ndiff`
+if test "$ndiff" = 0 ; then
+    echo "All processes aborted" >> aborttest.out    
+else
+    echo "Suspicious processes remain" >> aborttest.out
+    #echo "Processes before" >> aborttest.out
+    #cat aborttest.p1 >> aborttest.out
+    #echo "Processes after" >> aborttest.out
+    #cat aborttest.p2 >> aborttest.out
+    echo "Differences are" >> aborttest.out
+    diff -b aborttest.p1 aborttest.p2 >> aborttest.out
+    if [ -s aborttest.out2 ] ; then
+        echo "Output from mpirun was"
+        cat aborttest.out2 >> aborttest.out
+    fi
+    # Try to kill them
+    $PSPGM | grep $LOGNAME | grep aborttest | awk '{ print "kill ", $2 }' | sh
+fi
+echo "*** Tests of MPI_Abort (alt) ***" >> aborttest.out
+rm -f aborttest.p1 aborttest.p2 aborttest.out2
+CleanExe aborttest
+
+#
+# Run Fortran tests ONLY if Fortran available
+if [ $have_fortran -eq "1" ] ; then 
+
+#    RunTest errstringsf 1 "*** Tests of Fortran error strings ***"
+
+    RunTest getprocf 1 "*** Test MPI_Get_processor_name in Fortran ***"
+
+#    RunTest errhandf 1 "*** Tests of error handling in Fortran ***"
+fi
+
+else
+    # Just run checks
+    testfiles=*.out
+    if test "$testfiles" eq "*.out" ; then
+       echo "No output files remain from previous test!"
+       exit 1
+    fi
+fi
+
+#
+echo '*** Checking for differences from expected output ***'
+CheckAllOutput env.diff
+exit 0
diff --git a/teshsuite/smpi/mpich-test/env/sigchk.c b/teshsuite/smpi/mpich-test/env/sigchk.c
new file mode 100644 (file)
index 0000000..9294a05
--- /dev/null
@@ -0,0 +1,201 @@
+/* This file provides routines to check for the use of signals by software */
+
+#include <stdio.h>
+#include <signal.h>
+#include "test.h"
+#include "mpi.h"
+
+/* In order to quiet noisy C compilers, we provide ANSI-style prototypes
+   where possible */
+int SYiCheckSig ( FILE *, int, const char * );
+int SYCheckSignals ( FILE * );
+
+#ifdef HAVE_SIGACTION
+int SYiCheckSig( fp, sig, signame )
+FILE *fp;
+int  sig;
+const char *signame;
+{
+static int firstmsg = 1;
+struct sigaction libsig;
+
+sigaction( sig, NULL, &libsig);
+if (libsig.sa_handler != SIG_IGN && libsig.sa_handler != SIG_DFL) {
+    if (firstmsg) {
+       firstmsg = 0;
+       fprintf( fp, "Some signals have been changed.  This is not an error\n\
+but rather is a warning that user programs should not redefine the signals\n\
+listed here\n" );
+       }
+    fprintf( fp, "Signal %s has been changed\n", signame );
+    return 1;
+    }
+return 0;
+}
+#else
+int SYiCheckSig( fp, sig, signame )
+FILE *fp;
+int  sig;
+const char *signame;
+{
+void (*oldsig)();
+static int firstmsg = 1;
+
+oldsig = signal(sig,SIG_IGN);
+if (oldsig != SIG_IGN && oldsig != SIG_DFL) {
+    if (firstmsg) {
+       firstmsg = 0;
+       fprintf( fp, "Some signals have been changed.  This is not an error\n\
+but rather is a warning that user programs should not redefine the signals\n\
+listed here\n" );
+       }
+    fprintf( fp, "Signal %s has been changed\n", signame );
+    return 1;
+    }
+signal(sig,oldsig);
+return 0;
+}
+#endif
+
+int SYCheckSignals( fp )
+FILE *fp;
+{
+int  ndiff = 0;
+
+#ifdef SIGHUP
+ndiff += SYiCheckSig( fp, SIGHUP, "SIGHUP" );
+#endif
+
+#ifdef SIGINT
+ndiff += SYiCheckSig( fp, SIGINT, "SIGINT" );
+#endif
+
+#ifdef SIGQUIT
+ndiff += SYiCheckSig( fp, SIGQUIT, "SIGQUIT" );
+#endif
+
+#ifdef SIGILL
+ndiff += SYiCheckSig( fp, SIGILL, "SIGILL" );
+#endif
+
+#ifdef SIGTRAP
+ndiff += SYiCheckSig( fp, SIGTRAP, "SIGTRAP" );
+#endif
+
+#ifdef SIGIOT
+ndiff += SYiCheckSig( fp, SIGIOT, "SIGIOT" );
+#endif
+
+#ifdef SIGABRT
+ndiff += SYiCheckSig( fp, SIGABRT, "SIGABRT" );
+#endif
+
+#ifdef SIGEMT
+ndiff += SYiCheckSig( fp, SIGEMT, "SIGEMT" );
+#endif
+
+#ifdef SIGFPE
+ndiff += SYiCheckSig( fp, SIGFPE, "SIGFPE" );
+#endif
+
+#ifdef SIGBUS
+ndiff += SYiCheckSig( fp, SIGBUS, "SIGBUS" );
+#endif
+
+#ifdef SIGSEGV
+ndiff += SYiCheckSig( fp, SIGSEGV, "SIGSEGV" );
+#endif
+
+#ifdef SIGSYS
+ndiff += SYiCheckSig( fp, SIGSYS, "SIGSYS" );
+#endif
+
+#ifdef SIGPIPE
+ndiff += SYiCheckSig( fp, SIGPIPE, "SIGPIPE" );
+#endif
+
+#ifdef SIGALRM
+ndiff += SYiCheckSig( fp, SIGALRM, "SIGALRM" );
+#endif
+
+#ifdef SIGTERM
+ndiff += SYiCheckSig( fp, SIGTERM, "SIGTERM" );
+#endif
+
+#ifdef SIGURG
+ndiff += SYiCheckSig( fp, SIGURG, "SIGURG" );
+#endif
+
+#ifdef SIGTSTP
+ndiff += SYiCheckSig( fp, SIGTSTP, "SIGTSTP" );
+#endif
+
+#ifdef SIGCONT
+ndiff += SYiCheckSig( fp, SIGCONT, "SIGCONT" );
+#endif
+
+#ifdef SIGCHLD
+ndiff += SYiCheckSig( fp, SIGCHLD, "SIGCHLD" );
+#endif
+
+#ifdef SIGTTIN
+ndiff += SYiCheckSig( fp, SIGTTIN, "SIGTTIN" );
+#endif
+
+#ifdef SIGTTOU
+ndiff += SYiCheckSig( fp, SIGTTOU, "SIGTTOU" );
+#endif
+
+#ifdef SIGIO
+ndiff += SYiCheckSig( fp, SIGIO, "SIGIO" );
+#endif
+
+#ifdef SIGPOLL
+ndiff += SYiCheckSig( fp, SIGPOLL, "SIGPOLL" );
+#endif
+
+#ifdef SIGXCPU
+ndiff += SYiCheckSig( fp, SIGXCPU, "SIGXCPU" );
+#endif
+
+#ifdef SIGXFSZ
+ndiff += SYiCheckSig( fp, SIGXFSZ, "SIGXFSZ" );
+#endif
+
+#ifdef SIGVTALRM
+ndiff += SYiCheckSig( fp, SIGVTALRM, "SIGVTALRM" );
+#endif
+
+#ifdef SIGPROF
+ndiff += SYiCheckSig( fp, SIGPROF, "SIGPROF" );
+#endif
+
+#ifdef SIGWINCH
+ndiff += SYiCheckSig( fp, SIGWINCH, "SIGWINCH" );
+#endif
+
+#ifdef SIGLOST
+ndiff += SYiCheckSig( fp, SIGLOST, "SIGLOST" );
+#endif
+
+#ifdef SIGUSR1
+ndiff += SYiCheckSig( fp, SIGUSR1, "SIGUSR1" );
+#endif
+
+#ifdef SIGUSR2
+ndiff += SYiCheckSig( fp, SIGUSR2, "SIGUSR2" );
+#endif
+
+return ndiff;
+}
+
+
+int main( int argc, char **argv )
+{
+    int err;
+    MPI_Init( &argc, &argv );
+    err = SYCheckSignals( stdout );
+    Test_Waitforall( );
+    MPI_Finalize();
+    return err;
+}
diff --git a/teshsuite/smpi/mpich-test/env/test.c b/teshsuite/smpi/mpich-test/env/test.c
new file mode 100644 (file)
index 0000000..e1b8925
--- /dev/null
@@ -0,0 +1,130 @@
+/* Procedures for recording and printing test results */
+
+#include <stdio.h>
+#include <string.h>
+#include "test.h"
+#include "mpi.h"
+
+#if defined(USE_STDARG)
+#include <stdarg.h>
+#endif
+
+static int tests_passed = 0;
+static int tests_failed = 0;
+static char failed_tests[255][81];
+static char suite_name[255];
+FILE *fileout = NULL;
+
+void Test_Init(suite, rank)
+char *suite;
+int rank;
+{
+    char filename[512];
+
+    sprintf(filename, "%s-%d.out", suite, rank);
+    strncpy(suite_name, suite, 255);
+    fileout = fopen(filename, "w");
+    if (!fileout) {
+       fprintf( stderr, "Could not open %s on node %d\n", filename, rank );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+}
+
+#ifdef USE_STDARG
+void Test_Printf(char *format, ...)
+{
+    va_list arglist;
+
+    va_start(arglist, format);
+    (void)vfprintf(fileout, format, arglist);
+    va_end(arglist);
+}
+#else
+void Test_Printf(va_alist)
+va_dcl
+{
+    char *format;
+    va_list arglist;
+
+    va_start(arglist);
+    format = va_arg(arglist, char *);
+    (void)vfprintf(fileout, format, arglist);
+    fflush(fileout);
+    va_end(arglist);
+}
+#endif
+
+void Test_Message(mess)
+const char *mess;
+{
+    fprintf(fileout, "[%s]: %s\n", suite_name, mess);
+    fflush(fileout);
+}
+
+void Test_Failed(test)
+const char *test;
+{
+    fprintf(fileout, "[%s]: *** Test '%s' Failed! ***\n", suite_name, test);
+    strncpy(failed_tests[tests_failed], test, 81);
+    fflush(fileout);
+    tests_failed++;
+}
+
+void Test_Passed(test)
+const char *test;
+{
+#ifdef VERBOSE
+    fprintf(fileout, "[%s]: Test '%s' Passed.\n", suite_name, test);
+    fflush(fileout);
+#endif
+    tests_passed++;
+}
+
+int Summarize_Test_Results()
+{
+#ifdef VERBOSE
+    fprintf(fileout, "For test suite '%s':\n", suite_name);
+#else
+    if (tests_failed > 0)
+#endif
+    {
+       fprintf(fileout, "Of %d attempted tests, %d passed, %d failed.\n", 
+               tests_passed + tests_failed, tests_passed, tests_failed);
+    }
+    if (tests_failed > 0) {
+       int i;
+
+       fprintf(fileout, "*** Tests Failed:\n");
+       for (i = 0; i < tests_failed; i++)
+           fprintf(fileout, "*** %s\n", failed_tests[i]);
+    }
+    return tests_failed;
+}
+
+void Test_Finalize()
+{
+    fflush(fileout);
+    fclose(fileout);
+}
+
+#include "mpi.h"
+/* Wait for every process to pass through this point.  This test is used
+   to make sure that all processes complete, and that a test "passes" because
+   it executed, not because it some process failed.  
+ */
+void Test_Waitforall( )
+{
+int m, one, myrank, n;
+
+MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
+MPI_Comm_size( MPI_COMM_WORLD, &n );
+one = 1;
+MPI_Allreduce( &one, &m, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+
+if (m != n) {
+    printf( "[%d] Expected %d processes to wait at end, got %d\n", myrank, 
+           n, m );
+    }
+if (myrank == 0) 
+    printf( " No Errors\n" );
+}
diff --git a/teshsuite/smpi/mpich-test/env/test.h b/teshsuite/smpi/mpich-test/env/test.h
new file mode 100644 (file)
index 0000000..87bcde3
--- /dev/null
@@ -0,0 +1,24 @@
+/* Header for testing procedures */
+
+#ifndef _INCLUDED_TEST_H_
+#define _INCLUDED_TEST_H_
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+void Test_Init (char *, int);
+#ifdef USE_STDARG
+void Test_Printf (char *, ...);
+#else
+/* No prototype */
+void Test_Printf();
+#endif
+void Test_Message (const char *);
+void Test_Failed (const char *);
+void Test_Passed (const char *);
+int Summarize_Test_Results (void);
+void Test_Finalize (void);
+void Test_Waitforall (void);
+
+#endif
diff --git a/teshsuite/smpi/mpich-test/env/testerr.c b/teshsuite/smpi/mpich-test/env/testerr.c
new file mode 100644 (file)
index 0000000..fa6ead6
--- /dev/null
@@ -0,0 +1,170 @@
+#include <stdio.h>
+#include "mpi.h"
+/* Test error handling.  This is MPICH specific */
+void Test_Send( void );
+void Test_Recv( void );
+void Test_Datatype( void );
+void Test_Errors_warn( MPI_Comm *comm, int *code, ... );
+void Test_Failed( const char * msg );
+void Test_Passed(const char * msg );
+
+void Test_Errors_warn( MPI_Comm *comm, int *code, ... )
+{  
+  char buf[MPI_MAX_ERROR_STRING+1];
+  int  result_len; 
+  static int in_handler = 0;
+
+  if (in_handler) return;
+  in_handler = 1;
+  /* Convert code to message and print */
+  MPI_Error_string( *code, buf, &result_len );
+  printf( "%s\n", buf );
+  in_handler = 0;
+}  
+
+static int errcount = 0;
+void Test_Failed( const char * msg )
+{
+    printf( "FAILED: %s\n", msg );
+    errcount++;
+}
+void Test_Passed(const char * msg )
+{
+    printf( "Passed: %s\n", msg );
+}
+
+int main( int argc, char *argv[] )
+{
+    MPI_Errhandler TEST_ERRORS_WARN;
+
+    MPI_Init( &argc, &argv );
+
+    MPI_Errhandler_create( Test_Errors_warn, &TEST_ERRORS_WARN );
+    MPI_Errhandler_set(MPI_COMM_WORLD, TEST_ERRORS_WARN);
+
+    Test_Send();
+
+    Test_Recv();
+
+    Test_Datatype();
+
+    MPI_Finalize();
+
+    return 0;
+}
+
+void Test_Send( void )
+{
+    int buffer[100];
+    int dest;
+    MPI_Datatype bogus_type = MPI_DATATYPE_NULL;
+    int myrank, size;
+    int large_tag, flag, small_tag;
+    int *tag_ubp;
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    dest = size - 1;
+
+    if (MPI_Send(buffer, 20, MPI_INT, dest,
+                1, MPI_COMM_NULL) == MPI_SUCCESS){
+       Test_Failed("NULL Communicator Test");
+    }
+    else
+       Test_Passed("NULL Communicator Test");
+
+    if (MPI_Send(buffer, -1, MPI_INT, dest,
+                1, MPI_COMM_WORLD) == MPI_SUCCESS){
+       Test_Failed("Invalid Count Test");
+    }
+    else
+       Test_Passed("Invalid Count Test");
+
+    if (MPI_Send(buffer, 20, bogus_type, dest,
+                1, MPI_COMM_WORLD) == MPI_SUCCESS){
+       Test_Failed("Invalid Type Test");
+    }
+    else
+       Test_Passed("Invalid Type Test");
+
+    small_tag = -1;
+    if (small_tag == MPI_ANY_TAG) small_tag = -2;
+    if (MPI_Send(buffer, 20, MPI_INT, dest, 
+                small_tag, MPI_COMM_WORLD) == MPI_SUCCESS) {
+        Test_Failed("Invalid Tag Test");
+    }
+    else
+       Test_Passed("Invalid Tag Test");
+
+    /* Form a tag that is too large */
+    MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, (void **)&tag_ubp, &flag );
+    if (!flag) Test_Failed("Could not get tag ub!" );
+    large_tag = *tag_ubp + 1;
+    if (large_tag > *tag_ubp) {
+       if (MPI_Send(buffer, 20, MPI_INT, dest, 
+                    -1, MPI_COMM_WORLD) == MPI_SUCCESS) {
+           Test_Failed("Invalid Tag Test");
+           }
+       else
+           Test_Passed("Invalid Tag Test");
+       }
+
+    if (MPI_Send(buffer, 20, MPI_INT, 300,
+                1, MPI_COMM_WORLD) == MPI_SUCCESS) {
+       Test_Failed("Invalid Destination Test");
+    }
+    else
+       Test_Passed("Invalid Destination Test");
+
+    if (MPI_Send((void *)0, 10, MPI_INT, dest,
+                1, MPI_COMM_WORLD) == MPI_SUCCESS){
+       Test_Failed("Invalid Buffer Test (send)");
+    }
+    else
+       Test_Passed("Invalid Buffer Test (send)");
+}
+
+void Test_Recv( void )
+{
+}
+
+void Test_Datatype( void )
+{
+}
+    
+#ifdef FOO
+void
+ReceiverTest3()
+{
+    int buffer[20];
+    MPI_Datatype bogus_type = MPI_DATATYPE_NULL;
+    MPI_Status status;
+    int myrank;
+    int *tag_ubp;
+    int large_tag, flag, small_tag;
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
+
+    if (myrank == 0) {
+       fprintf( stderr, 
+"There should be eight error messages about invalid communicator\n\
+count argument, datatype argument, tag, rank, buffer send and buffer recv\n" );
+       }
+
+    /* A receive test might not fail until it is triggered... */
+    if (MPI_Recv((void *)0, 10, MPI_INT, src,
+                15, MPI_COMM_WORLD, &status) == MPI_SUCCESS){
+       Test_Failed("Invalid Buffer Test (recv)");
+    }
+    else
+       Test_Passed("Invalid Buffer Test (recv)");
+
+    /* Just to keep things happy, see if there is a message to receive */
+    { int flag, ibuf[10];
+
+    MPI_Iprobe( src, 15, MPI_COMM_WORLD, &flag, &status );
+    if (flag) 
+       MPI_Recv( ibuf, 10, MPI_INT, src, 15, MPI_COMM_WORLD, &status );
+    }
+    return;
+#endif
diff --git a/teshsuite/smpi/mpich-test/env/timers.c b/teshsuite/smpi/mpich-test/env/timers.c
new file mode 100644 (file)
index 0000000..810cbfe
--- /dev/null
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi.h"
+#include "test.h"
+#ifdef HAVE_WINDOWS_H
+#define sleep(a_) Sleep((a_)*1000)
+#include <windows.h>
+#endif
+
+int main( int argc, char **argv )
+{
+    int    err = 0;
+    double t1, t2;
+    double tick;
+    int    i;
+
+    MPI_Init( &argc, &argv );
+    t1 = MPI_Wtime();
+    t2 = MPI_Wtime();
+    if (t2 - t1 > 0.1 || t2 - t1 < 0.0) {
+       err++;
+       fprintf( stderr, 
+                "Two successive calls to MPI_Wtime gave strange results: (%f) (%f)\n", 
+                t1, t2 );
+    }
+/* Try several times to get a 1 second sleep */
+    for (i = 0; i<10; i++) {
+       t1 = MPI_Wtime();
+       sleep(1);
+       t2 = MPI_Wtime();
+       if (t2 - t1 >= (1.0 - 0.01) && t2 - t1 <= 5.0) break;
+       if (t2 - t1 > 5.0) i = 9;
+    }
+    if (i == 10) {
+       fprintf( stderr, 
+                "Timer around sleep(1) did not give 1 second; gave %f\n",
+             t2 - t1 );
+       fprintf( stderr, "If the sigchk check shows that SIGALRM is in use, \n\
+this indicates only that user programs must NOT use any system call or\n\
+library that uses SIGALRM.  SIGALRM is not used by MPICH but may be used\n\
+by the software the MPICH uses to implement communication to other \n\
+processes\n" );
+       err++;
+    } 
+    tick = MPI_Wtick();
+    if (tick > 1.0 || tick <= 0.0) {
+       err++;
+       fprintf( stderr, "MPI_Wtick gave a strange result: (%f)\n", tick );
+    }
+    Test_Waitforall( );
+    MPI_Finalize( );
+    
+    return err;
+}
diff --git a/teshsuite/smpi/mpich-test/env/timertest.c b/teshsuite/smpi/mpich-test/env/timertest.c
new file mode 100644 (file)
index 0000000..04f49fc
--- /dev/null
@@ -0,0 +1,35 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi.h"
+#include "test.h"
+#ifdef HAVE_WINDOWS_H
+#define sleep(a_) Sleep((a_)*1000)
+#include <windows.h>
+#endif
+
+int main( int argc, char **argv )
+{
+    double t1, t2;
+    double tick;
+    int    i;
+
+    MPI_Init( &argc, &argv );
+    t1 = MPI_Wtime();
+    t2 = MPI_Wtime();
+    fprintf( stdout, "Two successive calls to MPI_Wtime gave: (%f) (%f)\n", 
+               t1, t2 );
+    fprintf( stdout, "Five approximations to one second:\n");
+    for (i = 0; i < 5; i++)
+    {
+       t1 = MPI_Wtime();
+       sleep(1);
+       t2 = MPI_Wtime();
+       fprintf( stdout, "%f seconds\n", t2 - t1 );
+    } 
+    tick = MPI_Wtick();
+    fprintf( stdout, "MPI_Wtick gave: (%10.8f)\n", tick );
+
+    MPI_Finalize( );
+
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/profile/CMakeLists.txt b/teshsuite/smpi/mpich-test/profile/CMakeLists.txt
new file mode 100644 (file)
index 0000000..5d904ae
--- /dev/null
@@ -0,0 +1,43 @@
+cmake_minimum_required(VERSION 2.6)
+
+if(enable_smpi)
+  set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc")
+
+  set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
+  set(MPICH_FLAGS "-DHAVE_STDLIB_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DUSE_STDARG=1 -DHAVE_LONG_DOUBLE=1 -DHAVE_PROTOTYPES=1 -DHAVE_SIGNAL_H=1 -DHAVE_SIGACTION=1 -DHAVE_SLEEP=1 -DHAVE_SYSCONF=1")
+
+  include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
+  
+  add_executable(ptest ptest.c )
+  add_executable(colluses colluses.c )
+
+  target_link_libraries(ptest m simgrid smpi )
+  target_link_libraries(colluses m simgrid smpi )
+
+  set_target_properties(ptest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(colluses PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+endif()
+
+set(tesh_files
+  ${tesh_files}
+  PARENT_SCOPE
+  )
+set(xml_files
+  ${xml_files}
+  PARENT_SCOPE
+  )
+set(examples_src
+  ${examples_src}
+  ${CMAKE_CURRENT_SOURCE_DIR}/ptest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/colluses.c
+  PARENT_SCOPE
+  )
+set(bin_files
+  ${bin_files}
+  PARENT_SCOPE
+  )
+set(txt_files
+  ${txt_files}
+  PARENT_SCOPE
+  )
diff --git a/teshsuite/smpi/mpich-test/profile/colluses.c b/teshsuite/smpi/mpich-test/profile/colluses.c
new file mode 100644 (file)
index 0000000..a76604e
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * This file checks to see if the collective routine MPI_Allreduce uses
+ * MPI_Send or MPI_Isend to implement the operation.  It should use either
+ * a PMPI routine or a non-MPI routine.  
+ */
+
+#include "mpi.h"
+#include <stdio.h>
+
+static int used_send = 0,
+           used_isend = 0,
+           used_sendrecv = 0;
+int main( int argc, char *argv[] )
+{
+    int in, out;
+    int rank;
+    int in_sends[3], out_sends[3];
+
+    MPI_Init( &argc, &argv );
+    
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    in = 1;
+    MPI_Allreduce( &in, &out, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+
+    /* Now, see whether MPI routines were used */
+    in_sends[0] = used_send;
+    in_sends[1] = used_isend;
+    in_sends[2] = used_sendrecv;
+    MPI_Reduce( in_sends, out_sends, 3, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD );
+    if (rank == 0) {
+       int errs = 0;
+       if (in_sends[0] > 0) {
+           printf( " Allreduce used MPI_SEND (%d)\n", in_sends[0] );
+           errs++;
+       }
+       if (in_sends[1] > 0) {
+           printf( " Allreduce used MPI_ISEND (%d)\n", in_sends[1] );
+           errs++;
+       }
+       if (in_sends[2] > 0) {
+           printf( " Allreduce used MPI_SENDRECV (%d)\n", in_sends[2] );
+           errs++;
+       }
+       if (!errs) {
+           printf( " No Errors\n" );
+       }
+    }
+
+    MPI_Finalize( );
+    return 0;
+}
+
+/* 
+ * Replacements for MPI_Send, Isend, and Sendrecv that detect their use
+ */
+
+int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, 
+             int tag, MPI_Comm comm )
+{
+    used_send++;
+    return PMPI_Send( buf, count, datatype, dest, tag, comm );
+}
+
+int MPI_Sendrecv( void *sendbuf, int sendcount, MPI_Datatype sendtype, 
+                 int dest, int sendtag, 
+                  void *recvbuf, int recvcount, MPI_Datatype recvtype, 
+                 int source, int recvtag, MPI_Comm comm, MPI_Status *status )
+{
+    used_sendrecv++;
+    return PMPI_Sendrecv( sendbuf, sendcount, sendtype, dest, sendtag, 
+                         recvbuf, recvcount, recvtype, source, recvtag, 
+                         comm, status ); 
+}
+
+int MPI_Isend( void *buf, int count, MPI_Datatype datatype, int dest, int tag,
+              MPI_Comm comm, MPI_Request *request )
+{
+    used_isend++;
+    return PMPI_Isend( buf, count, datatype, dest, tag, comm, request );
+}
+
diff --git a/teshsuite/smpi/mpich-test/profile/ptest.c b/teshsuite/smpi/mpich-test/profile/ptest.c
new file mode 100644 (file)
index 0000000..672742c
--- /dev/null
@@ -0,0 +1,21 @@
+#include <stdio.h>
+#include "mpi.h"
+
+/* Header for testing procedures */
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+/*
+ * This tests for the existence of MPI_Pcontrol; nothing more.
+ */
+int main( int argc, char **argv )
+{
+    MPI_Init( &argc, &argv );
+    
+    MPI_Pcontrol( 0 );
+    printf( "Pcontrol test passed\n" );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/profile/ptest.std b/teshsuite/smpi/mpich-test/profile/ptest.std
new file mode 100644 (file)
index 0000000..1c13f91
--- /dev/null
@@ -0,0 +1 @@
+Pcontrol test passed
diff --git a/teshsuite/smpi/mpich-test/profile/runtests b/teshsuite/smpi/mpich-test/profile/runtests
new file mode 100755 (executable)
index 0000000..051cf5f
--- /dev/null
@@ -0,0 +1,118 @@
+#! /bin/sh
+#
+# Run some of the tests.  If any arguments are provided, pass them to the
+# test programs.
+#
+# -mvhome is needed for the ANL SP, and is ignored by others
+args=
+device=
+MPICH_VERSION=
+STOPFILE=${MPITEST_STOPTEST:-"$HOME/.stopmpichtests"}
+
+MAKE="make --no-print-directory"
+MPIRUNMVBACK=""
+#
+
+#
+# Set mpirun to the name/path of the mpirun program
+#FindMPIRUN
+#if [ -z "$mpirun" ] ; then
+#    echo "No mpirun in path.  Testing cannot proceed."
+#    exit 1
+#fi
+#
+# If the programs are not available, run make.
+runtests=1
+makeeach=0
+writesummaryfile=no
+quiet=0
+have_fortran=0
+check_at_once=1
+MAKE="make --no-print-directory"
+for arg in "$@" ; do
+    case $arg in 
+    -basedir=* )
+       basedir=`echo $arg | sed 's/-basedir=//'`
+       ;; 
+    -srcdir=* )
+       srcdir=`echo $arg | sed 's/-srcdir=//'`
+       ;; 
+       -fort=* )
+       have_fortran=`echo $arg | sed 's/-fort=//'`
+       ;;
+       -checkonly)
+       runtests=0
+       ;;
+    -margs=*)
+       margs=`echo $arg | sed 's/-margs=//'`
+       args="$args $margs"
+       ;;
+       -summaryfile=*)
+       writesummaryfile=yes
+       summaryfile=`echo A$arg | sed 's/A-summaryfile=//'`
+       ;;
+       -echo)
+       set -x
+       ;;
+       -small)
+       makeeach=1
+       ;;
+       -quiet)
+       shift
+       quiet=1
+       ;;
+       -atend)
+       check_at_once=0
+       ;;
+       -help|-u)
+       echo "runtests [-checkonly] [-margs='...'] [-atend]"
+       echo "run tests in this directory.  If -checkonly set, just run"
+       echo "the differences check (do NO rerun the test programs)."
+       echo "If -margs is used, these options are passed to mpirun."
+       echo "If -small is used, the examples are built, run, and deleted."
+       echo "If -atend is used, the success of the tests is checked only"
+       echo "at the end of the test rather than also after each test."
+       exit 1
+       ;;
+       *)
+       if test -n "$arg" ; then
+           echo "Passing remaining arguments to programs ($*)"
+           break
+        fi
+       ;;
+    esac
+done
+
+
+# Load basic procedures
+. ${srcdir}/../runbase
+
+mpirun=" ${basedir}/bin/smpirun -platform ${srcdir}/../../../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir}/../../hostfile  --log=root.thres:critical"
+# If the programs are not available, run make.
+#if [ ! -x sendrecv -a $makeeach = 0 -a $runtests = 1 ] ; then
+#    $MAKE default
+#fi
+
+testfiles=""
+if [ $runtests = 1 ] ; then
+echo '**** Testing MPI Profiling routines ****'
+#just a test for  MPI_Pcontrol, which is not implemented
+RunTest ptest 1 "**** Testing MPI_Pcontrol ****"
+
+RunTest colluses 4 "**** Testing for PMPI in Allreduce ****"
+
+else
+    # Just run checks
+    testfiles=`echo *.out`
+    if test "$testfiles" = "*.out" ; then
+       echo "No output files remain from previous test!"
+       exit 1
+    fi
+fi
+#
+echo '*** Checking for differences from expected output ***'
+CheckAllOutput profile.diff
+exit 0
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/CMakeLists.txt b/teshsuite/smpi/mpich-test/pt2pt/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4c431ef
--- /dev/null
@@ -0,0 +1,405 @@
+cmake_minimum_required(VERSION 2.6)
+
+if(enable_smpi)
+  set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc")
+  set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff")
+  set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
+  set(MPICH_FLAGS "-DHAVE_STDLIB_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DUSE_STDARG=1 -DHAVE_LONG_DOUBLE=1 -DHAVE_PROTOTYPES=1 -DHAVE_SIGNAL_H=1 -DHAVE_SIGACTION=1 -DHAVE_SLEEP=1 -DHAVE_SYSCONF=1")
+
+  include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
+  add_executable(overtake overtake.c test.c)
+  add_executable(bsendtest bsendtest.c test.c)
+  add_executable(relrank relrank.c test.c)
+  add_executable(sendrecv_mpich sendrecv.c test.c)
+  add_executable(persistent persistent.c)
+  add_executable(flood flood.c test.c)
+  add_executable(flood2 flood2.c test.c)
+  add_executable(persist persist.c)
+  add_executable(persist2 persist2.c)
+  add_executable(sendrecv2 sendrecv2.c dtypes.c gcomm.c)
+  add_executable(sendrecv3 sendrecv3.c dtypes.c gcomm.c)
+  add_executable(sendrecv4 sendrecv4.c dtypes.c gcomm.c)
+  add_executable(irsend irsend.c dtypes.c gcomm.c)
+  add_executable(irsendinit irsendinit.c dtypes.c gcomm.c)
+  add_executable(longmsgs longmsgs.c)
+  add_executable(testsome testsome.c dtypes.c gcomm.c)
+  add_executable(testall_mpich testall.c dtypes.c gcomm.c)
+  add_executable(sndrcv sndrcv.c dtypes.c gcomm.c)
+  add_executable(sndrcvrep sndrcvrep.c)
+  add_executable(sndrcvrpl2 sndrcvrpl2.c)
+  add_executable(getelm getelm.c )
+  add_executable(self self.c test.c)
+  add_executable(typelb typelb.c test.c)
+  add_executable(structlb structlb.c test.c)
+  add_executable(typeub typeub.c test.c)
+  add_executable(typeub2 typeub2.c)
+  add_executable(typeub3 typeub3.c)
+  add_executable(typecreate typecreate.c)
+  add_executable(reqcreate reqcreate.c)
+  add_executable(reqfree reqfree.c)
+  add_executable(isndrcv isndrcv.c test.c)
+  add_executable(nullproc nullproc.c)
+  add_executable(nullproc2 nullproc2.c)
+  add_executable(trunc trunc.c)
+  add_executable(truncmult truncmult.c)
+  add_executable(typetest typetest.c test.c)
+  add_executable(typebase typebase.c)
+  add_executable(ssendtest ssendtest.c test.c)
+  add_executable(ssendtest2 ssendtest2.c)
+  add_executable(issendtest issendtest.c test.c)
+  add_executable(issend2 issend2.c)
+  add_executable(issendinit issendinit.c test.c)
+  add_executable(testtypes testtypes.c test.c)
+  add_executable(dataalign dataalign.c)
+  add_executable(dtyperecv dtyperecv.c)
+  add_executable(dtypelife dtypelife.c test.c)
+  add_executable(htmsg htmsg.c)
+  add_executable(isendtest isendtest.c)
+  add_executable(third third.c test.c)
+  add_executable(fourth fourth.c test.c)
+  add_executable(fifth fifth.c test.c)
+  add_executable(sixth sixth.c test.c)
+  add_executable(probe probe.c test.c)
+  add_executable(nblock nblock.c )
+  add_executable(sendmany sendmany.c) 
+  add_executable(order order.c)
+  add_executable(pack pack.c)
+  add_executable(probe1 probe1.c test.c)
+  add_executable(testtest1 testtest1.c test.c) 
+  add_executable(hvectest hvectest.c test.c)
+  add_executable(hvectest2 hvectest2.c test.c)
+  add_executable(hvec hvec.c)
+  add_executable(hindexed hindexed.c) 
+  add_executable(irecvtest irecvtest.c test.c)
+  add_executable(nbtest nbtest.c)
+  add_executable(waitany waitany.c)
+  add_executable(waitall waitall.c)
+  add_executable(waitall2 waitall2.c)
+  add_executable(waitall3 waitall3.c)
+  add_executable(waitall4 waitall4.c)
+  add_executable(commit commit.c)
+  add_executable(cancel cancel.c)
+  add_executable(cancel2 cancel2.c)
+  add_executable(cancel3 cancel3.c)
+  add_executable(cancelmessages cancelmessages.c)
+  add_executable(cancelibm cancelibm.c)
+  add_executable(cancelissend cancelissend.c)
+  add_executable(sendorder sendorder.c)
+  add_executable(exittest exittest.c)
+  add_executable(selfvsworld selfvsworld.c)
+  if(SMPI_F2C)
+    add_executable(secondf secondf.f)
+#    add_executable(allpair2 allpair2.f)
+#    add_executable(allpair allpair.f)
+    add_executable(isendf isendf.f)
+    add_executable(pingpong_f pingpong.f)
+    add_executable(send1 send1.f)
+    add_executable(sendcplx sendcplx.f)
+    add_executable(sendfort sendfort.f)
+#    add_executable(structf structf.f)
+    add_executable(typebasef typebasef.f)
+  endif()
+
+  target_link_libraries(overtake m simgrid smpi )
+  target_link_libraries(bsendtest m simgrid smpi )
+  target_link_libraries(relrank m simgrid smpi )
+  target_link_libraries(sendrecv_mpich m simgrid smpi )
+  target_link_libraries(persistent m simgrid smpi )
+  target_link_libraries(flood m simgrid smpi )
+  target_link_libraries(flood2 m simgrid smpi )
+  target_link_libraries(persist m simgrid smpi )
+  target_link_libraries(persist2 m simgrid smpi )
+  target_link_libraries(sendrecv2 m simgrid smpi )
+  target_link_libraries(sendrecv3 m simgrid smpi )
+  target_link_libraries(sendrecv4 m simgrid smpi )
+  target_link_libraries(irsend m simgrid smpi )
+  target_link_libraries(irsendinit m simgrid smpi )
+  target_link_libraries(longmsgs m simgrid smpi )
+  target_link_libraries(testsome m simgrid smpi )
+  target_link_libraries(testall_mpich m simgrid smpi )
+  target_link_libraries(sndrcv m simgrid smpi )
+  target_link_libraries(sndrcvrep m simgrid smpi )
+  target_link_libraries(sndrcvrpl2 m simgrid smpi )
+  target_link_libraries(getelm m simgrid smpi )
+  target_link_libraries(self m simgrid smpi )
+  target_link_libraries(typelb m simgrid smpi )
+  target_link_libraries(structlb m simgrid smpi )
+  target_link_libraries(typeub m simgrid smpi )
+  target_link_libraries(typeub2 m simgrid smpi )
+  target_link_libraries(typeub3 m simgrid smpi )
+  target_link_libraries(typecreate m simgrid smpi )
+  target_link_libraries(reqcreate m simgrid smpi )
+  target_link_libraries(reqfree m simgrid smpi )
+  target_link_libraries(isndrcv m simgrid smpi )
+  target_link_libraries(nullproc m simgrid smpi )
+  target_link_libraries(nullproc2 m simgrid smpi )
+  target_link_libraries(trunc m simgrid smpi )
+  target_link_libraries(truncmult m simgrid smpi )
+  target_link_libraries(typetest m simgrid smpi )
+  target_link_libraries(typebase m simgrid smpi )
+  target_link_libraries(ssendtest m simgrid smpi )
+  target_link_libraries(ssendtest2 m simgrid smpi )
+  target_link_libraries(issendtest m simgrid smpi )
+  target_link_libraries(issend2 m simgrid smpi )
+  target_link_libraries(issendinit m simgrid smpi )
+  target_link_libraries(testtypes m simgrid smpi )
+  target_link_libraries(dataalign m simgrid smpi )
+  target_link_libraries(dtyperecv m simgrid smpi )
+  target_link_libraries(dtypelife m simgrid smpi )
+  target_link_libraries(htmsg m simgrid smpi )
+  target_link_libraries(isendtest m simgrid smpi )
+  target_link_libraries(third m simgrid smpi )
+  target_link_libraries(fourth m simgrid smpi )
+  target_link_libraries(fifth m simgrid smpi )
+  target_link_libraries(sixth m simgrid smpi )
+  target_link_libraries(probe m simgrid smpi )
+  target_link_libraries(nblock m simgrid smpi )
+  target_link_libraries(sendmany m simgrid smpi )
+  target_link_libraries(order m simgrid smpi )
+  target_link_libraries(pack m simgrid smpi )
+  target_link_libraries(probe1 m simgrid smpi )
+  target_link_libraries(testtest1  m simgrid smpi )
+  target_link_libraries(hvectest m simgrid smpi )
+  target_link_libraries(hvectest2 m simgrid smpi )
+  target_link_libraries(hvec m simgrid smpi )
+  target_link_libraries(hindexed m simgrid smpi )
+  target_link_libraries(irecvtest m simgrid smpi )
+  target_link_libraries(nbtest m simgrid smpi )
+  target_link_libraries(waitany m simgrid smpi )
+  target_link_libraries(waitall m simgrid smpi )
+  target_link_libraries(waitall2 m simgrid smpi )
+  target_link_libraries(waitall3 m simgrid smpi )
+  target_link_libraries(waitall4 m simgrid smpi )
+  target_link_libraries(commit m simgrid smpi )
+  target_link_libraries(cancel m simgrid smpi )
+  target_link_libraries(cancel2 m simgrid smpi )
+  target_link_libraries(cancel3 m simgrid smpi )
+  target_link_libraries(cancelmessages m simgrid smpi )
+  target_link_libraries(cancelibm m simgrid smpi )
+  target_link_libraries(cancelissend m simgrid smpi )
+  target_link_libraries(sendorder m simgrid smpi )
+  target_link_libraries(exittest m simgrid smpi )
+  target_link_libraries(selfvsworld m simgrid smpi )
+  if(SMPI_F2C)
+    target_link_libraries(secondf m simgrid smpi f2c)
+#    target_link_libraries(allpair2 m simgrid smpi f2c)
+#    target_link_libraries(allpair m simgrid smpi f2c)
+    target_link_libraries(isendf m simgrid smpi f2c)
+    target_link_libraries(pingpong_f m simgrid smpi f2c)
+    target_link_libraries(send1 m simgrid smpi f2c)
+    target_link_libraries(sendcplx m simgrid smpi f2c)
+    target_link_libraries(sendfort m simgrid smpi f2c)
+#    target_link_libraries(structf m simgrid smpi f2c)
+    target_link_libraries(typebasef m simgrid smpi f2c)
+  endif()
+
+  set_target_properties(overtake PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(bsendtest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(relrank PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(sendrecv_mpich PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(persistent PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(flood PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(flood2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(persist PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(persist2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(sendrecv2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(sendrecv3 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(sendrecv4 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(irsend PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(irsendinit PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(longmsgs PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(testsome PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(testall_mpich PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(sndrcv PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(sndrcvrep PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(sndrcvrpl2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(getelm PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(self PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(typelb PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(structlb PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(typeub PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(typeub2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(typeub3 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(typecreate PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(reqcreate PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(reqfree PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(isndrcv PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(nullproc PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(nullproc2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(trunc PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(truncmult PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(typetest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(typebase PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(ssendtest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(ssendtest2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(issendtest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(issend2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(issendinit PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(testtypes PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(dataalign PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(dtyperecv PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(dtypelife PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(htmsg PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(isendtest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(third PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(fourth PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(fifth PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(sixth PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(probe PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(nblock PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(sendmany PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(order PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(pack PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(probe1 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(testtest1  PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(hvectest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(hvectest2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(hvec PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(hindexed PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(irecvtest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(nbtest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(waitany PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(waitall PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(waitall2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(waitall3 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(waitall4 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(commit PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(cancel PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(cancel2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(cancel3 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(cancelmessages PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(cancelibm PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(cancelissend PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(sendorder PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(exittest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  set_target_properties(selfvsworld PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  if(SMPI_F2C)
+    set_target_properties(secondf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+#    set_target_properties(allpair2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+#    set_target_properties(allpair PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+    set_target_properties(isendf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+    set_target_properties(pingpong_f PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+    set_target_properties(send1 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+    set_target_properties(sendcplx PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+    set_target_properties(sendfort PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+#    set_target_properties(structf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+    set_target_properties(typebasef PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}")
+  endif()
+endif()
+
+set(tesh_files
+  ${tesh_files}
+  PARENT_SCOPE
+  )
+set(xml_files
+  ${xml_files}
+  PARENT_SCOPE
+  )
+set(examples_src
+  ${examples_src}
+  ${CMAKE_CURRENT_SOURCE_DIR}/gcomm.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/gcomm.h
+  ${CMAKE_CURRENT_SOURCE_DIR}/dtypes.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/dtypes.h
+  ${CMAKE_CURRENT_SOURCE_DIR}/overtake.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/bsendtest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/relrank.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/sendrecv.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/persistent.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/flood.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/flood2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/persist.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/persist2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/sendrecv2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/sendrecv3.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/sendrecv4.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/irsend.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/irsendinit.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/longmsgs.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/testsome.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/testall.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/sndrcv.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/sndrcvrep.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/sndrcvrpl2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/getelm.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/self.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/typelb.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/structlb.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/typeub.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/typeub2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/typeub3.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/typecreate.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/reqcreate.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/reqfree.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/isndrcv.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/nullproc.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/nullproc2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/trunc.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/truncmult.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/typetest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/typebase.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/ssendtest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/ssendtest2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/issendtest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/issend2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/issendinit.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/testtypes.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/dataalign.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/dtyperecv.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/dtypelife.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/htmsg.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/isendtest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/third.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/fourth.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/fifth.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/sixth.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/probe.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/nblock.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/sendmany.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/order.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/pack.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/probe1.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/testtest1.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/hvectest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/hvectest2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/hvec.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/hindexed.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/irecvtest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/nbtest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/waitany.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/waitall.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/waitall2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/waitall3.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/waitall4.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/commit.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/cancel.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/cancel2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/cancel3.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/cancelmessages.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/cancelibm.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/cancelissend.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/sendorder.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/exittest.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/selfvsworld.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/test.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/test.h
+  ${CMAKE_CURRENT_SOURCE_DIR}/secondf.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/allpair2.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/allpair.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/isendf.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/pingpong.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/send1.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/sendcplx.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/sendfort.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/structf.f
+  ${CMAKE_CURRENT_SOURCE_DIR}/typebasef.f
+  PARENT_SCOPE
+  )
+set(bin_files
+  ${bin_files}
+  PARENT_SCOPE
+  )
+set(txt_files
+  ${txt_files}
+  PARENT_SCOPE
+  )
diff --git a/teshsuite/smpi/mpich-test/pt2pt/README b/teshsuite/smpi/mpich-test/pt2pt/README
new file mode 100644 (file)
index 0000000..9251e04
--- /dev/null
@@ -0,0 +1,36 @@
+These files are meant to test the point-to-point layer of MPI.
+The runtests script is now setup to use mpirun (from the toplevel util
+directory. MPIRUN is installed in $PREFIX/bin if you make install). Of couse,
+mpirun is still being ported to various different machines.
+
+All of the following programs use 2 nodes :
+
+Their output is generally in <progname>-<rank>.out
+
+sendrecv - exercises sends and receives of all basic types with
+          large variations in sizes of the messages sent.
+
+isndrcv  - Same as sndrcv, but uses nonblocking pt2pt calls.
+
+overtake - tests that messages sent with send and isend are not
+          overtaking (the standard requires that they are not)
+          by sending a large message followed immediately by several small 
+          ones.
+
+testtypes - Tests the datatypes codes by making several hairy types
+           that should be compatible and trying them out.
+
+Other test programs (which may use more than 2 nodes...) -
+probe and probe1 do minor tests on MPI_probe.
+hvectest tests vector sends and receives (with derived vector datatypes)
+etc...
+
+If you need any help with these programs or find any bugs or make any 
+improvements, let me know. I have some improvements in mind for the testing
+harness (test.[ch]), because I'm not quite perfectly happy
+with it yet... :-) Enjoy.
+
+
+                                       Patrick Bridges
+                                       bridges@mcs.anl.gov
+                                       patrick@CS.MsState.Edu
diff --git a/teshsuite/smpi/mpich-test/pt2pt/allpair.f b/teshsuite/smpi/mpich-test/pt2pt/allpair.f
new file mode 100644 (file)
index 0000000..dfd2df6
--- /dev/null
@@ -0,0 +1,767 @@
+c
+c This program was inspired by a bug report from 
+c fsset@corelli.lerc.nasa.gov (Scott Townsend)
+c The original version of this program was submitted by email to 
+c mpi-bugs and is in the directory mpich/bugs/ssend (not distributed 
+c with the distribution).  This program was modified by William
+c Gropp (to correct a few errors and make more consistent with the
+c structure of the test programs in the examples/test/pt2pt directory.
+
+c A C version of this program is in allpairc.c
+c
+      program allpair
+      include 'mpif.h'
+      integer ierr
+
+      call MPI_Init(ierr)
+
+      call test_pair
+
+      call MPI_Finalize(ierr)
+
+      end
+
+c------------------------------------------------------------------------------
+c
+c  Simple pair communication exercises.
+c
+c------------------------------------------------------------------------------
+      subroutine test_pair
+      include 'mpif.h'
+      integer TEST_SIZE
+      parameter (TEST_SIZE=2000)
+
+      integer ierr, prev, next, count, tag, index, i, outcount,
+     .        requests(2), indices(2), rank, size, 
+     .        status(MPI_STATUS_SIZE), statuses(MPI_STATUS_SIZE,2)
+      integer dupcom
+      logical flag
+      real send_buf( TEST_SIZE ), recv_buf ( TEST_SIZE )
+
+      call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr )
+      call MPI_Comm_size( MPI_COMM_WORLD, size, ierr )
+      if (size .ne. 2) then
+         print *, 'Allpair test requires exactly 2 processes'
+         call MPI_Abort( MPI_COMM_WORLD, 1, ierr )
+      endif
+C      print *, ' about to do dup'
+      call MPI_Comm_dup( MPI_COMM_WORLD, dupcom, ierr )
+C      print *, ' did dup'
+      next = rank + 1
+      if (next .ge. size) next = 0
+
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+c
+c     Normal sends
+c
+      if (rank .eq. 0) then
+         print *, '    Send'
+         end if
+
+      tag = 1123
+      count = TEST_SIZE / 5
+
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Send(send_buf, count, MPI_REAL, next, tag,
+     .                 MPI_COMM_WORLD, ierr) 
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'send and recv' )
+      else
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'send and recv' )
+
+         call MPI_Send(recv_buf, count, MPI_REAL, next, tag,
+     .                 MPI_COMM_WORLD, ierr) 
+         end if
+c
+c     Ready sends.  Note that we must insure that the receive is posted
+c     before the rsend; this requires using Irecv.
+c
+      if (rank .eq. 0) then
+         print *, '    Rsend'
+         end if
+
+      tag = 1456
+      count = TEST_SIZE / 3
+
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, 
+     .                  MPI_COMM_WORLD, status, ierr )
+
+         call MPI_Rsend(send_buf, count, MPI_REAL, next, tag,
+     .                  MPI_COMM_WORLD, ierr) 
+
+         call MPI_Probe(MPI_ANY_SOURCE, tag,
+     .                  MPI_COMM_WORLD, status, ierr) 
+
+         if (status(MPI_SOURCE) .ne. prev) then
+            print *, 'Incorrect source, expected', prev,
+     .               ', got', status(MPI_SOURCE)
+            end if
+
+         if (status(MPI_TAG) .ne. tag) then
+            print *, 'Incorrect tag, expected', tag,
+     .               ', got', status(MPI_TAG)
+            end if
+
+         call MPI_Get_count(status, MPI_REAL, i, ierr)
+
+         if (i .ne. count) then
+            print *, 'Incorrect count, expected', count,
+     .               ', got', i
+            end if
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'rsend and recv' )
+
+      else
+
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 requests(1), ierr)
+         call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, 
+     .                  MPI_COMM_WORLD, ierr )
+         call MPI_Wait( requests(1), status, ierr )
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'rsend and recv' )
+
+         call MPI_Send(recv_buf, count, MPI_REAL, next, tag,
+     .                  MPI_COMM_WORLD, ierr) 
+         end if
+c
+c     Synchronous sends
+c
+      if (rank .eq. 0) then
+         print *, '    Ssend'
+         end if
+
+      tag = 1789
+      count = TEST_SIZE / 3
+
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Iprobe(MPI_ANY_SOURCE, tag,
+     .                   MPI_COMM_WORLD, flag, status, ierr) 
+
+         if (flag) then
+            print *, 'Iprobe succeeded! source', status(MPI_SOURCE),
+     .               ', tag', status(MPI_TAG)
+            end if
+
+         call MPI_Ssend(send_buf, count, MPI_REAL, next, tag,
+     .                  MPI_COMM_WORLD, ierr) 
+
+         do while (.not. flag)
+            call MPI_Iprobe(MPI_ANY_SOURCE, tag,
+     .                      MPI_COMM_WORLD, flag, status, ierr) 
+            end do
+
+         if (status(MPI_SOURCE) .ne. prev) then
+            print *, 'Incorrect source, expected', prev,
+     .               ', got', status(MPI_SOURCE)
+            end if
+
+         if (status(MPI_TAG) .ne. tag) then
+            print *, 'Incorrect tag, expected', tag,
+     .               ', got', status(MPI_TAG)
+            end if
+
+         call MPI_Get_count(status, MPI_REAL, i, ierr)
+
+         if (i .ne. count) then
+            print *, 'Incorrect count, expected', count,
+     .               ', got', i
+            end if
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status,
+     $        TEST_SIZE, 'ssend and recv' ) 
+
+      else
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'ssend and recv' )
+
+         call MPI_Ssend(recv_buf, count, MPI_REAL, next, tag,
+     .                  MPI_COMM_WORLD, ierr) 
+         end if
+c
+c     Nonblocking normal sends
+c
+      if (rank .eq. 0) then
+         print *, '    Isend'
+         end if
+
+      tag = 2123
+      count = TEST_SIZE / 5
+
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                  MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                  requests(1), ierr)
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Isend(send_buf, count, MPI_REAL, next, tag,
+     .                  MPI_COMM_WORLD, requests(2), ierr) 
+
+         call MPI_Waitall(2, requests, statuses, ierr)
+
+         call rq_check( requests, 2, 'isend and irecv' )
+
+         call msg_check( recv_buf, prev, tag, count, statuses(1,1),
+     $        TEST_SIZE, 'isend and irecv' )
+
+      else
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'isend and irecv' )
+
+         call MPI_Isend(recv_buf, count, MPI_REAL, next, tag,
+     .                  MPI_COMM_WORLD, requests(1), ierr) 
+
+         call MPI_Wait(requests(1), status, ierr)
+
+         call rq_check( requests(1), 1, 'isend and irecv' )
+
+         end if
+c
+c     Nonblocking ready sends
+c
+      if (rank .eq. 0) then
+         print *, '    Irsend'
+         end if
+
+      tag = 2456
+      count = TEST_SIZE / 3
+
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+c
+c  This test needs work for comm_size > 2
+c
+      if (rank .eq. 0) then
+
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                  MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                  requests(1), ierr)
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, next, 0, 
+     .                      MPI_BOTTOM, 0, MPI_INTEGER, next, 0, 
+     .                      dupcom, status, ierr )
+
+         call MPI_Irsend(send_buf, count, MPI_REAL, next, tag,
+     .                   MPI_COMM_WORLD, requests(2), ierr) 
+
+         index = -1
+         do while (index .ne. 1)
+            call MPI_Waitany(2, requests, index, statuses, ierr)
+            end do
+
+         call rq_check( requests(1), 1, 'irsend and irecv' )
+
+         call msg_check( recv_buf, prev, tag, count, statuses,
+     $           TEST_SIZE, 'irsend and irecv' )
+
+      else
+
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                  MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                  requests(1), ierr)
+
+         call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, next, 0, 
+     .                      MPI_BOTTOM, 0, MPI_INTEGER, next, 0, 
+     .                      dupcom, status, ierr )
+
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Test(requests(1), flag, status, ierr)
+            end do
+
+         call rq_check( requests, 1, 'irsend and irecv (test)' )
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'irsend and irecv' )
+
+         call MPI_Irsend(recv_buf, count, MPI_REAL, next, tag,
+     .                   MPI_COMM_WORLD, requests(1), ierr) 
+
+         call MPI_Waitall(1, requests, statuses, ierr)
+
+         call rq_check( requests, 1, 'irsend and irecv' )
+
+         end if
+
+c
+c     Nonblocking synchronous sends
+c
+      if (rank .eq. 0) then
+         print *, '    Issend'
+         end if
+
+      tag = 2789
+      count = TEST_SIZE / 3
+
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                  MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                  requests(1), ierr)
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Issend(send_buf, count, MPI_REAL, next, tag,
+     .                   MPI_COMM_WORLD, requests(2), ierr) 
+
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Testall(2, requests, flag, statuses, ierr)
+C            print *, 'flag = ', flag
+            end do
+
+         call rq_check( requests, 2, 'issend and irecv (testall)' )
+
+         call msg_check( recv_buf, prev, tag, count, statuses(1,1),
+     $           TEST_SIZE, 'issend and recv (testall)' )
+
+      else
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'issend and recv' )
+
+         call MPI_Issend(recv_buf, count, MPI_REAL, next, tag,
+     .                   MPI_COMM_WORLD, requests(1), ierr) 
+
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Testany(1, requests(1), index, flag,
+     .                       statuses(1,1), ierr)
+c            print *, 'flag = ', flag
+            end do
+
+         call rq_check( requests, 1, 'issend and recv (testany)' )
+
+         end if
+c
+c     Persistent normal sends
+c
+      if (rank .eq. 0) then
+         print *, '    Send_init' 
+         end if
+
+      tag = 3123
+      count = TEST_SIZE / 5
+
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      call MPI_Send_init(send_buf, count, MPI_REAL, next, tag,
+     .                   MPI_COMM_WORLD, requests(1), ierr) 
+
+      call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL,
+     .                   MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                   requests(2), ierr)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Startall(2, requests, ierr) 
+         call MPI_Waitall(2, requests, statuses, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, statuses(1,2),
+     $        TEST_SIZE, 'persistent send/recv' )
+
+      else
+
+         call MPI_Start(requests(2), ierr) 
+         call MPI_Wait(requests(2), status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     *                   'persistent send/recv')
+
+         do i = 1,count
+            send_buf(i) = recv_buf(i)
+            end do
+
+         call MPI_Start(requests(1), ierr) 
+         call MPI_Wait(requests(1), status, ierr)
+
+         end if
+
+      call MPI_Request_free(requests(1), ierr)
+      call MPI_Request_free(requests(2), ierr)
+c
+c     Persistent ready sends
+c
+      if (rank .eq. 0) then
+         print *, '    Rsend_init'
+         end if
+
+      tag = 3456
+      count = TEST_SIZE / 3
+
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      call MPI_Rsend_init(send_buf, count, MPI_REAL, next, tag,
+     .                    MPI_COMM_WORLD, requests(1), ierr) 
+
+      call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL,
+     .                   MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                   requests(2), ierr)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, 
+     .                  MPI_COMM_WORLD, status, ierr )
+
+         call MPI_Startall(2, requests, ierr)
+
+         index = -1
+
+         do while (index .ne. 2)
+            call MPI_Waitsome(2, requests, outcount,
+     .                        indices, statuses, ierr)
+            do i = 1,outcount
+               if (indices(i) .eq. 2) then
+                  call msg_check( recv_buf, prev, tag, count,
+     $                 statuses(1,i), TEST_SIZE, 'waitsome' )
+                  index = 2
+                  end if
+               end do
+            end do
+
+      else
+
+         call MPI_Start(requests(2), ierr)
+
+         call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, 
+     .                  MPI_COMM_WORLD, ierr )
+
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Test(requests(2), flag, status, ierr)
+            end do
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     *                   'test' )
+
+         do i = 1,count
+            send_buf(i) = recv_buf(i)
+            end do
+
+         call MPI_Start(requests(1), ierr)
+         call MPI_Wait(requests(1), status, ierr)
+
+         end if
+
+      call MPI_Request_free(requests(1), ierr)
+      call MPI_Request_free(requests(2), ierr)
+c
+c     Persistent synchronous sends
+c
+      if (rank .eq. 0) then
+         print *, '    Ssend_init'
+         end if
+
+      tag = 3789
+      count = TEST_SIZE / 3
+
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      call MPI_Ssend_init(send_buf, count, MPI_REAL, next, tag,
+     .                    MPI_COMM_WORLD, requests(2), ierr) 
+
+      call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL,
+     .                   MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                   requests(1), ierr)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Startall(2, requests, ierr)
+
+         index = -1
+         do while (index .ne. 1)
+            call MPI_Testsome(2, requests, outcount,
+     .                        indices, statuses, ierr)
+            do i = 1,outcount
+               if (indices(i) .eq. 1) then
+                  call msg_check( recv_buf, prev, tag, count,
+     $                 statuses(1,i), TEST_SIZE, 'testsome' )
+                  index = 1
+                  end if
+               end do
+            end do
+      else
+
+         call MPI_Start(requests(1), ierr)
+
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Testany(1, requests(1), index, flag,
+     .                       statuses(1,1), ierr)
+            end do
+         call msg_check( recv_buf, prev, tag, count, statuses(1,1),
+     $           TEST_SIZE, 'testany' )
+
+         do i = 1,count
+            send_buf(i) = recv_buf(i)
+            end do
+
+         call MPI_Start(requests(2), ierr)
+         call MPI_Wait(requests(2), status, ierr)
+
+         end if
+
+      call MPI_Request_free(requests(1), ierr)
+      call MPI_Request_free(requests(2), ierr)
+c
+c     Send/receive.
+c
+      if (rank .eq. 0) then
+         print *, '    Sendrecv'
+         end if
+
+      tag = 4123
+      count = TEST_SIZE / 5
+
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Sendrecv(send_buf, count, MPI_REAL, next, tag,
+     .                     recv_buf, count, MPI_REAL, prev, tag,
+     .                     MPI_COMM_WORLD, status, ierr) 
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'sendrecv' )
+
+      else
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'recv/send' )
+
+         call MPI_Send(recv_buf, count, MPI_REAL, next, tag,
+     .                 MPI_COMM_WORLD, ierr) 
+         end if
+c
+c     Send/receive replace.
+c
+      if (rank .eq. 0) then
+         print *, '    Sendrecv_replace'
+         end if
+
+      tag = 4456
+      count = TEST_SIZE / 3
+
+      if (rank .eq. 0) then
+
+         call init_test_data(recv_buf, TEST_SIZE)
+
+         do 11 i = count+1,TEST_SIZE
+            recv_buf(i) = 0.0
+ 11      continue
+
+         call MPI_Sendrecv_replace(recv_buf, count, MPI_REAL,
+     .                             next, tag, prev, tag,
+     .                             MPI_COMM_WORLD, status, ierr)  
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'sendrecvreplace' )
+
+      else
+
+         call clear_test_data(recv_buf,TEST_SIZE)
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'recv/send for replace' )
+
+         call MPI_Send(recv_buf, count, MPI_REAL, next, tag,
+     .                 MPI_COMM_WORLD, ierr) 
+         end if
+
+      call MPI_Comm_free( dupcom, ierr )
+      return
+      end
+
+c------------------------------------------------------------------------------
+c
+c  Check for correct source, tag, count, and data in test message.
+c
+c------------------------------------------------------------------------------
+      subroutine msg_check( recv_buf, source, tag, count, status, n, 
+     *                      name )
+      include 'mpif.h'
+      integer n
+      real    recv_buf(n)
+      integer source, tag, count, rank, status(MPI_STATUS_SIZE)
+      character*(*) name
+
+      integer ierr, recv_src, recv_tag, recv_count
+
+      recv_src = status(MPI_SOURCE)
+      recv_tag = status(MPI_TAG)
+      call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr )
+      call MPI_Get_count(status, MPI_REAL, recv_count, ierr)
+
+      if (recv_src .ne. source) then
+         print *, '[', rank, '] Unexpected source:', recv_src, 
+     *            ' in ', name
+         call MPI_Abort(MPI_COMM_WORLD, 101, ierr)
+         end if
+
+      if (recv_tag .ne. tag) then
+         print *, '[', rank, '] Unexpected tag:', recv_tag, ' in ', name
+         call MPI_Abort(MPI_COMM_WORLD, 102, ierr)
+         end if
+
+      if (recv_count .ne. count) then
+         print *, '[', rank, '] Unexpected count:', recv_count,
+     *            ' in ', name
+         call MPI_Abort(MPI_COMM_WORLD, 103, ierr)
+         end if
+
+      call verify_test_data(recv_buf, count, n, name )
+
+      end
+c------------------------------------------------------------------------------
+c
+c  Check that requests have been set to null
+c
+c------------------------------------------------------------------------------
+      subroutine rq_check( requests, n, msg )
+      include 'mpif.h'
+      integer n, requests(n)
+      character*(*) msg
+      integer i
+c
+      do 10 i=1, n
+         if (requests(i) .ne. MPI_REQUEST_NULL) then
+            print *, 'Nonnull request in ', msg
+         endif
+ 10   continue
+c      
+      end
+c------------------------------------------------------------------------------
+c
+c  Initialize test data buffer with integral sequence.
+c
+c------------------------------------------------------------------------------
+      subroutine init_test_data(buf,n)
+      integer n
+      real buf(n)
+      integer i
+
+      do 10 i = 1, n
+         buf(i) = REAL(i)
+ 10    continue
+      end
+
+c------------------------------------------------------------------------------
+c
+c  Clear test data buffer
+c
+c------------------------------------------------------------------------------
+      subroutine clear_test_data(buf, n)
+      integer n
+      real buf(n)
+      integer i
+
+      do 10 i = 1, n
+         buf(i) = 0.
+ 10   continue
+
+      end
+
+c------------------------------------------------------------------------------
+c
+c  Verify test data buffer
+c
+c------------------------------------------------------------------------------
+      subroutine verify_test_data(buf, count, n, name)
+      include 'mpif.h'
+      integer n
+      real buf(n)
+      character *(*) name
+
+      integer count, ierr, i
+
+      do 10 i = 1, count
+         if (buf(i) .ne. REAL(i)) then
+            print 100, buf(i), i, count, name
+            call MPI_Abort(MPI_COMM_WORLD, 108, ierr)
+            endif
+ 10       continue
+
+      do 20 i = count + 1, n
+         if (buf(i) .ne. 0.) then
+            print 100, buf(i), i, n, name
+            call MPI_Abort(MPI_COMM_WORLD, 109, ierr)
+            endif
+ 20       continue
+
+100   format('Invalid data', f6.1, ' at ', i4, ' of ', i4, ' in ', a)
+
+      end
diff --git a/teshsuite/smpi/mpich-test/pt2pt/allpair.std b/teshsuite/smpi/mpich-test/pt2pt/allpair.std
new file mode 100644 (file)
index 0000000..31a1d07
--- /dev/null
@@ -0,0 +1,13 @@
+*** Testing pt-2-pt from Fortran ***
+     Send
+     Rsend
+     Ssend
+     Isend
+     Irsend
+     Issend
+     Send_init
+     Rsend_init
+     Ssend_init
+     Sendrecv
+     Sendrecv_replace
+*** Testing pt-2-pt from Fortran ***
diff --git a/teshsuite/smpi/mpich-test/pt2pt/allpair2.f b/teshsuite/smpi/mpich-test/pt2pt/allpair2.f
new file mode 100644 (file)
index 0000000..12b91ba
--- /dev/null
@@ -0,0 +1,809 @@
+c
+c This program was inspired by a bug report from 
+c fsset@corelli.lerc.nasa.gov (Scott Townsend)
+c The original version of this program was submitted by email to 
+c mpi-bugs and is in the directory mpich/bugs/ssend (not distributed 
+c with the distribution).  This program was modified by William
+c Gropp (to correct a few errors and make more consistent with the
+c structure of the test programs in the examples/test/pt2pt directory.
+
+c A C version of this program is in allpairc.c
+c
+c This version is intended to test for memory leaks; it runs each test
+c a number of times (TEST_COUNT + some in test_pair).
+c 
+      program allpair2
+      include 'mpif.h'
+      integer ierr
+
+      call MPI_Init(ierr)
+
+      call test_pair
+
+      call MPI_Finalize(ierr)
+
+      end
+
+c------------------------------------------------------------------------------
+c
+c  Simple pair communication exercises.
+c
+c------------------------------------------------------------------------------
+      subroutine test_pair
+      include 'mpif.h'
+      integer TEST_SIZE, TEST_COUNT
+      parameter (TEST_SIZE=2000)
+      parameter (TEST_COUNT=100)
+
+      integer ierr, prev, next, count, tag, index, i, outcount,
+     .        requests(2), indices(2), rank, size, 
+     .        status(MPI_STATUS_SIZE), statuses(MPI_STATUS_SIZE,2)
+      integer dupcom
+      integer c
+      logical flag
+      real send_buf( TEST_SIZE ), recv_buf ( TEST_SIZE )
+
+      call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr )
+      call MPI_Comm_size( MPI_COMM_WORLD, size, ierr )
+      call MPI_Comm_dup( MPI_COMM_WORLD, dupcom, ierr )
+      next = rank + 1
+      if (next .ge. size) next = 0
+
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+c
+c     Normal sends
+c
+      if (rank .eq. 0) then
+         print *, '    Send'
+         end if
+
+      tag = 1123
+      count = TEST_SIZE / 5
+
+      do 111 c=1, TEST_COUNT+1
+
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Send(send_buf, count, MPI_REAL, next, tag,
+     .                 MPI_COMM_WORLD, ierr) 
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'send and recv' )
+
+      else
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'send and recv' )
+
+         call MPI_Send(recv_buf, count, MPI_REAL, next, tag,
+     .                 MPI_COMM_WORLD, ierr) 
+         end if
+ 111  continue
+c
+c     Ready sends.  Note that we must ensure that the receive is posted
+c     before the rsend; this requires using Irecv.
+c
+      if (rank .eq. 0) then
+         print *, '    Rsend'
+         end if
+
+      tag = 1456
+      count = TEST_SIZE / 3
+
+      do 112 c = 1, TEST_COUNT+2
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, 
+     .                  MPI_COMM_WORLD, status, ierr )
+
+         call MPI_Rsend(send_buf, count, MPI_REAL, next, tag,
+     .                  MPI_COMM_WORLD, ierr) 
+
+         call MPI_Probe(MPI_ANY_SOURCE, tag,
+     .                  MPI_COMM_WORLD, status, ierr) 
+
+         if (status(MPI_SOURCE) .ne. prev) then
+            print *, 'Incorrect source, expected', prev,
+     .               ', got', status(MPI_SOURCE)
+            end if
+
+         if (status(MPI_TAG) .ne. tag) then
+            print *, 'Incorrect tag, expected', tag,
+     .               ', got', status(MPI_TAG)
+            end if
+
+         call MPI_Get_count(status, MPI_REAL, i, ierr)
+
+         if (i .ne. count) then
+            print *, 'Incorrect count, expected', count,
+     .               ', got', i
+            end if
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'rsend and recv' )
+
+      else
+
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 requests(1), ierr)
+         call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, 
+     .                  MPI_COMM_WORLD, ierr )
+         call MPI_Wait( requests(1), status, ierr )
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'rsend and recv' )
+
+         call MPI_Send(recv_buf, count, MPI_REAL, next, tag,
+     .                  MPI_COMM_WORLD, ierr) 
+         end if
+ 112  continue
+c
+c     Synchronous sends
+c
+      if (rank .eq. 0) then
+         print *, '    Ssend'
+         end if
+
+      tag = 1789
+      count = TEST_SIZE / 3
+
+      do 113 c = 1, TEST_COUNT+3
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Iprobe(MPI_ANY_SOURCE, tag,
+     .                   MPI_COMM_WORLD, flag, status, ierr) 
+
+         if (flag) then
+            print *, 'Iprobe succeeded! source', status(MPI_SOURCE),
+     .               ', tag', status(MPI_TAG)
+            end if
+
+         call MPI_Ssend(send_buf, count, MPI_REAL, next, tag,
+     .                  MPI_COMM_WORLD, ierr) 
+
+         do while (.not. flag)
+            call MPI_Iprobe(MPI_ANY_SOURCE, tag,
+     .                      MPI_COMM_WORLD, flag, status, ierr) 
+            end do
+
+         if (status(MPI_SOURCE) .ne. prev) then
+            print *, 'Incorrect source, expected', prev,
+     .               ', got', status(MPI_SOURCE)
+            end if
+
+         if (status(MPI_TAG) .ne. tag) then
+            print *, 'Incorrect tag, expected', tag,
+     .               ', got', status(MPI_TAG)
+            end if
+
+         call MPI_Get_count(status, MPI_REAL, i, ierr)
+
+         if (i .ne. count) then
+            print *, 'Incorrect count, expected', count,
+     .               ', got', i
+            end if
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status,
+     $        TEST_SIZE, 'ssend and recv' ) 
+
+      else
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'ssend and recv' )
+
+         call MPI_Ssend(recv_buf, count, MPI_REAL, next, tag,
+     .                  MPI_COMM_WORLD, ierr) 
+         end if
+ 113  continue
+c
+c     Nonblocking normal sends
+c
+      if (rank .eq. 0) then
+         print *, '    Isend'
+         end if
+
+      tag = 2123
+      count = TEST_SIZE / 5
+
+      do 114 c = 1, TEST_COUNT+4
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                  MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                  requests(1), ierr)
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Isend(send_buf, count, MPI_REAL, next, tag,
+     .                  MPI_COMM_WORLD, requests(2), ierr) 
+
+         call MPI_Waitall(2, requests, statuses, ierr)
+
+         call rq_check( requests, 2, 'isend and irecv' )
+
+         call msg_check( recv_buf, prev, tag, count, statuses(1,1),
+     $        TEST_SIZE, 'isend and irecv' )
+
+      else
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'isend and irecv' )
+
+         call MPI_Isend(recv_buf, count, MPI_REAL, next, tag,
+     .                  MPI_COMM_WORLD, requests(1), ierr) 
+
+         call MPI_Wait(requests(1), status, ierr)
+
+         call rq_check( requests(1), 1, 'isend and irecv' )
+
+         end if
+ 114  continue
+c
+c     Nonblocking ready sends
+c
+      if (rank .eq. 0) then
+         print *, '    Irsend'
+         end if
+
+      tag = 2456
+      count = TEST_SIZE / 3
+
+      do 115 c = 1, TEST_COUNT+5
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                  MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                  requests(1), ierr)
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, next, 0, 
+     .                      MPI_BOTTOM, 0, MPI_INTEGER, next, 0, 
+     .                      dupcom, status, ierr )
+
+         call MPI_Irsend(send_buf, count, MPI_REAL, next, tag,
+     .                   MPI_COMM_WORLD, requests(2), ierr) 
+
+         index = -1
+         do while (index .ne. 1)
+            call MPI_Waitany(2, requests, index, statuses, ierr)
+            end do
+
+         call rq_check( requests(1), 1, 'irsend and irecv' )
+
+         call msg_check( recv_buf, prev, tag, count, statuses,
+     $           TEST_SIZE, 'irsend and irecv' )
+
+C
+C        In case the send didn't complete yet.
+         call MPI_Waitall( 2, requests, statuses, ierr )
+
+      else
+
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                  MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                  requests(1), ierr)
+
+         call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, next, 0, 
+     .                      MPI_BOTTOM, 0, MPI_INTEGER, next, 0, 
+     .                      dupcom, status, ierr )
+
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Test(requests(1), flag, status, ierr)
+            end do
+
+         call rq_check( requests, 1, 'irsend and irecv (test)' )
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'irsend and irecv' )
+
+         call MPI_Irsend(recv_buf, count, MPI_REAL, next, tag,
+     .                   MPI_COMM_WORLD, requests(1), ierr) 
+
+         call MPI_Waitall(1, requests, statuses, ierr)
+
+         call rq_check( requests, 1, 'irsend and irecv' )
+
+         end if
+ 115  continue
+c
+c     Nonblocking synchronous sends
+c
+      if (rank .eq. 0) then
+         print *, '    Issend'
+         end if
+
+      tag = 2789
+      count = TEST_SIZE / 3
+
+      do 116 c = 1, TEST_COUNT+6
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                  MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                  requests(1), ierr)
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Issend(send_buf, count, MPI_REAL, next, tag,
+     .                   MPI_COMM_WORLD, requests(2), ierr) 
+
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Testall(2, requests, flag, statuses, ierr)
+C            print *, 'flag = ', flag
+            end do
+
+         call rq_check( requests, 2, 'issend and irecv (testall)' )
+
+         call msg_check( recv_buf, prev, tag, count, statuses(1,1),
+     $           TEST_SIZE, 'issend and recv (testall)' )
+
+      else
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'issend and recv' )
+
+         call MPI_Issend(recv_buf, count, MPI_REAL, next, tag,
+     .                   MPI_COMM_WORLD, requests(1), ierr) 
+
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Testany(1, requests(1), index, flag,
+     .                       statuses(1,1), ierr)
+c            print *, 'flag = ', flag
+            end do
+
+         call rq_check( requests, 1, 'issend and recv (testany)' )
+
+         end if
+ 116  continue
+c
+c     Persistent normal sends
+c
+      if (rank .eq. 0) then
+         print *, '    Send_init' 
+         end if
+
+      tag = 3123
+      count = TEST_SIZE / 5
+
+      do 117 c = 1, TEST_COUNT+7
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      call MPI_Send_init(send_buf, count, MPI_REAL, next, tag,
+     .                   MPI_COMM_WORLD, requests(1), ierr) 
+
+      call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL,
+     .                   MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                   requests(2), ierr)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Startall(2, requests, ierr) 
+         call MPI_Waitall(2, requests, statuses, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, statuses(1,2),
+     $        TEST_SIZE, 'persistent send/recv' )
+
+      else
+
+         call MPI_Start(requests(2), ierr) 
+         call MPI_Wait(requests(2), status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     *                   'persistent send/recv')
+
+         do i = 1,count
+            send_buf(i) = recv_buf(i)
+            end do
+
+         call MPI_Start(requests(1), ierr) 
+         call MPI_Wait(requests(1), status, ierr)
+
+         end if
+
+      call MPI_Request_free(requests(1), ierr)
+      call MPI_Request_free(requests(2), ierr)
+ 117  continue
+c
+c     Persistent ready sends
+c     Like the ready send, we must ensure that the receive is posted
+c     before the ready send is started.
+c
+      if (rank .eq. 0) then
+         print *, '    Rsend_init'
+         end if
+
+      tag = 3456
+      count = TEST_SIZE / 3
+
+      do 118 c = 1, TEST_COUNT+8
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      call MPI_Rsend_init(send_buf, count, MPI_REAL, next, tag,
+     .                    MPI_COMM_WORLD, requests(1), ierr) 
+
+      call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL,
+     .                   MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                   requests(2), ierr)
+
+c
+c receive a clear-to-go from the destination, so that the ready send
+c will find the matching receive when it arrives
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, 1, 321, 
+     $                  MPI_COMM_WORLD, status, ierr ) 
+         call MPI_Startall(2, requests, ierr)
+
+         index = -1
+         do while (index .ne. 2)
+            call MPI_Waitsome(2, requests, outcount,
+     .                        indices, statuses, ierr)
+            do i = 1,outcount
+               if (indices(i) .eq. 2) then
+                  call msg_check( recv_buf, prev, tag, count,
+     $                 statuses(1,i), TEST_SIZE, 'waitsome' )
+                  index = 2
+                  end if
+               end do
+            end do
+
+      else
+
+         call MPI_Start(requests(2), ierr)
+
+c Let the target know that is may begin the ready send
+         call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, 0, 321, 
+     $                  MPI_COMM_WORLD, ierr ) 
+
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Test(requests(2), flag, status, ierr)
+            end do
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     *                   'test' )
+
+         do i = 1,count
+            send_buf(i) = recv_buf(i)
+            end do
+
+         call MPI_Start(requests(1), ierr)
+         call MPI_Wait(requests(1), status, ierr)
+
+         end if
+
+      call MPI_Request_free(requests(1), ierr)
+      call MPI_Request_free(requests(2), ierr)
+ 118  continue
+c
+c     Persistent synchronous sends
+c
+      if (rank .eq. 0) then
+         print *, '    Ssend_init'
+         end if
+
+      tag = 3789
+      count = TEST_SIZE / 3
+
+      do 119 c = 1, TEST_COUNT+9
+      call clear_test_data(recv_buf,TEST_SIZE)
+      
+      call MPI_Ssend_init(send_buf, count, MPI_REAL, next, tag,
+     .                    MPI_COMM_WORLD, requests(2), ierr) 
+
+      call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL,
+     .                   MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                   requests(1), ierr)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Startall(2, requests, ierr)
+
+         index = -1
+         do while (index .ne. 1)
+            call MPI_Testsome(2, requests, outcount,
+     .                        indices, statuses, ierr)
+            do i = 1,outcount
+               if (indices(i) .eq. 1) then
+                  call msg_check( recv_buf, prev, tag, count,
+     $                 statuses(1,i), TEST_SIZE, 'testsome' )
+                  index = 1
+                  end if
+               end do
+            end do
+
+      else
+
+         call MPI_Start(requests(1), ierr)
+
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Testany(1, requests(1), index, flag,
+     .                       statuses(1,1), ierr)
+            end do
+
+         call msg_check( recv_buf, prev, tag, count, statuses(1,1),
+     $           TEST_SIZE, 'testany' )
+
+         do i = 1,count
+            send_buf(i) = recv_buf(i)
+            end do
+
+         call MPI_Start(requests(2), ierr)
+         call MPI_Wait(requests(2), status, ierr)
+
+         end if
+
+      call MPI_Request_free(requests(1), ierr)
+      call MPI_Request_free(requests(2), ierr)
+ 119  continue
+c
+c     Send/receive.
+c
+      if (rank .eq. 0) then
+         print *, '    Sendrecv'
+         end if
+
+      tag = 4123
+      count = TEST_SIZE / 5
+
+      do 120 c = 1, TEST_COUNT+10
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Sendrecv(send_buf, count, MPI_REAL, next, tag,
+     .                     recv_buf, count, MPI_REAL, prev, tag,
+     .                     MPI_COMM_WORLD, status, ierr) 
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'sendrecv' )
+
+      else
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'recv/send' )
+
+         call MPI_Send(recv_buf, count, MPI_REAL, next, tag,
+     .                 MPI_COMM_WORLD, ierr) 
+         end if
+ 120  continue
+c
+c     Send/receive replace.
+c
+      if (rank .eq. 0) then
+         print *, '    Sendrecv_replace'
+         end if
+
+      tag = 4456
+      count = TEST_SIZE / 3
+
+      do 121 c = 1, TEST_COUNT+11
+      if (rank .eq. 0) then
+
+         call init_test_data(recv_buf, TEST_SIZE)
+
+         do 11 i = count+1,TEST_SIZE
+            recv_buf(i) = 0.0
+ 11      continue
+
+         call MPI_Sendrecv_replace(recv_buf, count, MPI_REAL,
+     .                             next, tag, prev, tag,
+     .                             MPI_COMM_WORLD, status, ierr)  
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'sendrecvreplace' )
+
+      else
+
+         call clear_test_data(recv_buf,TEST_SIZE)
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
+     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     .                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
+     .                   'recv/send for replace' )
+
+         call MPI_Send(recv_buf, count, MPI_REAL, next, tag,
+     .                 MPI_COMM_WORLD, ierr) 
+         end if
+
+ 121  continue
+
+      call MPI_Comm_free( dupcom, ierr )
+      return
+      
+      end
+
+c------------------------------------------------------------------------------
+c
+c  Check for correct source, tag, count, and data in test message.
+c
+c------------------------------------------------------------------------------
+      subroutine msg_check( recv_buf, source, tag, count, status, n, 
+     *                      name )
+      include 'mpif.h'
+      integer n
+      real    recv_buf(n)
+      integer source, tag, count, rank, status(MPI_STATUS_SIZE)
+      character*(*) name
+
+      integer ierr, recv_src, recv_tag, recv_count
+
+      recv_src = status(MPI_SOURCE)
+      recv_tag = status(MPI_TAG)
+      call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr )
+      call MPI_Get_count(status, MPI_REAL, recv_count, ierr)
+
+C     Check for null status
+      if (recv_src .eq. MPI_ANY_SOURCE .and. 
+     *    recv_tag .eq. MPI_ANY_TAG .and. 
+     *    status(MPI_ERROR) .eq. MPI_SUCCESS) then
+         print *, '[', rank, '] Unexpected NULL status in ', name
+         call MPI_Abort( MPI_COMM_WORLD, 104, ierr )
+      end if
+      if (recv_src .ne. source) then
+         print *, '[', rank, '] Unexpected source:', recv_src, 
+     *            ' in ', name
+         call MPI_Abort(MPI_COMM_WORLD, 101, ierr)
+         end if
+
+      if (recv_tag .ne. tag) then
+         print *, '[', rank, '] Unexpected tag:', recv_tag, ' in ', name
+         call MPI_Abort(MPI_COMM_WORLD, 102, ierr)
+         end if
+
+      if (recv_count .ne. count) then
+         print *, '[', rank, '] Unexpected count:', recv_count,
+     *            ' in ', name
+         call MPI_Abort(MPI_COMM_WORLD, 103, ierr)
+         end if
+
+      call verify_test_data(recv_buf, count, n, name )
+
+      end
+c------------------------------------------------------------------------------
+c
+c  Check that requests have been set to null
+c
+c------------------------------------------------------------------------------
+      subroutine rq_check( requests, n, msg )
+      include 'mpif.h'
+      integer n, requests(n)
+      character*(*) msg
+      integer i
+c
+      do 10 i=1, n
+         if (requests(i) .ne. MPI_REQUEST_NULL) then
+            print *, 'Nonnull request in ', msg
+         endif
+ 10   continue
+c      
+      end
+c------------------------------------------------------------------------------
+c
+c  Initialize test data buffer with integral sequence.
+c
+c------------------------------------------------------------------------------
+      subroutine init_test_data(buf,n)
+      integer n
+      real buf(n)
+      integer i
+
+      do 10 i = 1, n
+         buf(i) = REAL(i)
+ 10    continue
+      end
+
+c------------------------------------------------------------------------------
+c
+c  Clear test data buffer
+c
+c------------------------------------------------------------------------------
+      subroutine clear_test_data(buf, n)
+      integer n
+      real buf(n)
+      integer i
+
+      do 10 i = 1, n
+         buf(i) = 0.
+ 10   continue
+
+      end
+
+c------------------------------------------------------------------------------
+c
+c  Verify test data buffer
+c
+c------------------------------------------------------------------------------
+      subroutine verify_test_data(buf, count, n, name)
+      include 'mpif.h'
+      integer n
+      real buf(n)
+      character *(*) name
+
+      integer count, ierr, i
+
+      do 10 i = 1, count
+         if (buf(i) .ne. REAL(i)) then
+            print 100, buf(i), i, count, name
+            call MPI_Abort(MPI_COMM_WORLD, 108, ierr)
+            endif
+ 10       continue
+
+      do 20 i = count + 1, n
+         if (buf(i) .ne. 0.) then
+            print 100, buf(i), i, n, name
+            call MPI_Abort(MPI_COMM_WORLD, 109, ierr)
+            endif
+ 20       continue
+
+100   format('Invalid data', f6.1, ' at ', i4, ' of ', i4, ' in ', a)
+
+      end
diff --git a/teshsuite/smpi/mpich-test/pt2pt/allpair2.std b/teshsuite/smpi/mpich-test/pt2pt/allpair2.std
new file mode 100644 (file)
index 0000000..f1c4b3c
--- /dev/null
@@ -0,0 +1,13 @@
+*** Testing pt-2-pt from Fortran  (many calls) ***
+     Send
+     Rsend
+     Ssend
+     Isend
+     Irsend
+     Issend
+     Send_init
+     Rsend_init
+     Ssend_init
+     Sendrecv
+     Sendrecv_replace
+*** Testing pt-2-pt from Fortran  (many calls) ***
diff --git a/teshsuite/smpi/mpich-test/pt2pt/bsendtest.c b/teshsuite/smpi/mpich-test/pt2pt/bsendtest.c
new file mode 100644 (file)
index 0000000..afd2eef
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+ * Program to test that the "no overtaking messages" semantics
+ * of point to point communications in MPI is satisfied. 
+ * A long message is sent using MPI_BSend and received using MPI_Recv,
+ * followed by lots of short messages sent the same way.
+ *
+ *                             Patrick Bridges
+ *                             bridges@mcs.anl.gov
+ *                             patrick@CS.MsState.Edu
+ */
+
+#include <stdio.h>
+/* Needed for malloc declaration */
+#include <stdlib.h>
+#include "test.h"
+#include "mpi.h"
+
+#define SIZE 10000
+
+static int src  = 0;
+static int dest = 1;
+
+/* Which tests to perform (not yet implemented) */
+/* static int Do_Buffer = 1; */
+/* static int Do_Standard = 1; */
+
+/* Prototypes for picky compilers */
+void Generate_Data ( double *, int );
+void Normal_Test_Recv ( double *, int );
+void Buffered_Test_Send ( double *, int );
+void Buffered_Test_Ibsend ( double *, int );
+int Check_Data ( double *, int );
+void Clear_Buffer ( double *, int );
+
+void Generate_Data(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i;
+
+    for (i = 0; i < buff_size; i++)
+       buffer[i] = (double)i+1;
+}
+
+void Normal_Test_Recv(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i, j;
+    MPI_Status Stat;
+    double     *b;
+
+    b = buffer;
+    for (j = 0; j < 2; j++) {
+       /* Receive a long message */
+       MPI_Recv(b, (buff_size/2 - 10), MPI_DOUBLE, src, 
+                2000, MPI_COMM_WORLD, &Stat);
+       b += buff_size/2 - 10;
+       /* Followed by 10 short ones */
+       for (i = 0; i < 10; i++) {
+           MPI_Recv(b++, 1, MPI_DOUBLE, src, 2000, MPI_COMM_WORLD, &Stat);
+       }
+    }
+}
+
+void Buffered_Test_Send(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i, j;
+    void *bbuffer;
+    int  size;
+
+    for (j = 0; j < 2; j++) {
+       /* send a long message */
+       MPI_Bsend(buffer, (buff_size/2 - 10), MPI_DOUBLE, dest, 2000, 
+                MPI_COMM_WORLD);
+       buffer += buff_size/2 - 10;
+       /* Followed by 10 short ones */
+       for (i = 0; i < 10; i++)
+           MPI_Bsend(buffer++, 1, MPI_DOUBLE, 
+                     dest, 2000, MPI_COMM_WORLD);
+        /* Force this set of Bsends to complete */
+        MPI_Buffer_detach( &bbuffer, &size );
+        MPI_Buffer_attach( bbuffer, size );
+    }
+}
+
+void Buffered_Test_Ibsend(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i, j;
+    void *bbuffer;
+    int  size;
+    int  cnt;
+    MPI_Request req[20];
+    MPI_Status  statuses[20];
+
+    for (j = 0; j < 2; j++) {
+       /* send a long message */
+       cnt = 0;
+       MPI_Ibsend(buffer, (buff_size/2 - 10), MPI_DOUBLE, dest, 2000, 
+                MPI_COMM_WORLD, &req[cnt++]);
+       buffer += buff_size/2 - 10;
+       /* Followed by 10 short ones */
+       for (i = 0; i < 10; i++)
+           MPI_Ibsend(buffer++, 1, MPI_DOUBLE, 
+                     dest, 2000, MPI_COMM_WORLD, &req[cnt++]);
+       /* Wait for these to finish (should finish immediately) */
+       MPI_Waitall( cnt, req, statuses );
+
+        /* Force this set of Bsends to complete; this may take longer than
+          the Waitall */
+        MPI_Buffer_detach( &bbuffer, &size );
+        MPI_Buffer_attach( bbuffer, size );
+    }
+}
+
+int Check_Data(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i;
+    int err = 0;
+
+    for (i = 0; i < buff_size; i++)
+       if (buffer[i] != (i + 1)) {
+           err++;
+           fprintf( stderr, "Value at %d is %f, should be %f\n", i, 
+                   buffer[i], (double)(i+1) );
+           if (err > 10) return 1;
+           }
+    return err;
+}
+
+void Clear_Buffer(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i;
+    for (i = 0; i < buff_size; i++)
+       buffer[i] = -1;
+}
+
+
+int main(int argc, char **argv)
+{
+    int rank; /* My Rank (0 or 1) */
+    double buffer[SIZE], *tmpbuffer, *tmpbuf;
+    int tsize, bsize;
+    char *Current_Test = NULL;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+    if (rank == src) { 
+       Generate_Data(buffer, SIZE);
+       MPI_Pack_size( SIZE, MPI_DOUBLE, MPI_COMM_WORLD, &bsize );
+       tmpbuffer = (double *) malloc( bsize + 22*MPI_BSEND_OVERHEAD );
+       if (!tmpbuffer) {
+           fprintf( stderr, "Could not allocate bsend buffer of size %d\n",
+                    bsize );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+           }
+        MPI_Buffer_attach( tmpbuffer, bsize + 22*MPI_BSEND_OVERHEAD );
+       Buffered_Test_Send(buffer, SIZE);
+       Buffered_Test_Ibsend(buffer, SIZE);
+       MPI_Buffer_detach( &tmpbuf, &tsize );
+       Test_Waitforall( );
+       MPI_Finalize();
+
+    } else if (rank == dest) {
+       Test_Init("bsendtest", rank);
+       /* Test 3 */
+       Current_Test = (char*)"Overtaking Test (Buffered Send -> Normal Receive)";
+       Clear_Buffer(buffer, SIZE);
+       /* For Bsend */
+       Normal_Test_Recv(buffer, SIZE);
+       if (Check_Data(buffer, SIZE))
+           Test_Failed(Current_Test);
+       else
+           Test_Passed(Current_Test);
+
+       /* For Ibsend */
+       Current_Test = (char*)"Overtaking Test (Buffered Isend -> Normal Receive)";
+       Clear_Buffer(buffer, SIZE);
+       Normal_Test_Recv(buffer, SIZE);
+       if (Check_Data(buffer, SIZE))
+           Test_Failed(Current_Test);
+       else
+           Test_Passed(Current_Test);
+
+       Test_Waitforall( );
+       {
+           int rval = Summarize_Test_Results(); /* Returns number of tests;
+                                                   that failed */
+           Test_Finalize();
+           MPI_Finalize();
+           return rval;
+       }
+    } else {
+       fprintf(stderr, "*** This program uses exactly 2 processes! ***\n");
+        MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    return 0;
+}
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/cancel.c b/teshsuite/smpi/mpich-test/pt2pt/cancel.c
new file mode 100644 (file)
index 0000000..e1ca0f3
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * This file shows a typical use of MPI_Cancel to free IRecv's that
+ * are not wanted.  We check for both successful and unsuccessful 
+ * cancels
+ */
+
+#include "mpi.h"
+#include <stdio.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int main( int argc, char **argv )
+{
+    MPI_Request r1;
+    int         size, rank;
+    int         err = 0;
+    int         partner, buf[10], flag;
+    MPI_Status  status;
+
+    MPI_Init( &argc, &argv );
+
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    
+    if (size < 2) {
+       printf( "Cancel test requires at least 2 processes\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    /* 
+     * Here is the test.  First, we ensure an unsatisfied Irecv:
+     *       process 0             process size-1
+     *       Sendrecv              Sendrecv
+     *       Irecv                    ----
+     *       Cancel                   ----
+     *       Sendrecv              Sendrecv
+     * Next, we confirm receipt before canceling
+     *       Irecv                 Send
+     *       Sendrecv              Sendrecv
+     *       Cancel
+     */
+    if (rank == 0) {
+       partner = size - 1;
+       /* Cancel succeeds */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Irecv( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
+       MPI_Cancel( &r1 );
+       MPI_Wait( &r1, &status );
+       MPI_Test_cancelled( &status, &flag );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       if (!flag) {
+           err++;
+           printf( "Cancel of a receive failed where it should succeed.\n" );
+       }
+
+       /* Cancel fails */
+       MPI_Irecv( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Cancel( &r1 );
+       MPI_Test( &r1, &flag, &status );
+       MPI_Test_cancelled( &status, &flag );
+       /* It is technically possible for the cancel to succeed, even though
+          the message was (at least partially) delivered.  I'm leaving
+          this test in since most of the MPICH devices provide this
+          behavior. */
+       if (flag) {
+           err++;
+           printf( "Cancel of a receive succeeded where it shouldn't.\n" );
+       }
+
+       if (err) {
+           printf( "Test failed with %d errors.\n", err );
+       }
+       else {
+           printf( " No Errors\n" );
+       }
+    }
+    else if (rank == size - 1) {
+       partner = 0;
+       /* Cancel succeeds */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       /* Cancel fails */
+       MPI_Send( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+    }
+
+    /* 
+       Next test - check that a cancel for a request receive from
+       MPI_PROC_NULL succeeds (there is some suspicion that some
+       systems can't handle this - also, MPI_REQUEST_NULL 
+
+       Note that a null request is invalid (see the various NULL comments)
+    r1 = MPI_REQUEST_NULL;
+    MPI_Cancel( &r1 );
+    */
+    MPI_Irecv( buf, 10, MPI_INT, MPI_PROC_NULL, 0, MPI_COMM_WORLD, &r1 );
+    MPI_Cancel( &r1 );
+
+    MPI_Request_free( &r1 );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/cancel2.c b/teshsuite/smpi/mpich-test/pt2pt/cancel2.c
new file mode 100644 (file)
index 0000000..664c20a
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ * This file shows a typical use of MPI_Cancel to free Persistent Recv's that
+ * are not wanted.  We check for both successful and unsuccessful 
+ * cancels
+ */
+
+/* On 10/27/99, a test for MPI_Waitsome/MPI_Testsome was added */
+
+#include "mpi.h"
+#include <stdio.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int main( int argc, char **argv )
+{
+    MPI_Request r1;
+    int         size, rank;
+    int         err = 0;
+    int         partner, buf[10], flag, idx, index;
+    MPI_Status  status;
+
+    MPI_Init( &argc, &argv );
+
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    
+    if (size < 2) {
+       printf( "Cancel test requires at least 2 processes\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    /* 
+     * Here is the test.  First, we ensure an unsatisfied Irecv:
+     *       process 0             process size-1
+     *       Sendrecv              Sendrecv
+     *       Irecv                    ----
+     *       Cancel                   ----
+     *       Sendrecv              Sendrecv
+     * Next, we confirm receipt before canceling
+     *       Irecv                 Send
+     *       Sendrecv              Sendrecv
+     *       Cancel
+     */
+    if (rank == 0) {
+       partner = size - 1;
+       /* Cancel succeeds for wait/waitall */
+       MPI_Recv_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Start( &r1 );
+       MPI_Cancel( &r1 );
+       MPI_Wait( &r1, &status );
+       MPI_Test_cancelled( &status, &flag );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       if (!flag) {
+           err++; 
+           printf( "Cancel of a receive failed where it should succeed (Wait).\n" );
+       }
+
+       MPI_Request_free( &r1 );
+
+       /* Cancel fails for test/testall */
+       buf[0] = -1;
+       MPI_Recv_init( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
+       MPI_Start( &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Cancel( &r1 );
+       MPI_Test( &r1, &flag, &status );
+       MPI_Test_cancelled( &status, &flag );
+       if (flag) {
+           err++;
+           printf( "Cancel of a receive succeeded where it shouldn't (Test).\n" );
+           if (buf[0] != -1) {
+               printf( "Receive buffer changed even though cancel suceeded! (Test).\n" );
+           }
+       }
+       MPI_Request_free( &r1 );
+
+       /* Cancel succeeds for waitany */
+       MPI_Recv_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Start( &r1 );
+       MPI_Cancel( &r1 );
+       MPI_Waitany( 1, &r1, &idx, &status );
+       MPI_Test_cancelled( &status, &flag );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       if (!flag) {
+           err++;
+           printf( "Cancel of a receive failed where it should succeed (Waitany).\n" );
+       }
+       MPI_Request_free( &r1 );
+
+       /* Cancel fails for testany */
+        buf[0] = -1;
+       MPI_Recv_init( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
+       MPI_Start( &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Cancel( &r1 );
+       MPI_Testany( 1, &r1, &idx, &flag, &status );
+       MPI_Test_cancelled( &status, &flag );
+       if (flag) {
+           err++;
+           printf( "Cancel of a receive succeeded where it shouldn't (Testany).\n" );
+           if (buf[0] != -1) {
+               printf( "Receive buffer changed even though cancel suceeded! (Test).\n" );
+           }
+       }
+       MPI_Request_free( &r1 );
+
+       /* Cancel succeeds for waitsome */
+       MPI_Recv_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Start( &r1 );
+       MPI_Cancel( &r1 );
+       MPI_Waitsome( 1, &r1, &idx, &index, &status );
+       MPI_Test_cancelled( &status, &flag );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       if (!flag) {
+           err++;
+           printf( "Cancel of a receive failed where it should succeed (Waitsome).\n" );
+       }
+       MPI_Request_free( &r1 );
+
+       /* Cancel fails for testsome*/
+        buf[0] = -1;
+       MPI_Recv_init( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
+       MPI_Start( &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Cancel( &r1 );
+       MPI_Testsome( 1, &r1, &idx, &index, &status );
+       MPI_Test_cancelled( &status, &flag );
+       if (flag) {
+           err++;
+           printf( "Cancel of a receive succeeded where it shouldn't (Testsome).\n" );
+           if (buf[0] != -1) {
+               printf( "Receive buffer changed even though cancel suceeded! (Testsome).\n" );
+           }
+       }
+       MPI_Request_free( &r1 );
+
+       if (err) {
+           printf( "Test failed with %d errors.\n", err );
+       }
+       else {
+           printf( " No Errors\n" );
+       }
+    }
+
+    else if (rank == size - 1) {
+       partner = 0;
+       /* Cancel succeeds for wait/waitall */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       /* Cancel fails for test/testall */
+       buf[0] = 3;
+       MPI_Send( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+
+       /* Cancel succeeds for waitany */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       /* Cancel fails  for testany */
+       MPI_Send( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+
+       /* Cancel succeeds for waitsome */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       /* Cancel fails  for waitsome */
+       MPI_Send( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+
+    /* 
+       Next test - check that a cancel for a request receive from
+       MPI_PROC_NULL succeeds (there is some suspicion that some
+       systems can't handle this - also, MPI_REQUEST_NULL 
+     */
+    /* A null request is an error. (null objects are errors unless otherwise
+       allowed)
+    r1 = MPI_REQUEST_NULL;
+    MPI_Cancel( &r1 );
+    */
+       MPI_Recv_init( buf, 10, MPI_INT, MPI_PROC_NULL, 0, MPI_COMM_WORLD, &r1 );
+       MPI_Start( &r1 );
+       MPI_Cancel( &r1 );
+       MPI_Request_free( &r1 );    /* Must complete cancel.  We know that it 
+                                      won't complete, so we don't need to do
+                                      anything else */
+    }
+
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/cancel3.c b/teshsuite/smpi/mpich-test/pt2pt/cancel3.c
new file mode 100644 (file)
index 0000000..c6a84e7
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * This file shows a typical use of MPI_Cancel to free Persistent Send's that
+ * are not wanted.  We check for both successful and unsuccessful 
+ * cancels
+ */
+
+#include "mpi.h"
+#include <stdio.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int main( int argc, char **argv )
+{
+    MPI_Request r1;
+    int         size, rank;
+    int         err = 0;
+    int         partner, buf[10], flag, idx, index;
+    MPI_Status  status;
+
+    MPI_Init( &argc, &argv );
+
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    
+    if (size < 2) {
+       printf( "Cancel test requires at least 2 processes\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    /* 
+     * Here is the test.  First, we ensure an unsatisfied Irecv:
+     *       process 0             process size-1
+     *       Sendrecv              Sendrecv
+     *       Irecv                    ----
+     *       Cancel                   ----
+     *       Sendrecv              Sendrecv
+     * Next, we confirm receipt before canceling
+     *       Irecv                 Send
+     *       Sendrecv              Sendrecv
+     *       Cancel
+     */
+    if (rank == 0) {
+       partner = size - 1;
+       /* Cancel succeeds for wait/waitall */
+       MPI_Send_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Start( &r1 );
+       MPI_Cancel( &r1 );
+       MPI_Wait( &r1, &status );
+       MPI_Test_cancelled( &status, &flag ); 
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       if (!flag) {
+           err++; 
+           printf( "Cancel of a send failed where it should succeed (Wait).\n" );
+       }
+       MPI_Request_free( &r1 ); 
+
+       /* Cancel fails for test/testall */
+       buf[0] = 3;
+       MPI_Send_init( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
+       MPI_Start( &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Cancel( &r1 );
+       MPI_Test( &r1, &flag, &status );
+       MPI_Test_cancelled( &status, &flag );
+       if (flag) {
+           err++;
+           printf( "Cancel of a send succeeded where it shouldn't (Test).\n" );
+       }
+       MPI_Request_free( &r1 );
+
+       /* Cancel succeeds for waitany */
+       MPI_Send_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Start( &r1 );
+       MPI_Cancel( &r1 );
+       MPI_Waitany( 1, &r1, &idx, &status );
+       MPI_Test_cancelled( &status, &flag );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       if (!flag) {
+           err++;
+           printf( "Cancel of a send failed where it should succeed (Waitany).\n" );
+       }
+       MPI_Request_free( &r1 );
+
+       /* Cancel fails for testany */
+        buf[0] = 3;
+       MPI_Send_init( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
+       MPI_Start( &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Cancel( &r1 );
+       MPI_Testany( 1, &r1, &idx, &flag, &status );
+       MPI_Test_cancelled( &status, &flag );
+       if (flag) {
+           err++;
+           printf( "Cancel of a send succeeded where it shouldn't (Testany).\n" );
+       }
+       MPI_Request_free( &r1 );
+
+       /* Cancel succeeds for waitsome */
+       MPI_Send_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Start( &r1 );
+       MPI_Cancel( &r1 );
+       MPI_Waitsome( 1, &r1, &idx, &index, &status );
+       MPI_Test_cancelled( &status, &flag );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       if (!flag) {
+           err++;
+           printf( "Cancel of a send failed where it should succeed (Waitsome).\n" );
+       }
+       MPI_Request_free( &r1 );
+
+       /* Cancel fails for testsome*/
+        buf[0] = 3;
+       MPI_Send_init( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 );
+       MPI_Start( &r1 );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Cancel( &r1 );
+       MPI_Testsome( 1, &r1, &idx, &index, &status );
+       MPI_Test_cancelled( &status, &flag );
+       if (flag) {
+           err++;
+           printf( "Cancel of a send succeeded where it shouldn't (Testsome).\n" );
+       }
+       MPI_Request_free( &r1 );
+
+       if (err) {
+           printf( "Test failed with %d errors.\n", err );
+       }
+       else {
+           printf( " No Errors\n" );
+       }
+    }
+    else if (rank == size - 1) {
+       partner = 0;
+       /* Cancel succeeds for wait/waitall */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+
+       /* Cancel fails for test/testall */
+       buf[0] = -1;
+       MPI_Recv( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+
+       if (buf[0] == -1) {
+           printf( "Receive buffer did not change even though cancel should not have suceeded! (Test).\n" );
+           }
+
+       /* Cancel succeeds for waitany */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       /* Cancel fails  for testany */
+       buf[0] = -1;
+       MPI_Recv( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       if (buf[0] == -1) {
+           printf( "Receive buffer did not change even though cancel should not have suceeded! (Testany).\n" );
+           }
+
+       /* Cancel succeeds for waitsome */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+       /* Cancel fails for testsome */
+       buf[0] = -1;
+       MPI_Recv( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 1,
+                     MPI_COMM_WORLD, &status );
+
+       if (buf[0] == -1) {
+           printf( "Receive buffer did not change even though cancel should not have suceeded! (Test).\n" );
+           }
+
+    }
+
+    MPI_Finalize();
+    return 0;
+}
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/cancelibm.c b/teshsuite/smpi/mpich-test/pt2pt/cancelibm.c
new file mode 100644 (file)
index 0000000..3f83a52
--- /dev/null
@@ -0,0 +1,146 @@
+/****************************************************************************
+
+  MESSAGE PASSING INTERFACE TEST CASE SUITE
+  
+  Copyright IBM Corp. 1995
+       
+  IBM Corp. hereby grants a non-exclusive license to use, copy, modify, and
+  distribute this software for any purpose and without fee provided that the
+  above copyright notice and the following paragraphs appear in all copies.
+         
+  IBM Corp. makes no representation that the test cases comprising this
+  suite are correct or are an accurate representation of any standard.
+               
+  In no event shall IBM be liable to any party for direct, indirect, special
+  incidental, or consequential damage arising out of the use of this software
+  even if IBM Corp. has been advised of the possibility of such damage.
+                 
+  IBM CORP. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED
+  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS AND IBM
+  CORP. HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
+  ENHANCEMENTS, OR MODIFICATIONS.
+                       
+  ****************************************************************************
+                         
+  These test cases reflect an interpretation of the MPI Standard.  They are
+  are, in most cases, unit tests of specific MPI behaviors.  If a user of any
+  test case from this set believes that the MPI Standard requires behavior
+  different than that implied by the test case we would appreciate feedback.
+  
+  Comments may be sent to:
+  Richard Treumann
+  treumann@kgn.ibm.com
+                                 
+  ****************************************************************************
+*/
+#include <stdio.h>
+#include "mpi.h"
+
+int main(int argc, char *argv[])
+{
+       int me, tasks, data, flag;
+       int err0 = 0;
+       int err1 = 0;
+       int errs, toterrs;
+       MPI_Request request;
+       MPI_Status status;
+
+       MPI_Init(&argc,&argv);
+       MPI_Comm_rank(MPI_COMM_WORLD,&me);
+       MPI_Comm_size(MPI_COMM_WORLD,&tasks);
+
+       if (tasks < 2) {
+           printf( "Cancel test requires at least 2 processes\n" );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+       
+       { int data[100000]; if (me == 0)  
+       {
+               MPI_Irecv(data, 1, MPI_INT, 1, 1, MPI_COMM_WORLD,&request);
+               MPI_Cancel(&request);
+               MPI_Wait(&request,&status);
+               MPI_Test_cancelled(&status,&flag);
+               if (!flag) {
+                   err0++;
+                   printf("task %d ERROR: Receive request not cancelled!\n", me);
+               }
+
+               MPI_Issend(data, 100000, MPI_INT, 1, 1, MPI_COMM_WORLD,&request);
+               MPI_Cancel(&request);
+               for (flag = 0;; )  
+               {
+                       MPI_Test(&request,&flag,&status);
+                       if (flag) break;
+               }
+               
+               MPI_Test_cancelled(&status,&flag);
+               if (!flag) {
+                   err0++;
+                   printf("task %d ERROR: Send request not cancelled! (1)\n", me);
+               }
+       }}
+       
+       if (me == 0)  
+       {
+               data = 5;
+               MPI_Isend(&data, 1, MPI_INT, 1, 1, MPI_COMM_WORLD,&request);
+               MPI_Cancel(&request);
+               MPI_Wait(&request,&status);
+               MPI_Test_cancelled(&status,&flag);
+               if (!flag) {
+                   err0++;
+                   printf("task %d ERROR: Send request not cancelled! (2)\n", me);
+               }
+               MPI_Barrier(MPI_COMM_WORLD);
+               status.MPI_TAG=MPI_SUCCESS;
+               data = 6;
+               MPI_Send(&data, 1, MPI_INT, 1, 5, MPI_COMM_WORLD);
+               
+               data = 7;
+               MPI_Isend(&data, 1, MPI_INT, 1, 1, MPI_COMM_WORLD,&request);
+               MPI_Barrier(MPI_COMM_WORLD);
+               MPI_Cancel(&request);
+               MPI_Wait(&request,&status);
+               MPI_Test_cancelled(&status,&flag);
+               if (flag) {
+                   err0++;
+                   printf("task %d ERROR: Send request cancelled!\n", me);
+               }
+       } 
+       else if (me == 1) 
+       {
+           MPI_Barrier(MPI_COMM_WORLD);
+           data = 0;
+           MPI_Recv(&data, 1, MPI_INT, 0, 1, MPI_COMM_WORLD,&status);
+           if (data != 7) {
+               err1++;
+               printf("task %d ERROR: Send request not cancelled!\n", me);
+           }
+           
+           MPI_Recv(&data, 1, MPI_INT, 0, 5, MPI_COMM_WORLD,&status);
+           if (data != 6) {
+               err1++;
+               printf("task %d ERROR: Send request not cancelled!\n", me);
+           }
+           MPI_Barrier(MPI_COMM_WORLD);
+       }
+       else {
+           /* These are needed when the size of MPI_COMM_WORLD > 2 */
+           MPI_Barrier( MPI_COMM_WORLD );
+           MPI_Barrier( MPI_COMM_WORLD );
+       }
+       
+       errs = err0 + err1;
+       MPI_Reduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD );
+           
+       if ( errs ) {
+           printf( "Test failed with %d errors.\n", errs );
+       }
+       if (me == 0 && toterrs == 0) {
+           printf( " No Errors\n" );
+       }
+             
+       MPI_Finalize();
+       return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/cancelissend.c b/teshsuite/smpi/mpich-test/pt2pt/cancelissend.c
new file mode 100644 (file)
index 0000000..277fb73
--- /dev/null
@@ -0,0 +1,160 @@
+/****************************************************************************
+
+  MESSAGE PASSING INTERFACE TEST CASE SUITE
+  
+  Copyright IBM Corp. 1995
+       
+  IBM Corp. hereby grants a non-exclusive license to use, copy, modify, and
+  distribute this software for any purpose and without fee provided that the
+  above copyright notice and the following paragraphs appear in all copies.
+         
+  IBM Corp. makes no representation that the test cases comprising this
+  suite are correct or are an accurate representation of any standard.
+               
+  In no event shall IBM be liable to any party for direct, indirect, special
+  incidental, or consequential damage arising out of the use of this software
+  even if IBM Corp. has been advised of the possibility of such damage.
+                 
+  IBM CORP. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED
+  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS AND IBM
+  CORP. HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
+  ENHANCEMENTS, OR MODIFICATIONS.
+                       
+  ****************************************************************************
+                         
+  These test cases reflect an interpretation of the MPI Standard.  They are
+  are, in most cases, unit tests of specific MPI behaviors.  If a user of any
+  test case from this set believes that the MPI Standard requires behavior
+  different than that implied by the test case we would appreciate feedback.
+  
+  Comments may be sent to:
+  Richard Treumann
+  treumann@kgn.ibm.com
+                                 
+  ****************************************************************************
+*/
+/* 
+ * WDG - July 6, 2004
+ *
+ * This is a modified version that:
+ *  Uses a shorter message (in case the implementation uses eager delivery
+ *  even with synchronous send)
+ *  Allows control of which process is executing the Issend and which the
+ *  receive (to simplify debugging)
+ */
+#include <stdio.h>
+#include "mpi.h"
+
+int main(int argc, char *argv[])
+{
+       int me, tasks, data, flag;
+       int err0 = 0;
+       int err1 = 0;
+       int errs, toterrs;
+       int master = 1, worker = 0;
+       MPI_Request request;
+       MPI_Status status;
+
+       MPI_Init(&argc,&argv);
+       MPI_Comm_rank(MPI_COMM_WORLD,&me);
+       MPI_Comm_size(MPI_COMM_WORLD,&tasks);
+
+       if (tasks < 2) {
+           printf( "Cancel test requires at least 2 processes\n" );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+
+       /* The original test sent 10000 elements with Issend.  This
+          one uses less data but keeps the array the same size */
+       { int data[100000]; if (me == master)  
+       {
+               MPI_Irecv(data, 1, MPI_INT, worker, 1, MPI_COMM_WORLD,&request);
+               MPI_Cancel(&request);
+               MPI_Wait(&request,&status);
+               MPI_Test_cancelled(&status,&flag);
+               if (!flag) {
+                   err0++;
+                   printf("task %d ERROR: Receive request not cancelled!\n", me);
+               }
+
+               /* This is short enough to use eager but because it is
+                  a Synchronous send, it must still be possible to 
+                  cancel it, even when it is a short message */
+               MPI_Issend(data, 100, MPI_INT, worker, 1, MPI_COMM_WORLD,&request);
+               MPI_Cancel(&request);
+               for (flag = 0;; )  
+               {
+                       MPI_Test(&request,&flag,&status);
+                       if (flag) break;
+               }
+               
+               MPI_Test_cancelled(&status,&flag);
+               if (!flag) {
+                   err0++;
+                   printf("task %d ERROR: Send request not cancelled! (1)\n", me);
+               }
+       }}
+       
+       if (me == master)  
+       {
+               data = 5;
+               MPI_Isend(&data, 1, MPI_INT, worker, 1, MPI_COMM_WORLD,&request);
+               MPI_Cancel(&request);
+               MPI_Wait(&request,&status);
+               MPI_Test_cancelled(&status,&flag);
+               if (!flag) {
+                   err0++;
+                   printf("task %d ERROR: Send request not cancelled! (2)\n", me);
+               }
+               MPI_Barrier(MPI_COMM_WORLD);
+               status.MPI_TAG=MPI_SUCCESS;
+               data = 6;
+               MPI_Send(&data, 1, MPI_INT, worker, 5, MPI_COMM_WORLD);
+               
+               MPI_Isend(&data, 1, MPI_INT, worker, 1, MPI_COMM_WORLD,&request);
+               MPI_Barrier(MPI_COMM_WORLD);
+               MPI_Cancel(&request);
+               MPI_Wait(&request,&status);
+               MPI_Test_cancelled(&status,&flag);
+               if (flag) {
+                   err0++;
+                   printf("task %d ERROR: Send request cancelled!\n", me);
+               }
+       } 
+       else if (me == worker) 
+       {
+           MPI_Barrier(MPI_COMM_WORLD);
+           data = 0;
+           MPI_Recv(&data, 1, MPI_INT, master, 1, MPI_COMM_WORLD,&status);
+           if (data != 6) {
+               err1++;
+               printf("task %d ERROR: Send request not cancelled!\n", me);
+           }
+           
+           MPI_Recv(&data, 1, MPI_INT, master, 5, MPI_COMM_WORLD,&status);
+           if (data != 6) {
+               err1++;
+               printf("task %d ERROR: Send request not cancelled!\n", me);
+           }
+           MPI_Barrier(MPI_COMM_WORLD);
+       }
+       else {
+           /* These are needed when the size of MPI_COMM_WORLD > 2 */
+           MPI_Barrier( MPI_COMM_WORLD );
+           MPI_Barrier( MPI_COMM_WORLD );
+       }
+       
+       errs = err0 + err1;
+       MPI_Reduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD );
+           
+       if ( errs ) {
+           printf( "Test failed with %d errors.\n", errs );
+       }
+       if (me == 0 && toterrs == 0) {
+           printf( " No Errors\n" );
+       }
+             
+       MPI_Finalize();
+       return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/cancelmessages.c b/teshsuite/smpi/mpich-test/pt2pt/cancelmessages.c
new file mode 100644 (file)
index 0000000..6ca255b
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * This file tests to see if short,eager,and rndv messages can all be 
+ * successfully cancelled.  If they cannot be cancelled, then the 
+ * program still must successfully complete.
+ */
+
+#include "mpi.h"
+#include <stdio.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int main( int argc, char *argv[] )
+{
+
+    double       sbuf[20000];
+#ifdef FOO
+    double rbuf[20000];
+#endif
+    int          rank;
+    int          n, flag, size;
+    int          err = 0;
+    int          verbose = 0;
+    MPI_Status   status;
+    MPI_Request  req;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    if (size < 2) {
+       printf( "Cancel test requires at least 2 processes\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    /* Short Message Test */
+    n = 200;
+
+    if (rank == 1) { /* begin if rank = 1 */
+       MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req );
+       MPI_Cancel(&req); 
+       MPI_Wait(&req, &status);
+       MPI_Test_cancelled(&status, &flag);
+       if (!flag) {
+           err++;
+           printf( "Cancelling a short message failed where it should succeed.\n" );
+       }
+       else if (verbose)
+       {
+           printf("Cancelling a short message succeeded.\n");
+       }
+    }  /* end if rank == 1 */
+
+#ifdef FOO
+/* Note that MPI-2 specifies that status.MPI_ERROR is only set by
+   multiple completion (e.g., MPI_Waitsome) and not by test_cancelled.
+*/
+    MPI_Barrier(MPI_COMM_WORLD); 
+
+    if (rank == 0) {  /* begin if rank == 0 */
+       MPI_Recv( rbuf, n, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD, &status);
+    }  /* end if rank = 0 */
+    else if (rank == 1) { /* begin if rank = 1 */
+       MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req );
+       MPI_Cancel(&req); 
+       MPI_Wait(&req, &status);
+       MPI_Test_cancelled(&status, &flag);
+       if (!flag && status.MPI_ERROR != MPI_SUCCESS) {
+           err++;
+           printf( "Cancel of a send returned an error in the status field.\n" );
+       }
+         /* end if status.MPI_ERROR */
+    }  /* end if rank == 1 */
+#endif
+
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    /* Eager Message Test */
+    n = 3000;
+
+    if (rank == 1) { /* begin if rank = 1 */
+       MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req );
+       MPI_Cancel(&req);
+       MPI_Wait(&req, &status);
+       MPI_Test_cancelled(&status, &flag);
+       if (!flag) {
+           err++;
+           printf( "Cancelling an eager message (3000 doubles) failed where it should succeed.\n" );
+       }
+       else if (verbose)
+       {
+           printf("Cancelling an eager message (3000 doubles) succeeded.\n");
+       }
+    }  /* end if rank == 1 */
+
+#ifdef FOO
+    MPI_Barrier(MPI_COMM_WORLD); 
+
+    if (rank == 0) {  /* begin if rank == 0 */
+       MPI_Irecv(rbuf, n, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD, &req );
+       MPI_Wait( &req, &status);
+    }  /* end if rank = 0 */
+    else if (rank == 1) { /* begin if rank = 1 */
+       MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req );
+       MPI_Cancel(&req);
+       MPI_Wait(&req, &status);
+       MPI_Test_cancelled(&status, &flag);
+       if (!flag && status.MPI_ERROR != MPI_SUCCESS) {
+           err++;
+           printf( "Cancel of a send returned an error in the status field.\n" );
+       }
+       /* end if status.MPI_ERROR */
+    }  /* end if rank == 1 */
+#endif
+
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    /* Rndv Message Test */
+    n = 20000;
+
+    if (rank == 1) { /* begin if rank = 1 */
+       MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req );
+       MPI_Cancel(&req);
+       MPI_Wait(&req, &status);
+       MPI_Test_cancelled(&status, &flag);
+       if (!flag) {
+           err++;
+           printf( "Cancelling a rendezvous message failed (20000 doubles) where it should succeed.\n" );
+       }
+       else if (verbose)
+       {
+           printf("Cancelling an rendezvous message (20000 doubles) succeeded.\n");
+       }
+    }  /* end if rank == 1 */
+
+#ifdef FOO
+    MPI_Barrier(MPI_COMM_WORLD); 
+
+    if (rank == 0) {  /* begin if rank == 0 */
+       MPI_Irecv(rbuf, n, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD, &req );
+       MPI_Wait( &req, &status); 
+    }  /* end if rank = 0 */
+    else if (rank == 1) { /* begin if rank = 1 */
+       MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req );
+       MPI_Cancel(&req);
+       MPI_Wait(&req, &status);
+       MPI_Test_cancelled(&status, &flag);
+       if (!flag && status.MPI_ERROR != MPI_SUCCESS) {
+           err++;
+           printf( "Cancel of a send returned an error in the status field.\n" );
+       }
+       /* end if status.MPI_ERROR */
+    }  /* end if rank == 1 */
+#endif
+
+    MPI_Barrier(MPI_COMM_WORLD); 
+
+    if (rank == 1) {  /* begin if rank = 1 */
+       if (err) {
+           printf( "Test failed with %d errors.\n", err );
+       }
+       else {
+           printf( " No Errors\n" );
+       }
+    }
+
+    MPI_Finalize( );
+
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/commit.c b/teshsuite/smpi/mpich-test/pt2pt/commit.c
new file mode 100644 (file)
index 0000000..09570f0
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * This is a test of Type_commit.  This checks to see if Type_commit
+ * (or Type_struct) replaces a struct with a contiguous type, and
+ * that that type is constructed correctly.
+ */
+
+#include "mpi.h"
+#include <stdio.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int main( int argc, char **argv )
+{
+    int          nsize, n2size;
+    MPI_Aint     nlb, nub, n2lb, n2ub;
+    MPI_Datatype ntype, n2type;
+    MPI_Aint     displs[2];
+    MPI_Datatype types[2];
+    int          blockcounts[2];
+    double       myarray[10];
+    int          err = 0;
+
+    MPI_Init( &argc, &argv );
+    
+    MPI_Address( &myarray[0], &displs[0] );
+    MPI_Address( &myarray[3], &displs[1] );
+    blockcounts[0] = 3;
+    blockcounts[1] = 1;
+    displs[1] = displs[1] - displs[0];
+    displs[0] = 0;
+    types[0] = MPI_DOUBLE;
+    types[1] = MPI_DOUBLE;
+    MPI_Type_struct( 2, blockcounts, displs, types, &ntype );
+    MPI_Type_commit( &ntype );
+
+    MPI_Type_size( ntype, &nsize );
+    MPI_Type_lb( ntype, &nlb );
+    MPI_Type_ub( ntype, &nub );
+
+    if (nlb != 0) {
+       err++;
+       printf( "LB for struct is %d\n", (int)nlb );
+    }
+    if (nub != 4 * sizeof(double)) {
+       err++;
+       printf( "UB for struct is %d != %d\n", (int)nub, 
+               4 * (int)sizeof(double) );
+    }
+    if (nsize != 4 * sizeof(double)) {
+       err++;
+       printf( "Size for struct %d != %d\n", nsize, 4 * (int)sizeof(double) );
+    }
+
+    MPI_Type_contiguous( 3, ntype, &n2type );
+    MPI_Type_commit( &n2type );
+
+    MPI_Type_size( n2type, &n2size );
+    MPI_Type_lb( n2type, &n2lb );
+    MPI_Type_ub( n2type, &n2ub );
+
+    if (n2size != 3 * nsize) {
+       err++;
+       printf( "Size of contig type %d != %d\n", n2size, 3*nsize );
+    }
+    if (n2lb != 0) {
+       err++;
+       printf( "LB for contig is %d\n", (int)n2lb );
+    }
+    if (n2ub != 3 * nub) {
+       err++;
+       printf( "UB for contig %d != %d\n", (int)n2ub, 3 * (int)nub );
+    }
+
+    if (err) {
+       printf( "Found %d errors\n", err );
+    }
+    else {
+       printf( " No Errors\n" );
+    }
+    MPI_Type_free( &ntype );
+    MPI_Type_free( &n2type );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/dataalign.c b/teshsuite/smpi/mpich-test/pt2pt/dataalign.c
new file mode 100644 (file)
index 0000000..a04bd9a
--- /dev/null
@@ -0,0 +1,105 @@
+#include "test.h"
+#include <stdio.h>
+#include "mpi.h"
+#include <ctype.h>
+
+
+int main( int argc, char *argv[])
+{
+       struct a {      int     i;
+                       char    c;
+               } s[10], s1[10];
+       int j;
+       int errs = 0, toterrs;
+       int rank, size, tsize;
+       MPI_Aint text;
+       int blens[2]; 
+       MPI_Aint disps[2];
+       MPI_Datatype bases[2];
+       MPI_Datatype str, con;
+       MPI_Status status;
+
+       MPI_Init( &argc, &argv );
+
+       MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+       MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+       for( j = 0; j < 10; j ++ ) {
+               s[j].i = j + rank;
+               s[j].c = j + rank + 'a';
+       }
+
+       blens[0] = blens[1] = 1;
+       disps[0] = 0; disps[1] = sizeof(int);
+       bases[0] = MPI_INT; bases[1] = MPI_CHAR;
+       MPI_Type_struct( 2, blens, disps, bases, &str );
+       MPI_Type_commit( &str );
+       MPI_Type_contiguous( 10, str, &con );
+       MPI_Type_commit( &con );
+       MPI_Type_size( con, &tsize );
+       MPI_Type_extent( con, &text );
+
+#ifdef DEBUG
+       printf("Size of MPI array is %d, extent is %d\n", tsize, text );
+#endif
+
+#ifdef DEBUG
+        {
+       void * p1, *p2;
+       p1 = s;
+       p2 = &(s[10].i);  /* This statement may fail on some systems */
+       printf("C array starts at %p and ends at %p for a length of %d\n",
+               s, &(s[9].c), (char *)p2-(char *)p1 );
+        }
+#endif
+       MPI_Type_extent( str, &text );
+#ifdef DEBUG
+       MPI_Type_size( str, &tsize );
+       printf("Size of MPI struct is %d, extent is %d\n", tsize, (int)text );
+       printf("Size of C struct is %d\n", sizeof(struct a) );
+#endif
+       if (text != sizeof(struct a)) {
+           printf( "Extent of struct a (%d) does not match sizeof (%d)\n",
+                   (int)text, (int)sizeof(struct a) );
+           errs++;
+       }
+
+       MPI_Send( s, 1, con, rank ^ 1, 0, MPI_COMM_WORLD );
+       MPI_Recv( s1, 1, con, rank ^ 1, 0, MPI_COMM_WORLD, &status );
+
+       for( j = 0; j < 10; j++ ) {
+#ifdef DEBUG       
+               printf("%d Sent: %d %c, Got: %d %c\n", rank,
+                       s[j].i, s[j].c, s1[j].i, s1[j].c );
+#endif
+               if ( s1[j].i != j + status.MPI_SOURCE ) {
+                   errs++;
+                   printf( "Got s[%d].i = %d; expected %d\n", j, s1[j].i,
+                           j + status.MPI_SOURCE );
+               }
+               if ( s1[j].c != 'a' + j + status.MPI_SOURCE ) {
+                   errs++;
+                   /* If the character is not a printing character, 
+                      this can generate an file that diff, for example,
+                      believes is a binary file */
+                   if (isprint( (int)(s1[j].c) )) {
+                       printf( "Got s[%d].c = %c; expected %c\n", j, s1[j].c,
+                               j + status.MPI_SOURCE + 'a');
+                   }
+                   else {
+                       printf( "Got s[%d].c = %x; expected %c\n", j, (int)s1[j].c,
+                               j + status.MPI_SOURCE + 'a');
+                   }
+               }
+       }
+
+       MPI_Allreduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+       if (rank == 0) {
+           if (toterrs > 0) printf( "Found %d errors\n", toterrs );
+           else             printf( " No Errors\n" );
+       }
+       MPI_Type_free( &str );
+       MPI_Type_free( &con );
+       MPI_Finalize();
+       return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/dtypelife.c b/teshsuite/smpi/mpich-test/pt2pt/dtypelife.c
new file mode 100644 (file)
index 0000000..baa3d11
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Program to test that datatypes that are freed with MPI_TYPE_FREE
+ * are not actually deleted until communication that they are a part of
+ * has completed.
+ *
+ */
+
+#include <stdio.h>
+#include "test.h"
+#include "mpi.h"
+
+#define SIZE 10000
+static int src  = 1;
+static int dest = 0;
+
+/* Prototypes for picky compilers */
+void Generate_Data ( int *, int );
+
+void Generate_Data(buffer, buff_size)
+int *buffer;
+int buff_size;
+{
+    int i;
+
+    for (i = 0; i < buff_size; i++)
+       buffer[i] = i+1;
+}
+
+int main( int argc, char **argv)
+{
+    int rank; /* My Rank (0 or 1) */
+    int tag, count, i, errcnt = 0;
+    MPI_Request handle;
+    double data[100];
+    MPI_Status status;
+    MPI_Datatype rowtype;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+    tag    = 2001;
+    count  = 1;
+    for (i = 0; i < 100; i++)
+       data[i] = i;
+    MPI_Type_vector( 10, 1, 10, MPI_DOUBLE, &rowtype );
+    MPI_Type_commit( &rowtype );
+    if (rank == src) { 
+       MPI_Irecv(data, count, rowtype, dest, tag, MPI_COMM_WORLD,
+                &handle ); 
+       MPI_Type_free( &rowtype );
+       MPI_Recv( (void *)0, 0, MPI_INT, dest, tag+1, 
+                 MPI_COMM_WORLD, &status );
+       MPI_Wait( &handle, &status );
+       /* Check for correct data */
+       for (i = 0; i < 10; i++) if (data[i*10] != i*10) {
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](rcv row-row) %d'th element = %f, should be %f\n",
+                    rank, i, data[i*10], 10.0*i );
+           }
+
+    } else if (rank == dest) {
+       MPI_Send( (void *)0, 0, MPI_INT, src, tag+1, MPI_COMM_WORLD );
+       /* By using an Ssend first, we make sure that the Irecv doesn't
+          match until after the type has been freed */
+       MPI_Isend( data, count, rowtype, src, tag, MPI_COMM_WORLD, 
+                 &handle );
+       MPI_Type_free( &rowtype );
+       MPI_Wait( &handle, &status );
+       }
+
+    i = errcnt;
+    MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (errcnt > 0) {
+       printf( "Found %d errors in the run\n", errcnt );
+       }
+    Test_Waitforall( );
+    MPI_Finalize();
+
+    return 0;
+}
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/dtyperecv.c b/teshsuite/smpi/mpich-test/pt2pt/dtyperecv.c
new file mode 100644 (file)
index 0000000..a65e484
--- /dev/null
@@ -0,0 +1,61 @@
+
+/*
+> so, my second question:
+> 
+>   2. what is the output of that MPI program?
+> 
+> i think it should be 42 -1 42 -1.
+> 
+> but compiling with mpich-1.1.0 an running on solaris machines
+> (ch_p4) writes : 42 -1 42 0.
+> 
+> thanks,
+>     Holger
+> 
+> MPI code:
+> -------------------------------------------------------
+*/
+#include "test.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi.h"
+
+int main( int argc, char **argv )
+{
+  int my_rank, i, data[6];
+  MPI_Status  status;
+  MPI_Datatype  my_type;
+  int errs = 0, toterrs;
+
+  MPI_Init(&argc, &argv);
+  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
+
+  MPI_Type_vector(2, 1, 2, MPI_INT, &my_type);
+  MPI_Type_commit(&my_type);
+
+  if (my_rank == 0) {
+    data[0]=42;data[1]=42;
+    MPI_Send(&(data[0]), 2, MPI_INT, 1, 42, MPI_COMM_WORLD);
+  } else {
+    for (i=0; i<6; i++)
+      data[i] = -1;
+    MPI_Recv(&(data[0]), 2, my_type, 0, 42, MPI_COMM_WORLD, &status);
+    /* Check for correct receipt */
+    if (data[0] != 42 || data[1] != -1 || data[2] != 42 || data[3] != -1 
+       || data[4] != -1 || data[5] != -1) {
+       errs++;
+       for (i=0; i<4; i++)
+           printf("%i ",data[i]);
+       printf("\n");
+    }
+  }
+  MPI_Allreduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+  if (my_rank == 0) {
+      if (toterrs > 0) printf( "Found %d errors\n", toterrs );
+      else             printf( " No Errors\n" );
+  }
+
+  MPI_Type_free( &my_type );
+  MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/dtypes.c b/teshsuite/smpi/mpich-test/pt2pt/dtypes.c
new file mode 100644 (file)
index 0000000..efcd4a0
--- /dev/null
@@ -0,0 +1,343 @@
+/* This file contains code to generate a variety of MPI datatypes for testing
+   the various MPI routines. 
+
+ To simplify the test code, this generates an array of datatypes, buffers with
+ data and buffers with no data (0 bits) for use in send and receive 
+ routines of various types.
+
+  In addition, this doesn't even test all of the possibilities.  For example,
+  there is currently no test of sending more than one item defined with 
+  MPI_Type_contiguous .
+
+  This routine should be extended as time permits.
+
+  Note also that this test assumes that the sending and receive types are
+  the same.  MPI requires only that the type signatures match, which is
+  a weaker requirement.
+
+  THIS CODE IS FROM mpich/tsuite AND SHOULD BE CHANGED THERE ONLY
+ */
+
+#include "mpi.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include "dtypes.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+/* Change this to test only the basic, predefined types */
+static int basic_only = 0;
+
+/* 
+   Arrays types, inbufs, outbufs, and counts are allocated by the
+   CALLER.  n on input is the maximum number; on output, it is the
+   number defined .
+   names contains a string identifying the test
+
+   See AllocateForData below for a routine to allocate these arrays.
+
+   We may want to add a routine to call to check that the proper data
+   has been received.
+ */
+/* TYPECNT is the number of instances of each type in a test */
+#define TYPECNT 10
+#define SETUPBASICTYPE(mpi,c,name) { int i; c *a; \
+if (cnt > *n) {*n = cnt; return; }\
+types[cnt] = mpi; \
+inbufs[cnt] = (void *)calloc( TYPECNT,sizeof(c) ); \
+outbufs[cnt] = (void *)malloc( sizeof(c) * TYPECNT ); \
+a = (c *)inbufs[cnt]; for (i=0; i<TYPECNT; i++) a[i] = i; \
+a = (c *)outbufs[cnt]; for (i=0; i<TYPECNT; i++) a[i] = 0; \
+names[cnt] = (char *)malloc(100);\
+sprintf( names[cnt], "Basic type %s", name );\
+counts[cnt]  = TYPECNT; bytesize[cnt] = sizeof(c) * TYPECNT; cnt++; }
+
+#define SETUPCONTIGTYPE(mpi,c,name) { int i; c *a; \
+if (cnt > *n) {*n = cnt; return; }\
+MPI_Type_contiguous( TYPECNT, mpi, types + cnt );\
+MPI_Type_commit( types + cnt );\
+inbufs[cnt] = (void *)calloc( TYPECNT, sizeof(c) ); \
+outbufs[cnt] = (void *)malloc( sizeof(c) * TYPECNT ); \
+a = (c *)inbufs[cnt]; for (i=0; i<TYPECNT; i++) a[i] = i; \
+a = (c *)outbufs[cnt]; for (i=0; i<TYPECNT; i++) a[i] = 0; \
+names[cnt] = (char *)malloc(100);\
+sprintf( names[cnt], "Contig type %s", name );\
+counts[cnt]  = 1;  bytesize[cnt] = sizeof(c) * TYPECNT; cnt++; }
+
+/* These are vectors of block length one.  */
+#define STRIDE 9
+#define SETUPVECTORTYPE(mpi,c,name) { int i; c *a; \
+if (cnt > *n) {*n = cnt; return; }\
+MPI_Type_vector( TYPECNT, 1, STRIDE, mpi, types + cnt );\
+MPI_Type_commit( types + cnt );\
+inbufs[cnt] = (void *)calloc( sizeof(c) * TYPECNT * STRIDE,1); \
+outbufs[cnt] = (void *)calloc( sizeof(c) * TYPECNT * STRIDE,1); \
+a = (c *)inbufs[cnt]; for (i=0; i<TYPECNT; i++) a[i*STRIDE] = i; \
+a = (c *)outbufs[cnt]; for (i=0; i<TYPECNT; i++) a[i*STRIDE] = 0; \
+names[cnt] = (char *)malloc(100);\
+sprintf( names[cnt], "Vector type %s", name );\
+counts[cnt]  = 1;  bytesize[cnt] = sizeof(c) * TYPECNT * STRIDE ;cnt++; }
+
+/* This indexed type is setup like a contiguous type .
+   Note that systems may try to convert this to contiguous, so we'll
+   eventually need a test that has holes in it */
+#define SETUPINDEXTYPE(mpi,c,name) { int i; int *lens, *disp; c *a; \
+if (cnt > *n) {*n = cnt; return; }\
+lens = (int *)malloc( TYPECNT * sizeof(int) ); \
+disp = (int *)malloc( TYPECNT * sizeof(int) ); \
+for (i=0; i<TYPECNT; i++) { lens[i] = 1; disp[i] = i; } \
+MPI_Type_indexed( TYPECNT, lens, disp, mpi, types + cnt );\
+free( lens ); free( disp ); \
+MPI_Type_commit( types + cnt );\
+inbufs[cnt] = (void *)calloc( TYPECNT, sizeof(c) ); \
+outbufs[cnt] = (void *)malloc( sizeof(c) * TYPECNT ); \
+a = (c *)inbufs[cnt]; for (i=0; i<TYPECNT; i++) a[i] = i; \
+a = (c *)outbufs[cnt]; for (i=0; i<TYPECNT; i++) a[i] = 0; \
+names[cnt] = (char *)malloc(100);\
+sprintf( names[cnt], "Index type %s", name );\
+counts[cnt]  = 1;  bytesize[cnt] = sizeof(c) * TYPECNT; cnt++; }
+
+/* This defines a structure of two basic members; by chosing things like
+   (char, double), various packing and alignment tests can be made */
+#define SETUPSTRUCT2TYPE(mpi1,c1,mpi2,c2,name,tname) { int i; \
+MPI_Datatype b[3]; int cnts[3]; \
+struct name { c1 a1; c2 a2; } *a, samp; \
+MPI_Aint disp[3]; \
+b[0] = mpi1; b[1] = mpi2; b[2] = MPI_UB;\
+cnts[0] = 1; cnts[1] = 1; cnts[2] = 1;\
+MPI_Address( &(samp.a2), &disp[1] ); \
+MPI_Address( &(samp.a1), &disp[0] ); \
+MPI_Address( &(samp) + 1, &disp[2] ); \
+disp[1] = disp[1] - disp[0]; disp[2] = disp[2] - disp[0]; disp[0] = 0; \
+if (cnt > *n) {*n = cnt; return; }\
+MPI_Type_struct( 3, cnts, disp, b, types + cnt );\
+MPI_Type_commit( types + cnt );\
+inbufs[cnt] = (void *)calloc( sizeof(struct name) * TYPECNT,1); \
+outbufs[cnt] = (void *)calloc( sizeof(struct name) * TYPECNT,1); \
+a = (struct name *)inbufs[cnt]; for (i=0; i<TYPECNT; i++) { a[i].a1 = i; \
+ a[i].a2 = i; } \
+a = (struct name *)outbufs[cnt]; for (i=0; i<TYPECNT; i++) { a[i].a1 = 0; \
+ a[i].a2 = 0; } \
+names[cnt] = (char *)malloc(100);\
+sprintf( names[cnt], "Struct type %s", tname );\
+counts[cnt]  = TYPECNT;  bytesize[cnt] = sizeof(struct name) * TYPECNT;cnt++; }
+
+/* This accomplished the same effect as VECTOR, but allow a count of > 1 */
+#define SETUPSTRUCTTYPEUB(mpi,c,name) { int i; c *a; \
+int blens[2];  MPI_Aint disps[2]; MPI_Datatype mtypes[2]; \
+if (cnt > *n) {*n = cnt; return; }\
+blens[0] = 1; blens[1] = 1; disps[0] = 0; disps[1] = STRIDE * sizeof(c); \
+mtypes[0] = mpi; mtypes[1] = MPI_UB; \
+MPI_Type_struct( 2, blens, disps, mtypes, types + cnt );\
+MPI_Type_commit( types + cnt );\
+inbufs[cnt] = (void *)calloc( sizeof(c) * TYPECNT * STRIDE,1); \
+outbufs[cnt] = (void *)calloc( sizeof(c) * TYPECNT * STRIDE,1); \
+a = (c *)inbufs[cnt]; for (i=0; i<TYPECNT; i++) a[i*STRIDE] = i; \
+a = (c *)outbufs[cnt]; for (i=0; i<TYPECNT; i++) a[i*STRIDE] = 0; \
+names[cnt] = (char *)malloc(100);\
+sprintf( names[cnt], "Struct (MPI_UB) type %s", name );\
+counts[cnt]  = TYPECNT;  bytesize[cnt] = sizeof(c) * TYPECNT * STRIDE;cnt++; }
+
+/* 
+ * Set whether only the basic types should be generated
+ */
+void BasicDatatypesOnly( void )
+{
+    basic_only = 1;
+}
+
+static int nbasic_types = 0;
+/* On input, n is the size of the various buffers.  On output, 
+   it is the number available types 
+ */
+void GenerateData( MPI_Datatype *types, void **inbufs, void **outbufs, 
+                  int *counts, int *bytesize, char **names, int *n )
+{
+int cnt = 0;   /* Number of defined types */
+
+/* First, generate an element of each basic type */
+SETUPBASICTYPE(MPI_CHAR,char,"MPI_CHAR");
+SETUPBASICTYPE(MPI_SHORT,short,"MPI_SHORT");
+SETUPBASICTYPE(MPI_INT,int,"MPI_INT");
+SETUPBASICTYPE(MPI_LONG,long,"MPI_LONG");
+SETUPBASICTYPE(MPI_UNSIGNED_CHAR,unsigned char,"MPI_UNSIGNED_CHAR");
+SETUPBASICTYPE(MPI_UNSIGNED_SHORT,unsigned short,"MPI_UNSIGNED_SHORT");
+SETUPBASICTYPE(MPI_UNSIGNED,unsigned,"MPI_UNSIGNED");
+SETUPBASICTYPE(MPI_UNSIGNED_LONG,unsigned long,"MPI_UNSIGNED_LONG");
+SETUPBASICTYPE(MPI_FLOAT,float,"MPI_FLOAT");
+SETUPBASICTYPE(MPI_DOUBLE,double,"MPI_DOUBLE");
+SETUPBASICTYPE(MPI_BYTE,char,"MPI_BYTE");
+#ifdef HAVE_LONG_LONG_INT
+SETUPBASICTYPE(MPI_LONG_LONG_INT,long long,"MPI_LONG_LONG_INT");
+#endif
+#ifdef HAVE_LONG_DOUBLE
+SETUPBASICTYPE(MPI_LONG_DOUBLE,long double,"MPI_LONG_DOUBLE");
+#endif
+nbasic_types = cnt;
+
+ if (basic_only) {
+     *n = cnt;
+     return;
+ }
+/* Generate contiguous data items */
+SETUPCONTIGTYPE(MPI_CHAR,char,"MPI_CHAR");
+SETUPCONTIGTYPE(MPI_SHORT,short,"MPI_SHORT");
+SETUPCONTIGTYPE(MPI_INT,int,"MPI_INT");
+SETUPCONTIGTYPE(MPI_LONG,long,"MPI_LONG");
+SETUPCONTIGTYPE(MPI_UNSIGNED_CHAR,unsigned char,"MPI_UNSIGNED_CHAR");
+SETUPCONTIGTYPE(MPI_UNSIGNED_SHORT,unsigned short,"MPI_UNSIGNED_SHORT");
+SETUPCONTIGTYPE(MPI_UNSIGNED,unsigned,"MPI_UNSIGNED");
+SETUPCONTIGTYPE(MPI_UNSIGNED_LONG,unsigned long,"MPI_UNSIGNED_LONG");
+SETUPCONTIGTYPE(MPI_FLOAT,float,"MPI_FLOAT");
+SETUPCONTIGTYPE(MPI_DOUBLE,double,"MPI_DOUBLE");
+SETUPCONTIGTYPE(MPI_BYTE,char,"MPI_BYTE");
+#ifdef HAVE_LONG_LONG_INT
+SETUPCONTIGTYPE(MPI_LONG_LONG_INT,long long,"MPI_LONG_LONG_INT");
+#endif
+#ifdef HAVE_LONG_DOUBLE
+SETUPCONTIGTYPE(MPI_LONG_DOUBLE,long double,"MPI_LONG_DOUBLE");
+#endif
+
+/* Generate vector items */
+SETUPVECTORTYPE(MPI_CHAR,char,"MPI_CHAR");
+SETUPVECTORTYPE(MPI_SHORT,short,"MPI_SHORT");
+SETUPVECTORTYPE(MPI_INT,int,"MPI_INT");
+SETUPVECTORTYPE(MPI_LONG,long,"MPI_LONG");
+SETUPVECTORTYPE(MPI_UNSIGNED_CHAR,unsigned char,"MPI_UNSIGNED_CHAR");
+SETUPVECTORTYPE(MPI_UNSIGNED_SHORT,unsigned short,"MPI_UNSIGNED_SHORT");
+SETUPVECTORTYPE(MPI_UNSIGNED,unsigned,"MPI_UNSIGNED");
+SETUPVECTORTYPE(MPI_UNSIGNED_LONG,unsigned long,"MPI_UNSIGNED_LONG");
+SETUPVECTORTYPE(MPI_FLOAT,float,"MPI_FLOAT");
+SETUPVECTORTYPE(MPI_DOUBLE,double,"MPI_DOUBLE");
+SETUPVECTORTYPE(MPI_BYTE,char,"MPI_BYTE");
+#ifdef HAVE_LONG_LONG_INT
+SETUPVECTORTYPE(MPI_LONG_LONG_INT,long long,"MPI_LONG_LONG_INT");
+#endif
+#ifdef HAVE_LONG_DOUBLE
+SETUPVECTORTYPE(MPI_LONG_DOUBLE,long double,"MPI_LONG_DOUBLE");
+#endif
+
+/* Generate indexed items */
+SETUPINDEXTYPE(MPI_CHAR,char,"MPI_CHAR");
+SETUPINDEXTYPE(MPI_SHORT,short,"MPI_SHORT");
+SETUPINDEXTYPE(MPI_INT,int,"MPI_INT");
+SETUPINDEXTYPE(MPI_LONG,long,"MPI_LONG");
+SETUPINDEXTYPE(MPI_UNSIGNED_CHAR,unsigned char,"MPI_UNSIGNED_CHAR");
+SETUPINDEXTYPE(MPI_UNSIGNED_SHORT,unsigned short,"MPI_UNSIGNED_SHORT");
+SETUPINDEXTYPE(MPI_UNSIGNED,unsigned,"MPI_UNSIGNED");
+SETUPINDEXTYPE(MPI_UNSIGNED_LONG,unsigned long,"MPI_UNSIGNED_LONG");
+SETUPINDEXTYPE(MPI_FLOAT,float,"MPI_FLOAT");
+SETUPINDEXTYPE(MPI_DOUBLE,double,"MPI_DOUBLE");
+SETUPINDEXTYPE(MPI_BYTE,char,"MPI_BYTE");
+#ifdef HAVE_LONG_LONG_INT
+SETUPINDEXTYPE(MPI_LONG_LONG_INT,long long,"MPI_LONG_LONG_INT");
+#endif
+#ifdef HAVE_LONG_DOUBLE
+SETUPINDEXTYPE(MPI_LONG_DOUBLE,long double,"MPI_LONG_DOUBLE");
+#endif
+
+/* Generate struct items */ 
+SETUPSTRUCT2TYPE(MPI_CHAR,char,MPI_DOUBLE,double,d1,"char-double")
+SETUPSTRUCT2TYPE(MPI_DOUBLE,double,MPI_CHAR,char,d2,"double-char")
+SETUPSTRUCT2TYPE(MPI_UNSIGNED,unsigned,MPI_DOUBLE,double,d3,"unsigned-double")
+SETUPSTRUCT2TYPE(MPI_FLOAT,float,MPI_LONG,long,d4,"float-long")
+SETUPSTRUCT2TYPE(MPI_UNSIGNED_CHAR,unsigned char,MPI_CHAR,char,d5,
+  "unsigned char-char")
+SETUPSTRUCT2TYPE(MPI_UNSIGNED_SHORT,unsigned short,MPI_DOUBLE,double,d6,
+  "unsigned short-double")
+
+/* Generate struct using MPI_UB */
+SETUPSTRUCTTYPEUB(MPI_CHAR,char,"MPI_CHAR");
+SETUPSTRUCTTYPEUB(MPI_SHORT,short,"MPI_SHORT");
+SETUPSTRUCTTYPEUB(MPI_INT,int,"MPI_INT");
+SETUPSTRUCTTYPEUB(MPI_LONG,long,"MPI_LONG");
+SETUPSTRUCTTYPEUB(MPI_UNSIGNED_CHAR,unsigned char,"MPI_UNSIGNED_CHAR");
+SETUPSTRUCTTYPEUB(MPI_UNSIGNED_SHORT,unsigned short,"MPI_UNSIGNED_SHORT");
+SETUPSTRUCTTYPEUB(MPI_UNSIGNED,unsigned,"MPI_UNSIGNED");
+SETUPSTRUCTTYPEUB(MPI_UNSIGNED_LONG,unsigned long,"MPI_UNSIGNED_LONG");
+SETUPSTRUCTTYPEUB(MPI_FLOAT,float,"MPI_FLOAT");
+SETUPSTRUCTTYPEUB(MPI_DOUBLE,double,"MPI_DOUBLE");
+SETUPSTRUCTTYPEUB(MPI_BYTE,char,"MPI_BYTE");
+
+/* 60 different entries to this point + 4 for long long and 
+   4 for long double */
+*n = cnt;
+}
+
+/* 
+   MAX_TEST should be 1 + actual max (allows us to check that it was, 
+   indeed, large enough) 
+ */
+#define MAX_TEST 70
+void AllocateForData( MPI_Datatype **types, void ***inbufs, void ***outbufs, 
+                     int **counts, int **bytesize, char ***names, int *n )
+{
+    *types    = (MPI_Datatype *)malloc( MAX_TEST * sizeof(MPI_Datatype) );
+    *inbufs   = (void **) malloc( MAX_TEST * sizeof(void *) );
+    *outbufs  = (void **) malloc( MAX_TEST * sizeof(void *) );
+    *names    = (char **) malloc( MAX_TEST * sizeof(char *) );
+    *counts   = (int *)   malloc( MAX_TEST * sizeof(int) );
+    *bytesize = (int *)   malloc( MAX_TEST * sizeof(int) );
+    *n       = MAX_TEST;
+}
+
+int CheckData( void *inbuf, void *outbuf, int size_bytes )
+{
+    char *in = (char *)inbuf, *out = (char *)outbuf;
+    int  i;
+    for (i=0; i<size_bytes; i++) {
+       if (in[i] != out[i]) {
+           return i + 1;
+       }
+    }
+    return 0;
+}
+
+/* 
+ * This is a version of CheckData that prints error messages
+ */
+int CheckDataAndPrint( void *inbuf, void *outbuf, int size_bytes, 
+                      char *typename, int typenum )
+{
+    int errloc, world_rank;
+    
+    if ((errloc = CheckData( inbuf, outbuf, size_bytes ))) {
+       char *p1, *p2;
+       MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+       fprintf( stderr, 
+        "Error in data with type %s (type %d on %d) at byte %d of %d\n", 
+                typename, typenum, world_rank, errloc - 1, size_bytes );
+       p1 = (char *)inbuf;
+       p2 = (char *)outbuf;
+       fprintf( stderr, 
+                "Got %x expected %x\n", p2[errloc-1], p1[errloc-1] );
+#if 0
+       MPIR_PrintDatatypeUnpack( stderr, counts[j], types[j], 
+                                 0, 0 );
+#endif
+    }
+    return errloc;
+}
+
+void FreeDatatypes( MPI_Datatype *types, void **inbufs, void **outbufs, 
+                   int *counts, int *bytesize, char **names, int n )
+{
+    int i;
+    for (i=0; i<n; i++) {
+       if (inbufs[i]) 
+           free( inbufs[i] );
+       if (outbufs[i]) 
+           free( outbufs[i] );
+       free( names[i] );
+       /* Only if not basic ... */
+       if (i >= nbasic_types) 
+           MPI_Type_free( types + i );
+    }
+    free( inbufs );
+    free( outbufs );
+    free( names );
+    free( counts );
+    free( bytesize );
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/dtypes.h b/teshsuite/smpi/mpich-test/pt2pt/dtypes.h
new file mode 100644 (file)
index 0000000..7aabe29
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef MPITEST_DTYPES
+#define MPITEST_DTYPES
+
+void GenerateData ( MPI_Datatype *, void **, void **, int *, int *,
+                             char **, int * );
+void AllocateForData ( MPI_Datatype **, void ***, void ***, 
+                                int **, int **, char ***, int * );
+int CheckData ( void *, void *, int );
+int CheckDataAndPrint ( void *, void *, int, char *, int );
+void FreeDatatypes ( MPI_Datatype *, void **, void **, 
+                              int *, int *, char **, int );
+void BasicDatatypesOnly( void );
+#endif
diff --git a/teshsuite/smpi/mpich-test/pt2pt/exittest.c b/teshsuite/smpi/mpich-test/pt2pt/exittest.c
new file mode 100644 (file)
index 0000000..09f4c92
--- /dev/null
@@ -0,0 +1,78 @@
+
+/*
+  A report was made that this program hung on a 2 processor LINUX cluster.
+  We haven't seen that problem, but since this does test whether process 0
+  waits for the other processes to complete before exiting, it is a good
+  test to have.
+ */
+#include <stdio.h>
+#include "mpi.h"
+#define MAX_NUM_PROCS 10
+
+int main( int argc, char *argv[])
+{
+  int idx;
+  int num_procs,my_id;
+  int s;
+  int r;
+  MPI_Status status;
+
+  MPI_Init(&argc,&argv);
+  MPI_Comm_size(MPI_COMM_WORLD,&num_procs);
+  MPI_Comm_rank(MPI_COMM_WORLD,&my_id);
+  
+  if (num_procs < 3)
+    {
+    fprintf(stderr, "Need at least 3 processes for this bug\n");
+    MPI_Finalize();
+    return 0;
+    }
+
+#ifdef DEBUG  
+  fprintf(stderr, "%d Starting ....\n", my_id);
+  fflush(stderr);
+#endif
+  
+  if (my_id == 1)
+    {
+    idx = 2;
+    s = 333;
+#ifdef DEBUG
+    fprintf(stdout, "%d start send (%d) to %d\n", my_id, s, idx);
+    fflush(stdout);
+#endif
+    MPI_Send(&s, 1, MPI_INT, idx, 0, MPI_COMM_WORLD);
+#ifdef DEBUG
+    fprintf(stdout, "%d finished send to %d\n", my_id, idx);
+    fflush(stdout);
+#endif
+    }
+  
+  if (my_id == 2)
+    {
+    idx = 1;
+#ifdef DEBUG
+    fprintf(stdout, "%d start recv from %d\n", my_id, idx);
+    fflush(stdout);
+#endif
+    MPI_Recv (&r, 1, MPI_INT, idx, 0, MPI_COMM_WORLD, &status );
+#ifdef DEBUG
+    fprintf(stdout, "%d finished recv (%d) from %d\n", my_id, r, idx);
+    fflush(stdout);
+#endif
+    }
+
+#ifdef DBUG  
+  fprintf(stdout, "%d Done ....\n",my_id);
+  fflush(stdout);
+#endif  
+  MPI_Barrier( MPI_COMM_WORLD );
+  if (my_id == 0) {
+      /* If we reach here, we're done */
+      printf( " No Errors\n" );
+  }
+
+  MPI_Finalize();
+  return 0;
+}
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/fairness/README b/teshsuite/smpi/mpich-test/pt2pt/fairness/README
new file mode 100644 (file)
index 0000000..61bb15e
--- /dev/null
@@ -0,0 +1,3 @@
+These are programs to test the fairness of mpi.
+On some underlying devices, you don't want to know the
+results...
diff --git a/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness-euih.c b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness-euih.c
new file mode 100644 (file)
index 0000000..332cc05
--- /dev/null
@@ -0,0 +1,80 @@
+/* 
+ * Program to test the fairness of the MPI implementation over source.
+ * All of the programs wait on a barrier, then node 0 starts receiving
+ * small messages using ANY_SOURCE from all of the other nodes who
+ * send as much as they can.  Node 0 collects statistics on the rate
+ * messages are received from each source. (Every N messages it
+ * prints out what percentage of the last N received were from each
+ * source. It does this for <size-1> times.
+ *
+ * This program should be run with at least 8 nodes just to be (un)fair
+ *
+ * Patrick Bridges * bridges@mcs.anl.gov * patrick@CS.MsState.Edu 
+ */
+
+#include <stdio.h>
+#include "test.h"
+#define MPG 200
+#define MSZ 1
+
+int 
+main(argc, argv)
+int argc;
+char **argv;
+{
+    int rank, size, an_int[MSZ]; 
+    int dummy[4], d1, d2;
+    char *Current_Test = NULL;
+    int *num_array, i, j;
+    int dontcare, allgrp;
+    
+    /* Initialize the environment */
+    mp_environ(&size,&rank);
+
+    /* Get allgrp from the task */
+    d1 = 4; d2 = 3;
+    mp_task_query(dummy,&d1,&d2);
+    allgrp = dummy[3];
+    dontcare = dummy[0];
+
+    Test_Init("fairness", rank);
+
+    /* Wait for everyone to be ready */
+    if (rank == 0) { 
+       /* Initialize an array to keep statistics in */
+       num_array = (int *)malloc((size - 1) * sizeof(int));
+
+       mp_sync(&allgrp);
+       
+       for (i = 0; i < size - 1; i++) {
+           /* Clear the buffer of counts */
+           memset(num_array, 0, (size - 1) * sizeof(int));
+           for (j = 0; j < MPG; j++) {
+               d1 = sizeof(int)*MSZ;
+               d2 = 2000;
+               mp_brecv(an_int, &d1, &dontcare, &d2);
+               num_array[d1 - 1]++;
+           }
+           Test_Printf("Statistics for message group %d:\n", i + 1);
+           for (j = 0; j < size -1 ; j++)
+               Test_Printf("%f%% of last %d messages received \
+were from source %d.\n",
+                           num_array[j]*100.0/MPG, MPG, j + 1);
+       }
+       free(num_array);
+       (void)Summarize_Test_Results();
+    } else {
+       mp_sync(&allgrp);
+       for (i = 0; i < MPG; i++) {
+           int d3, d4;
+
+           d1 = MSZ*sizeof(int);
+           d2 = 0;
+           d3 = 2000;
+           d4 = 0;
+           mp_bend(an_int, &d1, &d2, &d3, &d4);
+       }
+    }
+
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness.c b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness.c
new file mode 100644 (file)
index 0000000..804162e
--- /dev/null
@@ -0,0 +1,72 @@
+/* 
+ * Program to test the fairness of the MPI implementation over source.
+ * All of the programs wait on a barrier, then node 0 starts receiving
+ * small messages using ANY_SOURCE from all of the other nodes who
+ * send as much as they can.  Node 0 collects statistics on the rate
+ * messages are received from each source. (Every N messages it
+ * prints out what percentage of the last N received were from each
+ * source. It does this for <size-1> times.
+ *
+ * This program should be run with at least 8 nodes just to be (un)fair
+ *
+ * Patrick Bridges * bridges@mcs.anl.gov * patrick@CS.MsState.Edu 
+ */
+
+#include <stdio.h>
+#include "test.h"
+#include "mpi.h"
+#define MPG 200
+#define MSZ 1
+int main(argc, argv)
+int argc;
+char **argv;
+{
+    int rank, size, an_int[MSZ]; 
+    char *Current_Test = NULL;
+    int *num_array, i, j;
+    MPI_Status Status;
+    
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+    Test_Init("fairness", rank);
+
+    /* Wait for everyone to be ready */
+    
+    if (rank == 0) { 
+       /* Initialize an array to keep statistics in */
+       num_array = (int *)malloc((size - 1) * sizeof(int));
+
+       MPI_Barrier(MPI_COMM_WORLD);
+       
+       for (i = 0; i < size - 1; i++) {
+           /* Clear the buffer of counts */
+           memset(num_array, 0, (size - 1) * sizeof(int));
+           for (j = 0; j < MPG; j++) {
+               MPI_Recv(an_int, MSZ, MPI_INT, MPI_ANY_SOURCE, 2000, 
+                        MPI_COMM_WORLD, &Status);
+               num_array[Status.MPI_SOURCE - 1]++;
+           }
+           Test_Printf("Statistics for message group %d:\n", i + 1);
+           for (j = 0; j < size -1 ; j++)
+               Test_Printf("%f%% of last %d messages received \
+were from source %d.\n",
+                           num_array[j]*100.0/MPG, MPG, j + 1);
+       }
+       free(num_array);
+       (void)Summarize_Test_Results();
+       MPI_Finalize();
+
+    } else {
+       MPI_Barrier(MPI_COMM_WORLD);
+       for (i = 0; i < MPG; i++) {
+           MPI_Send(an_int, MSZ, MPI_INT, 0, 2000, MPI_COMM_WORLD);
+       }
+       MPI_Finalize();
+    }
+
+    return 0;
+}
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness2.c b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness2.c
new file mode 100644 (file)
index 0000000..5e295d5
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * This program should be run with at least 8 nodes just to (un)fair
+ *
+ * Patrick Bridges * bridges@mcs.anl.gov * patrick@CS.MsState.Edu 
+ */
+
+#include <stdio.h>
+#include "test.h"
+#include "mpi.h"
+
+int main(argc, argv)
+int argc;
+char **argv;
+{
+    int rank, size, an_int; 
+    char *Current_Test = NULL;
+    int *num_array, i, j;
+    MPI_Status Status;
+    
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+    Test_Init("fairness2", rank);
+
+    /* Wait for everyone to be ready */
+    
+    if (rank == 0) { 
+       /* Initialize an array to keep statistics in */
+       num_array = (int *)malloc((size - 1) * sizeof(int));
+
+       /* Make sure everyone is ready */
+       MPI_Barrier(MPI_COMM_WORLD);
+
+       /* Wait for all of the senders to send all of their messages */
+       Test_Message("Waiting for all of the senders to say they're through.");
+       for (i = 0 ; i < size - 1; i++)
+           MPI_Recv(&an_int, 1, MPI_INT, MPI_ANY_SOURCE, 5000,
+                    MPI_COMM_WORLD, &Status);
+       
+       Test_Message("Starting to dequeue messages...");
+       /* Now start dequeuing messages */
+       for (i = 0; i < size - 1; i++) {
+           /* Clear the buffer of counts */
+           memset(num_array, 0, (size - 1) * sizeof(int));
+           for (j = 0; j < 200; j++) {
+               MPI_Recv(&an_int, 1, MPI_INT, MPI_ANY_SOURCE, 2000, 
+                        MPI_COMM_WORLD, &Status);
+               num_array[Status.MPI_SOURCE - 1]++;
+           }
+           Test_Printf("Statistics for message group %d:\n", i + 1);
+           for (j = 0; j < size -1 ; j++)
+               Test_Printf("%f%% of last 200 messages received \
+were from source %d.\n",
+                           num_array[j]/2.0, j + 1);
+       }
+
+       free(num_array);
+       (void)Summarize_Test_Results();
+       MPI_Finalize();
+
+    } else {
+       MPI_Request ReqArray[200];
+       MPI_Status StatArray[200];
+       
+       MPI_Barrier(MPI_COMM_WORLD);
+       an_int = rank;
+       
+       Test_Message("About to send all of the little messages.");
+       /* Send 200 tiny messages - nonblocking so we don't deadlock */
+       for (i = 0; i < 200; i++)
+           MPI_Isend(&an_int, 1, MPI_INT, 0, 2000, MPI_COMM_WORLD, 
+                     &ReqArray[i]);
+
+       Test_Message("Sending the final message.");
+       /* Tell receiver we've sent all of our messages */
+       MPI_Send(&an_int, 1, MPI_INT, 0, 5000, MPI_COMM_WORLD);
+       Test_Message("Waiting on the nonblocking requests.");
+       MPI_Waitall(200,ReqArray,StatArray);
+       (void)Summarize_Test_Results();
+       MPI_Finalize();
+    }
+
+    return 0;
+}
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness2m.c b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness2m.c
new file mode 100644 (file)
index 0000000..706a95d
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * This program should be run with at least 8 nodes just to (un)fair
+ *
+ * Patrick Bridges * bridges@mcs.anl.gov * patrick@CS.MsState.Edu 
+ */
+
+#include <stdio.h>
+#include "test.h"
+#include "mpi.h"
+#include "mpe.h"
+
+int main(argc, argv)
+int argc;
+char **argv;
+{
+    int rank, size, an_int; 
+    char *Current_Test = NULL;
+    int *num_array, i, j;
+    MPI_Status Status;
+    
+    MPI_Init(&argc, &argv);
+    MPE_Init_log();
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+    Test_Init("fairness2m", rank);
+
+    /* Wait for everyone to be ready */
+    
+    if (rank == 0) { 
+       /* Initialize an array to keep statistics in */
+       num_array = (int *)malloc((size - 1) * sizeof(int));
+
+       /* Make sure everyone is ready */
+       MPI_Barrier(MPI_COMM_WORLD);
+
+       /* Wait for all of the senders to send all of their messages */
+       Test_Message("Waiting for all of the senders to say they're through.");
+       for (i = 0 ; i < size - 1; i++) {
+           MPI_Recv(&an_int, 1, MPI_INT, MPI_ANY_SOURCE, 5000,
+                    MPI_COMM_WORLD, &Status);
+           MPE_Log_receive(Status.MPI_SOURCE, 5000, sizeof(int));
+       }
+       Test_Message("Starting to dequeue messages...");
+       /* Now start dequeuing messages */
+       for (i = 0; i < size - 1; i++) {
+           /* Clear the buffer of counts */
+           memset(num_array, 0, (size - 1) * sizeof(int));
+           for (j = 0; j < 200; j++) {
+               MPI_Recv(&an_int, 1, MPI_INT, MPI_ANY_SOURCE, 2000, 
+                        MPI_COMM_WORLD, &Status);
+               MPE_Log_receive(Status.MPI_SOURCE, 2000, sizeof(int));
+               num_array[Status.MPI_SOURCE - 1]++;
+           }
+           Test_Printf("Statistics for message group %d:\n", i + 1);
+           for (j = 0; j < size -1 ; j++)
+               Test_Printf("%f%% of last 200 messages received \
+were from source %d.\n",
+                           num_array[j]/2.0, j + 1);
+       }
+
+       free(num_array);
+       (void)Summarize_Test_Results();
+
+       MPE_Finish_log("/home/bridges/fairness2.log");
+       MPI_Finalize();
+
+    } else {
+       MPI_Request ReqArray[200];
+       MPI_Status StatArray[200];
+       
+       MPI_Barrier(MPI_COMM_WORLD);
+       an_int = rank;
+       
+       Test_Message("About to send all of the little messages.");
+       /* Send 200 tiny messages - nonblocking so we don't deadlock */
+       for (i = 0; i < 200; i++) {
+           MPI_Isend(&an_int, 1, MPI_INT, 0, 2000, MPI_COMM_WORLD, 
+                     &ReqArray[i]);
+           MPE_Log_send(0, 2000, sizeof(int));
+       }
+       Test_Message("Sending the final message.");
+       /* Tell receiver we've sent all of our messages */
+       MPI_Send(&an_int, 1, MPI_INT, 0, 5000, MPI_COMM_WORLD);
+       MPE_Log_send(0, 5000, sizeof(int));
+
+       Test_Message("Waiting on the nonblocking requests.");
+       MPI_Waitall(200,ReqArray,StatArray);
+       (void)Summarize_Test_Results();
+
+       MPE_Finish_log("/home/bridges/fairness2.log");
+       MPI_Finalize();
+    }
+
+    return 0;
+}
+
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/fairness/fairnessm.c b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairnessm.c
new file mode 100644 (file)
index 0000000..709d08a
--- /dev/null
@@ -0,0 +1,79 @@
+/* 
+ * Program to test the fairness of the MPI implementation over source.
+ * All of the programs wait on a barrier, then node 0 starts receiving
+ * small messages using ANY_SOURCE from all of the other nodes who
+ * send as much as they can.  Node 0 collects statistics on the rate
+ * messages are received from each source. (Every N messages it
+ * prints out what percentage of the last N received were from each
+ * source. It does this for <size-1> times.
+ *
+ * This program should be run with at least 8 nodes just to be (un)fair
+ *
+ * Patrick Bridges * bridges@mcs.anl.gov * patrick@CS.MsState.Edu 
+ */
+
+#include <stdio.h>
+#include "test.h"
+#include "mpi.h"
+#include "mpe.h"
+#define MPG 25
+#define MSZ 1
+
+int main(argc, argv)
+int argc;
+char **argv;
+{
+    int rank, size, an_int[MSZ]; 
+    char *Current_Test = NULL;
+    int *num_array, i, j;
+    MPI_Status Status;
+    
+    MPI_Init(&argc, &argv);
+    MPE_Init_log();
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+    Test_Init("fairnessm", rank);
+
+    /* Wait for everyone to be ready */
+    
+    if (rank == 0) { 
+       /* Initialize an array to keep statistics in */
+       num_array = (int *)malloc((size - 1) * sizeof(int));
+       MPID_SetRecvDebugFlag(1);
+       MPI_Barrier(MPI_COMM_WORLD);
+       
+       for (i = 0; i < size - 1; i++) {
+           /* Clear the buffer of counts */
+           memset(num_array, 0, (size - 1) * sizeof(int));
+           for (j = 0; j < MPG; j++) {
+               MPI_Recv(an_int, MSZ, MPI_INT, MPI_ANY_SOURCE, 2000, 
+                        MPI_COMM_WORLD, &Status);
+               MPE_Log_receive(Status.MPI_SOURCE, 2000, MSZ * sizeof(int));
+               num_array[Status.MPI_SOURCE - 1]++;
+           }
+           Test_Printf("Statistics for message group %d:\n", i + 1);
+           for (j = 0; j < size -1 ; j++)
+               Test_Printf("%f%% of last %d messages received \
+were from source %d.\n",
+                           num_array[j]/2.0, MPG, j + 1);
+       }
+       free(num_array);
+       (void)Summarize_Test_Results();
+       MPE_Finish_log("/home/bridges/fairness.log");
+       MPI_Finalize();
+
+    } else {
+       MPI_Barrier(MPI_COMM_WORLD);
+       for (i = 0; i < MPG; i++) {
+           MPI_Send(an_int, MSZ, MPI_INT, 0, 2000, MPI_COMM_WORLD);
+           MPE_Log_send(0, 2000, MSZ * sizeof(int));
+       }
+       MPE_Finish_log("/home/bridges/fairness.log");
+       MPI_Finalize();
+    }
+
+    return 0;
+}
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/fifth.c b/teshsuite/smpi/mpich-test/pt2pt/fifth.c
new file mode 100644 (file)
index 0000000..d06c907
--- /dev/null
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+
+int main( int argc, char **argv )
+{
+    int rank, np, data = 777;
+    MPI_Request handle[4];
+    MPI_Status status[4];
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &np );
+
+    if (np < 4) {
+      MPI_Finalize();
+      printf( "4 processors or more required, %d done\n", rank );
+      return(1);
+    }
+
+    if (rank == 0) {
+      MPI_Isend( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle[0] );
+      MPI_Irecv( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle[1] );
+      MPI_Isend( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle[2] );
+      MPI_Irecv( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle[3] );
+      MPI_Waitall ( 4, handle, status );
+    }
+    else if (rank == 1) {
+      MPI_Irecv( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle[0] );
+      MPI_Isend( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle[1] );
+      MPI_Isend( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle[2] );
+      MPI_Irecv( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle[3] );
+      MPI_Waitall ( 4, handle, status );
+    }
+    else if (rank == 2) {
+      MPI_Isend( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle[0] );
+      MPI_Irecv( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle[1] );
+      MPI_Irecv( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle[2] );
+      MPI_Isend( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle[3] );
+      MPI_Waitall ( 4, handle, status );
+    }
+    else if (rank == 3) {
+      MPI_Irecv( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle[0] );
+      MPI_Isend( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle[1] );
+      MPI_Irecv( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle[2] );
+      MPI_Isend( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle[3] );
+      MPI_Waitall ( 4, handle, status );
+    }
+    Test_Waitforall( );
+    MPI_Finalize();
+    return(0);
+}
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/flood.c b/teshsuite/smpi/mpich-test/pt2pt/flood.c
new file mode 100644 (file)
index 0000000..ae25bce
--- /dev/null
@@ -0,0 +1,254 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "test.h"
+
+#define MAX_REQ 16
+#define DEF_MAX_MSG 2000000
+/* 
+   This program tests a flood of data for both unexpected and expected messages   to test any internal message fragmentation or protocol shifts
+
+   An optional argument can change the maximum message size.  For example, use
+      flood 9000000
+   to stress the memory system (the size is the number of ints, not bytes)
+ */
+
+void SetupData ( int *, int, int );
+void SetupRdata ( int *, int );
+int  CheckData ( int *, int, int, MPI_Status * );
+
+#ifdef VERBOSE
+static int verbose = 1;
+#else
+static int verbose = 0;
+#endif
+
+int main( int argc, char **argv )
+{
+    MPI_Comm comm;
+    MPI_Request r[MAX_REQ];
+    MPI_Status  s[MAX_REQ];
+    int msgsize, maxmsg, root, i, size, rank, err = 0, toterr;
+    int max_msg_size = DEF_MAX_MSG;
+    int *sbuf, *rbuf;
+
+    MPI_Init( &argc, &argv );
+
+    comm = MPI_COMM_WORLD;
+
+    MPI_Comm_size( comm, &size );
+    MPI_Comm_rank( comm, &rank );
+
+    if (size < 2) {
+       printf( "This test requires at least 2 processors\n" );
+       MPI_Abort( comm, 1 );
+    }
+
+    /* Check for a max message argument */
+    if (rank == 0) {
+       if (argc > 1) {
+           max_msg_size = atoi( argv[1] );
+           /* Correct if unrecognized argument */
+           if (max_msg_size <= 0) max_msg_size = DEF_MAX_MSG;
+       }
+    }
+    MPI_Bcast( &max_msg_size, 1, MPI_INT, 0, MPI_COMM_WORLD );
+
+    /* First, try large blocking sends to root */
+    root = 0;
+    
+    msgsize = 128;
+    maxmsg  = max_msg_size;
+    if (rank == root && verbose) printf( "Blocking sends: " );
+    while (msgsize < maxmsg) {
+       if (rank == root) {
+           if (verbose) { printf( "%d ", msgsize ); fflush( stdout ); }
+           rbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!rbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           for (i=0; i<size; i++) {
+               if (i == rank) continue;
+               SetupRdata( rbuf, msgsize );
+               MPI_Recv( rbuf, msgsize, MPI_INT, i, 2*i, comm, s );
+               err += CheckData( rbuf, msgsize, 2*i, s );
+           }
+           free( rbuf );
+       }
+       else {
+           sbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!sbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           SetupData( sbuf, msgsize, 2*rank );
+           MPI_Send( sbuf, msgsize, MPI_INT, root, 2*rank, comm );
+           free( sbuf );
+       }
+       msgsize *= 4;
+    }
+    if (rank == 0 && verbose) { printf( "\n" ); fflush( stdout ); }
+
+    /* Next, try unexpected messages with Isends */
+    msgsize = 128;
+    maxmsg  = max_msg_size;
+    if (rank == root && verbose) printf( "Unexpected recvs: " );
+    while (msgsize < maxmsg) {
+       if (rank == root) {
+           if (verbose) { printf( "%d ", msgsize ); fflush( stdout ); }
+           rbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!rbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           MPI_Barrier( comm );
+           for (i=0; i<size; i++) {
+               if (i == rank) continue;
+               SetupRdata( rbuf, msgsize );
+               MPI_Recv( rbuf, msgsize, MPI_INT, i, 2*i, comm, s );
+               err += CheckData( rbuf, msgsize, 2*i, s );
+           }
+           free( rbuf );
+       }
+       else {
+           sbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!sbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           SetupData( sbuf, msgsize, 2*rank );
+           MPI_Isend( sbuf, msgsize, MPI_INT, root, 2*rank, comm, r );
+           MPI_Barrier( comm );
+           MPI_Wait( r, s );
+           free( sbuf );
+       }
+       msgsize *= 4;
+    }
+    if (rank == 0 && verbose) { printf( "\n" ); fflush( stdout ); }
+
+    /* Try large synchronous blocking sends to root */
+    root = 0;
+    
+    msgsize = 128;
+    maxmsg  = max_msg_size;
+    if (rank == root && verbose) printf( "Synchronous sends: " );
+    while (msgsize < maxmsg) {
+       if (rank == root) {
+           if (verbose) { printf( "%d ", msgsize ); fflush( stdout ); }
+           rbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!rbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           for (i=0; i<size; i++) {
+               if (i == rank) continue;
+               SetupRdata( rbuf, msgsize );
+               MPI_Recv( rbuf, msgsize, MPI_INT, i, 2*i, comm, s );
+               err += CheckData( rbuf, msgsize, 2*i, s );
+           }
+           free( rbuf );
+       }
+       else {
+           sbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!sbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           SetupData( sbuf, msgsize, 2*rank );
+           MPI_Send( sbuf, msgsize, MPI_INT, root, 2*rank, comm );
+           free( sbuf );
+       }
+       msgsize *= 4;
+    }
+    if (rank == 0 && verbose) { printf( "\n" ); fflush( stdout ); }
+
+    /* Next, try expected messages with Rsend */
+    msgsize = 128;
+    maxmsg  = max_msg_size;
+    if (rank == root && verbose) printf( "Expected recvs and Rsend: " );
+    while (msgsize < maxmsg) {
+       if (rank == root) {
+           if (verbose) { printf( "%d ", msgsize ); fflush( stdout ); }
+           rbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!rbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           for (i=0; i<size; i++) {
+               if (i == rank) continue;
+               SetupRdata( rbuf, msgsize );
+               MPI_Irecv( rbuf, msgsize, MPI_INT, i, 2*i, comm, r );
+               MPI_Send( MPI_BOTTOM, 0, MPI_INT, i, 2*i+1, comm );
+               MPI_Wait( r, s );
+               err += CheckData( rbuf, msgsize, 2*i, s );
+           }
+           free( rbuf );
+       }
+       else {
+           sbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!sbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           SetupData( sbuf, msgsize, 2*rank );
+           MPI_Recv( MPI_BOTTOM, 0, MPI_INT, root, 2*rank+1, comm, s );
+           MPI_Send( sbuf, msgsize, MPI_INT, root, 2*rank, comm );
+           free( sbuf );
+       }
+       msgsize *= 4;
+    }
+    if (rank == 0 && verbose) { printf( "\n" ); fflush( stdout ); }
+
+
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    
+    if (rank == 0) {
+       if (toterr == 0) printf( " No Errors\n" );
+       else printf( "!! found %d errors\n", toterr );
+    }
+    if (toterr) {
+       printf( "!! found %d errors on processor %d\n", err, rank );
+    }
+
+    MPI_Finalize( );
+    return 0;
+}
+
+void SetupData( sbuf, n, tag )
+int *sbuf, n, tag;
+{
+    int i;
+
+    for (i=0; i<n; i++) 
+       sbuf[i] = i;
+}
+
+int CheckData( rbuf, n, tag, s )
+int *rbuf, n, tag;
+MPI_Status *s;
+{
+    int act_n, i;
+
+    MPI_Get_count( s, MPI_INT, &act_n );
+    if (act_n != n) {
+       printf( "Received %d instead of %d ints\n", act_n, n );
+       return 1;
+    }
+    for (i=0; i<n; i++) {
+       if (rbuf[i] != i) {
+           printf( "rbuf[%d] is %d, should be %d\n", i, rbuf[i], i );
+           printf( "rbuf[%d] is 0x%x, should be 0x%x\n", i, rbuf[i], i );
+           return 1;
+       }
+    }
+    return 0;
+}
+
+void SetupRdata( rbuf, n )
+int *rbuf, n;
+{
+    int i;
+    
+    for (i=0; i<n; i++) rbuf[i] = -(i+1);
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/flood2.c b/teshsuite/smpi/mpich-test/pt2pt/flood2.c
new file mode 100644 (file)
index 0000000..0666405
--- /dev/null
@@ -0,0 +1,215 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "test.h"
+
+#define MAX_REQ 32
+#define MAX_MSG_CNT 32000
+#define MAX_MSG 2048
+/* 
+   This program tests a flood of data of short messages to test handling
+   of both incoming messages and internal message queues
+ */
+
+void SetupData ( int *, int, int );
+void SetupRdata ( int *, int );
+int  CheckData ( int *, int, int, MPI_Status * );
+
+#ifdef VERBOSE
+static int verbose = 1;
+#else
+static int verbose = 0;
+#endif
+
+
+int main( int argc, char **argv )
+{
+    MPI_Comm comm;
+    MPI_Request r[MAX_REQ];
+    MPI_Status  s[MAX_REQ];
+    int msgsize, maxmsg, root, i, j, size, rank, err = 0, msgcnt, toterr;
+    int *sbuf, *rbuf;
+
+    MPI_Init( &argc, &argv );
+    
+    comm = MPI_COMM_WORLD;
+
+    MPI_Comm_size( comm, &size );
+    MPI_Comm_rank( comm, &rank );
+
+    if (size < 2) {
+       printf( "This test requires at least 2 processors\n" );
+       MPI_Abort( comm, 1 );
+    }
+
+    /* First, try large blocking sends to root */
+    root = 0;
+    
+    maxmsg =  MAX_MSG;
+    msgsize = 128;
+    msgcnt  = MAX_MSG_CNT;
+    if (rank == root && verbose) printf( "Blocking sends: " );
+    while (msgsize <= maxmsg) {
+       if (rank == root) {
+           if (verbose) { printf( "%d ", msgsize ); fflush( stdout ); }
+           rbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!rbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           for (i=0; i<size; i++) {
+               if (i == rank) continue;
+               for (j=0; j<msgcnt; j++) {
+                   SetupRdata( rbuf, msgsize );
+                   MPI_Recv( rbuf, msgsize, MPI_INT, i, 2*i, comm, s );
+                   err += CheckData( rbuf, msgsize, 2*i, s );
+               }
+           }
+           free( rbuf );
+       }
+       else {
+           sbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!sbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           SetupData( sbuf, msgsize, 2*rank );
+           for (j=0; j<msgcnt; j++) 
+               MPI_Send( sbuf, msgsize, MPI_INT, root, 2*rank, comm );
+           free( sbuf );
+       }
+       msgsize *= 4;
+    }
+    if (rank == 0 && verbose) { printf( "\n" ); fflush( stdout ); }
+
+    /* Next, try unexpected messages with Isends */
+    msgsize = 128;
+    maxmsg  = MAX_MSG;
+    msgcnt  = MAX_REQ;
+    if (rank == root && verbose) printf( "Unexpected recvs: " );
+    while (msgsize <= maxmsg) {
+       if (rank == root) {
+           if (verbose) { printf( "%d ", msgsize ); fflush( stdout ); }
+           rbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!rbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           MPI_Barrier( comm );
+           for (i=0; i<size; i++) {
+               if (i == rank) continue;
+               for (j=0; j<msgcnt; j++) {
+                   SetupRdata( rbuf, msgsize );
+                   MPI_Recv( rbuf, msgsize, MPI_INT, i, 2*i, comm, s );
+                   err += CheckData( rbuf, msgsize, 2*i, s );
+               }
+           }
+           free( rbuf );
+       }
+       else {
+           sbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!sbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           SetupData( sbuf, msgsize, 2*rank );
+           for (j=0; j<msgcnt; j++) {
+               MPI_Isend( sbuf, msgsize, MPI_INT, root, 2*rank, comm, &r[j] );
+           }
+           MPI_Barrier( comm );
+           MPI_Waitall( msgcnt, r, s );
+           free( sbuf );
+       }
+       msgsize *= 4;
+    }
+    if (rank == 0 && verbose) { printf( "\n" ); fflush( stdout ); }
+
+    /* Try large synchronous blocking sends to root */
+    root = 0;
+    
+    msgsize = 128;
+    maxmsg  = MAX_MSG;
+    if (rank == root && verbose) printf( "Synchronous sends: " );
+    while (msgsize <= maxmsg) {
+       if (rank == root) {
+           if (verbose) { printf( "%d ", msgsize ); fflush( stdout ); }
+           rbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!rbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           for (i=0; i<size; i++) {
+               if (i == rank) continue;
+               for (j=0; j<msgcnt; j++) {
+                   SetupRdata( rbuf, msgsize );
+                   MPI_Recv( rbuf, msgsize, MPI_INT, i, 2*i, comm, s );
+                   err += CheckData( rbuf, msgsize, 2*i, s );
+               }
+           }
+           free( rbuf );
+       }
+       else {
+           sbuf = (int *)malloc( msgsize * sizeof(int) );
+           if (!sbuf) {
+               printf( "Could not allocate %d words\n", msgsize );
+               MPI_Abort( comm, 1 );
+           }
+           SetupData( sbuf, msgsize, 2*rank );
+           for (j=0; j<msgcnt; j++) 
+               MPI_Ssend( sbuf, msgsize, MPI_INT, root, 2*rank, comm );
+           free( sbuf );
+       }
+       msgsize *= 4;
+    }
+    if (rank == 0 && verbose) { printf( "\n" ); fflush( stdout ); }
+
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    
+    if (rank == 0) {
+       if (toterr == 0) printf( " No Errors\n" );
+       else printf( "!! found %d errors\n", toterr );
+    }
+    if (toterr) {
+       printf( "!! found %d errors on processor %d\n", err, rank );
+    }
+
+    MPI_Finalize( );
+    return 0;
+}
+
+void SetupData( sbuf, n, tag )
+int *sbuf, n, tag;
+{
+    int i;
+
+    for (i=0; i<n; i++) 
+       sbuf[i] = i;
+}
+
+int CheckData( rbuf, n, tag, s )
+int *rbuf, n, tag;
+MPI_Status *s;
+{
+    int act_n, i;
+
+    MPI_Get_count( s, MPI_INT, &act_n );
+    if (act_n != n) {
+       printf( "Received %d instead of %d ints\n", act_n, n );
+       return 1;
+    }
+    for (i=0; i<n; i++) {
+       if (rbuf[i] != i) {
+           printf( "rbuf[%d] is %d, should be %d\n", i, rbuf[i], i );
+           return 1;
+       }
+    }
+    return 0;
+}
+
+void SetupRdata( rbuf, n )
+int *rbuf, n;
+{
+    int i;
+    
+    for (i=0; i<n; i++) rbuf[i] = -(i+1);
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/fourth.c b/teshsuite/smpi/mpich-test/pt2pt/fourth.c
new file mode 100644 (file)
index 0000000..84c30a5
--- /dev/null
@@ -0,0 +1,64 @@
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+
+int main( int argc, char **argv )
+{
+    int rank, np, data = 777;
+    MPI_Request handle;
+    MPI_Status status;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &np );
+
+    if (np < 4) {
+      MPI_Finalize();
+      printf( "4 processors or more required, %d done\n", rank );
+      return(1);
+    }
+
+    if (rank == 0) {
+      MPI_Isend( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+      MPI_Irecv( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+      MPI_Isend( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+      MPI_Irecv( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+    }
+    else if (rank == 1) {
+      MPI_Irecv( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+      MPI_Isend( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+      MPI_Isend( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+      MPI_Irecv( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+    }
+    else if (rank == 2) {
+      MPI_Isend( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+      MPI_Irecv( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+      MPI_Irecv( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+      MPI_Isend( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+    }
+    else if (rank == 3) {
+      MPI_Irecv( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+      MPI_Isend( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+      MPI_Irecv( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+      MPI_Isend( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle );
+      MPI_Wait( &handle, &status );
+    }
+    Test_Waitforall( );
+    MPI_Finalize();
+    return(0);
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/gcomm.c b/teshsuite/smpi/mpich-test/pt2pt/gcomm.c
new file mode 100644 (file)
index 0000000..3bbb3dd
--- /dev/null
@@ -0,0 +1,78 @@
+/* 
+    This file generates a few communicators for use in the test suite
+
+    THIS CODE IS FROM mpich/tsuite AND SHOULD BE CHANGED THERE ONLY
+ */
+
+#include "mpi.h"
+
+#include "gcomm.h"
+
+void MakeComms( comms, maxn, n, make_intercomm )
+MPI_Comm *comms;
+int      *n, maxn, make_intercomm;
+{
+int cnt = 0;
+int rank, size;
+int dims[2];
+int periods[2], range[1][3];
+MPI_Group group, newgroup;
+
+MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+comms[cnt++] = MPI_COMM_WORLD;
+if (cnt == maxn) {*n = cnt; return; }
+
+/* Construct a communicator with the ranks reversed */
+MPI_Comm_group( MPI_COMM_WORLD, &group );
+range[0][0] = size-1;
+range[0][1] = 0;
+range[0][2] = -1;
+MPI_Group_range_incl( group, 1, range, &newgroup );
+MPI_Comm_create( MPI_COMM_WORLD, newgroup, &comms[cnt] );
+cnt++;
+//MPI_Group_free( &group );
+//MPI_Group_free( &newgroup );
+if (cnt == maxn) {*n = cnt; return; }
+
+if (size > 3) {
+    /* Divide into odd and even processes */
+    MPI_Comm_split( MPI_COMM_WORLD, rank & 0x1, rank, comms + cnt );
+    cnt ++;
+
+    /* Use the cartesian constructors */
+    dims[0] = 0; dims[1] = 0;
+    MPI_Dims_create( size, 2, dims );
+    periods[0] = 0; periods[1] = 0;
+    MPI_Cart_create( MPI_COMM_WORLD, 2, dims, periods, 0, comms + cnt );
+    cnt ++;
+    if (cnt == maxn) {*n = cnt; return; }
+
+    /* Create an intercommunicator (point-to-point operations only)
+       Note that in this case, codes need to use MPI_Comm_remote_size to
+       (added to MPI_Comm_size) to get the size of the full group */
+    if (make_intercomm) {
+       /* The remote_leader is rank 1 in MPI_COMM_WORLD if we are even
+          and 0 if we are odd (the remote_leader rank is relative to the
+          peer communicator) 
+        */
+       MPI_Intercomm_create( comms[2], 0, MPI_COMM_WORLD, !(rank&0x1), 
+                             37, comms + cnt );
+       cnt ++;
+       if (cnt == maxn) {*n = cnt; return; }
+       }
+    }
+*n = cnt;
+}
+
+void FreeComms( comms, n )
+MPI_Comm *comms;
+int      n;
+{
+int i;
+for (i=1; i<n; i++) {
+    if (comms[i] != MPI_COMM_NULL) 
+       MPI_Comm_free( comms + i );
+    }
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/gcomm.h b/teshsuite/smpi/mpich-test/pt2pt/gcomm.h
new file mode 100644 (file)
index 0000000..9eee1df
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef MPITEST_GCOMMS
+#define MPITEST_GCOMMS
+
+void MakeComms ( MPI_Comm *, int, int *, int );
+void FreeComms ( MPI_Comm *, int );
+#endif
diff --git a/teshsuite/smpi/mpich-test/pt2pt/getelm.c b/teshsuite/smpi/mpich-test/pt2pt/getelm.c
new file mode 100644 (file)
index 0000000..517c07a
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * This is a test of getting the number of basic elements
+ */
+
+#include "mpi.h"
+#include <stdio.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+typedef struct { 
+    int len;
+    double data[1000];
+    } buf_t;
+
+int main( int argc, char **argv )
+{
+    int err = 0, toterr;
+    MPI_Datatype contig1, varstruct1, oldtypes[2], varstruct2;
+    MPI_Aint     displs[2];
+    int          blens[2];
+    MPI_Comm     comm;
+    MPI_Status   status;
+    int          world_rank;
+    int          rank, size, partner, count, i;
+    int          send_ibuf[4], recv_ibuf[4];
+    buf_t        send_buf, recv_buf;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+
+/* Form the datatypes */
+    MPI_Type_contiguous( 4, MPI_INT, &contig1 );
+    MPI_Type_commit( &contig1 );
+    blens[0] = 1;
+    blens[1] = 1000;
+    oldtypes[0] = MPI_INT;
+    oldtypes[1] = MPI_DOUBLE;
+/* Note that the displacement for the data is probably double aligned */
+    MPI_Address( &send_buf.len, &displs[0] );
+    MPI_Address( &send_buf.data[0], &displs[1] );
+/* Make relative */
+    displs[1] = displs[1] - displs[0];
+    displs[0] = 0;
+    MPI_Type_struct( 2, blens, displs, oldtypes, &varstruct1 );
+    MPI_Type_commit( &varstruct1 );
+
+    comm = MPI_COMM_WORLD;
+
+    MPI_Comm_size( comm, &size );
+    MPI_Comm_rank( comm, &rank );
+
+    if (size < 2) {
+       fprintf( stderr, "This test requires at least 2 processes\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    if (rank == size - 1) {
+       partner = 0;
+       /* Send contiguous data */
+       for (i=0; i<4; i++) 
+           send_ibuf[i] = i;
+       MPI_Send( send_ibuf, 1, contig1, partner, 0, comm );
+
+       /* Send partial structure */
+       blens[1] = 23;
+       MPI_Type_struct( 2, blens, displs, oldtypes, &varstruct2 );
+       MPI_Type_commit( &varstruct2 );
+
+       MPI_Send( &send_buf, 1, varstruct2, partner, 1, comm );
+       MPI_Type_free( &varstruct2 );
+
+       /* Send NO data */
+       MPI_Send( MPI_BOTTOM, 0, MPI_INT, partner, 2, comm );
+    }
+    else if (rank == 0) {
+       partner = size - 1;
+       MPI_Recv( recv_ibuf, 1, contig1, partner, 0, comm, &status );
+       MPI_Get_count( &status, MPI_INT, &count );
+       if (count != 4) {
+           err++;
+           fprintf( stderr, 
+                    "Wrong count for contig recv MPI_INT; got %d expected %d\n",
+                    count, 4 );
+       }
+       MPI_Get_count( &status, contig1, &count );
+       if (count != 1) {
+           err++;
+           fprintf( stderr, 
+                    "Wrong count for contig recv (contig); got %d expected %d\n",
+                    count, 1 );
+       }
+       MPI_Get_elements( &status, contig1, &count );
+       if (count != 4) {
+           err++;
+           fprintf( stderr, 
+                    "Wrong elements for contig recv contig; got %d expected %d\n",
+                    count, 4 );
+       }
+
+       /* Now, try the partial structure */
+       MPI_Recv( &recv_buf, 1, varstruct1, partner, 1, comm, &status );
+       MPI_Get_elements( &status, varstruct1, &count );
+       if (count != 24) {
+           err++;
+           fprintf( stderr, 
+                    "Wrong number of elements for struct recv; got %d expected %d\n", 
+                    count, 24 );
+       }
+
+       {
+           /* Receive nothing using a 0-sized type */
+           MPI_Datatype ztype;
+           MPI_Type_contiguous( 0, MPI_INT, &ztype );
+           MPI_Type_commit( &ztype );
+           MPI_Recv( &recv_buf, 10, ztype, partner, 2, comm, &status );
+           /* Current clarification requires 0 for the result */
+           MPI_Get_elements( &status, ztype, &count );
+           if (count != 0) {
+               err++;
+               fprintf( stderr, 
+                        "Wrong number of elements for 0-size datatype; got %d\n",
+                        count );
+           }
+           MPI_Get_count( &status, ztype, &count );
+           if (count != 0) {
+               err++;
+               fprintf( stderr, 
+                        "Wrong count for 0-size datatype; got %d\n",
+                        count );
+           }
+           MPI_Type_free( &ztype );
+       }
+    }
+    MPI_Type_free( &contig1 );
+    MPI_Type_free( &varstruct1 );
+    
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (world_rank == 0) {
+           if (toterr == 0) 
+               printf( " No Errors\n" );
+           else
+               printf( "Found %d errors in MPI_Get_elements\n", toterr );
+    }
+    MPI_Finalize( );
+    return toterr;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/hindexed.c b/teshsuite/smpi/mpich-test/pt2pt/hindexed.c
new file mode 100644 (file)
index 0000000..24df469
--- /dev/null
@@ -0,0 +1,106 @@
+#include "mpi.h"
+#include <stdio.h>
+/* stdlib.h needed for malloc declaration */
+#include <stdlib.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+/*
+ * This file tests MPI_Type_hindexed by describing parts of a triangular
+ * matrix, stored in a square matrix, and sending sending it.
+ * 
+ * The matrix is stored in column-major, and the tests use
+ * MPI_Type_vector or MPI_Type_struct to define the elements that are sent
+ */
+
+int main( int argc, char **argv )
+{
+    MPI_Datatype rowtype, mattype;
+    int          *sbuf, *rbuf;
+    int          rank, mat_n;
+    static int   blens[2] = { 1, 1 };
+    MPI_Datatype types[2] = { MPI_INT, MPI_UB };
+    int          *mat_blens, i ;
+    MPI_Aint     *mat_displs;
+    MPI_Aint     displs[2];
+    MPI_Status   status;
+    int          err, row, col;
+
+    MPI_Init( &argc, &argv );
+
+    err = 0;
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    mat_n = 10;
+    sbuf = (int *) malloc( mat_n * mat_n * sizeof(int) );
+    rbuf = (int *) malloc( mat_n * mat_n * sizeof(int) );
+    if (!sbuf || !rbuf) {
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    /* Define a row type based on a strided struct type */
+    displs[0] = 0;
+    displs[1] = mat_n*sizeof(int);
+    MPI_Type_struct( 2, blens, displs, types, &rowtype );
+     MPI_Type_commit( &rowtype ); 
+
+    /* Define an hindexed type that defines all of the rows of the
+       triangular part of sbuf */
+    
+    mat_blens = (int *)malloc( mat_n * sizeof(int) );
+    mat_displs = (MPI_Aint *)malloc( mat_n * sizeof(MPI_Aint) );
+    for (i=0; i<mat_n; i++) {
+       mat_blens[i] = mat_n - i;
+       MPI_Address( &sbuf[i + i * mat_n], &mat_displs[i] );
+       if (i != 0)
+           mat_displs[i] = mat_displs[i] - mat_displs[0];
+    }
+    mat_displs[0] = 0;
+    MPI_Type_hindexed( mat_n, mat_blens, mat_displs, rowtype, &mattype );
+    MPI_Type_commit( &mattype );
+   // MPI_Type_free( &rowtype );
+
+    /* Load up the data */
+    for (i=0; i<mat_n * mat_n; i++) {
+       sbuf[i] = i;
+       rbuf[i] = -i;
+    }
+    
+    /* Send it and receive it in the same order */
+    MPI_Sendrecv( sbuf, 1, mattype, rank, 0, rbuf, 1, mattype, rank, 0, 
+                 MPI_COMM_WORLD, &status );
+
+    for (row = 0; row<mat_n; row++) {
+       for (col = row; col<mat_n; col++) {
+           if (rbuf[row + col*mat_n] != sbuf[row + col*mat_n]) {
+               err++;
+               fprintf( stderr, "mat(%d,%d) = %d, not %d\n",
+                        row, col, rbuf[row+col*mat_n], sbuf[row+col*mat_n] );
+           }
+       }
+    }
+
+    /* Send hindexed and receive contiguous */
+    MPI_Sendrecv( sbuf, 1, mattype, rank, 1, 
+                 rbuf, (mat_n * (mat_n + 1))/2, MPI_INT, rank, 1, 
+                 MPI_COMM_WORLD, &status );
+    i = 0;
+    for (row = 0; row<mat_n; row++) {
+       for (col = row; col<mat_n; col++) {
+           if (rbuf[i] != sbuf[row + col*mat_n]) {
+               err++;
+               fprintf( stderr, "rbuf(%d,%d) = %d, not %d\n",
+                        row, col, rbuf[i], sbuf[row+col*mat_n] );
+           }
+           i++;
+       }
+    }
+
+    MPI_Type_free( &mattype );
+    if (err == 0) printf( "Test passed\n" );
+    else          printf( "Test failed with %d errors\n", err );
+
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/hindexed.std b/teshsuite/smpi/mpich-test/pt2pt/hindexed.std
new file mode 100644 (file)
index 0000000..386f3d2
--- /dev/null
@@ -0,0 +1 @@
+Test passed
diff --git a/teshsuite/smpi/mpich-test/pt2pt/htmsg.c b/teshsuite/smpi/mpich-test/pt2pt/htmsg.c
new file mode 100644 (file)
index 0000000..46986c9
--- /dev/null
@@ -0,0 +1,54 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <string.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+/* 
+   This is a very simple MPI program which can be used to check things
+   like the behavior of the ADI or heterogeneous code
+ */
+int main( int argc, char **argv )
+{
+char msg[10];
+char smsg[10];
+int  rank, size;
+int  src, dest;
+int  count;
+MPI_Status status;
+
+MPI_Init( &argc, &argv );
+MPI_Comm_size( MPI_COMM_WORLD, &size );
+MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+if (size != 2) {
+    MPI_Abort( MPI_COMM_WORLD, 1 );
+    return 1;
+    }
+src  = 1;
+dest = 0;
+if (rank == src) {
+    strcpy( msg, "MPICH!" );
+    MPI_Send( msg, 7, MPI_CHAR, dest, 10, MPI_COMM_WORLD );
+    }
+else {
+    MPI_Recv( smsg, 10, MPI_CHAR, src, 10, MPI_COMM_WORLD, &status );
+    if (status.MPI_TAG != 10) {
+       fprintf( stderr, "Error in status tag!\n" );
+       }
+    if (status.MPI_SOURCE != src) {
+       fprintf( stderr, "Error in status source!\n" );
+       }
+    MPI_Get_count( &status, MPI_CHAR, &count );
+    if (count != 7) {
+       fprintf( stderr, "Error in count, got %d expected 7\n", count );
+       }
+    if (strcmp( smsg, "MPICH!" )) {
+       fprintf( stderr, "Got wrong msg (%s), expected \"MPICH!\"\n", smsg );
+       }
+    }
+
+MPI_Finalize();
+return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/hvec.c b/teshsuite/smpi/mpich-test/pt2pt/hvec.c
new file mode 100644 (file)
index 0000000..5539b18
--- /dev/null
@@ -0,0 +1,127 @@
+#include "mpi.h"
+#include "test.h"
+#include <stdio.h>
+
+/* The original version of this was sent by  
+   empierce@tribble.llnl.gov (Elsie M. Pierce) 
+   I've modified it to fit the automated tests requirements
+ */
+/* Prototypes for picky compilers */
+int iinit ( int *, int, int );
+int ilist1 ( int *, int, int, int );
+void Build_vect ( MPI_Datatype * );
+void Build_ctg ( int, MPI_Datatype *, MPI_Datatype * );
+void Get_d5 ( int );
+
+int iinit(a, value, l)
+int *a, value, l;
+{
+  int i;
+  
+  for (i=0; i<l; i++)
+    a[i] = value;
+  return(0);
+}
+
+
+int ilist1(a, mype, pe_out, l)
+int *a, mype, pe_out, l;
+{
+  int i;
+  
+  if (mype == pe_out){
+    for (i=0; i<l; i++)
+      printf("%d ",a[i]);
+    printf("\n");
+  }
+  return(0);
+}
+
+
+void Build_vect(mess_ptr) 
+MPI_Datatype* mess_ptr;
+{
+  int count, bllen, gap, str;
+  
+/*   Define an MPI type with two blocks of 3 integers each, separated */
+/*   by one integer. */
+  count        = 2;
+  bllen        = 3;
+  gap  = 1;
+  str  = bllen + gap;
+
+  MPI_Type_vector(count, bllen, str, MPI_INT, mess_ptr);
+  MPI_Type_commit(mess_ptr);
+  
+}
+
+
+void   Build_ctg(big_offset,messtyp, messtyp2)
+int big_offset;
+MPI_Datatype *messtyp, *messtyp2;
+{
+  int count;
+  MPI_Aint ext;
+    
+  count=3;
+  MPI_Type_extent(*messtyp, &ext);
+  MPI_Type_hvector(count, 1, ext+big_offset, *messtyp, messtyp2);
+  MPI_Type_commit(messtyp2);
+  /*printf( "pack is:\n" );
+  MPIR_PrintDatatypePack( stdout, 1, *messtyp2, 0, 0 );
+  printf( "unpack is:\n" );
+  MPIR_PrintDatatypeUnpack( stdout, 1, *messtyp2, 0, 0 ); */
+}
+  
+
+
+void Get_d5(my_rank)
+int my_rank;
+{
+  MPI_Datatype messtyp, messtyp2;
+  int root=0;
+  int count=1;
+  int big_offset;
+  int intlen;
+#define DL 32
+  
+  int dar[DL];
+     
+  iinit(dar, my_rank, DL);
+  Build_vect(&messtyp);
+  MPI_Bcast(dar, count, messtyp, root, MPI_COMM_WORLD);
+  if (my_rank==1)
+    printf("  0 = Sent, 1 = Not Sent \n%s",
+          "  Vector Type with Gap : \n");
+  ilist1(dar, my_rank, 1, DL);
+
+  intlen = sizeof(int);
+  for (big_offset = -intlen; big_offset<=2*intlen; 
+       big_offset += intlen){
+    if (my_rank==1)
+     printf("\n Three of above vector types combined, with offset = %i ints\n",
+            big_offset/(int)sizeof(int));
+    iinit(dar, my_rank, DL);
+    Build_ctg(big_offset, &messtyp, &messtyp2);
+    MPI_Bcast(dar, count, messtyp2, root, MPI_COMM_WORLD);
+    MPI_Barrier(MPI_COMM_WORLD);
+    MPI_Type_free(&messtyp2);
+    ilist1(dar, my_rank, 1, DL);
+  }
+  MPI_Type_free( &messtyp );
+}
+
+
+
+int main( int argc, char *argv[]) 
+{
+  int my_rank;
+    
+  MPI_Init (&argc, &argv);
+  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
+
+  Get_d5(my_rank);
+  
+  MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/hvec.std b/teshsuite/smpi/mpich-test/pt2pt/hvec.std
new file mode 100644 (file)
index 0000000..93fb40f
--- /dev/null
@@ -0,0 +1,15 @@
+  0 = Sent, 1 = Not Sent 
+  Vector Type with Gap : 
+0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
+
+ Three of above vector types combined, with offset = -1 ints
+0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 
+
+ Three of above vector types combined, with offset = 0 ints
+0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 
+
+ Three of above vector types combined, with offset = 1 ints
+0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 
+
+ Three of above vector types combined, with offset = 2 ints
+0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 1 1 1 1 1 
diff --git a/teshsuite/smpi/mpich-test/pt2pt/hvectest.c b/teshsuite/smpi/mpich-test/pt2pt/hvectest.c
new file mode 100644 (file)
index 0000000..178ef56
--- /dev/null
@@ -0,0 +1,315 @@
+/*
+    hvectest - test program that sends an array of floats from the first 
+             process of a group to the last, using send and recv and the
+            vector datatype.
+*/
+
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+/* #define SHOWMSG */
+
+#ifdef VERBOSE
+static int verbose = 1;
+#else
+static int verbose = 0;
+#endif
+int main( int argc, char **argv )
+{
+    int rank, size, to, from, tag, count, i;
+    int src, dest;
+    int st_source, st_tag, st_count;
+    int errcnt = 0;
+    MPI_Request handle;
+    MPI_Status status;
+    double data[100];
+    MPI_Datatype rowtype;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    src  = size - 1;
+    dest = 0;
+/*
+    dest  = size - 1;
+    src = 0;
+ */
+    MPI_Type_vector( 10, 1, 10, MPI_DOUBLE, &rowtype );
+    MPI_Type_commit( &rowtype );
+    /* First test: send a row */
+    if (rank == src) {
+       to     = dest;
+       count  = 1;
+       tag    = 2001;
+       for (i = 0; i < 100; i++)
+           data[i] = i;
+       /* Send a row */
+       MPI_Send( data, count, rowtype, to, tag, MPI_COMM_WORLD );
+#ifdef SHOWMSG
+       printf("%d sent", rank );
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+    }
+
+    if (rank == dest) {
+       tag   = MPI_ANY_TAG;
+       count = 10;             
+       from  = MPI_ANY_SOURCE;
+       MPI_Recv(data, count, MPI_DOUBLE, from, tag, MPI_COMM_WORLD,
+                &status ); 
+
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       MPI_Get_count( &status, MPI_DOUBLE, &st_count );
+
+       if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {
+           printf( "Status info: source = %d, tag = %d, count = %d\n",
+                   st_source, st_tag, st_count );
+       }
+#ifdef SHOWMSG
+       printf( "%d received", rank);
+       for (i = 0; i < 10; i++) printf(" %f",data[i]); printf("\n");
+#endif
+       for (i = 0; i < 10; i++) if (data[i] != 10*i) { 
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](rcv double) %d'th element = %f, should be %f\n",
+                    rank, i, data[i], 10.0*i );
+           }
+    }
+
+    /* Second test: receive a column into row */
+    if (rank == src)
+    {
+       to     = dest;
+       count  = 10;
+       tag    = 2001;
+       for (i = 0; i < 100; i++)
+           data[i] = i;
+       /* Send a row */
+       MPI_Send( data, count, MPI_DOUBLE, to, tag, MPI_COMM_WORLD );
+#ifdef SHOWMSG
+       printf("%d sent", rank );
+       for (i = 0; i < 10; i++) printf(" %f",data[i]);printf("\n");
+#endif
+    }
+    if (rank == dest)
+    {
+       tag   = MPI_ANY_TAG;
+       count = 1;              
+       from  = MPI_ANY_SOURCE;
+       MPI_Recv(data, count, rowtype, from, tag, MPI_COMM_WORLD,
+                &status ); 
+
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       MPI_Get_count( &status, MPI_DOUBLE, &st_count );
+
+       if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {
+           printf( "Status info: source = %d, tag = %d, count = %d\n",
+               st_source, st_tag, st_count );
+       }
+#ifdef SHOWMSG
+       printf( "%d received", rank);
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+       for (i = 0; i < 10; i++) if (data[i*10] != i) {
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](rcv row) %d'th element = %f, should be %f\n",
+                    rank, i, data[i*10], 1.0*i );
+           }
+    }
+
+    /* Third test: send AND receive a row */
+    if (rank == src)
+    {
+       to     = dest;
+       count  = 1;
+       tag    = 2001;
+       for (i = 0; i < 100; i++)
+           data[i] = i;
+       /* Send a row */
+       MPI_Send( data, count, rowtype, to, tag, MPI_COMM_WORLD );
+#ifdef SHOWMSG
+       printf("%d sent", rank );
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+    }
+    if (rank == dest)
+    {
+       tag   = MPI_ANY_TAG;
+       count = 1;              
+       from  = MPI_ANY_SOURCE;
+       MPI_Recv(data, count, rowtype, from, tag, MPI_COMM_WORLD,
+                &status ); 
+
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       MPI_Get_count( &status, MPI_DOUBLE, &st_count );
+
+       if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {
+           printf( "Status info: source = %d, tag = %d, count = %d\n",
+                   st_source, st_tag, st_count );
+       }
+#ifdef SHOWMSG
+       printf( "%d received", rank);
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+       for (i = 0; i < 10; i++) if (data[i*10] != i*10) {
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](rcv row-row) %d'th element = %f, should be %f\n",
+                    rank, i, data[i*10], 10.0*i );
+           }
+    }
+
+    /* Second Set of Tests: Use Isend and Irecv instead of Send and Recv */
+    /* First test: send a row */
+    if (rank == src)
+    {
+       to     = dest;
+       count  = 1;
+       tag    = 2001;
+       for (i = 0; i < 100; i++)
+           data[i] = i;
+       /* Send a row */
+       MPI_Isend( data, count, rowtype, to, tag, MPI_COMM_WORLD, &handle );
+       MPI_Wait( &handle, &status );
+#ifdef SHOWMSG
+       printf("%d sent", rank );
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+    }
+
+    if (rank == dest)
+    {
+       tag   = MPI_ANY_TAG;
+       count = 10;             
+       from  = MPI_ANY_SOURCE;
+       MPI_Irecv(data, count, MPI_DOUBLE, from, tag, MPI_COMM_WORLD,
+                &handle ); 
+       MPI_Wait( &handle, &status );
+
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       MPI_Get_count( &status, MPI_DOUBLE, &st_count );
+
+       if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {
+           printf( "Status info: source = %d, tag = %d, count = %d\n",
+                   st_source, st_tag, st_count );
+       }
+#ifdef SHOWMSG
+       printf( "%d received", rank);
+       for (i = 0; i < 10; i++) printf(" %f",data[i]); printf("\n");
+#endif
+       for (i = 0; i < 10; i++) if (data[i] != 10*i) {
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](ircv double) %d'th element = %f, should be %f\n",
+                    rank, i, data[i], 10.0*i );
+           }
+    }
+
+    /* Second test: receive a column into row */
+    if (rank == src)
+    {
+       to     = dest;
+       count  = 10;
+       tag    = 2001;
+       for (i = 0; i < 100; i++)
+           data[i] = i;
+       /* Send a row */
+       MPI_Isend( data, count, MPI_DOUBLE, to, tag, MPI_COMM_WORLD, 
+                  &handle );
+       MPI_Wait( &handle, &status );
+#ifdef SHOWMSG
+       printf("%d sent", rank );
+       for (i = 0; i < 10; i++) printf(" %f",data[i]);printf("\n");
+#endif
+    }
+    if (rank == dest)
+    {
+       tag   = MPI_ANY_TAG;
+       count = 1;              
+       from  = MPI_ANY_SOURCE;
+       MPI_Irecv(data, count, rowtype, from, tag, MPI_COMM_WORLD,
+                &handle ); 
+       MPI_Wait( &handle, &status );
+
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       MPI_Get_count( &status, MPI_DOUBLE, &st_count );
+
+       if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {
+           printf( "Status info: source = %d, tag = %d, count = %d\n",
+                   st_source, st_tag, st_count );
+       }
+#ifdef SHOWMSG
+       printf( "%d received", rank);
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+       for (i = 0; i < 10; i++) if (data[i*10] != i) {
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](ircv row) %d'th element = %f, should be %f\n",
+                    rank, i, data[i*10], 1.0*i );
+           }
+    }
+
+    /* Third test: send AND receive a row */
+    if (rank == src)
+    {
+       to     = dest;
+       count  = 1;
+       tag    = 2001;
+       for (i = 0; i < 100; i++)
+           data[i] = i;
+       /* Send a row */
+       MPI_Isend( data, count, rowtype, to, tag, MPI_COMM_WORLD, &handle );
+       MPI_Wait( &handle, &status );
+#ifdef SHOWMSG
+       printf("%d sent", rank );
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+    }
+    if (rank == dest)
+    {
+       tag   = MPI_ANY_TAG;
+       count = 1;              
+       from  = MPI_ANY_SOURCE;
+       MPI_Irecv(data, count, rowtype, from, tag, MPI_COMM_WORLD,
+                &handle ); 
+       MPI_Wait( &handle, &status );
+
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       MPI_Get_count( &status, MPI_DOUBLE, &st_count );
+
+       if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {
+           printf( "Status info: source = %d, tag = %d, count = %d\n",
+                   st_source, st_tag, st_count );
+       }
+#ifdef SHOWMSG
+       printf( "%d received", rank);
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+       for (i = 0; i < 10; i++) if (data[i*10] != i*10) {
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](ircv row-row) %d'th element = %f, should be %f\n",
+                    rank, i, data[i*10], 10.0*i );
+           }
+    }
+
+    i = errcnt;
+    MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (errcnt > 0) {
+       printf( "Found %d errors in the run \n", errcnt );
+       }
+    MPI_Type_free( &rowtype );
+    Test_Waitforall( );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/hvectest2.c b/teshsuite/smpi/mpich-test/pt2pt/hvectest2.c
new file mode 100644 (file)
index 0000000..0414b3d
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+    hvectest2 - test program that sends an array of floats from the first 
+                process of a group to the last, using send and recv and the
+               struct datatype for variable length vectors
+*/
+
+#include "mpi.h"
+#include <stdio.h>
+#include <string.h>
+#include "test.h"
+/* #define SHOWMSG */
+
+/* Prototypes for picky compilers */
+void ClearArray ( double *, int, double );
+void SetArray ( double *, int );
+
+#ifdef VERBOSE
+static int verbose = 1;
+#else
+static int verbose = 0;
+#endif
+
+void ClearArray( a, n, v )
+double *a, v;
+int    n;
+{
+    int i;
+    for (i=0; i<n; i++) a[i] = v;
+}
+
+void SetArray( a, n )
+double *a;
+int    n;
+{
+    int i;
+    for (i=0; i<n; i++) a[i] = (double)i;
+}
+
+/* 
+   This test requires that the MPI implementation support predefined 
+   MPI_Datatypes in static initializers (i.e., they must be compile time
+   constants).  This was voted as a clarification on 4/26/95.
+ */
+int main( int argc, char **argv )
+{
+    int rank, size, to, from, tag, count, i;
+    int src, dest;
+    int st_source, st_tag, st_count;
+    int errcnt = 0;
+    MPI_Request handle;
+    MPI_Status status;
+    double data[100];
+    MPI_Datatype rowtype;
+    static int blens[2] = { 1, 1 };
+    MPI_Datatype types[2] = { MPI_DOUBLE, MPI_UB };
+    MPI_Aint displs[2];
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* dest writes out the received stats; for the output to be
+       consistant (with the final check), it should be procees 0 */
+    if (argc > 1 && argv[1] && strcmp( "-alt", argv[1] ) == 0) {
+       dest = size - 1;
+       src  = 0;
+       }
+    else {
+       src  = size - 1;
+       dest = 0;
+       }
+
+    displs[0] = 0;
+    displs[1] = 10*sizeof(double);
+/*
+    blens[0]  = 1;
+    blens[1]  = 1;
+    types[0]  = MPI_DOUBLE;
+    types[1]  = MPI_UB;
+ */
+    MPI_Type_struct( 2, blens, displs, types, &rowtype );
+    MPI_Type_commit( &rowtype );
+    /* First test: send a row */
+    if (rank == src)
+    {
+       to     = dest;
+       count  = 10;
+       tag    = 2001;
+       SetArray( data, 100 );
+       /* Send a row */
+       MPI_Send( data, count, rowtype, to, tag, MPI_COMM_WORLD );
+#ifdef SHOWMSG
+       printf("%d sent", rank );
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+    }
+
+    if (rank == dest)
+    {
+       tag   = MPI_ANY_TAG;
+       count = 10;             
+       from  = MPI_ANY_SOURCE;
+       
+       ClearArray( data, 100, -1.0 );
+       MPI_Recv(data, count, MPI_DOUBLE, from, tag, MPI_COMM_WORLD,
+                &status ); 
+
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       MPI_Get_count( &status, MPI_DOUBLE, &st_count );
+
+       if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {
+           printf( "Status info: source = %d, tag = %d, count = %d\n",
+                   st_source, st_tag, st_count );
+       }
+#ifdef SHOWMSG
+       printf( "%d received", rank);
+       for (i = 0; i < 10; i++) printf(" %f",data[i]); printf("\n");
+#endif
+       for (i = 0; i < 10; i++) if (data[i] != 10*i) { 
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](rcv double) %d'th element = %f, should be %f\n",
+                    rank, i, data[i], 10.0*i );
+           }
+    }
+
+    /* Second test: receive a column into row */
+    if (rank == src)
+    {
+       to     = dest;
+       count  = 10;
+       tag    = 2001;
+       SetArray( data, 100 );
+       /* Send a row */
+       /* MPE_Print_datatype_pack_action( stdout, count, 
+                                          MPI_DOUBLE, 0, 0 ); */
+       MPI_Send( data, count, MPI_DOUBLE, to, tag, MPI_COMM_WORLD );
+#ifdef SHOWMSG
+       printf("%d sent", rank );
+       for (i = 0; i < 10; i++) printf(" %f",data[i]);printf("\n");
+#endif
+    }
+    if (rank == dest)
+    {
+       tag   = MPI_ANY_TAG;
+       count = 10;             
+       from  = MPI_ANY_SOURCE;
+       ClearArray( data, 100, -1.0 );
+       MPI_Recv(data, count, rowtype, from, tag, MPI_COMM_WORLD,
+                &status ); 
+       /* MPE_Print_datatype_unpack_action( stdout, count, rowtype, 0, 0 ); */
+
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       MPI_Get_count( &status, MPI_DOUBLE, &st_count );
+
+       if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {
+           printf( "Status info: source = %d, tag = %d, count = %d\n",
+               st_source, st_tag, st_count );
+       }
+#ifdef SHOWMSG
+       printf( "%d received", rank);
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+       for (i = 0; i < 10; i++) if (data[i*10] != i) {
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](rcv row) %d'th element = %f, should be %f\n",
+                    rank, i, data[i*10], 1.0*i );
+           }
+    }
+
+    /* Third test: send AND receive a row */
+    if (rank == src)
+    {
+       to     = dest;
+       count  = 10;
+       tag    = 2001;
+       SetArray( data, 100 );
+       /* Send a row */
+       MPI_Send( data, count, rowtype, to, tag, MPI_COMM_WORLD );
+#ifdef SHOWMSG
+       printf("%d sent", rank );
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+    }
+    if (rank == dest)
+    {
+       tag   = MPI_ANY_TAG;
+       count = 10;             
+       from  = MPI_ANY_SOURCE;
+       ClearArray( data, 100, -1.0 );
+       MPI_Recv(data, count, rowtype, from, tag, MPI_COMM_WORLD,
+                &status ); 
+
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       MPI_Get_count( &status, MPI_DOUBLE, &st_count );
+
+       if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {
+           printf( "Status info: source = %d, tag = %d, count = %d\n",
+                   st_source, st_tag, st_count );
+       }
+#ifdef SHOWMSG
+       printf( "%d received", rank);
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+       for (i = 0; i < 10; i++) if (data[i*10] != i*10) {
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](rcv row-row) %d'th element = %f, should be %f\n",
+                    rank, i, data[i*10], 10.0*i );
+           }
+    }
+
+    /* Second Set of Tests: Use Isend and Irecv instead of Send and Recv */
+    /* First test: send a row */
+    if (rank == src)
+    {
+       to     = dest;
+       count  = 10;
+       tag    = 2001;
+       SetArray( data, 100 );
+       /* Send a row */
+       MPI_Isend( data, count, rowtype, to, tag, MPI_COMM_WORLD, &handle );
+       MPI_Wait( &handle, &status );
+#ifdef SHOWMSG
+       printf("%d sent", rank );
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+    }
+
+    if (rank == dest)
+    {
+       tag   = MPI_ANY_TAG;
+       count = 10;             
+       from  = MPI_ANY_SOURCE;
+       ClearArray( data, 100, -1.0 );
+       MPI_Irecv(data, count, MPI_DOUBLE, from, tag, MPI_COMM_WORLD,
+                &handle ); 
+       MPI_Wait( &handle, &status );
+
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       MPI_Get_count( &status, MPI_DOUBLE, &st_count );
+
+       if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {
+           printf( "Status info: source = %d, tag = %d, count = %d\n",
+                   st_source, st_tag, st_count );
+       }
+#ifdef SHOWMSG
+       printf( "%d received", rank);
+       for (i = 0; i < 10; i++) printf(" %f",data[i]); printf("\n");
+#endif
+       for (i = 0; i < 10; i++) if (data[i] != 10*i) {
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](ircv double) %d'th element = %f, should be %f\n",
+                    rank, i, data[i], 10.0*i );
+           }
+    }
+
+    /* Second test: receive a column into row */
+    if (rank == src)
+    {
+       to     = dest;
+       count  = 10;
+       tag    = 2001;
+       SetArray( data, 100 );
+       /* Send a row */
+       MPI_Isend( data, count, MPI_DOUBLE, to, tag, MPI_COMM_WORLD, 
+                  &handle );
+       MPI_Wait( &handle, &status );
+#ifdef SHOWMSG
+       printf("%d sent", rank );
+       for (i = 0; i < 10; i++) printf(" %f",data[i]);printf("\n");
+#endif
+    }
+    if (rank == dest)
+    {
+       tag   = MPI_ANY_TAG;
+       count = 10;             
+       from  = MPI_ANY_SOURCE;
+       ClearArray( data, 100, -1.0 );
+       MPI_Irecv(data, count, rowtype, from, tag, MPI_COMM_WORLD,
+                &handle ); 
+       MPI_Wait( &handle, &status );
+
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       MPI_Get_count( &status, MPI_DOUBLE, &st_count );
+
+       if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {
+           printf( "Status info: source = %d, tag = %d, count = %d\n",
+                   st_source, st_tag, st_count );
+       }
+#ifdef SHOWMSG
+       printf( "%d received", rank);
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+       for (i = 0; i < 10; i++) if (data[i*10] != i) {
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](ircv row) %d'th element = %f, should be %f\n",
+                    rank, i, data[i*10], 1.0*i );
+           }
+    }
+
+    /* Third test: send AND receive a row */
+    if (rank == src)
+    {
+       to     = dest;
+       count  = 10;
+       tag    = 2001;
+       SetArray( data, 100 );
+       /* Send a row */
+       MPI_Isend( data, count, rowtype, to, tag, MPI_COMM_WORLD, &handle );
+       MPI_Wait( &handle, &status );
+#ifdef SHOWMSG
+       printf("%d sent", rank );
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+    }
+    if (rank == dest)
+    {
+       tag   = MPI_ANY_TAG;
+       count = 10;             
+       from  = MPI_ANY_SOURCE;
+       ClearArray( data, 100, -1.0 );
+       MPI_Irecv(data, count, rowtype, from, tag, MPI_COMM_WORLD,
+                &handle ); 
+       MPI_Wait( &handle, &status );
+
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       MPI_Get_count( &status, MPI_DOUBLE, &st_count );
+
+       if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) {
+           printf( "Status info: source = %d, tag = %d, count = %d\n",
+                   st_source, st_tag, st_count );
+       }
+#ifdef SHOWMSG
+       printf( "%d received", rank);
+       for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n");
+#endif
+       for (i = 0; i < 10; i++) if (data[i*10] != i*10) {
+           errcnt++;
+           fprintf( stderr, 
+                   "[%d](ircv row-row) %d'th element = %f, should be %f\n",
+                    rank, i, data[i*10], 10.0*i );
+           }
+    }
+
+    i = errcnt;
+    MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (errcnt > 0) {
+       printf( "Found %d errors in the run \n", errcnt );
+       }
+    MPI_Type_free( &rowtype );
+    Test_Waitforall( );
+    MPI_Finalize();
+    return 0;
+}
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/irecvtest.c b/teshsuite/smpi/mpich-test/pt2pt/irecvtest.c
new file mode 100644 (file)
index 0000000..446059e
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Program to test that the "no overtaking messages" semantics
+ * of point to point communications in MPI is satisfied, 
+ * for a simple send/irecv operation.
+ *
+ * Derived from a program written by 
+ *                             Patrick Bridges
+ *                             bridges@mcs.anl.gov
+ *                             patrick@CS.MsState.Edu
+ */
+
+#include <stdio.h>
+#include "test.h"
+#include "mpi.h"
+
+#define SIZE 10000
+
+static int src  = 0;
+static int dest = 1;
+
+/* Which tests to perform (not yet implemented) */
+/* static int Do_Buffer = 1; */
+/* static int Do_Standard = 1; */
+
+/* Prototypes for picky compilers */
+void Generate_Data ( double *, int );
+void Normal_Test_Send ( double *, int );
+void Async_Test_Recv ( double *, int );
+int Check_Data ( double *, int );
+void Clear_Buffer ( double *, int );
+
+void Generate_Data(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i;
+
+    for (i = 0; i < buff_size; i++)
+       buffer[i] = (double)i+1;
+}
+
+#define NSHORT 10
+void Normal_Test_Send(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i, j;
+
+    for (j = 0; j < 2; j++) {
+       /* send a long message */
+       MPI_Send(buffer, (buff_size/2 - NSHORT), MPI_DOUBLE, dest, 2000, 
+                MPI_COMM_WORLD);
+       buffer += buff_size/2 - NSHORT;
+       /* Followed by NSHORT short ones */
+       for (i = 0; i < NSHORT; i++)
+           MPI_Send(buffer++, 1, MPI_DOUBLE, dest, 2000, MPI_COMM_WORLD);
+    }
+}
+
+void Async_Test_Recv(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i, j, req = 0;
+    MPI_Status Stat[22];
+    MPI_Request Hand[22];
+    
+    for (j = 0; j < 2; j++) {
+       /* Receive a long message */
+       MPI_Irecv(buffer, (buff_size/2 - NSHORT), MPI_DOUBLE, src, 
+                2000, MPI_COMM_WORLD, &(Hand[req++]));
+       buffer += buff_size/2 - NSHORT;
+       /* Followed by NSHORT short ones */
+       for (i = 0; i < NSHORT; i++)
+           MPI_Irecv(buffer++, 1, MPI_DOUBLE, src, 2000, 
+                     MPI_COMM_WORLD, &(Hand[req++]));
+    }
+    MPI_Waitall(req, Hand, Stat);
+}
+
+int Check_Data(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i;
+    int err = 0;
+
+    for (i = 0; i < buff_size; i++)
+       if (buffer[i] != (i + 1)) {
+           err++;
+           fprintf( stderr, "Value at %d is %f, should be %f\n", i, 
+                   buffer[i], (double)(i+1) );
+           fflush( stderr );
+           if (err > 10) return 1;
+           }
+    return err;
+}
+
+void Clear_Buffer(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i;
+    for (i = 0; i < buff_size; i++)
+       buffer[i] = -1;
+}
+
+
+int main( int argc, char **argv)
+{
+    int rank; /* My Rank (0 or 1) */
+    double buffer[SIZE];
+    char *Current_Test = NULL;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+    if (rank == src) { 
+       Generate_Data(buffer, SIZE);
+       Normal_Test_Send(buffer, SIZE);
+       Test_Waitforall( );
+       MPI_Finalize();
+
+    } else if (rank == dest) {
+       Test_Init("irecvtest", rank);
+       /* Test 2 */
+       Clear_Buffer(buffer, SIZE);
+       Current_Test = (char*)"Overtaking Test (Normal Send   ->  Async Receive)";
+       Async_Test_Recv(buffer, SIZE);
+       if (Check_Data(buffer, SIZE))
+           Test_Failed(Current_Test);
+       else
+           Test_Passed(Current_Test);
+       Test_Waitforall( );
+
+       MPI_Finalize();
+       {
+           int rval = Summarize_Test_Results(); /* Returns number of tests;
+                                                   that failed */
+           Test_Finalize();
+           return rval;
+       }
+    } else {
+       fprintf(stderr, "*** This program uses exactly 2 processes! ***\n");
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    return 0;
+}
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/irsend.c b/teshsuite/smpi/mpich-test/pt2pt/irsend.c
new file mode 100644 (file)
index 0000000..9b690de
--- /dev/null
@@ -0,0 +1,155 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "dtypes.h"
+#include "gcomm.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int verbose = 0;
+/* Nonblocking ready sends 
+   
+   This is similar to a test in allpair.f, but with an expanded range of
+   datatypes and communicators.
+ */
+
+int main( int argc, char **argv )
+{
+    MPI_Datatype *types;
+    void         **inbufs, **outbufs;
+    char         **names;
+    int          *counts, *bytesize, ntype;
+    MPI_Comm     comms[20];
+    int          ncomm = 20, rank, np, partner, tag;
+    int          i, j, k, err, toterr, world_rank, errloc;
+    MPI_Status   status, statuses[2];
+    int          flag, index;
+    char         *obuf;
+    MPI_Request  requests[2];
+
+
+    MPI_Init( &argc, &argv );
+
+    AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, 
+                    &names, &ntype );
+    GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype );
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+    MakeComms( comms, 20, &ncomm, 0 );
+
+/* Test over a wide range of datatypes and communicators */
+    err = 0;
+    for (i=0; i<ncomm; i++) {
+       MPI_Comm_rank( comms[i], &rank );
+       MPI_Comm_size( comms[i], &np );
+       if (np < 2) continue;
+       tag = i;
+       for (j=0; j<ntype; j++) {
+           if (world_rank == 0 && verbose) 
+               fprintf( stdout, "Testing type %s\n", names[j] );
+           /* This test does an irsend between both partners, with 
+              a sendrecv after the irecv used to guarentee that the
+              irsend has a matching receive
+              */
+           if (rank == 0) {
+               partner = np - 1;
+#if 0
+               MPIR_PrintDatatypePack( stdout, counts[j], types[j], 0, 0 );
+#endif
+               obuf = outbufs[j];
+               for (k=0; k<bytesize[j]; k++) 
+                   obuf[k] = 0;
+           
+               MPI_Irecv(outbufs[j], counts[j], types[j], partner, tag, 
+                         comms[i], &requests[0] );
+
+               MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                             MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                             comms[i], &status );
+
+               MPI_Irsend( inbufs[j], counts[j], types[j], partner, tag, 
+                           comms[i], &requests[1] );
+           
+               do {
+                   MPI_Waitany( 2, requests, &index, &status );
+               } while (index != 0);
+
+               /* Always the possiblity that the Irsend is still waiting */
+               MPI_Waitall( 2, requests, statuses );
+               if ((errloc = CheckData( inbufs[j], outbufs[j], bytesize[j] ))) {
+                   char *p1, *p2;
+                   fprintf( stderr, 
+                            "Error in data with type %s (type %d on %d) at byte %d\n", 
+                            names[j], j, world_rank, errloc - 1 );
+                   p1 = (char *)inbufs[j];
+                   p2 = (char *)outbufs[j];
+                   fprintf( stderr, 
+                            "Got %x expected %x\n", p1[errloc-1], p2[errloc-1] );
+                   err++;
+#if 0
+                   MPIR_PrintDatatypeUnpack( stderr, counts[j], types[j], 
+                                             0, 0 );
+#endif
+               }
+           }
+           else if (rank == np - 1) {
+               partner = 0;
+               obuf = outbufs[j];
+               for (k=0; k<bytesize[j]; k++) 
+                   obuf[k] = 0;
+           
+               MPI_Irecv(outbufs[j], counts[j], types[j], partner, tag, 
+                         comms[i], &requests[0] );
+
+               MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                             MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                             comms[i], &status );
+
+               /* Wait for irecv to complete */
+               do {
+                   MPI_Test( &requests[0], &flag, &status );
+               } while (!flag);
+               if ((errloc = CheckData( inbufs[j], outbufs[j], bytesize[j] ))) {
+                   char *p1, *p2;
+                   fprintf( stderr, 
+                            "Error in data with type %s (type %d on %d) at byte %d\n", 
+                            names[j], j, world_rank, errloc - 1 );
+                   p1 = (char *)inbufs[j];
+                   p2 = (char *)outbufs[j];
+                   fprintf( stderr, 
+                            "Got %x expected %x\n", p1[errloc-1], p2[errloc-1] );
+                   err++;
+#if 0
+                   MPIR_PrintDatatypeUnpack( stderr, counts[j], types[j], 
+                                             0, 0 );
+#endif
+               }
+
+               MPI_Irsend( inbufs[j], counts[j], types[j], partner, tag, 
+                           comms[i], &requests[1] );
+           
+               MPI_Waitall(1, &requests[1], &status );
+           }
+       }
+    }
+
+    if (err > 0) {
+       fprintf( stderr, "%d errors on %d\n", err, rank );
+    }
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (world_rank == 0) {
+       if (toterr == 0) {
+           printf( " No Errors\n" );
+       }
+       else {
+           printf (" Found %d errors\n", toterr );
+       }
+    }
+    FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype );
+    FreeComms( comms, ncomm );
+    MPI_Finalize();
+
+    return err;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/irsendinit.c b/teshsuite/smpi/mpich-test/pt2pt/irsendinit.c
new file mode 100644 (file)
index 0000000..d80cf5a
--- /dev/null
@@ -0,0 +1,167 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "dtypes.h"
+#include "gcomm.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int verbose = 0;
+/* Nonblocking ready persistent sends 
+   
+   This is similar to a test in allpair.f, but with an expanded range of
+   datatypes and communicators.
+
+   This is like irsend.c, but with multiple starts of the same persistent
+   request.
+ */
+
+int main( int argc, char **argv )
+{
+    MPI_Datatype *types;
+    void         **inbufs, **outbufs;
+    char         **names;
+    int          *counts, *bytesize, ntype;
+    MPI_Comm     comms[20];
+    int          ncomm = 20, rank, np, partner, tag;
+    int          i, j, k, err, toterr, world_rank, errloc;
+    MPI_Status   status;
+    int          flag, index;
+    char         *obuf;
+    MPI_Request  requests[2];
+    int          mcnt;
+
+
+    MPI_Init( &argc, &argv );
+
+    AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, 
+                    &names, &ntype );
+    GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype );
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+    MakeComms( comms, 20, &ncomm, 0 );
+
+/* Test over a wide range of datatypes and communicators */
+    err = 0;
+    for (i=0; i<ncomm; i++) {
+       MPI_Comm_rank( comms[i], &rank );
+       MPI_Comm_size( comms[i], &np );
+       if (np < 2) continue;
+       tag = i;
+       for (j=0; j<ntype; j++) {
+           if (world_rank == 0 && verbose) 
+               fprintf( stdout, "Testing type %s\n", names[j] );
+           /* This test does an irsend between both partners, with 
+              a sendrecv after the irecv used to guarentee that the
+              irsend has a matching receive
+              */
+           if (rank == 0) {
+               partner = np - 1;
+#if 0
+               MPIR_PrintDatatypePack( stdout, counts[j], types[j], 0, 0 );
+#endif
+               obuf = outbufs[j];
+               for (k=0; k<bytesize[j]; k++) 
+                   obuf[k] = 0;
+           
+               MPI_Recv_init(outbufs[j], counts[j], types[j], partner, tag, 
+                             comms[i], &requests[0] );
+               MPI_Rsend_init( inbufs[j], counts[j], types[j], partner, tag, 
+                               comms[i], &requests[1] );
+           
+               for (mcnt=0; mcnt<10; mcnt++) {
+                   MPI_Start( &requests[0] );
+                   MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                                 MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                                 comms[i], &status );
+                   MPI_Start( &requests[1] );
+                   do {
+                       MPI_Waitany( 2, requests, &index, &status );
+                   } while (index != 0);
+                   
+                   if ((errloc = CheckData( inbufs[j], outbufs[j], 
+                                            bytesize[j] ))) {
+                       char *p1, *p2;
+                       fprintf( stderr, 
+    "Error in data with type %s (type %d on %d) at byte %d in %dth test\n", 
+                                names[j], j, world_rank, errloc - 1, mcnt );
+                       p1 = (char *)inbufs[j];
+                       p2 = (char *)outbufs[j];
+                       fprintf( stderr, 
+                       "Got %x expected %x\n", p1[errloc-1], p2[errloc-1] );
+                       err++;
+#if 0
+                       MPIR_PrintDatatypeUnpack( stderr, counts[j], types[j], 
+                                                 0, 0 );
+#endif
+                   }
+                   MPI_Waitall(1, &requests[1], &status );
+               }
+               MPI_Request_free( &requests[0] );
+               MPI_Request_free( &requests[1] );
+           }
+           else if (rank == np - 1) {
+               partner = 0;
+               obuf = outbufs[j];
+               for (k=0; k<bytesize[j]; k++) 
+                   obuf[k] = 0;
+           
+               MPI_Recv_init(outbufs[j], counts[j], types[j], partner, tag, 
+                             comms[i], &requests[0] );
+               MPI_Rsend_init( inbufs[j], counts[j], types[j], partner, tag, 
+                               comms[i], &requests[1] );
+               for (mcnt=0; mcnt<10; mcnt++) {
+                   MPI_Start( &requests[0] );
+                   MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                                 MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                                 comms[i], &status );
+                   MPI_Start( &requests[1] );
+                   /* Wait for irecv to complete */
+                   do {
+                       MPI_Test( &requests[0], &flag, &status );
+                   } while (!flag);
+                   if ((errloc = CheckData( inbufs[j], outbufs[j], 
+                                            bytesize[j] ))) {
+                       char *p1, *p2;
+                       fprintf( stderr, 
+                   "Error in data with type %s (type %d on %d) at byte %d\n", 
+                                names[j], j, world_rank, errloc - 1 );
+                       p1 = (char *)inbufs[j];
+                       p2 = (char *)outbufs[j];
+                       fprintf( stderr, 
+                       "Got %x expected %x\n", p1[errloc-1], p2[errloc-1] );
+                       err++;
+#if 0
+                       MPIR_PrintDatatypeUnpack( stderr, counts[j], types[j], 
+                                             0, 0 );
+#endif
+                   }
+
+                   MPI_Waitall(1, &requests[1], &status );
+               }
+               MPI_Request_free( &requests[0] );
+               MPI_Request_free( &requests[1] );
+           }
+       }
+    }
+
+    if (err > 0) {
+       fprintf( stderr, "%d errors on %d\n", err, rank );
+    }
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (world_rank == 0) {
+       if (toterr == 0) {
+           printf( " No Errors\n" );
+       }
+       else {
+           printf (" Found %d errors\n", toterr );
+       }
+    }
+    FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype );
+    FreeComms( comms, ncomm );
+    MPI_Finalize();
+
+    return err;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/isendf.f b/teshsuite/smpi/mpich-test/pt2pt/isendf.f
new file mode 100644 (file)
index 0000000..1880724
--- /dev/null
@@ -0,0 +1,53 @@
+      program main
+      include 'mpif.h'
+      integer ierr, errs, toterrs
+      integer request
+      integer status(MPI_STATUS_SIZE)
+      integer rank, size, buf(10)
+      logical flag
+C
+      call MPI_Init( ierr )
+      errs = 0
+C
+      call MPI_Comm_size( MPI_COMM_WORLD, size, ierr )
+      if (size .lt. 2) then
+         print *, 'Must have at least two processes'
+         call MPI_Abort( MPI_COMM_WORLD, 1, ierr )
+      endif
+      call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr )
+      if (rank .eq. 0) then
+         do i = 1, 10
+            buf(i) = i
+         enddo
+         call MPI_Isend( buf, 10, MPI_INTEGER, size - 1, 1,
+     $        MPI_COMM_WORLD, request, ierr )
+         call MPI_Wait( request, status, ierr )
+      endif
+      if (rank .eq. size - 1) then
+         call MPI_Irecv( buf, 10, MPI_INTEGER, 0, 1, MPI_COMM_WORLD,
+     $        request, ierr )
+C         call MPI_Wait( request, status, ierr )
+         flag = .FALSE.
+         do while (.not. flag) 
+            call MPI_Test( request, flag, status, ierr )
+         enddo
+C     
+C     Check the results
+         do i = 1, 10
+            if (buf(i) .ne. i) then
+               errs = errs + 1
+            endif
+         enddo
+      endif
+C
+      call MPI_Allreduce( errs, toterrs, 1, MPI_INTEGER, MPI_SUM,
+     $     MPI_COMM_WORLD, ierr )
+      if (rank .eq. 0) then
+         if (toterrs .gt. 0) then
+            print *, "Found ", toterrs, " Errors"
+         else
+            PRINT *, " No Errors"
+         endif
+      endif
+      call MPI_Finalize( ierr )
+      end
diff --git a/teshsuite/smpi/mpich-test/pt2pt/isendtest.c b/teshsuite/smpi/mpich-test/pt2pt/isendtest.c
new file mode 100644 (file)
index 0000000..0a92010
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+   MPICH 1.0.8 on Intel Paragons is alleged to have failed this test.
+   (Original code from 
+    From: weber@zam212.zam.kfa-juelich.de (M.Weber)
+    Reply-To: M.Weber@kfa-juelich.de
+   modified slightly to meet our test rules.)
+ */
+#include <stdio.h>
+#include "mpi.h"
+#define SIZE 100
+/* SIZE 16 worked on Paragon */
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int main( int argc, char *argv[])
+{
+  int num_procs,my_id,flag;
+  int buf[SIZE][SIZE];
+  MPI_Status status;
+  MPI_Request handle;
+
+  MPI_Init(&argc,&argv);
+  MPI_Comm_size(MPI_COMM_WORLD,&num_procs);
+  MPI_Comm_rank(MPI_COMM_WORLD,&my_id);
+  
+  if ( my_id == 1 ) {
+     MPI_Isend (buf, SIZE*SIZE, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle );
+
+     flag = 0;
+     while (flag == 0) {
+        MPI_Test (&handle, &flag, &status);
+        printf("%d Wait for completition flag = %d handle = %ld ....\n",
+               my_id, flag, (long) handle);
+     }
+  }
+  else if (my_id == 0 ) {
+     MPI_Recv (buf, SIZE*SIZE, MPI_INT, 1, 0, MPI_COMM_WORLD, &status );
+  }
+
+  printf("%d Done ....\n",my_id);
+
+  MPI_Finalize();
+  return 0;
+}
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/isndrcv.c b/teshsuite/smpi/mpich-test/pt2pt/isndrcv.c
new file mode 100644 (file)
index 0000000..d15c58a
--- /dev/null
@@ -0,0 +1,507 @@
+/* 
+ * Program to test all of the features of MPI_Send and MPI_Recv
+ *
+ * *** What is tested? ***
+ * 1. Sending and receiving all basic types and many sizes - check
+ * 2. Tag selectivity - check
+ * 3. Error return codes for
+ *    a. Invalid Communicator
+ *    b. Invalid destination or source
+ *    c. Count out of range
+ *    d. Invalid type
+ */
+
+#include "test.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mpi.h"
+
+#ifdef HAVE_MPICHCONF_H
+#include "mpichconf.h"
+#endif
+
+static int src = 1;
+static int dest = 0;
+
+static int verbose = 0;
+
+#define MAX_TYPES 12
+static MPI_Datatype BasicTypes[MAX_TYPES];
+#if defined(HAVE_LONG_DOUBLE) && (!defined HAS_XDR)
+static int ntypes = 12;
+#else
+static int ntypes = 11;
+#endif
+
+static int maxbufferlen = 10000;
+static int stdbufferlen = 300;
+
+/* Prototypes to keep compilers quiet */
+void AllocateBuffers ( void **, MPI_Datatype *, int, int );
+void FreeBuffers ( void **, int );
+void FillBuffers ( void **, MPI_Datatype *, int, int );
+int CheckBuffer ( void *, MPI_Datatype, int );
+void SetupBasicTypes (void);
+void SenderTest1 (void);
+void ReceiverTest1 (void);
+void SenderTest2 (void);
+void ReceiverTest2 (void);
+void SenderTest3 (void);
+void ReceiverTest3 (void);
+
+void 
+AllocateBuffers(void **bufferspace, MPI_Datatype *buffertypes, int num_types, 
+               int bufferlen)
+{
+    int i;
+    for (i = 0; i < ntypes; i++) {
+       if (buffertypes[i] == MPI_CHAR)
+           bufferspace[i] = malloc(bufferlen * sizeof(char));
+       else if (buffertypes[i] == MPI_SHORT)
+           bufferspace[i] = malloc(bufferlen * sizeof(short));
+       else if (buffertypes[i] == MPI_INT)
+           bufferspace[i] = malloc(bufferlen * sizeof(int));
+       else if (buffertypes[i] == MPI_LONG)
+           bufferspace[i] = malloc(bufferlen * sizeof(long));
+       else if (buffertypes[i] == MPI_UNSIGNED_CHAR)
+           bufferspace[i] = malloc(bufferlen * sizeof(unsigned char));
+       else if (buffertypes[i] == MPI_UNSIGNED_SHORT)
+           bufferspace[i] = malloc(bufferlen * sizeof(unsigned short));
+       else if (buffertypes[i] == MPI_UNSIGNED)
+           bufferspace[i] = malloc(bufferlen * sizeof(unsigned int));
+       else if (buffertypes[i] == MPI_UNSIGNED_LONG)
+           bufferspace[i] = malloc(bufferlen * sizeof(unsigned long));
+       else if (buffertypes[i] == MPI_FLOAT)
+           bufferspace[i] = malloc(bufferlen * sizeof(float));
+       else if (buffertypes[i] == MPI_DOUBLE)
+           bufferspace[i] = malloc(bufferlen * sizeof(double));
+#if defined(HAVE_LONG_DOUBLE)  && (!defined HAS_XDR)
+       else if (MPI_LONG_DOUBLE && buffertypes[i] == MPI_LONG_DOUBLE) {
+           int dlen;
+           MPI_Type_size( MPI_LONG_DOUBLE, &dlen );
+           bufferspace[i] = malloc(bufferlen * dlen);
+       }
+#endif
+       else if (buffertypes[i] == MPI_BYTE)
+           bufferspace[i] = malloc(bufferlen * sizeof(unsigned char));
+    }
+}
+
+void 
+FreeBuffers(void **buffers, int nbuffers)
+{
+    int i;
+    for (i = 0; i < nbuffers; i++)
+       free(buffers[i]);
+}
+
+void 
+FillBuffers(void **bufferspace, MPI_Datatype *buffertypes, int num_types, 
+           int bufferlen)
+{
+    int i, j;
+    for (i = 0; i < ntypes; i++) {
+       for (j = 0; j < bufferlen; j++) {
+           if (buffertypes[i] == MPI_CHAR)
+               ((char *)bufferspace[i])[j] = (char)(j & 0x7f);
+           else if (buffertypes[i] == MPI_SHORT)
+               ((short *)bufferspace[i])[j] = (short)j;
+           else if (buffertypes[i] == MPI_INT)
+               ((int *)bufferspace[i])[j] = (int)j;
+           else if (buffertypes[i] == MPI_LONG)
+               ((long *)bufferspace[i])[j] = (long)j;
+           else if (buffertypes[i] == MPI_UNSIGNED_CHAR)
+               ((unsigned char *)bufferspace[i])[j] = (unsigned char)j;
+           else if (buffertypes[i] == MPI_UNSIGNED_SHORT)
+               ((unsigned short *)bufferspace[i])[j] = (unsigned short)j;
+           else if (buffertypes[i] == MPI_UNSIGNED)
+               ((unsigned int *)bufferspace[i])[j] = (unsigned int)j;
+           else if (buffertypes[i] == MPI_UNSIGNED_LONG)
+               ((unsigned long *)bufferspace[i])[j] = (unsigned long)j;
+           else if (buffertypes[i] == MPI_FLOAT)
+               ((float *)bufferspace[i])[j] = (float)j;
+           else if (buffertypes[i] == MPI_DOUBLE)
+               ((double *)bufferspace[i])[j] = (double)j;
+#if defined(HAVE_LONG_DOUBLE)  && (!defined HAS_XDR)
+           else if (MPI_LONG_DOUBLE && buffertypes[i] == MPI_LONG_DOUBLE)
+               ((long double *)bufferspace[i])[j] = (long double)j;
+#endif
+           else if (buffertypes[i] == MPI_BYTE)
+               ((unsigned char *)bufferspace[i])[j] = (unsigned char)j;
+       }
+    }
+}
+
+int
+CheckBuffer(bufferspace, buffertype, bufferlen)
+void *bufferspace; 
+MPI_Datatype buffertype; 
+int bufferlen;
+{
+    int j;
+    for (j = 0; j < bufferlen; j++) {
+       if (buffertype == MPI_CHAR) {
+           if (((char *)bufferspace)[j] != (char)(j & 0x7f))
+               return 1;
+       } else if (buffertype == MPI_SHORT) {
+           if (((short *)bufferspace)[j] != (short)j)
+               return 1;
+       } else if (buffertype == MPI_INT) {
+           if (((int *)bufferspace)[j] != (int)j)
+               return 1;
+       } else if (buffertype == MPI_LONG) {
+           if (((long *)bufferspace)[j] != (long)j)
+               return 1;
+       } else if (buffertype == MPI_UNSIGNED_CHAR) {
+           if (((unsigned char *)bufferspace)[j] != (unsigned char)j)
+               return 1;
+       } else if (buffertype == MPI_UNSIGNED_SHORT) {
+                   if (((unsigned short *)bufferspace)[j] != (unsigned short)j)
+               return 1;
+       } else if (buffertype == MPI_UNSIGNED) {
+           if (((unsigned int *)bufferspace)[j] != (unsigned int)j)
+               return 1;
+       } else if (buffertype == MPI_UNSIGNED_LONG) {
+           if (((unsigned long *)bufferspace)[j] != (unsigned long)j)
+               return 1;
+       } else if (buffertype == MPI_FLOAT) {
+           if (((float *)bufferspace)[j] != (float)j)
+               return 1;
+       } else if (buffertype == MPI_DOUBLE) {
+           if (((double *)bufferspace)[j] != (double)j)
+               return 1;
+#if defined(HAVE_LONG_DOUBLE)  && (!defined HAS_XDR)
+       } else if (MPI_LONG_DOUBLE && buffertype == MPI_LONG_DOUBLE) {
+           if (((long double *)bufferspace)[j] != (long double)j)
+               return 1;
+#endif
+       } else if (buffertype == MPI_BYTE) {
+           if (((unsigned char *)bufferspace)[j] != (unsigned char)j)
+               return 1;
+       }
+    }
+    return 0;
+}
+
+void SetupBasicTypes( void )
+{
+    BasicTypes[0] = MPI_CHAR;
+    BasicTypes[1] = MPI_SHORT;
+    BasicTypes[2] = MPI_INT;
+    BasicTypes[3] = MPI_LONG;
+    BasicTypes[4] = MPI_UNSIGNED_CHAR;
+    BasicTypes[5] = MPI_UNSIGNED_SHORT;
+    BasicTypes[6] = MPI_UNSIGNED;
+    BasicTypes[7] = MPI_UNSIGNED_LONG;
+    BasicTypes[8] = MPI_FLOAT;
+    BasicTypes[9] = MPI_DOUBLE;
+
+    /* Define the last few elements as null just in case */
+    BasicTypes[11] = MPI_DATATYPE_NULL;
+#if defined (HAVE_LONG_DOUBLE) && (!defined HAS_XDR)
+    if (MPI_LONG_DOUBLE) {
+       BasicTypes[10] = MPI_LONG_DOUBLE;
+       BasicTypes[11] = MPI_BYTE;
+       }
+    else {
+       ntypes = 11;
+       BasicTypes[10] = MPI_BYTE;
+       }
+#else
+    BasicTypes[10] = MPI_BYTE;
+#endif
+}
+
+void 
+SenderTest1( void )
+{
+    void *bufferspace[MAX_TYPES];
+    int i, j;
+    int act_send;
+    MPI_Request *requests = 
+       (MPI_Request *)malloc(sizeof(MPI_Request) * ntypes * 
+                             maxbufferlen/500);
+    MPI_Status *statuses = 
+       (MPI_Status *)malloc(sizeof(MPI_Status) * ntypes * 
+                            maxbufferlen/500);
+
+    AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen);
+    FillBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen);
+    act_send = 0;
+    for (i = 0; i < ntypes; i++) {
+       for (j = 0; j < maxbufferlen; j += 500) {
+           if (BasicTypes[i] == MPI_DATATYPE_NULL) continue;
+           MPI_Isend(bufferspace[i], j, BasicTypes[i], dest, 
+                     2000, MPI_COMM_WORLD, 
+                     &(requests[act_send++]));
+           }
+    }
+    MPI_Waitall( act_send, requests, statuses);
+    free(requests);
+    free(statuses);
+    FreeBuffers(bufferspace, ntypes);
+}
+
+void
+ReceiverTest1( void )
+{
+    void *bufferspace[MAX_TYPES];
+    int i, j;
+    char message[81];
+    MPI_Status Stat;
+    MPI_Request Req;
+    int dummy, passed;
+
+    AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen);
+    for (i = 0; i < ntypes; i++) {
+       passed = 1;
+       /* Try different sized messages */
+       for (j = 0; j < maxbufferlen; j += 500) {
+           /* Skip null datatypes */
+           if (!BasicTypes[i]) continue;
+           MPI_Irecv(bufferspace[i], j, BasicTypes[i], src, 
+                    2000, MPI_COMM_WORLD, &Req);
+           sprintf(message, "Send-Receive Test, Type %d, Count %d",
+                   i, j);
+           MPI_Wait(&Req, &Stat);
+           if (Stat.MPI_SOURCE != src) {
+               fprintf(stderr, "*** Incorrect Source returned. ***\n");
+               Test_Failed(message);
+               passed = 0;
+           } else if (Stat.MPI_TAG != 2000) {  
+               fprintf(stderr, "*** Incorrect Tag returned. ***\n");       
+               Test_Failed(message);
+               passed = 0;
+           } else if (MPI_Get_count(&Stat, BasicTypes[i], &dummy) ||
+                      dummy != j) {
+               fprintf(stderr, 
+                       "*** Incorrect Count returned, Count = %d. ***\n", 
+                       dummy);
+               Test_Failed(message);
+               passed = 0;
+           } else if(CheckBuffer(bufferspace[i], BasicTypes[i], j)) {
+               fprintf(stderr, "*** Incorrect Message received. ***\n");
+               Test_Failed(message);
+               passed = 0;
+           } 
+       }
+       sprintf(message, "Send-Receive Test, Type %d",
+               i);
+       if (passed) 
+           Test_Passed(message);
+       else 
+           Test_Failed(message);
+    }
+    FreeBuffers(bufferspace, ntypes);
+}
+
+/* Test Tag Selectivity */
+void 
+SenderTest2( void )
+{
+    int *buffer;
+    int i;
+    MPI_Request requests[10];
+    MPI_Status statuses[10];
+
+    buffer = (int *)malloc(stdbufferlen * sizeof(int));
+
+    for (i = 0; i < stdbufferlen; i++)
+       buffer[i] = i;
+    
+    for (i = 1; i <= 10; i++)
+       MPI_Isend(buffer, stdbufferlen, MPI_INT, dest,
+                2000+i, MPI_COMM_WORLD, &(requests[i-1]));
+    MPI_Waitall(10, requests, statuses);
+    free(buffer);
+    
+    return;
+}
+
+void
+ReceiverTest2( void )
+{
+    int *buffer;
+    int i, j;
+    char message[81];
+    MPI_Status Stat;
+    int dummy, passed;
+
+    MPI_Request Req;
+
+    buffer = (int *)malloc(stdbufferlen * sizeof(int));
+    passed = 1;
+
+    for (i = 2010; i >= 2001; i--) {
+       MPI_Irecv(buffer, stdbufferlen, MPI_INT, src, 
+                i, MPI_COMM_WORLD, &Req);
+       sprintf(message, "Tag Selectivity Test, Tag %d",
+               i);
+       MPI_Wait(&Req, &Stat);
+       if (Stat.MPI_SOURCE != src) {
+           fprintf(stderr, "*** Incorrect Source returned. ***\n");
+           Test_Failed(message);
+       } else if (Stat.MPI_TAG != i) { 
+           fprintf(stderr, "*** Incorrect Tag returned. ***\n");           
+           Test_Failed(message);
+       } else if (MPI_Get_count(&Stat, MPI_INT, &dummy) ||
+                  dummy != stdbufferlen) {
+           fprintf(stderr, 
+                   "*** Incorrect Count returned, Count = %d. ***\n", 
+                   dummy);
+           Test_Failed(message);
+       } else if(CheckBuffer( (void *)buffer, MPI_INT, stdbufferlen)) {
+           fprintf(stderr, "*** Incorrect Message received. ***\n");
+           Test_Failed(message);
+           passed = 0;
+       }
+       /* Clear out the buffer */
+       for (j = 0; j < stdbufferlen; j++)
+           buffer[j] = -1;
+    }
+    strncpy(message, "Tag Selectivity Test", 81);
+    if (passed)
+       Test_Passed(message);
+    else
+       Test_Failed(message);
+    free(buffer);
+    return;
+}
+
+void
+SenderTest3( void )
+{
+    return;
+}
+
+void
+ReceiverTest3( void )
+{
+    int buffer[20];
+    MPI_Datatype bogus_type = MPI_DATATYPE_NULL;
+    MPI_Request Req;
+#if 0
+    MPI_Status Stat;
+    int err_code;
+#endif
+    if (verbose)
+       MPI_Errhandler_set(MPI_COMM_WORLD, TEST_ERRORS_WARN);
+    else
+       MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
+
+    if (MPI_Isend(buffer, 20, MPI_INT, dest,
+                1, MPI_COMM_NULL, &Req) == MPI_SUCCESS){
+       Test_Failed("NULL Communicator Test");
+    }
+    else {
+       Test_Passed("NULL Communicator Test");
+#if 0
+       /* If test passed (i.e. send failed, try waiting on the
+          request... */
+       Test_Message("About to wait on failed request.");
+       if (MPI_Wait(&Req, &Stat) == MPI_SUCCESS) {;
+           Test_Failed("Wait on failed isend Test");
+        }
+        else 
+           Test_Passed("Wait on failed isend Test");
+       Test_Message("Done waiting on failed request.");
+#endif
+    }
+/*
+    if (MPI_Isend(NULL, 10, MPI_INT, dest,
+                1, MPI_COMM_WORLD, &Req) == MPI_SUCCESS){
+       Test_Failed("Invalid Buffer Test");
+    }
+    else
+       Test_Passed("Invalid Buffer Test");
+*/
+   if (MPI_Isend(buffer, -1, MPI_INT, dest,
+                1, MPI_COMM_WORLD, &Req) == MPI_SUCCESS){
+       Test_Failed("Invalid Count Test");
+    }
+    else
+       Test_Passed("Invalid Count Test");
+
+   if (MPI_Isend(buffer, 20, bogus_type, dest,
+                1, MPI_COMM_WORLD, &Req) == MPI_SUCCESS){
+       Test_Failed("Invalid Type Test");
+    }
+    else
+       Test_Passed("Invalid Type Test");
+
+   if (MPI_Isend(buffer, 20, MPI_INT, dest, 
+                -1000, MPI_COMM_WORLD, &Req) == MPI_SUCCESS) {
+        Test_Failed("Invalid Tag Test");
+    }
+    else
+       Test_Passed("Invalid Tag Test");
+
+   if (MPI_Isend(buffer, 20, MPI_INT, 300,
+                1, MPI_COMM_WORLD, &Req) == MPI_SUCCESS) {
+       Test_Failed("Invalid Destination Test");
+    }
+    else
+       Test_Passed("Invalid Destination Test");
+    return;
+}
+
+int 
+main( int argc, char **argv )
+{
+    int myrank, mysize;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
+    MPI_Comm_size(MPI_COMM_WORLD, &mysize);
+
+    /* dest writes out the received stats; for the output to be
+       consistant (with the final check), it should be procees 0 */
+    if (argc > 1 && argv[1] && strcmp( "-alt", argv[1] ) == 0) {
+       dest = 1;
+       src  = 0;
+       }
+    else {
+       src  = 1;
+       dest = 0;
+       }
+
+    Test_Init("isndrcv", myrank);
+    SetupBasicTypes();
+
+    if (mysize != 2) {
+       fprintf(stderr, 
+               "*** This test program requires exactly 2 processes.\n");
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+    
+    /* Turn stdout's buffering to line buffered so it mixes right with
+       stderr in output files. (hopefully) */
+    setvbuf(stdout, NULL, _IOLBF, 0);
+
+    if (myrank == src) {
+       SenderTest1();
+       SenderTest2();
+       SenderTest3();  
+    } else if (myrank == dest) {
+       ReceiverTest1();
+       ReceiverTest2();
+       ReceiverTest3(); 
+    } else {
+       fprintf(stderr, "*** This program uses exactly 2 processes! ***\n");
+       exit(-1);
+    }
+    Test_Waitforall( );
+    if (myrank == dest) {
+       int rval;
+       rval = Summarize_Test_Results();
+       Test_Finalize();
+       MPI_Finalize();
+       return rval;
+    }
+    else {
+       Test_Finalize();
+       MPI_Finalize();
+       return 0;
+    }
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/isndrcv2.c b/teshsuite/smpi/mpich-test/pt2pt/isndrcv2.c
new file mode 100644 (file)
index 0000000..531e51b
--- /dev/null
@@ -0,0 +1,41 @@
+#include <stdio.h>
+#include "mpi.h"
+
+int main( int argc, char **argv )
+{
+    int rank, size;
+    MPI_Request r1, r2;
+    MPI_Status  s;
+    int         buf[10000], buf2[10000], count, tag1, tag2;
+
+    count = 10000;
+    tag1  = 100;
+    tag2  = 1000;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    if (rank == 0) {
+       MPI_Isend( buf, count, MPI_INT, 1, tag1, MPI_COMM_WORLD, &r1 );
+       MPI_Isend( buf2, count, MPI_INT, 1, tag2, MPI_COMM_WORLD, &r2 );
+       MPI_Wait( &r1, &s );
+       MPI_Wait( &r2, &s );
+    }
+    else if (rank == 1) {
+       MPI_Irecv( buf2, count, MPI_INT, 0, tag2, MPI_COMM_WORLD, &r2 );
+       MPI_Irecv( buf,  count, MPI_INT, 0, tag1, MPI_COMM_WORLD, &r1 );
+       MPI_Wait( &r2, &s );
+       if (s.MPI_TAG != tag2) {
+           printf( "Error in receive order\n" );
+       }
+       MPI_Wait( &r1, &s );
+    }
+
+    MPI_Barrier( MPI_COMM_WORLD );
+    if (rank == 0) {
+       printf( "Test completed\n" );
+    }
+    MPI_Finalize( );
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/issend2.c b/teshsuite/smpi/mpich-test/pt2pt/issend2.c
new file mode 100644 (file)
index 0000000..0ff413a
--- /dev/null
@@ -0,0 +1,102 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/* This program comes from Bert Still, bert@h4p.llnl.gov 
+   It caused problems for the T3D implementation.
+ */
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+
+#define MESSAGE_TAG 8
+#define MESSAGE_VALUE 6
+#define MESSAGE_TYPE MPI_BYTE
+#define MESSAGE_CTYPE char
+static MESSAGE_CTYPE recv_msg[8];
+static MESSAGE_CTYPE send_msg[8];
+
+static MPI_Status recv_status;
+static MPI_Status send_status[2];
+static MPI_Request request[2];
+static int complete[2];
+
+/*------------------------------------------------------------------------*/
+
+void fatal ( int,const char * );
+
+void fatal(rank, msg)
+int rank;
+const char *msg;
+{
+  printf("***FATAL** rank %d: %s\n", rank, msg);
+  MPI_Abort(MPI_COMM_WORLD, 1);
+  exit(1);
+}
+
+int verbose = 0;
+int main( int argc, char *argv[] )
+{
+  int size, rank;
+  int err=0, toterr;
+
+  if (MPI_Init(&argc, &argv)!=MPI_SUCCESS) fatal(-1, "MPI_Init failed");
+
+  if (MPI_Comm_size(MPI_COMM_WORLD, &size)!=MPI_SUCCESS)
+    fatal(-1, "MPI_Comm_size failed");
+  if (MPI_Comm_rank(MPI_COMM_WORLD, &rank)!=MPI_SUCCESS)
+    fatal(-1, "MPI_Comm_rank failed");
+  if (size!=2) fatal(rank, "issend2 test requires -np 2\n");
+
+  if (rank) {
+    if (MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+                  &recv_status)!=MPI_SUCCESS)
+      fatal(rank, "MPI_Probe failed");
+    if (recv_status.MPI_SOURCE!=0 || recv_status.MPI_TAG!=MESSAGE_TAG)
+      fatal(rank, "message source or tag wrong");
+    if (MPI_Recv(recv_msg, 8, MESSAGE_TYPE,
+                 recv_status.MPI_SOURCE, recv_status.MPI_TAG, MPI_COMM_WORLD,
+                 &recv_status)!=MPI_SUCCESS)
+      fatal(rank, "MPI_Recv failed");
+    if (recv_msg[0] == MESSAGE_VALUE) {
+       if (verbose) printf( "test completed successfully\n" );
+    }
+    else {
+       printf("test failed: rank %d: got %d but expected %d\n", 
+              rank, recv_msg[0], MESSAGE_VALUE );
+       err++;
+    }
+
+    fflush(stdout);
+
+    if (recv_msg[0]!=MESSAGE_VALUE)
+      fatal(rank, "received message doesn't match sent message");
+
+  } else {
+    int n_complete;
+
+    send_msg[0]= MESSAGE_VALUE;
+
+    if (MPI_Issend(send_msg, 1, MESSAGE_TYPE, /*rank*/1, MESSAGE_TAG,
+                   MPI_COMM_WORLD, request) != MPI_SUCCESS)
+          fatal(rank, "MPI_Issend failed");
+    if (MPI_Waitsome(1, request, &n_complete, complete,send_status) != 
+        MPI_SUCCESS) 
+       fatal(rank, "MPI_Waitsome failed");
+    if (request[0]!=MPI_REQUEST_NULL || n_complete!=1 || complete[0]!=0) 
+       fatal(rank, "Waitsome result is wrong");
+  }
+
+  MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+  if (rank == 0) {
+      if (toterr == 0) {
+         printf( " No Errors\n" );
+      }
+      else {
+         printf (" Found %d errors\n", toterr );
+      }
+  }
+  /* printf("rank %d: about to finalize\n", rank); */
+  fflush(stdout);
+  MPI_Finalize();
+  /*  printf("rank %d: finalize completed\n", rank); */
+  fflush(stdout);
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/issendinit.c b/teshsuite/smpi/mpich-test/pt2pt/issendinit.c
new file mode 100644 (file)
index 0000000..42588d2
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Program to test that the "synchronous send" semantics
+ * of point to point communications in MPI is (probably) satisfied. 
+ * This is done by starting two synchronous sends and then testing that
+ * they do not complete until the matchine receives are issued.
+ */
+
+#include <stdio.h>
+#include "test.h"
+#include "mpi.h"
+
+#define SIZE 10000
+/* Amount of time in seconds to wait for the receipt of the second Ssend
+   message */
+#define MAX_TIME 20
+static int src  = 1;
+static int dest = 0;
+
+/* Prototypes for picky compilers */
+void Generate_Data ( int *, int );
+
+void Generate_Data(buffer, buff_size)
+int *buffer;
+int buff_size;
+{
+    int i;
+
+    for (i = 0; i < buff_size; i++)
+       buffer[i] = i+1;
+}
+
+int main( int argc, char **argv )
+{
+    int rank; /* My Rank (0 or 1) */
+    int act_size = 1000;
+    int flag;
+    int buffer[SIZE];
+    double t0;
+    char *Current_Test = NULL;
+    MPI_Status status;
+    MPI_Request r[2];
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+    if (rank == src) { 
+       Test_Init("issendinit", rank);
+       Generate_Data(buffer, SIZE);
+       Current_Test = (char*)"Ssend_init waits for recv";
+       MPI_Recv( buffer, 0, MPI_INT, dest, 0, MPI_COMM_WORLD, &status );
+       MPI_Send( buffer, 0, MPI_INT, dest, 0, MPI_COMM_WORLD );
+       MPI_Ssend_init( buffer, act_size, MPI_INT, dest, 1, MPI_COMM_WORLD, 
+                       &r[0] );
+       MPI_Ssend_init( buffer, act_size, MPI_INT, dest, 2, MPI_COMM_WORLD, 
+                       &r[1] );
+       MPI_Startall( 2, r );
+       t0 = MPI_Wtime();
+       flag = 0;
+       while (MPI_Wtime() - t0 < MAX_TIME) {
+           MPI_Test( &r[0], &flag, &status );
+           if (flag) {
+               Test_Failed(Current_Test);
+               break;
+               }
+           }
+       if (!flag) 
+           Test_Passed(Current_Test);
+       MPI_Wait( &r[1], &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, dest, 13,
+                     MPI_BOTTOM, 0, MPI_INT, dest, 13,
+                     MPI_COMM_WORLD, &status );
+       MPI_Wait( &r[0], &status );
+       MPI_Request_free( &r[0] );
+       MPI_Request_free( &r[1] );
+       Test_Waitforall( );
+       {
+           int rval = Summarize_Test_Results(); /* Returns number of tests;
+                                                   that failed */
+           Test_Finalize();
+           MPI_Finalize();
+           return rval;
+       }
+
+    } else if (rank == dest) {
+       MPI_Send( buffer, 0, MPI_INT, src, 0, MPI_COMM_WORLD );
+       MPI_Recv( buffer, 0, MPI_INT, src, 0, MPI_COMM_WORLD, &status );
+       MPI_Recv( buffer, act_size, MPI_INT, src, 2, MPI_COMM_WORLD, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, src, 13,
+                     MPI_BOTTOM, 0, MPI_INT, src, 13,
+                     MPI_COMM_WORLD, &status );
+       MPI_Recv( buffer, act_size, MPI_INT, src, 1, MPI_COMM_WORLD, &status );
+       /* Test 1 */
+       Test_Waitforall( );
+       MPI_Finalize();
+    } else {
+       fprintf(stderr, "*** This program uses exactly 2 processes! ***\n");
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    return 0;
+}
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/issendtest.c b/teshsuite/smpi/mpich-test/pt2pt/issendtest.c
new file mode 100644 (file)
index 0000000..80a9ed1
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Program to test that the "synchronous send" semantics
+ * of point to point communications in MPI is (probably) satisfied. 
+ * This uses tests on the completions of the SENDS (unlike the MPI_Ssend
+ * test) since the Issends return "immediately" but can not complete
+ * until the matching receive begins.
+ *
+ * This program has been patterned off of "overtake.c"
+ *
+ *                             William Gropp
+ *                             gropp@mcs.anl.gov
+ */
+
+#include <stdio.h>
+#include "test.h"
+#include "mpi.h"
+
+#define SIZE 10000
+/* Amount of time in seconds to wait for the receipt of the second Ssend
+   message */
+#define MAX_TIME 20
+static int src  = 1;
+static int dest = 0;
+
+/* Prototypes for picky compilers */
+void Generate_Data ( int *, int );
+
+void Generate_Data( int *buffer, int buff_size)
+{
+    int i;
+
+    for (i = 0; i < buff_size; i++)
+       buffer[i] = i+1;
+}
+
+int main( int argc, char **argv)
+{
+    int rank; /* My Rank (0 or 1) */
+    int act_size = 1000;
+    int flag;
+    int buffer[SIZE];
+    double t0;
+    char *Current_Test = NULL;
+    MPI_Status status;
+    MPI_Request r1, r2;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+    /* This test depends on a working wtime.  Make a simple check */
+    Current_Test = (char*)"Testing timer";
+    t0 = MPI_Wtime();
+    if (t0 == 0 && MPI_Wtime() == 0) {
+       int loopcount = 1000000;
+       /* This test is too severe (systems with fast 
+          processors and large MPI_Wtick values can 
+          fail.  Try harder to test MPI_Wtime */
+       while (loopcount-- && MPI_Wtime() == 0) ;
+       if (loopcount <= 0) {
+           fprintf( stderr, 
+                    "MPI_WTIME is returning 0; a working value is needed\n\
+for this test.\n" );
+           Test_Failed(Current_Test);
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+       t0 = MPI_Wtime();
+    }
+    /* Test that the timer increases */
+    Current_Test = (char*)"Testing timer increases";
+    for (flag=0; flag<1000000; flag++) {
+       if (MPI_Wtime() > t0) break;
+    }
+    if (flag >= 1000000) {
+       fprintf( stderr, "MPI_WTIME is not returning increasing values!\n" );
+       Test_Failed(Current_Test);
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    Current_Test = (char*)"Issend waits for recv";
+    if (rank == src) { 
+       Test_Init("issendtest", rank);
+       Generate_Data(buffer, SIZE);
+       MPI_Recv( buffer, 0, MPI_INT, dest, 0, MPI_COMM_WORLD, &status );
+       MPI_Send( buffer, 0, MPI_INT, dest, 0, MPI_COMM_WORLD );
+       MPI_Issend( buffer, act_size, MPI_INT, dest, 1, MPI_COMM_WORLD, &r1 );
+       MPI_Issend( buffer, act_size, MPI_INT, dest, 2, MPI_COMM_WORLD, &r2 );
+       t0 = MPI_Wtime();
+       flag = 0;
+       while ( (MPI_Wtime() - t0) < MAX_TIME) {
+           MPI_Test( &r1, &flag, &status );
+           if (flag) {
+               Test_Failed(Current_Test);
+               break;
+               }
+           }
+       if (!flag) 
+           Test_Passed(Current_Test);
+       MPI_Wait( &r2, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, dest, 13,
+                     MPI_BOTTOM, 0, MPI_INT, dest, 13,
+                     MPI_COMM_WORLD, &status );
+       MPI_Wait( &r1, &status );
+       Test_Waitforall( );
+       {
+           int rval = Summarize_Test_Results(); /* Returns number of tests;
+                                                   that failed */
+           Test_Finalize();
+           MPI_Finalize();
+           return rval;
+       }
+
+    } else if (rank == dest) {
+       /* Test 1 */
+       MPI_Send( buffer, 0, MPI_INT, src, 0, MPI_COMM_WORLD );
+       MPI_Recv( buffer, 0, MPI_INT, src, 0, MPI_COMM_WORLD, &status );
+       MPI_Recv( buffer, act_size, MPI_INT, src, 2, MPI_COMM_WORLD, &status );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, src, 13,
+                     MPI_BOTTOM, 0, MPI_INT, src, 13,
+                     MPI_COMM_WORLD, &status );
+       MPI_Recv( buffer, act_size, MPI_INT, src, 1, MPI_COMM_WORLD, &status );
+
+       Test_Waitforall( );
+       Test_Finalize();
+       MPI_Finalize();
+    } else {
+       fprintf(stderr, "*** This program uses exactly 2 processes! ***\n");
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/longmsgs.c b/teshsuite/smpi/mpich-test/pt2pt/longmsgs.c
new file mode 100644 (file)
index 0000000..154c945
--- /dev/null
@@ -0,0 +1,201 @@
+#include "test.h"
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#define MIN_MESSAGE_LENGTH 256
+#define MAX_MESSAGE_LENGTH (16*1024*1024)
+#define TAG1 1
+#define TAG2 2
+#define TAG3 3
+#define TAG4 4
+#define TAGSR 101
+
+int verbose = 0;
+
+void Resetbuf( char *, int );
+void Checkbuf( char *, int, MPI_Status * );
+
+void Resetbuf( char *buf, int len )
+{
+    int i;
+    for (i=0; i<len; i++) 
+       buf[i] = 0;
+}
+
+void Checkbuf( char *buf, int len, MPI_Status *status )
+{
+    int count, i;
+    int err = 0;
+    char ival;
+    
+    MPI_Get_count( status, MPI_CHAR, &count );
+    if (count != len) {
+       fprintf( stderr, "Got len of %d but expected %d\n", count, len );
+       err++;
+    }
+    ival = 0;
+    for (i=0; i<len; i++) {
+       if (buf[i] != ival) {
+           err++;
+           fprintf( stderr, 
+                    "Found wrong value in buffer[%d] = %d, expected %d\n",
+                    i, buf[i], ival );
+           if (err > 10) break;
+       }
+       ival++;
+    }
+    if (err) MPI_Abort( MPI_COMM_WORLD, 1 );
+}
+
+int main( int argc, char *argv[] )
+{
+    int msglen, i;
+    int msglen_min = MIN_MESSAGE_LENGTH;
+    int msglen_max = MAX_MESSAGE_LENGTH;
+    int rank,poolsize,Master;
+    char *sendbuf,*recvbuf;
+    char ival;
+    MPI_Request request;
+    MPI_Status status;
+       
+    MPI_Init(&argc,&argv);
+    MPI_Comm_size(MPI_COMM_WORLD,&poolsize);
+    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
+
+    if(poolsize != 2) {
+       printf("Expected exactly 2 MPI processes\n");
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+/* 
+   The following test allows this test to run on small-memory systems
+   that support the sysconf call interface.  This test keeps the test from
+   becoming swap-bound.  For example, on an old Linux system or a
+   Sony Playstation 2 (really!) 
+ */
+#if defined(HAVE_SYSCONF) && defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
+    { 
+       long n_pages, pagesize;
+       int  actmsglen_max;
+       n_pages  = sysconf( _SC_PHYS_PAGES );
+       pagesize = sysconf( _SC_PAGESIZE );
+       /* We want to avoid integer overflow in the size calculation.
+          The best way is to avoid computing any products (such
+          as total memory = n_pages * pagesize) and instead
+          compute a msglen_max that fits within 1/4 of the available 
+          pages */
+       if (n_pages > 0 && pagesize > 0) {
+           /* Recompute msglen_max */
+           int msgpages = 4 * ((msglen_max + pagesize - 1)/ pagesize);
+           while (n_pages < msgpages) { msglen_max /= 2; msgpages /= 2; }
+       }
+       /* printf ( "before = %d\n", msglen_max ); */
+       MPI_Allreduce( &msglen_max, &actmsglen_max, 1, MPI_INT, 
+                      MPI_MIN, MPI_COMM_WORLD );
+       msglen_max = actmsglen_max;
+       /* printf ( "after = %d\n", msglen_max ); */
+    }
+#endif
+
+    Master = (rank == 0);      
+
+    if(Master && verbose)
+       printf("Size (bytes)\n------------\n");
+    for(msglen = msglen_min; msglen <= msglen_max; msglen *= 2) {
+
+       sendbuf = malloc(msglen);
+       recvbuf = malloc(msglen);
+       if(sendbuf == NULL || recvbuf == NULL) {
+           printf("Can't allocate %d bytes\n",msglen);
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+
+       ival = 0;
+       for (i=0; i<msglen; i++) {
+           sendbuf[i] = ival++;
+           recvbuf[i] = 0;
+       }
+
+
+       if(Master && verbose) 
+           printf("%d\n",msglen);
+       fflush(stdout);
+
+       MPI_Barrier(MPI_COMM_WORLD);
+               
+       /* Send/Recv */
+       if(Master) 
+           MPI_Send(sendbuf,msglen,MPI_CHAR,1,TAG1,MPI_COMM_WORLD);
+       else {
+           Resetbuf( recvbuf, msglen );
+           MPI_Recv(recvbuf,msglen,MPI_CHAR,0,TAG1,MPI_COMM_WORLD,&status);
+           Checkbuf( recvbuf, msglen, &status );
+       }
+
+       MPI_Barrier(MPI_COMM_WORLD);
+
+       /* Ssend/Recv */
+       if(Master) 
+           MPI_Send(sendbuf,msglen,MPI_CHAR,1,TAG2,MPI_COMM_WORLD);
+       else {
+           Resetbuf( recvbuf, msglen );
+           MPI_Recv(recvbuf,msglen,MPI_CHAR,0,TAG2,MPI_COMM_WORLD,&status);
+           Checkbuf( recvbuf, msglen, &status );
+       }
+
+       MPI_Barrier(MPI_COMM_WORLD);
+               
+       /* Rsend/Recv */
+/*     if (Master) {*/
+/*         MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, 1, TAGSR,*/
+/*                       MPI_BOTTOM, 0, MPI_INT, 1, TAGSR,*/
+/*                       MPI_COMM_WORLD, &status );*/
+/*         MPI_Rsend( sendbuf,msglen,MPI_CHAR,1,TAG3,MPI_COMM_WORLD );*/
+/*     }*/
+/*     else {*/
+/*         Resetbuf( recvbuf, msglen );*/
+/*         MPI_Irecv( recvbuf,msglen,MPI_CHAR,0,TAG3,MPI_COMM_WORLD,&request);*/
+/*         MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, 0, TAGSR,*/
+/*                       MPI_BOTTOM, 0, MPI_INT, 0, TAGSR,*/
+/*                       MPI_COMM_WORLD, &status );*/
+/*         MPI_Wait( &request, &status );*/
+/*         Checkbuf( recvbuf, msglen, &status );*/
+/*     }*/
+/*         */
+/*     MPI_Barrier(MPI_COMM_WORLD);*/
+
+       /* Isend/Recv - receive not ready */
+       if(Master) {
+           MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, 1, TAGSR,
+                         MPI_BOTTOM, 0, MPI_INT, 1, TAGSR,
+                         MPI_COMM_WORLD, &status );
+           MPI_Isend(sendbuf,msglen,MPI_CHAR,1,TAG4,MPI_COMM_WORLD, &request);
+           MPI_Wait( &request, &status );
+       }
+       else {
+           Resetbuf( recvbuf, msglen );
+           MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, 0, TAGSR,
+                         MPI_BOTTOM, 0, MPI_INT, 0, TAGSR,
+                         MPI_COMM_WORLD, &status );
+           MPI_Recv(recvbuf,msglen,MPI_CHAR,0,TAG4,MPI_COMM_WORLD,&status);
+           Checkbuf( recvbuf, msglen, &status );
+       }
+
+       MPI_Barrier(MPI_COMM_WORLD);
+
+       free(sendbuf);
+       free(recvbuf);
+    }
+
+    if (rank == 0) {
+       /* If we do not abort, we saw no errors */
+       printf( " No Errors\n" );
+    }
+
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/mpitest.h b/teshsuite/smpi/mpich-test/pt2pt/mpitest.h
new file mode 100644 (file)
index 0000000..a14b2c9
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef MPITEST_TEST
+#define MPITEST_TEST
+
+void Test_Init ( char *, int );
+void Test_Message (char *);
+void Test_Failed (char *);
+void Test_Passed (char *);
+int Summarize_Test_Results (void);
+void Test_Finalize (void);
+void Test_Waitforall (void);
+#endif
diff --git a/teshsuite/smpi/mpich-test/pt2pt/nblock.c b/teshsuite/smpi/mpich-test/pt2pt/nblock.c
new file mode 100644 (file)
index 0000000..a489013
--- /dev/null
@@ -0,0 +1,101 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+#ifndef MAXNP
+#define MAXNP 16
+#endif
+
+/*
+   Test to make sure that nonblocking routines actually work.  This
+   stresses them by sending large numbers of requests and receiving them
+   piecemeal.
+ */
+int main( int argc, char **argv )
+{
+    int count, tag, nsend, myid, np, rcnt, scnt, i, j;
+    int *(sbuf[MAXNP]), *(rbuf[MAXNP]);
+    MPI_Status status;
+    MPI_Request *rsend, *rrecv;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &myid );
+    MPI_Comm_size( MPI_COMM_WORLD, &np );
+
+    if (np > MAXNP) {
+       fprintf( stderr, 
+                "This test must run with at most %d processes\n", MAXNP );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    nsend = 3 * np;
+    rsend = (MPI_Request *) malloc ( nsend * sizeof(MPI_Request) );
+    rrecv = (MPI_Request *) malloc ( nsend * sizeof(MPI_Request) );
+    if (!rsend || !rrecv) {
+       fprintf( stderr, "Failed to allocate space for requests\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    for (count = 1; count < 10000; count *= 2) {
+       for (i=0; i<nsend; i++) {
+           sbuf[i] = (int *)calloc( count, sizeof(int) );
+           rbuf[i] = (int *)malloc( count * sizeof(int) );
+           if (!sbuf[i] || !rbuf[i]) {
+               fprintf( stderr, "Unable to allocate %d ints\n", count );
+               MPI_Abort( MPI_COMM_WORLD, 1 );
+           }
+       }
+       
+       /* We'll send/recv from everyone */
+       scnt = 0;
+       rcnt = 0;
+       /* The MPI standard requires that active buffers be distinct
+          in nonblocking calls */
+       for (j=0; j<3; j++) {
+           tag = j;
+           for (i=0; i<np; i++) {
+               if (i != myid) {
+                   MPI_Isend( sbuf[scnt], count, MPI_INT, i, 
+                              tag, MPI_COMM_WORLD, &rsend[scnt] );
+                   scnt++;
+               }
+               
+           }
+           for (i=0; i<np; i++) {
+               if (i != myid) {
+                   MPI_Irecv( rbuf[rcnt], count, MPI_INT, i, 
+                              tag, MPI_COMM_WORLD, &rrecv[rcnt] );
+                   rcnt++;
+               }
+           }
+       }
+       /* In general, it would be better to use MPI_Waitall, but this should
+          work as well */
+       for (i=0; i<rcnt; i++) {
+           MPI_Wait( &rrecv[i], &status );
+       }
+       for (i=0; i<scnt; i++) {
+           MPI_Wait( &rsend[i], &status );
+       }
+
+       for (i=0; i<nsend; i++) {
+           free( sbuf[i] );
+           free( rbuf[i] );
+       }
+
+       MPI_Barrier( MPI_COMM_WORLD );
+       if (myid == 0 && (count % 64) == 0) {
+           printf( "All processes completed for count = %ld ints of data\n", 
+                   (long)count );
+           fflush(stdout);
+       }
+    }
+    MPI_Finalize();
+    return 0;
+}
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/nblock.std b/teshsuite/smpi/mpich-test/pt2pt/nblock.std
new file mode 100644 (file)
index 0000000..7af1fd7
--- /dev/null
@@ -0,0 +1,8 @@
+All processes completed for count = 64 ints of data
+All processes completed for count = 128 ints of data
+All processes completed for count = 256 ints of data
+All processes completed for count = 512 ints of data
+All processes completed for count = 1024 ints of data
+All processes completed for count = 2048 ints of data
+All processes completed for count = 4096 ints of data
+All processes completed for count = 8192 ints of data
diff --git a/teshsuite/smpi/mpich-test/pt2pt/nbtest.c b/teshsuite/smpi/mpich-test/pt2pt/nbtest.c
new file mode 100644 (file)
index 0000000..3e62023
--- /dev/null
@@ -0,0 +1,103 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+/*
+   Test to make sure that nonblocking routines actually work
+   In this example, we assume that we do not know the message
+   sizes ahead of time.
+
+   Just like nblock, but with the probe test.
+*/
+
+int main( int argc, char **argv )
+{
+    int count, tag, nsend, myid, np, rcnt, scnt, i, j, *send_buf;
+    int length, finished;
+    int baselen = 1;
+    int **recv_buf;
+    MPI_Status status, rtn_status;
+    MPI_Request *rsend, *rrecv;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &myid );
+    MPI_Comm_size( MPI_COMM_WORLD, &np );
+/*
+  MPE_Errors_call_dbx_in_xterm( (argv)[0], (char *)0 ); 
+  MPE_Signals_call_debugger();
+  */
+    if (argc > 2 && argv[1] && strcmp( argv[1], "-first" ) == 0) 
+       baselen = atoi(argv[2]);
+
+/* malloc buffers */
+    nsend = 3 * np;
+    rsend = (MPI_Request *) malloc ( nsend * sizeof(MPI_Request) );
+    rrecv = (MPI_Request *) malloc ( nsend * sizeof(MPI_Request) );
+    recv_buf = (int **) malloc ( nsend * sizeof(int *) );
+    if (!rsend || !rrecv) {
+       fprintf( stderr, "Failed to allocate space for requests\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    for (count = baselen; count < 10000; count *= 2) {
+       /* We'll send/recv from everyone */
+       scnt = 0;
+       rcnt = 0;
+
+       /* do sends */
+       send_buf   = (int *)malloc( count * sizeof(int) );
+       for (j=0; j<3; j++) {
+           tag = j;
+           for (i=0; i<np; i++) {
+               if (i != myid) 
+                   MPI_Isend( send_buf, count, MPI_INT, i, tag, 
+                              MPI_COMM_WORLD, &rsend[scnt++] );
+           }
+           /* Check sends, one could free memory here if they are done */
+           for (i=0; i<scnt; i++) {
+               MPI_Test( &rsend[i], &finished, &status );
+           }
+       }
+
+       /* do recvs */
+       for (j=0; j<3; j++) {
+           tag = j;
+           for (i=0; i<np; i++) {
+               if (i != myid)  {
+                   MPI_Probe(MPI_ANY_SOURCE,tag,MPI_COMM_WORLD,&status);
+                   MPI_Get_count(&status,MPI_INT,&length); 
+                   /* printf("[%d] length = %d\n",myid,length); 
+                      fflush(stdout); */
+                   recv_buf[rcnt] = (int *)malloc(length * sizeof(int));
+                   MPI_Recv(recv_buf[rcnt],length,MPI_INT,status.MPI_SOURCE, 
+                            status.MPI_TAG,MPI_COMM_WORLD,&rtn_status);
+                   rcnt++;
+               }
+           }
+       }
+
+       /* Wait on sends */
+       for (i=0; i<scnt; i++) {
+           MPI_Wait( &rsend[i], &status );
+       }
+
+       /* free buffers */
+       for (i=0; i<rcnt; i++) free(recv_buf[i]);
+       free( send_buf );
+       
+       MPI_Barrier( MPI_COMM_WORLD );
+       if (myid == 0 && (count % 64) == 0) {
+           printf( "All processes completed for count = %ld ints of data\n", 
+                   (long)count ); fflush(stdout);
+       }
+    }
+
+    MPI_Finalize();
+    return 0;
+}
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/nbtest.std b/teshsuite/smpi/mpich-test/pt2pt/nbtest.std
new file mode 100644 (file)
index 0000000..567a3c1
--- /dev/null
@@ -0,0 +1,10 @@
+*** Testing Isend/Probe/Recv (large numbers) ***
+All processes completed for count = 64 ints of data
+All processes completed for count = 128 ints of data
+All processes completed for count = 256 ints of data
+All processes completed for count = 512 ints of data
+All processes completed for count = 1024 ints of data
+All processes completed for count = 2048 ints of data
+All processes completed for count = 4096 ints of data
+All processes completed for count = 8192 ints of data
+*** Testing Isend/Probe/Recv (large numbers) ***
diff --git a/teshsuite/smpi/mpich-test/pt2pt/nullproc.c b/teshsuite/smpi/mpich-test/pt2pt/nullproc.c
new file mode 100644 (file)
index 0000000..d9d547f
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ *  Test for null proc handling with non-blocking routines
+ */
+
+
+#include <stdio.h>
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int main( int argc, char *argv[] )
+{
+   int             a[4];
+   int             i, nproc;
+   int             rank, right, left;
+   MPI_Status      status;
+   MPI_Request     req[4];
+   int             index, it, count, errcnt = 0;
+
+   /* start up */
+   MPI_Init(&argc, &argv);
+   MPI_Comm_size(MPI_COMM_WORLD, &nproc);
+   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+   /* set up processor chain (Apps should use Cart_create/shift) */
+   left = (rank == 0) ? MPI_PROC_NULL : rank - 1;
+   right = (rank == nproc - 1) ? MPI_PROC_NULL : rank + 1;
+
+   /* initialize local matrix */
+   /* globally: a[i] = i, i = 1 .. 2*nproc */
+   /* locally : a[i] = 2*rank+i, i=1,2 */
+   a[0] = -1;
+   a[1] = 2*rank + 1; 
+   a[2] = 2*rank + 2; 
+   a[3] = -1;
+
+   /* start all receives and sends */
+   MPI_Irecv(&a[0], 1, MPI_INT, left,  1, MPI_COMM_WORLD, &req[0]);
+   MPI_Irecv(&a[3], 1, MPI_INT, right, 0, MPI_COMM_WORLD, &req[3]);
+   MPI_Isend(&a[1], 1, MPI_INT, left, 0, MPI_COMM_WORLD, &req[1]);
+   MPI_Isend(&a[2], 1, MPI_INT, right,  1, MPI_COMM_WORLD, &req[2]);
+
+   for (it=0; it<4; it++) {
+       status.MPI_SOURCE = nproc;
+       status.MPI_TAG = nproc;
+       MPI_Waitany( 4, req, &index, &status );
+       if (index == 0 && left == MPI_PROC_NULL) {
+          if (status.MPI_TAG != MPI_ANY_TAG ||
+              status.MPI_SOURCE != MPI_PROC_NULL) {
+              errcnt ++;
+              fprintf( stderr, "Incorrect null status for left\n" );
+          }
+          MPI_Get_count( &status, MPI_INT, &count );
+          if (count != 0) {
+              errcnt ++;
+              fprintf( stderr, "Incorrect null status for left (count)\n" );
+          }
+       }
+       else if (index == 3 && right == MPI_PROC_NULL) {
+          if (status.MPI_TAG != MPI_ANY_TAG ||
+              status.MPI_SOURCE != MPI_PROC_NULL) {
+              errcnt ++;
+              fprintf( stderr, "Incorrect null status for right\n" );
+          }
+          MPI_Get_count( &status, MPI_INT, &count );
+          if (count != 0) {
+              errcnt ++;
+              fprintf( stderr, "Incorrect null status for right (count)\n" );
+          }
+       }
+   }
+   
+   /* Test results */
+   if (left == MPI_PROC_NULL) {
+       if (a[0] != -1) {
+          fprintf( stderr, "Expected -1, found %d in left partner\n", a[0] );
+          errcnt ++;
+       }
+   }
+   else {
+       if (a[0] != 2 * left + 2) {
+          fprintf( stderr, "Expected %d, found %d in left partner\n", 
+                   2 * left + 2, a[0] );
+          errcnt ++;
+       }
+   }
+
+   if (right == MPI_PROC_NULL) {
+       if (a[3] != -1) {
+          fprintf( stderr, "Expected -1, found %d in right partner\n", a[3] );
+          errcnt ++;
+       }
+   }
+   else {
+       if (a[3] != 2 * right + 1) {
+          fprintf( stderr, "Expected %d, found %d in right partner\n", 
+                   2 * right + 1, a[3] );
+          errcnt ++;
+       }
+   }
+
+   
+   i = errcnt;
+   MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+   if (rank == 0) {
+       if (errcnt > 0) {
+          printf( "Found %d errors in the run \n", errcnt );
+       }
+       else
+          printf( "No errors in handling MPI_PROC_NULL\n" );
+   }
+   
+   /* clean up */
+   MPI_Finalize();
+   return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/nullproc.std b/teshsuite/smpi/mpich-test/pt2pt/nullproc.std
new file mode 100644 (file)
index 0000000..a9124d5
--- /dev/null
@@ -0,0 +1 @@
+No errors in handling MPI_PROC_NULL
diff --git a/teshsuite/smpi/mpich-test/pt2pt/nullproc2.c b/teshsuite/smpi/mpich-test/pt2pt/nullproc2.c
new file mode 100644 (file)
index 0000000..fcffd5a
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ *  Test for null proc handling with blocking routines
+ */
+
+
+#include <stdio.h>
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int main( int argc, char *argv[] )
+{
+   int             a[4];
+   int             i, nproc;
+   int             rank, right, left;
+   MPI_Status      st[2], sts[2];
+   MPI_Request     req[2];
+   int             count, errcnt = 0;
+
+   /* start up */
+   MPI_Init(&argc, &argv);
+   MPI_Comm_size(MPI_COMM_WORLD, &nproc);
+   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+   /* set up processor chain (Apps should use Cart_create/shift) */
+   left = (rank == 0) ? MPI_PROC_NULL : rank - 1;
+   right = (rank == nproc - 1) ? MPI_PROC_NULL : rank + 1;
+
+   /* initialize local matrix */
+   /* globally: a[i] = i, i = 1 .. 2*nproc */
+   /* locally : a[i] = 2*rank+i, i=1,2 */
+   a[0] = -1;
+   a[1] = 2*rank + 1; 
+   a[2] = 2*rank + 2; 
+   a[3] = -1;
+
+   /* start all receives and sends */
+   MPI_Isend(&a[1], 1, MPI_INT, left, 0, MPI_COMM_WORLD, &req[0]);
+   MPI_Isend(&a[2], 1, MPI_INT, right,  1, MPI_COMM_WORLD, &req[1]);
+   st[0].MPI_SOURCE = nproc;
+   st[0].MPI_TAG = -1;
+   st[1].MPI_SOURCE = nproc;
+   st[1].MPI_TAG = -1;
+   MPI_Recv(&a[0], 1, MPI_INT, left,  1, MPI_COMM_WORLD, &st[0]);
+   MPI_Recv(&a[3], 1, MPI_INT, right, 0, MPI_COMM_WORLD, &st[1]);
+   MPI_Waitall( 2, req, sts );
+
+   /* Test the end points */
+   if (left == MPI_PROC_NULL) {
+       if (st[0].MPI_TAG != MPI_ANY_TAG ||
+          st[0].MPI_SOURCE != MPI_PROC_NULL) {
+          errcnt ++;
+          fprintf( stderr, "Incorrect null status for left\n" );
+          if (st[0].MPI_SOURCE != MPI_PROC_NULL) {
+              fprintf( stderr, "Source returned was %d but should be %d\n",
+                       st[0].MPI_SOURCE, MPI_PROC_NULL );
+          }
+       }
+       MPI_Get_count( &st[0], MPI_INT, &count );
+       if (count != 0) {
+          errcnt ++;
+          fprintf( stderr, "Incorrect null status for left (count)\n" );
+          fprintf( stderr, "Count was %d but should be 0\n", count );
+       }
+   }
+   else if (right == MPI_PROC_NULL) {
+       if (st[1].MPI_TAG != MPI_ANY_TAG ||
+          st[1].MPI_SOURCE != MPI_PROC_NULL) {
+          errcnt ++;
+          fprintf( stderr, "Incorrect null status for right\n" );
+          if (st[1].MPI_SOURCE != MPI_PROC_NULL) {
+              fprintf( stderr, "Source returned was %d but should be %d\n",
+                       st[1].MPI_SOURCE, MPI_PROC_NULL );
+          }
+       }
+       MPI_Get_count( &st[1], MPI_INT, &count );
+       if (count != 0) {
+          errcnt ++;
+          fprintf( stderr, "Incorrect null status for right (count)\n" );
+          fprintf( stderr, "Count was %d but should be 0\n", count );
+       }
+   }
+   
+   /* Test results */
+   if (left == MPI_PROC_NULL) {
+       if (a[0] != -1) {
+          fprintf( stderr, "Expected -1, found %d in left partner\n", a[0] );
+          errcnt ++;
+       }
+   }
+   else {
+       if (a[0] != 2 * left + 2) {
+          fprintf( stderr, "Expected %d, found %d in left partner\n", 
+                   2 * left + 2, a[0] );
+          errcnt ++;
+       }
+   }
+
+   if (right == MPI_PROC_NULL) {
+       if (a[3] != -1) {
+          fprintf( stderr, "Expected -1, found %d in right partner\n", a[3] );
+          errcnt ++;
+       }
+   }
+   else {
+       if (a[3] != 2 * right + 1) {
+          fprintf( stderr, "Expected %d, found %d in right partner\n", 
+                   2 * right + 1, a[3] );
+          errcnt ++;
+       }
+   }
+
+   
+   i = errcnt;
+   MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+   if (rank == 0) {
+       if (errcnt > 0) {
+          printf( "Found %d errors in the run \n", errcnt );
+       }
+       else
+          printf( "No errors in handling MPI_PROC_NULL\n" );
+   }
+   
+   /* clean up */
+   MPI_Finalize();
+   return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/nullproc2.std b/teshsuite/smpi/mpich-test/pt2pt/nullproc2.std
new file mode 100644 (file)
index 0000000..a9124d5
--- /dev/null
@@ -0,0 +1 @@
+No errors in handling MPI_PROC_NULL
diff --git a/teshsuite/smpi/mpich-test/pt2pt/order.c b/teshsuite/smpi/mpich-test/pt2pt/order.c
new file mode 100644 (file)
index 0000000..1b8f3a9
--- /dev/null
@@ -0,0 +1,71 @@
+#include <stdio.h>
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+
+int main( int argc, char *argv[] )
+{
+    int easy;
+    int rank;
+    int size;
+    int a;
+    int b;
+    MPI_Request request;
+    MPI_Status  status;
+    double t0;
+    
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    /* This test depends on a working wtime.  Make a simple check */
+    t0 = MPI_Wtime();
+    if (t0 == 0 && MPI_Wtime() == 0) {
+       int loopcount = 1000000;
+       /* This test is too severe (systems with fast 
+          processors and large MPI_Wtick values can 
+          fail.  Try harder to test MPI_Wtime */
+       while (loopcount-- && MPI_Wtime() == 0) ;
+       if (loopcount <= 0) {
+           fprintf( stderr, 
+                    "MPI_WTIME is returning 0; a working value is needed\n\
+for this test.\n" );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+       t0 = MPI_Wtime();
+    }
+
+    easy = 1;
+
+    MPI_Barrier( MPI_COMM_WORLD );
+    if (rank == 0)
+    {
+       MPI_Irecv(&a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &request);
+       MPI_Recv(&b, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &status);
+       MPI_Wait(&request, &status);
+       /* Check for correct values: */
+       if (a == 1 && b == 2) {
+           printf( " No Errors\n" );
+       }
+       else {
+           printf("rank = %d, a = %d, b = %d\n", rank, a, b);
+       }
+    }
+    else
+    {
+       MPI_Wtime();
+       sleep(easy);
+  //while (MPI_Wtime() - t1 < easy) ;
+       a = 1;
+       b = 2;
+       MPI_Send(&a, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
+       MPI_Send(&b, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
+    }
+    
+
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/overtake.c b/teshsuite/smpi/mpich-test/pt2pt/overtake.c
new file mode 100644 (file)
index 0000000..209285f
--- /dev/null
@@ -0,0 +1,290 @@
+/*
+ * Program to test that the "no overtaking messages" semantics
+ * of point to point communications in MPI is satisfied. 
+ * A long message is sent using MPI_Send and received using MPI_Recv,
+ * followed by lots of short messages sent the same way.
+ * Then Send -> Irecv, Bsend -> Recv, Bsend -> Irecv, 
+ * Isend -> Recv, and Isend -> Irecv are all tried in the
+ * same way.
+ *
+ *                             Patrick Bridges
+ *                             bridges@mcs.anl.gov
+ *                             patrick@CS.MsState.Edu
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "test.h"
+#include "mpi.h"
+
+#define SIZE 10000
+
+static int src  = 0;
+static int dest = 1;
+
+/* Which tests to perform (not yet implemented) */
+/* static int Do_Buffer = 1; */
+/* static int Do_Standard = 1; */
+/* In order to quiet noisy C compilers, we provide ANSI-style prototypes
+   where possible */
+void Generate_Data ( double *, int );
+void Normal_Test_Send ( double *, int );
+void Normal_Test_Recv ( double *, int );
+void Buffered_Test_Send ( double *, int );
+void Buffered_Test_Recv ( double *, int );
+void Async_Test_Send ( double *, int );
+void Async_Test_Recv ( double *, int );
+int Check_Data ( double *, int );
+void Clear_Buffer ( double *, int );
+
+
+void Generate_Data(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i;
+
+    for (i = 0; i < buff_size; i++)
+       buffer[i] = (double)i+1;
+}
+
+void Normal_Test_Send(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i, j;
+
+    for (j = 0; j < 2; j++) {
+       /* send a long message */
+       MPI_Send(buffer, (buff_size/2 - 10), MPI_DOUBLE, dest, 2000, 
+                MPI_COMM_WORLD);
+       buffer += buff_size/2 - 10;
+       /* Followed by 10 short ones */
+       for (i = 0; i < 10; i++)
+           MPI_Send(buffer++, 1, MPI_DOUBLE, dest, 2000, MPI_COMM_WORLD);
+    }
+}
+
+void Normal_Test_Recv(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i, j;
+    MPI_Status Stat;
+
+    for (j = 0; j < 2; j++) {
+       /* Receive a long message */
+       MPI_Recv(buffer, (buff_size/2 - 10), MPI_DOUBLE, src, 
+                2000, MPI_COMM_WORLD, &Stat);
+       buffer += buff_size/2 - 10;
+       /* Followed by 10 short ones */
+       for (i = 0; i < 10; i++)
+           MPI_Recv(buffer++, 1, MPI_DOUBLE, src, 2000, MPI_COMM_WORLD, &Stat);
+    }
+}
+
+void Buffered_Test_Send(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i, j;
+    void *bbuffer;
+    int size;
+
+    for (j = 0; j < 2; j++) {
+       /* send a long message */
+       MPI_Bsend(buffer, (buff_size/2 - 10), MPI_DOUBLE, dest, 2000, 
+                MPI_COMM_WORLD);
+       buffer += buff_size/2 - 10;
+       /* Followed by 10 short ones */
+       for (i = 0; i < 10; i++)
+           MPI_Bsend(buffer++, 1, MPI_DOUBLE, 
+                     dest, 2000, MPI_COMM_WORLD);
+        /* Force this set of Bsends to complete */
+        MPI_Buffer_detach( &bbuffer, &size );
+        MPI_Buffer_attach( bbuffer, size );
+    }
+}
+
+void Async_Test_Send(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i, j, req = 0;
+    MPI_Status Stat[22];
+    MPI_Request Hand[22];
+
+    for (j = 0; j < 2; j++) {
+       /* send a long message */
+       MPI_Isend(buffer, (buff_size/2 - 10), MPI_DOUBLE, 
+                 dest, 2000, MPI_COMM_WORLD, &(Hand[req++]));
+       buffer += buff_size/2 - 10;
+       /* Followed by 10 short ones */
+       for (i = 0; i < 10; i++)
+           MPI_Isend(buffer++, 1, MPI_DOUBLE, dest, 2000, 
+                     MPI_COMM_WORLD, &(Hand[req++]));
+    }
+    MPI_Waitall(req, Hand, Stat);
+}
+
+void Async_Test_Recv(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i, j, req = 0;
+    MPI_Status Stat[22];
+    MPI_Request Hand[22];
+    
+    for (j = 0; j < 2; j++) {
+       /* Receive a long message */
+       MPI_Irecv(buffer, (buff_size/2 - 10), MPI_DOUBLE, src, 
+                2000, MPI_COMM_WORLD, &(Hand[req++]));
+       buffer += buff_size/2 - 10;
+       /* Followed by 10 short ones */
+       for (i = 0; i < 10; i++)
+           MPI_Irecv(buffer++, 1, MPI_DOUBLE, src, 2000, 
+                     MPI_COMM_WORLD, &(Hand[req++]));
+    }
+    MPI_Waitall(req, Hand, Stat);
+}
+
+int Check_Data(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i;
+    int err = 0;
+
+    for (i = 0; i < buff_size; i++)
+       if (buffer[i] != (i + 1)) {
+           err++;
+           fprintf( stderr, "Value at %d is %f, should be %f\n", i, 
+                   buffer[i], (double)(i+1) );
+           if (err > 10) return 1;
+           }
+    return err;
+}
+
+void Clear_Buffer(buffer, buff_size)
+double *buffer;
+int buff_size;
+{
+    int i;
+    for (i = 0; i < buff_size; i++)
+       buffer[i] = -1;
+}
+
+
+int main( int argc, char **argv )
+{
+    int rank; /* My Rank (0 or 1) */
+    double buffer[SIZE], *tmpbuffer, *tmpbuf;
+    int tsize, bsize;
+    char *Current_Test = NULL;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+    if (rank == src) { 
+       Generate_Data(buffer, SIZE);
+       Normal_Test_Send(buffer, SIZE);
+       Normal_Test_Send(buffer, SIZE);
+#if !defined(SIMPLE_SENDS) && !defined(NO_BUFFERED_SENDS)
+       MPI_Pack_size( SIZE, MPI_DOUBLE, MPI_COMM_WORLD, &bsize );
+       tmpbuffer = (double *) malloc( bsize + MPI_BSEND_OVERHEAD );
+       if (!tmpbuffer) {
+           fprintf( stderr, "Could not allocate bsend buffer of size %d\n",
+                    bsize );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+           }
+        MPI_Buffer_attach( tmpbuffer, bsize + MPI_BSEND_OVERHEAD );
+       Buffered_Test_Send(buffer, SIZE);
+       Buffered_Test_Send(buffer, SIZE);
+       MPI_Buffer_detach( &tmpbuf, &tsize );
+#endif
+#if !defined(SIMPLE_SENDS) && !defined(NO_ASYNC_SENDS)
+       Async_Test_Send(buffer, SIZE);
+       Async_Test_Send(buffer, SIZE);
+#endif
+       Test_Waitforall( );
+
+    } else if (rank == dest) {
+       Test_Init("overtake", rank);
+       /* Test 1 */
+       Current_Test = (char*)"Overtaking Test (Normal Send   -> Normal Recieve)";
+       Normal_Test_Recv(buffer, SIZE);
+
+       if (Check_Data(buffer, SIZE))
+           Test_Failed(Current_Test);
+       else
+           Test_Passed(Current_Test);
+
+       /* Test 2 */
+       Clear_Buffer(buffer, SIZE);
+       Current_Test = (char*)"Overtaking Test (Normal Send   ->  Async Receive)";
+       Async_Test_Recv(buffer, SIZE);
+       if (Check_Data(buffer, SIZE))
+           Test_Failed(Current_Test);
+       else
+           Test_Passed(Current_Test);
+
+#if !defined(SIMPLE_SENDS) && !defined(NO_BUFFERED_SENDS)
+       /* Test 3 */
+       Current_Test = (char*)"Overtaking Test (Buffered Send -> Normal Recieve)";
+       Clear_Buffer(buffer, SIZE);
+       Normal_Test_Recv(buffer, SIZE);
+
+       if (Check_Data(buffer, SIZE))
+           Test_Failed(Current_Test);
+       else
+           Test_Passed(Current_Test);
+
+       /* Test 4 */
+       Clear_Buffer(buffer, SIZE);
+       Current_Test = (char*)"Overtaking Test (Buffered Send ->  Async Receive)";
+       Async_Test_Recv(buffer, SIZE);
+       if (Check_Data(buffer, SIZE))
+           Test_Failed(Current_Test);
+       else
+           Test_Passed(Current_Test);
+#endif
+
+#if !defined(SIMPLE_SENDS) && !defined(NO_ASYNC_SENDS)
+       /* Test 5 */
+       Current_Test = (char*)"Overtaking Test (Async Send    -> Normal Receive)";
+       Clear_Buffer(buffer, SIZE);
+       Normal_Test_Recv(buffer, SIZE);
+       if (Check_Data(buffer, SIZE))
+           Test_Failed(Current_Test);
+       else
+           Test_Passed(Current_Test);
+
+           /* Test 6 */
+       Clear_Buffer(buffer, SIZE);
+       Current_Test = (char*)"Overtaking Test (Async Send    ->  Async Receive)";
+       Async_Test_Recv(buffer, SIZE);
+       if (Check_Data(buffer, SIZE))
+           Test_Failed(Current_Test);
+       else
+           Test_Passed(Current_Test);
+#endif
+
+       Test_Waitforall( );
+       {
+           int rval = Summarize_Test_Results(); /* Returns number of tests;
+                                                   that failed */
+           Test_Finalize();
+           MPI_Finalize();
+           return rval;
+       }
+    } else {
+       fprintf(stderr, "*** This program uses exactly 2 processes! ***\n");
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    MPI_Finalize();
+    return 0;
+}
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/pack.c b/teshsuite/smpi/mpich-test/pt2pt/pack.c
new file mode 100644 (file)
index 0000000..ee9a2dd
--- /dev/null
@@ -0,0 +1,77 @@
+#include "mpi.h"
+#include <stdio.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+/*
+   Check pack/unpack of mixed datatypes.
+ */
+#define BUF_SIZE 100
+int main( int argc, char **argv )
+{
+    int myrank;
+    char buffer[BUF_SIZE];
+    int n, size, src, dest, errcnt, errs;
+    double a,b;
+    int pos;
+
+    MPI_Status status;
+    MPI_Init(&argc, &argv);
+    
+    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
+
+    src           = 0;
+    dest   = 1;
+
+    src           = 1;
+    dest   = 0;
+
+    errcnt = 0;
+    if (myrank == src)
+       {
+           pos = 0;
+           n   = 10;
+           a   = 1.1;
+           b   = 2.2;
+           MPI_Pack(&n, 1, MPI_INT, buffer, BUF_SIZE, &pos, MPI_COMM_WORLD);
+           MPI_Pack(&a, 1, MPI_DOUBLE, buffer, BUF_SIZE, &pos, 
+                    MPI_COMM_WORLD);
+           MPI_Pack(&b, 1, MPI_DOUBLE, buffer, BUF_SIZE, &pos, 
+                    MPI_COMM_WORLD);
+           /* printf( "%d\n", pos ); */
+           MPI_Send(&pos, 1, MPI_INT, dest, 999, MPI_COMM_WORLD);
+           MPI_Send(buffer, pos, MPI_PACKED, dest, 99, MPI_COMM_WORLD);
+       }
+    else
+       {
+           MPI_Recv(&size, 1, MPI_INT, src, 999, MPI_COMM_WORLD, &status);
+           MPI_Recv(buffer, size, MPI_PACKED, src, 99, 
+                    MPI_COMM_WORLD, &status);
+           pos = 0;
+           MPI_Unpack(buffer, size, &pos, &n, 1, MPI_INT, MPI_COMM_WORLD);
+           MPI_Unpack(buffer, size, &pos, &a, 1, MPI_DOUBLE, MPI_COMM_WORLD);
+           MPI_Unpack(buffer, size, &pos, &b, 1, MPI_DOUBLE, MPI_COMM_WORLD);
+           /* Check results */
+           if (n != 10) { 
+               errcnt++;
+               printf( "Wrong value for n; got %d expected %d\n", n, 10 );
+               }
+           if (a != 1.1) { 
+               errcnt++;
+               printf( "Wrong value for a; got %f expected %f\n", a, 1.1 );
+               }
+           if (b != 2.2) { 
+               errcnt++;
+               printf( "Wrong value for b; got %f expected %f\n", b, 2.2 );
+               }
+       }
+    MPI_Allreduce( &errcnt, &errs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (myrank == 0) {
+       if (errs == 0) printf( "No errors\n" );
+       else           printf( "%d errors\n", errs );
+       }
+    MPI_Finalize();
+return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/persist.c b/teshsuite/smpi/mpich-test/pt2pt/persist.c
new file mode 100644 (file)
index 0000000..7e17762
--- /dev/null
@@ -0,0 +1,54 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+/*
+ * This example causes the IBM SP2 MPI version to generate the message
+ * ERROR: 0032-158 Persistent request already active  (2) in MPI_Startall, task 0
+ * in the SECOND set of MPI_Startall (after the MPI_Request_free).
+ */
+int main( int argc, char **argv )
+{
+    MPI_Request r[4];
+    MPI_Status  statuses[4];
+    double sbuf1[10], sbuf2[10];
+    double rbuf1[10], rbuf2[10];
+    int size, rank, up_nbr, down_nbr, i;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+
+    up_nbr = (rank + 1) % size;
+    down_nbr = (size + rank - 1) % size;
+
+    MPI_Recv_init( rbuf1, 10, MPI_DOUBLE, down_nbr, 0, MPI_COMM_WORLD, &r[0] );
+    MPI_Recv_init( rbuf2, 10, MPI_DOUBLE, up_nbr, 1, MPI_COMM_WORLD, &r[1] );
+    MPI_Send_init( sbuf1, 10, MPI_DOUBLE, up_nbr, 0, MPI_COMM_WORLD, &r[2] );
+    MPI_Send_init( sbuf2, 10, MPI_DOUBLE, down_nbr, 1, MPI_COMM_WORLD, &r[3] );
+    MPI_Startall( 4, r );
+    MPI_Waitall( 4, r, statuses );
+
+    for (i=0; i<4; i++) {
+       MPI_Request_free( &r[i] );
+       }
+
+    MPI_Recv_init( rbuf1, 10, MPI_DOUBLE, down_nbr, 0, MPI_COMM_WORLD, &r[0] );
+    MPI_Recv_init( rbuf2, 10, MPI_DOUBLE, up_nbr, 1, MPI_COMM_WORLD, &r[1] );
+    MPI_Send_init( sbuf1, 10, MPI_DOUBLE, up_nbr, 0, MPI_COMM_WORLD, &r[2] );
+    MPI_Send_init( sbuf2, 10, MPI_DOUBLE, down_nbr, 1, MPI_COMM_WORLD, &r[3] );
+    MPI_Startall( 4, r );
+    MPI_Waitall( 4, r, statuses );
+
+    for (i=0; i<4; i++) {
+       MPI_Request_free( &r[i] );
+       }
+
+    if (rank == 0) printf( " No Errors\n" );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/persist2.c b/teshsuite/smpi/mpich-test/pt2pt/persist2.c
new file mode 100644 (file)
index 0000000..7bdfeaf
--- /dev/null
@@ -0,0 +1,80 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+/*
+ */
+int main( int argc, char **argv )
+{
+    MPI_Request r[4];
+    MPI_Status  statuses[4];
+    double sbuf1[10], sbuf2[10];
+    double rbuf1[10], rbuf2[10];
+    double userbuf[40+4*MPI_BSEND_OVERHEAD];
+    int size, rank, up_nbr, down_nbr, i, err, toterr;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+
+    up_nbr = (rank + 1) % size;
+    down_nbr = (size + rank - 1) % size;
+
+    for (i=0; i<10; i++) {
+       sbuf1[i] = (double)i;
+       sbuf2[i] = (double)(i+20);
+    }
+    MPI_Buffer_attach( userbuf, 40*sizeof(double) + 4 * MPI_BSEND_OVERHEAD );
+
+    MPI_Recv_init( rbuf1, 10, MPI_DOUBLE, down_nbr, 0, MPI_COMM_WORLD, &r[0] );
+    MPI_Recv_init( rbuf2, 10, MPI_DOUBLE, up_nbr, 1, MPI_COMM_WORLD, &r[1] );
+    MPI_Bsend_init( sbuf1, 10, MPI_DOUBLE, up_nbr, 0, MPI_COMM_WORLD, &r[2] );
+    MPI_Bsend_init( sbuf2, 10, MPI_DOUBLE, down_nbr, 1, MPI_COMM_WORLD, &r[3] );
+    MPI_Startall( 4, r );
+    MPI_Waitall( 4, r, statuses );
+
+    for (i=0; i<4; i++) {
+       MPI_Request_free( &r[i] );
+       }
+
+    MPI_Recv_init( rbuf1, 10, MPI_DOUBLE, down_nbr, 0, MPI_COMM_WORLD, &r[0] );
+    MPI_Recv_init( rbuf2, 10, MPI_DOUBLE, up_nbr, 1, MPI_COMM_WORLD, &r[1] );
+    MPI_Bsend_init( sbuf1, 10, MPI_DOUBLE, up_nbr, 0, MPI_COMM_WORLD, &r[2] );
+    MPI_Bsend_init( sbuf2, 10, MPI_DOUBLE, down_nbr, 1, MPI_COMM_WORLD, &r[3] );
+    MPI_Startall( 4, r );
+    MPI_Waitall( 4, r, statuses );
+
+    for (i=0; i<4; i++) {
+       MPI_Request_free( &r[i] );
+       }
+
+    /* Check data */
+    err = 0;
+    for (i=0; i<10;i++) {
+       if (rbuf1[i] != i) {
+           err++;
+           if (err < 10) 
+               fprintf( stderr, "Expected %d, rbuf1[%d] = %f\n", i, i, 
+                        rbuf1[i] );
+       }
+       if (rbuf2[i] != i+20) {
+           err++;
+           if (err < 10) 
+               fprintf( stderr, "Expected %d, rbuf2[%d] = %f\n", i+20, i, 
+                        rbuf2[i] );
+       }
+    }
+
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (rank == 0) {
+       if (toterr == 0) printf( "No errors\n" );
+       else             printf( "Found %d errors\n", toterr );
+    }
+
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/persistent.c b/teshsuite/smpi/mpich-test/pt2pt/persistent.c
new file mode 100644 (file)
index 0000000..7c8e213
--- /dev/null
@@ -0,0 +1,56 @@
+#include "mpi.h"
+#include <stdio.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int main( int argc, char **argv )
+{
+    int rank, size, i, len, actlen, expected_len;
+    MPI_Request rq;
+    MPI_Status status;
+    double data[100];
+
+    len = 100;
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    if (size < 3 ) {
+       fprintf( stderr, "This test requires more than 2 proceses\n" );
+       MPI_Finalize();
+       return 1;
+       }
+
+    if (rank == 0) {
+       MPI_Recv_init( data, len, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, 
+                      MPI_COMM_WORLD, &rq );
+       for (i=1; i<size; i++) {
+           printf( "Receiving message %d\n", i );
+           MPI_Start( &rq );
+           MPI_Wait( &rq, &status );
+           if (status.MPI_SOURCE != status.MPI_TAG) {
+               printf( "Error in received message (source and tag)\n" );
+               printf( "Source was %d and tag was %d\n",
+                       status.MPI_SOURCE, status.MPI_TAG );
+               }
+           MPI_Get_count( &status, MPI_DOUBLE, &actlen );
+           expected_len = (status.MPI_SOURCE < 10) ? status.MPI_SOURCE * 10 :
+               100;
+           if (actlen != expected_len) {
+               printf( "Got %d words, expected %d words\n", actlen, 
+                      expected_len );
+               }
+           printf( "Received message %d\n", i );
+           }
+       MPI_Request_free( &rq );
+       printf( "Completed all receives\n" );
+       }
+    else {
+       MPI_Send( data, (rank < 10) ? rank * 10 : 100, 
+                 MPI_DOUBLE, 0, rank, MPI_COMM_WORLD );
+       }
+MPI_Finalize();
+return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/persistent.std b/teshsuite/smpi/mpich-test/pt2pt/persistent.std
new file mode 100644 (file)
index 0000000..5a25fc0
--- /dev/null
@@ -0,0 +1,7 @@
+Receiving message 1
+Received message 1
+Receiving message 2
+Received message 2
+Receiving message 3
+Received message 3
+Completed all receives
diff --git a/teshsuite/smpi/mpich-test/pt2pt/pingpong.f b/teshsuite/smpi/mpich-test/pt2pt/pingpong.f
new file mode 100644 (file)
index 0000000..53adf21
--- /dev/null
@@ -0,0 +1,274 @@
+c PING_PONG two-node message exchanges benchmark program
+C 
+C Contributed by Richard Frost <frost@SDSC.EDU>, caused problems
+C on t3d with -device=t3d -arch=cray_t3d -no_short_longs -nodevdebug
+C 
+C
+C This is a very time-consuming program on a workstation cluster.
+C For this reason, I've modified it to do fewer tests (1/10 as many)
+C
+c
+c This is a simple benchmark designed to measure the latency and bandwidth
+c of a message-passing MIMD computer.  It is currently set up to run with
+c MPI.
+c
+c Compile (MPI mpich version 1.0.11 or later) with
+c     % mpif77 -o pong pong.f
+c
+c (mpif77 is a script that hides details about libraries from the user)
+c
+c Execute as
+c     % mpirun -np 2 pong
+c
+c Make sure that ~mpi/bin is in your path.
+c
+c Note that the MPI-specific calls are:
+c
+c      MPI_INIT
+c      MPI_COMM_RANK
+c      MPI_COMM_SIZE
+c
+c      MPI_Wtime
+c      MPI_Wtick
+c
+c      MPI_SEND
+c      MPI_RECV
+c
+c      MPI_FINALIZE
+c
+c Some care needs to be taken in using the
+c appropriate timing routine.  Check the value of MPI_Wtick() to see if
+c the clock resolution is reasonable for your tests.
+c
+c The benchmark measures
+c the time to send a message of length N bytes from node 0 to node 1 and
+c receive an acknowledging copy of that message which node 1 sends back to 
+c node 0.  Note that node 1 waits for the completion of its receive before
+c sending the message back to node 0. Note also that the program is not
+c necessarily optimal any given system, but is intended
+c to provide a reasonably transparent baseline measurement. 
+c 
+c For message lengths len (= num of doubles * sizedouble),
+c a total of msgspersample ping-pong message exchanges are made,       
+c and half of the average round-trip time (i.e. the one-way message
+c time) is then fit by a linear function y(N) = a + b*N via a least squares
+c linear regression.  The coefficient a is then interpreted as the latency
+c (time to send a 0-length message) and b as the inverse bandwidth (i.e. 1/b =
+c bandwidth in bytes/sec)
+c
+c The entire procedure is repeated twice, with the bandwidth, latency, and
+c measured and fitted values of the message times reported for each instance.
+c
+c The underlying message passing performance characteristics of a 
+c particular system may not necessarily be accurately modeled by the simple
+c linear function assumed here.  This may be reflected in a dependency of
+c the observed latency and bandwidth on the range of message sizes used.
+c
+c Original author:
+c R. Leary, San Diego Supercomputer Center
+c leary@sdsc.edu        9/20/94
+c
+c Modified for MPI     10/27/95
+c frost@sdsc.edu
+
+c
+c =========================== program header =========================== 
+c
+
+      program pong
+      implicit none
+      include 'mpif.h'
+
+c sizedouble = size in bytes of double precision element
+      integer sizedouble
+      parameter(sizedouble=8)
+
+c Note: set these parameters to one of 3 cases:
+c  1. size (each sample) < packetization length of architecture
+c  2. size (each sample) > packetization length of architecture
+c  3. size (1st sample) < packetization length of architecture
+c   & size (all others) > packetization length of architecture
+c
+c  Some known packetization lengths:
+c    Paragon            ~1500    bytes
+c    Cray T3D           ~1500    bytes
+c    TCP/IP networks    256-1024 bytes
+c
+c samples = the number of data points collected
+      integer samples
+      parameter(samples=40)
+c initsamplesize = # of elements transmitted in 1st sample
+      integer initsamplesize
+      parameter(initsamplesize=125)
+c samplesizeinc = sample size increase per iteration (linear rate)
+      integer samplesizeinc
+      parameter(samplesizeinc=125)
+c     parameter(samplesizeinc=1)
+c msgspersample = the number of messages
+      integer msgspersample
+c      parameter(msgspersample=1000)
+       parameter(msgspersample=100)
+
+c The buffer array contains the message , while x(i) is the message size 
+c and y(i) the corresponding measured one-way average time. 
+c Note that buffer is a double precision array
+c
+c ibufcount = total number of elements in buffer
+      integer ibufcount
+      parameter(ibufcount=(initsamplesize+((samples-1)*samplesizeinc)))
+c
+      double precision buffer(ibufcount)
+      double precision x(samples), y(samples)
+      double precision t1, t2
+      double precision a, b, bandw
+      double precision sumx, sumy, sumxx, sumxy
+      double precision det, fit
+
+      integer stat(MPI_STATUS_SIZE)
+      integer ierr, ierr1, ierr2
+      integer nodenum, numprocs
+      integer idest
+      integer i, iter, sample
+      integer num
+
+c
+c =========================== begin =========================== 
+c
+
+      call MPI_INIT( ierr )
+      call MPI_COMM_RANK( MPI_COMM_WORLD, nodenum, ierr )
+      call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
+
+      if (numprocs .ne. 2) then
+         write (6,*) 'This program is only valid for 2 processors'
+         write (6,*) 'numprocs = ', numprocs
+         stop
+      endif
+
+c Put something into array
+      do 2 i=1,ibufcount
+        buffer(i) = dfloat(i)
+    2 continue
+
+      if (nodenum .eq. 0) then
+         write (6,*) ' MPI pong test'
+         write (6,*) ' samples = ', samples
+         write (6,*) ' initsamplesize = ', initsamplesize
+         write (6,*) ' samplesizeinc = ', samplesizeinc
+         write (6,*) ' msgspersample = ', msgspersample
+         write (6,*) ' ibufcount = ', ibufcount
+         write (6,98) MPI_Wtick()
+         write (6,*) 
+      endif
+   98 format (' clock resolution = ',e10.5)
+
+      call MPI_BARRIER(MPI_COMM_WORLD, ierr)
+
+c
+c =========================== main loop =========================== 
+c
+
+c Start main loop - iterate twice to generate two complete sets of timings
+      do 60 iter = 1,2
+      do 40 sample = 1,samples
+      num = initsamplesize + ((sample-1)*samplesizeinc)
+
+c debug
+      write (6,99) nodenum, iter, sample, num
+      call MPI_BARRIER(MPI_COMM_WORLD, ierr)
+   99 format ( 1x, 'PE = ', i1, ', iter = ',i1,
+     +             ', sample = ', i3, ', num = ', i5 )
+
+c Find initial elapsed time in seconds
+
+      if(nodenum.eq.0) then
+c Send message from node 0 to 1 and receive message from 1
+        idest = 1
+        t1 = MPI_Wtime()
+        do 20 i = 1,msgspersample
+           call MPI_SEND(buffer, num, MPI_DOUBLE_PRECISION, 
+     +              idest, 0, MPI_COMM_WORLD, ierr1)
+           call MPI_RECV(buffer, num, MPI_DOUBLE_PRECISION, 
+     +              MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     +              stat, ierr2)
+   20   continue
+        t2 = MPI_Wtime()
+      else
+c Send message from node 1 to 0 and receive message from 0
+        idest = 0
+        t1 = MPI_Wtime()
+        do 21 i = 1,msgspersample
+           call MPI_RECV(buffer, num, MPI_DOUBLE_PRECISION, 
+     +              MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
+     +              stat, ierr2)
+           call MPI_SEND(buffer, num, MPI_DOUBLE_PRECISION, 
+     +              idest, 0, MPI_COMM_WORLD, ierr1)
+   21   continue
+        t2 = MPI_Wtime()
+      endif
+
+c independent variable is message length:
+      x(sample) = dfloat(num * sizedouble)
+
+c dependent variable is average one-way transit time:
+      y(sample) = ((t2 - t1) * 0.5) /
+     +            dfloat(msgspersample)
+
+   40 continue
+
+c now do linear least squares fit to data
+c time = a + b*x
+
+      if (nodenum .eq. 0) then
+      sumy = 0.d0
+      sumx = 0.d0
+      sumxy = 0.d0
+      sumxx = 0. d0
+      do 45 i=1,samples
+         sumx = sumx + x(i)
+         sumy = sumy + y(i)
+         sumxy = sumxy + ( x(i) * y(i) )
+         sumxx = sumxx + ( x(i) * x(i) )
+   45 continue
+
+      det = (dfloat(samples) * sumxx) - (sumx * sumx)
+      a = (1.d6 * ((sumxx * sumy) - (sumx * sumxy))) / det
+      b = (1.d6 * ((dfloat(samples) * sumxy) - (sumx * sumy))) / det
+
+      write(6,*)
+      write(6,*) ' iter = ', iter
+      write(6,*)
+      write(6,*) ' least squares fit:  time = a + b * (msg length)'
+      write(6,200) a
+      write(6,300) b
+      bandw = 1./b
+      write(6,400) bandw
+      write(6,*)
+      write(6,*) '    message         observed          fitted'
+      write(6,*) ' length(bytes)     time(usec)       time(usec)'
+      write(6,*)
+      do 50 i=1,samples
+         fit = a + b*x(i) 
+         y(i) = y(i)*1.d6
+         write(6,100) x(i),y(i),fit
+   50 continue
+      endif
+
+   60 continue
+
+c
+c =========================== end loop =========================== 
+c
+
+  100 format(3x,f8.0,5x,f12.2,5x,f12.2)
+  200 format(5x,'a = latency = ',f8.2,' microseconds')
+  300 format(5x,'b = inverse bandwidth = ' , f8.5,' secs/Mbyte')     
+  400 format(5x,'1/b = bandwidth = ',f8.2,' Mbytes/sec')
+
+c
+c =========================== end program =========================== 
+c
+
+      call MPI_FINALIZE(ierr)
+      
+      end
diff --git a/teshsuite/smpi/mpich-test/pt2pt/probe.c b/teshsuite/smpi/mpich-test/pt2pt/probe.c
new file mode 100644 (file)
index 0000000..6d55b48
--- /dev/null
@@ -0,0 +1,56 @@
+/* 
+   This is a test of probe to receive a message of unknown length
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "mpi.h"
+#include "test.h"
+
+int main( int argc, char **argv ) 
+{
+int data, to, from, tag, maxlen, np, myid, src, dest;
+MPI_Status status;
+
+MPI_Init( &argc, &argv );
+MPI_Comm_rank( MPI_COMM_WORLD, &myid );
+MPI_Comm_size( MPI_COMM_WORLD, &np );
+
+/* dest writes out the received stats; for the output to be
+   consistant (with the final check), it should be procees 0 */
+if (argc > 1 && argv[1] && strcmp( "-alt", argv[1] ) == 0) {
+    dest = np - 1;
+    src  = 0;
+    }
+else {
+    src  = np - 1;
+    dest = 0;
+    }
+
+if (myid == src) {
+    to   = dest;
+    tag  = 2000;
+#ifdef VERBOSE    
+    printf( "About to send\n" );
+#endif
+    MPI_Send( &data, 1, MPI_INT, to, tag, MPI_COMM_WORLD );
+    }
+else {
+    tag    = 2000;
+    from   = MPI_ANY_SOURCE;
+    MPI_Probe( from, tag, MPI_COMM_WORLD, &status );
+    MPI_Get_count( &status, MPI_INT, &maxlen );
+    /* Here I'd normally allocate space; I'll just check that it is ok */
+    if (maxlen > 1)
+       printf( "Error; size = %d\n", maxlen );
+#ifdef VERBOSE
+    printf( "About to receive\n" );
+#endif
+    MPI_Recv( &data, 1, MPI_INT, status.MPI_SOURCE, status.MPI_TAG, 
+             MPI_COMM_WORLD, &status );
+    }
+MPI_Barrier( MPI_COMM_WORLD );
+Test_Waitforall( );
+MPI_Finalize();
+return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/probe1.c b/teshsuite/smpi/mpich-test/pt2pt/probe1.c
new file mode 100644 (file)
index 0000000..389283c
--- /dev/null
@@ -0,0 +1,78 @@
+/* 
+   This is a test of probe to receive a message of unknown type (used as a
+   server)
+ */
+#include <stdio.h>
+#include <string.h>
+#include "mpi.h"
+#include "test.h"
+
+int main( int argc, char **argv ) 
+{
+int data, to, from, tag, maxlen, np, myid, flag, dest, src;
+MPI_Status status, status1;
+
+MPI_Init( &argc, &argv );
+MPI_Comm_rank( MPI_COMM_WORLD, &myid );
+MPI_Comm_size( MPI_COMM_WORLD, &np );
+
+/* dest writes out the received stats; for the output to be
+   consistant (with the final check), it should be procees 0 */
+if (argc > 1 && argv[1] && strcmp( "-alt", argv[1] ) == 0) {
+    dest = np - 1;
+    src  = 0;
+    }
+else {
+    src  = np - 1;
+    dest = 0;
+    }
+
+if (myid == src) {
+    to   = dest;
+    tag = 2000;
+#ifdef VERBOSE
+    printf( "About to send\n" );
+#endif
+    MPI_Send( &data, 1, MPI_INT, to, tag, MPI_COMM_WORLD );
+    tag = 2001;
+#ifdef VERBOSE
+    printf( "About to send 'done'\n" );
+#endif
+    MPI_Send( &data, 1, MPI_INT, to, tag, MPI_COMM_WORLD );
+    }
+else {
+    /* Server loop */
+    while (1) {
+       tag    = MPI_ANY_TAG;
+       from   = MPI_ANY_SOURCE;
+       /* Should really use MPI_Probe, but functionally this will work
+          (it is less efficient, however) */
+       do {            
+           MPI_Iprobe( from, tag, MPI_COMM_WORLD, &flag, &status );
+           } while (!flag);
+       if (status.MPI_TAG == 2001) {
+#ifdef VERBOSE
+           printf( "Received terminate message\n" );
+#endif
+           /* Actually need to receive it ... */
+           MPI_Recv( &data, 1, MPI_INT, status.MPI_SOURCE, 
+                     status.MPI_TAG, MPI_COMM_WORLD, &status1 );
+           break;
+           }
+       if (status.MPI_TAG == 2000) {
+           MPI_Get_count( &status, MPI_INT, &maxlen );
+           if (maxlen > 1)
+               printf( "Error; size = %d\n", maxlen );
+#ifdef VERBOSE
+           printf( "About to receive\n" );
+#endif
+           MPI_Recv( &data, 1, MPI_INT, status.MPI_SOURCE, 
+                     status.MPI_TAG, MPI_COMM_WORLD, &status1 );
+           }
+       }
+    }
+MPI_Barrier( MPI_COMM_WORLD );
+Test_Waitforall( );
+MPI_Finalize();
+return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/relrank.c b/teshsuite/smpi/mpich-test/pt2pt/relrank.c
new file mode 100644 (file)
index 0000000..6becaf7
--- /dev/null
@@ -0,0 +1,58 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+/* 
+ * Test that receives are done by relative rank, and that the status value
+ * contains the relative rank
+ */
+int main( int argc, char **argv )
+{
+    int rank, new_world_rank, size, order, errcnt = 0, i;
+    int tmpint = 0;
+    MPI_Comm new_world;
+    MPI_Status s;
+
+    MPI_Init(&argc,&argv);
+
+    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
+    MPI_Comm_size(MPI_COMM_WORLD,&size);
+
+    order = size - rank - 1;
+    MPI_Comm_split(MPI_COMM_WORLD, 0, order, &new_world);
+       
+    MPI_Comm_rank ( new_world, &new_world_rank );
+
+    /* Make sure that the split worked correctly */
+    if (new_world_rank != order) {
+       errcnt ++;
+       fprintf( stderr, "Comm split did not properly order ranks!\n" );
+    }
+    if (new_world_rank==0) {
+       MPI_Send(&tmpint, 1, MPI_INT, 1, 0, new_world);
+       /* printf("%d(%d): Sent message to: %d\n", new_world_rank, rank, 1); */
+    }
+    else if (new_world_rank == 1) {
+       MPI_Recv(&tmpint, 1, MPI_INT, 0, 0, new_world,&s);
+       if (s.MPI_SOURCE != 0) {
+           errcnt++;
+           fprintf( stderr, 
+                    "Source incorrect in recv status (%d should be %d)\n",
+                    s.MPI_SOURCE, 0 );
+       }
+       /*
+         printf("%d(%d): Recv message from: -> %d(%d) <- these 2 should equal\n", 
+         new_world_rank, rank, 0, s.MPI_SOURCE); 
+         */
+    }
+
+    MPI_Comm_free( &new_world );
+    i = errcnt;
+    MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (errcnt > 0) {
+       printf( "Found %d errors in the run\n", errcnt );
+    }
+    Test_Waitforall( );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/reqcreate.c b/teshsuite/smpi/mpich-test/pt2pt/reqcreate.c
new file mode 100644 (file)
index 0000000..16646cb
--- /dev/null
@@ -0,0 +1,85 @@
+#include <stdio.h>
+#include "mpi.h"
+#include <stdlib.h>
+#include "test.h"
+
+/* Test request creation */
+
+int main( int argc, char **argv )
+{
+    int i, n, n_goal = 2048, rc, len, buf[1];
+    MPI_Request *req_array;
+    MPI_Status status;
+    char msg[MPI_MAX_ERROR_STRING];
+
+    MPI_Init( &argc, &argv );
+    MPI_Errhandler_set( MPI_COMM_WORLD, MPI_ERRORS_RETURN );
+
+    n = n_goal;
+
+    req_array = (MPI_Request *)malloc( n * sizeof(MPI_Request) );
+    
+    for (i=0; i<n; i++) {
+       rc = MPI_Irecv( buf, 1, MPI_INT, 0, i, MPI_COMM_WORLD, req_array + i );
+       if (rc) {
+           fprintf( stderr, "Error when creating request number %d\n", i );
+           MPI_Error_string( rc, msg, &len );
+           fprintf( stderr, "%s\n", msg );
+           n = i + 1;
+           break;
+       }
+    }
+    for (i=0; i<n; i++) {
+       rc = MPI_Cancel( req_array + i );
+       if (rc) {
+           fprintf( stderr, "Error when canceling request number %d\n", i );
+           MPI_Error_string( rc, msg, &len );
+           fprintf( stderr, "%s\n", msg );
+           n = i + 1;
+           break;
+       }
+       rc = MPI_Request_free( req_array + i );
+       if (rc) {
+           fprintf( stderr, "Error when freeing request number %d\n", i );
+           MPI_Error_string( rc, msg, &len );
+           fprintf( stderr, "%s\n", msg );
+           n = i + 1;
+           break;
+       }
+    }
+
+    printf( "Completed test of %d request creations (with cancel)\n", n );
+
+    for (i=0; i<n; i++) {
+       rc = MPI_Irecv( buf, 1, MPI_INT, MPI_PROC_NULL, i, MPI_COMM_WORLD, 
+                       req_array + i );
+       if (rc) {
+           fprintf( stderr, "Error when creating request number %d\n", i );
+           MPI_Error_string( rc, msg, &len );
+           fprintf( stderr, "%s\n", msg );
+           n = i + 1;
+           break;
+       }
+    }
+    for (i=0; i<n; i++) {
+       rc = MPI_Wait( req_array + i, &status );
+       if (rc) {
+           fprintf( stderr, "Error when waiting on request number %d\n", i );
+           MPI_Error_string( rc, msg, &len );
+           fprintf( stderr, "%s\n", msg );
+           n = i + 1;
+           break;
+       }
+    }
+
+    printf( "Completed test of %d request creations (with wait)\n", n );
+    if (n != n_goal) {
+       printf (
+"This MPI implementation limits the number of request that can be created\n\
+This is allowed by the standard and is not a bug, but is a limit on the\n\
+implementation\n" );
+    }
+    free( req_array );
+    MPI_Finalize( );
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/reqcreate.std b/teshsuite/smpi/mpich-test/pt2pt/reqcreate.std
new file mode 100644 (file)
index 0000000..08ddff5
--- /dev/null
@@ -0,0 +1,4 @@
+**** Checking the request creation routines ****
+Completed test of 2048 request creations (with cancel)
+Completed test of 2048 request creations (with wait)
+**** Checking the request creation routines ****
diff --git a/teshsuite/smpi/mpich-test/pt2pt/reqfree.c b/teshsuite/smpi/mpich-test/pt2pt/reqfree.c
new file mode 100644 (file)
index 0000000..0b4eb44
--- /dev/null
@@ -0,0 +1,152 @@
+#include "test.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include "mpi.h"
+
+#define MAX_REQ 10000
+
+#define DEFAULT_REQ 100
+#define DEFAULT_LEN 20000
+#define DEFAULT_LOOP 10
+
+int main( int argc, char **argv )
+{
+    int rank, size, loop, max_loop = DEFAULT_LOOP, max_req = DEFAULT_REQ;
+    int buf_len = DEFAULT_LEN;
+    int i, j, errs = 0, toterrs;
+    MPI_Request r;
+    MPI_Status  status;
+    int *(b[MAX_REQ]);
+    MPI_Datatype dtype;
+    int sendrank = 0, recvrank = 1;
+
+    MPI_Init( &argc, &argv );
+
+    dtype = MPI_INT;
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+
+/* 
+   The following test allows this test to run on small-memory systems
+   that support the sysconf call interface.  This test keeps the test from
+   becoming swap-bound.  For example, on an old Linux system or a
+   Sony Playstation 2 (really!) 
+ */
+#if defined(HAVE_SYSCONF) && defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
+    if (rank == sendrank) 
+    { 
+       long n_pages, pagesize;
+       int  msglen_max = max_req * buf_len * sizeof(int);
+       n_pages  = sysconf( _SC_PHYS_PAGES );
+       pagesize = sysconf( _SC_PAGESIZE );
+       /* printf( "Total mem = %ld\n", n_pages * pagesize ); */
+       /* We want to avoid integer overflow in the size calculation.
+          The best way is to avoid computing any products (such
+          as total memory = n_pages * pagesize) and instead
+          compute a msglen_max that fits within 1/4 of the available 
+          pages */
+       if (n_pages > 0 && pagesize > 0) {
+           /* Recompute msglen_max */
+           int msgpages = 4 * ((msglen_max + pagesize - 1)/ pagesize);
+           while (n_pages < msgpages) { 
+               msglen_max /= 2; msgpages /= 2; buf_len /= 2; 
+           }
+       }
+    }
+#else
+    /* printf( "No sysconf\n" ); */
+#endif
+
+    /* Check command line args (allow usage even with one processor */
+    argv++;
+    argc--;
+    while (argc--) {
+       if (strcmp( "-loop" , *argv ) == 0) {
+           argv++; argc--;
+           max_loop = atoi( *argv );
+       }
+       else if (strcmp( "-req", *argv ) == 0) {
+           argv++; argc--;
+           max_req = atoi( *argv );
+       }
+       else if (strcmp( "-len", *argv ) == 0) {
+           argv++; argc--;
+           buf_len = atoi( *argv );
+       }
+       else {
+           fprintf( stderr, 
+                    "Usage: reqfree [ -loop n ] [ -req n ] [ -len n ]\n" );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+       argv++;
+    }
+    
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    if (size != 2) {
+       fprintf( stderr, "This program requires two processes\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    /* Assume only processor 0 has the command line */
+    MPI_Bcast( &max_loop, 1, MPI_INT, 0, MPI_COMM_WORLD );
+    MPI_Bcast( &max_req, 1, MPI_INT, 0, MPI_COMM_WORLD );
+    MPI_Bcast( &buf_len, 1, MPI_INT, 0, MPI_COMM_WORLD );
+
+    /* Allocate buffers */
+    for (i=0; i<max_req; i++) {
+       b[i] = (int *) malloc(buf_len * sizeof(int) );
+       if (!b[i]) {
+           fprintf( stderr, "Could not allocate %dth block of %d ints\n", 
+                    i, buf_len );
+           MPI_Abort( MPI_COMM_WORLD, 2 );
+       }
+       if (rank != sendrank) break;
+       for (j=0; j<buf_len; j++) {
+           b[i][j] = i * buf_len + j;
+       }
+    }
+
+    /* Loop several times to capture resource leaks */
+    for (loop=0; loop<max_loop; loop++) {
+       if (rank == sendrank) {
+           for (i=0; i<max_req; i++) {
+               MPI_Isend( b[i], buf_len, dtype, recvrank, 0, 
+                          MPI_COMM_WORLD, &r );
+               MPI_Request_free( &r ); 
+           }
+           MPI_Barrier( MPI_COMM_WORLD );
+           MPI_Barrier( MPI_COMM_WORLD );
+       }
+       else {
+           MPI_Barrier( MPI_COMM_WORLD );
+           for (i=0; i<max_req; i++) {
+               MPI_Recv( b[0], buf_len, dtype, sendrank, 0, MPI_COMM_WORLD, 
+                         &status );
+               for (j=0; j<buf_len; j++) {
+                   if (b[0][j] != i * buf_len + j) {
+                       errs++;
+                       fprintf( stdout, 
+                                "at %d in %dth message, got %d expected %d\n",
+                                j, i, b[0][j], i * buf_len + j );
+                       break;
+                   }
+               }
+           }
+           MPI_Barrier( MPI_COMM_WORLD );
+       }
+    }
+
+    MPI_Allreduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (rank == 0) {
+       if (toterrs == 0) printf( " No Errors\n" );
+       else              printf( "Found %d errors\n", toterrs );
+    }
+
+    MPI_Finalize( );
+    return 0;
+}
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/runtests b/teshsuite/smpi/mpich-test/pt2pt/runtests
new file mode 100755 (executable)
index 0000000..f9b9ff2
--- /dev/null
@@ -0,0 +1,383 @@
+#! /bin/sh
+#
+# Run some of the tests.  If any arguments are provided, pass them to the
+# test programs.
+#
+# -mvhome is needed for the ANL SP, and is ignored by others
+args=
+device=
+MPICH_VERSION=
+STOPFILE=${MPITEST_STOPTEST:-"$HOME/.stopmpichtests"}
+MAKE="make --no-print-directory"
+MPIRUNMVBACK=""
+#
+# Load basic procedures
+
+#
+# Set mpirun to the name/path of the mpirun program
+#FindMPIRUN
+#
+# If the programs are not available, run make.
+runtests=1
+makeeach=0
+writesummaryfile=no
+check_at_once=1
+quiet=0
+check_canrun=0
+have_fortran=0
+CheckOutputWhileRunning="yes"
+# Using shifts should  remove args from the list.
+for arg in "$@" ; do
+    case $arg in 
+    -basedir=* )
+       basedir=`echo $arg | sed 's/-basedir=//'`
+       ;; 
+    -srcdir=* )
+       srcdir=`echo $arg | sed 's/-srcdir=//'`
+       ;; 
+       -fort=* )
+       have_fortran=`echo $arg | sed 's/-fort=//'`
+       ;;
+       -checkonly)
+       shift
+       runtests=0
+       ;;
+        -margs=*)
+       shift
+       margs=`echo $arg | sed 's/-margs=//'`
+       args="$args $margs"
+       ;;
+       -summaryfile=*)
+       writesummaryfile=yes
+       summaryfile=`echo A$arg | sed 's/A-summaryfile=//'`
+       ;;
+       -echo)
+       shift
+       set -x
+       ;;
+       -check)
+       check_canrun=1
+       ;;
+       -quiet)
+       shift
+       quiet=1
+       ;;
+       -small)
+       shift
+       makeeach=1
+       ;;
+       -atend)
+       shift
+       check_at_once=0
+       ;;
+       -help|-u)
+       shift
+       echo "runtests [-checkonly] [-margs='...'] [-atend] [-check]"
+       echo "run tests in this directory.  If -checkonly set, just run"
+       echo "the differences check (do NO rerun the test programs)."
+       echo "If -margs is used, these options are passed to mpirun."
+       echo "If -small is used, the examples are built, run, and deleted."
+       echo "If -atend is used, the success of the tests is checked only"
+       echo "at the end of the test rather than also after each test."
+       echo "If -check is used, only a single simple test is run; this"
+       echo "is used to check that mpirun can run an MPI program."
+       exit 1
+       ;;
+       *)
+       if test -n "$arg" ; then
+           echo "Passing remaining arguments to programs ($*)"
+           break
+        fi
+       ;;
+    esac
+done
+
+#
+# Load basic procedures
+. ${srcdir}/../runbase
+
+# Do this because we're writing the output while running
+savewritesummaryfile=$writesummaryfile
+writesummaryfile=no
+
+mpirun=" ${basedir}/bin/smpirun --cfg=smpi/running_power:108095000 -platform ${srcdir}/../../../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir}/../../hostfile  --log=root.thres:critical"
+
+# If cannot run test, do that and exit
+if [ $check_canrun = 1 ] ; then
+    # Make sure that we don't have an old file lying around
+    rm -f third third.o third.exe
+    MakeExe third
+    rm -f third.out
+    echo '*** Testing Unexpected messages ***' >> third.out
+    $mpirun $args -np 2 ./third </dev/null >> third.out 2>&1
+    echo '*** Testing Unexpected messages ***' >> third.out
+    rm -f third.stdo
+    cat >>third.stdo <<EOF
+*** Testing Unexpected messages ***
+ No Errors
+*** Testing Unexpected messages ***
+EOF
+#    if diff -b third.out third.stdo > /dev/null ; then
+       rc=0
+#    else
+#      echo "Failed to run simple program!"
+#      echo "Output from run attempt was"
+#      cat third.out
+#        echo "mpirun program was $mpirun"
+#      echo "mpirun command was "
+#      echo "$mpirun $args -np 2 ./third </dev/null >>third.out 2>&1"
+#      rc=1
+#    fi
+#    CleanExe third
+#    rm -f third.out 
+#    exit $rc
+fi
+
+# If the programs are not available, run make.
+#if [ ! -x sendrecv_mpich -a $makeeach = 0 -a $runtests = 1 ] ; then
+#    $MAKE
+#fi
+
+testfiles=""
+if [ $runtests = 1 ] ; then
+echo '**** Testing MPI Point-to-point routines ****'
+
+RunTest sendrecv_mpich 2 "**** Testing MPI_Send and MPI_Recv ****" "" "sendrecv-0.out sendrecv-1.out"
+
+RunTest sendrecv2 2 "**** Testing MPI_Send and MPI_Recv (2) ****"
+
+
+#Uses MPI_Pack and Unpack
+#RunTest sendrecv3 2 "**** Testing MPI_Send and MPI_Recv (3) ****"
+#Uses MPI_BOTTOM
+#RunTest sendrecv4 2 "**** Testing MPI_Send and MPI_Recv (4) ****"
+
+#not supported
+#RunTest bsendtest 2 "**** Testing MPI_Bsend and MPI_Recv (4) ****" "" "bsendtest-0.out bsendtest-1.out"
+
+RunTest isndrcv 2 "**** Testing MPI_Isend and MPI_Irecv ****" "" "isndrcv-0.out isndrcv-1.out"
+
+#RunTest irsend 2 "**** Testing MPI_Irsend ****"
+
+#RunTest irsendinit 2 "**** Testing MPI_Rsend_init ****"
+
+
+#rsend and ssend to implement, removed for now
+RunTest longmsgs 2 "**** Testing long messages ****"
+
+RunTest testsome 2 "**** Testing MPI_Testsome/Testany/Waitsome ****"
+
+#issend used, replaced by isend - fails 
+#RunTest testall_mpich 2 "**** Testing MPI_Testall ****"
+
+#MPI_Cancel, not yet implemented
+#RunTest cancel 2 "**** Checking MPI_Cancel (Irecv's) ****"
+
+#RunTest cancel2 2 "**** Checking MPI_Cancel (Persistent Recv's) ****"
+
+#RunTest cancel3 2 "**** Checking MPI_Cancel (Persistent Send's) ****"
+
+#RunTest cancelmessages 2 "**** Checking MPI_Cancel (short/eager/rndv) ****"
+
+#RunTest cancelibm 2 "**** Checking MPI_Cancel (successful/nonsuccessful) ****"
+
+# This test exposes a SEGV in the MPICH1 code.  However, this is an
+# uncommon situtation.  Users who need this feature should switch to 
+# MPICH2 (www.mcs.anl.gov/mpi/mpich2)
+#RunTest cancelissend 2 "**** Checking MPI_Cancel and MPI_Issend (short msgs) ****"
+
+RunTest sndrcv 2 "**** Testing MPI_Sendrecv ****"
+
+RunTest sndrcvrep 2 "**** Testing MPI_Sendrecv_replace ****"
+
+RunTest sndrcvrpl2 2 "**** Testing MPI_Sendrecv_replace (long) ****"
+
+#not implemented :TODO, should be simple, add a nbelements parameter to the datatype, compute it at creation time, then multiply status->count by this number
+#RunTest getelm 2 "**** Testing MPI_Get_elements ****"
+
+#uses Pack_size, Buffer_attach, Bsend, Buffer_detach
+#RunTest overtake 2 "**** Verifying that messages are non-overtaking ****" "" "overtake-0.out overtake-1.out"
+
+#RunTest ssendtest 2 "**** Verifying ssend ****"
+
+#RunTest ssendtest2 2 "**** Verifying ssend (2) ****"
+
+#RunTest issendtest 2 "**** Verifying Issend ****" "" "issendtest-1.out"
+
+#RunTest issend2 2 "**** Verifying Issend (2) ****"
+
+#uses MPI_Cancel, lets a lot of orphan comms.
+#RunTest reqcreate 1 "**** Checking the request creation routines ****"
+
+
+#free does really free the request, without waiting for completion, leading to bugs.
+#RunTest reqfree 2 "**** Checking request free ****" "-req 2048"
+
+RunTest typebase 1 "**** Checking the type (sizes) routines ****"
+
+RunTest typecreate 1 "**** Checking the type creation routines ****"
+
+RunTest typetest 2 "**** Checking the type routines ****" "" "typetest-0.out typetest-1.out"
+
+#weird error, because comment says smpi returned value is same as expected from mpich .. modified to handle this value as correct
+RunTest typeub 2 "**** Checking the type routines: MPI_UB ****"
+
+RunTest typeub2 1 "**** Checking the type routines: MPI_UB(2) ****"
+
+RunTest typeub3 1 "**** Checking the type routines: MPI_UB(3) ****"
+
+RunTest typelb 1 "**** Checking the type routines: MPI_LB ****"
+
+RunTest structlb 1 "**** Checking Type_struct routines: MPI_LB ****"
+
+#ssend, replaced by send
+RunTest dtypelife 2 "**** Checking the type routines: MPI_Type_free ****"
+
+#TODO: handle alignment for extent values 
+#RunTest dataalign 2 "**** Checking the type alignment ****"
+
+RunTest dtyperecv 2 "**** Checking the type recv ****"
+
+RunTest commit 1 "**** Checking the type routines: MPI_Type_commit ****"
+
+RunTest third 2 "*** Testing Unexpected messages ***"
+
+RunTest fourth 4 "*** Testing Irecv/Isend/Wait ***"
+
+RunTest fifth 4 "*** Testing Irecv/Isend/Waitall ***"
+
+#uses MPI_keyval_create, Attr_put, Attr_get, Attr_delete, Keyval_free
+#RunTest sixth 2 "*** Testing attribute manipulation ***"
+
+RunTest nblock 4 "*** Testing Isend/Irecv (large numbers) ***"
+
+#TODO : unlock probing ...
+#RunTest nbtest 4 "*** Testing Isend/Probe/Recv (large numbers) ***"
+
+RunTest sendmany 8 "*** Testing Send (many procs) ***"
+
+RunTest order 2 "*** Testing Recv ordering ***"
+
+RunTest sendorder 2 "**** Checking Message Ordering ****"
+
+RunTest exittest 3 "**** Checking Exit Processing ****"
+
+#uses MPI_Errors
+#RunTest trunc 2 "*** Testing Message truncation ***"
+#TODO: handle MPI_ERR_IN_STATUS
+#RunTest truncmult 2 '*** Testing Message trunction in multiple completions ***'
+
+RunTest nullproc 2 "*** Testing handling of MPI_PROC_NULL ***"
+
+RunTest nullproc2 2 "*** Testing handling of MPI_PROC_NULL in blocking Recv ***"
+
+RunTest relrank 2 "*** Testing handling of relative rank ***"
+
+RunTest hvectest 2 "*** Testing Vector type ***"
+
+RunTest hvectest2 2 "*** Testing struct type for vectors (MPI_UB) ***"
+
+RunTest hvec 2 "*** Testing Type_Hvector ***"
+
+RunTest hindexed 1 "*** Testing Type_Hindexed ***"
+
+RunTest probe 2 "*** Testing Probe and Get_count ***"
+
+RunTest probe1 2 "*** Testing Iprobe and Get_count ***"
+
+RunTest self 1 "*** Testing send to self ***"
+#TODO : handle COMM_SELF
+#RunTest selfvsworld 2 "*** Testing COMM_SELF and COMM_WORLD ***"
+
+RunTest testtest1 2 "*** Testing MPI_Test ***"
+
+RunTest persistent 4 "*** Testing MPI_Recv_init ***"
+
+RunTest persist 4 "*** Testing MPI_Startall/Request_free ***"
+#used MPI_Buffers and Bsends
+#RunTest persist2 4 "*** Testing MPI_Startall(Bsend)/Request_free ***"
+
+RunTest waitall 4 "*** Testing MPI_Waitall ***"
+
+#uses issend, replaced by isend, and ssend replaced by send
+#RunTest waitall2 2 "*** Testing MPI_Waitall (order) ***"
+
+#RunTest waitall3 4 "*** Testing MPI_Waitall (order-irecv) ***"
+
+#RunTest waitall4 4 "*** Testing MPI_Waitall (order-isend) ***"
+#put a big value for the message size, because it failed as a detached send (isend was used instead of issend)
+RunTest waitany 4 "*** Testing MPI_Waitany ***"
+
+#RunTest pack 2 "*** Testing MPI_Pack ***"
+
+#calls to ssend replaced by send
+RunTest flood 2 "**** Testing large messages ****"
+
+#very long
+#RunTest flood2 2 "**** Testing large numbers of messages ****"
+#
+# Run Fortran tests ONLY if Fortran available
+if [ $have_fortran -eq "1" ] ; then 
+    echo "FORTRAN TESTS"
+    #
+    #echo "*** secondf ***" >> pt2pt.out
+    #$mpirun $args -np 2 ./secondf "$@" >> pt2pt.out 2>&1
+    #
+    RunTest isendf 2 "*** Testing isend from Fortran ***"
+
+    RunTest sendcplx 2 "*** Testing Fortran send ***"
+    #RunTest allpair 2 "*** Testing pt-2-pt from Fortran ***"
+
+    #RunTest allpair2 2 "*** Testing pt-2-pt from Fortran (many calls) ***"
+    #
+#    OutTime
+#    testfiles="$testfiles structf.out"
+#    rm -f structf.out
+#    MakeExe structf
+#    echo '*** Testing Type_struct from Fortran ***'
+#    echo '*** Testing Type_struct from Fortran ***' >> structf.out
+    # This is tricky.  Because of a bug in IRIX64, we need to direct 
+    # input from /dev/null (so that we can know that we need a new process
+    # group).  This should be ok for everyone, but SunOS 4.1.4 tends to
+    # panic (!!) in this case.  Since both behaviors represent broken
+    # operating systems, we test for ARCH=IRIX64 
+#    if [ "LINUX" = "IRIX64" ] ; then 
+#      $mpirun $args -np 2 ./structf "$@" >> structf.out 2>&1 < /dev/null
+#    else
+#      $mpirun $args -np 2 ./structf "$@" >> structf.out 2>&1
+#    fi
+#    echo '*** Testing Type_struct from Fortran ***' >> structf.out
+#    CheckOutput structf
+#    CleanExe structf
+    #
+    RunTest send1 2 "*** Testing pt-2-pt from Fortran (2) ***"
+
+    RunTest sendfort 2 "*** Testing Fortran logical datatype ***"
+
+    #
+    testfiles="$testfiles pingpong.out"
+    rm -f pingpong.out
+    #MakeExe pingpong
+
+    echo '*** Testing pt-2-pt from Fortran (3) ***' 
+    $mpirun $args -np 2 ./pingpong_f "$@" >> /dev/null 
+    CheckOutput pingpong
+    #CleanExe pingpong
+    #
+    echo "END OF FORTRAN TESTS"
+fi
+#
+else
+    # Just run checks
+    testfiles=`echo *.out`
+    if test "$testfiles" = "*.out" ; then
+       echo "No output files remain from previous test!"
+       exit 1
+    fi
+fi
+#
+writesummaryfile=$savewritesummaryfile
+echo '*** Checking for differences from expected output ***'
+CheckAllOutput pt2pt.diff
+exit 0
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/secondf.f b/teshsuite/smpi/mpich-test/pt2pt/secondf.f
new file mode 100644 (file)
index 0000000..af3d2ef
--- /dev/null
@@ -0,0 +1,59 @@
+C
+C    second - test program that sends an array of floats from the first process
+C             of a group to the last, using send and recv
+C
+C
+      program main
+      include 'mpif.h'
+C
+      integer rank, size, to, from, tag, count, i, ierr
+      integer src, dest
+      integer st_source, st_tag, st_count
+C      MPI_Status status
+      integer status(MPI_STATUS_SIZE)
+      double precision data(100)
+
+      call MPI_INIT( ierr )
+C      print *, 'about to call comm rank'
+      call MPI_COMM_RANK( MPI_COMM_WORLD, rank, ierr )
+C      print *, rank, 'about to call comm size'
+      call MPI_COMM_SIZE( MPI_COMM_WORLD, size, ierr )
+      print *, 'Process ', rank, ' of ', size, ' is alive'
+C
+C      src = size - 1
+C      dest = 0
+      dest = size - 1
+      src = 0
+C      
+      if (rank .eq. src) then
+         to     = dest
+         count  = 10
+         tag    = 2001
+         do 10 i=1, 10
+            data(i) = i
+ 10      continue
+         call MPI_SEND( data, count, MPI_DOUBLE_PRECISION, to, tag, 
+     &                  MPI_COMM_WORLD, ierr )
+         print *, rank, ' sent'
+         print *, (data(i),i=1,10)
+      elseif (rank .eq. dest) then
+         tag   = MPI_ANY_TAG
+         count = 10            
+         from  = MPI_ANY_SOURCE
+         call MPI_RECV(data, count, MPI_DOUBLE_PRECISION, from, tag, 
+     &                 MPI_COMM_WORLD, status, ierr ) 
+            
+         call MPI_GET_COUNT( status, MPI_DOUBLE_PRECISION, 
+     &                       st_count, ierr )
+         st_source = status(MPI_SOURCE)
+         st_tag    = status(MPI_TAG)
+c         
+         print *, 'Status info: source = ', st_source, 
+     &             ' tag = ', st_tag, ' count = ', st_count
+         print *, rank, ' received', (data(i),i=1,10)
+      endif
+        
+        call MPI_FINALIZE( ierr )
+        print *, 'Process ', rank, ' exiting'
+        end
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/self.c b/teshsuite/smpi/mpich-test/pt2pt/self.c
new file mode 100644 (file)
index 0000000..1cad66f
--- /dev/null
@@ -0,0 +1,63 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+/*
+ * This needs to test long messages as well as short ones.
+ * The most likely failure mode for this program is that it will
+ * hang.  Sorry about that....
+ *
+ */
+int main( int argc, char **argv )
+{
+int           sendbuf[10];
+int           sendcount = 10;
+int           recvbuf[10];
+int           recvcount = 10;
+int           source = 0, recvtag = 2;
+int           dest = 0, sendtag = 2;
+int           i, *longsend, *longrecv;
+
+    int               mpi_errno = MPI_SUCCESS;
+    MPI_Status        status_array[2];
+    MPI_Request       req[2];
+
+    MPI_Init( &argc, &argv );
+    if ((mpi_errno = MPI_Irecv ( recvbuf, recvcount, MPI_INT,
+                           source, recvtag, MPI_COMM_WORLD, &req[1] ))) 
+       return mpi_errno;
+    if ((mpi_errno = MPI_Isend ( sendbuf, sendcount, MPI_INT, dest,   
+                           sendtag, MPI_COMM_WORLD, &req[0] ))) 
+       return mpi_errno;
+
+    fprintf( stdout, "[%d] Starting waitall\n", 0 );
+    mpi_errno = MPI_Waitall ( 2, req, status_array );
+    fprintf( stdout, "[%d] Ending waitall\n", 0 );
+
+    for (i=16; i<257000; i *= 2) {
+       longsend = (int *)malloc( i * sizeof(int) );
+       longrecv = (int *)malloc( i * sizeof(int) );
+       if (!longsend || !longrecv) {
+       }
+       if ((mpi_errno = MPI_Irecv ( longrecv, i, MPI_INT, source, recvtag, 
+                                    MPI_COMM_WORLD, &req[1] ))) 
+           return mpi_errno;
+       if ((mpi_errno = MPI_Isend ( longsend, i, MPI_INT, dest,  sendtag, 
+                                    MPI_COMM_WORLD, &req[0] ))) 
+       return mpi_errno;
+       
+       fprintf( stdout, "[%d] Starting waitall (%d)\n", 0, i );
+       mpi_errno = MPI_Waitall ( 2, req, status_array );
+       fprintf( stdout, "[%d] Ending waitall\n", 0 );
+
+       free( longsend );
+       free( longrecv );
+    }
+
+    MPI_Finalize();
+    return (mpi_errno);
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/self.std b/teshsuite/smpi/mpich-test/pt2pt/self.std
new file mode 100644 (file)
index 0000000..2abdf2f
--- /dev/null
@@ -0,0 +1,30 @@
+[0] Starting waitall
+[0] Ending waitall
+[0] Starting waitall (16)
+[0] Ending waitall
+[0] Starting waitall (32)
+[0] Ending waitall
+[0] Starting waitall (64)
+[0] Ending waitall
+[0] Starting waitall (128)
+[0] Ending waitall
+[0] Starting waitall (256)
+[0] Ending waitall
+[0] Starting waitall (512)
+[0] Ending waitall
+[0] Starting waitall (1024)
+[0] Ending waitall
+[0] Starting waitall (2048)
+[0] Ending waitall
+[0] Starting waitall (4096)
+[0] Ending waitall
+[0] Starting waitall (8192)
+[0] Ending waitall
+[0] Starting waitall (16384)
+[0] Ending waitall
+[0] Starting waitall (32768)
+[0] Ending waitall
+[0] Starting waitall (65536)
+[0] Ending waitall
+[0] Starting waitall (131072)
+[0] Ending waitall
diff --git a/teshsuite/smpi/mpich-test/pt2pt/selfvsworld.c b/teshsuite/smpi/mpich-test/pt2pt/selfvsworld.c
new file mode 100644 (file)
index 0000000..621b99d
--- /dev/null
@@ -0,0 +1,104 @@
+/* -----------------------------------------------------------------------
+ * Code:   mismatch.c
+ * Lab:    Parallel Processing Performance Tools
+ * Usage:  mismatch
+ *         Run on two nodes
+ *         You will need to stop the deadlocked program with <ctrl>\
+ * Author: Roslyn Leibensperger  Last revised: 3/19/97 RYL
+ *
+ * Modified by Bill Gropp (ANL) to use Iprobe to detect the message and 
+ * always produce output (no need to abort a deadlocked program).  
+ * Unfortunately(?), the version of POE that had this bug is no longer
+ * available, so we can't test whether using Iprobe would show the same
+ * problem.
+ * ------------------------------------------------------------------------ */
+#include <stdio.h>
+#include "mpi.h"
+#define MSGLEN 100            /* length of message in elements */
+#define TAG_A 100
+#define TAG_B 200
+
+int main( int argc, char *argv[] ) 
+{
+  float message1 [MSGLEN],    /* message buffers                      */
+        message2 [MSGLEN],
+        message3 [MSGLEN];
+  int rank,                   /* rank of task in communicator         */
+      dest=0, source=0,       /* rank in communicator of destination  */
+                              /* and source tasks                     */
+      send_tag=0, recv_tag=0, /* message tags                         */
+      flag, size, i;
+  int errs = 0, toterrs;
+  MPI_Status status;          /* status of communication              */
+  MPI_Status statuses[2];
+  MPI_Request requests[2];
+
+  MPI_Init( &argc, &argv );
+  MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+  MPI_Comm_size( MPI_COMM_WORLD, &size );
+  if (size != 2) {
+      printf( "Must run with exactly 2 processes\n" );
+      MPI_Abort( MPI_COMM_WORLD, 1 );
+  }
+  /* printf ( " Task %d initialized\n", rank ); */
+
+  /* initialize message buffers */
+  for ( i=0; i<MSGLEN; i++ )  
+    {
+      message1[i] = 100;
+      message2[i] = -100;
+    }
+
+  /* ---------------------------------------------------------------
+   * each task sets its message tags for the send and receive, plus
+   * the destination for the send, and the source for the receive 
+   * --------------------------------------------------------------- */
+  if ( rank == 0 )  
+    {
+      dest = 1;
+      source = 1;
+      send_tag = TAG_B;
+      recv_tag = TAG_A;
+  }
+  else if ( rank == 1)  
+    {
+      dest = 0;
+      source = 0;
+      send_tag = TAG_B;
+      recv_tag = TAG_A;
+    }
+
+  /* ---------------------------------------------------------------
+   * send and receive messages 
+   * --------------------------------------------------------------- */
+  /*  printf ( " Task %d has sent the message\n", rank ); */
+  MPI_Isend ( message1, MSGLEN, MPI_FLOAT, dest, send_tag, MPI_COMM_WORLD, &requests[0] );
+  MPI_Irecv ( message2, MSGLEN, MPI_FLOAT, source, recv_tag, MPI_COMM_WORLD, &requests[1] );
+
+  /* See if we can receive the message on COMM_SELF...
+   * This should *never* be possible, but if TV is to be believed may happen
+   * with POE 2.4
+   */
+  MPI_Iprobe( MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_SELF, &flag, &status );
+  if (flag) {
+      errs++;
+      printf ( " Task %d has received the message on COMM_SELF !\n", rank );
+  }
+
+  MPI_Recv( message3, MSGLEN, MPI_FLOAT, source, send_tag, MPI_COMM_WORLD, 
+           &status );
+  MPI_Send( message3, MSGLEN, MPI_FLOAT, dest, recv_tag, MPI_COMM_WORLD );
+  MPI_Waitall( 2, requests, statuses );
+  MPI_Reduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD );
+  if (rank == 0) {
+      if (toterrs == 0) 
+         printf( "No errors\n" );
+      else
+         printf( "Error in handling MPI_COMM_SELF\n" );
+  }
+
+  MPI_Finalize();
+  return 0;
+}
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/send1.f b/teshsuite/smpi/mpich-test/pt2pt/send1.f
new file mode 100644 (file)
index 0000000..141f2d2
--- /dev/null
@@ -0,0 +1,111 @@
+C
+C Test program from Kevin Maguire (K.Maguire@dl.ac.uk); hung earlier
+C T3D verions.  Modified by WDG to be Fortran 77
+C
+      PROGRAM TEST
+      IMPLICIT NONE
+      
+      INCLUDE 'mpif.h'
+      
+      INTEGER STRT,STOP,STEP
+      PARAMETER ( STRT = 1 , STOP = 1000 , STEP = 10 )
+      
+      INTEGER MAX_MESS
+      PARAMETER (MAX_MESS = STOP)
+      
+      INTEGER NUM_LOOPS
+      PARAMETER (NUM_LOOPS = 5)
+
+      LOGICAL VERBOSE
+      PARAMETER (VERBOSE = .FALSE.)
+
+      REAL MESSAGE1(MAX_MESS),MESSAGE2(MAX_MESS)
+
+      INTEGER MES_SIZE,MES_NUM,ID,IERR
+      INTEGER TO1,FROM1,MES_ID1
+      INTEGER TO2,FROM2,MES_ID2
+      INTEGER INODE,ITOTNODE
+      INTEGER STATUS(MPI_STATUS_SIZE)
+      
+      INTEGER TAG_UP_BD
+      
+      CALL MPI_INIT(IERR)
+      CALL MPI_COMM_RANK
+     $     (MPI_COMM_WORLD,INODE,IERR)
+      CALL MPI_COMM_SIZE
+     $     (MPI_COMM_WORLD,ITOTNODE,IERR)
+C      CALL MPI_ATTR_GET
+C     $     (MPI_COMM_WORLD,MPI_TAG_UB,TAG_UP_BD,FLAG,IERR)
+      TAG_UP_BD=1000000
+      
+      CALL MPI_BARRIER(MPI_COMM_WORLD,IERR)
+      
+      ID = 0
+
+      DO 10 MES_SIZE=STRT,STOP,STEP
+
+         DO 20 MES_NUM=1,NUM_LOOPS
+
+            MESSAGE1(1) =  1.
+            MESSAGE2(1) =  2.
+
+            MES_ID1 = ID
+            ID = ID + 100
+            IF (ID.GE.TAG_UP_BD) ID = 0
+            FROM1   = 0
+            TO1     = ITOTNODE-1
+            
+            MES_ID2 = ID
+            ID = ID + 100
+            IF (ID.GE.TAG_UP_BD) ID = 0
+            FROM2   = ITOTNODE-1
+            TO2     = 0
+
+            IF (INODE.EQ.0) THEN
+
+               CALL MPI_SEND(
+     $              MESSAGE1,MES_SIZE,MPI_REAL,
+     $              TO1,MES_ID1,MPI_COMM_WORLD,
+     $              IERR)
+
+               CALL MPI_RECV(
+     $              MESSAGE2,MES_SIZE,MPI_REAL,
+     $              FROM2,MES_ID2,MPI_COMM_WORLD,
+     $              STATUS,IERR)
+
+            ENDIF
+
+            IF (INODE.EQ.(ITOTNODE-1)) THEN
+
+               CALL MPI_RECV(
+     $              MESSAGE1,MES_SIZE,MPI_REAL,
+     $              FROM1,MES_ID1,MPI_COMM_WORLD,
+     $              STATUS,IERR)
+               
+               CALL MPI_SEND(
+     $              MESSAGE2,MES_SIZE,MPI_REAL,
+     $              TO2,MES_ID2,MPI_COMM_WORLD,
+     $              IERR)
+
+            ENDIF
+
+            CALL MPI_BARRIER(MPI_COMM_WORLD,IERR)
+
+            IF (INODE.EQ.0 .AND. VERBOSE) THEN 
+               WRITE (*,'(5I10)')
+     $              MES_SIZE,MES_NUM,TO1,FROM1,MES_ID1
+               WRITE (*,'(5I10)')
+     $              MES_SIZE,MES_NUM,TO2,FROM2,MES_ID2
+               WRITE (*,'(5I10)')
+            ENDIF
+
+ 20      CONTINUE
+
+ 10   CONTINUE
+      IF (INODE.EQ.0) THEN 
+C        If we get here at all, we're ok
+         PRINT *, ' No Errors'
+      ENDIF
+      CALL MPI_FINALIZE(IERR)
+
+      END
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendcplx.f b/teshsuite/smpi/mpich-test/pt2pt/sendcplx.f
new file mode 100644 (file)
index 0000000..b316959
--- /dev/null
@@ -0,0 +1,31 @@
+      PROGRAM MAIN
+      INCLUDE 'mpif.h'
+      
+      INTEGER LDA
+      PARAMETER (LDA=2)
+      INTEGER myid,IERR,NPROCS, stat(MPI_STATUS_SIZE)
+      COMPLEX A(2,2)
+
+      CALL MPI_INIT(IERR)
+      CALL MPI_COMM_RANK(MPI_COMM_WORLD,myid,IERR)
+      CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,IERR)
+      
+      J0 = 1
+      J1 = 2
+      
+      IF (myid .EQ. 0) THEN
+         A(1,1) = CMPLX(1,1)
+         A(2,1) = CMPLX(2,1)
+         A(1,2) = CMPLX(1,2)
+         A(2,2) = CMPLX(2,2)
+         CALL MPI_SEND(A(1,1),LDA*(J1-J0+1),MPI_COMPLEX,1,
+     +                 0,MPI_COMM_WORLD,IERR)
+      ELSE      
+         CALL MPI_RECV(A(1,1),LDA*(J1-J0+1),MPI_COMPLEX,
+     +             0,MPI_ANY_TAG,MPI_COMM_WORLD,stat,IERR)
+         PRINT *,'Received A'
+         PRINT *,'A(1,1) = ',A(1,1),' A(1,2) = ',A(1,2)
+         PRINT *,'A(2,1) = ',A(2,1),' A(2,2) = ',A(2,2)
+      ENDIF
+      CALL MPI_FINALIZE(IERR) 
+      END
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendcplx.stdo b/teshsuite/smpi/mpich-test/pt2pt/sendcplx.stdo
new file mode 100644 (file)
index 0000000..3f5bbcc
--- /dev/null
@@ -0,0 +1,3 @@
+ Received A
+ A(1,1) =  (1.,1.) A(1,2) =  (1.,2.)
+ A(2,1) =  (2.,1.) A(2,2) =  (2.,2.)
\ No newline at end of file
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendfort.f b/teshsuite/smpi/mpich-test/pt2pt/sendfort.f
new file mode 100644 (file)
index 0000000..4e54486
--- /dev/null
@@ -0,0 +1,47 @@
+      program main
+C
+C     Test Fortran logical data
+C
+      implicit none
+      include 'mpif.h'
+      integer ierr, n, tag, status(MPI_STATUS_SIZE), size, rank, i
+      integer errs, nrecv
+      logical l(1000)
+C
+      call mpi_init( ierr )
+      call mpi_comm_size( MPI_COMM_WORLD, size, ierr )
+      call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr )
+C
+      n = 100
+      do i=1, n
+         l(i) = i .lt. n/2
+      enddo
+      tag = 27
+      if (rank .eq. 1) then
+         call MPI_Send( l, n, MPI_LOGICAL, 0, tag, MPI_COMM_WORLD, ierr
+     $        )
+      else if (rank .eq. 0) then
+         call MPI_Recv( l, n, MPI_LOGICAL, 1, tag, MPI_COMM_WORLD,
+     $        status, ierr )
+C         Check results
+         call MPI_Get_count( status, MPI_LOGICAL, nrecv, ierr )
+         if (nrecv .ne. n) then
+            print *, 'Wrong count for logical data'
+         endif
+         errs = 0
+         do i=1, n
+            if (l(i) .neqv. (i .lt. n/2)) then
+               errs = errs + 1
+               print *, 'Error in logical entry ', i
+            endif
+         enddo
+         if (errs .gt. 0) then
+            print *, ' Found ', errs, ' errors'
+         else
+            print *, ' No Errors'
+         endif
+      endif
+C
+      call mpi_finalize( ierr )
+C
+      end
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendmany.c b/teshsuite/smpi/mpich-test/pt2pt/sendmany.c
new file mode 100644 (file)
index 0000000..7d6c6a8
--- /dev/null
@@ -0,0 +1,84 @@
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#include <assert.h>
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+#define MAXPES 16
+#define MYBUFSIZE 8*1024
+static int buffer[MAXPES][MYBUFSIZE];
+
+#define NUM_RUNS 10
+
+
+int main ( int argc, char *argv[] )
+{
+  int i;
+  int count, size;
+  int self, npes;
+  double secs;
+  MPI_Request request[MAXPES];
+  MPI_Status status;
+
+
+  MPI_Init (&argc, &argv);
+  MPI_Comm_rank (MPI_COMM_WORLD, &self);
+  MPI_Comm_size (MPI_COMM_WORLD, &npes);
+
+  assert (npes <= MAXPES);
+
+  for (size = 1; size  <= MYBUFSIZE ; size += size)
+    {
+
+      secs = -MPI_Wtime ();
+      for (count = 0; count < NUM_RUNS; count++)
+       {
+         MPI_Barrier (MPI_COMM_WORLD);
+
+         for (i = 0; i < npes; i++)
+           {
+             if (i == self)
+               continue;
+             MPI_Irecv (buffer[i], size, MPI_INT, i,
+                        MPI_ANY_TAG, MPI_COMM_WORLD, &request[i]);
+           }
+
+         for (i = 0; i < npes; i++)
+           {
+             if (i == self)
+               continue;
+             MPI_Send (buffer[self], size, MPI_INT, i, 0, MPI_COMM_WORLD);
+           }
+
+         for (i = 0; i < npes; i++)
+           {
+             if (i == self)
+               continue;
+             MPI_Wait (&request[i], &status);
+           }
+
+       }
+      MPI_Barrier (MPI_COMM_WORLD);
+      secs += MPI_Wtime ();
+
+      if (self == 0)
+       {
+         secs = secs / (double) NUM_RUNS;
+         printf ( "length = %d ints\n", size );
+         fflush(stdout);
+/*
+         printf ("%f\n",
+                 (double) (size * sizeof (int) * (npes - 1)) /
+                   (secs * 1024.0 * 1024.0));
+ */
+       }
+    }
+  MPI_Finalize();
+  return (0);
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendmany.std b/teshsuite/smpi/mpich-test/pt2pt/sendmany.std
new file mode 100644 (file)
index 0000000..87eabe0
--- /dev/null
@@ -0,0 +1,15 @@
+You requested to use 8 processes, but there is only 5 processes in your hostfile...
+length = 1 ints
+length = 2 ints
+length = 4 ints
+length = 8 ints
+length = 16 ints
+length = 32 ints
+length = 64 ints
+length = 128 ints
+length = 256 ints
+length = 512 ints
+length = 1024 ints
+length = 2048 ints
+length = 4096 ints
+length = 8192 ints
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendorder.c b/teshsuite/smpi/mpich-test/pt2pt/sendorder.c
new file mode 100644 (file)
index 0000000..e6e3f08
--- /dev/null
@@ -0,0 +1,173 @@
+/* 
+   Test ordering of messages that differ only in data
+
+   sendorder [ -n number-of-sends ] [ -m length-of-long-sends ]
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mpi.h"
+
+/* Prototypes */
+void delay( int );
+void CheckStatus( MPI_Status *, int, int, int, int * );
+
+/* 
+   This is a delay to make sure that several messages are in the queue when 
+   the MPI_Recv is called
+
+   10ms delay for now.
+*/
+void delay( int ms )
+{
+  double  deltat = ms * 0.001;
+  MPI_Wtime();
+  //while (MPI_Wtime() - t < deltat) ;
+  sleep(deltat);
+}
+
+void CheckStatus( MPI_Status *status, int tag, int src, int cnt, int *err )
+{
+  int n;
+  
+  if (status->MPI_TAG != tag && status->MPI_SOURCE != src) { 
+    if (*err < 10) {
+      fprintf( stdout, 
+       "Error in message status! tag = %d and source = %d\n", status->MPI_TAG, 
+                  status->MPI_SOURCE );
+       }
+    (void)*err++;
+  }
+  MPI_Get_count( status, MPI_INT, &n );
+  if (n != cnt) {
+    if (*err < 10) {
+      fprintf( stdout, 
+       "Error in message status!  length is %d and should be %d\n", n, cnt );
+    }
+    (void)*err++;
+  }
+}
+
+int main( int argc, char *argv[] )
+{
+  int i, n, m, val, *buf;
+  MPI_Status status;
+  int src, dest, tag, err = 0, toterr;
+  int rank, size;
+  MPI_Comm comm;
+
+  MPI_Init( &argc, &argv );
+
+  n    = 1000;    /* Number of tests */
+  comm = MPI_COMM_WORLD;
+  tag  = 3;
+  m    = 1000;    /* Size in ints of longer buffer */
+
+  /* Check for options
+   */
+  argc--; argv++;
+  while (argc > 0) {
+    if (argv[0] && strcmp( argv[0], "-n" ) == 0) {
+      argc++;
+      n = atoi( argv[0] );
+    }
+    else if (argv[0] && strcmp( argv[0], "-m" ) == 0) {
+      argc++;
+      m = atoi( argv[0] );
+    }
+    argc--; argv++;
+  }
+  /* Ensure that everyone has the values */
+  MPI_Bcast( &n, 1, MPI_INT, 0, MPI_COMM_WORLD );
+  MPI_Bcast( &m, 1, MPI_INT, 0, MPI_COMM_WORLD );
+
+  MPI_Comm_rank( comm, &rank );
+  MPI_Comm_size( comm, &size );
+  if (size < 2) {
+    fprintf( stderr, "This program requires at least 2 processes\n" );
+    MPI_Abort( MPI_COMM_WORLD, 1 );
+  }
+  src  = 0;
+  dest = size - 1;
+
+  /* Single Int */
+  MPI_Barrier( comm );
+  if (rank == src) {
+    for (i=0; i<n; i++) {
+      MPI_Send( &i, 1, MPI_INT, dest, tag, comm );
+    }
+  }
+  else if (rank == dest) {
+    for (i=0; i<n; i++) {
+      delay( 10 );
+      MPI_Recv( &val, 1, MPI_INT, src, tag, comm, &status );
+      /* The messages are sent in order that matches the value of i; 
+        if they are not received in order, this will show up in the
+        value here */
+      if (val != i) { 
+       if (err < 10) {
+         fprintf( stdout, 
+   "Error in message order (single int): message %d received when %d expected\n", val, i );
+       }
+       err++;
+      }
+      CheckStatus( &status, tag, src, 1, &err );
+    }
+  }
+
+  /* Alternating message sizes */
+  buf = (int *)malloc( m * sizeof(int) );
+  if (!buf) {
+    fprintf( stdout, "Could not allocate %d ints\n", m );
+    MPI_Abort( MPI_COMM_WORLD, 1 );
+  }
+  for (i=0; i<m; i++) buf[i] = - i;
+
+  MPI_Barrier( comm );
+  if (rank == src) {
+    for (i=0; i<n; i++) {
+      buf[0] = i;
+      MPI_Send( &i, 1, MPI_INT, dest, tag, comm );
+      MPI_Send( buf, m, MPI_INT, dest, tag, comm );
+    }
+  }
+  else if (rank == dest) {
+    for (i=0; i<n; i++) {
+      delay( 10 );
+      MPI_Recv( &val, 1, MPI_INT, src, tag, comm, &status );
+      if (val != i) { 
+       if (err < 10) {
+         fprintf( stdout, 
+   "Error in message order: message %d received when %d expected\n", val, i );
+       }
+       err++;
+      }
+      CheckStatus( &status, tag, src, 1, &err );
+
+      MPI_Recv( buf, m, MPI_INT, src, tag, comm, &status );
+      if (buf[0] != i) { 
+       if (err < 10) {
+         fprintf( stdout, 
+   "Error in message order: message buf[] %d received when %d expected\n", 
+                  buf[0], i );
+       }
+       err++;
+      }
+      CheckStatus( &status, tag, src, m, &err );
+    }
+  }
+  
+  /* Finally error reporting: make sure that rank 0 reports the message */
+  MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+  MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+  if (rank == 0) {
+    if (toterr) printf( "Found %d errors\n", toterr );
+    else        printf( " No Errors\n" );
+  }
+
+  MPI_Barrier( MPI_COMM_WORLD );
+  MPI_Finalize();
+  return 0;
+}
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendrecv.c b/teshsuite/smpi/mpich-test/pt2pt/sendrecv.c
new file mode 100644 (file)
index 0000000..9c592b0
--- /dev/null
@@ -0,0 +1,634 @@
+/* 
+ * Program to test all of the features of MPI_Send and MPI_Recv
+ *
+ * *** What is tested? ***
+ * 1. Sending and receiving all basic types and many sizes - check
+ * 2. Tag selectivity - check
+ * 3. Error return codes for
+ *    a. Invalid Communicator
+ *    b. Invalid destination or source
+ *    c. Count out of range
+ *    d. Invalid type
+ *
+ * Define VERBOSE to get noisier output
+ */
+
+#include "test.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mpi.h"
+
+#ifdef HAVE_MPICHCONF_H
+#include "mpichconf.h"
+#endif
+
+static int src = 1;
+static int dest = 0;
+
+static int do_test1 = 1;
+static int do_test2 = 1;
+static int do_test3 = 1;
+
+static int verbose = 0;
+
+#define MAX_TYPES 13
+static int ntypes = 0;
+static int nolongdouble = 0;
+static MPI_Datatype BasicTypes[MAX_TYPES];
+
+static int maxbufferlen = 10000;
+static char *(BasicNames[MAX_TYPES]);
+
+/* In order to quiet noisy C compilers, we provide ANSI-style prototypes
+   where possible */
+
+void AllocateBuffers ( void **, MPI_Datatype *, int, int );
+void FreeBuffers ( void **, int );
+void FillBuffers ( void **, MPI_Datatype *, int, int );
+int CheckBuffer ( void *, MPI_Datatype, int );
+void SetupBasicTypes (void);
+void SenderTest1 (void);
+void ReceiverTest1 (void);
+void SenderTest2 (void);
+void ReceiverTest2 (void);
+void SenderTest3 (void);
+void ReceiverTest3 (void);
+
+void 
+AllocateBuffers(bufferspace, buffertypes, num_types, bufferlen)
+    void **bufferspace;
+    MPI_Datatype *buffertypes;
+    int num_types;
+    int bufferlen;
+{
+    int i;
+    for (i = 0; i < ntypes; i++) {
+       if (buffertypes[i] == MPI_CHAR)
+           bufferspace[i] = malloc(bufferlen * sizeof(char));
+       else if (buffertypes[i] == MPI_SHORT)
+           bufferspace[i] = malloc(bufferlen * sizeof(short));
+       else if (buffertypes[i] == MPI_INT)
+           bufferspace[i] = malloc(bufferlen * sizeof(int));
+       else if (buffertypes[i] == MPI_LONG)
+           bufferspace[i] = malloc(bufferlen * sizeof(long));
+       else if (buffertypes[i] == MPI_UNSIGNED_CHAR)
+           bufferspace[i] = malloc(bufferlen * sizeof(unsigned char));
+       else if (buffertypes[i] == MPI_UNSIGNED_SHORT)
+           bufferspace[i] = malloc(bufferlen * sizeof(unsigned short));
+       else if (buffertypes[i] == MPI_UNSIGNED)
+           bufferspace[i] = malloc(bufferlen * sizeof(unsigned int));
+       else if (buffertypes[i] == MPI_UNSIGNED_LONG)
+           bufferspace[i] = malloc(bufferlen * sizeof(unsigned long));
+       else if (buffertypes[i] == MPI_FLOAT)
+           bufferspace[i] = malloc(bufferlen * sizeof(float));
+       else if (buffertypes[i] == MPI_DOUBLE)
+           bufferspace[i] = malloc(bufferlen * sizeof(double));
+#if defined(HAVE_LONG_DOUBLE) && !defined(HAS_XDR) 
+       else if (buffertypes[i] == MPI_LONG_DOUBLE) {
+           int dlen;
+           MPI_Type_size( MPI_LONG_DOUBLE, &dlen );
+           bufferspace[i] = malloc(bufferlen * dlen);
+       }
+#endif
+#if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR)
+       else if (buffertypes[i] == MPI_LONG_LONG_INT) 
+           bufferspace[i] = malloc(bufferlen * sizeof(long long) );
+#endif
+       else if (buffertypes[i] == MPI_BYTE)
+           bufferspace[i] = malloc(bufferlen * sizeof(unsigned char));
+    }
+}
+
+void FreeBuffers(void **buffers, int nbuffers)
+{
+    int i;
+    for (i = 0; i < nbuffers; i++)
+       free(buffers[i]);
+}
+
+void FillBuffers(bufferspace, buffertypes, num_types, bufferlen)
+    void **bufferspace; 
+    MPI_Datatype *buffertypes;
+    int num_types;
+    int bufferlen;
+{
+    int i, j;
+    for (i = 0; i < ntypes; i++) {
+       for (j = 0; j < bufferlen; j++) {
+           if (buffertypes[i] == MPI_CHAR)
+               ((char *)bufferspace[i])[j] = (char)(j & 0x7f);
+           else if (buffertypes[i] == MPI_SHORT)
+               ((short *)bufferspace[i])[j] = (short)j;
+           else if (buffertypes[i] == MPI_INT)
+               ((int *)bufferspace[i])[j] = (int)j;
+           else if (buffertypes[i] == MPI_LONG)
+               ((long *)bufferspace[i])[j] = (long)j;
+           else if (buffertypes[i] == MPI_UNSIGNED_CHAR)
+               ((unsigned char *)bufferspace[i])[j] = (unsigned char)j;
+           else if (buffertypes[i] == MPI_UNSIGNED_SHORT)
+               ((unsigned short *)bufferspace[i])[j] = (unsigned short)j;
+           else if (buffertypes[i] == MPI_UNSIGNED)
+               ((unsigned int *)bufferspace[i])[j] = (unsigned int)j;
+           else if (buffertypes[i] == MPI_UNSIGNED_LONG)
+               ((unsigned long *)bufferspace[i])[j] = (unsigned long)j;
+           else if (buffertypes[i] == MPI_FLOAT)
+               ((float *)bufferspace[i])[j] = (float)j;
+           else if (buffertypes[i] == MPI_DOUBLE)
+               ((double *)bufferspace[i])[j] = (double)j;
+#if defined(HAVE_LONG_DOUBLE) && !defined(HAS_XDR) 
+           else if (buffertypes[i] == MPI_LONG_DOUBLE)
+               ((long double *)bufferspace[i])[j] = (long double)j;
+#endif
+#if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR) 
+           else if (buffertypes[i] == MPI_LONG_LONG_INT)
+               ((long long *)bufferspace[i])[j] = (long long)j;
+#endif
+           else if (buffertypes[i] == MPI_BYTE)
+               ((unsigned char *)bufferspace[i])[j] = (unsigned char)j;
+       }
+    }
+}
+
+int
+CheckBuffer(bufferspace, buffertype, bufferlen)
+    void *bufferspace; 
+    MPI_Datatype buffertype; 
+    int bufferlen;
+{
+    int j;
+    char valerr[256];
+    valerr[0] = 0;
+    for (j = 0; j < bufferlen; j++) {
+       if (buffertype == MPI_CHAR) {
+           if (((char *)bufferspace)[j] != (char)(j & 0x7f)) {
+               sprintf( valerr, "%x != %x", 
+                       ((char *)bufferspace)[j], (char)(j&0x7f) );
+               break;
+               }
+       } else if (buffertype == MPI_SHORT) {
+           if (((short *)bufferspace)[j] != (short)j) {
+               sprintf( valerr, "%d != %d", 
+                       ((short *)bufferspace)[j], (short)j );
+               break;
+               }
+       } else if (buffertype == MPI_INT) {
+           if (((int *)bufferspace)[j] != (int)j) {
+               sprintf( valerr, "%d != %d", 
+                       ((int *)bufferspace)[j], (int)j );
+               break;
+               }
+       } else if (buffertype == MPI_LONG) {
+           if (((long *)bufferspace)[j] != (long)j) {
+               break;
+               }
+       } else if (buffertype == MPI_UNSIGNED_CHAR) {
+           if (((unsigned char *)bufferspace)[j] != (unsigned char)j) {
+               break;
+               }
+       } else if (buffertype == MPI_UNSIGNED_SHORT) {
+           if (((unsigned short *)bufferspace)[j] != (unsigned short)j) {
+               break;
+               }
+       } else if (buffertype == MPI_UNSIGNED) {
+           if (((unsigned int *)bufferspace)[j] != (unsigned int)j) {
+               break;
+               }
+       } else if (buffertype == MPI_UNSIGNED_LONG) {
+           if (((unsigned long *)bufferspace)[j] != (unsigned long)j) {
+               break;
+               }
+       } else if (buffertype == MPI_FLOAT) {
+           if (((float *)bufferspace)[j] != (float)j) {
+               break;
+               }
+       } else if (buffertype == MPI_DOUBLE) {
+           if (((double *)bufferspace)[j] != (double)j) {
+               break;
+               }
+#if defined(HAVE_LONG_DOUBLE) && !defined(HAS_XDR) 
+       } else if (buffertype == MPI_LONG_DOUBLE) {
+           if (((long double *)bufferspace)[j] != (long double)j) {
+               break;
+               }
+#endif
+#if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR) 
+       } else if (buffertype == MPI_LONG_LONG_INT) {
+           if (((long long *)bufferspace)[j] != (long long)j) {
+               break;
+               }
+#endif
+       } else if (buffertype == MPI_BYTE) {
+           if (((unsigned char *)bufferspace)[j] != (unsigned char)j) {
+               break;
+               }
+       }
+    }
+    /* Return +1 so an error in the first location is > 0 */
+    if (j < bufferlen) {
+       if (valerr[0]) fprintf( stderr, "Different value[%d] = %s\n", 
+                               j, valerr );
+       else
+           fprintf( stderr, "Different value[%d]\n", j );
+       return j+1;
+       }
+    return 0;
+}
+
+void 
+SetupBasicTypes()
+{
+    BasicTypes[0] = MPI_CHAR;        BasicNames[0] = (char*)"MPI_CHAR" ;
+    BasicTypes[1] = MPI_SHORT;       BasicNames[1] = (char*)"MPI_SHORT";
+    BasicTypes[2] = MPI_INT;         BasicNames[2] = (char*)"MPI_INT"  ;
+    BasicTypes[3] = MPI_LONG;        BasicNames[3] = (char*)"MPI_LONG" ;
+    BasicTypes[4] = MPI_UNSIGNED_CHAR; BasicNames[4] = (char*)"MPI_UNSIGNED_CHAR";
+    BasicTypes[5] = MPI_UNSIGNED_SHORT; BasicNames[5] = (char*)"MPI_UNSIGNED_SHORT";
+    BasicTypes[6] = MPI_UNSIGNED;    BasicNames[6] = (char*)"MPI_UNSIGNED";
+    BasicTypes[7] = MPI_UNSIGNED_LONG; BasicNames[7] = (char*)"MPI_UNSIGNED_LONG";
+    BasicTypes[8] = MPI_FLOAT;       BasicNames[8] = (char*)"MPI_FLOAT";
+    BasicTypes[9] = MPI_DOUBLE;      BasicNames[9] = (char*)"MPI_DOUBLE";
+    BasicTypes[10] = MPI_BYTE;       BasicNames[10] = (char*)"MPI_BYTE";
+    /* By making the BYTE type LAST, we make it easier to handle heterogeneous
+       systems that may not support all of the types */
+    ntypes = 11;
+#if defined (HAVE_LONG_DOUBLE) && !defined(HAS_XDR) 
+    /* This test allows us to use MPI_LONG_DOUBLE, but rely on size > 0 
+       for "actually implemented" */
+    if (!nolongdouble) { 
+       int l;
+       MPI_Type_size( MPI_LONG_DOUBLE, &l );
+       if (l > 0) {
+           BasicTypes[ntypes] = MPI_LONG_DOUBLE; 
+           BasicNames[ntypes] = (char*)"MPI_LONG_DOUBLE";
+           ntypes++;
+       }
+    }
+#endif
+#if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR)
+    BasicTypes[ntypes] = MPI_LONG_LONG_INT;
+    BasicNames[ntypes] = (char*)"MPI_LONG_LONG_INT";
+    ntypes++;
+#endif
+}
+
+void 
+SenderTest1()
+{
+    void *bufferspace[MAX_TYPES];
+    int i, j;
+
+    AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen);
+    FillBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen);
+    for (i = 0; i < ntypes; i++) {
+       MPI_Send( (void *)0, 0, BasicTypes[i], dest, 2000, MPI_COMM_WORLD );
+       for (j = 0; j < maxbufferlen; j += 500)
+           MPI_Send(bufferspace[i], j, BasicTypes[i], dest, 
+                    2000, MPI_COMM_WORLD);
+    }
+    FreeBuffers(bufferspace, ntypes);
+}
+
+void
+ReceiverTest1()
+{
+    void *bufferspace[MAX_TYPES];
+    int i, j;
+    char message[81];
+    MPI_Status Stat;
+    int dummy, passed;
+
+    AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen);
+    for (i = 0; i < ntypes; i++) {
+       passed = 1;
+       MPI_Recv( (void *)0, 0, BasicTypes[i], src, 
+                    2000, MPI_COMM_WORLD, &Stat);
+       if (Stat.MPI_SOURCE != src) {
+           fprintf(stderr, "*** Incorrect Source returned. ***\n");
+           Test_Failed(message);
+           passed = 0;
+       } else if (Stat.MPI_TAG != 2000) {      
+           fprintf(stderr, "*** Incorrect Tag returned. ***\n");           
+           Test_Failed(message);
+           passed = 0;
+       } else if (MPI_Get_count(&Stat, BasicTypes[i], &dummy) ||
+                  dummy != 0) {
+           fprintf(stderr, 
+                   "*** Incorrect Count returned, Count = %d. ***\n", 
+                   dummy);
+           Test_Failed(message);
+           passed = 0;
+           }
+       /* Try different sized messages */
+       for (j = 0; j < maxbufferlen; j += 500) {
+           MPI_Recv(bufferspace[i], j, BasicTypes[i], src, 
+                    2000, MPI_COMM_WORLD, &Stat);
+           sprintf(message, "Send-Receive Test, Type %d, Count %d",
+                   i, j);
+           if (Stat.MPI_SOURCE != src) {
+               fprintf(stderr, "*** Incorrect Source returned. ***\n");
+               Test_Failed(message);
+               passed = 0;
+           } else if (Stat.MPI_TAG != 2000) {  
+               fprintf(stderr, "*** Incorrect Tag returned. ***\n");       
+               Test_Failed(message);
+               passed = 0;
+           } else if (MPI_Get_count(&Stat, BasicTypes[i], &dummy) ||
+                      dummy != j) {
+               fprintf(stderr, 
+           "*** Incorrect Count returned, Count = %d (should be %d). ***\n", 
+                       dummy, j);
+               Test_Failed(message);
+               passed = 0;
+           } else if(CheckBuffer(bufferspace[i], BasicTypes[i], j)) {
+               fprintf(stderr, 
+              "*** Incorrect Message received (type = %d (%s), count = %d). ***\n",
+                       i, BasicNames[i], j );
+               Test_Failed(message);
+               passed = 0;
+           } 
+#ifdef VERBOSE         
+           else {
+               fprintf(stderr, 
+              "Message of count %d, type %d received correctly.\n", 
+                          j, i );
+           }
+#endif
+       }
+       sprintf(message, "Send-Receive Test, Type %d (%s)",
+               i, BasicNames[i] );
+       if (passed) 
+           Test_Passed(message);
+       else 
+           Test_Failed(message);
+    }
+    FreeBuffers(bufferspace, ntypes);
+}
+
+#define MAX_ORDER_TAG 2010
+/* Test Tag Selectivity.
+   Note that we must use non-blocking sends here, since otherwise we could 
+   deadlock waiting to receive/send the first message
+*/
+void 
+SenderTest2()
+{
+    int *buffer;
+    int i;
+    MPI_Request r[10];
+    MPI_Status  s[10];
+
+    buffer = (int *)malloc(maxbufferlen * sizeof(int));
+    for (i = 0; i < maxbufferlen; i++)
+       buffer[i] = i;
+    
+    for (i = 2001; i <= MAX_ORDER_TAG; i++)
+       MPI_Isend(buffer, maxbufferlen, MPI_INT, dest,
+                i, MPI_COMM_WORLD, &r[i-2001] );
+    
+    MPI_Waitall( MAX_ORDER_TAG-2001+1, r, s );
+    free(buffer);
+    
+    return;
+}
+
+void
+ReceiverTest2()
+{
+    int *buffer;
+    int i, j;
+    char message[81];
+    MPI_Status Stat;
+    int dummy, passed;
+    int errloc;
+
+    buffer = (int *)calloc(maxbufferlen,sizeof(int));
+    passed = 1;
+
+    for (i = MAX_ORDER_TAG; i >= 2001; i--) {
+       MPI_Recv(buffer, maxbufferlen, MPI_INT, src, 
+                i, MPI_COMM_WORLD, &Stat);
+       sprintf(message, "Tag Selectivity Test, Tag %d",
+               i);
+       if (Stat.MPI_SOURCE != src) {
+           fprintf(stderr, "*** Incorrect Source returned. ***\n");
+           Test_Failed(message);
+       } else if (Stat.MPI_TAG != i) { 
+           fprintf(stderr, "*** Incorrect Tag returned. ***\n");           
+           Test_Failed(message);
+       } else if (MPI_Get_count(&Stat, MPI_INT, &dummy) ||
+                  dummy != maxbufferlen) {
+           fprintf(stderr, 
+                   "*** Incorrect Count returned, Count = %d. ***\n", 
+                   dummy);
+           Test_Failed(message);
+       } else if((errloc = 
+                  CheckBuffer((void*)buffer, MPI_INT, maxbufferlen))) {
+           fprintf(stderr, 
+                   "*** Incorrect Message received at %d (tag=%d). ***\n",
+                   errloc-1, i);
+           Test_Failed(message);
+           passed = 0;
+       }
+       /* Clear out the buffer */
+       for (j = 0; j < maxbufferlen; j++)
+           buffer[j] = -1;
+    }
+    strncpy(message, "Tag Selectivity Test", 81);
+    if (passed)
+       Test_Passed(message);
+    else
+       Test_Failed(message);
+    free(buffer);
+    return;
+}
+
+void
+SenderTest3()
+{
+    int ibuf[10];
+
+    /* A receive test might not fail until it is triggered... */
+    MPI_Send( ibuf, 10, MPI_INT, dest, 15, MPI_COMM_WORLD);
+
+    return;
+}
+
+void
+ReceiverTest3( void )
+{
+    int buffer[20];
+    MPI_Datatype bogus_type = MPI_DATATYPE_NULL;
+    MPI_Status status;
+    int myrank;
+    int small_tag;
+/*
+    if (verbose) 
+       MPI_Errhandler_set(MPI_COMM_WORLD, TEST_ERRORS_WARN);
+    else 
+       MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN );
+*/
+    MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
+
+    if (myrank == 0 && verbose) {
+       fprintf( stderr, 
+"There should be eight error messages about invalid communicator\n\
+count argument, datatype argument, tag, rank, buffer send and buffer recv\n" );
+       }
+    if (MPI_Send(buffer, 20, MPI_INT, dest,
+                1, MPI_COMM_NULL) == MPI_SUCCESS){
+       Test_Failed("NULL Communicator Test");
+    }
+    else
+       Test_Passed("NULL Communicator Test");
+
+    if (MPI_Send(buffer, -1, MPI_INT, dest,
+                1, MPI_COMM_WORLD) == MPI_SUCCESS){
+       Test_Failed("Invalid Count Test");
+    }
+    else
+       Test_Passed("Invalid Count Test");
+
+    if (MPI_Send(buffer, 20, bogus_type, dest,
+                1, MPI_COMM_WORLD) == MPI_SUCCESS){
+       Test_Failed("Invalid Type Test");
+    }
+    else
+       Test_Passed("Invalid Type Test");
+
+    small_tag = -1;
+    if (small_tag == MPI_ANY_TAG) small_tag = -2;
+    if (MPI_Send(buffer, 20, MPI_INT, dest, 
+                small_tag, MPI_COMM_WORLD) == MPI_SUCCESS) {
+        Test_Failed("Invalid Tag Test");
+    }
+    else
+       Test_Passed("Invalid Tag Test");
+
+    /* Form a tag that is too large */
+    /*MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, (void **)&tag_ubp, &flag );
+    if (!flag) Test_Failed("Could not get tag ub!" );
+    large_tag = *tag_ubp + 1;
+    if (large_tag > *tag_ubp) {
+       if (MPI_Send(buffer, 20, MPI_INT, dest, 
+                    large_tag, MPI_COMM_WORLD) == MPI_SUCCESS) {
+           Test_Failed("Invalid Tag Test");
+           }
+       else
+           Test_Passed("Invalid Tag Test");
+    }
+*/
+    if (MPI_Send(buffer, 20, MPI_INT, 300,
+                1, MPI_COMM_WORLD) == MPI_SUCCESS) {
+       Test_Failed("Invalid Destination Test");
+    }
+    else
+       Test_Passed("Invalid Destination Test");
+
+    if (MPI_Send((void *)0, 10, MPI_INT, dest,
+                1, MPI_COMM_WORLD) == MPI_SUCCESS){
+       Test_Failed("Invalid Buffer Test (send)");
+    }
+    else
+       Test_Passed("Invalid Buffer Test (send)");
+
+    /* A receive test might not fail until it is triggered... */
+    if (MPI_Recv((void *)0, 10, MPI_INT, src,
+                15, MPI_COMM_WORLD, &status) == MPI_SUCCESS){
+       Test_Failed("Invalid Buffer Test (recv)");
+    }
+    else
+       Test_Passed("Invalid Buffer Test (recv)");
+
+    /* Just to keep things happy, see if there is a message to receive */
+    { int flag, ibuf[10];
+
+    MPI_Iprobe( src, 15, MPI_COMM_WORLD, &flag, &status );
+    if (flag) 
+       MPI_Recv( ibuf, 10, MPI_INT, src, 15, MPI_COMM_WORLD, &status );
+    }
+    MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL );
+    return;
+}
+
+/* Allow -nolongdouble to suppress long double testing */
+int main( int argc, char **argv )
+{
+    int myrank, mysize;
+    int rc, itemp, i;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
+    MPI_Comm_size(MPI_COMM_WORLD, &mysize);
+    Test_Init("sendrecv", myrank);
+    SetupBasicTypes();
+
+    if (mysize != 2) {
+       fprintf(stderr, 
+               "*** This test program requires exactly 2 processes.\n");
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    /* Get the min of the basic types */
+    itemp = ntypes;
+    MPI_Allreduce( &itemp, &ntypes, 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD );
+
+    /* dest writes out the received stats; for the output to be
+       consistant (with the final check), it should be procees 0 */
+    for (i=1; i<argc; i++) {
+       if (argv[i] && strcmp( "-alt", argv[i] ) == 0) {
+           dest = 1;
+           src  = 0;
+       } 
+       else if (argv[i] && strcmp( "-nolongdouble", argv[i] ) == 0) {
+           nolongdouble = 1;
+       }
+       else if (argv[i] && strcmp( "-test1", argv[i] ) == 0) {
+           do_test2 = do_test3 = 0;
+       }
+       else if (argv[i] && strcmp( "-test2", argv[i] ) == 0) {
+           do_test1 = do_test3 = 0;
+       }
+       else if (argv[i] && strcmp( "-test3", argv[i] ) == 0) {
+           do_test2 = do_test1 = 0;
+       }
+       else {
+           printf( "Unrecognized argument %s\n", argv[i] );
+       }
+    }
+
+    /* Turn stdout's buffering to line buffered so it mixes right with
+       stderr in output files. (hopefully) */
+    setvbuf(stdout, NULL, _IOLBF, 0);
+    setvbuf(stderr, NULL, _IOLBF, 0);
+
+    if (myrank == src) {
+       if (do_test1)
+           SenderTest1();
+       if (do_test2)
+           SenderTest2();
+       if (do_test3)
+           SenderTest3(); 
+    } else if (myrank == dest) {
+       if (do_test1)
+           ReceiverTest1();
+       if (do_test2)
+           ReceiverTest2();
+       if (do_test3) 
+           ReceiverTest3();
+    } else {
+       fprintf(stderr, "*** This program uses exactly 2 processes! ***\n");
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+    if (myrank == dest) {
+       rc = Summarize_Test_Results();
+    }
+    else {
+       rc = 0;
+    }
+    Test_Finalize();
+    Test_Waitforall( );
+    MPI_Finalize();
+    return rc;
+}
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendrecv2.c b/teshsuite/smpi/mpich-test/pt2pt/sendrecv2.c
new file mode 100644 (file)
index 0000000..afd29cb
--- /dev/null
@@ -0,0 +1,123 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "dtypes.h"
+#include "gcomm.h"
+#include "test.h"
+
+int verbose = 0;
+/*
+   This program is from mpich/tsuite/pt2pt and should be changed there only.
+   It needs gcomm and dtype from mpich/tsuite, and can be run with 
+   any number of processes > 1.
+ */
+int main( int argc, char **argv)
+{
+    MPI_Datatype *types;
+    void         **inbufs, **outbufs;
+    char         **names;
+    int          *counts, *bytesize, ntype;
+    MPI_Comm     comms[20];
+    int          ncomm = 20, rank, np, partner, tag, count;
+    int          i, j, k, err, toterr, world_rank, errloc;
+    MPI_Status   status;
+    char         *obuf;
+
+    MPI_Init( &argc, &argv );
+    
+    /* 
+     * Check for -basiconly to select only the simple datatypes
+     */
+    for (i=1; i<argc; i++) {
+       if (!argv[i]) break;
+       if (strcmp( argv[i], "-basiconly" ) == 0) {
+           BasicDatatypesOnly();
+       }
+       else if (strcmp( argv[i], "-verbose" ) == 0) {
+           verbose = 1;
+       }
+    }
+    
+    AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, 
+                    &names, &ntype );
+    GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype );
+    
+    MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+    MakeComms( comms, 20, &ncomm, 0 );
+    
+ /* Test over a wide range of datatypes and communicators */
+    err = 0;
+    for (i=0; i<ncomm; i++) {
+       if (comms[i] == MPI_COMM_NULL) continue;
+       MPI_Comm_rank( comms[i], &rank );
+       MPI_Comm_size( comms[i], &np );
+       if (np < 2) continue;
+       if (world_rank == 0 && verbose) 
+           fprintf( stdout, "Testing communicator number %d\n", i );
+       
+       tag = i;
+       for (j=0; j<ntype; j++) {
+           if (world_rank == 0 && verbose) 
+               fprintf( stdout, "Testing type %s\n", names[j] );
+           if (rank == 0) {
+               partner = np - 1;
+#if 0
+               MPIR_PrintDatatypePack( stdout, counts[j], types[j], 0, 0 );
+#endif
+               MPI_Send( inbufs[j], counts[j], types[j], partner, tag, comms[i] );
+            }
+           else if (rank == np-1) {
+               partner = 0;
+               obuf = outbufs[j];
+               for (k=0; k<bytesize[j]; k++) 
+                   obuf[k] = 0;
+               MPI_Recv( outbufs[j], counts[j], types[j], partner, tag, 
+                         comms[i], &status );
+               /* Test correct */
+               MPI_Get_count( &status, types[j], &count );
+               if (count != counts[j]) {
+                   fprintf( stderr, 
+                    "Error in counts (got %d expected %d) with type %s\n",
+                        count, counts[j], names[j] );
+                   err++;
+                }
+               if (status.MPI_SOURCE != partner) {
+                   fprintf( stderr, 
+                       "Error in source (got %d expected %d) with type %s\n",
+                        status.MPI_SOURCE, partner, names[j] );
+                   err++;
+                }
+               if ((errloc = CheckData( inbufs[j], outbufs[j], bytesize[j] ))) {
+                   char *p1, *p2;
+                   fprintf( stderr, 
+                   "Error in data with type %s (type %d on %d) at byte %d\n", 
+                            names[j], j, world_rank, errloc - 1 );
+                   p1 = (char *)inbufs[j];
+                   p2 = (char *)outbufs[j];
+                   fprintf( stderr, 
+                       "Got %x expected %x\n", p1[errloc-1], p2[errloc-1] );
+                   err++;
+#if 0
+                   MPIR_PrintDatatypeUnpack( stderr, counts[j], types[j], 
+                                             0, 0 );
+#endif
+                }
+            }
+       }
+    }
+    if (err > 0) {
+       fprintf( stderr, "%d errors on %d\n", err, rank );
+    }
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (world_rank == 0) {
+       if (toterr == 0) {
+           printf( " No Errors\n" );
+       }
+       else {
+           printf (" Found %d errors\n", toterr );
+       }
+    }
+    FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype );
+    FreeComms( comms, ncomm );
+    MPI_Finalize();
+    return err;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendrecv3.c b/teshsuite/smpi/mpich-test/pt2pt/sendrecv3.c
new file mode 100644 (file)
index 0000000..9664a63
--- /dev/null
@@ -0,0 +1,158 @@
+#include "mpi.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include "dtypes.h"
+#include "gcomm.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int verbose = 0;
+/*
+   This program is from mpich/tsuite/pt2pt and should be changed there only.
+   It needs gcomm and dtype from mpich/tsuite, and can be run with 
+   any number of processes > 1.
+
+   This version uses Pack to send a message and Unpack OR the datatype 
+   to receive it.
+ */
+int main( int argc, char **argv )
+{
+MPI_Datatype *types;
+void         **inbufs, **outbufs;
+char         **names;
+char         *packbuf, *unpackbuf;
+int          packsize, unpacksize, position;
+int          *counts, *bytesize, ntype;
+MPI_Comm     comms[20];
+int          ncomm = 20, rank, np, partner, tag, count;
+int          i, j, k, err, toterr, world_rank;
+int          errloc;
+MPI_Status   status;
+char         *obuf;
+
+MPI_Init( &argc, &argv );
+
+AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, 
+                &names, &ntype );
+GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype );
+
+MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+MakeComms( comms, 20, &ncomm, 0 );
+
+/* Test over a wide range of datatypes and communicators */
+err = 0;
+for (i=0; i<ncomm; i++) {
+    MPI_Comm_rank( comms[i], &rank );
+    MPI_Comm_size( comms[i], &np );
+    if (np < 2) continue;
+    if (world_rank == 0 && verbose) {
+       fprintf( stdout, "Testing with communicator with %d members\n", np );
+       }
+    tag = i;
+    for (j=0; j<ntype; j++) {
+       if (world_rank == 0 && verbose) 
+           fprintf( stdout, "Testing type %s\n", names[j] );
+        if (rank == 0) {
+           partner = np - 1;
+           MPI_Pack_size( counts[j], types[j], comms[i], &packsize );
+           packbuf = (char *)malloc( packsize );
+           if (!packbuf) 
+               MPI_Abort( MPI_COMM_WORLD, 1 );
+           position = 0;
+           MPI_Pack( inbufs[j], counts[j], types[j], packbuf, packsize, 
+                     &position, comms[i] );
+           /* Send twice */
+            MPI_Send( packbuf, position, MPI_PACKED, partner, tag, comms[i] );
+            MPI_Send( packbuf, position, MPI_PACKED, partner, tag, comms[i] );
+           free( packbuf );
+            }
+        else if (rank == np-1) {
+           partner = 0;
+           obuf = outbufs[j];
+           for (k=0; k<bytesize[j]; k++) 
+               obuf[k] = 0;
+           /* Receive directly */
+            MPI_Recv( outbufs[j], counts[j], types[j], partner, tag, comms[i],
+                      &status );
+            /* Test correct */
+            MPI_Get_count( &status, types[j], &count );
+            if (count != counts[j]) {
+               fprintf( stderr, 
+                       "Error in counts (got %d expected %d) with type %s\n",
+                        count, counts[j], names[j] );
+                err++;
+                }
+            if (status.MPI_SOURCE != partner) {
+               fprintf( stderr, 
+                       "Error in source (got %d expected %d) with type %s\n",
+                        status.MPI_SOURCE, partner, names[j] );
+                err++;
+                }
+            if ((errloc = CheckData( inbufs[j], outbufs[j], bytesize[j] ))) {
+               fprintf( stderr, 
+                    "Error in data at byte %d with type %s (type %d on %d)\n", 
+                        errloc - 1, names[j], j, world_rank );
+                err++;
+                }
+           /* Receive packed, then unpack */
+           MPI_Pack_size( counts[j], types[j], comms[i], &unpacksize ); 
+           unpackbuf = (char *)malloc( unpacksize );
+           if (!unpackbuf) 
+               MPI_Abort( MPI_COMM_WORLD, 1 );
+            MPI_Recv( unpackbuf, unpacksize, MPI_PACKED, partner, tag, 
+                     comms[i], &status );
+           obuf = outbufs[j];
+           for (k=0; k<bytesize[j]; k++) 
+               obuf[k] = 0;
+           position = 0;
+            MPI_Get_count( &status, MPI_PACKED, &unpacksize );
+           MPI_Unpack( unpackbuf, unpacksize, &position, 
+                       outbufs[j], counts[j], types[j], comms[i] );
+           free( unpackbuf );
+            /* Test correct */
+#ifdef FOO
+           /* Length is tricky; a correct code will have signaled an error 
+              in MPI_Unpack */
+           count = position;
+            if (count != counts[j]) {
+               fprintf( stderr, 
+               "Error in counts (got %d expected %d) with type %s (Unpack)\n",
+                        count, counts[j], names[j] );
+                err++;
+                }
+#endif
+            if (status.MPI_SOURCE != partner) {
+               fprintf( stderr, 
+               "Error in source (got %d expected %d) with type %s (Unpack)\n",
+                        status.MPI_SOURCE, partner, names[j] );
+                err++;
+                }
+            if ((errloc = CheckData( inbufs[j], outbufs[j], bytesize[j] ))) {
+               fprintf( stderr, 
+            "Error in data at byte %d with type %s (type %d on %d, Unpack)\n", 
+                       errloc - 1, names[j], j, world_rank );
+                err++;
+                }
+            }
+       }
+    }
+if (err > 0) {
+    fprintf( stderr, "%d errors on %d\n", err, rank );
+    }
+MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+ if (world_rank == 0) {
+     if (toterr == 0) {
+        printf( " No Errors\n" );
+     }
+     else {
+        printf (" Found %d errors\n", toterr );
+     }
+ }
+FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype );
+FreeComms( comms, ncomm );
+MPI_Barrier( MPI_COMM_WORLD );
+MPI_Finalize();
+return err;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendrecv4.c b/teshsuite/smpi/mpich-test/pt2pt/sendrecv4.c
new file mode 100644 (file)
index 0000000..a4e5a05
--- /dev/null
@@ -0,0 +1,175 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "dtypes.h"
+#include "gcomm.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int verbose = 0;
+/*
+   This program is from mpich/tsuite/pt2pt and should be changed there only.
+   It needs gcomm and dtype from mpich/tsuite, and can be run with 
+   any number of processes > 1.
+
+   This version sends and receives EVERYTHING from MPI_BOTTOM, by putting
+   the data into a structure.
+
+   This code isn't quite correct, since the MPI_Type_struct that is 
+   created for the type may not have the correct extent.  
+   One possible change is to make the struct type include the count, and
+   send/receive one instance of the data item.  
+
+   The GenerateData call should return extents; when the extent of the 
+   created structure doesn't match, we can at least issue an error message.
+ */
+int main( int argc, char **argv )
+{
+MPI_Datatype *types;
+void         **inbufs, **outbufs;
+char         **names;
+int          *counts, *bytesize, ntype;
+MPI_Comm     comms[20];
+int          ncomm = 20, rank, np, partner, tag, count;
+int          i, j, k, err, toterr, world_rank, errloc;
+MPI_Status   status;
+char         *obuf;
+MPI_Datatype offsettype;
+int          blen;
+MPI_Aint     displ, extent, natural_extent;
+
+MPI_Init( &argc, &argv );
+
+AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, 
+                &names, &ntype );
+GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype );
+
+MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+MakeComms( comms, 20, &ncomm, 0 );
+
+/* Test over a wide range of datatypes and communicators */
+err = 0;
+for (i=0; i<ncomm; i++) {
+    MPI_Comm_rank( comms[i], &rank );
+    MPI_Comm_size( comms[i], &np );
+    if (np < 2) continue;
+    tag = i;
+    for (j=0; j<ntype; j++) {
+       if (world_rank == 0 && verbose) 
+           fprintf( stdout, "Testing type %s\n", names[j] );
+        if (rank == 0) {
+           MPI_Address( inbufs[j], &displ );
+           blen = 1;
+           MPI_Type_struct( 1, &blen, &displ, types + j, &offsettype );
+           MPI_Type_commit( &offsettype );
+           /* Warning: if the type has an explicit MPI_UB, then using a
+              simple shift of the offset won't work.  For now, we skip
+              types whose extents are negative; the correct solution is
+              to add, where required, an explicit MPI_UB */
+           MPI_Type_extent( offsettype, &extent );
+           if (extent < 0) {
+               if (world_rank == 0) 
+                   fprintf( stdout, 
+                       "... skipping (appears to have explicit MPI_UB\n" );
+               MPI_Type_free( &offsettype );
+               continue;
+               }
+           MPI_Type_extent( types[j], &natural_extent );
+           if (natural_extent != extent) {
+               MPI_Type_free( &offsettype );
+               continue;
+           }
+           partner = np - 1;
+#if 0
+               MPIR_PrintDatatypePack( stdout, counts[j], offsettype, 
+                                         0, 0 );
+#endif
+            MPI_Send( MPI_BOTTOM, counts[j], offsettype, partner, tag, 
+                     comms[i] );
+           MPI_Type_free( &offsettype );
+            }
+        else if (rank == np-1) {
+           partner = 0;
+           obuf = outbufs[j];
+           for (k=0; k<bytesize[j]; k++) 
+               obuf[k] = 0;
+           MPI_Address( outbufs[j], &displ );
+           blen = 1;
+           MPI_Type_struct( 1, &blen, &displ, types + j, &offsettype );
+           MPI_Type_commit( &offsettype );
+           /* Warning: if the type has an explicit MPI_UB, then using a
+              simple shift of the offset won't work.  For now, we skip
+              types whose extents are negative; the correct solution is
+              to add, where required, an explicit MPI_UB */
+           MPI_Type_extent( offsettype, &extent );
+           if (extent < 0) {
+               MPI_Type_free( &offsettype );
+               continue;
+               }
+           MPI_Type_extent( types[j], &natural_extent );
+           if (natural_extent != extent) {
+               MPI_Type_free( &offsettype );
+               continue;
+           }
+            MPI_Recv( MPI_BOTTOM, counts[j], offsettype, 
+                    partner, tag, comms[i], &status );
+            /* Test correct */
+            MPI_Get_count( &status, types[j], &count );
+            if (count != counts[j]) {
+               fprintf( stderr, 
+                       "Error in counts (got %d expected %d) with type %s\n",
+                        count, counts[j], names[j] );
+                err++;
+                }
+            if (status.MPI_SOURCE != partner) {
+               fprintf( stderr, 
+                       "Error in source (got %d expected %d) with type %s\n",
+                        status.MPI_SOURCE, partner, names[j] );
+                err++;
+                }
+            if ((errloc = CheckData( inbufs[j], outbufs[j], bytesize[j] ))) {
+               fprintf( stderr, 
+                  "Error in data with type %s (type %d on %d) at byte %d\n", 
+                        names[j], j, world_rank, errloc - 1 );
+               if (err < 10) {
+                   /* Give details on only the first 10 errors */
+                   unsigned char *in_p = (unsigned char *)inbufs[j],
+                       *out_p = (unsigned char *)outbufs[j];
+                   int jj;
+                   jj = errloc - 1;
+                   jj &= 0xfffffffc; /* lop off a few bits */ 
+                   in_p += jj;
+                   out_p += jj;
+                   fprintf( stderr, "%02x%02x%02x%02x should be %02x%02x%02x%02x\n",
+                            out_p[0], out_p[1], out_p[2], out_p[3],
+                            in_p[0], in_p[1], in_p[2], in_p[3] );
+               }
+                err++;
+#if 0
+               MPIR_PrintDatatypeUnpack( stdout, counts[j], offsettype, 
+                                         0, 0 );
+#endif
+                }
+           MPI_Type_free( &offsettype );
+            }
+       }
+    }
+if (err > 0) {
+    fprintf( stderr, "%d errors on %d\n", err, rank );
+    }
+MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+ if (world_rank == 0) {
+     if (toterr == 0) {
+        printf( " No Errors\n" );
+     }
+     else {
+        printf (" Found %d errors\n", toterr );
+     }
+ }
+
+FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype );
+FreeComms( comms, ncomm );
+MPI_Finalize();
+return err;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sixth.c b/teshsuite/smpi/mpich-test/pt2pt/sixth.c
new file mode 100644 (file)
index 0000000..5f56e6e
--- /dev/null
@@ -0,0 +1,114 @@
+#include <stdio.h>
+#include "mpi.h"
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#else
+extern char *malloc();
+#endif
+#include "test.h"
+
+typedef struct _table {
+  int references;
+  int length;
+  int *value;
+} Table;
+
+/* Prototypes for picky compilers */
+int copy_table ( MPI_Comm, int, void *, void *, void *, int * );
+void create_table ( int, int *, Table ** );
+int delete_table ( MPI_Comm, int, void *, void * );
+
+/* These are incorrect...*/
+int copy_table ( MPI_Comm oldcomm, int keyval, void *extra_state, 
+                void *attr_in, void *attr_out, int *flag)
+{
+  Table *table = (Table *)attr_in;;
+
+  table->references++;
+  (*(void **)attr_out) = attr_in;
+  (*flag) = 1;
+  (*(int *)extra_state)++;
+  return (MPI_SUCCESS);
+}
+
+void create_table ( int num, int *values, Table **table_out )
+{
+  int i;
+  (*table_out) = (Table *)malloc(sizeof(Table));
+  (*table_out)->references = 1;
+  (*table_out)->length = num;
+  (*table_out)->value = (int *)malloc(sizeof(int)*num);
+  for (i=0;i<num;i++) 
+    (*table_out)->value[i] = values[i];
+}
+
+int delete_table ( MPI_Comm comm, int keyval, 
+                  void *attr_val, void *extra_state)
+{
+  Table *table = (Table *)attr_val;
+
+  if ( table->references == 1 )
+       free(table);
+  else
+       table->references--;
+  (*(int *)extra_state)--;
+  return MPI_SUCCESS;
+}
+
+int main ( int argc, char **argv )
+{
+  int rank, size;
+  Table *table;
+  MPI_Comm new_comm;
+  int table_key;
+  int values[3]; 
+  int table_copies = 1;
+  int found;
+  int errors = 0;
+
+  MPI_Init ( &argc, &argv );
+  MPI_Comm_rank ( MPI_COMM_WORLD, &rank );
+  MPI_Comm_size ( MPI_COMM_WORLD, &size );
+
+  values[0] = 1; values[1] = 2; values[2] = 3;
+  create_table(3,values,&table);
+  
+  MPI_Keyval_create ( copy_table, delete_table, &table_key, 
+                     (void *)&table_copies );
+  MPI_Attr_put ( MPI_COMM_WORLD, table_key, (void *)table );
+  MPI_Comm_dup ( MPI_COMM_WORLD, &new_comm );
+  MPI_Attr_get ( new_comm, table_key, (void **)&table, &found );
+
+  if (!found) {
+      printf( "did not find attribute on new comm\n" );
+      errors++;
+  }
+
+  if ((table_copies != 2) && (table->references != 2)) {
+      printf( "table_copies != 2 (=%d) and table->references != 2 (=%d)\n",
+             table_copies, table->references );
+      errors++;
+  }
+
+  MPI_Comm_free ( &new_comm );
+
+  if ((table_copies != 1) && (table->references != 1)) {
+      printf( "table_copies != 1 (=%d) and table->references != 1 (=%d)\n",
+             table_copies, table->references );
+      errors++;
+  }
+
+  MPI_Attr_delete ( MPI_COMM_WORLD, table_key );
+
+  if ( table_copies != 0 ) {
+      printf( "table_copies != 0 (=%d)\n", table_copies );
+      errors++;
+  }
+  if (errors)
+    printf("[%d] OOPS.  %d errors!\n",rank,errors);
+
+  MPI_Keyval_free ( &table_key );
+  Test_Waitforall( );
+  MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sndrcv.c b/teshsuite/smpi/mpich-test/pt2pt/sndrcv.c
new file mode 100644 (file)
index 0000000..9323ccc
--- /dev/null
@@ -0,0 +1,138 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "dtypes.h"
+#include "gcomm.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int verbose = 0;
+/*
+   This program is from mpich/tsuite/pt2pt and should be changed there only.
+   It needs gcomm and dtype from mpich/tsuite, and can be run with 
+   any number of processes > 1.
+
+   This version uses sendrecv and sendrecv_replace (but only in the
+   head-to-head mode).
+ */
+int main( int argc, char **argv )
+{
+MPI_Datatype *types;
+void         **inbufs, **outbufs;
+char         **names;
+int          *counts, *bytesize, ntype;
+MPI_Comm     comms[20];
+int          ncomm = 20, rank, np, partner=0, tag, count;
+int          i, j, k, err, toterr, world_rank, errloc;
+MPI_Status   status;
+char         *obuf, *ibuf;
+
+MPI_Init( &argc, &argv );
+
+AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, 
+                &names, &ntype );
+GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype );
+
+MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+MakeComms( comms, 20, &ncomm, 0 );
+
+/* Test over a wide range of datatypes and communicators */
+err = 0;
+for (i=0; i<ncomm; i++) {
+    MPI_Comm_rank( comms[i], &rank );
+    MPI_Comm_size( comms[i], &np );
+    if (np < 2) continue;
+    tag = i;
+    if (rank == 0) 
+       partner = np - 1;
+    if (rank == np - 1)
+       partner = 0;
+    for (j=0; j<ntype; j++) {
+       if (world_rank == 0 && verbose) 
+           fprintf( stdout, "Testing type %s\n", names[j] );
+        if (rank == 0 || rank == np - 1) {
+           obuf = outbufs[j];
+           for (k=0; k<bytesize[j]; k++) 
+               obuf[k] = 0;
+           MPI_Sendrecv( inbufs[j], counts[j], types[j], partner, tag, 
+                         outbufs[j], counts[j], types[j], partner, tag, 
+                         comms[i], &status );
+            /* Test correct */
+            MPI_Get_count( &status, types[j], &count );
+            if (count != counts[j]) {
+               fprintf( stderr, 
+                       "Error in counts (got %d expected %d) with type %s\n",
+                        count, counts[j], names[j] );
+                err++;
+                }
+            if (status.MPI_SOURCE != partner) {
+               fprintf( stderr, 
+                       "Error in source (got %d expected %d) with type %s\n",
+                        status.MPI_SOURCE, partner, names[j] );
+                err++;
+                }
+            if ((errloc = CheckData( inbufs[j], outbufs[j], bytesize[j] ))) {
+               char *p1, *p2;
+               fprintf( stderr, 
+                  "Error in data with type %s (type %d on %d) at byte %d\n", 
+                        names[j], j, world_rank, errloc - 1 );
+               p1 = (char *)inbufs[j];
+               p2 = (char *)outbufs[j];
+               fprintf( stderr, 
+                       "Got %x expected %x\n", p1[errloc-1], p2[errloc-1] );
+                err++;
+                }
+           /* Now do sendrecv_replace */
+           obuf = outbufs[j];
+           ibuf = inbufs[j];
+           for (k=0; k<bytesize[j]; k++) 
+               obuf[k] = ibuf[k];
+           /* This would be a better test if the data was different... */
+           MPI_Sendrecv_replace( obuf, counts[j], types[j], partner, tag, 
+                                 partner, tag, comms[i], &status );
+            /* Test correct */
+            MPI_Get_count( &status, types[j], &count );
+            if (count != counts[j]) {
+               fprintf( stderr, 
+                       "Error in counts (got %d expected %d) with type %s\n",
+                        count, counts[j], names[j] );
+                err++;
+                }
+            if (status.MPI_SOURCE != partner) {
+               fprintf( stderr, 
+                       "Error in source (got %d expected %d) with type %s\n",
+                        status.MPI_SOURCE, partner, names[j] );
+                err++;
+                }
+            if ((errloc = CheckData( inbufs[j], outbufs[j], bytesize[j] ))) {
+               char *p1, *p2;
+               fprintf( stderr, 
+                  "Error in data with type %s (type %d on %d) at byte %d\n", 
+                        names[j], j, world_rank, errloc - 1 );
+               p1 = (char *)inbufs[j];
+               p2 = (char *)outbufs[j];
+               fprintf( stderr, 
+                       "Got %x expected %x\n", p1[errloc-1], p2[errloc-1] );
+                err++;
+                }
+            }
+       }
+    }
+if (err > 0) {
+    fprintf( stderr, "%d errors on %d\n", err, rank );
+    }
+MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+ if (world_rank == 0) {
+     if (toterr == 0) {
+        printf( " No Errors\n" );
+     }
+     else {
+        printf (" Found %d errors\n", toterr );
+     }
+ }
+FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype );
+FreeComms( comms, ncomm );
+MPI_Finalize();
+return err;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sndrcvrep.c b/teshsuite/smpi/mpich-test/pt2pt/sndrcvrep.c
new file mode 100644 (file)
index 0000000..87b5999
--- /dev/null
@@ -0,0 +1,68 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int main( int argc, char **argv )
+{
+    MPI_Status   status;
+    int          count, dest, source, sendtag, recvtag, len, rc;
+    int          rank, size, errcnt = 0;
+    MPI_Comm     comm;
+    int          *buf;
+    MPI_Datatype dtype;
+    MPI_Init( &argc, &argv );
+
+    MPI_Comm_dup( MPI_COMM_WORLD, &comm );
+    MPI_Errhandler_set( comm, MPI_ERRORS_RETURN );
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    /* Check recoverable errors */
+    if (rank == 0) {
+       rc = MPI_Sendrecv_replace( (char *)0, 1, MPI_INT, 0, 0,
+                                  0, 0, comm, &status );
+       if (!rc) {
+           errcnt++;
+           fprintf( stderr, "Failed to detect null buffer\n" );
+       }
+       buf = 0; /* Give buf a value before use */
+       rc = MPI_Sendrecv_replace( buf, 1, MPI_DATATYPE_NULL, 0,
+                                  0, 0, 0, comm, &status );
+       if (!rc) {
+           errcnt++;
+           fprintf( stderr, "Failed to detect null datatype\n" );
+       }
+       /* Could be others */
+    }
+
+    /* Check non-contiguous datatypes */
+    MPI_Type_vector( 1, 1, 10, MPI_INT, &dtype );
+    MPI_Type_commit( &dtype );
+
+    buf    = (int *)malloc( 10 * 10 * sizeof(int) );
+    dest   = (rank + 1) % size;
+    source = (rank + size - 1) % size;
+
+    count   = 0;
+    sendtag = 1;
+    recvtag = 1;
+    MPI_Sendrecv_replace( buf, count, dtype, dest, 
+                         sendtag, source, recvtag, MPI_COMM_WORLD, &status );
+    MPI_Get_count( &status, dtype, &len );
+    if (len != 0) {
+       errcnt ++;
+       fprintf( stderr, "Computed %d for count, should be %d\n", len, 0 );
+    }
+    
+    MPI_Type_free( &dtype );
+    MPI_Comm_free( &comm );
+    if (rank == 0) {
+       printf( "Completed test of MPI_Sendrecv_replace\n" );
+    }
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sndrcvrep.std b/teshsuite/smpi/mpich-test/pt2pt/sndrcvrep.std
new file mode 100644 (file)
index 0000000..b001334
--- /dev/null
@@ -0,0 +1 @@
+Completed test of MPI_Sendrecv_replace
diff --git a/teshsuite/smpi/mpich-test/pt2pt/sndrcvrpl2.c b/teshsuite/smpi/mpich-test/pt2pt/sndrcvrpl2.c
new file mode 100644 (file)
index 0000000..fdb5c81
--- /dev/null
@@ -0,0 +1,64 @@
+
+/* 
+ * Based on a program from James Clippinger (james@cs.dartmouth.edu), 
+ * http://www.cs.dartmouth.edu/~james/.
+ *
+ */
+#include "test.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include "mpi.h"
+
+int main( int argc, char **argv )
+{
+    MPI_Status status;
+    int count, rank, size,  dest, source, i, err = 0, toterr;
+    long *buf;
+
+    /* Initialize MPI and get my rank and total number of
+       processors */
+    
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    /* Send-receive-replace the buffer */
+    count  = 1 << 14;
+    buf    = (long *)malloc( count * sizeof(long) );
+    for (i=0; i<count; i++)
+       buf[i] = rank + size*i;
+    dest   = (rank + 1) % size;
+    source = (rank + size - 1) % size;
+
+/*
+    fprintf(stderr, "Proc %d: About to SRR, dest proc %d, source proc 
+%d\n",
+           rank, dest, source);
+ */
+    MPI_Sendrecv_replace( buf, count, MPI_LONG, dest, 
+                          1, source, 1, MPI_COMM_WORLD, &status );
+
+    for (i=0; i<count; i++) {
+       if (buf[i] != source + size*i) {
+           if (err++ > 10) break;
+           printf( "Received %ld in buf[%d]; expected %d\n",
+                   buf[i], i, source + size*i );
+       }
+    }
+/*
+    fprintf(stderr, "Done with SRR on proc %d\n", rank);
+ */
+
+    /* Finalize everything */
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (rank == 0) {
+       if (toterr == 0) 
+           printf( " No Errors\n" );
+       else
+           printf( "Test failed with %d errors!\n", toterr );
+    }
+    free( buf );
+    
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/ssendtest.c b/teshsuite/smpi/mpich-test/pt2pt/ssendtest.c
new file mode 100644 (file)
index 0000000..6de2ca9
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * Program to test that the "synchronous send" semantics
+ * of point to point communications in MPI is (probably) satisfied. 
+ * Two messages are send in one order; the destination uses MPI_Iprobe
+ * to look for the SECOND message before doing a receive on the first.
+ * To give a finite-termination, a fixed amount of time is used for
+ * the Iprobe test.
+ *
+ * This program has been patterned off of "overtake.c"
+ *
+ *                             William Gropp
+ *                             gropp@mcs.anl.gov
+ */
+
+#include <stdio.h>
+#include "test.h"
+#include "mpi.h"
+
+#define SIZE 10000
+/* Amount of time in seconds to wait for the receipt of the second Ssend
+   message */
+#define MAX_TIME 10
+static int src  = 0;
+static int dest = 1;
+
+/* Prototypes for picky compilers */
+void Generate_Data ( int *, int );
+
+void Generate_Data( int *buffer, int buff_size)
+{
+    int i;
+
+    for (i = 0; i < buff_size; i++)
+       buffer[i] = i+1;
+}
+
+int main( int argc, char **argv)
+{
+    int rank; /* My Rank (0 or 1) */
+    int act_size = 0;
+    int flag, np, rval, i;
+    int buffer[SIZE];
+    double t0;
+    char *Current_Test = NULL;
+    MPI_Status status, status1, status2;
+    int count1, count2;
+    int sizes[4];
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size( MPI_COMM_WORLD, &np );
+    if (np != 2) {
+        fprintf(stderr, "*** This program uses exactly 2 processes! ***\n");
+        MPI_Abort( MPI_COMM_WORLD, 1 );
+        }
+
+    sizes[0] = 0;
+    sizes[1] = 1;
+    sizes[2] = 1000;
+    sizes[3] = SIZE;
+/*    for (i = 0; i < 4; i++ ) { */
+    for (i = 1; i < 2; i++ ) {
+       act_size = sizes[i];
+        if (rank == src) { 
+            Generate_Data(buffer, SIZE);
+            MPI_Recv( buffer, 0, MPI_INT, dest, 0, MPI_COMM_WORLD, &status );
+            MPI_Send( buffer, 0, MPI_INT, dest, 0, MPI_COMM_WORLD );
+            MPI_Ssend( buffer, act_size, MPI_INT, dest, 1, MPI_COMM_WORLD );
+            MPI_Ssend( buffer, act_size, MPI_INT, dest, 2, MPI_COMM_WORLD );
+            
+        } else if (rank == dest) {
+            Test_Init("ssendtest", rank);
+            /* Test 1 */
+            Current_Test = (char*)"Ssend Test (Synchronous Send -> Normal Recieve)";
+            MPI_Send( buffer, 0, MPI_INT, src, 0, MPI_COMM_WORLD );
+            MPI_Recv( buffer, 0, MPI_INT, src, 0, MPI_COMM_WORLD, &status );
+            t0 = MPI_Wtime();
+            flag = 0;
+           /* This test depends on a working wtime.  Make a simple check */
+           if (t0 == 0 && MPI_Wtime() == 0) {
+               int loopcount = 1000000;
+               /* This test is too severe (systems with fast 
+                  processors and large MPI_Wtick values can 
+                  fail.  Try harder to test MPI_Wtime */
+               while (loopcount-- && MPI_Wtime() == 0) ;
+               if (loopcount <= 0) {
+                   fprintf( stderr, 
+                            "MPI_WTIME is returning 0; a working value is needed\n\
+for this test.\n" );
+                   Test_Failed(Current_Test);
+                   MPI_Abort( MPI_COMM_WORLD, 1 );
+               }
+               t0 = MPI_Wtime();
+           }
+            while (MPI_Wtime() - t0 < MAX_TIME) {
+                MPI_Iprobe( src, 2, MPI_COMM_WORLD, &flag, &status );
+                if (flag) {
+                    Test_Failed(Current_Test);
+                    break;
+                    }
+                }
+            if (!flag) 
+                Test_Passed(Current_Test);
+            MPI_Recv( buffer, act_size, MPI_INT, src, 1, MPI_COMM_WORLD, 
+                     &status1 );
+            MPI_Recv( buffer, act_size, MPI_INT, src, 2, MPI_COMM_WORLD, 
+                     &status2 );
+            
+            MPI_Get_count( &status1, MPI_INT, &count1 );
+            MPI_Get_count( &status2, MPI_INT, &count2 );
+            if (count1 != act_size) {
+                fprintf( stdout, 
+                        "(1) Wrong count from recv of ssend: got %d (%d)\n", 
+                        count1, act_size );
+                }
+            if (status1.MPI_TAG != 1) {
+                fprintf( stdout, "(1) Wrong tag from recv of ssend: got %d\n", 
+                        status1.MPI_TAG );
+                }
+            if (count2 != act_size) {
+                fprintf( stdout, 
+                        "(2) Wrong count from recv of ssend: got %d (%d)\n", 
+                        count1, act_size );
+                }
+            if (status2.MPI_TAG != 2) {
+                fprintf( stdout, "(2) Wrong tag from recv of ssend: got %d\n", 
+                        status2.MPI_TAG );
+                }
+
+            }
+        }
+
+    Test_Waitforall( );
+    rval = 0;
+    if (rank == dest) {
+           rval = Summarize_Test_Results(); /* Returns number of tests;
+                                                   that failed */
+           Test_Finalize();
+           }
+    MPI_Finalize();
+    return rval;
+}
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/ssendtest2.c b/teshsuite/smpi/mpich-test/pt2pt/ssendtest2.c
new file mode 100644 (file)
index 0000000..0bc65a8
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Test from oertel@ZIB-Berlin.DE 
+ */
+
+/*
+ * Test of MPI_Ssend on MPI implementation on Cray T3D
+ *
+ * Process dest should receive numbers 1,...,10 but
+ * receives 274878030344 instead !!!
+ *
+ * Test program works correctly with MPI_Ssend replaced by MPI_Send!
+ *
+ *
+ * Compiler options: /mpp/bin/cc -Tcray-t3d -g -X2 -I"directory of mpi.h"
+ *
+ * Output of run with option -mpiversion:
+
+ssendt3d -mpiversion
+MPI model implementation 1.00.11., T3D Device Driver, Version 0.0
+MPI model implementation 1.00.11., T3D Device Driver, Version 0.0
+Configured with -arch=cray_t3d -device=t3d -opt=-g -ar_nolocal -make=gmake
+Configured with -arch=cray_t3d -device=t3d -opt=-g -ar_nolocal -make=gmake
+Received 274878008072
+Received 274878008072
+Received 274878008072
+Received 274878008072
+Received 274878008072
+Received 274878008072
+Received 274878008072
+Received 274878008072
+Received 274878008072
+Received 274878008072
+
+ */
+
+#include <stdio.h>
+#include "mpi.h"
+
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+#define SIZE 10
+
+static int src  = 0;
+static int dest = 1;
+
+int main( int argc, char **argv )
+{
+    int rank; /* My Rank (0 or 1) */
+    int i, ivalue;
+    MPI_Status Stat;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank);
+
+    if (rank == src) {
+
+        for (i=1; i<=SIZE; i++)
+        {
+            MPI_Ssend( &i, 1, MPI_INT, dest, 2000, MPI_COMM_WORLD);
+        }
+
+    } else if (rank == dest) {
+        for (i=1; i<=SIZE; i++)
+        {
+            MPI_Recv( &ivalue, 1, MPI_INT, src, 2000, MPI_COMM_WORLD, &Stat);
+            printf("Received %d\n", ivalue); fflush(stdout);
+        }
+    }
+    MPI_Barrier( MPI_COMM_WORLD);
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/ssendtest2.std b/teshsuite/smpi/mpich-test/pt2pt/ssendtest2.std
new file mode 100644 (file)
index 0000000..33fda53
--- /dev/null
@@ -0,0 +1,12 @@
+**** Verifying ssend (2) ****
+Received 1
+Received 2
+Received 3
+Received 4
+Received 5
+Received 6
+Received 7
+Received 8
+Received 9
+Received 10
+**** Verifying ssend (2) ****
diff --git a/teshsuite/smpi/mpich-test/pt2pt/structf.f b/teshsuite/smpi/mpich-test/pt2pt/structf.f
new file mode 100644 (file)
index 0000000..efb555b
--- /dev/null
@@ -0,0 +1,87 @@
+C Thanks to 
+C William R. Magro
+C for this test
+C
+C It has been modifiedly slightly to work with the automated MPI
+C tests.
+C  WDG.
+C
+      program bustit
+      implicit none
+
+      include 'mpif.h'
+
+      integer ierr
+      integer comm
+      integer newtype
+      integer me
+      integer position
+      integer type(5)
+      integer length(5)
+      integer disp(5)
+      integer bufsize
+      parameter (bufsize=100)
+      character buf(bufsize)
+      character name*(10)
+      integer status(MPI_STATUS_SIZE)
+      integer i, size
+      double precision x
+      integer src, dest
+
+C     Enroll in MPI
+      call mpi_init(ierr)
+
+C     get my rank
+      call mpi_comm_rank(MPI_COMM_WORLD, me, ierr)
+      call mpi_comm_size(MPI_COMM_WORLD, size, ierr )
+      if (size .lt. 2) then
+         print *, "Must have at least 2 processes"
+         call MPI_Abort( 1, MPI_COMM_WORLD, ierr )
+      endif
+
+      comm = MPI_COMM_WORLD
+      src = 0
+      dest = 1
+
+      if(me.eq.src) then
+          i=5
+          x=5.1234d0
+          name="hello"
+
+          type(1)=MPI_CHARACTER
+          length(1)=5
+          call mpi_address(name,disp(1),ierr)
+
+          type(2)=MPI_DOUBLE_PRECISION
+          length(2)=1
+          call mpi_address(x,disp(2),ierr)
+
+          call mpi_type_struct(2,length,disp,type,newtype,ierr)
+          call mpi_type_commit(newtype,ierr)
+          call mpi_barrier( MPI_COMM_WORLD, ierr )
+          call mpi_send(MPI_BOTTOM,1,newtype,dest,1,comm,ierr)
+          call mpi_type_free(newtype,ierr)
+C         write(*,*) "Sent ",name(1:5),x
+      else 
+C         Everyone calls barrier incase size > 2
+          call mpi_barrier( MPI_COMM_WORLD, ierr )
+          if (me.eq.dest) then
+             position=0
+
+             name = " "
+             x    = 0.0d0
+             call mpi_recv(buf,bufsize,MPI_PACKED, src,
+     .            1, comm, status, ierr)
+             
+             call mpi_unpack(buf,bufsize,position,
+     .            name,5,MPI_CHARACTER, comm,ierr)
+             call mpi_unpack(buf,bufsize,position,
+     .            x,1,MPI_DOUBLE_PRECISION, comm,ierr)
+             print 1, name, x
+ 1           format( " Received ", a, f7.4 )
+          endif
+      endif
+
+      call mpi_finalize(ierr)
+
+      end
diff --git a/teshsuite/smpi/mpich-test/pt2pt/structf.std b/teshsuite/smpi/mpich-test/pt2pt/structf.std
new file mode 100644 (file)
index 0000000..fa328ce
--- /dev/null
@@ -0,0 +1,3 @@
+*** Testing Type_struct from Fortran ***
+ Received hello         5.1234
+*** Testing Type_struct from Fortran ***
diff --git a/teshsuite/smpi/mpich-test/pt2pt/structlb.c b/teshsuite/smpi/mpich-test/pt2pt/structlb.c
new file mode 100644 (file)
index 0000000..a28d295
--- /dev/null
@@ -0,0 +1,55 @@
+#include "mpi.h"
+#include <stdio.h>
+
+int main( int argc, char **argv)
+{
+    int blockcnt[2], size;
+    MPI_Datatype tmptype, newtype, oldtypes[2];
+    MPI_Aint offsets[2], extent, lb, ub;
+
+    MPI_Init(&argc, &argv);
+
+    blockcnt[0] = 1;
+    offsets[0] = 1;
+    oldtypes[0] = MPI_BYTE;
+    blockcnt[1] = 1;   /* set upper bound to avoid padding */
+    offsets[1] = 2;
+    oldtypes[1] = MPI_UB;
+    MPI_Type_struct(2, blockcnt, offsets, oldtypes, &tmptype);
+    MPI_Type_commit(&tmptype);
+
+    MPI_Type_size(tmptype, &size);
+    MPI_Type_lb(tmptype, &lb);
+    MPI_Type_ub(tmptype, &ub);
+    MPI_Type_extent(tmptype, &extent);
+#ifdef DEBUG
+    printf("tmptype: size: %d lb: %ld ub: %ld ex: %ld\n", size, lb, ub, 
+          extent);
+#endif
+       
+    blockcnt[0] = 1;
+    offsets[0] = 1;
+    oldtypes[0] = tmptype;
+    MPI_Type_struct(1, blockcnt, offsets, oldtypes, &newtype);
+    MPI_Type_commit(&newtype);
+
+    MPI_Type_size(newtype, &size);
+    MPI_Type_lb(newtype, &lb);
+    MPI_Type_ub(newtype, &ub);
+    MPI_Type_extent(newtype, &extent);
+#ifdef DEBUG
+    printf("newtype: size: %ld lb: %ld ub: %ld ex: %d\n", size, lb, ub, 
+          extent);
+#endif 
+    if (size != 1 || lb != 2 || ub != 3 || extent != 1) {
+           printf ("lb = %ld (should be 2), ub = %ld (should be 3) extent = %ld should be 1, size = %d (should be 1)\n", lb, ub, extent, size) ;
+    }
+    else {
+       printf( " No Errors\n" );
+    }
+    MPI_Type_free(&tmptype);
+    MPI_Type_free(&newtype);
+    MPI_Finalize();
+
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/systest.c b/teshsuite/smpi/mpich-test/pt2pt/systest.c
new file mode 100644 (file)
index 0000000..af5fbb8
--- /dev/null
@@ -0,0 +1,433 @@
+#include "mpi.h"
+#include <stdio.h>
+
+#define MAX2(a,b) (((a)>(b)) ? (a) : (b))
+
+int  GlobalReadInteger();
+void Hello();
+/*
+void Ring();
+void Stress();
+void Globals();
+*/
+
+int main( int argc, char **argv )
+{
+
+    int me, option;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD,&me);
+
+    fprintf(stderr,"Process %d is alive\n",me);
+
+    while (1) {
+
+       MPI_Barrier(MPI_COMM_WORLD);
+
+      again:
+       if (me == 0) {
+           /* Read user input for action */
+           (void) printf("\nOptions: 0=quit, 1=Hello, 2=Ring, 3=Stress, ");
+           (void) printf("4=Globals : ");
+           (void) fflush(stdout);
+       }
+       option = GlobalReadInteger();
+       if ( (option < 0) || (option > 4) )
+           goto again;
+
+       switch (option) {
+         case 0:
+           MPI_Finalize();
+           return;
+         case 1:
+           Hello();     break;
+         case 2:
+           Ring();      break;
+/*
+         case 3:
+           Stress();    break;
+         case 4:
+           Globals();   break;
+*/
+         default:
+           fprintf(stderr,"systest: invalid option %d\n", option);   break;
+       }
+    }
+}
+
+int GlobalReadInteger()
+/*
+  Process zero reads an integer from stdin and broadcasts
+  to everyone else
+*/
+{
+    int me, value, *msg, msg_len, type=999 ,zero=0;
+
+    MPI_Comm_rank(MPI_COMM_WORLD, &me);
+    if (me == 0) {
+       if (scanf("%d", &value) != 1)
+           fprintf(stderr,"failed reading integer value from stdin\n");
+    }
+    MPI_Bcast(&value, 1, MPI_INT, 0, MPI_COMM_WORLD);
+    return value;
+}
+
+static void Hello()
+/*
+  Everyone exchanges a hello message with everyone else.
+  The hello message just comprises the sending and target nodes.
+*/
+{
+    int nproc, me;
+    int type = 1;
+    int buffer[2], node, length;
+    MPI_Status status;
+
+    MPI_Comm_rank(MPI_COMM_WORLD, &me);
+    MPI_Comm_size(MPI_COMM_WORLD, &nproc);
+
+    if (me == 0) {
+       printf("\nHello test ... show network integrity\n----------\n\n");
+       fflush(stdout);
+    }
+
+    for (node = 0; node<nproc; node++) {
+       if (node != me) {
+           buffer[0] = me;
+           buffer[1] = node;
+           MPI_Send(buffer, 2, MPI_INT, node, type, MPI_COMM_WORLD);
+           MPI_Recv(buffer, 2, MPI_INT, node, type, MPI_COMM_WORLD, &status);
+
+           if ( (buffer[0] != node) || (buffer[1] != me) ) {
+               (void) fprintf(stderr, "Hello: %d!=%d or %d!=%d\n",
+                              buffer[0], node, buffer[1], me);
+               printf("Mismatch on hello process ids; node = %d\n", node);
+           }
+
+           printf("Hello from %d to %d\n", me, node);
+           fflush(stdout);
+       }
+    }
+}
+
+static void Ring()       /* Time passing a message round a ring */
+{
+    int nproc, me;
+    MPI_Status status;
+    int nproc = p4_num_total_ids();
+    int type = 4;
+    int left = (me + nproc - 1) % nproc;
+    int right = (me + 1) % nproc;
+    char *buffer, *msg;
+    int start, lenbuf, used, max_len,  msg_len;
+    double rate, us_rate;
+    double start_ustime, end_ustime, used_ustime;
+
+    MPI_Comm_rank(MPI_COMM_WORLD, &me);
+    MPI_Comm_size(MPI_COMM_WORLD, &nproc);
+    left = (me + nproc - 1) % nproc;
+    right = (me + 1) % nproc;
+
+    /* Find out how big a message to use */
+
+    if (me == 0) {
+       (void) printf("\nRing test...time network performance\n---------\n\n");
+       (void) printf("Input maximum message size: ");
+       (void) fflush(stdout);
+    }
+    max_len = GlobalReadInteger();
+    if ( (max_len <= 0) || (max_len >= 4*1024*1024) )
+       max_len = 512*1024;
+    if ( (buffer = malloc((unsigned) max_len)) == (char *) NULL) {
+       printf("process %d could not allocate buffer of size %d\n",me,max_len);
+       MPI_Abort(MPI_COMM_WORLD,7777);
+    }
+
+    lenbuf = 1;
+    while (lenbuf <= max_len) {
+       start_ustime = MPI_Wtime();
+       if (me == 0) {
+           MPI_Send(buffer,lenbuf,MPI_CHAR,left, type,MPI_COMM_WORLD);
+           MPI_Recv(buffer,lenbuf,MPI_CHAR,right,type,MPI_COMM_WORLD,&status);
+       }
+       else {
+           MPI_Recv(buffer,lenbuf,MPI_CHAR,right,type,MPI_COMM_WORLD,&status);
+           MPI_Send(buffer,lenbuf,MPI_CHAR,left, type,MPI_COMM_WORLD);
+       }
+       used_ustime = MPI_Wtime() - start_ustime;
+
+       if (used_ustime > 0)
+           us_rate = 1.0 * (double) (nproc * lenbuf) / (double) used_ustime;
+       else
+           us_rate = 0.0;
+       if (me == 0)
+           printf("len=%d bytes, used= %d us, rate=%f Mbytes/sec\n",
+                  lenbuf, used_ustime, us_rate);
+    
+       lenbuf *= 2;
+    }
+    free(buffer);
+}
+
+double ranf()
+/* Returns ran # uniform in (0,1) ... probably rather bad statistics. */
+{
+  static unsigned long seed = 54321;
+
+  seed = seed * 1812433253 + 12345;
+  return (seed & 0x7fffffff) * 4.6566128752458e-10;
+}
+
+static void RandList(lo, hi, list, n)
+     int lo, hi, *list, n;
+/*
+  Fill list with n random integers between lo & hi inclusively
+*/
+{
+  int i, ran;
+  double dran;
+
+  for (i=0; i<n; i++) {
+    dran = ranf();
+    ran = lo + (int) (dran * (double) (hi-lo+1));
+    if (ran < lo)
+      ran = lo;
+    if (ran > hi)
+      ran = hi;
+    list[i] = ran;
+  }
+}
+
+static void Stress()
+/*
+  Stress the system by passing messages between a randomly selected
+  list of nodes
+*/
+{
+#define N_LEN 10
+#ifdef NCUBE
+  /* ncube does not handle msgs larger than 
+     32K at present (see nwrite) */
+  static int len[N_LEN] = {0,1,2,4,8,4096,8192,16384,32768,32768};
+#else
+  static int len[N_LEN] = {0,1,2,4,8,4096,8192,16384,32768,65536};
+#endif
+  int me = p4_get_my_id();
+  int nproc = p4_num_total_ids();
+  int zero = 0;
+  int type, lenbuf, i, j, from, to;
+  int *list_i, *list_j, *list_n;
+  char *buffer;
+  int n_stress, mod, *msg, msg_len;
+
+
+  type = 6;
+  if (me == 0) {
+    (void) printf("\nStress test ... randomly exchange messages\n-----------");
+    (void) printf("\n\nInput no. of messages: ");
+    (void) fflush(stdout);
+  }
+  n_stress = GlobalReadInteger();
+  if ( (n_stress <= 0) || (n_stress > 100000) )
+    n_stress = 1000;
+  p4_dprintfl(00,"n_stress=%d\n",n_stress);
+
+  lenbuf = n_stress * sizeof(int);
+
+  if (!(buffer = p4_shmalloc((unsigned) len[N_LEN-1])))
+    p4_error("Stress: failed to allocate buffer", len[N_LEN-1]);
+
+  type = 7;
+  if (me == 0) { /* Make random list of pairs and message lengths */
+    if (!(list_i = (int *) p4_shmalloc((unsigned) lenbuf)))
+      p4_error("Stress: failed to allocate list_i",lenbuf);
+    if (!(list_j = (int *) p4_shmalloc((unsigned) lenbuf)))
+      p4_error("Stress: failed to allocate list_j",lenbuf);
+    if (!(list_n = (int *) p4_shmalloc((unsigned) lenbuf)))
+      p4_error("Stress: failed to allocate list_n",lenbuf);
+
+    RandList((int) 0, nproc-1, list_i, n_stress);
+    RandList((int) 0, nproc-1, list_j, n_stress);
+    RandList((int) 0, N_LEN-1, list_n, n_stress);
+    for (i=0; i<n_stress; i++)
+      list_n[i] = len[list_n[i]];
+    p4_broadcastx(type, (char *) list_i, lenbuf, P4INT);
+    p4_broadcastx(type, (char *) list_j, lenbuf, P4INT);
+    p4_broadcastx(type, (char *) list_n, lenbuf, P4INT);
+  }
+  else {
+    list_i = (int *) NULL;
+    (void) p4_recv(&type, &zero, (char **) &list_i, &msg_len);
+    list_j = (int *) NULL;
+    (void) p4_recv(&type, &zero, (char **) &list_j, &msg_len);
+    list_n = (int *) NULL;
+    (void) p4_recv(&type, &zero, (char **) &list_n, &msg_len);
+  }
+
+  type = 8;
+
+  j = 0;
+  mod = (n_stress-1)/10 + 1;
+  for (i=0; i < n_stress; i++) {
+
+    from   = list_i[i];
+    to     = list_j[i];
+    lenbuf = list_n[i];
+
+    /* P4 can send to self 
+    if (from == to)
+      continue; */
+
+    if ( (me == 0) && (j%mod == 0) ) {
+      (void) printf("Stress: test=%ld: from=%ld, to=%ld, len=%ld\n",
+                   i, from, to, lenbuf);
+      (void) fflush(stdout);
+    }
+
+    j++;  /* Needed when skipping send to self */
+
+    if (from == me)
+      (void) p4_send(type, to, buffer, lenbuf);
+
+    if (to == me) {
+      msg = (int *) NULL;
+      (void) p4_recv(&type, &from, (char **) &msg, &msg_len);
+      p4_msg_free((char *) msg);
+      if (msg_len != lenbuf)
+       p4_error("Stress: invalid message length on receive",lenbuf);
+    }
+  }
+
+  (void) p4_shfree(buffer);
+  if (me == 0) {
+    (void) p4_shfree((char *) list_n);
+    (void) p4_shfree((char *) list_j);
+    (void) p4_shfree((char *) list_i);
+  }
+  else {
+    (void) p4_msg_free((char *) list_n);
+    (void) p4_msg_free((char *) list_j);
+    (void) p4_msg_free((char *) list_i);
+  }
+}
+
+static int CompareVectors(n, a, b)
+     int n;
+     double *a, *b;
+/*
+  Return the no. of differences in two vectors allowing for
+  numerical roundoff.
+*/
+{
+#define ABS(a)   (((a)>=0 ) ? (a) : -(a))
+  int nerrs = 0;
+  double diff;
+
+  while (n--) {
+    diff = *a++ - *b++;
+    if (ABS(diff) > 1.0e-8)
+      nerrs++;
+  }
+  
+  return nerrs;
+}
+
+static void Globals()
+/*
+  Test out functioning of the global operations.
+*/
+{
+  int nproc = p4_num_total_ids();
+  int me = p4_get_my_id();
+  int n, i, start, used, nerrs;
+  double *a, *b, rate;
+
+#define DO(string, op) \
+  start = p4_clock(); \
+  if (p4_global_op(33, (char *) a, n, sizeof(double), op, P4DBL)) \
+    p4_error("p4_global_op failed",n); \
+  used = p4_clock()-start; \
+  rate = (used>0) ? n/(1.0e+3 * used) : 0.0; \
+  nerrs = CompareVectors(n, a, b); \
+  if (me == 0) \
+    (void) printf("%s, len=%d, used=%d ms, rate=%f Mop/sec, nerrs=%d\n",\
+                   string, n, used, rate, nerrs);
+
+  if (me == 0) {
+    (void) printf("\nGlobal operations test\n----------------------");
+    (void) printf("\n\nInput vector length ");
+    (void) fflush(stdout);
+  }
+  n = GlobalReadInteger();
+  if ( (n < 0) || (n > 1000000) )
+    n = 1000;
+
+  if (!(a = (double *) p4_shmalloc((unsigned) (n*sizeof(double)))))
+    p4_error("failed to create work space (a)",n);
+  if (!(b = (double *) p4_shmalloc((unsigned) (n*sizeof(double)))))
+    p4_error("failed to create work space (b)",n);
+
+  /* Summation */
+
+  for (i=0; i<n; i++) {
+    a[i] = i+me;
+    b[i] = nproc*i + (nproc*(nproc-1))/2;
+  }
+  DO("Summation", p4_dbl_sum_op);
+
+  /* Maximum */
+
+  for (i=0; i<n; i++) {
+    a[i] = i+me;
+    b[i] = i+nproc-1;
+  }
+  DO("Maximum", p4_dbl_max_op);
+
+  /* Abs Maximum */
+
+  for (i=0; i<n; i++) {
+    a[i] = i+me - n/2;
+    b[i] = MAX2(n/2-i, i+nproc-1-n/2);
+  }
+  DO("Abs Maximum", p4_dbl_absmax_op);
+
+  /* Tidy up */
+
+  p4_shfree((char *) b);
+  p4_shfree((char *) a);
+}
+
+
+void synchronize(type)
+     int type;
+/*
+  Processes block until all have checked in with process 0
+  with a message of specified type .. a barrier.
+*/
+{
+  int me = p4_get_my_id();
+  int nproc = p4_num_total_ids();
+  int zero = 0;
+  int *msg;
+  int msg_len, node, dummy = type;
+
+  if (me == zero) {
+    for (node=1; node<nproc; node++){       /* Check in */
+      msg = (int *) NULL;
+      if (p4_recv(&type, &node, (char **) &msg, &msg_len))
+       p4_error("synchronize: recv 1 failed", (int) msg);
+      p4_msg_free((char *) msg);
+    }
+    if (p4_broadcast(type, (char *) &dummy, sizeof dummy))
+      p4_error("synchronize: broadcast failed",type);
+  }
+  else {
+    if (p4_send(type, zero, (char *) &me, sizeof me))
+      p4_error("synchronize: send failed", type);
+    msg = (int *) NULL;
+    if (p4_recv(&type, &zero, (char **) &msg, &msg_len))
+      p4_error("synchronize: recv 2 failed", (int) msg);
+    p4_msg_free((char *) msg);
+  }
+}    
diff --git a/teshsuite/smpi/mpich-test/pt2pt/systest1.c b/teshsuite/smpi/mpich-test/pt2pt/systest1.c
new file mode 100644 (file)
index 0000000..2ca9812
--- /dev/null
@@ -0,0 +1,115 @@
+#include "mpi.h"
+#include <stdio.h>
+
+#define MAX2(a,b) (((a)>(b)) ? (a) : (b))
+
+int  GlobalReadInteger();
+void Hello();
+/*
+void Ring();
+void Stress();
+void Globals();
+*/
+
+int main(argc,argv)
+int argc;
+char **argv;
+{
+
+    int me, option;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD,&me);
+
+    fprintf(stderr,"Process %d is alive\n",me);
+
+    while (1) {
+
+       MPI_Barrier(MPI_COMM_WORLD);
+
+      again:
+       if (me == 0) {
+           /* Read user input for action */
+           (void) printf("\nOptions: 0=quit, 1=Hello, 2=Ring, 3=Stress, ");
+           (void) printf("4=Globals : ");
+           (void) fflush(stdout);
+       }
+       option = GlobalReadInteger();
+       if ( (option < 0) || (option > 4) )
+           goto again;
+
+       switch (option) {
+         case 0:
+           MPI_Finalize();
+           return;
+         case 1:
+           Hello();     break;
+/*
+         case 2:
+           Ring();      break;
+         case 3:
+           Stress();    break;
+         case 4:
+           Globals();   break;
+*/
+         default:
+           fprintf(stderr,"systest: invalid option %d\n", option);   break;
+       }
+    }
+}
+
+int GlobalReadInteger()
+/*
+  Process zero reads an integer from stdin and broadcasts
+  to everyone else
+*/
+{
+    int me, value, *msg, msg_len, type=999 ,zero=0;
+
+    MPI_Comm_rank(MPI_COMM_WORLD, &me);
+    if (me == 0) {
+       if (scanf("%d", &value) != 1)
+           fprintf(stderr,"failed reading integer value from stdin\n");
+    }
+    MPI_Bcast(&value, 1, MPI_INT, 0, MPI_COMM_WORLD);
+    return value;
+}
+
+static void Hello()
+/*
+  Everyone exchanges a hello message with everyone else.
+  The hello message just comprises the sending and target nodes.
+*/
+{
+    int nproc, me;
+    int type = 1;
+    int buffer[2], node, length;
+    MPI_Status status;
+
+    MPI_Comm_rank(MPI_COMM_WORLD, &me);
+    MPI_Comm_size(MPI_COMM_WORLD, &nproc);
+
+    if (me == 0) {
+       printf("\nHello test ... show network integrity\n----------\n\n");
+       fflush(stdout);
+    }
+
+    for (node = 0; node<nproc; node++) {
+       if (node != me) {
+           buffer[0] = me;
+           buffer[1] = node;
+           MPI_Send(buffer, 2, MPI_INT, node, type, MPI_COMM_WORLD);
+           buffer[0] = buffer[1] = 7777;
+           MPI_Recv(buffer, 2, MPI_INT, node, type, MPI_COMM_WORLD, &status);
+
+           if ( (buffer[0] != node) || (buffer[1] != me) ) {
+               (void) fprintf(stderr, "Hello: %d!=%d or %d!=%d\n",
+                              buffer[0], node, buffer[1], me);
+               printf("Mismatch on hello process ids; node = %d\n", node);
+           }
+
+           printf("Hello from %d to %d\n", me, node);
+           fflush(stdout);
+       }
+    }
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/test.c b/teshsuite/smpi/mpich-test/pt2pt/test.c
new file mode 100644 (file)
index 0000000..c9d7f28
--- /dev/null
@@ -0,0 +1,162 @@
+/* Procedures for recording and printing test results */
+
+#include <stdio.h>
+#include <string.h>
+#include "test.h"
+
+#if defined(USE_STDARG)
+#include <stdarg.h>
+#endif
+
+static int tests_passed = 0;
+static int tests_failed = 0;
+static char failed_tests[255][81];
+static char suite_name[255];
+FILE *fileout = NULL;
+
+void Test_Init(const char *suite, int rank)
+{
+    char filename[512];
+
+    sprintf(filename, "%s-%d.out", suite, rank);
+    strncpy(suite_name, suite, 255);
+    fileout = fopen(filename, "w");
+    if (!fileout) {
+       fprintf( stderr, "Could not open %s on node %d\n", filename, rank );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    //MPI_Errhandler_create( Test_Errors_warn, &TEST_ERRORS_WARN );
+}
+
+void Test_Message(const char *mess)
+{
+    fprintf(fileout, "[%s]: %s\n", suite_name, mess);
+    fflush(fileout);
+}
+
+void Test_Failed(const char *test)
+{
+    fprintf(fileout, "[%s]: *** Test '%s' Failed! ***\n", suite_name, test);
+    strncpy(failed_tests[tests_failed], test, 81);
+    fflush(fileout);
+    tests_failed++;
+}
+
+void Test_Passed(const char *test)
+{
+#ifdef VERBOSE
+    fprintf(fileout, "[%s]: Test '%s' Passed.\n", suite_name, test);
+    fflush(fileout);
+#endif
+    tests_passed++;
+}
+
+int Summarize_Test_Results()
+{
+#ifdef VERBOSE
+    fprintf(fileout, "For test suite '%s':\n", suite_name);
+#else
+    if (tests_failed > 0)
+#endif
+    {
+       fprintf(fileout, "Of %d attempted tests, %d passed, %d failed.\n", 
+               tests_passed + tests_failed, tests_passed, tests_failed);
+    }
+    if (tests_failed > 0) {
+       int i;
+
+       fprintf(fileout, "*** Tests Failed:\n");
+       for (i = 0; i < tests_failed; i++)
+           fprintf(fileout, "*** %s\n", failed_tests[i]);
+    }
+    return tests_failed;
+}
+
+void Test_Finalize( void )
+{
+    //if (TEST_ERRORS_WARN != MPI_ERRHANDLER_NULL) 
+       //MPI_Errhandler_free( &TEST_ERRORS_WARN );
+    if (fileout) {
+       fflush(fileout);
+       //fclose(fileout);
+    }
+}
+
+#include "mpi.h"
+/* Wait for every process to pass through this point.  This test is used
+   to make sure that all processes complete, and that a test "passes" because
+   it executed, not because it some process failed.  
+ */
+void Test_Waitforall( void )
+{
+    int m, one, myrank, n;
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
+    MPI_Comm_size( MPI_COMM_WORLD, &n );
+    one = 1;
+    MPI_Allreduce( &one, &m, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+
+    if (m != n) {
+       printf( "[%d] Expected %d processes to wait at end, got %d\n", myrank, 
+               n, m );
+    }
+    if (myrank == 0) 
+       printf( " No Errors\n" );
+}
+
+/*
+   Handler prints warning messsage and returns.  Internal.  Not
+   a part of the standard.
+ */
+MPI_Errhandler TEST_ERRORS_WARN ;
+
+#ifdef USE_STDARG
+void Test_Errors_warn(  MPI_Comm *comm, int *code, ... )
+{  
+  char buf[MPI_MAX_ERROR_STRING];
+  int  myid; 
+  char *string;
+#ifdef MPIR_DEBUG
+  char *file;
+  int  *line;
+#endif
+  static int in_handler = 0;
+  va_list Argp;
+
+#ifdef USE_OLDSTYLE_STDARG
+  va_start( Argp );
+#else
+  va_start( Argp, code );
+#endif
+  string = va_arg(Argp,char *);
+#ifdef MPIR_DEBUG
+  /* These are only needed for debugging output */
+  file   = va_arg(Argp,char *);
+  line   = va_arg(Argp,int *);
+#endif
+  va_end( Argp );
+#else
+void Test_Errors_warn( MPI_Comm *comm, int *code, char *string, char *file, 
+                      int *line )
+{
+  char buf[MPI_MAX_ERROR_STRING];
+  int  myid, result_len; 
+  static int in_handler = 0;
+#endif
+
+  if (in_handler) return;
+  in_handler = 1;
+
+  MPI_Comm_rank( MPI_COMM_WORLD, &myid );
+  //MPI_Error_string( *code, buf, &result_len );
+#ifdef MPIR_DEBUG
+  /* Generate this information ONLY when debugging MPIR */
+  fprintf( stderr, "%d -  File: %s   Line: %d\n", myid, 
+                  file, *line );
+#endif
+  fprintf( stderr, "%d - %s : %s\n", myid, 
+          string ? string : "<NO ERROR MESSAGE>", buf );
+  fflush( stderr );
+  in_handler = 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/test.h b/teshsuite/smpi/mpich-test/pt2pt/test.h
new file mode 100644 (file)
index 0000000..fb83d22
--- /dev/null
@@ -0,0 +1,29 @@
+/* Header for testing procedures */
+
+#ifndef _INCLUDED_TEST_H_
+#define _INCLUDED_TEST_H_
+
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+void Test_Init (const char *, int);
+#ifdef USE_STDARG
+void Test_Printf (const char *, ...);
+void Test_Errors_warn ( MPI_Comm *, int *, ... );
+#else
+/* No prototype */
+void Test_Printf();
+void Test_Errors_warn();
+#endif
+void Test_Message (const char *);
+void Test_Failed (const char *);
+void Test_Passed (const char *);
+int Summarize_Test_Results (void);
+void Test_Finalize (void);
+void Test_Waitforall (void);
+
+extern MPI_Errhandler TEST_ERRORS_WARN;
+#endif
diff --git a/teshsuite/smpi/mpich-test/pt2pt/testall.c b/teshsuite/smpi/mpich-test/pt2pt/testall.c
new file mode 100644 (file)
index 0000000..22f471b
--- /dev/null
@@ -0,0 +1,175 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "dtypes.h"
+#include "gcomm.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int verbose = 0;
+/* 
+   Multiple completions
+   
+   This is similar to a test in allpair.f, but with an expanded range of
+   datatypes and communicators.
+ */
+
+int main( int argc, char **argv )
+{
+MPI_Datatype *types;
+void         **inbufs, **outbufs;
+char         **names;
+int          *counts, *bytesize, ntype;
+MPI_Comm     comms[20];
+int          ncomm = 20, rank, np, partner, tag;
+int          i, j, k, err, toterr, world_rank;
+MPI_Status   status, statuses[2];
+int          flag;
+char         *obuf;
+MPI_Request  requests[2];
+
+
+MPI_Init( &argc, &argv );
+
+AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, 
+                &names, &ntype );
+GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype );
+
+MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+MakeComms( comms, 20, &ncomm, 0 );
+
+/* Test over a wide range of datatypes and communicators */
+err = 0;
+for (i=0; i<ncomm; i++) {
+    MPI_Comm_rank( comms[i], &rank );
+    MPI_Comm_size( comms[i], &np );
+    if (np < 2) continue;
+    tag = i;
+    /* This is the test.  
+       master:                               worker:
+       irecv                                 send
+       isend
+       testall  (fail)
+       sendrecv                              sendrecv
+                                             irecv
+       sendrecv                              sendrecv
+                                             wait
+       sendrecv                              sendrecv
+       testall  (should succeed)                  
+     */
+    for (j=0; j<ntype; j++) {
+       if (world_rank == 0 && verbose) 
+           fprintf( stdout, "Testing type %s\n", names[j] );
+        if (rank == 0) {
+           /* Master */
+           partner = np - 1;
+#if 0
+           MPIR_PrintDatatypePack( stdout, counts[j], types[j], 0, 0 );
+#endif
+           obuf = outbufs[j];
+           for (k=0; k<bytesize[j]; k++) 
+               obuf[k] = 0;
+           
+           MPI_Irecv(outbufs[j], counts[j], types[j], partner, tag, 
+                     comms[i], &requests[0] );
+           
+           /* Use issend to ensure that the test cannot complete */
+           MPI_Isend( inbufs[j], counts[j], types[j], partner, tag, 
+                       comms[i], &requests[1] );
+
+           /* Note that the send may have completed */
+           MPI_Testall( 2, &requests[0], &flag, statuses );
+           if (flag) {
+               err++;
+               fprintf( stderr, "MPI_Testall returned flag == true!\n" );
+               }
+           if (requests[1] == MPI_REQUEST_NULL) {
+               err++;
+               fprintf( stderr, "MPI_Testall freed a request\n" );
+               }
+           MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         comms[i], &status );
+           MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         comms[i], &status );
+           MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         comms[i], &status );
+           /* This should succeed, but may fail if the wait below is 
+              still waiting */
+           MPI_Testall( 2, requests, &flag, statuses );
+           if (!flag) {
+               err++;
+               fprintf( stderr, "MPI_Testall returned flag == false!\n" );
+               }
+           if (requests[0] != MPI_REQUEST_NULL || 
+               requests[1] != MPI_REQUEST_NULL) {
+               err++;
+               fprintf( stderr, "MPI_Testall failed to free requests (test %d)\n", j );
+               if (requests[0] != MPI_REQUEST_NULL) {
+                   fprintf( stderr, "Failed to free Irecv request\n" );
+               }
+               if (requests[1] != MPI_REQUEST_NULL) {
+                   fprintf( stderr, "Failed to free Isend request\n" );
+               }
+           }
+           /* Check the received data */
+            if (CheckDataAndPrint( inbufs[j], outbufs[j], bytesize[j],
+                                  names[j], j )) {
+               err++;
+               }
+           }
+       else if (rank == np - 1) {
+           /* receiver */
+           partner = 0;
+           obuf = outbufs[j];
+           for (k=0; k<bytesize[j]; k++) 
+               obuf[k] = 0;
+           
+           MPI_Send( inbufs[j], counts[j], types[j], partner, tag, 
+                       comms[i] );
+           
+           MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         comms[i], &status );
+
+           MPI_Irecv(outbufs[j], counts[j], types[j], partner, tag, 
+                     comms[i], &requests[0] );
+
+           MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         comms[i], &status );
+
+           MPI_Wait( requests, statuses );
+            if (CheckDataAndPrint( inbufs[j], outbufs[j], bytesize[j],
+                                  names[j], j )) {
+                err++;
+               }
+           MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         comms[i], &status );
+           }
+       }
+    }
+
+if (err > 0) {
+    fprintf( stderr, "%d errors on %d\n", err, rank );
+    }
+MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+ if (world_rank == 0) {
+     if (toterr == 0) {
+        printf( " No Errors\n" );
+     }
+     else {
+        printf (" Found %d errors\n", toterr );
+     }
+ }
+FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype );
+FreeComms( comms, ncomm );
+MPI_Finalize();
+
+return err;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/testhetero b/teshsuite/smpi/mpich-test/pt2pt/testhetero
new file mode 100755 (executable)
index 0000000..5f32e12
--- /dev/null
@@ -0,0 +1,92 @@
+#! /bin/sh
+#
+# This is a simple heterogeneous test which exploits the mpicc command and
+# mpirun.  This is an example of how heterogeneous programs may be built and
+# run
+#
+#
+# Parameters for all programs and systems
+set -x
+device=ch_p4
+mpihome=../../..
+rshcmd=rsh
+programs="sendrecv sendrecv2 sendrecv3 sendrecv4 getelm"
+# Extra files needed for each program.
+sendrecvfiles="test.c"
+sendrecvargs="-nolongdouble"
+sendrecv2files="dtypes.c gcomm.c"
+sendrecv3files="dtypes.c gcomm.c"
+sendrecv4files="dtypes.c gcomm.c"
+getelmfiles=""
+#
+#
+# arch1 is local, arch2 is remote
+arch1=sun4
+arch2=freebsd
+name2=dogbert
+#
+debug_args=""
+fail_hard=1
+rebuild=0
+mpirun_args=""
+for arg in "$@" ; do
+    case "$arg" in 
+       -echo) set -x ;;
+       -noclean) noclean=1 ;;
+       -debug) debug_args="-p4dbg 99 -p4rdbg 99" ;;
+       -mpichdebug) debug_args="$debug_args -mpichdebug" ;;
+       -xxgdb) mpirun_args="-xxgdb" ;;
+        -soft) fail_hard=0 ;;
+       -force | -rebuild) rebuild=1 ;;
+       -alpha) arch2=alpha ; name2=ptera ;;
+       -help) 
+       echo "Test heterogeneous operation of MPICH with ch_p4 using"
+       echo "the versions of MPICH built in the current tree."
+       echo "Should be run on a sun4; it rsh's to other machines as"
+       echo "necessary."
+       exit 1
+       ;;
+       *) echo "Unrecognized argument $arg"
+       exit 1
+       ;;
+    esac
+done
+#
+arches="$arch1 $arch2"
+#
+mypwd=`pwd`
+# Fixup for brain-dead automounters
+mypwd=`echo $mypwd | sed s%/tmp_mnt%%g`
+#
+# Build local versions
+if [ 1 = 1 ] ; then
+    for pgm in $programs ; do
+        eval extrafiles=$"${pgm}files"
+        $mpihome/lib/$arch1/$device/mpicc -o $pgm.$arch1 $pgm.c $extrafiles
+    done
+fi
+#
+# Build remote versions
+for pgm in $programs ; do 
+    eval extrafiles=$"${pgm}files"
+    $rshcmd -n $name2 "(cd $mypwd ; $mpihome/lib/$arch2/$device/mpicc \
+       -o $pgm.$arch2 $pgm.c $extrafiles)"
+done
+#
+# Run the programs
+for pgm in $programs ; do
+    echo "Running $pgm..."
+    eval extraargs=$"${pgm}args"
+    $mpihome/lib/$arch1/$device/mpirun $mpirun_args \
+               -arch $arch1 -np 1 -arch $arch2 -np 1 $pgm.%a $debug_args \
+               $extraargs
+done
+#
+# Remove the executables
+if [ -z "$noclean" ] ; then 
+    for arch in $arches ; do
+        for pgm in $programs ; do
+           rm -f $pgm.$arch
+        done
+    done
+fi
diff --git a/teshsuite/smpi/mpich-test/pt2pt/testsome.c b/teshsuite/smpi/mpich-test/pt2pt/testsome.c
new file mode 100644 (file)
index 0000000..955e503
--- /dev/null
@@ -0,0 +1,173 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "dtypes.h"
+#include "gcomm.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+int verbose = 0;
+/* 
+   Multiple completions
+   
+   This is similar to a test in allpair.f, but with an expanded range of
+   datatypes and communicators.
+ */
+
+int main( int argc, char **argv )
+{
+MPI_Datatype *types;
+void         **inbufs, **outbufs;
+char         **names;
+int          *counts, *bytesize, ntype;
+MPI_Comm     comms[20];
+int          ncomm = 20, rank, np, partner, tag;
+int          i, j, k, err, toterr, world_rank;
+MPI_Status   status, statuses[2];
+int          flag, index, outcount, indices[2];
+char         *obuf;
+MPI_Request  requests[2];
+
+
+MPI_Init( &argc, &argv );
+
+AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, 
+                &names, &ntype );
+GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype );
+
+MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+MakeComms( comms, 20, &ncomm, 0 );
+
+/* Test over a wide range of datatypes and communicators */
+err = 0;
+for (i=0; i<ncomm; i++) {
+    MPI_Comm_rank( comms[i], &rank );
+    MPI_Comm_size( comms[i], &np );
+    if (np < 2) continue;
+    tag = i;
+    /* This is the test.  
+       sender:                               receiver:
+       irecv                                 irecv
+       isend
+       testsome (all fail)
+       testany  (all fail)
+       sendrecv                              sendrecv
+                                             isend
+       sendrecv                              sendrecv
+       testsome (both may)                   waitsome (both may)
+       waitall                               waitsome (must get other, if any)
+                                             waitsome (outcount = undefined)
+       This test DEPENDS on the handling of null requests, since the several
+       waits/tests may complete everything "early".
+     */
+    for (j=0; j<ntype; j++) {
+       if (world_rank == 0 && verbose) 
+           fprintf( stdout, "Testing type %s\n", names[j] );
+       /* This test does an irsend between both partners, with 
+          a sendrecv after the irecv used to guarentee that the
+          irsend has a matching receive
+        */
+        if (rank == 0) {
+           /* Sender */
+           partner = np - 1;
+#if 0
+           MPIR_PrintDatatypePack( stdout, counts[j], types[j], 0, 0 );
+#endif
+           obuf = outbufs[j];
+           for (k=0; k<bytesize[j]; k++) 
+               obuf[k] = 0;
+           
+           MPI_Irecv(outbufs[j], counts[j], types[j], partner, tag, 
+                     comms[i], &requests[0] );
+
+           MPI_Isend( inbufs[j], counts[j], types[j], partner, tag, 
+                       comms[i], &requests[1] );
+
+           /* Note that the send may have completed */
+           MPI_Testsome( 1, &requests[0], &outcount, indices, statuses );
+           if (outcount != 0) {
+               fprintf( stderr, "MPI_Testsome returned outcount = %d\n",
+                        outcount );
+               err++;
+               }
+           MPI_Testany( 1, &requests[0], &index, &flag, &status );
+           if (flag) {
+               fprintf( stderr, "MPI_Testany returned flag = true\n" );
+               err++;
+               }
+           MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         comms[i], &status );
+           MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         comms[i], &status );
+           /* We EXPECT both to succeed, but they may not */
+           MPI_Testsome( 2, requests, &outcount, indices, statuses );
+           MPI_Waitall( 2, requests, statuses );
+           
+           /* Check the received data */
+            if (CheckDataAndPrint( inbufs[j], outbufs[j], bytesize[j],
+                                  names[j], j )) {
+               err++;
+               }
+           }
+       else if (rank == np - 1) {
+           /* receiver */
+           partner = 0;
+           obuf = outbufs[j];
+           for (k=0; k<bytesize[j]; k++) 
+               obuf[k] = 0;
+           
+           MPI_Irecv(outbufs[j], counts[j], types[j], partner, tag, 
+                     comms[i], &requests[0] );
+
+           MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         comms[i], &status );
+
+           MPI_Isend( inbufs[j], counts[j], types[j], partner, tag, 
+                       comms[i], &requests[1] );
+           
+           MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         MPI_BOTTOM, 0, MPI_INT, partner, ncomm+i, 
+                         comms[i], &status );
+
+           MPI_Waitsome( 2, requests, &outcount, indices, statuses );
+           MPI_Waitsome( 2, requests, &outcount, indices, statuses );
+           MPI_Waitsome( 2, requests, &outcount, indices, statuses );
+           if (outcount != MPI_UNDEFINED) {
+               err++;
+               fprintf( stderr, 
+               "MPI_Waitsome did not return outcount = MPI_UNDEFINED\n" );
+               }
+
+            if (CheckDataAndPrint( inbufs[j], outbufs[j], bytesize[j],
+                                  names[j], j )) {
+                err++;
+               }
+
+           MPI_Waitall(1, &requests[1], &status );
+           }
+       }
+    }
+
+if (err > 0) {
+    fprintf( stderr, "%d errors on %d\n", err, rank );
+    }
+ MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+ if (world_rank == 0) {
+     if (toterr == 0) {
+        printf( " No Errors\n" );
+     }
+     else {
+        printf (" Found %d errors\n", toterr );
+     }
+ }
+FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype );
+FreeComms( comms, ncomm );
+MPI_Finalize();
+
+return err;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/testtest1.c b/teshsuite/smpi/mpich-test/pt2pt/testtest1.c
new file mode 100644 (file)
index 0000000..e087567
--- /dev/null
@@ -0,0 +1,83 @@
+/* 
+   This is a test of MPI_Test to receive a message of known length (used as a
+   server)
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include <string.h>
+#include "test.h"
+
+int main( int argc, char **argv ) 
+{
+    int data, to, from, tag, maxlen, np, myid, flag, dest, src;
+    MPI_Status status;
+    MPI_Request request;
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &myid );
+    MPI_Comm_size( MPI_COMM_WORLD, &np );
+
+/* dest writes out the received stats; for the output to be
+   consistant (with the final check), it should be procees 0 */
+    if (argc > 1 && argv[1] && strcmp( "-alt", argv[1] ) == 0) {
+       dest = np - 1;
+       src  = 0;
+    }
+    else {
+       src  = np - 1;
+       dest = 0;
+    }
+
+    if (myid == src) {
+       to   = dest;
+       tag = 2000;
+       data = 100;
+#ifdef VERBOSE
+       printf( "About to send\n" );
+#endif
+       MPI_Send( &data, 1, MPI_INT, to, tag, MPI_COMM_WORLD );
+       tag = 2001;
+       data = 0;
+#ifdef VERBOSE
+       printf( "About to send 'done'\n" );
+#endif
+       MPI_Send( &data, 1, MPI_INT, to, tag, MPI_COMM_WORLD );
+    }
+    else {
+       /* Server loop */
+       while (1) {
+           tag    = MPI_ANY_TAG;
+           from   = MPI_ANY_SOURCE;
+           MPI_Irecv( &data, 1, MPI_INT, from, tag, MPI_COMM_WORLD,
+                      &request );
+           /* Should really use MPI_Wait, but functionally this will work
+              (it is less efficient, however) */
+           do {                
+               MPI_Test( &request, &flag, &status );
+           } while (!flag);
+           if (status.MPI_TAG == 2001) {
+#ifdef VERBOSE
+               printf( "Received terminate message\n" );
+#endif
+               break;
+           }
+           if (status.MPI_TAG == 2000) {
+               MPI_Get_count( &status, MPI_INT, &maxlen );
+               if (maxlen != 1) {
+                   fprintf( stderr, "Should have received one integer; got %d\n",
+                            maxlen );
+               }
+               /* Check data: */
+               if (data != 100) {
+                   fprintf( stderr, 
+                            "Did not receive correct data: %d instead of %d\n", 
+                            data, 100 );
+               }
+           }
+       }
+    }
+    MPI_Barrier( MPI_COMM_WORLD );
+    Test_Waitforall( );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/testtypes.c b/teshsuite/smpi/mpich-test/pt2pt/testtypes.c
new file mode 100644 (file)
index 0000000..be04181
--- /dev/null
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+
+int main( int argc, char **argv )
+{
+  int i_size;
+  MPI_Aint i_extent;
+    
+  MPI_Init(&argc, &argv);
+
+
+  MPI_Type_extent(MPI_INT, &i_extent);
+  printf("MPI_Type_extent (MPI_INT) = %ld\n", i_extent);
+
+  MPI_Type_size(MPI_INT, &i_size);
+  printf("MPI_Type_size (MPI_INT) = %d\n", i_size);
+
+
+  MPI_Type_extent(MPI_UNSIGNED, &i_extent);
+  printf("MPI_Type_extent (MPI_UNSIGNED) = %ld\n", i_extent);
+
+  MPI_Type_size(MPI_UNSIGNED, &i_size);
+  printf("MPI_Type_size (MPI_UNSIGNED) = %d\n", i_size);
+
+#if defined(HAVE_LONG_DOUBLE)
+  MPI_Type_extent(MPI_LONG_DOUBLE, &i_extent);
+  printf("MPI_Type_extent (MPI_LONG_DOUBLE) = %ld\n", i_extent);
+
+  MPI_Type_size(MPI_LONG_DOUBLE, &i_size);
+  printf("MPI_Type_size (MPI_LONG_DOUBLE) = %d\n", i_size);
+#endif
+
+  Test_Waitforall( );
+  MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/third.c b/teshsuite/smpi/mpich-test/pt2pt/third.c
new file mode 100644 (file)
index 0000000..f8a2f24
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+    third - test program that tests queueing by sending messages with various
+            tags, receiving them in particular order.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "mpi.h"
+#include "test.h"
+#ifdef HAVE_UNISTD_H
+/* For sleep */
+#include <unistd.h>
+#endif
+
+#ifndef HAVE_SLEEP
+void sleep( int secs )
+{
+#ifdef VX_WORKS
+    /* Also needs include <time.h>? */
+    struct timespec rqtp = { 10, 0 };
+    nanosleep(&rqtp, NULL);
+#else
+    double t;
+    t = MPI_Wtime();
+    while (MPI_Wtime() - t < (double)secs) ;
+#endif
+}
+#endif
+
+/* Define VERBOSE to get printed output */
+int main( int argc, char **argv )
+{
+    int rank, size, to, from, tag, count;
+    int src, dest, waiter;
+    int st_count;
+#ifdef VERBOSE
+    int st_source, st_tag;
+#endif
+    MPI_Status status;
+    char data[100];
+    MPI_Request rq[2];
+    MPI_Status statuses[2];
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+/*
+    src  = size - 1;
+    dest = 0;
+ */
+    src = 0;
+    dest = size - 1;
+    /* waiter = dest; */       /* Receiver delays, so msgs unexpected */
+    /* waiter = src;  */       /* Sender delays, so recvs posted      */
+    waiter = 10000;            /* nobody waits */
+
+    if (rank == src)
+    {
+       if (waiter == src)
+           sleep(10);
+       to     = dest;
+       tag    = 2001;
+       sprintf(data,"First message, type 2001");
+       count = strlen(data) + 1;
+       MPI_Isend( data, count, MPI_CHAR, to, tag, MPI_COMM_WORLD, &rq[0] );
+#ifdef VERBOSE 
+       printf("%d sent :%s:\n", rank, data );
+#endif
+       tag    = 2002;
+       sprintf(data,"Second message, type 2002");
+       count = strlen(data) + 1;
+       MPI_Isend( data, count, MPI_CHAR, to, tag, MPI_COMM_WORLD, &rq[1] );
+       MPI_Waitall( 2, rq, statuses );
+#ifdef VERBOSE 
+       printf("%d sent :%s:\n", rank, data );
+#endif
+    }
+    else
+    if (rank == dest)
+    {
+       if (waiter == dest)
+           sleep(10);
+       from  = MPI_ANY_SOURCE;
+       count = 100;            
+
+       tag   = 2002;
+       MPI_Recv(data, count, MPI_CHAR, from, tag, MPI_COMM_WORLD, &status ); 
+
+       MPI_Get_count( &status, MPI_CHAR, &st_count );
+       if (st_count != strlen("Second message, type 2002") + 1) {
+           printf( "Received wrong length!\n" );
+           }
+#ifdef VERBOSE 
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;
+       printf( "Status info: source = %d, tag = %d, count = %d\n",
+               st_source, st_tag, st_count );
+       printf( "%d received :%s:\n", rank, data);
+#endif
+       tag   = 2001;
+       MPI_Recv(data, count, MPI_CHAR, from, tag, MPI_COMM_WORLD, &status ); 
+
+       MPI_Get_count( &status, MPI_CHAR, &st_count );
+       if (st_count != strlen("First message, type 2001") + 1) {
+           printf( "Received wrong length!\n" );
+           }
+#ifdef VERBOSE 
+       st_source = status.MPI_SOURCE;
+       st_tag    = status.MPI_TAG;\
+       printf( "Status info: source = %d, tag = %d, count = %d\n",
+               st_source, st_tag, st_count );
+       printf( "%d received :%s:\n", rank, data);
+#endif
+    }
+#ifdef VERBOSE 
+    printf( "Process %d exiting\n", rank );
+#endif
+    Test_Waitforall( );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/trunc.c b/teshsuite/smpi/mpich-test/pt2pt/trunc.c
new file mode 100644 (file)
index 0000000..d07993a
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * This file tests that message truncation errors are properly detected and
+ * handled (in particular, that data is NOT overwritten).
+ */
+
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "test.h"
+/* Prototypes for picky compilers */
+int SetupRecvBuf ( int * );
+int CheckRecvErr ( int, MPI_Status *, int *, const char * );
+
+int main( int argc, char **argv )
+{
+    int         err = 0, toterr;
+    int         world_rank;
+    MPI_Comm    comm, dupcomm;
+    int         rank, size;
+    int         partner, merr, flag;
+    MPI_Status  status;
+    MPI_Request request;
+    int         i, sendbuf[10], recvbuf[10];
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+
+    comm = MPI_COMM_WORLD;
+    MPI_Comm_dup( comm, &dupcomm );
+    MPI_Comm_rank( comm, &rank );
+    MPI_Comm_size( comm, &size );
+
+/* We'll RECEIVE into rank 0, just to simplify any debugging.  The tests are
+   sender                                     receiver
+   send( count = 10 )                         recv(count = 1)
+   isend( count = 10 )
+   sendrecv                                   sendrecv
+   wait                                       recv(count=1) (unexpected recv)
+                                              irecv( count = 1)
+   sendrecv                                   sendrecv               
+   send( count = 10)                          wait (expected/err trunc)
+                                              irecv( count = 1)
+   sendrecv                                   sendrecv
+   send( count = 10)                          test (expected/err trunc)
+ */
+   
+    if (size < 2) {
+       fprintf( stderr, "This test requires at least 2 processes\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+    if (rank == 0) {
+       /* Only return on the RECEIVERS side */
+       MPI_Errhandler_set( comm, MPI_ERRORS_RETURN );
+       partner = size - 1;
+       SetupRecvBuf( recvbuf );
+       merr = MPI_Recv( recvbuf, 1, MPI_INT, partner, 1, comm, &status );
+       err += CheckRecvErr( merr, &status, recvbuf, "Recv" );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     dupcomm, &status );
+
+       SetupRecvBuf( recvbuf );
+       merr = MPI_Recv( recvbuf, 1, MPI_INT, partner, 2, comm, &status );
+       err += CheckRecvErr( merr, &status, recvbuf, "Unexpected Recv" );
+
+       SetupRecvBuf( recvbuf );
+       merr = MPI_Irecv( recvbuf, 1, MPI_INT, partner, 3, comm, &request );
+    
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     dupcomm, &status );
+       merr = MPI_Wait( &request, &status );
+       err += CheckRecvErr( merr, &status, recvbuf, "Irecv/Wait" );
+
+       SetupRecvBuf( recvbuf );
+       merr = MPI_Irecv( recvbuf, 1, MPI_INT, partner, 4, comm, &request );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     dupcomm, &status );
+       do { 
+           merr = MPI_Test( &request, &flag, &status );
+       } while (merr == 0 && flag == 0);
+       err += CheckRecvErr( merr, &status, recvbuf, "Irecv/Test" );
+    }
+    else if (rank == size - 1) {
+       partner = 0;
+       for (i=0; i<10; i++) 
+           sendbuf[i] = 100 + i;
+       MPI_Send( sendbuf, 10, MPI_INT, partner, 1, comm );
+       MPI_Isend( sendbuf, 10, MPI_INT, partner, 2, comm, &request );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     dupcomm, &status );
+       MPI_Wait( &request, &status );
+
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     dupcomm, &status );
+       MPI_Send( sendbuf, 10, MPI_INT, partner, 3, comm );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     dupcomm, &status );
+       MPI_Send( sendbuf, 10, MPI_INT, partner, 4, comm );
+    }
+    MPI_Comm_free( &dupcomm );
+
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (world_rank == 0) {
+       if (toterr == 0) 
+           printf( " No Errors\n" );
+       else
+           printf( "Found %d errors in Truncated Message test\n", toterr );
+    }
+    MPI_Finalize( );
+    return toterr;
+}
+
+int SetupRecvBuf( recvbuf )
+int *recvbuf;
+{
+    int i;
+    for (i=0; i<10; i++) 
+       recvbuf[i] = i+1;
+    return 0;
+}
+
+int CheckRecvErr( merr, status, recvbuf, msg )
+int        merr, *recvbuf;
+MPI_Status *status;
+const char       *msg;
+{
+    int  class;
+    int  err = 0, rlen;
+    char buf[MPI_MAX_ERROR_STRING];
+
+/* Get the MPI Error class from merr */
+    MPI_Error_class( merr, &class );
+    switch (class) {
+    case MPI_ERR_TRUNCATE:
+       /* Check that data buf is ok */
+       if (recvbuf[1] != 2) {
+           err++;
+           fprintf( stderr, 
+                    "Receive buffer overwritten!  Found %d in 2nd pos.\n",
+                    recvbuf[1] );
+       }
+       break;
+
+    case MPI_ERR_IN_STATUS:
+       /* Check for correct message */
+       /* ERR IN STATUS is correct ONLY for multiple completion routines */
+/*     if (status->MPI_ERROR == MPI_ERR_TRUNCATE) 
+           break; */
+       /* Else, fall through into default... */
+    default:
+       /* Wrong error; get message and print */
+       MPI_Error_string( merr, buf, &rlen );
+       fprintf( stderr, 
+                "Got unexpected error message from %s: %s\n", msg, buf );
+       err++;
+    }
+    return err;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/truncmult.c b/teshsuite/smpi/mpich-test/pt2pt/truncmult.c
new file mode 100644 (file)
index 0000000..7f1e68b
--- /dev/null
@@ -0,0 +1,258 @@
+/*
+ * This file tests that message truncation errors are properly detected and
+ * handled (in particular, that data is NOT overwritten).
+ * 
+ * This version checks the multiple completion routines
+ */
+
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "test.h"
+/* Prototypes for picky compilers */
+int SetupRecvBuf ( int * );
+int CheckRecvErr ( int, MPI_Status *, int *, const char * );
+int CheckRecvOk  ( MPI_Status *, int *, int, const char * );
+
+int main( int argc, char **argv )
+{
+    int         err = 0, toterr;
+    int         world_rank;
+    MPI_Comm    comm, dupcomm;
+    int         rank, size;
+    int         partner, merr;
+    MPI_Status  statuses[4], status;
+    MPI_Request requests[4];
+    int         i, sendbuf[10],
+               recvbuf1[10], recvbuf2[10], recvbuf3[10], recvbuf4[10];
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
+
+    comm = MPI_COMM_WORLD;
+    MPI_Comm_dup( comm, &dupcomm );
+    MPI_Comm_rank( comm, &rank );
+    MPI_Comm_size( comm, &size );
+
+/* We'll RECEIVE into rank 0, just to simplify any debugging.  Just in 
+   case the MPI implementation tests for errors when the irecv is issued,
+   we make sure that the matching sends don't occur until the receives
+   are posted.
+
+   sender                                     receiver
+                                              irecv(tag=1,count=1)
+                                             irecv(tag=2,count=1)
+   sendrecv                                   sendrecv
+   send(tag=1,count=1)                        
+   send(tag=2,count=10)
+                                              waitall()
+                                                error in status, err trunc
+                                                wait for tag = 1 if necessary
+   sendrecv                                   sendrecv
+   Ditto, but with 2 truncated messages
+   Ditto, but with testall. (not done yet)
+   All of the above, but with waitsome/testsome (not done yet)
+ */
+   
+    if (rank == 0) {
+       /* Only return on the RECEIVERS side */
+       MPI_Errhandler_set( comm, MPI_ERRORS_RETURN );
+       partner = size - 1;
+
+       SetupRecvBuf( recvbuf1 );
+       SetupRecvBuf( recvbuf2 );
+       merr = MPI_Irecv( recvbuf1, 1, MPI_INT, partner, 1, comm, 
+                         &requests[0] );  /* this will succeed */
+       merr = MPI_Irecv( recvbuf2, 1, MPI_INT, partner, 2, comm, 
+                         &requests[1] );  /* this will fail */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     dupcomm, &status );
+       merr = MPI_Waitall( 2, requests, statuses );
+       if (merr != MPI_ERR_IN_STATUS) {
+           err++;
+           fprintf( stderr, "Did not return MPI_ERR_IN_STATUS\n" );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+       if (statuses[0].MPI_ERROR == MPI_ERR_PENDING) {
+           /* information - first send is not yet complete */
+           if ((statuses[0].MPI_ERROR = MPI_Wait( &requests[0], &statuses[0] )) == MPI_SUCCESS) {
+               err++;
+               fprintf( stderr, "failed to complete legal request (1)\n" );
+           }
+       }
+       if (statuses[0].MPI_ERROR != MPI_SUCCESS) {
+           err ++;
+           fprintf( stderr, "Could not complete legal send-receive\n" );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+       err += CheckRecvErr( merr, &statuses[1], recvbuf2, "Irecv" );
+
+       SetupRecvBuf( recvbuf1 );
+       SetupRecvBuf( recvbuf2 );
+       SetupRecvBuf( recvbuf3 );
+       SetupRecvBuf( recvbuf4 );
+       merr = MPI_Irecv( recvbuf1, 1, MPI_INT, partner, 1, comm, 
+                         &requests[0] );  /* this will succeed */
+       merr = MPI_Irecv( recvbuf2, 1, MPI_INT, partner, 2, comm, 
+                         &requests[1] );  /* this will fail */
+       merr = MPI_Irecv( recvbuf3, 1, MPI_INT, partner, 3, comm, 
+                         &requests[2] );  /* this will fail */
+       merr = MPI_Irecv( recvbuf4, 1, MPI_INT, partner, 4, comm, 
+                         &requests[3] );  /* this will succeed */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     dupcomm, &status );
+       merr = MPI_Waitall( 4, requests, statuses );
+       if (merr != MPI_ERR_IN_STATUS) {
+           err++;
+           fprintf( stderr, "Did not return MPI_ERR_IN_STATUS (4)\n" );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+       if (statuses[0].MPI_ERROR == MPI_ERR_PENDING) {
+           /* information - first send is not yet complete */
+           if ((statuses[0].MPI_ERROR = MPI_Wait( &requests[0], &statuses[0] )) != MPI_SUCCESS) {
+               err++;
+               fprintf( stderr, "failed to complete legal request (1a)\n" );
+           }
+       }
+       /* Check for correct completion */
+       err += CheckRecvOk( &statuses[0], recvbuf1, 1, "4-1" );
+
+       if (statuses[3].MPI_ERROR == MPI_ERR_PENDING) {
+           /* information - first send is not yet complete */
+           if ((statuses[3].MPI_ERROR = MPI_Wait( &requests[3], &statuses[3] )) != MPI_SUCCESS) {
+               err++;
+               fprintf( stderr, "failed to complete legal request (3a)\n" );
+           }
+       }
+       /* Check for correct completion */
+       err += CheckRecvOk( &statuses[3], recvbuf4, 4, "4-4" );
+
+       if (statuses[0].MPI_ERROR != MPI_SUCCESS) {
+           err ++;
+           fprintf( stderr, "Could not complete legal send-receive-0\n" );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+       if (statuses[3].MPI_ERROR != MPI_SUCCESS) {
+           err ++;
+           fprintf( stderr, "Could not complete legal send-receive-3\n" );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+       
+       if (statuses[1].MPI_ERROR == MPI_ERR_PENDING) {
+           statuses[1].MPI_ERROR = MPI_Wait( &requests[1], &statuses[1] );
+       }
+       err += CheckRecvErr( merr, &statuses[1], recvbuf2, "Irecv-2" );
+       if (statuses[2].MPI_ERROR == MPI_ERR_PENDING) {
+           statuses[2].MPI_ERROR = MPI_Wait( &requests[2], &statuses[2] );
+       }
+       err += CheckRecvErr( merr, &statuses[2], recvbuf3, "Irecv-3" );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     dupcomm, &status );
+    }
+    else if (rank == size - 1) {
+       partner = 0;
+       for (i=0; i<10; i++) 
+           sendbuf[i] = 100 + i;
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     dupcomm, &status );
+       MPI_Send( sendbuf, 1, MPI_INT, partner, 1, comm );
+       MPI_Send( sendbuf, 10, MPI_INT, partner, 2, comm );
+
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     dupcomm, &status );
+       MPI_Send( sendbuf, 1, MPI_INT, partner, 1, comm );
+       MPI_Send( sendbuf, 10, MPI_INT, partner, 2, comm );
+       MPI_Send( sendbuf, 10, MPI_INT, partner, 3, comm );
+       MPI_Send( sendbuf, 1, MPI_INT, partner, 4, comm );
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     MPI_BOTTOM, 0, MPI_INT, partner, 0,
+                     dupcomm, &status );
+    }
+    MPI_Comm_free( &dupcomm );
+
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (world_rank == 0) {
+       if (toterr == 0) 
+           printf( " No Errors\n" );
+       else
+           printf( "Found %d errors in Truncated Message Multiple Completion test\n", toterr );
+    }
+    MPI_Finalize( );
+    return toterr;
+}
+
+int SetupRecvBuf( recvbuf )
+int *recvbuf;
+{
+    int i;
+    for (i=0; i<10; i++) 
+       recvbuf[i] = i+1;
+    return 0;
+}
+
+int CheckRecvOk( status, recvbuf, tag, msg )
+int        *recvbuf, tag;
+MPI_Status *status;
+const char       *msg;
+{
+    int err = 0, count;
+
+    if (status->MPI_TAG != tag) {
+       err++;
+       fprintf( stderr, "Wrong tag; was %d should be %d (%s)\n", 
+                status->MPI_TAG, tag, msg );
+    }
+    MPI_Get_count( status, MPI_INT, &count );
+    if (count != 1) {
+       err++;
+       fprintf( stderr, "Wrong count; was %d expected 1 (%s)\n", count, msg );
+    }
+    return err;
+}
+
+int CheckRecvErr( merr, status, recvbuf, msg )
+int        merr, *recvbuf;
+MPI_Status *status;
+const char       *msg;
+{
+    int  class;
+    int  err = 0, rlen;
+    char buf[MPI_MAX_ERROR_STRING];
+
+/* Get the MPI Error class from merr */
+    MPI_Error_class( merr, &class );
+    switch (class) {
+    case MPI_ERR_TRUNCATE:
+       /* Check that data buf is ok */
+       if (recvbuf[1] != 2) {
+           err++;
+           fprintf( stderr, 
+                    "Receive buffer overwritten!  Found %d in 2nd pos.\n",
+                    recvbuf[1] );
+       }
+       break;
+
+    case MPI_ERR_IN_STATUS:
+       /* Check for correct message */
+        MPI_Error_class(status->MPI_ERROR, &class);
+       if (class != MPI_ERR_TRUNCATE) {
+           MPI_Error_string( status->MPI_ERROR, buf, &rlen );
+           fprintf( stderr, 
+                "Unexpected error message for err in status for %s: %s\n", 
+                msg, buf );
+       }
+       break;
+    default:
+       /* Wrong error; get message and print */
+       MPI_Error_string( merr, buf, &rlen );
+       fprintf( stderr, 
+                "Got unexpected error message from %s: %s\n", msg, buf );
+       err++;
+    }
+    return err;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/typebase.c b/teshsuite/smpi/mpich-test/pt2pt/typebase.c
new file mode 100644 (file)
index 0000000..bdd784a
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+/* 
+ * This program checks that the type inquiry routines work with the 
+ * basic types
+ */
+
+#define MAX_TYPES 14
+static int ntypes;
+static MPI_Datatype BasicTypes[MAX_TYPES];
+static char         *(BasicTypesName[MAX_TYPES]);
+static int          BasicSizes[MAX_TYPES];
+
+/* Prototypes for picky compilers */
+void SetupBasicTypes (void);
+
+void 
+SetupBasicTypes()
+{
+    BasicTypes[0] = MPI_CHAR;
+    BasicTypes[1] = MPI_SHORT;
+    BasicTypes[2] = MPI_INT;
+    BasicTypes[3] = MPI_LONG;
+    BasicTypes[4] = MPI_UNSIGNED_CHAR;
+    BasicTypes[5] = MPI_UNSIGNED_SHORT;
+    BasicTypes[6] = MPI_UNSIGNED;
+    BasicTypes[7] = MPI_UNSIGNED_LONG;
+    BasicTypes[8] = MPI_FLOAT;
+    BasicTypes[9] = MPI_DOUBLE;
+
+    BasicTypesName[0] = (char*)"MPI_CHAR";
+    BasicTypesName[1] = (char*)"MPI_SHORT";
+    BasicTypesName[2] = (char*)"MPI_INT";
+    BasicTypesName[3] = (char*)"MPI_LONG";
+    BasicTypesName[4] = (char*)"MPI_UNSIGNED_CHAR";
+    BasicTypesName[5] = (char*)"MPI_UNSIGNED_SHORT";
+    BasicTypesName[6] = (char*)"MPI_UNSIGNED";
+    BasicTypesName[7] = (char*)"MPI_UNSIGNED_LONG";
+    BasicTypesName[8] = (char*)"MPI_FLOAT";
+    BasicTypesName[9] = (char*)"MPI_DOUBLE";
+
+    BasicSizes[0] = sizeof(char);
+    BasicSizes[1] = sizeof(short);
+    BasicSizes[2] = sizeof(int);
+    BasicSizes[3] = sizeof(long);
+    BasicSizes[4] = sizeof(unsigned char);
+    BasicSizes[5] = sizeof(unsigned short);
+    BasicSizes[6] = sizeof(unsigned);
+    BasicSizes[7] = sizeof(unsigned long);
+    BasicSizes[8] = sizeof(float);
+    BasicSizes[9] = sizeof(double);
+
+    ntypes = 10;
+#ifdef HAVE_LONG_DOUBLE
+    BasicTypes[ntypes] = MPI_LONG_DOUBLE;
+    BasicSizes[ntypes] = sizeof(long double);
+    BasicTypesName[ntypes] = (char*)"MPI_LONG_DOUBLE";
+    ntypes++;
+#endif
+    BasicTypes[ntypes] = MPI_BYTE;
+    BasicSizes[ntypes] = sizeof(unsigned char);
+    BasicTypesName[ntypes] = (char*)"MPI_BYTE";
+    ntypes++;
+
+#ifdef HAVE_LONG_LONG_INT
+    BasicTypes[ntypes] = MPI_LONG_LONG_INT;
+    BasicSizes[ntypes] = sizeof(long long);
+    BasicTypesName[ntypes] = "MPI_LONG_LONG_INT";
+    ntypes++;
+#endif
+    }
+
+int main( int argc, char **argv )
+{
+int      i, errs;
+int      size;
+MPI_Aint extent, lb, ub;
+MPI_Init( &argc, &argv );
+
+/* This should be run by a single process */
+
+SetupBasicTypes();
+
+errs = 0;
+for (i=0; i<ntypes; i++) {
+    MPI_Type_size( BasicTypes[i], &size );
+    MPI_Type_extent( BasicTypes[i], &extent );
+    MPI_Type_lb( BasicTypes[i], &lb );
+    MPI_Type_ub( BasicTypes[i], &ub );
+    if (size != extent) {
+       errs++;
+       printf( "size (%d) != extent (%ld) for basic type %s\n", size, 
+               (long) extent, BasicTypesName[i] );
+       }
+    if (size != BasicSizes[i]) {
+       errs++;
+       printf( "size(%d) != C size (%d) for basic type %s\n", size, 
+              BasicSizes[i], BasicTypesName[i] );
+       }
+    if (lb != 0) {
+       errs++;
+       printf( "Lowerbound of %s was %d instead of 0\n", 
+               BasicTypesName[i], (int)lb );
+       }
+    if (ub != extent) {
+       errs++;
+       printf( "Upperbound of %s was %d instead of %d\n", 
+               BasicTypesName[i], (int)ub, (int)extent );
+       }
+    }
+
+if (errs) {
+    printf( "Found %d errors in testing C types\n", errs );
+    }
+else {
+    printf( "Found no errors in basic C types\n" );
+    }
+
+MPI_Finalize( );
+return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/typebase.std b/teshsuite/smpi/mpich-test/pt2pt/typebase.std
new file mode 100644 (file)
index 0000000..409e123
--- /dev/null
@@ -0,0 +1 @@
+Found no errors in basic C types
diff --git a/teshsuite/smpi/mpich-test/pt2pt/typebasef.f b/teshsuite/smpi/mpich-test/pt2pt/typebasef.f
new file mode 100644 (file)
index 0000000..3bb6a24
--- /dev/null
@@ -0,0 +1,71 @@
+C
+C Fortran program to test the basic Fortran types
+C 
+      subroutine SetupBasicTypes( basictypes, basicnames )
+      include 'mpif.h'
+      integer basictypes(*)
+      character*40 basicnames(*)
+C
+      basictypes(1) = MPI_INTEGER
+      basictypes(2) = MPI_REAL
+      basictypes(3) = MPI_DOUBLE_PRECISION
+      basictypes(4) = MPI_COMPLEX
+      basictypes(5) = MPI_LOGICAL
+      basictypes(6) = MPI_CHARACTER
+      basictypes(7) = MPI_BYTE
+      basictypes(8) = MPI_PACKED
+C      
+      basicnames(1) = 'INTEGER'
+      basicnames(2) = 'REAL'
+      basicnames(3) = 'DOUBLE PRECISION'
+      basicnames(4) = 'COMPLEX'
+      basicnames(5) = 'LOGICAL'
+      basicnames(6) = 'CHARACTER'
+      basicnames(7) = 'BYTE'
+      basicnames(8) = 'PACKED'
+C
+      return
+      end
+C
+      program main
+      include 'mpif.h'
+      integer basictypes(8)
+      character*40 basicnames(8)
+      integer i, errcnt, ierr
+      integer size, extent, ub, lb
+C
+      call mpi_init(ierr)
+C
+      call SetupBasicTypes( basictypes, basicnames )
+C
+      errcnt = 0
+      do 10 i=1,8 
+         call MPI_Type_size( BasicTypes(i), size, ierr )
+         call MPI_Type_extent( BasicTypes(i), extent, ierr )
+         call MPI_Type_lb( BasicTypes(i), lb, ierr )
+         call MPI_Type_ub( BasicTypes(i), ub, ierr )
+         if (size .ne. extent) then
+           errcnt = errcnt + 1
+            print *, "size (", size, ") != extent (", extent, 
+     *         ") for basic type ", basicnames(i)
+        endif
+         if (lb .ne. 0) then
+            errcnt = errcnt + 1
+            print *, "Lowerbound of ", basicnames(i), " was ", lb, 
+     *         " instead of 0" 
+         endif
+         if (ub .ne. extent) then
+            errcnt = errcnt + 1
+            print *, "Upperbound of ", basicnames(i), " was ",
+     *        ub, " instead of ", extent
+         endif
+ 10   continue
+C
+      if (errcnt .gt. 0) then
+         print *, "Found ", errcnt, " errors in testing Fortran types"
+      else
+         print *, " Found no errors in basic Fortran "
+      endif
+C
+      call mpi_finalize(ierr)
+      end
diff --git a/teshsuite/smpi/mpich-test/pt2pt/typecreate.c b/teshsuite/smpi/mpich-test/pt2pt/typecreate.c
new file mode 100644 (file)
index 0000000..bc606b5
--- /dev/null
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include "mpi.h"
+#include "test.h"
+#include <stdlib.h>
+
+int main( int argc, char **argv )
+{
+    int i, n, n_goal = 2048, rc, len;
+    MPI_Datatype *type_array;
+    char msg[MPI_MAX_ERROR_STRING];
+
+    MPI_Init( &argc, &argv );
+    MPI_Errhandler_set( MPI_COMM_WORLD, MPI_ERRORS_RETURN );
+
+    n = n_goal;
+
+    type_array = (MPI_Datatype *)malloc( n * sizeof(MPI_Datatype) );
+    
+    for (i=0; i<n; i++) {
+       int             blens[2];
+       MPI_Aint        displ[2];
+       MPI_Datatype    types[2];
+
+       blens[0] = 2;
+       blens[1] = 3;
+       displ[0] = 0;
+       displ[1] = (i+2) * sizeof(int);
+       types[0] = MPI_INT;
+       types[1] = MPI_DOUBLE;
+       rc = MPI_Type_struct( 2, blens, displ, types, type_array + i );
+       if (rc) {
+           fprintf( stderr, "Error when creating type number %d\n", i );
+           MPI_Error_string( rc, msg, &len );
+           fprintf( stderr, "%s\n", msg );
+           n = i + 1;
+           break;
+       }
+       rc = MPI_Type_commit( type_array + i );
+       if (rc) {
+           fprintf( stderr, "Error when commiting type number %d\n", i );
+           MPI_Error_string( rc, msg, &len );
+           fprintf( stderr, "%s\n", msg );
+           n = i + 1;
+           break;
+       }
+    }
+    for (i=0; i<n; i++) {
+       rc = MPI_Type_free( type_array + i );
+       if (rc) {
+           fprintf( stderr, "Error when freeing type number %d\n", i );
+           MPI_Error_string( rc, msg, &len );
+           fprintf( stderr, "%s\n", msg );
+           break;
+       }
+    }
+    free( type_array );
+    printf( "Completed test of %d type creations\n", n );
+    if (n != n_goal) {
+       printf (
+"This MPI implementation limits the number of datatypes that can be created\n\
+This is allowed by the standard and is not a bug, but is a limit on the\n\
+implementation\n" );
+    }
+    MPI_Finalize( );
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/typecreate.std b/teshsuite/smpi/mpich-test/pt2pt/typecreate.std
new file mode 100644 (file)
index 0000000..2e09a88
--- /dev/null
@@ -0,0 +1 @@
+Completed test of 2048 type creations
diff --git a/teshsuite/smpi/mpich-test/pt2pt/typelb.c b/teshsuite/smpi/mpich-test/pt2pt/typelb.c
new file mode 100644 (file)
index 0000000..1da6964
--- /dev/null
@@ -0,0 +1,45 @@
+#include "mpi.h"
+#include <stdio.h>
+
+int
+main( int argc, char **argv)
+{
+    int blockcnt[2], rank;
+    MPI_Aint offsets[2], lb, ub, extent;
+    MPI_Datatype tmp_type, newtype;
+
+    MPI_Init(&argc, &argv);
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    if (rank == 0) {
+       blockcnt[0] = 1;
+       offsets[0] = 3;
+       MPI_Type_hindexed(1, blockcnt, offsets, MPI_BYTE, &tmp_type);
+       blockcnt[0] = 1;
+       offsets[0] = 1;
+       MPI_Type_hindexed(1, blockcnt, offsets, tmp_type, &newtype);
+       MPI_Type_commit(&newtype);
+       
+       MPI_Type_lb(newtype, &lb);
+       MPI_Type_extent(newtype, &extent);
+       MPI_Type_ub(newtype, &ub);
+       
+       /* Check that the results are correct */
+#ifdef DEBUG
+       printf("lb=%ld, ub=%ld, extent=%ld\n", lb, ub, extent);
+       printf("Should be lb=4, ub=5, extent=1\n");
+#endif
+       if (lb != 4 || ub != 5 || extent != 1) {
+           printf ("lb = %ld (should be 4), ub = %ld (should be 5) extent = %ld should be 1\n", lb, ub, extent) ;
+       }
+       else {
+           printf( " No Errors\n" );
+       }
+
+       MPI_Type_free(&tmp_type);
+       MPI_Type_free(&newtype);
+
+    }
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/typetest.c b/teshsuite/smpi/mpich-test/pt2pt/typetest.c
new file mode 100644 (file)
index 0000000..593728c
--- /dev/null
@@ -0,0 +1,310 @@
+/* 
+ * Patrick Bridges * bridges@mcs.anl.gov * patrick@CS.MsState.Edu 
+ *
+ * Modified by William Gropp
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "test.h"
+#include "mpi.h"
+#include <string.h>
+/* CM5 users need to comment out the next include (memory.h) because 
+   of an error in the CM5 include file (memory.h is inconsistent with
+   string.h) */
+/* #include <memory.h> */
+
+struct struct1 {
+    double d1;
+    char   c1[8];
+};
+
+
+struct struct2 {
+    double d1;
+    double d2;
+    char   c1[8];
+    char   c2[8];
+    double d3;
+    char   c3[8];
+    double d4;
+    char   c4[8];
+};
+
+struct struct3 {
+    double d1[2];
+    char  c1[2][8];
+    struct struct1 s1[2];
+};
+
+/* Structure with probable gap */
+struct struct4 {
+    int a1;
+    char c1, c2;
+    int a2;
+};   
+
+int main( int argc, char **argv )
+{
+    int rank, size, ret; 
+    MPI_Status Status;
+    MPI_Datatype struct1_t, struct2_t, struct3_t, struct4_t, struct4a_t,
+       astruct1_t, carray_t;
+    static int block1[2] = {1, 1};
+    static int block2[6] = {2, 2, 1, 1, 1, 1};
+    static int block3[3] = {2, 2, 1};
+    static int block4[4] = {1, 1, 1, 1};
+    static int block4a[3] = {1, 2, 1};
+    MPI_Aint disp1[2], disp2[6], disp3[6], disp4[4], disp4a[3];
+    MPI_Datatype type1[2], type2[6], type3[3];
+    MPI_Datatype type4[4] = {MPI_INT, MPI_CHAR, MPI_CHAR, MPI_INT};
+    MPI_Datatype type4a[3] = {MPI_INT, MPI_CHAR, MPI_INT};
+    struct struct1 dummy1;
+    struct struct2 dummy2;
+    struct struct3 dummy3;
+    struct struct4 dummy4;
+    int i, master_rank = 0, slave_rank = 1;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    for (i=1; i<argc; i++) {
+       if (argv[i] && strcmp("-alt",argv[i]) == 0) {
+           master_rank = 1;
+           slave_rank  = 0;
+           printf( "[%d] setting master rank to 1\n", rank );
+           }
+       }
+
+    Test_Init("typetest", rank);
+
+    /* Create some types to try out */
+
+    /* A simple array of characters */ 
+    MPI_Type_contiguous(8, MPI_CHAR, &carray_t); 
+    ret = MPI_Type_commit(&carray_t);
+    if (ret != MPI_SUCCESS) {
+       fprintf(stderr, "Could not make char array type."), fflush(stderr); 
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    /* A fairly simple structure */
+    MPI_Address( &dummy1, &disp1[0] );
+    MPI_Address( &dummy1.c1[0], &disp1[1] );
+    disp1[1] = disp1[1] - disp1[0];
+    disp1[0] = 0;
+    type1[0] = MPI_DOUBLE;
+    type1[1] = carray_t;
+    MPI_Type_struct(2, block1, disp1, type1, &struct1_t);
+    ret = MPI_Type_commit(&struct1_t);
+    if (ret != MPI_SUCCESS) {
+       fprintf(stderr, "Could not make struct 1."); fflush(stderr); 
+        MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    /* And a short array of this type */
+    MPI_Type_contiguous(2, struct1_t, &astruct1_t);
+    ret = MPI_Type_commit(&astruct1_t);
+    if (ret != MPI_SUCCESS) {
+       fprintf(stderr, "Could not make struct 1 array."); fflush(stderr);
+        MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    
+    /* A more complex structure */
+    MPI_Address( &dummy2, &disp2[0] );
+    MPI_Address( &dummy2.c1[0], &disp2[1] );
+    MPI_Address( &dummy2.d3, &disp2[2] );
+    MPI_Address( &dummy2.c3[0], &disp2[3] );
+    MPI_Address( &dummy2.d4, &disp2[4] );
+    MPI_Address( &dummy2.c4[0], &disp2[5] );
+    for (i=1; i<6; i++) {
+      disp2[i] = disp2[i] - disp2[0];
+    }
+    disp2[0] = 0;                    
+    type2[0] = MPI_DOUBLE; type2[1] = carray_t; type2[2] = MPI_DOUBLE;
+    type2[3] = carray_t; type2[4] = MPI_DOUBLE; type2[5] = carray_t;
+    MPI_Type_struct(6, block2, disp2, type2, &struct2_t);
+    ret = MPI_Type_commit(&struct2_t);
+    if (ret != MPI_SUCCESS) {
+       fprintf(stderr, "Could not make struct 2."), fflush(stderr);
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    /* Another (hopefully compatible) complex structure */
+    MPI_Address( &dummy3, &disp3[0] );
+    MPI_Address( &dummy3.c1[0][0], &disp3[1] );
+    MPI_Address( &dummy3.s1[0], &disp3[2] );
+    for (i=1; i<3; i++) 
+      disp3[i] = disp3[i] - disp3[0];
+    disp3[0] = 0; 
+    type3[0] = MPI_DOUBLE; type3[1] = carray_t; type3[2] = astruct1_t;
+    MPI_Type_struct(3, block3, disp3, type3, &struct3_t);
+    ret = MPI_Type_commit(&struct3_t);
+    if (ret != MPI_SUCCESS) {
+       fprintf(stderr, "Could not make struct 3."), fflush(stderr);
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    /* A structure with gaps (invokes padding) */
+    MPI_Address( &dummy4.a1, &disp4[0] );
+    MPI_Address( &dummy4.c1, &disp4[1] );
+    MPI_Address( &dummy4.c2, &disp4[2] );
+    MPI_Address( &dummy4.a2, &disp4[3] );
+    for (i=1; i<4; i++) 
+       disp4[i] = disp4[i] - disp4[0];
+    disp4[0] = 0;
+    MPI_Type_struct(4, block4, disp4, type4, &struct4_t);
+    ret = MPI_Type_commit(&struct4_t);
+
+
+    MPI_Address( &dummy4.a1, &disp4a[0] );
+    MPI_Address( &dummy4.c1, &disp4a[1] );
+    MPI_Address( &dummy4.a2, &disp4a[2] );
+    for (i=1; i<3; i++) 
+       disp4a[i] = disp4a[i] - disp4a[0];
+    disp4a[0] = 0;
+    MPI_Type_struct(3, block4a, disp4a, type4a, &struct4a_t);
+    ret = MPI_Type_commit(&struct4a_t);
+
+    /* Wait for everyone to be ready */
+    MPI_Barrier(MPI_COMM_WORLD);
+    if (rank == master_rank) {         
+
+       /* Fill up the type */
+       dummy2.d1 = 11.0; dummy2.d2 = 12.0; dummy2.d3 = 13.0; dummy2.d4 = 14.0;
+       strncpy(dummy2.c1, "two", 8);
+       strncpy(dummy2.c2, "four", 8);
+       strncpy(dummy2.c3, "six", 8);
+       strncpy(dummy2.c4, "eight", 8);
+       
+       /* Send the type */
+       MPI_Send(&dummy2, 1, struct2_t, slave_rank, 2000, MPI_COMM_WORLD);
+       /* Clear out the type */
+       memset(&dummy2, 0, sizeof(dummy2));
+       /* And receive it back */
+       MPI_Recv(&dummy2, 1, struct2_t, slave_rank, 2000, MPI_COMM_WORLD, 
+                &Status);
+       
+       /* Did it make it OK? */
+       if ((dummy2.d1 != 11.0) || (dummy2.d2 != 12.0) || 
+           (dummy2.d3 != 13.0) || (dummy2.d4 != 14.0) || 
+           strncmp(dummy2.c1, "two", 8) || strncmp(dummy2.c2, "four", 8) || 
+           strncmp(dummy2.c3, "six", 8) || strncmp(dummy2.c4, "eight", 8)) {
+           Test_Failed("Complex Type Round Trip Test");
+#ifdef MPE_USE_EXTENSIONS
+           printf( "Pack action is\n" );
+           MPIR_PrintDatatypePack( stdout, 1, struct2_t, (long)&dummy2, 0 );
+           printf( "Unpack action is\n" );
+           MPIR_PrintDatatypeUnpack( stdout, 1, struct2_t, 0, (long)&dummy2 );
+#endif
+       } else {
+           Test_Passed("Complex Type Round Trip Test");
+       }
+
+
+       /* Fill up the type again */
+       dummy2.d1 = 11.0; dummy2.d2 = 12.0; dummy2.d3 = 13.0; dummy2.d4 = 14.0;
+       strncpy(dummy2.c1, "two", 8);
+       strncpy(dummy2.c2, "four", 8);
+       strncpy(dummy2.c3, "six", 8);
+       strncpy(dummy2.c4, "eight", 8);
+       
+       /* Send the type */
+       MPI_Send(&dummy2, 1, struct2_t, slave_rank, 2000, MPI_COMM_WORLD);
+       /* Clear out the type */
+       memset(&dummy2, 0, sizeof(dummy2));
+       /* And receive it back */
+       MPI_Recv(&dummy2, 1, struct2_t, slave_rank, 2000, MPI_COMM_WORLD, 
+                &Status);
+       
+       /* Did it make it OK? */
+       if ((dummy2.d1 != 11.0) || (dummy2.d2 != 12.0) || 
+           (dummy2.d3 != 13.0) || (dummy2.d4 != 14.0) || 
+           strncmp(dummy2.c1, "two", 8) || strncmp(dummy2.c2, "four", 8) || 
+           strncmp(dummy2.c3, "six", 8) || strncmp(dummy2.c4, "eight", 8))
+           Test_Failed("Compatible Complex Type Round Trip Test");
+       else
+           Test_Passed("Compatible Complex Type Round Trip Test");
+
+       /* Expect ints to be at least 4 bytes.  Make sure that the MSbit is
+          0 so that there are no sign-extension suprises. */
+       dummy4.a1 = 0x17faec2b;
+       dummy4.c1 = 'c';
+       dummy4.c2 = 'F';
+       dummy4.a2 = 0x91fb8354;
+       MPI_Send( &dummy4, 1, struct4_t, slave_rank, 2004, MPI_COMM_WORLD );
+       memset( &dummy4, 0, sizeof(dummy4) );
+       MPI_Recv( &dummy4, 1, struct4a_t, slave_rank, 2004, MPI_COMM_WORLD, 
+                 &Status );
+       /* Check for correct data */
+       if (dummy4.a1 != 0x17faec2b || dummy4.c1 != 'c' ||
+           dummy4.c2 != 'F' || dummy4.a2 != 0x91fb8354) {
+           Test_Failed( "Padded Structure Type Round Trip Test" );
+           }
+       else {
+           Test_Passed( "Padded Structure Type Round Trip Test" );
+           }
+
+       if ((MPI_Type_free(&struct3_t) != MPI_SUCCESS) ||
+           (MPI_Type_free(&struct1_t) != MPI_SUCCESS) ||
+           (MPI_Type_free(&struct2_t) != MPI_SUCCESS) ||
+           (MPI_Type_free(&struct4_t) != MPI_SUCCESS) ||
+           (MPI_Type_free(&struct4a_t) != MPI_SUCCESS) ||
+           (MPI_Type_free(&astruct1_t) != MPI_SUCCESS) ||
+           (MPI_Type_free(&carray_t) != MPI_SUCCESS))
+           Test_Failed("Type Free test");
+       else
+           Test_Passed("Type Free test");
+       
+       Test_Waitforall( );
+    } else {
+       MPI_Recv(&dummy2, 1, struct2_t, master_rank, 2000, 
+                MPI_COMM_WORLD, &Status);
+       MPI_Send(&dummy2, 1, struct2_t, master_rank, 2000, MPI_COMM_WORLD);
+
+       MPI_Recv(&dummy3, 1, struct3_t, master_rank, 2000, MPI_COMM_WORLD, 
+                &Status);
+       if ((dummy3.d1[0] != 11.0) || (dummy3.d1[1] != 12.0) || 
+           (dummy3.s1[0].d1 != 13.0) || (dummy3.s1[1].d1 != 14.0) || 
+           strncmp(dummy3.c1[0], "two", 8) || 
+           strncmp(dummy3.c1[1], "four", 8) || 
+           strncmp(dummy3.s1[0].c1, "six", 8) || 
+           strncmp(dummy3.s1[1].c1, "eight", 8)) {
+
+           /* Kill dummy3 so it will die after it's sent back */
+           memset(&dummy3, 0, sizeof(dummy3));
+           Test_Message("Message didn't convert properly. Hosing \
+return message.");
+       }
+       MPI_Send(&dummy3, 1, struct3_t, master_rank, 2000, MPI_COMM_WORLD);
+
+       /* Use same structure type */
+       MPI_Recv( &dummy4, 1, struct4_t, master_rank, 2004, MPI_COMM_WORLD, 
+                 &Status );
+       MPI_Send( &dummy4, 1, struct4_t, master_rank, 2004, MPI_COMM_WORLD );
+
+       if ((MPI_Type_free(&struct3_t) != MPI_SUCCESS) ||
+           (MPI_Type_free(&struct1_t) != MPI_SUCCESS) ||
+           (MPI_Type_free(&struct2_t) != MPI_SUCCESS) ||
+           (MPI_Type_free(&struct4_t) != MPI_SUCCESS) ||
+           (MPI_Type_free(&struct4a_t) != MPI_SUCCESS) ||
+           (MPI_Type_free(&astruct1_t) != MPI_SUCCESS) ||
+           (MPI_Type_free(&carray_t) != MPI_SUCCESS))
+           Test_Failed("Type Free test");
+       else
+           Test_Passed("Type Free test");
+
+       Test_Waitforall( );
+    }
+
+    if (rank == master_rank) {         
+       (void)Summarize_Test_Results();
+       }
+
+    Test_Finalize();
+    MPI_Finalize();
+
+return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/typeub.c b/teshsuite/smpi/mpich-test/pt2pt/typeub.c
new file mode 100644 (file)
index 0000000..56b7660
--- /dev/null
@@ -0,0 +1,88 @@
+#include <math.h>
+#include <stdio.h>
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+/*
+ *     Trying to manipulate the extent of a datatype with succesive
+ *     calls to MPI_Type_struct.  Tests that a MPI_UB buried within
+ *      a structure is found.  From kalns@canidae.cps.msu.edu (modified to
+ *      fit test structure).
+ */
+int main( int argc, char **argv )
+{
+   int          errs = 0, toterrs, rank; 
+   MPI_Aint    extent;
+   int         blens[2];
+   MPI_Aint    displ[2];
+   MPI_Datatype types[2];
+   MPI_Datatype type1,type2,type3;
+   MPI_Aint     extent1, extent2, extent3;
+
+   MPI_Init( &argc, &argv );
+
+  /*   2 blocks of 1 int each, stride of 4 ; expect extent to be 20
+   */
+   MPI_Type_vector( 2, 1, 4, MPI_INT, &type1 );
+   MPI_Type_commit( &type1 );
+   MPI_Type_extent( type1, &extent );
+   extent1 = 5 * sizeof(int);
+   if (extent != extent1) {
+       errs++;
+       printf("extent(type1)=%ld\n",(long)extent);
+       }
+
+   blens[0]=1;
+   blens[1]=1;
+   displ[0]=0;
+   displ[1]=sizeof(int)*4;
+   types[0]=type1;
+   types[1]=MPI_UB;
+   extent2 = displ[1];
+
+  /*   using MPI_UB and Type_struct, monkey with the extent, making it 16
+   */
+   MPI_Type_struct( 2, blens, displ, types, &type2 );
+   MPI_Type_commit( &type2 );
+   MPI_Type_extent( type2, &extent );
+   if (extent != extent2) {
+       errs++;
+       printf("extent(type2)=%ld\n",(long)extent);
+       }
+
+  /*   monkey with the extent again, making it 4
+   *   ===> MPICH gives 4      
+   *   ===> MPIF gives 16, the old extent      
+   */
+   displ[1]=sizeof(int);
+   types[0]=type2;
+   types[1]=MPI_UB;
+   extent3 = extent2;
+
+   MPI_Type_struct( 2, blens, displ, types, &type3 );
+   MPI_Type_commit( &type3 );
+
+   MPI_Type_extent( type3, &extent );
+   if (extent != extent3 && extent != 4) {
+       errs++;
+       printf("extent(type3)=%ld\n",(long)extent);
+       }
+
+   MPI_Type_free( &type1 );
+   MPI_Type_free( &type2 );
+   MPI_Type_free( &type3 );
+
+   MPI_Allreduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+   MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+   if (rank == 0) {
+       if (toterrs == 0) printf( " No Errors\n" );
+       else              printf( "Found %d errors\n", toterrs );
+   }
+
+
+   MPI_Finalize();
+   return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/typeub2.c b/teshsuite/smpi/mpich-test/pt2pt/typeub2.c
new file mode 100644 (file)
index 0000000..68951f2
--- /dev/null
@@ -0,0 +1,75 @@
+#include "mpi.h"
+#include <stdio.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+int main( int argc, char *argv[] )
+{
+    MPI_Datatype dt1, dt2, dt3;
+    MPI_Aint     ex1, ex2, ex3;
+    int          sz1, sz2, sz3;
+    MPI_Aint     lb,ub;
+    MPI_Aint     disp[3];
+    MPI_Datatype types[3];
+    int          blocklen[3];
+    MPI_Init(&argc, &argv);
+    blocklen[0] = 1;    blocklen[1] = 1;        blocklen[2] = 1;
+    disp[0] = -3;       disp[1] = 0;            disp[2] = 6;
+    types[0] = MPI_LB;  types[1] = MPI_INT;     types[2] = MPI_UB;
+    MPI_Type_struct(3,blocklen,disp, types,&dt1);
+    MPI_Type_commit(&dt1);
+        MPI_Type_lb(dt1, &lb);          MPI_Type_ub(dt1, &ub);
+        MPI_Type_extent(dt1,&ex1);      MPI_Type_size(dt1,&sz1);
+
+       /* Values should be lb = -3, ub = 6 extent 9; 
+          size depends on implementation */
+       if (lb != -3 || ub != 6 || ex1 != 9) {
+           printf("Example 3.26 type1 lb %d ub %d extent %d size %d\n",
+                  (int)lb, (int)ub, (int)ex1, sz1);
+       }
+       else 
+           printf("Example 3.26 type1 correct\n" );
+    MPI_Type_contiguous(2,dt1,&dt2);
+        MPI_Type_lb(dt2, &lb);          MPI_Type_ub(dt2, &ub);
+        MPI_Type_extent(dt2,&ex2);      MPI_Type_size(dt2,&sz2);
+       /* Values should be lb = -3, ub = 15, extent = 18, size
+          depends on implementation */
+       if (lb != -3 || ub != 15 || ex2 != 18) {
+           printf("Example 3.26 type2 lb %d ub %d extent %d size %d\n", 
+                  (int)lb, (int)ub, (int)ex2, sz2);
+       }
+       else 
+           printf( "Example 3.26 type2 correct\n" );
+    types[0]=dt1;               types[1]=dt1;
+    blocklen[0]=1;              blocklen[1]=1;
+    disp[0]=0;                  disp[1]=ex1;
+    MPI_Type_struct(2, blocklen, disp, types, &dt3);
+    MPI_Type_commit(&dt3);
+        MPI_Type_lb(dt3, &lb);          MPI_Type_ub(dt3, &ub);
+        MPI_Type_extent(dt3,&ex3);      MPI_Type_size(dt3,&sz3);
+       /* Another way to express type2 */
+       if (lb != -3 || ub != 15 || ex3 != 18) {
+           printf("type3 lb %d ub %d extent %d size %d\n", 
+                  (int)lb, (int)ub, (int)ex3, sz2);
+       }
+       else 
+           printf( "type3 correct\n" );
+    MPI_Type_free( &dt1 );
+    MPI_Type_free( &dt2 );
+    MPI_Type_free( &dt3 );
+       
+    MPI_Finalize();
+    return 0;
+}
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/typeub2.std b/teshsuite/smpi/mpich-test/pt2pt/typeub2.std
new file mode 100644 (file)
index 0000000..52c4c6c
--- /dev/null
@@ -0,0 +1,3 @@
+Example 3.26 type1 correct
+Example 3.26 type2 correct
+type3 correct
diff --git a/teshsuite/smpi/mpich-test/pt2pt/typeub3.c b/teshsuite/smpi/mpich-test/pt2pt/typeub3.c
new file mode 100644 (file)
index 0000000..8cc3ea5
--- /dev/null
@@ -0,0 +1,104 @@
+/* This test checks that all of the MPI Type routines correctly compute 
+   the UB and LB of a datatype from the greatest/least instance */
+
+#include "mpi.h"
+#include <stdio.h>
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+int main( int argc, char *argv[] )
+{
+    MPI_Datatype dt1, dt2, dt3, dt4, dt5;
+    MPI_Aint     ex;
+    int          sz;
+    MPI_Aint     lb,ub;
+    MPI_Aint     disp[3];
+    MPI_Datatype types[3];
+    int          blocklen[3];
+    int          idisp[3];
+
+    MPI_Init(&argc, &argv);
+
+    /* Create a datatype with explicit LB and UB */
+    blocklen[0] = 1;    blocklen[1] = 1;        blocklen[2] = 1;
+    disp[0] = -3;       disp[1] = 0;            disp[2] = 6;
+    types[0] = MPI_LB;  types[1] = MPI_INT;     types[2] = MPI_UB;
+    /* Generate samples for contiguous, hindexed, hvector, indexed, 
+       and vector (struct and contiguous tested in typeub2) */
+
+    MPI_Type_struct(3,blocklen,disp, types,&dt1);
+    MPI_Type_commit(&dt1);
+
+    /* This type is the same as in typeub2, and is tested there */
+    
+    types[0]=dt1;               types[1]=dt1;
+    blocklen[0]=1;              blocklen[1]=1;
+    disp[0]=-4;                 disp[1]=7;
+    idisp[0]=-4;                idisp[1]=7;
+
+    MPI_Type_hindexed( 2, blocklen, disp, dt1, &dt2 );
+    MPI_Type_commit( &dt2 );
+
+        MPI_Type_lb( dt2, &lb );       MPI_Type_ub( dt2, &ub );
+       MPI_Type_extent( dt2, &ex );   MPI_Type_size( dt2, &sz );
+
+       if (lb != -7 || ub != 13 || ex != 20) {
+           printf("hindexed lb %d ub %d extent %d size %d\n", 
+                  (int)lb, (int)ub, (int)ex, sz);
+       }
+       else 
+           printf( "hindexed ok\n" );
+
+    MPI_Type_indexed( 2, blocklen, idisp, dt1, &dt3 );
+    MPI_Type_commit( &dt3 );
+
+        MPI_Type_lb( dt3, &lb );       MPI_Type_ub( dt3, &ub );
+       MPI_Type_extent( dt3, &ex );   MPI_Type_size( dt3, &sz );
+
+       if (lb != -39 || ub != 69 || ex != 108) {
+           printf("indexed lb %d ub %d extent %d size %d\n", 
+                  (int)lb, (int)ub, (int)ex, sz);
+       }
+       else 
+           printf( "indexed ok\n" );
+
+    MPI_Type_hvector( 2, 1, 14, dt1, &dt4 );
+    MPI_Type_commit( &dt4 );
+
+        MPI_Type_lb( dt4, &lb );       MPI_Type_ub( dt4, &ub );
+       MPI_Type_extent( dt4, &ex );   MPI_Type_size( dt4, &sz );
+
+       if (lb != -3 || ub != 20 || ex != 23) {
+           printf("hvector lb %d ub %d extent %d size %d\n", 
+                  (int)lb, (int)ub, (int)ex, sz);
+       }
+       else 
+           printf( "hvector ok\n" );
+
+    MPI_Type_vector( 2, 1, 14, dt1, &dt5 );
+    MPI_Type_commit( &dt5 );
+    
+        MPI_Type_lb( dt5, &lb );       MPI_Type_ub( dt5, &ub );
+       MPI_Type_extent( dt5, &ex );   MPI_Type_size( dt5, &sz );
+
+       if (lb != -3 || ub != 132 || ex != 135) {
+           printf("vector lb %d ub %d extent %d size %d\n", 
+                  (int)lb, (int)ub, (int)ex, sz);
+       }
+       else 
+           printf( "vector ok\n" );
+
+    MPI_Type_free( &dt1 );
+    MPI_Type_free( &dt2 );
+    MPI_Type_free( &dt3 );
+    MPI_Type_free( &dt4 );
+    MPI_Type_free( &dt5 );
+
+    MPI_Finalize();
+    return 0;
+}
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/typeub3.std b/teshsuite/smpi/mpich-test/pt2pt/typeub3.std
new file mode 100644 (file)
index 0000000..a04e547
--- /dev/null
@@ -0,0 +1,4 @@
+hindexed ok
+indexed ok
+hvector ok
+vector ok
diff --git a/teshsuite/smpi/mpich-test/pt2pt/waitall.c b/teshsuite/smpi/mpich-test/pt2pt/waitall.c
new file mode 100644 (file)
index 0000000..3fd97ed
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * This code tests waitall; in particular, the that ordering requirement
+ * on nonblocking communication is observed.
+ */
+
+#include <stdio.h>
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+#ifdef HAVE_UNISTD_H
+/* For sleep */
+#include <unistd.h>
+#endif
+
+#define MAX_REQ 32
+
+#ifndef HAVE_SLEEP
+void sleep( int secs )
+{
+#ifdef VX_WORKS
+    /* Also needs include <time.h>? */
+    struct timespec rqtp = { 10, 0 };
+    nanosleep(&rqtp, NULL);
+#else
+    double t;
+    t = MPI_Wtime();
+    while (MPI_Wtime() - t < (double)secs) ;
+#endif
+}
+#endif
+
+int main( int argc, char **argv )
+{
+    int rank, size;
+    int i, j, count, err = 0, toterr;
+    MPI_Request r[MAX_REQ];
+    MPI_Status  s[MAX_REQ];
+    int         buf[MAX_REQ][MAX_REQ];
+
+    MPI_Init( &argc, &argv );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    if (size < 2) {
+       fprintf( stderr, "This test requires at least 2 processes\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+    /* First, cause the wait all to happen AFTER the Sends */
+    if (rank == 0) {
+       for (i=0; i<MAX_REQ; i++) {
+           MPI_Irecv( buf[i], i+1, MPI_INT, 1, 99, MPI_COMM_WORLD, 
+                      &r[MAX_REQ-1-i] ); 
+       }
+       MPI_Waitall( MAX_REQ, r, s );
+       /* Check that we've received the correct data */
+       for (i=0; i<MAX_REQ; i++) {
+           MPI_Get_count( &s[MAX_REQ-1-i], MPI_INT, &count );
+           if (count != i) {
+               err++;
+               fprintf( stderr, "Wrong count (%d) for request %d\n", 
+                        count, MAX_REQ-1-i );
+           }
+       }
+    }
+    else if (rank == 1) {
+       for (i=0; i<MAX_REQ; i++) {
+           for (j=0; j<=i; j++)
+               buf[i][j] = i * MAX_REQ + j;
+           MPI_Send( buf[i], i, MPI_INT, 0, 99, MPI_COMM_WORLD );
+       }
+    }
+
+    /* Second, cause the waitall to start BEFORE the Sends */
+    if (rank == 0) {
+       for (i=0; i<MAX_REQ; i++) {
+           MPI_Irecv( buf[i], i+1, MPI_INT, 1, 99, MPI_COMM_WORLD, 
+                      &r[MAX_REQ-1-i] ); 
+       }
+       MPI_Send( MPI_BOTTOM, 0, MPI_INT, 1, 0, MPI_COMM_WORLD );
+       MPI_Waitall( MAX_REQ, r, s );
+       /* Check that we've received the correct data */
+       for (i=0; i<MAX_REQ; i++) {
+           MPI_Get_count( &s[MAX_REQ-1-i], MPI_INT, &count );
+           if (count != i) {
+               err++;
+               fprintf( stderr, 
+                        "Wrong count (%d) for request %d (waitall posted)\n", 
+                        count, MAX_REQ-1-i );
+           }
+       }
+    }
+    else if (rank == 1) {
+       MPI_Recv( MPI_BOTTOM, 0, MPI_INT, 0, 0, MPI_COMM_WORLD, &s[0] );
+       sleep( 2 );
+       for (i=0; i<MAX_REQ; i++) {
+           for (j=0; j<=i; j++)
+               buf[i][j] = i * MAX_REQ + j;
+           MPI_Send( buf[i], i, MPI_INT, 0, 99, MPI_COMM_WORLD );
+       }
+    }
+
+
+    MPI_Barrier( MPI_COMM_WORLD );
+    if (rank == 0) {
+       toterr = err;
+       if (toterr == 0) 
+           printf( "Test complete\n" );
+       else
+           printf( "Found %d errors in test!\n", toterr );
+    }
+    
+    MPI_Finalize();
+    return 0;
+}
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/waitall.std b/teshsuite/smpi/mpich-test/pt2pt/waitall.std
new file mode 100644 (file)
index 0000000..f75da10
--- /dev/null
@@ -0,0 +1 @@
+Test complete
diff --git a/teshsuite/smpi/mpich-test/pt2pt/waitall2.c b/teshsuite/smpi/mpich-test/pt2pt/waitall2.c
new file mode 100644 (file)
index 0000000..fbcee83
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+  Test of waitall.  This makes sure that the requests in a wait can occur
+  in any order.
+
+  Run with 2 processes.
+  */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+void Pause( double );
+
+void Pause( double sec )
+{
+  /*double t1 =*/ MPI_Wtime();
+  sleep(sec);
+//while (MPI_Wtime() - t1 < sec) ;
+}
+
+int main( int argc, char **argv )
+{
+  int size, rank, flag, i;
+  int *buf1, *buf2, cnt;
+  double t0;
+  MPI_Status statuses[2];
+  MPI_Request req[2];
+
+  MPI_Init( &argc, &argv );
+  MPI_Comm_size( MPI_COMM_WORLD, &size );
+  MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+
+  if (size < 2) {
+    printf( "This test requires at least 2 processors\n" );
+    MPI_Abort( MPI_COMM_WORLD, 1 );
+    return 1;
+  }
+  
+  /* Large enough that almost certainly a rendezvous algorithm will be used
+     by Issend.  buflimit.c will give you a more reliable value */
+  cnt = 35000;
+
+  /* Test:
+     process 0                        process 1
+                                      Irecv1
+                                      Irecv2
+     Sendrecv                         Sendrecv
+     pause(2 sec)                     pause(2 sec)
+     Issend2                          Waitall
+     test(2) for 5 secs
+     Ssend1
+     Wait(2) if necessary
+
+     If the test for Issend2 never succeeds, then the waitall appears to be
+     waiting for req1 first.  By using Issend, we can keep the program from
+     hanging.
+  */
+  buf1 = (int *)malloc( cnt * sizeof(int) );
+  buf2 = (int *)malloc( cnt * sizeof(int) );
+  if (!buf1 || !buf2) {
+    printf( "Could not allocate buffers of size %d\n", cnt );
+    MPI_Abort( MPI_COMM_WORLD, 1 );
+    return 1;
+  }
+
+  for (i=0; i<cnt; i++) {
+    buf1[i] = i;
+    buf2[i] = i;
+  }
+
+  if (rank == 0) {
+    MPI_Sendrecv( MPI_BOTTOM, 0, MPI_BYTE, size - 1, 3, 
+                 MPI_BOTTOM, 0, MPI_BYTE, size - 1, 3, 
+                 MPI_COMM_WORLD, &statuses[0] );
+    Pause( 2.0 );
+    MPI_Isend( buf2, cnt, MPI_INT, size-1, 2, MPI_COMM_WORLD, &req[0] );
+    t0 = MPI_Wtime();
+    flag = 0;
+    while (t0 + 5.0 > MPI_Wtime() && !flag) 
+      MPI_Test( &req[0], &flag, &statuses[0] );
+    MPI_Send( buf1, cnt, MPI_INT, size-1, 1, MPI_COMM_WORLD );
+    if (!flag) {
+      printf( 
+    "*ERROR: MPI_Waitall appears to be waiting for requests in the order\n\
+they appear in the request list\n" );
+      MPI_Wait( &req[0], &statuses[0] );
+    }
+    else {
+       printf( "No errors\n" ) ;
+    }
+  }
+  else if (rank == size - 1) {
+    MPI_Irecv( buf1, cnt, MPI_INT, 0, 1, MPI_COMM_WORLD, &req[0] );
+    MPI_Irecv( buf2, cnt, MPI_INT, 0, 2, MPI_COMM_WORLD, &req[1] );
+    MPI_Sendrecv( MPI_BOTTOM, 0, MPI_BYTE, 0, 3, 
+                 MPI_BOTTOM, 0, MPI_BYTE, 0, 3, MPI_COMM_WORLD, &statuses[0] );
+    Pause( 2.0 );
+    MPI_Waitall( 2, req, statuses );
+  }
+
+  free( buf1 );
+  free( buf2 );
+  MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/waitall3.c b/teshsuite/smpi/mpich-test/pt2pt/waitall3.c
new file mode 100644 (file)
index 0000000..cdd13f8
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+  Test of waitall.  This makes sure that the requests in a wait can occur
+  in any order.
+
+  Run with 4 processes.  This checks for code that listens to a specified
+  process.  This is similar to the test in waitall2, except the incoming
+  messages come from processes 1 and 2.  (no message comes from process 3).
+  */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+void Pause( double );
+
+void Pause( double sec )
+{
+  /*double t1 =*/ MPI_Wtime();
+  sleep(sec);
+//  while (MPI_Wtime() - t1 < sec) ;
+}
+
+int main( int argc, char **argv )
+{
+    int size, rank, flag, i;
+    int *buf1, *buf2, cnt;
+    double t0;
+    MPI_Status statuses[2];
+    MPI_Request req[2];
+    
+    MPI_Init( &argc, &argv );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+
+    if (size < 3) {
+       printf( "This test requires at least 3 processors\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+       return 1;
+    }
+  
+    /* Large enough that almost certainly a rendezvous algorithm will be used
+       by Issend.  buflimit.c will give you a more reliable value */
+    cnt = 35000;
+
+    /* Test:
+     process 0                    process 1               process 2
+                                  Irecv1
+                                  Irecv2
+     Barrier                      Barrier                 Barrier
+     pause(2 sec)                 pause(2 sec)            
+     issend2                      Waitall                 
+     test(2) for 5 secs
+     sendrecv (process 2)                                 sendrecv(process0)
+                                                          ssend1
+     wait(2) if necessary
+
+     If the test for Issend2 never succeeds, then the waitall appears to be
+     waiting for req1 first.  By using Issend, we can keep the program from
+     hanging.
+    */
+    buf1 = (int *)malloc( cnt * sizeof(int) );
+    buf2 = (int *)malloc( cnt * sizeof(int) );
+    if (!buf1 || !buf2) {
+       printf( "Could not allocate buffers of size %d\n", cnt );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+       return 1;
+    }
+    
+    for (i=0; i<cnt; i++) {
+       buf1[i] = i;
+       buf2[i] = i;
+    }
+
+    MPI_Barrier( MPI_COMM_WORLD );
+    if (rank == 0) {
+       MPI_Barrier( MPI_COMM_WORLD );
+       Pause( 2.0 );
+       MPI_Isend( buf2, cnt, MPI_INT, 1, 2, MPI_COMM_WORLD, &req[0] );
+       t0 = MPI_Wtime();
+       flag = 0;
+       while (t0 + 5.0 > MPI_Wtime() && !flag) 
+           MPI_Test( &req[0], &flag, &statuses[0] );
+/* Tell process 2 to go ahead */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_BYTE, 2, 3, 
+                     MPI_BOTTOM, 0, MPI_BYTE, 2, 3, MPI_COMM_WORLD, &statuses[0] );
+       if (!flag) {
+           printf( 
+    "*ERROR: MPI_Waitall appears to be waiting for requests in the order\n\
+they appear in the request list\n" );
+           /* We can wait now since process 2 should have allowed the wait
+              to proceed */
+           MPI_Wait( &req[0], &statuses[0] );
+       }
+       else {
+           printf( " No Errors\n" ) ;
+       }
+    }
+    else if (rank == 1) {
+       MPI_Irecv( buf1, cnt, MPI_INT, 2, 1, MPI_COMM_WORLD, &req[0] );
+       MPI_Irecv( buf2, cnt, MPI_INT, 0, 2, MPI_COMM_WORLD, &req[1] );
+       MPI_Barrier( MPI_COMM_WORLD );
+       Pause( 2.0 );
+       MPI_Waitall( 2, req, statuses );
+    }
+    else if (rank == 2) {
+       MPI_Barrier( MPI_COMM_WORLD );
+       /* Wait for process 0 to tell us to go ahead */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_BYTE, 0, 3, 
+                     MPI_BOTTOM, 0, MPI_BYTE, 0, 3, MPI_COMM_WORLD, &statuses[0] );
+       MPI_Send( buf1, cnt, MPI_INT, 1, 1, MPI_COMM_WORLD );
+    }
+    else {
+       MPI_Barrier( MPI_COMM_WORLD );
+    }
+    
+    free( buf1 );
+    free( buf2 );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/waitall4.c b/teshsuite/smpi/mpich-test/pt2pt/waitall4.c
new file mode 100644 (file)
index 0000000..24d9ea4
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+  Test of waitall.  This makes sure that the requests in a wait can occur
+  in any order.
+
+  Run with 4 processes.  This checks for code that listens to a specified
+  process.  This is similar to the test in waitall3, except that the 
+  wait is on sends instead of receives.  Messages are sent by process 2 to
+  processes 0 and 1.  Process 3 is uninvolved.
+  */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+void Pause( double );
+
+void Pause( double sec )
+{
+  /*double t1 =*/ MPI_Wtime();
+  sleep(sec);
+//  while (MPI_Wtime() - t1 < sec) ;
+}
+
+int main( int argc, char **argv )
+{
+    int size, rank, flag, i;
+    int *buf1, *buf2, cnt;
+    double t0;
+    MPI_Status statuses[2];
+    MPI_Request req[2];
+    
+    MPI_Init( &argc, &argv );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+
+    if (size < 3) {
+       printf( "This test requires at least 3 processors\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+       return 1;
+    }
+  
+    /* Large enough that almost certainly a rendezvous algorithm will be used
+       by Issend.  buflimit.c will give you a more reliable value */
+    cnt = 35000;
+
+    /* Test:
+     process 0                    process 1               process 2
+                                                          Issend1
+                                                          Issend0
+     Barrier                      Barrier                 Barrier
+     pause(2 sec)                 pause(2 sec)            pause(1 sec)
+     irecv2                                               waitall
+     test(2) for 5 secs
+     sendrecv (process 1)         sendrecv(process0)
+                                  recv2
+     wait(2) if necessary
+
+     If the test for Irecv2 never succeeds, then the waitall appears to be
+     waiting for req1 first.  By using Issend, we can keep the program from
+     hanging.
+    */
+    buf1 = (int *)malloc( cnt * sizeof(int) );
+    buf2 = (int *)malloc( cnt * sizeof(int) );
+    if (!buf1 || !buf2) {
+       printf( "Could not allocate buffers of size %d\n", cnt );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+       return 1;
+    }
+    
+    for (i=0; i<cnt; i++) {
+       buf1[i] = i;
+       buf2[i] = i;
+    }
+
+    MPI_Barrier( MPI_COMM_WORLD );
+    if (rank == 0) {
+       MPI_Barrier( MPI_COMM_WORLD );
+       Pause( 2.0 );
+       MPI_Irecv( buf2, cnt, MPI_INT, 2, 2, MPI_COMM_WORLD, &req[0] );
+       t0 = MPI_Wtime();
+       flag = 0;
+       while (t0 + 5.0 > MPI_Wtime() && !flag) 
+           MPI_Test( &req[0], &flag, &statuses[0] );
+       /* printf( "Test succeeded at %f with flag %d\n", MPI_Wtime()-t0, flag ); */
+       /* Tell process 2 to go ahead */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_BYTE, 1, 3, 
+                     MPI_BOTTOM, 0, MPI_BYTE, 1, 3, MPI_COMM_WORLD, &statuses[0] );
+       if (!flag) {
+           printf( 
+    "*ERROR: MPI_Waitall appears to be waiting for requests in the order\n\
+they appear in the request list\n" );
+           /* We can wait now since process 2 should have allowed the wait
+              to proceed */
+           MPI_Wait( &req[0], &statuses[0] );
+       }
+       else {
+           printf( " No Errors\n" ) ;
+       }
+    }
+    else if (rank == 2) {
+       MPI_Isend( buf1, cnt, MPI_INT, 1, 1, MPI_COMM_WORLD, &req[0] );
+       MPI_Isend( buf2, cnt, MPI_INT, 0, 2, MPI_COMM_WORLD, &req[1] );
+       MPI_Barrier( MPI_COMM_WORLD );
+       Pause( 1.0 );
+       MPI_Waitall( 2, req, statuses );
+    }
+    else if (rank == 1) {
+       MPI_Status status;
+       MPI_Barrier( MPI_COMM_WORLD );
+       /* Wait for process 0 to tell us to go ahead */
+       MPI_Sendrecv( MPI_BOTTOM, 0, MPI_BYTE, 0, 3, 
+                     MPI_BOTTOM, 0, MPI_BYTE, 0, 3, MPI_COMM_WORLD, &statuses[0] );
+       MPI_Recv( buf1, cnt, MPI_INT, 2, 1, MPI_COMM_WORLD, &status );
+    }
+    else {
+       MPI_Barrier( MPI_COMM_WORLD );
+    }
+    
+    free( buf1 );
+    free( buf2 );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/pt2pt/waitany.c b/teshsuite/smpi/mpich-test/pt2pt/waitany.c
new file mode 100644 (file)
index 0000000..47adda6
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * This code tests waitany; in one version of MPICH, it uncovered some
+ * problems with the ADI Test calls.
+ */
+/* #define i_ntotin 256  */ /* ok    */
+/* #define i_ntotin 257  */ /* fails */
+#define i_ntotin 25600  
+
+#include <stdio.h>
+#include "mpi.h"
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+#define DAR 32  /* ``Data: ARray''  */
+
+
+int main( int argc, char **argv )
+ {
+  int locId ;
+  int data [i_ntotin] ;
+
+  MPI_Init(&argc, &argv) ;
+  MPI_Comm_rank(MPI_COMM_WORLD, &locId) ;
+
+  if(locId == 0) {
+
+    /* The server... */
+
+    MPI_Status status[2] ;
+    MPI_Request events [2] ;
+
+    int eventId ;
+
+    int dstId = 1 ;
+
+    int i ;
+
+    for(i = 0 ; i < i_ntotin ; i++)
+      data [i] = i + 1 ;
+
+    events [0] = MPI_REQUEST_NULL ;
+    events [1] = MPI_REQUEST_NULL ;
+
+    MPI_Isend(data, i_ntotin, MPI_INT, dstId, DAR,
+              MPI_COMM_WORLD, events + 1) ;
+        /* enable send of data */
+
+    /*_begin_trace_code  */
+    /* printf("locId = %d: MPI_Isend(%x, %d, %x, %d, %d, %x, %x)\n",
+      locId, data, i_ntotin, MPI_INT, dstId, DAR, MPI_COMM_WORLD, events [1]); 
+      */
+    /*_end_trace_code  */
+
+    /*_begin_trace_code  */
+    /* printf("locId = %d: MPI_Waitany(%d, [%x, %x], %x %x)...",
+      locId, 2, events [0], events [1], &eventId, &status) ; */
+    /*_end_trace_code  */
+
+    MPI_Waitany(2, events, &eventId, status) ;
+
+    /*_begin_trace_code  */
+    printf("done.  eventId = %d\n", eventId) ;
+    /*_end_trace_code  */
+  }
+
+  if(locId == 1) {
+
+    /* The Client...  */
+
+    MPI_Status status ;
+
+    int srcId = MPI_ANY_SOURCE ;
+
+    /*_begin_trace_code  */
+    /*
+    printf("locId = %d: MPI_Recv(%x, %d, %x, %d, %d, %x, %x)...",
+      locId, data, i_ntotin, MPI_INT, srcId, DAR, MPI_COMM_WORLD, &status) ;
+      */
+    /*_end_trace_code  */
+
+    MPI_Recv(data, i_ntotin, MPI_INT, srcId, DAR,
+             MPI_COMM_WORLD, &status) ;
+
+    /*_begin_trace_code  */
+    /*printf("done.\n") ;*/
+    /*_end_trace_code  */
+
+    /*
+    printf("locId = %d: data [0] = %d, data [%d] = %d\n",
+      locId, data [0], i_ntotin - 1, data [i_ntotin - 1]) ;
+       */
+  }
+
+  MPI_Barrier( MPI_COMM_WORLD );
+  if (locId == 0)
+      printf( "Test complete\n" );
+  MPI_Finalize() ;
+  return 0;
+}
+
+
+
diff --git a/teshsuite/smpi/mpich-test/pt2pt/waitany.std b/teshsuite/smpi/mpich-test/pt2pt/waitany.std
new file mode 100644 (file)
index 0000000..d8092c1
--- /dev/null
@@ -0,0 +1,2 @@
+done.  eventId = 1
+Test complete
diff --git a/teshsuite/smpi/mpich-test/runbase b/teshsuite/smpi/mpich-test/runbase
new file mode 100644 (file)
index 0000000..ae91ba4
--- /dev/null
@@ -0,0 +1,250 @@
+#! /bin/sh
+#
+# This file contains support shell routines and steps common to all
+# runtests scripts.
+#
+# Find MPIRUN
+#
+# Some people don't include "." in their path (! in case an ls trojan horse,
+# I guess - if someone does that to you, you have bigger problems).  This
+# code tests to see if you have a path to mpirun; if not, it tries ./mpirun.
+#
+# One particular problem is having multiple mpiruns in the path.  An
+# absolute path for mpirun will fix many problems
+FindMPIRUN () {
+    if [ -z "$MPICH_USE_LIB_MPIRUN" -a ! -x "$mpirun" ] ; then
+        IFS="${IFS=    }"; saveifs="$IFS"; IFS="${IFS}:"
+        for dir in $PATH ; do 
+            if [ -x $dir/mpirun ] ; then
+               if [ -n "${MPICH_VERSION}" ] ; then
+                   # Test that we've found the correct mpirun
+                   if strings $dir/mpirun | grep "MPIRUN for MPICH" > /dev/null ; then
+                       :
+                   else
+                       # echo "$dir/mpirun isn't for MPICH"
+                       continue
+                   fi
+               fi
+                mpirun="mpirun"
+                break
+             fi
+        done
+        IFS="$saveifs"
+    fi
+    if [ -z "$mpirun" -a -x "./mpirun" ] ; then
+        mpirun=./mpirun
+    fi
+    #
+    if [ -z "$mpirun" ] ; then
+        echo "No mpirun in path.  Testing can not proceed."
+        exit 1
+    fi
+}
+
+# MakeExe program-name
+MakeExe() {
+    if [ -s $STOPFILE ] ; then 
+        echo "Found stopfile $STOPFILE; exiting"
+       exit 0
+    fi
+    if [ ! -x $1 ] ; then
+       $MAKE $1
+        if [ ! -x $1 ] ; then 
+           if [ "$MPITEST_CONTINUE" = "always" ] ; then
+               echo "Could not build executable $1; skipping this test"
+           else 
+               echo "Could not build executable $1; aborting tests"
+               exit 1
+           fi
+        fi
+    fi
+}
+
+# CleanExe program-name
+CleanExe() {
+    if [ $makeeach = 1 ] ; then
+       /bin/rm -f $1 $1.o
+    fi
+}
+
+# Output marker
+OutTime() {
+    if [ $quiet = 0 ] ; then
+       if [ -z "$hostname" ] ; then
+           hostname=`hostname`
+       fi
+       d=`date`
+       echo "$hostname : $d"
+    fi
+}
+
+# Do an "on the fly" check for problems.
+# Checkout testname difffile
+# difffile may be empty, in which case stdout is used.
+# If $writesummaryfile is yes, output the results to $summaryfile.
+# Use XML-style output for the summary file:
+# <MPITEST>
+# <NAME NAME="" STATUS="PASS"|"FAIL">
+# <WORKDIR>directory</WORKDIR>
+# <TESTDIFF>
+#    text from different
+# </TESTDIFF>
+# </MPITEST>
+#
+# We'd also like to support 
+# <NP>$np</NP>
+# but we don't have that information when this routine is called
+CheckOutput() {
+    bfile=$1
+    difffile=$2
+    fileok="no"
+    if [ ! -s ${bfile}.out ] ; then
+        echo "No output file ${bfile}.out!"
+    else
+       cmpfile=""
+        # Handle Fortran systems that generate stop statements
+        rm -f ${bfile}.tout
+       grep -v 'FORTRAN STOP' ${bfile}.out > ${bfile}.tout
+       for stdfile in $srcdir/${bfile}.std $srcdir/${bfile}.std2 \
+                       $srcdir/std/${bfile}.std ${bfile}.stdo ; do
+           if [ -z "$cmpfile" -a -s "$stdfile" ] ; then
+               cmpfile=$stdfile
+           fi
+           if test -s $stdfile && diff -b ${bfile}.tout $stdfile > /dev/null ; then
+               fileok=yes
+               break;
+           fi
+       done
+       if [ $fileok = "no" ] ; then
+           if [ -n "$difffile" ] ; then
+               if [ -n "$cmpfile" ] ; then
+                    echo "Differences in ${bfile}.out" >> ${difffile}
+                   diff -b ${bfile}.tout $cmpfile >> ${difffile}
+               else
+                    echo "Cannot find a file to compare against for test ${bfile}.out"
+               fi
+           else
+               if [ -n "$cmpfile" ] ; then
+                    echo "Differences in ${bfile}.out"
+                   diff -b ${bfile}.tout $cmpfile
+               else
+                    echo "Cannot find a file to compare against for test ${bfile}.out"
+               fi
+            fi
+           nodiff=0
+       fi
+       if [ "$writesummaryfile" = "yes" ] ; then
+           if [ $fileok = "yes" ] ; then 
+               passed=pass
+           else
+               passed=fail
+           fi
+           mydir=`pwd`
+           cat >>$summaryfile <<EOF
+<MPITEST>
+<NAME>$bfile</NAME>
+<WORKDIR>$mydir</WORKDIR>
+<STATUS>$passed</STATUS>
+EOF
+            if [ -n "$np" ] ; then
+               echo "<NP>$np</NP>" >> $summaryfile
+            fi
+           if [ $fileok = "no" ] ; then
+               echo "<TESTDIFF>" >> $summaryfile
+               if [ ! -s ${bfile}.out ] ; then
+                   echo "No output file" >>$summaryfile
+               else
+                   if [ -z "$cmpfile" ] ; then 
+                       cmpfile="/dev/null"
+                   fi
+                   diff -b ${bfile}.tout $cmpfile | \
+                   sed -e 's/&/-AMP-amp;/g' -e 's/</-AMP-lt;/g' \
+                       -e 's/>/-AMP-gt;/g' | \
+                   sed -e 's/-AMP-/\&/g' >> $summaryfile
+               fi
+               echo "</TESTDIFF>" >> $summaryfile
+           fi
+           if [ -s "$bfile.tbk" ] ; then
+               echo "<TRACEBACK>" >> $summaryfile
+               echo "$bfile.tbk" >>$summaryfile
+               echo "</TRACEBACK>" >> $summaryfile
+           fi
+           echo "</MPITEST>" >> $summaryfile
+       fi
+        rm -f ${bfile}.tout
+    fi
+}
+
+# Runtest pgm-name np marker-test args outfiles
+# filename.tbk is a traceback file.  Use a tool like pardump $1 > $1.tbk
+# to get such files
+RunTest() {
+    OutTime
+    pgm=$1
+    np=$2
+    testfiles="$testfiles $pgm.out"
+    /bin/rm -f $pgm.out $pgm.tbk
+    MakeExe $1
+    if [ ! -x $pgm ] ; then
+        # If no executable, put the make data into $1.out
+        $MAKE $pgm > $pgm.out 2>&1 
+    else
+        mname=$3
+        if [ -z "$mname" ] ; then mname="*** $1 ***" ; fi
+        #echo "$mname" >> $pgm.out
+        echo "$mname"
+        mvarg=""
+        if [ -n "$5" ] ; then rm -f $5 ; 
+            if [ -n "$MPIRUNMVBACK" ] ; then mvarg="$MPIRUNMVBACK \"$5\"" ; fi 
+        fi
+        # The eval is necessary to ensure that the mvarg value is properly
+        # tokenized.  The ./$1 ensures that the program will be found,
+        # even if . is not in the PATH.
+        
+        eval $mpirun $args -np $np $mvarg ./$pgm $4 </dev/null >> $pgm.out 2>&1
+        if [ -n "$5" ] ; then 
+            for file in $5 ; do 
+                if [ -s $file ] ; then 
+                    cat $file >> $pgm.out ; rm -f $file 
+                fi
+            done
+        fi
+        #echo "$mname" >> $pgm.out
+        if [ ! -s $srcdir/$pgm.std -a ! -s $pgm.stdo ] ; then
+            # We don't need a special file if the output is just "No Errors"
+            cat >>$pgm.stdo <<EOF
+ No Errors
+EOF
+        fi
+        if [ "$CheckOutputWhileRunning" = "yes" -o "$check_at_once" = 1 ] ; then
+            CheckOutput $pgm
+        fi
+       # CleanExe $pgm
+    #ipcs
+    fi
+    np=""
+}
+
+#
+# Check the output of the programs against the "standard" output.  The 
+# possible files are:
+#   $srcdir/file.std
+#   $srcdir/file.std2
+#   file.stdo     
+# The last one is an automatically generated file for those programs
+# that simply produce a " No errors" output.
+CheckAllOutput ()
+{
+    difffile=$1
+    /bin/rm -f ${difffile}
+    nodiff=1
+    for file in $testfiles ; do
+       bfile=`basename $file .out`
+       CheckOutput $bfile ${difffile}
+    done
+    if [ -s ${difffile} ] ; then
+        cat ${difffile}
+    elif [ $nodiff = 1 ] ; then
+        echo "-- No differences found; test successful"
+    fi
+}
diff --git a/teshsuite/smpi/mpich-test/topol/cart.c b/teshsuite/smpi/mpich-test/topol/cart.c
new file mode 100644 (file)
index 0000000..d8bc77d
--- /dev/null
@@ -0,0 +1,134 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+#define NUM_DIMS 2
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i;
+    int              errors=0;
+    int              dims[NUM_DIMS];
+    int              periods[NUM_DIMS];
+    int              coords[NUM_DIMS];
+    int              new_coords[NUM_DIMS];
+    int              reorder = 1;
+    MPI_Comm         comm_temp, comm_cart, new_comm;
+    int              topo_status;
+    int              ndims;
+    int              new_rank;
+    int              remain_dims[NUM_DIMS];
+    int              newnewrank;
+
+    MPI_Init( &argc, &argv );
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* Clear dims array and get dims for topology */
+    for(i=0;i<NUM_DIMS;i++) { dims[i] = 0; periods[i] = 0; }
+    MPI_Dims_create ( size, NUM_DIMS, dims );
+
+    /* Make a new communicator with a topology */
+    MPI_Cart_create ( MPI_COMM_WORLD, 2, dims, periods, reorder, &comm_temp );
+    MPI_Comm_dup ( comm_temp, &comm_cart );
+
+    /* Determine the status of the new communicator */
+    MPI_Topo_test ( comm_cart, &topo_status );
+    if (topo_status != MPI_CART) {
+       printf( "topo_status of duped comm is not MPI_CART\n" );
+       errors++;
+    }
+
+    /* How many dims do we have? */
+    MPI_Cartdim_get( comm_cart, &ndims );
+    if ( ndims != NUM_DIMS ) {
+       printf( "Number of dims of duped comm (%d) should be %d\n", 
+               ndims, NUM_DIMS );
+       errors++;
+    }
+
+    /* Get the topology, does it agree with what we put in? */
+    for(i=0;i<NUM_DIMS;i++) { dims[i] = 0; periods[i] = 0; }
+    MPI_Cart_get ( comm_cart, NUM_DIMS, dims, periods, coords );
+
+    /* Does the mapping from coords to rank work? */
+    MPI_Cart_rank ( comm_cart, coords, &new_rank );
+    if ( new_rank != rank ) {
+       printf( "New rank of duped comm (%d) != old rank (%d)\n", 
+               new_rank, rank );
+       errors++;
+    }
+
+    /* Does the mapping from rank to coords work */
+    MPI_Cart_coords ( comm_cart, rank, NUM_DIMS, new_coords );
+    for (i=0;i<NUM_DIMS;i++) 
+       if ( coords[i] != new_coords[i] ) {
+           printf( "Old coords[%d] of duped comm (%d) != new_coords (%d)\n", 
+                   i, coords[i], new_coords[i] );
+           errors++;
+       }
+
+    /* Let's shift in each dimension and see how it works!   */
+    /* Because it's late and I'm tired, I'm not making this  */
+    /* automatically test itself.                            */
+    for (i=0;i<NUM_DIMS;i++) {
+      int source, dest;
+      MPI_Cart_shift(comm_cart, i, 1, &source, &dest);
+#ifdef VERBOSE      
+      printf ("[%d] Shifting %d in the %d dimension\n",rank,1,i);
+      printf ("[%d]    source = %d  dest = %d\n",rank,source,dest); 
+#endif
+    }
+
+    /* Subdivide */
+    remain_dims[0] = 0; 
+    for (i=1; i<NUM_DIMS; i++) remain_dims[i] = 1;
+    MPI_Cart_sub ( comm_cart, remain_dims, &new_comm );
+
+    /* Determine the status of the new communicator */
+    MPI_Topo_test ( new_comm, &topo_status );
+    if (topo_status != MPI_CART) {
+       printf( "topo_status of cartsub comm is not MPI_CART\n" );
+       errors++;
+    }
+
+    /* How many dims do we have? */
+    MPI_Cartdim_get( new_comm, &ndims );
+    if ( ndims != NUM_DIMS-1 ) {
+       printf( "Number of dims of cartsub comm (%d) should be %d\n", 
+               ndims, NUM_DIMS-1 );
+       errors++;
+    }
+
+    /* Get the topology, does it agree with what we put in? */
+    for(i=0;i<NUM_DIMS-1;i++) { dims[i] = 0; periods[i] = 0; }
+    MPI_Cart_get ( new_comm, ndims, dims, periods, coords );
+    
+    /* Does the mapping from coords to rank work? */
+    MPI_Comm_rank ( new_comm, &newnewrank );
+    MPI_Cart_rank ( new_comm, coords, &new_rank );
+    if ( new_rank != newnewrank ) {
+       printf( "New rank of cartsub comm (%d) != old rank (%d)\n", 
+               new_rank, newnewrank );
+       errors++;
+    }
+
+    /* Does the mapping from rank to coords work */
+    MPI_Cart_coords ( new_comm, new_rank, NUM_DIMS -1, new_coords );
+    for (i=0;i<NUM_DIMS-1;i++) 
+       if ( coords[i] != new_coords[i] ) {
+           printf( "Old coords[%d] of cartsub comm (%d) != new_coords (%d)\n", 
+                   i, coords[i], new_coords[i] );
+           errors++;
+       }
+
+    /* We're at the end */
+    MPI_Comm_free( &new_comm );
+    MPI_Comm_free( &comm_temp );
+    MPI_Comm_free( &comm_cart );
+    Test_Waitforall( );
+    if (errors) printf( "[%d] done with %d ERRORS!\n", rank,errors );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/topol/cart1f.f b/teshsuite/smpi/mpich-test/topol/cart1f.f
new file mode 100644 (file)
index 0000000..5bd5982
--- /dev/null
@@ -0,0 +1,192 @@
+        program main
+        include 'mpif.h'
+
+
+        integer NUM_DIMS
+        parameter (NUM_DIMS=2)
+
+        integer ierr
+        integer errors, toterrors
+        integer comm_temp, comm_cart, new_comm
+        integer size, rank, i
+        logical periods(NUM_DIMS)
+        integer dims(NUM_DIMS)
+        integer coords(NUM_DIMS)
+        integer new_coords(NUM_DIMS)
+        logical remain_dims(NUM_DIMS)
+        integer newnewrank
+        logical reorder
+        integer topo_status
+        integer ndims
+        integer new_rank
+
+        integer source, dest
+
+        errors=0
+        call MPI_INIT (ierr)
+
+        call MPI_COMM_RANK( MPI_COMM_WORLD, rank, ierr)
+        call MPI_COMM_SIZE (MPI_COMM_WORLD, size, ierr )
+
+c
+c    Clear dims array and get dims for topology 
+c
+        do 100 i=1,NUM_DIMS
+                dims(i)=0
+                periods(i)= .false.
+100     continue
+        call MPI_DIMS_CREATE( size, NUM_DIMS, dims, ierr)
+
+c
+c     Make a new communicator with a topology 
+c
+        reorder = .true.
+        call MPI_CART_CREATE( MPI_COMM_WORLD, 2, dims, periods,  
+     $          reorder, comm_temp, ierr)
+        call MPI_COMM_DUP (comm_temp, comm_cart, ierr)
+
+c
+c     Determine the status of the new communicator 
+c
+        call MPI_TOPO_TEST (comm_cart, topo_status, ierr)
+        IF (topo_status .ne. MPI_CART) then
+           print *, "Topo_status is not MPI_CART"
+           errors=errors+1
+        ENDIF
+
+c
+c     How many dims do we have? 
+c
+        call MPI_CARTDIM_GET( comm_cart, ndims, ierr)
+        if (ndims .ne. NUM_DIMS ) then
+           print *, "ndims (", ndims, ") is not NUM_DIMS (", NUMDIMS,
+     $          ")" 
+           errors = errors+1
+        ENDIF
+
+c
+c     Get the topology, does it agree with what we put in? 
+c
+        do 500 i=1,NUM_DIMS
+                dims(i)=0
+                periods(i)=.false.
+500     continue
+        call MPI_CART_GET( comm_cart, NUM_DIMS, dims, periods, coords,
+     $       ierr) 
+c
+c     Does the mapping from coords to rank work? 
+c
+        call MPI_CART_RANK( comm_cart, coords, new_rank, ierr)
+        if (new_rank .ne. rank ) then
+           print *, "New_rank = ", new_rank, " is not rank (", rank, ")"
+           errors=errors+1
+        endif
+
+c
+c     Does the mapping from rank to coords work 
+c
+        call MPI_CART_COORDS( comm_cart, rank, NUM_DIMS, new_coords ,
+     $       ierr) 
+        do 600 i=1,NUM_DIMS
+                if (coords(i) .ne. new_coords(i)) then
+                   print *, "coords(",i,") = ", coords(i), " not = ",
+     $                  new_coords(i) 
+                   errors=errors + 1
+                endif
+600     continue
+
+c
+c     Let's shift in each dimension and see how it works!  
+c     Because it's late and I'm tired, I'm not making this 
+c     automatically test itself.                          
+c
+        do 700 i=1,NUM_DIMS
+           call MPI_CART_SHIFT( comm_cart, (i-1), 1, source, dest, ierr)
+c           print *, '[', rank, '] shifting 1 in the ', (i-1), 
+c     $                 ' dimension'
+c           print *, '[', rank, ']     source = ', source, 
+c     $                 ' dest = ', dest
+                
+700     continue
+
+c
+c     Subdivide 
+c
+        remain_dims(1)=.false.
+        do 800 i=2,NUM_DIMS
+                remain_dims(i)=.true.
+800     continue
+        call MPI_CART_SUB( comm_cart, remain_dims, new_comm, ierr)
+
+c
+c     Determine the status of the new communicator 
+c
+        call MPI_TOPO_TEST( new_comm, topo_status, ierr )
+        if (topo_status .ne. MPI_CART ) then
+           print *, "Topo_status of new comm is not MPI_CART"
+           errors=errors+1
+        endif
+
+c
+c     How many dims do we have? 
+c
+        call MPI_CARTDIM_GET( new_comm, ndims, ierr)
+        if (ndims .ne. NUM_DIMS-1 ) then
+           print *, "ndims (", ndims, ") is not NUM_DIMS-1"
+           errors = errors+1
+        endif
+
+c
+c     Get the topology, does it agree with what we put in? 
+c
+        do 900 i=1,NUM_DIMS-1
+                dims(i)=0
+                periods(i)=.false.
+900     continue
+        call MPI_CART_GET( new_comm, ndims, dims, periods, coords, ierr)
+    
+c
+c     Does the mapping from coords to rank work? 
+c
+        call MPI_COMM_RANK( new_comm, newnewrank, ierr)
+        call MPI_CART_RANK( new_comm, coords, new_rank, ierr)
+        if (new_rank .ne. newnewrank ) then
+           print *, "New rank (", new_rank, ") is not newnewrank"
+           errors=errors+1
+        endif
+
+c
+c     Does the mapping from rank to coords work 
+c
+        call MPI_CART_COORDS( new_comm, new_rank, NUM_DIMS-1, new_coords
+     $       ,  ierr)
+        do 1000 i=1,NUM_DIMS-1
+                if (coords(i) .ne. new_coords(i)) then
+                   print *, "coords(",i,") = ", coords(i),
+     $                  " != new_coords (", new_coords(i), ")"
+                   errors=errors+1
+                endif
+1000    continue
+
+c
+c     We're at the end 
+c
+        call MPI_COMM_FREE( new_comm, ierr)
+        call MPI_COMM_FREE( comm_temp, ierr)
+        call MPI_COMM_FREE( comm_cart, ierr)
+        
+c       call Test_Waitforall_( )
+
+        call MPI_ALLREDUCE( errors, toterrors, 1, MPI_INTEGER,
+     1                      MPI_SUM, MPI_COMM_WORLD, ierr )
+        if (rank .eq. 0) then
+           if (toterrors .eq. 0) then
+              print *, ' No Errors'
+           else
+              print *, ' Done with ', toterrors, ' ERRORS!'
+           endif
+        endif
+        call MPI_FINALIZE(ierr)
+c          print *, '[', rank, '] done with ', errors, ' ERRORS!'
+
+        end
diff --git a/teshsuite/smpi/mpich-test/topol/cart2.c b/teshsuite/smpi/mpich-test/topol/cart2.c
new file mode 100644 (file)
index 0000000..b28d2b9
--- /dev/null
@@ -0,0 +1,61 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+#define NUM_DIMS 2
+
+int verbose = 0; 
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i;
+    int              dims[NUM_DIMS];
+    int              periods[NUM_DIMS];
+    int              new_coords[NUM_DIMS];
+    int              new_new_coords[NUM_DIMS];
+    int              reorder = 1;
+    int              left, right, top, bottom;
+    MPI_Comm         comm_cart;
+
+    MPI_Init( &argc, &argv );
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* Clear dims array and get dims for topology */
+    for(i=0;i<NUM_DIMS;i++) { dims[i] = 0; periods[i] = 0; }
+    MPI_Dims_create ( size, NUM_DIMS, dims );
+
+    /* Make a new communicator with a topology */
+    MPI_Cart_create ( MPI_COMM_WORLD, 2, dims, periods, reorder, &comm_cart );
+
+    /* Does the mapping from rank to coords work */
+    MPI_Cart_coords ( comm_cart, rank, NUM_DIMS, new_coords ); 
+
+    /* 2nd call to Cart coords gives us an error - why? */
+    MPI_Cart_coords ( comm_cart, rank, NUM_DIMS, new_new_coords ); /***34***/ 
+
+    /* Try cart shift */
+    MPI_Cart_shift( comm_cart, 0, 1, &left, &right );
+    MPI_Cart_shift( comm_cart, 1, 1, &bottom, &top );
+
+    if (dims[0] == 2) {
+       /* We should see
+          [0] -1 2 -1 1
+          [1] -1 3 0 -1
+          [2] 0 -1 -1 3
+          [3] 1 -1 2 -1
+       */
+       if (verbose) {
+           printf( "[%d] final dims = [%d,%d]\n", rank, dims[0], dims[1] );
+           printf( "[%d] left = %d, right = %d, bottom = %d, top = %d\n", 
+                   rank, left, right, bottom, top );
+       }
+    }
+
+    MPI_Comm_free( &comm_cart );
+    Test_Waitforall( );
+    MPI_Finalize();
+    
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/topol/cart2f.f b/teshsuite/smpi/mpich-test/topol/cart2f.f
new file mode 100644 (file)
index 0000000..54ae04d
--- /dev/null
@@ -0,0 +1,54 @@
+        program main
+        include 'mpif.h'
+
+        integer NUM_DIMS
+        parameter (NUM_DIMS=2)
+
+        integer rank, size, i
+        integer dims(NUM_DIMS)
+        logical periods(NUM_DIMS)
+        integer new_coords(NUM_DIMS)
+        integer new_new_coords(NUM_DIMS)
+        logical reorder
+        
+        integer comm_cart
+        integer ierr
+
+        reorder= .true.
+        
+        call MPI_INIT(ierr)
+
+        call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
+        call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)
+
+c     Clear dims array and get dims for topology 
+        do 100 i=1,NUM_DIMS
+                dims(i)=0
+                periods(i)=.false.
+100     continue
+        call MPI_DIMS_CREATE(size, NUM_DIMS, dims, ierr)
+
+c     Make a new communicator with a topology 
+        call MPI_CART_CREATE(MPI_COMM_WORLD, 2, dims, periods,
+     $          reorder, comm_cart, ierr)
+
+c     Does the mapping from rank to coords work 
+        call MPI_CART_COORDS(comm_cart, rank, NUM_DIMS, new_coords,
+     $          ierr)
+
+c     2nd call to Cart coords gives us an error - why?    *34*
+        call MPI_CART_COORDS(comm_cart, rank, NUM_DIMS, new_new_coords,
+     $          ierr)
+
+        call MPI_COMM_FREE(comm_cart, ierr)
+c       call Test_Waitforall()
+        if (rank .eq. 0) then
+c          call MPI_ALLREDUCE( errors, toterrors, 1, MPI_INTEGER,
+c       1       MPI_SUM, MPI_COMM_WORLD )
+           print *, ' No Errors'
+c          print *, ' Done with ', toterrors, ' ERRORS!'
+        endif
+        call MPI_FINALIZE(ierr)
+c        print *, 'cart2f completed, errors=', ierr
+
+        end
diff --git a/teshsuite/smpi/mpich-test/topol/cartc.f90 b/teshsuite/smpi/mpich-test/topol/cartc.f90
new file mode 100644 (file)
index 0000000..6544a1b
--- /dev/null
@@ -0,0 +1,21 @@
+program topology
+  
+     implicit none
+     include "mpif.h"
+     integer, parameter :: Ndim=2
+     integer :: Rang, Nprocs, Comm, info
+     integer, dimension(Ndim) :: Dims
+     logical, dimension(Ndim) :: Period
+     logical                  :: Reorder=.FALSE.
+
+     Period(:) = .FALSE.
+     CALL MPI_INIT(info)
+     CALL MPI_COMM_RANK( MPI_COMM_WORLD, rang, info )
+     CALL MPI_COMM_SIZE( MPI_COMM_WORLD, Nprocs, info )
+     Dims(:) = 0
+     CALL MPI_DIMS_CREATE( Nprocs, Ndim, Dims, info )
+     CALL MPI_CART_CREATE( MPI_COMM_WORLD, Ndim, Dims, Period, Reorder, &
+                           Comm, info )
+     print *, "Rang : ",rang," New Comm cart : ",Comm
+     call MPI_FINALIZE(info)
+end program topology
diff --git a/teshsuite/smpi/mpich-test/topol/cartf.f b/teshsuite/smpi/mpich-test/topol/cartf.f
new file mode 100644 (file)
index 0000000..e793c64
--- /dev/null
@@ -0,0 +1,278 @@
+c
+c     From Craig Douglas, modified by Bill Gropp (based on code in Using
+c     MPI).
+c     This code tests some topology routines and sendrecv with some
+c     MPI_PROC_NULL source/destinations.  It should be run with 4
+c     processes 
+c
+        program main
+        include 'mpif.h'
+        integer maxn
+        parameter (maxn = 35)
+        double precision  a(maxn,maxn)
+        integer nx, ny
+        integer myid, newid, numprocs, comm2d, ierr, stride
+        integer nbrleft, nbrright, nbrtop, nbrbottom
+        integer sx, ex, sy, ey
+        integer dims(2), coords(2)
+        integer nerrs, toterrs
+        logical periods(2)
+        logical verbose
+        data periods/2*.false./
+        data verbose/.false./
+c
+        call MPI_INIT( ierr )
+        call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
+        call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
+c        print *, "Process ", myid, " of ", numprocs, " is alive"
+        if (numprocs .ne. 4) then
+           print *, "This test requires exactly four processes"
+           call MPI_Abort( MPI_COMM_WORLD, 1, ierr )
+        endif 
+        nx = 8
+        ny = 4
+        dims(1) = 0
+        dims(2) = 0
+        call MPI_DIMS_CREATE( numprocs, 2, dims, ierr )
+        call MPI_CART_CREATE( MPI_COMM_WORLD, 2, dims, periods, .true.,
+     *                      comm2d, ierr )
+        call MPI_COMM_RANK( comm2d, newid, ierr )
+        if (verbose) then
+           print *, "Process ", myid, " of ", numprocs, " is now ",
+     $          newid
+        endif
+        myid = newid
+        call MPI_Cart_shift( comm2d, 0,  1, nbrleft,   nbrright, ierr )
+        call MPI_Cart_shift( comm2d, 1,  1, nbrbottom, nbrtop,   ierr )
+        if (verbose) then
+            print *, "Process ", myid, " has nbrs", nbrleft, nbrright,
+     &            nbrtop, nbrbottom
+        endif
+        call MPI_Cart_get( comm2d, 2, dims, periods, coords, ierr )
+        call MPE_DECOMP1D( nx, dims(1), coords(1), sx, ex )
+        call MPE_DECOMP1D( ny, dims(2), coords(2), sy, ey )
+c
+c       Fortran allows print to include * and , in the output!
+c       So, we use an explicit Format
+        if ( myid .eq. 0 )
+     &    print 10, dims(1), dims(2)
+ 10     format( " Dims: ", i4, i4 )
+        if (verbose) then
+           print *, "Process ", myid, " has coords of ", coords
+           print *, "Process ", myid, " has sx,ex/sy,ey ", sx,
+     $          ex, sy, ey
+        endif
+        call MPI_TYPE_VECTOR( ey-sy+3, 1, ex-sx+3,
+     $                        MPI_DOUBLE_PRECISION, stride, ierr )
+        call MPI_TYPE_COMMIT( stride, ierr )
+        call setupv( myid, a, sx, ex, sy, ey )
+        call MPI_BARRIER( MPI_COMM_WORLD, ierr )
+c
+        call exchng2( myid, a, sx, ex, sy, ey, comm2d, stride,
+     $                nbrleft, nbrright, nbrtop, nbrbottom )
+c
+c     Check results
+c
+        call checkval( a, sx, ex, sy, ey, nx, ny, nerrs )
+c
+        call mpi_allreduce( nerrs, toterrs, 1, MPI_INTEGER, MPI_SUM,
+     $       MPI_COMM_WORLD, ierr )
+        if (myid .eq. 0) then
+           print *, " Total errors = ", toterrs
+        endif
+        call MPI_TYPE_FREE( stride, ierr )
+        call MPI_COMM_FREE( comm2d, ierr )
+c        call prv( -1, -1, -1, a, sx, ex, sy, ey )
+        call MPI_FINALIZE(ierr)
+        end
+        subroutine MPE_DECOMP1D( n, numprocs, myid, s, e )
+        integer n, numprocs, myid, s, e
+        integer nlocal
+        integer deficit
+c
+        nlocal  = n / numprocs
+        s       = myid * nlocal + 1
+        deficit = mod(n,numprocs)
+        s       = s + min(myid,deficit)
+        if (myid .lt. deficit) then
+            nlocal = nlocal + 1
+        endif
+        e = s + nlocal - 1
+        if (e .gt. n .or. myid .eq. numprocs-1) e = n
+        return
+        end
+        subroutine exchng2( myid, v, sx, ex, sy, ey,
+     $                      comm2d, stride,
+     $                      nbrleft, nbrright, nbrtop, nbrbottom  )
+        include "mpif.h"
+        integer myid, sx, ex, sy, ey, stride
+        double precision v(sx-1:ex+1,sy-1:ey+1)
+        integer nbrleft, nbrright, nbrtop, nbrbottom, comm2d
+        integer status(MPI_STATUS_SIZE), ierr, nx
+c
+        nx = ex - sx + 1
+c  These are just like the 1-d versions, except for less data
+c        call prv( myid, -1, -1, v, sx, ex, sy, ey )
+        call MPI_SENDRECV( v(sx,ey),  nx, MPI_DOUBLE_PRECISION,
+     $                    nbrtop, 0,
+     $                    v(sx,sy-1), nx, MPI_DOUBLE_PRECISION,
+     $                    nbrbottom, 0, comm2d, status, ierr )
+c        call prv( myid, nbrtop, nbrbottom, v, sx, ex, sy, ey )
+        call MPI_SENDRECV( v(sx,sy),  nx, MPI_DOUBLE_PRECISION,
+     $                    nbrbottom, 1,
+     $                    v(sx,ey+1), nx, MPI_DOUBLE_PRECISION,
+     $                    nbrtop, 1, comm2d, status, ierr )
+c        call prv( myid, nbrbottom, nbrtop, v, sx, ex, sy, ey )
+c This uses the "strided" datatype
+c       v(ex,sy-1) = -100 - myid
+        call MPI_SENDRECV( v(ex,sy-1),  1, stride, nbrright,  2,
+     $                     v(sx-1,sy-1), 1, stride, nbrleft,  2,
+     $                     comm2d, status, ierr )
+c        call prv( myid, nbrright, nbrleft, v, sx, ex, sy, ey )
+c       v(sx,sy-1) = -200 - myid
+        call MPI_SENDRECV( v(sx,sy-1),  1, stride, nbrleft,   3,
+     $                     v(ex+1,sy-1), 1, stride, nbrright, 3,
+     $                     comm2d, status, ierr )
+c        call prv( myid, nbrleft, nbrright, v, sx, ex, sy, ey )
+        return
+        end
+        subroutine prv( myid, n1, n2, v, sx, ex, sy, ey )
+c***********************************************************************
+c
+c       Print a matrix of numbers.
+c
+c***********************************************************************
+        integer myid, n1, n2, sx, ex, sy, ey
+        double precision  v(sx-1:ex+1,sy-1:ey+1)
+        integer count, i, j
+        save count
+        character*5 fname
+        data count  / 0 /
+        if ( myid .lt. 0 ) then
+            close( 11 )
+            return
+        endif
+        write (fname,'(''foo.'',i1)') myid
+        if ( count .eq. 0 )
+     &      open( 11, file=fname, status='UNKNOWN' )
+        write (11,*) '----------------------------------------'
+        if ( count .eq. 0 ) then
+            write (11,*) 'sx ', sx
+            write (11,*) 'ex ', ex
+            write (11,*) 'sy ', sy
+            write (11,*) 'ey ', ey
+            write (11,*) '----------------------------------------'
+        endif
+        count = count + 1
+        write (11,*) 'count,n1,n2: ', count, n1, n2
+        do j = ey+1,sy-1,-1
+            write (11,1) j, (v(i,j), i = sx-1,ex+1)
+        enddo
+        return
+ 1      Format( i3, 20f7.0 )
+c1      Format( i3, 1p, 20d10.1 )
+        end
+        subroutine setupv( myid, v, sx, ex, sy, ey )
+        integer myid, sx, ex, sy, ey
+        double precision  v(sx-1:ex+1,sy-1:ey+1)
+        integer i, j, k
+c        write (*,*) 'setupv: ', myid, sx, ex, sy, ey
+        do j = sy,ey
+            k = j * 1000.0
+            do i = sx,ex
+                v(i,j)    = i + k
+                v(i,sy-1) = 0
+                v(i,ey+1) = 0
+            enddo
+            v(sx-1,j) = 0
+            v(ex+1,j) = 0
+        enddo
+        return
+        end
+c***********************************************************************
+      subroutine checkval( a, sx, ex, sy, ey, nx, ny, errs )
+      integer sx, ex, sy, ey, nx, ny
+      double precision a(sx-1:ex+1,sy-1:ey+1)
+      integer i, j, k
+      integer errs
+c
+c     Check interior
+c
+      errs = 0
+      do 10 j=sy,ey
+         k = j * 1000
+         do 10 i=sx,ex
+            if (a(i,j) .ne. i + k ) then
+               errs = errs + 1
+               print *, "error at (", i, ",", j, ") = ", a(i,j)
+            endif
+ 10   continue
+c
+c     Check the boundaries
+c      
+      i = sx - 1
+      if (sx .eq. 1) then
+         do 20 j=sy,ey
+            if (a(i,j) .ne. 0.0) then
+               errs = errs + 1
+               print *, "error at (", i, ",", j, ") = ", a(i,j)
+            endif
+ 20      continue
+      else
+         do 30 j=sy,ey
+            if (a(i,j) .ne. i + j * 1000) then
+               errs = errs + 1
+               print *, "error at (", i, ",", j, ") = ", a(i,j)
+            endif
+ 30      continue
+      endif
+      i = ex + 1
+      if (ex .eq. nx) then
+         do 40 j=sy,ey
+            if (a(i,j) .ne. 0.0) then
+               errs = errs + 1
+               print *, "error at (", i, ",", j, ") = ", a(i,j)
+            endif
+ 40      continue
+      else
+         do 50 j=sy,ey
+            if (a(i,j) .ne. i + j * 1000) then
+               errs = errs + 1
+               print *, "error at (", i, ",", j, ") = ", a(i,j)
+            endif
+ 50      continue
+      endif
+      j = sy - 1
+      if (sy .eq. 1) then
+         do 60 i=sx,ex
+            if (a(i,j) .ne. 0.0) then
+               errs = errs + 1
+               print *, "error at (", i, ",", j, ") = ", a(i,j)
+            endif
+ 60      continue
+      else
+         do 70 i=sx,ex
+            if (a(i,j) .ne. i + j * 1000) then
+               errs = errs + 1
+               print *, "error at (", i, ",", j, ") = ", a(i,j)
+            endif
+ 70      continue
+      endif
+      j = ey + 1
+      if (ey .eq. ny) then
+         do 80 i=sx,ex
+            if (a(i,j) .ne. 0.0) then
+               errs = errs + 1
+               print *, "error at (", i, ",", j, ") = ", a(i,j)
+            endif
+ 80      continue
+      else
+         do 90 i=sx,ex
+            if (a(i,j) .ne. i + j * 1000) then
+               errs = errs + 1
+               print *, "error at (", i, ",", j, ") = ", a(i,j)
+            endif
+ 90      continue
+      endif
+      return 
+      end
diff --git a/teshsuite/smpi/mpich-test/topol/cartf.std b/teshsuite/smpi/mpich-test/topol/cartf.std
new file mode 100644 (file)
index 0000000..16a9835
--- /dev/null
@@ -0,0 +1,4 @@
+*** Testing cart from Fortran ***
+ Dims:    2   2
+ Total errors =   0
+*** Testing cart from Fortran ***
diff --git a/teshsuite/smpi/mpich-test/topol/cartmap.c b/teshsuite/smpi/mpich-test/topol/cartmap.c
new file mode 100644 (file)
index 0000000..5f5bf4d
--- /dev/null
@@ -0,0 +1,55 @@
+#include "mpi.h"
+#include <stdio.h>
+/* stdlib.h Needed for malloc declaration */
+#include <stdlib.h>
+#include "test.h"
+
+#define NUM_DIMS 2
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i;
+    int              errors=0;
+    int              dims[NUM_DIMS];
+    int              periods[NUM_DIMS];
+    int              *rbuf, *sbuf;
+    int              new_rank;
+
+    MPI_Init( &argc, &argv );
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* Clear dims array and get dims for topology */
+    for(i=0;i<NUM_DIMS;i++) { dims[i] = 0; periods[i] = 0; }
+    MPI_Dims_create ( size, NUM_DIMS, dims );
+
+    /* Look at what rankings a cartesian topology MIGHT have */
+    MPI_Cart_map( MPI_COMM_WORLD, 2, dims, periods, &new_rank );
+
+    /* Check that all new ranks are used exactly once */
+    rbuf = (int *)malloc( size * sizeof(int) );
+    sbuf = (int *)malloc( size * sizeof(int) );
+    if (!rbuf || !sbuf) {
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+    for (i=0; i<size; i++) 
+       sbuf[i] = 0;
+    sbuf[new_rank] = 1;
+    MPI_Reduce( sbuf, rbuf, size, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD );
+    if (rank == 0) {
+       for (i=0; i<size; i++) {
+           if (rbuf[i] != 1) {
+               errors++;
+               fprintf( stderr, "Rank %d used %d times\n", i, rbuf[i] );
+           }
+       }
+       if (errors == 0) 
+           printf( "Cart map test passed\n" );
+    }
+
+    free( rbuf );
+    free( sbuf );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/topol/cartmap.std b/teshsuite/smpi/mpich-test/topol/cartmap.std
new file mode 100644 (file)
index 0000000..6e6af96
--- /dev/null
@@ -0,0 +1,3 @@
+**** Testing MPI_Cart_map etc ****
+Cart map test passed
+**** Testing MPI_Cart_map etc ****
diff --git a/teshsuite/smpi/mpich-test/topol/cartorder.c b/teshsuite/smpi/mpich-test/topol/cartorder.c
new file mode 100644 (file)
index 0000000..a380455
--- /dev/null
@@ -0,0 +1,148 @@
+#include "mpi.h"
+#include <stdio.h>
+#include "test.h"
+
+/* This test makes sure that the ordering if reorder is FALSE is
+   as specified in 6.2, virtual topologies 
+
+   At the same time, it duplicates the tests in cart.c, but
+   with reorder = 0.
+*/
+
+#define NUM_DIMS 2
+
+int main( int argc, char **argv )
+{
+    int              rank, size, i;
+    int              errors=0;
+    int              dims[NUM_DIMS];
+    int              periods[NUM_DIMS];
+    int              coords[NUM_DIMS];
+    int              new_coords[NUM_DIMS];
+    int              reorder = 0;
+    MPI_Comm         comm_temp, comm_cart, new_comm;
+    int              topo_status;
+    int              ndims;
+    int              new_rank;
+    int              remain_dims[NUM_DIMS];
+    int              newnewrank;
+
+    MPI_Init( &argc, &argv );
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+
+    /* Clear dims array and get dims for topology */
+    for(i=0;i<NUM_DIMS;i++) { dims[i] = 0; periods[i] = 0; }
+    MPI_Dims_create ( size, NUM_DIMS, dims );
+
+    /* Make a new communicator with a topology */
+    MPI_Cart_create ( MPI_COMM_WORLD, 2, dims, periods, reorder, &comm_temp );
+    MPI_Comm_dup ( comm_temp, &comm_cart );
+
+    /* Determine the status of the new communicator */
+    MPI_Topo_test ( comm_cart, &topo_status );
+    if (topo_status != MPI_CART) {
+       printf( "topo_status of duped comm is not MPI_CART\n" );
+       errors++;
+    }
+
+    /* How many dims do we have? */
+    MPI_Cartdim_get( comm_cart, &ndims );
+    if ( ndims != NUM_DIMS ) {
+       printf( "Number of dims of duped comm (%d) should be %d\n", 
+               ndims, NUM_DIMS );
+       errors++;
+    }
+
+    /* Get the topology, does it agree with what we put in? */
+    for(i=0;i<NUM_DIMS;i++) { dims[i] = 0; periods[i] = 0; }
+    MPI_Cart_get ( comm_cart, NUM_DIMS, dims, periods, coords );
+
+    /* Check that the coordinates are correct */
+#if NUM_DIMS == 2
+    if (rank != coords[1] + coords[0] * dims[1]) {
+       errors++;
+       fprintf( stderr, 
+"Did not get expected coordinate (row major required by MPI standard 6.2)\n" );
+    }
+#endif
+    /* Does the mapping from coords to rank work? */
+    MPI_Cart_rank ( comm_cart, coords, &new_rank );
+    if ( new_rank != rank ) {
+       printf( "New rank of duped comm (%d) != old rank (%d)\n", 
+               new_rank, rank );
+       errors++;
+    }
+
+    /* Does the mapping from rank to coords work */
+    MPI_Cart_coords ( comm_cart, rank, NUM_DIMS, new_coords );
+    for (i=0;i<NUM_DIMS;i++) 
+       if ( coords[i] != new_coords[i] ) {
+           printf( "Old coords[%d] of duped comm (%d) != new_coords (%d)\n", 
+                   i, coords[i], new_coords[i] );
+           errors++;
+       }
+
+    /* Let's shift in each dimension and see how it works!   */
+    /* Because it's late and I'm tired, I'm not making this  */
+    /* automatically test itself.                            */
+    for (i=0;i<NUM_DIMS;i++) {
+      int source, dest;
+      MPI_Cart_shift(comm_cart, i, 1, &source, &dest);
+#ifdef VERBOSE      
+      printf ("[%d] Shifting %d in the %d dimension\n",rank,1,i);
+      printf ("[%d]    source = %d  dest = %d\n",rank,source,dest); 
+#endif
+    }
+
+    /* Subdivide */
+    remain_dims[0] = 0; 
+    for (i=1; i<NUM_DIMS; i++) remain_dims[i] = 1;
+    MPI_Cart_sub ( comm_cart, remain_dims, &new_comm );
+
+    /* Determine the status of the new communicator */
+    MPI_Topo_test ( new_comm, &topo_status );
+    if (topo_status != MPI_CART) {
+       printf( "topo_status of cartsub comm is not MPI_CART\n" );
+       errors++;
+    }
+
+    /* How many dims do we have? */
+    MPI_Cartdim_get( new_comm, &ndims );
+    if ( ndims != NUM_DIMS-1 ) {
+       printf( "Number of dims of cartsub comm (%d) should be %d\n", 
+               ndims, NUM_DIMS-1 );
+       errors++;
+    }
+
+    /* Get the topology, does it agree with what we put in? */
+    for(i=0;i<NUM_DIMS-1;i++) { dims[i] = 0; periods[i] = 0; }
+    MPI_Cart_get ( new_comm, ndims, dims, periods, coords );
+    
+    /* Does the mapping from coords to rank work? */
+    MPI_Comm_rank ( new_comm, &newnewrank );
+    MPI_Cart_rank ( new_comm, coords, &new_rank );
+    if ( new_rank != newnewrank ) {
+       printf( "New rank of cartsub comm (%d) != old rank (%d)\n", 
+               new_rank, newnewrank );
+       errors++;
+    }
+    /* Does the mapping from rank to coords work */
+    MPI_Cart_coords ( new_comm, new_rank, NUM_DIMS -1, new_coords );
+    for (i=0;i<NUM_DIMS-1;i++) 
+       if ( coords[i] != new_coords[i] ) {
+           printf( "Old coords[%d] of cartsub comm (%d) != new_coords (%d)\n", 
+                   i, coords[i], new_coords[i] );
+           errors++;
+       }
+
+    /* We're at the end */
+    MPI_Comm_free( &new_comm );
+    MPI_Comm_free( &comm_temp );
+    MPI_Comm_free( &comm_cart );
+    Test_Waitforall( );
+    if (errors) printf( "[%d] done with %d ERRORS!\n", rank,errors );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/topol/dims.c b/teshsuite/smpi/mpich-test/topol/dims.c
new file mode 100644 (file)
index 0000000..c9c4747
--- /dev/null
@@ -0,0 +1,117 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+
+#include "mpi.h"
+#include <stdio.h>
+
+int main( int argc, char *argv[] )
+{
+    int dims[10];
+    int i, j, ndims, totnodes, err, errcnt = 0;
+
+    MPI_Init( &argc, &argv );
+
+    MPI_Errhandler_set( MPI_COMM_WORLD, MPI_ERRORS_RETURN );
+
+    /* Try for error checks */
+    dims[0] = 2;
+    dims[1] = 2;
+    dims[2] = 0;
+    err = MPI_Dims_create( 26, 3, dims );
+    if (err == MPI_SUCCESS) {
+       printf( "The product of the specified dims does not divide the nnodes and MPI_Dims_create did not return an error\n" );
+       for (i=0; i<3; i++) {
+           printf( "dims[%d] = %d\n", i, dims[i] );
+       }
+       errcnt++;
+    }
+
+    /* Check for a few reasonable decompositions */
+    dims[0] = dims[1] = 0;
+    err = MPI_Dims_create( 16, 2, dims );
+    if (err) {
+       char msg[MPI_MAX_ERROR_STRING];
+       int result_len;
+       MPI_Error_string( err, msg, &result_len );
+       printf( "Unexpected error return from dims_create (16,2) %s\n", msg );
+       errcnt++;
+    }
+    else {
+       if (dims[0] * dims[1] != 16) {
+           printf( "Returned dimensions do not match request\n" );
+           errcnt++;
+       }
+#ifdef MPICH_NAME
+       if (dims[0] != 4) {
+           errcnt++;
+           printf( "Expected 4 x 4, got %d x %d\n", dims[0],dims[1] );
+       }
+#endif
+    }
+
+    dims[0] = dims[1] = 0;
+    /* 60 = 2 * 2 * 3 * 5 */
+    err = MPI_Dims_create( 60, 2, dims );
+    if (err) {
+       char msg[MPI_MAX_ERROR_STRING];
+       int result_len;
+       MPI_Error_string( err, msg, &result_len );
+       printf( "Unexpected error return from dims_create (16,2) %s\n", msg );
+       errcnt++;
+    }
+    else {
+       if (dims[0] * dims[1] != 60) {
+           printf( "Returned dimensions do not match request (%d)\n",
+                   dims[0] * dims[1] );
+           errcnt++;
+       }
+#ifdef MPICH_NAME
+       if (dims[0] == 1 || dims[1] == 1) {
+           errcnt++;
+           printf( "Expected rectangular decomp, got %d x %d\n", 
+                   dims[0],dims[1] );
+       }
+#endif
+    }
+
+    /* Test a range of values */
+    for (ndims=1; ndims<=4; ndims++) {
+       for (i=2; i<64; i++) {
+           for (j=0; j<ndims; j++) {
+               dims[j] = 0;
+           }
+           MPI_Dims_create( i, ndims, dims );
+           /* Check the results */
+           totnodes = 1;
+           for (j=0; j<ndims; j++) {
+               totnodes *= dims[j];
+               if (dims[j] <= 0) {
+                   errcnt++;
+                   printf( "Non positive dims[%d] = %d for %d nodes and %d ndims\n", 
+                           j, dims[j], i, ndims );
+               }
+           }
+           if (totnodes != i) {
+               errcnt++;
+               printf( "Did not correctly partition %d nodes among %d dims (got %d nodes)\n",
+                       i, ndims, totnodes );
+               if (ndims > 1) {
+                   printf( "Dims = " );
+                   for (j=0; j<ndims; j++) {
+                       printf( " %d", dims[j] );
+                   }
+                   printf( "\n" );
+               }
+           }
+               
+       }
+    }
+    /* Summarize the results */
+    if (errcnt) {
+       printf( " %d errors found\n", errcnt );
+    }
+    else {
+       printf( " No Errors\n" );
+    }
+    MPI_Finalize( );
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich-test/topol/graphtest.c b/teshsuite/smpi/mpich-test/topol/graphtest.c
new file mode 100644 (file)
index 0000000..ee60559
--- /dev/null
@@ -0,0 +1,234 @@
+/*
+
+  Test for the MPI Graph routines :
+
+  MPI_Graphdims_get
+  MPI_Graph_create
+  MPI_Graph_get
+  MPI_Graph_map
+  MPI_Graph_neighbors
+  MPI_Graph_neighbors_count
+*/
+
+
+#include "mpi.h"
+#include <stdio.h>
+/* stdlib.h Needed for malloc declaration */
+#include <stdlib.h>
+#include "test.h"
+
+void NumberEdges ( int **, int **, int, int, int );
+void PrintGraph  ( int, int *, int * );
+
+int main( int argc, char **argv )
+{
+    MPI_Comm comm, new_comm;
+    int      reorder;
+    int      nbrarray[3], baseindex;
+    int      size, i, j, nnodes, nedges, q_nnodes, q_nedges, q_nnbrs, newrank;
+    int      *index, *edges, *q_index, *q_edges, *rankbuf;
+    int      worldrank, err = 0, toterr;
+
+    MPI_Init( &argc, &argv );
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &worldrank );
+
+/* Generate the graph for a binary tree.  
+   
+   Note that EVERY process must have the SAME data
+   */
+    comm = MPI_COMM_WORLD;
+    MPI_Comm_size( comm, &size );
+
+    index = (int *)malloc( (size + 1) * sizeof(int) );
+    edges = (int *)malloc( (size + 1) * 3 * sizeof(int) );
+    reorder = 0;
+    for (i=0; i < size; i++) {
+       index[i] = 0;
+    }
+    NumberEdges( &index, &edges, -1, 0, size - 1 );
+    nedges= index[0];
+    for (i=1; i<size; i++) {
+       nedges += index[i];
+       index[i] = index[i] + index[i-1];
+    }
+    nnodes = size;
+#ifdef DEBUG
+    PrintGraph( nnodes, index, edges );
+#endif
+    MPI_Graph_create( comm, nnodes, index, edges, reorder, &new_comm );
+
+/* Now, try to get the information about this graph */
+    MPI_Graphdims_get( new_comm, &q_nnodes, &q_nedges );
+    if (q_nnodes != nnodes) {
+       printf( "Wrong number of nodes, expected %d got %d\n", nnodes, q_nnodes );
+       err++;
+    }
+    if (q_nedges != nedges) {
+       printf( "Wrong number of edges; expected %d got %d\n", nedges, q_nedges );
+       err++;
+    }
+    q_index = (int *)malloc( q_nnodes * sizeof(int) );
+    q_edges = (int *)malloc( q_nedges * sizeof(int) );
+
+    MPI_Graph_get( new_comm, q_nnodes, q_nedges, q_index, q_edges );
+
+/* Check with original */
+    if (worldrank == 0) {
+       printf( "Checking graph_get\n" );
+    }
+/* Because reorder was set to zero, we should have the same data */
+    for (i=0; i<size; i++) {
+       if (index[i] != q_index[i]) {
+           err++;
+           printf( "index[%d] is %d, should be %d\n", i, q_index[i], index[i] );
+       }
+    }
+    for (i=0; i<nedges; i++) {
+       if (edges[i] != q_edges[i]) {
+           err++;
+           printf( "edges[%d] is %d, should be %d\n", i, q_edges[i], edges[i] );
+       }
+    }
+
+/* Now, get each neighbor set individually */
+    for (i=0; i<size; i++) {
+       MPI_Graph_neighbors_count( new_comm, i, &q_nnbrs );
+       MPI_Graph_neighbors( new_comm, i, 3, nbrarray );
+
+       /* Need to test */
+       baseindex = (i > 0) ? index[i-1] : 0;
+       for (j=0; j<q_nnbrs; j++) {
+           if (nbrarray[j] != edges[baseindex+j]) {
+               err++;
+               printf( "nbrarray[%d] for rank %d should be %d, is %d\n",
+                       j, i, edges[baseindex+j], nbrarray[j] );
+           }
+       }
+    }
+
+/* Test MPI_Graph_map by seeing what ranks are generated for this graph */
+    MPI_Graph_map( comm, nnodes, index, edges, &newrank );
+
+    if (worldrank == 0) {
+       printf( "Checking graph_map\n" );
+    }
+/* Check that the ranks are at least disjoint among all processors. */
+    rankbuf = (int *)malloc( size * sizeof(int) );
+    MPI_Allgather( &newrank, 1, MPI_INT, rankbuf, 1, MPI_INT, comm );
+    for (i=0; i<size; i++) {
+       for (j=0; j<size; j++) {
+           if (rankbuf[j] == i) break;
+       }
+       if (j >= size) {
+           err++;
+           printf( "Rank %d missing in graph_map\n", i );
+       }
+    }
+
+    MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+    if (worldrank == 0) {
+       if (toterr == 0) 
+           printf( "No errors in MPI Graph routines\n" );
+       else
+           printf( "Found %d errors in MPI Graph routines\n", toterr );
+    }
+
+    MPI_Comm_free( &new_comm );
+    free( index );
+    free( edges );
+    free( q_index );
+    free( q_edges );
+    free( rankbuf );
+    MPI_Finalize( );
+    return 0;
+}
+
+/* 
+ * Routine to print out a graph for debugging
+ */
+void PrintGraph( nnodes, index, edges )
+int nnodes, *index, *edges;
+{
+    int i, lastidx, j;
+    lastidx=0;
+    printf( "rank\tindex\tedges\n" );
+    for (i=0; i<nnodes; i++) {
+       printf( "%d\t%d\t", i, index[i] );
+       for (j=0; j<index[i] - lastidx; j++) {
+           printf( "%d ", *edges++ );
+       }
+       printf( "\n" );
+       lastidx = index[i];
+    }
+}
+
+/* 
+   Number index[0] as first, add its children, and then number them.
+   Note that because of the way the index/edge list is defined, we 
+   need to do a depth-first evaluation
+
+   Each process is connected to the processes rank+1
+   and rank + 1 + floor((size)/2), where size is the size of the subtree 
+
+   Make index[i] the DEGREE of node i.  We'll make the relative to 0
+   at the end.
+ */
+void NumberEdges( Index, Edges, parent, first, last )
+int **Index, **Edges, parent, first, last;
+{
+    int *index = *Index;
+    int *edges = *Edges;
+    int right;
+
+    index[0] = 0;
+    if (parent >= 0) {
+#ifdef DEBUG    
+       printf( "Adding parent %d to %d\n", parent, first );
+#endif
+       *index   = *index + 1;
+       *edges++ = parent;
+    }
+    if (first >= last) {
+       /* leaf */
+       index++;
+       if (parent >= 0) {
+           *Index = index;
+           *Edges = edges;
+       }
+       return;
+    }
+
+/* Internal node.  Always at least a left child */
+#ifdef DEBUG
+    printf( "Adding left child %d to %d\n", first + 1, first );
+#endif
+    *index      = *index + 1;
+    *edges++ = first + 1;
+
+/* Try to add a right child */
+    right = (last - first)/2;
+    right = first + right + 1;
+    if (right == first + 1) 
+       right++;
+    if (right <= last) {
+       /* right child */
+#ifdef DEBUG    
+       printf( "Adding rightchild %d to %d\n", right, first );
+#endif
+       *index   = *index + 1;
+       *edges++ = right;
+    }
+    index++;
+    if (first + 1 <= last && right - 1 > first) {
+       NumberEdges( &index, &edges, first, first + 1, 
+                    (right <= last) ? right - 1: last );
+    }
+    if (right <= last) {
+       NumberEdges( &index, &edges, first, right, last );
+    }
+    if (parent >= 0) {
+       *Index = index;
+       *Edges = edges;
+    }
+}
diff --git a/teshsuite/smpi/mpich-test/topol/graphtest.std b/teshsuite/smpi/mpich-test/topol/graphtest.std
new file mode 100644 (file)
index 0000000..0182e23
--- /dev/null
@@ -0,0 +1,5 @@
+**** Testing MPI_Graph_create etc ****
+Checking graph_get
+Checking graph_map
+No errors in MPI Graph routines
+**** Testing MPI_Graph_create etc ****
diff --git a/teshsuite/smpi/mpich-test/topol/test.c b/teshsuite/smpi/mpich-test/topol/test.c
new file mode 100644 (file)
index 0000000..9c7b299
--- /dev/null
@@ -0,0 +1,102 @@
+/* Procedures for recording and printing test results */
+
+#include <stdio.h>
+#include <string.h>
+#include "test.h"
+#include "mpi.h"
+
+static int tests_passed = 0;
+static int tests_failed = 0;
+static char failed_tests[255][81];
+static char suite_name[255];
+FILE *fileout = NULL;
+
+void Test_Init(suite, rank)
+char *suite;
+int rank;
+{
+    char filename[512];
+
+    sprintf(filename, "%s-%d.out", suite, rank);
+    strncpy(suite_name, suite, 255);
+    fileout = fopen(filename, "w");
+    if (!fileout) {
+       fprintf( stderr, "Could not open %s on node %d\n", filename, rank );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+}
+
+void Test_Message(mess)
+char *mess;
+{
+    fprintf(fileout, "[%s]: %s\n", suite_name, mess);
+    fflush(fileout);
+}
+
+void Test_Failed(test)
+char *test;
+{
+    fprintf(fileout, "[%s]: *** Test '%s' Failed! ***\n", suite_name, test);
+    strncpy(failed_tests[tests_failed], test, 81);
+    fflush(fileout);
+    tests_failed++;
+}
+
+void Test_Passed(test)
+char *test;
+{
+#ifdef VERBOSE    
+    fprintf(fileout, "[%s]: Test '%s' Passed.\n", suite_name, test);
+    fflush(fileout);
+#endif
+    tests_passed++;
+}
+
+int Summarize_Test_Results()
+{
+#ifdef VERBOSE
+    fprintf(fileout, "For test suite '%s':\n", suite_name);
+#else
+    if (tests_failed > 0)
+#endif
+    {
+       fprintf(fileout, "Of %d attempted tests, %d passed, %d failed.\n", 
+               tests_passed + tests_failed, tests_passed, tests_failed);
+    }
+    if (tests_failed > 0) {
+       int i;
+
+       fprintf(fileout, "*** Tests Failed:\n");
+       for (i = 0; i < tests_failed; i++)
+           fprintf(fileout, "*** %s\n", failed_tests[i]);
+    }
+    return tests_failed;
+}
+
+void Test_Finalize()
+{
+    fflush(fileout);
+    fclose(fileout);
+}
+
+#include "mpi.h"
+/* Wait for every process to pass through this point.  This test is used
+   to make sure that all processes complete, and that a test "passes" because
+   it executed, not because it some process failed.  
+ */
+void Test_Waitforall( )
+{
+int m, one, myrank, n;
+
+MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
+MPI_Comm_size( MPI_COMM_WORLD, &n );
+one = 1;
+MPI_Allreduce( &one, &m, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
+
+if (m != n) {
+    printf( "[%d] Expected %d processes to wait at end, got %d\n", myrank, 
+           n, m );
+    }
+if (myrank == 0) 
+    printf( " No Errors\n" );
+}
diff --git a/teshsuite/smpi/mpich-test/topol/test.h b/teshsuite/smpi/mpich-test/topol/test.h
new file mode 100644 (file)
index 0000000..b79cd2c
--- /dev/null
@@ -0,0 +1,24 @@
+/* Header for testing procedures */
+
+#ifndef _INCLUDED_TEST_H_
+#define _INCLUDED_TEST_H_
+
+#if defined(NEEDS_STDLIB_PROTOTYPES)
+#include "protofix.h"
+#endif
+
+void Test_Init (char *, int);
+#ifdef USE_STDARG
+void Test_Printf (char *, ...);
+#else
+/* No prototype */
+void Test_Printf();
+#endif
+void Test_Message (char *);
+void Test_Failed (char *);
+void Test_Passed (char *);
+int Summarize_Test_Results (void);
+void Test_Finalize (void);
+void Test_Waitforall (void);
+
+#endif
diff --git a/teshsuite/smpi/mpich-test/topol/twod.f b/teshsuite/smpi/mpich-test/topol/twod.f
new file mode 100644 (file)
index 0000000..6d791b3
--- /dev/null
@@ -0,0 +1,291 @@
+c**********************************************************************
+c   twod.f - a solution to the Poisson problem by using Jacobi 
+c   interation on a 2-d decomposition
+c     
+c   .... the rest of this is from pi3.f to show the style ...
+c
+c   Each node: 
+c    1) receives the number of rectangles used in the approximation.
+c    2) calculates the areas of it's rectangles.
+c    3) Synchronizes for a global summation.
+c   Node 0 prints the result.
+c
+c  Variables:
+c
+c    pi  the calculated result
+c    n   number of points of integration.  
+c    x           midpoint of each rectangle's interval
+c    f           function to integrate
+c    sum,pi      area of rectangles
+c    tmp         temporary scratch space for global summation
+c    i           do loop index
+c
+c     This code is included (without the prints) because one version of
+c     MPICH SEGV'ed (probably because of errors in handling send/recv of
+c     MPI_PROC_NULL source/destination).
+c
+c****************************************************************************
+      program main
+      include "mpif.h"
+      integer maxn
+      parameter (maxn = 128)
+      double precision  a(maxn,maxn), b(maxn,maxn), f(maxn,maxn)
+      integer nx, ny
+      integer myid, numprocs, it, rc, comm2d, ierr, stride
+      integer nbrleft, nbrright, nbrtop, nbrbottom
+      integer sx, ex, sy, ey
+      integer dims(2)
+      logical periods(2)
+      double precision diff2d, diffnorm, dwork
+      double precision t1, t2
+      external diff2d
+      data periods/2*.false./
+
+      call MPI_INIT( ierr )
+      call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
+      call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
+c      print *, "Process ", myid, " of ", numprocs, " is alive"
+      if (myid .eq. 0) then
+c
+c         Get the size of the problem
+c
+c          print *, 'Enter nx'
+c          read *, nx
+           nx = 10
+      endif
+c      print *, 'About to do bcast on ', myid
+      call MPI_BCAST(nx,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)
+      ny   = nx
+c
+c Get a new communicator for a decomposition of the domain.  Let MPI
+c find a "good" decomposition
+c
+      dims(1) = 0
+      dims(2) = 0
+      call MPI_DIMS_CREATE( numprocs, 2, dims, ierr )
+      call MPI_CART_CREATE( MPI_COMM_WORLD, 2, dims, periods, .true.,
+     *                    comm2d, ierr )
+c
+c Get my position in this communicator
+c 
+      call MPI_COMM_RANK( comm2d, myid, ierr )
+c      print *, "Process ", myid, " of ", numprocs, " is alive"
+c
+c My neighbors are now +/- 1 with my rank.  Handle the case of the 
+c boundaries by using MPI_PROCNULL.
+      call fnd2dnbrs( comm2d, nbrleft, nbrright, nbrtop, nbrbottom )
+c      print *, "Process ", myid, ":", 
+c     *     nbrleft, nbrright, nbrtop, nbrbottom
+c
+c Compute the decomposition
+c     
+      call fnd2ddecomp( comm2d, nx, sx, ex, sy, ey )
+c      print *, "Process ", myid, ":", sx, ex, sy, ey
+c
+c Create a new, "strided" datatype for the exchange in the "non-contiguous"
+c direction
+c
+      call mpi_Type_vector( ey-sy+1, 1, ex-sx+3, 
+     $                      MPI_DOUBLE_PRECISION, stride, ierr )
+      call mpi_Type_commit( stride, ierr )
+c
+c
+c Initialize the right-hand-side (f) and the initial solution guess (a)
+c
+      call twodinit( a, b, f, nx, sx, ex, sy, ey )
+c
+c Actually do the computation.  Note the use of a collective operation to
+c check for convergence, and a do-loop to bound the number of iterations.
+c
+      call MPI_BARRIER( MPI_COMM_WORLD, ierr )
+      t1 = MPI_WTIME()
+      do 10 it=1, 100
+        call exchng2( a, b, sx, ex, sy, ey, comm2d, stride, 
+     $                nbrleft, nbrright, nbrtop, nbrbottom )
+        call sweep2d( b, f, nx, sx, ex, sy, ey, a )
+        call exchng2( b, a, sx, ex, sy, ey, comm2d, stride, 
+     $                nbrleft, nbrright, nbrtop, nbrbottom )
+        call sweep2d( a, f, nx, sx, ex, sy, ey, b )
+        dwork = diff2d( a, b, nx, sx, ex, sy, ey )
+        call MPI_Allreduce( dwork, diffnorm, 1, MPI_DOUBLE_PRECISION, 
+     $                     MPI_SUM, comm2d, ierr )
+        if (diffnorm .lt. 1.0e-5) goto 20
+c        if (myid .eq. 0) print *, 2*it, ' Difference is ', diffnorm
+10     continue
+      if (myid .eq. 0) print *, 'Failed to converge'
+20    continue
+      t2 = MPI_WTIME()
+c      if (myid .eq. 0) then
+c         print *, 'Converged after ', 2*it, ' Iterations in ', t2 - t1,
+c     $        ' secs '
+c      endif
+c
+c
+      call MPI_Type_free( stride, ierr )
+      call MPI_Comm_free( comm2d, ierr )
+      if (myid .eq. 0) then
+         print *, ' No Errors'
+      endif
+      call MPI_FINALIZE(rc)
+      end
+c
+c Perform a Jacobi sweep for a 2-d decomposition
+c
+      subroutine sweep2d( a, f, n, sx, ex, sy, ey, b )
+      integer n, sx, ex, sy, ey
+      double precision a(sx-1:ex+1, sy-1:ey+1), f(sx-1:ex+1, sy-1:ey+1),
+     +                 b(sx-1:ex+1, sy-1:ey+1)
+c
+      integer i, j
+      double precision h
+c
+      h = 1.0d0 / dble(n+1)
+      do 10 i=sx, ex
+         do 10 j=sy, ey
+            b(i,j) = 0.25 * (a(i-1,j)+a(i,j+1)+a(i,j-1)+a(i+1,j)) - 
+     +               h * h * f(i,j)
+ 10   continue
+      return
+      end
+
+       subroutine exchng2( a, b, sx, ex, sy, ey, 
+     $                     comm2d, stride, 
+     $                     nbrleft, nbrright, nbrtop, nbrbottom  )
+       include "mpif.h"
+       integer sx, ex, sy, ey, stride
+       double precision a(sx-1:ex+1, sy-1:ey+1), 
+     $                  b(sx-1:ex+1, sy-1:ey+1)
+       integer nbrleft, nbrright, nbrtop, nbrbottom, comm2d
+       integer status(MPI_STATUS_SIZE), ierr, nx
+c
+       nx = ex - sx + 1
+c  These are just like the 1-d versions, except for less data
+        call MPI_SENDRECV( b(ex,sy),  nx, MPI_DOUBLE_PRECISION, 
+     $                    nbrtop, 0,
+     $                    a(sx-1,sy), nx, MPI_DOUBLE_PRECISION, 
+     $                    nbrbottom, 0, comm2d, status, ierr )
+        call MPI_SENDRECV( b(sx,sy),  nx, MPI_DOUBLE_PRECISION,
+     $                    nbrbottom, 1,
+     $                    a(ex+1,sy), nx, MPI_DOUBLE_PRECISION, 
+     $                    nbrtop, 1, comm2d, status, ierr )
+c
+c This uses the "strided" datatype
+        call MPI_SENDRECV( b(sx,ey),  1, stride, nbrright,  0,
+     $                     a(sx,sy-1), 1, stride, nbrleft,  0, 
+     $                     comm2d, status, ierr )
+        call MPI_SENDRECV( b(sx,sy),  1, stride, nbrleft,   1,
+     $                     a(sx,ey+1), 1, stride, nbrright, 1, 
+     $                     comm2d, status, ierr )
+        return
+        end
+
+c
+c  The rest of the 2-d program
+c
+      double precision function diff2d( a, b, nx, sx, ex, sy, ey )
+      integer nx, sx, ex, sy, ey
+      double precision a(sx-1:ex+1, sy-1:ey+1), b(sx-1:ex+1, sy-1:ey+1)
+c
+      double precision sum
+      integer i, j
+c
+      sum = 0.0d0
+      do 10 j=sy,ey
+         do 10 i=sx,ex
+            sum = sum + (a(i,j) - b(i,j)) ** 2
+ 10      continue
+c      
+      diff2d = sum
+      return
+      end
+      subroutine twodinit( a, b, f, nx, sx, ex, sy, ey )
+      integer nx, sx, ex, sy, ey
+      double precision a(sx-1:ex+1, sy-1:ey+1), b(sx-1:ex+1, sy-1:ey+1),
+     &                 f(sx-1:ex+1, sy-1:ey+1)
+c
+      integer i, j
+c
+      do 10 j=sy-1,ey+1
+         do 10 i=sx-1,ex+1
+            a(i,j) = 0.0d0
+            b(i,j) = 0.0d0
+            f(i,j) = 0.0d0
+ 10      continue
+c      
+c    Handle boundary conditions
+c
+      if (sx .eq. 1) then 
+         do 20 j=sy,ey
+            a(0,j) = 1.0d0
+            b(0,j) = 1.0d0
+ 20      continue
+      endif
+      if (ex .eq. nx) then
+         do 21 j=sy,ey
+            a(nx+1,j) = 0.0d0
+            b(nx+1,j) = 0.0d0
+ 21      continue
+      endif 
+      if (sy .eq. 1) then
+         do 30 i=sx,ex
+            a(i,0) = 1.0d0
+            b(i,0) = 1.0d0
+ 30      continue 
+      endif
+c
+      return
+      end
+
+c
+c  This file contains a routine for producing a decomposition of a 1-d array
+c  when given a number of processors.  It may be used in "direct" product
+c  decomposition.  The values returned assume a "global" domain in [1:n]
+c
+      subroutine MPE_DECOMP1D( n, numprocs, myid, s, e )
+      integer n, numprocs, myid, s, e
+      integer nlocal
+      integer deficit
+c
+      nlocal  = n / numprocs
+      s       = myid * nlocal + 1
+      deficit = mod(n,numprocs)
+      s       = s + min(myid,deficit)
+      if (myid .lt. deficit) then
+          nlocal = nlocal + 1
+      endif
+      e = s + nlocal - 1
+      if (e .gt. n .or. myid .eq. numprocs-1) e = n
+      return
+      end
+c
+c This routine show how to determine the neighbors in a 2-d decomposition of
+c the domain. This assumes that MPI_Cart_create has already been called 
+c
+      subroutine fnd2dnbrs( comm2d, 
+     $                      nbrleft, nbrright, nbrtop, nbrbottom )
+      integer comm2d, nbrleft, nbrright, nbrtop, nbrbottom
+c
+      integer ierr
+c
+      call MPI_Cart_shift( comm2d, 0,  1, nbrleft,   nbrright, ierr )
+      call MPI_Cart_shift( comm2d, 1,  1, nbrbottom, nbrtop,   ierr )
+c
+      return
+      end
+c
+c Note: THIS IS A TEST PROGRAM.  THE ACTUAL VALUES MOVED ARE NOT
+c CORRECT FOR A POISSON SOLVER.
+c
+      subroutine fnd2ddecomp( comm2d, n, sx, ex, sy, ey )
+      integer comm2d
+      integer n, sx, ex, sy, ey
+      integer dims(2), coords(2), ierr
+      logical periods(2)
+c
+      call MPI_Cart_get( comm2d, 2, dims, periods, coords, ierr )
+
+      call MPE_DECOMP1D( n, dims(1), coords(1), sx, ex )
+      call MPE_DECOMP1D( n, dims(2), coords(2), sy, ey )
+c
+      return
+      end
diff --git a/teshsuite/smpi/mpich-test/topol/twod2.f b/teshsuite/smpi/mpich-test/topol/twod2.f
new file mode 100644 (file)
index 0000000..eb5ea75
--- /dev/null
@@ -0,0 +1,289 @@
+c**********************************************************************
+c   twod.f - a solution to the Poisson problem by using Jacobi 
+c   interation on a 2-d decomposition
+c     
+c   .... the rest of this is from pi3.f to show the style ...
+c
+c   Each node: 
+c    1) receives the number of rectangles used in the approximation.
+c    2) calculates the areas of it's rectangles.
+c    3) Synchronizes for a global summation.
+c   Node 0 prints the result.
+c
+c  Variables:
+c
+c    pi  the calculated result
+c    n   number of points of integration.  
+c    x           midpoint of each rectangle's interval
+c    f           function to integrate
+c    sum,pi      area of rectangles
+c    tmp         temporary scratch space for global summation
+c    i           do loop index
+c
+c     This code is included (without the prints) because one version of
+c     MPICH SEGV'ed (probably because of errors in handling send/recv of
+c     MPI_PROC_NULL source/destination).
+c
+c****************************************************************************
+      program main
+      include "mpif.h"
+      integer maxn
+      parameter (maxn = 128)
+      double precision  a(maxn,maxn), b(maxn,maxn), f(maxn,maxn)
+      integer nx, ny
+      integer myid, numprocs, it, rc, comm2d, ierr, stride
+      integer nbrleft, nbrright, nbrtop, nbrbottom
+      integer sx, ex, sy, ey
+      integer dims(2)
+      logical periods(2)
+      double precision diff2d, diffnorm, dwork
+      double precision t1, t2
+      external diff2d
+      data periods/2*.false./
+
+      call MPI_INIT( ierr )
+      call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
+      call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
+c      print *, "Process ", myid, " of ", numprocs, " is alive"
+      if (myid .eq. 0) then
+c
+c         Get the size of the problem
+c
+c          print *, 'Enter nx'
+c          read *, nx
+           nx = 10
+      endif
+c      print *, 'About to do bcast on ', myid
+      call MPI_BCAST(nx,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)
+      ny   = nx
+c
+c Get a new communicator for a decomposition of the domain.  Let MPI
+c find a "good" decomposition
+c
+      dims(1) = 0
+      dims(2) = 0
+      call MPI_DIMS_CREATE( numprocs, 2, dims, ierr )
+      call MPI_CART_CREATE( MPI_COMM_WORLD, 2, dims, periods, .true.,
+     *                    comm2d, ierr )
+c
+c Get my position in this communicator
+c 
+      call MPI_COMM_RANK( comm2d, myid, ierr )
+c      print *, "Process ", myid, " of ", numprocs, " is alive"
+c
+c My neighbors are now +/- 1 with my rank.  Handle the case of the 
+c boundaries by using MPI_PROCNULL.
+      call fnd2dnbrs( comm2d, nbrleft, nbrright, nbrtop, nbrbottom )
+c      print *, "Process ", myid, ":", 
+c     *     nbrleft, nbrright, nbrtop, nbrbottom
+c
+c Compute the decomposition
+c     
+      call fnd2ddecomp( comm2d, nx, sx, ex, sy, ey )
+c      print *, "Process ", myid, ":", sx, ex, sy, ey
+c
+c Create a new, "strided" datatype for the exchange in the "non-contiguous"
+c direction
+c
+      call mpi_Type_vector( ey-sy+1, 1, ex-sx+3, 
+     $                      MPI_DOUBLE_PRECISION, stride, ierr )
+      call mpi_Type_commit( stride, ierr )
+c
+c
+c Initialize the right-hand-side (f) and the initial solution guess (a)
+c
+      call twodinit( a, b, f, nx, sx, ex, sy, ey )
+c
+c Actually do the computation.  Note the use of a collective operation to
+c check for convergence, and a do-loop to bound the number of iterations.
+c
+      call MPI_BARRIER( MPI_COMM_WORLD, ierr )
+      t1 = MPI_WTIME()
+      do 10 it=1, 100
+       call exchng2( b, sx, ex, sy, ey, comm2d, stride, 
+     $                nbrleft, nbrright, nbrtop, nbrbottom )
+       call sweep2d( b, f, nx, sx, ex, sy, ey, a )
+       call exchng2( a, sx, ex, sy, ey, comm2d, stride, 
+     $                nbrleft, nbrright, nbrtop, nbrbottom )
+       call sweep2d( a, f, nx, sx, ex, sy, ey, b )
+       dwork = diff2d( a, b, nx, sx, ex, sy, ey )
+       call MPI_Allreduce( dwork, diffnorm, 1, MPI_DOUBLE_PRECISION, 
+     $                     MPI_SUM, comm2d, ierr )
+        if (diffnorm .lt. 1.0e-5) goto 20
+        if (myid .eq. 0) print *, 2*it, ' Difference is ', diffnorm
+10     continue
+      if (myid .eq. 0) print *, 'Failed to converge'
+20    continue
+      t2 = MPI_WTIME()
+c      if (myid .eq. 0) then
+c         print *, 'Converged after ', 2*it, ' Iterations in ', t2 - t1,
+c     $        ' secs '
+c      endif
+c
+c
+      call MPI_Type_free( stride, ierr )
+      call MPI_Comm_free( comm2d, ierr )
+      call MPI_FINALIZE(rc)
+      end
+c
+c Perform a Jacobi sweep for a 2-d decomposition
+c
+      subroutine sweep2d( a, f, n, sx, ex, sy, ey, b )
+      integer n, sx, ex, sy, ey
+      double precision a(sx-1:ex+1, sy-1:ey+1), f(sx-1:ex+1, sy-1:ey+1),
+     +                 b(sx-1:ex+1, sy-1:ey+1)
+c
+      integer i, j
+      double precision h
+c
+      h = 1.0d0 / dble(n+1)
+      do 10 j=sy, ey
+         do 10 i=sx, ex
+            b(i,j) = 0.25 * (a(i-1,j)+a(i,j+1)+a(i,j-1)+a(i+1,j)) - 
+     +               h * h * f(i,j)
+ 10   continue
+      return
+      end
+c
+       subroutine exchng2( a, sx, ex, sy, ey, 
+     $                     comm2d, stride, 
+     $                     nbrleft, nbrright, nbrtop, nbrbottom  )
+       include "mpif.h"
+       integer sx, ex, sy, ey, stride
+       double precision a(sx-1:ex+1, sy-1:ey+1)
+       integer nbrleft, nbrright, nbrtop, nbrbottom, comm2d
+       integer status(MPI_STATUS_SIZE), ierr, nx
+c
+       nx = ex - sx + 1
+c  These are just like the 1-d versions, except for less data
+       call MPI_SENDRECV( a(sx,ey),  nx, MPI_DOUBLE_PRECISION, 
+     $                           nbrtop, 0,
+     $                    a(sx,sy-1), nx, MPI_DOUBLE_PRECISION, 
+     $                    nbrbottom, 0, comm2d, status, ierr )
+       call MPI_SENDRECV( a(sx,sy),  nx, MPI_DOUBLE_PRECISION,
+     $                    nbrbottom, 1,
+     $                    a(sx,ey+1), nx, MPI_DOUBLE_PRECISION, 
+     $                    nbrtop, 1, comm2d, status, ierr )
+c
+c This uses the "strided" datatype
+       call MPI_SENDRECV( a(ex,sy),  1, stride, nbrright,  0,
+     $                     a(sx-1,sy), 1, stride, nbrleft,  0, 
+     $                     comm2d, status, ierr )
+       call MPI_SENDRECV( a(sx,sy),  1, stride, nbrleft,   1,
+     $                     a(ex+1,sy), 1, stride, nbrright, 1, 
+     $                     comm2d, status, ierr )
+       return
+       end
+
+c
+c  The rest of the 2-d program
+c
+      double precision function diff2d( a, b, nx, sx, ex, sy, ey )
+      integer nx, sx, ex, sy, ey
+      double precision a(sx-1:ex+1, sy-1:ey+1), b(sx-1:ex+1, sy-1:ey+1)
+c
+      double precision sum
+      integer i, j
+c
+      sum = 0.0d0
+      do 10 j=sy,ey
+         do 10 i=sx,ex
+            sum = sum + (a(i,j) - b(i,j)) ** 2
+ 10      continue
+c      
+      diff2d = sum
+      return
+      end
+      subroutine twodinit( a, b, f, nx, sx, ex, sy, ey )
+      integer nx, sx, ex, sy, ey
+      double precision a(sx-1:ex+1, sy-1:ey+1), b(sx-1:ex+1, sy-1:ey+1),
+     &                 f(sx-1:ex+1, sy-1:ey+1)
+c
+      integer i, j
+c
+      do 10 j=sy-1,ey+1
+         do 10 i=sx-1,ex+1
+            a(i,j) = 0.0d0
+            b(i,j) = 0.0d0
+            f(i,j) = 0.0d0
+ 10      continue
+c      
+c    Handle boundary conditions
+c
+      if (sx .eq. 1) then 
+         do 20 j=sy,ey
+            a(0,j) = 1.0d0
+            b(0,j) = 1.0d0
+ 20      continue
+      endif
+      if (ex .eq. nx) then
+         do 21 j=sy,ey
+            a(nx+1,j) = 0.0d0
+            b(nx+1,j) = 0.0d0
+ 21      continue
+      endif 
+      if (sy .eq. 1) then
+         do 30 i=sx,ex
+            a(i,0) = 1.0d0
+            b(i,0) = 1.0d0
+ 30      continue 
+      endif
+c
+      return
+      end
+
+c
+c  This file contains a routine for producing a decomposition of a 1-d array
+c  when given a number of processors.  It may be used in "direct" product
+c  decomposition.  The values returned assume a "global" domain in [1:n]
+c
+      subroutine MPE_DECOMP1D( n, numprocs, myid, s, e )
+      integer n, numprocs, myid, s, e
+      integer nlocal
+      integer deficit
+c
+      nlocal  = n / numprocs
+      s              = myid * nlocal + 1
+      deficit = mod(n,numprocs)
+      s              = s + min(myid,deficit)
+      if (myid .lt. deficit) then
+          nlocal = nlocal + 1
+      endif
+      e = s + nlocal - 1
+      if (e .gt. n .or. myid .eq. numprocs-1) e = n
+      return
+      end
+c
+c This routine show how to determine the neighbors in a 2-d decomposition of
+c the domain. This assumes that MPI_Cart_create has already been called 
+c
+      subroutine fnd2dnbrs( comm2d, 
+     $                      nbrleft, nbrright, nbrtop, nbrbottom )
+      integer comm2d, nbrleft, nbrright, nbrtop, nbrbottom
+c
+      integer ierr
+c
+      call MPI_Cart_shift( comm2d, 0,  1, nbrleft,   nbrright, ierr )
+      call MPI_Cart_shift( comm2d, 1,  1, nbrbottom, nbrtop,   ierr )
+c
+      return
+      end
+c
+c Note: THIS IS A TEST PROGRAM.  THE ACTUAL VALUES MOVED ARE NOT
+c CORRECT FOR A POISSON SOLVER.
+c
+      subroutine fnd2ddecomp( comm2d, n, sx, ex, sy, ey )
+      integer comm2d
+      integer n, sx, ex, sy, ey
+      integer dims(2), coords(2), ierr
+      logical periods(2)
+c
+      call MPI_Cart_get( comm2d, 2, dims, periods, coords, ierr )
+
+      call MPE_DECOMP1D( n, dims(1), coords(1), sx, ex )
+      call MPE_DECOMP1D( n, dims(2), coords(2), sy, ey )
+c
+      return
+      end
+      
+
index ae9e297..1e4962d 100644 (file)
@@ -4,8 +4,8 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "mpi.h"
 #include <stdio.h>
+#include "mpi.h"
 
 static int test(int myid, int numprocs)
 {
index ada55b9..981d2a2 100644 (file)
@@ -4,8 +4,8 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "mpi.h"
 #include <stdio.h>
+#include "mpi.h"
 #include "instr/instr.h"
 
 #define DATATOSENT 100000000
index e4aa259..8a8b7b7 100644 (file)
@@ -1,21 +1,22 @@
 cmake_minimum_required(VERSION 2.6)
 
 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
-
-add_executable(log_large_test log_large_test.c)
-add_executable(parallel_log_crashtest parallel_log_crashtest.c)
-add_executable(mmalloc_test mmalloc_test.c)
+if(NOT WIN32)
+  add_executable(log_large_test log_large_test.c)
+  add_executable(parallel_log_crashtest parallel_log_crashtest.c)
+  if(HAVE_MMAP)
+    add_executable(mmalloc_test mmalloc_test.c)
+  endif()
+endif()
 
 ### Add definitions for compile
 if(NOT WIN32)
-  target_link_libraries(log_large_test gras m pthread )
-  target_link_libraries(parallel_log_crashtest gras m pthread )
-  target_link_libraries(mmalloc_test gras m pthread )
-else(NOT WIN32)
-  target_link_libraries(log_large_test gras)
-  target_link_libraries(parallel_log_crashtest gras)
-  target_link_libraries(mmalloc_test gras)
-endif(NOT WIN32)
+  target_link_libraries(log_large_test simgrid m pthread )
+  target_link_libraries(parallel_log_crashtest simgrid m pthread )
+  if(HAVE_MMAP)
+    target_link_libraries(mmalloc_test simgrid m pthread )
+  endif()
+endif()
 
 set(tesh_files
   ${tesh_files}
index ba27cec..20c4bbc 100644 (file)
@@ -6,8 +6,7 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "gras.h"
-#include "xbt/synchro.h"
+#include "xbt.h"
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(test, "Logs of this example");
 
index 4f773c3..f181bdf 100644 (file)
@@ -6,8 +6,7 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "gras.h"
-#include "xbt/synchro.h"
+#include "xbt.h"
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(synchro_crashtest, "Logs of this example");
 
@@ -19,7 +18,7 @@ int *id;                        /* to pass a pointer to the threads without race
 int more_info = 0;              /* SET IT TO TRUE TO GET MORE INFO */
 
 /* Code ran by each thread */
-static void crasher_thread(void *arg)
+static void* crasher_thread(void *arg)
 {
   int id = *(int *) arg;
   int i;
@@ -31,19 +30,20 @@ static void crasher_thread(void *arg)
     else
       XBT_INFO("XXX (XX|XX|XX|XX|XX|XX|XX|XX|XX)");
   }
+  return NULL;
 }
 
 int crasher(int argc, char *argv[]);
 int crasher(int argc, char *argv[])
 {
   int i;
-  xbt_thread_t *crashers;
+  xbt_os_thread_t *crashers;
 
-  gras_init(&argc, argv);
+  xbt_init(&argc, argv);
 
   /* initializations of the philosopher mecanisms */
   id = xbt_new0(int, crasher_amount);
-  crashers = xbt_new(xbt_thread_t, crasher_amount);
+  crashers = xbt_new(xbt_os_thread_t, crasher_amount);
 
   for (i = 0; i < crasher_amount; i++)
     id[i] = i;
@@ -52,26 +52,21 @@ int crasher(int argc, char *argv[])
   for (i = 0; i < crasher_amount; i++) {
     char *name = bprintf("thread %d", i);
     crashers[i] =
-        xbt_thread_create(name, &crasher_thread, &id[i], 1 /* joinable */ );
+        xbt_os_thread_create(name, &crasher_thread, &id[i], NULL );
     free(name);
   }
 
   /* wait for them */
   for (i = 0; i < crasher_amount; i++)
-    xbt_thread_join(crashers[i]);
+    xbt_os_thread_join(crashers[i],NULL);
 
   xbt_free(crashers);
   xbt_free(id);
 
-  gras_exit();
   return 0;
 }
 
 int main(int argc, char *argv[])
 {
-  int errcode;
-
-  errcode = crasher(argc, argv);
-
-  return errcode;
+  return crasher(argc, argv);
 }
index 0f18b71..cb7605e 100644 (file)
@@ -1,7 +1,6 @@
 
 ! timeout 20
 p Try to crash the log mecanism by using it in parallel with a lot of threads
-! setenv GRAS_NO_WARN_EXPERIMENTAL=1
 $ xbt/parallel_log_crashtest "--log=root.fmt:%m%n"
 > XXX (XX|XX|XX|XX|XX|XX|XX|XX|XX)
 > XXX (XX|XX|XX|XX|XX|XX|XX|XX|XX)
@@ -9804,4 +9803,3 @@ $ xbt/parallel_log_crashtest "--log=root.fmt:%m%n"
 > XXX (XX|XX|XX|XX|XX|XX|XX|XX|XX)
 > XXX (XX|XX|XX|XX|XX|XX|XX|XX|XX)
 > XXX (XX|XX|XX|XX|XX|XX|XX|XX|XX)
-> Exiting GRAS
index 49addbc..f9eee1c 100644 (file)
@@ -15,14 +15,14 @@ if(NOT WIN32)
   target_link_libraries(surf_usage simgrid m )
   target_link_libraries(surf_usage2 simgrid m )
   target_link_libraries(trace_usage simgrid m )
-else(NOT WIN32)
+else()
   target_link_libraries(lmm_usage simgrid )
   target_link_libraries(maxmin_bench simgrid )
   set_target_properties(maxmin_bench PROPERTIES COMPILE_FLAGS "-DDLL_STATIC")
   target_link_libraries(surf_usage simgrid )
   target_link_libraries(surf_usage2 simgrid )
   target_link_libraries(trace_usage simgrid )
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index b0e8ffd..fa6aaef 100644 (file)
@@ -9,16 +9,16 @@ add_executable(parmap_bench "parmap_bench.c")
 
 ### Add definitions for compile
 if(NOT WIN32)
-  target_link_libraries(log_usage gras m )
+  target_link_libraries(log_usage simgrid m )
   target_link_libraries(graphxml_usage simgrid m )
-  target_link_libraries(heap_bench gras m )
+  target_link_libraries(heap_bench simgrid m )
   target_link_libraries(parmap_bench simgrid m )
-else(NOT WIN32)
-  target_link_libraries(log_usage gras )
+else()
+  target_link_libraries(log_usage simgrid )
   target_link_libraries(graphxml_usage simgrid )
-  target_link_libraries(heap_bench gras )
+  target_link_libraries(heap_bench simgrid )
   target_link_libraries(parmap_bench simgrid )
-endif(NOT WIN32)
+endif()
 
 set(tesh_files
   ${tesh_files}
index 417f987..b873e1b 100644 (file)
 
 #include <stdlib.h>
 #include <stdio.h>
-#include <time.h>
+#include <xbt/xbt_os_time.h>
 
 #include "xbt/heap.h"
-#include "gras/virtu.h"         /* time manipulation in bench */
-
 #include "xbt/sysdep.h"         /* calloc, printf */
 
 #define MAX_TEST 1000000
@@ -80,14 +78,14 @@ void test_heap_mean_operation(int size)
   double date = 0;
   int i, j;
 
-  date = gras_os_time() * 1000000;
+  date = xbt_os_time() * 1000000;
   for (i = 0; i < size; i++)
     xbt_heap_push(heap, NULL, (10.0 * rand() / (RAND_MAX + 1.0)));
 
-  date = gras_os_time() * 1000000 - date;
+  date = xbt_os_time() * 1000000 - date;
   printf("Creation time  %d size heap : %g\n", size, date);
 
-  date = gras_os_time() * 1000000;
+  date = xbt_os_time() * 1000000;
   for (j = 0; j < MAX_TEST; j++) {
 
     if (!(j % size) && j)
@@ -97,7 +95,7 @@ void test_heap_mean_operation(int size)
     xbt_heap_pop(heap);
     xbt_heap_push(heap, NULL, 3.0 * val);
   }
-  date = gras_os_time() * 1000000 - date;
+  date = xbt_os_time() * 1000000 - date;
   printf("Mean access time for a %d size heap : %g\n", size,
          date * 1.0 / (MAX_TEST + 0.0));
 
index 16a24ee..bc50ddd 100644 (file)
@@ -10,9 +10,7 @@
 #pragma hdrstop
 #endif
 
-#include "gras.h"
-
-
+#include "xbt.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(test, top,
                                 "Logging specific to this test");
index cec9426..d63bfc3 100644 (file)
@@ -3,7 +3,7 @@
 #include <xbt/dynar.h>
 #include <xbt/parmap.h>
 #include <xbt/sysdep.h>
-#include <gras_config.h>        /* HAVE_FUTEX_H */
+#include <internal_config.h>        /* HAVE_FUTEX_H */
 #include "xbt/xbt_os_time.h"
 
 #define MODES_DEFAULT 0x7
index 32efcc8..7634adc 100644 (file)
@@ -2,7 +2,6 @@ cmake_minimum_required(VERSION 2.6)
 
 set(bin_files
   ${bin_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/compile-stats
   ${CMAKE_CURRENT_SOURCE_DIR}/fix-paje-trace.sh
   ${CMAKE_CURRENT_SOURCE_DIR}/indent
   ${CMAKE_CURRENT_SOURCE_DIR}/sg_unit_extractor.pl
diff --git a/tools/compile-stats b/tools/compile-stats
deleted file mode 100755 (executable)
index 70dcd48..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#! /bin/sh
-
-HTML="buildlogs/index.html"
-rm -f $HTML
-
-echo "<html>" >> $HTML
-for VERSION in `ls buildlogs|grep -v html` ; do
-  echo "XXXX Version $VERSION"
-  echo "<h3>$VERSION</h3><table border=1>" >> $HTML
-  for file in `ls buildlogs/$VERSION/*.log`; do
-    file=`basename $file`
-    host=`basename $file .log`
-    
-    ## Extract the output from config.log
-    cat buildlogs/$VERSION/$file | \
-      sed -e ':begin' \
-          -e '/CONFIG-LOG-DUMP-BEGIN/ { ' \
-         -e '  :in' \
-         -e '  n'\
-         -e '  /CONFIG-LOG-DUMP-END/Q' \
-         -e '  p'\
-         -e '  b in' \
-         -e '}'\
-         -e 'n'\
-         -e 'b begin' \
-         -n \
-       >buildlogs/$VERSION/$host.config
-    cat buildlogs/$VERSION/$file | \
-      sed -e ':begin' \
-          -e '/CONFIG-LOG-DUMP-BEGIN/Q'\
-         -e 'p'\
-         -e 'n'\
-         -e 'b begin' \
-         -n \
-       >buildlogs/$VERSION/$host.output
-
-    ## Extract some info out there
-    last=`tail -n 1 buildlogs/$VERSION/$file`
-    sys=`grep -e "^build='[^']*'\$" buildlogs/$VERSION/$file| \
-        sed "s/^build='\([^']*\)'\$/\1/"`
-    grassys=`grep "^#define GRAS_THISARCH" buildlogs/$VERSION/$file| \
-             sed 's/.*GRAS_THISARCH //'`
-
-        
-    ## Make text and html outputs
-    if [ "x$last" = "xRemote compilation sucessful." ] ; then
-      res="success: "
-      color=
-    else
-      res="FAILED:  "
-      color="#fc5e5e"
-    fi
-    echo "<tr <td><a href=$VERSION/$host.output>$res</a>" >> $HTML
-    echo "    <td bgcolor='$color'>$host"                 >> $HTML
-    echo "    <td><a href=$VERSION/$host.config>$sys</a>" >> $HTML
-    
-    echo "$res $host     $sys ($grassys)"
-  done
-  echo "</table>" >> $HTML
-done
-echo "</html>" >>$HTML
index a17561f..b62d22a 100644 (file)
@@ -7,9 +7,9 @@ add_executable(graphicator graphicator.c)
 ### Add definitions for compile
 if(NOT WIN32)
   target_link_libraries(graphicator simgrid m pthread )
-else(NOT WIN32)
+else()
   target_link_libraries(graphicator simgrid )
-endif(NOT WIN32)
+endif()
 
 ## Clean generated files
 get_directory_property(extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES)
diff --git a/tools/gras/CMakeLists.txt b/tools/gras/CMakeLists.txt
deleted file mode 100644 (file)
index eb9301c..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-
-set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin")
-
-add_executable(gras_stub_generator stub_generator.c unix_stub_generator.c windows_stub_generator.c)
-add_executable(struct_diff struct_diff.c)
-
-### Add definitions for compile
-if(NOT WIN32)
-  target_link_libraries(gras_stub_generator simgrid pthread m)
-  target_link_libraries(struct_diff         simgrid pthread m)
-else(NOT WIN32)
-  target_link_libraries(gras_stub_generator simgrid)
-  target_link_libraries(struct_diff         simgrid)
-endif(NOT WIN32)
-
-set(tesh_files
-  ${tesh_files}
-  PARENT_SCOPE
-  )
-set(xml_files
-  ${xml_files}
-  PARENT_SCOPE
-  )
-set(tools_src
-  ${tools_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/windows_stub_generator.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/unix_stub_generator.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/struct_diff.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/stub_generator.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/gras_stub_generator.h
-  PARENT_SCOPE
-  )
-set(bin_files
-  ${bin_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/s_smx_process_t
-  ${CMAKE_CURRENT_SOURCE_DIR}/s_smx_simcall_t
-  ${CMAKE_CURRENT_SOURCE_DIR}/stub_generator4borland.mak
-  ${CMAKE_CURRENT_SOURCE_DIR}/stub_generator.bpf
-  ${CMAKE_CURRENT_SOURCE_DIR}/stub_generator.bpr
-  PARENT_SCOPE
-  )
-set(txt_files
-  ${txt_files}
-  PARENT_SCOPE
-  )
diff --git a/tools/gras/gras_stub_generator.h b/tools/gras/gras_stub_generator.h
deleted file mode 100644 (file)
index 8fa5f45..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/* gras_stub_generator - creates the main() to use a GRAS program           */
-
-/* Copyright (c) 2003-2007 Martin Quinson, Arnaud Legrand, Malek Cherier.   */
-/* All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef GRAS_STUB_GENERATOR_H
-#define GRAS_STUB_GENERATOR_H
-
-#define WARN "/***********\n * DO NOT EDIT! THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM %s BY gras_stub_generator\n ***********/\n"
-
-#include "xbt/dynar.h"
-#include "xbt/dict.h"
-extern xbt_dict_t process_function_set;
-extern xbt_dynar_t process_list;
-extern xbt_dict_t machine_set;
-extern char *warning;
-
-typedef struct s_process_t {
-  int argc;
-  char **argv;
-  char *host;
-} s_process_t;
-
-void s_process_free(void *process);
-
-/* UNIX files */
-void generate_sim(char *project);
-void generate_rl(char *project);
-void generate_makefile_am(char *project, char *deployment);
-void generate_makefile_local(char *project, char *deployment);
-
-/* the gras.h header directory (used only in windows)*/
-extern char *__gras_path;
-
-/*
- * Generate a borland simulation poject file.
- * @param name The name of the simulation project
- */
-void generate_borland_simulation_project(const char *name);
-
-/*
- * Generate a borland project file for real life.
- * @param name The name of the project to create.
- */
-void generate_borland_real_life_project(const char *name);
-
-
-/*
- * Create the Microsoft visual C++ file project for the simulation.
- */
-int generate_simulation_dsp_file(const char *project_name);
-
-/*
- * Create the Microsoft visual C++ real life project file.
- */
-int generate_real_live_dsp_file(const char *project_name);
-
-
-#endif
diff --git a/tools/gras/s_smx_process_t b/tools/gras/s_smx_process_t
deleted file mode 100644 (file)
index 877d527..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-struct s_smx_process_t {
-  s_xbt_swag_hookup_t process_hookup;
-  s_xbt_swag_hookup_t synchro_hookup;
-  s_xbt_swag_hookup_t host_proc_hookup;
-  s_xbt_swag_hookup_t destroy_hookup;
-
-  unsigned long pid;
-  char *name                XBT_ANNOTE(size,1);
-  smx_host_t smx_host;          
-  smx_context_t context;        
-  xbt_running_ctx_t *running_ctx XBT_ANNOTE(size,1);
-  short int FLAGS;
-  smx_host_t new_host;          
-  smx_action_t waiting_action;  
-  xbt_fifo_t comms;       
-  xbt_dict_t properties;
-  
-
-} s_smx_process_t;
-
diff --git a/tools/gras/s_smx_simcall_t b/tools/gras/s_smx_simcall_t
deleted file mode 100644 (file)
index 28ae88f..0000000
+++ /dev/null
@@ -1,424 +0,0 @@
-typedef struct s_smx_simcall {
-  e_smx_simcall_t call;
-  smx_process_t issuer;
-
-  union {
-
-    struct {
-      const char *name;
-      smx_host_t result;
-    } host_get_by_name;
-
-    struct {
-      smx_host_t host;
-      const char* result;
-    } host_get_name;
-
-    struct {
-      smx_host_t host;
-      xbt_dict_t result;
-    } host_get_properties;
-
-    struct {
-      smx_host_t host;
-      double result;
-    } host_get_speed;
-
-    struct {
-      smx_host_t host;
-      double result;
-    } host_get_available_speed;
-
-    struct {
-      smx_host_t host;
-      int result;
-    } host_get_state;
-
-    struct {
-      smx_host_t host;
-      void* result;
-    } host_get_data;
-
-    struct {
-      smx_host_t host;
-      void* data;
-    } host_set_data;
-
-    struct {
-      const char* name;
-      smx_host_t host;
-      double computation_amount;
-      double priority;
-      smx_action_t result;
-    } host_execute;
-
-    struct {
-      const char *name;
-      int host_nb;
-      smx_host_t *host_list;
-      double *computation_amount;
-      double *communication_amount;
-      double amount;
-      double rate;
-      smx_action_t result;
-    } host_parallel_execute;
-
-    struct {
-      smx_action_t execution;
-    } host_execution_destroy;
-
-    struct {
-      smx_action_t execution;
-    } host_execution_cancel;
-
-    struct {
-      smx_action_t execution;
-      double result;
-    } host_execution_get_remains;
-
-    struct {
-      smx_action_t execution;
-      e_smx_state_t result;
-    } host_execution_get_state;
-
-    struct {
-      smx_action_t execution;
-      double priority;
-    } host_execution_set_priority;
-
-    struct {
-      smx_action_t execution;
-      e_smx_state_t result;
-    } host_execution_wait;
-
-    struct {
-      smx_process_t *process;
-      const char *name;
-      xbt_main_func_t code;
-      void *data;
-      const char *hostname;
-      int argc;
-      char **argv;
-      xbt_dict_t properties;
-    } process_create;
-
-    struct {
-      smx_process_t process;
-    } process_kill;
-
-    struct {
-      smx_process_t process;
-    } process_cleanup;
-
-    struct {
-      smx_process_t process;
-      smx_host_t dest;
-    } process_change_host;
-
-    struct {
-      smx_process_t process;
-    } process_suspend;
-
-    struct {
-      smx_process_t process;
-    } process_resume;
-
-    struct {
-      int result;
-    } process_count;
-
-    struct {
-      smx_process_t process;
-      void* result;
-    } process_get_data;
-
-    struct {
-      smx_process_t process;
-      void* data;
-    } process_set_data;
-
-    struct {
-      smx_process_t process;
-      smx_host_t result;
-    } process_get_host;
-
-    struct {
-      smx_process_t process;
-      const char *result;
-    } process_get_name;
-
-    struct {
-      smx_process_t process;
-      int result;
-    } process_is_suspended;
-
-    struct {
-      smx_process_t process;
-      xbt_dict_t result;
-    } process_get_properties;
-
-    struct {
-      double duration;
-      e_smx_state_t result;
-    } process_sleep;
-
-    struct {
-      const char *name;
-      smx_rdv_t result;
-    } rdv_create;
-
-    struct {
-      smx_rdv_t rdv;
-    } rdv_destroy;
-
-    struct {
-      const char* name;
-      smx_rdv_t result;
-    } rdv_get_by_name;
-
-    struct {
-      smx_rdv_t rdv;
-      smx_host_t host;
-      unsigned int result;
-    } rdv_comm_count_by_host;
-
-    struct {
-      smx_rdv_t rdv;
-      smx_action_t result;
-    } rdv_get_head;
-
-    struct {
-      smx_rdv_t rdv;
-      double task_size;
-      double rate;
-      void *src_buff;
-      size_t src_buff_size;
-      int (*match_fun)(void *, void *);
-      void *data;
-      double timeout;
-    } comm_send;
-
-    struct {
-      smx_rdv_t rdv;
-      double task_size;
-      double rate;
-      void *src_buff;
-      size_t src_buff_size;
-      int (*match_fun)(void *, void *);
-      void (*clean_fun)(void *);
-      void *data;
-      int detached;
-      smx_action_t result;
-    } comm_isend;
-
-    struct {
-      smx_rdv_t rdv;
-      void *dst_buff;
-      size_t *dst_buff_size;
-      int (*match_fun)(void *, void *);
-      void *data;
-      double timeout;
-    } comm_recv;
-
-    struct {
-      smx_rdv_t rdv;
-      void *dst_buff;
-      size_t *dst_buff_size;
-      int (*match_fun)(void *, void *);
-          void *data;
-      smx_action_t result;
-    } comm_irecv;
-
-    struct {
-      smx_action_t comm;
-    } comm_destroy;
-
-    struct {
-      smx_action_t comm;
-    } comm_cancel;
-
-    struct {
-      xbt_dynar_t comms;
-      unsigned int result;
-    } comm_waitany;
-
-    struct {
-      smx_action_t comm;
-      double timeout;
-    } comm_wait;
-
-    struct {
-      smx_action_t comm;
-      int result;
-    } comm_test;
-
-    struct {
-      xbt_dynar_t comms;
-      int result;
-    } comm_testany;
-
-    struct {
-      smx_action_t comm;
-      double result;
-    } comm_get_remains;
-
-    struct {
-      smx_action_t comm;
-      e_smx_state_t result;
-    } comm_get_state;
-
-    struct {
-      smx_action_t comm;
-      void *result;
-    } comm_get_src_data;
-
-    struct {
-      smx_action_t comm;
-      void *result;
-    } comm_get_dst_data;
-
-    struct {
-      smx_action_t comm;
-      smx_process_t result;
-    } comm_get_src_proc;
-
-    struct {
-      smx_action_t comm;
-      smx_process_t result;
-    } comm_get_dst_proc;
-
-    struct {
-      smx_action_t comm;
-      int result;
-    } comm_is_latency_bounded;
-
-    struct {
-      smx_action_t action;
-      const char *category;
-    } set_category;
-
-    struct {
-      smx_mutex_t result;
-    } mutex_init;
-
-    struct {
-      smx_mutex_t mutex;
-    } mutex_lock;
-
-    struct {
-      smx_mutex_t mutex;
-      int result;
-    } mutex_trylock;
-
-    struct {
-      smx_mutex_t mutex;
-    } mutex_unlock;
-
-    struct {
-      smx_mutex_t mutex;
-    } mutex_destroy;
-
-    struct {
-      smx_cond_t result;
-    } cond_init;
-
-    struct {
-      smx_cond_t cond;
-    } cond_destroy;
-
-    struct {
-      smx_cond_t cond;
-    } cond_signal;
-
-    struct {
-      smx_cond_t cond;
-      smx_mutex_t mutex;
-    } cond_wait;
-
-    struct {
-      smx_cond_t cond;
-      smx_mutex_t mutex;
-      double timeout;
-    } cond_wait_timeout;
-
-    struct {
-      smx_cond_t cond;
-    } cond_broadcast;
-
-    struct {
-      int capacity;
-      smx_sem_t result;
-    } sem_init;
-
-    struct {
-      smx_sem_t sem;
-    } sem_destroy;
-
-    struct {
-      smx_sem_t sem;
-    } sem_release;
-
-    struct {
-      smx_sem_t sem;
-      int result;
-    } sem_would_block;
-
-    struct {
-      smx_sem_t sem;
-    } sem_acquire;
-
-    struct {
-      smx_sem_t sem;
-      double timeout;
-    } sem_acquire_timeout;
-
-    struct {
-      smx_sem_t sem;
-      int result;
-    } sem_get_capacity;
-
-    struct {
-      const char* storage;
-      void *ptr;
-      size_t size;
-      size_t nmemb;
-      m_file_t stream;
-      size_t result;
-    } file_read;
-
-    struct {
-      const char* storage;
-      const void *ptr;
-      size_t size;
-      size_t nmemb;
-      m_file_t stream;
-      size_t result;
-    } file_write;
-
-    struct {
-      const char* storage;
-      const char* path;
-      const char* mode;
-      m_file_t result;
-    } file_open;
-
-    struct {
-      const char* storage;
-      m_file_t fp;
-      int result;
-    } file_close;
-
-    struct {
-      const char* storage;
-      int fd;
-      //Next should be struct stat* buf
-      void* buf;
-      int result;
-    } file_stat;
-
-  };
-} s_smx_simcall_t, *smx_simcall_t;
-
-
-
-
diff --git a/tools/gras/struct_diff.c b/tools/gras/struct_diff.c
deleted file mode 100644 (file)
index 8e25f90..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/* struct_diff -- little tool to see which structure's field are modified on mc_diff */
-
-/* Copyright (c) 2012. The SimGrid Team. All rights reserved.               */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include "xbt.h"
-#include "xbt/datadesc.h"
-#include "xbt/file_stat.h"
-#include "../../src/xbt/datadesc/datadesc_private.h" // RAAAAH! ugly relative path, but it's late, I want it to be done NOW.
-#include "simgrid/simix.h"
-#include "../../src/simix/smx_smurf_private.h" // RAAAAH! ugly relative path, but it's even later and it still doesn't work
-
-static void define_types(void) {
-  xbt_datadesc_type_t desc;
-
-  /* typedef struct xbt_swag_hookup {
-   *    void *next;
-   *    void *prev;
-   *  } s_xbt_swag_hookup_t; */
-  desc = xbt_datadesc_struct("s_xbt_swag_hookup_t");
-  xbt_datadesc_struct_append(desc,"next",xbt_datadesc_by_name("data pointer"));
-  xbt_datadesc_struct_append(desc,"prev",xbt_datadesc_by_name("data pointer"));
-  xbt_datadesc_struct_close(desc);
-
-  /* FIXME: maybe we should provide the internal details */
-  xbt_datadesc_copy("smx_host_t",xbt_datadesc_by_name("data pointer"));
-  xbt_datadesc_copy("smx_context_t",xbt_datadesc_by_name("data pointer"));
-  xbt_datadesc_copy("smx_action_t",xbt_datadesc_by_name("data pointer"));
-  xbt_datadesc_copy("xbt_dict_t",xbt_datadesc_by_name("data pointer"));
-  xbt_datadesc_copy("xbt_fifo_t",xbt_datadesc_by_name("data pointer"));
-  xbt_datadesc_copy("smx_process_t",xbt_datadesc_by_name("data pointer"));
-
-  /* typedef struct {
-   *   char *msg;
-   *   xbt_errcat_t category;
-
-   *   int value;
-   *   short int remote;
-   *   char *host;
-   *   char *procname;
-   *
-   *   int pid;
-   *   char *file;
-   *   int line;
-   *   char *func;
-
-   *   int used;
-   *   char **bt_strings;
-   *   void *bt[XBT_BACKTRACE_SIZE];
-   * } xbt_ex_t;   */
-  desc = xbt_datadesc_struct("xbt_ex_t");
-  xbt_datadesc_struct_append(desc,"msg",xbt_datadesc_by_name("string"));
-
-  xbt_assert(sizeof(xbt_errcat_t)==sizeof(int),
-      "I was assuming that xbt_errcat_t is of the same size than integer, but it's not true: it's %zu (int:%zu)\n",
-      sizeof(xbt_errcat_t),sizeof(int));
-  xbt_datadesc_struct_append(desc,"category",xbt_datadesc_by_name("short int"));
-
-  xbt_datadesc_struct_append(desc,"value",xbt_datadesc_by_name("short int"));
-  xbt_datadesc_struct_append(desc,"remote",xbt_datadesc_by_name("short int"));
-  xbt_datadesc_struct_append(desc,"host",xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_append(desc,"procname",xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_append(desc,"pid",xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_append(desc,"file",xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_append(desc,"line",xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_append(desc,"func",xbt_datadesc_by_name("string"));
-  xbt_datadesc_struct_append(desc,"used",xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_append(desc,"bt_strings",xbt_datadesc_by_name("data pointer"));
-  xbt_datadesc_struct_append(desc,"bt",xbt_datadesc_array_fixed("xbt_bt",xbt_datadesc_by_name("data pointer"),XBT_BACKTRACE_SIZE));
-  xbt_datadesc_struct_close(desc);
-
-  /* typedef struct {
-   *   __ex_mctx_t *ctx_mctx;
-   *   volatile int ctx_caught;
-   *   volatile xbt_ex_t exception;
-   * } xbt_running_ctx_t;   */
-  desc = xbt_datadesc_struct("xbt_running_ctx_t");
-  xbt_datadesc_struct_append(desc,"ctx_mctx",xbt_datadesc_by_name("data pointer"));
-  xbt_datadesc_struct_append(desc,"ctx_caught",xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_append(desc,"exception",xbt_datadesc_by_name("int"));
-  xbt_datadesc_struct_close(desc);
-
-  xbt_assert(sizeof(e_smx_simcall_t)==sizeof(int),
-      "I was assuming that e_smx_simcall_t is of the same size than integer, but it's not true: it's %zu (int:%zu)\n",
-      sizeof(e_smx_simcall_t),sizeof(int));
-  xbt_datadesc_copy("e_smx_simcall_t", xbt_datadesc_by_name("int"));
-}
-
-static void parse_from_file(const char *name){
-  int in=open(name,O_RDONLY);
-  if (in==-1){
-    fprintf(stderr,"Cannot read structure file from %s: %s\n",name,strerror(errno));
-    exit(1);
-  }
-
-  xbt_strbuff_t strbuff = xbt_strbuff_new();
-  int r;
-  do {
-    char buffer[1024];
-    r = read(in,&buffer,1023);
-    buffer[r] = '\0';
-    xbt_strbuff_append(strbuff,buffer);
-  } while (r!=0);
-
-  printf("File %s content:\n%s\n",name,strbuff->data);
-  xbt_datadesc_parse(name,strbuff->data);
-
-}
-
-int main(int argc, char** argv) {
-  xbt_init(&argc, argv);
-  define_types();
-
-  if (argc<3) {
-    fprintf(stderr,"Usage: %s struct-file offset1 offset2 ...\n",argv[0]);
-    exit(1);
-  }
-
-//  parse_from_file("s_smx_simcall_t");
-  parse_from_file(argv[1]);
-
-  int cpt;
-  xbt_datadesc_type_t type = xbt_datadesc_by_name(argv[1]);
-  for (cpt=2;cpt<argc;cpt++) {
-    int offset = atoi(argv[cpt]);
-    unsigned int cursor;
-    xbt_dd_cat_field_t field;
-    int found = 0;
-
-    printf ("Offset: %d in struct %s (there is %lu fields)\n",
-        offset, type->name, xbt_dynar_length(type->category.struct_data.fields));
-    xbt_dynar_foreach(type->category.struct_data.fields,cursor,field) {
-      if (field->offset[GRAS_THISARCH]<= offset&&
-          field->offset[GRAS_THISARCH]+field->type->size[GRAS_THISARCH] >= offset) {
-        found = 1;
-        printf("This offset is somewhere in field %s, which starts at offset %ld and is of size %ld\n",
-              field->name,field->offset[GRAS_THISARCH],field->type->size[GRAS_THISARCH]);
-
-      }
-    }
-    if (!found) {
-
-      printf("Damnit, the structure is too short to find the the field (last field %s was at offset %ld, with size %ld). Weird.\n",
-          field->name,field->offset[GRAS_THISARCH],field->type->size[GRAS_THISARCH]);
-    }
-  }
-  return 0;
-}
-
-
-
diff --git a/tools/gras/stub_generator.bpf b/tools/gras/stub_generator.bpf
deleted file mode 100644 (file)
index 12ae5a4..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-Ce fichier est uniquement utilisé par le gestionnaire de projets et doit Ãªtre traité comme le fichier projet
-
-
-main 
\ No newline at end of file
diff --git a/tools/gras/stub_generator.bpr b/tools/gras/stub_generator.bpr
deleted file mode 100644 (file)
index a6b5828..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!-- C++Builder XML Project -->
-<PROJECT>
-  <MACROS>
-    <VERSION value="BCB.06.00"/>
-    <PROJECT value="stub_generator.exe"/>
-    <OBJFILES value="stub_generator.obj ..\..\src\surf\surfxml_parse.obj 
-      ..\..\src\surf\trace_mgr.obj ..\..\src\xbt\snprintf.obj 
-      ..\..\src\surf\surf.obj ..\..\src\surf\maxmin.obj"/>
-    <RESFILES value="stub_generator.res"/>
-    <IDLFILES value=""/>
-    <IDLGENFILES value=""/>
-    <DEFFILE value=""/>
-    <RESDEPEN value="$(RESFILES)"/>
-    <LIBFILES value="simgrid.lib"/>
-    <LIBRARIES value="rtl.lib vcl.lib"/>
-    <SPARELIBS value="vcl.lib rtl.lib"/>
-    <PACKAGES value="vcl.bpi vclx.bpi bcbsmp.bpi dbrtl.bpi vcldb.bpi adortl.bpi ibsmp.bpi 
-      bdertl.bpi vcldbx.bpi qrpt.bpi teeui.bpi teedb.bpi tee.bpi dss.bpi 
-      teeqr.bpi ibxpress.bpi dsnap.bpi vclie.bpi inetdb.bpi inet.bpi nmfast.bpi 
-      webdsnap.bpi bcbie.bpi dclocx.bpi bcb2kaxserver.bpi PackageLableDate.bpi"/>
-    <PATHCPP value=".;..\..\src\surf;..\..\src\surf;..\..\src\xbt;..\..\src\surf;..\..\src\surf"/>
-    <PATHPAS value=".;"/>
-    <PATHRC value=".;"/>
-    <PATHASM value=".;"/>
-    <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
-    <RELEASELIBPATH value="$(BCB)\lib\release"/>
-    <LINKER value="ilink32"/>
-    <USERDEFINES value="_DEBUG"/>
-    <SYSDEFINES value="NO_STRICT;_NO_VCL"/>
-    <MAINSOURCE value="stub_generator.bpf"/>
-    <INCLUDEPATH value="..\..\src\gras;..\..\src\gras\Virtu;..\..\src\xbt;..\..\src\surf;..\..\..\tools\gras;$(BCB)\include;$(BCB)\include\vcl;C:\dev\cvs\simgrid\include;C:\dev\cvs\simgrid\src\include;C:\dev\cvs\simgrid\src;C:\dev\cvs\simgrid\src\gras;C:\dev\cvs\simgrid\inc"/>
-    <LIBPATH value="..\..\src\gras;..\..\src\gras\Virtu;..\..\src\xbt;..\..\src\surf;..\..\..\tools\gras;$(BCB)\lib;$(BCB)\lib\obj"/>
-    <WARNINGS value="-w-rvl -w-rch -w-pia -w-pch -w-par -w-csu -w-ccc -w-aus"/>
-    <OTHERFILES value=""/>
-  </MACROS>
-  <OPTIONS>
-    <IDLCFLAGS value="-I..\..\src\gras -I..\..\src\gras\Virtu -I..\..\src\xbt -I..\..\src\surf 
-      -I..\..\..\tools\gras -I$(BCB)\include -I$(BCB)\include\vcl 
-      -IC:\dev\cvs\simgrid\include -IC:\dev\cvs\simgrid\src\include 
-      -IC:\dev\cvs\simgrid\src -IC:\dev\cvs\simgrid\src\gras 
-      -IC:\dev\cvs\simgrid\inc -src_suffix cpp -D_DEBUG -boa"/>
-    <CFLAG1 value="-Od -H=c:\PROGRA~1\borland\CBUILD~1\lib\vcl60.csm -Hh=100 -Hc -Vx -Ve -Vmp 
-      -X- -r- -ps -a1 -b- -k -y -v -vi- -tWC -tWM- -c"/>
-    <PFLAGS value="-$Y+ -$W -$O- -$A8 -v -JPHNE -M"/>
-    <RFLAGS value=""/>
-    <AFLAGS value="/mx /w2 /zi"/>
-    <LFLAGS value="-D&quot;&quot; -c- -ap -Tpe -x -Gn -w -v"/>
-    <OTHERFILES value=""/>
-  </OPTIONS>
-  <LINKER>
-    <ALLOBJ value="c0x32.obj $(OBJFILES)"/>
-    <ALLRES value="$(RESFILES)"/>
-    <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32.lib"/>
-    <OTHERFILES value=""/>
-  </LINKER>
-  <FILELIST>
-      <FILE FILENAME="stub_generator.res" FORMNAME="" UNITNAME="stub_generator.res" CONTAINERID="ResTool" DESIGNCLASS="" LOCALCOMMAND=""/>
-      <FILE FILENAME="stub_generator.bpf" FORMNAME="" UNITNAME="stub_generator" CONTAINERID="BPF" DESIGNCLASS="" LOCALCOMMAND=""/>
-      <FILE FILENAME="stub_generator.c" FORMNAME="" UNITNAME="stub_generator" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
-      <FILE FILENAME="simgrid.lib" FORMNAME="" UNITNAME="simgrid.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
-      <FILE FILENAME="..\..\src\surf\surfxml_parse.c" FORMNAME="" UNITNAME="surfxml_parse" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
-      <FILE FILENAME="..\..\src\surf\trace_mgr.c" FORMNAME="" UNITNAME="trace_mgr" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
-      <FILE FILENAME="..\..\src\xbt\snprintf.c" FORMNAME="" UNITNAME="snprintf" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
-      <FILE FILENAME="..\..\src\surf\surf.c" FORMNAME="" UNITNAME="surf" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
-      <FILE FILENAME="..\..\src\surf\maxmin.c" FORMNAME="" UNITNAME="maxmin" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
-  </FILELIST>
-  <BUILDTOOLS>
-  </BUILDTOOLS>
-
-  <IDEOPTIONS>
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=0
-Locale=1036
-CodePage=1252
-
-[Version Info Keys]
-CompanyName=
-FileDescription=
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-
-[Excluded Packages]
-c:\program files\borland\cbuilder6\Bin\dclclxdb60.bpl=Composants BD CLX Borland
-C:\Program Files\Borland\CBuilder6\Bin\dclclxstd60.bpl=Composants Standard CLX Borland
-
-[HistoryLists\hlIncludePath]
-Count=16
-Item0=..\..\src\gras\Virtu;..\..\src\xbt;..\..\src\surf;..\..\..\tools\gras;$(BCB)\include;$(BCB)\include\vcl;C:\dev\cvs\simgrid\include;C:\dev\cvs\simgrid\src\include;C:\dev\cvs\simgrid\src;C:\dev\cvs\simgrid\src\gras;C:\dev\cvs\simgrid\inc
-Item1=..\..\src\gras\Virtu;..\..\src\xbt;..\..\src\surf;..\..\..\tools\gras;$(BCB)\include;$(BCB)\include\vcl;C:\dev\cvs\simgrid\include;C:\dev\cvs\simgrid\src\include;C:\dev\cvs\simgrid\src\;C:\dev\cvs\simgrid\src\xbt;C:\dev\cvs\simgrid\src\surf;C:\dev\cvs\simgrid\src\gras;C:\dev\cvs\simgrid\inc
-Item2=..\..\src\gras\Virtu;..\..\src\xbt;..\..\src\surf;..\..\..\tools\gras;$(BCB)\include;$(BCB)\include\vcl;C:\dev\cvs\simgrid\include;C:\dev\cvs\simgrid\src\include;..\..\src
-Item3=..\..\src\xbt;..\..\src\surf;..\..\..\tools\gras;$(BCB)\include;$(BCB)\include\vcl;C:\dev\cvs\simgrid\include;C:\dev\cvs\simgrid\src\include;..\..\src
-Item4=..\..\src\surf;..\..\..\tools\gras;$(BCB)\include;$(BCB)\include\vcl;C:\dev\cvs\simgrid\include;C:\dev\cvs\simgrid\src\include;..\..\src\
-Item5=..\..\src\surf;..\..\..\tools\gras;$(BCB)\include;$(BCB)\include\vcl;C:\dev\cvs\simgrid\include;C:\dev\cvs\simgrid\src\include
-Item6=..\..\..\tools\gras;$(BCB)\include;$(BCB)\include\vcl;C:\dev\cvs\simgrid\include;C:\dev\cvs\simgrid\src\include
-Item7=..\..\..\tools\gras;$(BCB)\include;$(BCB)\include\vcl;C:\dev\cvs\simgrid\include
-Item8=..\..\..\tools\gras;$(BCB)\include;$(BCB)\include\vcl
-Item9=..\..\..\tools\gras
-Item10=..\..\..\src\xbt\collection;C:\Program Files\Borland\CBuilder5;$(BCB)\include;$(BCB)\include\vcl;..\..\..\include
-Item11=C:\Program Files\Borland\CBuilder5;$(BCB)\include;$(BCB)\include\vcl;..\..\..\include
-Item12=..\..\..\src\xbt\collection;C:\Program Files\Borland\CBuilder5\;$(BCB)\include;$(BCB)\include\vcl;..\..\..\include
-Item13=C:\Program Files\Borland\CBuilder5\;$(BCB)\include;$(BCB)\include\vcl;C:\com\inria\projects\sg\include
-Item14=..\..\..\src\xbt\collection;C:\Program Files\Borland\CBuilder5\;$(BCB)\include;$(BCB)\include\vcl
-Item15=C:\Program Files\Borland\CBuilder5\;$(BCB)\include;$(BCB)\include\vcl
-
-[HistoryLists\hlLibraryPath]
-Count=9
-Item0=..\..\src\gras\Virtu;..\..\src\xbt;..\..\src\surf;..\..\..\tools\gras;$(BCB)\lib;$(BCB)\lib\obj
-Item1=..\..\src\xbt;..\..\src\surf;..\..\..\tools\gras;$(BCB)\lib;$(BCB)\lib\obj
-Item2=..\..\src\surf;..\..\..\tools\gras;$(BCB)\lib;$(BCB)\lib\obj
-Item3=..\..\..\tools\gras;$(BCB)\lib;$(BCB)\lib\obj
-Item4=..\..\..\tools\gras
-Item5=..\..\..\src\xbt\collection;C:\Program Files\Borland\CBuilder5;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
-Item6=C:\Program Files\Borland\CBuilder5;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
-Item7=..\..\..\src\xbt\collection;C:\Program Files\Borland\CBuilder5\;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
-Item8=C:\Program Files\Borland\CBuilder5\;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
-
-[HistoryLists\hlDebugSourcePath]
-Count=1
-Item0=$(BCB)\source\vcl
-
-[HistoryLists\hlConditionals]
-Count=1
-Item0=_DEBUG
-
-[HistoryLists\hlIntOutputDir]
-Count=2
-Item0=..\..\..\lib
-Item1=C:\com\inria\projects\sg\lib
-
-[HistoryLists\hlFinalOutputDir]
-Count=2
-Item0=..\..\..\bin\test\
-Item1=C:\com\inria\projects\sg\bin\test
-
-[Debugging]
-DebugSourceDirs=$(BCB)\source\vcl
-
-[Parameters]
-RunParams=essai C:\dev\cvs\simgrid\examples\bandwidth\bandwidth_deployment.xml
-Launcher=
-UseLauncher=0
-DebugCWD=
-HostApplication=
-RemoteHost=
-RemotePath=
-RemoteLauncher=
-RemoteCWD=
-RemoteDebug=0
-
-[Compiler]
-ShowInfoMsgs=0
-LinkDebugVcl=0
-LinkCGLIB=0
-
-[CORBA]
-AddServerUnit=1
-AddClientUnit=1
-PrecompiledHeaders=1
-
-[Language]
-ActiveLang=
-ProjectLang=
-RootDir=
-  </IDEOPTIONS>
-</PROJECT>
\ No newline at end of file
diff --git a/tools/gras/stub_generator.c b/tools/gras/stub_generator.c
deleted file mode 100644 (file)
index bdd5613..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-/* gras_stub_generator - creates the main() to use a GRAS program           */
-
-/* Copyright (c) 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-/* specific to Borland Compiler */
-#ifdef __BORLANDDC__
-#pragma hdrstop
-#endif
-
-#include <stdio.h>
-#include "xbt/sysdep.h"
-#include "xbt/function_types.h"
-#include "xbt/log.h"
-#include "surf/surfxml_parse.h"
-#include "surf/surf.h"
-#include "portable.h"           /* Needed for the time of the SIMIX convertion */
-
-#include "gras_stub_generator.h"
-#include <stdarg.h>
-extern char *xbt_binary_name;
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(stubgen, gras, "Stub generator");
-
-#ifdef _XBT_WIN32
-#include <windows.h>
-#endif
-
-/* specific to Borland Compiler */
-#ifdef __BORLANDDC__
-#pragma argsused
-#endif
-
-
-/**********************************************/
-/********* Parse XML deployment file **********/
-/**********************************************/
-xbt_dict_t process_function_set = NULL;
-xbt_dynar_t process_list = NULL;
-xbt_dict_t machine_set = NULL;
-char *warning = NULL;
-
-void s_process_free(void *process)
-{
-  s_process_t *p = (s_process_t *) process;
-  free(p->host);
-}
-
-static s_process_t process;
-
-static void parse_process(sg_platf_process_cbarg_t process_arg)
-{
-  xbt_dict_set(process_function_set, process_arg->function, NULL, NULL);
-  xbt_dict_set(machine_set, process_arg->host, NULL, NULL);
-  process.argc = process_arg->argc;
-  process.argv = (char**)(process_arg->argv);
-  process.host = strdup(process_arg->host);
-  /*XBT_VERB("Function: %s",A_surfxml_process_function); */
-  xbt_dynar_push(process_list, &process);
-}
-
-int main(int argc, char *argv[])
-{
-  char *project_name = NULL;
-  char *deployment_file = NULL;
-  int i;
-
-  XBT_LOG_CONNECT(stubgen);
-
-  xbt_binary_name=xbt_strdup(argv[0]);
-
-  surf_init(&argc, argv);
-  process_function_set = xbt_dict_new_homogeneous(NULL);
-  process_list = xbt_dynar_new(sizeof(s_process_t), s_process_free);
-  machine_set = xbt_dict_new_homogeneous(NULL);
-
-  for (i = 1; i < argc; i++) {
-    int need_removal = 0;
-    if (!strncmp("--extra-process=", argv[i], strlen("--extra-process="))) {
-      xbt_dict_set(process_function_set,
-                   argv[i] + strlen("--extra-process="), NULL, NULL);
-      need_removal = 1;
-    }
-
-
-    if (need_removal) {         /* remove the handled argument from argv */
-      int j;
-      for (j = i + 1; j < argc; j++) {
-        argv[j - 1] = argv[j];
-      }
-      argv[j - 1] = NULL;
-      argc--;
-      i--;                      /* compensate effect of next loop incrementation */
-    }
-  }
-
-  xbt_assert((argc >= 3),
-              "Usage: %s project_name deployment_file [deployment_file...]\n",
-              argv[0]);
-
-  project_name = argv[1];
-
-  surf_parse_reset_callbacks();
-  sg_platf_process_add_cb(parse_process);
-
-  for (i = 2; i < argc; i++) {
-    deployment_file = argv[i];
-    surf_parse_open(deployment_file);
-    if (surf_parse())
-      xbt_die("Parse error in %s", deployment_file);
-
-    surf_parse_close();
-  }
-
-
-  warning = xbt_new(char, strlen(WARN) + strlen(deployment_file) + 10);
-  sprintf(warning, WARN, deployment_file);
-
-  /*if(XBT_LOG_ISENABLED(stubgen, xbt_log_priority_debug)) {
-     xbt_dict_cursor_t cursor=NULL;
-     char *key = NULL;
-     void *data = NULL;
-
-     for (cursor=NULL, xbt_dict_cursor_first((process_function_set),&(cursor)) ;
-     xbt_dict_cursor_get_or_free(&(cursor),&(key),(void**)(&data));
-     xbt_dict_cursor_step(cursor) ) {
-     XBT_DEBUG("Function %s", key);
-     }
-
-     xbt_dict_dump(process_function_set,print);
-     } */
-
-  generate_sim(project_name);
-  generate_rl(project_name);
-  generate_makefile_local(project_name, deployment_file);
-#ifdef __BORLANDC__
-  generate_borland_simulation_project(project_name);
-  generate_borland_real_life_project(project_name);
-  generate_simulation_dsp_file(project_name);
-  generate_real_live_dsp_file(project_name);
-
-  xbt_free(__gras_path);
-#endif
-
-  free(warning);
-
-
-  xbt_free(process.argv);
-
-  xbt_dict_free(&process_function_set);
-  xbt_dynar_free(&process_list);
-  xbt_dict_free(&machine_set);
-  surf_exit();
-
-  return 0;
-}
diff --git a/tools/gras/stub_generator4borland.mak b/tools/gras/stub_generator4borland.mak
deleted file mode 100644 (file)
index 1422f90..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-# ---------------------------------------------------------------------------
-!if !$d(BCB)
-BCB = $(MAKEDIR)\..
-!endif
-
-# ---------------------------------------------------------------------------
-# IDE SECTION
-# ---------------------------------------------------------------------------
-# The following section of the project makefile is managed by the BCB IDE.
-# It is recommended to use the IDE to change any of the values in this
-# section.
-# ---------------------------------------------------------------------------
-
-VERSION = BCB.06.00
-# ---------------------------------------------------------------------------
-PROJECT = _stub_generator.exe
-OBJFILES = _stub_generator.obj ..\..\src\surf\surfxml_parse.obj \
-    ..\..\src\surf\trace_mgr.obj ..\..\src\xbt\snprintf.obj \
-    ..\..\src\surf\surf.obj ..\..\src\surf\maxmin.obj
-RESFILES = _stub_generator.res
-MAINSOURCE = _stub_generator.bpf
-RESDEPEN = $(RESFILES)
-LIBFILES = simgrid.lib
-IDLFILES = 
-IDLGENFILES = 
-LIBRARIES = rtl.lib vcl.lib
-PACKAGES = vcl.bpi vclx.bpi bcbsmp.bpi dbrtl.bpi vcldb.bpi adortl.bpi ibsmp.bpi \
-    bdertl.bpi vcldbx.bpi qrpt.bpi teeui.bpi teedb.bpi tee.bpi dss.bpi \
-    teeqr.bpi ibxpress.bpi dsnap.bpi vclie.bpi inetdb.bpi inet.bpi nmfast.bpi \
-    webdsnap.bpi bcbie.bpi dclocx.bpi bcb2kaxserver.bpi PackageLableDate.bpi
-SPARELIBS = vcl.lib rtl.lib
-DEFFILE = 
-OTHERFILES = 
-# ---------------------------------------------------------------------------
-DEBUGLIBPATH = $(BCB)\lib\debug
-RELEASELIBPATH = $(BCB)\lib\release
-USERDEFINES = _DEBUG
-SYSDEFINES = NO_STRICT;_NO_VCL
-INCLUDEPATH = ..\..\src\gras;..\..\src\gras\Virtu;..\..\src\xbt;..\..\src\surf;..\..\..\tools\gras;$(BCB)\include;$(BCB)\include\vcl;C:\dev\cvs\simgrid\include;C:\dev\cvs\simgrid\src\include;C:\dev\cvs\simgrid\src;C:\dev\cvs\simgrid\src\gras;C:\dev\cvs\simgrid\inc
-LIBPATH = ..\..\src\gras;..\..\src\gras\Virtu;..\..\src\xbt;..\..\src\surf;..\..\..\tools\gras;$(BCB)\lib;$(BCB)\lib\obj
-WARNINGS= -w-rvl -w-rch -w-pia -w-pch -w-par -w-csu -w-ccc -w-aus
-PATHCPP = .;..\..\src\surf;..\..\src\surf;..\..\src\xbt;..\..\src\surf;..\..\src\surf
-PATHASM = .;
-PATHPAS = .;
-PATHRC = .;
-PATHOBJ = .;$(LIBPATH)
-# ---------------------------------------------------------------------------
-CFLAG1 = -Od -H=c:\PROGRA~1\borland\CBUILD~1\lib\vcl60.csm -Hh=100 -Hc -Vx -Ve -Vmp \
-    -X- -r- -ps -a1 -b- -k -y -v -vi- -tWC -tWM- -c
-IDLCFLAGS = -I..\..\src\gras -I..\..\src\gras\Virtu -I..\..\src\xbt -I..\..\src\surf \
-    -I..\..\..\tools\gras -I$(BCB)\include -I$(BCB)\include\vcl \
-    -IC:\dev\cvs\simgrid\include -IC:\dev\cvs\simgrid\src\include \
-    -IC:\dev\cvs\simgrid\src -IC:\dev\cvs\simgrid\src\gras \
-    -IC:\dev\cvs\simgrid\inc -src_suffix cpp -D_DEBUG -boa
-PFLAGS = -$Y+ -$W -$O- -$A8 -v -JPHNE -M
-RFLAGS = 
-AFLAGS = /mx /w2 /zi
-LFLAGS = -D"" -c- -ap -Tpe -x -Gn -w -v
-# ---------------------------------------------------------------------------
-ALLOBJ = c0x32.obj $(OBJFILES)
-ALLRES = $(RESFILES)
-ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cw32.lib
-# ---------------------------------------------------------------------------
-!ifdef IDEOPTIONS
-
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=0
-
-[Version Info Keys]
-CompanyName=
-FileDescription=
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-
-[Debugging]
-DebugSourceDirs=$(BCB)\source\vcl
-
-!endif
-
-
-
-
-
-# ---------------------------------------------------------------------------
-# MAKE SECTION
-# ---------------------------------------------------------------------------
-# This section of the project file is not used by the BCB IDE.  It is for
-# the benefit of building from the command-line using the MAKE utility.
-# ---------------------------------------------------------------------------
-
-.autodepend
-# ---------------------------------------------------------------------------
-!if "$(USERDEFINES)" != ""
-AUSERDEFINES = -d$(USERDEFINES:;= -d)
-!else
-AUSERDEFINES =
-!endif
-
-!if !$d(BCC32)
-BCC32 = bcc32
-!endif
-
-!if !$d(CPP32)
-CPP32 = cpp32
-!endif
-
-!if !$d(DCC32)
-DCC32 = dcc32
-!endif
-
-!if !$d(TASM32)
-TASM32 = tasm32
-!endif
-
-!if !$d(LINKER)
-LINKER = ilink32
-!endif
-
-!if !$d(BRCC32)
-BRCC32 = brcc32
-!endif
-
-
-# ---------------------------------------------------------------------------
-!if $d(PATHCPP)
-.PATH.CPP = $(PATHCPP)
-.PATH.C   = $(PATHCPP)
-!endif
-
-!if $d(PATHPAS)
-.PATH.PAS = $(PATHPAS)
-!endif
-
-!if $d(PATHASM)
-.PATH.ASM = $(PATHASM)
-!endif
-
-!if $d(PATHRC)
-.PATH.RC  = $(PATHRC)
-!endif
-
-!if $d(PATHOBJ)
-.PATH.OBJ  = $(PATHOBJ)
-!endif
-# ---------------------------------------------------------------------------
-$(PROJECT): $(OTHERFILES) $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)
-    $(BCB)\BIN\$(LINKER) @&&!
-    $(LFLAGS) -L$(LIBPATH) +
-    $(ALLOBJ), +
-    $(PROJECT),, +
-    $(ALLLIB), +
-    $(DEFFILE), +
-    $(ALLRES)
-!
-# ---------------------------------------------------------------------------
-.pas.hpp:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
-
-.pas.obj:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
-
-.cpp.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
-
-.c.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
-
-.c.i:
-    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
-
-.cpp.i:
-    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
-
-.asm.obj:
-    $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@
-
-.rc.res:
-    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $<
-
-
-
-# ---------------------------------------------------------------------------
-
-
-
-
diff --git a/tools/gras/unix_stub_generator.c b/tools/gras/unix_stub_generator.c
deleted file mode 100644 (file)
index 4642ef3..0000000
+++ /dev/null
@@ -1,456 +0,0 @@
-/* gras_stub_generator - creates the main() to use a GRAS program           */
-
-/* Copyright (c) 2003-2007 Martin Quinson, Arnaud Legrand, Malek Cherier.   */
-/* All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-/* specific to Borland Compiler */
-#ifdef __BORLANDDC__
-#pragma hdrstop
-#endif
-
-#include <stdio.h>
-#include "xbt/sysdep.h"
-#include "xbt/function_types.h"
-#include "xbt/log.h"
-#include "surf/surfxml_parse.h"
-#include "surf/surf.h"
-#include "portable.h"           /* Needed for the time of the SIMIX convertion */
-#include "gras_stub_generator.h"
-
-#include <stdarg.h>
-
-#ifdef __BORLANDC__
-/* stupid stubs so that it compiles on windows */
-void generate_sim(char *project)
-{
-}
-
-void generate_rl(char *project)
-{
-}
-
-void generate_makefile_local(char *project, char *deployment)
-{
-}
-#else
-/* real implementation */
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(stubgen);
-
-
-#define WARN "/***********\n * DO NOT EDIT! THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM %s BY gras_stub_generator\n ***********/\n"
-#define SIM_SOURCENAME  "_%s_simulator.c"
-#define SIM_OBJNAME  "_%s_simulator.o"
-#define SIM_BINARYNAME  "%s_simulator"
-#define SIM_SOURCENAME_LDADD  "%s_simulator_LDADD"
-#define SIM_SOURCENAME_SOURCES  "%s_simulator_SOURCES"
-#define RL_SOURCENAME  "_%s_%s.c"
-#define RL_OBJNAME  "_%s_%s.o"
-#define RL_BINARYNAME  "%s_%s"
-#define RL_SOURCENAME_LDADD  "%s_%s_LDADD"
-#define RL_SOURCENAME_SOURCES  "%s_%s_SOURCES"
-#define MAKEFILE_FILENAME_AM  "%s.Makefile.am"
-#define MAKEFILE_FILENAME_LOCAL  "%s.mk"
-#define MAKEFILE_FILENAME_REMOTE  "%s.Makefile.remote"
-#define DEPLOYMENT  "%s.deploy.sh"
-
-/**********************************************/
-/**** Generate the file for the simulator *****/
-/**********************************************/
-
-const char *SIM_PREEMBULE =
-    "/* specific to Borland Compiler */\n"
-    "#ifdef __BORLANDC__\n"
-    "#pragma hdrstop\n"
-    "#endif\n\n"
-    "#include <stdlib.h>\n"
-    "#include <stdio.h>\n"
-    "#include \"msg/msg.h\"\n"
-    "#include <gras.h>\n" "\n" "char *gras_log=NULL;\n";
-
-
-#define SIM_LAUNCH_FUNC  \
-"int launch_%s(int argc, char **argv) {\n" \
-"  char **myargv=argv;\n" \
-"  int myargc=argc;\n" \
-"  int i;\n" \
-"  int retcode;\n"\
-"    \n"\
-"  if (gras_log) {\n"\
-"    myargv=malloc((argc+1) * sizeof(char**));\n" \
-"    for (i=0; i<argc; i++)\n" \
-"      myargv[i] = argv[i];\n" \
-"    myargv[myargc++] = gras_log;\n" \
-"  }\n" \
-"  retcode = %s(myargc,myargv);\n" \
-"  if (myargv != argv)\n" \
-"    free(myargv);\n" \
-"  return retcode;\n" \
-"}\n"
-
-const char *SIM_MAIN_POSTEMBULE = "\n"
-    "\n"
-    "  gras_launch_application(argv[2]);\n"
-    "\n"
-    "  /*  Run the simulation */\n"
-    "  gras_main();\n"
-    "\n"
-    "  /* cleanup the place */\n"
-    "  gras_clean();\n"
-    "  if (gras_log)\n" "    free(gras_log);\n" "  return 0;\n" "}\n";
-
-
-
-
-void generate_sim(char *project)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *key = NULL;
-  void *data = NULL;
-  char *filename = NULL;
-  FILE *FICOUT = NULL;
-
-  /* Output file: <projet>_simulator.c */
-  filename = xbt_new(char, strlen(project) + strlen(SIM_SOURCENAME));
-  sprintf(filename, SIM_SOURCENAME, project);
-
-  FICOUT = fopen(filename, "w");
-
-  xbt_assert(FICOUT, "Unable to open %s for writing", filename);
-
-  fprintf(FICOUT, "%s\n", warning);
-  fprintf(FICOUT, "%s", SIM_PREEMBULE);
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, "int %s(int argc,char *argv[]);\n", key);
-  }
-
-  fprintf(FICOUT, "\n");
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, "int launch_%s(int argc,char *argv[]);\n", key);
-  }
-
-  fprintf(FICOUT, "\n%s\n", warning);
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, SIM_LAUNCH_FUNC, key, key);
-  }
-  fprintf(FICOUT, "\n%s\n", warning);
-
-  fprintf(FICOUT, "%s", "/* specific to Borland Compiler */\n"
-          "#ifdef __BORLANDDC__\n" "#pragma argsused\n" "#endif\n\n");
-
-  fprintf(FICOUT, "%s", "int main (int argc,char *argv[]) {\n"
-          "\n"
-          "  /*  Simulation setup */\n"
-          "  gras_global_init(&argc,argv);\n"
-          "  if (argc != 3) {\n"
-          "    fprintf(stderr, \"Usage: %s platform.xml deployment.xml [--log=...]\\n\",argv[0]);\n"
-          "    exit(1);\n" "  }\n" "\n");
-  fprintf(FICOUT,
-          "  gras_create_environment(argv[1]);\n"
-          "\n" "  /*  Application deployment */\n");
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, "  gras_function_register(\"%s\", launch_%s);\n", key,
-            key);
-  }
-  fprintf(FICOUT, "%s", SIM_MAIN_POSTEMBULE);
-  fclose(FICOUT);
-  free(filename);
-}
-
-/**********************************************/
-/**** Generate the file for the real life *****/
-/**********************************************/
-void generate_rl(char *project)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *key = NULL;
-  void *data = NULL;
-  char *filename = NULL;
-  FILE *FICOUT = NULL;
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    filename =
-        xbt_new(char,
-                strlen(project) + strlen(RL_SOURCENAME) + strlen(key));
-
-    sprintf(filename, RL_SOURCENAME, project, key);
-
-    FICOUT = fopen(filename, "w");
-    xbt_assert(FICOUT, "Unable to open %s for writing", filename);
-
-    fprintf(FICOUT, "\n%s\n", warning);
-    fprintf(FICOUT, "/* specific to Borland Compiler */\n"
-            "#ifdef __BORLANDC__\n"
-            "#pragma hdrstop\n"
-            "#endif\n\n"
-            "#include <stdio.h>\n"
-            "#include <signal.h>\n"
-            "#include <gras.h>\n"
-            "\n"
-            "XBT_PUBLIC_DATA(const char *) _gras_procname;\n"
-            "/* user code */\n"
-            "int %s(int argc, char *argv[]);\n"
-            "\n"
-            "/* specific to Borland Compiler */\n"
-            "#ifdef __BORLANDC__\n"
-            "#pragma argsused\n"
-            "#endif\n\n"
-            "int main(int argc, char *argv[]){\n"
-            "  int errcode;\n"
-            "\n"
-            "  _gras_procname = \"%s\";\n"
-            "  errcode=%s(argc,argv);\n"
-            " \n" "  return errcode;\n" "}\n", key, key, key);
-    fprintf(FICOUT, "\n%s\n", warning);
-    fclose(FICOUT);
-    free(filename);
-  }
-}
-
-void generate_makefile_am(char *project, char *deployment)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *key = NULL;
-  void *data = NULL;
-  char *filename = NULL;
-  FILE *FICOUT = NULL;
-
-  filename = xbt_new(char, strlen(project) + strlen(MAKEFILE_FILENAME_AM));
-  sprintf(filename, MAKEFILE_FILENAME_AM, project);
-
-  FICOUT = fopen(filename, "w");
-  xbt_assert(FICOUT, "Unable to open %s for writing", filename);
-
-  fprintf(FICOUT, "# AUTOMAKE variable definition\n");
-  fprintf(FICOUT, "INCLUDES= @CFLAGS_SimGrid@\n\n");
-  fprintf(FICOUT, "PROGRAMS=");
-  fprintf(FICOUT, SIM_BINARYNAME, project);
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, " ");
-    fprintf(FICOUT, RL_BINARYNAME, project, key);
-  }
-
-  fprintf(FICOUT, "\n\n");
-  fprintf(FICOUT, SIM_SOURCENAME_SOURCES, project);
-  fprintf(FICOUT, "=\t");
-  fprintf(FICOUT, SIM_SOURCENAME, project);
-  fprintf(FICOUT, " %s.c\n", project);
-  fprintf(FICOUT, SIM_SOURCENAME_LDADD, project);
-  fprintf(FICOUT, "=\tpath/to/libsimgrid.a\n\n");
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, RL_SOURCENAME_SOURCES, project, key);
-    fprintf(FICOUT, "=\t");
-    fprintf(FICOUT, RL_SOURCENAME, project, key);
-    fprintf(FICOUT, " %s.c\n", project);
-    fprintf(FICOUT, RL_SOURCENAME_LDADD, project, key);
-    fprintf(FICOUT, "=\tpath/to/libgras.a\n\n");
-  }
-
-  fprintf(FICOUT,
-          "\n# cleanup temps (allowing the user to add extra clean files)\n");
-  fprintf(FICOUT, "CLEANFILES?= \n");
-  fprintf(FICOUT, "CLEANFILES+= ");
-  fprintf(FICOUT, SIM_SOURCENAME, project);
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, " ");
-    fprintf(FICOUT, RL_SOURCENAME, project, key);
-  }
-  fprintf(FICOUT, "\n");
-
-  fprintf(FICOUT, "\n# generate temps\n");
-  fprintf(FICOUT,
-          "\n# A rule to generate the source file each time the deployment file changes\n");
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, RL_SOURCENAME, project, key);
-    fprintf(FICOUT, " ");
-  }
-  fprintf(FICOUT, SIM_SOURCENAME, project);
-  fprintf(FICOUT, ": %s\n", deployment);
-  fprintf(FICOUT, "\tgras_stub_generator %s %s >/dev/null\n", project,
-          deployment);
-  fclose(FICOUT);
-}
-
-void generate_makefile_local(char *project, char *deployment)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *key = NULL;
-  void *data = NULL;
-  char *filename = NULL;
-  FILE *FICOUT = NULL;
-
-  filename =
-      xbt_new(char, strlen(project) + strlen(MAKEFILE_FILENAME_LOCAL));
-  sprintf(filename, MAKEFILE_FILENAME_LOCAL, project);
-
-  FICOUT = fopen(filename, "w");
-  xbt_assert(FICOUT, "Unable to open %s for writing", filename);
-  free(filename);
-
-  fprintf(FICOUT,
-          "\n"
-          "####\n"
-          "#### THIS FILE WAS GENERATED, DO NOT EDIT BEFORE RENAMING IT\n"
-          "####\n\n\n");
-
-  fprintf(FICOUT, "## Variable declarations\n"
-          "PROJECT_NAME=%s\n" "DISTDIR=gras-$(PROJECT_NAME)\n\n", project);
-
-  fprintf(FICOUT,
-          "# Set the GRAS_ROOT environment variable to the path under which you installed SimGrid\n"
-          "# Compilation will fail if you don't do so\n"
-          "GRAS_ROOT?= $(shell if [ -e /usr/local/lib/libgras.so ] ; then echo /usr/local ; else echo \"\\\"<<<< GRAS_ROOT undefined !!! >>>>\\\"\"; fi)\n\n"
-          "# You can fiddle the following to make it fit your taste\n"
-          "INCLUDES = -I$(GRAS_ROOT)/include\n"
-          "CFLAGS ?= -O3 -w -g -Wall\n"
-          "LIBS_SIM = -lm  -L$(GRAS_ROOT)/lib/ -lsimgrid\n"
-          "LIBS_RL = -lm  -L$(GRAS_ROOT)/lib/ -lgras\n" "LIBS = \n" "\n");
-
-  fprintf(FICOUT, "PRECIOUS_C_FILES ?= %s.c\n", project);
-
-  fprintf(FICOUT, "GENERATED_C_FILES = ");
-  fprintf(FICOUT, SIM_SOURCENAME " ", project);
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, RL_SOURCENAME " ", project, key);
-  }
-  fprintf(FICOUT, "\n");
-
-  fprintf(FICOUT,
-          "OBJ_FILES = $(patsubst %%.c,%%.o,$(PRECIOUS_C_FILES))\n");
-
-  fprintf(FICOUT, "BIN_FILES = ");
-
-  fprintf(FICOUT, SIM_BINARYNAME " ", project);
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, RL_BINARYNAME " ", project, key);
-  }
-  fprintf(FICOUT, "\n");
-
-  fprintf(FICOUT,
-          "\n"
-          "## By default, build all the binaries\n"
-          "all: $(BIN_FILES)\n" "\n");
-
-  fprintf(FICOUT,
-          "\n## generate temps: regenerate the source file each time the deployment file changes\n");
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, RL_SOURCENAME, project, key);
-    fprintf(FICOUT, " ");
-  }
-  fprintf(FICOUT, SIM_SOURCENAME, project);
-  fprintf(FICOUT, ": %s\n", deployment);
-  fprintf(FICOUT, "\tgras_stub_generator %s %s >/dev/null\n", project,
-          deployment);
-
-  fprintf(FICOUT, "\n## Generate the binaries\n");
-  fprintf(FICOUT, SIM_BINARYNAME ": " SIM_OBJNAME " $(OBJ_FILES)\n",
-          project, project);
-  fprintf(FICOUT,
-          "\t$(CC) $(INCLUDES) $(DEFS) $(CFLAGS) $^ $(LIBS_SIM) $(LIBS) $(LDADD) -o $@ \n");
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, RL_BINARYNAME " : " RL_OBJNAME " $(OBJ_FILES)\n",
-            project, key, project, key);
-    fprintf(FICOUT,
-            "\t$(CC) $(INCLUDES) $(DEFS) $(CFLAGS) $^ $(LIBS_RL) $(LIBS) $(LDADD) -o $@ \n");
-  }
-  fprintf(FICOUT,
-          "\n"
-          "%%: %%.o\n"
-          "\t$(CC) $(INCLUDES) $(DEFS) $(CFLAGS) $^ $(LIBS) $(LDADD) -o $@ \n"
-          "\n"
-          "%%.o: %%.c\n"
-          "\t$(CC) $(INCLUDES) $(DEFS) $(CFLAGS) -c -o $@ $<\n" "\n");
-
-  fprintf(FICOUT,
-          "## Rules for tarballs and cleaning\n"
-          "DIST_FILES= $(EXTRA_DIST) $(GENERATED_C_FILES) $(PRECIOUS_C_FILES) "
-          MAKEFILE_FILENAME_LOCAL " " /*MAKEFILE_FILENAME_REMOTE */ "\n"
-          "distdir: $(DIST_FILES)\n" "\trm -rf $(DISTDIR)\n"
-          "\tmkdir -p $(DISTDIR)\n" "\tcp $^ $(DISTDIR)\n" "\n"
-          "dist: clean distdir\n"
-          "\ttar c $(DISTDIR) | gzip -c9 > $(DISTDIR).tar.gz\n" "\n",
-          project /*, project */ );
-
-  fprintf(FICOUT,
-          "clean:\n"
-          "\trm -f $(CLEANFILES) $(BIN_FILES) $(OBJ_FILES) *~ %s.o "
-          SIM_OBJNAME, project, project);
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    fprintf(FICOUT, " " RL_OBJNAME, project, key);
-  }
-  fprintf(FICOUT,
-          "\n"
-          "\trm -rf $(DISTDIR)\n"
-          "\n" ".SUFFIXES:\n" ".PHONY : clean\n" "\n");
-  /* 
-     fprintf(FICOUT, "############ REMOTE COMPILING #########\n");
-     fprintf(FICOUT,
-     "MACHINES ?= ");
-     xbt_dict_foreach(machine_set,cursor,key,data) {
-     fprintf(FICOUT, "%s ",key);
-     }
-     fprintf(FICOUT,"\n");
-
-     fprintf(FICOUT,
-     "INSTALL_PATH ?='$$HOME/tmp/src' ### Has to be an absolute path !!! \n"
-     "GRAS_ROOT ?='$(INSTALL_PATH)' ### Has to be an absolute path !!! \n"
-     "SRCDIR ?= ./\n"
-     "SIMGRID_URL ?=http://gcl.ucsd.edu/simgrid/dl/\n"
-     "SIMGRID_VERSION ?=2.92\n"
-     "GRAS_PROJECT ?= %s\n"
-     "GRAS_PROJECT_URL ?= http://www-id.imag.fr/Laboratoire/Membres/Legrand_Arnaud/gras_test/\n"
-     "\n"
-     "remote:\n"
-     "\t@echo;echo \"----[ Compile the package on remote hosts ]----\"\n"
-     "\t@test -e $(SRCDIR)/buildlogs/ || mkdir -p $(SRCDIR)/buildlogs/\n"
-     "\t for site in $(MACHINES) ; do \\\n"
-     "\t   machine=`echo $$site |sed 's/^\\([^%%]*\\)%%.*$$/\\1/'`;\\\n"
-     "\t   machine2=`echo $$site |sed 's/^\\([^%%]*\\)%%\\(.*\\)$$/\\2/'`;\\\n"
-     "\t   cmd_mkdir=\"\\\"sh -c 'env INSTALL_PATH=$(INSTALL_PATH) GRAS_ROOT=$(GRAS_ROOT) \\\n"
-     "\t                        SIMGRID_URL=$(SIMGRID_URL) SIMGRID_VERSION=$(SIMGRID_VERSION) GRAS_PROJECT=$(GRAS_PROJECT) \\\n"
-     "\t                        GRAS_PROJECT_URL=$(GRAS_PROJECT_URL)  mkdir -p $(INSTALL_PATH) 2>&1'\\\"\";\\\n"
-     "\t   cmd_make=\"\\\"sh -c 'env INSTALL_PATH=$(INSTALL_PATH) GRAS_ROOT=$(GRAS_ROOT) \\\n"
-     "\t                        SIMGRID_URL=$(SIMGRID_URL) SIMGRID_VERSION=$(SIMGRID_VERSION) GRAS_PROJECT=$(GRAS_PROJECT) \\\n"
-     "\t                        GRAS_PROJECT_URL=$(GRAS_PROJECT_URL)  make -C $(INSTALL_PATH) -f "MAKEFILE_FILENAME_REMOTE" $(ACTION) 2>&1'\\\"\";\\\n"
-     "\t   if echo $$site | grep  '%%' >/dev/null ; then \\\n"
-     "\t     echo \"----[ Compile on $$machine2 (behind $$machine) ]----\";\\\n"
-     "\t   else \\\n"
-     "\t     machine=$$site;\\\n"
-     "\t     echo \"----[ Compile on $$machine ]----\";\\\n"
-     "\t   fi;\\\n"
-     "\t   if echo $$site | grep  '%%' >/dev/null ; then \\\n"
-     "\t     if ssh $$machine \"ssh -A $$machine2 $$cmd_mkdir\" 2>&1 > $(SRCDIR)/buildlogs/$$site.log;\\\n"
-     "\t     then true; else failed=1;echo \"Failed (check $(SRCDIR)/buildlogs/$$site.log)\"; fi;\\\n"
-     "\t   else \\\n"
-     "\t     if ssh $$machine \"eval $$cmd_mkdir\" 2>&1 > $(SRCDIR)/buildlogs/$$site.log ;\\\n"
-     "\t     then true; else failed=1;echo \"Failed (check $(SRCDIR)/buildlogs/$$site.log)\"; fi; \\\n"
-     "\t   fi;\\\n"
-     "\t   echo \"-- Copy the data over\"; \\\n"
-     "\t   scp "MAKEFILE_FILENAME_REMOTE" $$site:$(INSTALL_PATH) ;\\\n"
-     "\t   echo \"-- Compiling... (the output gets into $(SRCDIR)/buildlogs/$$site.log)\"; \\\n"
-     "\t   if echo $$site | grep  '%%' >/dev/null ; then \\\n"
-     "\t     if ssh $$machine \"ssh -A $$machine2 $$cmd_make\" 2>&1 >> $(SRCDIR)/buildlogs/$$site.log;\\\n"
-     "\t     then echo \"Sucessful\"; else failed=1;echo \"Failed (check $(SRCDIR)/buildlogs/$$site.log)\"; fi;echo; \\\n"
-     "\t   else \\\n"
-     "\t     if ssh $$machine \"eval $$cmd_make\" 2>&1 >> $(SRCDIR)/buildlogs/$$site.log ;\\\n"
-     "\t     then echo \"Sucessful\"; else failed=1;echo \"Failed (check $(SRCDIR)/buildlogs/$$site.log)\"; fi;echo; \\\n"
-     "\t   fi;\\\n"
-     "\t done;\n",project,project,project);
-   */
-  fclose(FICOUT);
-}
-
-static void print(void *p)
-{
-  printf("%p", p);
-}
-#endif
diff --git a/tools/gras/windows_stub_generator.c b/tools/gras/windows_stub_generator.c
deleted file mode 100644 (file)
index ddb4299..0000000
+++ /dev/null
@@ -1,1060 +0,0 @@
-/* gras_stub_generator - creates the main() to use a GRAS program           */
-
-/* Copyright (c) 2003-2007 Martin Quinson, Arnaud Legrand, Malek Cherier.   */
-/* All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "gras_stub_generator.h"
-
-/* specific to Borland Compiler */
-#ifdef __BORLANDDC__
-#pragma hdrstop
-#endif
-
-#include <stdio.h>
-#include "xbt/sysdep.h"
-#include "xbt/function_types.h"
-#include "xbt/log.h"
-#include "surf/surfxml_parse.h"
-#include "surf/surf.h"
-#include "portable.h"           /* Needed for the time of the SIMIX convertion */
-
-#include <stdarg.h>
-
-
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(stubgen);
-
-#ifdef __BORLANDDC__
-
-char *__gras_path = NULL;
-
-/* tabulation level (used to indent the lines of the borland project file */
-static unsigned int level = 0;
-
-
-#ifndef MAX_PATH
-#define MAX_PATH 260
-#endif
-
-/*
- * A structure which represents a borland project file.
- */
-typedef struct s_borland_project {
-  const char *xml_version;      /* the xml version used to write the borland project file                   */
-  const char *encoding;         /* the encoding used to write the borland project file                      */
-  const char *comment;          /* the xml comment to write at the begining of the borland project file     */
-  char *name;                   /* the name of the borland project file                                                                         */
-  FILE *stream;                 /* the stream to the borland project file                                                                       */
-  const char *version;          /* the builder version of the borland project file                                                      */
-  char *bin_dir;                /* the directory used to store the generated program                                            */
-  char *obj_dir;                /* the directory used to store the generated object files                                       */
-  char *lib_dir;                /* the directory used to store the librairies used in the borland project       */
-  char *src_dir;                /* the directory use to store the source files of the project                           */
-} s_borland_project_t, *borland_project_t;
-
-
-/*
- * A structure which represents a visual C++ project file.
- */
-typedef struct s_dsp {
-  FILE *stream;
-  char *lib_dir;
-  char *src_dir;
-  char *name;
-} s_dsp_t, *dsp_t;
-
-/*
- * Write tabs in a borland project file.
- * @param project The project concerned by the operation.
- * @param count The count tab to write
- */
-static void
-borland_project_write_tabs(borland_project_t project, unsigned int count);
-
-/*
- * Write the begin of an xml node in the borland project file.
- * @param project The borland project concerned by this operation.
- * @param name The name of the node.
- */
-static void
-borland_project_begin_xml_node(borland_project_t project,
-                               const char *name);
-
-
-/*
- * Write the end of an xml node in the borland project file.
- * @param project The borland project concerned by this operation.
- * @param name The name of the node.
- */
-static void
-borland_project_end_xml_node(borland_project_t project, const char *name);
-
-/*
- * Write an xml element in a borland project file.
- * @param project The borland project concerned by this operation.
- * @param name The name of the element to write
- * @param value The value of the element  
- */
-static void
-borland_project_write_xml_element(borland_project_t project,
-                                  const char *name, const char *value);
-
-/*
- * Write a FILE xml element in the borland project file.
- * @param project The borland project concerned by this operation.
- * @param file_name The value of the attribute FILENAME.
- * @param form_name The value of the attribute FORMNAME.
- * @param unit_name The value of the attribute UNITNAME.
- * @param container_id The value of the attribute CONTAINERID.
- * @param design_claas The value of the attribute DESIGNCLASS.
- * @param local_command The value of the attribute LOCALCOMMAND.
- */
-static void
-borland_project_write_file_element(borland_project_t project,
-                                   const char *file_name,
-                                   const char *form_name,
-                                   const char *unit_name,
-                                   const char *container_id,
-                                   const char *design_class,
-                                   const char *local_command);
-/*
- * Write all options of the IDE of the Borland Builder C++ compiler.
- * @ param project The project concerned by this operation.
- */
-
-static void borland_project_write_ide_options(borland_project_t project);
-
-/*
- * Write the xml header of the xml document.
- * @param project The project concerned by the operation.
- */
-static void borland_project_write_xml_header(borland_project_t project);
-
-/*
- * Write an xml comment in a borland project file
- * @param project The project concerned by this operation.
- */
-static void borland_project_write_xml_comment(borland_project_t project);
-
-/*
- * Create a bpf file used by a borland project file.
- * @param name The name of the bpf file to create.
- */
-static void borland_project_create_main_file(const char *name);
-
-/*
- * Create a borland project file.
- * @param project The project concerned by this operation.
- */
-static void borland_project_create(borland_project_t project);
-
-/*
- * Close a borland project file.
- * @param project the borland project file to close.
- */
-static void borland_project_close(borland_project_t project);
-
-
-/*
- * Generate a borland project file.
- * @param project The borland project to generate.
- */
-static void
-generate_borland_project(borland_project_t project, int is_rl,
-                         const char *name);
-
-/*
- * Find the path of a file.
- * @param file_name The file name to find.
- * @path path If founded this parameter will contain the path of file.
- * @return If successful the function returns 1. Otherwise the function
- *  retruns 0;
- */
-static int
-find_file_path(const char *root_dir, const char *file_name, char *path);
-
-
-/*
- * Functions used to create a Microsoft Visual C++ project file (*.dsp).
- */
-
-/*
- * generate a Microsoft Visual project file*/
-static void generate_dsp_project(dsp_t project, int is_rl,
-                                 const char *name);
-
-static void
-generate_borland_project(borland_project_t project, int is_rl,
-                         const char *name)
-{
-  char *binary_path;            /* the path of the generated binary file                                */
-  char *obj_path;               /* the path of the generated object file                                */
-  char *lib_files;              /* a list of the libraries used in the borland project  */
-  char *main_source;            /* the name of the bpf file used by the borland project */
-  char *file_name;              /* the file name of the main source file                                */
-  char *include_path;           /* the include path                                     */
-  char *buffer;
-
-  /* create the borland project file */
-  borland_project_create(project);
-
-  /* write the xml document header */
-  borland_project_write_xml_header(project);
-
-  /* write the xml comment to identify a borland project file */
-  borland_project_write_xml_comment(project);
-
-  /* write the begin of the node PROJECT */
-  borland_project_begin_xml_node(project, "PROJECT");
-
-  /* write the begin of node MACROS */
-  borland_project_begin_xml_node(project, "MACROS");
-
-  /* write the borland project version */
-  borland_project_write_xml_element(project, "VERSION", project->version);
-
-  /* construct and write the borland project binary path */
-  binary_path =
-      xbt_new0(char, strlen(project->name) + strlen(project->bin_dir) + 6);
-  sprintf(binary_path, "%s\\%s.exe", project->bin_dir, project->name);
-  borland_project_write_xml_element(project, "PROJECT", binary_path);
-  xbt_free(binary_path);
-
-  /* construct an write the object files to generate by the compiler */
-  obj_path =
-      xbt_new0(char,
-               strlen(project->name) + strlen(name) +
-               (2 * strlen(project->obj_dir)) + 11);
-  sprintf(binary_path, "%s\\%s.obj\n%s\\%s.obj", project->obj_dir,
-          project->name, project->obj_dir, name);
-  borland_project_write_xml_element(project, "OBJFILES", obj_path);
-  xbt_free(obj_path);
-
-  /* write the resource files used by the compiler (no resource file used) */
-  borland_project_write_xml_element(project, "RESFILES", "");
-
-  /* write the IDL files of the project (no IDL files used) */
-  borland_project_write_xml_element(project, "IDLFILES", "");
-
-  /* write the IDLGENFILES element (not used) */
-  borland_project_write_xml_element(project, "IDLGENFILES", "");
-
-  /* write the DEFFILE element (not used) */
-  borland_project_write_xml_element(project, "DEFFILE", "");
-
-  /* write the RESDEPEN element (not used, no resource file used) */
-  borland_project_write_xml_element(project, "RESDEPEN", "$(RESFILES)");
-
-  /* construct and write the list of libraries used by the project */
-  /*
-     lib_files = xbt_new0(char,(2 * (strlen(project->lib_dir) + 1)) + strlen("simgrid.lib") + strlen("libgras.lib") + 3);
-     sprintf(lib_files,"%s\\simgrid.lib %s\\libgras.lib",project->lib_dir,project->lib_dir);
-   */
-
-  if (is_rl) {
-    lib_files =
-        xbt_new0(char,
-                 (2 * (strlen(project->lib_dir) + 1)) +
-                 strlen("libgras.lib") + 2);
-    sprintf(lib_files, "%s\\libgras.lib", project->lib_dir);
-  } else {
-    lib_files =
-        xbt_new0(char,
-                 (2 * (strlen(project->lib_dir) + 1)) +
-                 strlen("simgrid.lib") + 2);
-    sprintf(lib_files, "%s\\simgrid.lib", project->lib_dir);
-  }
-
-  borland_project_write_xml_element(project, "LIBFILES", lib_files);
-  xbt_free(lib_files);
-
-  /* write the SPARELIBS element (not used) */
-  borland_project_write_xml_element(project, "SPARELIBS", "");
-
-  /* write the PACKAGES element (no package used) */
-  borland_project_write_xml_element(project, "PACKAGES", "");
-
-  /* write the PATHCPP element (the path of the source files of the project) */
-  borland_project_write_xml_element(project, "PATHCPP", ".;");
-
-  /* write the PATHPAS element (not used) */
-  borland_project_write_xml_element(project, "PATHPAS", "");
-
-  /* write the PATHRC element (not used) */
-  borland_project_write_xml_element(project, "PATHRC", "");
-
-  /* write the PATHASM element (not used) */
-  borland_project_write_xml_element(project, "PATHASM", "");
-
-  /* write the DEBUGLIBPATH element (the path for debug) */
-  borland_project_write_xml_element(project, "DEBUGLIBPATH",
-                                    "$(BCB)\\lib\\debug");
-
-  /* write the RELEASELIBPATH element (the path for release) */
-  borland_project_write_xml_element(project, "RELEASELIBPATH",
-                                    "$(BCB)\\lib\\release");
-
-  /* specify the linker to use */
-  borland_project_write_xml_element(project, "LINKER", "ilink32");
-
-  /* write the USERDEFINES element (user definitions (#define _DEBUG)) */
-  borland_project_write_xml_element(project, "USERDEFINES", "_DEBUG");
-
-  /* write the SYSDEFINES element (use the system definitions, not used strict ANSI and no use the VCL) */
-  borland_project_write_xml_element(project, "SYSDEFINES",
-                                    "NO_STRICT;_NO_VCL");
-
-  /* construct and write the MAINSOURCE element */
-  main_source = xbt_new0(char, strlen(project->name) + 5);
-  sprintf(main_source, "%s.bpf", project->name);
-  /* write the main source file to use in the borland project file */
-  borland_project_write_xml_element(project, "MAINSOURCE", main_source);
-
-  /* create the bpf file used by the borland project */
-  borland_project_create_main_file(main_source);
-
-  /* FIXME resolve the include path */
-  /* write the INCLUDEPATH element  */
-
-  if (!__gras_path) {
-    buffer = xbt_new0(char, MAX_PATH);
-    GetEnvironmentVariable("SG_INSTALL_DIR", buffer, MAX_PATH);
-
-    __gras_path = xbt_new0(char, MAX_PATH);
-    sprintf(__gras_path, "%s\\simgrid\\include", buffer);
-    free(buffer);
-
-    /*find_file_path("C:\\","gras.h",__gras_path); */
-  }
-
-  include_path =
-      xbt_new0(char, strlen("$(BCB)\\include") + strlen(__gras_path) + 2);
-  sprintf(include_path, "$(BCB)\\include;%s", __gras_path);
-
-  borland_project_write_xml_element(project, "INCLUDEPATH", include_path);
-
-  xbt_free(include_path);
-
-  /* write the LIBPATH element (no librarie paths specified) */
-  borland_project_write_xml_element(project, "LIBPATH",
-                                    "$(BCB)\\lib;$(BCB)\\lib\\obj");
-
-  /*
-   * write the WARNINGS element :
-   *  -w-sus (-w-8075) disabled the suspect conversion pointer warning
-   *  -w-rvl (-w-8070) disabled the function must return warning
-   *  -w-rch (-w-8066) disabled the warning which specify that we can't attain the code
-   *  -w-pia (-w-8060) disabled the warning that detect a possible bad assignement
-   *  -w-pch (-w-8058) disabled the warning throw when the compiler can't precompile a header file
-   *  -w-par (-w-8057) disabled the warning that detect an unused variable
-   *  -w-csu (-w-8012) disabled the warning that detect a comparison between a signed number and an unsigned number
-   *  -w-ccc (-w-8008) disabled the warning that detect une conditon which is always true
-   *  -w-aus (-w-8008) disabled the warning that detect an affected value which is never used
-   */
-  borland_project_write_xml_element(project, "WARNINGS",
-                                    "-w-sus -w-rvl -w-rch -w-pia -w-pch -w-par -w-csu -w-ccc -w-aus");
-
-  /* write the OTHERFILES element (no other files used used) */
-  borland_project_write_xml_element(project, "OTHERFILES", "");
-
-  /* write the end of the node MACROS */
-  borland_project_end_xml_node(project, "MACROS");
-
-  /* write the begin of the node OPTIONS */
-  borland_project_begin_xml_node(project, "OPTIONS");
-
-  /* FIXME check the idlcflags */
-  /* write the IDLCFLAGS element */
-  borland_project_write_xml_element(project, "IDLCFLAGS", "");
-
-  /*
-   * write the CFLAG1 element (compiler options ) :
-   *
-   *  -Od     this flag disable all compiler optimisation
-   *  -H      this flag specify the name of the file which will contain the precompiled header
-   *  -Hc     this flag specify to the compiler to cach the precompiled header
-   *  -Vx     this flag specify to the compiler to allow the empty structures
-   *  -Ve     this flag specify to the compiler to allow the empty base classes
-   *  -X-     this flag activate the auto-depend informations of the compiler
-   *  -r-     this flag disabled the use of the processor register
-   *  -a1     this flag specify that the data must be aligned on one byte
-   *  -b-     this flag specify that the enums are the smallest size of the integer
-   *  -k      (used during debug)
-   *  -y      this flag generate the line number for debug
-   *  -v      this flag enabled the debugging of the source files
-   *  -vi     check the expansion of the inline functions
-   *  -tWC    specify that it's a console application
-   *  -tWM-   specify that the application is not multithread
-   *  -c      generate the object file, no link
-   */
-  borland_project_write_xml_element(project, "CFLAG1",
-                                    "-Od -H=$(BCB)\\lib\\vcl60.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -tWC -tWM- -c");
-
-  /* write the PFLAGS element */
-  borland_project_write_xml_element(project, "PFLAGS",
-                                    "-N2obj -N0obj -$YD -$W -$O- -$A8 -v -JPHNE ");
-
-  /* write the RFLAGS element */
-  borland_project_write_xml_element(project, "RFLAGS", "");
-
-  /* write the AFLAGS element (assembler flags) :
-   *
-   *  /mx (not documented)
-   *  /w2 (not documented)
-   *  /zd (not documented)
-   *
-   */
-  borland_project_write_xml_element(project, "AFLAGS", "/mx /w2 /zd");
-
-  /* write the LFLAGS element (linker flags) :
-   *
-   *  -I      specify the output directory for object files
-   *  -D      register the specified description (no description "")
-   *  -ap     build a win32 console application
-   *  -Tpe    generate a exe file
-   *  -x      do not create the map file
-   *  -Gn     do not generate the state file
-   *  -v      include the complete debug informations  
-   */
-  borland_project_write_xml_element(project, "LFLAGS",
-                                    "-Iobj -D&quot;&quot; -ap -Tpe -x -Gn -v");
-
-  /* write the OTHERFILES element (not used) */
-  borland_project_write_xml_element(project, "OTHERFILES", "");
-
-  /* write the end of the node OPTIONS */
-  borland_project_end_xml_node(project, "OPTIONS");
-
-  /* write the begin of the node LINKER */
-  borland_project_begin_xml_node(project, "LINKER");
-
-  /* write the ALLOBJ element */
-  borland_project_write_xml_element(project, "ALLOBJ",
-                                    "c0x32.obj $(OBJFILES)");
-
-  /* write the ALLRES element (not used) */
-  borland_project_write_xml_element(project, "ALLRES", "");
-
-  /* write the ALLLIB element */
-  borland_project_write_xml_element(project, "ALLLIB",
-                                    "$(LIBFILES) $(LIBRARIES) import32.lib cw32.lib");
-
-  /* write the OTHERFILES element (not used) */
-  borland_project_write_xml_element(project, "OTHERFILES", "");
-
-  /* write the end of the node LINKER */
-  borland_project_end_xml_node(project, "LINKER");
-
-  /* write the begin of the node FILELIST */
-  borland_project_begin_xml_node(project, "FILELIST");
-
-  /* construct and write the list of file elements */
-
-  /* add the bpf file to the list */
-  borland_project_write_file_element(project, main_source, "",
-                                     project->name, "BPF", "", "");
-  xbt_free(main_source);
-
-  /* FIXME : check the source file directory */
-  /* add the generated source file to the list */
-
-  file_name =
-      xbt_new0(char, strlen(project->src_dir) + strlen(project->name) + 5);
-  sprintf(file_name, "%s\\_%s.c", project->src_dir, project->name);
-  borland_project_write_file_element(project, file_name, "", project->name,
-                                     "CCompiler", "", "");
-
-  memset(file_name, 0,
-         strlen(project->src_dir) + strlen(project->name) + 4);
-  sprintf(file_name, "%s\\%s.c", project->src_dir, name);
-  borland_project_write_file_element(project, file_name, "", name,
-                                     "CCompiler", "", "");
-
-  xbt_free(file_name);
-
-  /* FIXME : check the libraries directory */
-  /* add the simgrid library to the list */
-
-  if (is_rl) {
-    file_name =
-        xbt_new0(char,
-                 strlen(project->lib_dir) + strlen("libgras.lib") + 2);
-    sprintf(file_name, "%s\\libgras.lib", project->lib_dir);
-    borland_project_write_file_element(project, file_name, "",
-                                       "libgras.lib", "LibTool", "", "");
-  } else {
-    file_name =
-        xbt_new0(char,
-                 strlen(project->lib_dir) + strlen("simgrid.lib") + 2);
-    sprintf(file_name, "%s\\simgrid.lib", project->lib_dir);
-    borland_project_write_file_element(project, file_name, "",
-                                       "simgrid.lib", "LibTool", "", "");
-  }
-
-
-  xbt_free(file_name);
-
-  /* write the end of the node FILELIST */
-  borland_project_end_xml_node(project, "FILELIST");
-
-  /* write the begin of the node BUILDTOOLS (not used) */
-  borland_project_begin_xml_node(project, "BUILDTOOLS");
-
-  /* write the end of the node BUILDTOOLS (not used) */
-  borland_project_end_xml_node(project, "BUILDTOOLS");
-
-  /* write the begin of the node IDEOPTIONS */
-  borland_project_begin_xml_node(project, "IDEOPTIONS");
-
-  /* write all of the option of the IDE of Borland C++ Builder */
-  borland_project_write_ide_options(project);
-
-  /* write the end of the node IDEOPTIONS */
-  borland_project_end_xml_node(project, "IDEOPTIONS");
-
-  /* write the end of the node PROJECT */
-  borland_project_end_xml_node(project, "PROJECT");
-
-  /* close the borland project file */
-  borland_project_close(project);
-}
-
-void borland_project_write_tabs(borland_project_t project,
-                                unsigned int count)
-{
-  unsigned int pos;
-
-  for (pos = 0; pos < count; pos++)
-    fprintf(project->stream, "\t");
-}
-
-void
-borland_project_begin_xml_node(borland_project_t project, const char *name)
-{
-  if (level)
-    borland_project_write_tabs(project, level);
-
-  fprintf(project->stream, "<%s>\n", name);
-
-  level++;
-}
-
-void borland_project_end_xml_node(borland_project_t project,
-                                  const char *name)
-{
-  level--;
-
-  if (level)
-    borland_project_write_tabs(project, level);
-
-  fprintf(project->stream, "</%s>\n", name);
-}
-
-
-void
-borland_project_write_xml_element(borland_project_t project,
-                                  const char *name, const char *value)
-{
-  borland_project_write_tabs(project, level);
-  fprintf(project->stream, "<%s value=\"%s\"/>\n", name, value);
-}
-
-void borland_project_write_xml_header(borland_project_t project)
-{
-  fprintf(project->stream, "<?xml version='%s' encoding='%s' ?>\n",
-          project->xml_version, project->encoding);
-}
-
-void borland_project_create_main_file(const char *name)
-{
-  FILE *stream = fopen(name, "w+");
-
-  fprintf(stream,
-          "Ce fichier est uniquement utilis� par le gestionnaire de projets et doit ï¿½tre trait� comme le fichier projet\n\n\nmain\n");
-
-  fclose(stream);
-}
-
-void borland_project_create(borland_project_t project)
-{
-  char *file_name = xbt_new0(char, strlen(project->name) + 5);
-  sprintf(file_name, "%s.bpr", project->name);
-  project->stream = fopen(file_name, "w+");
-  xbt_free(file_name);
-}
-
-void borland_project_write_xml_comment(borland_project_t project)
-{
-  fprintf(project->stream, "<!-- %s -->\n", project->comment);
-}
-
-void
-borland_project_write_file_element(borland_project_t project,
-                                   const char *file_name,
-                                   const char *form_name,
-                                   const char *unit_name,
-                                   const char *container_id,
-                                   const char *design_class,
-                                   const char *local_command)
-{
-  borland_project_write_tabs(project, level);
-
-  fprintf(project->stream,
-          "<FILE FILENAME=\"%s\" FORMNAME=\"%s\" UNITNAME=\"%s\" CONTAINERID=\"%s\" DESIGNCLASS=\"%s\" LOCALCOMMAND=\"%s\"/>\n",
-          file_name, form_name, unit_name, container_id, design_class,
-          local_command);
-}
-
-void borland_project_write_ide_options(borland_project_t project)
-{
-
-  const char *ide_options =
-      "[Version Info]\nIncludeVerInfo=0\nAutoIncBuild=0\nMajorVer=1\nMinorVer=0\nRelease=0\nBuild=0\nDebug=0\nPreRelease=0\nSpecial=0\nPrivate=0\nDLL=0\nLocale=1036\nCodePage=1252\n\n"
-      "[Version Info Keys]\nCompanyName=\nFileDescription=\nFileVersion=1.0.0.0\nInternalName=\nLegalCopyright=\nLegalTrademarks=\nOriginalFilename=\nProductName=\nProductVersion=1.0.0.0\nComments=\n\n"
-      "[Excluded Packages]\n$(BCB)\\dclclxdb60.bpl=Composants BD CLX Borland\n$(BCB)\\Bin\\dclclxstd60.bpl=Composants Standard CLX Borland\n\n"
-      "[HistoryLists\\hlIncludePath]\nCount=1\nItem0=$(BCB)\\include;$(BCB)\\include\\vcl;\n\n"
-      "[HistoryLists\\hlLibraryPath]\nCount=1\nItem0=$(BCB)\\lib\\obj;$(BCB)\\lib\n\n"
-      "[HistoryLists\\hlDebugSourcePath]\nCount=1\nItem0=$(BCB)\\source\\vcl\\\n\n"
-      "[HistoryLists\\hlConditionals]\nCount=1\nItem0=_DEBUG\n\n"
-      "[HistoryLists\\hlIntOutputDir]\nCount=0\n\n"
-      "[HistoryLists\\hlFinalOutputDir]\nCount=0\n\n"
-      "[HistoryLists\\hIBPIOutputDir]\nCount=0\n\n"
-      "[Debugging]\nDebugSourceDirs=$(BCB)\\source\\vcl\n\n"
-      "[Parameters]\nRunParams=\nLauncher=\nUseLauncher=0\nDebugCWD=\nHostApplication=\nRemoteHost=\nRemotePath=\nRemoteLauncher=\nRemoteCWD=\nRemoteDebug=0\n\n"
-      "[Compiler]\nShowInfoMsgs=0\nLinkDebugVcl=0\nLinkCGLIB=0\n\n"
-      "[CORBA]\nAddServerUnit=1\nAddClientUnit=1\nPrecompiledHeaders=1\n\n"
-      "[Language]\nActiveLang=\nProjectLang=\nRootDir=\n";
-
-  fprintf(project->stream, ide_options);
-}
-
-void borland_project_close(borland_project_t project)
-{
-  fclose(project->stream);
-}
-
-void generate_borland_simulation_project(const char *name)
-{
-  char buffer[MAX_PATH] = { 0 };
-
-  HANDLE hDir;
-  WIN32_FIND_DATA wfd = { 0 };
-
-  s_borland_project_t borland_project = { 0 };
-  borland_project.xml_version = "1.0";
-  borland_project.encoding = "utf-8";
-  borland_project.comment = "C++Builder XML Project";
-  borland_project.version = "BCB.06.00";
-
-  borland_project.lib_dir = xbt_new0(char, MAX_PATH);
-
-
-  GetEnvironmentVariable("LIB_SIMGRID_PATH", borland_project.lib_dir,
-                         MAX_PATH);
-
-
-  GetCurrentDirectory(MAX_PATH, buffer);
-
-  borland_project.src_dir = xbt_strdup(buffer);
-
-  borland_project.name =
-      xbt_new0(char, strlen(name) + strlen("simulator") + 2);
-  sprintf(borland_project.name, "%s_simulator", name);
-
-  borland_project.bin_dir =
-      xbt_new0(char, strlen(buffer) + strlen("\\bin") + 1);
-  sprintf(borland_project.bin_dir, "%s\\bin", buffer);
-
-  hDir = FindFirstFile(borland_project.bin_dir, &wfd);
-
-  if (!hDir)
-    CreateDirectory(borland_project.bin_dir, NULL);
-
-  borland_project.obj_dir =
-      xbt_new0(char, strlen(buffer) + strlen("\\obj") + 1);
-  sprintf(borland_project.obj_dir, "%s\\obj", buffer);
-
-  hDir = FindFirstFile(borland_project.obj_dir, &wfd);
-
-  if (INVALID_HANDLE_VALUE == hDir)
-    CreateDirectory(borland_project.obj_dir, NULL);
-
-  generate_borland_project(&borland_project, 0, name);
-
-  xbt_free(borland_project.name);
-  xbt_free(borland_project.src_dir);
-  xbt_free(borland_project.bin_dir);
-  xbt_free(borland_project.obj_dir);
-  xbt_free(borland_project.lib_dir);
-}
-
-void generate_borland_real_life_project(const char *name)
-{
-  HANDLE hDir;
-  WIN32_FIND_DATA wfd = { 0 };
-  char buffer[MAX_PATH] = { 0 };
-  xbt_dict_cursor_t cursor = NULL;
-  char *key = NULL;
-  void *data = NULL;
-  s_borland_project_t borland_project = { 0 };
-
-  borland_project.xml_version = "1.0";
-  borland_project.encoding = "utf-8";
-  borland_project.comment = "C++Builder XML Project";
-  borland_project.version = "BCB.06.00";
-
-  borland_project.lib_dir = xbt_new0(char, MAX_PATH);
-
-  GetEnvironmentVariable("LIB_GRAS_PATH", borland_project.lib_dir,
-                         MAX_PATH);
-
-  GetCurrentDirectory(MAX_PATH, buffer);
-
-  borland_project.src_dir = xbt_strdup(buffer);
-
-  borland_project.bin_dir =
-      xbt_new0(char, strlen(buffer) + strlen("\\bin") + 1);
-  sprintf(borland_project.bin_dir, "%s\\bin", buffer);
-
-  hDir = FindFirstFile(borland_project.bin_dir, &wfd);
-
-  if (INVALID_HANDLE_VALUE == hDir)
-    CreateDirectory(borland_project.bin_dir, NULL);
-
-  borland_project.obj_dir =
-      xbt_new0(char, strlen(buffer) + strlen("\\obj") + 1);
-  sprintf(borland_project.obj_dir, "%s\\obj", buffer);
-
-  hDir = FindFirstFile(borland_project.obj_dir, &wfd);
-
-  if (!hDir)
-    CreateDirectory(borland_project.obj_dir, NULL);
-
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    borland_project.name = xbt_new0(char, strlen(name) + strlen(key) + 2);
-
-    sprintf(borland_project.name, "%s_%s", name, key);
-
-    generate_borland_project(&borland_project, 1, name);
-    xbt_free(borland_project.name);
-  }
-
-  xbt_free(borland_project.src_dir);
-  xbt_free(borland_project.bin_dir);
-  xbt_free(borland_project.obj_dir);
-  xbt_free(borland_project.lib_dir);
-}
-
-int find_file_path(const char *root_dir, const char *file_name, char *path)
-{
-  HANDLE hFind;
-  WIN32_FIND_DATA wfd;
-  char *prev_dir = xbt_new(char, MAX_PATH);
-  GetCurrentDirectory(MAX_PATH, prev_dir);
-  SetCurrentDirectory(root_dir);
-
-  // begining of the scan
-  hFind = FindFirstFile("*.*", &wfd);
-
-  if (hFind != INVALID_HANDLE_VALUE) {
-
-    /* it's a file */
-    if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
-
-      if (!strcmp(file_name, wfd.cFileName)) {
-        GetCurrentDirectory(MAX_PATH, path);
-        SetCurrentDirectory(prev_dir);
-        xbt_free(prev_dir);
-        FindClose(hFind);
-        return 1;
-      }
-
-    }
-    /* it's a directory, scan it */
-    else {
-
-      if (strcmp(wfd.cFileName, ".") && strcmp(wfd.cFileName, "..")) {
-        if (find_file_path(wfd.cFileName, file_name, path)) {
-          FindClose(hFind);
-          SetCurrentDirectory(prev_dir);
-          return 1;
-        }
-      }
-    }
-
-    /* next file or directory */
-    while (FindNextFile(hFind, &wfd)) {
-      /* it's a file */
-      if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
-        if (!strcmp(file_name, wfd.cFileName)) {
-          GetCurrentDirectory(MAX_PATH, path);
-          SetCurrentDirectory(prev_dir);
-          xbt_free(prev_dir);
-          FindClose(hFind);
-          return 1;
-        }
-      }
-      /* it's a file scan it */
-      else {
-
-        if (strcmp(wfd.cFileName, ".") && strcmp(wfd.cFileName, "..")) {
-
-          if (find_file_path(wfd.cFileName, file_name, path)) {
-            SetCurrentDirectory(prev_dir);
-            FindClose(hFind);
-            return 1;
-          }
-
-        }
-
-      }
-    }
-  }
-
-  SetCurrentDirectory(prev_dir);
-  xbt_free(prev_dir);
-  FindClose(hFind);
-  return 0;
-}
-
-/* Implementation of the functions used to create a Visual C++ project.*/
-
-int generate_simulation_dsp_file(const char *name)
-{
-  char buffer[MAX_PATH] = { 0 };
-  s_dsp_t dsp = { 0 };
-  dsp.lib_dir = xbt_new0(char, MAX_PATH);
-
-  GetEnvironmentVariable("LIB_SIMGRID_PATH", dsp.lib_dir, MAX_PATH);
-  GetCurrentDirectory(MAX_PATH, buffer);
-
-  dsp.src_dir = xbt_strdup(buffer);
-  dsp.name = xbt_new0(char, strlen(name) + strlen("simulator") + 2);
-  sprintf(dsp.name, "%s_simulator", name);
-
-  generate_dsp_project(&dsp, 0, name);
-
-  xbt_free(dsp.name);
-  xbt_free(dsp.src_dir);
-  xbt_free(dsp.lib_dir);
-
-  return 0;
-}
-
-/*
- * Create the Microsoft visual C++ real life project file.
- */
-int generate_real_live_dsp_file(const char *name)
-{
-
-  char buffer[MAX_PATH] = { 0 };
-  xbt_dict_cursor_t cursor = NULL;
-  char *key = NULL;
-  void *data = NULL;
-  s_dsp_t dsp = { 0 };
-
-
-  dsp.lib_dir = xbt_new0(char, MAX_PATH);
-
-  GetEnvironmentVariable("LIB_GRAS_PATH", dsp.lib_dir, MAX_PATH);
-
-  GetCurrentDirectory(MAX_PATH, buffer);
-
-  dsp.src_dir = xbt_strdup(buffer);
-
-
-  xbt_dict_foreach(process_function_set, cursor, key, data) {
-    dsp.name = xbt_new0(char, strlen(name) + strlen(key) + 2);
-
-    sprintf(dsp.name, "%s_%s", name, key);
-
-    generate_dsp_project(&dsp, 1, name);
-    xbt_free(dsp.name);
-  }
-
-  xbt_free(dsp.src_dir);
-  xbt_free(dsp.lib_dir);
-  return 0;
-}
-
-void generate_dsp_project(dsp_t project, int is_rl, const char *name)
-{
-  /* create the visual C++ project file */
-  char *buffer;
-  char *file_name = xbt_new0(char, strlen(project->name) + 5);
-  sprintf(file_name, "%s.dsp", project->name);
-  project->stream = fopen(file_name, "w+");
-  xbt_free(file_name);
-
-  if (!__gras_path) {
-    buffer = xbt_new0(char, MAX_PATH);
-    GetEnvironmentVariable("SG_INSTALL_DIR", buffer, MAX_PATH);
-
-    __gras_path = xbt_new0(char, MAX_PATH);
-    sprintf(__gras_path, "%s\\simgrid\\include", buffer);
-    free(buffer);
-  }
-
-  /* dsp file header */
-  fprintf(project->stream,
-          "# Microsoft Developer Studio Project File - Name=\"%s\" - Package Owner=<4>\n",
-          project->name);
-  fprintf(project->stream,
-          "# Microsoft Developer Studio Generated Build File, Format Version 6.00\n");
-  fprintf(project->stream, "# ** DO NOT EDIT **\n\n");
-
-  /* target type is a win32 x86 console application */
-  fprintf(project->stream,
-          "# TARGTYPE \"Win32 (x86) Console Application\" 0x0103\n\n");
-
-  /* the current config is win32-debug */
-  fprintf(project->stream, "CFG=%s - Win32 Debug\n", project->name);
-
-  /* warning */
-  fprintf(project->stream,
-          "!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n");
-
-  /* NMAKE usage */
-  fprintf(project->stream,
-          "!MESSAGE use the Export Makefile command and run\n");
-  fprintf(project->stream, "!MESSAGE\n");
-  fprintf(project->stream, "!MESSAGE NMAKE /f \"%s.mak\".\n",
-          project->name);
-  fprintf(project->stream, "!MESSAGE\n");
-  fprintf(project->stream,
-          "!MESSAGE You can specify a configuration when running NMAKE\n");
-  fprintf(project->stream,
-          "!MESSAGE by defining the macro CFG on the command line. For example:\n");
-  fprintf(project->stream, "!MESSAGE\n");
-  fprintf(project->stream,
-          "!MESSAGE NMAKE /f \"%s.mak\" CFG=\"%s - Win32 Debug\"\n",
-          project->name, project->name);
-  fprintf(project->stream, "!MESSAGE\n");
-  fprintf(project->stream,
-          "!MESSAGE Possible choices for configuration are:\n");
-  fprintf(project->stream, "!MESSAGE\n");
-  fprintf(project->stream,
-          "!MESSAGE \"%s - Win32 Release\" (based on \"Win32 (x86) Console Application\")\n",
-          project->name);
-  fprintf(project->stream,
-          "!MESSAGE \"%s - Win32 Debug\" (based on \"Win32 (x86) Console Application\")\n",
-          project->name);
-  fprintf(project->stream, "!MESSAGE\n\n");
-
-  fprintf(project->stream, "# Begin Project\n\n");
-  fprintf(project->stream, "# PROP AllowPerConfigDependencies 0\n");
-  fprintf(project->stream, "# PROP Scc_ProjName\n");
-  fprintf(project->stream, "# PROP Scc_LocalPath\n");
-  fprintf(project->stream, "CPP=cl.exe\n");
-  fprintf(project->stream, "RSC=rc.exe\n\n");
-
-  fprintf(project->stream, "!IF  \"$(CFG)\" == \"%s - Win32 Release\"\n\n",
-          project->name);
-
-  fprintf(project->stream, "# PROP BASE Use_MFC 0\n");
-  fprintf(project->stream, "# PROP BASE Use_Debug_Libraries 0\n");
-  fprintf(project->stream, "# PROP BASE Output_Dir \"Release\"\n");
-  fprintf(project->stream, "# PROP BASE Intermediate_Dir \"Release\"\n");
-  fprintf(project->stream, "# PROP BASE Target_Dir \"\"\n");
-  fprintf(project->stream, "# PROP Use_MFC 0\n");
-  fprintf(project->stream, "# PROP Use_Debug_Libraries 0\n");
-  fprintf(project->stream, "# PROP Output_Dir \"Release\"\n");
-  fprintf(project->stream, "# PROP Intermediate_Dir \"Release\"\n");
-  fprintf(project->stream, "# PROP Target_Dir \"\"\n");
-  /* TODO : the include directory */
-  /*fprintf(project->stream,"# ADD BASE CPP /nologo /W3 /GX /O2 /I \"./%s\" /D \"_XBT_WIN32\" /D \"WIN32\" /D \"NDEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /c\n",__gras_path); */
-  fprintf(project->stream,
-          "# ADD BASE CPP /nologo /W3 /GX /O2 /I \"%s\" /D \"_XBT_WIN32\" /D \"WIN32\" /D \"NDEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /c\n",
-          __gras_path);
-  fprintf(project->stream,
-          "# ADD CPP /nologo /W3 /GX /O2 /D \"_XBT_WIN32\" /D \"WIN32\" /D \"NDEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /c\n");
-  fprintf(project->stream, "# ADD BASE RSC /l 0x40c /d \"NDEBUG\"\n");
-  fprintf(project->stream, "# ADD RSC /l 0x40c /d \"NDEBUG\n");
-  fprintf(project->stream, "BSC32=bscmake.exe\n");
-  fprintf(project->stream, "# ADD BASE BSC32 /nologo\n");
-  fprintf(project->stream, "# ADD BSC32 /nologo\n");
-  fprintf(project->stream, "LINK32=link.exe\n");
-  fprintf(project->stream,
-          "# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\n");
-
-  if (is_rl)
-    fprintf(project->stream,
-            "# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libgras.lib /nologo /subsystem:console /machine:I386\n\n");
-  else
-    fprintf(project->stream,
-            "# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib simgrid.lib /nologo /subsystem:console /machine:I386\n\n");
-
-  fprintf(project->stream, "!ELSEIF  \"$(CFG)\" == \"%s - Win32 Debug\"\n",
-          project->name);
-
-  fprintf(project->stream, "# PROP BASE Use_MFC 0\n");
-  fprintf(project->stream, "# PROP BASE Use_Debug_Libraries 1\n");
-  fprintf(project->stream, "# PROP BASE Output_Dir \"Debug\"\n");
-  fprintf(project->stream, "# PROP BASE Intermediate_Dir \"Debug\"\n");
-  fprintf(project->stream, "# PROP BASE Target_Dir \"\"\n");
-  fprintf(project->stream, "# PROP Use_MFC 0\n");
-  fprintf(project->stream, "# PROP Use_Debug_Libraries 1\n");
-  fprintf(project->stream, "# PROP Output_Dir \"Debug\"\n");
-  fprintf(project->stream, "# PROP Intermediate_Dir \"Debug\"\n");
-  fprintf(project->stream, "# PROP Ignore_Export_Lib 0\n");
-  fprintf(project->stream, "# PROP Target_Dir \"\"\n");
-  /* TODO : the include directory */
-  /*fprintf(project->stream,"# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od  /I \"./%s\" /D \"_XBT_WIN32\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /GZ  /c\n",__gras_path); */
-  fprintf(project->stream,
-          "# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od  /I \"%s\" /D \"_XBT_WIN32\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /GZ  /c\n",
-          __gras_path);
-  fprintf(project->stream,
-          "# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D \"_XBT_WIN32\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /GZ  /c\n");
-  fprintf(project->stream, "# ADD BASE RSC /l 0x40c /d \"_DEBUG\"\n");
-  fprintf(project->stream, "# ADD RSC /l 0x40c /d \"_DEBUG\"\n");
-  fprintf(project->stream, "BSC32=bscmake.exe\n");
-  fprintf(project->stream, "# ADD BASE BSC32 /nologo\n");
-  fprintf(project->stream, "# ADD BSC32 /nologo\n");
-  fprintf(project->stream, "LINK32=link.exe\n");
-  fprintf(project->stream,
-          "# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\n");
-
-  if (is_rl)
-    fprintf(project->stream,
-            "# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib simgrid.lib  libgras.lib  /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\n\n");
-  else
-    fprintf(project->stream,
-            "# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib simgrid.lib  simgrid.lib  /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\n\n");
-
-  fprintf(project->stream, "!ENDIF\n\n");
-
-  fprintf(project->stream, "# Begin Target\n\n");
-  fprintf(project->stream, "# Name \"%s - Win32 Release\"\n",
-          project->name);
-  fprintf(project->stream, "# Name \"%s - Win32 Debug\"\n", project->name);
-  fprintf(project->stream, "# Begin Group \"Source Files\"\n\n");
-  fprintf(project->stream,
-          "# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\n\n");
-
-  fprintf(project->stream, "# Begin Source File\n");
-  fprintf(project->stream, "SOURCE=%s\\_%s.c\n", project->src_dir,
-          project->name);
-  fprintf(project->stream, "# End Source File\n\n");
-
-  fprintf(project->stream, "# Begin Source File\n");
-  fprintf(project->stream, "SOURCE=%s\\%s.c\n", project->src_dir, name);
-  fprintf(project->stream, "# End Source File\n\n");
-
-  fprintf(project->stream, "# End Group\n");
-  fprintf(project->stream, "# Begin Group \"Header Files\"\n\n");
-  fprintf(project->stream, "# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\n");
-  fprintf(project->stream, "# End Group\n");
-  fprintf(project->stream, "# Begin Group \"Resource Files\"\n\n");
-  fprintf(project->stream,
-          "# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\"\n");
-  fprintf(project->stream, "# End Group\n");
-  fprintf(project->stream, "# End Target\n");
-  fprintf(project->stream, "# End Project\n");
-
-}
-
-#endif
index ba6211b..507a46e 100755 (executable)
@@ -15,7 +15,7 @@ eval 'exec perl -S $0 ${1+"$@"}'
 
 =head1 NAME
 
-simgrid_update_xml - updates simgrid XML files to lastest version
+simgrid_update_xml - updates simgrid XML files to latest version
   
 =head1 SYNOPSIS
 
index 85bd62d..a3e2b78 100644 (file)
@@ -6,14 +6,14 @@ if(WIN32)
     COMMENT "Install ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/tesh.pl"
     COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/tesh.pl ${CMAKE_BINARY_DIR}/bin/tesh
     )
-else(WIN32)
+else()
   set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin")
 
   add_executable(tesh tesh.c run_context.c signal.c)
 
   ### Add definitions for compile
-  target_link_libraries(tesh gras m pthread)
-endif(WIN32)
+  target_link_libraries(tesh simgrid m pthread)
+endif()
 
 set(tesh_files
   ${tesh_files}
@@ -58,5 +58,6 @@ set(bin_files
 set(txt_files
   ${txt_files}
   ${CMAKE_CURRENT_SOURCE_DIR}/README
+  ${CMAKE_CURRENT_SOURCE_DIR}/tesh.1
   PARENT_SCOPE
   )
index 8ae8137..8e23b7e 100644 (file)
@@ -67,7 +67,7 @@ implemented yet in tesh. This is a bit restrictive, but well, patch
 welcome...
 
 The situation in which it is mainly problematic is to create a
-temporary file. The solution is to use the "mkfile" buildin command,
+temporary file. The solution is to use the "mkfile" built-in command,
 as in the following example:
 $ mkfile myFile
 > some content
@@ -122,7 +122,7 @@ SimGrid since the processes run out of order at any scheduling point
 parallel). To ensure that the simulator outputs still match, we have
 to sort the output back before comparing it. 
 
-We expect the simulators to run with that log formating argument:
+We expect the simulators to run with that log formatting argument:
    -log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n
 Then, tesh sorts string on the 19 first chars only, and is stable when
 line beginnings are equal. This should ensure that:
index dc2ae04..f58c80e 100644 (file)
@@ -79,7 +79,7 @@ void rctx_init(void)
   struct sigaction newact;
   int i;
   fg_job = 0;
-  bg_jobs = xbt_dynar_new_sync(sizeof(rctx_t), kill_it);
+  bg_jobs = xbt_dynar_new(sizeof(rctx_t), kill_it);
   armageddon_mutex = xbt_os_mutex_init();
   armageddon_initiator = NULL;
   sigwaiter_mutex = xbt_os_mutex_init();
index 35a02ca..38c1d4e 100644 (file)
@@ -3,7 +3,7 @@
 .SH NAME
 tesh \- testing shell
 .SH SYNOPSIS
-.B ls
+.B tesh
 [\fIOPTION\fR]... [\fIFILE\fR]...
 .SH DESCRIPTION
 This is the TESH tool. It constitutes a testing shell, ie a sort of shell specialized to run tests. The list of actions to take is parsed from files files called testsuite. 
@@ -63,7 +63,7 @@ implemented yet in tesh. This is a bit restrictive, but well, patch
 welcome...
 
 The situation in which it is mainly problematic is to create a
-temporary file. The solution is to use the "mkfile" buildin command,
+temporary file. The solution is to use the "mkfile" built-in command,
 as in the following example:
 $ mkfile myFile
 > some content
@@ -104,7 +104,7 @@ SimGrid since the processes run out of order at any scheduling point
 parallel). To ensure that the simulator outputs still match, we have
 to sort the output back before comparing it. 
 
-We expect the simulators to run with that log formating argument:
+We expect the simulators to run with that log formatting argument:
    -log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n
 Then, tesh sorts string on the 19 first chars only, and is stable when
 line beginnings are equal. This should ensure that: