Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'mc' into mc++
authorGabriel Corona <gabriel.corona@loria.fr>
Thu, 6 Mar 2014 12:29:59 +0000 (13:29 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Thu, 6 Mar 2014 12:29:59 +0000 (13:29 +0100)
1072 files changed:
.cproject
.gitignore
.project
CMakeLists.txt
COPYING
COPYRIGHT.template [new file with mode: 0644]
ChangeLog
NEWS
README.coding
buildtools/Cmake/AddTests.cmake
buildtools/Cmake/CTestConfig.cmake
buildtools/Cmake/CompleteInFiles.cmake
buildtools/Cmake/DefinePackages.cmake
buildtools/Cmake/Distrib.cmake
buildtools/Cmake/Flags.cmake
buildtools/Cmake/GenerateDoc.cmake
buildtools/Cmake/MaintainerMode.cmake
buildtools/Cmake/MakeExe.cmake
buildtools/Cmake/MakeJava.cmake
buildtools/Cmake/MakeLib.cmake
buildtools/Cmake/MakeLibWin.cmake
buildtools/Cmake/Modules/FindF2c.cmake
buildtools/Cmake/Modules/FindLibSigc++.cmake [new file with mode: 0644]
buildtools/Cmake/Modules/FindNS3.cmake
buildtools/Cmake/Option.cmake
buildtools/Cmake/PrintArgs.cmake
buildtools/Cmake/Scripts/generate_memcheck_tests.pl
buildtools/Cmake/Scripts/generate_new_tests.pl
buildtools/Cmake/Scripts/java_bundle.sh [new file with mode: 0755]
buildtools/Cmake/Scripts/my_valgrind.pl
buildtools/Cmake/Scripts/tesh.pl
buildtools/Cmake/Scripts/update_tesh.pl
buildtools/Cmake/Supernovae.cmake [deleted file]
buildtools/Cmake/src/internal_config.h.in
buildtools/Cmake/test_prog/prog_AC_CHECK_MCSC.c
buildtools/Cmake/test_prog/prog_gnu_dynlinker.c
buildtools/Cmake/test_prog/prog_gtnets.cpp
buildtools/Cmake/test_prog/prog_mutex_timedlock.c
buildtools/Cmake/test_prog/prog_printf_null.c
buildtools/Cmake/test_prog/prog_sem_init.c
buildtools/Cmake/test_prog/prog_sem_open.c
buildtools/Cmake/test_prog/prog_sem_timedwait.c
buildtools/Cmake/test_prog/prog_snprintf.c
buildtools/Cmake/test_prog/prog_stackgrowth.c
buildtools/Cmake/test_prog/prog_stacksetup.c
buildtools/Cmake/test_prog/prog_thread_storage.c
buildtools/Cmake/test_prog/prog_vsnprintf.c
buildtools/jenkins/run.sh
buildtools/pipol/rc.debian
buildtools/pipol/rc.fedora
buildtools/pipol/rc.ubuntu
contrib/benchmarking_code_block/bench.h
contrib/benchmarking_code_block/inject.h
contrib/deployment_generation/generate_random_deployment.pl
contrib/network_model/calibrate_piecewise.py
contrib/network_model/regress.py
contrib/network_model/regression2.py
contrib/network_model/smpi_calibration.c
doc/Doxyfile.in
doc/HelloWorld/HelloWorld.c
doc/doxygen/bindings.doc
doc/doxygen/inside_extending.doc
doc/doxygen/install.doc
doc/doxygen/introduction.doc
doc/doxygen/module-msg.doc
doc/doxygen/module-surf.doc
doc/doxygen/options.doc
doc/doxygen/platform.doc
doc/msg-tuto-src/masterworker0.c
doc/msg-tuto-src/masterworker1.c
doc/msg-tuto-src/masterworker2.c
doc/msg-tuto-src/masterworker3.c
doc/msg-tuto-src/masterworker4.c
examples/java/async/AsyncTest.java
examples/java/async/FinalizeTask.java
examples/java/async/Forwarder.java
examples/java/async/Master.java
examples/java/async/Slave.java
examples/java/async/async.tesh
examples/java/bittorrent/Bittorrent.java
examples/java/bittorrent/Common.java
examples/java/bittorrent/Connection.java
examples/java/bittorrent/MessageTask.java
examples/java/bittorrent/Peer.java
examples/java/bittorrent/Tracker.java
examples/java/bittorrent/TrackerTask.java
examples/java/bittorrent/generate.py
examples/java/chord/Chord.java
examples/java/chord/ChordTask.java
examples/java/chord/Common.java
examples/java/chord/FindSuccessorAnswerTask.java
examples/java/chord/FindSuccessorTask.java
examples/java/chord/GetPredecessorAnswerTask.java
examples/java/chord/GetPredecessorTask.java
examples/java/chord/Node.java
examples/java/chord/NotifyTask.java
examples/java/cloud/Cloud.java
examples/java/cloud/FinalizeTask.java
examples/java/cloud/Master.java
examples/java/cloud/Slave.java
examples/java/cloud/cloud.tesh
examples/java/cloud/migration/CMakeLists.txt [new file with mode: 0644]
examples/java/cloud/migration/Daemon.java [new file with mode: 0644]
examples/java/cloud/migration/Main.java [new file with mode: 0644]
examples/java/cloud/migration/Test.java [new file with mode: 0644]
examples/java/cloud/migration/XVM.java [new file with mode: 0644]
examples/java/cloud/migration/deploy_simple.xml [new file with mode: 0644]
examples/java/cloud/migration/migration.tesh [new file with mode: 0644]
examples/java/cloud/migration/platform_simple.xml [new file with mode: 0644]
examples/java/commTime/CommTimeTest.java
examples/java/commTime/FinalizeTask.java
examples/java/commTime/Master.java
examples/java/commTime/Slave.java
examples/java/io/IO.java
examples/java/io/Node.java
examples/java/kademlia/Answer.java
examples/java/kademlia/Bucket.java
examples/java/kademlia/Common.java
examples/java/kademlia/Contact.java
examples/java/kademlia/FindNodeAnswerTask.java
examples/java/kademlia/FindNodeTask.java
examples/java/kademlia/Kademlia.java
examples/java/kademlia/KademliaTask.java
examples/java/kademlia/Node.java
examples/java/kademlia/PingAnswerTask.java
examples/java/kademlia/PingTask.java
examples/java/kademlia/RoutingTable.java
examples/java/master_slave_bypass/FinalizeTask.java
examples/java/master_slave_bypass/Master.java
examples/java/master_slave_bypass/MsBypass.java
examples/java/master_slave_bypass/Slave.java
examples/java/master_slave_kill/FinalizeTask.java
examples/java/master_slave_kill/Master.java
examples/java/master_slave_kill/MsKill.java
examples/java/master_slave_kill/Slave.java
examples/java/masterslave/FinalizeTask.java
examples/java/masterslave/Forwarder.java
examples/java/masterslave/Master.java
examples/java/masterslave/Masterslave.java
examples/java/masterslave/Slave.java
examples/java/masterslave/masterslave.tesh
examples/java/migration/Emigrant.java
examples/java/migration/Migration.java
examples/java/migration/Policeman.java
examples/java/migration/migration.tesh
examples/java/mutualExclusion/Coordinator.java
examples/java/mutualExclusion/GrantTask.java
examples/java/mutualExclusion/MutexCentral.java
examples/java/mutualExclusion/Node.java
examples/java/mutualExclusion/ReleaseTask.java
examples/java/mutualExclusion/RequestTask.java
examples/java/pingPong/PingPongTask.java
examples/java/pingPong/PingPongTest.java
examples/java/pingPong/Receiver.java
examples/java/pingPong/Sender.java
examples/java/platform.xml
examples/java/priority/Priority.java
examples/java/priority/Test.java
examples/java/priority/priority.tesh
examples/java/startKillTime/Master.java
examples/java/startKillTime/Slave.java
examples/java/startKillTime/StartKillTime.java
examples/java/suspend/DreamMaster.java
examples/java/suspend/LazyGuy.java
examples/java/suspend/Suspend.java
examples/java/suspend/suspend.tesh
examples/java/tracing/PingPongTask.java
examples/java/tracing/Receiver.java
examples/java/tracing/Sender.java
examples/java/tracing/TracingTest.java
examples/lua/SimSplay/chord.lua
examples/lua/SimSplay/platform_script.lua
examples/lua/SimSplay/sim_splay.lua
examples/lua/SimSplay/splay_school.lua
examples/lua/bittorrent/bittorrent.lua
examples/lua/bittorrent/peer.lua
examples/lua/bittorrent/tracker.lua
examples/lua/chord/chord.lua
examples/lua/console/deploy.lua
examples/lua/console/master.lua
examples/lua/console/master_slave_bypass.lua
examples/lua/console/platform.lua
examples/lua/console/slave.lua
examples/lua/kademlia/kademlia.lua
examples/lua/kademlia/routing_table.lua
examples/lua/kademlia/tools.lua
examples/lua/masterslave/master.lua
examples/lua/masterslave/master_slave.lua
examples/lua/masterslave/platform.lua
examples/lua/masterslave/slave.lua
examples/lua/multi_matrix/mult_matrix.lua
examples/lua/multi_matrix/receiver.lua
examples/lua/multi_matrix/sender.lua
examples/lua/splaySim/master.lua
examples/lua/splaySim/slave.lua
examples/lua/splaySim/splay_ctrl.lua
examples/lua/splaySim/splay_deploy_masterslave.lua
examples/lua/splaySim/splay_platform.lua
examples/lua/state_cloner/duplicated_globals.lua
examples/lua/tracing/master.lua
examples/lua/tracing/master_slave_trace.lua
examples/lua/tracing/slave.lua
examples/msg/actions/actions.c
examples/msg/bittorrent/bittorrent.c
examples/msg/bittorrent/bittorrent.h
examples/msg/bittorrent/bittorrent_platfgen.c
examples/msg/bittorrent/connection.c
examples/msg/bittorrent/connection.h
examples/msg/bittorrent/generate.py
examples/msg/bittorrent/messages.c
examples/msg/bittorrent/messages.h
examples/msg/bittorrent/peer.c
examples/msg/bittorrent/peer.h
examples/msg/bittorrent/tracker.c
examples/msg/bittorrent/tracker.h
examples/msg/chainsend/broadcaster.c
examples/msg/chainsend/broadcaster.h
examples/msg/chainsend/chainsend.c
examples/msg/chainsend/common.c
examples/msg/chainsend/common.h
examples/msg/chainsend/generate_deployment_file.rb
examples/msg/chainsend/iterator.c
examples/msg/chainsend/iterator.h
examples/msg/chainsend/messages.c
examples/msg/chainsend/messages.h
examples/msg/chainsend/peer.c
examples/msg/chainsend/peer.h
examples/msg/chord/chord.c
examples/msg/chord/chord.tesh
examples/msg/chord/chord_crosstraffic.tesh
examples/msg/chord/generate.py
examples/msg/cloud/CMakeLists.txt
examples/msg/cloud/bound.c [new file with mode: 0644]
examples/msg/cloud/masterslave_virtual_machines.c [deleted file]
examples/msg/cloud/masterslave_virtual_machines.tesh [deleted file]
examples/msg/cloud/masterslave_virtual_machines.xml [deleted file]
examples/msg/cloud/migrate_vm.c [new file with mode: 0644]
examples/msg/cloud/multicore.c [new file with mode: 0644]
examples/msg/cloud/multicore_plat.xml [new file with mode: 0644]
examples/msg/cloud/scale.c [new file with mode: 0644]
examples/msg/cloud/simple_plat.xml [new file with mode: 0644]
examples/msg/cloud/simple_vm.c [new file with mode: 0644]
examples/msg/cloud/simple_vm.tesh [new file with mode: 0644]
examples/msg/cloud/two_tasks_vm.c [new file with mode: 0644]
examples/msg/cloud/two_tasks_vm.tesh [new file with mode: 0644]
examples/msg/energy/e1/e1.c
examples/msg/energy/e1/pstate.tesh
examples/msg/energy/e2/e2.c
examples/msg/energy/e2/energy_consumption.tesh
examples/msg/energy/e3/concurrent_tasks.tesh
examples/msg/energy/e3/e3.c
examples/msg/gpu/test_MSG_gpu_task_create.c
examples/msg/gtnets/gtnets.c
examples/msg/icomms/peer.c
examples/msg/icomms/peer2.c
examples/msg/icomms/peer3.c
examples/msg/io/CMakeLists.txt
examples/msg/io/file.c
examples/msg/io/file_unlink.c
examples/msg/io/io.tesh
examples/msg/io/storage.c [new file with mode: 0644]
examples/msg/io/storage.tesh [new file with mode: 0644]
examples/msg/kademlia/answer.c
examples/msg/kademlia/answer.h
examples/msg/kademlia/common.h
examples/msg/kademlia/generate.py
examples/msg/kademlia/kademlia.c
examples/msg/kademlia/kademlia.h
examples/msg/kademlia/node.c
examples/msg/kademlia/node.h
examples/msg/kademlia/routing_table.c
examples/msg/kademlia/routing_table.h
examples/msg/kademlia/task.c
examples/msg/kademlia/task.h
examples/msg/masterslave/masterslave_arg.c
examples/msg/masterslave/masterslave_bypass.c
examples/msg/masterslave/masterslave_cluster.c
examples/msg/masterslave/masterslave_failure.c
examples/msg/masterslave/masterslave_failure_platfgen.c
examples/msg/masterslave/masterslave_forwarder.c
examples/msg/masterslave/masterslave_kill.c
examples/msg/masterslave/masterslave_mailbox.c
examples/msg/masterslave/masterslave_platfgen.c
examples/msg/mc/bugged1.c
examples/msg/mc/bugged1.tesh
examples/msg/mc/bugged1_liveness.c
examples/msg/mc/bugged1_liveness.h
examples/msg/mc/bugged1_liveness.tesh
examples/msg/mc/bugged1_liveness_visited.tesh
examples/msg/mc/bugged2.c
examples/msg/mc/bugged2.tesh
examples/msg/mc/bugged2_liveness.c
examples/msg/mc/bugged2_liveness.h
examples/msg/mc/bugged3.c
examples/msg/mc/centralized_mutex.c
examples/msg/mc/electric_fence.c
examples/msg/migration/migration.c
examples/msg/ns3/ns3.c
examples/msg/ns3/ns3.tesh
examples/msg/parallel_task/parallel_task.c
examples/msg/parallel_task/test_ptask.c
examples/msg/pastry/pastry.c
examples/msg/pmm/msg_pmm.c
examples/msg/priority/priority.c
examples/msg/properties/msg_prop.c
examples/msg/semaphores/synchro.c
examples/msg/sendrecv/sendrecv.c
examples/msg/start_kill_time/sk_time.c
examples/msg/suspend/suspend.c
examples/msg/token_ring/ring_call.c
examples/msg/token_ring/token_bypass.c
examples/msg/token_ring/token_ring.tesh
examples/msg/tracing/categories.c
examples/msg/tracing/link_srcdst_user_variables.c
examples/msg/tracing/link_user_variables.c
examples/msg/tracing/ms.c
examples/msg/tracing/procmig.c
examples/msg/tracing/simple.c
examples/msg/tracing/trace_platform.c
examples/msg/tracing/user_variables.c
examples/platforms/conf/transform_optorsim_platform.pl
examples/platforms/content/small_content.txt [new file with mode: 0644]
examples/platforms/generation_scripts/create_hierarchical_clusters.pl
examples/platforms/generation_scripts/enhancedDTDwithHierarchicalCluster.pl
examples/platforms/generation_scripts/generate_g5k_platform.pl
examples/platforms/generation_scripts/generate_g5k_platform_cabinets.pl
examples/platforms/storage.xml
examples/platforms/syscoord/generate_peer_platform.pl
examples/platforms/torus_cluster.xml [new file with mode: 0644]
examples/scala/masterslave/masterslave.tesh
examples/simdag/dax/dax_test.c
examples/simdag/dax/generate_forkjoin.pl
examples/simdag/dax/generate_strassen.pl
examples/simdag/dot/dot_test.c
examples/simdag/dot/dot_test2.c
examples/simdag/dot/ptg_test.c
examples/simdag/dot/simulate_dot.c
examples/simdag/goal/goal_test.c
examples/simdag/io/io.tesh
examples/simdag/io/sd_io.c
examples/simdag/metaxml/sd_meta.c
examples/simdag/platform_script.lua
examples/simdag/properties/sd_prop.c
examples/simdag/scheduling/minmin_test.c
examples/simdag/sd_avail.c
examples/simdag/sd_comm_throttling.c
examples/simdag/sd_fail.c
examples/simdag/sd_seq_access.c
examples/simdag/sd_test.c
examples/simdag/sd_test2.c
examples/simdag/sd_typed_tasks_test.c
examples/simdag/simdag_trace.c
examples/simdag/test_simdag.in
examples/smpi/MM/2.5D_MM.c
examples/smpi/MM/2.5D_MM.h
examples/smpi/MM/MM_mpi.c
examples/smpi/MM/Matrix_init.c
examples/smpi/MM/Matrix_init.h
examples/smpi/MM/Summa.c
examples/smpi/MM/Summa.h
examples/smpi/bcbench.c
examples/smpi/energy/energy.tesh
examples/smpi/energy/f77/energy.tesh
examples/smpi/energy/f77/sef.f
examples/smpi/energy/f90/energy.tesh
examples/smpi/energy/f90/sef90.f90
examples/smpi/energy/platform.xml
examples/smpi/energy/se.c
examples/smpi/mc/bugged1.c
examples/smpi/mc/bugged1_liveness.c
examples/smpi/mc/bugged2.c
examples/smpi/mvmul.c
examples/smpi/replay/replay.c
examples/smpi/replay/smpi_replay.tesh
examples/smpi/tracing/smpi_traced.c
examples/smpi/tracing/smpi_traced.tesh
examples/smpi/tracing/smpi_traced_simple.c
examples/xbt/sem_basic.c
examples/xbt/sem_sched.c
include/instr/instr.h
include/instr/jedule/jedule_events.h
include/instr/jedule/jedule_output.h
include/instr/jedule/jedule_platform.h
include/instr/jedule/jedule_sd_binding.h
include/msg/datatypes.h
include/msg/msg.h
include/simdag/datatypes.h
include/simdag/simdag.h
include/simgrid.h [new file with mode: 0644]
include/simgrid/datatypes.h [new file with mode: 0644]
include/simgrid/modelchecker.h
include/simgrid/platf.h
include/simgrid/platf_generator.h
include/simgrid/plugins.h [new file with mode: 0644]
include/simgrid/simix.h
include/simgrid_config.h.in
include/smpi/mpi.h
include/smpi/mpif.h.in
include/smpi/smpi.h
include/smpi/smpi_cocci.h
include/smpi/smpi_main.h
include/smpi/smpif.h.in
include/surf/simgrid_dtd.h
include/surf/surf_routing.h
include/surf/surfxml_parse.h
include/xbt.h
include/xbt/RngStream.h
include/xbt/asserts.h
include/xbt/automaton.h
include/xbt/config.h
include/xbt/cunit.h
include/xbt/dict.h
include/xbt/dynar.h
include/xbt/ex.h
include/xbt/fifo.h
include/xbt/function_types.h
include/xbt/graph.h
include/xbt/graphxml_parse.h
include/xbt/hash.h
include/xbt/heap.h
include/xbt/lib.h
include/xbt/log.h
include/xbt/mallocator.h
include/xbt/matrix.h
include/xbt/misc.h
include/xbt/mmalloc.h
include/xbt/module.h
include/xbt/parmap.h
include/xbt/peer.h
include/xbt/queue.h
include/xbt/replay.h
include/xbt/set.h
include/xbt/setset.h
include/xbt/str.h
include/xbt/strbuff.h
include/xbt/swag.h
include/xbt/synchro_core.h
include/xbt/sysdep.h
include/xbt/virtu.h
include/xbt/win32_ucontext.h
include/xbt/xbt_os_thread.h
src/bindings/bindings_global.c
src/bindings/java/MANIFEST.MF.in [moved from src/bindings/java/MANIFEST.MF with 98% similarity]
src/bindings/java/jmsg.c
src/bindings/java/jmsg.h
src/bindings/java/jmsg_as.c
src/bindings/java/jmsg_as.h
src/bindings/java/jmsg_comm.c
src/bindings/java/jmsg_comm.h
src/bindings/java/jmsg_file.c
src/bindings/java/jmsg_file.h
src/bindings/java/jmsg_host.c
src/bindings/java/jmsg_host.h
src/bindings/java/jmsg_process.c
src/bindings/java/jmsg_process.h
src/bindings/java/jmsg_rngstream.c
src/bindings/java/jmsg_rngstream.h
src/bindings/java/jmsg_synchro.c
src/bindings/java/jmsg_synchro.h
src/bindings/java/jmsg_task.c
src/bindings/java/jmsg_task.h
src/bindings/java/jmsg_vm.c
src/bindings/java/jmsg_vm.h
src/bindings/java/jtrace.c
src/bindings/java/jtrace.h
src/bindings/java/jxbt_utilities.c
src/bindings/java/jxbt_utilities.h
src/bindings/java/org/simgrid/msg/As.java
src/bindings/java/org/simgrid/msg/Comm.java
src/bindings/java/org/simgrid/msg/File.java
src/bindings/java/org/simgrid/msg/Host.java
src/bindings/java/org/simgrid/msg/HostFailureException.java
src/bindings/java/org/simgrid/msg/HostNotFoundException.java
src/bindings/java/org/simgrid/msg/JniException.java
src/bindings/java/org/simgrid/msg/Msg.java
src/bindings/java/org/simgrid/msg/MsgException.java
src/bindings/java/org/simgrid/msg/Mutex.java
src/bindings/java/org/simgrid/msg/NativeException.java
src/bindings/java/org/simgrid/msg/NativeLib.java [new file with mode: 0644]
src/bindings/java/org/simgrid/msg/Process.java
src/bindings/java/org/simgrid/msg/ProcessKilledError.java
src/bindings/java/org/simgrid/msg/ProcessNotFoundException.java
src/bindings/java/org/simgrid/msg/RngStream.java
src/bindings/java/org/simgrid/msg/Semaphore.java
src/bindings/java/org/simgrid/msg/Task.java
src/bindings/java/org/simgrid/msg/TaskCancelledException.java
src/bindings/java/org/simgrid/msg/TimeoutException.java
src/bindings/java/org/simgrid/msg/TransferFailureException.java
src/bindings/java/org/simgrid/msg/VM.java
src/bindings/java/org/simgrid/trace/Trace.java
src/bindings/java/smx_context_cojava.c
src/bindings/java/smx_context_cojava.h
src/bindings/java/smx_context_java.c
src/bindings/java/smx_context_java.h
src/bindings/lua/lua_comm.c
src/bindings/lua/lua_host.c
src/bindings/lua/lua_platf.c
src/bindings/lua/lua_private.h
src/bindings/lua/lua_process.c
src/bindings/lua/lua_state_cloner.c
src/bindings/lua/lua_state_cloner.h
src/bindings/lua/lua_task.c
src/bindings/lua/lua_utils.c
src/bindings/lua/lua_utils.h
src/bindings/lua/simgrid_lua.c
src/bindings/lua/simgrid_lua.h
src/context_sysv_config.h.in
src/include/instr/instr_interface.h
src/include/mc/datatypes.h
src/include/mc/mc.h
src/include/simgrid/platf_interface.h
src/include/simgrid/sg_config.h
src/include/smpi/smpi_interface.h
src/include/surf/datatypes.h
src/include/surf/maxmin.h
src/include/surf/random_mgr.h
src/include/surf/surf.h
src/include/surf/surf_resource.h
src/include/surf/surf_resource_lmm.h
src/include/surf/surfxml_parse_values.h
src/include/surf/trace_mgr.h
src/include/xbt/wine_dbghelp.h
src/include/xbt/xbt_os_time.h
src/instr/instr_TI_trace.c
src/instr/instr_config.c
src/instr/instr_interface.c
src/instr/instr_paje_containers.c
src/instr/instr_paje_header.c
src/instr/instr_paje_trace.c
src/instr/instr_paje_types.c
src/instr/instr_paje_values.c
src/instr/instr_private.h
src/instr/instr_resource_utilization.c
src/instr/instr_trace.c
src/instr/jedule/jedule_events.c
src/instr/jedule/jedule_output.c
src/instr/jedule/jedule_platform.c
src/instr/jedule/jedule_sd_binding.c
src/mc/mc_checkpoint.c
src/mc/mc_compare.c
src/mc/mc_dpor.c
src/mc/mc_dwarf.c
src/mc/mc_global.c
src/mc/mc_hash.c
src/mc/mc_liveness.c
src/mc/mc_memory.c
src/mc/mc_pair.c
src/mc/mc_private.h
src/mc/mc_request.c
src/mc/mc_state.c
src/mc/memory_map.c
src/mk_supernovae.pl [deleted file]
src/msg/instr_msg_process.c
src/msg/instr_msg_task.c
src/msg/instr_msg_vm.c
src/msg/msg_actions.c
src/msg/msg_deployment.c
src/msg/msg_environment.c
src/msg/msg_global.c
src/msg/msg_gos.c
src/msg/msg_host.c
src/msg/msg_io.c
src/msg/msg_mailbox.c
src/msg/msg_mailbox.h
src/msg/msg_new_api.c
src/msg/msg_private.h
src/msg/msg_process.c
src/msg/msg_synchro.c
src/msg/msg_task.c
src/msg/msg_vm.c
src/portable.h
src/simdag/dax_dtd.c
src/simdag/dax_dtd.h
src/simdag/instr_sd_task.c
src/simdag/private.h
src/simdag/sd_daxloader.c
src/simdag/sd_dotloader.c
src/simdag/sd_global.c
src/simdag/sd_link.c
src/simdag/sd_task.c
src/simdag/sd_workstation.c
src/simgrid/sg_config.c
src/simix/simcalls.in [new file with mode: 0644]
src/simix/simcalls.py [new file with mode: 0755]
src/simix/simcalls_generated_args_getter_setter.h [new file with mode: 0644]
src/simix/simcalls_generated_body.c [new file with mode: 0644]
src/simix/simcalls_generated_case.c [new file with mode: 0644]
src/simix/simcalls_generated_enum.h [new file with mode: 0644]
src/simix/simcalls_generated_res_getter_setter.h [new file with mode: 0644]
src/simix/simcalls_generated_string.c [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_deployment.c
src/simix/smx_environment.c
src/simix/smx_global.c
src/simix/smx_host.c
src/simix/smx_host_private.h
src/simix/smx_io.c
src/simix/smx_io_private.h
src/simix/smx_network.c
src/simix/smx_network_private.h
src/simix/smx_new_api.c
src/simix/smx_new_api_private.h
src/simix/smx_private.h
src/simix/smx_process.c
src/simix/smx_process_private.h
src/simix/smx_smurf.c
src/simix/smx_smurf_private.h
src/simix/smx_synchro.c
src/simix/smx_synchro_private.h
src/simix/smx_user.c
src/simix/smx_vm.c [new file with mode: 0644]
src/smpi/colls/allgather-2dmesh.c
src/smpi/colls/allgather-3dmesh.c
src/smpi/colls/allgather-GB.c
src/smpi/colls/allgather-NTSLR-NB.c
src/smpi/colls/allgather-NTSLR.c
src/smpi/colls/allgather-SMP-NTS.c
src/smpi/colls/allgather-bruck.c
src/smpi/colls/allgather-loosely-lr.c
src/smpi/colls/allgather-ompi-neighborexchange.c
src/smpi/colls/allgather-pair.c
src/smpi/colls/allgather-rdb.c
src/smpi/colls/allgather-rhv.c
src/smpi/colls/allgather-ring.c
src/smpi/colls/allgather-smp-simple.c
src/smpi/colls/allgather-spreading-simple.c
src/smpi/colls/allgatherv-GB.c
src/smpi/colls/allgatherv-mpich-rdb.c
src/smpi/colls/allgatherv-mpich-ring.c
src/smpi/colls/allgatherv-ompi-bruck.c
src/smpi/colls/allgatherv-ompi-neighborexchange.c
src/smpi/colls/allgatherv-pair.c
src/smpi/colls/allgatherv-ring.c
src/smpi/colls/allreduce-lr.c
src/smpi/colls/allreduce-ompi-ring-segmented.c
src/smpi/colls/allreduce-rab-rdb.c
src/smpi/colls/allreduce-rab1.c
src/smpi/colls/allreduce-rab2.c
src/smpi/colls/allreduce-rdb.c
src/smpi/colls/allreduce-redbcast.c
src/smpi/colls/allreduce-smp-binomial-pipeline.c
src/smpi/colls/allreduce-smp-binomial.c
src/smpi/colls/allreduce-smp-rdb.c
src/smpi/colls/allreduce-smp-rsag-lr.c
src/smpi/colls/allreduce-smp-rsag-rab.c
src/smpi/colls/allreduce-smp-rsag.c
src/smpi/colls/alltoall-2dmesh.c
src/smpi/colls/alltoall-3dmesh.c
src/smpi/colls/alltoall-bruck.c
src/smpi/colls/alltoall-pair-light-barrier.c
src/smpi/colls/alltoall-pair-mpi-barrier.c
src/smpi/colls/alltoall-pair-one-barrier.c
src/smpi/colls/alltoall-pair.c
src/smpi/colls/alltoall-rdb.c
src/smpi/colls/alltoall-ring-light-barrier.c
src/smpi/colls/alltoall-ring-mpi-barrier.c
src/smpi/colls/alltoall-ring-one-barrier.c
src/smpi/colls/alltoall-ring.c
src/smpi/colls/alltoallv-bruck.c
src/smpi/colls/alltoallv-ompi-basic-linear.c
src/smpi/colls/alltoallv-pair-light-barrier.c
src/smpi/colls/alltoallv-pair-mpi-barrier.c
src/smpi/colls/alltoallv-pair-one-barrier.c
src/smpi/colls/alltoallv-pair.c
src/smpi/colls/alltoallv-ring-light-barrier.c
src/smpi/colls/alltoallv-ring-mpi-barrier.c
src/smpi/colls/alltoallv-ring-one-barrier.c
src/smpi/colls/alltoallv-ring.c
src/smpi/colls/barrier-ompi.c
src/smpi/colls/bcast-NTSB.c
src/smpi/colls/bcast-NTSL-Isend.c
src/smpi/colls/bcast-NTSL.c
src/smpi/colls/bcast-SMP-binary.c
src/smpi/colls/bcast-SMP-binomial.c
src/smpi/colls/bcast-SMP-linear.c
src/smpi/colls/bcast-arrival-pattern-aware-wait.c
src/smpi/colls/bcast-arrival-pattern-aware.c
src/smpi/colls/bcast-arrival-scatter.c
src/smpi/colls/bcast-binomial-tree.c
src/smpi/colls/bcast-flattree-pipeline.c
src/smpi/colls/bcast-flattree.c
src/smpi/colls/bcast-ompi-pipeline.c
src/smpi/colls/bcast-ompi-split-bintree.c
src/smpi/colls/bcast-scatter-LR-allgather.c
src/smpi/colls/bcast-scatter-rdb-allgather.c
src/smpi/colls/coll_tuned_topo.c
src/smpi/colls/coll_tuned_topo.h
src/smpi/colls/colls.h
src/smpi/colls/colls_global.c
src/smpi/colls/colls_private.h
src/smpi/colls/gather-ompi.c
src/smpi/colls/reduce-NTSL.c
src/smpi/colls/reduce-arrival-pattern-aware.c
src/smpi/colls/reduce-binomial.c
src/smpi/colls/reduce-flat-tree.c
src/smpi/colls/reduce-ompi.c
src/smpi/colls/reduce-scatter-gather.c
src/smpi/colls/reduce_scatter-mpich.c
src/smpi/colls/reduce_scatter-ompi.c
src/smpi/colls/scatter-ompi.c
src/smpi/colls/smpi_automatic_selector.c
src/smpi/colls/smpi_mpich_selector.c
src/smpi/colls/smpi_openmpi_selector.c
src/smpi/fixsrc.pl
src/smpi/instr_smpi.c
src/smpi/patch_source.sh
src/smpi/private.h
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_dvfs.c
src/smpi/smpi_f77.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_mpi_dt_private.h
src/smpi/smpi_pmpi.c
src/smpi/smpi_replay.c
src/smpi/smpicc.in
src/smpi/smpif2c.in
src/smpi/smpif90.in
src/smpi/smpiff.in
src/smpi/smpirun.in
src/smpi/smpitools.sh [new file with mode: 0644]
src/surf/cpu_cas01.c [deleted file]
src/surf/cpu_cas01.cpp [new file with mode: 0644]
src/surf/cpu_cas01.hpp [new file with mode: 0644]
src/surf/cpu_cas01_private.h [deleted file]
src/surf/cpu_interface.cpp [new file with mode: 0644]
src/surf/cpu_interface.hpp [new file with mode: 0644]
src/surf/cpu_ti.c [deleted file]
src/surf/cpu_ti.cpp [new file with mode: 0644]
src/surf/cpu_ti.hpp [new file with mode: 0644]
src/surf/cpu_ti_private.h [deleted file]
src/surf/fair_bottleneck.cpp [moved from src/surf/fair_bottleneck.c with 85% similarity]
src/surf/gtnets/gtnets_interface.cc
src/surf/gtnets/gtnets_interface.h
src/surf/gtnets/gtnets_simulator.cc
src/surf/gtnets/gtnets_simulator.h
src/surf/gtnets/gtnets_topology.cc
src/surf/gtnets/gtnets_topology.h
src/surf/instr_routing.c
src/surf/instr_surf.c
src/surf/lagrange.cpp [moved from src/surf/lagrange.c with 95% similarity]
src/surf/maxmin.cpp [moved from src/surf/maxmin.c with 81% similarity]
src/surf/maxmin_private.hpp [moved from src/surf/maxmin_private.h with 90% similarity]
src/surf/network.c [deleted file]
src/surf/network_cm02.cpp [new file with mode: 0644]
src/surf/network_cm02.hpp [new file with mode: 0644]
src/surf/network_constant.c [deleted file]
src/surf/network_constant.cpp [new file with mode: 0644]
src/surf/network_constant.hpp [new file with mode: 0644]
src/surf/network_gtnets.c [deleted file]
src/surf/network_gtnets.cpp [new file with mode: 0644]
src/surf/network_gtnets.hpp [new file with mode: 0644]
src/surf/network_gtnets_private.h [deleted file]
src/surf/network_interface.cpp [new file with mode: 0644]
src/surf/network_interface.hpp [new file with mode: 0644]
src/surf/network_ns3.cpp [moved from src/surf/network_ns3.c with 51% similarity]
src/surf/network_ns3.hpp [new file with mode: 0644]
src/surf/network_ns3_private.h [deleted file]
src/surf/network_private.h [deleted file]
src/surf/network_smpi.cpp [new file with mode: 0644]
src/surf/network_smpi.hpp [new file with mode: 0644]
src/surf/new_model.c [deleted file]
src/surf/new_model_private.h [deleted file]
src/surf/ns3/my-point-to-point-helper.cc
src/surf/ns3/my-point-to-point-helper.h
src/surf/ns3/ns3_interface.cc
src/surf/ns3/ns3_interface.h
src/surf/ns3/ns3_simulator.cc
src/surf/ns3/ns3_simulator.h
src/surf/ns3/red-queue.cc
src/surf/ns3/red-queue.h
src/surf/platf_generator.c
src/surf/platf_generator_private.h
src/surf/plugins/energy.cpp [new file with mode: 0644]
src/surf/plugins/energy.hpp [new file with mode: 0644]
src/surf/random_mgr.c
src/surf/sg_platf.c
src/surf/simgrid.dtd
src/surf/simgrid_dtd.c
src/surf/storage.c [deleted file]
src/surf/storage_interface.cpp [new file with mode: 0644]
src/surf/storage_interface.hpp [new file with mode: 0644]
src/surf/storage_n11.cpp [new file with mode: 0644]
src/surf/storage_n11.hpp [new file with mode: 0644]
src/surf/storage_private.h [deleted file]
src/surf/surf.c [deleted file]
src/surf/surf_action.c [deleted file]
src/surf/surf_c_bindings.cpp [new file with mode: 0644]
src/surf/surf_interface.cpp [new file with mode: 0644]
src/surf/surf_interface.hpp [new file with mode: 0644]
src/surf/surf_model.c [deleted file]
src/surf/surf_private.h
src/surf/surf_routing.cpp [moved from src/surf/surf_routing.c with 66% similarity]
src/surf/surf_routing.hpp [new file with mode: 0644]
src/surf/surf_routing_cluster.c [deleted file]
src/surf/surf_routing_cluster.cpp [new file with mode: 0644]
src/surf/surf_routing_cluster.hpp [new file with mode: 0644]
src/surf/surf_routing_cluster_torus.cpp [new file with mode: 0644]
src/surf/surf_routing_cluster_torus.hpp [new file with mode: 0644]
src/surf/surf_routing_dijkstra.cpp [moved from src/surf/surf_routing_dijkstra.c with 56% similarity]
src/surf/surf_routing_dijkstra.hpp [new file with mode: 0644]
src/surf/surf_routing_floyd.cpp [moved from src/surf/surf_routing_floyd.c with 53% similarity]
src/surf/surf_routing_floyd.hpp [new file with mode: 0644]
src/surf/surf_routing_full.cpp [moved from src/surf/surf_routing_full.c with 56% similarity]
src/surf/surf_routing_full.hpp [new file with mode: 0644]
src/surf/surf_routing_generic.cpp [moved from src/surf/surf_routing_generic.c with 57% similarity]
src/surf/surf_routing_generic.hpp [new file with mode: 0644]
src/surf/surf_routing_none.c [deleted file]
src/surf/surf_routing_none.cpp [new file with mode: 0644]
src/surf/surf_routing_none.hpp [new file with mode: 0644]
src/surf/surf_routing_private.hpp [moved from src/surf/surf_routing_private.h with 94% similarity]
src/surf/surf_routing_vivaldi.c [deleted file]
src/surf/surf_routing_vivaldi.cpp [new file with mode: 0644]
src/surf/surf_routing_vivaldi.hpp [new file with mode: 0644]
src/surf/surfxml_parse.c
src/surf/surfxml_parseplatf.c
src/surf/trace_mgr.c
src/surf/trace_mgr_private.h
src/surf/vm_workstation_hl13.cpp [new file with mode: 0644]
src/surf/vm_workstation_hl13.hpp [new file with mode: 0644]
src/surf/vm_workstation_interface.cpp [new file with mode: 0644]
src/surf/vm_workstation_interface.hpp [new file with mode: 0644]
src/surf/workstation.c [deleted file]
src/surf/workstation_clm03.cpp [new file with mode: 0644]
src/surf/workstation_clm03.hpp [new file with mode: 0644]
src/surf/workstation_interface.cpp [new file with mode: 0644]
src/surf/workstation_interface.hpp [new file with mode: 0644]
src/surf/workstation_ptask_L07.c [deleted file]
src/surf/workstation_ptask_L07.cpp [new file with mode: 0644]
src/surf/workstation_ptask_L07.hpp [new file with mode: 0644]
src/win32/config.h
src/xbt/RngStream.c
src/xbt/automaton/automaton.c
src/xbt/automaton/automaton_lexer.yy.c
src/xbt/automaton/automatonparse_promela.c
src/xbt/automaton/parserPromela.lex
src/xbt/automaton/parserPromela.tab.cacc
src/xbt/automaton/parserPromela.tab.hacc
src/xbt/automaton/parserPromela.yacc
src/xbt/backtrace_dummy.c
src/xbt/backtrace_linux.c
src/xbt/backtrace_windows.c
src/xbt/config.c
src/xbt/cunit.c
src/xbt/dict.c
src/xbt/dict_cursor.c
src/xbt/dict_elm.c
src/xbt/dict_multi.c
src/xbt/dict_private.h
src/xbt/dynar.c
src/xbt/ex.c
src/xbt/ex_interface.h
src/xbt/fifo.c
src/xbt/fifo_private.h
src/xbt/graph.c
src/xbt/graph_private.h
src/xbt/graphxml.c
src/xbt/graphxml_parse.c
src/xbt/heap.c
src/xbt/heap_private.h
src/xbt/lib.c
src/xbt/log.c
src/xbt/log_private.h
src/xbt/mallocator.c
src/xbt/mallocator_private.h
src/xbt/mmalloc/mfree.c
src/xbt/mmalloc/mm.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/mmalloc/mrealloc.c
src/xbt/parmap.c
src/xbt/set.c
src/xbt/setset.c
src/xbt/setset_private.h
src/xbt/snprintf.c
src/xbt/swag.c
src/xbt/win32_ucontext.c
src/xbt/xbt_log_appender_file.c
src/xbt/xbt_log_layout_format.c
src/xbt/xbt_log_layout_simple.c
src/xbt/xbt_main.c
src/xbt/xbt_matrix.c
src/xbt/xbt_os_thread.c
src/xbt/xbt_os_time.c
src/xbt/xbt_peer.c
src/xbt/xbt_queue.c
src/xbt/xbt_replay.c
src/xbt/xbt_sg_stubs.c
src/xbt/xbt_sg_synchro.c
src/xbt/xbt_sha.c
src/xbt/xbt_str.c
src/xbt/xbt_strbuff.c
src/xbt/xbt_virtu.c
src/xbt_modinter.h
teshsuite/msg/get_sender.c
teshsuite/msg/pid.c
teshsuite/msg/storage/CMakeLists.txt
teshsuite/msg/storage/platform.xml
teshsuite/msg/storage/storage.tesh [deleted file]
teshsuite/msg/storage/storage_basic.c [moved from teshsuite/msg/storage/storage.c with 68% similarity]
teshsuite/msg/storage/storage_basic.tesh [new file with mode: 0644]
teshsuite/msg/storage/storage_content_c.txt
teshsuite/msg/storage/storage_content_s1.txt
teshsuite/msg/storage/storage_content_s2.txt
teshsuite/msg/trace/test_trace_integration.c
teshsuite/simdag/availability/availability_test.c
teshsuite/simdag/basic0.c
teshsuite/simdag/basic1.c
teshsuite/simdag/basic2.c
teshsuite/simdag/basic3.c
teshsuite/simdag/basic4.c
teshsuite/simdag/basic5.c
teshsuite/simdag/basic6.c
teshsuite/simdag/incomplete.c
teshsuite/simdag/network/mxn/test_intra_all2all.c
teshsuite/simdag/network/mxn/test_intra_independent_comm.c
teshsuite/simdag/network/mxn/test_intra_scatter.c
teshsuite/simdag/network/p2p/test_latency1.c
teshsuite/simdag/network/p2p/test_latency2.c
teshsuite/simdag/network/p2p/test_latency3.c
teshsuite/simdag/network/p2p/test_latency_bound.c
teshsuite/simdag/network/test_reinit_costs.c
teshsuite/simdag/partask/test_comp_only_par.c
teshsuite/simdag/partask/test_comp_only_seq.c
teshsuite/simdag/platforms/Evaluate_get_route_time.c
teshsuite/simdag/platforms/Evaluate_parse_time.c
teshsuite/simdag/platforms/basic_link_test.c
teshsuite/simdag/platforms/basic_parsing_test.c
teshsuite/simdag/platforms/basic_tracing.c
teshsuite/simdag/platforms/flatifier.c
teshsuite/simdag/platforms/flatifier.tesh
teshsuite/simdag/platforms/is_router_test.c
teshsuite/simix/check_defaults.c
teshsuite/smpi/TI_output.tesh
teshsuite/smpi/allgather_coll.c
teshsuite/smpi/allgather_coll.tesh
teshsuite/smpi/allgatherv_coll.c
teshsuite/smpi/allgatherv_coll.tesh
teshsuite/smpi/allreduce.c
teshsuite/smpi/allreduce_coll.c
teshsuite/smpi/allreduce_coll.tesh
teshsuite/smpi/allreduce_coll_large.tesh
teshsuite/smpi/alltoall2.c
teshsuite/smpi/alltoall_basic.c
teshsuite/smpi/alltoall_coll.c
teshsuite/smpi/alltoall_coll.tesh
teshsuite/smpi/alltoallv_coll.c
teshsuite/smpi/alltoallv_coll.tesh
teshsuite/smpi/barrier.c
teshsuite/smpi/barrier_coll.tesh
teshsuite/smpi/bcast.c
teshsuite/smpi/bcast.tesh
teshsuite/smpi/bcast_coll.c
teshsuite/smpi/bcast_coll.tesh
teshsuite/smpi/compute.c
teshsuite/smpi/compute.tesh
teshsuite/smpi/compute2.c
teshsuite/smpi/compute3.c
teshsuite/smpi/dsend.c
teshsuite/smpi/gather_coll.c
teshsuite/smpi/gather_coll.tesh
teshsuite/smpi/get_processor_name.c
teshsuite/smpi/hvector.tesh
teshsuite/smpi/hvector_test.c
teshsuite/smpi/indexed.tesh
teshsuite/smpi/indexed_test.c
teshsuite/smpi/mpich3-test/CMakeLists.txt
teshsuite/smpi/mpich3-test/attr/CMakeLists.txt
teshsuite/smpi/mpich3-test/coll/CMakeLists.txt
teshsuite/smpi/mpich3-test/coll/allgatherv4.c
teshsuite/smpi/mpich3-test/comm/CMakeLists.txt
teshsuite/smpi/mpich3-test/datatype/CMakeLists.txt
teshsuite/smpi/mpich3-test/datatype/contents.c
teshsuite/smpi/mpich3-test/datatype/testlist
teshsuite/smpi/mpich3-test/f77/attr/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/coll/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/coll/exscanf.f
teshsuite/smpi/mpich3-test/f77/comm/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/datatype/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/ext/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/init/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/pt2pt/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/util/CMakeLists.txt [new file with mode: 0644]
teshsuite/smpi/mpich3-test/f77/util/mtestf.f
teshsuite/smpi/mpich3-test/f90/coll/CMakeLists.txt
teshsuite/smpi/mpich3-test/f90/coll/exscanf90.f90
teshsuite/smpi/mpich3-test/f90/coll/redscatf90.f90
teshsuite/smpi/mpich3-test/f90/datatype/CMakeLists.txt
teshsuite/smpi/mpich3-test/f90/init/CMakeLists.txt
teshsuite/smpi/mpich3-test/f90/pt2pt/CMakeLists.txt
teshsuite/smpi/mpich3-test/f90/util/CMakeLists.txt [new file with mode: 0644]
teshsuite/smpi/mpich3-test/group/CMakeLists.txt
teshsuite/smpi/mpich3-test/init/CMakeLists.txt
teshsuite/smpi/mpich3-test/pt2pt/CMakeLists.txt
teshsuite/smpi/mpich3-test/util/mtest.c
teshsuite/smpi/pingpong.c
teshsuite/smpi/pt2pt.tesh
teshsuite/smpi/reduce.c
teshsuite/smpi/reduce.tesh
teshsuite/smpi/reduce_coll.c
teshsuite/smpi/reduce_coll.tesh
teshsuite/smpi/reduce_scatter_coll.c
teshsuite/smpi/reduce_scatter_coll.tesh
teshsuite/smpi/scatter.c
teshsuite/smpi/scatter_coll.tesh
teshsuite/smpi/sendrecv.c
teshsuite/smpi/sendtest.c
teshsuite/smpi/shared.c
teshsuite/smpi/shared.tesh
teshsuite/smpi/split.c
teshsuite/smpi/struct.tesh
teshsuite/smpi/struct_test.c
teshsuite/smpi/ttest01.c
teshsuite/smpi/vector.tesh
teshsuite/smpi/vector_test.c
teshsuite/xbt/CMakeLists.txt
teshsuite/xbt/log_large_test.c
teshsuite/xbt/mmalloc_test.c
teshsuite/xbt/parallel_log_crashtest.c
teshsuite/xbt/parmap_test.c
testsuite/surf/lmm_usage.c
testsuite/surf/maxmin_bench.c
testsuite/surf/surf_usage.c
testsuite/surf/surf_usage2.c
testsuite/surf/trace_usage.c
testsuite/xbt/graphxml_usage.c
testsuite/xbt/heap_bench.c
testsuite/xbt/log_usage.c
testsuite/xbt/parmap_bench.c
tools/MSG_visualization/colorize.pl
tools/MSG_visualization/trace2fig.pl
tools/check_dist_archive
tools/check_dist_archive.exclude
tools/doxygen/fig2dev_postprocessor.pl
tools/doxygen/index_create.pl
tools/doxygen/xbt_log_extract_hierarchy.pl
tools/fix-paje-trace.sh
tools/generate-multi-jar.py [new file with mode: 0755]
tools/graphicator/graphicator.c
tools/indent
tools/normalize-pointers.py [new file with mode: 0755]
tools/platf_route_rulebased2full.py
tools/sg_unit_extractor.pl
tools/sg_xml_unit_converter.py
tools/simgrid.supp
tools/simgrid_update_xml.pl
tools/spell/lspell.pl
tools/spell/lspell2.pl
tools/spell/sg_stopwords.txt
tools/spell/spell.sh
tools/tesh/colorize.pl
tools/tesh/run_context.c
tools/tesh/run_context.h
tools/tesh/signal.c
tools/tesh/tesh.1
tools/tesh/tesh.c
tools/tesh/tesh.h
tools/update_copyright_header [new file with mode: 0755]

index 2d167a8..12679b9 100644 (file)
--- a/.cproject
+++ b/.cproject
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?fileVersion 5.0.0?>
-
-<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage2">
+<?fileVersion 5.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage2">
        <storageModule moduleId="org.eclipse.cdt.core.settings">
-               <cconfiguration id="cdt.managedbuild.toolchain.gnu.base.1353180652">
-                       <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1353180652_org.eclipse.cdt.core.settings" id="cdt.managedbuild.toolchain.gnu.base.1353180652" name="Default"/>
-                       <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1353180652_cdtBuildSystem" version="4.0.0"/>
-                       <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1353180652_org.eclipse.cdt.core.externalSettings"/>
+               <cconfiguration id="cdt.managedbuild.toolchain.gnu.base.1053321950">
+                       <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1053321950_org.eclipse.cdt.core.settings" id="cdt.managedbuild.toolchain.gnu.base.1053321950" name="Default"/>
+                       <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1053321950_cdtBuildSystem" version="4.0.0"/>
+                       <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1053321950_org.eclipse.cdt.core.externalSettings"/>
                </cconfiguration>
        </storageModule>
-       <storageModule moduleId="org.eclipse.cdt.core.pathentry">
-               <pathentry kind="mac" name="main" path="" value="smpi_simulated_main"/>
-               <pathentry include="/usr/include/lua5.1" kind="inc" path="" system="true"/>
-               <pathentry include="/usr/include" kind="inc" path="" system="true"/>
-               <pathentry base-path="simgrid" include="include" kind="inc" path="" system="true"/>
-               <pathentry base-path="simgrid" include="src/include" kind="inc" path="" system="true"/>
-               <pathentry base-path="simgrid" include="src" kind="inc" path="" system="true"/>
-               <pathentry excluding="**/CMakeFiles/" kind="out" path=""/>
-               <pathentry kind="src" path=""/>
-       </storageModule>
        <storageModule moduleId="cdtBuildSystem" version="4.0.0">
-               <project id="simgrid.null.697056024" name="simgrid"/>
+               <project id="simgrid.null.1652888656" name="simgrid"/>
+       </storageModule>
+       <storageModule moduleId="scannerConfiguration">
+               <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
        </storageModule>
+       <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
        <storageModule moduleId="refreshScope" versionNumber="2">
                <configuration configurationName="Default">
                        <resource resourceType="PROJECT" workspacePath="/simgrid"/>
                </configuration>
        </storageModule>
-       <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
-       <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
-       <storageModule moduleId="scannerConfiguration">
-               <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
-               <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-                       <buildOutputProvider>
-                               <openAction enabled="true" filePath=""/>
-                               <parser enabled="true"/>
-                       </buildOutputProvider>
-                       <scannerInfoProvider id="specsFile">
-                               <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="/usr/bin/gcc" useDefault="true"/>
-                               <parser enabled="true"/>
-                       </scannerInfoProvider>
-               </profile>
-               <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-                       <buildOutputProvider>
-                               <openAction enabled="true" filePath=""/>
-                               <parser enabled="true"/>
-                       </buildOutputProvider>
-                       <scannerInfoProvider id="makefileGenerator">
-                               <runAction arguments="-f ${project_name}_scd.mk" command="/usr/bin/make" useDefault="true"/>
-                               <parser enabled="true"/>
-                       </scannerInfoProvider>
-               </profile>
-               <scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.base.1353180652;cdt.managedbuild.toolchain.gnu.base.1353180652.1797514135;cdt.managedbuild.tool.gnu.c.compiler.base.2037544368;cdt.managedbuild.tool.gnu.c.compiler.input.1851803849">
-                       <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
-                       <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-                               <buildOutputProvider>
-                                       <openAction enabled="true" filePath=""/>
-                                       <parser enabled="true"/>
-                               </buildOutputProvider>
-                               <scannerInfoProvider id="specsFile">
-                                       <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="/usr/bin/gcc" useDefault="true"/>
-                                       <parser enabled="true"/>
-                               </scannerInfoProvider>
-                       </profile>
-                       <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-                               <buildOutputProvider>
-                                       <openAction enabled="true" filePath=""/>
-                                       <parser enabled="true"/>
-                               </buildOutputProvider>
-                               <scannerInfoProvider id="makefileGenerator">
-                                       <runAction arguments="-f ${project_name}_scd.mk" command="/usr/bin/make" useDefault="true"/>
-                                       <parser enabled="true"/>
-                               </scannerInfoProvider>
-                       </profile>
-               </scannerConfigBuildInfo>
-               <scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.base.1353180652;cdt.managedbuild.toolchain.gnu.base.1353180652.1797514135;cdt.managedbuild.tool.gnu.cpp.compiler.base.1129818443;cdt.managedbuild.tool.gnu.cpp.compiler.input.500761747">
-                       <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
-                       <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-                               <buildOutputProvider>
-                                       <openAction enabled="true" filePath=""/>
-                                       <parser enabled="true"/>
-                               </buildOutputProvider>
-                               <scannerInfoProvider id="specsFile">
-                                       <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="/usr/bin/gcc" useDefault="true"/>
-                                       <parser enabled="true"/>
-                               </scannerInfoProvider>
-                       </profile>
-                       <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-                               <buildOutputProvider>
-                                       <openAction enabled="true" filePath=""/>
-                                       <parser enabled="true"/>
-                               </buildOutputProvider>
-                               <scannerInfoProvider id="makefileGenerator">
-                                       <runAction arguments="-f ${project_name}_scd.mk" command="/usr/bin/make" useDefault="true"/>
-                                       <parser enabled="true"/>
-                               </scannerInfoProvider>
-                       </profile>
-               </scannerConfigBuildInfo>
-       </storageModule>
+       <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
 </cproject>
index dbcfa12..1dfeaaf 100644 (file)
@@ -36,10 +36,9 @@ examples/lua/console/simgrid.so
 simgrid.jar
 
 ################################################
-### Units and supernovae files
+### Unit files
 src/simgrid_units_main.c
 src/*_unit.c
-src/supernovae_*.c
 
 ################################################
 ### Generated files
@@ -133,7 +132,6 @@ examples/msg/simulation.trace
 examples/msg/toto.txt
 examples/msg/z_gtnets.trace
 examples/msg/gpu/test_MSG_gpu_task_create
-examples/msg/cloud/masterslave_virtual_machines
 examples/msg/energy/e1/e1
 examples/msg/energy/e2/e2
 examples/msg/energy/e3/e3
index d935a7a..a3b80ff 100644 (file)
--- a/.project
+++ b/.project
@@ -1,91 +1,27 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-  <name>simgrid</name>
-  <comment></comment>
-  <projects>
-  </projects>
-  <buildSpec>
-    <buildCommand>
-      <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
-      <triggers>clean,full,incremental,</triggers>
-      <arguments>
-        <dictionary>
-          <key>?name?</key>
-          <value></value>
-        </dictionary>
-        <dictionary>
-          <key>org.eclipse.cdt.make.core.append_environment</key>
-          <value>true</value>
-        </dictionary>
-        <dictionary>
-          <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
-          <value>all</value>
-        </dictionary>
-        <dictionary>
-          <key>org.eclipse.cdt.make.core.buildArguments</key>
-          <value></value>
-        </dictionary>
-        <dictionary>
-          <key>org.eclipse.cdt.make.core.buildCommand</key>
-          <value>make</value>
-        </dictionary>
-        <dictionary>
-          <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
-          <value>clean</value>
-        </dictionary>
-        <dictionary>
-          <key>org.eclipse.cdt.make.core.contents</key>
-          <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
-        </dictionary>
-        <dictionary>
-          <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
-          <value>false</value>
-        </dictionary>
-        <dictionary>
-          <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
-          <value>true</value>
-        </dictionary>
-        <dictionary>
-          <key>org.eclipse.cdt.make.core.enableFullBuild</key>
-          <value>true</value>
-        </dictionary>
-        <dictionary>
-          <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
-          <value>all</value>
-        </dictionary>
-        <dictionary>
-          <key>org.eclipse.cdt.make.core.stopOnError</key>
-          <value>true</value>
-        </dictionary>
-        <dictionary>
-          <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
-          <value>true</value>
-        </dictionary>
-      </arguments>
-    </buildCommand>
-    <buildCommand>
-      <name>org.rubypeople.rdt.core.rubybuilder</name>
-      <arguments>
-      </arguments>
-    </buildCommand>
-    <buildCommand>
-      <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
-      <triggers>full,incremental,</triggers>
-      <arguments>
-      </arguments>
-    </buildCommand>
-    <buildCommand>
-      <name>org.eclipse.jdt.core.javabuilder</name>
-      <arguments>
-      </arguments>
-    </buildCommand>
-  </buildSpec>
-  <natures>
-    <nature>org.eclipse.cdt.core.ccnature</nature>
-    <nature>org.eclipse.cdt.core.cnature</nature>
-    <nature>org.rubypeople.rdt.core.rubynature</nature>
-    <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
-    <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
-    <nature>org.eclipse.jdt.core.javanature</nature>
-  </natures>
+       <name>simgrid</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+                       <triggers>clean,full,incremental,</triggers>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+                       <triggers>full,incremental,</triggers>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.cdt.core.cnature</nature>
+               <nature>org.eclipse.cdt.core.ccnature</nature>
+               <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+               <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+       </natures>
 </projectDescription>
index 747d9fc..cfae0bb 100644 (file)
@@ -7,6 +7,9 @@ project(SimGrid C)
 if (enable_gtnets OR enable_ns3 OR enable_model-checking)
   enable_language(CXX)
 endif()
+
+enable_language(CXX)
+
 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
@@ -47,11 +50,12 @@ set(CMAKE_Fortran_LINK_FLAGS "" CACHE TYPE INTERNAL FORCE)
 # 3.9.0 -> release 3.9
 # 3.9.90 -> release 3.10pre1
 # 3.10.0 -> release 3.10
+# 3.11.0 -> release 3.11
 
 set(SIMGRID_VERSION_MAJOR "3")
-set(SIMGRID_VERSION_MINOR "10")
+set(SIMGRID_VERSION_MINOR "11")
 set(SIMGRID_VERSION_PATCH "0")
-set(SIMGRID_VERSION_EXTRA "-rc2") # Extra words to add to version string (e.g. -rc1)
+set(SIMGRID_VERSION_EXTRA "-devel") # Extra words to add to version string (e.g. -rc1)
 
 set(SIMGRID_VERSION_DATE  "2013") # Year for copyright information
 
@@ -166,9 +170,9 @@ if(WIN32)
     message(FATAL_ERROR "Please use MinGW to compile SimGrid!")
   endif()
 
-  if(ARCH_32_BITS)     ### Arch 32bits
+  if(ARCH_32_BITS)      ### Arch 32bits
     set(_WIN32 1)
-  else()       ### Arch 64bits
+  else()        ### Arch 64bits
     set(_WIN64 1)
   endif()
 
@@ -180,18 +184,18 @@ if(WIN32)
 
   set(_XBT_WIN32 1)
 
-  message(STATUS "C_COMPILER                   ${CMAKE_C_COMPILER} ${COMPILER_C_VERSION}")
-  message(STATUS "CXX_COMPILER                 ${CMAKE_CXX_COMPILER} ${COMPILER_CXX_VERSION}")
-  message(STATUS "CMAKE_RC_COMPILER            ${CMAKE_RC_COMPILER}")
-  message(STATUS "INCLUDE                      ${CMAKE_INCLUDE_WIN}")
-  message(STATUS "LIB                          ${CMAKE_LIB_WIN}")
-  message(STATUS "MAKE_PROGRAM                 ${CMAKE_MAKE_PROGRAM}")
-  message(STATUS "CMAKE_BUILD_TOOL             ${CMAKE_BUILD_TOOL}")
-  message(STATUS "LINKER                       ${CMAKE_LINKER}")
-  message(STATUS "CMAKE_GENERATOR              ${CMAKE_GENERATOR}")
-  message(STATUS "BORLAND                      ${BORLAND}")
-  message(STATUS "VISUALC                      ${MSVC}")
-  message(STATUS "GNUC                         ${CMAKE_COMPILER_IS_GNUCC}")
+  message(STATUS "C_COMPILER                    ${CMAKE_C_COMPILER} ${COMPILER_C_VERSION}")
+  message(STATUS "CXX_COMPILER                  ${CMAKE_CXX_COMPILER} ${COMPILER_CXX_VERSION}")
+  message(STATUS "CMAKE_RC_COMPILER             ${CMAKE_RC_COMPILER}")
+  message(STATUS "INCLUDE                       ${CMAKE_INCLUDE_WIN}")
+  message(STATUS "LIB                           ${CMAKE_LIB_WIN}")
+  message(STATUS "MAKE_PROGRAM                  ${CMAKE_MAKE_PROGRAM}")
+  message(STATUS "CMAKE_BUILD_TOOL              ${CMAKE_BUILD_TOOL}")
+  message(STATUS "LINKER                        ${CMAKE_LINKER}")
+  message(STATUS "CMAKE_GENERATOR               ${CMAKE_GENERATOR}")
+  message(STATUS "BORLAND                       ${BORLAND}")
+  message(STATUS "VISUALC                       ${MSVC}")
+  message(STATUS "GNUC                          ${CMAKE_COMPILER_IS_GNUCC}")
 
 endif()
 
diff --git a/COPYING b/COPYING
index d8bb07b..6ff568f 100644 (file)
--- a/COPYING
+++ b/COPYING
@@ -91,8 +91,8 @@ include/xbt/mmalloc.h
 =========================================================================
 
 In order to use ucontext with windows platform we had those files :
-       src/xbt/win32_ucontext.c
-       include/xbt/win32_ucontext.h
+        src/xbt/win32_ucontext.c
+        include/xbt/win32_ucontext.h
 
 Their copyright is the following:
 
@@ -155,8 +155,8 @@ List of files:
 
 =========================================================================
 
-The SMPI testsuite was borrowed from the MPICH3 test files. It can be found 
-inside ./teshsuite/smpi/mpich3-test. Some of the collective algorithms 
+The SMPI testsuite was borrowed from the MPICH3 test files. It can be found
+inside ./teshsuite/smpi/mpich3-test. Some of the collective algorithms
 available in src/smpi/colls/ were also copied from MPICH
 
 
@@ -166,7 +166,7 @@ available in src/smpi/colls/ were also copied from MPICH
  */
 <------------- COPYRIGHT file in the top-level ----------------------->
 
-                                 COPYRIGHT
+                                  COPYRIGHT
 
 The following is a notice of limited availability of the code, and disclaimer
 which must be included in the prologue of the code and in all source listings
@@ -187,7 +187,7 @@ Department of Computer Science
 University of Illinois at Urbana-Champaign
 
 
-                             GOVERNMENT LICENSE
+                              GOVERNMENT LICENSE
 
 Portions of this material resulted from work developed under a U.S.
 Government Contract and are subject to the following license: the Government
@@ -195,7 +195,7 @@ is granted for itself and others acting on its behalf a paid-up, nonexclusive,
 irrevocable worldwide license in this computer software to reproduce, prepare
 derivative works, and perform publicly and display publicly.
 
-                                 DISCLAIMER
+                                  DISCLAIMER
 
 This computer code material was prepared, in part, as an account of work
 sponsored by an agency of the United States Government.  Neither the United
@@ -289,12 +289,12 @@ Copyright (c) 2004-2010 The Trustees of Indiana University and Indiana
 Copyright (c) 2004-2010 The University of Tennessee and The University
                         of Tennessee Research Foundation.  All rights
                         reserved.
-Copyright (c) 2004-2010 High Performance Computing Center Stuttgart, 
+Copyright (c) 2004-2010 High Performance Computing Center Stuttgart,
                         University of Stuttgart.  All rights reserved.
 Copyright (c) 2004-2008 The Regents of the University of California.
                         All rights reserved.
 Copyright (c) 2006-2010 Los Alamos National Security, LLC.  All rights
-                        reserved. 
+                        reserved.
 Copyright (c) 2006-2010 Cisco Systems, Inc.  All rights reserved.
 Copyright (c) 2006-2010 Voltaire, Inc. All rights reserved.
 Copyright (c) 2006-2011 Sandia National Laboratories. All rights reserved.
@@ -304,7 +304,7 @@ Copyright (c) 2006-2010 The University of Houston. All rights reserved.
 Copyright (c) 2006-2009 Myricom, Inc.  All rights reserved.
 Copyright (c) 2007-2008 UT-Battelle, LLC. All rights reserved.
 Copyright (c) 2007-2010 IBM Corporation.  All rights reserved.
-Copyright (c) 1998-2005 Forschungszentrum Juelich, Juelich Supercomputing 
+Copyright (c) 1998-2005 Forschungszentrum Juelich, Juelich Supercomputing
                         Centre, Federal Republic of Germany
 Copyright (c) 2005-2008 ZIH, TU Dresden, Federal Republic of Germany
 Copyright (c) 2007      Evergrid, Inc. All rights reserved.
diff --git a/COPYRIGHT.template b/COPYRIGHT.template
new file mode 100644 (file)
index 0000000..29aeb32
--- /dev/null
@@ -0,0 +1,5 @@
+/* Copyright (c) 2014. 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. */
index 0b9ae9e..4df2e78 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,79 @@
-SimGrid (3.10-rc2) unstable; urgency=low
+SimGrid (3.11) NOT RELEASED; urgency=low
+
+ TENTATIVE RELEASE GOALS for 3.11:
+ * Switch to tesh.pl, and kill the now unused parts of xbt that seem fragile
+ * Clean up CMake files (may need a full rewrite).
+   Non exhaustive list of subgoals:
+   - Use genuine cmake mechanisms and variables when available,
+     instead of reinventing the wheel.
+   - Correctly determine system and architecture (e.g. x32).
+   - Correctly determine compiler type and version (e.g. clang).
+   - Correctly set compiler flags according to compiler type and version.
+   - Correctly set compiler flags for C++, Java, and Fortran compilers too.
+   - Use git to generate the dist archive.  Either use git-archive to
+     generate the tarball, or keep using cmake -E tar, but use git-ls-files
+     to get the list of files to pack.
+
+ Tools:
+ * Normalizing pointers addresses tool for better diff between logs
+
+ Examples:
+ * Add cloud examples using new VMs
+   - examples/msg/cloud/two_tasks_vm.tesh
+   - examples/msg/cloud/simple_vm.tesh
+   - examples/java/cloud/cloud.tesh
+   - examples/java/cloud/migration/migration.tesh
+
+ MSG:
+ * Add virtual machine
+   - creation of a VM on a PM
+   - migration of a VM from a PM to another PM
+
+ Simcalls:
+ * Simcalls are now generated by a python script
+   - generate files include by simgrid
+   - check that all the functions exists and propose prototypes
+ * Clean simcalls
+   - remove sem_destroy, file_set_data, comm_destroy, vm_set_state,
+     host_set_data, host_get_data
+
+ SURF:
+ * Translate surf models from C to C++
+   - Generic classes for all models: Model, Resource, Action
+   - A generic interface for each kind of model (cpu, network, storage
+     workstation, workstationvm)
+   - C bindings
+ * Translate surf routings from C to C++
+ * Add callbacks using sigc++ or boost::signals2
+   - Add callback functions for resource creation/destruction
+   - Add callback finctions for action state change
+   - Handle Energy as a plugin
+ * Replace swag by boost::intrusive
+ * Add new routing model for torus clusters
+ * More documentation
+
+ SMPI:
+ * hostfiles support host:nb_processes construct to deploy several processes on
+   one node
+ * Collective communication algorithms should not crash if used with
+   improper number of nodes and report the error.
+
+ Java:
+ * New cmake option, enable_lib_in_jar, to control whether native libraries are
+   copied into simgrid.jar or not (ON by default).  Use this option if you want
+   to reduce the size of the installed simgrid.jar, *and* the native libraries
+   are kept installed elsewhere.
+
+ Build System:
+ * Supernovae build mode is definitively removed. It was used to improve
+   inlining and inter-module optimizations. It is nowadays superseded by
+   link-time optimizations commonly available in compilers.
+ * Update ns3 find lib
+ * Add boost dependency for surf++
+
+ -- $date Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
+
+SimGrid (3.10) stable; urgency=low
 
  The Clean Diaper Release, a.k.a. SimGrid is leak-free.
 
@@ -88,13 +163,14 @@ SimGrid (3.10-rc2) unstable; urgency=low
 
  Build System:
  * Lots of memory leaks were corrected in this release.
+   There is no known memory leaks anymore, in all of our 600+ tests.
  * New command line option --version, to get SimGrid version information.
    Packagers may want to add extra words to SIMGRID_VERSION_EXTRA defined in
    CMakeLists.txt.
  * Supernovae builds are deprecated, and expected to be removed in the next
    version of SimGrid.
 
- -- Fri Nov  8 23:54:56 CET 2013 Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
+ -- Sun Nov 17 00:26:44 CET 2013 Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
 
 SimGrid (3.9) stable; urgency=low
 
diff --git a/NEWS b/NEWS
index d601309..716b19f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,8 +1,20 @@
+                    _               _____  _ _
+__   _____ _ __ ___(_) ___  _ __   |___ / / / |
+\ \ / / _ \ '__/ __| |/ _ \| '_ \    |_ \ | | |
+ \ V /  __/ |  \__ \ | (_) | | | |  ___) || | |
+  \_/ \___|_|  |___/_|\___/|_| |_| |____(_)_|_|
+
+The Class Release. Major changes:
+ * Surf is now in C++ and documented
+ * Virtual Machine model
+ * Surf callbacks to create plugins
+ * Simcalls generated by python script
                     _               _____  _  ___
 __   _____ _ __ ___(_) ___  _ __   |___ / / |/ _ \
 \ \ / / _ \ '__/ __| |/ _ \| '_ \    |_ \ | | | | |
  \ V /  __/ |  \__ \ | (_) | | | |  ___) || | |_| |
   \_/ \___|_|  |___/_|\___/|_| |_| |____(_)_|\___/
+                Nov 17 2013
 
 The Clean Diaper Release, a.k.a. SimGrid is leak-free. Major changes:
 
index 35c9a55..c78b39b 100644 (file)
@@ -26,7 +26,7 @@ The tree is not split on projects, but on file finality:
  testsuite/ -> The more test the better.
                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
+               All tests should be listed in run_test.in so that they get
                run on 'make check'.
 
  examples/ -> Supposed to be copy/pastable by the user, so keep it clear and
@@ -34,11 +34,11 @@ The tree is not split on projects, but on file finality:
                 public headers here.
 
  teshsuite/ -> The more test the better. Put in there any strange test
-              doing things that the users are not supposed to do,
-              just to see if our framework is robust to incorrect and
-              unusual behaviors. All tests written in this section
-              should leverage our tesh(1) utility.
+               doing things that the users are not supposed to do,
+               just to see if our framework is robust to incorrect and
+               unusual behaviors. All tests written in this section
+               should leverage our tesh(1) utility.
+
  testsuite/ -> Old test suite, that should be converted to tesh and
                moved to teshsuite at some point.
 
@@ -92,7 +92,7 @@ bug. Please report it (or fix it yourself if you can).
 **
 *****************************************************
 
-MALLOC:
+MALLOC
  Don't use it, or you'll have to check the result (and do some dirty stuff
  on AIX). Use xbt_malloc (or even better, xbt_new) instead.
 
@@ -102,6 +102,12 @@ SIZE_T (FIXME: obsolete?)
  do cast it to unsigned long before printing (and use %lu),
  or use %zu.
 
+INTEGERS
+ Please avoid to use long ints.  This is the source of many compatibility
+ problems between 32 bits and 64 bits archs.  Either use plain ints (generally
+ 32 bits wide) or long long ints (64 bits wide, at least).  At last resort
+ consider using integer types defined in C99 by <stdint.h>.
+
 PRINTF pointer difference (FIXME: advertise %td instead?)
  printf ("diff = %ld\n", (long) (pointer2 - pointer1));
 
@@ -208,4 +214,3 @@ investigating the portability of the thing to windows.
   deactivate the whole logging mechanism, switching to printfs
   instead. SimGrid becomes incredibly verbose when doing so, but it
   you let you fixing the dynars.
-  
\ No newline at end of file
index ee959c3..9d5814c 100644 (file)
@@ -28,6 +28,13 @@ else()
 SET(TESH_COMMAND ${CMAKE_BINARY_DIR}/bin/tesh)
 endif()
 
+#some tests may take forever on non futexes systems, using busy_wait with n cores < n workers
+# default to posix for these tests if futexes are not supported
+if(NOT HAVE_FUTEX_H) 
+SET(CONTEXTS_SYNCHRO --cfg contexts/synchro:posix)
+endif()
+
 INCLUDE(CTest)
 ENABLE_TESTING()
 
@@ -62,7 +69,7 @@ if(NOT enable_memcheck)
   # teshsuite/xbt
   ADD_TEST(xbt-log-large                        ${TESH_COMMAND} ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/log_large_test.tesh)
   ADD_TEST(xbt-log-parallel                     ${TESH_COMMAND} ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/parallel_log_crashtest.tesh)
-  IF(HAVE_MMAP)
+  IF(HAVE_MMALLOC)
     IF(${ARCH_32_BITS})
       ADD_TEST(xbt-mmalloc-32                   ${TESH_COMMAND} ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/mmalloc_32.tesh)
     ELSE()
@@ -73,18 +80,18 @@ if(NOT enable_memcheck)
 
   # BEGIN CONTEXTS FACTORY
   if(HAVE_RAWCTX)
-    ADD_TEST(simix_factory_default              ${TESH_COMMAND} ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/factory_raw.tesh)
+    ADD_TEST(simix-factory-default              ${TESH_COMMAND} ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/factory_raw.tesh)
   elseif(CONTEXT_UCONTEXT)
-    ADD_TEST(simix_factory_default              ${TESH_COMMAND} ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/factory_ucontext.tesh)
+    ADD_TEST(simix-factory-default              ${TESH_COMMAND} ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/factory_ucontext.tesh)
   else()
-    ADD_TEST(simix_factory_default              ${TESH_COMMAND} ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/factory_thread.tesh)
+    ADD_TEST(simix-factory-default              ${TESH_COMMAND} ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/factory_thread.tesh)
   endif()
-  ADD_TEST(simix_factory_thread                 ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/factory_thread.tesh)
+  ADD_TEST(simix-factory-thread                 ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/factory_thread.tesh)
   if(HAVE_RAWCTX)
-    ADD_TEST(simix_factory_raw                  ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/factory_raw.tesh)
+    ADD_TEST(simix-factory-raw                  ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/factory_raw.tesh)
   endif()
   if(CONTEXT_UCONTEXT)
-    ADD_TEST(simix_factory_ucontext             ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/factory_ucontext.tesh)
+    ADD_TEST(simix-factory-ucontext             ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/factory_ucontext.tesh)
   endif()
 
   ADD_TEST(tesh-msg-get-sender-thread           ${TESH_COMMAND} ${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)
@@ -138,6 +145,7 @@ if(NOT enable_memcheck)
 
   # MSG examples
   ADD_TEST(msg-file                             ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/ --setenv srcdir=${CMAKE_HOME_DIRECTORY}/ --cd ${CMAKE_HOME_DIRECTORY}/examples/ ${CMAKE_HOME_DIRECTORY}/examples/msg/io/io.tesh)
+  ADD_TEST(msg-storage                          ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/ --setenv srcdir=${CMAKE_HOME_DIRECTORY}/ --cd ${CMAKE_HOME_DIRECTORY}/examples/ ${CMAKE_HOME_DIRECTORY}/examples/msg/io/storage.tesh)
   ADD_TEST(msg-start-kill-time                  ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/ --setenv srcdir=${CMAKE_HOME_DIRECTORY}/ --cd ${CMAKE_HOME_DIRECTORY}/examples/ ${CMAKE_HOME_DIRECTORY}/examples/msg/start_kill_time/start_kill_time.tesh)
   ADD_TEST(msg-chainsend                        ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chainsend --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/chainsend --cd ${CMAKE_HOME_DIRECTORY}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/chainsend/chainsend.tesh)
 
@@ -163,7 +171,9 @@ if(NOT enable_memcheck)
 
   ADD_TEST(msg-masterslave-vivaldi-thread       ${TESH_COMMAND} ${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-masterslave-virtual-machines-thread ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/masterslave_virtual_machines.tesh)
+  ADD_TEST(msg-cloud-two-tasks-vm-thread ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/cloud/ --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/ --cd ${CMAKE_BINARY_DIR}/examples/msg/cloud/ ${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/two_tasks_vm.tesh)
+  
+  ADD_TEST(msg-cloud-simple-vm-thread ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/cloud/ --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/ --cd ${CMAKE_BINARY_DIR}/examples/msg/cloud/ ${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/simple_vm.tesh)
 
   if(CONTEXT_UCONTEXT)
     ADD_TEST(msg-sendrecv-CLM03-ucontext        ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_CLM03.tesh)
@@ -187,7 +197,8 @@ if(NOT enable_memcheck)
 
     ADD_TEST(msg-masterslave-vivaldi-ucontext   ${TESH_COMMAND} ${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-masterslave-virtual-machines-ucontext ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/masterslave_virtual_machines.tesh)
+    ADD_TEST(msg-cloud-two-tasks-vm-ucontext ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/cloud/ --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/ --cd ${CMAKE_BINARY_DIR}/examples/msg/cloud/ ${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/two_tasks_vm.tesh)
+     ADD_TEST(msg-cloud-simple-vm-ucontext ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/cloud/ --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/ --cd ${CMAKE_BINARY_DIR}/examples/msg/cloud/ ${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/simple_vm.tesh)
   endif()
 
   if(HAVE_RAWCTX)
@@ -212,7 +223,8 @@ if(NOT enable_memcheck)
 
     ADD_TEST(msg-masterslave-vivaldi-raw        ${TESH_COMMAND} ${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-masterslave-virtual-machines-raw ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/masterslave_virtual_machines.tesh)
+    ADD_TEST(msg-cloud-two-tasks-vm-raw ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/cloud/ --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/ --cd ${CMAKE_BINARY_DIR}/examples/msg/cloud/ ${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/two_tasks_vm.tesh)
+  ADD_TEST(msg-cloud-simple-vm-raw ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/cloud/ --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/ --cd ${CMAKE_BINARY_DIR}/examples/msg/cloud/ ${CMAKE_HOME_DIRECTORY}/examples/msg/cloud/simple_vm.tesh)
   endif()
 
   ADD_TEST(msg-energy-pstates-thread            ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/energy/e1/pstate.tesh)
@@ -231,12 +243,12 @@ if(NOT enable_memcheck)
     ADD_TEST(msg-energy-concurrent-tasks-raw    ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/energy/e3/concurrent_tasks.tesh)
   endif()
 
-  ADD_TEST(msg-storage-thread                   ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/storage/storage.tesh)
+  ADD_TEST(msg-storage-basic-thread                   ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/storage/storage_basic.tesh)
   if(CONTEXT_UCONTEXT)
-    ADD_TEST(msg-storage-ucontext               ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/storage/storage.tesh)
+    ADD_TEST(msg-storage-basic-ucontext               ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/storage/storage_basic.tesh)
   endif()
   if(HAVE_RAWCTX)
-    ADD_TEST(msg-storage-raw                    ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/storage/storage.tesh)
+    ADD_TEST(msg-storage-basic-raw                    ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/storage/storage_basic.tesh)
   endif()
 
   ADD_TEST(msg-token-ring-thread                ${TESH_COMMAND} ${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)
@@ -255,13 +267,13 @@ if(NOT enable_memcheck)
   ADD_TEST(msg-actions-thread                   ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/actions --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/actions actions.tesh)
   ADD_TEST(msg-trace-thread                     ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/msg --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/msg trace/trace.tesh)
   ADD_TEST(msg-chord-no-crosstraffic-thread     ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord.tesh)
-  ADD_TEST(msg-chord-no-crosstraffic-thread-parallel ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --cfg contexts/nthreads:4 --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord.tesh)
+  ADD_TEST(msg-chord-no-crosstraffic-thread-parallel ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --cfg contexts/nthreads:4 ${CONTEXTS_SYNCHRO} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord.tesh)
   ADD_TEST(msg-chord-thread                     ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord_crosstraffic.tesh)
-  ADD_TEST(msg-chord-thread-parallel            ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --cfg contexts/nthreads:4 --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord_crosstraffic.tesh)
+  ADD_TEST(msg-chord-thread-parallel            ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --cfg contexts/nthreads:4  ${CONTEXTS_SYNCHRO} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord_crosstraffic.tesh)
   ADD_TEST(msg-bittorrent-thread                ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/bittorrent --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/bittorrent bittorrent.tesh)
-  ADD_TEST(msg-bittorrent-thread-parallel       ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/nthreads:4 --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/bittorrent --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/bittorrent bittorrent.tesh)
+  ADD_TEST(msg-bittorrent-thread-parallel       ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/nthreads:4 --cfg contexts/factory:thread ${CONTEXTS_SYNCHRO} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/bittorrent --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/bittorrent bittorrent.tesh)
   ADD_TEST(msg-kademlia-thread                  ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh)
-  ADD_TEST(msg-kademlia-thread-parallel         ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/nthreads:4 --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh)
+  ADD_TEST(msg-kademlia-thread-parallel         ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/nthreads:4 --cfg contexts/factory:thread ${CONTEXTS_SYNCHRO} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh)
 
   if(CONTEXT_UCONTEXT)
     ADD_TEST(msg-migration-ucontext             ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/migration/migration.tesh)
@@ -272,13 +284,13 @@ if(NOT enable_memcheck)
     ADD_TEST(msg-actions-ucontext               ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/actions --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/actions actions.tesh)
     ADD_TEST(msg-trace-ucontext                 ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/msg --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/msg trace/trace.tesh)
     ADD_TEST(msg-chord-no-crosstraffic-ucontext ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord.tesh)
-    ADD_TEST(msg-chord-no-crosstraffic-ucontext-parallel ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --cfg contexts/nthreads:4 --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord.tesh)
+    ADD_TEST(msg-chord-no-crosstraffic-ucontext-parallel ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --cfg contexts/nthreads:4 ${CONTEXTS_SYNCHRO} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord.tesh)
     ADD_TEST(msg-chord-ucontext                 ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord_crosstraffic.tesh)
-    ADD_TEST(msg-chord-ucontext-parallel        ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --cfg contexts/nthreads:4 --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord_crosstraffic.tesh)
+    ADD_TEST(msg-chord-ucontext-parallel        ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --cfg contexts/nthreads:4 ${CONTEXTS_SYNCHRO} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord_crosstraffic.tesh)
     ADD_TEST(msg-bittorrent-ucontext            ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/bittorrent --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/bittorrent bittorrent.tesh)
-    ADD_TEST(msg-bittorrent-ucontext-parallel   ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/nthreads:4 --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/bittorrent --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/bittorrent bittorrent.tesh)
+    ADD_TEST(msg-bittorrent-ucontext-parallel   ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/nthreads:4 ${CONTEXTS_SYNCHRO} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/bittorrent --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/bittorrent bittorrent.tesh)
     ADD_TEST(msg-kademlia-ucontext              ${TESH_COMMAND} ${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     ${TESH_COMMAND} ${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)
+    ADD_TEST(msg-kademlia-ucontext-parallel     ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/nthreads:4 ${CONTEXTS_SYNCHRO} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh)
 
   endif()
   if(HAVE_RAWCTX)
@@ -290,13 +302,13 @@ if(NOT enable_memcheck)
     ADD_TEST(msg-properties-raw                 ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/properties/msg_prop.tesh)
     ADD_TEST(msg-trace-raw                      ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/msg --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/msg trace/trace.tesh)
     ADD_TEST(msg-chord-no-crosstraffic-raw      ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord.tesh)
-    ADD_TEST(msg-chord-no-crosstraffic-raw-parallel ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --cfg contexts/nthreads:4 --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord.tesh)
+    ADD_TEST(msg-chord-no-crosstraffic-raw-parallel ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --cfg contexts/nthreads:4 ${CONTEXTS_SYNCHRO} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord.tesh)
     ADD_TEST(msg-chord-raw                      ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord_crosstraffic.tesh)
-    ADD_TEST(msg-chord-raw-parallel             ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --cfg contexts/nthreads:4 --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord_crosstraffic.tesh)
+    ADD_TEST(msg-chord-raw-parallel             ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --cfg contexts/nthreads:4 ${CONTEXTS_SYNCHRO} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/chord --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/chord chord_crosstraffic.tesh)
     ADD_TEST(msg-bittorrent-raw                 ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/bittorrent --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/bittorrent bittorrent.tesh)
-    ADD_TEST(msg-bittorrent-raw-parallel        ${TESH_COMMAND} ${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-bittorrent-raw-parallel        ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/nthreads:4 ${CONTEXTS_SYNCHRO} --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                   ${TESH_COMMAND} ${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          ${TESH_COMMAND} ${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)
+    ADD_TEST(msg-kademlia-raw-parallel          ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/nthreads:4 ${CONTEXTS_SYNCHRO} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh)
   endif()
 
   # simdag examples
@@ -368,10 +380,10 @@ if(NOT enable_memcheck)
     ADD_TEST(tracing-help                       ${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms/basic_parsing_test --help-tracing)
     ADD_TEST(tracing-ms                         ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/ms.tesh)
     ADD_TEST(tracing-simdag                     ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag_tracing.tesh)
-    ADD_TEST(tracing-trace_platform             ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/trace_platform.tesh)
-    ADD_TEST(tracing-user_variables             ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/user_variables.tesh)
-    ADD_TEST(tracing-link_user_variables        ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/link_user_variables.tesh)
-    ADD_TEST(tracing-link_srcdst_user_variables ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/link_srcdst_user_variables.tesh)
+    ADD_TEST(tracing-trace-platform             ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/trace_platform.tesh)
+    ADD_TEST(tracing-user-variables             ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/user_variables.tesh)
+    ADD_TEST(tracing-link-user-variables        ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/link_user_variables.tesh)
+    ADD_TEST(tracing-link-srcdst-user-variables ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/link_srcdst_user_variables.tesh)
     ADD_TEST(tracing-categories                 ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/categories.tesh)
     ADD_TEST(tracing-process-migration          ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/procmig.tesh)
     ADD_TEST(graphicator                        ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} --setenv bindir=${CMAKE_BINARY_DIR}/bin --cd ${CMAKE_HOME_DIRECTORY}/tools/graphicator graphicator.tesh)
@@ -497,7 +509,7 @@ if(NOT enable_memcheck)
     ENDFOREACH()
 
     FOREACH (REDUCE_SCATTER_COLL default  ompi mpich ompi_basic_recursivehalving ompi_ring mpich_noncomm mpich_pair mpich_rdb)
-      ADD_TEST(smpi-reduce_scatter-coll-${REDUCE_SCATTER_COLL} ${TESH_COMMAND} ${TESH_OPTION} --cfg smpi/reduce_scatter:${REDUCE_SCATTER_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce_scatter_coll.tesh)
+      ADD_TEST(smpi-reduce-scatter-coll-${REDUCE_SCATTER_COLL} ${TESH_COMMAND} ${TESH_OPTION} --cfg smpi/reduce_scatter:${REDUCE_SCATTER_COLL} --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce_scatter_coll.tesh)
     ENDFOREACH()
 
     FOREACH (SCATTER_COLL default  ompi mpich ompi_basic_linear ompi_binomial)
@@ -517,6 +529,15 @@ if(NOT enable_memcheck)
     ADD_TEST(smpi-mpich3-coll-ompi-thread       ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich3-test/coll perl ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/runtests -mpiexec=${CMAKE_BINARY_DIR}/smpi_script/bin/smpirun -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/coll -tests=testlist -execarg=--cfg=contexts/factory:thread -execarg=--cfg=smpi/coll_selector:ompi -execarg=--cfg=smpi/send_is_detached_thres:0)
     ADD_TEST(smpi-mpich3-coll-mpich-thread      ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich3-test/coll perl ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/runtests -mpiexec=${CMAKE_BINARY_DIR}/smpi_script/bin/smpirun -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/coll -tests=testlist -execarg=--cfg=contexts/factory:thread -execarg=--cfg=smpi/coll_selector:mpich)
     set_tests_properties(smpi-mpich3-coll-thread smpi-mpich3-coll-ompi-thread smpi-mpich3-coll-mpich-thread PROPERTIES PASS_REGULAR_EXPRESSION "tests passed!")
+    if(CONTEXT_UCONTEXT)
+      ADD_TEST(smpi-mpich3-coll-ompi-ucontext   ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich3-test/coll perl ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/runtests -mpiexec=${CMAKE_BINARY_DIR}/smpi_script/bin/smpirun -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/coll -tests=testlist -execarg=--cfg=contexts/factory:ucontext -execarg=--cfg=smpi/coll_selector:ompi -execarg=--cfg=smpi/send_is_detached_thres:0)
+      set_tests_properties(smpi-mpich3-coll-ompi-ucontext PROPERTIES PASS_REGULAR_EXPRESSION "tests passed!")
+    endif()
+    if(HAVE_RAWCTX)
+      ADD_TEST(smpi-mpich3-coll-mpich-raw       ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich3-test/coll perl ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/runtests -mpiexec=${CMAKE_BINARY_DIR}/smpi_script/bin/smpirun -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/coll -tests=testlist -execarg=--cfg=contexts/factory:raw -execarg=--cfg=smpi/coll_selector:mpich)
+      set_tests_properties(smpi-mpich3-coll-mpich-raw PROPERTIES PASS_REGULAR_EXPRESSION "tests passed!")
+    endif()
+
     if(HAVE_RAWCTX)
       ADD_TEST(smpi-mpich3-attr-raw             ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich3-test/attr perl ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/runtests -mpiexec=${CMAKE_BINARY_DIR}/smpi_script/bin/smpirun -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/attr -tests=testlist -execarg=--cfg=contexts/factory:raw)
       ADD_TEST(smpi-mpich3-comm-raw             ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich3-test/comm perl ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/runtests -mpiexec=${CMAKE_BINARY_DIR}/smpi_script/bin/smpirun -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/comm -tests=testlist -execarg=--cfg=contexts/factory:raw)
@@ -540,15 +561,16 @@ if(NOT enable_memcheck)
   # Java examples
   if(enable_java)
     if(WIN32)
-    set(TESH_CLASSPATH "${CMAKE_BINARY_DIR}/examples/java/\;${SIMGRID_JAR}")
+      set(TESH_CLASSPATH "${CMAKE_BINARY_DIR}/examples/java/\;${SIMGRID_FULL_JAR}")
     else()
-    set(TESH_CLASSPATH "${CMAKE_BINARY_DIR}/examples/java/:${SIMGRID_JAR}")
+      set(TESH_CLASSPATH "${CMAKE_BINARY_DIR}/examples/java/:${SIMGRID_FULL_JAR}")
     endif()
     ADD_TEST(java-async                         ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/async/async.tesh)
     ADD_TEST(java-bittorrent                    ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/bittorrent/bittorrent.tesh)
     ADD_TEST(java-bypass                        ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/master_slave_bypass/bypass.tesh)
     ADD_TEST(java-chord                         ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/chord/chord.tesh)
     ADD_TEST(java-cloud                         ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/cloud/cloud.tesh)
+    ADD_TEST(java-cloud-migration               ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/cloud/migration/migration.tesh)
     ADD_TEST(java-commTime                      ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/commTime/commtime.tesh)
     ADD_TEST(java-kademlia                      ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/kademlia/kademlia.tesh)
     ADD_TEST(java-kill                          ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/master_slave_kill/kill.tesh)
@@ -567,9 +589,9 @@ if(NOT enable_memcheck)
   # Scala examples
   if(enable_scala)
     if(WIN32)
-    set(TESH_CLASSPATH "${CMAKE_BINARY_DIR}/examples/scala/\;${SIMGRID_JAR}\;${SCALA_JARS}")
+      set(TESH_CLASSPATH "${CMAKE_BINARY_DIR}/examples/scala/\;${SIMGRID_FULL_JAR}\;${SCALA_JARS}")
     else()
-    set(TESH_CLASSPATH "${CMAKE_BINARY_DIR}/examples/scala/:${SIMGRID_JAR}:${SCALA_JARS}")
+      set(TESH_CLASSPATH "${CMAKE_BINARY_DIR}/examples/scala/:${SIMGRID_FULL_JAR}:${SCALA_JARS}")
     endif()
 
     ADD_TEST(scala-bypass                       ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/scala --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/scala ${CMAKE_HOME_DIRECTORY}/examples/scala/master_slave_bypass/bypass.tesh)
index e51e466..7c961b1 100644 (file)
@@ -18,10 +18,6 @@ if(enable_compile_warnings AND enable_compile_optimizations)
   SET(BUILDNAME "FULL_FLAGS" CACHE TYPE INTERNAL FORCE)
 endif()
 
-if(enable_supernovae)
-  SET(BUILDNAME "SUPERNOVAE" CACHE TYPE INTERNAL FORCE)
-endif()
-
 if(HAVE_GTNETS)
   SET(BUILDNAME "GTNETS" CACHE TYPE INTERNAL FORCE)
 endif()
index 16f8dba..98cc461 100644 (file)
@@ -9,7 +9,7 @@ set(CMAKE_MODULE_PATH
 
 ### Determine the assembly flavor that we need today
 include(CMakeDetermineSystem)
-IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86|AMD64")
+IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86|AMD64|amd64")
   IF(${ARCH_32_BITS})
     message(STATUS "System processor: i686 (${CMAKE_SYSTEM_PROCESSOR}, 32 bits)")
     set(PROCESSOR_i686 1)
@@ -73,6 +73,7 @@ include(TestBigEndian)
 TEST_BIG_ENDIAN(BIGENDIAN)
 
 include(FindGraphviz)
+include(FindLibSigc++)
 
 set(HAVE_GTNETS 0)
 if(enable_gtnets)
@@ -98,6 +99,13 @@ if(enable_ns3)
   include(FindNS3)
 endif()
 
+find_package(Boost REQUIRED)
+if(Boost_FOUND)
+  include_directories(${Boost_INCLUDE_DIRS})
+else()
+  message(FATAL_ERROR, "Failed to find Boost libraries")
+endif()
+
 # Checks for header libraries functions.
 CHECK_LIBRARY_EXISTS(pthread pthread_create          "" pthread)
 CHECK_LIBRARY_EXISTS(pthread sem_init                "" HAVE_SEM_INIT_LIB)
@@ -148,7 +156,6 @@ CHECK_FUNCTION_EXISTS(asprintf HAVE_ASPRINTF)
 CHECK_FUNCTION_EXISTS(vasprintf HAVE_VASPRINTF)
 CHECK_FUNCTION_EXISTS(makecontext HAVE_MAKECONTEXT)
 CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP)
-CHECK_FUNCTION_EXISTS(mergesort HAVE_MERGESORT)
 
 #Check if __thread is defined
 execute_process(
@@ -158,16 +165,22 @@ execute_process(
   )
 
 if(HAVE_thread_storage_run)
-  set(HAVE_THREAD_LOCAL_STORAGE 0)
-else()
   set(HAVE_THREAD_LOCAL_STORAGE 1)
+else()
+  set(HAVE_THREAD_LOCAL_STORAGE 0)
 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})")
-ENDIF(NOT "${CMAKE_SYSTEM}" MATCHES "Linux" AND NOT "${CMAKE_SYSTEM}" MATCHES "kFreeBSD" AND NOT "${CMAKE_SYSTEM}" MATCHES "GNU" AND NOT  "${CMAKE_SYSTEM}" MATCHES "Darwin")
+ENDIF()
+
+if(HAVE_MMAP AND HAVE_THREAD_LOCAL_STORAGE)
+  SET(HAVE_MMALLOC 1)
+else()
+  SET(HAVE_MMALLOC 0)
+endif()
 
 if(WIN32) #THOSE FILES ARE FUNCTIONS ARE NOT DETECTED BUT THEY SHOULD...
   set(HAVE_UCONTEXT_H 1)
@@ -208,12 +221,15 @@ else()
   SET(MALLOCATOR_IS_WANTED 0)
 endif()
 
-if(enable_model-checking AND HAVE_MMAP)
+if(enable_model-checking AND HAVE_MMALLOC)
   SET(HAVE_MC 1)
   SET(MMALLOC_WANT_OVERRIDE_LEGACY 1)
   include(FindLibunwind)
   include(FindLibdw)
 else()
+  if(enable_model-checking)
+    message(STATUS "Warning: support for model-checking has been disabled because HAVE_MMALLOC is false")
+  endif()
   SET(HAVE_MC 0)
   SET(MMALLOC_WANT_OVERRIDE_LEGACY 0)
 endif()
@@ -483,7 +499,7 @@ endif()
 ###############
 ## GIT version check
 ##
-if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/ AND NOT WIN32)
+if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/)
   execute_process(COMMAND git remote
   COMMAND head -n 1
   WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git/
@@ -516,6 +532,8 @@ if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/ AND NOT WIN32)
     message(STATUS "Git date: ${GIT_DATE}")
     string(REGEX REPLACE " .*" "" GIT_VERSION "${GIT_VERSION}")
   endif()
+elseif(EXISTS ${CMAKE_HOME_DIRECTORY}/.gitversion)
+  FILE(STRINGS ${CMAKE_HOME_DIRECTORY}/.gitversion GIT_VERSION)
 endif()
 
 if(release)
@@ -810,6 +828,7 @@ if(HAVE_NS3_LIB)
 endif()
 set(CMAKE_SMPI_COMMAND "${CMAKE_SMPI_COMMAND}:\${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}\"")
 
+file(READ ${CMAKE_HOME_DIRECTORY}/src/smpi/smpitools.sh SMPITOOLS_SH)
 configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/mpif.h.in ${CMAKE_BINARY_DIR}/include/smpi/mpif.h @ONLY)
 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)
@@ -876,8 +895,6 @@ set(generated_files_to_clean
   ${CMAKE_BINARY_DIR}/bin/colorize
   ${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_smpi.c
   )
 
 if("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
index 41b6fab..622d35f 100644 (file)
@@ -2,7 +2,7 @@
 
 set(EXTRA_DIST
   include/xbt/win32_ucontext.h
-  src/bindings/java/MANIFEST.MF
+  src/bindings/java/MANIFEST.MF.in
   src/include/instr/instr_interface.h
   src/include/mc/datatypes.h
   src/include/mc/mc.h
@@ -19,7 +19,6 @@ set(EXTRA_DIST
   src/include/surf/trace_mgr.h
   src/include/xbt/wine_dbghelp.h
   src/include/xbt/xbt_os_time.h
-  src/mk_supernovae.pl
   src/msg/msg_mailbox.h
   src/msg/msg_private.h
   src/portable.h
@@ -27,6 +26,14 @@ set(EXTRA_DIST
   src/simdag/dax_dtd.c
   src/simdag/dax_dtd.h
   src/simdag/private.h
+  src/simix/simcalls.in
+  src/simix/simcalls.py
+  src/simix/simcalls_generated_enum.h
+  src/simix/simcalls_generated_string.c
+  src/simix/simcalls_generated_res_getter_setter.h
+  src/simix/simcalls_generated_args_getter_setter.h
+  src/simix/simcalls_generated_case.c
+  src/simix/simcalls_generated_body.c
   src/simix/smx_host_private.h
   src/simix/smx_io_private.h
   src/simix/smx_network_private.h
@@ -40,15 +47,20 @@ set(EXTRA_DIST
   src/smpi/colls/coll_tuned_topo.h
   src/smpi/private.h
   src/smpi/smpi_mpi_dt_private.h
-  src/surf/cpu_cas01_private.h
-  src/surf/cpu_ti_private.h
+  src/surf/plugins/energy.hpp
+  src/surf/cpu_interface.hpp
+  src/surf/cpu_ti.hpp
+  src/surf/cpu_cas01.hpp
   src/surf/gtnets/gtnets_interface.h
   src/surf/gtnets/gtnets_simulator.h
   src/surf/gtnets/gtnets_topology.h
-  src/surf/maxmin_private.h
-  src/surf/network_gtnets_private.h
-  src/surf/network_ns3_private.h
-  src/surf/network_private.h
+  src/surf/maxmin_private.hpp
+  src/surf/network_interface.hpp
+  src/surf/network_gtnets.hpp
+  src/surf/network_ns3.hpp
+  src/surf/network_cm02.hpp
+  src/surf/network_smpi.hpp
+  src/surf/network_constant.hpp
   src/surf/ns3/my-point-to-point-helper.h
   src/surf/ns3/ns3_interface.h
   src/surf/ns3/ns3_simulator.h
@@ -56,11 +68,27 @@ set(EXTRA_DIST
   src/surf/platf_generator_private.h
   src/surf/simgrid.dtd
   src/surf/simgrid_dtd.c
-  src/surf/storage_private.h
+  src/surf/storage_interface.hpp
+  src/surf/storage_n11.hpp
+  src/surf/surf_interface.hpp
   src/surf/surf_private.h
-  src/surf/surf_routing_private.h
+  src/surf/surf_routing_private.hpp
+  src/surf/surf_routing.hpp
+  src/surf/surf_routing_cluster.hpp
+  src/surf/surf_routing_cluster_torus.hpp
+  src/surf/surf_routing_dijkstra.hpp
+  src/surf/surf_routing_floyd.hpp
+  src/surf/surf_routing_full.hpp
+  src/surf/surf_routing_generic.hpp
+  src/surf/surf_routing_none.hpp
+  src/surf/surf_routing_vivaldi.hpp
   src/surf/surfxml_parse.c
   src/surf/trace_mgr_private.h
+  src/surf/vm_workstation_interface.hpp
+  src/surf/vm_workstation_hl13.hpp
+  src/surf/workstation_interface.hpp
+  src/surf/workstation_clm03.hpp
+  src/surf/workstation_ptask_L07.hpp
   src/win32/config.h
   src/xbt/automaton/automaton_lexer.yy.c
   src/xbt/automaton/parserPromela.lex
@@ -257,7 +285,7 @@ set(XBT_SRC
   src/xbt_modinter.h
   )
 
-if(HAVE_MMAP)
+if(HAVE_MMALLOC)
   set(XBT_SRC
     ${XBT_SRC}
     src/xbt/mmalloc/mm.c
@@ -268,11 +296,11 @@ set(GTNETS_SRC
   src/surf/gtnets/gtnets_interface.cc
   src/surf/gtnets/gtnets_simulator.cc
   src/surf/gtnets/gtnets_topology.cc
-  src/surf/network_gtnets.c
+  src/surf/network_gtnets.cpp
   )
 
 set(NS3_SRC
-  src/surf/network_ns3.c
+  src/surf/network_ns3.cpp
   src/surf/ns3/my-point-to-point-helper.cc
   src/surf/ns3/ns3_interface.cc
   src/surf/ns3/ns3_simulator.cc
@@ -280,35 +308,43 @@ set(NS3_SRC
   )
 
 set(SURF_SRC
-  src/surf/cpu_cas01.c
-  src/surf/cpu_ti.c
-  src/surf/fair_bottleneck.c
+  src/surf/plugins/energy.cpp
+  src/surf/cpu_interface.cpp
+  src/surf/cpu_ti.cpp
+  src/surf/cpu_cas01.cpp
+  src/surf/fair_bottleneck.cpp
   src/surf/instr_routing.c
   src/surf/instr_surf.c
-  src/surf/lagrange.c
-  src/surf/maxmin.c
-  src/surf/network.c
-  src/surf/network_constant.c
+  src/surf/lagrange.cpp
+  src/surf/maxmin.cpp
+  src/surf/network_interface.cpp
+  src/surf/network_cm02.cpp
+  src/surf/network_smpi.cpp  
+  src/surf/network_constant.cpp
   src/surf/platf_generator.c
   src/surf/random_mgr.c
   src/surf/sg_platf.c
-  src/surf/storage.c
-  src/surf/surf.c
-  src/surf/surf_action.c
-  src/surf/surf_model.c
-  src/surf/surf_routing.c
-  src/surf/surf_routing_cluster.c
-  src/surf/surf_routing_dijkstra.c
-  src/surf/surf_routing_floyd.c
-  src/surf/surf_routing_full.c
-  src/surf/surf_routing_generic.c
-  src/surf/surf_routing_none.c
-  src/surf/surf_routing_vivaldi.c
+  src/surf/storage_interface.cpp
+  src/surf/storage_n11.cpp
+  src/surf/surf_interface.cpp
+  src/surf/surf_c_bindings.cpp
+  src/surf/surf_routing.cpp  
+  src/surf/surf_routing_cluster.cpp
+  src/surf/surf_routing_cluster_torus.cpp
+  src/surf/surf_routing_dijkstra.cpp
+  src/surf/surf_routing_floyd.cpp
+  src/surf/surf_routing_full.cpp
+  src/surf/surf_routing_generic.cpp
+  src/surf/surf_routing_none.cpp
+  src/surf/surf_routing_vivaldi.cpp
   src/surf/surfxml_parse.c
   src/surf/surfxml_parseplatf.c
   src/surf/trace_mgr.c
-  src/surf/workstation.c
-  src/surf/workstation_ptask_L07.c
+  src/surf/workstation_interface.cpp
+  src/surf/workstation_clm03.cpp
+  src/surf/workstation_ptask_L07.cpp
+  src/surf/vm_workstation_interface.cpp
+  src/surf/vm_workstation_hl13.cpp
   src/xbt/xbt_sg_stubs.c
   )
 
@@ -326,6 +362,7 @@ set(SIMIX_SRC
   src/simix/smx_smurf.c
   src/simix/smx_synchro.c
   src/simix/smx_user.c
+  src/simix/smx_vm.c
   )
 
 set(SIMGRID_SRC
@@ -367,19 +404,6 @@ set(SIMIX_SRC
 )
 #* ****************************************************************************************** *#
 
-#* ****************************************************************************************** *#
-#* TUTORIAL: New Model                                                                        *#
-
-set(SURF_SRC
-  ${SURF_SRC}
-  src/surf/new_model.c
-  )
-set(EXTRA_DIST
-  ${EXTRA_DIST}
-  src/surf/new_model_private.h
-  )
-#* ****************************************************************************************** *#
-
 set(SIMDAG_SRC
   src/simdag/instr_sd_task.c
   src/simdag/sd_daxloader.c
@@ -446,12 +470,13 @@ set(JMSG_JAVA_SRC
   src/bindings/java/org/simgrid/msg/Msg.java
   src/bindings/java/org/simgrid/msg/MsgException.java
   src/bindings/java/org/simgrid/msg/Mutex.java
-  src/bindings/java/org/simgrid/msg/Semaphore.java
   src/bindings/java/org/simgrid/msg/NativeException.java
+  src/bindings/java/org/simgrid/msg/NativeLib.java
   src/bindings/java/org/simgrid/msg/Process.java
   src/bindings/java/org/simgrid/msg/ProcessKilledError.java
   src/bindings/java/org/simgrid/msg/ProcessNotFoundException.java
   src/bindings/java/org/simgrid/msg/RngStream.java
+  src/bindings/java/org/simgrid/msg/Semaphore.java
   src/bindings/java/org/simgrid/msg/Task.java
   src/bindings/java/org/simgrid/msg/TaskCancelledException.java
   src/bindings/java/org/simgrid/msg/TimeoutException.java
@@ -530,14 +555,17 @@ set(MC_SRC
   )
 
 set(headers_to_install
+  include/simgrid.h
   include/instr/instr.h
   include/msg/datatypes.h
   include/msg/msg.h
   include/simdag/datatypes.h
   include/simdag/simdag.h
+  include/simgrid/datatypes.h
   include/simgrid/modelchecker.h
   include/simgrid/platf.h
   include/simgrid/platf_generator.h
+  include/simgrid/plugins.h
   include/simgrid/simix.h
   include/smpi/mpi.h
   include/smpi/smpi.h
@@ -824,6 +852,7 @@ set(bin_files
   src/smpi/smpiff.in
   src/smpi/smpif90.in
   src/smpi/smpirun.in
+  src/smpi/smpitools.sh
   )
 
 set(txt_files
@@ -847,6 +876,7 @@ set(EXAMPLES_CMAKEFILES_TXT
   examples/java/bittorrent/CMakeLists.txt
   examples/java/chord/CMakeLists.txt
   examples/java/cloud/CMakeLists.txt
+  examples/java/cloud/migration/CMakeLists.txt
   examples/java/commTime/CMakeLists.txt
   examples/java/io/CMakeLists.txt
   examples/java/kademlia/CMakeLists.txt
@@ -931,6 +961,7 @@ set(TESHSUITE_CMAKEFILES_TXT
   teshsuite/smpi/mpich3-test/group/CMakeLists.txt
   teshsuite/smpi/mpich3-test/init/CMakeLists.txt
   teshsuite/smpi/mpich3-test/pt2pt/CMakeLists.txt
+  teshsuite/smpi/mpich3-test/f77/util/CMakeLists.txt
 #  teshsuite/smpi/mpich3-test/f77/attr/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/coll/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/comm/CMakeLists.txt
@@ -938,6 +969,7 @@ set(TESHSUITE_CMAKEFILES_TXT
   teshsuite/smpi/mpich3-test/f77/ext/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/init/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/pt2pt/CMakeLists.txt
+  teshsuite/smpi/mpich3-test/f90/util/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f90/coll/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f90/datatype/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f90/init/CMakeLists.txt
@@ -976,6 +1008,7 @@ set(CMAKE_SOURCE_FILES
   buildtools/Cmake/Modules/FindGFortran.cmake
   buildtools/Cmake/Modules/FindGTnets.cmake
   buildtools/Cmake/Modules/FindGraphviz.cmake
+  buildtools/Cmake/Modules/FindLibSigc++.cmake
   buildtools/Cmake/Modules/FindLibunwind.cmake
   buildtools/Cmake/Modules/FindLibdw.cmake
   buildtools/Cmake/Modules/FindLua51Simgrid.cmake
@@ -993,12 +1026,12 @@ set(CMAKE_SOURCE_FILES
   buildtools/Cmake/Scripts/SimGrid.packproj
   buildtools/Cmake/Scripts/generate_memcheck_tests.pl
   buildtools/Cmake/Scripts/generate_new_tests.pl
+  buildtools/Cmake/Scripts/java_bundle.sh
   buildtools/Cmake/Scripts/my_valgrind.pl
   buildtools/Cmake/Scripts/postinstall.sh
   buildtools/Cmake/Scripts/preinstall.sh
   buildtools/Cmake/Scripts/tesh.pl
   buildtools/Cmake/Scripts/update_tesh.pl
-  buildtools/Cmake/Supernovae.cmake
   buildtools/Cmake/UnitTesting.cmake
   buildtools/Cmake/src/internal_config.h.in
   buildtools/Cmake/src/simgrid.nsi.in
@@ -1031,6 +1064,7 @@ set(PLATFORMS_EXAMPLES
   examples/platforms/conf/lcg_sept2004_grid.xml
   examples/platforms/conf/transform_optorsim_platform.pl
   examples/platforms/config.xml
+  examples/platforms/content/small_content.txt
   examples/platforms/content/storage_content.txt
   examples/platforms/content/win_storage_content.txt
   examples/platforms/data_center.xml
@@ -1040,6 +1074,7 @@ set(PLATFORMS_EXAMPLES
   examples/platforms/generation_scripts/generate_g5k_platform.pl
   examples/platforms/generation_scripts/generate_g5k_platform_cabinets.pl
   examples/platforms/griffon.xml
+  examples/platforms/torus_cluster.xml
   examples/platforms/meta_cluster.xml
   examples/platforms/multicore_machine.xml
   examples/platforms/prop.xml
index 775512c..74b539b 100644 (file)
@@ -26,12 +26,23 @@ if(NOT WIN32)
 endif()
 
 # binaries
-install(PROGRAMS ${CMAKE_BINARY_DIR}/bin/smpicc
-  ${CMAKE_BINARY_DIR}/bin/smpif2c
-  ${CMAKE_BINARY_DIR}/bin/smpiff
-  ${CMAKE_BINARY_DIR}/bin/smpif90
-  ${CMAKE_BINARY_DIR}/bin/smpirun
-  DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/)
+if(enable_smpi)
+  install(PROGRAMS
+    ${CMAKE_BINARY_DIR}/bin/smpicc
+    ${CMAKE_BINARY_DIR}/bin/smpirun
+    DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/)
+  if(SMPI_F2C)
+    install(PROGRAMS
+      ${CMAKE_BINARY_DIR}/bin/smpif2c
+      ${CMAKE_BINARY_DIR}/bin/smpiff
+      DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/)
+  endif()
+  if(SMPI_F90)
+    install(PROGRAMS
+      ${CMAKE_BINARY_DIR}/bin/smpif90
+      DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/)
+  endif()
+endif()
 
 install(PROGRAMS ${CMAKE_BINARY_DIR}/bin/tesh
   DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/)
@@ -67,10 +78,16 @@ if(enable_lib_static AND NOT WIN32)
 endif()
 
 if(enable_java)
+  if(enable_lib_in_jar)
+    set(SIMGRID_JAR_TO_INSTALL "${SIMGRID_FULL_JAR}")
+  else()
+    set(SIMGRID_JAR_TO_INSTALL "${SIMGRID_JAR}")
+  endif()
   install(TARGETS simgrid-java
       DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/)
-  install(FILES ${SIMGRID_JAR}
-      DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/java/)
+  install(FILES ${SIMGRID_JAR_TO_INSTALL}
+      DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/java/
+      RENAME simgrid.jar)
 endif()
 
 # include files
@@ -139,6 +156,7 @@ add_custom_target(uninstall
   COMMAND ${CMAKE_COMMAND} -E  remove_directory ${CMAKE_INSTALL_PREFIX}/include/xbt
   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.h
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/include/simgrid_config.h
   COMMAND ${CMAKE_COMMAND} -E  remove -f ${CMAKE_INSTALL_PREFIX}/include/xbt.h
   COMMAND ${CMAKE_COMMAND} -E  echo "uninstall include ok"
@@ -248,6 +266,7 @@ endforeach(file ${source_to_pack})
 add_custom_command(
   TARGET dist-dir
   COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/Makefile.default ${PROJECT_NAME}-${release_version}/Makefile
+  COMMAND ${CMAKE_COMMAND} -E echo "${GIT_VERSION}" > ${PROJECT_NAME}-${release_version}/.gitversion
   )
 
 ######################################
@@ -362,11 +381,4 @@ add_custom_target(maintainer-clean
   WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}"
   )
 
-add_custom_target(supernovae-clean
-  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}"
-  )
-
-
 include(CPack)
index 058ea2d..eb9d3f4 100644 (file)
@@ -2,7 +2,7 @@ set(warnCFLAGS "")
 set(optCFLAGS "")
 
 if(NOT __VISUALC__ AND NOT __BORLANDC__)
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-g3")
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-std=gnu99 -g3")
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-g3")
   set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g")
 else()
@@ -19,6 +19,8 @@ if(enable_compile_warnings)
     endif()
   endif()
 
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
+
   set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Wall") # FIXME: Q&D hack
 
   set(CMAKE_JAVA_COMPILE_FLAGS "-Xlint")
@@ -69,9 +71,10 @@ set(TESH_OPTION "")
 if(enable_coverage)
   find_program(GCOV_PATH gcov)
   if(GCOV_PATH)
-    SET(COVERAGE_COMMAND "${GCOV_PATH}" CACHE TYPE FILEPATH FORCE)
+    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_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_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)
@@ -84,6 +87,11 @@ if(NOT $ENV{CFLAGS} STREQUAL "")
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} $ENV{CFLAGS}")
 endif()
 
+if(NOT $ENV{CXXFLAGS} STREQUAL "")
+  message(STATUS "Add CXXFLAGS: \"$ENV{CXXFLAGS}\" to CMAKE_CXX_FLAGS")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} $ENV{CXXFLAGS}")
+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}")
index 9ccde43..0ef519a 100644 (file)
@@ -86,23 +86,23 @@ endif()
 ### Fill in the "make sync-gforge" target ###
 #############################################
 
+set(RSYNC_CMD rsync --verbose --cvs-exclude --compress --delete --delete-excluded --rsh=ssh --ignore-times --recursive --links --times --omit-dir-times --perms --chmod=a+rX,ug+w,o-w,Dg+s)
+
 add_custom_target(sync-gforge-doc
-  COMMAND chmod g+rw -R doc/
-  COMMAND chmod a+rX -R doc/
-  COMMAND ssh scm.gforge.inria.fr mkdir -p /home/groups/simgrid/htdocs/simgrid/${release_version}/html/ || true
+  COMMAND ssh scm.gforge.inria.fr mkdir -p -m 2775 /home/groups/simgrid/htdocs/simgrid/${release_version}/ || 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_CMD} doc/html/ scm.gforge.inria.fr:/home/groups/simgrid/htdocs/simgrid/${release_version}/doc/ || true
 
-  COMMAND scp doc/html/simgrid_modules2.png doc/html/simgrid_modules.png doc/webcruft/simgrid_logo_2011.png
+  COMMAND ${RSYNC_CMD} doc/html/simgrid_modules2.png doc/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}"
   )
 add_dependencies(sync-gforge-doc simgrid_documentation)
 
 add_custom_target(sync-gforge-dtd
-  COMMAND scp src/surf/simgrid.dtd scm.gforge.inria.fr:/home/groups/simgrid/htdocs/simgrid/${release_version}/simgrid.dtd
-  COMMAND scp src/surf/simgrid.dtd scm.gforge.inria.fr:/home/groups/simgrid/htdocs/simgrid.dtd
+  COMMAND ${RSYNC_CMD} src/surf/simgrid.dtd scm.gforge.inria.fr:/home/groups/simgrid/htdocs/simgrid/${release_version}/simgrid.dtd
+  COMMAND ${RSYNC_CMD} src/surf/simgrid.dtd scm.gforge.inria.fr:/home/groups/simgrid/htdocs/simgrid.dtd
   WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}"
   )
 
index d5fdcad..cd89912 100644 (file)
@@ -4,6 +4,42 @@ set(FLEXML_MIN_MINOR 9)
 set(FLEXML_MIN_PATCH 6)
 
 # the rest should only be changed if you understand what you're doing
+if(enable_maintainer_mode AND NOT WIN32)
+  find_program(PYTHON_EXE NAMES python)
+  if (PYTHON_EXE)
+    add_custom_command(
+      OUTPUT
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_enum.h
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_string.c
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_res_getter_setter.h
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_args_getter_setter.h
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_case.c
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_body.c
+      
+      DEPENDS
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls.py
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls.in
+
+      COMMENT "Generating simcalls source files"
+      COMMAND ${PYTHON_EXE} simcalls.py
+      WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/src/simix/
+      )
+
+    add_custom_target(simcalls_generated_src
+      DEPENDS
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_enum.h
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_string.c
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_res_getter_setter.h
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_args_getter_setter.h
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_case.c
+      ${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_body.c
+      )
+
+    SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
+      "${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_enum.h;${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_string.c;${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_res_getter_setter.h;${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_args_getter_setter.h;${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_case.c;${CMAKE_HOME_DIRECTORY}/src/simix/simcalls_generated_body.c"
+      )
+  endif()
+endif()
 
 if(enable_maintainer_mode AND NOT WIN32)
   find_program(FLEX_EXE NAMES flex)
index 4c6d9d2..c854fb5 100644 (file)
@@ -7,6 +7,7 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/async)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/bittorrent)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/chord)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/cloud)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/cloud/migration)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/commTime)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/io)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/kademlia)
@@ -100,12 +101,14 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/init)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/pt2pt)
 
 #add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/f77/attr)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/f77/util)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/f77/coll)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/f77/comm)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/f77/datatype)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/f77/ext)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/f77/init)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/f77/pt2pt)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/f90/util)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/f90/coll)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/f90/datatype)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/f90/init)
index f7c69b4..f1c43de 100644 (file)
@@ -56,26 +56,16 @@ endif()
 ## Files to include in simgrid.jar
 ##
 set(SIMGRID_JAR "${CMAKE_BINARY_DIR}/simgrid.jar")
-set(MANIFEST_FILE "${CMAKE_HOME_DIRECTORY}/src/bindings/java/MANIFEST.MF")
+set(SIMGRID_FULL_JAR "${CMAKE_BINARY_DIR}/simgrid_full.jar")
+set(MANIFEST_IN_FILE "${CMAKE_HOME_DIRECTORY}/src/bindings/java/MANIFEST.MF.in")
+set(MANIFEST_FILE "${CMAKE_BINARY_DIR}/src/bindings/java/MANIFEST.MF")
+
+
 set(LIBSIMGRID_SO
   libsimgrid${CMAKE_SHARED_LIBRARY_SUFFIX})
 set(LIBSIMGRID_JAVA_SO
   ${CMAKE_SHARED_LIBRARY_PREFIX}simgrid-java${CMAKE_SHARED_LIBRARY_SUFFIX})
 
-## Name of the "NATIVE" folder in simgrid.jar
-##
-if(CMAKE_SYSTEM_PROCESSOR MATCHES ".86")
-  if(${ARCH_32_BITS})
-    set(JSG_BUNDLE "NATIVE/${CMAKE_SYSTEM_NAME}/i386/")
-  else()
-    set(JSG_BUNDLE "NATIVE/${CMAKE_SYSTEM_NAME}/amd64/")
-  endif()
-else()
-  message(WARNING "Unknown system type. Processor: ${CMAKE_SYSTEM_PROCESSOR}; System: ${CMAKE_SYSTEM_NAME}")
-  set(JSG_BUNDLE "NATIVE/${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}/")
-endif()
-message("-- [Java] Native libraries bundled into: ${JSG_BUNDLE}")
-
 ## Don't strip libraries if not in release mode
 ##
 if(release)
@@ -93,28 +83,30 @@ else()
   add_jar(simgrid-java_pre_jar ${JMSG_JAVA_SRC} OUTPUT_NAME simgrid)
 endif()
 
+set(JAVA_BUNDLE "${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/java_bundle.sh")
+set(JAVA_BUNDLE_SO_FILES
+  ${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_SO}
+  ${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_JAVA_SO}
+  )
+set(JAVA_BUNDLE_TXT_FILES
+  ${CMAKE_HOME_DIRECTORY}/COPYING
+  ${CMAKE_HOME_DIRECTORY}/ChangeLog
+  ${CMAKE_HOME_DIRECTORY}/ChangeLog.SimGrid-java
+  ${CMAKE_HOME_DIRECTORY}/LICENSE-LGPL-2.1
+  )
 add_custom_command(
   COMMENT "Finalize simgrid.jar..."
   OUTPUT ${SIMGRID_JAR}_finalized
   DEPENDS simgrid simgrid-java simgrid-java_pre_jar
-          ${SIMGRID_JAR} ${MANIFEST_FILE}
-          ${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_SO}
-          ${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_JAVA_SO}
-          ${CMAKE_HOME_DIRECTORY}/COPYING
-          ${CMAKE_HOME_DIRECTORY}/ChangeLog
-          ${CMAKE_HOME_DIRECTORY}/ChangeLog.SimGrid-java
-          ${CMAKE_HOME_DIRECTORY}/LICENSE-LGPL-2.1
-  COMMAND ${CMAKE_COMMAND} -E remove_directory "NATIVE"
-  COMMAND ${CMAKE_COMMAND} -E make_directory "${JSG_BUNDLE}"
-  COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_SO}" "${JSG_BUNDLE}"
-  COMMAND ${STRIP_COMMAND} -S "${JSG_BUNDLE}/${LIBSIMGRID_SO}"
-  COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_JAVA_SO}" "${JSG_BUNDLE}"
-  COMMAND ${STRIP_COMMAND} -S "${JSG_BUNDLE}/${LIBSIMGRID_JAVA_SO}"
-  COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_HOME_DIRECTORY}/COPYING" "${JSG_BUNDLE}"
-  COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_HOME_DIRECTORY}/ChangeLog" "${JSG_BUNDLE}"
-  COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_HOME_DIRECTORY}/ChangeLog.SimGrid-java" "${JSG_BUNDLE}"
-  COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_HOME_DIRECTORY}/LICENSE-LGPL-2.1" "${JSG_BUNDLE}"
-  COMMAND ${JAVA_ARCHIVE} -uvmf ${MANIFEST_FILE} ${SIMGRID_JAR} "NATIVE"
+          ${SIMGRID_JAR} ${MANIFEST_IN_FILE}
+          ${JAVA_BUNDLE_SO_FILES} ${JAVA_BUNDLE_TXT_FILES}
+  COMMAND ${JAVA_BUNDLE} "${SIMGRID_JAR}" "${Java_JAVA_EXECUTABLE}" "${STRIP_COMMAND}" -so ${JAVA_BUNDLE_SO_FILES} -txt ${JAVA_BUNDLE_TXT_FILES}
+  COMMAND ${CMAKE_COMMAND} -E copy ${MANIFEST_IN_FILE} ${MANIFEST_FILE}
+  COMMAND ${CMAKE_COMMAND} -E echo "Specification-Version: \\\"${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}.${SIMGRID_VERSION_PATCH}\\\"" >> ${MANIFEST_FILE}
+  COMMAND ${CMAKE_COMMAND} -E echo "Implementation-Version: \\\"${GIT_VERSION}\\\"" >> ${MANIFEST_FILE}
+  COMMAND ${JAVA_ARCHIVE} -uvmf ${MANIFEST_FILE} ${SIMGRID_JAR}
+  COMMAND ${CMAKE_COMMAND} -E copy ${SIMGRID_JAR} ${SIMGRID_FULL_JAR}
+  COMMAND ${JAVA_ARCHIVE} -uvf ${SIMGRID_FULL_JAR} "NATIVE"
   COMMAND ${CMAKE_COMMAND} -E remove ${SIMGRID_JAR}_finalized
   COMMAND ${CMAKE_COMMAND} -E touch ${SIMGRID_JAR}_finalized
   )
index 2f81c23..25fdfad 100644 (file)
@@ -3,11 +3,8 @@
 ###############################
 # Declare the library content #
 ###############################
-# If we want supernovae, rewrite the libs' content to use it
-include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Supernovae.cmake)
 
 # Actually declare our libraries
-
 add_library(simgrid SHARED ${simgrid_sources})
 set_target_properties(simgrid PROPERTIES VERSION ${libsimgrid_version})
 
@@ -21,24 +18,9 @@ endif()
 
 add_dependencies(simgrid maintainer_files)
 
-# if supernovaeing, we need some depends to make sure that the source gets generated
-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()
-
-  if(enable_smpi)
-    add_dependencies(simgrid ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c)
-    if(enable_lib_static)
-      add_dependencies(simgrid_static ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c)
-    endif()
-  endif()
-endif()
-
 # Compute the dependencies of SimGrid
 #####################################
-set(SIMGRID_DEP "-lm")
+set(SIMGRID_DEP "-lm -lstdc++")
 
 if(pthread)
   if(${CONTEXT_THREADS})
@@ -82,6 +64,10 @@ if(HAVE_GRAPHVIZ)
   endif()
 endif()
 
+if(HAVE_LIBSIGC++)
+  SET(SIMGRID_DEP "${SIMGRID_DEP} -lsigc-2.0")   
+endif()
+
 if(HAVE_GTNETS)
   SET(SIMGRID_DEP "${SIMGRID_DEP} -lgtnets")
 endif()
@@ -108,12 +94,12 @@ if(MMALLOC_WANT_OVERRIDE_LEGACY AND HAVE_GNU_LD)
 endif()
 
 if(HAVE_NS3)
-  if(${NS3_VERSION} EQUAL 310)
+  if(${NS3_VERSION_MINOR} EQUAL 10)
     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()
-    SET(SIMGRID_DEP "${SIMGRID_DEP} -lns3-core -lns3-csma -lns3-point-to-point -lns3-internet -lns3-applications")
+    SET(SIMGRID_DEP "${SIMGRID_DEP} -lns3.${NS3_VERSION_MINOR}-core -lns3.${NS3_VERSION_MINOR}-csma -lns3.${NS3_VERSION_MINOR}-point-to-point -lns3.${NS3_VERSION_MINOR}-internet -lns3.${NS3_VERSION_MINOR}-applications")
   endif()
 endif()
 
@@ -139,6 +125,9 @@ endif()
 
 # Dependencies from maintainer mode
 ###################################
+if(enable_maintainer_mode AND PYTHON_EXE)
+  add_dependencies(simgrid simcalls_generated_src)
+endif()
 if(enable_maintainer_mode AND BISON_EXE AND LEX_EXE)
   add_dependencies(simgrid automaton_generated_src)
 endif()
index f596b1f..3699a3a 100644 (file)
@@ -29,10 +29,13 @@ endif()
 
 set(SIMGRID_DEP "-lws2_32 -L${PATH_PTHREAD_LIB} -lm -lpthreadGC2")
 
+
 if(ARCH_32_BITS)
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -march=i486")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -march=i486")
 else()
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
   #        message(FATAL_ERROR "Sorry, Simgrid fails with full 64bits for now! Please contact us.")
 endif()
 
index 611e765..4d22501 100644 (file)
@@ -1,7 +1,6 @@
-find_path(HAVE_F2C_H f2c.h
-  HINTS
-  $ENV{LD_LIBRARY_PATH}
-  PATH_SUFFIXES include/
+find_program(F2C_EXE
+  NAME f2c
+  PATH_SUFFIXES bin/
   PATHS
   /opt
   /opt/local
@@ -10,9 +9,17 @@ find_path(HAVE_F2C_H f2c.h
   /usr
   )
 
-find_program(F2C_EXE
+if(F2C_EXE)
+  message(STATUS "Looking for bin f2c - found: ${F2C_EXE}")
+else()
+  message(STATUS "Looking for bin f2c - not found (http://www.netlib.org/f2c/)")
+endif()
+
+find_library(HAVE_F2C_LIB
   NAME f2c
-  PATH_SUFFIXES bin/
+  HINTS
+  ENV LD_LIBRARY_PATH
+  PATH_SUFFIXES lib/
   PATHS
   /opt
   /opt/local
@@ -21,11 +28,17 @@ find_program(F2C_EXE
   /usr
   )
 
-find_library(HAVE_F2C_LIB
-  NAME f2c
+if(HAVE_F2C_LIB)
+  message(STATUS "Looking for lib f2c - found: ${HAVE_F2C_LIB}")
+else()
+  message(STATUS "Looking for lib f2c - not found")
+endif()
+
+get_filename_component(F2C_HINT ${HAVE_F2C_LIB} PATH)
+find_path(HAVE_F2C_H f2c.h
   HINTS
-  $ENV{LD_LIBRARY_PATH}
-  PATH_SUFFIXES lib/
+  ${F2C_HINT}/..
+  PATH_SUFFIXES include/
   PATHS
   /opt
   /opt/local
@@ -35,28 +48,13 @@ find_library(HAVE_F2C_LIB
   )
 
 if(HAVE_F2C_H)
-  set(HAVE_SMPI_F2C_H 1)
-endif()
-
-message(STATUS "Looking for f2c.h")
-if(HAVE_F2C_H)
-  message(STATUS "Looking for f2c.h - found")
+  message(STATUS "Looking for f2c.h - found: ${HAVE_F2C_H}")
 else()
   message(STATUS "Looking for f2c.h - not found")
 endif()
 
-message(STATUS "Looking for lib f2c")
-if(HAVE_F2C_LIB)
-  message(STATUS "Looking for lib f2c - found")
-else()
-  message(STATUS "Looking for lib f2c - not found")
-endif()
-
-message(STATUS "Looking for bin f2c")
-if(F2C_EXE)
-  message(STATUS "Found F2C: ${F2C_EXE}")
-else()
-  message(STATUS "Looking for bin f2c - not found (http://www.netlib.org/f2c/)")
+if(HAVE_F2C_H)
+  set(HAVE_SMPI_F2C_H 1)
 endif()
 
 mark_as_advanced(HAVE_F2C_H)
diff --git a/buildtools/Cmake/Modules/FindLibSigc++.cmake b/buildtools/Cmake/Modules/FindLibSigc++.cmake
new file mode 100644 (file)
index 0000000..2d2aa03
--- /dev/null
@@ -0,0 +1,71 @@
+find_path(PATH_LIBSIGC++_H "sigc++/sigc++.h"
+  HINTS
+  $ENV{LD_LIBRARY_PATH}
+  PATH_SUFFIXES include/sigc++-2.0/ include/
+  PATHS
+  /opt
+  /opt/local
+  /opt/csw
+  /sw
+  /usr)
+
+find_path(PATH_LIBSIGC++CONFIG_H "sigc++config.h"
+  HINTS
+  $ENV{LD_LIBRARY_PATH}
+  PATH_SUFFIXES lib/x86_64-linux-gnu/sigc++-2.0/include/ include/
+  PATHS
+  /opt
+  /opt/local
+  /opt/csw
+  /sw
+  /usr)
+
+find_library(PATH_LIBSIGC++_LIB
+  NAMES sigc-2.0
+  HINTS
+  $ENV{LD_LIBRARY_PATH}
+  PATH_SUFFIXES lib/x86_64-linux-gnu/ lib/sigc++/ lib/
+  PATHS
+  /opt
+  /opt/local
+  /opt/csw
+  /sw
+  /usr)
+
+message(STATUS "Looking for sigc++/sigc++.h")
+if(PATH_LIBSIGC++_H)
+  message(STATUS "Looking for sigc++/sigc++.h - found")
+else()
+  message(STATUS "Looking for sigc++/sigc++.h - not found")
+endif()
+
+message(STATUS "Looking for sigc++config.h")
+if(PATH_LIBSIGC++CONFIG_H)
+  message(STATUS "Looking for sigc++config.h - found")
+else()
+  message(STATUS "Looking for sigc++config.h - not found")
+endif()
+
+message(STATUS "Looking for libsigc++")
+if(PATH_LIBSIGC++_LIB)
+  message(STATUS "Looking for libsigc++ - found")
+else()
+  message(STATUS "Looking for libsigc++ - not found")
+endif()
+
+if(PATH_LIBSIGC++_LIB AND PATH_LIBSIGC++_H AND PATH_LIBSIGC++CONFIG_H)
+  string(REGEX REPLACE "/sigc\\+\\+/sigc\\+\\+.h" "" PATH_LIBSIGC++_H   "${PATH_LIBSIGC++_H}")
+  string(REGEX REPLACE "/sigc\\+\\+config.h" "" PATH_LIBSIGC++CONFIG_H   "${PATH_LIBSIGC++CONFIG_H}")
+  string(REGEX REPLACE "/libsig.*" "" PATH_LIBSIGC++_LIB "${PATH_LIBSIGC++_LIB}")
+      
+  include_directories(${PATH_LIBSIGC++_H})
+  include_directories(${PATH_LIBSIGC++CONFIG_H})
+  link_directories(${PATH_LIBSIGC++_LIB})
+  set(HAVE_LIBSIGC++ "1")
+else()
+  set(HAVE_LIBSIGC++ "0")
+endif()
+
+mark_as_advanced(PATH_LIBSIGC++_H)
+mark_as_advanced(PATH_LIBSIGC++CONFIG_H)
+mark_as_advanced(PATH_LIBSIGC++_LIB)
index 04e568c..2e0afbd 100644 (file)
@@ -13,7 +13,7 @@ find_library(HAVE_NS3_LIB
   )
 
 find_library(HAVE_NS3_CORE_LIB
-  NAME ns3-core
+  NAME ns3-core ns3.14-core ns3.17-core
   PATH_SUFFIXES lib64 lib ns3/lib
   PATHS
   ${ns3_path}
@@ -21,7 +21,7 @@ find_library(HAVE_NS3_CORE_LIB
 
 find_path(HAVE_CORE_MODULE_H
   NAME ns3/core-module.h
-  PATH_SUFFIXES include ns3/include include/ns3.14.1
+  PATH_SUFFIXES include ns3/include include/ns3.14.1 include/ns3.17
   PATHS
   ${ns3_path}
   )
@@ -56,14 +56,14 @@ if(HAVE_CORE_MODULE_H)
   if(HAVE_NS3_LIB)
     message(STATUS "Warning: NS-3 version <= 3.10")
     set(HAVE_NS3 1)
-    set(NS3_VERSION 310)
-    string(REPLACE "/libns3.${LIB_EXE}" ""  HAVE_NS3_LIB "${HAVE_NS3_LIB}")
+    set(NS3_VERSION_MINOR 10)
+    string(REPLACE "/libns3.${LIB_EXE}" "" HAVE_NS3_LIB "${HAVE_NS3_LIB}")
   endif()
   if(HAVE_NS3_CORE_LIB)
     message(STATUS "NS-3 version > 3.10")
+    string(REGEX REPLACE ".*ns3.([0-9]+)-core.*" "\\1" NS3_VERSION_MINOR "${HAVE_NS3_CORE_LIB}")
     set(HAVE_NS3 1)
-    set(NS3_VERSION 312)
-    string(REPLACE "/libns3-core.${LIB_EXE}" ""  HAVE_NS3_LIB "${HAVE_NS3_CORE_LIB}")
+    string(REPLACE "/libns3-core.${LIB_EXE}" "" HAVE_NS3_LIB "${HAVE_NS3_CORE_LIB}")
   endif()
 endif()
 
@@ -84,11 +84,8 @@ if(HAVE_NS3)
     endif()
 
     SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-I${HAVE_CORE_MODULE_H} -L${HAVE_NS3_LIB} ")
+    message(STATUS "TEST: ${CMAKE_CXX_FLAGS}")
   endif()
 else()
   message(STATUS "Warning: To use NS-3 Please install ns3 at least version 3.10 (http://www.nsnam.org/releases/)")
 endif()
-
-if(HAVE_NS3 AND enable_supernovae)
-  set(enable_supernovae OFF)
-endif()
index f9f4d28..1c56b6e 100644 (file)
@@ -34,9 +34,9 @@ option(enable_print_message "Enable print message during config." off)
 mark_as_advanced(enable_print_message)
 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)
+option(enable_lib_in_jar "Whether the native libraries are bundled into the Java jar file" on)
 option(enable_jedule "Jedule output of SimDAG." off)
 option(enable_debug "Turn this off to remove all debug messages at compile time (faster, but no debug activable)" on)
-option(enable_supernovae "Whether Supernovae mode (helping compiler optimization) is activated." off)
 option(enable_msg_deprecated "This option enable the use of msg deprecated functions" off)
 
 if(WIN32)
index 054222c..09c6b3d 100644 (file)
@@ -62,6 +62,8 @@ if(enable_print_message)
   message("HAVE_ASPRINTF ...............: ${HAVE_ASPRINTF}")
   message("HAVE_VASPRINTF ..............: ${HAVE_VASPRINTF}")
   message("HAVE_MMAP ...................: ${HAVE_MMAP}")
+  message("HAVE_THREAD_LOCAL_STORAGE ...: ${HAVE_THREAD_LOCAL_STORAGE}")
+  message("HAVE_MMALLOC ................: ${HAVE_MMALLOC}")
   message("")
   message("CONTEXT_THREADS .............: ${CONTEXT_THREADS}")
   message("CONTEXT_UCONTEXT ............: ${CONTEXT_UCONTEXT}")
@@ -96,7 +98,7 @@ endif()
 message("        Linker: .............: ${CMAKE_LINKER}")
 message("")
 message("        CFlags ..............: ${CMAKE_C_FLAGS}")
-message("        CPPFlags ............: ${CMAKE_CXX_FLAGS}")
+message("        CXXFlags ............: ${CMAKE_CXX_FLAGS}")
 message("        LDFlags .............: ${CMAKE_C_LINK_FLAGS}")
 message("")
 if(NOT APPLE AND NOT WIN32)
@@ -113,14 +115,17 @@ message("        Compile MPI testsuite: ${enable_smpi_MPICH3_testsuite}")
 message("        Compile Smpi f77 ....: ${SMPI_F2C}")
 message("        Compile Smpi f90 ....: ${SMPI_F90}")
 message("        Compile Static ......: ${enable_lib_static}")
+if(enable_java)
+  message("        Native lib in jar ...: ${enable_lib_in_jar}")
+endif()
 message("")
 message("        Maintainer mode .....: ${enable_maintainer_mode}")
-message("        Supernovae mode .....: ${enable_supernovae}")
-message("        Model checking ......: ${enable_model-checking}")
+message("        Model checking ......: ${HAVE_MC}")
 message("        Tracing mode ........: ${enable_tracing}")
 message("        Jedule  mode ........: ${enable_jedule}")
 message("        Latency bound .......: ${enable_latency_bound_tracking}")
 message("        Graphviz mode .......: ${HAVE_GRAPHVIZ}")
+message("        Sigc++ mode .........: ${HAVE_LIBSIGC++}")
 message("        Mallocators .........: ${enable_mallocators}")
 message("")
 message("        Simgrid dependencies : ${SIMGRID_DEP}")
index df08806..85dd349 100755 (executable)
@@ -1,4 +1,11 @@
 #!/usr/bin/perl -w
+
+# Copyright (c) 2012-2014. 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.
+
 use strict;
 
 # input file = AddTest.txt
index aa2245e..e3c807c 100755 (executable)
@@ -1,4 +1,11 @@
 #!/usr/bin/perl -w
+
+# Copyright (c) 2012, 2014. 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.
+
 use strict;
 
 # input file = AddTest.txt
diff --git a/buildtools/Cmake/Scripts/java_bundle.sh b/buildtools/Cmake/Scripts/java_bundle.sh
new file mode 100755 (executable)
index 0000000..1c232b8
--- /dev/null
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+set -e
+#set -x
+
+if [ $# -lt 3 ]; then
+    cat >&2 <<EOF
+Usage: $0 simgrid.jar java_command strip_command [-so file.so...] [-txt file.txt...]
+    simgrid.jar    SimGrid jar file
+    java_command   path to the Java runtime
+    strip_command  path to the command used to strip libraries
+    file.so        library file to stript and bundle into the archive
+    file.txt       other file  to bundle into the archive
+EOF
+    exit 1
+fi
+
+SIMGRID_JAR=$1
+JAVA=$2
+STRIP=$3
+shift 3
+
+JSG_BUNDLE=$("$JAVA" -classpath "$SIMGRID_JAR" org.simgrid.msg.NativeLib)
+
+# sanity check
+case "$JSG_BUNDLE" in
+    NATIVE/*)
+        cat >&2 <<EOF
+-- [Java] Native libraries bundled into: ${JSG_BUNDLE}
+EOF
+        ;;
+    *)
+        cat >&2 <<EOF
+-- [Java] Native libraries NOT bundled into invalid directory: ${JSG_BUNDLE}
+EOF
+        exit 1
+        ;;
+esac
+
+# prepare directory
+rm -fr NATIVE
+mkdir -p "$JSG_BUNDLE"
+
+if [ "$1" = "-so" ]; then
+    shift
+    for file; do
+        [ "$file" != "-txt" ] || break
+        cp -f "$file" "$JSG_BUNDLE"
+        "$STRIP" -S "$JSG_BUNDLE/${file##*/}"
+        shift
+    done
+fi
+
+if [ "$1" = "-txt" ]; then
+    shift
+    for file; do
+        cp -f "$file" "$JSG_BUNDLE"
+        shift
+    done
+fi
index 82e950f..073b4b8 100755 (executable)
@@ -1,4 +1,11 @@
 #!/usr/bin/perl -w
+
+# Copyright (c) 2012-2014. 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.
+
 use strict;
 my @argv = ("valgrind");
 my $count = 0;
index e103a8f..451b26a 100755 (executable)
@@ -1,4 +1,11 @@
 #! /usr/bin/perl
+
+# Copyright (c) 2012-2014. 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.
+
 eval 'exec perl -S $0 ${1+"$@"}'
   if $running_under_some_shell;
 
index 24d5c25..7c340b4 100755 (executable)
@@ -1,4 +1,11 @@
 #!/usr/bin/perl -w
+
+# Copyright (c) 2012, 2014. 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.
+
 use strict;
 
 if($#ARGV!=1) {
diff --git a/buildtools/Cmake/Supernovae.cmake b/buildtools/Cmake/Supernovae.cmake
deleted file mode 100644 (file)
index 347192e..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-### Make supernovae files and libs
-
-#############################################################################
-### Add here every files that should not be supernovaed (generated files) ###
-#############################################################################
-set(simgrid_fragile_sources
-  src/simdag/sd_daxloader.c
-  src/surf/surfxml_parse.c
-  src/xbt/graphxml_parse.c
-  src/xbt/mmalloc/mm.c
-  ${GTNETS_USED}
-  )
-
-#####################################################
-### END OF CONFIGURATION, NO NEED TO READ FURTHER ###
-#####################################################
-
-### Rebuild the supernovae source files
-if (enable_supernovae) # I need supernovae
-
-  message(WARNING
-"==============================================================================\n"
-"WARNING\n"
-"Supernovae builds are deprecated, and expected to be removed in the next version of SimGrid.\n"
-"If you want this feature to be kept, please tell us at <simgrid-user@lists.gforge.inria.fr>.\n"
-"===============================================================================
-")
-
-  # 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_smpi.c
-    PROPERTIES GENERATED true)
-
-  ADD_CUSTOM_COMMAND(
-    OUTPUT   ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c
-    DEPENDS  ${CMAKE_HOME_DIRECTORY}/src/mk_supernovae.pl ${simgrid_sources}
-    COMMAND  perl ${CMAKE_HOME_DIRECTORY}/src/mk_supernovae.pl --out=${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c '--fragile=${simgrid_fragile_sources}' '${simgrid_sources}'
-    WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}
-    COMMENT "Generating supernovae_sg.c"
-    )
-
-
-  ADD_CUSTOM_COMMAND(
-    OUTPUT   ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c
-    DEPENDS  ${CMAKE_HOME_DIRECTORY}/src/mk_supernovae.pl ${SMPI_SRC}
-    COMMAND  perl ${CMAKE_HOME_DIRECTORY}/src/mk_supernovae.pl --out=${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c  '${SMPI_SRC}'
-    WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}
-    COMMENT "Generating supernovae_smpi.c"
-    )
-
-  ### Change the content of the libraries so that it contains only supernovae+fragiles
-  set(simgrid_sources
-    ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c
-    ${simgrid_fragile_sources})
-
-  set(SMPI_SRC
-    ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c)
-
-endif() # I need supernovae
index 3e988d1..bd406de 100644 (file)
@@ -3,13 +3,12 @@
 /* This file is AUTOMATICALLY GENERATED by Cmake. Edit the following
    template instead buildtools/Cmake/src/internal_config.h.in               */
 
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. 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. */
 
-
 /* Set somes variables for Windows compilation */
 
 #ifdef _XBT_DLL_EXPORT
 #cmakedefine MMALLOC_WANT_OVERRIDE_LEGACY @MMALLOC_WANT_OVERRIDE_LEGACY@
 #cmakedefine HAVE_MC @HAVE_MC@
 
-/* Set to true if have the mergesort function */
-#cmakedefine HAVE_MERGESORT @HAVE_MERGESORT@
-
 /* If have linux_futex.h */
 #cmakedefine HAVE_FUTEX_H @HAVE_FUTEX_H@
 
+/* Some variable for libsigc++ */
+#cmakedefine HAVE_LIBSIGC @HAVE_LIBSIGC++@
+
 /* Some variable for graphviz */
 #cmakedefine HAVE_GRAPHVIZ @HAVE_GRAPHVIZ@
 #cmakedefine HAVE_GRAPH_H @GRAPH_H@
 /* Define to 1 if you have the <execinfo.h> header file. */
 #cmakedefine HAVE_EXECINFO_H @HAVE_EXECINFO_H@
 
-/* Define to 1 if you have the `mmap' function. */
-#cmakedefine HAVE_MMAP @HAVE_MMAP@
+/* Define to 1 if mmalloc is compiled in. */
+#cmakedefine HAVE_MMALLOC @HAVE_MMALLOC@
 
 /* Define to 1 if you have the `getdtablesize' function. */
 #cmakedefine HAVE_GETDTABLESIZE @HAVE_GETDTABLESIZE@
index 59d5289..a20e1bd 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010. The SimGrid Team.
+/* Copyright (c) 2010, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index fde4577..6187f9e 100644 (file)
@@ -1,5 +1,5 @@
 /* prog_gnu_dynlinker.c -- check that RTLD_NEXT is defined as in GNU linker */
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 7c68bea..4391b46 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2010, 2014. 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 <simulator.h>
 
 int main(){
index cb9d070..60dd8fe 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2011. The SimGrid Team.
+/* Copyright (c) 2010-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 00277d4..10eb15e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010. The SimGrid Team.
+/* Copyright (c) 2010, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 01d3ff3..43540a0 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index be4a92d..56a2c4b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 994d9ad..c6a94a8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010. The SimGrid Team.
+/* Copyright (c) 2010, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 60f2403..1e33689 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010. The SimGrid Team.
+/* Copyright (c) 2010, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index f0f2f1a..81aff74 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010. The SimGrid Team.
+/* Copyright (c) 2010, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 66dcba0..35f08bc 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010. The SimGrid Team.
+/* Copyright (c) 2010, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 732a000..86d2940 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2011. The SimGrid Team.
+/* Copyright (c) 2010-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 26e1db9..5a392e6 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010. The SimGrid Team.
+/* Copyright (c) 2010, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 52e6752..1d1ad6c 100755 (executable)
@@ -55,12 +55,12 @@ else
 
     if [ "$build_mode" = "Debug" ]
     then
-    cmake -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=OFF -Denable_lua=ON -Denable_compile_optimizations=ON  -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=ON -Denable_compile_warnings=ON .
+    cmake -Denable_coverage=OFF -Denable_java=ON -Denable_model-checking=OFF -Denable_lua=ON -Denable_compile_optimizations=ON  -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=ON -Denable_compile_warnings=ON .
     fi
 
     if [ "$build_mode" = "ModelChecker" ]
     then
-    cmake -Denable_coverage=ON -Denable_java=ON -Denable_smpi=ON -Denable_model-checking=ON -Denable_lua=ON -Denable_compile_optimizations=OFF -Denable_compile_warnings=ON .
+    cmake -Denable_coverage=OFF -Denable_java=ON -Denable_smpi=ON -Denable_model-checking=ON -Denable_lua=ON -Denable_compile_optimizations=OFF -Denable_compile_warnings=ON .
     fi
 
     if [ "$build_mode" = "DynamicAnalysis" ]
index 5fd8a96..8a65eff 100644 (file)
@@ -10,6 +10,7 @@ sudo aptitude -y install gcc
 sudo aptitude -y install git
 sudo aptitude -y install git-core
 sudo aptitude -y install graphviz-dev graphviz
+sudo aptitude -y install libboost-dev
 sudo aptitude -y install liblua5.1-dev lua5.1
 sudo aptitude -y install libunwind7-dev
 sudo aptitude -y install make
index 35f9832..6dcc08b 100644 (file)
@@ -4,19 +4,20 @@
 
 sudo yum -y -q update
 
+sudo yum -y -q install boost-devel
+sudo yum -y -q install cmake
+sudo yum -y -q install f2c
 sudo yum -y -q install gcc
-sudo yum -y -q install make
+sudo yum -y -q install git-core
+sudo yum -y -q install graphviz-dev graphviz
 sudo yum -y -q install java-1.6.0-openjdk
+sudo yum -y -q install libunwind libunwind-devel
 sudo yum -y -q install lua-devel lua
-sudo yum -y -q install unzip
-sudo yum -y -q install cmake
-sudo yum -y -q install wget
+sudo yum -y -q install make
 sudo yum -y -q install perl
-sudo yum -y -q install graphviz-dev graphviz
-sudo yum -y -q install f2c
-sudo yum -y -q install git-core
 sudo yum -y -q install ruby ruby-devel
-sudo yum -y -q install libunwind libunwind-devel
+sudo yum -y -q install unzip
+sudo yum -y -q install wget
 
 which_svn=`which svn`          #svn necessary
 which_gcc=`which gcc`          #gcc gcc necessary
index cfd59e3..b2b9d25 100644 (file)
@@ -9,6 +9,7 @@ sudo apt-get -y -qq install g++
 sudo apt-get -y -qq install gcc
 sudo apt-get -y -qq install git-core
 sudo apt-get -y -qq install graphviz-dev graphviz
+sudo apt-get -y -qq install libboost-dev
 sudo apt-get -y -qq install liblua5.1-dev lua5.1
 sudo apt-get -y -qq install libunwind7-dev
 sudo apt-get -y -qq install make
index fc86bc3..568a931 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /* Copy to src/include/xbt/ folder  */
 
 /* Benchmarking a code block */
@@ -91,7 +97,7 @@ static inline int bench_end_block(char* block_id)
                clock_gettime(CLOCK_REALTIME, &mybench->end_time);
                struct timespec interval;
                xbt_diff_time(&mybench->start_time, &mybench->end_time, &interval);
-               fprintf(mybench->output, "%s %lf %lf %lf\n", block_id, xbt_get_time(&mybench->start_time), xbt_get_time(&mybench->end_time), xbt_get_time(&interval));
+               fprintf(mybench->output, "%s %f %f %f\n", block_id, xbt_get_time(&mybench->start_time), xbt_get_time(&mybench->end_time), xbt_get_time(&interval));
                return 0;
        }
 }
@@ -127,7 +133,7 @@ static inline int xbt_bench_end(char* block_id)
        if(mybench->block_id == NULL)
                strcat (mybench->block_id, "NONAME");
 
-       fprintf(mybench->output, "%s %lf %lf %lf\n", mybench->block_id, xbt_get_time(&mybench->start_time), xbt_get_time(&mybench->end_time), xbt_get_time(&interval));
+       fprintf(mybench->output, "%s %f %f %f\n", mybench->block_id, xbt_get_time(&mybench->start_time), xbt_get_time(&mybench->end_time), xbt_get_time(&interval));
        return 0;
 }
 
index ba23a65..f4d9fa2 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /* Copy to src/include/xbt/ folder  */
 
 /* Injecting timings for previously benchmarked code blocks */
index ce58aae..b160b3f 100755 (executable)
@@ -1,4 +1,11 @@
 #!/usr/bin/perl -w
+
+# Copyright (c) 2009, 2011, 2014. 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.
+
 use strict;
 
 sub melange {
index f381698..8a54e84 100755 (executable)
@@ -1,5 +1,10 @@
 #!/usr/bin/env python
 
+# Copyright (c) 2010-2011, 2014. 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.
 
 import sys
 from math import sqrt
index 6bffd97..6df8e71 100755 (executable)
@@ -1,5 +1,11 @@
 #!/usr/bin/env python
 
+# Copyright (c) 2010-2011, 2014. 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.
+
 #---------------------------------------------------------------------------------------------------
 # Example invokation:
 # % ./regress.py griffon_skampi_pt2pt.ski.dat 65536 120832
index ea9e3a4..f314d9e 100755 (executable)
@@ -1,4 +1,11 @@
 #!/usr/bin/python
+
+# Copyright (c) 2011, 2014. 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 script takes the following command line parameters
 # 1) an input file containing 2 columns: message size and 1-way trip time
 # 2) the maximum relative error for a line segment
index fd67750..7c1abb6 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2011, 2014. 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. */
+
 /**--------- <copy/paste C code snippet in surf/network.c> -------------
   * produced by:
   * ./regression2.py ./pingpong-in.dat 0.15 30 2 2.4e-5 1.25e8
index 104b4ee..7453925 100644 (file)
@@ -116,7 +116,7 @@ ALWAYS_DETAILED_SEC    = NO
 # members were ordinary class members. Constructors, destructors and assignment
 # operators of the base classes will not be shown.
 
-INLINE_INHERITED_MEMB  = YES
+INLINE_INHERITED_MEMB  = NO
 
 # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
 # path before files name in the file list and in the header files. If set
@@ -322,22 +322,6 @@ INLINE_SIMPLE_STRUCTS  = NO
 
 TYPEDEF_HIDES_STRUCT   = NO
 
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
-# determine which symbols to keep in memory and which to flush to disk.
-# When the cache is full, less often used symbols will be written to disk.
-# For small to medium size projects (<1000 input files) the default value is
-# probably good enough. For larger projects a too small cache size can cause
-# doxygen to be busy swapping symbols to and from disk most of the time
-# causing a significant performance penalty.
-# If the system has enough physical memory increasing the cache will improve the
-# performance by keeping more symbols in memory. Note that the value works on
-# a logarithmic scale so increasing the size by one will roughly double the
-# memory usage. The cache size is given by this formula:
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
-# corresponding to a cache size of 2^16 = 65536 symbols.
-
-SYMBOL_CACHE_SIZE      = 0
-
 # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be
 # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
 # their name and scope. Since this can be an expensive process and often the
@@ -699,6 +683,7 @@ INPUT                  = doxygen/index.doc \
                          @top_srcdir@/src/include/surf \
                          @top_srcdir@/src/xbt/ \
                          @top_srcdir@/src/surf/ \
+                         @top_srcdir@/src/surf/plugins/ \
                          @top_srcdir@/src/msg/ \
                          @top_srcdir@/src/simdag \
                          @top_srcdir@/src/simix \
@@ -766,7 +751,7 @@ RECURSIVE              = NO
 # Note that relative paths are relative to the directory from which doxygen is
 # run.
 
-EXCLUDE                =
+EXCLUDE                = @top_srcdir@/src/simix/simcalls_generated_case.c
 
 # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
 # directories that are symbolic links (a Unix file system feature) are excluded
index ae6a7fb..72c6d04 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2011-2012, 2014. 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/log.h"
 XBT_LOG_NEW_DEFAULT_CATEGORY(HelloWorld,
index 2ad4cd3..1283603 100644 (file)
@@ -128,7 +128,7 @@ http://graal.ens-lyon.fr/~jrouzaud/files/corosimple-linux-amd64-20120914.tgz
 ~~~~{.sh}
 sudo apt-get install mercurial ksh libfreetype6-dev libcups2-dev libasound2-dev gawk openjdk-7-jdk libxext-dev libxrender-dev libxtst-dev
 # Grab the forest extension: we need to source-install it
-hg clone https://bitbucket.org/gxti/hgforest hgforest \endverbatim
+hg clone https://bitbucket.org/gxti/hgforest hgforest
 ~~~~
  -# Configure the mercurial extensions: Edit ~/.hgrc and paste the
     following lines. Don't forget to change the /path/to/forest.py to
@@ -163,13 +163,12 @@ ls -i patches/hotspot/series sources/hotspot/.hg/patches/series
 #  9707849 patches/hotspot/series  
 #  9707849 sources/hotspot/.hg/patches/series
 
-
 # Specify what to compile. 
-export davinci=$(pwd) guards="buildable testable coro-simple"
+export davinci=${pwd} guards="buildable testable coro-simple"
 # Apply the patches
-sh patches/make/each-patch-repo.sh hg qselect --reapply $guards '$(sh $davinci/patches/make/current-release.sh)'
+sh patches/make/each-patch-repo.sh hg qselect --reapply $guards `sh $davinci/patches/make/current-release.sh`
 # Check that it understood that you want the patch applied:
-grep GLOBAL_GUARDS patches/make/* -r
+grep -r GLOBAL_GUARDS patches/make/
 # this should display something like the following (maybe amonst other unrelated lines)
 # GLOBAL_GUARDS=buildable testable coro-simple
 # If this does not work, edit patches/make/Makefile,
@@ -178,9 +177,10 @@ grep GLOBAL_GUARDS patches/make/* -r
 
 
 # Finish the setup
-(cd patches/make; make setup && make force && make && make FORCE_VERSIONS=1 && echo "Sources are properly setup")
+cd patches/make;
+make setup && make force && make && make FORCE_VERSIONS=1 && echo "Sources are properly setup"
 # If this last command failed, check your mercurial config within ~/.hgrc (see above)
-~~~~       
+~~~~
  -# Compile it all
 ~~~~{.sh}
 unset LD_LIBRARY_PATH
index f7c796b..cf71bb1 100644 (file)
@@ -26,60 +26,70 @@ user@caraja:~/workspace/simgrid/src$ cg "TUTORIAL: New API"
 \endverbatim
 
 \section simgrid_dev_guide_model How to add a new model in surf?
-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
+A model in simgrid is composed of three classes: Model, Resource and Action
+(surf_interface.hpp). 
 
-\section simgrid_dev_guide_simcall How to add a new simcall?
-To add a simcall called `<name>` with three arguments `arg1`, `arg2` and `arg3`
-of type `targ1`, `targ2`, `targ3` respectively and which return a value of
-type `tret` you must first define the simcall function in the the
-`include/simgrid/simix.h` and make it call the automatically generated `BODY`
-function which will do all the bad stuff.
+Actually there are five kind of models: CpuModel, NetworkModel, WorkstationModel,
+WorkstationVMModel and StorageModel. For each kind of model, there is an
+interface (e.g.: cpu_interface.hpp) and some implementations (e.g.: cpu_cas01.hpp,
+cpu_ti.hpp). 
 
-~~~~{.c}
-tret simcall_<NAME>(targ1 arg1, targ2 arg2, targ3 arg3){
-  return simcall_BODY_<NAME>(arg1, arg2, arg3);
-}
-~~~~
+If you want to create a new implementation of a kind of model you must extend
+the classes of the corresponding interface.
 
-Then you must add an new line in the list `SIMCALL_LIST1` of simcall actions in
-`src/simix/smx_smurf_private.h`. The arguments of the `ACTION` are:
-- the simcall enum name,
-- the `<name>` of the simcall,
-- if the result must be automatically saved in the simcall
- (`WITH_ANSWER`/`WITHOUT_ANSWER`)
-- the return type,
-- the arguments.
+If you want to create a new kind of model, you must create a new interface
+ where you extend the classes Model, Resource and Action, and then create an
+ implementation of this interface.
 
-The return type and the arguments must be define by using `TSPEC(name, type)`,
-or one of the predefined type (e.g., `TSTRING(n)`, `TINT(n)`, `TVOID(n)`,
-`TPTR(n)`, â€¦). You must get something like this:
+\section simgrid_dev_guide_simcall How to add a new simcall?
+A simcall is used to go from user mode to kernel mode. The workflow of
+a simcall is the following:
 
-~~~~{.c}
-ACTION(SIMCALL_<NAME>, <name>, WITH_ANSWER, TSPEC(result, tret), TSPEC(arg1, targ1), TSPEC(arg2, targ2), TSPEC(arg3, targ3)) sep  \
-~~~~
+- `<ret> simcall_<name>(<args>)`
+ - `simcall_BODY_<name>(<args>)`
+  - create the simcall
+  - `SIMIX_process_yield` if not maestro
+  - ========== KERNEL MODE ==========
+  - `SIMIX_simcall_pre`
+   - `SIMIX_pre_<name>(simcall, <args>)`
+   - `SIMIX_simcall_answer(simcall)`
+
+To simplify the simcall creation, we have made a python script that
+generate most of the code and give helpers for the remaining stuff.
+The script generating the simcalls (src/simix/simcalls.in) take in input
+the src/simix/simcalls.in file where the simcalls are defined and generate
+the following files:
 
-Finaly you have to define the kernel code in a `SIMIX_pre_<name>` in the
-corresponding src/simix/smx_*.c file:
+- simcall_generated_args_getter_setter.h:
+  functions to get and set simcall arguments
+- simcall_generated_res_getter_setter.h:
+  functions to get and set simcall result
+- simcall_generated_body.c:
+  the BODY function of the simcall
+- simcall_generated_case.c:
+  the case of the SIMIX_simcall_pre function
+- simcall_generated_enum.h:
+  the enum of simcalls
+- simcall_generated_string.c:
+  string corresponding to the enum to debug
 
-~~~~{.c}
-tret SIMIX_pre_<name>(smx_simcall_t simcall, targ1 arg1, targ2 arg2, targ3 arg3) {
-  SIMIX_<NAME>(arg1, arg2, arg3);
-}
+Furthermode if the simcall_<name> or the SIMIX_pre_<name> function are missing,
+a warning will show up with a prototype of the corresponding fonction to fill.
 
-tret SIMIX_<name>(targ1 arg1, targ2 arg2, targ3 arg3) {
-  // Your code in kernel mode
-}
+The simcall.in file list all the simcalls in sections. A line starting by "##"
+define a new section which will be replace by a "ifdef" in the generated code.
+There is a simcall by line which follow this format:
+
+~~~~
+Simcall -> Name HasAnswer Res Args
+Name -> [a-z0-9_]+
+Has_Answer -> "True" | "False"
+Res -> "(" Type MaybeCast ")"
+Args -> Args Arg | Arg
+Arg -> "(" Name "," Type MaybeCast ")"
+Type -> "char" | "const char*" | "int" | "long" | "unsigned char" | "unsigned short" | "unsigned int" | "unsigned long" | "float" | "double" | "void*" | "FPtr" | "const void*" | "size_t" | "sg_size_t" | "void" | "void*"
+MaybeCast -> "," Cast | ""
+Cast -> [a-z0-9_* ]+
 ~~~~
 
 \section simgrid_dev_guide_tag What is How to add a new tag for xml files?
index 8867f4c..63aebcf 100644 (file)
@@ -188,13 +188,6 @@ accepts several options, as listed below.
       your simulation speed even if you simulate without activating
       the model-checker. We are working on improving this situation.
 
-  @li <b>enable_supernovae</b> (ON/OFF): If you use an ancient
-      compiler (such as gcc prior to 4.6), you want to enable this
-      option to ensure that the whole SimGrid library is presented to
-      the compiler as a unique compilation unit to allow cross-units
-      optimizations. This is useless on modern compilers (and will
-      soon be droped).
-
   @li <b>enable_compile_warnings</b> (ON/OFF): request the compiler to
       issue error message whenever the source code is not perfectly
       clean. If you develop SimGrid itself, you must activate it to
index e091538..0851aff 100644 (file)
@@ -105,19 +105,10 @@ available on the [online documentation][fn:4] and in the tutorials:
 
 ## Installing SimGrid
 
-    sudo apt-get install simgrid   
-    
-This tutorial requires simgrid 3.8 at last so you may need to get
-the [debian package](http://packages.debian.org/unstable/main/simgrid). Here is a shortcut:
-
-- AMD64: http://ftp.de.debian.org/debian/pool/main/s/simgrid/simgrid_3.8.1-2_amd64.deb
-- i386: http://ftp.de.debian.org/debian/pool/main/s/simgrid/simgrid_3.8.1-2_i386.deb
-
-Then
+    sudo apt-get install libsimgrid-dev
 
-~~~~{.sh}
-sudo dpkg -i simgrid_3.8*.deb
-~~~~
+This tutorial requires simgrid 3.8 at least so you may need to get
+the [debian packages](http://packages.debian.org/libsimgrid-dev).
 
 # Recommended Steps
 
index d652b97..b27ec73 100644 (file)
@@ -118,6 +118,13 @@ details).
  *
  */
 
+/** @defgroup msg_storage_management Storage Management Functions
+ *  @ingroup MSG_API
+ *  @brief This section describes the storage structure of MSG
+ *         (#msg_storage_t) and the functions for managing it. It
+ *   is based on POSIX functions.
+ */
+
 /** @defgroup msg_file_management File Management Functions
  *  @ingroup MSG_API
  *  @brief This section describes the file structure of MSG
@@ -125,7 +132,6 @@ details).
  *   is based on POSIX functions.
  */
 
-
 /**
 @defgroup msg_trace_driven Trace-driven simulations
 @ingroup MSG_API
index a756aef..7e3733f 100644 (file)
@@ -1,10 +1,21 @@
 /** \addtogroup SURF_API
-
+  
   \section SURF_doc Surf documentation
+   Surf is composed several components:
    - \ref SURF_simulation
    - \ref SURF_actions
    - \ref SURF_resources
    - \ref SURF_build_api
+   - \ref SURF_interface
+   - \ref SURF_routing_interface
+   - \ref SURF_cpu_interface
+   - \ref SURF_network_interface
+   - \ref SURF_storage_interface
+   - \ref SURF_workstation_interface
+   - \ref SURF_vm_workstation_interface
+   - \ref SURF_callbacks
+   - \ref SURF_plugin_energy
+   
 
 */
 
     the simulation and exiting SURF.
 */
 
-/** \defgroup SURF_actions SURF actions
-    \ingroup SURF_API
-    \brief This section describes the different datatypes and operations related to the actions in SURF.
-
-    \htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Actions" --> \endhtmlonly
-*/
-
-/** \defgroup SURF_resources SURF resources
-    \ingroup SURF_API
-    \brief This section describes the different datatypes and operations related to the resources in SURF.
-
-    \htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Resources" --> \endhtmlonly
-*/
-
 /** \defgroup SURF_build_api Create a new API
     \ingroup SURF_API
     \brief How to build a new API on top of SURF
     we strongly recommand you to contact us before anyway.
 
 */
+
+/**
+@defgroup SURF_c_bindings   SURF C bindings
+@ingroup SURF_API
+@brief Describes the c bindings of SURF
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Surf C bindings" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_routing_interface   SURF Routing Interface
+@ingroup SURF_API
+@brief Describes the routing interface
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Surf Routing" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_interface   SURF Interface
+@ingroup SURF_API
+@brief Describes the general interface for all components (Cpu, Network, Storage, Workstation, WorkstationVM)
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Surf Interface" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_cpu_interface   SURF Cpu Interface
+@ingroup SURF_API
+@brief Describes the general Cpu interface for all Cpu implementations
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Cpu Interface" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_network_interface   SURF Network Interface
+@ingroup SURF_API
+@brief Describes the general Network interface for all Network implementations
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Network Interface" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_storage_interface   SURF Storage Interface
+@ingroup SURF_API
+@brief Describes the general  interface for all Storage implementations
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Storage Interface" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_workstation_interface   SURF Workstation Interface
+@ingroup SURF_API
+@brief Describes the general  interface for all Workstation implementations
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Workstation Interface" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_vm_workstation_interface   SURF VM Workstation Interface
+@ingroup SURF_API
+@brief Describes the general  interface for all VM Workstation implementations
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="VM Workstation Interface" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_lmm   SURF Linear MaxMin
+@ingroup SURF_API
+@brief Describes how the linear MaxMin system work
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="SURF Linear MaxMin" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_callbacks   SURF callbacks
+@ingroup SURF_API
+@brief Describes how to use the SURF callbacks
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="SURF callbacks" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_plugin_energy   SURF Energy Plugin
+@ingroup SURF_API
+@brief Describes how to use the energy plugin.
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Energy plugin" --> @endhtmlonly
+*/
\ No newline at end of file
index 9f5fa98..b9ab520 100644 (file)
@@ -18,7 +18,7 @@ type the following: \verbatim
 my_simulator --cfg=Item:Value (other arguments)
 \endverbatim
 
-Several \c --cfg command line arguments can naturally be used. If you
+Several \c `--cfg` command line arguments can naturally be used. If you
 need to include spaces in the argument, don't forget to quote the
 argument. You can even escape the included quotes (write \' for ' if
 you have your argument between ').
@@ -31,7 +31,8 @@ ignored so you don't really need to pass it. The important par is that
 within that tag, you can pass one or several \c \<prop\> tags to specify
 the configuration to use. For example, setting \c Item to \c Value
 can be done by adding the following to the beginning of your platform
-file: \verbatim
+file: 
+\verbatim
 <config>
   <prop id="Item" value="Value"/>
 </config>
@@ -390,8 +391,8 @@ 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. For the thread factory, the default value 
+is 128 (in KiB), while our Chord simulation works with stacks as small
+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.
 
index 1101198..5c3ae9e 100644 (file)
@@ -372,14 +372,17 @@ router_name = prefix + clusterId + router_ + suffix;
 
 <b>cluster example</b>
 \verbatim
-<cluster id="my_cluster_1" prefix="" suffix=""
-               radical="0-262144"      power="1000000000"    bw="125000000"     lat="5E-5"/>
-<cluster id="my_cluster_1" prefix="c-" suffix=".me"
-               radical="0-99"  power="1000000000"    bw="125000000"     lat="5E-5"
-        bb_bw="2250000000" bb_lat="5E-4"/>
+<cluster id="my_cluster_1" prefix="" suffix="" radical="0-262144"
+         power="1e9" bw="125e6" lat="5E-5"/>
+
+<cluster id="my_cluster_1" prefix="c-" suffix=".me" radical="0-99"
+         power="1e9" bw="125e6" lat="5E-5"
+         bb_bw="2.25e9" bb_lat="5E-4"/>
 \endverbatim
-The second examples creates 100 machines, which names are the following:
+The second examples creates one router and 100 machines, which names 
+are the following:
 \verbatim
+c-my_cluster_1_router.me
 c-0.my_cluster_1.me
 c-1.my_cluster_1.me
 c-2.my_cluster_1.me
@@ -606,14 +609,28 @@ find /path/you/want -type f -exec ls -l {} \; 2>/dev/null > ./content.txt
 \li <b>content</b>: default value 0. The file containing the disk
     content. (may be moved soon or later to <b>storage</b> tag. 
 
-The tag must contains some predefined prop, as may do some other
-resources tags. This should moved to attributes soon or later. 
-<b>storage_type</b> mandatory <b>prop</b> :
+The tag must contains some predefined model prop, as may do some other
+resources tags.
+<b>storage_type</b> mandatory <b>model_prop</b> :
 \li <b>Bwrite</b>: value in B/s. Write throughput
 \li <b>Bread</b>: value in B/s. Read throughput
 \li <b>Bconnexion</b>: value in B/s. Connection throughput (i.e. the
     throughput of the storage connector). 
 
+A storage_type can also contain the <b>prop</b> tag. The prop tag allows you
+to define additional information on this storage_type following the
+attribute/value schema. You may want to use it to give information to
+the tool you use for rendering your simulation, for example.
+
+\verbatim
+<storage_type id="single_HDD" model="linear_no_lat" size="4000" content_type="txt_unix">
+  <model_prop id="Bwrite" value="30MBps" />
+  <model_prop id="Bread" value="100MBps" />
+  <model_prop id="Bconnection" value="150MBps" />
+  <b><prop id="Brand" value="Western Digital" /></b>
+</storage_type>
+\endverbatim
+
 \subsubsection pf_sto_st storage
 
 <b>storage_type</b> attributes :
index 0311b6e..b283dc5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8a7acff..5b240e3 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 98a5687..aa03897 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index a51c9a9..c2891d5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 35755cc..1f4bb50 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 7777767..983fecd 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package async;
 
index 9fa045c..1e7b439 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package async;
 import org.simgrid.msg.Task;
index a4913a6..fbf394f 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package async;
 import org.simgrid.msg.Host;
index e39f041..4960b75 100644 (file)
@@ -1,12 +1,10 @@
-/*
- * Master of a basic master/slave example in Java
- *
- * Copyright (c) 2006-2013. 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. 
- */
+/* Master of a basic master/slave example in Java */
+
+/* Copyright (c) 2006-2014. 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. */
 
 package async;
 import java.util.ArrayList;
index a4a651f..1d4f567 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2007, 2010, 2013. 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. 
- */
+/* Copyright (c) 2006-2007, 2010, 2013-2014. 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. */
+
 package async;
 import org.simgrid.msg.Comm;
 import org.simgrid.msg.Host;
index 72c3ab7..1a1321d 100644 (file)
@@ -3,6 +3,7 @@
 ! output sort
 ! timeout 30
 $ java -classpath ${classpath:=.} async/AsyncTest ${srcdir:=.}/platform.xml ${srcdir:=.}/async/asyncDeployment.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Using regular java threads. Coroutines could speed your simulation up.
 > [  0.000000] (10:async.Slave@Robert) Receiving on 'slave_8'
 > [  0.000000] (11:async.Slave@Sirois) Receiving on 'slave_9'
 > [  0.000000] (12:async.Slave@Monique) Receiving on 'slave_10'
@@ -53,4 +54,3 @@ $ java -classpath ${classpath:=.} async/AsyncTest ${srcdir:=.}/platform.xml ${sr
 > [ 25.851463] (2:async.Forwarder@Jackson) I'm done. See you!
 > [ 26.357007] (3:async.Forwarder@Casavant) I'm done. See you!
 > [ 29.000728] (0:@) MSG_main finished; Cleaning up the simulation...
-> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up.
index 5685bd9..b488195 100644 (file)
@@ -1,12 +1,9 @@
-/**
-* Copyright (c) 2012-2013. 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.
-*
-*/
+/* Copyright (c) 2012-2014. 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. */
+
 package bittorrent;
 
 import org.simgrid.msg.Msg;
index 7e78b5a..1fe856e 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package bittorrent;
 /**
  * Common constants for use in the simulation
index 29a3011..4ca20fd 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package bittorrent;
 
 import java.util.Arrays;
index 88c04c7..3c98d15 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package bittorrent;
 
 import org.simgrid.msg.Task;
index f1f10c1..10fd6c5 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package bittorrent;
 
 import java.util.ArrayList;
index 1a812b6..338b763 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package bittorrent;
 import java.util.ArrayList;
 
index 4b06649..beaf7b8 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package bittorrent;
 import java.util.ArrayList;
 
index 9ba8611..d4ea09e 100755 (executable)
@@ -1,5 +1,11 @@
 #!/usr/bin/python
 
+# Copyright (c) 2013-2014. 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 script generates a specific deployment file for the Bittorrent example.
 # It assumes that the platform will be a cluster.
 # Usage: python generate.py nb_nodes nb_bits end_date percentage
index 36038a1..2f3d7fa 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package chord;
 
 import org.simgrid.msg.Msg;
index aac5083..b10940c 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package chord;
 
 import org.simgrid.msg.Task;
index 6531dc0..7031c23 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package chord;
 /**
  * Common constants used over the simulation
index f0d2c94..a740872 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package chord;
 
 public class FindSuccessorAnswerTask extends ChordTask {
index 51c2310..db77027 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package chord;
 
 public class FindSuccessorTask extends ChordTask {
index 3c58bc1..ac1b142 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package chord;
 
 public class GetPredecessorAnswerTask extends ChordTask {
index a3b0c0c..38fecab 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package chord;
 
 public class GetPredecessorTask extends ChordTask {
index 64db0e5..27cb63a 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package chord;
 
 import org.simgrid.msg.Comm;
index 84094ca..b36c4ca 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package chord;
 
 public class NotifyTask extends ChordTask {
index 3e64460..9848bc3 100644 (file)
@@ -1,23 +1,21 @@
-/*
- * Copyright (c) 2012-2013. 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package cloud;
 
 import org.simgrid.msg.Host;
 import org.simgrid.msg.Msg;
 import org.simgrid.msg.MsgException;
-
 /**
  * Example showing the use of the new experimental Cloud API.
  */
 public class Cloud {
        public static final double task_comp_size = 10;
        public static final double task_comm_size = 10;
-
+       public static final int hostNB = 2 ; 
        public static void main(String[] args) throws MsgException {       
            Msg.init(args); 
            
@@ -28,15 +26,15 @@ public class Cloud {
            }
            /* Construct the platform */
                Msg.createEnvironment(args[0]);
-                 /* Retrieve the 10 first hosts of the platform file */
                Host[] hosts = Host.all();
-               if (hosts.length < 10) {
-                       Msg.info("I need at least 10 hosts in the platform file, but " + args[0] + " contains only " + hosts.length + " hosts");
+               if (hosts.length < hostNB+1) {
+                       Msg.info("I need at least "+ (hostNB+1) +"  hosts in the platform file, but " + args[0] + " contains only " + hosts.length + " hosts");
                        System.exit(42);
                }
+               Msg.info("Start"+ hostNB +"  hosts");
                new Master(hosts[0],"Master",hosts).start();
                /* Execute the simulation */
                Msg.run();
                
     }
-}
\ No newline at end of file
+}
index ffaf4b9..b710b2f 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2012-2013. 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package cloud;
 
 import org.simgrid.msg.Task;
index 8710bfb..57806fd 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2012-2013. 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package cloud;
 
 import java.util.ArrayList;
@@ -24,31 +23,36 @@ public class Master extends Process {
                this.hosts = hosts;
        }
        public void main(String[] args) throws MsgException {
-               int slavesCount = 10;
+               int slavesCount = Cloud.hostNB;
                
                ArrayList<VM> vms = new ArrayList<VM>();
                
+               // Create one VM per host and bind a process inside each one. 
                for (int i = 0; i < slavesCount; i++) {
-                       Slave slave = new Slave(hosts[i],i);
-                       slave.start();
-                       VM vm = new VM(hosts[i],hosts[i]+"_"+i,1);
-                       vm.bind(slave);
+                       Msg.info("create VM0"+i);       
+                       VM vm = new VM(hosts[i+1],"VM0"+i);
+                       vm.start();
                        vms.add(vm);
+                       Slave slave = new Slave(vm,i);
+                       Msg.info("Put Worker "+slave.msgName()+ " on "+vm.getName());
+                       slave.start();
+       
                }
                Msg.info("Launched " + vms.size() + " VMs");
                
                Msg.info("Send a first batch of work to everyone");
                workBatch(slavesCount);
                
-               Msg.info("Now suspend all VMs, just for fun");
+               Msg.info("Suspend all VMs");
                for (int i = 0; i < vms.size(); i++) {
+                       Msg.info("Suspend "+vms.get(i).getName());
                        vms.get(i).suspend();
                }
                
                Msg.info("Wait a while");
                waitFor(2);
                
-               Msg.info("Enough. Let's resume everybody.");
+               Msg.info("Resume all VMs.");
                for (int i = 0; i < vms.size(); i++) {
                        vms.get(i).resume();
                }
@@ -56,42 +60,37 @@ public class Master extends Process {
                Msg.info("Sleep long enough for everyone to be done with previous batch of work");
                waitFor(1000 - Msg.getClock());
                
-               Msg.info("Add one more process per VM.");
+/*             Msg.info("Add one more process per VM.");
                for (int i = 0; i < vms.size(); i++) {
                        VM vm = vms.get(i);
-                       Slave slave = new Slave(hosts[i],i + vms.size());
+                       Slave slave = new Slave(vm,i + vms.size());
                        slave.start();
-                       vm.bind(slave);
-               }
-               
-               Msg.info("Migrate everyone to the second host.");
-               for (int i = 0; i < vms.size(); i++) {
-                       vms.get(i).migrate(hosts[1]);
                }
-               
-               Msg.info("Suspend everyone, move them to the third host, and resume them.");
+       
+               workBatch(slavesCount * 2);
+*/
+
+               Msg.info("Migrate everyone to "+hosts[3].getName());
                for (int i = 0; i < vms.size(); i++) {
-                       VM vm = vms.get(i);
-                       vm.suspend();
-                       vm.migrate(hosts[2]);
-                       vm.resume();
+                       Msg.info("Migrate "+vms.get(i).getName()+"from"+hosts[i+1].getName()+"to "+hosts[3].getName());
+                       vms.get(i).migrate(hosts[2]);
                }
                
-               workBatch(slavesCount * 2);
                
                Msg.info("Let's shut down the simulation and kill everyone.");
                
                for (int i = 0; i < vms.size(); i++) {
                        vms.get(i).shutdown();
+                       vms.get(i).destroy();
                }                               
                Msg.info("Master done.");
        }
        
        public void workBatch(int slavesCount) throws MsgException {
                for (int i = 0; i < slavesCount; i++) {
-                       Task task = new Task("Task_" + i, Cloud.task_comp_size, Cloud.task_comm_size);
-                       Msg.info("Sending to " + i);
-                       task.send("slave_" + i);
+                       Task task = new Task("Task0" + i, Cloud.task_comp_size, Cloud.task_comm_size);
+                       Msg.info("Sending to WRK0" + i);
+                       task.send("MBOX:WRK0" + i);
                }
        }
 }
index 4d9963e..7aaa48e 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2012-2013. 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package cloud;
 
 import org.simgrid.msg.Host;
@@ -16,15 +15,15 @@ import org.simgrid.msg.Task;
 public class Slave extends Process {
        private int number;
        public Slave(Host host, int number) {
-               super(host,"Slave " + number,null);
+               super(host,"WRK0" + number,null);
                this.number = number;
        }
        public void main(String[] args) throws MsgException {
+               Msg.info(this.msgName() +" is listenning on MBOX:WRK0"+ number);
                while(true) {                   
-                       Msg.info("Receiving on " + "slave_" + number);
                        Task task;
                         try {
-                                task = Task.receive("slave_"+number);
+                                task = Task.receive("MBOX:WRK0"+number);
                         } catch (MsgException e) {
                                 Msg.debug("Received failed. I'm done. See you!");
                                 break;
@@ -39,9 +38,9 @@ public class Slave extends Process {
                        } catch (MsgException e) {
 
                        }
-                       Msg.info("\"" + task.getName() + "\" done ");
+                       Msg.info(this.msgName() +" executed task (" + task.getName()+")");
                }
 
                
        }
-}
\ No newline at end of file
+}
index c8c05d1..1f3f49d 100644 (file)
 ! output sort
 
 $ java -classpath ${classpath:=.} cloud/Cloud ${srcdir:=.}/platform.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (10:Slave 8@Jean_Yves) Receiving on slave_8
-> [  0.000000] (11:Slave 9@Fafard) Receiving on slave_9
-> [  0.000000] (1:Master@Jacquelin) Launched 10 VMs
+> [  0.000000] (0:@) Using regular java threads. Coroutines could speed your simulation up.
+> [  0.000000] (0:@) Start2  hosts
+> [  0.000000] (1:Master@Jacquelin) create VM00
+> [  0.000000] (0:@) Create VM(VM00)@PM(Intel) with 0 mounted disks
+> [  0.000000] (1:Master@Jacquelin) Put Worker WRK00 on VM00
+> [  0.000000] (2:WRK00@VM00) WRK00 is listenning on MBOX:WRK00
+> [  0.000000] (1:Master@Jacquelin) create VM01
+> [  0.000000] (0:@) Create VM(VM01)@PM(Provost) with 0 mounted disks
+> [  0.000000] (1:Master@Jacquelin) Put Worker WRK01 on VM01
+> [  0.000000] (3:WRK01@VM01) WRK01 is listenning on MBOX:WRK01
+> [  0.000000] (1:Master@Jacquelin) Launched 2 VMs
 > [  0.000000] (1:Master@Jacquelin) Send a first batch of work to everyone
-> [  0.000000] (1:Master@Jacquelin) Sending to 0
-> [  0.000000] (2:Slave 0@Jacquelin) Receiving on slave_0
-> [  0.000000] (3:Slave 1@Intel) Receiving on slave_1
-> [  0.000000] (4:Slave 2@Provost) Receiving on slave_2
-> [  0.000000] (5:Slave 3@Fernand) Receiving on slave_3
-> [  0.000000] (6:Slave 4@Bescherelle) Receiving on slave_4
-> [  0.000000] (7:Slave 5@Ethernet) Receiving on slave_5
-> [  0.000000] (8:Slave 6@Kuenning) Receiving on slave_6
-> [  0.000000] (9:Slave 7@Dodge) Receiving on slave_7
-> [  0.000195] (1:Master@Jacquelin) Sending to 1
-> [  0.000195] (2:Slave 0@Jacquelin) Received "Task_0". Processing it.
-> [  0.000195] (2:Slave 0@Jacquelin) "Task_0" done 
-> [  0.000195] (2:Slave 0@Jacquelin) Receiving on slave_0
-> [  0.918916] (1:Master@Jacquelin) Sending to 2
-> [  0.918916] (3:Slave 1@Intel) Received "Task_1". Processing it.
-> [  0.918916] (3:Slave 1@Intel) "Task_1" done 
-> [  0.918916] (3:Slave 1@Intel) Receiving on slave_1
-> [  2.798593] (1:Master@Jacquelin) Sending to 3
-> [  2.798593] (4:Slave 2@Provost) Received "Task_2". Processing it.
-> [  2.798593] (4:Slave 2@Provost) "Task_2" done 
-> [  2.798593] (4:Slave 2@Provost) Receiving on slave_2
-> [  4.624255] (1:Master@Jacquelin) Sending to 4
-> [  4.624255] (5:Slave 3@Fernand) Received "Task_3". Processing it.
-> [  4.624255] (5:Slave 3@Fernand) "Task_3" done 
-> [  4.624255] (5:Slave 3@Fernand) Receiving on slave_3
-> [  5.487049] (1:Master@Jacquelin) Sending to 5
-> [  5.487049] (6:Slave 4@Bescherelle) Received "Task_4". Processing it.
-> [  5.487049] (6:Slave 4@Bescherelle) "Task_4" done 
-> [  5.487049] (6:Slave 4@Bescherelle) Receiving on slave_4
-> [  6.547253] (1:Master@Jacquelin) Sending to 6
-> [  6.547253] (7:Slave 5@Ethernet) Received "Task_5". Processing it.
-> [  6.547253] (7:Slave 5@Ethernet) "Task_5" done 
-> [  6.547253] (7:Slave 5@Ethernet) Receiving on slave_5
-> [  7.404569] (1:Master@Jacquelin) Sending to 7
-> [  7.404569] (8:Slave 6@Kuenning) Received "Task_6". Processing it.
-> [  7.404569] (8:Slave 6@Kuenning) "Task_6" done 
-> [  7.404569] (8:Slave 6@Kuenning) Receiving on slave_6
-> [  8.804761] (1:Master@Jacquelin) Sending to 8
-> [  8.804761] (9:Slave 7@Dodge) Received "Task_7". Processing it.
-> [  8.804761] (9:Slave 7@Dodge) "Task_7" done 
-> [  8.804761] (9:Slave 7@Dodge) Receiving on slave_7
-> [  9.729891] (10:Slave 8@Jean_Yves) Received "Task_8". Processing it.
-> [  9.729891] (1:Master@Jacquelin) Sending to 9
-> [  9.729892] (10:Slave 8@Jean_Yves) "Task_8" done 
-> [  9.729892] (10:Slave 8@Jean_Yves) Receiving on slave_8
-> [ 11.714553] (11:Slave 9@Fafard) Received "Task_9". Processing it.
-> [ 11.714553] (1:Master@Jacquelin) Now suspend all VMs, just for fun
-> [ 11.714553] (1:Master@Jacquelin) Wait a while
-> [ 13.714553] (11:Slave 9@Fafard) "Task_9" done 
-> [ 13.714553] (11:Slave 9@Fafard) Receiving on slave_9
-> [ 13.714553] (1:Master@Jacquelin) Enough. Let's resume everybody.
-> [ 13.714553] (1:Master@Jacquelin) Sleep long enough for everyone to be done with previous batch of work
-> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up.
-> [1000.000000] (12:Slave 10@Jacquelin) Receiving on slave_10
-> [1000.000000] (13:Slave 11@Intel) Receiving on slave_11
-> [1000.000000] (14:Slave 12@Provost) Receiving on slave_12
-> [1000.000000] (15:Slave 13@Fernand) Receiving on slave_13
-> [1000.000000] (16:Slave 14@Bescherelle) Receiving on slave_14
-> [1000.000000] (17:Slave 15@Ethernet) Receiving on slave_15
-> [1000.000000] (18:Slave 16@Kuenning) Receiving on slave_16
-> [1000.000000] (19:Slave 17@Dodge) Receiving on slave_17
-> [1000.000000] (1:Master@Jacquelin) Add one more process per VM.
-> [1000.000000] (1:Master@Jacquelin) Migrate everyone to the second host.
-> [1000.000000] (1:Master@Jacquelin) Suspend everyone, move them to the third host, and resume them.
-> [1000.000000] (1:Master@Jacquelin) Sending to 0
-> [1000.000000] (20:Slave 18@Jean_Yves) Receiving on slave_18
-> [1000.000000] (21:Slave 19@Fafard) Receiving on slave_19
-> [1000.000195] (1:Master@Jacquelin) Sending to 1
-> [1000.000195] (2:Slave 0@Provost) Received "Task_0". Processing it.
-> [1000.000195] (2:Slave 0@Provost) "Task_0" done 
-> [1000.000195] (2:Slave 0@Provost) Receiving on slave_0
-> [1000.918916] (1:Master@Jacquelin) Sending to 2
-> [1000.918916] (3:Slave 1@Provost) Received "Task_1". Processing it.
-> [1000.918916] (3:Slave 1@Provost) "Task_1" done 
-> [1000.918916] (3:Slave 1@Provost) Receiving on slave_1
-> [1002.798593] (1:Master@Jacquelin) Sending to 3
-> [1002.798593] (4:Slave 2@Provost) Received "Task_2". Processing it.
-> [1002.798593] (4:Slave 2@Provost) "Task_2" done 
-> [1002.798593] (4:Slave 2@Provost) Receiving on slave_2
-> [1004.624255] (1:Master@Jacquelin) Sending to 4
-> [1004.624255] (5:Slave 3@Provost) Received "Task_3". Processing it.
-> [1004.624255] (5:Slave 3@Provost) "Task_3" done 
-> [1004.624255] (5:Slave 3@Provost) Receiving on slave_3
-> [1005.487049] (1:Master@Jacquelin) Sending to 5
-> [1005.487049] (6:Slave 4@Provost) Received "Task_4". Processing it.
-> [1005.487049] (6:Slave 4@Provost) "Task_4" done 
-> [1005.487049] (6:Slave 4@Provost) Receiving on slave_4
-> [1006.547253] (1:Master@Jacquelin) Sending to 6
-> [1006.547253] (7:Slave 5@Provost) Received "Task_5". Processing it.
-> [1006.547253] (7:Slave 5@Provost) "Task_5" done 
-> [1006.547253] (7:Slave 5@Provost) Receiving on slave_5
-> [1007.404569] (1:Master@Jacquelin) Sending to 7
-> [1007.404569] (8:Slave 6@Provost) Received "Task_6". Processing it.
-> [1007.404569] (8:Slave 6@Provost) "Task_6" done 
-> [1007.404569] (8:Slave 6@Provost) Receiving on slave_6
-> [1008.804761] (1:Master@Jacquelin) Sending to 8
-> [1008.804761] (9:Slave 7@Provost) Received "Task_7". Processing it.
-> [1008.804761] (9:Slave 7@Provost) "Task_7" done 
-> [1008.804761] (9:Slave 7@Provost) Receiving on slave_7
-> [1009.729891] (10:Slave 8@Provost) Received "Task_8". Processing it.
-> [1009.729891] (1:Master@Jacquelin) Sending to 9
-> [1009.729892] (10:Slave 8@Provost) "Task_8" done 
-> [1009.729892] (10:Slave 8@Provost) Receiving on slave_8
-> [1011.714553] (11:Slave 9@Provost) Received "Task_9". Processing it.
-> [1011.714553] (11:Slave 9@Provost) "Task_9" done 
-> [1011.714553] (11:Slave 9@Provost) Receiving on slave_9
-> [1011.714553] (1:Master@Jacquelin) Sending to 10
-> [1011.714748] (12:Slave 10@Provost) Received "Task_10". Processing it.
-> [1011.714748] (12:Slave 10@Provost) "Task_10" done 
-> [1011.714748] (12:Slave 10@Provost) Receiving on slave_10
-> [1011.714748] (1:Master@Jacquelin) Sending to 11
-> [1012.633469] (13:Slave 11@Provost) Received "Task_11". Processing it.
-> [1012.633469] (13:Slave 11@Provost) "Task_11" done 
-> [1012.633469] (13:Slave 11@Provost) Receiving on slave_11
-> [1012.633469] (1:Master@Jacquelin) Sending to 12
-> [1014.513146] (14:Slave 12@Provost) Received "Task_12". Processing it.
-> [1014.513146] (14:Slave 12@Provost) "Task_12" done 
-> [1014.513146] (14:Slave 12@Provost) Receiving on slave_12
-> [1014.513146] (1:Master@Jacquelin) Sending to 13
-> [1016.338807] (15:Slave 13@Provost) Received "Task_13". Processing it.
-> [1016.338807] (15:Slave 13@Provost) "Task_13" done 
-> [1016.338807] (15:Slave 13@Provost) Receiving on slave_13
-> [1016.338807] (1:Master@Jacquelin) Sending to 14
-> [1017.201602] (16:Slave 14@Provost) Received "Task_14". Processing it.
-> [1017.201602] (16:Slave 14@Provost) "Task_14" done 
-> [1017.201602] (16:Slave 14@Provost) Receiving on slave_14
-> [1017.201602] (1:Master@Jacquelin) Sending to 15
-> [1018.261806] (17:Slave 15@Provost) Received "Task_15". Processing it.
-> [1018.261806] (17:Slave 15@Provost) "Task_15" done 
-> [1018.261806] (17:Slave 15@Provost) Receiving on slave_15
-> [1018.261806] (1:Master@Jacquelin) Sending to 16
-> [1019.119122] (18:Slave 16@Provost) Received "Task_16". Processing it.
-> [1019.119122] (18:Slave 16@Provost) "Task_16" done 
-> [1019.119122] (18:Slave 16@Provost) Receiving on slave_16
-> [1019.119122] (1:Master@Jacquelin) Sending to 17
-> [1020.519313] (19:Slave 17@Provost) Received "Task_17". Processing it.
-> [1020.519313] (19:Slave 17@Provost) "Task_17" done 
-> [1020.519313] (19:Slave 17@Provost) Receiving on slave_17
-> [1020.519313] (1:Master@Jacquelin) Sending to 18
-> [1021.444444] (1:Master@Jacquelin) Sending to 19
-> [1021.444444] (20:Slave 18@Provost) Received "Task_18". Processing it.
-> [1021.444444] (20:Slave 18@Provost) "Task_18" done 
-> [1021.444444] (20:Slave 18@Provost) Receiving on slave_18
-> [1023.429105] (0:@) MSG_main finished; Cleaning up the simulation...
-> [1023.429105] (1:Master@Jacquelin) Let's shut down the simulation and kill everyone.
-> [1023.429105] (1:Master@Jacquelin) Master done.
-> [1023.429105] (21:Slave 19@Provost) Received "Task_19". Processing it.
+> [  0.000000] (1:Master@Jacquelin) Sending to WRK00
+> [  0.918703] (2:WRK00@VM00) Received "Task00". Processing it.
+> [  0.918703] (1:Master@Jacquelin) Sending to WRK01
+> [  0.918703] (2:WRK00@VM00) WRK00 executed task (Task00)
+> [  2.798361] (3:WRK01@VM01) Received "Task01". Processing it.
+> [  2.798361] (1:Master@Jacquelin) Suspend all VMs
+> [  2.798361] (1:Master@Jacquelin) Suspend VM00
+> [  2.798361] (1:Master@Jacquelin) Suspend VM01
+> [  2.798361] (1:Master@Jacquelin) Wait a while
+> [  4.798361] (1:Master@Jacquelin) Resume all VMs.
+> [  4.798361] (1:Master@Jacquelin) Sleep long enough for everyone to be done with previous batch of work
+> [  4.798361] (3:WRK01@VM01) WRK01 executed task (Task01)
+> [1000.000000] (1:Master@Jacquelin) Migrate everyone to Fernand
+> [1000.000000] (1:Master@Jacquelin) Migrate VM00fromIntelto Fernand
+> [1000.000000] (5:__pr_mig_tx:VM00(Intel-Provost)@Intel) mig-stage1: remaining_size 1073741824.000000
+> [1147.021183] (5:__pr_mig_tx:VM00(Intel-Provost)@Intel) actual banwdidth 6.964983 (MB/s), threshold 219099.412193
+> [1147.021183] (5:__pr_mig_tx:VM00(Intel-Provost)@Intel) mig-stage 2:0 updated_size 0.000000 computed_during_stage1 0.000000 dp_rate 0.000000 dp_cap 1193046471.111111
+> [1147.021183] (5:__pr_mig_tx:VM00(Intel-Provost)@Intel) mig-stage2.0: remaining_size 0.000000 (< threshold 219099.412193)
+> [1147.021183] (5:__pr_mig_tx:VM00(Intel-Provost)@Intel) mig-stage3: remaining_size 0.000000
+> [1149.029299] (0:@) migrate VM(VM00): set bound (137333000.000000) at Provost
+> [1149.029299] (4:__pr_mig_rx:VM00(Intel-Provost)@Provost) set affinity(0x0000@Provost) for VM00
+> [1150.908953] (1:Master@Jacquelin) Migrate VM01fromProvostto Fernand
+> [1150.908953] (9:__pr_mig_tx:VM01(Provost-Provost)@Provost) mig-stage1: remaining_size 1073741824.000000
+> [1153.065257] (9:__pr_mig_tx:VM01(Provost-Provost)@Provost) actual banwdidth 474.886827 (MB/s), threshold 14938647.898422
+> [1153.065257] (9:__pr_mig_tx:VM01(Provost-Provost)@Provost) mig-stage 2:0 updated_size 0.000000 computed_during_stage1 0.000000 dp_rate 0.000000 dp_cap 1193046471.111111
+> [1153.065257] (9:__pr_mig_tx:VM01(Provost-Provost)@Provost) mig-stage2.0: remaining_size 0.000000 (< threshold 14938647.898422)
+> [1153.065257] (9:__pr_mig_tx:VM01(Provost-Provost)@Provost) mig-stage3: remaining_size 0.000000
+> [1153.065452] (0:@) migrate VM(VM01): set bound (137333000.000000) at Provost
+> [1153.065452] (8:__pr_mig_rx:VM01(Provost-Provost)@Provost) set affinity(0x0000@Provost) for VM01
+> [1154.945106] (1:Master@Jacquelin) Let's shut down the simulation and kill everyone.
+> [1154.945106] (1:Master@Jacquelin) Master done.
+> [1154.945106] (0:@) MSG_main finished; Cleaning up the simulation...
diff --git a/examples/java/cloud/migration/CMakeLists.txt b/examples/java/cloud/migration/CMakeLists.txt
new file mode 100644 (file)
index 0000000..210dc00
--- /dev/null
@@ -0,0 +1,47 @@
+cmake_minimum_required(VERSION 2.6)
+
+set(example java_cloud_migration)
+set(sources
+  ${CMAKE_CURRENT_SOURCE_DIR}/Daemon.java
+  ${CMAKE_CURRENT_SOURCE_DIR}/Main.java
+  ${CMAKE_CURRENT_SOURCE_DIR}/Test.java
+  ${CMAKE_CURRENT_SOURCE_DIR}/XVM.java
+  )
+
+if(enable_java)
+  add_custom_command(
+    COMMENT "Building ${example}..."
+    OUTPUT ${example}_compiled
+    DEPENDS ${sources} simgrid-java_jar ${SIMGRID_JAR}
+    COMMAND ${JAVA_COMPILE} -classpath ${SIMGRID_JAR}
+                             -d ${CMAKE_CURRENT_BINARY_DIR}/../.. ${sources}
+    COMMAND ${CMAKE_COMMAND} -E remove ${example}_compiled
+    COMMAND ${CMAKE_COMMAND} -E touch ${example}_compiled
+  )
+  add_custom_target(${example} ALL DEPENDS ${example}_compiled)
+endif()
+
+set(tesh_files
+  ${tesh_files}
+  ${CMAKE_CURRENT_SOURCE_DIR}/migration.tesh
+  PARENT_SCOPE
+  )
+set(xml_files
+  ${xml_files}
+  ${CMAKE_CURRENT_SOURCE_DIR}/deploy_simple.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/platform_simple.xml
+  PARENT_SCOPE
+  )
+set(examples_src
+  ${examples_src}
+  ${sources}
+  PARENT_SCOPE
+  )
+set(bin_files
+  ${bin_files}
+  PARENT_SCOPE
+  )
+set(txt_files
+  ${txt_files}
+  PARENT_SCOPE
+  )
diff --git a/examples/java/cloud/migration/Daemon.java b/examples/java/cloud/migration/Daemon.java
new file mode 100644 (file)
index 0000000..80cf2a8
--- /dev/null
@@ -0,0 +1,38 @@
+/* Copyright (c) 2014. 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. */
+
+package cloud.migration;
+
+import org.simgrid.msg.*;
+import org.simgrid.msg.Process;
+
+public class Daemon extends Process {
+       private Task currentTask;
+    public Daemon(VM vm, int load) {
+               super((Host)vm,"Daemon");
+       currentTask = new Task(this.getHost().getName()+"-daemon-0", this.getHost().getSpeed()*100, 0);
+    }
+    public void main(String[] args) throws MsgException {
+        int i = 1;
+        while(!Main.isEndOfTest()) {
+            // TODO the binding is not yet available
+            try {
+                currentTask.execute();
+            } catch (HostFailureException e) {
+                e.printStackTrace();
+            } catch (TaskCancelledException e) {
+                System.out.println("task cancelled");
+                suspend(); // Suspend the process
+            }
+            currentTask = new Task(this.getHost().getName()+"-daemon-"+(i++), this.getHost().getSpeed()*100, 0);
+//            Msg.info(currentTask.getName());
+        }
+    }
+
+    public double getRemaining(){
+        return this.currentTask.getRemainingDuration();
+    }
+    }
diff --git a/examples/java/cloud/migration/Main.java b/examples/java/cloud/migration/Main.java
new file mode 100644 (file)
index 0000000..cd0a6ae
--- /dev/null
@@ -0,0 +1,42 @@
+/* Copyright (c) 2014. 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. */
+
+package cloud.migration;
+
+import org.simgrid.msg.Host;
+import org.simgrid.msg.HostNotFoundException;
+import org.simgrid.msg.Msg;
+import org.simgrid.msg.NativeException;
+
+public class Main {
+    private static boolean endOfTest = false;
+
+    public static void setEndOfTest(){
+        endOfTest=true;
+    }
+
+    public static boolean isEndOfTest(){
+        return endOfTest;
+    }
+
+    public static void main(String[] args) throws NativeException {
+       /* Init. internal values */
+        Msg.init(args);
+
+        if (args.length < 2) {
+            Msg.info("Usage  : Main platform_file.xml dployment_file.xml");
+            System.exit(1);
+        }
+
+       /* construct the platform and deploy the application */
+        Msg.createEnvironment(args[0]);
+        Msg.deployApplication(args[1]);
+
+        Msg.run();
+
+
+    }
+}
diff --git a/examples/java/cloud/migration/Test.java b/examples/java/cloud/migration/Test.java
new file mode 100644 (file)
index 0000000..7edaa0a
--- /dev/null
@@ -0,0 +1,150 @@
+/* Copyright (c) 2014. 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. */
+
+package cloud.migration;
+
+import org.simgrid.msg.*;
+import org.simgrid.msg.Process;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Test extends Process{
+
+    Test(Host host, String name, String[] args) throws HostNotFoundException, NativeException  {
+        super(host, name, args);
+    }
+
+    public void main(String[] strings) throws MsgException {
+
+       double startTime = 0;
+       double endTime = 0;
+
+       /* get hosts 1 and 2*/
+        Host host0 = null;
+        Host host1 = null;
+
+        try {
+            host0 = Host.getByName("host0");
+            host1 = Host.getByName("host1");
+        }catch (HostNotFoundException e) {
+            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+        }
+
+        List<VM> vms = new ArrayList<VM>();
+
+      /* Create VM1 */
+        int dpRate = 70;
+        int load1 = 90;
+        int load2 = 80;
+               
+
+                 Msg.info("This example evaluates the migration time of a VM in presence of collocated VMs on the source and the dest nodes");
+                 Msg.info("The migrated VM has a memory intensity rate of 70% of the network BW and a cpu load of 90% \"(see cloudcom 2013 paper \"Adding a Live Migration Model Into SimGrid\" for further information) "); 
+
+                 Msg.info("Load of collocated VMs fluctuate between 0 and 90% in order to create a starvation issue and see whether it impacts or not the migration time");
+        XVM vm1 = null;
+        vm1 = new XVM(
+                host0,
+                "vm0",
+                1, // Nb of vcpu
+                2048, // Ramsize,
+                125, // Net Bandwidth
+                null, //VM disk image
+                -1,   //size of disk image,
+                125, // Net bandwidth,
+                dpRate // Memory intensity
+        );
+        vms.add(vm1);
+        vm1.start();
+
+        /* Collocated VMs */
+        int collocatedSrc = 6;
+        int vmSrcLoad[] = {
+                80,
+                0,
+                90,
+                40,
+                30,
+                90,
+        };
+
+        XVM tmp = null;
+        for (int i=1 ; i<= collocatedSrc ; i++){
+            tmp = new XVM(
+                    host0,
+                    "vm"+i,
+                    1, // Nb of vcpu
+                    2048, // Ramsize,
+                    125, // Net Bandwidth
+                    null, //VM disk image
+                    -1,   //size of disk image,
+                    125, // Net bandwidth,
+                    dpRate // Memory intensity
+            );
+            vms.add(tmp);
+            tmp.start();
+            tmp.setLoad(vmSrcLoad[i-1]);
+        }
+
+        int collocatedDst = 6;
+        int vmDstLoad[] = {
+                0,
+                40,
+                90,
+                100,
+                0,
+                80,
+        };
+
+        for (int i=1 ; i <= collocatedDst ; i++){
+            tmp = new XVM(
+                    host1,
+                    "vm"+(i+collocatedSrc),
+                    1, // Nb of vcpu
+                    2048, // Ramsize,
+                    125, // Net Bandwidth
+                    null, //VM disk image
+                    -1,   //size of disk image,
+                    125, // Net bandwidth,
+                    dpRate // Memory intensity
+            );
+            vms.add(tmp);
+            tmp.start();
+            tmp.setLoad(vmDstLoad[i-1]);
+        }
+
+        Msg.info("Round trip of VM1 (load "+load1+"%)");
+        vm1.setLoad(load1);
+        Msg.info("     - Launch migration from host 0 to host 1");
+        startTime = Msg.getClock();
+        vm1.migrate(host1);
+        endTime = Msg.getClock();
+        Msg.info("     - End of Migration from host 0 to host 1 (duration:"+(endTime-startTime)+")");
+        Msg.info("     - Launch migration from host 1 to host 0");
+        startTime = Msg.getClock();
+        vm1.migrate(host0);
+        endTime = Msg.getClock();
+        Msg.info("     - End of Migration from host 1 to host 0 (duration:"+(endTime-startTime)+")");
+
+        Msg.info("\n \n \nRound trip of VM1 (load "+load2+"%)");
+        vm1.setLoad(load2);
+        Msg.info("     - Launch migration from host 0 to host 1");
+        startTime = Msg.getClock();
+        vm1.migrate(host1);
+        endTime = Msg.getClock();
+        Msg.info("     - End of Migration from host 0 to host 1 (duration:"+(endTime-startTime)+")");
+        Msg.info("     - Launch migration from host 1 to host 0");
+        startTime = Msg.getClock();
+        vm1.migrate(host0);
+        endTime = Msg.getClock();
+        Msg.info("     - End of Migration from host 1 to host 0 (duration:"+(endTime-startTime)+")");
+
+        Main.setEndOfTest();
+        Msg.info("Destroy VMs");
+        for (VM vm: vms)
+          vm.destroy();
+    }
+}
diff --git a/examples/java/cloud/migration/XVM.java b/examples/java/cloud/migration/XVM.java
new file mode 100644 (file)
index 0000000..97467cb
--- /dev/null
@@ -0,0 +1,75 @@
+/* Copyright (c) 2014. 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. */
+
+package cloud.migration;
+
+import org.simgrid.msg.Host;
+import org.simgrid.msg.HostNotFoundException;
+import org.simgrid.msg.Msg;
+import org.simgrid.msg.VM;
+
+/**
+ * A stupid VM extension to associate a daemon to the VM
+ */
+public class XVM extends VM {
+
+
+    private int dpIntensity;
+    private int netBW;
+    private int ramsize;
+    private int currentLoad;
+
+    private Daemon daemon;
+
+    public XVM(Host host, String name,
+               int nbCores, int ramsize, int netBW, String diskPath, int diskSize, int migNetBW, int dpIntensity){
+        super(host, name, nbCores, ramsize, netBW, diskPath, diskSize, (int)(migNetBW*0.9), dpIntensity);
+        this.currentLoad = 0;
+        this.netBW = netBW ;
+        this. dpIntensity = dpIntensity ;
+        this.ramsize= ramsize;
+        this.daemon = new Daemon(this, 100);
+
+    }
+
+    public void setLoad(int load){  
+        if (load >0) {
+            this.setBound(load);
+        //    this.getDaemon().setLoad(load);
+            daemon.resume();
+        }
+        else{
+            daemon.suspend();
+        }
+        currentLoad = load ;
+    }
+
+    public void start(){
+        super.start();
+         try {
+            daemon.start();
+        } catch (HostNotFoundException e) {
+            e.printStackTrace();
+        }
+        this.setLoad(0);
+
+    }
+    public Daemon getDaemon(){
+        return this.daemon;
+    }
+    public int getLoad(){
+       System.out.println("Remaining comp:" + this.daemon.getRemaining());
+        return this.currentLoad;
+    }
+
+    public void migrate(Host host){
+        Msg.info("Start migration of VM " + this.getName() + " to " + host.getName());
+        Msg.info("    currentLoad:" + this.currentLoad + "/ramSize:" + this.ramsize + "/dpIntensity:" + this.dpIntensity + "/remaining:" + this.daemon.getRemaining());
+        super.migrate(host);
+        this.setLoad(this.currentLoad); //Fixed the fact that setBound is not propagated to the new node.
+        Msg.info("End of migration of VM " + this.getName() + " to node " + host.getName());
+    }
+}
diff --git a/examples/java/cloud/migration/deploy_simple.xml b/examples/java/cloud/migration/deploy_simple.xml
new file mode 100644 (file)
index 0000000..707963d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+    <process host="host0" function="cloud/migration/Test">
+    </process>
+</platform>
diff --git a/examples/java/cloud/migration/migration.tesh b/examples/java/cloud/migration/migration.tesh
new file mode 100644 (file)
index 0000000..c1337ee
--- /dev/null
@@ -0,0 +1,165 @@
+#! tesh
+
+$ java -classpath ${classpath:=.} cloud/migration/Main ${srcdir:=.}/cloud/migration/platform_simple.xml ${srcdir:=.}/cloud/migration/deploy_simple.xml 
+> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up.
+> [host0:cloud/migration/Test:(1) 0.000000] [jmsg/INFO] This example evaluates the migration time of a VM in presence of collocated VMs on the source and the dest nodes
+> [host0:cloud/migration/Test:(1) 0.000000] [jmsg/INFO] The migrated VM has a memory intensity rate of 70% of the network BW and a cpu load of 90% "(see cloudcom 2013 paper "Adding a Live Migration Model Into SimGrid" for further information) 
+> [host0:cloud/migration/Test:(1) 0.000000] [jmsg/INFO] Load of collocated VMs fluctuate between 0 and 90% in order to create a starvation issue and see whether it impacts or not the migration time
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm0)@PM(host0) with 0 mounted disks
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm1)@PM(host0) with 0 mounted disks
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm2)@PM(host0) with 0 mounted disks
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm3)@PM(host0) with 0 mounted disks
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm4)@PM(host0) with 0 mounted disks
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm5)@PM(host0) with 0 mounted disks
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm6)@PM(host0) with 0 mounted disks
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm7)@PM(host1) with 0 mounted disks
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm8)@PM(host1) with 0 mounted disks
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm9)@PM(host1) with 0 mounted disks
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm10)@PM(host1) with 0 mounted disks
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm11)@PM(host1) with 0 mounted disks
+> [0.000000] [surf_vm_workstation/INFO] Create VM(vm12)@PM(host1) with 0 mounted disks
+> [host0:cloud/migration/Test:(1) 0.000000] [jmsg/INFO] Round trip of VM1 (load 90%)
+> [host0:cloud/migration/Test:(1) 0.000000] [jmsg/INFO]      - Launch migration from host 0 to host 1
+> [host0:cloud/migration/Test:(1) 0.000000] [jmsg/INFO] Start migration of VM vm0 to host1
+> [host0:cloud/migration/Test:(1) 0.000000] [jmsg/INFO]     currentLoad:90/ramSize:2048/dpIntensity:70/remaining:8.095E11
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 0.000000] [msg_vm/INFO] mig-stage1: remaining_size 2147483648.000000
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 18.598067] [msg_vm/INFO] actual banwdidth 110.118973 (MB/s), threshold 3464043.375348
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 18.598067] [msg_vm/INFO] mig-stage 2:0 updated_size 1009084906.862392 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 18.598067] [msg_vm/INFO] mig-stage2.0: remaining_size 1009084906.862392 (> threshold 3464043.375348)
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 27.337835] [msg_vm/INFO] actual banwdidth 110.110284, threshold 3463770.024427
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 27.337835] [msg_vm/INFO] mig-stage 2:1 updated_size 474198119.178924 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 27.337835] [msg_vm/INFO] mig-stage2.1: remaining_size 474198119.178924 (> threshold 3463770.024427)
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 31.445594] [msg_vm/INFO] actual banwdidth 110.091798, threshold 3463188.514958
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 31.445594] [msg_vm/INFO] mig-stage 2:2 updated_size 222876798.522755 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 31.445594] [msg_vm/INFO] mig-stage2.2: remaining_size 222876798.522755 (> threshold 3463188.514958)
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 33.376962] [msg_vm/INFO] actual banwdidth 110.052494, threshold 3461952.124955
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 33.376962] [msg_vm/INFO] mig-stage 2:3 updated_size 104791237.544459 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 33.376962] [msg_vm/INFO] mig-stage2.3: remaining_size 104791237.544459 (> threshold 3461952.124955)
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 34.285733] [msg_vm/INFO] actual banwdidth 109.969020, threshold 3459326.250492
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 34.285733] [msg_vm/INFO] mig-stage 2:4 updated_size 49307685.020391 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 34.285733] [msg_vm/INFO] mig-stage2.4: remaining_size 49307685.020391 (> threshold 3459326.250492)
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 34.714029] [msg_vm/INFO] actual banwdidth 109.792154, threshold 3453762.521054
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 34.714029] [msg_vm/INFO] mig-stage 2:5 updated_size 23238243.968121 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 34.714029] [msg_vm/INFO] mig-stage2.5: remaining_size 23238243.968121 (> threshold 3453762.521054)
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 34.916568] [msg_vm/INFO] actual banwdidth 109.419289, threshold 3442033.220071
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 34.916568] [msg_vm/INFO] mig-stage 2:6 updated_size 10989284.465950 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 34.916568] [msg_vm/INFO] mig-stage2.6: remaining_size 10989284.465950 (> threshold 3442033.220071)
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 35.013034] [msg_vm/INFO] actual banwdidth 108.641444, threshold 3417564.332268
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 35.013034] [msg_vm/INFO] mig-stage 2:7 updated_size 5234001.988682 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 35.013034] [msg_vm/INFO] mig-stage2.7: remaining_size 5234001.988682 (> threshold 3417564.332268)
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 35.059660] [msg_vm/INFO] actual banwdidth 107.053869, threshold 3367623.544281
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 35.059660] [msg_vm/INFO] mig-stage 2:8 updated_size 2529831.013694 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 35.059660] [msg_vm/INFO] mig-stage2.8: remaining_size 2529831.013694 (< threshold 3367623.544281)
+> [host0:__pr_mig_tx:vm0(host0-host1):(16) 35.059660] [msg_vm/INFO] mig-stage3: remaining_size 2529831.013694
+> [35.082869] [surf_vm_workstation/INFO] migrate VM(vm0): set bound (7285500000.000000) at host1
+> [host1:__pr_mig_rx:vm0(host0-host1):(15) 35.082869] [msg_vm/INFO] set affinity(0x0000@host1) for vm0
+> [host0:cloud/migration/Test:(1) 35.084170] [jmsg/INFO] End of migration of VM vm0 to node host1
+> [host0:cloud/migration/Test:(1) 35.084170] [jmsg/INFO]      - End of Migration from host 0 to host 1 (duration:35.0841702956701)
+> [host0:cloud/migration/Test:(1) 35.084170] [jmsg/INFO]      - Launch migration from host 1 to host 0
+> [host0:cloud/migration/Test:(1) 35.084170] [jmsg/INFO] Start migration of VM vm0 to host0
+> [host0:cloud/migration/Test:(1) 35.084170] [jmsg/INFO]     currentLoad:90/ramSize:2048/dpIntensity:70/remaining:6.220564352570236E11
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 35.084170] [msg_vm/INFO] mig-stage1: remaining_size 2147483648.000000
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 53.682237] [msg_vm/INFO] actual banwdidth 110.118973 (MB/s), threshold 3464043.375348
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 53.682237] [msg_vm/INFO] mig-stage 2:0 updated_size 917349915.329448 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 53.682237] [msg_vm/INFO] mig-stage2.0: remaining_size 917349915.329448 (> threshold 3464043.375348)
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 61.627599] [msg_vm/INFO] actual banwdidth 110.108645, threshold 3463718.461873
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 61.627599] [msg_vm/INFO] mig-stage 2:1 updated_size 391905106.046906 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 61.627599] [msg_vm/INFO] mig-stage2.1: remaining_size 391905106.046906 (> threshold 3463718.461873)
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 65.022717] [msg_vm/INFO] actual banwdidth 110.084477, threshold 3462958.209981
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 65.022717] [msg_vm/INFO] mig-stage 2:2 updated_size 167464266.773127 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 65.022717] [msg_vm/INFO] mig-stage2.2: remaining_size 167464266.773127 (> threshold 3462958.209981)
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 66.474224] [msg_vm/INFO] actual banwdidth 110.027970, threshold 3461180.656939
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 66.474224] [msg_vm/INFO] mig-stage 2:3 updated_size 71595605.337913 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 66.474224] [msg_vm/INFO] mig-stage2.3: remaining_size 71595605.337913 (> threshold 3461180.656939)
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.095529] [msg_vm/INFO] actual banwdidth 109.896074, threshold 3457031.577357
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.095529] [msg_vm/INFO] mig-stage 2:4 updated_size 30645837.890704 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.095529] [msg_vm/INFO] mig-stage2.4: remaining_size 30645837.890704 (> threshold 3457031.577357)
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.362216] [msg_vm/INFO] actual banwdidth 109.589442, threshold 3447385.759089
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.362216] [msg_vm/INFO] mig-stage 2:5 updated_size 13154371.345477 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.362216] [msg_vm/INFO] mig-stage2.5: remaining_size 13154371.345477 (> threshold 3447385.759089)
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.477431] [msg_vm/INFO] actual banwdidth 108.883138, threshold 3425167.371629
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.477431] [msg_vm/INFO] mig-stage 2:6 updated_size 5682988.543846 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.477431] [msg_vm/INFO] mig-stage2.6: remaining_size 5682988.543846 (> threshold 3425167.371629)
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.527946] [msg_vm/INFO] actual banwdidth 107.290377, threshold 3375063.431326
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.527946] [msg_vm/INFO] mig-stage 2:7 updated_size 2491628.685811 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.527946] [msg_vm/INFO] mig-stage2.7: remaining_size 2491628.685811 (< threshold 3375063.431326)
+> [host1:__pr_mig_tx:vm0(host1-host0):(28) 67.527946] [msg_vm/INFO] mig-stage3: remaining_size 2491628.685811
+> [67.550824] [surf_vm_workstation/INFO] migrate VM(vm0): set bound (7285500000.000000) at host0
+> [host0:__pr_mig_rx:vm0(host1-host0):(27) 67.550824] [msg_vm/INFO] set affinity(0x0000@host0) for vm0
+> [host0:cloud/migration/Test:(1) 67.551019] [jmsg/INFO] End of migration of VM vm0 to node host0
+> [host0:cloud/migration/Test:(1) 67.551019] [jmsg/INFO]      - End of Migration from host 1 to host 0 (duration:32.46684874546391)
+> [host0:cloud/migration/Test:(1) 67.551019] [jmsg/INFO] 
+>  
+>  
+> Round trip of VM1 (load 80%)
+> [host0:cloud/migration/Test:(1) 67.551019] [jmsg/INFO]      - Launch migration from host 0 to host 1
+> [host0:cloud/migration/Test:(1) 67.551019] [jmsg/INFO] Start migration of VM vm0 to host1
+> [host0:cloud/migration/Test:(1) 67.551019] [jmsg/INFO]     currentLoad:80/ramSize:2048/dpIntensity:70/remaining:4.6436485611595026E11
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 67.551019] [msg_vm/INFO] mig-stage1: remaining_size 2147483648.000000
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 86.149086] [msg_vm/INFO] actual banwdidth 110.118973 (MB/s), threshold 3464043.375348
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 86.149086] [msg_vm/INFO] mig-stage 2:0 updated_size 1009084906.862392 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 86.149086] [msg_vm/INFO] mig-stage2.0: remaining_size 1009084906.862392 (> threshold 3464043.375348)
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 94.888854] [msg_vm/INFO] actual banwdidth 110.110284, threshold 3463770.024427
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 94.888854] [msg_vm/INFO] mig-stage 2:1 updated_size 474198119.178924 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 94.888854] [msg_vm/INFO] mig-stage2.1: remaining_size 474198119.178924 (> threshold 3463770.024427)
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 98.996613] [msg_vm/INFO] actual banwdidth 110.091798, threshold 3463188.514958
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 98.996613] [msg_vm/INFO] mig-stage 2:2 updated_size 222876798.522756 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 98.996613] [msg_vm/INFO] mig-stage2.2: remaining_size 222876798.522756 (> threshold 3463188.514958)
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 100.927981] [msg_vm/INFO] actual banwdidth 110.052494, threshold 3461952.124955
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 100.927981] [msg_vm/INFO] mig-stage 2:3 updated_size 104791237.544460 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 100.927981] [msg_vm/INFO] mig-stage2.3: remaining_size 104791237.544460 (> threshold 3461952.124955)
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 101.836752] [msg_vm/INFO] actual banwdidth 109.969020, threshold 3459326.250492
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 101.836752] [msg_vm/INFO] mig-stage 2:4 updated_size 49307685.020392 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 101.836752] [msg_vm/INFO] mig-stage2.4: remaining_size 49307685.020392 (> threshold 3459326.250492)
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.265048] [msg_vm/INFO] actual banwdidth 109.792154, threshold 3453762.521054
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.265048] [msg_vm/INFO] mig-stage 2:5 updated_size 23238243.968121 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.265048] [msg_vm/INFO] mig-stage2.5: remaining_size 23238243.968121 (> threshold 3453762.521054)
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.467587] [msg_vm/INFO] actual banwdidth 109.419289, threshold 3442033.220071
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.467587] [msg_vm/INFO] mig-stage 2:6 updated_size 10989284.465950 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.467587] [msg_vm/INFO] mig-stage2.6: remaining_size 10989284.465950 (> threshold 3442033.220071)
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.564053] [msg_vm/INFO] actual banwdidth 108.641444, threshold 3417564.332268
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.564053] [msg_vm/INFO] mig-stage 2:7 updated_size 5234001.988682 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.564053] [msg_vm/INFO] mig-stage2.7: remaining_size 5234001.988682 (> threshold 3417564.332268)
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.610680] [msg_vm/INFO] actual banwdidth 107.053869, threshold 3367623.544281
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.610680] [msg_vm/INFO] mig-stage 2:8 updated_size 2529831.013694 computed_during_stage1 99363890485.508911 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.610680] [msg_vm/INFO] mig-stage2.8: remaining_size 2529831.013694 (< threshold 3367623.544281)
+> [host0:__pr_mig_tx:vm0(host0-host1):(39) 102.610680] [msg_vm/INFO] mig-stage3: remaining_size 2529831.013694
+> [102.633888] [surf_vm_workstation/INFO] migrate VM(vm0): set bound (6476000000.000000) at host1
+> [host1:__pr_mig_rx:vm0(host0-host1):(38) 102.633888] [msg_vm/INFO] set affinity(0x0000@host1) for vm0
+> [host0:cloud/migration/Test:(1) 102.635189] [jmsg/INFO] End of migration of VM vm0 to node host1
+> [host0:cloud/migration/Test:(1) 102.635189] [jmsg/INFO]      - End of Migration from host 0 to host 1 (duration:35.08417029567006)
+> [host0:cloud/migration/Test:(1) 102.635189] [jmsg/INFO]      - Launch migration from host 1 to host 0
+> [host0:cloud/migration/Test:(1) 102.635189] [jmsg/INFO] Start migration of VM vm0 to host0
+> [host0:cloud/migration/Test:(1) 102.635189] [jmsg/INFO]     currentLoad:80/ramSize:2048/dpIntensity:70/remaining:2.7692129137297363E11
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 102.635189] [msg_vm/INFO] mig-stage1: remaining_size 2147483648.000000
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 121.233256] [msg_vm/INFO] actual banwdidth 110.118973 (MB/s), threshold 3464043.375348
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 121.233256] [msg_vm/INFO] mig-stage 2:0 updated_size 917349915.329448 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 121.233256] [msg_vm/INFO] mig-stage2.0: remaining_size 917349915.329448 (> threshold 3464043.375348)
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 129.178618] [msg_vm/INFO] actual banwdidth 110.108645, threshold 3463718.461873
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 129.178618] [msg_vm/INFO] mig-stage 2:1 updated_size 391905106.046906 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 129.178618] [msg_vm/INFO] mig-stage2.1: remaining_size 391905106.046906 (> threshold 3463718.461873)
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 132.573736] [msg_vm/INFO] actual banwdidth 110.084477, threshold 3462958.209981
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 132.573736] [msg_vm/INFO] mig-stage 2:2 updated_size 167464266.773128 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 132.573736] [msg_vm/INFO] mig-stage2.2: remaining_size 167464266.773128 (> threshold 3462958.209981)
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 134.025243] [msg_vm/INFO] actual banwdidth 110.027970, threshold 3461180.656939
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 134.025243] [msg_vm/INFO] mig-stage 2:3 updated_size 71595605.337913 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 134.025243] [msg_vm/INFO] mig-stage2.3: remaining_size 71595605.337913 (> threshold 3461180.656939)
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 134.646548] [msg_vm/INFO] actual banwdidth 109.896074, threshold 3457031.577357
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 134.646548] [msg_vm/INFO] mig-stage 2:4 updated_size 30645837.890704 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 134.646548] [msg_vm/INFO] mig-stage2.4: remaining_size 30645837.890704 (> threshold 3457031.577357)
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 134.913235] [msg_vm/INFO] actual banwdidth 109.589442, threshold 3447385.759089
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 134.913235] [msg_vm/INFO] mig-stage 2:5 updated_size 13154371.345477 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 134.913235] [msg_vm/INFO] mig-stage2.5: remaining_size 13154371.345477 (> threshold 3447385.759089)
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 135.028450] [msg_vm/INFO] actual banwdidth 108.883138, threshold 3425167.371628
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 135.028450] [msg_vm/INFO] mig-stage 2:6 updated_size 5682988.543847 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 135.028450] [msg_vm/INFO] mig-stage2.6: remaining_size 5682988.543847 (> threshold 3425167.371628)
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 135.078965] [msg_vm/INFO] actual banwdidth 107.290377, threshold 3375063.431326
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 135.078965] [msg_vm/INFO] mig-stage 2:7 updated_size 2491628.685810 computed_during_stage1 90330809532.280823 dp_rate 0.010155 dp_cap 2386092942.222222
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 135.078965] [msg_vm/INFO] mig-stage2.7: remaining_size 2491628.685810 (< threshold 3375063.431326)
+> [host1:__pr_mig_tx:vm0(host1-host0):(51) 135.078965] [msg_vm/INFO] mig-stage3: remaining_size 2491628.685810
+> [135.101843] [surf_vm_workstation/INFO] migrate VM(vm0): set bound (6476000000.000000) at host0
+> [host0:__pr_mig_rx:vm0(host1-host0):(50) 135.101843] [msg_vm/INFO] set affinity(0x0000@host0) for vm0
+> [host0:cloud/migration/Test:(1) 135.102038] [jmsg/INFO] End of migration of VM vm0 to node host0
+> [host0:cloud/migration/Test:(1) 135.102038] [jmsg/INFO]      - End of Migration from host 1 to host 0 (duration:32.46684874546395)
+> [host0:cloud/migration/Test:(1) 135.102038] [jmsg/INFO] Destroy VMs
+> [135.102038] [jmsg/INFO] MSG_main finished; Cleaning up the simulation...
diff --git a/examples/java/cloud/migration/platform_simple.xml b/examples/java/cloud/migration/platform_simple.xml
new file mode 100644 (file)
index 0000000..7ccd736
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version='1.0'?>
+ <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+ <platform version="3">
+ <AS  id="AS0"  routing="Full">
+       <host id="host0" core="4" power="8095000000"/>
+       <host id="host1" core="4" power="8095000000"/>
+       <link id="link1" bandwidth="125000000" latency="0.000100"/>
+   <route src="host0" dst="host1"><link_ctn id="link1"/></route>
+  </AS>
+  </platform>
\ No newline at end of file
index ba64851..417aa27 100644 (file)
@@ -1,9 +1,8 @@
-/*
- * Copyright (c) 2006-2013. The SimGrid Team. All right 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package commTime;
 import org.simgrid.msg.Msg;
index d0e3f32..f5dcc18 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package commTime;
 import org.simgrid.msg.*;
index 9dc9772..9193702 100644 (file)
@@ -1,12 +1,10 @@
-/*
- * Master of a basic master/slave example in Java
- *
- * Copyright (c) 2006-2013. 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. 
- */
+/* Master of a basic master/slave example in Java */
+
+/* Copyright (c) 2006-2014. 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. */
 
 package commTime;
 
index bb81c9f..c90ad64 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package commTime;
 
index 6a6674f..4c94dcf 100644 (file)
@@ -1,9 +1,9 @@
-/*
- * 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package io;
 
 import org.simgrid.msg.Host;
index 353db84..a0a88cd 100644 (file)
@@ -1,9 +1,9 @@
-/*
- * 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package io;
 
 import org.simgrid.msg.File;
index 9373f50..ff0a25b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index cd6e635..8ad2326 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 package kademlia;
 
 import java.util.ArrayList;
index 576d273..7df08e7 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 package kademlia;
 /**
  * Common constants used all over the simulation
index ac0ba9e..16d3906 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index ab85b3a..cb036da 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index b5bfa97..9ee53a9 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 567987b..a9c05c4 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 package kademlia;
 import org.simgrid.msg.Msg;
 import org.simgrid.msg.MsgException;
index 17c5d42..9ca0c5f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 447ff8d..0a94781 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 package kademlia;
 
 import org.simgrid.msg.Host;
index 097b6a8..46f2fd8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 38c02a1..3b08c93 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 815d1d0..ca136a0 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 package kademlia;
 import java.util.Collections;
 import java.util.Vector;
index 77085c5..a3b9bd8 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package master_slave_bypass;
 import org.simgrid.msg.Task;
index ea894d8..39fb1c4 100644 (file)
@@ -1,12 +1,10 @@
-/*
- * Master of a basic master/slave example in Java
- *
- * Copyright (c) 2006-2013. 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. 
- */
+/* Master of a basic master/slave example in Java */
+
+/* Copyright (c) 2006-2014. 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. */
 
 package master_slave_bypass;
 import org.simgrid.msg.HostNotFoundException;
index 3a61208..8301465 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package master_slave_bypass;
 
index c342df4..05526ea 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package master_slave_bypass;
 import org.simgrid.msg.HostFailureException;
 import org.simgrid.msg.HostNotFoundException;
index 8b5daa3..ec1a0e2 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package master_slave_kill;
 import org.simgrid.msg.Task;
index 82c8a9d..3aac3fc 100644 (file)
@@ -1,12 +1,10 @@
-/*
- * Master of a basic master/slave example in Java
- *
- * Copyright (c) 2006-2013. 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. 
- */
+/* Master of a basic master/slave example in Java */
+
+/* Copyright (c) 2006-2014. 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. */
 
 package master_slave_kill;
 import org.simgrid.msg.HostNotFoundException;
index cb54fa1..8fc9d97 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package master_slave_kill;
 
index 630c25b..ab99898 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package master_slave_kill;
 import org.simgrid.msg.HostFailureException;
 import org.simgrid.msg.HostNotFoundException;
index fc4d97b..e250984 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package masterslave;
 import org.simgrid.msg.Task;
index 12a9f83..f6b8f5b 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package masterslave;
 
index 94e00f5..8e9d9d1 100644 (file)
@@ -1,12 +1,10 @@
-/*
- * Master of a basic master/slave example in Java
- *
- * Copyright (c) 2006-2013. 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. 
- */
+/* Master of a basic master/slave example in Java */
+
+/* Copyright (c) 2006-2014. 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. */
 
 package masterslave;
 import org.simgrid.msg.Host;
index b91c178..f5518ab 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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.
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package masterslave;
 
index e3e4f08..2820c92 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package masterslave;
 
 import org.simgrid.msg.Host;
index ee1d207..81be5cf 100644 (file)
@@ -3,6 +3,7 @@
 ! output sort
 
 $ java -classpath ${classpath:=.} masterslave/Masterslave ${srcdir:=.}/platform.xml ${srcdir:=.}/masterslave/masterslaveDeployment.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Using regular java threads. Coroutines could speed your simulation up.
 > [  0.000000] (1:masterslave.Master@Jacquelin) Hello! Got 7 slaves and 5 tasks to process
 > [  0.000000] (2:masterslave.Forwarder@Jackson) Receiving on 'slave_0'
 > [  0.000000] (3:masterslave.Forwarder@Casavant) Receiving on 'slave_1'
@@ -29,4 +30,3 @@ $ java -classpath ${classpath:=.} masterslave/Masterslave ${srcdir:=.}/platform.
 > [ 17.251680] (0:@) MSG_main finished; Cleaning up the simulation...
 > [ 17.251680] (1:masterslave.Master@Jacquelin) Goodbye now!
 > [ 17.251680] (8:masterslave.Slave@Browne) Received Finalize. I'm done. See you!
-> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up.
index c875081..5fda9f5 100644 (file)
@@ -1,9 +1,9 @@
-/*
- * 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package migration;
 
 import org.simgrid.msg.Host;
index 3db138d..97aa53b 100644 (file)
@@ -1,9 +1,9 @@
-/*
- * 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package migration;
 import org.simgrid.msg.Msg;
 import org.simgrid.msg.Mutex;
index 3dd8d97..664dd33 100644 (file)
@@ -1,9 +1,9 @@
-/*
- * 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package migration;
 
 import org.simgrid.msg.Host;
index 131e9a3..a954e42 100644 (file)
@@ -3,6 +3,7 @@
 ! output sort
 
 $ java -classpath ${classpath:=.} migration/Migration ${srcdir:=.}/platform.xml ${srcdir:=.}/migration/migrationDeployment.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Using regular java threads. Coroutines could speed your simulation up.
 > [  0.000000] (1:migration.Emigrant@Jacquelin) I'll look for a new job on another machine where the grass is greener.
 > [  0.000000] (1:migration.Emigrant@Boivin) Yeah, found something to do
 > [  1.000000] (2:migration.Policeman@Boivin) Wait a bit before migrating the emigrant.
@@ -11,5 +12,3 @@ $ java -classpath ${classpath:=.} migration/Migration ${srcdir:=.}/platform.xml
 > [  7.000000] (1:migration.Emigrant@Jacquelin) I've been moved on this new host:Jacquelin
 > [  7.000000] (1:migration.Emigrant@Jacquelin) Uh, nothing to do here. Stopping now
 > [  7.000000] (2:migration.Policeman@Boivin) I moved the emigrant
-> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up.
-
index 44fc41b..7a0e0a6 100644 (file)
@@ -1,9 +1,8 @@
-/*
- * 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
 
 package mutualExclusion;
 import java.util.LinkedList;
index 60d59e2..79e19d0 100644 (file)
@@ -1,9 +1,9 @@
-/*
- * 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package mutualExclusion;
 import org.simgrid.msg.Task;
 
index e368c3a..d5da381 100644 (file)
@@ -1,9 +1,9 @@
-/*
- * 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package mutualExclusion;
 
 import org.simgrid.msg.Msg;
index b316367..0b622fe 100644 (file)
@@ -1,9 +1,9 @@
-/*
- * 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package mutualExclusion;
 
 import org.simgrid.msg.Host;
index 46db893..6348116 100644 (file)
@@ -1,9 +1,9 @@
-/*
- * 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package mutualExclusion;
 public class ReleaseTask extends org.simgrid.msg.Task {
 }
index d9d9721..225d16b 100644 (file)
@@ -1,9 +1,9 @@
-/*
- * 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package mutualExclusion;
 import org.simgrid.msg.Task;
 
index 5acc673..76f7fff 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package pingPong;
 import org.simgrid.msg.NativeException;
index 39f7d38..04f71d9 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package pingPong;
 import org.simgrid.msg.Msg;
 import org.simgrid.msg.NativeException;
index e553e2a..57e69cf 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package pingPong;
 import org.simgrid.msg.Host;
 import org.simgrid.msg.Msg;
index a39430a..52fbab1 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package pingPong;
 import org.simgrid.msg.Host;
 import org.simgrid.msg.HostNotFoundException;
index 84db0e2..495a7b2 100644 (file)
    <link id="108" bandwidth="990.5kBps" latency="1.742977ms"/>
    <link id="115" bandwidth="926.625kBps" latency="601.375us"/>
    <link id="92" bandwidth="1.564125MBps" latency="788.956us"/>
-   <link id="103" bandwidth="472.125kBps" latency="5.161451ms"/>
+   <link id="103" bandwidth="472.125MBps" latency="5.161451ms"/>
    <link id="10" bandwidth="34.285625MBps" latency="514.433us"/>
    <link id="113" bandwidth="1.858MBps" latency="820.952us"/>
    <link id="152" bandwidth="7.20975MBps" latency="1.461517ms"/>
    <link id="88" bandwidth="10.314625MBps" latency="6.932556ms"/>
    <link id="116" bandwidth="2.368MBps" latency="9.547561ms"/>
    <link id="144" bandwidth="259.125kBps" latency="4.460898ms"/>
-   <link id="141" bandwidth="472.125kBps" latency="5.161451ms"/>
+   <link id="141" bandwidth="472.125MBps" latency="5.161451ms"/>
    <link id="30" bandwidth="10.099625MBps" latency="479.78us"/>
    <link id="100" bandwidth="721.625kBps" latency="6.406us"/>
    <link id="25" bandwidth="8.015125MBps" latency="35.076518ms"/>
index 99f0aac..2462ca0 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package priority;
 import org.simgrid.msg.Msg;
 import org.simgrid.msg.NativeException;
index 365e8df..14370f3 100644 (file)
@@ -1,9 +1,9 @@
-/*
- * 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. 
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package priority;
 import org.simgrid.msg.Host;
 import org.simgrid.msg.Msg;
index 1a0b8ad..35646ab 100644 (file)
@@ -3,9 +3,9 @@
 ! output sort
 
 $ java -classpath ${classpath:=.} priority/Priority ${srcdir:=.}/platform.xml ${srcdir:=.}/priority/priorityDeployment.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Using regular java threads. Coroutines could speed your simulation up.
 > [  0.000000] (1:priority.Test@Fafard) Hello! Running a task of size 7.6296E7 with priority 1.0
 > [  0.000000] (2:priority.Test@Fafard) Hello! Running a task of size 7.6296E7 with priority 2.0
 > [  0.833332] (2:priority.Test@Fafard) Goodbye now!
 > [  1.111109] (0:@) MSG_main finished; Cleaning up the simulation...
 > [  1.111109] (1:priority.Test@Fafard) Goodbye now!
-> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up.
index 47b2c8f..270c4a6 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package startKillTime;
 import org.simgrid.msg.Host;
 import org.simgrid.msg.HostFailureException;
index 5978e70..0018b6e 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package startKillTime;
 import org.simgrid.msg.Host;
 import org.simgrid.msg.HostFailureException;
index 3a2999c..8daffbe 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package startKillTime;
 import org.simgrid.msg.Msg;
 import org.simgrid.msg.NativeException;
index a27be09..8dff985 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package suspend;
 
 import org.simgrid.msg.Host;
index 6a8b17c..ffad084 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package suspend;
 
 import org.simgrid.msg.Host;
index ec31e22..027ed8e 100644 (file)
@@ -1,10 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package suspend;
 
 import org.simgrid.msg.Msg;
index 897db64..8230392 100644 (file)
@@ -2,6 +2,7 @@
 
 ! output sort
 $ java -classpath ${classpath:=.} suspend/Suspend ${srcdir:=.}/platform.xml ${srcdir:=.}/suspend/suspendDeployment.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Using regular java threads. Coroutines could speed your simulation up.
 > [  0.000000] (1:suspend.DreamMaster@Jacquelin) Let's create a lazy guy.
 > [  0.000000] (1:suspend.DreamMaster@Jacquelin) Let's wait a little bit...
 > [  0.000000] (2:Lazy@Jacquelin) Nobody's watching me ? Let's go to sleep.
@@ -10,5 +11,3 @@ $ java -classpath ${classpath:=.} suspend/Suspend ${srcdir:=.}/platform.xml ${sr
 > [ 10.000000] (1:suspend.DreamMaster@Jacquelin) OK, goodbye now.
 > [ 10.000000] (2:Lazy@Jacquelin) Uuuh ? Did somebody call me ?
 > [ 10.000000] (2:Lazy@Jacquelin) Mmmh, goodbye now.
-> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up.
-
index 0c3fbd8..f43b69e 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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. 
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package tracing;
 import org.simgrid.msg.NativeException;
index 3383695..dab370f 100644 (file)
@@ -1,13 +1,9 @@
-/*
- * $Id$
- *
- * Copyright 2006,2007 Martin Quinson, Malek Cherier         
- * Copyright (c) 2012-2013. 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. 
- */
+/* Copyright (c) 2006-2007, 2012-2014. 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. */
+
 package tracing;
 import org.simgrid.msg.Host;
 import org.simgrid.msg.Msg;
index 30d0dc3..48a14c4 100644 (file)
@@ -1,12 +1,11 @@
-/*
- * Sender of basic ping/pong example
- *
- * Copyright (c) 2006-2013. 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. 
- */
+/* Sender of basic ping/pong example */
+
+/* Copyright (c) 2006-2014. 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. */
+
 package tracing;
 import org.simgrid.msg.Host;
 import org.simgrid.msg.HostNotFoundException;
index 6205296..b8453bd 100644 (file)
@@ -1,13 +1,9 @@
-/*
- * $Id$
- *
- * Copyright 2006,2007 Martin Quinson, Malek Cherier         
- * Copyright (c) 2012-2013. 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. 
- */
+/* Copyright (c) 2006-2007, 2012-2014. 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. */
+
 package tracing;
 import org.simgrid.msg.Msg;
 import org.simgrid.trace.Trace;
index 7e22954..1f746d4 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
 dofile "sim_splay.lua"
 between, call, thread, ping = misc.between_c, rpc.call, events.thread, rpc.ping
 n, predecessor, finger, timeout, m = {}, nil, {}, 5, 24
index c0f5589..1226288 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
 require "simgrid"
 
   simgrid.AS.new{id="AS0",mode="Full"}; 
index 6202cb3..a530714 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
 require "simgrid"
 
 -- Splay global modules
index 358c36f..e740dd5 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
 require("sim_splay")
 
 function SPLAYschool()
index 26381a7..6631d43 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2012, 2014. 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.
+
 -- A SimGrid Lua implementation of the Bittorrent protocol.
 
 require("simgrid")
index 96a20f3..496af85 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2012, 2014. 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.
+
 -- A SimGrid Lua implementation of the Bittorrent protocol.
 
 require("simgrid")
index e662990..e39a2d9 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2012, 2014. 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.
+
 -- A SimGrid Lua implementation of the Bittorrent protocol.
 
 require("simgrid")
index 523b150..6e6df64 100644 (file)
@@ -1,5 +1,11 @@
 -- A SimGrid Lua implementation of the Chord DHT
 
+-- Copyright (c) 2011-2012, 2014. 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.
+
 require("simgrid")
 
 nb_bits = 24
index 5d46da3..6cd9a48 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2013-2014. 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.
+
  dofile 'master.lua'
  dofile 'slave.lua' 
 
index 2ce3118..36f9785 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2013-2014. 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.
+
 --Master Function
 function Master(...) 
 
index 55a79d5..b88391f 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2013-2014. 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.
+
 require "simgrid"
 dofile 'platform.lua'
 dofile 'deploy.lua'
index 6e0f88b..b38d3ce 100644 (file)
@@ -1,4 +1,8 @@
+-- Copyright (c) 2011, 2013-2014. 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.
 
 simgrid.platf.open();
 
index 816fbda..b70a75a 100644 (file)
@@ -1,4 +1,8 @@
+-- Copyright (c) 2011, 2013-2014. 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.
 
 -- Slave Function ---------------------------------------------------------
 function Slave(...)
index 70d67d6..3641824 100644 (file)
@@ -1,4 +1,11 @@
 -- A SimGrid Lua implementation of the Kademlia protocol.
+
+-- Copyright (c) 2012, 2014. 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.
+
 require("simgrid")
 
 -- Common constants
index 3c2b636..d4f4d04 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2012, 2014. 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.
+
 -- Routing table data
 routing_table = {
 buckets = {},
index 664c342..71bb07a 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2012, 2014. 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.
+
 function bxor (a,b)
   local r = 0
   for i = 0, 31 do
index 2ee7f41..0cd88bc 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011-2012, 2014. 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.
+
 function Master(...) 
 
   if #arg ~= 4 then
index 2aeb917..9a7f354 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011-2014. 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.
+
 dofile 'master.lua'
 dofile 'slave.lua'
 -- Simulation Code ----------------------------------------------------------
index 8ef9d4b..9999efd 100644 (file)
@@ -1,4 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
   --create new routing model
   --simgrid.AS.new(AS_id,AS_mode)
   simgrid.AS.new{id="AS0",mode="Full"}; 
index 8756983..d6f2141 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011-2012, 2014. 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.
+
 function Slave(...)
 
   if #arg ~= 1 then
index 9700b76..62c89e3 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
 dofile 'sender.lua'
 dofile 'receiver.lua'
 require "simgrid"
index e771b7a..6769b5c 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
 function Receiver(...)
 
   simgrid.info("Hello From Receiver")
index dfd1ae8..16166ff 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
 function Sender(...) 
 
   simgrid.info("Hello From Sender")
index 04951c3..e495048 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
 --Master Function
 function Master(...) 
 
index e188572..4275c31 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
 -- Slave Function ---------------------------------------------------------
 function Slave(...)
 
index 5c8007c..7b8a5ce 100644 (file)
@@ -1,3 +1,8 @@
+-- Copyright (c) 2011, 2014. 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.
 
 -- Simulation Code ----------------------------------------------------------
 
index a40ef42..cd09f62 100644 (file)
@@ -1,3 +1,8 @@
+-- Copyright (c) 2011, 2014. 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.
 
    dofile "master.lua"
    dofile "slave.lua"
index 1181a1b..d2dc999 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
 require "simgrid"
 
   simgrid.AS.new{id="AS0",mode="Full"}; 
index 70366bb..5adc010 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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 code creates 3 simgrid processes and verifies that the global values
 -- in each Lua world are correctly cloned from maestro and become different
 
index e189c05..13bdaa5 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
 --Master Function
 function Master(...) 
 
index f3ca3f4..a13006f 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2011, 2014. 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.
+
 dofile 'master.lua'
 dofile 'slave.lua'
 
index cdbe5f3..b473a36 100644 (file)
@@ -1,3 +1,8 @@
+-- Copyright (c) 2011, 2014. 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.
 
 -- Slave Function ---------------------------------------------------------
 function Slave(...)
index edb9037..ef44344 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 741cd2c..0ad4781 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "bittorrent.h"
 #include "peer.h"
 #include "tracker.h"
@@ -37,7 +38,7 @@ int main(int argc, char *argv[])
     RngStream stream;
     snprintf(descr, sizeof descr, "RngSream<%s>", MSG_host_get_name(host));
     stream = RngStream_CreateStream(descr);
-    MSG_host_set_data(host, stream);
+    MSG_host_set_property_value(host, "stream", (char*)stream, NULL);
   }
 
   MSG_function_register("tracker", tracker);
@@ -48,7 +49,7 @@ int main(int argc, char *argv[])
   MSG_main();
 
   xbt_dynar_foreach(host_list, i, host) {
-    RngStream stream = MSG_host_get_data(host);
+    RngStream stream = (RngStream) MSG_host_get_property_value(host, "stream");
     RngStream_DeleteStream(&stream);
   }
   xbt_dynar_free(&host_list);
index 7401336..01a80ee 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index bb9045d..9afada0 100644 (file)
@@ -1,7 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
+
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "bittorrent.h"
 #include "peer.h"
 #include "tracker.h"
index 0378f4a..c0ee2a5 100644 (file)
@@ -1,8 +1,9 @@
-  /* Copyright (c) 2012-2013. The SimGrid Team.
  * All rights reserved.                                                     */
+/* Copyright (c) 2012-2014. 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 "connection.h"
 #include "bittorrent.h"
 #include <xbt/sysdep.h>
index 2d30008..418b638 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #ifndef BITTORRENT_CONNECTION_H_
 #define BITTORRENT_CONNECTION_H_
 /**
index 1aed434..f3460bb 100755 (executable)
@@ -1,5 +1,11 @@
 #!/usr/bin/python
 
+# Copyright (c) 2012, 2014. 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 script generates a specific deployment file for the Bittorrent example.
 # It assumes that the platform will be a cluster.
 # Usage: python generate.py nb_nodes nb_bits end_date percentage
index cd7cd4c..bfe1ea4 100644 (file)
@@ -1,8 +1,9 @@
-  /* Copyright (c) 2012-2013. The SimGrid Team.
  * All rights reserved.                                                     */
+/* Copyright (c) 2012-2014. 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 "messages.h"
 #include "bittorrent.h"
 
index 4357729..dab23af 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 2ea4729..1923233 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "peer.h"
 #include "tracker.h"
 #include "connection.h"
@@ -241,7 +242,8 @@ void peer_init(peer_t peer, int id, int seed)
 
   peer->current_pieces = xbt_dynar_new(sizeof(int), NULL);
 
-  peer->stream = RngStream_CreateStream("");
+  peer->stream =
+    (RngStream)MSG_host_get_property_value(MSG_host_self(), "stream");
   peer->comm_received = NULL;
 
   peer->round = 0;
@@ -265,8 +267,6 @@ void peer_free(peer_t peer)
   xbt_free(peer->pieces_count);
   xbt_free(peer->bitfield);
   xbt_free(peer->bitfield_blocks);
-
-  RngStream_DeleteStream(&peer->stream);
 }
 
 /**
index 3955438..e64a2d2 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #ifndef BITTORRENT_PEER_H
 #define BITTORRENT_PEER_H
 #include <msg/msg.h>
index b45d464..631a456 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "tracker.h"
 #include <msg/msg.h>
 #include <xbt/RngStream.h>
@@ -19,8 +20,7 @@ int tracker(int argc, char *argv[])
 {
   int i;
 
-  RngStream stream = MSG_host_get_data(MSG_host_self());
-
+  RngStream stream = (RngStream) MSG_host_get_property_value(MSG_host_self(), "stream");
   //Checking arguments
   xbt_assert(argc == 2, "Wrong number of arguments for the tracker.");
   //Retrieving end time
index 5acc231..e1b1fea 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 507167a..5daf3d5 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 "broadcaster.h"
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_broadcaster,
index ce6fe97..2b06656 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 KADEPLOY_BROADCASTER_H
 #define KADEPLOY_BROADCASTER_H
 
index 06e7bea..e8a4d19 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (c) 2007-2010, 2012. The SimGrid Team.
- * Copyright (c) 2012. Maximiliano Geier.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 928c6e3..12fc601 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 "common.h"
 
 int process_pending_connections(xbt_dynar_t q)
index e28e098..2336685 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 KADEPLOY_COMMON_H
 #define KADEPLOY_COMMON_H
 
index 3adb0d7..e290ae1 100755 (executable)
@@ -1,5 +1,11 @@
 #!/usr/bin/env ruby
 
+# Copyright (c) 2012-2014. 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.
+
 require 'rexml/document'
 
 class HostsExtractor
index 47dfe04..70956ea 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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 "iterator.h"
 
 /* http://stackoverflow.com/a/3348142 */
index 3a13ed1..dfc2693 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 KADEPLOY_ITERATOR_H
 #define KADEPLOY_ITERATOR_H
 
index 253cdf7..28a92fb 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 "messages.h"
 
 msg_task_t task_message_new(e_message_type type, unsigned int len)
index ef1f25c..b717d5c 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 KADEPLOY_MESSAGES_H
 #define KADEPLOY_MESSAGES_H
 
index 1b76e50..6be29c1 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 "peer.h"
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_peer,
index 8ee42f7..63f5a0e 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 KADEPLOY_PEER_H
 #define KADEPLOY_PEER_H
 
index ce2c4bd..4f58233 100644 (file)
@@ -1,5 +1,4 @@
-
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -93,6 +92,7 @@ typedef struct s_task_data {
 } s_task_data_t, *task_data_t;
 
 static int *powers2;
+static xbt_dynar_t host_list;
 
 // utility functions
 static void chord_initialize(void);
@@ -133,17 +133,35 @@ static void chord_initialize(void)
   // compute the powers of 2 once for all
   powers2 = xbt_new(int, nb_bits);
   int pow = 1;
-  int i;
+  unsigned i;
   for (i = 0; i < nb_bits; i++) {
     powers2[i] = pow;
     pow = pow << 1;
   }
   nb_keys = pow;
   XBT_DEBUG("Sets nb_keys to %d", nb_keys);
+
+  msg_host_t host;
+  host_list = MSG_hosts_as_dynar();
+  xbt_dynar_foreach(host_list, i, host) {
+    char descr[512];
+    RngStream stream;
+    snprintf(descr, sizeof descr, "RngSream<%s>", MSG_host_get_name(host));
+    stream = RngStream_CreateStream(descr);
+    MSG_host_set_property_value(host, "stream", (char*)stream, NULL);
+  }
 }
 
 static void chord_exit(void)
 {
+  msg_host_t host;
+  unsigned i;
+  xbt_dynar_foreach(host_list, i, host) {
+    RngStream stream = (RngStream)MSG_host_get_property_value(host, "stream");
+    RngStream_DeleteStream(&stream);
+  }
+  xbt_dynar_free(&host_list);
+
   xbt_free(powers2);
 }
 
@@ -304,6 +322,8 @@ int node(int argc, char *argv[])
   // initialize my node
   s_node_t node = {0};
   node.id = atoi(argv[1]);
+  node.stream =
+    (RngStream)MSG_host_get_property_value(MSG_host_self(), "stream");
   get_mailbox(node.id, node.mailbox);
   node.next_finger_to_fix = 0;
   node.fingers = xbt_new0(s_finger_t, nb_bits);
@@ -574,7 +594,6 @@ static void leave(node_t node)
 {
   XBT_DEBUG("Well Guys! I Think it's time for me to quit ;)");
   quit_notify(node);
-  RngStream_DeleteStream(&node->stream);
 }
 
 /**
@@ -708,7 +727,8 @@ static int remote_find_successor(node_t node, int ask_to, int id)
        //   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) {
+        if (task_received != task_sent ||
+            ans_data->type != TASK_FIND_SUCCESSOR_ANSWER) {
           // this is not the expected answer
           MSG_comm_destroy(node->comm_receive);
           node->comm_receive = NULL;
@@ -788,7 +808,8 @@ static int remote_get_predecessor(node_t node, int ask_to)
           MC_assert(task_received == task_sent);
           }*/
 
-        if (task_received != task_sent) {
+        if (task_received != task_sent ||
+            ans_data->type != TASK_GET_PREDECESSOR_ANSWER) {
           MSG_comm_destroy(node->comm_receive);
           node->comm_receive = NULL;
           handle_task(node, task_received);
@@ -990,18 +1011,11 @@ static void check_predecessor(node_t node)
  */
 static void random_lookup(node_t node)
 {
-  
-  int id = 1337; 
-  find_successor(node, id);
-
-  /*** Random lookup disabled for tesh examples ***/
-  /*if(node->stream == NULL)
-    node->stream = RngStream_CreateStream("");
   int random_index = RngStream_RandInt (node->stream, 0, nb_bits - 1);
   int random_id = node->fingers[random_index].id;
   XBT_DEBUG("Making a lookup request for id %d", random_id);
   int res = find_successor(node, random_id);
-  XBT_DEBUG("The successor of node %d is %d", random_id, res);*/
+  XBT_DEBUG("The successor of node %d is %d", random_id, res);
 
 }
 
@@ -1042,10 +1056,10 @@ int main(int argc, char *argv[])
   const char* platform_file = options[0];
   const char* application_file = options[1];
 
-  chord_initialize();
-
   MSG_create_environment(platform_file);
 
+  chord_initialize();
+
   MSG_function_register("node", node);
   MSG_launch_application(application_file);
 
index 96fdb8c..ccad098 100644 (file)
@@ -5,13 +5,13 @@ p Testing the Chord implementation with MSG
 ! output sort
 $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platform.xml ${srcdir:=.}/chord.xml --cfg=network/crosstraffic:0 --log=msg_chord.thres:verbose "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (0:@) Configuration change: Set 'network/crosstraffic' to '0'
+> [  0.000000] (6:node@Jean_Yves) Joining the ring with id 14, knowing node 1
 > [  0.000000] (1:node@Gatien) Joining the ring with id 48, knowing node 1
 > [  0.000000] (2:node@McGee) Joining the ring with id 42, knowing node 1
 > [  0.000000] (3:node@iRMX) Joining the ring with id 38, knowing node 1
-> [  0.000000] (4:node@Geoff) Joining the ring with id 32, knowing node 1
-> [  0.000000] (5:node@TeX) Joining the ring with id 21, knowing node 1
-> [  0.000000] (6:node@Jean_Yves) Joining the ring with id 14, knowing node 1
 > [  0.000000] (7:node@Boivin) Joining the ring with id 8, knowing node 1
+> [  0.000000] (5:node@TeX) Joining the ring with id 21, knowing node 1
+> [  0.000000] (4:node@Geoff) Joining the ring with id 32, knowing node 1
 > [  0.000000] (8:node@Jacquelin) My finger table:
 > [  0.000000] (8:node@Jacquelin) Start | Succ 
 > [  0.000000] (8:node@Jacquelin)    2  |   1 
@@ -84,294 +84,383 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platfo
 > [ 36.048185] (7:node@Boivin)   24  |   8 
 > [ 36.048185] (7:node@Boivin)   40  |   8 
 > [ 36.048185] (7:node@Boivin) Predecessor: -1
-> [ 74.998500] (8:node@Jacquelin) My finger table:
-> [ 74.998500] (8:node@Jacquelin) Start | Succ 
-> [ 74.998500] (8:node@Jacquelin)    2  |   1 
-> [ 74.998500] (8:node@Jacquelin)    3  |   1 
-> [ 74.998500] (8:node@Jacquelin)    5  |   1 
-> [ 74.998500] (8:node@Jacquelin)    9  |   1 
-> [ 74.998500] (8:node@Jacquelin)   17  |   1 
-> [ 74.998500] (8:node@Jacquelin)   33  |   1 
-> [ 74.998500] (8:node@Jacquelin) Predecessor: 32
-> [ 75.886856] (8:node@Jacquelin) My finger table:
-> [ 75.886856] (8:node@Jacquelin) Start | Succ 
-> [ 75.886856] (8:node@Jacquelin)    2  |  32 
-> [ 75.886856] (8:node@Jacquelin)    3  |   1 
-> [ 75.886856] (8:node@Jacquelin)    5  |   1 
-> [ 75.886856] (8:node@Jacquelin)    9  |   1 
-> [ 75.886856] (8:node@Jacquelin)   17  |   1 
-> [ 75.886856] (8:node@Jacquelin)   33  |   1 
-> [ 75.886856] (8:node@Jacquelin) Predecessor: 42
-> [ 77.161304] (8:node@Jacquelin) My finger table:
-> [ 77.161304] (8:node@Jacquelin) Start | Succ 
-> [ 77.161304] (8:node@Jacquelin)    2  |  32 
-> [ 77.161304] (8:node@Jacquelin)    3  |   1 
-> [ 77.161304] (8:node@Jacquelin)    5  |   1 
-> [ 77.161304] (8:node@Jacquelin)    9  |   1 
-> [ 77.161304] (8:node@Jacquelin)   17  |   1 
-> [ 77.161304] (8:node@Jacquelin)   33  |   1 
-> [ 77.161304] (8:node@Jacquelin) Predecessor: 48
-> [102.428549] (4:node@Geoff) My finger table:
-> [102.428549] (4:node@Geoff) Start | Succ 
-> [102.428549] (4:node@Geoff)   33  |  48 
-> [102.428549] (4:node@Geoff)   34  |  32 
-> [102.428549] (4:node@Geoff)   36  |  32 
-> [102.428549] (4:node@Geoff)   40  |  32 
-> [102.428549] (4:node@Geoff)   48  |  32 
-> [102.428549] (4:node@Geoff)    0  |  32 
-> [102.428549] (4:node@Geoff) Predecessor: 1
-> [128.446143] (1:node@Gatien) My finger table:
-> [128.446143] (1:node@Gatien) Start | Succ 
-> [128.446143] (1:node@Gatien)   49  |   1 
-> [128.446143] (1:node@Gatien)   50  |  48 
-> [128.446143] (1:node@Gatien)   52  |  48 
-> [128.446143] (1:node@Gatien)   56  |  48 
-> [128.446143] (1:node@Gatien)    0  |  48 
-> [128.446143] (1:node@Gatien)   16  |  48 
-> [128.446143] (1:node@Gatien) Predecessor: 32
-> [138.445943] (1:node@Gatien) My finger table:
-> [138.445943] (1:node@Gatien) Start | Succ 
-> [138.445943] (1:node@Gatien)   49  |   1 
-> [138.445943] (1:node@Gatien)   50  |  48 
-> [138.445943] (1:node@Gatien)   52  |  48 
-> [138.445943] (1:node@Gatien)   56  |  48 
-> [138.445943] (1:node@Gatien)    0  |  48 
-> [138.445943] (1:node@Gatien)   16  |  48 
-> [138.445943] (1:node@Gatien) Predecessor: 42
-> [211.728399] (2:node@McGee) My finger table:
-> [211.728399] (2:node@McGee) Start | Succ 
-> [211.728399] (2:node@McGee)   43  |  48 
-> [211.728399] (2:node@McGee)   44  |  42 
-> [211.728399] (2:node@McGee)   46  |  42 
-> [211.728399] (2:node@McGee)   50  |  42 
-> [211.728399] (2:node@McGee)   58  |  42 
-> [211.728399] (2:node@McGee)   10  |  42 
-> [211.728399] (2:node@McGee) Predecessor: 38
-> [248.221969] (1:node@Gatien) My finger table:
-> [248.221969] (1:node@Gatien) Start | Succ 
-> [248.221969] (1:node@Gatien)   49  |   1 
-> [248.221969] (1:node@Gatien)   50  |   1 
-> [248.221969] (1:node@Gatien)   52  |  48 
-> [248.221969] (1:node@Gatien)   56  |  48 
-> [248.221969] (1:node@Gatien)    0  |  48 
-> [248.221969] (1:node@Gatien)   16  |  48 
-> [248.221969] (1:node@Gatien) Predecessor: 42
-> [251.135492] (7:node@Boivin) My finger table:
-> [251.135492] (7:node@Boivin) Start | Succ 
-> [251.135492] (7:node@Boivin)    9  |  38 
-> [251.135492] (7:node@Boivin)   10  |  38 
-> [251.135492] (7:node@Boivin)   12  |   8 
-> [251.135492] (7:node@Boivin)   16  |   8 
-> [251.135492] (7:node@Boivin)   24  |   8 
-> [251.135492] (7:node@Boivin)   40  |   8 
-> [251.135492] (7:node@Boivin) Predecessor: -1
-> [259.451660] (2:node@McGee) My finger table:
-> [259.451660] (2:node@McGee) Start | Succ 
-> [259.451660] (2:node@McGee)   43  |  48 
-> [259.451660] (2:node@McGee)   44  |  48 
-> [259.451660] (2:node@McGee)   46  |  42 
-> [259.451660] (2:node@McGee)   50  |  42 
-> [259.451660] (2:node@McGee)   58  |  42 
-> [259.451660] (2:node@McGee)   10  |  42 
-> [259.451660] (2:node@McGee) Predecessor: 38
-> [309.452289] (4:node@Geoff) My finger table:
-> [309.452289] (4:node@Geoff) Start | Succ 
-> [309.452289] (4:node@Geoff)   33  |  38 
-> [309.452289] (4:node@Geoff)   34  |  38 
-> [309.452289] (4:node@Geoff)   36  |  32 
-> [309.452289] (4:node@Geoff)   40  |  32 
-> [309.452289] (4:node@Geoff)   48  |  32 
-> [309.452289] (4:node@Geoff)    0  |  32 
-> [309.452289] (4:node@Geoff) Predecessor: 1
-> [309.457634] (8:node@Jacquelin) My finger table:
-> [309.457634] (8:node@Jacquelin) Start | Succ 
-> [309.457634] (8:node@Jacquelin)    2  |  32 
-> [309.457634] (8:node@Jacquelin)    3  |  32 
-> [309.457634] (8:node@Jacquelin)    5  |   1 
-> [309.457634] (8:node@Jacquelin)    9  |   1 
-> [309.457634] (8:node@Jacquelin)   17  |   1 
-> [309.457634] (8:node@Jacquelin)   33  |   1 
-> [309.457634] (8:node@Jacquelin) Predecessor: 48
-> [323.904210] (6:node@Jean_Yves) My finger table:
-> [323.904210] (6:node@Jean_Yves) Start | Succ 
-> [323.904210] (6:node@Jean_Yves)   15  |  38 
-> [323.904210] (6:node@Jean_Yves)   16  |  38 
-> [323.904210] (6:node@Jean_Yves)   18  |  14 
-> [323.904210] (6:node@Jean_Yves)   22  |  14 
-> [323.904210] (6:node@Jean_Yves)   30  |  14 
-> [323.904210] (6:node@Jean_Yves)   46  |  14 
-> [323.904210] (6:node@Jean_Yves) Predecessor: -1
-> [325.353212] (3:node@iRMX) My finger table:
-> [325.353212] (3:node@iRMX) Start | Succ 
-> [325.353212] (3:node@iRMX)   39  |  42 
-> [325.353212] (3:node@iRMX)   40  |  38 
-> [325.353212] (3:node@iRMX)   42  |  38 
-> [325.353212] (3:node@iRMX)   46  |  38 
-> [325.353212] (3:node@iRMX)   54  |  38 
-> [325.353212] (3:node@iRMX)    6  |  38 
-> [325.353212] (3:node@iRMX) Predecessor: 32
-> [330.576758] (3:node@iRMX) My finger table:
-> [330.576758] (3:node@iRMX) Start | Succ 
-> [330.576758] (3:node@iRMX)   39  |  42 
-> [330.576758] (3:node@iRMX)   40  |  42 
-> [330.576758] (3:node@iRMX)   42  |  38 
-> [330.576758] (3:node@iRMX)   46  |  38 
-> [330.576758] (3:node@iRMX)   54  |  38 
-> [330.576758] (3:node@iRMX)    6  |  38 
-> [330.576758] (3:node@iRMX) Predecessor: 32
-> [352.615271] (5:node@TeX) My finger table:
-> [352.615271] (5:node@TeX) Start | Succ 
-> [352.615271] (5:node@TeX)   22  |  32 
-> [352.615271] (5:node@TeX)   23  |  32 
-> [352.615271] (5:node@TeX)   25  |  21 
-> [352.615271] (5:node@TeX)   29  |  21 
-> [352.615271] (5:node@TeX)   37  |  21 
-> [352.615271] (5:node@TeX)   53  |  21 
-> [352.615271] (5:node@TeX) Predecessor: -1
-> [369.575209] (1:node@Gatien) My finger table:
-> [369.575209] (1:node@Gatien) Start | Succ 
-> [369.575209] (1:node@Gatien)   49  |   1 
-> [369.575209] (1:node@Gatien)   50  |   1 
-> [369.575209] (1:node@Gatien)   52  |   1 
-> [369.575209] (1:node@Gatien)   56  |  48 
-> [369.575209] (1:node@Gatien)    0  |  48 
-> [369.575209] (1:node@Gatien)   16  |  48 
-> [369.575209] (1:node@Gatien) Predecessor: 42
-> [382.882683] (2:node@McGee) My finger table:
-> [382.882683] (2:node@McGee) Start | Succ 
-> [382.882683] (2:node@McGee)   43  |  48 
-> [382.882683] (2:node@McGee)   44  |  48 
-> [382.882683] (2:node@McGee)   46  |  48 
-> [382.882683] (2:node@McGee)   50  |  42 
-> [382.882683] (2:node@McGee)   58  |  42 
-> [382.882683] (2:node@McGee)   10  |  42 
-> [382.882683] (2:node@McGee) Predecessor: 38
-> [384.345471] (4:node@Geoff) My finger table:
-> [384.345471] (4:node@Geoff) Start | Succ 
-> [384.345471] (4:node@Geoff)   33  |  38 
-> [384.345471] (4:node@Geoff)   34  |  38 
-> [384.345471] (4:node@Geoff)   36  |  32 
-> [384.345471] (4:node@Geoff)   40  |  32 
-> [384.345471] (4:node@Geoff)   48  |  32 
-> [384.345471] (4:node@Geoff)    0  |  32 
-> [384.345471] (4:node@Geoff) Predecessor: 21
-> [420.326402] (7:node@Boivin) My finger table:
-> [420.326402] (7:node@Boivin) Start | Succ 
-> [420.326402] (7:node@Boivin)    9  |  21 
-> [420.326402] (7:node@Boivin)   10  |  38 
-> [420.326402] (7:node@Boivin)   12  |  21 
-> [420.326402] (7:node@Boivin)   16  |   8 
-> [420.326402] (7:node@Boivin)   24  |   8 
-> [420.326402] (7:node@Boivin)   40  |   8 
-> [420.326402] (7:node@Boivin) Predecessor: -1
-> [440.893851] (5:node@TeX) My finger table:
-> [440.893851] (5:node@TeX) Start | Succ 
-> [440.893851] (5:node@TeX)   22  |  32 
-> [440.893851] (5:node@TeX)   23  |  32 
-> [440.893851] (5:node@TeX)   25  |  21 
-> [440.893851] (5:node@TeX)   29  |  21 
-> [440.893851] (5:node@TeX)   37  |  21 
-> [440.893851] (5:node@TeX)   53  |  21 
-> [440.893851] (5:node@TeX) Predecessor: 14
-> [479.758971] (3:node@iRMX) My finger table:
-> [479.758971] (3:node@iRMX) Start | Succ 
-> [479.758971] (3:node@iRMX)   39  |  42 
-> [479.758971] (3:node@iRMX)   40  |  42 
-> [479.758971] (3:node@iRMX)   42  |  42 
-> [479.758971] (3:node@iRMX)   46  |  38 
-> [479.758971] (3:node@iRMX)   54  |  38 
-> [479.758971] (3:node@iRMX)    6  |  38 
-> [479.758971] (3:node@iRMX) Predecessor: 32
-> [482.033225] (4:node@Geoff) My finger table:
-> [482.033225] (4:node@Geoff) Start | Succ 
-> [482.033225] (4:node@Geoff)   33  |  38 
-> [482.033225] (4:node@Geoff)   34  |  38 
-> [482.033225] (4:node@Geoff)   36  |  38 
-> [482.033225] (4:node@Geoff)   40  |  32 
-> [482.033225] (4:node@Geoff)   48  |  32 
-> [482.033225] (4:node@Geoff)    0  |  32 
-> [482.033225] (4:node@Geoff) Predecessor: 21
-> [490.659143] (1:node@Gatien) My finger table:
-> [490.659143] (1:node@Gatien) Start | Succ 
-> [490.659143] (1:node@Gatien)   49  |   1 
-> [490.659143] (1:node@Gatien)   50  |   1 
-> [490.659143] (1:node@Gatien)   52  |   1 
-> [490.659143] (1:node@Gatien)   56  |   1 
-> [490.659143] (1:node@Gatien)    0  |  48 
-> [490.659143] (1:node@Gatien)   16  |  48 
-> [490.659143] (1:node@Gatien) Predecessor: 42
-> [498.176263] (3:node@iRMX) My finger table:
-> [498.176263] (3:node@iRMX) Start | Succ 
-> [498.176263] (3:node@iRMX)   39  |  42 
-> [498.176263] (3:node@iRMX)   40  |  42 
-> [498.176263] (3:node@iRMX)   42  |  42 
-> [498.176263] (3:node@iRMX)   46  |  38 
-> [498.176263] (3:node@iRMX)   54  |  38 
-> [498.176263] (3:node@iRMX)    6  |  38 
-> [498.176263] (3:node@iRMX) Predecessor: 32
-> [498.611138] (6:node@Jean_Yves) My finger table:
-> [498.611138] (6:node@Jean_Yves) Start | Succ 
-> [498.611138] (6:node@Jean_Yves)   15  |  21 
-> [498.611138] (6:node@Jean_Yves)   16  |  38 
-> [498.611138] (6:node@Jean_Yves)   18  |  21 
-> [498.611138] (6:node@Jean_Yves)   22  |  14 
-> [498.611138] (6:node@Jean_Yves)   30  |  14 
-> [498.611138] (6:node@Jean_Yves)   46  |  14 
-> [498.611138] (6:node@Jean_Yves) Predecessor: -1
-> [500.558693] (8:node@Jacquelin) My finger table:
-> [500.558693] (8:node@Jacquelin) Start | Succ 
-> [500.558693] (8:node@Jacquelin)    2  |  14 
-> [500.558693] (8:node@Jacquelin)    3  |  32 
-> [500.558693] (8:node@Jacquelin)    5  |  14 
-> [500.558693] (8:node@Jacquelin)    9  |   1 
-> [500.558693] (8:node@Jacquelin)   17  |   1 
-> [500.558693] (8:node@Jacquelin)   33  |   1 
-> [500.558693] (8:node@Jacquelin) Predecessor: 48
-> [505.760856] (2:node@McGee) My finger table:
-> [505.760856] (2:node@McGee) Start | Succ 
-> [505.760856] (2:node@McGee)   43  |  48 
-> [505.760856] (2:node@McGee)   44  |  48 
-> [505.760856] (2:node@McGee)   46  |  48 
-> [505.760856] (2:node@McGee)   50  |   1 
-> [505.760856] (2:node@McGee)   58  |  42 
-> [505.760856] (2:node@McGee)   10  |  42 
-> [505.760856] (2:node@McGee) Predecessor: 38
-> [509.829034] (5:node@TeX) My finger table:
-> [509.829034] (5:node@TeX) Start | Succ 
-> [509.829034] (5:node@TeX)   22  |  32 
-> [509.829034] (5:node@TeX)   23  |  32 
-> [509.829034] (5:node@TeX)   25  |  32 
-> [509.829034] (5:node@TeX)   29  |  21 
-> [509.829034] (5:node@TeX)   37  |  21 
-> [509.829034] (5:node@TeX)   53  |  21 
-> [509.829034] (5:node@TeX) Predecessor: 14
-> [533.786329] (6:node@Jean_Yves) My finger table:
-> [533.786329] (6:node@Jean_Yves) Start | Succ 
-> [533.786329] (6:node@Jean_Yves)   15  |  21 
-> [533.786329] (6:node@Jean_Yves)   16  |  38 
-> [533.786329] (6:node@Jean_Yves)   18  |  21 
-> [533.786329] (6:node@Jean_Yves)   22  |  14 
-> [533.786329] (6:node@Jean_Yves)   30  |  14 
-> [533.786329] (6:node@Jean_Yves)   46  |  14 
-> [533.786329] (6:node@Jean_Yves) Predecessor: 8
-> [549.075290] (7:node@Boivin) My finger table:
-> [549.075290] (7:node@Boivin) Start | Succ 
-> [549.075290] (7:node@Boivin)    9  |  14 
-> [549.075290] (7:node@Boivin)   10  |  38 
-> [549.075290] (7:node@Boivin)   12  |  21 
-> [549.075290] (7:node@Boivin)   16  |  21 
-> [549.075290] (7:node@Boivin)   24  |   8 
-> [549.075290] (7:node@Boivin)   40  |   8 
-> [549.075290] (7:node@Boivin) Predecessor: -1
-> [753.389615] (0:@) Messages created: 605
-> [753.389615] (0:@) Simulated time: 753.39
+> [ 89.998200] (8:node@Jacquelin) My finger table:
+> [ 89.998200] (8:node@Jacquelin) Start | Succ 
+> [ 89.998200] (8:node@Jacquelin)    2  |   1 
+> [ 89.998200] (8:node@Jacquelin)    3  |   1 
+> [ 89.998200] (8:node@Jacquelin)    5  |   1 
+> [ 89.998200] (8:node@Jacquelin)    9  |   1 
+> [ 89.998200] (8:node@Jacquelin)   17  |   1 
+> [ 89.998200] (8:node@Jacquelin)   33  |   1 
+> [ 89.998200] (8:node@Jacquelin) Predecessor: 32
+> [109.834284] (8:node@Jacquelin) My finger table:
+> [109.834284] (8:node@Jacquelin) Start | Succ 
+> [109.834284] (8:node@Jacquelin)    2  |  32 
+> [109.834284] (8:node@Jacquelin)    3  |   1 
+> [109.834284] (8:node@Jacquelin)    5  |   1 
+> [109.834284] (8:node@Jacquelin)    9  |   1 
+> [109.834284] (8:node@Jacquelin)   17  |   1 
+> [109.834284] (8:node@Jacquelin)   33  |   1 
+> [109.834284] (8:node@Jacquelin) Predecessor: 42
+> [111.997088] (8:node@Jacquelin) My finger table:
+> [111.997088] (8:node@Jacquelin) Start | Succ 
+> [111.997088] (8:node@Jacquelin)    2  |  32 
+> [111.997088] (8:node@Jacquelin)    3  |   1 
+> [111.997088] (8:node@Jacquelin)    5  |   1 
+> [111.997088] (8:node@Jacquelin)    9  |   1 
+> [111.997088] (8:node@Jacquelin)   17  |   1 
+> [111.997088] (8:node@Jacquelin)   33  |   1 
+> [111.997088] (8:node@Jacquelin) Predecessor: 48
+> [131.116432] (4:node@Geoff) My finger table:
+> [131.116432] (4:node@Geoff) Start | Succ 
+> [131.116432] (4:node@Geoff)   33  |  48 
+> [131.116432] (4:node@Geoff)   34  |  32 
+> [131.116432] (4:node@Geoff)   36  |  32 
+> [131.116432] (4:node@Geoff)   40  |  32 
+> [131.116432] (4:node@Geoff)   48  |  32 
+> [131.116432] (4:node@Geoff)    0  |  32 
+> [131.116432] (4:node@Geoff) Predecessor: 1
+> [160.070532] (1:node@Gatien) My finger table:
+> [160.070532] (1:node@Gatien) Start | Succ 
+> [160.070532] (1:node@Gatien)   49  |   1 
+> [160.070532] (1:node@Gatien)   50  |  48 
+> [160.070532] (1:node@Gatien)   52  |  48 
+> [160.070532] (1:node@Gatien)   56  |  48 
+> [160.070532] (1:node@Gatien)    0  |  48 
+> [160.070532] (1:node@Gatien)   16  |  48 
+> [160.070532] (1:node@Gatien) Predecessor: 32
+> [175.080917] (1:node@Gatien) My finger table:
+> [175.080917] (1:node@Gatien) Start | Succ 
+> [175.080917] (1:node@Gatien)   49  |   1 
+> [175.080917] (1:node@Gatien)   50  |  48 
+> [175.080917] (1:node@Gatien)   52  |  48 
+> [175.080917] (1:node@Gatien)   56  |  48 
+> [175.080917] (1:node@Gatien)    0  |  48 
+> [175.080917] (1:node@Gatien)   16  |  48 
+> [175.080917] (1:node@Gatien) Predecessor: 42
+> [210.526967] (2:node@McGee) My finger table:
+> [210.526967] (2:node@McGee) Start | Succ 
+> [210.526967] (2:node@McGee)   43  |  48 
+> [210.526967] (2:node@McGee)   44  |  42 
+> [210.526967] (2:node@McGee)   46  |  42 
+> [210.526967] (2:node@McGee)   50  |  42 
+> [210.526967] (2:node@McGee)   58  |  42 
+> [210.526967] (2:node@McGee)   10  |  42 
+> [210.526967] (2:node@McGee) Predecessor: 8
+> [213.351933] (2:node@McGee) My finger table:
+> [213.351933] (2:node@McGee) Start | Succ 
+> [213.351933] (2:node@McGee)   43  |  48 
+> [213.351933] (2:node@McGee)   44  |  42 
+> [213.351933] (2:node@McGee)   46  |  42 
+> [213.351933] (2:node@McGee)   50  |  42 
+> [213.351933] (2:node@McGee)   58  |  42 
+> [213.351933] (2:node@McGee)   10  |  42 
+> [213.351933] (2:node@McGee) Predecessor: 21
+> [220.117859] (2:node@McGee) My finger table:
+> [220.117859] (2:node@McGee) Start | Succ 
+> [220.117859] (2:node@McGee)   43  |  48 
+> [220.117859] (2:node@McGee)   44  |  42 
+> [220.117859] (2:node@McGee)   46  |  42 
+> [220.117859] (2:node@McGee)   50  |  42 
+> [220.117859] (2:node@McGee)   58  |  42 
+> [220.117859] (2:node@McGee)   10  |  42 
+> [220.117859] (2:node@McGee) Predecessor: 32
+> [243.554143] (5:node@TeX) My finger table:
+> [243.554143] (5:node@TeX) Start | Succ 
+> [243.554143] (5:node@TeX)   22  |  32 
+> [243.554143] (5:node@TeX)   23  |  32 
+> [243.554143] (5:node@TeX)   25  |  21 
+> [243.554143] (5:node@TeX)   29  |  21 
+> [243.554143] (5:node@TeX)   37  |  21 
+> [243.554143] (5:node@TeX)   53  |  21 
+> [243.554143] (5:node@TeX) Predecessor: -1
+> [244.785216] (2:node@McGee) My finger table:
+> [244.785216] (2:node@McGee) Start | Succ 
+> [244.785216] (2:node@McGee)   43  |  48 
+> [244.785216] (2:node@McGee)   44  |  42 
+> [244.785216] (2:node@McGee)   46  |  42 
+> [244.785216] (2:node@McGee)   50  |  42 
+> [244.785216] (2:node@McGee)   58  |  42 
+> [244.785216] (2:node@McGee)   10  |  42 
+> [244.785216] (2:node@McGee) Predecessor: 38
+> [244.894162] (6:node@Jean_Yves) My finger table:
+> [244.894162] (6:node@Jean_Yves) Start | Succ 
+> [244.894162] (6:node@Jean_Yves)   15  |  32 
+> [244.894162] (6:node@Jean_Yves)   16  |  32 
+> [244.894162] (6:node@Jean_Yves)   18  |  14 
+> [244.894162] (6:node@Jean_Yves)   22  |  14 
+> [244.894162] (6:node@Jean_Yves)   30  |  14 
+> [244.894162] (6:node@Jean_Yves)   46  |  14 
+> [244.894162] (6:node@Jean_Yves) Predecessor: -1
+> [254.475988] (2:node@McGee) My finger table:
+> [254.475988] (2:node@McGee) Start | Succ 
+> [254.475988] (2:node@McGee)   43  |  48 
+> [254.475988] (2:node@McGee)   44  |  48 
+> [254.475988] (2:node@McGee)   46  |  42 
+> [254.475988] (2:node@McGee)   50  |  42 
+> [254.475988] (2:node@McGee)   58  |  42 
+> [254.475988] (2:node@McGee)   10  |  42 
+> [254.475988] (2:node@McGee) Predecessor: 38
+> [257.793913] (4:node@Geoff) My finger table:
+> [257.793913] (4:node@Geoff) Start | Succ 
+> [257.793913] (4:node@Geoff)   33  |  42 
+> [257.793913] (4:node@Geoff)   34  |  42 
+> [257.793913] (4:node@Geoff)   36  |  32 
+> [257.793913] (4:node@Geoff)   40  |  32 
+> [257.793913] (4:node@Geoff)   48  |  32 
+> [257.793913] (4:node@Geoff)    0  |  32 
+> [257.793913] (4:node@Geoff) Predecessor: 1
+> [301.405548] (8:node@Jacquelin) My finger table:
+> [301.405548] (8:node@Jacquelin) Start | Succ 
+> [301.405548] (8:node@Jacquelin)    2  |  32 
+> [301.405548] (8:node@Jacquelin)    3  |  32 
+> [301.405548] (8:node@Jacquelin)    5  |   1 
+> [301.405548] (8:node@Jacquelin)    9  |   1 
+> [301.405548] (8:node@Jacquelin)   17  |   1 
+> [301.405548] (8:node@Jacquelin)   33  |   1 
+> [301.405548] (8:node@Jacquelin) Predecessor: 48
+> [304.772436] (7:node@Boivin) My finger table:
+> [304.772436] (7:node@Boivin) Start | Succ 
+> [304.772436] (7:node@Boivin)    9  |  32 
+> [304.772436] (7:node@Boivin)   10  |  32 
+> [304.772436] (7:node@Boivin)   12  |   8 
+> [304.772436] (7:node@Boivin)   16  |   8 
+> [304.772436] (7:node@Boivin)   24  |   8 
+> [304.772436] (7:node@Boivin)   40  |   8 
+> [304.772436] (7:node@Boivin) Predecessor: -1
+> [307.510173] (4:node@Geoff) My finger table:
+> [307.510173] (4:node@Geoff) Start | Succ 
+> [307.510173] (4:node@Geoff)   33  |  42 
+> [307.510173] (4:node@Geoff)   34  |  42 
+> [307.510173] (4:node@Geoff)   36  |  32 
+> [307.510173] (4:node@Geoff)   40  |  32 
+> [307.510173] (4:node@Geoff)   48  |  32 
+> [307.510173] (4:node@Geoff)    0  |  32 
+> [307.510173] (4:node@Geoff) Predecessor: 8
+> [307.783154] (1:node@Gatien) My finger table:
+> [307.783154] (1:node@Gatien) Start | Succ 
+> [307.783154] (1:node@Gatien)   49  |   1 
+> [307.783154] (1:node@Gatien)   50  |   1 
+> [307.783154] (1:node@Gatien)   52  |  48 
+> [307.783154] (1:node@Gatien)   56  |  48 
+> [307.783154] (1:node@Gatien)    0  |  48 
+> [307.783154] (1:node@Gatien)   16  |  48 
+> [307.783154] (1:node@Gatien) Predecessor: 42
+> [310.800278] (3:node@iRMX) My finger table:
+> [310.800278] (3:node@iRMX) Start | Succ 
+> [310.800278] (3:node@iRMX)   39  |  42 
+> [310.800278] (3:node@iRMX)   40  |  42 
+> [310.800278] (3:node@iRMX)   42  |  38 
+> [310.800278] (3:node@iRMX)   46  |  38 
+> [310.800278] (3:node@iRMX)   54  |  38 
+> [310.800278] (3:node@iRMX)    6  |  38 
+> [310.800278] (3:node@iRMX) Predecessor: -1
+> [313.838612] (4:node@Geoff) My finger table:
+> [313.838612] (4:node@Geoff) Start | Succ 
+> [313.838612] (4:node@Geoff)   33  |  38 
+> [313.838612] (4:node@Geoff)   34  |  42 
+> [313.838612] (4:node@Geoff)   36  |  32 
+> [313.838612] (4:node@Geoff)   40  |  32 
+> [313.838612] (4:node@Geoff)   48  |  32 
+> [313.838612] (4:node@Geoff)    0  |  32 
+> [313.838612] (4:node@Geoff) Predecessor: 21
+> [347.040437] (3:node@iRMX) My finger table:
+> [347.040437] (3:node@iRMX) Start | Succ 
+> [347.040437] (3:node@iRMX)   39  |  42 
+> [347.040437] (3:node@iRMX)   40  |  42 
+> [347.040437] (3:node@iRMX)   42  |  38 
+> [347.040437] (3:node@iRMX)   46  |  38 
+> [347.040437] (3:node@iRMX)   54  |  38 
+> [347.040437] (3:node@iRMX)    6  |  38 
+> [347.040437] (3:node@iRMX) Predecessor: 32
+> [368.832360] (5:node@TeX) My finger table:
+> [368.832360] (5:node@TeX) Start | Succ 
+> [368.832360] (5:node@TeX)   22  |  32 
+> [368.832360] (5:node@TeX)   23  |  32 
+> [368.832360] (5:node@TeX)   25  |  21 
+> [368.832360] (5:node@TeX)   29  |  21 
+> [368.832360] (5:node@TeX)   37  |  21 
+> [368.832360] (5:node@TeX)   53  |  21 
+> [368.832360] (5:node@TeX) Predecessor: 8
+> [374.267135] (6:node@Jean_Yves) My finger table:
+> [374.267135] (6:node@Jean_Yves) Start | Succ 
+> [374.267135] (6:node@Jean_Yves)   15  |  21 
+> [374.267135] (6:node@Jean_Yves)   16  |  32 
+> [374.267135] (6:node@Jean_Yves)   18  |  21 
+> [374.267135] (6:node@Jean_Yves)   22  |  14 
+> [374.267135] (6:node@Jean_Yves)   30  |  14 
+> [374.267135] (6:node@Jean_Yves)   46  |  14 
+> [374.267135] (6:node@Jean_Yves) Predecessor: -1
+> [375.174950] (5:node@TeX) My finger table:
+> [375.174950] (5:node@TeX) Start | Succ 
+> [375.174950] (5:node@TeX)   22  |  32 
+> [375.174950] (5:node@TeX)   23  |  32 
+> [375.174950] (5:node@TeX)   25  |  32 
+> [375.174950] (5:node@TeX)   29  |  21 
+> [375.174950] (5:node@TeX)   37  |  21 
+> [375.174950] (5:node@TeX)   53  |  21 
+> [375.174950] (5:node@TeX) Predecessor: 8
+> [377.892337] (5:node@TeX) My finger table:
+> [377.892337] (5:node@TeX) Start | Succ 
+> [377.892337] (5:node@TeX)   22  |  32 
+> [377.892337] (5:node@TeX)   23  |  32 
+> [377.892337] (5:node@TeX)   25  |  32 
+> [377.892337] (5:node@TeX)   29  |  21 
+> [377.892337] (5:node@TeX)   37  |  21 
+> [377.892337] (5:node@TeX)   53  |  21 
+> [377.892337] (5:node@TeX) Predecessor: 14
+> [381.140564] (4:node@Geoff) My finger table:
+> [381.140564] (4:node@Geoff) Start | Succ 
+> [381.140564] (4:node@Geoff)   33  |  38 
+> [381.140564] (4:node@Geoff)   34  |  42 
+> [381.140564] (4:node@Geoff)   36  |  38 
+> [381.140564] (4:node@Geoff)   40  |  32 
+> [381.140564] (4:node@Geoff)   48  |  32 
+> [381.140564] (4:node@Geoff)    0  |  32 
+> [381.140564] (4:node@Geoff) Predecessor: 21
+> [385.057356] (2:node@McGee) My finger table:
+> [385.057356] (2:node@McGee) Start | Succ 
+> [385.057356] (2:node@McGee)   43  |  48 
+> [385.057356] (2:node@McGee)   44  |  48 
+> [385.057356] (2:node@McGee)   46  |  48 
+> [385.057356] (2:node@McGee)   50  |  42 
+> [385.057356] (2:node@McGee)   58  |  42 
+> [385.057356] (2:node@McGee)   10  |  42 
+> [385.057356] (2:node@McGee) Predecessor: 38
+> [401.887123] (7:node@Boivin) My finger table:
+> [401.887123] (7:node@Boivin) Start | Succ 
+> [401.887123] (7:node@Boivin)    9  |  14 
+> [401.887123] (7:node@Boivin)   10  |  32 
+> [401.887123] (7:node@Boivin)   12  |   8 
+> [401.887123] (7:node@Boivin)   16  |   8 
+> [401.887123] (7:node@Boivin)   24  |   8 
+> [401.887123] (7:node@Boivin)   40  |   8 
+> [401.887123] (7:node@Boivin) Predecessor: 1
+> [428.242722] (8:node@Jacquelin) My finger table:
+> [428.242722] (8:node@Jacquelin) Start | Succ 
+> [428.242722] (8:node@Jacquelin)    2  |   8 
+> [428.242722] (8:node@Jacquelin)    3  |  32 
+> [428.242722] (8:node@Jacquelin)    5  |   8 
+> [428.242722] (8:node@Jacquelin)    9  |   1 
+> [428.242722] (8:node@Jacquelin)   17  |   1 
+> [428.242722] (8:node@Jacquelin)   33  |   1 
+> [428.242722] (8:node@Jacquelin) Predecessor: 48
+> [432.513129] (3:node@iRMX) My finger table:
+> [432.513129] (3:node@iRMX) Start | Succ 
+> [432.513129] (3:node@iRMX)   39  |  42 
+> [432.513129] (3:node@iRMX)   40  |  42 
+> [432.513129] (3:node@iRMX)   42  |  42 
+> [432.513129] (3:node@iRMX)   46  |  38 
+> [432.513129] (3:node@iRMX)   54  |  38 
+> [432.513129] (3:node@iRMX)    6  |  38 
+> [432.513129] (3:node@iRMX) Predecessor: 32
+> [433.617418] (7:node@Boivin) My finger table:
+> [433.617418] (7:node@Boivin) Start | Succ 
+> [433.617418] (7:node@Boivin)    9  |  14 
+> [433.617418] (7:node@Boivin)   10  |  32 
+> [433.617418] (7:node@Boivin)   12  |  14 
+> [433.617418] (7:node@Boivin)   16  |   8 
+> [433.617418] (7:node@Boivin)   24  |   8 
+> [433.617418] (7:node@Boivin)   40  |   8 
+> [433.617418] (7:node@Boivin) Predecessor: 1
+> [439.381023] (6:node@Jean_Yves) My finger table:
+> [439.381023] (6:node@Jean_Yves) Start | Succ 
+> [439.381023] (6:node@Jean_Yves)   15  |  21 
+> [439.381023] (6:node@Jean_Yves)   16  |  32 
+> [439.381023] (6:node@Jean_Yves)   18  |  21 
+> [439.381023] (6:node@Jean_Yves)   22  |  14 
+> [439.381023] (6:node@Jean_Yves)   30  |  14 
+> [439.381023] (6:node@Jean_Yves)   46  |  14 
+> [439.381023] (6:node@Jean_Yves) Predecessor: 8
+> [447.065766] (1:node@Gatien) My finger table:
+> [447.065766] (1:node@Gatien) Start | Succ 
+> [447.065766] (1:node@Gatien)   49  |   1 
+> [447.065766] (1:node@Gatien)   50  |   1 
+> [447.065766] (1:node@Gatien)   52  |   1 
+> [447.065766] (1:node@Gatien)   56  |  48 
+> [447.065766] (1:node@Gatien)    0  |  48 
+> [447.065766] (1:node@Gatien)   16  |  48 
+> [447.065766] (1:node@Gatien) Predecessor: 42
+> [517.974890] (5:node@TeX) My finger table:
+> [517.974890] (5:node@TeX) Start | Succ 
+> [517.974890] (5:node@TeX)   22  |  32 
+> [517.974890] (5:node@TeX)   23  |  32 
+> [517.974890] (5:node@TeX)   25  |  32 
+> [517.974890] (5:node@TeX)   29  |  32 
+> [517.974890] (5:node@TeX)   37  |  21 
+> [517.974890] (5:node@TeX)   53  |  21 
+> [517.974890] (5:node@TeX) Predecessor: 14
+> [536.878464] (4:node@Geoff) My finger table:
+> [536.878464] (4:node@Geoff) Start | Succ 
+> [536.878464] (4:node@Geoff)   33  |  38 
+> [536.878464] (4:node@Geoff)   34  |  42 
+> [536.878464] (4:node@Geoff)   36  |  38 
+> [536.878464] (4:node@Geoff)   40  |  42 
+> [536.878464] (4:node@Geoff)   48  |  32 
+> [536.878464] (4:node@Geoff)    0  |  32 
+> [536.878464] (4:node@Geoff) Predecessor: 21
+> [538.332998] (6:node@Jean_Yves) My finger table:
+> [538.332998] (6:node@Jean_Yves) Start | Succ 
+> [538.332998] (6:node@Jean_Yves)   15  |  21 
+> [538.332998] (6:node@Jean_Yves)   16  |  32 
+> [538.332998] (6:node@Jean_Yves)   18  |  21 
+> [538.332998] (6:node@Jean_Yves)   22  |  32 
+> [538.332998] (6:node@Jean_Yves)   30  |  14 
+> [538.332998] (6:node@Jean_Yves)   46  |  14 
+> [538.332998] (6:node@Jean_Yves) Predecessor: 8
+> [553.664062] (8:node@Jacquelin) My finger table:
+> [553.664062] (8:node@Jacquelin) Start | Succ 
+> [553.664062] (8:node@Jacquelin)    2  |   8 
+> [553.664062] (8:node@Jacquelin)    3  |  32 
+> [553.664062] (8:node@Jacquelin)    5  |   8 
+> [553.664062] (8:node@Jacquelin)    9  |  14 
+> [553.664062] (8:node@Jacquelin)   17  |   1 
+> [553.664062] (8:node@Jacquelin)   33  |   1 
+> [553.664062] (8:node@Jacquelin) Predecessor: 48
+> [554.213099] (2:node@McGee) My finger table:
+> [554.213099] (2:node@McGee) Start | Succ 
+> [554.213099] (2:node@McGee)   43  |  48 
+> [554.213099] (2:node@McGee)   44  |  48 
+> [554.213099] (2:node@McGee)   46  |  48 
+> [554.213099] (2:node@McGee)   50  |   1 
+> [554.213099] (2:node@McGee)   58  |  42 
+> [554.213099] (2:node@McGee)   10  |  42 
+> [554.213099] (2:node@McGee) Predecessor: 38
+> [569.831701] (7:node@Boivin) My finger table:
+> [569.831701] (7:node@Boivin) Start | Succ 
+> [569.831701] (7:node@Boivin)    9  |  14 
+> [569.831701] (7:node@Boivin)   10  |  32 
+> [569.831701] (7:node@Boivin)   12  |  14 
+> [569.831701] (7:node@Boivin)   16  |  21 
+> [569.831701] (7:node@Boivin)   24  |   8 
+> [569.831701] (7:node@Boivin)   40  |   8 
+> [569.831701] (7:node@Boivin) Predecessor: 1
+> [573.429486] (1:node@Gatien) My finger table:
+> [573.429486] (1:node@Gatien) Start | Succ 
+> [573.429486] (1:node@Gatien)   49  |   1 
+> [573.429486] (1:node@Gatien)   50  |   1 
+> [573.429486] (1:node@Gatien)   52  |   1 
+> [573.429486] (1:node@Gatien)   56  |   1 
+> [573.429486] (1:node@Gatien)    0  |  48 
+> [573.429486] (1:node@Gatien)   16  |  48 
+> [573.429486] (1:node@Gatien) Predecessor: 42
+> [577.413817] (3:node@iRMX) My finger table:
+> [577.413817] (3:node@iRMX) Start | Succ 
+> [577.413817] (3:node@iRMX)   39  |  42 
+> [577.413817] (3:node@iRMX)   40  |  42 
+> [577.413817] (3:node@iRMX)   42  |  42 
+> [577.413817] (3:node@iRMX)   46  |  48 
+> [577.413817] (3:node@iRMX)   54  |  38 
+> [577.413817] (3:node@iRMX)    6  |  38 
+> [577.413817] (3:node@iRMX) Predecessor: 32
+> [804.364963] (0:@) Messages created: 788
+> [804.364963] (0:@) Simulated time: 804.365
 
 ! 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
 > [   0.000000] (0:@) Configuration change: Set 'network/crosstraffic' to '0'
 > [   0.000000] (0:@) Configuration change: Set 'network/model' to 'Constant'
 > [   0.000000] (0:@) Switching workstation model to compound since you changed the network and/or cpu model(s)
-> [   0.000000] (10:node@c-9.me) Joining the ring with id 2015253, knowing node 1319738
 > [   0.000000] (1:node@c-0.me) My finger table:
 > [   0.000000] (1:node@c-0.me) Start | Succ 
 > [   0.000000] (1:node@c-0.me)   43  |  42 
@@ -385,8 +474,17 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.
 > [   0.000000] (1:node@c-0.me)  298  |  42 
 > [   0.000000] (1:node@c-0.me)  554  |  42 
 > [   0.000000] (1:node@c-0.me)  1066  |  42 
+> [   0.000000] (3:node@c-2.me) Joining the ring with id 533744, knowing node 366680
+> [   0.000000] (8:node@c-7.me) Joining the ring with id 10004760, knowing node 16509405
+> [   0.000000] (9:node@c-8.me) Joining the ring with id 6518808, knowing node 42
 > [   0.000000] (1:node@c-0.me)  2090  |  42 
+> [   0.000000] (10:node@c-9.me) Joining the ring with id 2015253, knowing node 1319738
+> [   0.000000] (4:node@c-3.me) Joining the ring with id 1319738, knowing node 42
+> [   0.000000] (7:node@c-6.me) Joining the ring with id 16728096, knowing node 1319738
+> [   0.000000] (2:node@c-1.me) Joining the ring with id 366680, knowing node 42
+> [   0.000000] (5:node@c-4.me) Joining the ring with id 16509405, knowing node 366680
 > [   0.000000] (1:node@c-0.me)  4138  |  42 
+> [   0.000000] (6:node@c-5.me) Joining the ring with id 10874876, knowing node 533744
 > [   0.000000] (1:node@c-0.me)  8234  |  42 
 > [   0.000000] (1:node@c-0.me)  16426  |  42 
 > [   0.000000] (1:node@c-0.me)  32810  |  42 
@@ -399,122 +497,114 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.
 > [   0.000000] (1:node@c-0.me)  4194346  |  42 
 > [   0.000000] (1:node@c-0.me)  8388650  |  42 
 > [   0.000000] (1:node@c-0.me) Predecessor: -1
-> [   0.000000] (2:node@c-1.me) Joining the ring with id 366680, knowing node 42
-> [   0.000000] (3:node@c-2.me) Joining the ring with id 533744, knowing node 366680
-> [   0.000000] (4:node@c-3.me) Joining the ring with id 1319738, knowing node 42
-> [   0.000000] (5:node@c-4.me) Joining the ring with id 16509405, knowing node 366680
-> [   0.000000] (6:node@c-5.me) Joining the ring with id 10874876, knowing node 533744
-> [   0.000000] (7:node@c-6.me) Joining the ring with id 16728096, knowing node 1319738
-> [   0.000000] (8:node@c-7.me) Joining the ring with id 10004760, knowing node 16509405
-> [   0.000000] (9:node@c-8.me) Joining the ring with id 6518808, knowing node 42
 > [   4.000000] (3:node@c-2.me) My finger table:
-> [   4.000000] (3:node@c-2.me) Start | Succ 
-> [   4.000000] (3:node@c-2.me)  533745  | 366680 
-> [   4.000000] (3:node@c-2.me)  533746  | 533744 
-> [   4.000000] (3:node@c-2.me)  533748  | 533744 
-> [   4.000000] (3:node@c-2.me)  533752  | 533744 
-> [   4.000000] (3:node@c-2.me)  533760  | 533744 
-> [   4.000000] (3:node@c-2.me)  533776  | 533744 
-> [   4.000000] (3:node@c-2.me)  533808  | 533744 
-> [   4.000000] (3:node@c-2.me)  533872  | 533744 
-> [   4.000000] (3:node@c-2.me)  534000  | 533744 
-> [   4.000000] (3:node@c-2.me)  534256  | 533744 
-> [   4.000000] (3:node@c-2.me)  534768  | 533744 
-> [   4.000000] (3:node@c-2.me)  535792  | 533744 
-> [   4.000000] (3:node@c-2.me)  537840  | 533744 
-> [   4.000000] (3:node@c-2.me)  541936  | 533744 
-> [   4.000000] (3:node@c-2.me)  550128  | 533744 
-> [   4.000000] (3:node@c-2.me)  566512  | 533744 
-> [   4.000000] (3:node@c-2.me)  599280  | 533744 
-> [   4.000000] (3:node@c-2.me)  664816  | 533744 
-> [   4.000000] (3:node@c-2.me)  795888  | 533744 
-> [   4.000000] (3:node@c-2.me)  1058032  | 533744 
-> [   4.000000] (3:node@c-2.me)  1582320  | 533744 
-> [   4.000000] (3:node@c-2.me)  2630896  | 533744 
-> [   4.000000] (3:node@c-2.me)  4728048  | 533744 
-> [   4.000000] (3:node@c-2.me)  8922352  | 533744 
-> [   4.000000] (3:node@c-2.me) Predecessor: -1
 > [   4.000000] (6:node@c-5.me) My finger table:
+> [   4.000000] (3:node@c-2.me) Start | Succ 
 > [   4.000000] (6:node@c-5.me) Start | Succ 
+> [   4.000000] (3:node@c-2.me)  533745  | 366680 
 > [   4.000000] (6:node@c-5.me)  10874877  | 533744 
+> [   4.000000] (3:node@c-2.me)  533746  | 533744 
 > [   4.000000] (6:node@c-5.me)  10874878  | 10874876 
+> [   4.000000] (3:node@c-2.me)  533748  | 533744 
 > [   4.000000] (6:node@c-5.me)  10874880  | 10874876 
+> [   4.000000] (3:node@c-2.me)  533752  | 533744 
 > [   4.000000] (6:node@c-5.me)  10874884  | 10874876 
+> [   4.000000] (3:node@c-2.me)  533760  | 533744 
 > [   4.000000] (6:node@c-5.me)  10874892  | 10874876 
 > [   4.000000] (6:node@c-5.me)  10874908  | 10874876 
+> [   4.000000] (3:node@c-2.me)  533776  | 533744 
 > [   4.000000] (6:node@c-5.me)  10874940  | 10874876 
+> [   4.000000] (3:node@c-2.me)  533808  | 533744 
 > [   4.000000] (6:node@c-5.me)  10875004  | 10874876 
+> [   4.000000] (3:node@c-2.me)  533872  | 533744 
 > [   4.000000] (6:node@c-5.me)  10875132  | 10874876 
 > [   4.000000] (6:node@c-5.me)  10875388  | 10874876 
+> [   4.000000] (3:node@c-2.me)  534000  | 533744 
 > [   4.000000] (6:node@c-5.me)  10875900  | 10874876 
+> [   4.000000] (3:node@c-2.me)  534256  | 533744 
 > [   4.000000] (6:node@c-5.me)  10876924  | 10874876 
+> [   4.000000] (3:node@c-2.me)  534768  | 533744 
 > [   4.000000] (6:node@c-5.me)  10878972  | 10874876 
 > [   4.000000] (6:node@c-5.me)  10883068  | 10874876 
+> [   4.000000] (3:node@c-2.me)  535792  | 533744 
 > [   4.000000] (6:node@c-5.me)  10891260  | 10874876 
+> [   4.000000] (3:node@c-2.me)  537840  | 533744 
 > [   4.000000] (6:node@c-5.me)  10907644  | 10874876 
+> [   4.000000] (3:node@c-2.me)  541936  | 533744 
 > [   4.000000] (6:node@c-5.me)  10940412  | 10874876 
+> [   4.000000] (3:node@c-2.me)  550128  | 533744 
 > [   4.000000] (6:node@c-5.me)  11005948  | 10874876 
+> [   4.000000] (3:node@c-2.me)  566512  | 533744 
+> [   4.000000] (3:node@c-2.me)  599280  | 533744 
 > [   4.000000] (6:node@c-5.me)  11137020  | 10874876 
+> [   4.000000] (3:node@c-2.me)  664816  | 533744 
+> [   4.000000] (3:node@c-2.me)  795888  | 533744 
 > [   4.000000] (6:node@c-5.me)  11399164  | 10874876 
+> [   4.000000] (3:node@c-2.me)  1058032  | 533744 
 > [   4.000000] (6:node@c-5.me)  11923452  | 10874876 
+> [   4.000000] (3:node@c-2.me)  1582320  | 533744 
 > [   4.000000] (6:node@c-5.me)  12972028  | 10874876 
+> [   4.000000] (3:node@c-2.me)  2630896  | 533744 
 > [   4.000000] (6:node@c-5.me)  15069180  | 10874876 
 > [   4.000000] (6:node@c-5.me)  2486268  | 10874876 
+> [   4.000000] (3:node@c-2.me)  4728048  | 533744 
 > [   4.000000] (6:node@c-5.me) Predecessor: -1
+> [   4.000000] (3:node@c-2.me)  8922352  | 533744 
+> [   4.000000] (3:node@c-2.me) Predecessor: -1
 > [   5.000000] (5:node@c-4.me) My finger table:
 > [   5.000000] (5:node@c-4.me) Start | Succ 
-> [   5.000000] (5:node@c-4.me)  16509406  | 366680 
-> [   5.000000] (5:node@c-4.me)  16509407  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16509409  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16509413  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16509421  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16509437  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16509469  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16509533  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16509661  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16509917  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16510429  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16511453  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16513501  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16517597  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16525789  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16542173  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16574941  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16640477  | 16509405 
-> [   5.000000] (5:node@c-4.me)  16771549  | 16509405 
-> [   5.000000] (5:node@c-4.me)  256477  | 16509405 
-> [   5.000000] (5:node@c-4.me)  780765  | 16509405 
-> [   5.000000] (5:node@c-4.me)  1829341  | 16509405 
-> [   5.000000] (5:node@c-4.me)  3926493  | 16509405 
-> [   5.000000] (5:node@c-4.me)  8120797  | 16509405 
-> [   5.000000] (5:node@c-4.me) Predecessor: -1
 > [   5.000000] (8:node@c-7.me) My finger table:
+> [   5.000000] (5:node@c-4.me)  16509406  | 366680 
 > [   5.000000] (8:node@c-7.me) Start | Succ 
 > [   5.000000] (8:node@c-7.me)  10004761  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16509407  | 16509405 
 > [   5.000000] (8:node@c-7.me)  10004762  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16509409  | 16509405 
 > [   5.000000] (8:node@c-7.me)  10004764  | 10004760 
 > [   5.000000] (8:node@c-7.me)  10004768  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16509413  | 16509405 
 > [   5.000000] (8:node@c-7.me)  10004776  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16509421  | 16509405 
 > [   5.000000] (8:node@c-7.me)  10004792  | 10004760 
 > [   5.000000] (8:node@c-7.me)  10004824  | 10004760 
 > [   5.000000] (8:node@c-7.me)  10004888  | 10004760 
 > [   5.000000] (8:node@c-7.me)  10005016  | 10004760 
 > [   5.000000] (8:node@c-7.me)  10005272  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16509437  | 16509405 
 > [   5.000000] (8:node@c-7.me)  10005784  | 10004760 
 > [   5.000000] (8:node@c-7.me)  10006808  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16509469  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16509533  | 16509405 
 > [   5.000000] (8:node@c-7.me)  10008856  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16509661  | 16509405 
 > [   5.000000] (8:node@c-7.me)  10012952  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16509917  | 16509405 
 > [   5.000000] (8:node@c-7.me)  10021144  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16510429  | 16509405 
 > [   5.000000] (8:node@c-7.me)  10037528  | 10004760 
 > [   5.000000] (8:node@c-7.me)  10070296  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16511453  | 16509405 
 > [   5.000000] (8:node@c-7.me)  10135832  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16513501  | 16509405 
 > [   5.000000] (8:node@c-7.me)  10266904  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16517597  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16525789  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16542173  | 16509405 
 > [   5.000000] (8:node@c-7.me)  10529048  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16574941  | 16509405 
 > [   5.000000] (8:node@c-7.me)  11053336  | 10004760 
+> [   5.000000] (5:node@c-4.me)  16640477  | 16509405 
+> [   5.000000] (5:node@c-4.me)  16771549  | 16509405 
 > [   5.000000] (8:node@c-7.me)  12101912  | 10004760 
+> [   5.000000] (5:node@c-4.me)  256477  | 16509405 
 > [   5.000000] (8:node@c-7.me)  14199064  | 10004760 
+> [   5.000000] (5:node@c-4.me)  780765  | 16509405 
+> [   5.000000] (5:node@c-4.me)  1829341  | 16509405 
 > [   5.000000] (8:node@c-7.me)  1616152  | 10004760 
+> [   5.000000] (5:node@c-4.me)  3926493  | 16509405 
 > [   5.000000] (8:node@c-7.me) Predecessor: -1
+> [   5.000000] (5:node@c-4.me)  8120797  | 16509405 
+> [   5.000000] (5:node@c-4.me) Predecessor: -1
 > [   5.999900] (2:node@c-1.me) My finger table:
 > [   5.999900] (2:node@c-1.me) Start | Succ 
 > [   5.999900] (2:node@c-1.me)  366681  |  42 
@@ -650,60 +740,60 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.
 > [  15.999700] (9:node@c-8.me)  10713112  | 6518808 
 > [  15.999700] (9:node@c-8.me)  14907416  | 6518808 
 > [  15.999700] (9:node@c-8.me) Predecessor: -1
-> [  26.999600] (3:node@c-2.me) My finger table:
-> [  26.999600] (3:node@c-2.me) Start | Succ 
-> [  26.999600] (3:node@c-2.me)  533745  | 366680 
-> [  26.999600] (3:node@c-2.me)  533746  | 533744 
-> [  26.999600] (3:node@c-2.me)  533748  | 533744 
-> [  26.999600] (3:node@c-2.me)  533752  | 533744 
-> [  26.999600] (3:node@c-2.me)  533760  | 533744 
-> [  26.999600] (3:node@c-2.me)  533776  | 533744 
-> [  26.999600] (3:node@c-2.me)  533808  | 533744 
-> [  26.999600] (3:node@c-2.me)  533872  | 533744 
-> [  26.999600] (3:node@c-2.me)  534000  | 533744 
-> [  26.999600] (3:node@c-2.me)  534256  | 533744 
-> [  26.999600] (3:node@c-2.me)  534768  | 533744 
-> [  26.999600] (3:node@c-2.me)  535792  | 533744 
-> [  26.999600] (3:node@c-2.me)  537840  | 533744 
-> [  26.999600] (3:node@c-2.me)  541936  | 533744 
-> [  26.999600] (3:node@c-2.me)  550128  | 533744 
-> [  26.999600] (3:node@c-2.me)  566512  | 533744 
-> [  26.999600] (3:node@c-2.me)  599280  | 533744 
-> [  26.999600] (3:node@c-2.me)  664816  | 533744 
-> [  26.999600] (3:node@c-2.me)  795888  | 533744 
-> [  26.999600] (3:node@c-2.me)  1058032  | 533744 
-> [  26.999600] (3:node@c-2.me)  1582320  | 533744 
-> [  26.999600] (3:node@c-2.me)  2630896  | 533744 
-> [  26.999600] (3:node@c-2.me)  4728048  | 533744 
-> [  26.999600] (3:node@c-2.me)  8922352  | 533744 
-> [  26.999600] (3:node@c-2.me) Predecessor: 10874876
-> [  31.999400] (5:node@c-4.me) My finger table:
-> [  31.999400] (5:node@c-4.me) Start | Succ 
-> [  31.999400] (5:node@c-4.me)  16509406  | 366680 
-> [  31.999400] (5:node@c-4.me)  16509407  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509409  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509413  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509421  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509437  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509469  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509533  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509661  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509917  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16510429  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16511453  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16513501  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16517597  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16525789  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16542173  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16574941  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16640477  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16771549  | 16509405 
-> [  31.999400] (5:node@c-4.me)  256477  | 16509405 
-> [  31.999400] (5:node@c-4.me)  780765  | 16509405 
-> [  31.999400] (5:node@c-4.me)  1829341  | 16509405 
-> [  31.999400] (5:node@c-4.me)  3926493  | 16509405 
-> [  31.999400] (5:node@c-4.me)  8120797  | 16509405 
-> [  31.999400] (5:node@c-4.me) Predecessor: 10004760
+> [  24.999600] (3:node@c-2.me) My finger table:
+> [  24.999600] (4:node@c-3.me) My finger table:
+> [  24.999600] (3:node@c-2.me) Start | Succ 
+> [  24.999600] (4:node@c-3.me) Start | Succ 
+> [  24.999600] (3:node@c-2.me)  533745  | 366680 
+> [  24.999600] (4:node@c-3.me)  1319739  |  42 
+> [  24.999600] (3:node@c-2.me)  533746  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319740  | 1319738 
+> [  24.999600] (3:node@c-2.me)  533748  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319742  | 1319738 
+> [  24.999600] (3:node@c-2.me)  533752  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319746  | 1319738 
+> [  24.999600] (3:node@c-2.me)  533760  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319754  | 1319738 
+> [  24.999600] (3:node@c-2.me)  533776  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319770  | 1319738 
+> [  24.999600] (3:node@c-2.me)  533808  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319802  | 1319738 
+> [  24.999600] (3:node@c-2.me)  533872  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319866  | 1319738 
+> [  24.999600] (3:node@c-2.me)  534000  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319994  | 1319738 
+> [  24.999600] (3:node@c-2.me)  534256  | 533744 
+> [  24.999600] (4:node@c-3.me)  1320250  | 1319738 
+> [  24.999600] (3:node@c-2.me)  534768  | 533744 
+> [  24.999600] (4:node@c-3.me)  1320762  | 1319738 
+> [  24.999600] (3:node@c-2.me)  535792  | 533744 
+> [  24.999600] (4:node@c-3.me)  1321786  | 1319738 
+> [  24.999600] (3:node@c-2.me)  537840  | 533744 
+> [  24.999600] (4:node@c-3.me)  1323834  | 1319738 
+> [  24.999600] (3:node@c-2.me)  541936  | 533744 
+> [  24.999600] (4:node@c-3.me)  1327930  | 1319738 
+> [  24.999600] (3:node@c-2.me)  550128  | 533744 
+> [  24.999600] (4:node@c-3.me)  1336122  | 1319738 
+> [  24.999600] (3:node@c-2.me)  566512  | 533744 
+> [  24.999600] (4:node@c-3.me)  1352506  | 1319738 
+> [  24.999600] (3:node@c-2.me)  599280  | 533744 
+> [  24.999600] (4:node@c-3.me)  1385274  | 1319738 
+> [  24.999600] (3:node@c-2.me)  664816  | 533744 
+> [  24.999600] (4:node@c-3.me)  1450810  | 1319738 
+> [  24.999600] (3:node@c-2.me)  795888  | 533744 
+> [  24.999600] (4:node@c-3.me)  1581882  | 1319738 
+> [  24.999600] (3:node@c-2.me)  1058032  | 533744 
+> [  24.999600] (4:node@c-3.me)  1844026  | 1319738 
+> [  24.999600] (3:node@c-2.me)  1582320  | 533744 
+> [  24.999600] (4:node@c-3.me)  2368314  | 1319738 
+> [  24.999600] (3:node@c-2.me)  2630896  | 533744 
+> [  24.999600] (4:node@c-3.me)  3416890  | 1319738 
+> [  24.999600] (3:node@c-2.me)  4728048  | 533744 
+> [  24.999600] (4:node@c-3.me)  5514042  | 1319738 
+> [  24.999600] (3:node@c-2.me)  8922352  | 533744 
+> [  24.999600] (4:node@c-3.me)  9708346  | 1319738 
+> [  24.999600] (3:node@c-2.me) Predecessor: 10874876
+> [  24.999600] (4:node@c-3.me) Predecessor: 16728096
 > [  32.999400] (2:node@c-1.me) My finger table:
 > [  32.999400] (2:node@c-1.me) Start | Succ 
 > [  32.999400] (2:node@c-1.me)  366681  |  42 
@@ -731,60 +821,60 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.
 > [  32.999400] (2:node@c-1.me)  4560984  | 366680 
 > [  32.999400] (2:node@c-1.me)  8755288  | 366680 
 > [  32.999400] (2:node@c-1.me) Predecessor: 533744
-> [  33.999400] (2:node@c-1.me) My finger table:
-> [  33.999400] (2:node@c-1.me) Start | Succ 
-> [  33.999400] (2:node@c-1.me)  366681  |  42 
-> [  33.999400] (2:node@c-1.me)  366682  | 366680 
-> [  33.999400] (2:node@c-1.me)  366684  | 366680 
-> [  33.999400] (2:node@c-1.me)  366688  | 366680 
-> [  33.999400] (2:node@c-1.me)  366696  | 366680 
-> [  33.999400] (2:node@c-1.me)  366712  | 366680 
-> [  33.999400] (2:node@c-1.me)  366744  | 366680 
-> [  33.999400] (2:node@c-1.me)  366808  | 366680 
-> [  33.999400] (2:node@c-1.me)  366936  | 366680 
-> [  33.999400] (2:node@c-1.me)  367192  | 366680 
-> [  33.999400] (2:node@c-1.me)  367704  | 366680 
-> [  33.999400] (2:node@c-1.me)  368728  | 366680 
-> [  33.999400] (2:node@c-1.me)  370776  | 366680 
-> [  33.999400] (2:node@c-1.me)  374872  | 366680 
-> [  33.999400] (2:node@c-1.me)  383064  | 366680 
-> [  33.999400] (2:node@c-1.me)  399448  | 366680 
-> [  33.999400] (2:node@c-1.me)  432216  | 366680 
-> [  33.999400] (2:node@c-1.me)  497752  | 366680 
-> [  33.999400] (2:node@c-1.me)  628824  | 366680 
-> [  33.999400] (2:node@c-1.me)  890968  | 366680 
-> [  33.999400] (2:node@c-1.me)  1415256  | 366680 
-> [  33.999400] (2:node@c-1.me)  2463832  | 366680 
-> [  33.999400] (2:node@c-1.me)  4560984  | 366680 
-> [  33.999400] (2:node@c-1.me)  8755288  | 366680 
-> [  33.999400] (2:node@c-1.me) Predecessor: 16509405
-> [  35.999300] (4:node@c-3.me) My finger table:
-> [  35.999300] (4:node@c-3.me) Start | Succ 
-> [  35.999300] (4:node@c-3.me)  1319739  |  42 
-> [  35.999300] (4:node@c-3.me)  1319740  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319742  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319746  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319754  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319770  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319802  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319866  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319994  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1320250  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1320762  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1321786  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1323834  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1327930  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1336122  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1352506  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1385274  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1450810  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1581882  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1844026  | 1319738 
-> [  35.999300] (4:node@c-3.me)  2368314  | 1319738 
-> [  35.999300] (4:node@c-3.me)  3416890  | 1319738 
-> [  35.999300] (4:node@c-3.me)  5514042  | 1319738 
-> [  35.999300] (4:node@c-3.me)  9708346  | 1319738 
-> [  35.999300] (4:node@c-3.me) Predecessor: 16728096
+> [  34.999400] (2:node@c-1.me) My finger table:
+> [  34.999400] (2:node@c-1.me) Start | Succ 
+> [  34.999400] (2:node@c-1.me)  366681  |  42 
+> [  34.999400] (2:node@c-1.me)  366682  | 366680 
+> [  34.999400] (2:node@c-1.me)  366684  | 366680 
+> [  34.999400] (2:node@c-1.me)  366688  | 366680 
+> [  34.999400] (2:node@c-1.me)  366696  | 366680 
+> [  34.999400] (2:node@c-1.me)  366712  | 366680 
+> [  34.999400] (2:node@c-1.me)  366744  | 366680 
+> [  34.999400] (2:node@c-1.me)  366808  | 366680 
+> [  34.999400] (2:node@c-1.me)  366936  | 366680 
+> [  34.999400] (2:node@c-1.me)  367192  | 366680 
+> [  34.999400] (2:node@c-1.me)  367704  | 366680 
+> [  34.999400] (2:node@c-1.me)  368728  | 366680 
+> [  34.999400] (2:node@c-1.me)  370776  | 366680 
+> [  34.999400] (2:node@c-1.me)  374872  | 366680 
+> [  34.999400] (2:node@c-1.me)  383064  | 366680 
+> [  34.999400] (2:node@c-1.me)  399448  | 366680 
+> [  34.999400] (2:node@c-1.me)  432216  | 366680 
+> [  34.999400] (2:node@c-1.me)  497752  | 366680 
+> [  34.999400] (2:node@c-1.me)  628824  | 366680 
+> [  34.999400] (2:node@c-1.me)  890968  | 366680 
+> [  34.999400] (2:node@c-1.me)  1415256  | 366680 
+> [  34.999400] (2:node@c-1.me)  2463832  | 366680 
+> [  34.999400] (2:node@c-1.me)  4560984  | 366680 
+> [  34.999400] (2:node@c-1.me)  8755288  | 366680 
+> [  34.999400] (2:node@c-1.me) Predecessor: 16509405
+> [  35.999400] (5:node@c-4.me) My finger table:
+> [  35.999400] (5:node@c-4.me) Start | Succ 
+> [  35.999400] (5:node@c-4.me)  16509406  | 366680 
+> [  35.999400] (5:node@c-4.me)  16509407  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509409  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509413  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509421  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509437  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509469  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509533  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509661  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509917  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16510429  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16511453  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16513501  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16517597  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16525789  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16542173  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16574941  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16640477  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16771549  | 16509405 
+> [  35.999400] (5:node@c-4.me)  256477  | 16509405 
+> [  35.999400] (5:node@c-4.me)  780765  | 16509405 
+> [  35.999400] (5:node@c-4.me)  1829341  | 16509405 
+> [  35.999400] (5:node@c-4.me)  3926493  | 16509405 
+> [  35.999400] (5:node@c-4.me)  8120797  | 16509405 
+> [  35.999400] (5:node@c-4.me) Predecessor: 10004760
 > [  49.999000] (1:node@c-0.me) My finger table:
 > [  49.999000] (1:node@c-0.me) Start | Succ 
 > [  49.999000] (1:node@c-0.me)   43  |  42 
@@ -812,2030 +902,2003 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.
 > [  49.999000] (1:node@c-0.me)  4194346  |  42 
 > [  49.999000] (1:node@c-0.me)  8388650  |  42 
 > [  49.999000] (1:node@c-0.me) Predecessor: 366680
-> [  59.998800] (1:node@c-0.me) My finger table:
-> [  59.998800] (1:node@c-0.me) Start | Succ 
-> [  59.998800] (1:node@c-0.me)   43  | 366680 
-> [  59.998800] (1:node@c-0.me)   44  |  42 
-> [  59.998800] (1:node@c-0.me)   46  |  42 
-> [  59.998800] (1:node@c-0.me)   50  |  42 
-> [  59.998800] (1:node@c-0.me)   58  |  42 
-> [  59.998800] (1:node@c-0.me)   74  |  42 
-> [  59.998800] (1:node@c-0.me)  106  |  42 
-> [  59.998800] (1:node@c-0.me)  170  |  42 
-> [  59.998800] (1:node@c-0.me)  298  |  42 
-> [  59.998800] (1:node@c-0.me)  554  |  42 
-> [  59.998800] (1:node@c-0.me)  1066  |  42 
-> [  59.998800] (1:node@c-0.me)  2090  |  42 
-> [  59.998800] (1:node@c-0.me)  4138  |  42 
-> [  59.998800] (1:node@c-0.me)  8234  |  42 
-> [  59.998800] (1:node@c-0.me)  16426  |  42 
-> [  59.998800] (1:node@c-0.me)  32810  |  42 
-> [  59.998800] (1:node@c-0.me)  65578  |  42 
-> [  59.998800] (1:node@c-0.me)  131114  |  42 
-> [  59.998800] (1:node@c-0.me)  262186  |  42 
-> [  59.998800] (1:node@c-0.me)  524330  |  42 
-> [  59.998800] (1:node@c-0.me)  1048618  |  42 
-> [  59.998800] (1:node@c-0.me)  2097194  |  42 
-> [  59.998800] (1:node@c-0.me)  4194346  |  42 
-> [  59.998800] (1:node@c-0.me)  8388650  |  42 
-> [  59.998800] (1:node@c-0.me) Predecessor: 1319738
-> [  69.998600] (1:node@c-0.me) My finger table:
-> [  69.998600] (1:node@c-0.me) Start | Succ 
-> [  69.998600] (1:node@c-0.me)   43  | 366680 
-> [  69.998600] (1:node@c-0.me)   44  |  42 
-> [  69.998600] (1:node@c-0.me)   46  |  42 
-> [  69.998600] (1:node@c-0.me)   50  |  42 
-> [  69.998600] (1:node@c-0.me)   58  |  42 
-> [  69.998600] (1:node@c-0.me)   74  |  42 
-> [  69.998600] (1:node@c-0.me)  106  |  42 
-> [  69.998600] (1:node@c-0.me)  170  |  42 
-> [  69.998600] (1:node@c-0.me)  298  |  42 
-> [  69.998600] (1:node@c-0.me)  554  |  42 
-> [  69.998600] (1:node@c-0.me)  1066  |  42 
-> [  69.998600] (1:node@c-0.me)  2090  |  42 
-> [  69.998600] (1:node@c-0.me)  4138  |  42 
-> [  69.998600] (1:node@c-0.me)  8234  |  42 
-> [  69.998600] (1:node@c-0.me)  16426  |  42 
-> [  69.998600] (1:node@c-0.me)  32810  |  42 
-> [  69.998600] (1:node@c-0.me)  65578  |  42 
-> [  69.998600] (1:node@c-0.me)  131114  |  42 
-> [  69.998600] (1:node@c-0.me)  262186  |  42 
-> [  69.998600] (1:node@c-0.me)  524330  |  42 
-> [  69.998600] (1:node@c-0.me)  1048618  |  42 
-> [  69.998600] (1:node@c-0.me)  2097194  |  42 
-> [  69.998600] (1:node@c-0.me)  4194346  |  42 
-> [  69.998600] (1:node@c-0.me)  8388650  |  42 
-> [  69.998600] (1:node@c-0.me) Predecessor: 6518808
-> [  81.998500] (2:node@c-1.me) My finger table:
-> [  81.998500] (2:node@c-1.me) Start | Succ 
-> [  81.998500] (2:node@c-1.me)  366681  | 6518808 
-> [  81.998500] (2:node@c-1.me)  366682  | 366680 
-> [  81.998500] (2:node@c-1.me)  366684  | 366680 
-> [  81.998500] (2:node@c-1.me)  366688  | 366680 
-> [  81.998500] (2:node@c-1.me)  366696  | 366680 
-> [  81.998500] (2:node@c-1.me)  366712  | 366680 
-> [  81.998500] (2:node@c-1.me)  366744  | 366680 
-> [  81.998500] (2:node@c-1.me)  366808  | 366680 
-> [  81.998500] (2:node@c-1.me)  366936  | 366680 
-> [  81.998500] (2:node@c-1.me)  367192  | 366680 
-> [  81.998500] (2:node@c-1.me)  367704  | 366680 
-> [  81.998500] (2:node@c-1.me)  368728  | 366680 
-> [  81.998500] (2:node@c-1.me)  370776  | 366680 
-> [  81.998500] (2:node@c-1.me)  374872  | 366680 
-> [  81.998500] (2:node@c-1.me)  383064  | 366680 
-> [  81.998500] (2:node@c-1.me)  399448  | 366680 
-> [  81.998500] (2:node@c-1.me)  432216  | 366680 
-> [  81.998500] (2:node@c-1.me)  497752  | 366680 
-> [  81.998500] (2:node@c-1.me)  628824  | 366680 
-> [  81.998500] (2:node@c-1.me)  890968  | 366680 
-> [  81.998500] (2:node@c-1.me)  1415256  | 366680 
-> [  81.998500] (2:node@c-1.me)  2463832  | 366680 
-> [  81.998500] (2:node@c-1.me)  4560984  | 366680 
-> [  81.998500] (2:node@c-1.me)  8755288  | 366680 
-> [  81.998500] (2:node@c-1.me) Predecessor: 42
-> [  98.998100] (7:node@c-6.me) My finger table:
-> [  98.998100] (7:node@c-6.me) Start | Succ 
-> [  98.998100] (7:node@c-6.me)  16728097  | 1319738 
-> [  98.998100] (7:node@c-6.me)  16728098  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728100  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728104  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728112  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728128  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728160  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728224  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728352  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728608  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16729120  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16730144  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16732192  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16736288  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16744480  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16760864  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16416  | 16728096 
-> [  98.998100] (7:node@c-6.me)  81952  | 16728096 
-> [  98.998100] (7:node@c-6.me)  213024  | 16728096 
-> [  98.998100] (7:node@c-6.me)  475168  | 16728096 
-> [  98.998100] (7:node@c-6.me)  999456  | 16728096 
-> [  98.998100] (7:node@c-6.me)  2048032  | 16728096 
-> [  98.998100] (7:node@c-6.me)  4145184  | 16728096 
-> [  98.998100] (7:node@c-6.me)  8339488  | 16728096 
-> [  98.998100] (7:node@c-6.me) Predecessor: 2015253
-> [ 110.998000] (9:node@c-8.me) My finger table:
-> [ 110.998000] (9:node@c-8.me) Start | Succ 
-> [ 110.998000] (9:node@c-8.me)  6518809  |  42 
-> [ 110.998000] (9:node@c-8.me)  6518810  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6518812  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6518816  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6518824  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6518840  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6518872  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6518936  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6519064  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6519320  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6519832  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6520856  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6522904  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6527000  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6535192  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6551576  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6584344  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6649880  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6780952  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  7043096  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  7567384  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  8615960  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  10713112  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  14907416  | 6518808 
-> [ 110.998000] (9:node@c-8.me) Predecessor: 366680
-> [ 111.998000] (9:node@c-8.me) My finger table:
-> [ 111.998000] (9:node@c-8.me) Start | Succ 
-> [ 111.998000] (9:node@c-8.me)  6518809  |  42 
-> [ 111.998000] (9:node@c-8.me)  6518810  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6518812  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6518816  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6518824  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6518840  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6518872  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6518936  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6519064  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6519320  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6519832  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6520856  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6522904  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6527000  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6535192  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6551576  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6584344  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6649880  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6780952  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  7043096  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  7567384  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  8615960  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  10713112  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  14907416  | 6518808 
-> [ 111.998000] (9:node@c-8.me) Predecessor: 1319738
-> [ 127.997700] (8:node@c-7.me) My finger table:
-> [ 127.997700] (8:node@c-7.me) Start | Succ 
-> [ 127.997700] (8:node@c-7.me)  10004761  | 16509405 
-> [ 127.997700] (8:node@c-7.me)  10004762  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10004764  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10004768  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10004776  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10004792  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10004824  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10004888  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10005016  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10005272  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10005784  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10006808  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10008856  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10012952  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10021144  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10037528  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10070296  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10135832  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10266904  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10529048  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  11053336  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  12101912  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  14199064  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  1616152  | 10004760 
-> [ 127.997700] (8:node@c-7.me) Predecessor: 533744
-> [ 137.997600] (1:node@c-0.me) My finger table:
-> [ 137.997600] (1:node@c-0.me) Start | Succ 
-> [ 137.997600] (1:node@c-0.me)   43  | 366680 
-> [ 137.997600] (1:node@c-0.me)   44  |  42 
-> [ 137.997600] (1:node@c-0.me)   46  |  42 
-> [ 137.997600] (1:node@c-0.me)   50  |  42 
-> [ 137.997600] (1:node@c-0.me)   58  |  42 
-> [ 137.997600] (1:node@c-0.me)   74  |  42 
-> [ 137.997600] (1:node@c-0.me)  106  |  42 
-> [ 137.997600] (1:node@c-0.me)  170  |  42 
-> [ 137.997600] (1:node@c-0.me)  298  |  42 
-> [ 137.997600] (1:node@c-0.me)  554  |  42 
-> [ 137.997600] (1:node@c-0.me)  1066  |  42 
-> [ 137.997600] (1:node@c-0.me)  2090  |  42 
-> [ 137.997600] (1:node@c-0.me)  4138  |  42 
-> [ 137.997600] (1:node@c-0.me)  8234  |  42 
-> [ 137.997600] (1:node@c-0.me)  16426  |  42 
-> [ 137.997600] (1:node@c-0.me)  32810  |  42 
-> [ 137.997600] (1:node@c-0.me)  65578  |  42 
-> [ 137.997600] (1:node@c-0.me)  131114  |  42 
-> [ 137.997600] (1:node@c-0.me)  262186  |  42 
-> [ 137.997600] (1:node@c-0.me)  524330  |  42 
-> [ 137.997600] (1:node@c-0.me)  1048618  |  42 
-> [ 137.997600] (1:node@c-0.me)  2097194  |  42 
-> [ 137.997600] (1:node@c-0.me)  4194346  |  42 
-> [ 137.997600] (1:node@c-0.me)  8388650  |  42 
-> [ 137.997600] (1:node@c-0.me) Predecessor: 16509405
-> [ 165.997100] (4:node@c-3.me) My finger table:
-> [ 165.997100] (4:node@c-3.me) Start | Succ 
-> [ 165.997100] (4:node@c-3.me)  1319739  | 6518808 
-> [ 165.997100] (4:node@c-3.me)  1319740  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319742  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319746  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319754  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319770  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319802  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319866  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319994  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1320250  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1320762  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1321786  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1323834  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1327930  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1336122  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1352506  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1385274  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1450810  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1581882  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1844026  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  2368314  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  3416890  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  5514042  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  9708346  | 1319738 
-> [ 165.997100] (4:node@c-3.me) Predecessor: 366680
-> [ 209.996500] (8:node@c-7.me) My finger table:
-> [ 209.996500] (8:node@c-7.me) Start | Succ 
-> [ 209.996500] (8:node@c-7.me)  10004761  | 16509405 
-> [ 209.996500] (8:node@c-7.me)  10004762  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10004764  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10004768  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10004776  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10004792  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10004824  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10004888  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10005016  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10005272  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10005784  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10006808  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10008856  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10012952  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10021144  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10037528  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10070296  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10135832  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10266904  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10529048  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  11053336  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  12101912  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  14199064  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  1616152  | 10004760 
-> [ 209.996500] (8:node@c-7.me) Predecessor: 6518808
-> [ 247.995800] (6:node@c-5.me) My finger table:
-> [ 247.995800] (6:node@c-5.me) Start | Succ 
-> [ 247.995800] (6:node@c-5.me)  10874877  | 533744 
-> [ 247.995800] (6:node@c-5.me)  10874878  | 533744 
-> [ 247.995800] (6:node@c-5.me)  10874880  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10874884  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10874892  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10874908  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10874940  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10875004  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10875132  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10875388  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10875900  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10876924  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10878972  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10883068  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10891260  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10907644  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10940412  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  11005948  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  11137020  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  11399164  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  11923452  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  12972028  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  15069180  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  2486268  | 10874876 
-> [ 247.995800] (6:node@c-5.me) Predecessor: -1
-> [ 249.995700] (7:node@c-6.me) My finger table:
-> [ 249.995700] (7:node@c-6.me) Start | Succ 
-> [ 249.995700] (7:node@c-6.me)  16728097  |  42 
-> [ 249.995700] (7:node@c-6.me)  16728098  |  42 
-> [ 249.995700] (7:node@c-6.me)  16728100  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728104  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728112  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728128  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728160  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728224  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728352  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728608  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16729120  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16730144  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16732192  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16736288  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16744480  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16760864  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16416  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  81952  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  213024  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  475168  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  999456  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  2048032  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  4145184  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  8339488  | 16728096 
-> [ 249.995700] (7:node@c-6.me) Predecessor: 2015253
-> [ 251.995700] (8:node@c-7.me) My finger table:
-> [ 251.995700] (8:node@c-7.me) Start | Succ 
-> [ 251.995700] (8:node@c-7.me)  10004761  | 16509405 
-> [ 251.995700] (8:node@c-7.me)  10004762  | 16509405 
-> [ 251.995700] (8:node@c-7.me)  10004764  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10004768  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10004776  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10004792  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10004824  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10004888  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10005016  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10005272  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10005784  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10006808  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10008856  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10012952  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10021144  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10037528  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10070296  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10135832  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10266904  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10529048  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  11053336  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  12101912  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  14199064  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  1616152  | 10004760 
-> [ 251.995700] (8:node@c-7.me) Predecessor: 6518808
-> [ 252.995700] (2:node@c-1.me) My finger table:
-> [ 252.995700] (2:node@c-1.me) Start | Succ 
-> [ 252.995700] (2:node@c-1.me)  366681  | 1319738 
-> [ 252.995700] (2:node@c-1.me)  366682  | 1319738 
-> [ 252.995700] (2:node@c-1.me)  366684  | 366680 
-> [ 252.995700] (2:node@c-1.me)  366688  | 366680 
-> [ 252.995700] (2:node@c-1.me)  366696  | 366680 
-> [ 252.995700] (2:node@c-1.me)  366712  | 366680 
-> [ 252.995700] (2:node@c-1.me)  366744  | 366680 
-> [ 252.995700] (2:node@c-1.me)  366808  | 366680 
-> [ 252.995700] (2:node@c-1.me)  366936  | 366680 
-> [ 252.995700] (2:node@c-1.me)  367192  | 366680 
-> [ 252.995700] (2:node@c-1.me)  367704  | 366680 
-> [ 252.995700] (2:node@c-1.me)  368728  | 366680 
-> [ 252.995700] (2:node@c-1.me)  370776  | 366680 
-> [ 252.995700] (2:node@c-1.me)  374872  | 366680 
-> [ 252.995700] (2:node@c-1.me)  383064  | 366680 
-> [ 252.995700] (2:node@c-1.me)  399448  | 366680 
-> [ 252.995700] (2:node@c-1.me)  432216  | 366680 
-> [ 252.995700] (2:node@c-1.me)  497752  | 366680 
-> [ 252.995700] (2:node@c-1.me)  628824  | 366680 
-> [ 252.995700] (2:node@c-1.me)  890968  | 366680 
-> [ 252.995700] (2:node@c-1.me)  1415256  | 366680 
-> [ 252.995700] (2:node@c-1.me)  2463832  | 366680 
-> [ 252.995700] (2:node@c-1.me)  4560984  | 366680 
-> [ 252.995700] (2:node@c-1.me)  8755288  | 366680 
-> [ 252.995700] (2:node@c-1.me) Predecessor: 42
-> [ 254.995700] (1:node@c-0.me) My finger table:
-> [ 254.995700] (1:node@c-0.me) Start | Succ 
-> [ 254.995700] (1:node@c-0.me)   43  | 366680 
-> [ 254.995700] (1:node@c-0.me)   44  |  42 
-> [ 254.995700] (1:node@c-0.me)   46  |  42 
-> [ 254.995700] (1:node@c-0.me)   50  |  42 
-> [ 254.995700] (1:node@c-0.me)   58  |  42 
-> [ 254.995700] (1:node@c-0.me)   74  |  42 
-> [ 254.995700] (1:node@c-0.me)  106  |  42 
-> [ 254.995700] (1:node@c-0.me)  170  |  42 
-> [ 254.995700] (1:node@c-0.me)  298  |  42 
-> [ 254.995700] (1:node@c-0.me)  554  |  42 
-> [ 254.995700] (1:node@c-0.me)  1066  |  42 
-> [ 254.995700] (1:node@c-0.me)  2090  |  42 
-> [ 254.995700] (1:node@c-0.me)  4138  |  42 
-> [ 254.995700] (1:node@c-0.me)  8234  |  42 
-> [ 254.995700] (1:node@c-0.me)  16426  |  42 
-> [ 254.995700] (1:node@c-0.me)  32810  |  42 
-> [ 254.995700] (1:node@c-0.me)  65578  |  42 
-> [ 254.995700] (1:node@c-0.me)  131114  |  42 
-> [ 254.995700] (1:node@c-0.me)  262186  |  42 
-> [ 254.995700] (1:node@c-0.me)  524330  |  42 
-> [ 254.995700] (1:node@c-0.me)  1048618  |  42 
-> [ 254.995700] (1:node@c-0.me)  2097194  |  42 
-> [ 254.995700] (1:node@c-0.me)  4194346  |  42 
-> [ 254.995700] (1:node@c-0.me)  8388650  |  42 
-> [ 254.995700] (1:node@c-0.me) Predecessor: 16728096
-> [ 254.995700] (4:node@c-3.me) My finger table:
-> [ 254.995700] (4:node@c-3.me) Start | Succ 
-> [ 254.995700] (4:node@c-3.me)  1319739  | 6518808 
-> [ 254.995700] (4:node@c-3.me)  1319740  | 6518808 
-> [ 254.995700] (4:node@c-3.me)  1319742  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1319746  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1319754  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1319770  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1319802  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1319866  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1319994  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1320250  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1320762  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1321786  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1323834  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1327930  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1336122  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1352506  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1385274  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1450810  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1581882  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1844026  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  2368314  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  3416890  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  5514042  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  9708346  | 1319738 
-> [ 254.995700] (4:node@c-3.me) Predecessor: 366680
-> [ 255.995700] (1:node@c-0.me) My finger table:
-> [ 255.995700] (1:node@c-0.me) Start | Succ 
-> [ 255.995700] (1:node@c-0.me)   43  | 366680 
-> [ 255.995700] (1:node@c-0.me)   44  | 366680 
-> [ 255.995700] (1:node@c-0.me)   46  |  42 
-> [ 255.995700] (1:node@c-0.me)   50  |  42 
-> [ 255.995700] (1:node@c-0.me)   58  |  42 
-> [ 255.995700] (1:node@c-0.me)   74  |  42 
-> [ 255.995700] (1:node@c-0.me)  106  |  42 
-> [ 255.995700] (1:node@c-0.me)  170  |  42 
-> [ 255.995700] (1:node@c-0.me)  298  |  42 
-> [ 255.995700] (1:node@c-0.me)  554  |  42 
-> [ 255.995700] (1:node@c-0.me)  1066  |  42 
-> [ 255.995700] (1:node@c-0.me)  2090  |  42 
-> [ 255.995700] (1:node@c-0.me)  4138  |  42 
-> [ 255.995700] (1:node@c-0.me)  8234  |  42 
-> [ 255.995700] (1:node@c-0.me)  16426  |  42 
-> [ 255.995700] (1:node@c-0.me)  32810  |  42 
-> [ 255.995700] (1:node@c-0.me)  65578  |  42 
-> [ 255.995700] (1:node@c-0.me)  131114  |  42 
-> [ 255.995700] (1:node@c-0.me)  262186  |  42 
-> [ 255.995700] (1:node@c-0.me)  524330  |  42 
-> [ 255.995700] (1:node@c-0.me)  1048618  |  42 
-> [ 255.995700] (1:node@c-0.me)  2097194  |  42 
-> [ 255.995700] (1:node@c-0.me)  4194346  |  42 
-> [ 255.995700] (1:node@c-0.me)  8388650  |  42 
-> [ 255.995700] (1:node@c-0.me) Predecessor: 16728096
-> [ 255.995700] (5:node@c-4.me) My finger table:
-> [ 255.995700] (5:node@c-4.me) Start | Succ 
-> [ 255.995700] (5:node@c-4.me)  16509406  |  42 
-> [ 255.995700] (5:node@c-4.me)  16509407  |  42 
-> [ 255.995700] (5:node@c-4.me)  16509409  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509413  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509421  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509437  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509469  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509533  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509661  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509917  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16510429  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16511453  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16513501  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16517597  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16525789  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16542173  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16574941  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16640477  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16771549  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  256477  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  780765  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  1829341  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  3926493  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  8120797  | 16509405 
-> [ 255.995700] (5:node@c-4.me) Predecessor: 10004760
-> [ 257.995700] (10:node@c-9.me) My finger table:
-> [ 257.995700] (10:node@c-9.me) Start | Succ 
-> [ 257.995700] (10:node@c-9.me)  2015254  | 16728096 
-> [ 257.995700] (10:node@c-9.me)  2015255  | 16728096 
-> [ 257.995700] (10:node@c-9.me)  2015257  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015261  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015269  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015285  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015317  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015381  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015509  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015765  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2016277  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2017301  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2019349  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2023445  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2031637  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2048021  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2080789  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2146325  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2277397  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2539541  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  3063829  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  4112405  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  6209557  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  10403861  | 2015253 
-> [ 257.995700] (10:node@c-9.me) Predecessor: -1
-> [ 263.995700] (3:node@c-2.me) My finger table:
-> [ 263.995700] (3:node@c-2.me) Start | Succ 
-> [ 263.995700] (3:node@c-2.me)  533745  | 1319738 
-> [ 263.995700] (3:node@c-2.me)  533746  | 1319738 
-> [ 263.995700] (3:node@c-2.me)  533748  | 533744 
-> [ 263.995700] (3:node@c-2.me)  533752  | 533744 
-> [ 263.995700] (3:node@c-2.me)  533760  | 533744 
-> [ 263.995700] (3:node@c-2.me)  533776  | 533744 
-> [ 263.995700] (3:node@c-2.me)  533808  | 533744 
-> [ 263.995700] (3:node@c-2.me)  533872  | 533744 
-> [ 263.995700] (3:node@c-2.me)  534000  | 533744 
-> [ 263.995700] (3:node@c-2.me)  534256  | 533744 
-> [ 263.995700] (3:node@c-2.me)  534768  | 533744 
-> [ 263.995700] (3:node@c-2.me)  535792  | 533744 
-> [ 263.995700] (3:node@c-2.me)  537840  | 533744 
-> [ 263.995700] (3:node@c-2.me)  541936  | 533744 
-> [ 263.995700] (3:node@c-2.me)  550128  | 533744 
-> [ 263.995700] (3:node@c-2.me)  566512  | 533744 
-> [ 263.995700] (3:node@c-2.me)  599280  | 533744 
-> [ 263.995700] (3:node@c-2.me)  664816  | 533744 
-> [ 263.995700] (3:node@c-2.me)  795888  | 533744 
-> [ 263.995700] (3:node@c-2.me)  1058032  | 533744 
-> [ 263.995700] (3:node@c-2.me)  1582320  | 533744 
-> [ 263.995700] (3:node@c-2.me)  2630896  | 533744 
-> [ 263.995700] (3:node@c-2.me)  4728048  | 533744 
-> [ 263.995700] (3:node@c-2.me)  8922352  | 533744 
-> [ 263.995700] (3:node@c-2.me) Predecessor: 10874876
-> [ 264.995500] (9:node@c-8.me) My finger table:
-> [ 264.995500] (9:node@c-8.me) Start | Succ 
-> [ 264.995500] (9:node@c-8.me)  6518809  | 10004760 
-> [ 264.995500] (9:node@c-8.me)  6518810  | 10004760 
-> [ 264.995500] (9:node@c-8.me)  6518812  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6518816  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6518824  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6518840  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6518872  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6518936  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6519064  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6519320  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6519832  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6520856  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6522904  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6527000  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6535192  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6551576  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6584344  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6649880  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6780952  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  7043096  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  7567384  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  8615960  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  10713112  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  14907416  | 6518808 
-> [ 264.995500] (9:node@c-8.me) Predecessor: 1319738
-> [ 310.994900] (4:node@c-3.me) My finger table:
-> [ 310.994900] (4:node@c-3.me) Start | Succ 
-> [ 310.994900] (4:node@c-3.me)  1319739  | 6518808 
-> [ 310.994900] (4:node@c-3.me)  1319740  | 6518808 
-> [ 310.994900] (4:node@c-3.me)  1319742  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1319746  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1319754  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1319770  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1319802  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1319866  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1319994  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1320250  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1320762  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1321786  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1323834  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1327930  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1336122  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1352506  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1385274  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1450810  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1581882  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1844026  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  2368314  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  3416890  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  5514042  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  9708346  | 1319738 
-> [ 310.994900] (4:node@c-3.me) Predecessor: 533744
-> [ 335.994500] (7:node@c-6.me) My finger table:
-> [ 335.994500] (7:node@c-6.me) Start | Succ 
-> [ 335.994500] (7:node@c-6.me)  16728097  |  42 
-> [ 335.994500] (7:node@c-6.me)  16728098  |  42 
-> [ 335.994500] (7:node@c-6.me)  16728100  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728104  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728112  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728128  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728160  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728224  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728352  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728608  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16729120  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16730144  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16732192  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16736288  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16744480  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16760864  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16416  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  81952  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  213024  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  475168  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  999456  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  2048032  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  4145184  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  8339488  | 16728096 
-> [ 335.994500] (7:node@c-6.me) Predecessor: 16509405
-> [ 366.994000] (3:node@c-2.me) My finger table:
-> [ 366.994000] (3:node@c-2.me) Start | Succ 
-> [ 366.994000] (3:node@c-2.me)  533745  | 1319738 
-> [ 366.994000] (3:node@c-2.me)  533746  | 1319738 
-> [ 366.994000] (3:node@c-2.me)  533748  | 533744 
-> [ 366.994000] (3:node@c-2.me)  533752  | 533744 
-> [ 366.994000] (3:node@c-2.me)  533760  | 533744 
-> [ 366.994000] (3:node@c-2.me)  533776  | 533744 
-> [ 366.994000] (3:node@c-2.me)  533808  | 533744 
-> [ 366.994000] (3:node@c-2.me)  533872  | 533744 
-> [ 366.994000] (3:node@c-2.me)  534000  | 533744 
-> [ 366.994000] (3:node@c-2.me)  534256  | 533744 
-> [ 366.994000] (3:node@c-2.me)  534768  | 533744 
-> [ 366.994000] (3:node@c-2.me)  535792  | 533744 
-> [ 366.994000] (3:node@c-2.me)  537840  | 533744 
-> [ 366.994000] (3:node@c-2.me)  541936  | 533744 
-> [ 366.994000] (3:node@c-2.me)  550128  | 533744 
-> [ 366.994000] (3:node@c-2.me)  566512  | 533744 
-> [ 366.994000] (3:node@c-2.me)  599280  | 533744 
-> [ 366.994000] (3:node@c-2.me)  664816  | 533744 
-> [ 366.994000] (3:node@c-2.me)  795888  | 533744 
-> [ 366.994000] (3:node@c-2.me)  1058032  | 533744 
-> [ 366.994000] (3:node@c-2.me)  1582320  | 533744 
-> [ 366.994000] (3:node@c-2.me)  2630896  | 533744 
-> [ 366.994000] (3:node@c-2.me)  4728048  | 533744 
-> [ 366.994000] (3:node@c-2.me)  8922352  | 533744 
-> [ 366.994000] (3:node@c-2.me) Predecessor: 366680
-> [ 370.993500] (6:node@c-5.me) My finger table:
-> [ 370.993500] (6:node@c-5.me) Start | Succ 
-> [ 370.993500] (6:node@c-5.me)  10874877  | 533744 
-> [ 370.993500] (6:node@c-5.me)  10874878  | 533744 
-> [ 370.993500] (6:node@c-5.me)  10874880  | 533744 
-> [ 370.993500] (6:node@c-5.me)  10874884  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10874892  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10874908  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10874940  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10875004  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10875132  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10875388  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10875900  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10876924  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10878972  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10883068  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10891260  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10907644  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10940412  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  11005948  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  11137020  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  11399164  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  11923452  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  12972028  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  15069180  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  2486268  | 10874876 
-> [ 370.993500] (6:node@c-5.me) Predecessor: -1
-> [ 375.993800] (2:node@c-1.me) My finger table:
-> [ 375.993800] (2:node@c-1.me) Start | Succ 
-> [ 375.993800] (2:node@c-1.me)  366681  | 533744 
-> [ 375.993800] (2:node@c-1.me)  366682  | 1319738 
-> [ 375.993800] (2:node@c-1.me)  366684  | 533744 
-> [ 375.993800] (2:node@c-1.me)  366688  | 366680 
-> [ 375.993800] (2:node@c-1.me)  366696  | 366680 
-> [ 375.993800] (2:node@c-1.me)  366712  | 366680 
-> [ 375.993800] (2:node@c-1.me)  366744  | 366680 
-> [ 375.993800] (2:node@c-1.me)  366808  | 366680 
-> [ 375.993800] (2:node@c-1.me)  366936  | 366680 
-> [ 375.993800] (2:node@c-1.me)  367192  | 366680 
-> [ 375.993800] (2:node@c-1.me)  367704  | 366680 
-> [ 375.993800] (2:node@c-1.me)  368728  | 366680 
-> [ 375.993800] (2:node@c-1.me)  370776  | 366680 
-> [ 375.993800] (2:node@c-1.me)  374872  | 366680 
-> [ 375.993800] (2:node@c-1.me)  383064  | 366680 
-> [ 375.993800] (2:node@c-1.me)  399448  | 366680 
-> [ 375.993800] (2:node@c-1.me)  432216  | 366680 
-> [ 375.993800] (2:node@c-1.me)  497752  | 366680 
-> [ 375.993800] (2:node@c-1.me)  628824  | 366680 
-> [ 375.993800] (2:node@c-1.me)  890968  | 366680 
-> [ 375.993800] (2:node@c-1.me)  1415256  | 366680 
-> [ 375.993800] (2:node@c-1.me)  2463832  | 366680 
-> [ 375.993800] (2:node@c-1.me)  4560984  | 366680 
-> [ 375.993800] (2:node@c-1.me)  8755288  | 366680 
-> [ 375.993800] (2:node@c-1.me) Predecessor: 42
-> [ 376.993800] (1:node@c-0.me) My finger table:
-> [ 376.993800] (1:node@c-0.me) Start | Succ 
-> [ 376.993800] (1:node@c-0.me)   43  | 366680 
-> [ 376.993800] (1:node@c-0.me)   44  | 366680 
-> [ 376.993800] (1:node@c-0.me)   46  | 366680 
-> [ 376.993800] (1:node@c-0.me)   50  |  42 
-> [ 376.993800] (1:node@c-0.me)   58  |  42 
-> [ 376.993800] (1:node@c-0.me)   74  |  42 
-> [ 376.993800] (1:node@c-0.me)  106  |  42 
-> [ 376.993800] (1:node@c-0.me)  170  |  42 
-> [ 376.993800] (1:node@c-0.me)  298  |  42 
-> [ 376.993800] (1:node@c-0.me)  554  |  42 
-> [ 376.993800] (1:node@c-0.me)  1066  |  42 
-> [ 376.993800] (1:node@c-0.me)  2090  |  42 
-> [ 376.993800] (1:node@c-0.me)  4138  |  42 
-> [ 376.993800] (1:node@c-0.me)  8234  |  42 
-> [ 376.993800] (1:node@c-0.me)  16426  |  42 
-> [ 376.993800] (1:node@c-0.me)  32810  |  42 
-> [ 376.993800] (1:node@c-0.me)  65578  |  42 
-> [ 376.993800] (1:node@c-0.me)  131114  |  42 
-> [ 376.993800] (1:node@c-0.me)  262186  |  42 
-> [ 376.993800] (1:node@c-0.me)  524330  |  42 
-> [ 376.993800] (1:node@c-0.me)  1048618  |  42 
-> [ 376.993800] (1:node@c-0.me)  2097194  |  42 
-> [ 376.993800] (1:node@c-0.me)  4194346  |  42 
-> [ 376.993800] (1:node@c-0.me)  8388650  |  42 
-> [ 376.993800] (1:node@c-0.me) Predecessor: 16728096
-> [ 376.993800] (4:node@c-3.me) My finger table:
-> [ 376.993800] (4:node@c-3.me) Start | Succ 
-> [ 376.993800] (4:node@c-3.me)  1319739  | 6518808 
-> [ 376.993800] (4:node@c-3.me)  1319740  | 6518808 
-> [ 376.993800] (4:node@c-3.me)  1319742  | 6518808 
-> [ 376.993800] (4:node@c-3.me)  1319746  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1319754  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1319770  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1319802  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1319866  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1319994  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1320250  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1320762  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1321786  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1323834  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1327930  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1336122  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1352506  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1385274  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1450810  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1581882  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1844026  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  2368314  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  3416890  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  5514042  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  9708346  | 1319738 
-> [ 376.993800] (4:node@c-3.me) Predecessor: 533744
-> [ 378.993800] (10:node@c-9.me) My finger table:
-> [ 378.993800] (10:node@c-9.me) Start | Succ 
-> [ 378.993800] (10:node@c-9.me)  2015254  | 10004760 
-> [ 378.993800] (10:node@c-9.me)  2015255  | 16728096 
-> [ 378.993800] (10:node@c-9.me)  2015257  | 10004760 
-> [ 378.993800] (10:node@c-9.me)  2015261  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2015269  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2015285  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2015317  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2015381  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2015509  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2015765  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2016277  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2017301  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2019349  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2023445  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2031637  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2048021  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2080789  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2146325  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2277397  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2539541  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  3063829  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  4112405  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  6209557  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  10403861  | 2015253 
-> [ 378.993800] (10:node@c-9.me) Predecessor: -1
-> [ 378.993800] (5:node@c-4.me) My finger table:
-> [ 378.993800] (5:node@c-4.me) Start | Succ 
-> [ 378.993800] (5:node@c-4.me)  16509406  | 16728096 
-> [ 378.993800] (5:node@c-4.me)  16509407  |  42 
-> [ 378.993800] (5:node@c-4.me)  16509409  | 16728096 
-> [ 378.993800] (5:node@c-4.me)  16509413  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16509421  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16509437  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16509469  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16509533  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16509661  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16509917  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16510429  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16511453  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16513501  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16517597  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16525789  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16542173  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16574941  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16640477  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16771549  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  256477  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  780765  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  1829341  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  3926493  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  8120797  | 16509405 
-> [ 378.993800] (5:node@c-4.me) Predecessor: 10004760
-> [ 379.993800] (8:node@c-7.me) My finger table:
-> [ 379.993800] (8:node@c-7.me) Start | Succ 
-> [ 379.993800] (8:node@c-7.me)  10004761  | 16509405 
-> [ 379.993800] (8:node@c-7.me)  10004762  | 16509405 
-> [ 379.993800] (8:node@c-7.me)  10004764  | 16509405 
-> [ 379.993800] (8:node@c-7.me)  10004768  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10004776  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10004792  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10004824  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10004888  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10005016  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10005272  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10005784  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10006808  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10008856  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10012952  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10021144  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10037528  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10070296  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10135832  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10266904  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10529048  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  11053336  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  12101912  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  14199064  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  1616152  | 10004760 
-> [ 379.993800] (8:node@c-7.me) Predecessor: 6518808
-> [ 385.993700] (3:node@c-2.me) My finger table:
-> [ 385.993700] (3:node@c-2.me) Start | Succ 
-> [ 385.993700] (3:node@c-2.me)  533745  | 1319738 
-> [ 385.993700] (3:node@c-2.me)  533746  | 1319738 
-> [ 385.993700] (3:node@c-2.me)  533748  | 1319738 
-> [ 385.993700] (3:node@c-2.me)  533752  | 533744 
-> [ 385.993700] (3:node@c-2.me)  533760  | 533744 
-> [ 385.993700] (3:node@c-2.me)  533776  | 533744 
-> [ 385.993700] (3:node@c-2.me)  533808  | 533744 
-> [ 385.993700] (3:node@c-2.me)  533872  | 533744 
-> [ 385.993700] (3:node@c-2.me)  534000  | 533744 
-> [ 385.993700] (3:node@c-2.me)  534256  | 533744 
-> [ 385.993700] (3:node@c-2.me)  534768  | 533744 
-> [ 385.993700] (3:node@c-2.me)  535792  | 533744 
-> [ 385.993700] (3:node@c-2.me)  537840  | 533744 
-> [ 385.993700] (3:node@c-2.me)  541936  | 533744 
-> [ 385.993700] (3:node@c-2.me)  550128  | 533744 
-> [ 385.993700] (3:node@c-2.me)  566512  | 533744 
-> [ 385.993700] (3:node@c-2.me)  599280  | 533744 
-> [ 385.993700] (3:node@c-2.me)  664816  | 533744 
-> [ 385.993700] (3:node@c-2.me)  795888  | 533744 
-> [ 385.993700] (3:node@c-2.me)  1058032  | 533744 
-> [ 385.993700] (3:node@c-2.me)  1582320  | 533744 
-> [ 385.993700] (3:node@c-2.me)  2630896  | 533744 
-> [ 385.993700] (3:node@c-2.me)  4728048  | 533744 
-> [ 385.993700] (3:node@c-2.me)  8922352  | 533744 
-> [ 385.993700] (3:node@c-2.me) Predecessor: 366680
-> [ 387.993700] (7:node@c-6.me) My finger table:
-> [ 387.993700] (7:node@c-6.me) Start | Succ 
-> [ 387.993700] (7:node@c-6.me)  16728097  |  42 
-> [ 387.993700] (7:node@c-6.me)  16728098  |  42 
-> [ 387.993700] (7:node@c-6.me)  16728100  |  42 
-> [ 387.993700] (7:node@c-6.me)  16728104  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16728112  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16728128  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16728160  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16728224  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16728352  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16728608  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16729120  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16730144  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16732192  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16736288  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16744480  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16760864  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16416  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  81952  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  213024  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  475168  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  999456  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  2048032  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  4145184  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  8339488  | 16728096 
-> [ 387.993700] (7:node@c-6.me) Predecessor: 16509405
-> [ 389.993600] (9:node@c-8.me) My finger table:
-> [ 389.993600] (9:node@c-8.me) Start | Succ 
-> [ 389.993600] (9:node@c-8.me)  6518809  | 10004760 
-> [ 389.993600] (9:node@c-8.me)  6518810  | 10004760 
-> [ 389.993600] (9:node@c-8.me)  6518812  | 10004760 
-> [ 389.993600] (9:node@c-8.me)  6518816  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6518824  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6518840  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6518872  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6518936  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6519064  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6519320  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6519832  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6520856  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6522904  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6527000  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6535192  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6551576  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6584344  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6649880  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6780952  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  7043096  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  7567384  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  8615960  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  10713112  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  14907416  | 6518808 
-> [ 389.993600] (9:node@c-8.me) Predecessor: 1319738
-> [ 435.993000] (9:node@c-8.me) My finger table:
-> [ 435.993000] (9:node@c-8.me) Start | Succ 
-> [ 435.993000] (9:node@c-8.me)  6518809  | 10004760 
-> [ 435.993000] (9:node@c-8.me)  6518810  | 10004760 
-> [ 435.993000] (9:node@c-8.me)  6518812  | 10004760 
-> [ 435.993000] (9:node@c-8.me)  6518816  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6518824  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6518840  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6518872  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6518936  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6519064  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6519320  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6519832  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6520856  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6522904  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6527000  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6535192  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6551576  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6584344  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6649880  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6780952  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  7043096  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  7567384  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  8615960  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  10713112  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  14907416  | 6518808 
-> [ 435.993000] (9:node@c-8.me) Predecessor: 2015253
-> [ 492.992000] (6:node@c-5.me) My finger table:
-> [ 492.992000] (6:node@c-5.me) Start | Succ 
-> [ 492.992000] (6:node@c-5.me)  10874877  | 16509405 
-> [ 492.992000] (6:node@c-5.me)  10874878  | 533744 
-> [ 492.992000] (6:node@c-5.me)  10874880  | 533744 
-> [ 492.992000] (6:node@c-5.me)  10874884  | 16509405 
-> [ 492.992000] (6:node@c-5.me)  10874892  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10874908  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10874940  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10875004  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10875132  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10875388  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10875900  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10876924  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10878972  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10883068  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10891260  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10907644  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10940412  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  11005948  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  11137020  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  11399164  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  11923452  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  12972028  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  15069180  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  2486268  | 10874876 
-> [ 492.992000] (6:node@c-5.me) Predecessor: -1
-> [ 500.991800] (1:node@c-0.me) My finger table:
-> [ 500.991800] (1:node@c-0.me) Start | Succ 
-> [ 500.991800] (1:node@c-0.me)   43  | 366680 
-> [ 500.991800] (1:node@c-0.me)   44  | 366680 
-> [ 500.991800] (1:node@c-0.me)   46  | 366680 
-> [ 500.991800] (1:node@c-0.me)   50  | 366680 
-> [ 500.991800] (1:node@c-0.me)   58  |  42 
-> [ 500.991800] (1:node@c-0.me)   74  |  42 
-> [ 500.991800] (1:node@c-0.me)  106  |  42 
-> [ 500.991800] (1:node@c-0.me)  170  |  42 
-> [ 500.991800] (1:node@c-0.me)  298  |  42 
-> [ 500.991800] (1:node@c-0.me)  554  |  42 
-> [ 500.991800] (1:node@c-0.me)  1066  |  42 
-> [ 500.991800] (1:node@c-0.me)  2090  |  42 
-> [ 500.991800] (1:node@c-0.me)  4138  |  42 
-> [ 500.991800] (1:node@c-0.me)  8234  |  42 
-> [ 500.991800] (1:node@c-0.me)  16426  |  42 
-> [ 500.991800] (1:node@c-0.me)  32810  |  42 
-> [ 500.991800] (1:node@c-0.me)  65578  |  42 
-> [ 500.991800] (1:node@c-0.me)  131114  |  42 
-> [ 500.991800] (1:node@c-0.me)  262186  |  42 
-> [ 500.991800] (1:node@c-0.me)  524330  |  42 
-> [ 500.991800] (1:node@c-0.me)  1048618  |  42 
-> [ 500.991800] (1:node@c-0.me)  2097194  |  42 
-> [ 500.991800] (1:node@c-0.me)  4194346  |  42 
-> [ 500.991800] (1:node@c-0.me)  8388650  |  42 
-> [ 500.991800] (1:node@c-0.me) Predecessor: 16728096
-> [ 504.991900] (5:node@c-4.me) My finger table:
-> [ 504.991900] (5:node@c-4.me) Start | Succ 
-> [ 504.991900] (5:node@c-4.me)  16509406  | 16728096 
-> [ 504.991900] (5:node@c-4.me)  16509407  |  42 
-> [ 504.991900] (5:node@c-4.me)  16509409  | 16728096 
-> [ 504.991900] (5:node@c-4.me)  16509413  | 16728096 
-> [ 504.991900] (5:node@c-4.me)  16509421  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16509437  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16509469  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16509533  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16509661  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16509917  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16510429  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16511453  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16513501  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16517597  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16525789  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16542173  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16574941  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16640477  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16771549  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  256477  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  780765  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  1829341  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  3926493  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  8120797  | 16509405 
-> [ 504.991900] (5:node@c-4.me) Predecessor: 10004760
-> [ 508.991700] (4:node@c-3.me) My finger table:
-> [ 508.991700] (4:node@c-3.me) Start | Succ 
-> [ 508.991700] (4:node@c-3.me)  1319739  | 2015253 
-> [ 508.991700] (4:node@c-3.me)  1319740  | 6518808 
-> [ 508.991700] (4:node@c-3.me)  1319742  | 6518808 
-> [ 508.991700] (4:node@c-3.me)  1319746  | 2015253 
-> [ 508.991700] (4:node@c-3.me)  1319754  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1319770  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1319802  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1319866  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1319994  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1320250  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1320762  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1321786  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1323834  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1327930  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1336122  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1352506  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1385274  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1450810  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1581882  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1844026  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  2368314  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  3416890  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  5514042  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  9708346  | 1319738 
-> [ 508.991700] (4:node@c-3.me) Predecessor: 533744
-> [ 509.991700] (10:node@c-9.me) My finger table:
-> [ 509.991700] (10:node@c-9.me) Start | Succ 
-> [ 509.991700] (10:node@c-9.me)  2015254  | 6518808 
-> [ 509.991700] (10:node@c-9.me)  2015255  | 16728096 
-> [ 509.991700] (10:node@c-9.me)  2015257  | 10004760 
-> [ 509.991700] (10:node@c-9.me)  2015261  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2015269  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2015285  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2015317  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2015381  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2015509  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2015765  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2016277  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2017301  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2019349  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2023445  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2031637  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2048021  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2080789  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2146325  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2277397  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2539541  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  3063829  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  4112405  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  6209557  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  10403861  | 2015253 
-> [ 509.991700] (10:node@c-9.me) Predecessor: 1319738
-> [ 513.991600] (2:node@c-1.me) My finger table:
-> [ 513.991600] (2:node@c-1.me) Start | Succ 
-> [ 513.991600] (2:node@c-1.me)  366681  | 533744 
-> [ 513.991600] (2:node@c-1.me)  366682  | 1319738 
-> [ 513.991600] (2:node@c-1.me)  366684  | 533744 
-> [ 513.991600] (2:node@c-1.me)  366688  | 533744 
-> [ 513.991600] (2:node@c-1.me)  366696  | 366680 
-> [ 513.991600] (2:node@c-1.me)  366712  | 366680 
-> [ 513.991600] (2:node@c-1.me)  366744  | 366680 
-> [ 513.991600] (2:node@c-1.me)  366808  | 366680 
-> [ 513.991600] (2:node@c-1.me)  366936  | 366680 
-> [ 513.991600] (2:node@c-1.me)  367192  | 366680 
-> [ 513.991600] (2:node@c-1.me)  367704  | 366680 
-> [ 513.991600] (2:node@c-1.me)  368728  | 366680 
-> [ 513.991600] (2:node@c-1.me)  370776  | 366680 
-> [ 513.991600] (2:node@c-1.me)  374872  | 366680 
-> [ 513.991600] (2:node@c-1.me)  383064  | 366680 
-> [ 513.991600] (2:node@c-1.me)  399448  | 366680 
-> [ 513.991600] (2:node@c-1.me)  432216  | 366680 
-> [ 513.991600] (2:node@c-1.me)  497752  | 366680 
-> [ 513.991600] (2:node@c-1.me)  628824  | 366680 
-> [ 513.991600] (2:node@c-1.me)  890968  | 366680 
-> [ 513.991600] (2:node@c-1.me)  1415256  | 366680 
-> [ 513.991600] (2:node@c-1.me)  2463832  | 366680 
-> [ 513.991600] (2:node@c-1.me)  4560984  | 366680 
-> [ 513.991600] (2:node@c-1.me)  8755288  | 366680 
-> [ 513.991600] (2:node@c-1.me) Predecessor: 42
-> [ 516.991600] (10:node@c-9.me) My finger table:
-> [ 516.991600] (10:node@c-9.me) Start | Succ 
-> [ 516.991600] (10:node@c-9.me)  2015254  | 6518808 
-> [ 516.991600] (10:node@c-9.me)  2015255  | 16728096 
-> [ 516.991600] (10:node@c-9.me)  2015257  | 10004760 
-> [ 516.991600] (10:node@c-9.me)  2015261  | 6518808 
-> [ 516.991600] (10:node@c-9.me)  2015269  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2015285  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2015317  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2015381  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2015509  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2015765  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2016277  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2017301  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2019349  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2023445  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2031637  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2048021  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2080789  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2146325  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2277397  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2539541  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  3063829  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  4112405  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  6209557  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  10403861  | 2015253 
-> [ 516.991600] (10:node@c-9.me) Predecessor: 1319738
-> [ 516.991600] (3:node@c-2.me) My finger table:
-> [ 516.991600] (3:node@c-2.me) Start | Succ 
-> [ 516.991600] (3:node@c-2.me)  533745  | 1319738 
-> [ 516.991600] (3:node@c-2.me)  533746  | 1319738 
-> [ 516.991600] (3:node@c-2.me)  533748  | 1319738 
-> [ 516.991600] (3:node@c-2.me)  533752  | 1319738 
-> [ 516.991600] (3:node@c-2.me)  533760  | 533744 
-> [ 516.991600] (3:node@c-2.me)  533776  | 533744 
-> [ 516.991600] (3:node@c-2.me)  533808  | 533744 
-> [ 516.991600] (3:node@c-2.me)  533872  | 533744 
-> [ 516.991600] (3:node@c-2.me)  534000  | 533744 
-> [ 516.991600] (3:node@c-2.me)  534256  | 533744 
-> [ 516.991600] (3:node@c-2.me)  534768  | 533744 
-> [ 516.991600] (3:node@c-2.me)  535792  | 533744 
-> [ 516.991600] (3:node@c-2.me)  537840  | 533744 
-> [ 516.991600] (3:node@c-2.me)  541936  | 533744 
-> [ 516.991600] (3:node@c-2.me)  550128  | 533744 
-> [ 516.991600] (3:node@c-2.me)  566512  | 533744 
-> [ 516.991600] (3:node@c-2.me)  599280  | 533744 
-> [ 516.991600] (3:node@c-2.me)  664816  | 533744 
-> [ 516.991600] (3:node@c-2.me)  795888  | 533744 
-> [ 516.991600] (3:node@c-2.me)  1058032  | 533744 
-> [ 516.991600] (3:node@c-2.me)  1582320  | 533744 
-> [ 516.991600] (3:node@c-2.me)  2630896  | 533744 
-> [ 516.991600] (3:node@c-2.me)  4728048  | 533744 
-> [ 516.991600] (3:node@c-2.me)  8922352  | 533744 
-> [ 516.991600] (3:node@c-2.me) Predecessor: 366680
-> [ 519.991600] (7:node@c-6.me) My finger table:
-> [ 519.991600] (7:node@c-6.me) Start | Succ 
-> [ 519.991600] (7:node@c-6.me)  16728097  |  42 
-> [ 519.991600] (7:node@c-6.me)  16728098  |  42 
-> [ 519.991600] (7:node@c-6.me)  16728100  |  42 
-> [ 519.991600] (7:node@c-6.me)  16728104  |  42 
-> [ 519.991600] (7:node@c-6.me)  16728112  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16728128  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16728160  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16728224  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16728352  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16728608  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16729120  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16730144  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16732192  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16736288  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16744480  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16760864  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16416  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  81952  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  213024  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  475168  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  999456  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  2048032  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  4145184  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  8339488  | 16728096 
-> [ 519.991600] (7:node@c-6.me) Predecessor: 16509405
-> [ 524.991500] (8:node@c-7.me) My finger table:
-> [ 524.991500] (8:node@c-7.me) Start | Succ 
-> [ 524.991500] (8:node@c-7.me)  10004761  | 16509405 
-> [ 524.991500] (8:node@c-7.me)  10004762  | 16509405 
-> [ 524.991500] (8:node@c-7.me)  10004764  | 16509405 
-> [ 524.991500] (8:node@c-7.me)  10004768  | 16509405 
-> [ 524.991500] (8:node@c-7.me)  10004776  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10004792  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10004824  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10004888  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10005016  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10005272  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10005784  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10006808  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10008856  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10012952  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10021144  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10037528  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10070296  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10135832  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10266904  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10529048  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  11053336  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  12101912  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  14199064  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  1616152  | 10004760 
-> [ 524.991500] (8:node@c-7.me) Predecessor: 6518808
-> [ 529.991500] (5:node@c-4.me) My finger table:
-> [ 529.991500] (5:node@c-4.me) Start | Succ 
-> [ 529.991500] (5:node@c-4.me)  16509406  | 16728096 
-> [ 529.991500] (5:node@c-4.me)  16509407  |  42 
-> [ 529.991500] (5:node@c-4.me)  16509409  | 16728096 
-> [ 529.991500] (5:node@c-4.me)  16509413  | 16728096 
-> [ 529.991500] (5:node@c-4.me)  16509421  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16509437  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16509469  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16509533  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16509661  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16509917  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16510429  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16511453  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16513501  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16517597  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16525789  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16542173  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16574941  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16640477  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16771549  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  256477  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  780765  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  1829341  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  3926493  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  8120797  | 16509405 
-> [ 529.991500] (5:node@c-4.me) Predecessor: 10874876
-> [ 540.991400] (9:node@c-8.me) My finger table:
-> [ 540.991400] (9:node@c-8.me) Start | Succ 
-> [ 540.991400] (9:node@c-8.me)  6518809  | 10004760 
-> [ 540.991400] (9:node@c-8.me)  6518810  | 10004760 
-> [ 540.991400] (9:node@c-8.me)  6518812  | 10004760 
-> [ 540.991400] (9:node@c-8.me)  6518816  | 10004760 
-> [ 540.991400] (9:node@c-8.me)  6518824  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6518840  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6518872  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6518936  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6519064  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6519320  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6519832  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6520856  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6522904  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6527000  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6535192  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6551576  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6584344  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6649880  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6780952  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  7043096  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  7567384  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  8615960  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  10713112  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  14907416  | 6518808 
-> [ 540.991400] (9:node@c-8.me) Predecessor: 2015253
-> [ 613.990100] (6:node@c-5.me) My finger table:
-> [ 613.990100] (6:node@c-5.me) Start | Succ 
-> [ 613.990100] (6:node@c-5.me)  10874877  | 16509405 
-> [ 613.990100] (6:node@c-5.me)  10874878  | 533744 
-> [ 613.990100] (6:node@c-5.me)  10874880  | 533744 
-> [ 613.990100] (6:node@c-5.me)  10874884  | 16509405 
-> [ 613.990100] (6:node@c-5.me)  10874892  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10874908  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10874940  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10875004  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10875132  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10875388  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10875900  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10876924  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10878972  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10883068  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10891260  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10907644  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10940412  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  11005948  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  11137020  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  11399164  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  11923452  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  12972028  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  15069180  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  2486268  | 10874876 
-> [ 613.990100] (6:node@c-5.me) Predecessor: 10004760
-> [ 629.989800] (1:node@c-0.me) My finger table:
-> [ 629.989800] (1:node@c-0.me) Start | Succ 
-> [ 629.989800] (1:node@c-0.me)   43  | 366680 
-> [ 629.989800] (1:node@c-0.me)   44  | 366680 
-> [ 629.989800] (1:node@c-0.me)   46  | 366680 
-> [ 629.989800] (1:node@c-0.me)   50  | 366680 
-> [ 629.989800] (1:node@c-0.me)   58  | 366680 
-> [ 629.989800] (1:node@c-0.me)   74  |  42 
-> [ 629.989800] (1:node@c-0.me)  106  |  42 
-> [ 629.989800] (1:node@c-0.me)  170  |  42 
-> [ 629.989800] (1:node@c-0.me)  298  |  42 
-> [ 629.989800] (1:node@c-0.me)  554  |  42 
-> [ 629.989800] (1:node@c-0.me)  1066  |  42 
-> [ 629.989800] (1:node@c-0.me)  2090  |  42 
-> [ 629.989800] (1:node@c-0.me)  4138  |  42 
-> [ 629.989800] (1:node@c-0.me)  8234  |  42 
-> [ 629.989800] (1:node@c-0.me)  16426  |  42 
-> [ 629.989800] (1:node@c-0.me)  32810  |  42 
-> [ 629.989800] (1:node@c-0.me)  65578  |  42 
-> [ 629.989800] (1:node@c-0.me)  131114  |  42 
-> [ 629.989800] (1:node@c-0.me)  262186  |  42 
-> [ 629.989800] (1:node@c-0.me)  524330  |  42 
-> [ 629.989800] (1:node@c-0.me)  1048618  |  42 
-> [ 629.989800] (1:node@c-0.me)  2097194  |  42 
-> [ 629.989800] (1:node@c-0.me)  4194346  |  42 
-> [ 629.989800] (1:node@c-0.me)  8388650  |  42 
-> [ 629.989800] (1:node@c-0.me) Predecessor: 16728096
-> [ 629.989800] (6:node@c-5.me) My finger table:
-> [ 629.989800] (6:node@c-5.me) Start | Succ 
-> [ 629.989800] (6:node@c-5.me)  10874877  | 16509405 
-> [ 629.989800] (6:node@c-5.me)  10874878  | 533744 
-> [ 629.989800] (6:node@c-5.me)  10874880  | 533744 
-> [ 629.989800] (6:node@c-5.me)  10874884  | 16509405 
-> [ 629.989800] (6:node@c-5.me)  10874892  | 16509405 
-> [ 629.989800] (6:node@c-5.me)  10874908  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10874940  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10875004  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10875132  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10875388  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10875900  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10876924  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10878972  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10883068  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10891260  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10907644  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10940412  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  11005948  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  11137020  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  11399164  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  11923452  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  12972028  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  15069180  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  2486268  | 10874876 
-> [ 629.989800] (6:node@c-5.me) Predecessor: 10004760
-> [ 632.989700] (4:node@c-3.me) My finger table:
-> [ 632.989700] (4:node@c-3.me) Start | Succ 
-> [ 632.989700] (4:node@c-3.me)  1319739  | 2015253 
-> [ 632.989700] (4:node@c-3.me)  1319740  | 6518808 
-> [ 632.989700] (4:node@c-3.me)  1319742  | 6518808 
-> [ 632.989700] (4:node@c-3.me)  1319746  | 2015253 
-> [ 632.989700] (4:node@c-3.me)  1319754  | 2015253 
-> [ 632.989700] (4:node@c-3.me)  1319770  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1319802  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1319866  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1319994  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1320250  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1320762  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1321786  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1323834  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1327930  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1336122  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1352506  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1385274  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1450810  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1581882  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1844026  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  2368314  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  3416890  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  5514042  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  9708346  | 1319738 
-> [ 632.989700] (4:node@c-3.me) Predecessor: 533744
-> [ 637.989600] (2:node@c-1.me) My finger table:
-> [ 637.989600] (2:node@c-1.me) Start | Succ 
-> [ 637.989600] (2:node@c-1.me)  366681  | 533744 
-> [ 637.989600] (2:node@c-1.me)  366682  | 1319738 
-> [ 637.989600] (2:node@c-1.me)  366684  | 533744 
-> [ 637.989600] (2:node@c-1.me)  366688  | 533744 
-> [ 637.989600] (2:node@c-1.me)  366696  | 533744 
-> [ 637.989600] (2:node@c-1.me)  366712  | 366680 
-> [ 637.989600] (2:node@c-1.me)  366744  | 366680 
-> [ 637.989600] (2:node@c-1.me)  366808  | 366680 
-> [ 637.989600] (2:node@c-1.me)  366936  | 366680 
-> [ 637.989600] (2:node@c-1.me)  367192  | 366680 
-> [ 637.989600] (2:node@c-1.me)  367704  | 366680 
-> [ 637.989600] (2:node@c-1.me)  368728  | 366680 
-> [ 637.989600] (2:node@c-1.me)  370776  | 366680 
-> [ 637.989600] (2:node@c-1.me)  374872  | 366680 
-> [ 637.989600] (2:node@c-1.me)  383064  | 366680 
-> [ 637.989600] (2:node@c-1.me)  399448  | 366680 
-> [ 637.989600] (2:node@c-1.me)  432216  | 366680 
-> [ 637.989600] (2:node@c-1.me)  497752  | 366680 
-> [ 637.989600] (2:node@c-1.me)  628824  | 366680 
-> [ 637.989600] (2:node@c-1.me)  890968  | 366680 
-> [ 637.989600] (2:node@c-1.me)  1415256  | 366680 
-> [ 637.989600] (2:node@c-1.me)  2463832  | 366680 
-> [ 637.989600] (2:node@c-1.me)  4560984  | 366680 
-> [ 637.989600] (2:node@c-1.me)  8755288  | 366680 
-> [ 637.989600] (2:node@c-1.me) Predecessor: 42
-> [ 638.989600] (3:node@c-2.me) My finger table:
-> [ 638.989600] (3:node@c-2.me) Start | Succ 
-> [ 638.989600] (3:node@c-2.me)  533745  | 1319738 
-> [ 638.989600] (3:node@c-2.me)  533746  | 1319738 
-> [ 638.989600] (3:node@c-2.me)  533748  | 1319738 
-> [ 638.989600] (3:node@c-2.me)  533752  | 1319738 
-> [ 638.989600] (3:node@c-2.me)  533760  | 1319738 
-> [ 638.989600] (3:node@c-2.me)  533776  | 533744 
-> [ 638.989600] (3:node@c-2.me)  533808  | 533744 
-> [ 638.989600] (3:node@c-2.me)  533872  | 533744 
-> [ 638.989600] (3:node@c-2.me)  534000  | 533744 
-> [ 638.989600] (3:node@c-2.me)  534256  | 533744 
-> [ 638.989600] (3:node@c-2.me)  534768  | 533744 
-> [ 638.989600] (3:node@c-2.me)  535792  | 533744 
-> [ 638.989600] (3:node@c-2.me)  537840  | 533744 
-> [ 638.989600] (3:node@c-2.me)  541936  | 533744 
-> [ 638.989600] (3:node@c-2.me)  550128  | 533744 
-> [ 638.989600] (3:node@c-2.me)  566512  | 533744 
-> [ 638.989600] (3:node@c-2.me)  599280  | 533744 
-> [ 638.989600] (3:node@c-2.me)  664816  | 533744 
-> [ 638.989600] (3:node@c-2.me)  795888  | 533744 
-> [ 638.989600] (3:node@c-2.me)  1058032  | 533744 
-> [ 638.989600] (3:node@c-2.me)  1582320  | 533744 
-> [ 638.989600] (3:node@c-2.me)  2630896  | 533744 
-> [ 638.989600] (3:node@c-2.me)  4728048  | 533744 
-> [ 638.989600] (3:node@c-2.me)  8922352  | 533744 
-> [ 638.989600] (3:node@c-2.me) Predecessor: 366680
-> [ 641.989600] (10:node@c-9.me) My finger table:
-> [ 641.989600] (10:node@c-9.me) Start | Succ 
-> [ 641.989600] (10:node@c-9.me)  2015254  | 6518808 
-> [ 641.989600] (10:node@c-9.me)  2015255  | 16728096 
-> [ 641.989600] (10:node@c-9.me)  2015257  | 10004760 
-> [ 641.989600] (10:node@c-9.me)  2015261  | 6518808 
-> [ 641.989600] (10:node@c-9.me)  2015269  | 6518808 
-> [ 641.989600] (10:node@c-9.me)  2015285  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2015317  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2015381  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2015509  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2015765  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2016277  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2017301  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2019349  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2023445  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2031637  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2048021  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2080789  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2146325  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2277397  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2539541  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  3063829  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  4112405  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  6209557  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  10403861  | 2015253 
-> [ 641.989600] (10:node@c-9.me) Predecessor: 1319738
-> [ 645.989500] (7:node@c-6.me) My finger table:
-> [ 645.989500] (7:node@c-6.me) Start | Succ 
-> [ 645.989500] (7:node@c-6.me)  16728097  |  42 
-> [ 645.989500] (7:node@c-6.me)  16728098  |  42 
-> [ 645.989500] (7:node@c-6.me)  16728100  |  42 
-> [ 645.989500] (7:node@c-6.me)  16728104  |  42 
-> [ 645.989500] (7:node@c-6.me)  16728112  |  42 
-> [ 645.989500] (7:node@c-6.me)  16728128  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16728160  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16728224  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16728352  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16728608  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16729120  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16730144  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16732192  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16736288  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16744480  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16760864  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16416  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  81952  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  213024  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  475168  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  999456  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  2048032  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  4145184  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  8339488  | 16728096 
-> [ 645.989500] (7:node@c-6.me) Predecessor: 16509405
-> [ 645.989600] (5:node@c-4.me) My finger table:
-> [ 645.989600] (5:node@c-4.me) Start | Succ 
-> [ 645.989600] (5:node@c-4.me)  16509406  | 16728096 
-> [ 645.989600] (5:node@c-4.me)  16509407  |  42 
-> [ 645.989600] (5:node@c-4.me)  16509409  | 16728096 
-> [ 645.989600] (5:node@c-4.me)  16509413  | 16728096 
-> [ 645.989600] (5:node@c-4.me)  16509421  | 16728096 
-> [ 645.989600] (5:node@c-4.me)  16509437  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16509469  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16509533  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16509661  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16509917  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16510429  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16511453  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16513501  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16517597  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16525789  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16542173  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16574941  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16640477  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16771549  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  256477  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  780765  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  1829341  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  3926493  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  8120797  | 16509405 
-> [ 645.989600] (5:node@c-4.me) Predecessor: 10874876
-> [ 655.989400] (8:node@c-7.me) My finger table:
-> [ 655.989400] (8:node@c-7.me) Start | Succ 
-> [ 655.989400] (8:node@c-7.me)  10004761  | 10874876 
-> [ 655.989400] (8:node@c-7.me)  10004762  | 16509405 
-> [ 655.989400] (8:node@c-7.me)  10004764  | 16509405 
-> [ 655.989400] (8:node@c-7.me)  10004768  | 16509405 
-> [ 655.989400] (8:node@c-7.me)  10004776  | 10874876 
-> [ 655.989400] (8:node@c-7.me)  10004792  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10004824  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10004888  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10005016  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10005272  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10005784  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10006808  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10008856  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10012952  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10021144  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10037528  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10070296  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10135832  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10266904  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10529048  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  11053336  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  12101912  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  14199064  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  1616152  | 10004760 
-> [ 655.989400] (8:node@c-7.me) Predecessor: 6518808
-> [ 662.989300] (9:node@c-8.me) My finger table:
-> [ 662.989300] (9:node@c-8.me) Start | Succ 
-> [ 662.989300] (9:node@c-8.me)  6518809  | 10004760 
-> [ 662.989300] (9:node@c-8.me)  6518810  | 10004760 
-> [ 662.989300] (9:node@c-8.me)  6518812  | 10004760 
-> [ 662.989300] (9:node@c-8.me)  6518816  | 10004760 
-> [ 662.989300] (9:node@c-8.me)  6518824  | 10004760 
-> [ 662.989300] (9:node@c-8.me)  6518840  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6518872  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6518936  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6519064  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6519320  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6519832  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6520856  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6522904  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6527000  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6535192  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6551576  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6584344  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6649880  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6780952  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  7043096  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  7567384  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  8615960  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  10713112  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  14907416  | 6518808 
-> [ 662.989300] (9:node@c-8.me) Predecessor: 2015253
-> [ 754.987800] (1:node@c-0.me) My finger table:
-> [ 754.987800] (1:node@c-0.me) Start | Succ 
-> [ 754.987800] (1:node@c-0.me)   43  | 366680 
-> [ 754.987800] (1:node@c-0.me)   44  | 366680 
-> [ 754.987800] (1:node@c-0.me)   46  | 366680 
-> [ 754.987800] (1:node@c-0.me)   50  | 366680 
-> [ 754.987800] (1:node@c-0.me)   58  | 366680 
-> [ 754.987800] (1:node@c-0.me)   74  | 366680 
-> [ 754.987800] (1:node@c-0.me)  106  |  42 
-> [ 754.987800] (1:node@c-0.me)  170  |  42 
-> [ 754.987800] (1:node@c-0.me)  298  |  42 
-> [ 754.987800] (1:node@c-0.me)  554  |  42 
-> [ 754.987800] (1:node@c-0.me)  1066  |  42 
-> [ 754.987800] (1:node@c-0.me)  2090  |  42 
-> [ 754.987800] (1:node@c-0.me)  4138  |  42 
-> [ 754.987800] (1:node@c-0.me)  8234  |  42 
-> [ 754.987800] (1:node@c-0.me)  16426  |  42 
-> [ 754.987800] (1:node@c-0.me)  32810  |  42 
-> [ 754.987800] (1:node@c-0.me)  65578  |  42 
-> [ 754.987800] (1:node@c-0.me)  131114  |  42 
-> [ 754.987800] (1:node@c-0.me)  262186  |  42 
-> [ 754.987800] (1:node@c-0.me)  524330  |  42 
-> [ 754.987800] (1:node@c-0.me)  1048618  |  42 
-> [ 754.987800] (1:node@c-0.me)  2097194  |  42 
-> [ 754.987800] (1:node@c-0.me)  4194346  |  42 
-> [ 754.987800] (1:node@c-0.me)  8388650  |  42 
-> [ 754.987800] (1:node@c-0.me) Predecessor: 16728096
-> [ 757.987800] (4:node@c-3.me) My finger table:
-> [ 757.987800] (4:node@c-3.me) Start | Succ 
-> [ 757.987800] (4:node@c-3.me)  1319739  | 2015253 
-> [ 757.987800] (4:node@c-3.me)  1319740  | 6518808 
-> [ 757.987800] (4:node@c-3.me)  1319742  | 6518808 
-> [ 757.987800] (4:node@c-3.me)  1319746  | 2015253 
-> [ 757.987800] (4:node@c-3.me)  1319754  | 2015253 
-> [ 757.987800] (4:node@c-3.me)  1319770  | 2015253 
-> [ 757.987800] (4:node@c-3.me)  1319802  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1319866  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1319994  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1320250  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1320762  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1321786  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1323834  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1327930  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1336122  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1352506  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1385274  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1450810  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1581882  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1844026  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  2368314  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  3416890  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  5514042  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  9708346  | 1319738 
-> [ 757.987800] (4:node@c-3.me) Predecessor: 533744
-> [ 762.987700] (10:node@c-9.me) My finger table:
-> [ 762.987700] (10:node@c-9.me) Start | Succ 
-> [ 762.987700] (10:node@c-9.me)  2015254  | 6518808 
-> [ 762.987700] (10:node@c-9.me)  2015255  | 16728096 
-> [ 762.987700] (10:node@c-9.me)  2015257  | 10004760 
-> [ 762.987700] (10:node@c-9.me)  2015261  | 6518808 
-> [ 762.987700] (10:node@c-9.me)  2015269  | 6518808 
-> [ 762.987700] (10:node@c-9.me)  2015285  | 6518808 
-> [ 762.987700] (10:node@c-9.me)  2015317  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2015381  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2015509  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2015765  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2016277  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2017301  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2019349  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2023445  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2031637  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2048021  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2080789  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2146325  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2277397  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2539541  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  3063829  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  4112405  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  6209557  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  10403861  | 2015253 
-> [ 762.987700] (10:node@c-9.me) Predecessor: 1319738
-> [ 762.987700] (6:node@c-5.me) My finger table:
-> [ 762.987700] (6:node@c-5.me) Start | Succ 
-> [ 762.987700] (6:node@c-5.me)  10874877  | 16509405 
-> [ 762.987700] (6:node@c-5.me)  10874878  | 533744 
-> [ 762.987700] (6:node@c-5.me)  10874880  | 533744 
-> [ 762.987700] (6:node@c-5.me)  10874884  | 16509405 
-> [ 762.987700] (6:node@c-5.me)  10874892  | 16509405 
-> [ 762.987700] (6:node@c-5.me)  10874908  | 16509405 
-> [ 762.987700] (6:node@c-5.me)  10874940  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10875004  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10875132  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10875388  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10875900  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10876924  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10878972  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10883068  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10891260  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10907644  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10940412  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  11005948  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  11137020  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  11399164  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  11923452  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  12972028  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  15069180  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  2486268  | 10874876 
-> [ 762.987700] (6:node@c-5.me) Predecessor: 10004760
-> [ 767.987600] (2:node@c-1.me) My finger table:
-> [ 767.987600] (2:node@c-1.me) Start | Succ 
-> [ 767.987600] (2:node@c-1.me)  366681  | 533744 
-> [ 767.987600] (2:node@c-1.me)  366682  | 1319738 
-> [ 767.987600] (2:node@c-1.me)  366684  | 533744 
-> [ 767.987600] (2:node@c-1.me)  366688  | 533744 
-> [ 767.987600] (2:node@c-1.me)  366696  | 533744 
-> [ 767.987600] (2:node@c-1.me)  366712  | 533744 
-> [ 767.987600] (2:node@c-1.me)  366744  | 366680 
-> [ 767.987600] (2:node@c-1.me)  366808  | 366680 
-> [ 767.987600] (2:node@c-1.me)  366936  | 366680 
-> [ 767.987600] (2:node@c-1.me)  367192  | 366680 
-> [ 767.987600] (2:node@c-1.me)  367704  | 366680 
-> [ 767.987600] (2:node@c-1.me)  368728  | 366680 
-> [ 767.987600] (2:node@c-1.me)  370776  | 366680 
-> [ 767.987600] (2:node@c-1.me)  374872  | 366680 
-> [ 767.987600] (2:node@c-1.me)  383064  | 366680 
-> [ 767.987600] (2:node@c-1.me)  399448  | 366680 
-> [ 767.987600] (2:node@c-1.me)  432216  | 366680 
-> [ 767.987600] (2:node@c-1.me)  497752  | 366680 
-> [ 767.987600] (2:node@c-1.me)  628824  | 366680 
-> [ 767.987600] (2:node@c-1.me)  890968  | 366680 
-> [ 767.987600] (2:node@c-1.me)  1415256  | 366680 
-> [ 767.987600] (2:node@c-1.me)  2463832  | 366680 
-> [ 767.987600] (2:node@c-1.me)  4560984  | 366680 
-> [ 767.987600] (2:node@c-1.me)  8755288  | 366680 
-> [ 767.987600] (2:node@c-1.me) Predecessor: 42
-> [ 771.987500] (5:node@c-4.me) My finger table:
-> [ 771.987500] (5:node@c-4.me) Start | Succ 
-> [ 771.987500] (5:node@c-4.me)  16509406  | 16728096 
-> [ 771.987500] (5:node@c-4.me)  16509407  |  42 
-> [ 771.987500] (5:node@c-4.me)  16509409  | 16728096 
-> [ 771.987500] (5:node@c-4.me)  16509413  | 16728096 
-> [ 771.987500] (5:node@c-4.me)  16509421  | 16728096 
-> [ 771.987500] (5:node@c-4.me)  16509437  | 16728096 
-> [ 771.987500] (5:node@c-4.me)  16509469  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16509533  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16509661  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16509917  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16510429  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16511453  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16513501  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16517597  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16525789  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16542173  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16574941  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16640477  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16771549  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  256477  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  780765  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  1829341  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  3926493  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  8120797  | 16509405 
-> [ 771.987500] (5:node@c-4.me) Predecessor: 10874876
-> [ 776.987500] (3:node@c-2.me) My finger table:
-> [ 776.987500] (3:node@c-2.me) Start | Succ 
-> [ 776.987500] (3:node@c-2.me)  533745  | 1319738 
-> [ 776.987500] (3:node@c-2.me)  533746  | 1319738 
-> [ 776.987500] (3:node@c-2.me)  533748  | 1319738 
-> [ 776.987500] (3:node@c-2.me)  533752  | 1319738 
-> [ 776.987500] (3:node@c-2.me)  533760  | 1319738 
-> [ 776.987500] (3:node@c-2.me)  533776  | 1319738 
-> [ 776.987500] (3:node@c-2.me)  533808  | 533744 
-> [ 776.987500] (3:node@c-2.me)  533872  | 533744 
-> [ 776.987500] (3:node@c-2.me)  534000  | 533744 
-> [ 776.987500] (3:node@c-2.me)  534256  | 533744 
-> [ 776.987500] (3:node@c-2.me)  534768  | 533744 
-> [ 776.987500] (3:node@c-2.me)  535792  | 533744 
-> [ 776.987500] (3:node@c-2.me)  537840  | 533744 
-> [ 776.987500] (3:node@c-2.me)  541936  | 533744 
-> [ 776.987500] (3:node@c-2.me)  550128  | 533744 
-> [ 776.987500] (3:node@c-2.me)  566512  | 533744 
-> [ 776.987500] (3:node@c-2.me)  599280  | 533744 
-> [ 776.987500] (3:node@c-2.me)  664816  | 533744 
-> [ 776.987500] (3:node@c-2.me)  795888  | 533744 
-> [ 776.987500] (3:node@c-2.me)  1058032  | 533744 
-> [ 776.987500] (3:node@c-2.me)  1582320  | 533744 
-> [ 776.987500] (3:node@c-2.me)  2630896  | 533744 
-> [ 776.987500] (3:node@c-2.me)  4728048  | 533744 
-> [ 776.987500] (3:node@c-2.me)  8922352  | 533744 
-> [ 776.987500] (3:node@c-2.me) Predecessor: 366680
-> [ 823.987500] (8:node@c-7.me) My finger table:
-> [ 823.987500] (8:node@c-7.me) Start | Succ 
-> [ 823.987500] (8:node@c-7.me)  10004761  | 10874876 
-> [ 823.987500] (8:node@c-7.me)  10004762  | 16509405 
-> [ 823.987500] (8:node@c-7.me)  10004764  | 16509405 
-> [ 823.987500] (8:node@c-7.me)  10004768  | 16509405 
-> [ 823.987500] (8:node@c-7.me)  10004776  | 10874876 
-> [ 823.987500] (8:node@c-7.me)  10004792  | 10874876 
-> [ 823.987500] (8:node@c-7.me)  10004824  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10004888  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10005016  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10005272  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10005784  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10006808  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10008856  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10012952  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10021144  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10037528  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10070296  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10135832  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10266904  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10529048  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  11053336  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  12101912  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  14199064  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  1616152  | 10004760 
-> [ 823.987500] (8:node@c-7.me) Predecessor: 6518808
-> [ 824.987500] (7:node@c-6.me) My finger table:
-> [ 824.987500] (7:node@c-6.me) Start | Succ 
-> [ 824.987500] (7:node@c-6.me)  16728097  |  42 
-> [ 824.987500] (7:node@c-6.me)  16728098  |  42 
-> [ 824.987500] (7:node@c-6.me)  16728100  |  42 
-> [ 824.987500] (7:node@c-6.me)  16728104  |  42 
-> [ 824.987500] (7:node@c-6.me)  16728112  |  42 
-> [ 824.987500] (7:node@c-6.me)  16728128  |  42 
-> [ 824.987500] (7:node@c-6.me)  16728160  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16728224  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16728352  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16728608  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16729120  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16730144  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16732192  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16736288  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16744480  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16760864  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16416  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  81952  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  213024  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  475168  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  999456  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  2048032  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  4145184  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  8339488  | 16728096 
-> [ 824.987500] (7:node@c-6.me) Predecessor: 16509405
-> [ 876.987500] (9:node@c-8.me) My finger table:
-> [ 876.987500] (9:node@c-8.me) Start | Succ 
-> [ 876.987500] (9:node@c-8.me)  6518809  | 10004760 
-> [ 876.987500] (9:node@c-8.me)  6518810  | 10004760 
-> [ 876.987500] (9:node@c-8.me)  6518812  | 10004760 
-> [ 876.987500] (9:node@c-8.me)  6518816  | 10004760 
-> [ 876.987500] (9:node@c-8.me)  6518824  | 10004760 
-> [ 876.987500] (9:node@c-8.me)  6518840  | 10004760 
-> [ 876.987500] (9:node@c-8.me)  6518872  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6518936  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6519064  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6519320  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6519832  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6520856  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6522904  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6527000  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6535192  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6551576  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6584344  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6649880  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6780952  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  7043096  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  7567384  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  8615960  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  10713112  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  14907416  | 6518808 
-> [ 876.987500] (9:node@c-8.me) Predecessor: 2015253
-> [ 880.986500] (1:node@c-0.me) My finger table:
-> [ 880.986500] (1:node@c-0.me) Start | Succ 
-> [ 880.986500] (1:node@c-0.me)   43  | 366680 
-> [ 880.986500] (1:node@c-0.me)   44  | 366680 
-> [ 880.986500] (1:node@c-0.me)   46  | 366680 
-> [ 880.986500] (1:node@c-0.me)   50  | 366680 
-> [ 880.986500] (1:node@c-0.me)   58  | 366680 
-> [ 880.986500] (1:node@c-0.me)   74  | 366680 
-> [ 880.986500] (1:node@c-0.me)  106  | 366680 
-> [ 880.986500] (1:node@c-0.me)  170  |  42 
-> [ 880.986500] (1:node@c-0.me)  298  |  42 
-> [ 880.986500] (1:node@c-0.me)  554  |  42 
-> [ 880.986500] (1:node@c-0.me)  1066  |  42 
-> [ 880.986500] (1:node@c-0.me)  2090  |  42 
-> [ 880.986500] (1:node@c-0.me)  4138  |  42 
-> [ 880.986500] (1:node@c-0.me)  8234  |  42 
-> [ 880.986500] (1:node@c-0.me)  16426  |  42 
-> [ 880.986500] (1:node@c-0.me)  32810  |  42 
-> [ 880.986500] (1:node@c-0.me)  65578  |  42 
-> [ 880.986500] (1:node@c-0.me)  131114  |  42 
-> [ 880.986500] (1:node@c-0.me)  262186  |  42 
-> [ 880.986500] (1:node@c-0.me)  524330  |  42 
-> [ 880.986500] (1:node@c-0.me)  1048618  |  42 
-> [ 880.986500] (1:node@c-0.me)  2097194  |  42 
-> [ 880.986500] (1:node@c-0.me)  4194346  |  42 
-> [ 880.986500] (1:node@c-0.me)  8388650  |  42 
-> [ 880.986500] (1:node@c-0.me) Predecessor: 16728096
-> [ 904.987100] (3:node@c-2.me) My finger table:
-> [ 904.987100] (3:node@c-2.me) Start | Succ 
-> [ 904.987100] (3:node@c-2.me)  533745  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533746  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533748  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533752  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533760  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533776  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533808  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533872  | 533744 
-> [ 904.987100] (3:node@c-2.me)  534000  | 533744 
-> [ 904.987100] (3:node@c-2.me)  534256  | 533744 
-> [ 904.987100] (3:node@c-2.me)  534768  | 533744 
-> [ 904.987100] (3:node@c-2.me)  535792  | 533744 
-> [ 904.987100] (3:node@c-2.me)  537840  | 533744 
-> [ 904.987100] (3:node@c-2.me)  541936  | 533744 
-> [ 904.987100] (3:node@c-2.me)  550128  | 533744 
-> [ 904.987100] (3:node@c-2.me)  566512  | 533744 
-> [ 904.987100] (3:node@c-2.me)  599280  | 533744 
-> [ 904.987100] (3:node@c-2.me)  664816  | 533744 
-> [ 904.987100] (3:node@c-2.me)  795888  | 533744 
-> [ 904.987100] (3:node@c-2.me)  1058032  | 533744 
-> [ 904.987100] (3:node@c-2.me)  1582320  | 533744 
-> [ 904.987100] (3:node@c-2.me)  2630896  | 533744 
-> [ 904.987100] (3:node@c-2.me)  4728048  | 533744 
-> [ 904.987100] (3:node@c-2.me)  8922352  | 533744 
-> [ 904.987100] (3:node@c-2.me) Predecessor: 366680
-> [ 924.987500] (5:node@c-4.me) My finger table:
-> [ 924.987500] (5:node@c-4.me) Start | Succ 
-> [ 924.987500] (5:node@c-4.me)  16509406  | 16728096 
-> [ 924.987500] (5:node@c-4.me)  16509407  |  42 
-> [ 924.987500] (5:node@c-4.me)  16509409  | 16728096 
-> [ 924.987500] (5:node@c-4.me)  16509413  | 16728096 
-> [ 924.987500] (5:node@c-4.me)  16509421  | 16728096 
-> [ 924.987500] (5:node@c-4.me)  16509437  | 16728096 
-> [ 924.987500] (5:node@c-4.me)  16509469  | 16728096 
-> [ 924.987500] (5:node@c-4.me)  16509533  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16509661  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16509917  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16510429  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16511453  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16513501  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16517597  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16525789  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16542173  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16574941  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16640477  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16771549  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  256477  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  780765  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  1829341  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  3926493  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  8120797  | 16509405 
-> [ 924.987500] (5:node@c-4.me) Predecessor: 10874876
-> [ 936.987400] (6:node@c-5.me) My finger table:
-> [ 936.987400] (6:node@c-5.me) Start | Succ 
-> [ 936.987400] (6:node@c-5.me)  10874877  | 16509405 
-> [ 936.987400] (6:node@c-5.me)  10874878  | 533744 
-> [ 936.987400] (6:node@c-5.me)  10874880  | 533744 
-> [ 936.987400] (6:node@c-5.me)  10874884  | 16509405 
-> [ 936.987400] (6:node@c-5.me)  10874892  | 16509405 
-> [ 936.987400] (6:node@c-5.me)  10874908  | 16509405 
-> [ 936.987400] (6:node@c-5.me)  10874940  | 16509405 
-> [ 936.987400] (6:node@c-5.me)  10875004  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10875132  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10875388  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10875900  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10876924  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10878972  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10883068  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10891260  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10907644  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10940412  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  11005948  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  11137020  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  11399164  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  11923452  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  12972028  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  15069180  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  2486268  | 10874876 
-> [ 936.987400] (6:node@c-5.me) Predecessor: 10004760
-> [ 945.985300] (7:node@c-6.me) My finger table:
-> [ 945.985300] (7:node@c-6.me) Start | Succ 
-> [ 945.985300] (7:node@c-6.me)  16728097  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728098  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728100  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728104  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728112  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728128  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728160  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728224  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16728352  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16728608  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16729120  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16730144  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16732192  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16736288  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16744480  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16760864  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16416  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  81952  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  213024  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  475168  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  999456  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  2048032  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  4145184  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  8339488  | 16728096 
-> [ 945.985300] (7:node@c-6.me) Predecessor: 16509405
-> [ 952.985200] (2:node@c-1.me) My finger table:
-> [ 952.985200] (2:node@c-1.me) Start | Succ 
-> [ 952.985200] (2:node@c-1.me)  366681  | 533744 
-> [ 952.985200] (2:node@c-1.me)  366682  | 1319738 
-> [ 952.985200] (2:node@c-1.me)  366684  | 533744 
-> [ 952.985200] (2:node@c-1.me)  366688  | 533744 
-> [ 952.985200] (2:node@c-1.me)  366696  | 533744 
-> [ 952.985200] (2:node@c-1.me)  366712  | 533744 
-> [ 952.985200] (2:node@c-1.me)  366744  | 533744 
-> [ 952.985200] (2:node@c-1.me)  366808  | 366680 
-> [ 952.985200] (2:node@c-1.me)  366936  | 366680 
-> [ 952.985200] (2:node@c-1.me)  367192  | 366680 
-> [ 952.985200] (2:node@c-1.me)  367704  | 366680 
-> [ 952.985200] (2:node@c-1.me)  368728  | 366680 
-> [ 952.985200] (2:node@c-1.me)  370776  | 366680 
-> [ 952.985200] (2:node@c-1.me)  374872  | 366680 
-> [ 952.985200] (2:node@c-1.me)  383064  | 366680 
-> [ 952.985200] (2:node@c-1.me)  399448  | 366680 
-> [ 952.985200] (2:node@c-1.me)  432216  | 366680 
-> [ 952.985200] (2:node@c-1.me)  497752  | 366680 
-> [ 952.985200] (2:node@c-1.me)  628824  | 366680 
-> [ 952.985200] (2:node@c-1.me)  890968  | 366680 
-> [ 952.985200] (2:node@c-1.me)  1415256  | 366680 
-> [ 952.985200] (2:node@c-1.me)  2463832  | 366680 
-> [ 952.985200] (2:node@c-1.me)  4560984  | 366680 
-> [ 952.985200] (2:node@c-1.me)  8755288  | 366680 
-> [ 952.985200] (2:node@c-1.me) Predecessor: 42
-> [ 967.986900] (4:node@c-3.me) My finger table:
-> [ 967.986900] (4:node@c-3.me) Start | Succ 
-> [ 967.986900] (4:node@c-3.me)  1319739  | 2015253 
-> [ 967.986900] (4:node@c-3.me)  1319740  | 6518808 
-> [ 967.986900] (4:node@c-3.me)  1319742  | 6518808 
-> [ 967.986900] (4:node@c-3.me)  1319746  | 2015253 
-> [ 967.986900] (4:node@c-3.me)  1319754  | 2015253 
-> [ 967.986900] (4:node@c-3.me)  1319770  | 2015253 
-> [ 967.986900] (4:node@c-3.me)  1319802  | 2015253 
-> [ 967.986900] (4:node@c-3.me)  1319866  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1319994  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1320250  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1320762  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1321786  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1323834  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1327930  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1336122  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1352506  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1385274  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1450810  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1581882  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1844026  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  2368314  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  3416890  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  5514042  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  9708346  | 1319738 
-> [ 967.986900] (4:node@c-3.me) Predecessor: 533744
-> [1207.985300] (0:@) Messages created: 1690
-> [1207.985300] (0:@) Simulated time: 1207.99
+> [  54.998900] (1:node@c-0.me) My finger table:
+> [  54.998900] (1:node@c-0.me) Start | Succ 
+> [  54.998900] (1:node@c-0.me)   43  | 366680 
+> [  54.998900] (1:node@c-0.me)   44  |  42 
+> [  54.998900] (1:node@c-0.me)   46  |  42 
+> [  54.998900] (1:node@c-0.me)   50  |  42 
+> [  54.998900] (1:node@c-0.me)   58  |  42 
+> [  54.998900] (1:node@c-0.me)   74  |  42 
+> [  54.998900] (1:node@c-0.me)  106  |  42 
+> [  54.998900] (1:node@c-0.me)  170  |  42 
+> [  54.998900] (1:node@c-0.me)  298  |  42 
+> [  54.998900] (1:node@c-0.me)  554  |  42 
+> [  54.998900] (1:node@c-0.me)  1066  |  42 
+> [  54.998900] (1:node@c-0.me)  2090  |  42 
+> [  54.998900] (1:node@c-0.me)  4138  |  42 
+> [  54.998900] (1:node@c-0.me)  8234  |  42 
+> [  54.998900] (1:node@c-0.me)  16426  |  42 
+> [  54.998900] (1:node@c-0.me)  32810  |  42 
+> [  54.998900] (1:node@c-0.me)  65578  |  42 
+> [  54.998900] (1:node@c-0.me)  131114  |  42 
+> [  54.998900] (1:node@c-0.me)  262186  |  42 
+> [  54.998900] (1:node@c-0.me)  524330  |  42 
+> [  54.998900] (1:node@c-0.me)  1048618  |  42 
+> [  54.998900] (1:node@c-0.me)  2097194  |  42 
+> [  54.998900] (1:node@c-0.me)  4194346  |  42 
+> [  54.998900] (1:node@c-0.me)  8388650  |  42 
+> [  54.998900] (1:node@c-0.me) Predecessor: 1319738
+> [  91.998400] (7:node@c-6.me) My finger table:
+> [  91.998400] (7:node@c-6.me) Start | Succ 
+> [  91.998400] (7:node@c-6.me)  16728097  | 1319738 
+> [  91.998400] (7:node@c-6.me)  16728098  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728100  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728104  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728112  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728128  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728160  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728224  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728352  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728608  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16729120  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16730144  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16732192  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16736288  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16744480  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16760864  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16416  | 16728096 
+> [  91.998400] (7:node@c-6.me)  81952  | 16728096 
+> [  91.998400] (7:node@c-6.me)  213024  | 16728096 
+> [  91.998400] (7:node@c-6.me)  475168  | 16728096 
+> [  91.998400] (7:node@c-6.me)  999456  | 16728096 
+> [  91.998400] (7:node@c-6.me)  2048032  | 16728096 
+> [  91.998400] (7:node@c-6.me)  4145184  | 16728096 
+> [  91.998400] (7:node@c-6.me)  8339488  | 16728096 
+> [  91.998400] (7:node@c-6.me) Predecessor: 2015253
+> [ 109.998800] (1:node@c-0.me) My finger table:
+> [ 109.998800] (1:node@c-0.me) Start | Succ 
+> [ 109.998800] (1:node@c-0.me)   43  | 366680 
+> [ 109.998800] (1:node@c-0.me)   44  |  42 
+> [ 109.998800] (1:node@c-0.me)   46  |  42 
+> [ 109.998800] (1:node@c-0.me)   50  |  42 
+> [ 109.998800] (1:node@c-0.me)   58  |  42 
+> [ 109.998800] (1:node@c-0.me)   74  |  42 
+> [ 109.998800] (1:node@c-0.me)  106  |  42 
+> [ 109.998800] (1:node@c-0.me)  170  |  42 
+> [ 109.998800] (1:node@c-0.me)  298  |  42 
+> [ 109.998800] (1:node@c-0.me)  554  |  42 
+> [ 109.998800] (1:node@c-0.me)  1066  |  42 
+> [ 109.998800] (1:node@c-0.me)  2090  |  42 
+> [ 109.998800] (1:node@c-0.me)  4138  |  42 
+> [ 109.998800] (1:node@c-0.me)  8234  |  42 
+> [ 109.998800] (1:node@c-0.me)  16426  |  42 
+> [ 109.998800] (1:node@c-0.me)  32810  |  42 
+> [ 109.998800] (1:node@c-0.me)  65578  |  42 
+> [ 109.998800] (1:node@c-0.me)  131114  |  42 
+> [ 109.998800] (1:node@c-0.me)  262186  |  42 
+> [ 109.998800] (1:node@c-0.me)  524330  |  42 
+> [ 109.998800] (1:node@c-0.me)  1048618  |  42 
+> [ 109.998800] (1:node@c-0.me)  2097194  |  42 
+> [ 109.998800] (1:node@c-0.me)  4194346  |  42 
+> [ 109.998800] (1:node@c-0.me)  8388650  |  42 
+> [ 109.998800] (1:node@c-0.me) Predecessor: 6518808
+> [ 163.999100] (2:node@c-1.me) My finger table:
+> [ 163.999100] (2:node@c-1.me) Start | Succ 
+> [ 163.999100] (2:node@c-1.me)  366681  |  42 
+> [ 163.999100] (2:node@c-1.me)  366682  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366684  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366688  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366696  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366712  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366744  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366808  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366936  | 366680 
+> [ 163.999100] (2:node@c-1.me)  367192  | 366680 
+> [ 163.999100] (2:node@c-1.me)  367704  | 366680 
+> [ 163.999100] (2:node@c-1.me)  368728  | 366680 
+> [ 163.999100] (2:node@c-1.me)  370776  | 366680 
+> [ 163.999100] (2:node@c-1.me)  374872  | 366680 
+> [ 163.999100] (2:node@c-1.me)  383064  | 366680 
+> [ 163.999100] (2:node@c-1.me)  399448  | 366680 
+> [ 163.999100] (2:node@c-1.me)  432216  | 366680 
+> [ 163.999100] (2:node@c-1.me)  497752  | 366680 
+> [ 163.999100] (2:node@c-1.me)  628824  | 366680 
+> [ 163.999100] (2:node@c-1.me)  890968  | 366680 
+> [ 163.999100] (2:node@c-1.me)  1415256  | 366680 
+> [ 163.999100] (2:node@c-1.me)  2463832  | 366680 
+> [ 163.999100] (2:node@c-1.me)  4560984  | 366680 
+> [ 163.999100] (2:node@c-1.me)  8755288  | 366680 
+> [ 163.999100] (2:node@c-1.me) Predecessor: 42
+> [ 195.998600] (9:node@c-8.me) My finger table:
+> [ 195.998600] (9:node@c-8.me) Start | Succ 
+> [ 195.998600] (9:node@c-8.me)  6518809  |  42 
+> [ 195.998600] (9:node@c-8.me)  6518810  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6518812  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6518816  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6518824  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6518840  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6518872  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6518936  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6519064  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6519320  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6519832  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6520856  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6522904  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6527000  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6535192  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6551576  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6584344  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6649880  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6780952  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  7043096  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  7567384  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  8615960  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  10713112  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  14907416  | 6518808 
+> [ 195.998600] (9:node@c-8.me) Predecessor: 1319738
+> [ 205.998500] (8:node@c-7.me) My finger table:
+> [ 205.998500] (8:node@c-7.me) Start | Succ 
+> [ 205.998500] (8:node@c-7.me)  10004761  | 16509405 
+> [ 205.998500] (8:node@c-7.me)  10004762  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10004764  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10004768  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10004776  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10004792  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10004824  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10004888  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10005016  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10005272  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10005784  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10006808  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10008856  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10012952  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10021144  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10037528  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10070296  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10135832  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10266904  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10529048  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  11053336  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  12101912  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  14199064  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  1616152  | 10004760 
+> [ 205.998500] (8:node@c-7.me) Predecessor: 533744
+> [ 206.998500] (1:node@c-0.me) My finger table:
+> [ 206.998500] (1:node@c-0.me) Start | Succ 
+> [ 206.998500] (1:node@c-0.me)   43  | 366680 
+> [ 206.998500] (1:node@c-0.me)   44  |  42 
+> [ 206.998500] (1:node@c-0.me)   46  |  42 
+> [ 206.998500] (1:node@c-0.me)   50  |  42 
+> [ 206.998500] (1:node@c-0.me)   58  |  42 
+> [ 206.998500] (1:node@c-0.me)   74  |  42 
+> [ 206.998500] (1:node@c-0.me)  106  |  42 
+> [ 206.998500] (1:node@c-0.me)  170  |  42 
+> [ 206.998500] (1:node@c-0.me)  298  |  42 
+> [ 206.998500] (1:node@c-0.me)  554  |  42 
+> [ 206.998500] (1:node@c-0.me)  1066  |  42 
+> [ 206.998500] (1:node@c-0.me)  2090  |  42 
+> [ 206.998500] (1:node@c-0.me)  4138  |  42 
+> [ 206.998500] (1:node@c-0.me)  8234  |  42 
+> [ 206.998500] (1:node@c-0.me)  16426  |  42 
+> [ 206.998500] (1:node@c-0.me)  32810  |  42 
+> [ 206.998500] (1:node@c-0.me)  65578  |  42 
+> [ 206.998500] (1:node@c-0.me)  131114  |  42 
+> [ 206.998500] (1:node@c-0.me)  262186  |  42 
+> [ 206.998500] (1:node@c-0.me)  524330  |  42 
+> [ 206.998500] (1:node@c-0.me)  1048618  |  42 
+> [ 206.998500] (1:node@c-0.me)  2097194  |  42 
+> [ 206.998500] (1:node@c-0.me)  4194346  |  42 
+> [ 206.998500] (1:node@c-0.me)  8388650  |  42 
+> [ 206.998500] (1:node@c-0.me) Predecessor: 16509405
+> [ 244.998100] (4:node@c-3.me) My finger table:
+> [ 244.998100] (4:node@c-3.me) Start | Succ 
+> [ 244.998100] (4:node@c-3.me)  1319739  | 6518808 
+> [ 244.998100] (4:node@c-3.me)  1319740  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319742  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319746  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319754  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319770  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319802  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319866  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319994  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1320250  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1320762  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1321786  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1323834  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1327930  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1336122  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1352506  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1385274  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1450810  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1581882  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1844026  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  2368314  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  3416890  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  5514042  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  9708346  | 1319738 
+> [ 244.998100] (4:node@c-3.me) Predecessor: 366680
+> [ 246.998000] (6:node@c-5.me) My finger table:
+> [ 246.998000] (6:node@c-5.me) Start | Succ 
+> [ 246.998000] (6:node@c-5.me)  10874877  | 533744 
+> [ 246.998000] (6:node@c-5.me)  10874878  | 533744 
+> [ 246.998000] (6:node@c-5.me)  10874880  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10874884  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10874892  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10874908  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10874940  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10875004  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10875132  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10875388  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10875900  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10876924  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10878972  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10883068  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10891260  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10907644  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10940412  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  11005948  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  11137020  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  11399164  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  11923452  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  12972028  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  15069180  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  2486268  | 10874876 
+> [ 246.998000] (6:node@c-5.me) Predecessor: -1
+> [ 247.998000] (7:node@c-6.me) My finger table:
+> [ 247.998000] (7:node@c-6.me) Start | Succ 
+> [ 247.998000] (7:node@c-6.me)  16728097  | 1319738 
+> [ 247.998000] (7:node@c-6.me)  16728098  | 1319738 
+> [ 247.998000] (7:node@c-6.me)  16728100  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728104  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728112  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728128  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728160  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728224  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728352  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728608  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16729120  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16730144  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16732192  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16736288  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16744480  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16760864  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16416  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  81952  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  213024  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  475168  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  999456  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  2048032  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  4145184  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  8339488  | 16728096 
+> [ 247.998000] (7:node@c-6.me) Predecessor: 2015253
+> [ 249.998000] (10:node@c-9.me) My finger table:
+> [ 249.998000] (10:node@c-9.me) Start | Succ 
+> [ 249.998000] (10:node@c-9.me)  2015254  | 16728096 
+> [ 249.998000] (10:node@c-9.me)  2015255  | 16728096 
+> [ 249.998000] (10:node@c-9.me)  2015257  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015261  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015269  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015285  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015317  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015381  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015509  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015765  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2016277  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2017301  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2019349  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2023445  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2031637  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2048021  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2080789  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2146325  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2277397  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2539541  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  3063829  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  4112405  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  6209557  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  10403861  | 2015253 
+> [ 249.998000] (10:node@c-9.me) Predecessor: -1
+> [ 275.997500] (3:node@c-2.me) My finger table:
+> [ 275.997500] (3:node@c-2.me) Start | Succ 
+> [ 275.997500] (3:node@c-2.me)  533745  | 10004760 
+> [ 275.997500] (3:node@c-2.me)  533746  | 10004760 
+> [ 275.997500] (3:node@c-2.me)  533748  | 533744 
+> [ 275.997500] (3:node@c-2.me)  533752  | 533744 
+> [ 275.997500] (3:node@c-2.me)  533760  | 533744 
+> [ 275.997500] (3:node@c-2.me)  533776  | 533744 
+> [ 275.997500] (3:node@c-2.me)  533808  | 533744 
+> [ 275.997500] (3:node@c-2.me)  533872  | 533744 
+> [ 275.997500] (3:node@c-2.me)  534000  | 533744 
+> [ 275.997500] (3:node@c-2.me)  534256  | 533744 
+> [ 275.997500] (3:node@c-2.me)  534768  | 533744 
+> [ 275.997500] (3:node@c-2.me)  535792  | 533744 
+> [ 275.997500] (3:node@c-2.me)  537840  | 533744 
+> [ 275.997500] (3:node@c-2.me)  541936  | 533744 
+> [ 275.997500] (3:node@c-2.me)  550128  | 533744 
+> [ 275.997500] (3:node@c-2.me)  566512  | 533744 
+> [ 275.997500] (3:node@c-2.me)  599280  | 533744 
+> [ 275.997500] (3:node@c-2.me)  664816  | 533744 
+> [ 275.997500] (3:node@c-2.me)  795888  | 533744 
+> [ 275.997500] (3:node@c-2.me)  1058032  | 533744 
+> [ 275.997500] (3:node@c-2.me)  1582320  | 533744 
+> [ 275.997500] (3:node@c-2.me)  2630896  | 533744 
+> [ 275.997500] (3:node@c-2.me)  4728048  | 533744 
+> [ 275.997500] (3:node@c-2.me)  8922352  | 533744 
+> [ 275.997500] (3:node@c-2.me) Predecessor: 10874876
+> [ 276.997600] (8:node@c-7.me) My finger table:
+> [ 276.997600] (8:node@c-7.me) Start | Succ 
+> [ 276.997600] (8:node@c-7.me)  10004761  | 16509405 
+> [ 276.997600] (8:node@c-7.me)  10004762  | 16509405 
+> [ 276.997600] (8:node@c-7.me)  10004764  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10004768  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10004776  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10004792  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10004824  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10004888  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10005016  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10005272  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10005784  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10006808  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10008856  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10012952  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10021144  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10037528  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10070296  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10135832  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10266904  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10529048  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  11053336  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  12101912  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  14199064  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  1616152  | 10004760 
+> [ 276.997600] (8:node@c-7.me) Predecessor: 533744
+> [ 276.997600] (2:node@c-1.me) My finger table:
+> [ 276.997600] (2:node@c-1.me) Start | Succ 
+> [ 276.997600] (2:node@c-1.me)  366681  | 1319738 
+> [ 276.997600] (2:node@c-1.me)  366682  | 1319738 
+> [ 276.997600] (2:node@c-1.me)  366684  | 366680 
+> [ 276.997600] (2:node@c-1.me)  366688  | 366680 
+> [ 276.997600] (2:node@c-1.me)  366696  | 366680 
+> [ 276.997600] (2:node@c-1.me)  366712  | 366680 
+> [ 276.997600] (2:node@c-1.me)  366744  | 366680 
+> [ 276.997600] (2:node@c-1.me)  366808  | 366680 
+> [ 276.997600] (2:node@c-1.me)  366936  | 366680 
+> [ 276.997600] (2:node@c-1.me)  367192  | 366680 
+> [ 276.997600] (2:node@c-1.me)  367704  | 366680 
+> [ 276.997600] (2:node@c-1.me)  368728  | 366680 
+> [ 276.997600] (2:node@c-1.me)  370776  | 366680 
+> [ 276.997600] (2:node@c-1.me)  374872  | 366680 
+> [ 276.997600] (2:node@c-1.me)  383064  | 366680 
+> [ 276.997600] (2:node@c-1.me)  399448  | 366680 
+> [ 276.997600] (2:node@c-1.me)  432216  | 366680 
+> [ 276.997600] (2:node@c-1.me)  497752  | 366680 
+> [ 276.997600] (2:node@c-1.me)  628824  | 366680 
+> [ 276.997600] (2:node@c-1.me)  890968  | 366680 
+> [ 276.997600] (2:node@c-1.me)  1415256  | 366680 
+> [ 276.997600] (2:node@c-1.me)  2463832  | 366680 
+> [ 276.997600] (2:node@c-1.me)  4560984  | 366680 
+> [ 276.997600] (2:node@c-1.me)  8755288  | 366680 
+> [ 276.997600] (2:node@c-1.me) Predecessor: 42
+> [ 281.997600] (9:node@c-8.me) My finger table:
+> [ 281.997600] (9:node@c-8.me) Start | Succ 
+> [ 281.997600] (9:node@c-8.me)  6518809  | 10004760 
+> [ 281.997600] (9:node@c-8.me)  6518810  | 10004760 
+> [ 281.997600] (9:node@c-8.me)  6518812  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6518816  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6518824  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6518840  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6518872  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6518936  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6519064  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6519320  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6519832  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6520856  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6522904  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6527000  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6535192  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6551576  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6584344  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6649880  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6780952  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  7043096  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  7567384  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  8615960  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  10713112  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  14907416  | 6518808 
+> [ 281.997600] (9:node@c-8.me) Predecessor: 1319738
+> [ 283.997600] (8:node@c-7.me) My finger table:
+> [ 283.997600] (8:node@c-7.me) Start | Succ 
+> [ 283.997600] (8:node@c-7.me)  10004761  | 16509405 
+> [ 283.997600] (8:node@c-7.me)  10004762  | 16509405 
+> [ 283.997600] (8:node@c-7.me)  10004764  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10004768  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10004776  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10004792  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10004824  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10004888  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10005016  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10005272  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10005784  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10006808  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10008856  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10012952  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10021144  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10037528  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10070296  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10135832  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10266904  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10529048  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  11053336  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  12101912  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  14199064  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  1616152  | 10004760 
+> [ 283.997600] (8:node@c-7.me) Predecessor: 6518808
+> [ 285.997500] (4:node@c-3.me) My finger table:
+> [ 285.997500] (4:node@c-3.me) Start | Succ 
+> [ 285.997500] (4:node@c-3.me)  1319739  | 6518808 
+> [ 285.997500] (4:node@c-3.me)  1319740  | 6518808 
+> [ 285.997500] (4:node@c-3.me)  1319742  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1319746  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1319754  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1319770  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1319802  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1319866  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1319994  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1320250  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1320762  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1321786  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1323834  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1327930  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1336122  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1352506  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1385274  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1450810  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1581882  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1844026  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  2368314  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  3416890  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  5514042  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  9708346  | 1319738 
+> [ 285.997500] (4:node@c-3.me) Predecessor: 366680
+> [ 285.997500] (1:node@c-0.me) My finger table:
+> [ 285.997500] (1:node@c-0.me) Start | Succ 
+> [ 285.997500] (1:node@c-0.me)   43  | 366680 
+> [ 285.997500] (1:node@c-0.me)   44  | 366680 
+> [ 285.997500] (1:node@c-0.me)   46  |  42 
+> [ 285.997500] (1:node@c-0.me)   50  |  42 
+> [ 285.997500] (1:node@c-0.me)   58  |  42 
+> [ 285.997500] (1:node@c-0.me)   74  |  42 
+> [ 285.997500] (1:node@c-0.me)  106  |  42 
+> [ 285.997500] (1:node@c-0.me)  170  |  42 
+> [ 285.997500] (1:node@c-0.me)  298  |  42 
+> [ 285.997500] (1:node@c-0.me)  554  |  42 
+> [ 285.997500] (1:node@c-0.me)  1066  |  42 
+> [ 285.997500] (1:node@c-0.me)  2090  |  42 
+> [ 285.997500] (1:node@c-0.me)  4138  |  42 
+> [ 285.997500] (1:node@c-0.me)  8234  |  42 
+> [ 285.997500] (1:node@c-0.me)  16426  |  42 
+> [ 285.997500] (1:node@c-0.me)  32810  |  42 
+> [ 285.997500] (1:node@c-0.me)  65578  |  42 
+> [ 285.997500] (1:node@c-0.me)  131114  |  42 
+> [ 285.997500] (1:node@c-0.me)  262186  |  42 
+> [ 285.997500] (1:node@c-0.me)  524330  |  42 
+> [ 285.997500] (1:node@c-0.me)  1048618  |  42 
+> [ 285.997500] (1:node@c-0.me)  2097194  |  42 
+> [ 285.997500] (1:node@c-0.me)  4194346  |  42 
+> [ 285.997500] (1:node@c-0.me)  8388650  |  42 
+> [ 285.997500] (1:node@c-0.me) Predecessor: 16509405
+> [ 290.997500] (5:node@c-4.me) My finger table:
+> [ 290.997500] (5:node@c-4.me) Start | Succ 
+> [ 290.997500] (5:node@c-4.me)  16509406  |  42 
+> [ 290.997500] (5:node@c-4.me)  16509407  |  42 
+> [ 290.997500] (5:node@c-4.me)  16509409  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509413  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509421  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509437  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509469  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509533  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509661  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509917  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16510429  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16511453  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16513501  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16517597  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16525789  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16542173  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16574941  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16640477  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16771549  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  256477  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  780765  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  1829341  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  3926493  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  8120797  | 16509405 
+> [ 290.997500] (5:node@c-4.me) Predecessor: 10004760
+> [ 356.996500] (1:node@c-0.me) My finger table:
+> [ 356.996500] (1:node@c-0.me) Start | Succ 
+> [ 356.996500] (1:node@c-0.me)   43  | 366680 
+> [ 356.996500] (1:node@c-0.me)   44  | 366680 
+> [ 356.996500] (1:node@c-0.me)   46  |  42 
+> [ 356.996500] (1:node@c-0.me)   50  |  42 
+> [ 356.996500] (1:node@c-0.me)   58  |  42 
+> [ 356.996500] (1:node@c-0.me)   74  |  42 
+> [ 356.996500] (1:node@c-0.me)  106  |  42 
+> [ 356.996500] (1:node@c-0.me)  170  |  42 
+> [ 356.996500] (1:node@c-0.me)  298  |  42 
+> [ 356.996500] (1:node@c-0.me)  554  |  42 
+> [ 356.996500] (1:node@c-0.me)  1066  |  42 
+> [ 356.996500] (1:node@c-0.me)  2090  |  42 
+> [ 356.996500] (1:node@c-0.me)  4138  |  42 
+> [ 356.996500] (1:node@c-0.me)  8234  |  42 
+> [ 356.996500] (1:node@c-0.me)  16426  |  42 
+> [ 356.996500] (1:node@c-0.me)  32810  |  42 
+> [ 356.996500] (1:node@c-0.me)  65578  |  42 
+> [ 356.996500] (1:node@c-0.me)  131114  |  42 
+> [ 356.996500] (1:node@c-0.me)  262186  |  42 
+> [ 356.996500] (1:node@c-0.me)  524330  |  42 
+> [ 356.996500] (1:node@c-0.me)  1048618  |  42 
+> [ 356.996500] (1:node@c-0.me)  2097194  |  42 
+> [ 356.996500] (1:node@c-0.me)  4194346  |  42 
+> [ 356.996500] (1:node@c-0.me)  8388650  |  42 
+> [ 356.996500] (1:node@c-0.me) Predecessor: 16728096
+> [ 370.996400] (6:node@c-5.me) My finger table:
+> [ 370.996400] (7:node@c-6.me) My finger table:
+> [ 370.996400] (6:node@c-5.me) Start | Succ 
+> [ 370.996400] (7:node@c-6.me) Start | Succ 
+> [ 370.996400] (6:node@c-5.me)  10874877  | 533744 
+> [ 370.996400] (6:node@c-5.me)  10874878  | 533744 
+> [ 370.996400] (7:node@c-6.me)  16728097  |  42 
+> [ 370.996400] (6:node@c-5.me)  10874880  | 533744 
+> [ 370.996400] (7:node@c-6.me)  16728098  | 1319738 
+> [ 370.996400] (7:node@c-6.me)  16728100  |  42 
+> [ 370.996400] (6:node@c-5.me)  10874884  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728104  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10874892  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728112  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10874908  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728128  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10874940  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728160  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10875004  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728224  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10875132  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728352  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10875388  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728608  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10875900  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16729120  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10876924  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16730144  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10878972  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16732192  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10883068  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16736288  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10891260  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16744480  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10907644  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16760864  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10940412  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16416  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  11005948  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  81952  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  11137020  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  213024  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  11399164  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  475168  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  11923452  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  999456  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  12972028  | 10874876 
+> [ 370.996400] (6:node@c-5.me)  15069180  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  2048032  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  2486268  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  4145184  | 16728096 
+> [ 370.996400] (7:node@c-6.me)  8339488  | 16728096 
+> [ 370.996400] (6:node@c-5.me) Predecessor: -1
+> [ 370.996400] (7:node@c-6.me) Predecessor: 2015253
+> [ 373.996300] (10:node@c-9.me) My finger table:
+> [ 373.996300] (10:node@c-9.me) Start | Succ 
+> [ 373.996300] (10:node@c-9.me)  2015254  | 16728096 
+> [ 373.996300] (10:node@c-9.me)  2015255  | 16728096 
+> [ 373.996300] (10:node@c-9.me)  2015257  | 16728096 
+> [ 373.996300] (10:node@c-9.me)  2015261  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2015269  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2015285  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2015317  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2015381  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2015509  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2015765  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2016277  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2017301  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2019349  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2023445  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2031637  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2048021  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2080789  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2146325  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2277397  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2539541  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  3063829  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  4112405  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  6209557  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  10403861  | 2015253 
+> [ 373.996300] (10:node@c-9.me) Predecessor: -1
+> [ 387.996200] (7:node@c-6.me) My finger table:
+> [ 387.996200] (7:node@c-6.me) Start | Succ 
+> [ 387.996200] (7:node@c-6.me)  16728097  |  42 
+> [ 387.996200] (7:node@c-6.me)  16728098  | 1319738 
+> [ 387.996200] (7:node@c-6.me)  16728100  |  42 
+> [ 387.996200] (7:node@c-6.me)  16728104  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16728112  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16728128  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16728160  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16728224  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16728352  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16728608  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16729120  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16730144  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16732192  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16736288  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16744480  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16760864  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16416  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  81952  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  213024  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  475168  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  999456  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  2048032  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  4145184  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  8339488  | 16728096 
+> [ 387.996200] (7:node@c-6.me) Predecessor: 16509405
+> [ 390.996100] (4:node@c-3.me) My finger table:
+> [ 390.996100] (4:node@c-3.me) Start | Succ 
+> [ 390.996100] (4:node@c-3.me)  1319739  | 6518808 
+> [ 390.996100] (4:node@c-3.me)  1319740  | 6518808 
+> [ 390.996100] (4:node@c-3.me)  1319742  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1319746  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1319754  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1319770  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1319802  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1319866  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1319994  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1320250  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1320762  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1321786  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1323834  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1327930  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1336122  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1352506  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1385274  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1450810  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1581882  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1844026  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  2368314  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  3416890  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  5514042  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  9708346  | 1319738 
+> [ 390.996100] (4:node@c-3.me) Predecessor: 533744
+> [ 397.996000] (8:node@c-7.me) My finger table:
+> [ 397.996000] (8:node@c-7.me) Start | Succ 
+> [ 397.996000] (8:node@c-7.me)  10004761  | 16509405 
+> [ 397.996000] (8:node@c-7.me)  10004762  | 16509405 
+> [ 397.996000] (8:node@c-7.me)  10004764  | 16509405 
+> [ 397.996000] (8:node@c-7.me)  10004768  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10004776  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10004792  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10004824  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10004888  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10005016  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10005272  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10005784  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10006808  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10008856  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10012952  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10021144  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10037528  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10070296  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10135832  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10266904  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10529048  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  11053336  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  12101912  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  14199064  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  1616152  | 10004760 
+> [ 397.996000] (8:node@c-7.me) Predecessor: 6518808
+> [ 399.996000] (2:node@c-1.me) My finger table:
+> [ 399.996000] (2:node@c-1.me) Start | Succ 
+> [ 399.996000] (2:node@c-1.me)  366681  | 533744 
+> [ 399.996000] (2:node@c-1.me)  366682  | 1319738 
+> [ 399.996000] (2:node@c-1.me)  366684  | 533744 
+> [ 399.996000] (2:node@c-1.me)  366688  | 366680 
+> [ 399.996000] (2:node@c-1.me)  366696  | 366680 
+> [ 399.996000] (2:node@c-1.me)  366712  | 366680 
+> [ 399.996000] (2:node@c-1.me)  366744  | 366680 
+> [ 399.996000] (2:node@c-1.me)  366808  | 366680 
+> [ 399.996000] (2:node@c-1.me)  366936  | 366680 
+> [ 399.996000] (2:node@c-1.me)  367192  | 366680 
+> [ 399.996000] (2:node@c-1.me)  367704  | 366680 
+> [ 399.996000] (2:node@c-1.me)  368728  | 366680 
+> [ 399.996000] (2:node@c-1.me)  370776  | 366680 
+> [ 399.996000] (2:node@c-1.me)  374872  | 366680 
+> [ 399.996000] (2:node@c-1.me)  383064  | 366680 
+> [ 399.996000] (2:node@c-1.me)  399448  | 366680 
+> [ 399.996000] (2:node@c-1.me)  432216  | 366680 
+> [ 399.996000] (2:node@c-1.me)  497752  | 366680 
+> [ 399.996000] (2:node@c-1.me)  628824  | 366680 
+> [ 399.996000] (2:node@c-1.me)  890968  | 366680 
+> [ 399.996000] (2:node@c-1.me)  1415256  | 366680 
+> [ 399.996000] (2:node@c-1.me)  2463832  | 366680 
+> [ 399.996000] (2:node@c-1.me)  4560984  | 366680 
+> [ 399.996000] (2:node@c-1.me)  8755288  | 366680 
+> [ 399.996000] (2:node@c-1.me) Predecessor: 42
+> [ 400.996000] (3:node@c-2.me) My finger table:
+> [ 400.996000] (3:node@c-2.me) Start | Succ 
+> [ 400.996000] (3:node@c-2.me)  533745  | 1319738 
+> [ 400.996000] (3:node@c-2.me)  533746  | 10004760 
+> [ 400.996000] (3:node@c-2.me)  533748  | 1319738 
+> [ 400.996000] (3:node@c-2.me)  533752  | 533744 
+> [ 400.996000] (3:node@c-2.me)  533760  | 533744 
+> [ 400.996000] (3:node@c-2.me)  533776  | 533744 
+> [ 400.996000] (3:node@c-2.me)  533808  | 533744 
+> [ 400.996000] (3:node@c-2.me)  533872  | 533744 
+> [ 400.996000] (3:node@c-2.me)  534000  | 533744 
+> [ 400.996000] (3:node@c-2.me)  534256  | 533744 
+> [ 400.996000] (3:node@c-2.me)  534768  | 533744 
+> [ 400.996000] (3:node@c-2.me)  535792  | 533744 
+> [ 400.996000] (3:node@c-2.me)  537840  | 533744 
+> [ 400.996000] (3:node@c-2.me)  541936  | 533744 
+> [ 400.996000] (3:node@c-2.me)  550128  | 533744 
+> [ 400.996000] (3:node@c-2.me)  566512  | 533744 
+> [ 400.996000] (3:node@c-2.me)  599280  | 533744 
+> [ 400.996000] (3:node@c-2.me)  664816  | 533744 
+> [ 400.996000] (3:node@c-2.me)  795888  | 533744 
+> [ 400.996000] (3:node@c-2.me)  1058032  | 533744 
+> [ 400.996000] (3:node@c-2.me)  1582320  | 533744 
+> [ 400.996000] (3:node@c-2.me)  2630896  | 533744 
+> [ 400.996000] (3:node@c-2.me)  4728048  | 533744 
+> [ 400.996000] (3:node@c-2.me)  8922352  | 533744 
+> [ 400.996000] (3:node@c-2.me) Predecessor: 10874876
+> [ 402.996000] (9:node@c-8.me) My finger table:
+> [ 402.996000] (9:node@c-8.me) Start | Succ 
+> [ 402.996000] (9:node@c-8.me)  6518809  | 10004760 
+> [ 402.996000] (9:node@c-8.me)  6518810  | 10004760 
+> [ 402.996000] (9:node@c-8.me)  6518812  | 10004760 
+> [ 402.996000] (9:node@c-8.me)  6518816  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6518824  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6518840  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6518872  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 402.996000] (9:node@c-8.me) Predecessor: 1319738
+> [ 406.995900] (4:node@c-3.me) My finger table:
+> [ 406.995900] (4:node@c-3.me) Start | Succ 
+> [ 406.995900] (4:node@c-3.me)  1319739  | 6518808 
+> [ 406.995900] (4:node@c-3.me)  1319740  | 6518808 
+> [ 406.995900] (4:node@c-3.me)  1319742  | 6518808 
+> [ 406.995900] (4:node@c-3.me)  1319746  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1319754  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1319770  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1319802  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1319866  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1319994  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1320250  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1320762  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1321786  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1323834  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1327930  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1336122  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1352506  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1385274  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1450810  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1581882  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1844026  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  2368314  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  3416890  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  5514042  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  9708346  | 1319738 
+> [ 406.995900] (4:node@c-3.me) Predecessor: 533744
+> [ 409.995900] (1:node@c-0.me) My finger table:
+> [ 409.995900] (1:node@c-0.me) Start | Succ 
+> [ 409.995900] (1:node@c-0.me)   43  | 366680 
+> [ 409.995900] (1:node@c-0.me)   44  | 366680 
+> [ 409.995900] (1:node@c-0.me)   46  | 366680 
+> [ 409.995900] (1:node@c-0.me)   50  |  42 
+> [ 409.995900] (1:node@c-0.me)   58  |  42 
+> [ 409.995900] (1:node@c-0.me)   74  |  42 
+> [ 409.995900] (1:node@c-0.me)  106  |  42 
+> [ 409.995900] (1:node@c-0.me)  170  |  42 
+> [ 409.995900] (1:node@c-0.me)  298  |  42 
+> [ 409.995900] (1:node@c-0.me)  554  |  42 
+> [ 409.995900] (1:node@c-0.me)  1066  |  42 
+> [ 409.995900] (1:node@c-0.me)  2090  |  42 
+> [ 409.995900] (1:node@c-0.me)  4138  |  42 
+> [ 409.995900] (1:node@c-0.me)  8234  |  42 
+> [ 409.995900] (1:node@c-0.me)  16426  |  42 
+> [ 409.995900] (1:node@c-0.me)  32810  |  42 
+> [ 409.995900] (1:node@c-0.me)  65578  |  42 
+> [ 409.995900] (1:node@c-0.me)  131114  |  42 
+> [ 409.995900] (1:node@c-0.me)  262186  |  42 
+> [ 409.995900] (1:node@c-0.me)  524330  |  42 
+> [ 409.995900] (1:node@c-0.me)  1048618  |  42 
+> [ 409.995900] (1:node@c-0.me)  2097194  |  42 
+> [ 409.995900] (1:node@c-0.me)  4194346  |  42 
+> [ 409.995900] (1:node@c-0.me)  8388650  |  42 
+> [ 409.995900] (1:node@c-0.me) Predecessor: 16728096
+> [ 413.995800] (5:node@c-4.me) My finger table:
+> [ 413.995800] (5:node@c-4.me) Start | Succ 
+> [ 413.995800] (5:node@c-4.me)  16509406  | 16728096 
+> [ 413.995800] (5:node@c-4.me)  16509407  |  42 
+> [ 413.995800] (5:node@c-4.me)  16509409  | 16728096 
+> [ 413.995800] (5:node@c-4.me)  16509413  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16509421  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16509437  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16509469  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16509533  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16509661  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16509917  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16510429  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16511453  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16513501  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16517597  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16525789  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16542173  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16574941  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16640477  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16771549  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  256477  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  780765  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  1829341  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  3926493  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  8120797  | 16509405 
+> [ 413.995800] (5:node@c-4.me) Predecessor: 10004760
+> [ 428.995800] (3:node@c-2.me) My finger table:
+> [ 428.995800] (3:node@c-2.me) Start | Succ 
+> [ 428.995800] (3:node@c-2.me)  533745  | 1319738 
+> [ 428.995800] (3:node@c-2.me)  533746  | 10004760 
+> [ 428.995800] (3:node@c-2.me)  533748  | 1319738 
+> [ 428.995800] (3:node@c-2.me)  533752  | 533744 
+> [ 428.995800] (3:node@c-2.me)  533760  | 533744 
+> [ 428.995800] (3:node@c-2.me)  533776  | 533744 
+> [ 428.995800] (3:node@c-2.me)  533808  | 533744 
+> [ 428.995800] (3:node@c-2.me)  533872  | 533744 
+> [ 428.995800] (3:node@c-2.me)  534000  | 533744 
+> [ 428.995800] (3:node@c-2.me)  534256  | 533744 
+> [ 428.995800] (3:node@c-2.me)  534768  | 533744 
+> [ 428.995800] (3:node@c-2.me)  535792  | 533744 
+> [ 428.995800] (3:node@c-2.me)  537840  | 533744 
+> [ 428.995800] (3:node@c-2.me)  541936  | 533744 
+> [ 428.995800] (3:node@c-2.me)  550128  | 533744 
+> [ 428.995800] (3:node@c-2.me)  566512  | 533744 
+> [ 428.995800] (3:node@c-2.me)  599280  | 533744 
+> [ 428.995800] (3:node@c-2.me)  664816  | 533744 
+> [ 428.995800] (3:node@c-2.me)  795888  | 533744 
+> [ 428.995800] (3:node@c-2.me)  1058032  | 533744 
+> [ 428.995800] (3:node@c-2.me)  1582320  | 533744 
+> [ 428.995800] (3:node@c-2.me)  2630896  | 533744 
+> [ 428.995800] (3:node@c-2.me)  4728048  | 533744 
+> [ 428.995800] (3:node@c-2.me)  8922352  | 533744 
+> [ 428.995800] (3:node@c-2.me) Predecessor: 366680
+> [ 494.995500] (7:node@c-6.me) My finger table:
+> [ 494.995500] (7:node@c-6.me) Start | Succ 
+> [ 494.995500] (7:node@c-6.me)  16728097  |  42 
+> [ 494.995500] (7:node@c-6.me)  16728098  | 1319738 
+> [ 494.995500] (7:node@c-6.me)  16728100  |  42 
+> [ 494.995500] (7:node@c-6.me)  16728104  |  42 
+> [ 494.995500] (7:node@c-6.me)  16728112  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16728128  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16728160  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16728224  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16728352  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16728608  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16729120  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16730144  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16732192  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16736288  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16744480  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16760864  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16416  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  81952  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  213024  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  475168  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  999456  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  2048032  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  4145184  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  8339488  | 16728096 
+> [ 494.995500] (7:node@c-6.me) Predecessor: 16509405
+> [ 499.995500] (10:node@c-9.me) My finger table:
+> [ 499.995500] (10:node@c-9.me) Start | Succ 
+> [ 499.995500] (10:node@c-9.me)  2015254  | 10004760 
+> [ 499.995500] (10:node@c-9.me)  2015255  | 16728096 
+> [ 499.995500] (10:node@c-9.me)  2015257  | 16728096 
+> [ 499.995500] (10:node@c-9.me)  2015261  | 10004760 
+> [ 499.995500] (10:node@c-9.me)  2015269  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2015285  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2015317  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2015381  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2015509  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2015765  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2016277  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2017301  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2019349  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2023445  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2031637  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2048021  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2080789  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2146325  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2277397  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2539541  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  3063829  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  4112405  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  6209557  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  10403861  | 2015253 
+> [ 499.995500] (10:node@c-9.me) Predecessor: -1
+> [ 501.995400] (6:node@c-5.me) My finger table:
+> [ 501.995400] (6:node@c-5.me) Start | Succ 
+> [ 501.995400] (6:node@c-5.me)  10874877  |  42 
+> [ 501.995400] (6:node@c-5.me)  10874878  | 533744 
+> [ 501.995400] (6:node@c-5.me)  10874880  | 533744 
+> [ 501.995400] (6:node@c-5.me)  10874884  |  42 
+> [ 501.995400] (6:node@c-5.me)  10874892  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10874908  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10874940  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10875004  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10875132  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10875388  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10875900  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10876924  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10878972  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10883068  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10891260  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10907644  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10940412  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  11005948  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  11137020  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  11399164  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  11923452  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  12972028  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  15069180  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  2486268  | 10874876 
+> [ 501.995400] (6:node@c-5.me) Predecessor: -1
+> [ 523.995200] (8:node@c-7.me) My finger table:
+> [ 523.995200] (8:node@c-7.me) Start | Succ 
+> [ 523.995200] (8:node@c-7.me)  10004761  | 16509405 
+> [ 523.995200] (8:node@c-7.me)  10004762  | 16509405 
+> [ 523.995200] (8:node@c-7.me)  10004764  | 16509405 
+> [ 523.995200] (8:node@c-7.me)  10004768  | 16509405 
+> [ 523.995200] (8:node@c-7.me)  10004776  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10004792  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10004824  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10004888  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10005016  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10005272  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10005784  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10006808  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10008856  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10012952  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10021144  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10037528  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10070296  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10135832  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10266904  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10529048  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  11053336  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  12101912  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  14199064  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  1616152  | 10004760 
+> [ 523.995200] (8:node@c-7.me) Predecessor: 6518808
+> [ 532.995100] (3:node@c-2.me) My finger table:
+> [ 532.995100] (3:node@c-2.me) Start | Succ 
+> [ 532.995100] (3:node@c-2.me)  533745  | 1319738 
+> [ 532.995100] (3:node@c-2.me)  533746  | 10004760 
+> [ 532.995100] (3:node@c-2.me)  533748  | 1319738 
+> [ 532.995100] (3:node@c-2.me)  533752  | 1319738 
+> [ 532.995100] (3:node@c-2.me)  533760  | 533744 
+> [ 532.995100] (3:node@c-2.me)  533776  | 533744 
+> [ 532.995100] (3:node@c-2.me)  533808  | 533744 
+> [ 532.995100] (3:node@c-2.me)  533872  | 533744 
+> [ 532.995100] (3:node@c-2.me)  534000  | 533744 
+> [ 532.995100] (3:node@c-2.me)  534256  | 533744 
+> [ 532.995100] (3:node@c-2.me)  534768  | 533744 
+> [ 532.995100] (3:node@c-2.me)  535792  | 533744 
+> [ 532.995100] (3:node@c-2.me)  537840  | 533744 
+> [ 532.995100] (3:node@c-2.me)  541936  | 533744 
+> [ 532.995100] (3:node@c-2.me)  550128  | 533744 
+> [ 532.995100] (3:node@c-2.me)  566512  | 533744 
+> [ 532.995100] (3:node@c-2.me)  599280  | 533744 
+> [ 532.995100] (3:node@c-2.me)  664816  | 533744 
+> [ 532.995100] (3:node@c-2.me)  795888  | 533744 
+> [ 532.995100] (3:node@c-2.me)  1058032  | 533744 
+> [ 532.995100] (3:node@c-2.me)  1582320  | 533744 
+> [ 532.995100] (3:node@c-2.me)  2630896  | 533744 
+> [ 532.995100] (3:node@c-2.me)  4728048  | 533744 
+> [ 532.995100] (3:node@c-2.me)  8922352  | 533744 
+> [ 532.995100] (3:node@c-2.me) Predecessor: 366680
+> [ 534.995100] (4:node@c-3.me) My finger table:
+> [ 534.995100] (9:node@c-8.me) My finger table:
+> [ 534.995100] (4:node@c-3.me) Start | Succ 
+> [ 534.995100] (9:node@c-8.me) Start | Succ 
+> [ 534.995100] (4:node@c-3.me)  1319739  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  6518809  | 10004760 
+> [ 534.995100] (4:node@c-3.me)  1319740  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  6518810  | 10004760 
+> [ 534.995100] (4:node@c-3.me)  1319742  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  6518812  | 10004760 
+> [ 534.995100] (4:node@c-3.me)  1319746  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  6518816  | 10004760 
+> [ 534.995100] (4:node@c-3.me)  1319754  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6518824  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1319770  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6518840  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  6518872  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1319802  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6518936  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1319866  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6519064  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1319994  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6519320  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1320250  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6519832  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1320762  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6520856  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1321786  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6522904  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1323834  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6527000  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1327930  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6535192  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1336122  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6551576  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1352506  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6584344  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1385274  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6649880  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1450810  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6780952  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1581882  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  7043096  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1844026  | 1319738 
+> [ 534.995100] (4:node@c-3.me)  2368314  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  7567384  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  3416890  | 1319738 
+> [ 534.995100] (4:node@c-3.me)  5514042  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  8615960  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  9708346  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  10713112  | 6518808 
+> [ 534.995100] (4:node@c-3.me) Predecessor: 533744
+> [ 534.995100] (9:node@c-8.me)  14907416  | 6518808 
+> [ 534.995100] (9:node@c-8.me) Predecessor: 1319738
+> [ 535.995000] (5:node@c-4.me) My finger table:
+> [ 535.995000] (5:node@c-4.me) Start | Succ 
+> [ 535.995000] (5:node@c-4.me)  16509406  | 16728096 
+> [ 535.995000] (5:node@c-4.me)  16509407  |  42 
+> [ 535.995000] (5:node@c-4.me)  16509409  | 16728096 
+> [ 535.995000] (5:node@c-4.me)  16509413  | 16728096 
+> [ 535.995000] (5:node@c-4.me)  16509421  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16509437  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16509469  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16509533  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16509661  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16509917  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16510429  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16511453  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16513501  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16517597  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16525789  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16542173  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16574941  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16640477  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16771549  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  256477  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  780765  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  1829341  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  3926493  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  8120797  | 16509405 
+> [ 535.995000] (5:node@c-4.me) Predecessor: 10004760
+> [ 550.994900] (1:node@c-0.me) My finger table:
+> [ 550.994900] (1:node@c-0.me) Start | Succ 
+> [ 550.994900] (1:node@c-0.me)   43  | 366680 
+> [ 550.994900] (1:node@c-0.me)   44  | 366680 
+> [ 550.994900] (1:node@c-0.me)   46  | 366680 
+> [ 550.994900] (1:node@c-0.me)   50  | 366680 
+> [ 550.994900] (1:node@c-0.me)   58  |  42 
+> [ 550.994900] (1:node@c-0.me)   74  |  42 
+> [ 550.994900] (1:node@c-0.me)  106  |  42 
+> [ 550.994900] (1:node@c-0.me)  170  |  42 
+> [ 550.994900] (1:node@c-0.me)  298  |  42 
+> [ 550.994900] (1:node@c-0.me)  554  |  42 
+> [ 550.994900] (1:node@c-0.me)  1066  |  42 
+> [ 550.994900] (1:node@c-0.me)  2090  |  42 
+> [ 550.994900] (1:node@c-0.me)  4138  |  42 
+> [ 550.994900] (1:node@c-0.me)  8234  |  42 
+> [ 550.994900] (1:node@c-0.me)  16426  |  42 
+> [ 550.994900] (1:node@c-0.me)  32810  |  42 
+> [ 550.994900] (1:node@c-0.me)  65578  |  42 
+> [ 550.994900] (1:node@c-0.me)  131114  |  42 
+> [ 550.994900] (1:node@c-0.me)  262186  |  42 
+> [ 550.994900] (1:node@c-0.me)  524330  |  42 
+> [ 550.994900] (1:node@c-0.me)  1048618  |  42 
+> [ 550.994900] (1:node@c-0.me)  2097194  |  42 
+> [ 550.994900] (1:node@c-0.me)  4194346  |  42 
+> [ 550.994900] (1:node@c-0.me)  8388650  |  42 
+> [ 550.994900] (1:node@c-0.me) Predecessor: 16728096
+> [ 572.994600] (9:node@c-8.me) My finger table:
+> [ 572.994600] (9:node@c-8.me) Start | Succ 
+> [ 572.994600] (9:node@c-8.me)  6518809  | 10004760 
+> [ 572.994600] (9:node@c-8.me)  6518810  | 10004760 
+> [ 572.994600] (9:node@c-8.me)  6518812  | 10004760 
+> [ 572.994600] (9:node@c-8.me)  6518816  | 10004760 
+> [ 572.994600] (9:node@c-8.me)  6518824  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6518840  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6518872  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6518936  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6519064  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6519320  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6519832  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6520856  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6522904  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6527000  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6535192  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6551576  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6584344  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6649880  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6780952  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  7043096  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  7567384  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  8615960  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  10713112  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  14907416  | 6518808 
+> [ 572.994600] (9:node@c-8.me) Predecessor: 2015253
+> [ 589.994400] (5:node@c-4.me) My finger table:
+> [ 589.994400] (5:node@c-4.me) Start | Succ 
+> [ 589.994400] (5:node@c-4.me)  16509406  | 16728096 
+> [ 589.994400] (5:node@c-4.me)  16509407  |  42 
+> [ 589.994400] (5:node@c-4.me)  16509409  | 16728096 
+> [ 589.994400] (5:node@c-4.me)  16509413  | 16728096 
+> [ 589.994400] (5:node@c-4.me)  16509421  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16509437  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16509469  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16509533  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16509661  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16509917  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16510429  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16511453  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16513501  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16517597  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16525789  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16542173  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16574941  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16640477  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16771549  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  256477  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  780765  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  1829341  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  3926493  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  8120797  | 16509405 
+> [ 589.994400] (5:node@c-4.me) Predecessor: 10874876
+> [ 622.994100] (10:node@c-9.me) My finger table:
+> [ 622.994100] (10:node@c-9.me) Start | Succ 
+> [ 622.994100] (10:node@c-9.me)  2015254  | 6518808 
+> [ 622.994100] (10:node@c-9.me)  2015255  | 16728096 
+> [ 622.994100] (10:node@c-9.me)  2015257  | 16728096 
+> [ 622.994100] (10:node@c-9.me)  2015261  | 10004760 
+> [ 622.994100] (10:node@c-9.me)  2015269  | 6518808 
+> [ 622.994100] (10:node@c-9.me)  2015285  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2015317  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2015381  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2015509  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2015765  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2016277  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2017301  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2019349  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2023445  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2031637  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2048021  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2080789  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2146325  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2277397  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2539541  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  3063829  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  4112405  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  6209557  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  10403861  | 2015253 
+> [ 622.994100] (10:node@c-9.me) Predecessor: -1
+> [ 624.994100] (7:node@c-6.me) My finger table:
+> [ 624.994100] (7:node@c-6.me) Start | Succ 
+> [ 624.994100] (7:node@c-6.me)  16728097  |  42 
+> [ 624.994100] (7:node@c-6.me)  16728098  | 1319738 
+> [ 624.994100] (7:node@c-6.me)  16728100  |  42 
+> [ 624.994100] (7:node@c-6.me)  16728104  |  42 
+> [ 624.994100] (7:node@c-6.me)  16728112  |  42 
+> [ 624.994100] (7:node@c-6.me)  16728128  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16728160  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16728224  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16728352  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16728608  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16729120  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16730144  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16732192  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16736288  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16744480  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16760864  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16416  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  81952  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  213024  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  475168  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  999456  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  2048032  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  4145184  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  8339488  | 16728096 
+> [ 624.994100] (7:node@c-6.me) Predecessor: 16509405
+> [ 632.993900] (10:node@c-9.me) My finger table:
+> [ 632.993900] (10:node@c-9.me) Start | Succ 
+> [ 632.993900] (10:node@c-9.me)  2015254  | 6518808 
+> [ 632.993900] (10:node@c-9.me)  2015255  | 16728096 
+> [ 632.993900] (10:node@c-9.me)  2015257  | 16728096 
+> [ 632.993900] (10:node@c-9.me)  2015261  | 10004760 
+> [ 632.993900] (10:node@c-9.me)  2015269  | 6518808 
+> [ 632.993900] (10:node@c-9.me)  2015285  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2015317  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2015381  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2015509  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2015765  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2016277  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2017301  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2019349  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2023445  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2031637  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2048021  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2080789  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2146325  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2277397  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2539541  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  3063829  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  4112405  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  6209557  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  10403861  | 2015253 
+> [ 632.993900] (10:node@c-9.me) Predecessor: 1319738
+> [ 639.993900] (6:node@c-5.me) My finger table:
+> [ 639.993900] (6:node@c-5.me) Start | Succ 
+> [ 639.993900] (6:node@c-5.me)  10874877  | 16509405 
+> [ 639.993900] (6:node@c-5.me)  10874878  | 533744 
+> [ 639.993900] (6:node@c-5.me)  10874880  | 533744 
+> [ 639.993900] (6:node@c-5.me)  10874884  |  42 
+> [ 639.993900] (6:node@c-5.me)  10874892  | 16509405 
+> [ 639.993900] (6:node@c-5.me)  10874908  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10874940  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10875004  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10875132  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10875388  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10875900  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10876924  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10878972  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10883068  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10891260  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10907644  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10940412  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  11005948  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  11137020  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  11399164  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  11923452  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  12972028  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  15069180  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  2486268  | 10874876 
+> [ 639.993900] (6:node@c-5.me) Predecessor: -1
+> [ 650.993800] (8:node@c-7.me) My finger table:
+> [ 650.993800] (8:node@c-7.me) Start | Succ 
+> [ 650.993800] (8:node@c-7.me)  10004761  | 10874876 
+> [ 650.993800] (8:node@c-7.me)  10004762  | 16509405 
+> [ 650.993800] (8:node@c-7.me)  10004764  | 16509405 
+> [ 650.993800] (8:node@c-7.me)  10004768  | 16509405 
+> [ 650.993800] (8:node@c-7.me)  10004776  | 10874876 
+> [ 650.993800] (8:node@c-7.me)  10004792  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10004824  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10004888  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10005016  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10005272  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10005784  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10006808  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10008856  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10012952  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10021144  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10037528  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10070296  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10135832  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10266904  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10529048  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  11053336  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  12101912  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  14199064  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  1616152  | 10004760 
+> [ 650.993800] (8:node@c-7.me) Predecessor: 6518808
+> [ 651.993800] (6:node@c-5.me) My finger table:
+> [ 651.993800] (6:node@c-5.me) Start | Succ 
+> [ 651.993800] (6:node@c-5.me)  10874877  | 16509405 
+> [ 651.993800] (6:node@c-5.me)  10874878  | 533744 
+> [ 651.993800] (6:node@c-5.me)  10874880  | 533744 
+> [ 651.993800] (6:node@c-5.me)  10874884  |  42 
+> [ 651.993800] (6:node@c-5.me)  10874892  | 16509405 
+> [ 651.993800] (6:node@c-5.me)  10874908  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10874940  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10875004  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10875132  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10875388  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10875900  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10876924  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10878972  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10883068  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10891260  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10907644  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10940412  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  11005948  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  11137020  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  11399164  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  11923452  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  12972028  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  15069180  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  2486268  | 10874876 
+> [ 651.993800] (6:node@c-5.me) Predecessor: 10004760
+> [ 655.993700] (3:node@c-2.me) My finger table:
+> [ 655.993700] (3:node@c-2.me) Start | Succ 
+> [ 655.993700] (3:node@c-2.me)  533745  | 1319738 
+> [ 655.993700] (3:node@c-2.me)  533746  | 10004760 
+> [ 655.993700] (3:node@c-2.me)  533748  | 1319738 
+> [ 655.993700] (3:node@c-2.me)  533752  | 1319738 
+> [ 655.993700] (3:node@c-2.me)  533760  | 1319738 
+> [ 655.993700] (3:node@c-2.me)  533776  | 533744 
+> [ 655.993700] (3:node@c-2.me)  533808  | 533744 
+> [ 655.993700] (3:node@c-2.me)  533872  | 533744 
+> [ 655.993700] (3:node@c-2.me)  534000  | 533744 
+> [ 655.993700] (3:node@c-2.me)  534256  | 533744 
+> [ 655.993700] (3:node@c-2.me)  534768  | 533744 
+> [ 655.993700] (3:node@c-2.me)  535792  | 533744 
+> [ 655.993700] (3:node@c-2.me)  537840  | 533744 
+> [ 655.993700] (3:node@c-2.me)  541936  | 533744 
+> [ 655.993700] (3:node@c-2.me)  550128  | 533744 
+> [ 655.993700] (3:node@c-2.me)  566512  | 533744 
+> [ 655.993700] (3:node@c-2.me)  599280  | 533744 
+> [ 655.993700] (3:node@c-2.me)  664816  | 533744 
+> [ 655.993700] (3:node@c-2.me)  795888  | 533744 
+> [ 655.993700] (3:node@c-2.me)  1058032  | 533744 
+> [ 655.993700] (3:node@c-2.me)  1582320  | 533744 
+> [ 655.993700] (3:node@c-2.me)  2630896  | 533744 
+> [ 655.993700] (3:node@c-2.me)  4728048  | 533744 
+> [ 655.993700] (3:node@c-2.me)  8922352  | 533744 
+> [ 655.993700] (3:node@c-2.me) Predecessor: 366680
+> [ 657.993700] (4:node@c-3.me) My finger table:
+> [ 657.993700] (4:node@c-3.me) Start | Succ 
+> [ 657.993700] (4:node@c-3.me)  1319739  | 2015253 
+> [ 657.993700] (4:node@c-3.me)  1319740  | 6518808 
+> [ 657.993700] (4:node@c-3.me)  1319742  | 6518808 
+> [ 657.993700] (4:node@c-3.me)  1319746  | 6518808 
+> [ 657.993700] (4:node@c-3.me)  1319754  | 2015253 
+> [ 657.993700] (4:node@c-3.me)  1319770  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1319802  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1319866  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1319994  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1320250  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1320762  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1321786  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1323834  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1327930  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1336122  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1352506  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1385274  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1450810  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1581882  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1844026  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  2368314  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  3416890  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  5514042  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  9708346  | 1319738 
+> [ 657.993700] (4:node@c-3.me) Predecessor: 533744
+> [ 661.993600] (9:node@c-8.me) My finger table:
+> [ 661.993600] (9:node@c-8.me) Start | Succ 
+> [ 661.993600] (9:node@c-8.me)  6518809  | 10004760 
+> [ 661.993600] (9:node@c-8.me)  6518810  | 10004760 
+> [ 661.993600] (9:node@c-8.me)  6518812  | 10004760 
+> [ 661.993600] (9:node@c-8.me)  6518816  | 10004760 
+> [ 661.993600] (9:node@c-8.me)  6518824  | 10004760 
+> [ 661.993600] (9:node@c-8.me)  6518840  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6518872  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6518936  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6519064  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6519320  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6519832  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6520856  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6522904  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6527000  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6535192  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6551576  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6584344  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6649880  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6780952  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  7043096  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  7567384  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  8615960  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  10713112  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  14907416  | 6518808 
+> [ 661.993600] (9:node@c-8.me) Predecessor: 2015253
+> [ 663.993600] (5:node@c-4.me) My finger table:
+> [ 663.993600] (5:node@c-4.me) Start | Succ 
+> [ 663.993600] (5:node@c-4.me)  16509406  | 16728096 
+> [ 663.993600] (5:node@c-4.me)  16509407  |  42 
+> [ 663.993600] (5:node@c-4.me)  16509409  | 16728096 
+> [ 663.993600] (5:node@c-4.me)  16509413  | 16728096 
+> [ 663.993600] (5:node@c-4.me)  16509421  | 16728096 
+> [ 663.993600] (5:node@c-4.me)  16509437  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16509469  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16509533  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16509661  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16509917  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16510429  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16511453  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16513501  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16517597  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16525789  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16542173  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16574941  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16640477  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16771549  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  256477  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  780765  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  1829341  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  3926493  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  8120797  | 16509405 
+> [ 663.993600] (5:node@c-4.me) Predecessor: 10874876
+> [ 744.993200] (10:node@c-9.me) My finger table:
+> [ 744.993200] (10:node@c-9.me) Start | Succ 
+> [ 744.993200] (10:node@c-9.me)  2015254  | 6518808 
+> [ 744.993200] (10:node@c-9.me)  2015255  | 16728096 
+> [ 744.993200] (10:node@c-9.me)  2015257  | 16728096 
+> [ 744.993200] (10:node@c-9.me)  2015261  | 10004760 
+> [ 744.993200] (10:node@c-9.me)  2015269  | 6518808 
+> [ 744.993200] (10:node@c-9.me)  2015285  | 6518808 
+> [ 744.993200] (10:node@c-9.me)  2015317  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2015381  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2015509  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2015765  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2016277  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2017301  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2019349  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2023445  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2031637  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2048021  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2080789  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2146325  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2277397  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2539541  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  3063829  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  4112405  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  6209557  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  10403861  | 2015253 
+> [ 744.993200] (10:node@c-9.me) Predecessor: 1319738
+> [ 748.993100] (2:node@c-1.me) My finger table:
+> [ 748.993100] (2:node@c-1.me) Start | Succ 
+> [ 748.993100] (2:node@c-1.me)  366681  | 533744 
+> [ 748.993100] (2:node@c-1.me)  366682  | 1319738 
+> [ 748.993100] (2:node@c-1.me)  366684  | 533744 
+> [ 748.993100] (2:node@c-1.me)  366688  | 533744 
+> [ 748.993100] (2:node@c-1.me)  366696  | 366680 
+> [ 748.993100] (2:node@c-1.me)  366712  | 366680 
+> [ 748.993100] (2:node@c-1.me)  366744  | 366680 
+> [ 748.993100] (2:node@c-1.me)  366808  | 366680 
+> [ 748.993100] (2:node@c-1.me)  366936  | 366680 
+> [ 748.993100] (2:node@c-1.me)  367192  | 366680 
+> [ 748.993100] (2:node@c-1.me)  367704  | 366680 
+> [ 748.993100] (2:node@c-1.me)  368728  | 366680 
+> [ 748.993100] (2:node@c-1.me)  370776  | 366680 
+> [ 748.993100] (2:node@c-1.me)  374872  | 366680 
+> [ 748.993100] (2:node@c-1.me)  383064  | 366680 
+> [ 748.993100] (2:node@c-1.me)  399448  | 366680 
+> [ 748.993100] (2:node@c-1.me)  432216  | 366680 
+> [ 748.993100] (2:node@c-1.me)  497752  | 366680 
+> [ 748.993100] (2:node@c-1.me)  628824  | 366680 
+> [ 748.993100] (2:node@c-1.me)  890968  | 366680 
+> [ 748.993100] (2:node@c-1.me)  1415256  | 366680 
+> [ 748.993100] (2:node@c-1.me)  2463832  | 366680 
+> [ 748.993100] (2:node@c-1.me)  4560984  | 366680 
+> [ 748.993100] (2:node@c-1.me)  8755288  | 366680 
+> [ 748.993100] (2:node@c-1.me) Predecessor: 42
+> [ 748.993100] (7:node@c-6.me) My finger table:
+> [ 748.993100] (7:node@c-6.me) Start | Succ 
+> [ 748.993100] (7:node@c-6.me)  16728097  |  42 
+> [ 748.993100] (7:node@c-6.me)  16728098  | 1319738 
+> [ 748.993100] (7:node@c-6.me)  16728100  |  42 
+> [ 748.993100] (7:node@c-6.me)  16728104  |  42 
+> [ 748.993100] (7:node@c-6.me)  16728112  |  42 
+> [ 748.993100] (7:node@c-6.me)  16728128  |  42 
+> [ 748.993100] (7:node@c-6.me)  16728160  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16728224  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16728352  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16728608  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16729120  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16730144  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16732192  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16736288  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16744480  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16760864  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16416  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  81952  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  213024  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  475168  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  999456  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  2048032  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  4145184  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  8339488  | 16728096 
+> [ 748.993100] (7:node@c-6.me) Predecessor: 16509405
+> [ 768.992700] (6:node@c-5.me) My finger table:
+> [ 768.992700] (6:node@c-5.me) Start | Succ 
+> [ 768.992700] (6:node@c-5.me)  10874877  | 16509405 
+> [ 768.992700] (6:node@c-5.me)  10874878  | 533744 
+> [ 768.992700] (6:node@c-5.me)  10874880  | 533744 
+> [ 768.992700] (6:node@c-5.me)  10874884  |  42 
+> [ 768.992700] (6:node@c-5.me)  10874892  | 16509405 
+> [ 768.992700] (6:node@c-5.me)  10874908  | 16509405 
+> [ 768.992700] (6:node@c-5.me)  10874940  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10875004  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10875132  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10875388  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10875900  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10876924  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10878972  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10883068  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10891260  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10907644  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10940412  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  11005948  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  11137020  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  11399164  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  11923452  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  12972028  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  15069180  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  2486268  | 10874876 
+> [ 768.992700] (6:node@c-5.me) Predecessor: 10004760
+> [ 781.992700] (3:node@c-2.me) My finger table:
+> [ 781.992700] (8:node@c-7.me) My finger table:
+> [ 781.992700] (3:node@c-2.me) Start | Succ 
+> [ 781.992700] (8:node@c-7.me) Start | Succ 
+> [ 781.992700] (3:node@c-2.me)  533745  | 1319738 
+> [ 781.992700] (8:node@c-7.me)  10004761  | 10874876 
+> [ 781.992700] (8:node@c-7.me)  10004762  | 16509405 
+> [ 781.992700] (3:node@c-2.me)  533746  | 10004760 
+> [ 781.992700] (8:node@c-7.me)  10004764  | 16509405 
+> [ 781.992700] (3:node@c-2.me)  533748  | 1319738 
+> [ 781.992700] (8:node@c-7.me)  10004768  | 16509405 
+> [ 781.992700] (3:node@c-2.me)  533752  | 1319738 
+> [ 781.992700] (8:node@c-7.me)  10004776  | 10874876 
+> [ 781.992700] (3:node@c-2.me)  533760  | 1319738 
+> [ 781.992700] (8:node@c-7.me)  10004792  | 10874876 
+> [ 781.992700] (3:node@c-2.me)  533776  | 1319738 
+> [ 781.992700] (8:node@c-7.me)  10004824  | 10004760 
+> [ 781.992700] (8:node@c-7.me)  10004888  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  533808  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10005016  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  533872  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10005272  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  534000  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10005784  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  534256  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10006808  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  534768  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10008856  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  535792  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10012952  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  537840  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10021144  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  541936  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10037528  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  550128  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10070296  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  566512  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10135832  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  599280  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10266904  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  664816  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10529048  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  795888  | 533744 
+> [ 781.992700] (8:node@c-7.me)  11053336  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  1058032  | 533744 
+> [ 781.992700] (8:node@c-7.me)  12101912  | 10004760 
+> [ 781.992700] (8:node@c-7.me)  14199064  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  1582320  | 533744 
+> [ 781.992700] (8:node@c-7.me)  1616152  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  2630896  | 533744 
+> [ 781.992700] (8:node@c-7.me) Predecessor: 6518808
+> [ 781.992700] (3:node@c-2.me)  4728048  | 533744 
+> [ 781.992700] (3:node@c-2.me)  8922352  | 533744 
+> [ 781.992700] (3:node@c-2.me) Predecessor: 366680
+> [ 786.992400] (5:node@c-4.me) My finger table:
+> [ 786.992400] (5:node@c-4.me) Start | Succ 
+> [ 786.992400] (5:node@c-4.me)  16509406  | 16728096 
+> [ 786.992400] (5:node@c-4.me)  16509407  |  42 
+> [ 786.992400] (5:node@c-4.me)  16509409  | 16728096 
+> [ 786.992400] (5:node@c-4.me)  16509413  | 16728096 
+> [ 786.992400] (5:node@c-4.me)  16509421  | 16728096 
+> [ 786.992400] (5:node@c-4.me)  16509437  | 16728096 
+> [ 786.992400] (5:node@c-4.me)  16509469  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16509533  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16509661  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16509917  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16510429  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16511453  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16513501  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16517597  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16525789  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16542173  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16574941  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16640477  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16771549  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  256477  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  780765  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  1829341  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  3926493  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  8120797  | 16509405 
+> [ 786.992400] (5:node@c-4.me) Predecessor: 10874876
+> [ 786.992600] (9:node@c-8.me) My finger table:
+> [ 786.992600] (9:node@c-8.me) Start | Succ 
+> [ 786.992600] (9:node@c-8.me)  6518809  | 10004760 
+> [ 786.992600] (9:node@c-8.me)  6518810  | 10004760 
+> [ 786.992600] (9:node@c-8.me)  6518812  | 10004760 
+> [ 786.992600] (9:node@c-8.me)  6518816  | 10004760 
+> [ 786.992600] (9:node@c-8.me)  6518824  | 10004760 
+> [ 786.992600] (9:node@c-8.me)  6518840  | 10004760 
+> [ 786.992600] (9:node@c-8.me)  6518872  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6518936  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6519064  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6519320  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6519832  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6520856  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6522904  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6527000  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6535192  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6551576  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6584344  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6649880  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6780952  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  7043096  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  7567384  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  8615960  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  10713112  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  14907416  | 6518808 
+> [ 786.992600] (9:node@c-8.me) Predecessor: 2015253
+> [ 795.992400] (4:node@c-3.me) My finger table:
+> [ 795.992400] (4:node@c-3.me) Start | Succ 
+> [ 795.992400] (4:node@c-3.me)  1319739  | 2015253 
+> [ 795.992400] (4:node@c-3.me)  1319740  | 6518808 
+> [ 795.992400] (4:node@c-3.me)  1319742  | 6518808 
+> [ 795.992400] (4:node@c-3.me)  1319746  | 6518808 
+> [ 795.992400] (4:node@c-3.me)  1319754  | 2015253 
+> [ 795.992400] (4:node@c-3.me)  1319770  | 2015253 
+> [ 795.992400] (4:node@c-3.me)  1319802  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1319866  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1319994  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1320250  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1320762  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1321786  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1323834  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1327930  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1336122  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1352506  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1385274  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1450810  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1581882  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1844026  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  2368314  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  3416890  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  5514042  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  9708346  | 1319738 
+> [ 795.992400] (4:node@c-3.me) Predecessor: 533744
+> [ 873.991200] (10:node@c-9.me) My finger table:
+> [ 873.991200] (10:node@c-9.me) Start | Succ 
+> [ 873.991200] (10:node@c-9.me)  2015254  | 6518808 
+> [ 873.991200] (10:node@c-9.me)  2015255  | 16728096 
+> [ 873.991200] (10:node@c-9.me)  2015257  | 16728096 
+> [ 873.991200] (10:node@c-9.me)  2015261  | 10004760 
+> [ 873.991200] (10:node@c-9.me)  2015269  | 6518808 
+> [ 873.991200] (10:node@c-9.me)  2015285  | 6518808 
+> [ 873.991200] (10:node@c-9.me)  2015317  | 6518808 
+> [ 873.991200] (10:node@c-9.me)  2015381  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2015509  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2015765  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2016277  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2017301  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2019349  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2023445  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2031637  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2048021  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2080789  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2146325  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2277397  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2539541  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  3063829  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  4112405  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  6209557  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  10403861  | 2015253 
+> [ 873.991200] (10:node@c-9.me) Predecessor: 1319738
+> [ 873.991300] (7:node@c-6.me) My finger table:
+> [ 873.991300] (7:node@c-6.me) Start | Succ 
+> [ 873.991300] (7:node@c-6.me)  16728097  |  42 
+> [ 873.991300] (7:node@c-6.me)  16728098  | 1319738 
+> [ 873.991300] (7:node@c-6.me)  16728100  |  42 
+> [ 873.991300] (7:node@c-6.me)  16728104  |  42 
+> [ 873.991300] (7:node@c-6.me)  16728112  |  42 
+> [ 873.991300] (7:node@c-6.me)  16728128  |  42 
+> [ 873.991300] (7:node@c-6.me)  16728160  |  42 
+> [ 873.991300] (7:node@c-6.me)  16728224  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16728352  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16728608  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16729120  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16730144  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16732192  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16736288  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16744480  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16760864  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16416  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  81952  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  213024  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  475168  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  999456  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  2048032  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  4145184  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  8339488  | 16728096 
+> [ 873.991300] (7:node@c-6.me) Predecessor: 16509405
+> [ 875.991200] (2:node@c-1.me) My finger table:
+> [ 875.991200] (2:node@c-1.me) Start | Succ 
+> [ 875.991200] (2:node@c-1.me)  366681  | 533744 
+> [ 875.991200] (2:node@c-1.me)  366682  | 1319738 
+> [ 875.991200] (2:node@c-1.me)  366684  | 533744 
+> [ 875.991200] (2:node@c-1.me)  366688  | 533744 
+> [ 875.991200] (2:node@c-1.me)  366696  | 533744 
+> [ 875.991200] (2:node@c-1.me)  366712  | 366680 
+> [ 875.991200] (2:node@c-1.me)  366744  | 366680 
+> [ 875.991200] (2:node@c-1.me)  366808  | 366680 
+> [ 875.991200] (2:node@c-1.me)  366936  | 366680 
+> [ 875.991200] (2:node@c-1.me)  367192  | 366680 
+> [ 875.991200] (2:node@c-1.me)  367704  | 366680 
+> [ 875.991200] (2:node@c-1.me)  368728  | 366680 
+> [ 875.991200] (2:node@c-1.me)  370776  | 366680 
+> [ 875.991200] (2:node@c-1.me)  374872  | 366680 
+> [ 875.991200] (2:node@c-1.me)  383064  | 366680 
+> [ 875.991200] (2:node@c-1.me)  399448  | 366680 
+> [ 875.991200] (2:node@c-1.me)  432216  | 366680 
+> [ 875.991200] (2:node@c-1.me)  497752  | 366680 
+> [ 875.991200] (2:node@c-1.me)  628824  | 366680 
+> [ 875.991200] (2:node@c-1.me)  890968  | 366680 
+> [ 875.991200] (2:node@c-1.me)  1415256  | 366680 
+> [ 875.991200] (2:node@c-1.me)  2463832  | 366680 
+> [ 875.991200] (2:node@c-1.me)  4560984  | 366680 
+> [ 875.991200] (2:node@c-1.me)  8755288  | 366680 
+> [ 875.991200] (2:node@c-1.me) Predecessor: 42
+> [ 893.990900] (6:node@c-5.me) My finger table:
+> [ 893.990900] (6:node@c-5.me) Start | Succ 
+> [ 893.990900] (6:node@c-5.me)  10874877  | 16509405 
+> [ 893.990900] (6:node@c-5.me)  10874878  | 533744 
+> [ 893.990900] (6:node@c-5.me)  10874880  | 533744 
+> [ 893.990900] (6:node@c-5.me)  10874884  |  42 
+> [ 893.990900] (6:node@c-5.me)  10874892  | 16509405 
+> [ 893.990900] (6:node@c-5.me)  10874908  | 16509405 
+> [ 893.990900] (6:node@c-5.me)  10874940  | 16509405 
+> [ 893.990900] (6:node@c-5.me)  10875004  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10875132  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10875388  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10875900  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10876924  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10878972  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10883068  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10891260  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10907644  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10940412  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  11005948  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  11137020  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  11399164  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  11923452  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  12972028  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  15069180  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  2486268  | 10874876 
+> [ 893.990900] (6:node@c-5.me) Predecessor: 10004760
+> [ 905.990900] (3:node@c-2.me) My finger table:
+> [ 905.990900] (3:node@c-2.me) Start | Succ 
+> [ 905.990900] (3:node@c-2.me)  533745  | 1319738 
+> [ 905.990900] (3:node@c-2.me)  533746  | 10004760 
+> [ 905.990900] (3:node@c-2.me)  533748  | 1319738 
+> [ 905.990900] (3:node@c-2.me)  533752  | 1319738 
+> [ 905.990900] (3:node@c-2.me)  533760  | 1319738 
+> [ 905.990900] (3:node@c-2.me)  533776  | 1319738 
+> [ 905.990900] (3:node@c-2.me)  533808  | 1319738 
+> [ 905.990900] (3:node@c-2.me)  533872  | 533744 
+> [ 905.990900] (3:node@c-2.me)  534000  | 533744 
+> [ 905.990900] (3:node@c-2.me)  534256  | 533744 
+> [ 905.990900] (3:node@c-2.me)  534768  | 533744 
+> [ 905.990900] (3:node@c-2.me)  535792  | 533744 
+> [ 905.990900] (3:node@c-2.me)  537840  | 533744 
+> [ 905.990900] (3:node@c-2.me)  541936  | 533744 
+> [ 905.990900] (3:node@c-2.me)  550128  | 533744 
+> [ 905.990900] (3:node@c-2.me)  566512  | 533744 
+> [ 905.990900] (3:node@c-2.me)  599280  | 533744 
+> [ 905.990900] (3:node@c-2.me)  664816  | 533744 
+> [ 905.990900] (3:node@c-2.me)  795888  | 533744 
+> [ 905.990900] (3:node@c-2.me)  1058032  | 533744 
+> [ 905.990900] (3:node@c-2.me)  1582320  | 533744 
+> [ 905.990900] (3:node@c-2.me)  2630896  | 533744 
+> [ 905.990900] (3:node@c-2.me)  4728048  | 533744 
+> [ 905.990900] (3:node@c-2.me)  8922352  | 533744 
+> [ 905.990900] (3:node@c-2.me) Predecessor: 366680
+> [ 943.991000] (9:node@c-8.me) My finger table:
+> [ 943.991000] (9:node@c-8.me) Start | Succ 
+> [ 943.991000] (9:node@c-8.me)  6518809  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518810  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518812  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518816  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518824  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518840  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518872  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 943.991000] (9:node@c-8.me) Predecessor: 2015253
+> [ 944.990900] (8:node@c-7.me) My finger table:
+> [ 944.990900] (8:node@c-7.me) Start | Succ 
+> [ 944.990900] (8:node@c-7.me)  10004761  | 10874876 
+> [ 944.990900] (8:node@c-7.me)  10004762  | 16509405 
+> [ 944.990900] (8:node@c-7.me)  10004764  | 16509405 
+> [ 944.990900] (8:node@c-7.me)  10004768  | 16509405 
+> [ 944.990900] (8:node@c-7.me)  10004776  | 10874876 
+> [ 944.990900] (8:node@c-7.me)  10004792  | 10874876 
+> [ 944.990900] (8:node@c-7.me)  10004824  | 10874876 
+> [ 944.990900] (8:node@c-7.me)  10004888  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10005016  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10005272  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10005784  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10006808  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10008856  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10012952  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10021144  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10037528  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10070296  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10135832  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10266904  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10529048  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  11053336  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  12101912  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  14199064  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  1616152  | 10004760 
+> [ 944.990900] (8:node@c-7.me) Predecessor: 6518808
+> [ 945.990900] (5:node@c-4.me) My finger table:
+> [ 945.990900] (5:node@c-4.me) Start | Succ 
+> [ 945.990900] (5:node@c-4.me)  16509406  | 16728096 
+> [ 945.990900] (5:node@c-4.me)  16509407  |  42 
+> [ 945.990900] (5:node@c-4.me)  16509409  | 16728096 
+> [ 945.990900] (5:node@c-4.me)  16509413  | 16728096 
+> [ 945.990900] (5:node@c-4.me)  16509421  | 16728096 
+> [ 945.990900] (5:node@c-4.me)  16509437  | 16728096 
+> [ 945.990900] (5:node@c-4.me)  16509469  | 16728096 
+> [ 945.990900] (5:node@c-4.me)  16509533  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16509661  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16509917  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16510429  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16511453  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16513501  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16517597  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16525789  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16542173  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16574941  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16640477  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16771549  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  256477  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  780765  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  1829341  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  3926493  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  8120797  | 16509405 
+> [ 945.990900] (5:node@c-4.me) Predecessor: 10874876
+> [ 947.990900] (1:node@c-0.me) My finger table:
+> [ 947.990900] (1:node@c-0.me) Start | Succ 
+> [ 947.990900] (1:node@c-0.me)   43  | 366680 
+> [ 947.990900] (1:node@c-0.me)   44  | 366680 
+> [ 947.990900] (1:node@c-0.me)   46  | 366680 
+> [ 947.990900] (1:node@c-0.me)   50  | 366680 
+> [ 947.990900] (1:node@c-0.me)   58  | 366680 
+> [ 947.990900] (1:node@c-0.me)   74  |  42 
+> [ 947.990900] (1:node@c-0.me)  106  |  42 
+> [ 947.990900] (1:node@c-0.me)  170  |  42 
+> [ 947.990900] (1:node@c-0.me)  298  |  42 
+> [ 947.990900] (1:node@c-0.me)  554  |  42 
+> [ 947.990900] (1:node@c-0.me)  1066  |  42 
+> [ 947.990900] (1:node@c-0.me)  2090  |  42 
+> [ 947.990900] (1:node@c-0.me)  4138  |  42 
+> [ 947.990900] (1:node@c-0.me)  8234  |  42 
+> [ 947.990900] (1:node@c-0.me)  16426  |  42 
+> [ 947.990900] (1:node@c-0.me)  32810  |  42 
+> [ 947.990900] (1:node@c-0.me)  65578  |  42 
+> [ 947.990900] (1:node@c-0.me)  131114  |  42 
+> [ 947.990900] (1:node@c-0.me)  262186  |  42 
+> [ 947.990900] (1:node@c-0.me)  524330  |  42 
+> [ 947.990900] (1:node@c-0.me)  1048618  |  42 
+> [ 947.990900] (1:node@c-0.me)  2097194  |  42 
+> [ 947.990900] (1:node@c-0.me)  4194346  |  42 
+> [ 947.990900] (1:node@c-0.me)  8388650  |  42 
+> [ 947.990900] (1:node@c-0.me) Predecessor: 16728096
+> [ 964.990700] (4:node@c-3.me) My finger table:
+> [ 964.990700] (4:node@c-3.me) Start | Succ 
+> [ 964.990700] (4:node@c-3.me)  1319739  | 2015253 
+> [ 964.990700] (4:node@c-3.me)  1319740  | 6518808 
+> [ 964.990700] (4:node@c-3.me)  1319742  | 6518808 
+> [ 964.990700] (4:node@c-3.me)  1319746  | 6518808 
+> [ 964.990700] (4:node@c-3.me)  1319754  | 2015253 
+> [ 964.990700] (4:node@c-3.me)  1319770  | 2015253 
+> [ 964.990700] (4:node@c-3.me)  1319802  | 2015253 
+> [ 964.990700] (4:node@c-3.me)  1319866  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1319994  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1320250  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1320762  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1321786  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1323834  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1327930  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1336122  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1352506  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1385274  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1450810  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1581882  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1844026  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  2368314  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  3416890  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  5514042  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  9708346  | 1319738 
+> [ 964.990700] (4:node@c-3.me) Predecessor: 533744
+> [ 995.990200] (7:node@c-6.me) My finger table:
+> [ 995.990200] (7:node@c-6.me) Start | Succ 
+> [ 995.990200] (7:node@c-6.me)  16728097  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728098  | 1319738 
+> [ 995.990200] (7:node@c-6.me)  16728100  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728104  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728112  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728128  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728160  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728224  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728352  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16728608  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16729120  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16730144  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16732192  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16736288  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16744480  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16760864  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16416  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  81952  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  213024  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  475168  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  999456  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  2048032  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  4145184  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  8339488  | 16728096 
+> [ 995.990200] (7:node@c-6.me) Predecessor: 16509405
+> [1182.990500] (0:@) Messages created: 2324
+> [1182.990500] (0:@) Simulated time: 1182.99
index 19bc5ff..86bf7c1 100644 (file)
@@ -4,13 +4,13 @@ p> Testing the Chord implementation with MSG
 
 ! output sort
 $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platform.xml ${srcdir:=.}/chord.xml --log=msg_chord.thres:verbose "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (6:node@Jean_Yves) Joining the ring with id 14, knowing node 1
 > [  0.000000] (1:node@Gatien) Joining the ring with id 48, knowing node 1
+> [  0.000000] (4:node@Geoff) Joining the ring with id 32, knowing node 1
 > [  0.000000] (2:node@McGee) Joining the ring with id 42, knowing node 1
 > [  0.000000] (3:node@iRMX) Joining the ring with id 38, knowing node 1
-> [  0.000000] (4:node@Geoff) Joining the ring with id 32, knowing node 1
-> [  0.000000] (5:node@TeX) Joining the ring with id 21, knowing node 1
-> [  0.000000] (6:node@Jean_Yves) Joining the ring with id 14, knowing node 1
 > [  0.000000] (7:node@Boivin) Joining the ring with id 8, knowing node 1
+> [  0.000000] (5:node@TeX) Joining the ring with id 21, knowing node 1
 > [  0.000000] (8:node@Jacquelin) My finger table:
 > [  0.000000] (8:node@Jacquelin) Start | Succ 
 > [  0.000000] (8:node@Jacquelin)    2  |   1 
@@ -83,294 +83,392 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platfo
 > [ 36.048186] (7:node@Boivin)   24  |   8 
 > [ 36.048186] (7:node@Boivin)   40  |   8 
 > [ 36.048186] (7:node@Boivin) Predecessor: -1
-> [ 74.998500] (8:node@Jacquelin) My finger table:
-> [ 74.998500] (8:node@Jacquelin) Start | Succ 
-> [ 74.998500] (8:node@Jacquelin)    2  |   1 
-> [ 74.998500] (8:node@Jacquelin)    3  |   1 
-> [ 74.998500] (8:node@Jacquelin)    5  |   1 
-> [ 74.998500] (8:node@Jacquelin)    9  |   1 
-> [ 74.998500] (8:node@Jacquelin)   17  |   1 
-> [ 74.998500] (8:node@Jacquelin)   33  |   1 
-> [ 74.998500] (8:node@Jacquelin) Predecessor: 32
-> [ 75.886856] (8:node@Jacquelin) My finger table:
-> [ 75.886856] (8:node@Jacquelin) Start | Succ 
-> [ 75.886856] (8:node@Jacquelin)    2  |  32 
-> [ 75.886856] (8:node@Jacquelin)    3  |   1 
-> [ 75.886856] (8:node@Jacquelin)    5  |   1 
-> [ 75.886856] (8:node@Jacquelin)    9  |   1 
-> [ 75.886856] (8:node@Jacquelin)   17  |   1 
-> [ 75.886856] (8:node@Jacquelin)   33  |   1 
-> [ 75.886856] (8:node@Jacquelin) Predecessor: 42
-> [ 77.161304] (8:node@Jacquelin) My finger table:
-> [ 77.161304] (8:node@Jacquelin) Start | Succ 
-> [ 77.161304] (8:node@Jacquelin)    2  |  32 
-> [ 77.161304] (8:node@Jacquelin)    3  |   1 
-> [ 77.161304] (8:node@Jacquelin)    5  |   1 
-> [ 77.161304] (8:node@Jacquelin)    9  |   1 
-> [ 77.161304] (8:node@Jacquelin)   17  |   1 
-> [ 77.161304] (8:node@Jacquelin)   33  |   1 
-> [ 77.161304] (8:node@Jacquelin) Predecessor: 48
-> [102.428555] (4:node@Geoff) My finger table:
-> [102.428555] (4:node@Geoff) Start | Succ 
-> [102.428555] (4:node@Geoff)   33  |  48 
-> [102.428555] (4:node@Geoff)   34  |  32 
-> [102.428555] (4:node@Geoff)   36  |  32 
-> [102.428555] (4:node@Geoff)   40  |  32 
-> [102.428555] (4:node@Geoff)   48  |  32 
-> [102.428555] (4:node@Geoff)    0  |  32 
-> [102.428555] (4:node@Geoff) Predecessor: 1
-> [128.446154] (1:node@Gatien) My finger table:
-> [128.446154] (1:node@Gatien) Start | Succ 
-> [128.446154] (1:node@Gatien)   49  |   1 
-> [128.446154] (1:node@Gatien)   50  |  48 
-> [128.446154] (1:node@Gatien)   52  |  48 
-> [128.446154] (1:node@Gatien)   56  |  48 
-> [128.446154] (1:node@Gatien)    0  |  48 
-> [128.446154] (1:node@Gatien)   16  |  48 
-> [128.446154] (1:node@Gatien) Predecessor: 32
-> [138.445954] (1:node@Gatien) My finger table:
-> [138.445954] (1:node@Gatien) Start | Succ 
-> [138.445954] (1:node@Gatien)   49  |   1 
-> [138.445954] (1:node@Gatien)   50  |  48 
-> [138.445954] (1:node@Gatien)   52  |  48 
-> [138.445954] (1:node@Gatien)   56  |  48 
-> [138.445954] (1:node@Gatien)    0  |  48 
-> [138.445954] (1:node@Gatien)   16  |  48 
-> [138.445954] (1:node@Gatien) Predecessor: 42
-> [211.728421] (2:node@McGee) My finger table:
-> [211.728421] (2:node@McGee) Start | Succ 
-> [211.728421] (2:node@McGee)   43  |  48 
-> [211.728421] (2:node@McGee)   44  |  42 
-> [211.728421] (2:node@McGee)   46  |  42 
-> [211.728421] (2:node@McGee)   50  |  42 
-> [211.728421] (2:node@McGee)   58  |  42 
-> [211.728421] (2:node@McGee)   10  |  42 
-> [211.728421] (2:node@McGee) Predecessor: 38
-> [248.221993] (1:node@Gatien) My finger table:
-> [248.221993] (1:node@Gatien) Start | Succ 
-> [248.221993] (1:node@Gatien)   49  |   1 
-> [248.221993] (1:node@Gatien)   50  |   1 
-> [248.221993] (1:node@Gatien)   52  |  48 
-> [248.221993] (1:node@Gatien)   56  |  48 
-> [248.221993] (1:node@Gatien)    0  |  48 
-> [248.221993] (1:node@Gatien)   16  |  48 
-> [248.221993] (1:node@Gatien) Predecessor: 42
-> [251.135518] (7:node@Boivin) My finger table:
-> [251.135518] (7:node@Boivin) Start | Succ 
-> [251.135518] (7:node@Boivin)    9  |  38 
-> [251.135518] (7:node@Boivin)   10  |  38 
-> [251.135518] (7:node@Boivin)   12  |   8 
-> [251.135518] (7:node@Boivin)   16  |   8 
-> [251.135518] (7:node@Boivin)   24  |   8 
-> [251.135518] (7:node@Boivin)   40  |   8 
-> [251.135518] (7:node@Boivin) Predecessor: -1
-> [259.451693] (2:node@McGee) My finger table:
-> [259.451693] (2:node@McGee) Start | Succ 
-> [259.451693] (2:node@McGee)   43  |  48 
-> [259.451693] (2:node@McGee)   44  |  48 
-> [259.451693] (2:node@McGee)   46  |  42 
-> [259.451693] (2:node@McGee)   50  |  42 
-> [259.451693] (2:node@McGee)   58  |  42 
-> [259.451693] (2:node@McGee)   10  |  42 
-> [259.451693] (2:node@McGee) Predecessor: 38
-> [309.452319] (4:node@Geoff) My finger table:
-> [309.452319] (4:node@Geoff) Start | Succ 
-> [309.452319] (4:node@Geoff)   33  |  38 
-> [309.452319] (4:node@Geoff)   34  |  38 
-> [309.452319] (4:node@Geoff)   36  |  32 
-> [309.452319] (4:node@Geoff)   40  |  32 
-> [309.452319] (4:node@Geoff)   48  |  32 
-> [309.452319] (4:node@Geoff)    0  |  32 
-> [309.452319] (4:node@Geoff) Predecessor: 1
-> [309.457663] (8:node@Jacquelin) My finger table:
-> [309.457663] (8:node@Jacquelin) Start | Succ 
-> [309.457663] (8:node@Jacquelin)    2  |  32 
-> [309.457663] (8:node@Jacquelin)    3  |  32 
-> [309.457663] (8:node@Jacquelin)    5  |   1 
-> [309.457663] (8:node@Jacquelin)    9  |   1 
-> [309.457663] (8:node@Jacquelin)   17  |   1 
-> [309.457663] (8:node@Jacquelin)   33  |   1 
-> [309.457663] (8:node@Jacquelin) Predecessor: 48
-> [323.904249] (6:node@Jean_Yves) My finger table:
-> [323.904249] (6:node@Jean_Yves) Start | Succ 
-> [323.904249] (6:node@Jean_Yves)   15  |  38 
-> [323.904249] (6:node@Jean_Yves)   16  |  38 
-> [323.904249] (6:node@Jean_Yves)   18  |  14 
-> [323.904249] (6:node@Jean_Yves)   22  |  14 
-> [323.904249] (6:node@Jean_Yves)   30  |  14 
-> [323.904249] (6:node@Jean_Yves)   46  |  14 
-> [323.904249] (6:node@Jean_Yves) Predecessor: -1
-> [325.353251] (3:node@iRMX) My finger table:
-> [325.353251] (3:node@iRMX) Start | Succ 
-> [325.353251] (3:node@iRMX)   39  |  42 
-> [325.353251] (3:node@iRMX)   40  |  38 
-> [325.353251] (3:node@iRMX)   42  |  38 
-> [325.353251] (3:node@iRMX)   46  |  38 
-> [325.353251] (3:node@iRMX)   54  |  38 
-> [325.353251] (3:node@iRMX)    6  |  38 
-> [325.353251] (3:node@iRMX) Predecessor: 32
-> [330.576799] (3:node@iRMX) My finger table:
-> [330.576799] (3:node@iRMX) Start | Succ 
-> [330.576799] (3:node@iRMX)   39  |  42 
-> [330.576799] (3:node@iRMX)   40  |  42 
-> [330.576799] (3:node@iRMX)   42  |  38 
-> [330.576799] (3:node@iRMX)   46  |  38 
-> [330.576799] (3:node@iRMX)   54  |  38 
-> [330.576799] (3:node@iRMX)    6  |  38 
-> [330.576799] (3:node@iRMX) Predecessor: 32
-> [352.615320] (5:node@TeX) My finger table:
-> [352.615320] (5:node@TeX) Start | Succ 
-> [352.615320] (5:node@TeX)   22  |  32 
-> [352.615320] (5:node@TeX)   23  |  32 
-> [352.615320] (5:node@TeX)   25  |  21 
-> [352.615320] (5:node@TeX)   29  |  21 
-> [352.615320] (5:node@TeX)   37  |  21 
-> [352.615320] (5:node@TeX)   53  |  21 
-> [352.615320] (5:node@TeX) Predecessor: -1
-> [369.575244] (1:node@Gatien) My finger table:
-> [369.575244] (1:node@Gatien) Start | Succ 
-> [369.575244] (1:node@Gatien)   49  |   1 
-> [369.575244] (1:node@Gatien)   50  |   1 
-> [369.575244] (1:node@Gatien)   52  |   1 
-> [369.575244] (1:node@Gatien)   56  |  48 
-> [369.575244] (1:node@Gatien)    0  |  48 
-> [369.575244] (1:node@Gatien)   16  |  48 
-> [369.575244] (1:node@Gatien) Predecessor: 42
-> [382.882723] (2:node@McGee) My finger table:
-> [382.882723] (2:node@McGee) Start | Succ 
-> [382.882723] (2:node@McGee)   43  |  48 
-> [382.882723] (2:node@McGee)   44  |  48 
-> [382.882723] (2:node@McGee)   46  |  48 
-> [382.882723] (2:node@McGee)   50  |  42 
-> [382.882723] (2:node@McGee)   58  |  42 
-> [382.882723] (2:node@McGee)   10  |  42 
-> [382.882723] (2:node@McGee) Predecessor: 38
-> [384.345510] (4:node@Geoff) My finger table:
-> [384.345510] (4:node@Geoff) Start | Succ 
-> [384.345510] (4:node@Geoff)   33  |  38 
-> [384.345510] (4:node@Geoff)   34  |  38 
-> [384.345510] (4:node@Geoff)   36  |  32 
-> [384.345510] (4:node@Geoff)   40  |  32 
-> [384.345510] (4:node@Geoff)   48  |  32 
-> [384.345510] (4:node@Geoff)    0  |  32 
-> [384.345510] (4:node@Geoff) Predecessor: 21
-> [420.326446] (7:node@Boivin) My finger table:
-> [420.326446] (7:node@Boivin) Start | Succ 
-> [420.326446] (7:node@Boivin)    9  |  21 
-> [420.326446] (7:node@Boivin)   10  |  38 
-> [420.326446] (7:node@Boivin)   12  |  21 
-> [420.326446] (7:node@Boivin)   16  |   8 
-> [420.326446] (7:node@Boivin)   24  |   8 
-> [420.326446] (7:node@Boivin)   40  |   8 
-> [420.326446] (7:node@Boivin) Predecessor: -1
-> [440.893903] (5:node@TeX) My finger table:
-> [440.893903] (5:node@TeX) Start | Succ 
-> [440.893903] (5:node@TeX)   22  |  32 
-> [440.893903] (5:node@TeX)   23  |  32 
-> [440.893903] (5:node@TeX)   25  |  21 
-> [440.893903] (5:node@TeX)   29  |  21 
-> [440.893903] (5:node@TeX)   37  |  21 
-> [440.893903] (5:node@TeX)   53  |  21 
-> [440.893903] (5:node@TeX) Predecessor: 14
-> [479.759018] (3:node@iRMX) My finger table:
-> [479.759018] (3:node@iRMX) Start | Succ 
-> [479.759018] (3:node@iRMX)   39  |  42 
-> [479.759018] (3:node@iRMX)   40  |  42 
-> [479.759018] (3:node@iRMX)   42  |  42 
-> [479.759018] (3:node@iRMX)   46  |  38 
-> [479.759018] (3:node@iRMX)   54  |  38 
-> [479.759018] (3:node@iRMX)    6  |  38 
-> [479.759018] (3:node@iRMX) Predecessor: 32
-> [482.033272] (4:node@Geoff) My finger table:
-> [482.033272] (4:node@Geoff) Start | Succ 
-> [482.033272] (4:node@Geoff)   33  |  38 
-> [482.033272] (4:node@Geoff)   34  |  38 
-> [482.033272] (4:node@Geoff)   36  |  38 
-> [482.033272] (4:node@Geoff)   40  |  32 
-> [482.033272] (4:node@Geoff)   48  |  32 
-> [482.033272] (4:node@Geoff)    0  |  32 
-> [482.033272] (4:node@Geoff) Predecessor: 21
-> [490.659190] (1:node@Gatien) My finger table:
-> [490.659190] (1:node@Gatien) Start | Succ 
-> [490.659190] (1:node@Gatien)   49  |   1 
-> [490.659190] (1:node@Gatien)   50  |   1 
-> [490.659190] (1:node@Gatien)   52  |   1 
-> [490.659190] (1:node@Gatien)   56  |   1 
-> [490.659190] (1:node@Gatien)    0  |  48 
-> [490.659190] (1:node@Gatien)   16  |  48 
-> [490.659190] (1:node@Gatien) Predecessor: 42
-> [498.176314] (3:node@iRMX) My finger table:
-> [498.176314] (3:node@iRMX) Start | Succ 
-> [498.176314] (3:node@iRMX)   39  |  42 
-> [498.176314] (3:node@iRMX)   40  |  42 
-> [498.176314] (3:node@iRMX)   42  |  42 
-> [498.176314] (3:node@iRMX)   46  |  38 
-> [498.176314] (3:node@iRMX)   54  |  38 
-> [498.176314] (3:node@iRMX)    6  |  38 
-> [498.176314] (3:node@iRMX) Predecessor: 32
-> [498.611193] (6:node@Jean_Yves) My finger table:
-> [498.611193] (6:node@Jean_Yves) Start | Succ 
-> [498.611193] (6:node@Jean_Yves)   15  |  21 
-> [498.611193] (6:node@Jean_Yves)   16  |  38 
-> [498.611193] (6:node@Jean_Yves)   18  |  21 
-> [498.611193] (6:node@Jean_Yves)   22  |  14 
-> [498.611193] (6:node@Jean_Yves)   30  |  14 
-> [498.611193] (6:node@Jean_Yves)   46  |  14 
-> [498.611193] (6:node@Jean_Yves) Predecessor: -1
-> [500.558742] (8:node@Jacquelin) My finger table:
-> [500.558742] (8:node@Jacquelin) Start | Succ 
-> [500.558742] (8:node@Jacquelin)    2  |  14 
-> [500.558742] (8:node@Jacquelin)    3  |  32 
-> [500.558742] (8:node@Jacquelin)    5  |  14 
-> [500.558742] (8:node@Jacquelin)    9  |   1 
-> [500.558742] (8:node@Jacquelin)   17  |   1 
-> [500.558742] (8:node@Jacquelin)   33  |   1 
-> [500.558742] (8:node@Jacquelin) Predecessor: 48
-> [505.760908] (2:node@McGee) My finger table:
-> [505.760908] (2:node@McGee) Start | Succ 
-> [505.760908] (2:node@McGee)   43  |  48 
-> [505.760908] (2:node@McGee)   44  |  48 
-> [505.760908] (2:node@McGee)   46  |  48 
-> [505.760908] (2:node@McGee)   50  |   1 
-> [505.760908] (2:node@McGee)   58  |  42 
-> [505.760908] (2:node@McGee)   10  |  42 
-> [505.760908] (2:node@McGee) Predecessor: 38
-> [509.829088] (5:node@TeX) My finger table:
-> [509.829088] (5:node@TeX) Start | Succ 
-> [509.829088] (5:node@TeX)   22  |  32 
-> [509.829088] (5:node@TeX)   23  |  32 
-> [509.829088] (5:node@TeX)   25  |  32 
-> [509.829088] (5:node@TeX)   29  |  21 
-> [509.829088] (5:node@TeX)   37  |  21 
-> [509.829088] (5:node@TeX)   53  |  21 
-> [509.829088] (5:node@TeX) Predecessor: 14
-> [533.786389] (6:node@Jean_Yves) My finger table:
-> [533.786389] (6:node@Jean_Yves) Start | Succ 
-> [533.786389] (6:node@Jean_Yves)   15  |  21 
-> [533.786389] (6:node@Jean_Yves)   16  |  38 
-> [533.786389] (6:node@Jean_Yves)   18  |  21 
-> [533.786389] (6:node@Jean_Yves)   22  |  14 
-> [533.786389] (6:node@Jean_Yves)   30  |  14 
-> [533.786389] (6:node@Jean_Yves)   46  |  14 
-> [533.786389] (6:node@Jean_Yves) Predecessor: 8
-> [549.075353] (7:node@Boivin) My finger table:
-> [549.075353] (7:node@Boivin) Start | Succ 
-> [549.075353] (7:node@Boivin)    9  |  14 
-> [549.075353] (7:node@Boivin)   10  |  38 
-> [549.075353] (7:node@Boivin)   12  |  21 
-> [549.075353] (7:node@Boivin)   16  |  21 
-> [549.075353] (7:node@Boivin)   24  |   8 
-> [549.075353] (7:node@Boivin)   40  |   8 
-> [549.075353] (7:node@Boivin) Predecessor: -1
-> [753.389688] (0:@) Messages created: 605
-> [753.389688] (0:@) Simulated time: 753.39
+> [ 89.998200] (8:node@Jacquelin) My finger table:
+> [ 89.998200] (8:node@Jacquelin) Start | Succ 
+> [ 89.998200] (8:node@Jacquelin)    2  |   1 
+> [ 89.998200] (8:node@Jacquelin)    3  |   1 
+> [ 89.998200] (8:node@Jacquelin)    5  |   1 
+> [ 89.998200] (8:node@Jacquelin)    9  |   1 
+> [ 89.998200] (8:node@Jacquelin)   17  |   1 
+> [ 89.998200] (8:node@Jacquelin)   33  |   1 
+> [ 89.998200] (8:node@Jacquelin) Predecessor: 32
+> [109.834289] (8:node@Jacquelin) My finger table:
+> [109.834289] (8:node@Jacquelin) Start | Succ 
+> [109.834289] (8:node@Jacquelin)    2  |  32 
+> [109.834289] (8:node@Jacquelin)    3  |   1 
+> [109.834289] (8:node@Jacquelin)    5  |   1 
+> [109.834289] (8:node@Jacquelin)    9  |   1 
+> [109.834289] (8:node@Jacquelin)   17  |   1 
+> [109.834289] (8:node@Jacquelin)   33  |   1 
+> [109.834289] (8:node@Jacquelin) Predecessor: 42
+> [111.997093] (8:node@Jacquelin) My finger table:
+> [111.997093] (8:node@Jacquelin) Start | Succ 
+> [111.997093] (8:node@Jacquelin)    2  |  32 
+> [111.997093] (8:node@Jacquelin)    3  |   1 
+> [111.997093] (8:node@Jacquelin)    5  |   1 
+> [111.997093] (8:node@Jacquelin)    9  |   1 
+> [111.997093] (8:node@Jacquelin)   17  |   1 
+> [111.997093] (8:node@Jacquelin)   33  |   1 
+> [111.997093] (8:node@Jacquelin) Predecessor: 48
+> [131.116449] (4:node@Geoff) My finger table:
+> [131.116449] (4:node@Geoff) Start | Succ 
+> [131.116449] (4:node@Geoff)   33  |  48 
+> [131.116449] (4:node@Geoff)   34  |  32 
+> [131.116449] (4:node@Geoff)   36  |  32 
+> [131.116449] (4:node@Geoff)   40  |  32 
+> [131.116449] (4:node@Geoff)   48  |  32 
+> [131.116449] (4:node@Geoff)    0  |  32 
+> [131.116449] (4:node@Geoff) Predecessor: 1
+> [160.070553] (1:node@Gatien) My finger table:
+> [160.070553] (1:node@Gatien) Start | Succ 
+> [160.070553] (1:node@Gatien)   49  |   1 
+> [160.070553] (1:node@Gatien)   50  |  48 
+> [160.070553] (1:node@Gatien)   52  |  48 
+> [160.070553] (1:node@Gatien)   56  |  48 
+> [160.070553] (1:node@Gatien)    0  |  48 
+> [160.070553] (1:node@Gatien)   16  |  48 
+> [160.070553] (1:node@Gatien) Predecessor: 32
+> [175.080938] (1:node@Gatien) My finger table:
+> [175.080938] (1:node@Gatien) Start | Succ 
+> [175.080938] (1:node@Gatien)   49  |   1 
+> [175.080938] (1:node@Gatien)   50  |  48 
+> [175.080938] (1:node@Gatien)   52  |  48 
+> [175.080938] (1:node@Gatien)   56  |  48 
+> [175.080938] (1:node@Gatien)    0  |  48 
+> [175.080938] (1:node@Gatien)   16  |  48 
+> [175.080938] (1:node@Gatien) Predecessor: 42
+> [210.527001] (2:node@McGee) My finger table:
+> [210.527001] (2:node@McGee) Start | Succ 
+> [210.527001] (2:node@McGee)   43  |  48 
+> [210.527001] (2:node@McGee)   44  |  42 
+> [210.527001] (2:node@McGee)   46  |  42 
+> [210.527001] (2:node@McGee)   50  |  42 
+> [210.527001] (2:node@McGee)   58  |  42 
+> [210.527001] (2:node@McGee)   10  |  42 
+> [210.527001] (2:node@McGee) Predecessor: 8
+> [213.351968] (2:node@McGee) My finger table:
+> [213.351968] (2:node@McGee) Start | Succ 
+> [213.351968] (2:node@McGee)   43  |  48 
+> [213.351968] (2:node@McGee)   44  |  42 
+> [213.351968] (2:node@McGee)   46  |  42 
+> [213.351968] (2:node@McGee)   50  |  42 
+> [213.351968] (2:node@McGee)   58  |  42 
+> [213.351968] (2:node@McGee)   10  |  42 
+> [213.351968] (2:node@McGee) Predecessor: 21
+> [220.117893] (2:node@McGee) My finger table:
+> [220.117893] (2:node@McGee) Start | Succ 
+> [220.117893] (2:node@McGee)   43  |  48 
+> [220.117893] (2:node@McGee)   44  |  42 
+> [220.117893] (2:node@McGee)   46  |  42 
+> [220.117893] (2:node@McGee)   50  |  42 
+> [220.117893] (2:node@McGee)   58  |  42 
+> [220.117893] (2:node@McGee)   10  |  42 
+> [220.117893] (2:node@McGee) Predecessor: 32
+> [243.554183] (5:node@TeX) My finger table:
+> [243.554183] (5:node@TeX) Start | Succ 
+> [243.554183] (5:node@TeX)   22  |  32 
+> [243.554183] (5:node@TeX)   23  |  32 
+> [243.554183] (5:node@TeX)   25  |  21 
+> [243.554183] (5:node@TeX)   29  |  21 
+> [243.554183] (5:node@TeX)   37  |  21 
+> [243.554183] (5:node@TeX)   53  |  21 
+> [243.554183] (5:node@TeX) Predecessor: -1
+> [244.785257] (2:node@McGee) My finger table:
+> [244.785257] (2:node@McGee) Start | Succ 
+> [244.785257] (2:node@McGee)   43  |  48 
+> [244.785257] (2:node@McGee)   44  |  42 
+> [244.785257] (2:node@McGee)   46  |  42 
+> [244.785257] (2:node@McGee)   50  |  42 
+> [244.785257] (2:node@McGee)   58  |  42 
+> [244.785257] (2:node@McGee)   10  |  42 
+> [244.785257] (2:node@McGee) Predecessor: 38
+> [244.894202] (6:node@Jean_Yves) My finger table:
+> [244.894202] (6:node@Jean_Yves) Start | Succ 
+> [244.894202] (6:node@Jean_Yves)   15  |  32 
+> [244.894202] (6:node@Jean_Yves)   16  |  32 
+> [244.894202] (6:node@Jean_Yves)   18  |  14 
+> [244.894202] (6:node@Jean_Yves)   22  |  14 
+> [244.894202] (6:node@Jean_Yves)   30  |  14 
+> [244.894202] (6:node@Jean_Yves)   46  |  14 
+> [244.894202] (6:node@Jean_Yves) Predecessor: -1
+> [254.476029] (2:node@McGee) My finger table:
+> [254.476029] (2:node@McGee) Start | Succ 
+> [254.476029] (2:node@McGee)   43  |  48 
+> [254.476029] (2:node@McGee)   44  |  48 
+> [254.476029] (2:node@McGee)   46  |  42 
+> [254.476029] (2:node@McGee)   50  |  42 
+> [254.476029] (2:node@McGee)   58  |  42 
+> [254.476029] (2:node@McGee)   10  |  42 
+> [254.476029] (2:node@McGee) Predecessor: 38
+> [257.793952] (4:node@Geoff) My finger table:
+> [257.793952] (4:node@Geoff) Start | Succ 
+> [257.793952] (4:node@Geoff)   33  |  42 
+> [257.793952] (4:node@Geoff)   34  |  42 
+> [257.793952] (4:node@Geoff)   36  |  32 
+> [257.793952] (4:node@Geoff)   40  |  32 
+> [257.793952] (4:node@Geoff)   48  |  32 
+> [257.793952] (4:node@Geoff)    0  |  32 
+> [257.793952] (4:node@Geoff) Predecessor: 1
+> [301.405587] (8:node@Jacquelin) My finger table:
+> [301.405587] (8:node@Jacquelin) Start | Succ 
+> [301.405587] (8:node@Jacquelin)    2  |  32 
+> [301.405587] (8:node@Jacquelin)    3  |  32 
+> [301.405587] (8:node@Jacquelin)    5  |   1 
+> [301.405587] (8:node@Jacquelin)    9  |   1 
+> [301.405587] (8:node@Jacquelin)   17  |   1 
+> [301.405587] (8:node@Jacquelin)   33  |   1 
+> [301.405587] (8:node@Jacquelin) Predecessor: 48
+> [304.772476] (7:node@Boivin) My finger table:
+> [304.772476] (7:node@Boivin) Start | Succ 
+> [304.772476] (7:node@Boivin)    9  |  32 
+> [304.772476] (7:node@Boivin)   10  |  32 
+> [304.772476] (7:node@Boivin)   12  |   8 
+> [304.772476] (7:node@Boivin)   16  |   8 
+> [304.772476] (7:node@Boivin)   24  |   8 
+> [304.772476] (7:node@Boivin)   40  |   8 
+> [304.772476] (7:node@Boivin) Predecessor: -1
+> [307.510216] (4:node@Geoff) My finger table:
+> [307.510216] (4:node@Geoff) Start | Succ 
+> [307.510216] (4:node@Geoff)   33  |  42 
+> [307.510216] (4:node@Geoff)   34  |  42 
+> [307.510216] (4:node@Geoff)   36  |  32 
+> [307.510216] (4:node@Geoff)   40  |  32 
+> [307.510216] (4:node@Geoff)   48  |  32 
+> [307.510216] (4:node@Geoff)    0  |  32 
+> [307.510216] (4:node@Geoff) Predecessor: 8
+> [307.783196] (1:node@Gatien) My finger table:
+> [307.783196] (1:node@Gatien) Start | Succ 
+> [307.783196] (1:node@Gatien)   49  |   1 
+> [307.783196] (1:node@Gatien)   50  |   1 
+> [307.783196] (1:node@Gatien)   52  |  48 
+> [307.783196] (1:node@Gatien)   56  |  48 
+> [307.783196] (1:node@Gatien)    0  |  48 
+> [307.783196] (1:node@Gatien)   16  |  48 
+> [307.783196] (1:node@Gatien) Predecessor: 42
+> [310.800320] (3:node@iRMX) My finger table:
+> [310.800320] (3:node@iRMX) Start | Succ 
+> [310.800320] (3:node@iRMX)   39  |  42 
+> [310.800320] (3:node@iRMX)   40  |  42 
+> [310.800320] (3:node@iRMX)   42  |  38 
+> [310.800320] (3:node@iRMX)   46  |  38 
+> [310.800320] (3:node@iRMX)   54  |  38 
+> [310.800320] (3:node@iRMX)    6  |  38 
+> [310.800320] (3:node@iRMX) Predecessor: -1
+> [313.838656] (4:node@Geoff) My finger table:
+> [313.838656] (4:node@Geoff) Start | Succ 
+> [313.838656] (4:node@Geoff)   33  |  38 
+> [313.838656] (4:node@Geoff)   34  |  42 
+> [313.838656] (4:node@Geoff)   36  |  32 
+> [313.838656] (4:node@Geoff)   40  |  32 
+> [313.838656] (4:node@Geoff)   48  |  32 
+> [313.838656] (4:node@Geoff)    0  |  32 
+> [313.838656] (4:node@Geoff) Predecessor: 21
+> [347.040484] (3:node@iRMX) My finger table:
+> [347.040484] (3:node@iRMX) Start | Succ 
+> [347.040484] (3:node@iRMX)   39  |  42 
+> [347.040484] (3:node@iRMX)   40  |  42 
+> [347.040484] (3:node@iRMX)   42  |  38 
+> [347.040484] (3:node@iRMX)   46  |  38 
+> [347.040484] (3:node@iRMX)   54  |  38 
+> [347.040484] (3:node@iRMX)    6  |  38 
+> [347.040484] (3:node@iRMX) Predecessor: 32
+> [368.832414] (5:node@TeX) My finger table:
+> [368.832414] (5:node@TeX) Start | Succ 
+> [368.832414] (5:node@TeX)   22  |  32 
+> [368.832414] (5:node@TeX)   23  |  32 
+> [368.832414] (5:node@TeX)   25  |  21 
+> [368.832414] (5:node@TeX)   29  |  21 
+> [368.832414] (5:node@TeX)   37  |  21 
+> [368.832414] (5:node@TeX)   53  |  21 
+> [368.832414] (5:node@TeX) Predecessor: 8
+> [374.267193] (6:node@Jean_Yves) My finger table:
+> [374.267193] (6:node@Jean_Yves) Start | Succ 
+> [374.267193] (6:node@Jean_Yves)   15  |  21 
+> [374.267193] (6:node@Jean_Yves)   16  |  32 
+> [374.267193] (6:node@Jean_Yves)   18  |  21 
+> [374.267193] (6:node@Jean_Yves)   22  |  14 
+> [374.267193] (6:node@Jean_Yves)   30  |  14 
+> [374.267193] (6:node@Jean_Yves)   46  |  14 
+> [374.267193] (6:node@Jean_Yves) Predecessor: -1
+> [375.175007] (5:node@TeX) My finger table:
+> [375.175007] (5:node@TeX) Start | Succ 
+> [375.175007] (5:node@TeX)   22  |  32 
+> [375.175007] (5:node@TeX)   23  |  32 
+> [375.175007] (5:node@TeX)   25  |  32 
+> [375.175007] (5:node@TeX)   29  |  21 
+> [375.175007] (5:node@TeX)   37  |  21 
+> [375.175007] (5:node@TeX)   53  |  21 
+> [375.175007] (5:node@TeX) Predecessor: 8
+> [377.892396] (5:node@TeX) My finger table:
+> [377.892396] (5:node@TeX) Start | Succ 
+> [377.892396] (5:node@TeX)   22  |  32 
+> [377.892396] (5:node@TeX)   23  |  32 
+> [377.892396] (5:node@TeX)   25  |  32 
+> [377.892396] (5:node@TeX)   29  |  21 
+> [377.892396] (5:node@TeX)   37  |  21 
+> [377.892396] (5:node@TeX)   53  |  21 
+> [377.892396] (5:node@TeX) Predecessor: 14
+> [381.140620] (4:node@Geoff) My finger table:
+> [381.140620] (4:node@Geoff) Start | Succ 
+> [381.140620] (4:node@Geoff)   33  |  38 
+> [381.140620] (4:node@Geoff)   34  |  42 
+> [381.140620] (4:node@Geoff)   36  |  38 
+> [381.140620] (4:node@Geoff)   40  |  32 
+> [381.140620] (4:node@Geoff)   48  |  32 
+> [381.140620] (4:node@Geoff)    0  |  32 
+> [381.140620] (4:node@Geoff) Predecessor: 21
+> [385.057415] (2:node@McGee) My finger table:
+> [385.057415] (2:node@McGee) Start | Succ 
+> [385.057415] (2:node@McGee)   43  |  48 
+> [385.057415] (2:node@McGee)   44  |  48 
+> [385.057415] (2:node@McGee)   46  |  48 
+> [385.057415] (2:node@McGee)   50  |  42 
+> [385.057415] (2:node@McGee)   58  |  42 
+> [385.057415] (2:node@McGee)   10  |  42 
+> [385.057415] (2:node@McGee) Predecessor: 38
+> [401.887186] (7:node@Boivin) My finger table:
+> [401.887186] (7:node@Boivin) Start | Succ 
+> [401.887186] (7:node@Boivin)    9  |  14 
+> [401.887186] (7:node@Boivin)   10  |  32 
+> [401.887186] (7:node@Boivin)   12  |   8 
+> [401.887186] (7:node@Boivin)   16  |   8 
+> [401.887186] (7:node@Boivin)   24  |   8 
+> [401.887186] (7:node@Boivin)   40  |   8 
+> [401.887186] (7:node@Boivin) Predecessor: 1
+> [428.242792] (8:node@Jacquelin) My finger table:
+> [428.242792] (8:node@Jacquelin) Start | Succ 
+> [428.242792] (8:node@Jacquelin)    2  |   8 
+> [428.242792] (8:node@Jacquelin)    3  |  32 
+> [428.242792] (8:node@Jacquelin)    5  |   8 
+> [428.242792] (8:node@Jacquelin)    9  |   1 
+> [428.242792] (8:node@Jacquelin)   17  |   1 
+> [428.242792] (8:node@Jacquelin)   33  |   1 
+> [428.242792] (8:node@Jacquelin) Predecessor: 48
+> [432.513194] (3:node@iRMX) My finger table:
+> [432.513194] (3:node@iRMX) Start | Succ 
+> [432.513194] (3:node@iRMX)   39  |  42 
+> [432.513194] (3:node@iRMX)   40  |  42 
+> [432.513194] (3:node@iRMX)   42  |  42 
+> [432.513194] (3:node@iRMX)   46  |  38 
+> [432.513194] (3:node@iRMX)   54  |  38 
+> [432.513194] (3:node@iRMX)    6  |  38 
+> [432.513194] (3:node@iRMX) Predecessor: 32
+> [433.617495] (7:node@Boivin) My finger table:
+> [433.617495] (7:node@Boivin) Start | Succ 
+> [433.617495] (7:node@Boivin)    9  |  14 
+> [433.617495] (7:node@Boivin)   10  |  32 
+> [433.617495] (7:node@Boivin)   12  |  14 
+> [433.617495] (7:node@Boivin)   16  |   8 
+> [433.617495] (7:node@Boivin)   24  |   8 
+> [433.617495] (7:node@Boivin)   40  |   8 
+> [433.617495] (7:node@Boivin) Predecessor: 1
+> [439.381100] (6:node@Jean_Yves) My finger table:
+> [439.381100] (6:node@Jean_Yves) Start | Succ 
+> [439.381100] (6:node@Jean_Yves)   15  |  21 
+> [439.381100] (6:node@Jean_Yves)   16  |  32 
+> [439.381100] (6:node@Jean_Yves)   18  |  21 
+> [439.381100] (6:node@Jean_Yves)   22  |  14 
+> [439.381100] (6:node@Jean_Yves)   30  |  14 
+> [439.381100] (6:node@Jean_Yves)   46  |  14 
+> [439.381100] (6:node@Jean_Yves) Predecessor: 8
+> [447.065837] (1:node@Gatien) My finger table:
+> [447.065837] (1:node@Gatien) Start | Succ 
+> [447.065837] (1:node@Gatien)   49  |   1 
+> [447.065837] (1:node@Gatien)   50  |   1 
+> [447.065837] (1:node@Gatien)   52  |   1 
+> [447.065837] (1:node@Gatien)   56  |  48 
+> [447.065837] (1:node@Gatien)    0  |  48 
+> [447.065837] (1:node@Gatien)   16  |  48 
+> [447.065837] (1:node@Gatien) Predecessor: 42
+> [517.974974] (5:node@TeX) My finger table:
+> [517.974974] (5:node@TeX) Start | Succ 
+> [517.974974] (5:node@TeX)   22  |  32 
+> [517.974974] (5:node@TeX)   23  |  32 
+> [517.974974] (5:node@TeX)   25  |  32 
+> [517.974974] (5:node@TeX)   29  |  32 
+> [517.974974] (5:node@TeX)   37  |  21 
+> [517.974974] (5:node@TeX)   53  |  21 
+> [517.974974] (5:node@TeX) Predecessor: 14
+> [536.878549] (4:node@Geoff) My finger table:
+> [536.878549] (4:node@Geoff) Start | Succ 
+> [536.878549] (4:node@Geoff)   33  |  38 
+> [536.878549] (4:node@Geoff)   34  |  42 
+> [536.878549] (4:node@Geoff)   36  |  38 
+> [536.878549] (4:node@Geoff)   40  |  42 
+> [536.878549] (4:node@Geoff)   48  |  32 
+> [536.878549] (4:node@Geoff)    0  |  32 
+> [536.878549] (4:node@Geoff) Predecessor: 21
+> [538.333100] (6:node@Jean_Yves) My finger table:
+> [538.333100] (6:node@Jean_Yves) Start | Succ 
+> [538.333100] (6:node@Jean_Yves)   15  |  21 
+> [538.333100] (6:node@Jean_Yves)   16  |  32 
+> [538.333100] (6:node@Jean_Yves)   18  |  21 
+> [538.333100] (6:node@Jean_Yves)   22  |  32 
+> [538.333100] (6:node@Jean_Yves)   30  |  14 
+> [538.333100] (6:node@Jean_Yves)   46  |  14 
+> [538.333100] (6:node@Jean_Yves) Predecessor: 8
+> [553.664147] (8:node@Jacquelin) My finger table:
+> [553.664147] (8:node@Jacquelin) Start | Succ 
+> [553.664147] (8:node@Jacquelin)    2  |   8 
+> [553.664147] (8:node@Jacquelin)    3  |  32 
+> [553.664147] (8:node@Jacquelin)    5  |   8 
+> [553.664147] (8:node@Jacquelin)    9  |  14 
+> [553.664147] (8:node@Jacquelin)   17  |   1 
+> [553.664147] (8:node@Jacquelin)   33  |   1 
+> [553.664147] (8:node@Jacquelin) Predecessor: 48
+> [554.213185] (2:node@McGee) My finger table:
+> [554.213185] (2:node@McGee) Start | Succ 
+> [554.213185] (2:node@McGee)   43  |  48 
+> [554.213185] (2:node@McGee)   44  |  48 
+> [554.213185] (2:node@McGee)   46  |  48 
+> [554.213185] (2:node@McGee)   50  |   1 
+> [554.213185] (2:node@McGee)   58  |  42 
+> [554.213185] (2:node@McGee)   10  |  42 
+> [554.213185] (2:node@McGee) Predecessor: 38
+> [569.831804] (7:node@Boivin) My finger table:
+> [569.831804] (7:node@Boivin) Start | Succ 
+> [569.831804] (7:node@Boivin)    9  |  14 
+> [569.831804] (7:node@Boivin)   10  |  32 
+> [569.831804] (7:node@Boivin)   12  |  14 
+> [569.831804] (7:node@Boivin)   16  |  21 
+> [569.831804] (7:node@Boivin)   24  |   8 
+> [569.831804] (7:node@Boivin)   40  |   8 
+> [569.831804] (7:node@Boivin) Predecessor: 1
+> [573.429591] (1:node@Gatien) My finger table:
+> [573.429591] (1:node@Gatien) Start | Succ 
+> [573.429591] (1:node@Gatien)   49  |   1 
+> [573.429591] (1:node@Gatien)   50  |   1 
+> [573.429591] (1:node@Gatien)   52  |   1 
+> [573.429591] (1:node@Gatien)   56  |   1 
+> [573.429591] (1:node@Gatien)    0  |  48 
+> [573.429591] (1:node@Gatien)   16  |  48 
+> [573.429591] (1:node@Gatien) Predecessor: 42
+> [577.413922] (3:node@iRMX) My finger table:
+> [577.413922] (3:node@iRMX) Start | Succ 
+> [577.413922] (3:node@iRMX)   39  |  42 
+> [577.413922] (3:node@iRMX)   40  |  42 
+> [577.413922] (3:node@iRMX)   42  |  42 
+> [577.413922] (3:node@iRMX)   46  |  48 
+> [577.413922] (3:node@iRMX)   54  |  38 
+> [577.413922] (3:node@iRMX)    6  |  38 
+> [577.413922] (3:node@iRMX) Predecessor: 32
+> [804.365058] (0:@) Messages created: 788
+> [804.365058] (0:@) Simulated time: 804.365
 
 ! 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
 > [   0.000000] (0:@) Configuration change: Set 'network/model' to 'Constant'
 > [   0.000000] (0:@) Switching workstation model to compound since you changed the network and/or cpu model(s)
-> [   0.000000] (10:node@c-9.me) Joining the ring with id 2015253, knowing node 1319738
+> [   0.000000] (8:node@c-7.me) Joining the ring with id 10004760, knowing node 16509405
 > [   0.000000] (1:node@c-0.me) My finger table:
+> [   0.000000] (9:node@c-8.me) Joining the ring with id 6518808, knowing node 42
+> [   0.000000] (4:node@c-3.me) Joining the ring with id 1319738, knowing node 42
+> [   0.000000] (5:node@c-4.me) Joining the ring with id 16509405, knowing node 366680
+> [   0.000000] (10:node@c-9.me) Joining the ring with id 2015253, knowing node 1319738
+> [   0.000000] (6:node@c-5.me) Joining the ring with id 10874876, knowing node 533744
+> [   0.000000] (3:node@c-2.me) Joining the ring with id 533744, knowing node 366680
+> [   0.000000] (2:node@c-1.me) Joining the ring with id 366680, knowing node 42
+> [   0.000000] (7:node@c-6.me) Joining the ring with id 16728096, knowing node 1319738
 > [   0.000000] (1:node@c-0.me) Start | Succ 
 > [   0.000000] (1:node@c-0.me)   43  |  42 
 > [   0.000000] (1:node@c-0.me)   44  |  42 
@@ -397,59 +495,51 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.
 > [   0.000000] (1:node@c-0.me)  4194346  |  42 
 > [   0.000000] (1:node@c-0.me)  8388650  |  42 
 > [   0.000000] (1:node@c-0.me) Predecessor: -1
-> [   0.000000] (2:node@c-1.me) Joining the ring with id 366680, knowing node 42
-> [   0.000000] (3:node@c-2.me) Joining the ring with id 533744, knowing node 366680
-> [   0.000000] (4:node@c-3.me) Joining the ring with id 1319738, knowing node 42
-> [   0.000000] (5:node@c-4.me) Joining the ring with id 16509405, knowing node 366680
-> [   0.000000] (6:node@c-5.me) Joining the ring with id 10874876, knowing node 533744
-> [   0.000000] (7:node@c-6.me) Joining the ring with id 16728096, knowing node 1319738
-> [   0.000000] (8:node@c-7.me) Joining the ring with id 10004760, knowing node 16509405
-> [   0.000000] (9:node@c-8.me) Joining the ring with id 6518808, knowing node 42
 > [   4.000000] (3:node@c-2.me) My finger table:
 > [   4.000000] (3:node@c-2.me) Start | Succ 
 > [   4.000000] (3:node@c-2.me)  533745  | 366680 
+> [   4.000000] (6:node@c-5.me) My finger table:
 > [   4.000000] (3:node@c-2.me)  533746  | 533744 
+> [   4.000000] (6:node@c-5.me) Start | Succ 
 > [   4.000000] (3:node@c-2.me)  533748  | 533744 
+> [   4.000000] (6:node@c-5.me)  10874877  | 533744 
 > [   4.000000] (3:node@c-2.me)  533752  | 533744 
 > [   4.000000] (3:node@c-2.me)  533760  | 533744 
 > [   4.000000] (3:node@c-2.me)  533776  | 533744 
+> [   4.000000] (6:node@c-5.me)  10874878  | 10874876 
 > [   4.000000] (3:node@c-2.me)  533808  | 533744 
 > [   4.000000] (3:node@c-2.me)  533872  | 533744 
+> [   4.000000] (6:node@c-5.me)  10874880  | 10874876 
 > [   4.000000] (3:node@c-2.me)  534000  | 533744 
+> [   4.000000] (6:node@c-5.me)  10874884  | 10874876 
 > [   4.000000] (3:node@c-2.me)  534256  | 533744 
+> [   4.000000] (6:node@c-5.me)  10874892  | 10874876 
 > [   4.000000] (3:node@c-2.me)  534768  | 533744 
+> [   4.000000] (6:node@c-5.me)  10874908  | 10874876 
+> [   4.000000] (6:node@c-5.me)  10874940  | 10874876 
 > [   4.000000] (3:node@c-2.me)  535792  | 533744 
 > [   4.000000] (3:node@c-2.me)  537840  | 533744 
+> [   4.000000] (6:node@c-5.me)  10875004  | 10874876 
 > [   4.000000] (3:node@c-2.me)  541936  | 533744 
 > [   4.000000] (3:node@c-2.me)  550128  | 533744 
 > [   4.000000] (3:node@c-2.me)  566512  | 533744 
 > [   4.000000] (3:node@c-2.me)  599280  | 533744 
 > [   4.000000] (3:node@c-2.me)  664816  | 533744 
-> [   4.000000] (3:node@c-2.me)  795888  | 533744 
-> [   4.000000] (3:node@c-2.me)  1058032  | 533744 
-> [   4.000000] (3:node@c-2.me)  1582320  | 533744 
-> [   4.000000] (3:node@c-2.me)  2630896  | 533744 
-> [   4.000000] (3:node@c-2.me)  4728048  | 533744 
-> [   4.000000] (3:node@c-2.me)  8922352  | 533744 
-> [   4.000000] (3:node@c-2.me) Predecessor: -1
-> [   4.000000] (6:node@c-5.me) My finger table:
-> [   4.000000] (6:node@c-5.me) Start | Succ 
-> [   4.000000] (6:node@c-5.me)  10874877  | 533744 
-> [   4.000000] (6:node@c-5.me)  10874878  | 10874876 
-> [   4.000000] (6:node@c-5.me)  10874880  | 10874876 
-> [   4.000000] (6:node@c-5.me)  10874884  | 10874876 
-> [   4.000000] (6:node@c-5.me)  10874892  | 10874876 
-> [   4.000000] (6:node@c-5.me)  10874908  | 10874876 
-> [   4.000000] (6:node@c-5.me)  10874940  | 10874876 
-> [   4.000000] (6:node@c-5.me)  10875004  | 10874876 
 > [   4.000000] (6:node@c-5.me)  10875132  | 10874876 
+> [   4.000000] (3:node@c-2.me)  795888  | 533744 
 > [   4.000000] (6:node@c-5.me)  10875388  | 10874876 
 > [   4.000000] (6:node@c-5.me)  10875900  | 10874876 
+> [   4.000000] (3:node@c-2.me)  1058032  | 533744 
 > [   4.000000] (6:node@c-5.me)  10876924  | 10874876 
+> [   4.000000] (3:node@c-2.me)  1582320  | 533744 
 > [   4.000000] (6:node@c-5.me)  10878972  | 10874876 
+> [   4.000000] (3:node@c-2.me)  2630896  | 533744 
 > [   4.000000] (6:node@c-5.me)  10883068  | 10874876 
+> [   4.000000] (3:node@c-2.me)  4728048  | 533744 
 > [   4.000000] (6:node@c-5.me)  10891260  | 10874876 
+> [   4.000000] (3:node@c-2.me)  8922352  | 533744 
 > [   4.000000] (6:node@c-5.me)  10907644  | 10874876 
+> [   4.000000] (3:node@c-2.me) Predecessor: -1
 > [   4.000000] (6:node@c-5.me)  10940412  | 10874876 
 > [   4.000000] (6:node@c-5.me)  11005948  | 10874876 
 > [   4.000000] (6:node@c-5.me)  11137020  | 10874876 
@@ -459,59 +549,59 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.
 > [   4.000000] (6:node@c-5.me)  15069180  | 10874876 
 > [   4.000000] (6:node@c-5.me)  2486268  | 10874876 
 > [   4.000000] (6:node@c-5.me) Predecessor: -1
+> [   5.000000] (8:node@c-7.me) My finger table:
+> [   5.000000] (8:node@c-7.me) Start | Succ 
+> [   5.000000] (8:node@c-7.me)  10004761  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10004762  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10004764  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10004768  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10004776  | 10004760 
 > [   5.000000] (5:node@c-4.me) My finger table:
+> [   5.000000] (8:node@c-7.me)  10004792  | 10004760 
 > [   5.000000] (5:node@c-4.me) Start | Succ 
+> [   5.000000] (8:node@c-7.me)  10004824  | 10004760 
 > [   5.000000] (5:node@c-4.me)  16509406  | 366680 
+> [   5.000000] (8:node@c-7.me)  10004888  | 10004760 
 > [   5.000000] (5:node@c-4.me)  16509407  | 16509405 
 > [   5.000000] (5:node@c-4.me)  16509409  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10005016  | 10004760 
 > [   5.000000] (5:node@c-4.me)  16509413  | 16509405 
 > [   5.000000] (5:node@c-4.me)  16509421  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10005272  | 10004760 
 > [   5.000000] (5:node@c-4.me)  16509437  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10005784  | 10004760 
 > [   5.000000] (5:node@c-4.me)  16509469  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10006808  | 10004760 
+> [   5.000000] (8:node@c-7.me)  10008856  | 10004760 
 > [   5.000000] (5:node@c-4.me)  16509533  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10012952  | 10004760 
 > [   5.000000] (5:node@c-4.me)  16509661  | 16509405 
 > [   5.000000] (5:node@c-4.me)  16509917  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10021144  | 10004760 
 > [   5.000000] (5:node@c-4.me)  16510429  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10037528  | 10004760 
 > [   5.000000] (5:node@c-4.me)  16511453  | 16509405 
 > [   5.000000] (5:node@c-4.me)  16513501  | 16509405 
 > [   5.000000] (5:node@c-4.me)  16517597  | 16509405 
 > [   5.000000] (5:node@c-4.me)  16525789  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10070296  | 10004760 
 > [   5.000000] (5:node@c-4.me)  16542173  | 16509405 
 > [   5.000000] (5:node@c-4.me)  16574941  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10135832  | 10004760 
 > [   5.000000] (5:node@c-4.me)  16640477  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10266904  | 10004760 
 > [   5.000000] (5:node@c-4.me)  16771549  | 16509405 
+> [   5.000000] (8:node@c-7.me)  10529048  | 10004760 
 > [   5.000000] (5:node@c-4.me)  256477  | 16509405 
 > [   5.000000] (5:node@c-4.me)  780765  | 16509405 
 > [   5.000000] (5:node@c-4.me)  1829341  | 16509405 
 > [   5.000000] (5:node@c-4.me)  3926493  | 16509405 
-> [   5.000000] (5:node@c-4.me)  8120797  | 16509405 
-> [   5.000000] (5:node@c-4.me) Predecessor: -1
-> [   5.000000] (8:node@c-7.me) My finger table:
-> [   5.000000] (8:node@c-7.me) Start | Succ 
-> [   5.000000] (8:node@c-7.me)  10004761  | 16509405 
-> [   5.000000] (8:node@c-7.me)  10004762  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10004764  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10004768  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10004776  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10004792  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10004824  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10004888  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10005016  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10005272  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10005784  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10006808  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10008856  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10012952  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10021144  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10037528  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10070296  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10135832  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10266904  | 10004760 
-> [   5.000000] (8:node@c-7.me)  10529048  | 10004760 
 > [   5.000000] (8:node@c-7.me)  11053336  | 10004760 
 > [   5.000000] (8:node@c-7.me)  12101912  | 10004760 
 > [   5.000000] (8:node@c-7.me)  14199064  | 10004760 
+> [   5.000000] (5:node@c-4.me)  8120797  | 16509405 
 > [   5.000000] (8:node@c-7.me)  1616152  | 10004760 
+> [   5.000000] (5:node@c-4.me) Predecessor: -1
 > [   5.000000] (8:node@c-7.me) Predecessor: -1
 > [   5.999900] (2:node@c-1.me) My finger table:
 > [   5.999900] (2:node@c-1.me) Start | Succ 
@@ -648,60 +738,60 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.
 > [  15.999700] (9:node@c-8.me)  10713112  | 6518808 
 > [  15.999700] (9:node@c-8.me)  14907416  | 6518808 
 > [  15.999700] (9:node@c-8.me) Predecessor: -1
-> [  26.999600] (3:node@c-2.me) My finger table:
-> [  26.999600] (3:node@c-2.me) Start | Succ 
-> [  26.999600] (3:node@c-2.me)  533745  | 366680 
-> [  26.999600] (3:node@c-2.me)  533746  | 533744 
-> [  26.999600] (3:node@c-2.me)  533748  | 533744 
-> [  26.999600] (3:node@c-2.me)  533752  | 533744 
-> [  26.999600] (3:node@c-2.me)  533760  | 533744 
-> [  26.999600] (3:node@c-2.me)  533776  | 533744 
-> [  26.999600] (3:node@c-2.me)  533808  | 533744 
-> [  26.999600] (3:node@c-2.me)  533872  | 533744 
-> [  26.999600] (3:node@c-2.me)  534000  | 533744 
-> [  26.999600] (3:node@c-2.me)  534256  | 533744 
-> [  26.999600] (3:node@c-2.me)  534768  | 533744 
-> [  26.999600] (3:node@c-2.me)  535792  | 533744 
-> [  26.999600] (3:node@c-2.me)  537840  | 533744 
-> [  26.999600] (3:node@c-2.me)  541936  | 533744 
-> [  26.999600] (3:node@c-2.me)  550128  | 533744 
-> [  26.999600] (3:node@c-2.me)  566512  | 533744 
-> [  26.999600] (3:node@c-2.me)  599280  | 533744 
-> [  26.999600] (3:node@c-2.me)  664816  | 533744 
-> [  26.999600] (3:node@c-2.me)  795888  | 533744 
-> [  26.999600] (3:node@c-2.me)  1058032  | 533744 
-> [  26.999600] (3:node@c-2.me)  1582320  | 533744 
-> [  26.999600] (3:node@c-2.me)  2630896  | 533744 
-> [  26.999600] (3:node@c-2.me)  4728048  | 533744 
-> [  26.999600] (3:node@c-2.me)  8922352  | 533744 
-> [  26.999600] (3:node@c-2.me) Predecessor: 10874876
-> [  31.999400] (5:node@c-4.me) My finger table:
-> [  31.999400] (5:node@c-4.me) Start | Succ 
-> [  31.999400] (5:node@c-4.me)  16509406  | 366680 
-> [  31.999400] (5:node@c-4.me)  16509407  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509409  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509413  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509421  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509437  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509469  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509533  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509661  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16509917  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16510429  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16511453  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16513501  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16517597  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16525789  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16542173  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16574941  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16640477  | 16509405 
-> [  31.999400] (5:node@c-4.me)  16771549  | 16509405 
-> [  31.999400] (5:node@c-4.me)  256477  | 16509405 
-> [  31.999400] (5:node@c-4.me)  780765  | 16509405 
-> [  31.999400] (5:node@c-4.me)  1829341  | 16509405 
-> [  31.999400] (5:node@c-4.me)  3926493  | 16509405 
-> [  31.999400] (5:node@c-4.me)  8120797  | 16509405 
-> [  31.999400] (5:node@c-4.me) Predecessor: 10004760
+> [  24.999600] (3:node@c-2.me) My finger table:
+> [  24.999600] (3:node@c-2.me) Start | Succ 
+> [  24.999600] (4:node@c-3.me) My finger table:
+> [  24.999600] (3:node@c-2.me)  533745  | 366680 
+> [  24.999600] (4:node@c-3.me) Start | Succ 
+> [  24.999600] (3:node@c-2.me)  533746  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319739  |  42 
+> [  24.999600] (3:node@c-2.me)  533748  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319740  | 1319738 
+> [  24.999600] (3:node@c-2.me)  533752  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319742  | 1319738 
+> [  24.999600] (3:node@c-2.me)  533760  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319746  | 1319738 
+> [  24.999600] (3:node@c-2.me)  533776  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319754  | 1319738 
+> [  24.999600] (4:node@c-3.me)  1319770  | 1319738 
+> [  24.999600] (3:node@c-2.me)  533808  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319802  | 1319738 
+> [  24.999600] (3:node@c-2.me)  533872  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319866  | 1319738 
+> [  24.999600] (3:node@c-2.me)  534000  | 533744 
+> [  24.999600] (4:node@c-3.me)  1319994  | 1319738 
+> [  24.999600] (3:node@c-2.me)  534256  | 533744 
+> [  24.999600] (4:node@c-3.me)  1320250  | 1319738 
+> [  24.999600] (3:node@c-2.me)  534768  | 533744 
+> [  24.999600] (4:node@c-3.me)  1320762  | 1319738 
+> [  24.999600] (3:node@c-2.me)  535792  | 533744 
+> [  24.999600] (3:node@c-2.me)  537840  | 533744 
+> [  24.999600] (4:node@c-3.me)  1321786  | 1319738 
+> [  24.999600] (3:node@c-2.me)  541936  | 533744 
+> [  24.999600] (4:node@c-3.me)  1323834  | 1319738 
+> [  24.999600] (3:node@c-2.me)  550128  | 533744 
+> [  24.999600] (4:node@c-3.me)  1327930  | 1319738 
+> [  24.999600] (3:node@c-2.me)  566512  | 533744 
+> [  24.999600] (4:node@c-3.me)  1336122  | 1319738 
+> [  24.999600] (3:node@c-2.me)  599280  | 533744 
+> [  24.999600] (4:node@c-3.me)  1352506  | 1319738 
+> [  24.999600] (3:node@c-2.me)  664816  | 533744 
+> [  24.999600] (4:node@c-3.me)  1385274  | 1319738 
+> [  24.999600] (3:node@c-2.me)  795888  | 533744 
+> [  24.999600] (4:node@c-3.me)  1450810  | 1319738 
+> [  24.999600] (3:node@c-2.me)  1058032  | 533744 
+> [  24.999600] (3:node@c-2.me)  1582320  | 533744 
+> [  24.999600] (4:node@c-3.me)  1581882  | 1319738 
+> [  24.999600] (3:node@c-2.me)  2630896  | 533744 
+> [  24.999600] (4:node@c-3.me)  1844026  | 1319738 
+> [  24.999600] (4:node@c-3.me)  2368314  | 1319738 
+> [  24.999600] (3:node@c-2.me)  4728048  | 533744 
+> [  24.999600] (4:node@c-3.me)  3416890  | 1319738 
+> [  24.999600] (3:node@c-2.me)  8922352  | 533744 
+> [  24.999600] (3:node@c-2.me) Predecessor: 10874876
+> [  24.999600] (4:node@c-3.me)  5514042  | 1319738 
+> [  24.999600] (4:node@c-3.me)  9708346  | 1319738 
+> [  24.999600] (4:node@c-3.me) Predecessor: 16728096
 > [  32.999400] (2:node@c-1.me) My finger table:
 > [  32.999400] (2:node@c-1.me) Start | Succ 
 > [  32.999400] (2:node@c-1.me)  366681  |  42 
@@ -729,60 +819,60 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.
 > [  32.999400] (2:node@c-1.me)  4560984  | 366680 
 > [  32.999400] (2:node@c-1.me)  8755288  | 366680 
 > [  32.999400] (2:node@c-1.me) Predecessor: 533744
-> [  33.999400] (2:node@c-1.me) My finger table:
-> [  33.999400] (2:node@c-1.me) Start | Succ 
-> [  33.999400] (2:node@c-1.me)  366681  |  42 
-> [  33.999400] (2:node@c-1.me)  366682  | 366680 
-> [  33.999400] (2:node@c-1.me)  366684  | 366680 
-> [  33.999400] (2:node@c-1.me)  366688  | 366680 
-> [  33.999400] (2:node@c-1.me)  366696  | 366680 
-> [  33.999400] (2:node@c-1.me)  366712  | 366680 
-> [  33.999400] (2:node@c-1.me)  366744  | 366680 
-> [  33.999400] (2:node@c-1.me)  366808  | 366680 
-> [  33.999400] (2:node@c-1.me)  366936  | 366680 
-> [  33.999400] (2:node@c-1.me)  367192  | 366680 
-> [  33.999400] (2:node@c-1.me)  367704  | 366680 
-> [  33.999400] (2:node@c-1.me)  368728  | 366680 
-> [  33.999400] (2:node@c-1.me)  370776  | 366680 
-> [  33.999400] (2:node@c-1.me)  374872  | 366680 
-> [  33.999400] (2:node@c-1.me)  383064  | 366680 
-> [  33.999400] (2:node@c-1.me)  399448  | 366680 
-> [  33.999400] (2:node@c-1.me)  432216  | 366680 
-> [  33.999400] (2:node@c-1.me)  497752  | 366680 
-> [  33.999400] (2:node@c-1.me)  628824  | 366680 
-> [  33.999400] (2:node@c-1.me)  890968  | 366680 
-> [  33.999400] (2:node@c-1.me)  1415256  | 366680 
-> [  33.999400] (2:node@c-1.me)  2463832  | 366680 
-> [  33.999400] (2:node@c-1.me)  4560984  | 366680 
-> [  33.999400] (2:node@c-1.me)  8755288  | 366680 
-> [  33.999400] (2:node@c-1.me) Predecessor: 16509405
-> [  35.999300] (4:node@c-3.me) My finger table:
-> [  35.999300] (4:node@c-3.me) Start | Succ 
-> [  35.999300] (4:node@c-3.me)  1319739  |  42 
-> [  35.999300] (4:node@c-3.me)  1319740  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319742  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319746  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319754  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319770  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319802  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319866  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1319994  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1320250  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1320762  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1321786  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1323834  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1327930  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1336122  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1352506  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1385274  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1450810  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1581882  | 1319738 
-> [  35.999300] (4:node@c-3.me)  1844026  | 1319738 
-> [  35.999300] (4:node@c-3.me)  2368314  | 1319738 
-> [  35.999300] (4:node@c-3.me)  3416890  | 1319738 
-> [  35.999300] (4:node@c-3.me)  5514042  | 1319738 
-> [  35.999300] (4:node@c-3.me)  9708346  | 1319738 
-> [  35.999300] (4:node@c-3.me) Predecessor: 16728096
+> [  34.999400] (2:node@c-1.me) My finger table:
+> [  34.999400] (2:node@c-1.me) Start | Succ 
+> [  34.999400] (2:node@c-1.me)  366681  |  42 
+> [  34.999400] (2:node@c-1.me)  366682  | 366680 
+> [  34.999400] (2:node@c-1.me)  366684  | 366680 
+> [  34.999400] (2:node@c-1.me)  366688  | 366680 
+> [  34.999400] (2:node@c-1.me)  366696  | 366680 
+> [  34.999400] (2:node@c-1.me)  366712  | 366680 
+> [  34.999400] (2:node@c-1.me)  366744  | 366680 
+> [  34.999400] (2:node@c-1.me)  366808  | 366680 
+> [  34.999400] (2:node@c-1.me)  366936  | 366680 
+> [  34.999400] (2:node@c-1.me)  367192  | 366680 
+> [  34.999400] (2:node@c-1.me)  367704  | 366680 
+> [  34.999400] (2:node@c-1.me)  368728  | 366680 
+> [  34.999400] (2:node@c-1.me)  370776  | 366680 
+> [  34.999400] (2:node@c-1.me)  374872  | 366680 
+> [  34.999400] (2:node@c-1.me)  383064  | 366680 
+> [  34.999400] (2:node@c-1.me)  399448  | 366680 
+> [  34.999400] (2:node@c-1.me)  432216  | 366680 
+> [  34.999400] (2:node@c-1.me)  497752  | 366680 
+> [  34.999400] (2:node@c-1.me)  628824  | 366680 
+> [  34.999400] (2:node@c-1.me)  890968  | 366680 
+> [  34.999400] (2:node@c-1.me)  1415256  | 366680 
+> [  34.999400] (2:node@c-1.me)  2463832  | 366680 
+> [  34.999400] (2:node@c-1.me)  4560984  | 366680 
+> [  34.999400] (2:node@c-1.me)  8755288  | 366680 
+> [  34.999400] (2:node@c-1.me) Predecessor: 16509405
+> [  35.999400] (5:node@c-4.me) My finger table:
+> [  35.999400] (5:node@c-4.me) Start | Succ 
+> [  35.999400] (5:node@c-4.me)  16509406  | 366680 
+> [  35.999400] (5:node@c-4.me)  16509407  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509409  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509413  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509421  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509437  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509469  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509533  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509661  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16509917  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16510429  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16511453  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16513501  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16517597  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16525789  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16542173  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16574941  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16640477  | 16509405 
+> [  35.999400] (5:node@c-4.me)  16771549  | 16509405 
+> [  35.999400] (5:node@c-4.me)  256477  | 16509405 
+> [  35.999400] (5:node@c-4.me)  780765  | 16509405 
+> [  35.999400] (5:node@c-4.me)  1829341  | 16509405 
+> [  35.999400] (5:node@c-4.me)  3926493  | 16509405 
+> [  35.999400] (5:node@c-4.me)  8120797  | 16509405 
+> [  35.999400] (5:node@c-4.me) Predecessor: 10004760
 > [  49.999000] (1:node@c-0.me) My finger table:
 > [  49.999000] (1:node@c-0.me) Start | Succ 
 > [  49.999000] (1:node@c-0.me)   43  |  42 
@@ -810,2030 +900,2003 @@ $ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT ${srcdir:=.}/../../platforms/cluster.
 > [  49.999000] (1:node@c-0.me)  4194346  |  42 
 > [  49.999000] (1:node@c-0.me)  8388650  |  42 
 > [  49.999000] (1:node@c-0.me) Predecessor: 366680
-> [  59.998800] (1:node@c-0.me) My finger table:
-> [  59.998800] (1:node@c-0.me) Start | Succ 
-> [  59.998800] (1:node@c-0.me)   43  | 366680 
-> [  59.998800] (1:node@c-0.me)   44  |  42 
-> [  59.998800] (1:node@c-0.me)   46  |  42 
-> [  59.998800] (1:node@c-0.me)   50  |  42 
-> [  59.998800] (1:node@c-0.me)   58  |  42 
-> [  59.998800] (1:node@c-0.me)   74  |  42 
-> [  59.998800] (1:node@c-0.me)  106  |  42 
-> [  59.998800] (1:node@c-0.me)  170  |  42 
-> [  59.998800] (1:node@c-0.me)  298  |  42 
-> [  59.998800] (1:node@c-0.me)  554  |  42 
-> [  59.998800] (1:node@c-0.me)  1066  |  42 
-> [  59.998800] (1:node@c-0.me)  2090  |  42 
-> [  59.998800] (1:node@c-0.me)  4138  |  42 
-> [  59.998800] (1:node@c-0.me)  8234  |  42 
-> [  59.998800] (1:node@c-0.me)  16426  |  42 
-> [  59.998800] (1:node@c-0.me)  32810  |  42 
-> [  59.998800] (1:node@c-0.me)  65578  |  42 
-> [  59.998800] (1:node@c-0.me)  131114  |  42 
-> [  59.998800] (1:node@c-0.me)  262186  |  42 
-> [  59.998800] (1:node@c-0.me)  524330  |  42 
-> [  59.998800] (1:node@c-0.me)  1048618  |  42 
-> [  59.998800] (1:node@c-0.me)  2097194  |  42 
-> [  59.998800] (1:node@c-0.me)  4194346  |  42 
-> [  59.998800] (1:node@c-0.me)  8388650  |  42 
-> [  59.998800] (1:node@c-0.me) Predecessor: 1319738
-> [  69.998600] (1:node@c-0.me) My finger table:
-> [  69.998600] (1:node@c-0.me) Start | Succ 
-> [  69.998600] (1:node@c-0.me)   43  | 366680 
-> [  69.998600] (1:node@c-0.me)   44  |  42 
-> [  69.998600] (1:node@c-0.me)   46  |  42 
-> [  69.998600] (1:node@c-0.me)   50  |  42 
-> [  69.998600] (1:node@c-0.me)   58  |  42 
-> [  69.998600] (1:node@c-0.me)   74  |  42 
-> [  69.998600] (1:node@c-0.me)  106  |  42 
-> [  69.998600] (1:node@c-0.me)  170  |  42 
-> [  69.998600] (1:node@c-0.me)  298  |  42 
-> [  69.998600] (1:node@c-0.me)  554  |  42 
-> [  69.998600] (1:node@c-0.me)  1066  |  42 
-> [  69.998600] (1:node@c-0.me)  2090  |  42 
-> [  69.998600] (1:node@c-0.me)  4138  |  42 
-> [  69.998600] (1:node@c-0.me)  8234  |  42 
-> [  69.998600] (1:node@c-0.me)  16426  |  42 
-> [  69.998600] (1:node@c-0.me)  32810  |  42 
-> [  69.998600] (1:node@c-0.me)  65578  |  42 
-> [  69.998600] (1:node@c-0.me)  131114  |  42 
-> [  69.998600] (1:node@c-0.me)  262186  |  42 
-> [  69.998600] (1:node@c-0.me)  524330  |  42 
-> [  69.998600] (1:node@c-0.me)  1048618  |  42 
-> [  69.998600] (1:node@c-0.me)  2097194  |  42 
-> [  69.998600] (1:node@c-0.me)  4194346  |  42 
-> [  69.998600] (1:node@c-0.me)  8388650  |  42 
-> [  69.998600] (1:node@c-0.me) Predecessor: 6518808
-> [  81.998500] (2:node@c-1.me) My finger table:
-> [  81.998500] (2:node@c-1.me) Start | Succ 
-> [  81.998500] (2:node@c-1.me)  366681  | 6518808 
-> [  81.998500] (2:node@c-1.me)  366682  | 366680 
-> [  81.998500] (2:node@c-1.me)  366684  | 366680 
-> [  81.998500] (2:node@c-1.me)  366688  | 366680 
-> [  81.998500] (2:node@c-1.me)  366696  | 366680 
-> [  81.998500] (2:node@c-1.me)  366712  | 366680 
-> [  81.998500] (2:node@c-1.me)  366744  | 366680 
-> [  81.998500] (2:node@c-1.me)  366808  | 366680 
-> [  81.998500] (2:node@c-1.me)  366936  | 366680 
-> [  81.998500] (2:node@c-1.me)  367192  | 366680 
-> [  81.998500] (2:node@c-1.me)  367704  | 366680 
-> [  81.998500] (2:node@c-1.me)  368728  | 366680 
-> [  81.998500] (2:node@c-1.me)  370776  | 366680 
-> [  81.998500] (2:node@c-1.me)  374872  | 366680 
-> [  81.998500] (2:node@c-1.me)  383064  | 366680 
-> [  81.998500] (2:node@c-1.me)  399448  | 366680 
-> [  81.998500] (2:node@c-1.me)  432216  | 366680 
-> [  81.998500] (2:node@c-1.me)  497752  | 366680 
-> [  81.998500] (2:node@c-1.me)  628824  | 366680 
-> [  81.998500] (2:node@c-1.me)  890968  | 366680 
-> [  81.998500] (2:node@c-1.me)  1415256  | 366680 
-> [  81.998500] (2:node@c-1.me)  2463832  | 366680 
-> [  81.998500] (2:node@c-1.me)  4560984  | 366680 
-> [  81.998500] (2:node@c-1.me)  8755288  | 366680 
-> [  81.998500] (2:node@c-1.me) Predecessor: 42
-> [  98.998100] (7:node@c-6.me) My finger table:
-> [  98.998100] (7:node@c-6.me) Start | Succ 
-> [  98.998100] (7:node@c-6.me)  16728097  | 1319738 
-> [  98.998100] (7:node@c-6.me)  16728098  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728100  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728104  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728112  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728128  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728160  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728224  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728352  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16728608  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16729120  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16730144  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16732192  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16736288  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16744480  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16760864  | 16728096 
-> [  98.998100] (7:node@c-6.me)  16416  | 16728096 
-> [  98.998100] (7:node@c-6.me)  81952  | 16728096 
-> [  98.998100] (7:node@c-6.me)  213024  | 16728096 
-> [  98.998100] (7:node@c-6.me)  475168  | 16728096 
-> [  98.998100] (7:node@c-6.me)  999456  | 16728096 
-> [  98.998100] (7:node@c-6.me)  2048032  | 16728096 
-> [  98.998100] (7:node@c-6.me)  4145184  | 16728096 
-> [  98.998100] (7:node@c-6.me)  8339488  | 16728096 
-> [  98.998100] (7:node@c-6.me) Predecessor: 2015253
-> [ 110.998000] (9:node@c-8.me) My finger table:
-> [ 110.998000] (9:node@c-8.me) Start | Succ 
-> [ 110.998000] (9:node@c-8.me)  6518809  |  42 
-> [ 110.998000] (9:node@c-8.me)  6518810  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6518812  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6518816  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6518824  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6518840  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6518872  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6518936  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6519064  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6519320  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6519832  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6520856  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6522904  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6527000  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6535192  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6551576  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6584344  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6649880  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  6780952  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  7043096  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  7567384  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  8615960  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  10713112  | 6518808 
-> [ 110.998000] (9:node@c-8.me)  14907416  | 6518808 
-> [ 110.998000] (9:node@c-8.me) Predecessor: 366680
-> [ 111.998000] (9:node@c-8.me) My finger table:
-> [ 111.998000] (9:node@c-8.me) Start | Succ 
-> [ 111.998000] (9:node@c-8.me)  6518809  |  42 
-> [ 111.998000] (9:node@c-8.me)  6518810  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6518812  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6518816  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6518824  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6518840  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6518872  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6518936  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6519064  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6519320  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6519832  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6520856  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6522904  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6527000  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6535192  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6551576  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6584344  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6649880  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  6780952  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  7043096  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  7567384  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  8615960  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  10713112  | 6518808 
-> [ 111.998000] (9:node@c-8.me)  14907416  | 6518808 
-> [ 111.998000] (9:node@c-8.me) Predecessor: 1319738
-> [ 127.997700] (8:node@c-7.me) My finger table:
-> [ 127.997700] (8:node@c-7.me) Start | Succ 
-> [ 127.997700] (8:node@c-7.me)  10004761  | 16509405 
-> [ 127.997700] (8:node@c-7.me)  10004762  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10004764  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10004768  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10004776  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10004792  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10004824  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10004888  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10005016  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10005272  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10005784  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10006808  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10008856  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10012952  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10021144  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10037528  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10070296  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10135832  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10266904  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  10529048  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  11053336  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  12101912  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  14199064  | 10004760 
-> [ 127.997700] (8:node@c-7.me)  1616152  | 10004760 
-> [ 127.997700] (8:node@c-7.me) Predecessor: 533744
-> [ 137.997600] (1:node@c-0.me) My finger table:
-> [ 137.997600] (1:node@c-0.me) Start | Succ 
-> [ 137.997600] (1:node@c-0.me)   43  | 366680 
-> [ 137.997600] (1:node@c-0.me)   44  |  42 
-> [ 137.997600] (1:node@c-0.me)   46  |  42 
-> [ 137.997600] (1:node@c-0.me)   50  |  42 
-> [ 137.997600] (1:node@c-0.me)   58  |  42 
-> [ 137.997600] (1:node@c-0.me)   74  |  42 
-> [ 137.997600] (1:node@c-0.me)  106  |  42 
-> [ 137.997600] (1:node@c-0.me)  170  |  42 
-> [ 137.997600] (1:node@c-0.me)  298  |  42 
-> [ 137.997600] (1:node@c-0.me)  554  |  42 
-> [ 137.997600] (1:node@c-0.me)  1066  |  42 
-> [ 137.997600] (1:node@c-0.me)  2090  |  42 
-> [ 137.997600] (1:node@c-0.me)  4138  |  42 
-> [ 137.997600] (1:node@c-0.me)  8234  |  42 
-> [ 137.997600] (1:node@c-0.me)  16426  |  42 
-> [ 137.997600] (1:node@c-0.me)  32810  |  42 
-> [ 137.997600] (1:node@c-0.me)  65578  |  42 
-> [ 137.997600] (1:node@c-0.me)  131114  |  42 
-> [ 137.997600] (1:node@c-0.me)  262186  |  42 
-> [ 137.997600] (1:node@c-0.me)  524330  |  42 
-> [ 137.997600] (1:node@c-0.me)  1048618  |  42 
-> [ 137.997600] (1:node@c-0.me)  2097194  |  42 
-> [ 137.997600] (1:node@c-0.me)  4194346  |  42 
-> [ 137.997600] (1:node@c-0.me)  8388650  |  42 
-> [ 137.997600] (1:node@c-0.me) Predecessor: 16509405
-> [ 165.997100] (4:node@c-3.me) My finger table:
-> [ 165.997100] (4:node@c-3.me) Start | Succ 
-> [ 165.997100] (4:node@c-3.me)  1319739  | 6518808 
-> [ 165.997100] (4:node@c-3.me)  1319740  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319742  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319746  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319754  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319770  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319802  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319866  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1319994  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1320250  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1320762  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1321786  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1323834  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1327930  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1336122  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1352506  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1385274  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1450810  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1581882  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  1844026  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  2368314  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  3416890  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  5514042  | 1319738 
-> [ 165.997100] (4:node@c-3.me)  9708346  | 1319738 
-> [ 165.997100] (4:node@c-3.me) Predecessor: 366680
-> [ 209.996500] (8:node@c-7.me) My finger table:
-> [ 209.996500] (8:node@c-7.me) Start | Succ 
-> [ 209.996500] (8:node@c-7.me)  10004761  | 16509405 
-> [ 209.996500] (8:node@c-7.me)  10004762  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10004764  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10004768  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10004776  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10004792  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10004824  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10004888  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10005016  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10005272  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10005784  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10006808  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10008856  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10012952  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10021144  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10037528  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10070296  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10135832  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10266904  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  10529048  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  11053336  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  12101912  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  14199064  | 10004760 
-> [ 209.996500] (8:node@c-7.me)  1616152  | 10004760 
-> [ 209.996500] (8:node@c-7.me) Predecessor: 6518808
-> [ 247.995800] (6:node@c-5.me) My finger table:
-> [ 247.995800] (6:node@c-5.me) Start | Succ 
-> [ 247.995800] (6:node@c-5.me)  10874877  | 533744 
-> [ 247.995800] (6:node@c-5.me)  10874878  | 533744 
-> [ 247.995800] (6:node@c-5.me)  10874880  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10874884  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10874892  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10874908  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10874940  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10875004  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10875132  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10875388  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10875900  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10876924  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10878972  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10883068  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10891260  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10907644  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  10940412  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  11005948  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  11137020  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  11399164  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  11923452  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  12972028  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  15069180  | 10874876 
-> [ 247.995800] (6:node@c-5.me)  2486268  | 10874876 
-> [ 247.995800] (6:node@c-5.me) Predecessor: -1
-> [ 249.995700] (7:node@c-6.me) My finger table:
-> [ 249.995700] (7:node@c-6.me) Start | Succ 
-> [ 249.995700] (7:node@c-6.me)  16728097  |  42 
-> [ 249.995700] (7:node@c-6.me)  16728098  |  42 
-> [ 249.995700] (7:node@c-6.me)  16728100  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728104  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728112  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728128  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728160  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728224  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728352  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16728608  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16729120  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16730144  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16732192  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16736288  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16744480  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16760864  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  16416  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  81952  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  213024  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  475168  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  999456  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  2048032  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  4145184  | 16728096 
-> [ 249.995700] (7:node@c-6.me)  8339488  | 16728096 
-> [ 249.995700] (7:node@c-6.me) Predecessor: 2015253
-> [ 251.995700] (8:node@c-7.me) My finger table:
-> [ 251.995700] (8:node@c-7.me) Start | Succ 
-> [ 251.995700] (8:node@c-7.me)  10004761  | 16509405 
-> [ 251.995700] (8:node@c-7.me)  10004762  | 16509405 
-> [ 251.995700] (8:node@c-7.me)  10004764  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10004768  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10004776  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10004792  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10004824  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10004888  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10005016  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10005272  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10005784  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10006808  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10008856  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10012952  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10021144  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10037528  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10070296  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10135832  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10266904  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  10529048  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  11053336  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  12101912  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  14199064  | 10004760 
-> [ 251.995700] (8:node@c-7.me)  1616152  | 10004760 
-> [ 251.995700] (8:node@c-7.me) Predecessor: 6518808
-> [ 252.995700] (2:node@c-1.me) My finger table:
-> [ 252.995700] (2:node@c-1.me) Start | Succ 
-> [ 252.995700] (2:node@c-1.me)  366681  | 1319738 
-> [ 252.995700] (2:node@c-1.me)  366682  | 1319738 
-> [ 252.995700] (2:node@c-1.me)  366684  | 366680 
-> [ 252.995700] (2:node@c-1.me)  366688  | 366680 
-> [ 252.995700] (2:node@c-1.me)  366696  | 366680 
-> [ 252.995700] (2:node@c-1.me)  366712  | 366680 
-> [ 252.995700] (2:node@c-1.me)  366744  | 366680 
-> [ 252.995700] (2:node@c-1.me)  366808  | 366680 
-> [ 252.995700] (2:node@c-1.me)  366936  | 366680 
-> [ 252.995700] (2:node@c-1.me)  367192  | 366680 
-> [ 252.995700] (2:node@c-1.me)  367704  | 366680 
-> [ 252.995700] (2:node@c-1.me)  368728  | 366680 
-> [ 252.995700] (2:node@c-1.me)  370776  | 366680 
-> [ 252.995700] (2:node@c-1.me)  374872  | 366680 
-> [ 252.995700] (2:node@c-1.me)  383064  | 366680 
-> [ 252.995700] (2:node@c-1.me)  399448  | 366680 
-> [ 252.995700] (2:node@c-1.me)  432216  | 366680 
-> [ 252.995700] (2:node@c-1.me)  497752  | 366680 
-> [ 252.995700] (2:node@c-1.me)  628824  | 366680 
-> [ 252.995700] (2:node@c-1.me)  890968  | 366680 
-> [ 252.995700] (2:node@c-1.me)  1415256  | 366680 
-> [ 252.995700] (2:node@c-1.me)  2463832  | 366680 
-> [ 252.995700] (2:node@c-1.me)  4560984  | 366680 
-> [ 252.995700] (2:node@c-1.me)  8755288  | 366680 
-> [ 252.995700] (2:node@c-1.me) Predecessor: 42
-> [ 254.995700] (1:node@c-0.me) My finger table:
-> [ 254.995700] (1:node@c-0.me) Start | Succ 
-> [ 254.995700] (1:node@c-0.me)   43  | 366680 
-> [ 254.995700] (1:node@c-0.me)   44  |  42 
-> [ 254.995700] (1:node@c-0.me)   46  |  42 
-> [ 254.995700] (1:node@c-0.me)   50  |  42 
-> [ 254.995700] (1:node@c-0.me)   58  |  42 
-> [ 254.995700] (1:node@c-0.me)   74  |  42 
-> [ 254.995700] (1:node@c-0.me)  106  |  42 
-> [ 254.995700] (1:node@c-0.me)  170  |  42 
-> [ 254.995700] (1:node@c-0.me)  298  |  42 
-> [ 254.995700] (1:node@c-0.me)  554  |  42 
-> [ 254.995700] (1:node@c-0.me)  1066  |  42 
-> [ 254.995700] (1:node@c-0.me)  2090  |  42 
-> [ 254.995700] (1:node@c-0.me)  4138  |  42 
-> [ 254.995700] (1:node@c-0.me)  8234  |  42 
-> [ 254.995700] (1:node@c-0.me)  16426  |  42 
-> [ 254.995700] (1:node@c-0.me)  32810  |  42 
-> [ 254.995700] (1:node@c-0.me)  65578  |  42 
-> [ 254.995700] (1:node@c-0.me)  131114  |  42 
-> [ 254.995700] (1:node@c-0.me)  262186  |  42 
-> [ 254.995700] (1:node@c-0.me)  524330  |  42 
-> [ 254.995700] (1:node@c-0.me)  1048618  |  42 
-> [ 254.995700] (1:node@c-0.me)  2097194  |  42 
-> [ 254.995700] (1:node@c-0.me)  4194346  |  42 
-> [ 254.995700] (1:node@c-0.me)  8388650  |  42 
-> [ 254.995700] (1:node@c-0.me) Predecessor: 16728096
-> [ 254.995700] (4:node@c-3.me) My finger table:
-> [ 254.995700] (4:node@c-3.me) Start | Succ 
-> [ 254.995700] (4:node@c-3.me)  1319739  | 6518808 
-> [ 254.995700] (4:node@c-3.me)  1319740  | 6518808 
-> [ 254.995700] (4:node@c-3.me)  1319742  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1319746  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1319754  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1319770  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1319802  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1319866  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1319994  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1320250  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1320762  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1321786  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1323834  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1327930  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1336122  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1352506  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1385274  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1450810  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1581882  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  1844026  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  2368314  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  3416890  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  5514042  | 1319738 
-> [ 254.995700] (4:node@c-3.me)  9708346  | 1319738 
-> [ 254.995700] (4:node@c-3.me) Predecessor: 366680
-> [ 255.995700] (1:node@c-0.me) My finger table:
-> [ 255.995700] (1:node@c-0.me) Start | Succ 
-> [ 255.995700] (1:node@c-0.me)   43  | 366680 
-> [ 255.995700] (1:node@c-0.me)   44  | 366680 
-> [ 255.995700] (1:node@c-0.me)   46  |  42 
-> [ 255.995700] (1:node@c-0.me)   50  |  42 
-> [ 255.995700] (1:node@c-0.me)   58  |  42 
-> [ 255.995700] (1:node@c-0.me)   74  |  42 
-> [ 255.995700] (1:node@c-0.me)  106  |  42 
-> [ 255.995700] (1:node@c-0.me)  170  |  42 
-> [ 255.995700] (1:node@c-0.me)  298  |  42 
-> [ 255.995700] (1:node@c-0.me)  554  |  42 
-> [ 255.995700] (1:node@c-0.me)  1066  |  42 
-> [ 255.995700] (1:node@c-0.me)  2090  |  42 
-> [ 255.995700] (1:node@c-0.me)  4138  |  42 
-> [ 255.995700] (1:node@c-0.me)  8234  |  42 
-> [ 255.995700] (1:node@c-0.me)  16426  |  42 
-> [ 255.995700] (1:node@c-0.me)  32810  |  42 
-> [ 255.995700] (1:node@c-0.me)  65578  |  42 
-> [ 255.995700] (1:node@c-0.me)  131114  |  42 
-> [ 255.995700] (1:node@c-0.me)  262186  |  42 
-> [ 255.995700] (1:node@c-0.me)  524330  |  42 
-> [ 255.995700] (1:node@c-0.me)  1048618  |  42 
-> [ 255.995700] (1:node@c-0.me)  2097194  |  42 
-> [ 255.995700] (1:node@c-0.me)  4194346  |  42 
-> [ 255.995700] (1:node@c-0.me)  8388650  |  42 
-> [ 255.995700] (1:node@c-0.me) Predecessor: 16728096
-> [ 255.995700] (5:node@c-4.me) My finger table:
-> [ 255.995700] (5:node@c-4.me) Start | Succ 
-> [ 255.995700] (5:node@c-4.me)  16509406  |  42 
-> [ 255.995700] (5:node@c-4.me)  16509407  |  42 
-> [ 255.995700] (5:node@c-4.me)  16509409  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509413  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509421  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509437  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509469  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509533  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509661  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16509917  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16510429  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16511453  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16513501  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16517597  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16525789  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16542173  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16574941  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16640477  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  16771549  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  256477  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  780765  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  1829341  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  3926493  | 16509405 
-> [ 255.995700] (5:node@c-4.me)  8120797  | 16509405 
-> [ 255.995700] (5:node@c-4.me) Predecessor: 10004760
-> [ 257.995700] (10:node@c-9.me) My finger table:
-> [ 257.995700] (10:node@c-9.me) Start | Succ 
-> [ 257.995700] (10:node@c-9.me)  2015254  | 16728096 
-> [ 257.995700] (10:node@c-9.me)  2015255  | 16728096 
-> [ 257.995700] (10:node@c-9.me)  2015257  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015261  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015269  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015285  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015317  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015381  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015509  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2015765  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2016277  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2017301  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2019349  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2023445  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2031637  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2048021  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2080789  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2146325  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2277397  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  2539541  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  3063829  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  4112405  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  6209557  | 2015253 
-> [ 257.995700] (10:node@c-9.me)  10403861  | 2015253 
-> [ 257.995700] (10:node@c-9.me) Predecessor: -1
-> [ 263.995700] (3:node@c-2.me) My finger table:
-> [ 263.995700] (3:node@c-2.me) Start | Succ 
-> [ 263.995700] (3:node@c-2.me)  533745  | 1319738 
-> [ 263.995700] (3:node@c-2.me)  533746  | 1319738 
-> [ 263.995700] (3:node@c-2.me)  533748  | 533744 
-> [ 263.995700] (3:node@c-2.me)  533752  | 533744 
-> [ 263.995700] (3:node@c-2.me)  533760  | 533744 
-> [ 263.995700] (3:node@c-2.me)  533776  | 533744 
-> [ 263.995700] (3:node@c-2.me)  533808  | 533744 
-> [ 263.995700] (3:node@c-2.me)  533872  | 533744 
-> [ 263.995700] (3:node@c-2.me)  534000  | 533744 
-> [ 263.995700] (3:node@c-2.me)  534256  | 533744 
-> [ 263.995700] (3:node@c-2.me)  534768  | 533744 
-> [ 263.995700] (3:node@c-2.me)  535792  | 533744 
-> [ 263.995700] (3:node@c-2.me)  537840  | 533744 
-> [ 263.995700] (3:node@c-2.me)  541936  | 533744 
-> [ 263.995700] (3:node@c-2.me)  550128  | 533744 
-> [ 263.995700] (3:node@c-2.me)  566512  | 533744 
-> [ 263.995700] (3:node@c-2.me)  599280  | 533744 
-> [ 263.995700] (3:node@c-2.me)  664816  | 533744 
-> [ 263.995700] (3:node@c-2.me)  795888  | 533744 
-> [ 263.995700] (3:node@c-2.me)  1058032  | 533744 
-> [ 263.995700] (3:node@c-2.me)  1582320  | 533744 
-> [ 263.995700] (3:node@c-2.me)  2630896  | 533744 
-> [ 263.995700] (3:node@c-2.me)  4728048  | 533744 
-> [ 263.995700] (3:node@c-2.me)  8922352  | 533744 
-> [ 263.995700] (3:node@c-2.me) Predecessor: 10874876
-> [ 264.995500] (9:node@c-8.me) My finger table:
-> [ 264.995500] (9:node@c-8.me) Start | Succ 
-> [ 264.995500] (9:node@c-8.me)  6518809  | 10004760 
-> [ 264.995500] (9:node@c-8.me)  6518810  | 10004760 
-> [ 264.995500] (9:node@c-8.me)  6518812  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6518816  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6518824  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6518840  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6518872  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6518936  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6519064  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6519320  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6519832  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6520856  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6522904  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6527000  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6535192  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6551576  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6584344  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6649880  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  6780952  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  7043096  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  7567384  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  8615960  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  10713112  | 6518808 
-> [ 264.995500] (9:node@c-8.me)  14907416  | 6518808 
-> [ 264.995500] (9:node@c-8.me) Predecessor: 1319738
-> [ 310.994900] (4:node@c-3.me) My finger table:
-> [ 310.994900] (4:node@c-3.me) Start | Succ 
-> [ 310.994900] (4:node@c-3.me)  1319739  | 6518808 
-> [ 310.994900] (4:node@c-3.me)  1319740  | 6518808 
-> [ 310.994900] (4:node@c-3.me)  1319742  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1319746  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1319754  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1319770  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1319802  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1319866  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1319994  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1320250  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1320762  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1321786  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1323834  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1327930  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1336122  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1352506  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1385274  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1450810  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1581882  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  1844026  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  2368314  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  3416890  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  5514042  | 1319738 
-> [ 310.994900] (4:node@c-3.me)  9708346  | 1319738 
-> [ 310.994900] (4:node@c-3.me) Predecessor: 533744
-> [ 335.994500] (7:node@c-6.me) My finger table:
-> [ 335.994500] (7:node@c-6.me) Start | Succ 
-> [ 335.994500] (7:node@c-6.me)  16728097  |  42 
-> [ 335.994500] (7:node@c-6.me)  16728098  |  42 
-> [ 335.994500] (7:node@c-6.me)  16728100  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728104  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728112  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728128  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728160  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728224  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728352  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16728608  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16729120  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16730144  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16732192  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16736288  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16744480  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16760864  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  16416  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  81952  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  213024  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  475168  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  999456  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  2048032  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  4145184  | 16728096 
-> [ 335.994500] (7:node@c-6.me)  8339488  | 16728096 
-> [ 335.994500] (7:node@c-6.me) Predecessor: 16509405
-> [ 366.994000] (3:node@c-2.me) My finger table:
-> [ 366.994000] (3:node@c-2.me) Start | Succ 
-> [ 366.994000] (3:node@c-2.me)  533745  | 1319738 
-> [ 366.994000] (3:node@c-2.me)  533746  | 1319738 
-> [ 366.994000] (3:node@c-2.me)  533748  | 533744 
-> [ 366.994000] (3:node@c-2.me)  533752  | 533744 
-> [ 366.994000] (3:node@c-2.me)  533760  | 533744 
-> [ 366.994000] (3:node@c-2.me)  533776  | 533744 
-> [ 366.994000] (3:node@c-2.me)  533808  | 533744 
-> [ 366.994000] (3:node@c-2.me)  533872  | 533744 
-> [ 366.994000] (3:node@c-2.me)  534000  | 533744 
-> [ 366.994000] (3:node@c-2.me)  534256  | 533744 
-> [ 366.994000] (3:node@c-2.me)  534768  | 533744 
-> [ 366.994000] (3:node@c-2.me)  535792  | 533744 
-> [ 366.994000] (3:node@c-2.me)  537840  | 533744 
-> [ 366.994000] (3:node@c-2.me)  541936  | 533744 
-> [ 366.994000] (3:node@c-2.me)  550128  | 533744 
-> [ 366.994000] (3:node@c-2.me)  566512  | 533744 
-> [ 366.994000] (3:node@c-2.me)  599280  | 533744 
-> [ 366.994000] (3:node@c-2.me)  664816  | 533744 
-> [ 366.994000] (3:node@c-2.me)  795888  | 533744 
-> [ 366.994000] (3:node@c-2.me)  1058032  | 533744 
-> [ 366.994000] (3:node@c-2.me)  1582320  | 533744 
-> [ 366.994000] (3:node@c-2.me)  2630896  | 533744 
-> [ 366.994000] (3:node@c-2.me)  4728048  | 533744 
-> [ 366.994000] (3:node@c-2.me)  8922352  | 533744 
-> [ 366.994000] (3:node@c-2.me) Predecessor: 366680
-> [ 370.993500] (6:node@c-5.me) My finger table:
-> [ 370.993500] (6:node@c-5.me) Start | Succ 
-> [ 370.993500] (6:node@c-5.me)  10874877  | 533744 
-> [ 370.993500] (6:node@c-5.me)  10874878  | 533744 
-> [ 370.993500] (6:node@c-5.me)  10874880  | 533744 
-> [ 370.993500] (6:node@c-5.me)  10874884  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10874892  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10874908  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10874940  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10875004  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10875132  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10875388  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10875900  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10876924  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10878972  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10883068  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10891260  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10907644  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  10940412  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  11005948  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  11137020  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  11399164  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  11923452  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  12972028  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  15069180  | 10874876 
-> [ 370.993500] (6:node@c-5.me)  2486268  | 10874876 
-> [ 370.993500] (6:node@c-5.me) Predecessor: -1
-> [ 375.993800] (2:node@c-1.me) My finger table:
-> [ 375.993800] (2:node@c-1.me) Start | Succ 
-> [ 375.993800] (2:node@c-1.me)  366681  | 533744 
-> [ 375.993800] (2:node@c-1.me)  366682  | 1319738 
-> [ 375.993800] (2:node@c-1.me)  366684  | 533744 
-> [ 375.993800] (2:node@c-1.me)  366688  | 366680 
-> [ 375.993800] (2:node@c-1.me)  366696  | 366680 
-> [ 375.993800] (2:node@c-1.me)  366712  | 366680 
-> [ 375.993800] (2:node@c-1.me)  366744  | 366680 
-> [ 375.993800] (2:node@c-1.me)  366808  | 366680 
-> [ 375.993800] (2:node@c-1.me)  366936  | 366680 
-> [ 375.993800] (2:node@c-1.me)  367192  | 366680 
-> [ 375.993800] (2:node@c-1.me)  367704  | 366680 
-> [ 375.993800] (2:node@c-1.me)  368728  | 366680 
-> [ 375.993800] (2:node@c-1.me)  370776  | 366680 
-> [ 375.993800] (2:node@c-1.me)  374872  | 366680 
-> [ 375.993800] (2:node@c-1.me)  383064  | 366680 
-> [ 375.993800] (2:node@c-1.me)  399448  | 366680 
-> [ 375.993800] (2:node@c-1.me)  432216  | 366680 
-> [ 375.993800] (2:node@c-1.me)  497752  | 366680 
-> [ 375.993800] (2:node@c-1.me)  628824  | 366680 
-> [ 375.993800] (2:node@c-1.me)  890968  | 366680 
-> [ 375.993800] (2:node@c-1.me)  1415256  | 366680 
-> [ 375.993800] (2:node@c-1.me)  2463832  | 366680 
-> [ 375.993800] (2:node@c-1.me)  4560984  | 366680 
-> [ 375.993800] (2:node@c-1.me)  8755288  | 366680 
-> [ 375.993800] (2:node@c-1.me) Predecessor: 42
-> [ 376.993800] (1:node@c-0.me) My finger table:
-> [ 376.993800] (1:node@c-0.me) Start | Succ 
-> [ 376.993800] (1:node@c-0.me)   43  | 366680 
-> [ 376.993800] (1:node@c-0.me)   44  | 366680 
-> [ 376.993800] (1:node@c-0.me)   46  | 366680 
-> [ 376.993800] (1:node@c-0.me)   50  |  42 
-> [ 376.993800] (1:node@c-0.me)   58  |  42 
-> [ 376.993800] (1:node@c-0.me)   74  |  42 
-> [ 376.993800] (1:node@c-0.me)  106  |  42 
-> [ 376.993800] (1:node@c-0.me)  170  |  42 
-> [ 376.993800] (1:node@c-0.me)  298  |  42 
-> [ 376.993800] (1:node@c-0.me)  554  |  42 
-> [ 376.993800] (1:node@c-0.me)  1066  |  42 
-> [ 376.993800] (1:node@c-0.me)  2090  |  42 
-> [ 376.993800] (1:node@c-0.me)  4138  |  42 
-> [ 376.993800] (1:node@c-0.me)  8234  |  42 
-> [ 376.993800] (1:node@c-0.me)  16426  |  42 
-> [ 376.993800] (1:node@c-0.me)  32810  |  42 
-> [ 376.993800] (1:node@c-0.me)  65578  |  42 
-> [ 376.993800] (1:node@c-0.me)  131114  |  42 
-> [ 376.993800] (1:node@c-0.me)  262186  |  42 
-> [ 376.993800] (1:node@c-0.me)  524330  |  42 
-> [ 376.993800] (1:node@c-0.me)  1048618  |  42 
-> [ 376.993800] (1:node@c-0.me)  2097194  |  42 
-> [ 376.993800] (1:node@c-0.me)  4194346  |  42 
-> [ 376.993800] (1:node@c-0.me)  8388650  |  42 
-> [ 376.993800] (1:node@c-0.me) Predecessor: 16728096
-> [ 376.993800] (4:node@c-3.me) My finger table:
-> [ 376.993800] (4:node@c-3.me) Start | Succ 
-> [ 376.993800] (4:node@c-3.me)  1319739  | 6518808 
-> [ 376.993800] (4:node@c-3.me)  1319740  | 6518808 
-> [ 376.993800] (4:node@c-3.me)  1319742  | 6518808 
-> [ 376.993800] (4:node@c-3.me)  1319746  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1319754  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1319770  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1319802  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1319866  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1319994  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1320250  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1320762  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1321786  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1323834  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1327930  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1336122  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1352506  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1385274  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1450810  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1581882  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  1844026  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  2368314  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  3416890  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  5514042  | 1319738 
-> [ 376.993800] (4:node@c-3.me)  9708346  | 1319738 
-> [ 376.993800] (4:node@c-3.me) Predecessor: 533744
-> [ 378.993800] (10:node@c-9.me) My finger table:
-> [ 378.993800] (10:node@c-9.me) Start | Succ 
-> [ 378.993800] (10:node@c-9.me)  2015254  | 10004760 
-> [ 378.993800] (10:node@c-9.me)  2015255  | 16728096 
-> [ 378.993800] (10:node@c-9.me)  2015257  | 10004760 
-> [ 378.993800] (10:node@c-9.me)  2015261  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2015269  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2015285  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2015317  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2015381  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2015509  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2015765  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2016277  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2017301  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2019349  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2023445  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2031637  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2048021  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2080789  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2146325  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2277397  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  2539541  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  3063829  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  4112405  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  6209557  | 2015253 
-> [ 378.993800] (10:node@c-9.me)  10403861  | 2015253 
-> [ 378.993800] (10:node@c-9.me) Predecessor: -1
-> [ 378.993800] (5:node@c-4.me) My finger table:
-> [ 378.993800] (5:node@c-4.me) Start | Succ 
-> [ 378.993800] (5:node@c-4.me)  16509406  | 16728096 
-> [ 378.993800] (5:node@c-4.me)  16509407  |  42 
-> [ 378.993800] (5:node@c-4.me)  16509409  | 16728096 
-> [ 378.993800] (5:node@c-4.me)  16509413  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16509421  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16509437  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16509469  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16509533  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16509661  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16509917  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16510429  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16511453  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16513501  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16517597  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16525789  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16542173  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16574941  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16640477  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  16771549  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  256477  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  780765  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  1829341  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  3926493  | 16509405 
-> [ 378.993800] (5:node@c-4.me)  8120797  | 16509405 
-> [ 378.993800] (5:node@c-4.me) Predecessor: 10004760
-> [ 379.993800] (8:node@c-7.me) My finger table:
-> [ 379.993800] (8:node@c-7.me) Start | Succ 
-> [ 379.993800] (8:node@c-7.me)  10004761  | 16509405 
-> [ 379.993800] (8:node@c-7.me)  10004762  | 16509405 
-> [ 379.993800] (8:node@c-7.me)  10004764  | 16509405 
-> [ 379.993800] (8:node@c-7.me)  10004768  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10004776  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10004792  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10004824  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10004888  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10005016  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10005272  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10005784  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10006808  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10008856  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10012952  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10021144  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10037528  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10070296  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10135832  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10266904  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  10529048  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  11053336  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  12101912  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  14199064  | 10004760 
-> [ 379.993800] (8:node@c-7.me)  1616152  | 10004760 
-> [ 379.993800] (8:node@c-7.me) Predecessor: 6518808
-> [ 385.993700] (3:node@c-2.me) My finger table:
-> [ 385.993700] (3:node@c-2.me) Start | Succ 
-> [ 385.993700] (3:node@c-2.me)  533745  | 1319738 
-> [ 385.993700] (3:node@c-2.me)  533746  | 1319738 
-> [ 385.993700] (3:node@c-2.me)  533748  | 1319738 
-> [ 385.993700] (3:node@c-2.me)  533752  | 533744 
-> [ 385.993700] (3:node@c-2.me)  533760  | 533744 
-> [ 385.993700] (3:node@c-2.me)  533776  | 533744 
-> [ 385.993700] (3:node@c-2.me)  533808  | 533744 
-> [ 385.993700] (3:node@c-2.me)  533872  | 533744 
-> [ 385.993700] (3:node@c-2.me)  534000  | 533744 
-> [ 385.993700] (3:node@c-2.me)  534256  | 533744 
-> [ 385.993700] (3:node@c-2.me)  534768  | 533744 
-> [ 385.993700] (3:node@c-2.me)  535792  | 533744 
-> [ 385.993700] (3:node@c-2.me)  537840  | 533744 
-> [ 385.993700] (3:node@c-2.me)  541936  | 533744 
-> [ 385.993700] (3:node@c-2.me)  550128  | 533744 
-> [ 385.993700] (3:node@c-2.me)  566512  | 533744 
-> [ 385.993700] (3:node@c-2.me)  599280  | 533744 
-> [ 385.993700] (3:node@c-2.me)  664816  | 533744 
-> [ 385.993700] (3:node@c-2.me)  795888  | 533744 
-> [ 385.993700] (3:node@c-2.me)  1058032  | 533744 
-> [ 385.993700] (3:node@c-2.me)  1582320  | 533744 
-> [ 385.993700] (3:node@c-2.me)  2630896  | 533744 
-> [ 385.993700] (3:node@c-2.me)  4728048  | 533744 
-> [ 385.993700] (3:node@c-2.me)  8922352  | 533744 
-> [ 385.993700] (3:node@c-2.me) Predecessor: 366680
-> [ 387.993700] (7:node@c-6.me) My finger table:
-> [ 387.993700] (7:node@c-6.me) Start | Succ 
-> [ 387.993700] (7:node@c-6.me)  16728097  |  42 
-> [ 387.993700] (7:node@c-6.me)  16728098  |  42 
-> [ 387.993700] (7:node@c-6.me)  16728100  |  42 
-> [ 387.993700] (7:node@c-6.me)  16728104  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16728112  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16728128  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16728160  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16728224  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16728352  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16728608  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16729120  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16730144  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16732192  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16736288  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16744480  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16760864  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  16416  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  81952  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  213024  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  475168  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  999456  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  2048032  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  4145184  | 16728096 
-> [ 387.993700] (7:node@c-6.me)  8339488  | 16728096 
-> [ 387.993700] (7:node@c-6.me) Predecessor: 16509405
-> [ 389.993600] (9:node@c-8.me) My finger table:
-> [ 389.993600] (9:node@c-8.me) Start | Succ 
-> [ 389.993600] (9:node@c-8.me)  6518809  | 10004760 
-> [ 389.993600] (9:node@c-8.me)  6518810  | 10004760 
-> [ 389.993600] (9:node@c-8.me)  6518812  | 10004760 
-> [ 389.993600] (9:node@c-8.me)  6518816  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6518824  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6518840  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6518872  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6518936  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6519064  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6519320  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6519832  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6520856  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6522904  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6527000  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6535192  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6551576  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6584344  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6649880  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  6780952  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  7043096  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  7567384  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  8615960  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  10713112  | 6518808 
-> [ 389.993600] (9:node@c-8.me)  14907416  | 6518808 
-> [ 389.993600] (9:node@c-8.me) Predecessor: 1319738
-> [ 435.993000] (9:node@c-8.me) My finger table:
-> [ 435.993000] (9:node@c-8.me) Start | Succ 
-> [ 435.993000] (9:node@c-8.me)  6518809  | 10004760 
-> [ 435.993000] (9:node@c-8.me)  6518810  | 10004760 
-> [ 435.993000] (9:node@c-8.me)  6518812  | 10004760 
-> [ 435.993000] (9:node@c-8.me)  6518816  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6518824  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6518840  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6518872  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6518936  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6519064  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6519320  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6519832  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6520856  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6522904  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6527000  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6535192  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6551576  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6584344  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6649880  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  6780952  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  7043096  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  7567384  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  8615960  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  10713112  | 6518808 
-> [ 435.993000] (9:node@c-8.me)  14907416  | 6518808 
-> [ 435.993000] (9:node@c-8.me) Predecessor: 2015253
-> [ 492.992000] (6:node@c-5.me) My finger table:
-> [ 492.992000] (6:node@c-5.me) Start | Succ 
-> [ 492.992000] (6:node@c-5.me)  10874877  | 16509405 
-> [ 492.992000] (6:node@c-5.me)  10874878  | 533744 
-> [ 492.992000] (6:node@c-5.me)  10874880  | 533744 
-> [ 492.992000] (6:node@c-5.me)  10874884  | 16509405 
-> [ 492.992000] (6:node@c-5.me)  10874892  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10874908  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10874940  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10875004  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10875132  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10875388  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10875900  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10876924  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10878972  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10883068  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10891260  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10907644  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  10940412  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  11005948  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  11137020  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  11399164  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  11923452  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  12972028  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  15069180  | 10874876 
-> [ 492.992000] (6:node@c-5.me)  2486268  | 10874876 
-> [ 492.992000] (6:node@c-5.me) Predecessor: -1
-> [ 500.991800] (1:node@c-0.me) My finger table:
-> [ 500.991800] (1:node@c-0.me) Start | Succ 
-> [ 500.991800] (1:node@c-0.me)   43  | 366680 
-> [ 500.991800] (1:node@c-0.me)   44  | 366680 
-> [ 500.991800] (1:node@c-0.me)   46  | 366680 
-> [ 500.991800] (1:node@c-0.me)   50  | 366680 
-> [ 500.991800] (1:node@c-0.me)   58  |  42 
-> [ 500.991800] (1:node@c-0.me)   74  |  42 
-> [ 500.991800] (1:node@c-0.me)  106  |  42 
-> [ 500.991800] (1:node@c-0.me)  170  |  42 
-> [ 500.991800] (1:node@c-0.me)  298  |  42 
-> [ 500.991800] (1:node@c-0.me)  554  |  42 
-> [ 500.991800] (1:node@c-0.me)  1066  |  42 
-> [ 500.991800] (1:node@c-0.me)  2090  |  42 
-> [ 500.991800] (1:node@c-0.me)  4138  |  42 
-> [ 500.991800] (1:node@c-0.me)  8234  |  42 
-> [ 500.991800] (1:node@c-0.me)  16426  |  42 
-> [ 500.991800] (1:node@c-0.me)  32810  |  42 
-> [ 500.991800] (1:node@c-0.me)  65578  |  42 
-> [ 500.991800] (1:node@c-0.me)  131114  |  42 
-> [ 500.991800] (1:node@c-0.me)  262186  |  42 
-> [ 500.991800] (1:node@c-0.me)  524330  |  42 
-> [ 500.991800] (1:node@c-0.me)  1048618  |  42 
-> [ 500.991800] (1:node@c-0.me)  2097194  |  42 
-> [ 500.991800] (1:node@c-0.me)  4194346  |  42 
-> [ 500.991800] (1:node@c-0.me)  8388650  |  42 
-> [ 500.991800] (1:node@c-0.me) Predecessor: 16728096
-> [ 504.991900] (5:node@c-4.me) My finger table:
-> [ 504.991900] (5:node@c-4.me) Start | Succ 
-> [ 504.991900] (5:node@c-4.me)  16509406  | 16728096 
-> [ 504.991900] (5:node@c-4.me)  16509407  |  42 
-> [ 504.991900] (5:node@c-4.me)  16509409  | 16728096 
-> [ 504.991900] (5:node@c-4.me)  16509413  | 16728096 
-> [ 504.991900] (5:node@c-4.me)  16509421  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16509437  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16509469  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16509533  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16509661  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16509917  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16510429  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16511453  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16513501  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16517597  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16525789  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16542173  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16574941  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16640477  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  16771549  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  256477  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  780765  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  1829341  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  3926493  | 16509405 
-> [ 504.991900] (5:node@c-4.me)  8120797  | 16509405 
-> [ 504.991900] (5:node@c-4.me) Predecessor: 10004760
-> [ 508.991700] (4:node@c-3.me) My finger table:
-> [ 508.991700] (4:node@c-3.me) Start | Succ 
-> [ 508.991700] (4:node@c-3.me)  1319739  | 2015253 
-> [ 508.991700] (4:node@c-3.me)  1319740  | 6518808 
-> [ 508.991700] (4:node@c-3.me)  1319742  | 6518808 
-> [ 508.991700] (4:node@c-3.me)  1319746  | 2015253 
-> [ 508.991700] (4:node@c-3.me)  1319754  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1319770  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1319802  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1319866  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1319994  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1320250  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1320762  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1321786  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1323834  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1327930  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1336122  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1352506  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1385274  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1450810  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1581882  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  1844026  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  2368314  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  3416890  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  5514042  | 1319738 
-> [ 508.991700] (4:node@c-3.me)  9708346  | 1319738 
-> [ 508.991700] (4:node@c-3.me) Predecessor: 533744
-> [ 509.991700] (10:node@c-9.me) My finger table:
-> [ 509.991700] (10:node@c-9.me) Start | Succ 
-> [ 509.991700] (10:node@c-9.me)  2015254  | 6518808 
-> [ 509.991700] (10:node@c-9.me)  2015255  | 16728096 
-> [ 509.991700] (10:node@c-9.me)  2015257  | 10004760 
-> [ 509.991700] (10:node@c-9.me)  2015261  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2015269  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2015285  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2015317  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2015381  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2015509  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2015765  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2016277  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2017301  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2019349  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2023445  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2031637  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2048021  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2080789  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2146325  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2277397  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  2539541  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  3063829  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  4112405  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  6209557  | 2015253 
-> [ 509.991700] (10:node@c-9.me)  10403861  | 2015253 
-> [ 509.991700] (10:node@c-9.me) Predecessor: 1319738
-> [ 513.991600] (2:node@c-1.me) My finger table:
-> [ 513.991600] (2:node@c-1.me) Start | Succ 
-> [ 513.991600] (2:node@c-1.me)  366681  | 533744 
-> [ 513.991600] (2:node@c-1.me)  366682  | 1319738 
-> [ 513.991600] (2:node@c-1.me)  366684  | 533744 
-> [ 513.991600] (2:node@c-1.me)  366688  | 533744 
-> [ 513.991600] (2:node@c-1.me)  366696  | 366680 
-> [ 513.991600] (2:node@c-1.me)  366712  | 366680 
-> [ 513.991600] (2:node@c-1.me)  366744  | 366680 
-> [ 513.991600] (2:node@c-1.me)  366808  | 366680 
-> [ 513.991600] (2:node@c-1.me)  366936  | 366680 
-> [ 513.991600] (2:node@c-1.me)  367192  | 366680 
-> [ 513.991600] (2:node@c-1.me)  367704  | 366680 
-> [ 513.991600] (2:node@c-1.me)  368728  | 366680 
-> [ 513.991600] (2:node@c-1.me)  370776  | 366680 
-> [ 513.991600] (2:node@c-1.me)  374872  | 366680 
-> [ 513.991600] (2:node@c-1.me)  383064  | 366680 
-> [ 513.991600] (2:node@c-1.me)  399448  | 366680 
-> [ 513.991600] (2:node@c-1.me)  432216  | 366680 
-> [ 513.991600] (2:node@c-1.me)  497752  | 366680 
-> [ 513.991600] (2:node@c-1.me)  628824  | 366680 
-> [ 513.991600] (2:node@c-1.me)  890968  | 366680 
-> [ 513.991600] (2:node@c-1.me)  1415256  | 366680 
-> [ 513.991600] (2:node@c-1.me)  2463832  | 366680 
-> [ 513.991600] (2:node@c-1.me)  4560984  | 366680 
-> [ 513.991600] (2:node@c-1.me)  8755288  | 366680 
-> [ 513.991600] (2:node@c-1.me) Predecessor: 42
-> [ 516.991600] (10:node@c-9.me) My finger table:
-> [ 516.991600] (10:node@c-9.me) Start | Succ 
-> [ 516.991600] (10:node@c-9.me)  2015254  | 6518808 
-> [ 516.991600] (10:node@c-9.me)  2015255  | 16728096 
-> [ 516.991600] (10:node@c-9.me)  2015257  | 10004760 
-> [ 516.991600] (10:node@c-9.me)  2015261  | 6518808 
-> [ 516.991600] (10:node@c-9.me)  2015269  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2015285  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2015317  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2015381  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2015509  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2015765  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2016277  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2017301  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2019349  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2023445  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2031637  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2048021  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2080789  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2146325  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2277397  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  2539541  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  3063829  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  4112405  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  6209557  | 2015253 
-> [ 516.991600] (10:node@c-9.me)  10403861  | 2015253 
-> [ 516.991600] (10:node@c-9.me) Predecessor: 1319738
-> [ 516.991600] (3:node@c-2.me) My finger table:
-> [ 516.991600] (3:node@c-2.me) Start | Succ 
-> [ 516.991600] (3:node@c-2.me)  533745  | 1319738 
-> [ 516.991600] (3:node@c-2.me)  533746  | 1319738 
-> [ 516.991600] (3:node@c-2.me)  533748  | 1319738 
-> [ 516.991600] (3:node@c-2.me)  533752  | 1319738 
-> [ 516.991600] (3:node@c-2.me)  533760  | 533744 
-> [ 516.991600] (3:node@c-2.me)  533776  | 533744 
-> [ 516.991600] (3:node@c-2.me)  533808  | 533744 
-> [ 516.991600] (3:node@c-2.me)  533872  | 533744 
-> [ 516.991600] (3:node@c-2.me)  534000  | 533744 
-> [ 516.991600] (3:node@c-2.me)  534256  | 533744 
-> [ 516.991600] (3:node@c-2.me)  534768  | 533744 
-> [ 516.991600] (3:node@c-2.me)  535792  | 533744 
-> [ 516.991600] (3:node@c-2.me)  537840  | 533744 
-> [ 516.991600] (3:node@c-2.me)  541936  | 533744 
-> [ 516.991600] (3:node@c-2.me)  550128  | 533744 
-> [ 516.991600] (3:node@c-2.me)  566512  | 533744 
-> [ 516.991600] (3:node@c-2.me)  599280  | 533744 
-> [ 516.991600] (3:node@c-2.me)  664816  | 533744 
-> [ 516.991600] (3:node@c-2.me)  795888  | 533744 
-> [ 516.991600] (3:node@c-2.me)  1058032  | 533744 
-> [ 516.991600] (3:node@c-2.me)  1582320  | 533744 
-> [ 516.991600] (3:node@c-2.me)  2630896  | 533744 
-> [ 516.991600] (3:node@c-2.me)  4728048  | 533744 
-> [ 516.991600] (3:node@c-2.me)  8922352  | 533744 
-> [ 516.991600] (3:node@c-2.me) Predecessor: 366680
-> [ 519.991600] (7:node@c-6.me) My finger table:
-> [ 519.991600] (7:node@c-6.me) Start | Succ 
-> [ 519.991600] (7:node@c-6.me)  16728097  |  42 
-> [ 519.991600] (7:node@c-6.me)  16728098  |  42 
-> [ 519.991600] (7:node@c-6.me)  16728100  |  42 
-> [ 519.991600] (7:node@c-6.me)  16728104  |  42 
-> [ 519.991600] (7:node@c-6.me)  16728112  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16728128  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16728160  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16728224  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16728352  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16728608  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16729120  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16730144  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16732192  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16736288  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16744480  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16760864  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  16416  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  81952  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  213024  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  475168  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  999456  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  2048032  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  4145184  | 16728096 
-> [ 519.991600] (7:node@c-6.me)  8339488  | 16728096 
-> [ 519.991600] (7:node@c-6.me) Predecessor: 16509405
-> [ 524.991500] (8:node@c-7.me) My finger table:
-> [ 524.991500] (8:node@c-7.me) Start | Succ 
-> [ 524.991500] (8:node@c-7.me)  10004761  | 16509405 
-> [ 524.991500] (8:node@c-7.me)  10004762  | 16509405 
-> [ 524.991500] (8:node@c-7.me)  10004764  | 16509405 
-> [ 524.991500] (8:node@c-7.me)  10004768  | 16509405 
-> [ 524.991500] (8:node@c-7.me)  10004776  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10004792  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10004824  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10004888  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10005016  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10005272  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10005784  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10006808  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10008856  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10012952  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10021144  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10037528  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10070296  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10135832  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10266904  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  10529048  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  11053336  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  12101912  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  14199064  | 10004760 
-> [ 524.991500] (8:node@c-7.me)  1616152  | 10004760 
-> [ 524.991500] (8:node@c-7.me) Predecessor: 6518808
-> [ 529.991500] (5:node@c-4.me) My finger table:
-> [ 529.991500] (5:node@c-4.me) Start | Succ 
-> [ 529.991500] (5:node@c-4.me)  16509406  | 16728096 
-> [ 529.991500] (5:node@c-4.me)  16509407  |  42 
-> [ 529.991500] (5:node@c-4.me)  16509409  | 16728096 
-> [ 529.991500] (5:node@c-4.me)  16509413  | 16728096 
-> [ 529.991500] (5:node@c-4.me)  16509421  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16509437  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16509469  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16509533  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16509661  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16509917  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16510429  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16511453  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16513501  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16517597  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16525789  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16542173  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16574941  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16640477  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  16771549  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  256477  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  780765  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  1829341  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  3926493  | 16509405 
-> [ 529.991500] (5:node@c-4.me)  8120797  | 16509405 
-> [ 529.991500] (5:node@c-4.me) Predecessor: 10874876
-> [ 540.991400] (9:node@c-8.me) My finger table:
-> [ 540.991400] (9:node@c-8.me) Start | Succ 
-> [ 540.991400] (9:node@c-8.me)  6518809  | 10004760 
-> [ 540.991400] (9:node@c-8.me)  6518810  | 10004760 
-> [ 540.991400] (9:node@c-8.me)  6518812  | 10004760 
-> [ 540.991400] (9:node@c-8.me)  6518816  | 10004760 
-> [ 540.991400] (9:node@c-8.me)  6518824  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6518840  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6518872  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6518936  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6519064  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6519320  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6519832  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6520856  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6522904  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6527000  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6535192  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6551576  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6584344  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6649880  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  6780952  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  7043096  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  7567384  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  8615960  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  10713112  | 6518808 
-> [ 540.991400] (9:node@c-8.me)  14907416  | 6518808 
-> [ 540.991400] (9:node@c-8.me) Predecessor: 2015253
-> [ 613.990100] (6:node@c-5.me) My finger table:
-> [ 613.990100] (6:node@c-5.me) Start | Succ 
-> [ 613.990100] (6:node@c-5.me)  10874877  | 16509405 
-> [ 613.990100] (6:node@c-5.me)  10874878  | 533744 
-> [ 613.990100] (6:node@c-5.me)  10874880  | 533744 
-> [ 613.990100] (6:node@c-5.me)  10874884  | 16509405 
-> [ 613.990100] (6:node@c-5.me)  10874892  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10874908  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10874940  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10875004  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10875132  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10875388  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10875900  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10876924  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10878972  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10883068  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10891260  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10907644  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  10940412  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  11005948  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  11137020  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  11399164  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  11923452  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  12972028  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  15069180  | 10874876 
-> [ 613.990100] (6:node@c-5.me)  2486268  | 10874876 
-> [ 613.990100] (6:node@c-5.me) Predecessor: 10004760
-> [ 629.989800] (1:node@c-0.me) My finger table:
-> [ 629.989800] (1:node@c-0.me) Start | Succ 
-> [ 629.989800] (1:node@c-0.me)   43  | 366680 
-> [ 629.989800] (1:node@c-0.me)   44  | 366680 
-> [ 629.989800] (1:node@c-0.me)   46  | 366680 
-> [ 629.989800] (1:node@c-0.me)   50  | 366680 
-> [ 629.989800] (1:node@c-0.me)   58  | 366680 
-> [ 629.989800] (1:node@c-0.me)   74  |  42 
-> [ 629.989800] (1:node@c-0.me)  106  |  42 
-> [ 629.989800] (1:node@c-0.me)  170  |  42 
-> [ 629.989800] (1:node@c-0.me)  298  |  42 
-> [ 629.989800] (1:node@c-0.me)  554  |  42 
-> [ 629.989800] (1:node@c-0.me)  1066  |  42 
-> [ 629.989800] (1:node@c-0.me)  2090  |  42 
-> [ 629.989800] (1:node@c-0.me)  4138  |  42 
-> [ 629.989800] (1:node@c-0.me)  8234  |  42 
-> [ 629.989800] (1:node@c-0.me)  16426  |  42 
-> [ 629.989800] (1:node@c-0.me)  32810  |  42 
-> [ 629.989800] (1:node@c-0.me)  65578  |  42 
-> [ 629.989800] (1:node@c-0.me)  131114  |  42 
-> [ 629.989800] (1:node@c-0.me)  262186  |  42 
-> [ 629.989800] (1:node@c-0.me)  524330  |  42 
-> [ 629.989800] (1:node@c-0.me)  1048618  |  42 
-> [ 629.989800] (1:node@c-0.me)  2097194  |  42 
-> [ 629.989800] (1:node@c-0.me)  4194346  |  42 
-> [ 629.989800] (1:node@c-0.me)  8388650  |  42 
-> [ 629.989800] (1:node@c-0.me) Predecessor: 16728096
-> [ 629.989800] (6:node@c-5.me) My finger table:
-> [ 629.989800] (6:node@c-5.me) Start | Succ 
-> [ 629.989800] (6:node@c-5.me)  10874877  | 16509405 
-> [ 629.989800] (6:node@c-5.me)  10874878  | 533744 
-> [ 629.989800] (6:node@c-5.me)  10874880  | 533744 
-> [ 629.989800] (6:node@c-5.me)  10874884  | 16509405 
-> [ 629.989800] (6:node@c-5.me)  10874892  | 16509405 
-> [ 629.989800] (6:node@c-5.me)  10874908  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10874940  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10875004  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10875132  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10875388  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10875900  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10876924  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10878972  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10883068  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10891260  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10907644  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  10940412  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  11005948  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  11137020  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  11399164  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  11923452  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  12972028  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  15069180  | 10874876 
-> [ 629.989800] (6:node@c-5.me)  2486268  | 10874876 
-> [ 629.989800] (6:node@c-5.me) Predecessor: 10004760
-> [ 632.989700] (4:node@c-3.me) My finger table:
-> [ 632.989700] (4:node@c-3.me) Start | Succ 
-> [ 632.989700] (4:node@c-3.me)  1319739  | 2015253 
-> [ 632.989700] (4:node@c-3.me)  1319740  | 6518808 
-> [ 632.989700] (4:node@c-3.me)  1319742  | 6518808 
-> [ 632.989700] (4:node@c-3.me)  1319746  | 2015253 
-> [ 632.989700] (4:node@c-3.me)  1319754  | 2015253 
-> [ 632.989700] (4:node@c-3.me)  1319770  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1319802  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1319866  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1319994  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1320250  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1320762  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1321786  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1323834  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1327930  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1336122  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1352506  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1385274  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1450810  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1581882  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  1844026  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  2368314  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  3416890  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  5514042  | 1319738 
-> [ 632.989700] (4:node@c-3.me)  9708346  | 1319738 
-> [ 632.989700] (4:node@c-3.me) Predecessor: 533744
-> [ 637.989600] (2:node@c-1.me) My finger table:
-> [ 637.989600] (2:node@c-1.me) Start | Succ 
-> [ 637.989600] (2:node@c-1.me)  366681  | 533744 
-> [ 637.989600] (2:node@c-1.me)  366682  | 1319738 
-> [ 637.989600] (2:node@c-1.me)  366684  | 533744 
-> [ 637.989600] (2:node@c-1.me)  366688  | 533744 
-> [ 637.989600] (2:node@c-1.me)  366696  | 533744 
-> [ 637.989600] (2:node@c-1.me)  366712  | 366680 
-> [ 637.989600] (2:node@c-1.me)  366744  | 366680 
-> [ 637.989600] (2:node@c-1.me)  366808  | 366680 
-> [ 637.989600] (2:node@c-1.me)  366936  | 366680 
-> [ 637.989600] (2:node@c-1.me)  367192  | 366680 
-> [ 637.989600] (2:node@c-1.me)  367704  | 366680 
-> [ 637.989600] (2:node@c-1.me)  368728  | 366680 
-> [ 637.989600] (2:node@c-1.me)  370776  | 366680 
-> [ 637.989600] (2:node@c-1.me)  374872  | 366680 
-> [ 637.989600] (2:node@c-1.me)  383064  | 366680 
-> [ 637.989600] (2:node@c-1.me)  399448  | 366680 
-> [ 637.989600] (2:node@c-1.me)  432216  | 366680 
-> [ 637.989600] (2:node@c-1.me)  497752  | 366680 
-> [ 637.989600] (2:node@c-1.me)  628824  | 366680 
-> [ 637.989600] (2:node@c-1.me)  890968  | 366680 
-> [ 637.989600] (2:node@c-1.me)  1415256  | 366680 
-> [ 637.989600] (2:node@c-1.me)  2463832  | 366680 
-> [ 637.989600] (2:node@c-1.me)  4560984  | 366680 
-> [ 637.989600] (2:node@c-1.me)  8755288  | 366680 
-> [ 637.989600] (2:node@c-1.me) Predecessor: 42
-> [ 638.989600] (3:node@c-2.me) My finger table:
-> [ 638.989600] (3:node@c-2.me) Start | Succ 
-> [ 638.989600] (3:node@c-2.me)  533745  | 1319738 
-> [ 638.989600] (3:node@c-2.me)  533746  | 1319738 
-> [ 638.989600] (3:node@c-2.me)  533748  | 1319738 
-> [ 638.989600] (3:node@c-2.me)  533752  | 1319738 
-> [ 638.989600] (3:node@c-2.me)  533760  | 1319738 
-> [ 638.989600] (3:node@c-2.me)  533776  | 533744 
-> [ 638.989600] (3:node@c-2.me)  533808  | 533744 
-> [ 638.989600] (3:node@c-2.me)  533872  | 533744 
-> [ 638.989600] (3:node@c-2.me)  534000  | 533744 
-> [ 638.989600] (3:node@c-2.me)  534256  | 533744 
-> [ 638.989600] (3:node@c-2.me)  534768  | 533744 
-> [ 638.989600] (3:node@c-2.me)  535792  | 533744 
-> [ 638.989600] (3:node@c-2.me)  537840  | 533744 
-> [ 638.989600] (3:node@c-2.me)  541936  | 533744 
-> [ 638.989600] (3:node@c-2.me)  550128  | 533744 
-> [ 638.989600] (3:node@c-2.me)  566512  | 533744 
-> [ 638.989600] (3:node@c-2.me)  599280  | 533744 
-> [ 638.989600] (3:node@c-2.me)  664816  | 533744 
-> [ 638.989600] (3:node@c-2.me)  795888  | 533744 
-> [ 638.989600] (3:node@c-2.me)  1058032  | 533744 
-> [ 638.989600] (3:node@c-2.me)  1582320  | 533744 
-> [ 638.989600] (3:node@c-2.me)  2630896  | 533744 
-> [ 638.989600] (3:node@c-2.me)  4728048  | 533744 
-> [ 638.989600] (3:node@c-2.me)  8922352  | 533744 
-> [ 638.989600] (3:node@c-2.me) Predecessor: 366680
-> [ 641.989600] (10:node@c-9.me) My finger table:
-> [ 641.989600] (10:node@c-9.me) Start | Succ 
-> [ 641.989600] (10:node@c-9.me)  2015254  | 6518808 
-> [ 641.989600] (10:node@c-9.me)  2015255  | 16728096 
-> [ 641.989600] (10:node@c-9.me)  2015257  | 10004760 
-> [ 641.989600] (10:node@c-9.me)  2015261  | 6518808 
-> [ 641.989600] (10:node@c-9.me)  2015269  | 6518808 
-> [ 641.989600] (10:node@c-9.me)  2015285  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2015317  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2015381  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2015509  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2015765  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2016277  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2017301  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2019349  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2023445  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2031637  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2048021  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2080789  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2146325  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2277397  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  2539541  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  3063829  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  4112405  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  6209557  | 2015253 
-> [ 641.989600] (10:node@c-9.me)  10403861  | 2015253 
-> [ 641.989600] (10:node@c-9.me) Predecessor: 1319738
-> [ 645.989500] (7:node@c-6.me) My finger table:
-> [ 645.989500] (7:node@c-6.me) Start | Succ 
-> [ 645.989500] (7:node@c-6.me)  16728097  |  42 
-> [ 645.989500] (7:node@c-6.me)  16728098  |  42 
-> [ 645.989500] (7:node@c-6.me)  16728100  |  42 
-> [ 645.989500] (7:node@c-6.me)  16728104  |  42 
-> [ 645.989500] (7:node@c-6.me)  16728112  |  42 
-> [ 645.989500] (7:node@c-6.me)  16728128  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16728160  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16728224  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16728352  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16728608  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16729120  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16730144  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16732192  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16736288  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16744480  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16760864  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  16416  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  81952  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  213024  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  475168  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  999456  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  2048032  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  4145184  | 16728096 
-> [ 645.989500] (7:node@c-6.me)  8339488  | 16728096 
-> [ 645.989500] (7:node@c-6.me) Predecessor: 16509405
-> [ 645.989600] (5:node@c-4.me) My finger table:
-> [ 645.989600] (5:node@c-4.me) Start | Succ 
-> [ 645.989600] (5:node@c-4.me)  16509406  | 16728096 
-> [ 645.989600] (5:node@c-4.me)  16509407  |  42 
-> [ 645.989600] (5:node@c-4.me)  16509409  | 16728096 
-> [ 645.989600] (5:node@c-4.me)  16509413  | 16728096 
-> [ 645.989600] (5:node@c-4.me)  16509421  | 16728096 
-> [ 645.989600] (5:node@c-4.me)  16509437  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16509469  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16509533  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16509661  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16509917  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16510429  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16511453  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16513501  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16517597  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16525789  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16542173  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16574941  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16640477  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  16771549  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  256477  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  780765  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  1829341  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  3926493  | 16509405 
-> [ 645.989600] (5:node@c-4.me)  8120797  | 16509405 
-> [ 645.989600] (5:node@c-4.me) Predecessor: 10874876
-> [ 655.989400] (8:node@c-7.me) My finger table:
-> [ 655.989400] (8:node@c-7.me) Start | Succ 
-> [ 655.989400] (8:node@c-7.me)  10004761  | 10874876 
-> [ 655.989400] (8:node@c-7.me)  10004762  | 16509405 
-> [ 655.989400] (8:node@c-7.me)  10004764  | 16509405 
-> [ 655.989400] (8:node@c-7.me)  10004768  | 16509405 
-> [ 655.989400] (8:node@c-7.me)  10004776  | 10874876 
-> [ 655.989400] (8:node@c-7.me)  10004792  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10004824  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10004888  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10005016  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10005272  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10005784  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10006808  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10008856  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10012952  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10021144  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10037528  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10070296  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10135832  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10266904  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  10529048  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  11053336  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  12101912  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  14199064  | 10004760 
-> [ 655.989400] (8:node@c-7.me)  1616152  | 10004760 
-> [ 655.989400] (8:node@c-7.me) Predecessor: 6518808
-> [ 662.989300] (9:node@c-8.me) My finger table:
-> [ 662.989300] (9:node@c-8.me) Start | Succ 
-> [ 662.989300] (9:node@c-8.me)  6518809  | 10004760 
-> [ 662.989300] (9:node@c-8.me)  6518810  | 10004760 
-> [ 662.989300] (9:node@c-8.me)  6518812  | 10004760 
-> [ 662.989300] (9:node@c-8.me)  6518816  | 10004760 
-> [ 662.989300] (9:node@c-8.me)  6518824  | 10004760 
-> [ 662.989300] (9:node@c-8.me)  6518840  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6518872  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6518936  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6519064  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6519320  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6519832  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6520856  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6522904  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6527000  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6535192  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6551576  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6584344  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6649880  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  6780952  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  7043096  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  7567384  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  8615960  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  10713112  | 6518808 
-> [ 662.989300] (9:node@c-8.me)  14907416  | 6518808 
-> [ 662.989300] (9:node@c-8.me) Predecessor: 2015253
-> [ 754.987800] (1:node@c-0.me) My finger table:
-> [ 754.987800] (1:node@c-0.me) Start | Succ 
-> [ 754.987800] (1:node@c-0.me)   43  | 366680 
-> [ 754.987800] (1:node@c-0.me)   44  | 366680 
-> [ 754.987800] (1:node@c-0.me)   46  | 366680 
-> [ 754.987800] (1:node@c-0.me)   50  | 366680 
-> [ 754.987800] (1:node@c-0.me)   58  | 366680 
-> [ 754.987800] (1:node@c-0.me)   74  | 366680 
-> [ 754.987800] (1:node@c-0.me)  106  |  42 
-> [ 754.987800] (1:node@c-0.me)  170  |  42 
-> [ 754.987800] (1:node@c-0.me)  298  |  42 
-> [ 754.987800] (1:node@c-0.me)  554  |  42 
-> [ 754.987800] (1:node@c-0.me)  1066  |  42 
-> [ 754.987800] (1:node@c-0.me)  2090  |  42 
-> [ 754.987800] (1:node@c-0.me)  4138  |  42 
-> [ 754.987800] (1:node@c-0.me)  8234  |  42 
-> [ 754.987800] (1:node@c-0.me)  16426  |  42 
-> [ 754.987800] (1:node@c-0.me)  32810  |  42 
-> [ 754.987800] (1:node@c-0.me)  65578  |  42 
-> [ 754.987800] (1:node@c-0.me)  131114  |  42 
-> [ 754.987800] (1:node@c-0.me)  262186  |  42 
-> [ 754.987800] (1:node@c-0.me)  524330  |  42 
-> [ 754.987800] (1:node@c-0.me)  1048618  |  42 
-> [ 754.987800] (1:node@c-0.me)  2097194  |  42 
-> [ 754.987800] (1:node@c-0.me)  4194346  |  42 
-> [ 754.987800] (1:node@c-0.me)  8388650  |  42 
-> [ 754.987800] (1:node@c-0.me) Predecessor: 16728096
-> [ 757.987800] (4:node@c-3.me) My finger table:
-> [ 757.987800] (4:node@c-3.me) Start | Succ 
-> [ 757.987800] (4:node@c-3.me)  1319739  | 2015253 
-> [ 757.987800] (4:node@c-3.me)  1319740  | 6518808 
-> [ 757.987800] (4:node@c-3.me)  1319742  | 6518808 
-> [ 757.987800] (4:node@c-3.me)  1319746  | 2015253 
-> [ 757.987800] (4:node@c-3.me)  1319754  | 2015253 
-> [ 757.987800] (4:node@c-3.me)  1319770  | 2015253 
-> [ 757.987800] (4:node@c-3.me)  1319802  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1319866  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1319994  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1320250  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1320762  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1321786  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1323834  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1327930  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1336122  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1352506  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1385274  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1450810  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1581882  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  1844026  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  2368314  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  3416890  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  5514042  | 1319738 
-> [ 757.987800] (4:node@c-3.me)  9708346  | 1319738 
-> [ 757.987800] (4:node@c-3.me) Predecessor: 533744
-> [ 762.987700] (10:node@c-9.me) My finger table:
-> [ 762.987700] (10:node@c-9.me) Start | Succ 
-> [ 762.987700] (10:node@c-9.me)  2015254  | 6518808 
-> [ 762.987700] (10:node@c-9.me)  2015255  | 16728096 
-> [ 762.987700] (10:node@c-9.me)  2015257  | 10004760 
-> [ 762.987700] (10:node@c-9.me)  2015261  | 6518808 
-> [ 762.987700] (10:node@c-9.me)  2015269  | 6518808 
-> [ 762.987700] (10:node@c-9.me)  2015285  | 6518808 
-> [ 762.987700] (10:node@c-9.me)  2015317  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2015381  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2015509  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2015765  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2016277  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2017301  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2019349  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2023445  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2031637  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2048021  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2080789  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2146325  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2277397  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  2539541  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  3063829  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  4112405  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  6209557  | 2015253 
-> [ 762.987700] (10:node@c-9.me)  10403861  | 2015253 
-> [ 762.987700] (10:node@c-9.me) Predecessor: 1319738
-> [ 762.987700] (6:node@c-5.me) My finger table:
-> [ 762.987700] (6:node@c-5.me) Start | Succ 
-> [ 762.987700] (6:node@c-5.me)  10874877  | 16509405 
-> [ 762.987700] (6:node@c-5.me)  10874878  | 533744 
-> [ 762.987700] (6:node@c-5.me)  10874880  | 533744 
-> [ 762.987700] (6:node@c-5.me)  10874884  | 16509405 
-> [ 762.987700] (6:node@c-5.me)  10874892  | 16509405 
-> [ 762.987700] (6:node@c-5.me)  10874908  | 16509405 
-> [ 762.987700] (6:node@c-5.me)  10874940  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10875004  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10875132  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10875388  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10875900  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10876924  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10878972  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10883068  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10891260  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10907644  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  10940412  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  11005948  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  11137020  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  11399164  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  11923452  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  12972028  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  15069180  | 10874876 
-> [ 762.987700] (6:node@c-5.me)  2486268  | 10874876 
-> [ 762.987700] (6:node@c-5.me) Predecessor: 10004760
-> [ 767.987600] (2:node@c-1.me) My finger table:
-> [ 767.987600] (2:node@c-1.me) Start | Succ 
-> [ 767.987600] (2:node@c-1.me)  366681  | 533744 
-> [ 767.987600] (2:node@c-1.me)  366682  | 1319738 
-> [ 767.987600] (2:node@c-1.me)  366684  | 533744 
-> [ 767.987600] (2:node@c-1.me)  366688  | 533744 
-> [ 767.987600] (2:node@c-1.me)  366696  | 533744 
-> [ 767.987600] (2:node@c-1.me)  366712  | 533744 
-> [ 767.987600] (2:node@c-1.me)  366744  | 366680 
-> [ 767.987600] (2:node@c-1.me)  366808  | 366680 
-> [ 767.987600] (2:node@c-1.me)  366936  | 366680 
-> [ 767.987600] (2:node@c-1.me)  367192  | 366680 
-> [ 767.987600] (2:node@c-1.me)  367704  | 366680 
-> [ 767.987600] (2:node@c-1.me)  368728  | 366680 
-> [ 767.987600] (2:node@c-1.me)  370776  | 366680 
-> [ 767.987600] (2:node@c-1.me)  374872  | 366680 
-> [ 767.987600] (2:node@c-1.me)  383064  | 366680 
-> [ 767.987600] (2:node@c-1.me)  399448  | 366680 
-> [ 767.987600] (2:node@c-1.me)  432216  | 366680 
-> [ 767.987600] (2:node@c-1.me)  497752  | 366680 
-> [ 767.987600] (2:node@c-1.me)  628824  | 366680 
-> [ 767.987600] (2:node@c-1.me)  890968  | 366680 
-> [ 767.987600] (2:node@c-1.me)  1415256  | 366680 
-> [ 767.987600] (2:node@c-1.me)  2463832  | 366680 
-> [ 767.987600] (2:node@c-1.me)  4560984  | 366680 
-> [ 767.987600] (2:node@c-1.me)  8755288  | 366680 
-> [ 767.987600] (2:node@c-1.me) Predecessor: 42
-> [ 771.987500] (5:node@c-4.me) My finger table:
-> [ 771.987500] (5:node@c-4.me) Start | Succ 
-> [ 771.987500] (5:node@c-4.me)  16509406  | 16728096 
-> [ 771.987500] (5:node@c-4.me)  16509407  |  42 
-> [ 771.987500] (5:node@c-4.me)  16509409  | 16728096 
-> [ 771.987500] (5:node@c-4.me)  16509413  | 16728096 
-> [ 771.987500] (5:node@c-4.me)  16509421  | 16728096 
-> [ 771.987500] (5:node@c-4.me)  16509437  | 16728096 
-> [ 771.987500] (5:node@c-4.me)  16509469  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16509533  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16509661  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16509917  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16510429  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16511453  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16513501  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16517597  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16525789  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16542173  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16574941  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16640477  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  16771549  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  256477  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  780765  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  1829341  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  3926493  | 16509405 
-> [ 771.987500] (5:node@c-4.me)  8120797  | 16509405 
-> [ 771.987500] (5:node@c-4.me) Predecessor: 10874876
-> [ 776.987500] (3:node@c-2.me) My finger table:
-> [ 776.987500] (3:node@c-2.me) Start | Succ 
-> [ 776.987500] (3:node@c-2.me)  533745  | 1319738 
-> [ 776.987500] (3:node@c-2.me)  533746  | 1319738 
-> [ 776.987500] (3:node@c-2.me)  533748  | 1319738 
-> [ 776.987500] (3:node@c-2.me)  533752  | 1319738 
-> [ 776.987500] (3:node@c-2.me)  533760  | 1319738 
-> [ 776.987500] (3:node@c-2.me)  533776  | 1319738 
-> [ 776.987500] (3:node@c-2.me)  533808  | 533744 
-> [ 776.987500] (3:node@c-2.me)  533872  | 533744 
-> [ 776.987500] (3:node@c-2.me)  534000  | 533744 
-> [ 776.987500] (3:node@c-2.me)  534256  | 533744 
-> [ 776.987500] (3:node@c-2.me)  534768  | 533744 
-> [ 776.987500] (3:node@c-2.me)  535792  | 533744 
-> [ 776.987500] (3:node@c-2.me)  537840  | 533744 
-> [ 776.987500] (3:node@c-2.me)  541936  | 533744 
-> [ 776.987500] (3:node@c-2.me)  550128  | 533744 
-> [ 776.987500] (3:node@c-2.me)  566512  | 533744 
-> [ 776.987500] (3:node@c-2.me)  599280  | 533744 
-> [ 776.987500] (3:node@c-2.me)  664816  | 533744 
-> [ 776.987500] (3:node@c-2.me)  795888  | 533744 
-> [ 776.987500] (3:node@c-2.me)  1058032  | 533744 
-> [ 776.987500] (3:node@c-2.me)  1582320  | 533744 
-> [ 776.987500] (3:node@c-2.me)  2630896  | 533744 
-> [ 776.987500] (3:node@c-2.me)  4728048  | 533744 
-> [ 776.987500] (3:node@c-2.me)  8922352  | 533744 
-> [ 776.987500] (3:node@c-2.me) Predecessor: 366680
-> [ 823.987500] (8:node@c-7.me) My finger table:
-> [ 823.987500] (8:node@c-7.me) Start | Succ 
-> [ 823.987500] (8:node@c-7.me)  10004761  | 10874876 
-> [ 823.987500] (8:node@c-7.me)  10004762  | 16509405 
-> [ 823.987500] (8:node@c-7.me)  10004764  | 16509405 
-> [ 823.987500] (8:node@c-7.me)  10004768  | 16509405 
-> [ 823.987500] (8:node@c-7.me)  10004776  | 10874876 
-> [ 823.987500] (8:node@c-7.me)  10004792  | 10874876 
-> [ 823.987500] (8:node@c-7.me)  10004824  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10004888  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10005016  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10005272  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10005784  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10006808  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10008856  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10012952  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10021144  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10037528  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10070296  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10135832  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10266904  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  10529048  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  11053336  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  12101912  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  14199064  | 10004760 
-> [ 823.987500] (8:node@c-7.me)  1616152  | 10004760 
-> [ 823.987500] (8:node@c-7.me) Predecessor: 6518808
-> [ 824.987500] (7:node@c-6.me) My finger table:
-> [ 824.987500] (7:node@c-6.me) Start | Succ 
-> [ 824.987500] (7:node@c-6.me)  16728097  |  42 
-> [ 824.987500] (7:node@c-6.me)  16728098  |  42 
-> [ 824.987500] (7:node@c-6.me)  16728100  |  42 
-> [ 824.987500] (7:node@c-6.me)  16728104  |  42 
-> [ 824.987500] (7:node@c-6.me)  16728112  |  42 
-> [ 824.987500] (7:node@c-6.me)  16728128  |  42 
-> [ 824.987500] (7:node@c-6.me)  16728160  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16728224  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16728352  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16728608  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16729120  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16730144  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16732192  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16736288  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16744480  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16760864  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  16416  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  81952  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  213024  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  475168  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  999456  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  2048032  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  4145184  | 16728096 
-> [ 824.987500] (7:node@c-6.me)  8339488  | 16728096 
-> [ 824.987500] (7:node@c-6.me) Predecessor: 16509405
-> [ 876.987500] (9:node@c-8.me) My finger table:
-> [ 876.987500] (9:node@c-8.me) Start | Succ 
-> [ 876.987500] (9:node@c-8.me)  6518809  | 10004760 
-> [ 876.987500] (9:node@c-8.me)  6518810  | 10004760 
-> [ 876.987500] (9:node@c-8.me)  6518812  | 10004760 
-> [ 876.987500] (9:node@c-8.me)  6518816  | 10004760 
-> [ 876.987500] (9:node@c-8.me)  6518824  | 10004760 
-> [ 876.987500] (9:node@c-8.me)  6518840  | 10004760 
-> [ 876.987500] (9:node@c-8.me)  6518872  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6518936  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6519064  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6519320  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6519832  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6520856  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6522904  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6527000  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6535192  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6551576  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6584344  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6649880  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  6780952  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  7043096  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  7567384  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  8615960  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  10713112  | 6518808 
-> [ 876.987500] (9:node@c-8.me)  14907416  | 6518808 
-> [ 876.987500] (9:node@c-8.me) Predecessor: 2015253
-> [ 880.986500] (1:node@c-0.me) My finger table:
-> [ 880.986500] (1:node@c-0.me) Start | Succ 
-> [ 880.986500] (1:node@c-0.me)   43  | 366680 
-> [ 880.986500] (1:node@c-0.me)   44  | 366680 
-> [ 880.986500] (1:node@c-0.me)   46  | 366680 
-> [ 880.986500] (1:node@c-0.me)   50  | 366680 
-> [ 880.986500] (1:node@c-0.me)   58  | 366680 
-> [ 880.986500] (1:node@c-0.me)   74  | 366680 
-> [ 880.986500] (1:node@c-0.me)  106  | 366680 
-> [ 880.986500] (1:node@c-0.me)  170  |  42 
-> [ 880.986500] (1:node@c-0.me)  298  |  42 
-> [ 880.986500] (1:node@c-0.me)  554  |  42 
-> [ 880.986500] (1:node@c-0.me)  1066  |  42 
-> [ 880.986500] (1:node@c-0.me)  2090  |  42 
-> [ 880.986500] (1:node@c-0.me)  4138  |  42 
-> [ 880.986500] (1:node@c-0.me)  8234  |  42 
-> [ 880.986500] (1:node@c-0.me)  16426  |  42 
-> [ 880.986500] (1:node@c-0.me)  32810  |  42 
-> [ 880.986500] (1:node@c-0.me)  65578  |  42 
-> [ 880.986500] (1:node@c-0.me)  131114  |  42 
-> [ 880.986500] (1:node@c-0.me)  262186  |  42 
-> [ 880.986500] (1:node@c-0.me)  524330  |  42 
-> [ 880.986500] (1:node@c-0.me)  1048618  |  42 
-> [ 880.986500] (1:node@c-0.me)  2097194  |  42 
-> [ 880.986500] (1:node@c-0.me)  4194346  |  42 
-> [ 880.986500] (1:node@c-0.me)  8388650  |  42 
-> [ 880.986500] (1:node@c-0.me) Predecessor: 16728096
-> [ 904.987100] (3:node@c-2.me) My finger table:
-> [ 904.987100] (3:node@c-2.me) Start | Succ 
-> [ 904.987100] (3:node@c-2.me)  533745  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533746  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533748  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533752  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533760  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533776  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533808  | 1319738 
-> [ 904.987100] (3:node@c-2.me)  533872  | 533744 
-> [ 904.987100] (3:node@c-2.me)  534000  | 533744 
-> [ 904.987100] (3:node@c-2.me)  534256  | 533744 
-> [ 904.987100] (3:node@c-2.me)  534768  | 533744 
-> [ 904.987100] (3:node@c-2.me)  535792  | 533744 
-> [ 904.987100] (3:node@c-2.me)  537840  | 533744 
-> [ 904.987100] (3:node@c-2.me)  541936  | 533744 
-> [ 904.987100] (3:node@c-2.me)  550128  | 533744 
-> [ 904.987100] (3:node@c-2.me)  566512  | 533744 
-> [ 904.987100] (3:node@c-2.me)  599280  | 533744 
-> [ 904.987100] (3:node@c-2.me)  664816  | 533744 
-> [ 904.987100] (3:node@c-2.me)  795888  | 533744 
-> [ 904.987100] (3:node@c-2.me)  1058032  | 533744 
-> [ 904.987100] (3:node@c-2.me)  1582320  | 533744 
-> [ 904.987100] (3:node@c-2.me)  2630896  | 533744 
-> [ 904.987100] (3:node@c-2.me)  4728048  | 533744 
-> [ 904.987100] (3:node@c-2.me)  8922352  | 533744 
-> [ 904.987100] (3:node@c-2.me) Predecessor: 366680
-> [ 924.987500] (5:node@c-4.me) My finger table:
-> [ 924.987500] (5:node@c-4.me) Start | Succ 
-> [ 924.987500] (5:node@c-4.me)  16509406  | 16728096 
-> [ 924.987500] (5:node@c-4.me)  16509407  |  42 
-> [ 924.987500] (5:node@c-4.me)  16509409  | 16728096 
-> [ 924.987500] (5:node@c-4.me)  16509413  | 16728096 
-> [ 924.987500] (5:node@c-4.me)  16509421  | 16728096 
-> [ 924.987500] (5:node@c-4.me)  16509437  | 16728096 
-> [ 924.987500] (5:node@c-4.me)  16509469  | 16728096 
-> [ 924.987500] (5:node@c-4.me)  16509533  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16509661  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16509917  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16510429  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16511453  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16513501  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16517597  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16525789  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16542173  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16574941  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16640477  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  16771549  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  256477  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  780765  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  1829341  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  3926493  | 16509405 
-> [ 924.987500] (5:node@c-4.me)  8120797  | 16509405 
-> [ 924.987500] (5:node@c-4.me) Predecessor: 10874876
-> [ 936.987400] (6:node@c-5.me) My finger table:
-> [ 936.987400] (6:node@c-5.me) Start | Succ 
-> [ 936.987400] (6:node@c-5.me)  10874877  | 16509405 
-> [ 936.987400] (6:node@c-5.me)  10874878  | 533744 
-> [ 936.987400] (6:node@c-5.me)  10874880  | 533744 
-> [ 936.987400] (6:node@c-5.me)  10874884  | 16509405 
-> [ 936.987400] (6:node@c-5.me)  10874892  | 16509405 
-> [ 936.987400] (6:node@c-5.me)  10874908  | 16509405 
-> [ 936.987400] (6:node@c-5.me)  10874940  | 16509405 
-> [ 936.987400] (6:node@c-5.me)  10875004  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10875132  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10875388  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10875900  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10876924  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10878972  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10883068  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10891260  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10907644  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  10940412  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  11005948  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  11137020  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  11399164  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  11923452  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  12972028  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  15069180  | 10874876 
-> [ 936.987400] (6:node@c-5.me)  2486268  | 10874876 
-> [ 936.987400] (6:node@c-5.me) Predecessor: 10004760
-> [ 945.985300] (7:node@c-6.me) My finger table:
-> [ 945.985300] (7:node@c-6.me) Start | Succ 
-> [ 945.985300] (7:node@c-6.me)  16728097  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728098  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728100  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728104  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728112  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728128  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728160  |  42 
-> [ 945.985300] (7:node@c-6.me)  16728224  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16728352  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16728608  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16729120  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16730144  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16732192  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16736288  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16744480  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16760864  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  16416  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  81952  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  213024  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  475168  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  999456  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  2048032  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  4145184  | 16728096 
-> [ 945.985300] (7:node@c-6.me)  8339488  | 16728096 
-> [ 945.985300] (7:node@c-6.me) Predecessor: 16509405
-> [ 952.985200] (2:node@c-1.me) My finger table:
-> [ 952.985200] (2:node@c-1.me) Start | Succ 
-> [ 952.985200] (2:node@c-1.me)  366681  | 533744 
-> [ 952.985200] (2:node@c-1.me)  366682  | 1319738 
-> [ 952.985200] (2:node@c-1.me)  366684  | 533744 
-> [ 952.985200] (2:node@c-1.me)  366688  | 533744 
-> [ 952.985200] (2:node@c-1.me)  366696  | 533744 
-> [ 952.985200] (2:node@c-1.me)  366712  | 533744 
-> [ 952.985200] (2:node@c-1.me)  366744  | 533744 
-> [ 952.985200] (2:node@c-1.me)  366808  | 366680 
-> [ 952.985200] (2:node@c-1.me)  366936  | 366680 
-> [ 952.985200] (2:node@c-1.me)  367192  | 366680 
-> [ 952.985200] (2:node@c-1.me)  367704  | 366680 
-> [ 952.985200] (2:node@c-1.me)  368728  | 366680 
-> [ 952.985200] (2:node@c-1.me)  370776  | 366680 
-> [ 952.985200] (2:node@c-1.me)  374872  | 366680 
-> [ 952.985200] (2:node@c-1.me)  383064  | 366680 
-> [ 952.985200] (2:node@c-1.me)  399448  | 366680 
-> [ 952.985200] (2:node@c-1.me)  432216  | 366680 
-> [ 952.985200] (2:node@c-1.me)  497752  | 366680 
-> [ 952.985200] (2:node@c-1.me)  628824  | 366680 
-> [ 952.985200] (2:node@c-1.me)  890968  | 366680 
-> [ 952.985200] (2:node@c-1.me)  1415256  | 366680 
-> [ 952.985200] (2:node@c-1.me)  2463832  | 366680 
-> [ 952.985200] (2:node@c-1.me)  4560984  | 366680 
-> [ 952.985200] (2:node@c-1.me)  8755288  | 366680 
-> [ 952.985200] (2:node@c-1.me) Predecessor: 42
-> [ 967.986900] (4:node@c-3.me) My finger table:
-> [ 967.986900] (4:node@c-3.me) Start | Succ 
-> [ 967.986900] (4:node@c-3.me)  1319739  | 2015253 
-> [ 967.986900] (4:node@c-3.me)  1319740  | 6518808 
-> [ 967.986900] (4:node@c-3.me)  1319742  | 6518808 
-> [ 967.986900] (4:node@c-3.me)  1319746  | 2015253 
-> [ 967.986900] (4:node@c-3.me)  1319754  | 2015253 
-> [ 967.986900] (4:node@c-3.me)  1319770  | 2015253 
-> [ 967.986900] (4:node@c-3.me)  1319802  | 2015253 
-> [ 967.986900] (4:node@c-3.me)  1319866  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1319994  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1320250  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1320762  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1321786  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1323834  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1327930  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1336122  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1352506  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1385274  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1450810  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1581882  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  1844026  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  2368314  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  3416890  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  5514042  | 1319738 
-> [ 967.986900] (4:node@c-3.me)  9708346  | 1319738 
-> [ 967.986900] (4:node@c-3.me) Predecessor: 533744
-> [1207.985300] (0:@) Messages created: 1690
-> [1207.985300] (0:@) Simulated time: 1207.99
+> [  54.998900] (1:node@c-0.me) My finger table:
+> [  54.998900] (1:node@c-0.me) Start | Succ 
+> [  54.998900] (1:node@c-0.me)   43  | 366680 
+> [  54.998900] (1:node@c-0.me)   44  |  42 
+> [  54.998900] (1:node@c-0.me)   46  |  42 
+> [  54.998900] (1:node@c-0.me)   50  |  42 
+> [  54.998900] (1:node@c-0.me)   58  |  42 
+> [  54.998900] (1:node@c-0.me)   74  |  42 
+> [  54.998900] (1:node@c-0.me)  106  |  42 
+> [  54.998900] (1:node@c-0.me)  170  |  42 
+> [  54.998900] (1:node@c-0.me)  298  |  42 
+> [  54.998900] (1:node@c-0.me)  554  |  42 
+> [  54.998900] (1:node@c-0.me)  1066  |  42 
+> [  54.998900] (1:node@c-0.me)  2090  |  42 
+> [  54.998900] (1:node@c-0.me)  4138  |  42 
+> [  54.998900] (1:node@c-0.me)  8234  |  42 
+> [  54.998900] (1:node@c-0.me)  16426  |  42 
+> [  54.998900] (1:node@c-0.me)  32810  |  42 
+> [  54.998900] (1:node@c-0.me)  65578  |  42 
+> [  54.998900] (1:node@c-0.me)  131114  |  42 
+> [  54.998900] (1:node@c-0.me)  262186  |  42 
+> [  54.998900] (1:node@c-0.me)  524330  |  42 
+> [  54.998900] (1:node@c-0.me)  1048618  |  42 
+> [  54.998900] (1:node@c-0.me)  2097194  |  42 
+> [  54.998900] (1:node@c-0.me)  4194346  |  42 
+> [  54.998900] (1:node@c-0.me)  8388650  |  42 
+> [  54.998900] (1:node@c-0.me) Predecessor: 1319738
+> [  91.998400] (7:node@c-6.me) My finger table:
+> [  91.998400] (7:node@c-6.me) Start | Succ 
+> [  91.998400] (7:node@c-6.me)  16728097  | 1319738 
+> [  91.998400] (7:node@c-6.me)  16728098  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728100  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728104  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728112  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728128  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728160  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728224  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728352  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16728608  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16729120  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16730144  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16732192  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16736288  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16744480  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16760864  | 16728096 
+> [  91.998400] (7:node@c-6.me)  16416  | 16728096 
+> [  91.998400] (7:node@c-6.me)  81952  | 16728096 
+> [  91.998400] (7:node@c-6.me)  213024  | 16728096 
+> [  91.998400] (7:node@c-6.me)  475168  | 16728096 
+> [  91.998400] (7:node@c-6.me)  999456  | 16728096 
+> [  91.998400] (7:node@c-6.me)  2048032  | 16728096 
+> [  91.998400] (7:node@c-6.me)  4145184  | 16728096 
+> [  91.998400] (7:node@c-6.me)  8339488  | 16728096 
+> [  91.998400] (7:node@c-6.me) Predecessor: 2015253
+> [ 109.998800] (1:node@c-0.me) My finger table:
+> [ 109.998800] (1:node@c-0.me) Start | Succ 
+> [ 109.998800] (1:node@c-0.me)   43  | 366680 
+> [ 109.998800] (1:node@c-0.me)   44  |  42 
+> [ 109.998800] (1:node@c-0.me)   46  |  42 
+> [ 109.998800] (1:node@c-0.me)   50  |  42 
+> [ 109.998800] (1:node@c-0.me)   58  |  42 
+> [ 109.998800] (1:node@c-0.me)   74  |  42 
+> [ 109.998800] (1:node@c-0.me)  106  |  42 
+> [ 109.998800] (1:node@c-0.me)  170  |  42 
+> [ 109.998800] (1:node@c-0.me)  298  |  42 
+> [ 109.998800] (1:node@c-0.me)  554  |  42 
+> [ 109.998800] (1:node@c-0.me)  1066  |  42 
+> [ 109.998800] (1:node@c-0.me)  2090  |  42 
+> [ 109.998800] (1:node@c-0.me)  4138  |  42 
+> [ 109.998800] (1:node@c-0.me)  8234  |  42 
+> [ 109.998800] (1:node@c-0.me)  16426  |  42 
+> [ 109.998800] (1:node@c-0.me)  32810  |  42 
+> [ 109.998800] (1:node@c-0.me)  65578  |  42 
+> [ 109.998800] (1:node@c-0.me)  131114  |  42 
+> [ 109.998800] (1:node@c-0.me)  262186  |  42 
+> [ 109.998800] (1:node@c-0.me)  524330  |  42 
+> [ 109.998800] (1:node@c-0.me)  1048618  |  42 
+> [ 109.998800] (1:node@c-0.me)  2097194  |  42 
+> [ 109.998800] (1:node@c-0.me)  4194346  |  42 
+> [ 109.998800] (1:node@c-0.me)  8388650  |  42 
+> [ 109.998800] (1:node@c-0.me) Predecessor: 6518808
+> [ 163.999100] (2:node@c-1.me) My finger table:
+> [ 163.999100] (2:node@c-1.me) Start | Succ 
+> [ 163.999100] (2:node@c-1.me)  366681  |  42 
+> [ 163.999100] (2:node@c-1.me)  366682  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366684  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366688  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366696  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366712  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366744  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366808  | 366680 
+> [ 163.999100] (2:node@c-1.me)  366936  | 366680 
+> [ 163.999100] (2:node@c-1.me)  367192  | 366680 
+> [ 163.999100] (2:node@c-1.me)  367704  | 366680 
+> [ 163.999100] (2:node@c-1.me)  368728  | 366680 
+> [ 163.999100] (2:node@c-1.me)  370776  | 366680 
+> [ 163.999100] (2:node@c-1.me)  374872  | 366680 
+> [ 163.999100] (2:node@c-1.me)  383064  | 366680 
+> [ 163.999100] (2:node@c-1.me)  399448  | 366680 
+> [ 163.999100] (2:node@c-1.me)  432216  | 366680 
+> [ 163.999100] (2:node@c-1.me)  497752  | 366680 
+> [ 163.999100] (2:node@c-1.me)  628824  | 366680 
+> [ 163.999100] (2:node@c-1.me)  890968  | 366680 
+> [ 163.999100] (2:node@c-1.me)  1415256  | 366680 
+> [ 163.999100] (2:node@c-1.me)  2463832  | 366680 
+> [ 163.999100] (2:node@c-1.me)  4560984  | 366680 
+> [ 163.999100] (2:node@c-1.me)  8755288  | 366680 
+> [ 163.999100] (2:node@c-1.me) Predecessor: 42
+> [ 195.998600] (9:node@c-8.me) My finger table:
+> [ 195.998600] (9:node@c-8.me) Start | Succ 
+> [ 195.998600] (9:node@c-8.me)  6518809  |  42 
+> [ 195.998600] (9:node@c-8.me)  6518810  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6518812  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6518816  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6518824  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6518840  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6518872  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6518936  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6519064  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6519320  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6519832  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6520856  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6522904  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6527000  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6535192  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6551576  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6584344  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6649880  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  6780952  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  7043096  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  7567384  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  8615960  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  10713112  | 6518808 
+> [ 195.998600] (9:node@c-8.me)  14907416  | 6518808 
+> [ 195.998600] (9:node@c-8.me) Predecessor: 1319738
+> [ 205.998500] (8:node@c-7.me) My finger table:
+> [ 205.998500] (8:node@c-7.me) Start | Succ 
+> [ 205.998500] (8:node@c-7.me)  10004761  | 16509405 
+> [ 205.998500] (8:node@c-7.me)  10004762  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10004764  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10004768  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10004776  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10004792  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10004824  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10004888  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10005016  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10005272  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10005784  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10006808  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10008856  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10012952  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10021144  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10037528  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10070296  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10135832  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10266904  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  10529048  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  11053336  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  12101912  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  14199064  | 10004760 
+> [ 205.998500] (8:node@c-7.me)  1616152  | 10004760 
+> [ 205.998500] (8:node@c-7.me) Predecessor: 533744
+> [ 206.998500] (1:node@c-0.me) My finger table:
+> [ 206.998500] (1:node@c-0.me) Start | Succ 
+> [ 206.998500] (1:node@c-0.me)   43  | 366680 
+> [ 206.998500] (1:node@c-0.me)   44  |  42 
+> [ 206.998500] (1:node@c-0.me)   46  |  42 
+> [ 206.998500] (1:node@c-0.me)   50  |  42 
+> [ 206.998500] (1:node@c-0.me)   58  |  42 
+> [ 206.998500] (1:node@c-0.me)   74  |  42 
+> [ 206.998500] (1:node@c-0.me)  106  |  42 
+> [ 206.998500] (1:node@c-0.me)  170  |  42 
+> [ 206.998500] (1:node@c-0.me)  298  |  42 
+> [ 206.998500] (1:node@c-0.me)  554  |  42 
+> [ 206.998500] (1:node@c-0.me)  1066  |  42 
+> [ 206.998500] (1:node@c-0.me)  2090  |  42 
+> [ 206.998500] (1:node@c-0.me)  4138  |  42 
+> [ 206.998500] (1:node@c-0.me)  8234  |  42 
+> [ 206.998500] (1:node@c-0.me)  16426  |  42 
+> [ 206.998500] (1:node@c-0.me)  32810  |  42 
+> [ 206.998500] (1:node@c-0.me)  65578  |  42 
+> [ 206.998500] (1:node@c-0.me)  131114  |  42 
+> [ 206.998500] (1:node@c-0.me)  262186  |  42 
+> [ 206.998500] (1:node@c-0.me)  524330  |  42 
+> [ 206.998500] (1:node@c-0.me)  1048618  |  42 
+> [ 206.998500] (1:node@c-0.me)  2097194  |  42 
+> [ 206.998500] (1:node@c-0.me)  4194346  |  42 
+> [ 206.998500] (1:node@c-0.me)  8388650  |  42 
+> [ 206.998500] (1:node@c-0.me) Predecessor: 16509405
+> [ 244.998100] (4:node@c-3.me) My finger table:
+> [ 244.998100] (4:node@c-3.me) Start | Succ 
+> [ 244.998100] (4:node@c-3.me)  1319739  | 6518808 
+> [ 244.998100] (4:node@c-3.me)  1319740  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319742  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319746  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319754  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319770  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319802  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319866  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1319994  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1320250  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1320762  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1321786  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1323834  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1327930  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1336122  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1352506  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1385274  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1450810  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1581882  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  1844026  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  2368314  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  3416890  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  5514042  | 1319738 
+> [ 244.998100] (4:node@c-3.me)  9708346  | 1319738 
+> [ 244.998100] (4:node@c-3.me) Predecessor: 366680
+> [ 246.998000] (6:node@c-5.me) My finger table:
+> [ 246.998000] (6:node@c-5.me) Start | Succ 
+> [ 246.998000] (6:node@c-5.me)  10874877  | 533744 
+> [ 246.998000] (6:node@c-5.me)  10874878  | 533744 
+> [ 246.998000] (6:node@c-5.me)  10874880  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10874884  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10874892  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10874908  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10874940  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10875004  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10875132  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10875388  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10875900  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10876924  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10878972  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10883068  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10891260  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10907644  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  10940412  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  11005948  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  11137020  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  11399164  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  11923452  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  12972028  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  15069180  | 10874876 
+> [ 246.998000] (6:node@c-5.me)  2486268  | 10874876 
+> [ 246.998000] (6:node@c-5.me) Predecessor: -1
+> [ 247.998000] (7:node@c-6.me) My finger table:
+> [ 247.998000] (7:node@c-6.me) Start | Succ 
+> [ 247.998000] (7:node@c-6.me)  16728097  | 1319738 
+> [ 247.998000] (7:node@c-6.me)  16728098  | 1319738 
+> [ 247.998000] (7:node@c-6.me)  16728100  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728104  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728112  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728128  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728160  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728224  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728352  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16728608  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16729120  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16730144  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16732192  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16736288  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16744480  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16760864  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  16416  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  81952  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  213024  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  475168  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  999456  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  2048032  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  4145184  | 16728096 
+> [ 247.998000] (7:node@c-6.me)  8339488  | 16728096 
+> [ 247.998000] (7:node@c-6.me) Predecessor: 2015253
+> [ 249.998000] (10:node@c-9.me) My finger table:
+> [ 249.998000] (10:node@c-9.me) Start | Succ 
+> [ 249.998000] (10:node@c-9.me)  2015254  | 16728096 
+> [ 249.998000] (10:node@c-9.me)  2015255  | 16728096 
+> [ 249.998000] (10:node@c-9.me)  2015257  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015261  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015269  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015285  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015317  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015381  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015509  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2015765  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2016277  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2017301  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2019349  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2023445  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2031637  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2048021  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2080789  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2146325  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2277397  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  2539541  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  3063829  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  4112405  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  6209557  | 2015253 
+> [ 249.998000] (10:node@c-9.me)  10403861  | 2015253 
+> [ 249.998000] (10:node@c-9.me) Predecessor: -1
+> [ 275.997500] (3:node@c-2.me) My finger table:
+> [ 275.997500] (3:node@c-2.me) Start | Succ 
+> [ 275.997500] (3:node@c-2.me)  533745  | 10004760 
+> [ 275.997500] (3:node@c-2.me)  533746  | 10004760 
+> [ 275.997500] (3:node@c-2.me)  533748  | 533744 
+> [ 275.997500] (3:node@c-2.me)  533752  | 533744 
+> [ 275.997500] (3:node@c-2.me)  533760  | 533744 
+> [ 275.997500] (3:node@c-2.me)  533776  | 533744 
+> [ 275.997500] (3:node@c-2.me)  533808  | 533744 
+> [ 275.997500] (3:node@c-2.me)  533872  | 533744 
+> [ 275.997500] (3:node@c-2.me)  534000  | 533744 
+> [ 275.997500] (3:node@c-2.me)  534256  | 533744 
+> [ 275.997500] (3:node@c-2.me)  534768  | 533744 
+> [ 275.997500] (3:node@c-2.me)  535792  | 533744 
+> [ 275.997500] (3:node@c-2.me)  537840  | 533744 
+> [ 275.997500] (3:node@c-2.me)  541936  | 533744 
+> [ 275.997500] (3:node@c-2.me)  550128  | 533744 
+> [ 275.997500] (3:node@c-2.me)  566512  | 533744 
+> [ 275.997500] (3:node@c-2.me)  599280  | 533744 
+> [ 275.997500] (3:node@c-2.me)  664816  | 533744 
+> [ 275.997500] (3:node@c-2.me)  795888  | 533744 
+> [ 275.997500] (3:node@c-2.me)  1058032  | 533744 
+> [ 275.997500] (3:node@c-2.me)  1582320  | 533744 
+> [ 275.997500] (3:node@c-2.me)  2630896  | 533744 
+> [ 275.997500] (3:node@c-2.me)  4728048  | 533744 
+> [ 275.997500] (3:node@c-2.me)  8922352  | 533744 
+> [ 275.997500] (3:node@c-2.me) Predecessor: 10874876
+> [ 276.997600] (8:node@c-7.me) My finger table:
+> [ 276.997600] (8:node@c-7.me) Start | Succ 
+> [ 276.997600] (8:node@c-7.me)  10004761  | 16509405 
+> [ 276.997600] (8:node@c-7.me)  10004762  | 16509405 
+> [ 276.997600] (8:node@c-7.me)  10004764  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10004768  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10004776  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10004792  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10004824  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10004888  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10005016  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10005272  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10005784  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10006808  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10008856  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10012952  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10021144  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10037528  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10070296  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10135832  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10266904  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  10529048  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  11053336  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  12101912  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  14199064  | 10004760 
+> [ 276.997600] (8:node@c-7.me)  1616152  | 10004760 
+> [ 276.997600] (8:node@c-7.me) Predecessor: 533744
+> [ 276.997600] (2:node@c-1.me) My finger table:
+> [ 276.997600] (2:node@c-1.me) Start | Succ 
+> [ 276.997600] (2:node@c-1.me)  366681  | 1319738 
+> [ 276.997600] (2:node@c-1.me)  366682  | 1319738 
+> [ 276.997600] (2:node@c-1.me)  366684  | 366680 
+> [ 276.997600] (2:node@c-1.me)  366688  | 366680 
+> [ 276.997600] (2:node@c-1.me)  366696  | 366680 
+> [ 276.997600] (2:node@c-1.me)  366712  | 366680 
+> [ 276.997600] (2:node@c-1.me)  366744  | 366680 
+> [ 276.997600] (2:node@c-1.me)  366808  | 366680 
+> [ 276.997600] (2:node@c-1.me)  366936  | 366680 
+> [ 276.997600] (2:node@c-1.me)  367192  | 366680 
+> [ 276.997600] (2:node@c-1.me)  367704  | 366680 
+> [ 276.997600] (2:node@c-1.me)  368728  | 366680 
+> [ 276.997600] (2:node@c-1.me)  370776  | 366680 
+> [ 276.997600] (2:node@c-1.me)  374872  | 366680 
+> [ 276.997600] (2:node@c-1.me)  383064  | 366680 
+> [ 276.997600] (2:node@c-1.me)  399448  | 366680 
+> [ 276.997600] (2:node@c-1.me)  432216  | 366680 
+> [ 276.997600] (2:node@c-1.me)  497752  | 366680 
+> [ 276.997600] (2:node@c-1.me)  628824  | 366680 
+> [ 276.997600] (2:node@c-1.me)  890968  | 366680 
+> [ 276.997600] (2:node@c-1.me)  1415256  | 366680 
+> [ 276.997600] (2:node@c-1.me)  2463832  | 366680 
+> [ 276.997600] (2:node@c-1.me)  4560984  | 366680 
+> [ 276.997600] (2:node@c-1.me)  8755288  | 366680 
+> [ 276.997600] (2:node@c-1.me) Predecessor: 42
+> [ 281.997600] (9:node@c-8.me) My finger table:
+> [ 281.997600] (9:node@c-8.me) Start | Succ 
+> [ 281.997600] (9:node@c-8.me)  6518809  | 10004760 
+> [ 281.997600] (9:node@c-8.me)  6518810  | 10004760 
+> [ 281.997600] (9:node@c-8.me)  6518812  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6518816  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6518824  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6518840  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6518872  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6518936  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6519064  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6519320  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6519832  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6520856  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6522904  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6527000  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6535192  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6551576  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6584344  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6649880  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  6780952  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  7043096  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  7567384  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  8615960  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  10713112  | 6518808 
+> [ 281.997600] (9:node@c-8.me)  14907416  | 6518808 
+> [ 281.997600] (9:node@c-8.me) Predecessor: 1319738
+> [ 283.997600] (8:node@c-7.me) My finger table:
+> [ 283.997600] (8:node@c-7.me) Start | Succ 
+> [ 283.997600] (8:node@c-7.me)  10004761  | 16509405 
+> [ 283.997600] (8:node@c-7.me)  10004762  | 16509405 
+> [ 283.997600] (8:node@c-7.me)  10004764  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10004768  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10004776  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10004792  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10004824  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10004888  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10005016  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10005272  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10005784  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10006808  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10008856  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10012952  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10021144  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10037528  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10070296  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10135832  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10266904  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  10529048  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  11053336  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  12101912  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  14199064  | 10004760 
+> [ 283.997600] (8:node@c-7.me)  1616152  | 10004760 
+> [ 283.997600] (8:node@c-7.me) Predecessor: 6518808
+> [ 285.997500] (4:node@c-3.me) My finger table:
+> [ 285.997500] (4:node@c-3.me) Start | Succ 
+> [ 285.997500] (4:node@c-3.me)  1319739  | 6518808 
+> [ 285.997500] (4:node@c-3.me)  1319740  | 6518808 
+> [ 285.997500] (4:node@c-3.me)  1319742  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1319746  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1319754  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1319770  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1319802  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1319866  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1319994  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1320250  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1320762  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1321786  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1323834  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1327930  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1336122  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1352506  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1385274  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1450810  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1581882  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  1844026  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  2368314  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  3416890  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  5514042  | 1319738 
+> [ 285.997500] (4:node@c-3.me)  9708346  | 1319738 
+> [ 285.997500] (4:node@c-3.me) Predecessor: 366680
+> [ 285.997500] (1:node@c-0.me) My finger table:
+> [ 285.997500] (1:node@c-0.me) Start | Succ 
+> [ 285.997500] (1:node@c-0.me)   43  | 366680 
+> [ 285.997500] (1:node@c-0.me)   44  | 366680 
+> [ 285.997500] (1:node@c-0.me)   46  |  42 
+> [ 285.997500] (1:node@c-0.me)   50  |  42 
+> [ 285.997500] (1:node@c-0.me)   58  |  42 
+> [ 285.997500] (1:node@c-0.me)   74  |  42 
+> [ 285.997500] (1:node@c-0.me)  106  |  42 
+> [ 285.997500] (1:node@c-0.me)  170  |  42 
+> [ 285.997500] (1:node@c-0.me)  298  |  42 
+> [ 285.997500] (1:node@c-0.me)  554  |  42 
+> [ 285.997500] (1:node@c-0.me)  1066  |  42 
+> [ 285.997500] (1:node@c-0.me)  2090  |  42 
+> [ 285.997500] (1:node@c-0.me)  4138  |  42 
+> [ 285.997500] (1:node@c-0.me)  8234  |  42 
+> [ 285.997500] (1:node@c-0.me)  16426  |  42 
+> [ 285.997500] (1:node@c-0.me)  32810  |  42 
+> [ 285.997500] (1:node@c-0.me)  65578  |  42 
+> [ 285.997500] (1:node@c-0.me)  131114  |  42 
+> [ 285.997500] (1:node@c-0.me)  262186  |  42 
+> [ 285.997500] (1:node@c-0.me)  524330  |  42 
+> [ 285.997500] (1:node@c-0.me)  1048618  |  42 
+> [ 285.997500] (1:node@c-0.me)  2097194  |  42 
+> [ 285.997500] (1:node@c-0.me)  4194346  |  42 
+> [ 285.997500] (1:node@c-0.me)  8388650  |  42 
+> [ 285.997500] (1:node@c-0.me) Predecessor: 16509405
+> [ 290.997500] (5:node@c-4.me) My finger table:
+> [ 290.997500] (5:node@c-4.me) Start | Succ 
+> [ 290.997500] (5:node@c-4.me)  16509406  |  42 
+> [ 290.997500] (5:node@c-4.me)  16509407  |  42 
+> [ 290.997500] (5:node@c-4.me)  16509409  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509413  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509421  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509437  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509469  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509533  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509661  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16509917  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16510429  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16511453  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16513501  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16517597  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16525789  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16542173  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16574941  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16640477  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  16771549  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  256477  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  780765  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  1829341  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  3926493  | 16509405 
+> [ 290.997500] (5:node@c-4.me)  8120797  | 16509405 
+> [ 290.997500] (5:node@c-4.me) Predecessor: 10004760
+> [ 356.996500] (1:node@c-0.me) My finger table:
+> [ 356.996500] (1:node@c-0.me) Start | Succ 
+> [ 356.996500] (1:node@c-0.me)   43  | 366680 
+> [ 356.996500] (1:node@c-0.me)   44  | 366680 
+> [ 356.996500] (1:node@c-0.me)   46  |  42 
+> [ 356.996500] (1:node@c-0.me)   50  |  42 
+> [ 356.996500] (1:node@c-0.me)   58  |  42 
+> [ 356.996500] (1:node@c-0.me)   74  |  42 
+> [ 356.996500] (1:node@c-0.me)  106  |  42 
+> [ 356.996500] (1:node@c-0.me)  170  |  42 
+> [ 356.996500] (1:node@c-0.me)  298  |  42 
+> [ 356.996500] (1:node@c-0.me)  554  |  42 
+> [ 356.996500] (1:node@c-0.me)  1066  |  42 
+> [ 356.996500] (1:node@c-0.me)  2090  |  42 
+> [ 356.996500] (1:node@c-0.me)  4138  |  42 
+> [ 356.996500] (1:node@c-0.me)  8234  |  42 
+> [ 356.996500] (1:node@c-0.me)  16426  |  42 
+> [ 356.996500] (1:node@c-0.me)  32810  |  42 
+> [ 356.996500] (1:node@c-0.me)  65578  |  42 
+> [ 356.996500] (1:node@c-0.me)  131114  |  42 
+> [ 356.996500] (1:node@c-0.me)  262186  |  42 
+> [ 356.996500] (1:node@c-0.me)  524330  |  42 
+> [ 356.996500] (1:node@c-0.me)  1048618  |  42 
+> [ 356.996500] (1:node@c-0.me)  2097194  |  42 
+> [ 356.996500] (1:node@c-0.me)  4194346  |  42 
+> [ 356.996500] (1:node@c-0.me)  8388650  |  42 
+> [ 356.996500] (1:node@c-0.me) Predecessor: 16728096
+> [ 370.996400] (6:node@c-5.me) My finger table:
+> [ 370.996400] (7:node@c-6.me) My finger table:
+> [ 370.996400] (6:node@c-5.me) Start | Succ 
+> [ 370.996400] (7:node@c-6.me) Start | Succ 
+> [ 370.996400] (6:node@c-5.me)  10874877  | 533744 
+> [ 370.996400] (7:node@c-6.me)  16728097  |  42 
+> [ 370.996400] (6:node@c-5.me)  10874878  | 533744 
+> [ 370.996400] (7:node@c-6.me)  16728098  | 1319738 
+> [ 370.996400] (6:node@c-5.me)  10874880  | 533744 
+> [ 370.996400] (7:node@c-6.me)  16728100  |  42 
+> [ 370.996400] (6:node@c-5.me)  10874884  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728104  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10874892  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728112  | 16728096 
+> [ 370.996400] (7:node@c-6.me)  16728128  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10874908  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728160  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10874940  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728224  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10875004  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728352  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10875132  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16728608  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10875388  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16729120  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10875900  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16730144  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10876924  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16732192  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10878972  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16736288  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10883068  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16744480  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10891260  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16760864  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10907644  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  16416  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  10940412  | 10874876 
+> [ 370.996400] (6:node@c-5.me)  11005948  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  81952  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  11137020  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  213024  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  11399164  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  475168  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  11923452  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  999456  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  12972028  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  2048032  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  15069180  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  4145184  | 16728096 
+> [ 370.996400] (6:node@c-5.me)  2486268  | 10874876 
+> [ 370.996400] (7:node@c-6.me)  8339488  | 16728096 
+> [ 370.996400] (6:node@c-5.me) Predecessor: -1
+> [ 370.996400] (7:node@c-6.me) Predecessor: 2015253
+> [ 373.996300] (10:node@c-9.me) My finger table:
+> [ 373.996300] (10:node@c-9.me) Start | Succ 
+> [ 373.996300] (10:node@c-9.me)  2015254  | 16728096 
+> [ 373.996300] (10:node@c-9.me)  2015255  | 16728096 
+> [ 373.996300] (10:node@c-9.me)  2015257  | 16728096 
+> [ 373.996300] (10:node@c-9.me)  2015261  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2015269  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2015285  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2015317  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2015381  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2015509  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2015765  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2016277  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2017301  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2019349  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2023445  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2031637  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2048021  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2080789  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2146325  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2277397  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  2539541  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  3063829  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  4112405  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  6209557  | 2015253 
+> [ 373.996300] (10:node@c-9.me)  10403861  | 2015253 
+> [ 373.996300] (10:node@c-9.me) Predecessor: -1
+> [ 387.996200] (7:node@c-6.me) My finger table:
+> [ 387.996200] (7:node@c-6.me) Start | Succ 
+> [ 387.996200] (7:node@c-6.me)  16728097  |  42 
+> [ 387.996200] (7:node@c-6.me)  16728098  | 1319738 
+> [ 387.996200] (7:node@c-6.me)  16728100  |  42 
+> [ 387.996200] (7:node@c-6.me)  16728104  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16728112  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16728128  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16728160  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16728224  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16728352  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16728608  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16729120  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16730144  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16732192  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16736288  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16744480  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16760864  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  16416  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  81952  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  213024  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  475168  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  999456  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  2048032  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  4145184  | 16728096 
+> [ 387.996200] (7:node@c-6.me)  8339488  | 16728096 
+> [ 387.996200] (7:node@c-6.me) Predecessor: 16509405
+> [ 390.996100] (4:node@c-3.me) My finger table:
+> [ 390.996100] (4:node@c-3.me) Start | Succ 
+> [ 390.996100] (4:node@c-3.me)  1319739  | 6518808 
+> [ 390.996100] (4:node@c-3.me)  1319740  | 6518808 
+> [ 390.996100] (4:node@c-3.me)  1319742  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1319746  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1319754  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1319770  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1319802  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1319866  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1319994  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1320250  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1320762  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1321786  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1323834  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1327930  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1336122  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1352506  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1385274  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1450810  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1581882  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  1844026  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  2368314  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  3416890  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  5514042  | 1319738 
+> [ 390.996100] (4:node@c-3.me)  9708346  | 1319738 
+> [ 390.996100] (4:node@c-3.me) Predecessor: 533744
+> [ 397.996000] (8:node@c-7.me) My finger table:
+> [ 397.996000] (8:node@c-7.me) Start | Succ 
+> [ 397.996000] (8:node@c-7.me)  10004761  | 16509405 
+> [ 397.996000] (8:node@c-7.me)  10004762  | 16509405 
+> [ 397.996000] (8:node@c-7.me)  10004764  | 16509405 
+> [ 397.996000] (8:node@c-7.me)  10004768  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10004776  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10004792  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10004824  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10004888  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10005016  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10005272  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10005784  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10006808  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10008856  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10012952  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10021144  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10037528  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10070296  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10135832  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10266904  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  10529048  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  11053336  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  12101912  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  14199064  | 10004760 
+> [ 397.996000] (8:node@c-7.me)  1616152  | 10004760 
+> [ 397.996000] (8:node@c-7.me) Predecessor: 6518808
+> [ 399.996000] (2:node@c-1.me) My finger table:
+> [ 399.996000] (2:node@c-1.me) Start | Succ 
+> [ 399.996000] (2:node@c-1.me)  366681  | 533744 
+> [ 399.996000] (2:node@c-1.me)  366682  | 1319738 
+> [ 399.996000] (2:node@c-1.me)  366684  | 533744 
+> [ 399.996000] (2:node@c-1.me)  366688  | 366680 
+> [ 399.996000] (2:node@c-1.me)  366696  | 366680 
+> [ 399.996000] (2:node@c-1.me)  366712  | 366680 
+> [ 399.996000] (2:node@c-1.me)  366744  | 366680 
+> [ 399.996000] (2:node@c-1.me)  366808  | 366680 
+> [ 399.996000] (2:node@c-1.me)  366936  | 366680 
+> [ 399.996000] (2:node@c-1.me)  367192  | 366680 
+> [ 399.996000] (2:node@c-1.me)  367704  | 366680 
+> [ 399.996000] (2:node@c-1.me)  368728  | 366680 
+> [ 399.996000] (2:node@c-1.me)  370776  | 366680 
+> [ 399.996000] (2:node@c-1.me)  374872  | 366680 
+> [ 399.996000] (2:node@c-1.me)  383064  | 366680 
+> [ 399.996000] (2:node@c-1.me)  399448  | 366680 
+> [ 399.996000] (2:node@c-1.me)  432216  | 366680 
+> [ 399.996000] (2:node@c-1.me)  497752  | 366680 
+> [ 399.996000] (2:node@c-1.me)  628824  | 366680 
+> [ 399.996000] (2:node@c-1.me)  890968  | 366680 
+> [ 399.996000] (2:node@c-1.me)  1415256  | 366680 
+> [ 399.996000] (2:node@c-1.me)  2463832  | 366680 
+> [ 399.996000] (2:node@c-1.me)  4560984  | 366680 
+> [ 399.996000] (2:node@c-1.me)  8755288  | 366680 
+> [ 399.996000] (2:node@c-1.me) Predecessor: 42
+> [ 400.996000] (3:node@c-2.me) My finger table:
+> [ 400.996000] (3:node@c-2.me) Start | Succ 
+> [ 400.996000] (3:node@c-2.me)  533745  | 1319738 
+> [ 400.996000] (3:node@c-2.me)  533746  | 10004760 
+> [ 400.996000] (3:node@c-2.me)  533748  | 1319738 
+> [ 400.996000] (3:node@c-2.me)  533752  | 533744 
+> [ 400.996000] (3:node@c-2.me)  533760  | 533744 
+> [ 400.996000] (3:node@c-2.me)  533776  | 533744 
+> [ 400.996000] (3:node@c-2.me)  533808  | 533744 
+> [ 400.996000] (3:node@c-2.me)  533872  | 533744 
+> [ 400.996000] (3:node@c-2.me)  534000  | 533744 
+> [ 400.996000] (3:node@c-2.me)  534256  | 533744 
+> [ 400.996000] (3:node@c-2.me)  534768  | 533744 
+> [ 400.996000] (3:node@c-2.me)  535792  | 533744 
+> [ 400.996000] (3:node@c-2.me)  537840  | 533744 
+> [ 400.996000] (3:node@c-2.me)  541936  | 533744 
+> [ 400.996000] (3:node@c-2.me)  550128  | 533744 
+> [ 400.996000] (3:node@c-2.me)  566512  | 533744 
+> [ 400.996000] (3:node@c-2.me)  599280  | 533744 
+> [ 400.996000] (3:node@c-2.me)  664816  | 533744 
+> [ 400.996000] (3:node@c-2.me)  795888  | 533744 
+> [ 400.996000] (3:node@c-2.me)  1058032  | 533744 
+> [ 400.996000] (3:node@c-2.me)  1582320  | 533744 
+> [ 400.996000] (3:node@c-2.me)  2630896  | 533744 
+> [ 400.996000] (3:node@c-2.me)  4728048  | 533744 
+> [ 400.996000] (3:node@c-2.me)  8922352  | 533744 
+> [ 400.996000] (3:node@c-2.me) Predecessor: 10874876
+> [ 402.996000] (9:node@c-8.me) My finger table:
+> [ 402.996000] (9:node@c-8.me) Start | Succ 
+> [ 402.996000] (9:node@c-8.me)  6518809  | 10004760 
+> [ 402.996000] (9:node@c-8.me)  6518810  | 10004760 
+> [ 402.996000] (9:node@c-8.me)  6518812  | 10004760 
+> [ 402.996000] (9:node@c-8.me)  6518816  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6518824  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6518840  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6518872  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 402.996000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 402.996000] (9:node@c-8.me) Predecessor: 1319738
+> [ 406.995900] (4:node@c-3.me) My finger table:
+> [ 406.995900] (4:node@c-3.me) Start | Succ 
+> [ 406.995900] (4:node@c-3.me)  1319739  | 6518808 
+> [ 406.995900] (4:node@c-3.me)  1319740  | 6518808 
+> [ 406.995900] (4:node@c-3.me)  1319742  | 6518808 
+> [ 406.995900] (4:node@c-3.me)  1319746  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1319754  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1319770  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1319802  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1319866  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1319994  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1320250  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1320762  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1321786  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1323834  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1327930  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1336122  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1352506  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1385274  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1450810  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1581882  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  1844026  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  2368314  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  3416890  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  5514042  | 1319738 
+> [ 406.995900] (4:node@c-3.me)  9708346  | 1319738 
+> [ 406.995900] (4:node@c-3.me) Predecessor: 533744
+> [ 409.995900] (1:node@c-0.me) My finger table:
+> [ 409.995900] (1:node@c-0.me) Start | Succ 
+> [ 409.995900] (1:node@c-0.me)   43  | 366680 
+> [ 409.995900] (1:node@c-0.me)   44  | 366680 
+> [ 409.995900] (1:node@c-0.me)   46  | 366680 
+> [ 409.995900] (1:node@c-0.me)   50  |  42 
+> [ 409.995900] (1:node@c-0.me)   58  |  42 
+> [ 409.995900] (1:node@c-0.me)   74  |  42 
+> [ 409.995900] (1:node@c-0.me)  106  |  42 
+> [ 409.995900] (1:node@c-0.me)  170  |  42 
+> [ 409.995900] (1:node@c-0.me)  298  |  42 
+> [ 409.995900] (1:node@c-0.me)  554  |  42 
+> [ 409.995900] (1:node@c-0.me)  1066  |  42 
+> [ 409.995900] (1:node@c-0.me)  2090  |  42 
+> [ 409.995900] (1:node@c-0.me)  4138  |  42 
+> [ 409.995900] (1:node@c-0.me)  8234  |  42 
+> [ 409.995900] (1:node@c-0.me)  16426  |  42 
+> [ 409.995900] (1:node@c-0.me)  32810  |  42 
+> [ 409.995900] (1:node@c-0.me)  65578  |  42 
+> [ 409.995900] (1:node@c-0.me)  131114  |  42 
+> [ 409.995900] (1:node@c-0.me)  262186  |  42 
+> [ 409.995900] (1:node@c-0.me)  524330  |  42 
+> [ 409.995900] (1:node@c-0.me)  1048618  |  42 
+> [ 409.995900] (1:node@c-0.me)  2097194  |  42 
+> [ 409.995900] (1:node@c-0.me)  4194346  |  42 
+> [ 409.995900] (1:node@c-0.me)  8388650  |  42 
+> [ 409.995900] (1:node@c-0.me) Predecessor: 16728096
+> [ 413.995800] (5:node@c-4.me) My finger table:
+> [ 413.995800] (5:node@c-4.me) Start | Succ 
+> [ 413.995800] (5:node@c-4.me)  16509406  | 16728096 
+> [ 413.995800] (5:node@c-4.me)  16509407  |  42 
+> [ 413.995800] (5:node@c-4.me)  16509409  | 16728096 
+> [ 413.995800] (5:node@c-4.me)  16509413  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16509421  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16509437  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16509469  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16509533  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16509661  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16509917  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16510429  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16511453  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16513501  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16517597  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16525789  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16542173  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16574941  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16640477  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  16771549  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  256477  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  780765  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  1829341  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  3926493  | 16509405 
+> [ 413.995800] (5:node@c-4.me)  8120797  | 16509405 
+> [ 413.995800] (5:node@c-4.me) Predecessor: 10004760
+> [ 428.995800] (3:node@c-2.me) My finger table:
+> [ 428.995800] (3:node@c-2.me) Start | Succ 
+> [ 428.995800] (3:node@c-2.me)  533745  | 1319738 
+> [ 428.995800] (3:node@c-2.me)  533746  | 10004760 
+> [ 428.995800] (3:node@c-2.me)  533748  | 1319738 
+> [ 428.995800] (3:node@c-2.me)  533752  | 533744 
+> [ 428.995800] (3:node@c-2.me)  533760  | 533744 
+> [ 428.995800] (3:node@c-2.me)  533776  | 533744 
+> [ 428.995800] (3:node@c-2.me)  533808  | 533744 
+> [ 428.995800] (3:node@c-2.me)  533872  | 533744 
+> [ 428.995800] (3:node@c-2.me)  534000  | 533744 
+> [ 428.995800] (3:node@c-2.me)  534256  | 533744 
+> [ 428.995800] (3:node@c-2.me)  534768  | 533744 
+> [ 428.995800] (3:node@c-2.me)  535792  | 533744 
+> [ 428.995800] (3:node@c-2.me)  537840  | 533744 
+> [ 428.995800] (3:node@c-2.me)  541936  | 533744 
+> [ 428.995800] (3:node@c-2.me)  550128  | 533744 
+> [ 428.995800] (3:node@c-2.me)  566512  | 533744 
+> [ 428.995800] (3:node@c-2.me)  599280  | 533744 
+> [ 428.995800] (3:node@c-2.me)  664816  | 533744 
+> [ 428.995800] (3:node@c-2.me)  795888  | 533744 
+> [ 428.995800] (3:node@c-2.me)  1058032  | 533744 
+> [ 428.995800] (3:node@c-2.me)  1582320  | 533744 
+> [ 428.995800] (3:node@c-2.me)  2630896  | 533744 
+> [ 428.995800] (3:node@c-2.me)  4728048  | 533744 
+> [ 428.995800] (3:node@c-2.me)  8922352  | 533744 
+> [ 428.995800] (3:node@c-2.me) Predecessor: 366680
+> [ 494.995500] (7:node@c-6.me) My finger table:
+> [ 494.995500] (7:node@c-6.me) Start | Succ 
+> [ 494.995500] (7:node@c-6.me)  16728097  |  42 
+> [ 494.995500] (7:node@c-6.me)  16728098  | 1319738 
+> [ 494.995500] (7:node@c-6.me)  16728100  |  42 
+> [ 494.995500] (7:node@c-6.me)  16728104  |  42 
+> [ 494.995500] (7:node@c-6.me)  16728112  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16728128  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16728160  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16728224  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16728352  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16728608  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16729120  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16730144  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16732192  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16736288  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16744480  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16760864  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  16416  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  81952  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  213024  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  475168  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  999456  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  2048032  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  4145184  | 16728096 
+> [ 494.995500] (7:node@c-6.me)  8339488  | 16728096 
+> [ 494.995500] (7:node@c-6.me) Predecessor: 16509405
+> [ 499.995500] (10:node@c-9.me) My finger table:
+> [ 499.995500] (10:node@c-9.me) Start | Succ 
+> [ 499.995500] (10:node@c-9.me)  2015254  | 10004760 
+> [ 499.995500] (10:node@c-9.me)  2015255  | 16728096 
+> [ 499.995500] (10:node@c-9.me)  2015257  | 16728096 
+> [ 499.995500] (10:node@c-9.me)  2015261  | 10004760 
+> [ 499.995500] (10:node@c-9.me)  2015269  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2015285  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2015317  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2015381  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2015509  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2015765  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2016277  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2017301  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2019349  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2023445  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2031637  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2048021  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2080789  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2146325  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2277397  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  2539541  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  3063829  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  4112405  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  6209557  | 2015253 
+> [ 499.995500] (10:node@c-9.me)  10403861  | 2015253 
+> [ 499.995500] (10:node@c-9.me) Predecessor: -1
+> [ 501.995400] (6:node@c-5.me) My finger table:
+> [ 501.995400] (6:node@c-5.me) Start | Succ 
+> [ 501.995400] (6:node@c-5.me)  10874877  |  42 
+> [ 501.995400] (6:node@c-5.me)  10874878  | 533744 
+> [ 501.995400] (6:node@c-5.me)  10874880  | 533744 
+> [ 501.995400] (6:node@c-5.me)  10874884  |  42 
+> [ 501.995400] (6:node@c-5.me)  10874892  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10874908  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10874940  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10875004  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10875132  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10875388  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10875900  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10876924  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10878972  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10883068  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10891260  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10907644  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  10940412  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  11005948  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  11137020  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  11399164  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  11923452  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  12972028  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  15069180  | 10874876 
+> [ 501.995400] (6:node@c-5.me)  2486268  | 10874876 
+> [ 501.995400] (6:node@c-5.me) Predecessor: -1
+> [ 523.995200] (8:node@c-7.me) My finger table:
+> [ 523.995200] (8:node@c-7.me) Start | Succ 
+> [ 523.995200] (8:node@c-7.me)  10004761  | 16509405 
+> [ 523.995200] (8:node@c-7.me)  10004762  | 16509405 
+> [ 523.995200] (8:node@c-7.me)  10004764  | 16509405 
+> [ 523.995200] (8:node@c-7.me)  10004768  | 16509405 
+> [ 523.995200] (8:node@c-7.me)  10004776  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10004792  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10004824  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10004888  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10005016  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10005272  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10005784  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10006808  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10008856  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10012952  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10021144  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10037528  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10070296  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10135832  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10266904  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  10529048  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  11053336  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  12101912  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  14199064  | 10004760 
+> [ 523.995200] (8:node@c-7.me)  1616152  | 10004760 
+> [ 523.995200] (8:node@c-7.me) Predecessor: 6518808
+> [ 532.995100] (3:node@c-2.me) My finger table:
+> [ 532.995100] (3:node@c-2.me) Start | Succ 
+> [ 532.995100] (3:node@c-2.me)  533745  | 1319738 
+> [ 532.995100] (3:node@c-2.me)  533746  | 10004760 
+> [ 532.995100] (3:node@c-2.me)  533748  | 1319738 
+> [ 532.995100] (3:node@c-2.me)  533752  | 1319738 
+> [ 532.995100] (3:node@c-2.me)  533760  | 533744 
+> [ 532.995100] (3:node@c-2.me)  533776  | 533744 
+> [ 532.995100] (3:node@c-2.me)  533808  | 533744 
+> [ 532.995100] (3:node@c-2.me)  533872  | 533744 
+> [ 532.995100] (3:node@c-2.me)  534000  | 533744 
+> [ 532.995100] (3:node@c-2.me)  534256  | 533744 
+> [ 532.995100] (3:node@c-2.me)  534768  | 533744 
+> [ 532.995100] (3:node@c-2.me)  535792  | 533744 
+> [ 532.995100] (3:node@c-2.me)  537840  | 533744 
+> [ 532.995100] (3:node@c-2.me)  541936  | 533744 
+> [ 532.995100] (3:node@c-2.me)  550128  | 533744 
+> [ 532.995100] (3:node@c-2.me)  566512  | 533744 
+> [ 532.995100] (3:node@c-2.me)  599280  | 533744 
+> [ 532.995100] (3:node@c-2.me)  664816  | 533744 
+> [ 532.995100] (3:node@c-2.me)  795888  | 533744 
+> [ 532.995100] (3:node@c-2.me)  1058032  | 533744 
+> [ 532.995100] (3:node@c-2.me)  1582320  | 533744 
+> [ 532.995100] (3:node@c-2.me)  2630896  | 533744 
+> [ 532.995100] (3:node@c-2.me)  4728048  | 533744 
+> [ 532.995100] (3:node@c-2.me)  8922352  | 533744 
+> [ 532.995100] (3:node@c-2.me) Predecessor: 366680
+> [ 534.995100] (4:node@c-3.me) My finger table:
+> [ 534.995100] (9:node@c-8.me) My finger table:
+> [ 534.995100] (4:node@c-3.me) Start | Succ 
+> [ 534.995100] (9:node@c-8.me) Start | Succ 
+> [ 534.995100] (4:node@c-3.me)  1319739  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  6518809  | 10004760 
+> [ 534.995100] (4:node@c-3.me)  1319740  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1319742  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1319746  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  6518810  | 10004760 
+> [ 534.995100] (4:node@c-3.me)  1319754  | 1319738 
+> [ 534.995100] (4:node@c-3.me)  1319770  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6518812  | 10004760 
+> [ 534.995100] (4:node@c-3.me)  1319802  | 1319738 
+> [ 534.995100] (4:node@c-3.me)  1319866  | 1319738 
+> [ 534.995100] (4:node@c-3.me)  1319994  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6518816  | 10004760 
+> [ 534.995100] (4:node@c-3.me)  1320250  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6518824  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  6518840  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1320762  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6518872  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1321786  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6518936  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1323834  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6519064  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1327930  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6519320  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1336122  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6519832  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1352506  | 1319738 
+> [ 534.995100] (4:node@c-3.me)  1385274  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6520856  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1450810  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6522904  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1581882  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6527000  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  1844026  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6535192  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  2368314  | 1319738 
+> [ 534.995100] (4:node@c-3.me)  3416890  | 1319738 
+> [ 534.995100] (4:node@c-3.me)  5514042  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6551576  | 6518808 
+> [ 534.995100] (4:node@c-3.me)  9708346  | 1319738 
+> [ 534.995100] (9:node@c-8.me)  6584344  | 6518808 
+> [ 534.995100] (4:node@c-3.me) Predecessor: 533744
+> [ 534.995100] (9:node@c-8.me)  6649880  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  6780952  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  7043096  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  7567384  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  8615960  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  10713112  | 6518808 
+> [ 534.995100] (9:node@c-8.me)  14907416  | 6518808 
+> [ 534.995100] (9:node@c-8.me) Predecessor: 1319738
+> [ 535.995000] (5:node@c-4.me) My finger table:
+> [ 535.995000] (5:node@c-4.me) Start | Succ 
+> [ 535.995000] (5:node@c-4.me)  16509406  | 16728096 
+> [ 535.995000] (5:node@c-4.me)  16509407  |  42 
+> [ 535.995000] (5:node@c-4.me)  16509409  | 16728096 
+> [ 535.995000] (5:node@c-4.me)  16509413  | 16728096 
+> [ 535.995000] (5:node@c-4.me)  16509421  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16509437  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16509469  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16509533  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16509661  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16509917  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16510429  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16511453  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16513501  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16517597  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16525789  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16542173  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16574941  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16640477  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  16771549  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  256477  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  780765  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  1829341  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  3926493  | 16509405 
+> [ 535.995000] (5:node@c-4.me)  8120797  | 16509405 
+> [ 535.995000] (5:node@c-4.me) Predecessor: 10004760
+> [ 550.994900] (1:node@c-0.me) My finger table:
+> [ 550.994900] (1:node@c-0.me) Start | Succ 
+> [ 550.994900] (1:node@c-0.me)   43  | 366680 
+> [ 550.994900] (1:node@c-0.me)   44  | 366680 
+> [ 550.994900] (1:node@c-0.me)   46  | 366680 
+> [ 550.994900] (1:node@c-0.me)   50  | 366680 
+> [ 550.994900] (1:node@c-0.me)   58  |  42 
+> [ 550.994900] (1:node@c-0.me)   74  |  42 
+> [ 550.994900] (1:node@c-0.me)  106  |  42 
+> [ 550.994900] (1:node@c-0.me)  170  |  42 
+> [ 550.994900] (1:node@c-0.me)  298  |  42 
+> [ 550.994900] (1:node@c-0.me)  554  |  42 
+> [ 550.994900] (1:node@c-0.me)  1066  |  42 
+> [ 550.994900] (1:node@c-0.me)  2090  |  42 
+> [ 550.994900] (1:node@c-0.me)  4138  |  42 
+> [ 550.994900] (1:node@c-0.me)  8234  |  42 
+> [ 550.994900] (1:node@c-0.me)  16426  |  42 
+> [ 550.994900] (1:node@c-0.me)  32810  |  42 
+> [ 550.994900] (1:node@c-0.me)  65578  |  42 
+> [ 550.994900] (1:node@c-0.me)  131114  |  42 
+> [ 550.994900] (1:node@c-0.me)  262186  |  42 
+> [ 550.994900] (1:node@c-0.me)  524330  |  42 
+> [ 550.994900] (1:node@c-0.me)  1048618  |  42 
+> [ 550.994900] (1:node@c-0.me)  2097194  |  42 
+> [ 550.994900] (1:node@c-0.me)  4194346  |  42 
+> [ 550.994900] (1:node@c-0.me)  8388650  |  42 
+> [ 550.994900] (1:node@c-0.me) Predecessor: 16728096
+> [ 572.994600] (9:node@c-8.me) My finger table:
+> [ 572.994600] (9:node@c-8.me) Start | Succ 
+> [ 572.994600] (9:node@c-8.me)  6518809  | 10004760 
+> [ 572.994600] (9:node@c-8.me)  6518810  | 10004760 
+> [ 572.994600] (9:node@c-8.me)  6518812  | 10004760 
+> [ 572.994600] (9:node@c-8.me)  6518816  | 10004760 
+> [ 572.994600] (9:node@c-8.me)  6518824  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6518840  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6518872  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6518936  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6519064  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6519320  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6519832  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6520856  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6522904  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6527000  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6535192  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6551576  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6584344  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6649880  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  6780952  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  7043096  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  7567384  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  8615960  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  10713112  | 6518808 
+> [ 572.994600] (9:node@c-8.me)  14907416  | 6518808 
+> [ 572.994600] (9:node@c-8.me) Predecessor: 2015253
+> [ 589.994400] (5:node@c-4.me) My finger table:
+> [ 589.994400] (5:node@c-4.me) Start | Succ 
+> [ 589.994400] (5:node@c-4.me)  16509406  | 16728096 
+> [ 589.994400] (5:node@c-4.me)  16509407  |  42 
+> [ 589.994400] (5:node@c-4.me)  16509409  | 16728096 
+> [ 589.994400] (5:node@c-4.me)  16509413  | 16728096 
+> [ 589.994400] (5:node@c-4.me)  16509421  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16509437  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16509469  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16509533  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16509661  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16509917  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16510429  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16511453  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16513501  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16517597  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16525789  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16542173  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16574941  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16640477  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  16771549  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  256477  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  780765  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  1829341  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  3926493  | 16509405 
+> [ 589.994400] (5:node@c-4.me)  8120797  | 16509405 
+> [ 589.994400] (5:node@c-4.me) Predecessor: 10874876
+> [ 622.994100] (10:node@c-9.me) My finger table:
+> [ 622.994100] (10:node@c-9.me) Start | Succ 
+> [ 622.994100] (10:node@c-9.me)  2015254  | 6518808 
+> [ 622.994100] (10:node@c-9.me)  2015255  | 16728096 
+> [ 622.994100] (10:node@c-9.me)  2015257  | 16728096 
+> [ 622.994100] (10:node@c-9.me)  2015261  | 10004760 
+> [ 622.994100] (10:node@c-9.me)  2015269  | 6518808 
+> [ 622.994100] (10:node@c-9.me)  2015285  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2015317  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2015381  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2015509  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2015765  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2016277  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2017301  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2019349  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2023445  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2031637  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2048021  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2080789  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2146325  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2277397  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  2539541  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  3063829  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  4112405  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  6209557  | 2015253 
+> [ 622.994100] (10:node@c-9.me)  10403861  | 2015253 
+> [ 622.994100] (10:node@c-9.me) Predecessor: -1
+> [ 624.994100] (7:node@c-6.me) My finger table:
+> [ 624.994100] (7:node@c-6.me) Start | Succ 
+> [ 624.994100] (7:node@c-6.me)  16728097  |  42 
+> [ 624.994100] (7:node@c-6.me)  16728098  | 1319738 
+> [ 624.994100] (7:node@c-6.me)  16728100  |  42 
+> [ 624.994100] (7:node@c-6.me)  16728104  |  42 
+> [ 624.994100] (7:node@c-6.me)  16728112  |  42 
+> [ 624.994100] (7:node@c-6.me)  16728128  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16728160  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16728224  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16728352  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16728608  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16729120  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16730144  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16732192  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16736288  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16744480  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16760864  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  16416  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  81952  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  213024  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  475168  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  999456  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  2048032  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  4145184  | 16728096 
+> [ 624.994100] (7:node@c-6.me)  8339488  | 16728096 
+> [ 624.994100] (7:node@c-6.me) Predecessor: 16509405
+> [ 632.993900] (10:node@c-9.me) My finger table:
+> [ 632.993900] (10:node@c-9.me) Start | Succ 
+> [ 632.993900] (10:node@c-9.me)  2015254  | 6518808 
+> [ 632.993900] (10:node@c-9.me)  2015255  | 16728096 
+> [ 632.993900] (10:node@c-9.me)  2015257  | 16728096 
+> [ 632.993900] (10:node@c-9.me)  2015261  | 10004760 
+> [ 632.993900] (10:node@c-9.me)  2015269  | 6518808 
+> [ 632.993900] (10:node@c-9.me)  2015285  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2015317  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2015381  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2015509  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2015765  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2016277  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2017301  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2019349  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2023445  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2031637  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2048021  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2080789  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2146325  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2277397  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  2539541  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  3063829  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  4112405  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  6209557  | 2015253 
+> [ 632.993900] (10:node@c-9.me)  10403861  | 2015253 
+> [ 632.993900] (10:node@c-9.me) Predecessor: 1319738
+> [ 639.993900] (6:node@c-5.me) My finger table:
+> [ 639.993900] (6:node@c-5.me) Start | Succ 
+> [ 639.993900] (6:node@c-5.me)  10874877  | 16509405 
+> [ 639.993900] (6:node@c-5.me)  10874878  | 533744 
+> [ 639.993900] (6:node@c-5.me)  10874880  | 533744 
+> [ 639.993900] (6:node@c-5.me)  10874884  |  42 
+> [ 639.993900] (6:node@c-5.me)  10874892  | 16509405 
+> [ 639.993900] (6:node@c-5.me)  10874908  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10874940  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10875004  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10875132  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10875388  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10875900  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10876924  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10878972  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10883068  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10891260  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10907644  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  10940412  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  11005948  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  11137020  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  11399164  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  11923452  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  12972028  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  15069180  | 10874876 
+> [ 639.993900] (6:node@c-5.me)  2486268  | 10874876 
+> [ 639.993900] (6:node@c-5.me) Predecessor: -1
+> [ 650.993800] (8:node@c-7.me) My finger table:
+> [ 650.993800] (8:node@c-7.me) Start | Succ 
+> [ 650.993800] (8:node@c-7.me)  10004761  | 10874876 
+> [ 650.993800] (8:node@c-7.me)  10004762  | 16509405 
+> [ 650.993800] (8:node@c-7.me)  10004764  | 16509405 
+> [ 650.993800] (8:node@c-7.me)  10004768  | 16509405 
+> [ 650.993800] (8:node@c-7.me)  10004776  | 10874876 
+> [ 650.993800] (8:node@c-7.me)  10004792  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10004824  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10004888  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10005016  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10005272  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10005784  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10006808  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10008856  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10012952  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10021144  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10037528  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10070296  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10135832  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10266904  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  10529048  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  11053336  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  12101912  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  14199064  | 10004760 
+> [ 650.993800] (8:node@c-7.me)  1616152  | 10004760 
+> [ 650.993800] (8:node@c-7.me) Predecessor: 6518808
+> [ 651.993800] (6:node@c-5.me) My finger table:
+> [ 651.993800] (6:node@c-5.me) Start | Succ 
+> [ 651.993800] (6:node@c-5.me)  10874877  | 16509405 
+> [ 651.993800] (6:node@c-5.me)  10874878  | 533744 
+> [ 651.993800] (6:node@c-5.me)  10874880  | 533744 
+> [ 651.993800] (6:node@c-5.me)  10874884  |  42 
+> [ 651.993800] (6:node@c-5.me)  10874892  | 16509405 
+> [ 651.993800] (6:node@c-5.me)  10874908  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10874940  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10875004  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10875132  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10875388  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10875900  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10876924  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10878972  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10883068  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10891260  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10907644  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  10940412  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  11005948  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  11137020  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  11399164  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  11923452  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  12972028  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  15069180  | 10874876 
+> [ 651.993800] (6:node@c-5.me)  2486268  | 10874876 
+> [ 651.993800] (6:node@c-5.me) Predecessor: 10004760
+> [ 655.993700] (3:node@c-2.me) My finger table:
+> [ 655.993700] (3:node@c-2.me) Start | Succ 
+> [ 655.993700] (3:node@c-2.me)  533745  | 1319738 
+> [ 655.993700] (3:node@c-2.me)  533746  | 10004760 
+> [ 655.993700] (3:node@c-2.me)  533748  | 1319738 
+> [ 655.993700] (3:node@c-2.me)  533752  | 1319738 
+> [ 655.993700] (3:node@c-2.me)  533760  | 1319738 
+> [ 655.993700] (3:node@c-2.me)  533776  | 533744 
+> [ 655.993700] (3:node@c-2.me)  533808  | 533744 
+> [ 655.993700] (3:node@c-2.me)  533872  | 533744 
+> [ 655.993700] (3:node@c-2.me)  534000  | 533744 
+> [ 655.993700] (3:node@c-2.me)  534256  | 533744 
+> [ 655.993700] (3:node@c-2.me)  534768  | 533744 
+> [ 655.993700] (3:node@c-2.me)  535792  | 533744 
+> [ 655.993700] (3:node@c-2.me)  537840  | 533744 
+> [ 655.993700] (3:node@c-2.me)  541936  | 533744 
+> [ 655.993700] (3:node@c-2.me)  550128  | 533744 
+> [ 655.993700] (3:node@c-2.me)  566512  | 533744 
+> [ 655.993700] (3:node@c-2.me)  599280  | 533744 
+> [ 655.993700] (3:node@c-2.me)  664816  | 533744 
+> [ 655.993700] (3:node@c-2.me)  795888  | 533744 
+> [ 655.993700] (3:node@c-2.me)  1058032  | 533744 
+> [ 655.993700] (3:node@c-2.me)  1582320  | 533744 
+> [ 655.993700] (3:node@c-2.me)  2630896  | 533744 
+> [ 655.993700] (3:node@c-2.me)  4728048  | 533744 
+> [ 655.993700] (3:node@c-2.me)  8922352  | 533744 
+> [ 655.993700] (3:node@c-2.me) Predecessor: 366680
+> [ 657.993700] (4:node@c-3.me) My finger table:
+> [ 657.993700] (4:node@c-3.me) Start | Succ 
+> [ 657.993700] (4:node@c-3.me)  1319739  | 2015253 
+> [ 657.993700] (4:node@c-3.me)  1319740  | 6518808 
+> [ 657.993700] (4:node@c-3.me)  1319742  | 6518808 
+> [ 657.993700] (4:node@c-3.me)  1319746  | 6518808 
+> [ 657.993700] (4:node@c-3.me)  1319754  | 2015253 
+> [ 657.993700] (4:node@c-3.me)  1319770  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1319802  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1319866  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1319994  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1320250  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1320762  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1321786  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1323834  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1327930  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1336122  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1352506  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1385274  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1450810  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1581882  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  1844026  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  2368314  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  3416890  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  5514042  | 1319738 
+> [ 657.993700] (4:node@c-3.me)  9708346  | 1319738 
+> [ 657.993700] (4:node@c-3.me) Predecessor: 533744
+> [ 661.993600] (9:node@c-8.me) My finger table:
+> [ 661.993600] (9:node@c-8.me) Start | Succ 
+> [ 661.993600] (9:node@c-8.me)  6518809  | 10004760 
+> [ 661.993600] (9:node@c-8.me)  6518810  | 10004760 
+> [ 661.993600] (9:node@c-8.me)  6518812  | 10004760 
+> [ 661.993600] (9:node@c-8.me)  6518816  | 10004760 
+> [ 661.993600] (9:node@c-8.me)  6518824  | 10004760 
+> [ 661.993600] (9:node@c-8.me)  6518840  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6518872  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6518936  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6519064  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6519320  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6519832  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6520856  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6522904  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6527000  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6535192  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6551576  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6584344  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6649880  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  6780952  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  7043096  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  7567384  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  8615960  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  10713112  | 6518808 
+> [ 661.993600] (9:node@c-8.me)  14907416  | 6518808 
+> [ 661.993600] (9:node@c-8.me) Predecessor: 2015253
+> [ 663.993600] (5:node@c-4.me) My finger table:
+> [ 663.993600] (5:node@c-4.me) Start | Succ 
+> [ 663.993600] (5:node@c-4.me)  16509406  | 16728096 
+> [ 663.993600] (5:node@c-4.me)  16509407  |  42 
+> [ 663.993600] (5:node@c-4.me)  16509409  | 16728096 
+> [ 663.993600] (5:node@c-4.me)  16509413  | 16728096 
+> [ 663.993600] (5:node@c-4.me)  16509421  | 16728096 
+> [ 663.993600] (5:node@c-4.me)  16509437  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16509469  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16509533  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16509661  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16509917  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16510429  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16511453  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16513501  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16517597  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16525789  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16542173  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16574941  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16640477  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  16771549  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  256477  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  780765  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  1829341  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  3926493  | 16509405 
+> [ 663.993600] (5:node@c-4.me)  8120797  | 16509405 
+> [ 663.993600] (5:node@c-4.me) Predecessor: 10874876
+> [ 744.993200] (10:node@c-9.me) My finger table:
+> [ 744.993200] (10:node@c-9.me) Start | Succ 
+> [ 744.993200] (10:node@c-9.me)  2015254  | 6518808 
+> [ 744.993200] (10:node@c-9.me)  2015255  | 16728096 
+> [ 744.993200] (10:node@c-9.me)  2015257  | 16728096 
+> [ 744.993200] (10:node@c-9.me)  2015261  | 10004760 
+> [ 744.993200] (10:node@c-9.me)  2015269  | 6518808 
+> [ 744.993200] (10:node@c-9.me)  2015285  | 6518808 
+> [ 744.993200] (10:node@c-9.me)  2015317  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2015381  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2015509  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2015765  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2016277  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2017301  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2019349  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2023445  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2031637  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2048021  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2080789  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2146325  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2277397  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  2539541  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  3063829  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  4112405  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  6209557  | 2015253 
+> [ 744.993200] (10:node@c-9.me)  10403861  | 2015253 
+> [ 744.993200] (10:node@c-9.me) Predecessor: 1319738
+> [ 748.993100] (2:node@c-1.me) My finger table:
+> [ 748.993100] (2:node@c-1.me) Start | Succ 
+> [ 748.993100] (2:node@c-1.me)  366681  | 533744 
+> [ 748.993100] (2:node@c-1.me)  366682  | 1319738 
+> [ 748.993100] (2:node@c-1.me)  366684  | 533744 
+> [ 748.993100] (2:node@c-1.me)  366688  | 533744 
+> [ 748.993100] (2:node@c-1.me)  366696  | 366680 
+> [ 748.993100] (2:node@c-1.me)  366712  | 366680 
+> [ 748.993100] (2:node@c-1.me)  366744  | 366680 
+> [ 748.993100] (2:node@c-1.me)  366808  | 366680 
+> [ 748.993100] (2:node@c-1.me)  366936  | 366680 
+> [ 748.993100] (2:node@c-1.me)  367192  | 366680 
+> [ 748.993100] (2:node@c-1.me)  367704  | 366680 
+> [ 748.993100] (2:node@c-1.me)  368728  | 366680 
+> [ 748.993100] (2:node@c-1.me)  370776  | 366680 
+> [ 748.993100] (2:node@c-1.me)  374872  | 366680 
+> [ 748.993100] (2:node@c-1.me)  383064  | 366680 
+> [ 748.993100] (2:node@c-1.me)  399448  | 366680 
+> [ 748.993100] (2:node@c-1.me)  432216  | 366680 
+> [ 748.993100] (2:node@c-1.me)  497752  | 366680 
+> [ 748.993100] (2:node@c-1.me)  628824  | 366680 
+> [ 748.993100] (2:node@c-1.me)  890968  | 366680 
+> [ 748.993100] (2:node@c-1.me)  1415256  | 366680 
+> [ 748.993100] (2:node@c-1.me)  2463832  | 366680 
+> [ 748.993100] (2:node@c-1.me)  4560984  | 366680 
+> [ 748.993100] (2:node@c-1.me)  8755288  | 366680 
+> [ 748.993100] (2:node@c-1.me) Predecessor: 42
+> [ 748.993100] (7:node@c-6.me) My finger table:
+> [ 748.993100] (7:node@c-6.me) Start | Succ 
+> [ 748.993100] (7:node@c-6.me)  16728097  |  42 
+> [ 748.993100] (7:node@c-6.me)  16728098  | 1319738 
+> [ 748.993100] (7:node@c-6.me)  16728100  |  42 
+> [ 748.993100] (7:node@c-6.me)  16728104  |  42 
+> [ 748.993100] (7:node@c-6.me)  16728112  |  42 
+> [ 748.993100] (7:node@c-6.me)  16728128  |  42 
+> [ 748.993100] (7:node@c-6.me)  16728160  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16728224  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16728352  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16728608  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16729120  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16730144  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16732192  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16736288  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16744480  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16760864  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  16416  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  81952  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  213024  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  475168  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  999456  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  2048032  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  4145184  | 16728096 
+> [ 748.993100] (7:node@c-6.me)  8339488  | 16728096 
+> [ 748.993100] (7:node@c-6.me) Predecessor: 16509405
+> [ 768.992700] (6:node@c-5.me) My finger table:
+> [ 768.992700] (6:node@c-5.me) Start | Succ 
+> [ 768.992700] (6:node@c-5.me)  10874877  | 16509405 
+> [ 768.992700] (6:node@c-5.me)  10874878  | 533744 
+> [ 768.992700] (6:node@c-5.me)  10874880  | 533744 
+> [ 768.992700] (6:node@c-5.me)  10874884  |  42 
+> [ 768.992700] (6:node@c-5.me)  10874892  | 16509405 
+> [ 768.992700] (6:node@c-5.me)  10874908  | 16509405 
+> [ 768.992700] (6:node@c-5.me)  10874940  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10875004  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10875132  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10875388  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10875900  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10876924  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10878972  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10883068  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10891260  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10907644  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  10940412  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  11005948  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  11137020  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  11399164  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  11923452  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  12972028  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  15069180  | 10874876 
+> [ 768.992700] (6:node@c-5.me)  2486268  | 10874876 
+> [ 768.992700] (6:node@c-5.me) Predecessor: 10004760
+> [ 781.992700] (3:node@c-2.me) My finger table:
+> [ 781.992700] (3:node@c-2.me) Start | Succ 
+> [ 781.992700] (8:node@c-7.me) My finger table:
+> [ 781.992700] (3:node@c-2.me)  533745  | 1319738 
+> [ 781.992700] (8:node@c-7.me) Start | Succ 
+> [ 781.992700] (3:node@c-2.me)  533746  | 10004760 
+> [ 781.992700] (8:node@c-7.me)  10004761  | 10874876 
+> [ 781.992700] (3:node@c-2.me)  533748  | 1319738 
+> [ 781.992700] (8:node@c-7.me)  10004762  | 16509405 
+> [ 781.992700] (3:node@c-2.me)  533752  | 1319738 
+> [ 781.992700] (8:node@c-7.me)  10004764  | 16509405 
+> [ 781.992700] (3:node@c-2.me)  533760  | 1319738 
+> [ 781.992700] (8:node@c-7.me)  10004768  | 16509405 
+> [ 781.992700] (8:node@c-7.me)  10004776  | 10874876 
+> [ 781.992700] (3:node@c-2.me)  533776  | 1319738 
+> [ 781.992700] (8:node@c-7.me)  10004792  | 10874876 
+> [ 781.992700] (8:node@c-7.me)  10004824  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  533808  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10004888  | 10004760 
+> [ 781.992700] (8:node@c-7.me)  10005016  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  533872  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10005272  | 10004760 
+> [ 781.992700] (8:node@c-7.me)  10005784  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  534000  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10006808  | 10004760 
+> [ 781.992700] (8:node@c-7.me)  10008856  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  534256  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10012952  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  534768  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10021144  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  535792  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10037528  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  537840  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10070296  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  541936  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10135832  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  550128  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10266904  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  566512  | 533744 
+> [ 781.992700] (8:node@c-7.me)  10529048  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  599280  | 533744 
+> [ 781.992700] (8:node@c-7.me)  11053336  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  664816  | 533744 
+> [ 781.992700] (8:node@c-7.me)  12101912  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  795888  | 533744 
+> [ 781.992700] (8:node@c-7.me)  14199064  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  1058032  | 533744 
+> [ 781.992700] (8:node@c-7.me)  1616152  | 10004760 
+> [ 781.992700] (3:node@c-2.me)  1582320  | 533744 
+> [ 781.992700] (8:node@c-7.me) Predecessor: 6518808
+> [ 781.992700] (3:node@c-2.me)  2630896  | 533744 
+> [ 781.992700] (3:node@c-2.me)  4728048  | 533744 
+> [ 781.992700] (3:node@c-2.me)  8922352  | 533744 
+> [ 781.992700] (3:node@c-2.me) Predecessor: 366680
+> [ 786.992400] (5:node@c-4.me) My finger table:
+> [ 786.992400] (5:node@c-4.me) Start | Succ 
+> [ 786.992400] (5:node@c-4.me)  16509406  | 16728096 
+> [ 786.992400] (5:node@c-4.me)  16509407  |  42 
+> [ 786.992400] (5:node@c-4.me)  16509409  | 16728096 
+> [ 786.992400] (5:node@c-4.me)  16509413  | 16728096 
+> [ 786.992400] (5:node@c-4.me)  16509421  | 16728096 
+> [ 786.992400] (5:node@c-4.me)  16509437  | 16728096 
+> [ 786.992400] (5:node@c-4.me)  16509469  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16509533  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16509661  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16509917  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16510429  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16511453  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16513501  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16517597  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16525789  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16542173  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16574941  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16640477  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  16771549  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  256477  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  780765  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  1829341  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  3926493  | 16509405 
+> [ 786.992400] (5:node@c-4.me)  8120797  | 16509405 
+> [ 786.992400] (5:node@c-4.me) Predecessor: 10874876
+> [ 786.992600] (9:node@c-8.me) My finger table:
+> [ 786.992600] (9:node@c-8.me) Start | Succ 
+> [ 786.992600] (9:node@c-8.me)  6518809  | 10004760 
+> [ 786.992600] (9:node@c-8.me)  6518810  | 10004760 
+> [ 786.992600] (9:node@c-8.me)  6518812  | 10004760 
+> [ 786.992600] (9:node@c-8.me)  6518816  | 10004760 
+> [ 786.992600] (9:node@c-8.me)  6518824  | 10004760 
+> [ 786.992600] (9:node@c-8.me)  6518840  | 10004760 
+> [ 786.992600] (9:node@c-8.me)  6518872  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6518936  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6519064  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6519320  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6519832  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6520856  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6522904  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6527000  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6535192  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6551576  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6584344  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6649880  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  6780952  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  7043096  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  7567384  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  8615960  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  10713112  | 6518808 
+> [ 786.992600] (9:node@c-8.me)  14907416  | 6518808 
+> [ 786.992600] (9:node@c-8.me) Predecessor: 2015253
+> [ 795.992400] (4:node@c-3.me) My finger table:
+> [ 795.992400] (4:node@c-3.me) Start | Succ 
+> [ 795.992400] (4:node@c-3.me)  1319739  | 2015253 
+> [ 795.992400] (4:node@c-3.me)  1319740  | 6518808 
+> [ 795.992400] (4:node@c-3.me)  1319742  | 6518808 
+> [ 795.992400] (4:node@c-3.me)  1319746  | 6518808 
+> [ 795.992400] (4:node@c-3.me)  1319754  | 2015253 
+> [ 795.992400] (4:node@c-3.me)  1319770  | 2015253 
+> [ 795.992400] (4:node@c-3.me)  1319802  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1319866  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1319994  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1320250  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1320762  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1321786  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1323834  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1327930  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1336122  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1352506  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1385274  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1450810  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1581882  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  1844026  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  2368314  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  3416890  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  5514042  | 1319738 
+> [ 795.992400] (4:node@c-3.me)  9708346  | 1319738 
+> [ 795.992400] (4:node@c-3.me) Predecessor: 533744
+> [ 873.991200] (10:node@c-9.me) My finger table:
+> [ 873.991200] (10:node@c-9.me) Start | Succ 
+> [ 873.991200] (10:node@c-9.me)  2015254  | 6518808 
+> [ 873.991200] (10:node@c-9.me)  2015255  | 16728096 
+> [ 873.991200] (10:node@c-9.me)  2015257  | 16728096 
+> [ 873.991200] (10:node@c-9.me)  2015261  | 10004760 
+> [ 873.991200] (10:node@c-9.me)  2015269  | 6518808 
+> [ 873.991200] (10:node@c-9.me)  2015285  | 6518808 
+> [ 873.991200] (10:node@c-9.me)  2015317  | 6518808 
+> [ 873.991200] (10:node@c-9.me)  2015381  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2015509  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2015765  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2016277  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2017301  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2019349  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2023445  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2031637  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2048021  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2080789  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2146325  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2277397  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  2539541  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  3063829  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  4112405  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  6209557  | 2015253 
+> [ 873.991200] (10:node@c-9.me)  10403861  | 2015253 
+> [ 873.991200] (10:node@c-9.me) Predecessor: 1319738
+> [ 873.991300] (7:node@c-6.me) My finger table:
+> [ 873.991300] (7:node@c-6.me) Start | Succ 
+> [ 873.991300] (7:node@c-6.me)  16728097  |  42 
+> [ 873.991300] (7:node@c-6.me)  16728098  | 1319738 
+> [ 873.991300] (7:node@c-6.me)  16728100  |  42 
+> [ 873.991300] (7:node@c-6.me)  16728104  |  42 
+> [ 873.991300] (7:node@c-6.me)  16728112  |  42 
+> [ 873.991300] (7:node@c-6.me)  16728128  |  42 
+> [ 873.991300] (7:node@c-6.me)  16728160  |  42 
+> [ 873.991300] (7:node@c-6.me)  16728224  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16728352  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16728608  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16729120  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16730144  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16732192  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16736288  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16744480  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16760864  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  16416  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  81952  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  213024  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  475168  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  999456  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  2048032  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  4145184  | 16728096 
+> [ 873.991300] (7:node@c-6.me)  8339488  | 16728096 
+> [ 873.991300] (7:node@c-6.me) Predecessor: 16509405
+> [ 875.991200] (2:node@c-1.me) My finger table:
+> [ 875.991200] (2:node@c-1.me) Start | Succ 
+> [ 875.991200] (2:node@c-1.me)  366681  | 533744 
+> [ 875.991200] (2:node@c-1.me)  366682  | 1319738 
+> [ 875.991200] (2:node@c-1.me)  366684  | 533744 
+> [ 875.991200] (2:node@c-1.me)  366688  | 533744 
+> [ 875.991200] (2:node@c-1.me)  366696  | 533744 
+> [ 875.991200] (2:node@c-1.me)  366712  | 366680 
+> [ 875.991200] (2:node@c-1.me)  366744  | 366680 
+> [ 875.991200] (2:node@c-1.me)  366808  | 366680 
+> [ 875.991200] (2:node@c-1.me)  366936  | 366680 
+> [ 875.991200] (2:node@c-1.me)  367192  | 366680 
+> [ 875.991200] (2:node@c-1.me)  367704  | 366680 
+> [ 875.991200] (2:node@c-1.me)  368728  | 366680 
+> [ 875.991200] (2:node@c-1.me)  370776  | 366680 
+> [ 875.991200] (2:node@c-1.me)  374872  | 366680 
+> [ 875.991200] (2:node@c-1.me)  383064  | 366680 
+> [ 875.991200] (2:node@c-1.me)  399448  | 366680 
+> [ 875.991200] (2:node@c-1.me)  432216  | 366680 
+> [ 875.991200] (2:node@c-1.me)  497752  | 366680 
+> [ 875.991200] (2:node@c-1.me)  628824  | 366680 
+> [ 875.991200] (2:node@c-1.me)  890968  | 366680 
+> [ 875.991200] (2:node@c-1.me)  1415256  | 366680 
+> [ 875.991200] (2:node@c-1.me)  2463832  | 366680 
+> [ 875.991200] (2:node@c-1.me)  4560984  | 366680 
+> [ 875.991200] (2:node@c-1.me)  8755288  | 366680 
+> [ 875.991200] (2:node@c-1.me) Predecessor: 42
+> [ 893.990900] (6:node@c-5.me) My finger table:
+> [ 893.990900] (6:node@c-5.me) Start | Succ 
+> [ 893.990900] (6:node@c-5.me)  10874877  | 16509405 
+> [ 893.990900] (6:node@c-5.me)  10874878  | 533744 
+> [ 893.990900] (6:node@c-5.me)  10874880  | 533744 
+> [ 893.990900] (6:node@c-5.me)  10874884  |  42 
+> [ 893.990900] (6:node@c-5.me)  10874892  | 16509405 
+> [ 893.990900] (6:node@c-5.me)  10874908  | 16509405 
+> [ 893.990900] (6:node@c-5.me)  10874940  | 16509405 
+> [ 893.990900] (6:node@c-5.me)  10875004  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10875132  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10875388  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10875900  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10876924  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10878972  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10883068  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10891260  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10907644  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  10940412  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  11005948  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  11137020  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  11399164  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  11923452  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  12972028  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  15069180  | 10874876 
+> [ 893.990900] (6:node@c-5.me)  2486268  | 10874876 
+> [ 893.990900] (6:node@c-5.me) Predecessor: 10004760
+> [ 905.990900] (3:node@c-2.me) My finger table:
+> [ 905.990900] (3:node@c-2.me) Start | Succ 
+> [ 905.990900] (3:node@c-2.me)  533745  | 1319738 
+> [ 905.990900] (3:node@c-2.me)  533746  | 10004760 
+> [ 905.990900] (3:node@c-2.me)  533748  | 1319738 
+> [ 905.990900] (3:node@c-2.me)  533752  | 1319738 
+> [ 905.990900] (3:node@c-2.me)  533760  | 1319738 
+> [ 905.990900] (3:node@c-2.me)  533776  | 1319738 
+> [ 905.990900] (3:node@c-2.me)  533808  | 1319738 
+> [ 905.990900] (3:node@c-2.me)  533872  | 533744 
+> [ 905.990900] (3:node@c-2.me)  534000  | 533744 
+> [ 905.990900] (3:node@c-2.me)  534256  | 533744 
+> [ 905.990900] (3:node@c-2.me)  534768  | 533744 
+> [ 905.990900] (3:node@c-2.me)  535792  | 533744 
+> [ 905.990900] (3:node@c-2.me)  537840  | 533744 
+> [ 905.990900] (3:node@c-2.me)  541936  | 533744 
+> [ 905.990900] (3:node@c-2.me)  550128  | 533744 
+> [ 905.990900] (3:node@c-2.me)  566512  | 533744 
+> [ 905.990900] (3:node@c-2.me)  599280  | 533744 
+> [ 905.990900] (3:node@c-2.me)  664816  | 533744 
+> [ 905.990900] (3:node@c-2.me)  795888  | 533744 
+> [ 905.990900] (3:node@c-2.me)  1058032  | 533744 
+> [ 905.990900] (3:node@c-2.me)  1582320  | 533744 
+> [ 905.990900] (3:node@c-2.me)  2630896  | 533744 
+> [ 905.990900] (3:node@c-2.me)  4728048  | 533744 
+> [ 905.990900] (3:node@c-2.me)  8922352  | 533744 
+> [ 905.990900] (3:node@c-2.me) Predecessor: 366680
+> [ 943.991000] (9:node@c-8.me) My finger table:
+> [ 943.991000] (9:node@c-8.me) Start | Succ 
+> [ 943.991000] (9:node@c-8.me)  6518809  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518810  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518812  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518816  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518824  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518840  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518872  | 10004760 
+> [ 943.991000] (9:node@c-8.me)  6518936  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6519064  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6519320  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6519832  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6520856  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6522904  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6527000  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6535192  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6551576  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6584344  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6649880  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  6780952  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  7043096  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  7567384  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  8615960  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  10713112  | 6518808 
+> [ 943.991000] (9:node@c-8.me)  14907416  | 6518808 
+> [ 943.991000] (9:node@c-8.me) Predecessor: 2015253
+> [ 944.990900] (8:node@c-7.me) My finger table:
+> [ 944.990900] (8:node@c-7.me) Start | Succ 
+> [ 944.990900] (8:node@c-7.me)  10004761  | 10874876 
+> [ 944.990900] (8:node@c-7.me)  10004762  | 16509405 
+> [ 944.990900] (8:node@c-7.me)  10004764  | 16509405 
+> [ 944.990900] (8:node@c-7.me)  10004768  | 16509405 
+> [ 944.990900] (8:node@c-7.me)  10004776  | 10874876 
+> [ 944.990900] (8:node@c-7.me)  10004792  | 10874876 
+> [ 944.990900] (8:node@c-7.me)  10004824  | 10874876 
+> [ 944.990900] (8:node@c-7.me)  10004888  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10005016  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10005272  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10005784  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10006808  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10008856  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10012952  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10021144  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10037528  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10070296  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10135832  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10266904  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  10529048  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  11053336  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  12101912  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  14199064  | 10004760 
+> [ 944.990900] (8:node@c-7.me)  1616152  | 10004760 
+> [ 944.990900] (8:node@c-7.me) Predecessor: 6518808
+> [ 945.990900] (5:node@c-4.me) My finger table:
+> [ 945.990900] (5:node@c-4.me) Start | Succ 
+> [ 945.990900] (5:node@c-4.me)  16509406  | 16728096 
+> [ 945.990900] (5:node@c-4.me)  16509407  |  42 
+> [ 945.990900] (5:node@c-4.me)  16509409  | 16728096 
+> [ 945.990900] (5:node@c-4.me)  16509413  | 16728096 
+> [ 945.990900] (5:node@c-4.me)  16509421  | 16728096 
+> [ 945.990900] (5:node@c-4.me)  16509437  | 16728096 
+> [ 945.990900] (5:node@c-4.me)  16509469  | 16728096 
+> [ 945.990900] (5:node@c-4.me)  16509533  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16509661  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16509917  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16510429  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16511453  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16513501  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16517597  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16525789  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16542173  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16574941  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16640477  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  16771549  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  256477  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  780765  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  1829341  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  3926493  | 16509405 
+> [ 945.990900] (5:node@c-4.me)  8120797  | 16509405 
+> [ 945.990900] (5:node@c-4.me) Predecessor: 10874876
+> [ 947.990900] (1:node@c-0.me) My finger table:
+> [ 947.990900] (1:node@c-0.me) Start | Succ 
+> [ 947.990900] (1:node@c-0.me)   43  | 366680 
+> [ 947.990900] (1:node@c-0.me)   44  | 366680 
+> [ 947.990900] (1:node@c-0.me)   46  | 366680 
+> [ 947.990900] (1:node@c-0.me)   50  | 366680 
+> [ 947.990900] (1:node@c-0.me)   58  | 366680 
+> [ 947.990900] (1:node@c-0.me)   74  |  42 
+> [ 947.990900] (1:node@c-0.me)  106  |  42 
+> [ 947.990900] (1:node@c-0.me)  170  |  42 
+> [ 947.990900] (1:node@c-0.me)  298  |  42 
+> [ 947.990900] (1:node@c-0.me)  554  |  42 
+> [ 947.990900] (1:node@c-0.me)  1066  |  42 
+> [ 947.990900] (1:node@c-0.me)  2090  |  42 
+> [ 947.990900] (1:node@c-0.me)  4138  |  42 
+> [ 947.990900] (1:node@c-0.me)  8234  |  42 
+> [ 947.990900] (1:node@c-0.me)  16426  |  42 
+> [ 947.990900] (1:node@c-0.me)  32810  |  42 
+> [ 947.990900] (1:node@c-0.me)  65578  |  42 
+> [ 947.990900] (1:node@c-0.me)  131114  |  42 
+> [ 947.990900] (1:node@c-0.me)  262186  |  42 
+> [ 947.990900] (1:node@c-0.me)  524330  |  42 
+> [ 947.990900] (1:node@c-0.me)  1048618  |  42 
+> [ 947.990900] (1:node@c-0.me)  2097194  |  42 
+> [ 947.990900] (1:node@c-0.me)  4194346  |  42 
+> [ 947.990900] (1:node@c-0.me)  8388650  |  42 
+> [ 947.990900] (1:node@c-0.me) Predecessor: 16728096
+> [ 964.990700] (4:node@c-3.me) My finger table:
+> [ 964.990700] (4:node@c-3.me) Start | Succ 
+> [ 964.990700] (4:node@c-3.me)  1319739  | 2015253 
+> [ 964.990700] (4:node@c-3.me)  1319740  | 6518808 
+> [ 964.990700] (4:node@c-3.me)  1319742  | 6518808 
+> [ 964.990700] (4:node@c-3.me)  1319746  | 6518808 
+> [ 964.990700] (4:node@c-3.me)  1319754  | 2015253 
+> [ 964.990700] (4:node@c-3.me)  1319770  | 2015253 
+> [ 964.990700] (4:node@c-3.me)  1319802  | 2015253 
+> [ 964.990700] (4:node@c-3.me)  1319866  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1319994  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1320250  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1320762  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1321786  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1323834  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1327930  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1336122  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1352506  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1385274  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1450810  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1581882  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  1844026  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  2368314  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  3416890  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  5514042  | 1319738 
+> [ 964.990700] (4:node@c-3.me)  9708346  | 1319738 
+> [ 964.990700] (4:node@c-3.me) Predecessor: 533744
+> [ 995.990200] (7:node@c-6.me) My finger table:
+> [ 995.990200] (7:node@c-6.me) Start | Succ 
+> [ 995.990200] (7:node@c-6.me)  16728097  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728098  | 1319738 
+> [ 995.990200] (7:node@c-6.me)  16728100  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728104  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728112  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728128  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728160  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728224  |  42 
+> [ 995.990200] (7:node@c-6.me)  16728352  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16728608  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16729120  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16730144  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16732192  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16736288  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16744480  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16760864  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  16416  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  81952  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  213024  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  475168  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  999456  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  2048032  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  4145184  | 16728096 
+> [ 995.990200] (7:node@c-6.me)  8339488  | 16728096 
+> [ 995.990200] (7:node@c-6.me) Predecessor: 16509405
+> [1182.990500] (0:@) Messages created: 2324
+> [1182.990500] (0:@) Simulated time: 1182.99
index cc24945..3d488ca 100755 (executable)
@@ -1,5 +1,11 @@
 #!/usr/bin/python
 
+# Copyright (c) 2011-2012, 2014. 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 script generates a specific deployment file for the Chord example.
 # It assumes that the platform will be a cluster.
 # Usage: python generate.py nb_nodes nb_bits end_date
index 534992d..66afe97 100644 (file)
@@ -2,28 +2,42 @@ cmake_minimum_required(VERSION 2.6)
 
 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
 
-add_executable(masterslave_virtual_machines "masterslave_virtual_machines.c")
+add_executable(simple_vm "simple_vm.c")
+add_executable(migrate_vm "migrate_vm.c")
+add_executable(bound "bound.c")
+add_executable(scale "scale.c")
+add_executable(multicore "multicore.c")
+add_executable(two_tasks_vm "two_tasks_vm.c")
 
 ### Add definitions for compile
-if(WIN32)
-  target_link_libraries(masterslave_virtual_machines simgrid )
-else()
-  target_link_libraries(masterslave_virtual_machines simgrid)
-endif()
+target_link_libraries(simple_vm simgrid)
+target_link_libraries(migrate_vm simgrid)
+target_link_libraries(bound simgrid)
+target_link_libraries(scale simgrid)
+target_link_libraries(multicore simgrid)
+target_link_libraries(two_tasks_vm simgrid)
+
 
 set(tesh_files
   ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/masterslave_virtual_machines.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/two_tasks_vm.tesh
+   ${CMAKE_CURRENT_SOURCE_DIR}/simple_vm.tesh
   PARENT_SCOPE
   )
 set(xml_files
   ${xml_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/masterslave_virtual_machines.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/simple_plat.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/multicore_plat.xml
   PARENT_SCOPE
   )
 set(examples_src
   ${examples_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/masterslave_virtual_machines.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/simple_vm.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/migrate_vm.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/bound.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/scale.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/multicore.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/two_tasks_vm.c
   PARENT_SCOPE
   )
 set(bin_files
diff --git a/examples/msg/cloud/bound.c b/examples/msg/cloud/bound.c
new file mode 100644 (file)
index 0000000..ee5fc49
--- /dev/null
@@ -0,0 +1,421 @@
+/* Copyright (c) 2007-2014. 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 "msg/msg.h"            /* Yeah! If you want to use msg, you need to include msg/msg.h */
+#include "xbt/sysdep.h"         /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+                             "Messages specific for this msg example");
+
+/** @addtogroup MSG_examples
+ *
+ * - <b>priority/priority.c</b>: Demonstrates the use of @ref
+ *   MSG_task_set_bound to change the computation priority of a
+ *   given task.
+ *
+ */
+
+static int worker_main(int argc, char *argv[])
+{
+  double computation_amount = atof(argv[1]);
+  int use_bound = atoi(argv[2]);
+  double bound = atof(argv[3]);
+
+  {
+    double clock_sta = MSG_get_clock();
+
+    msg_task_t task = MSG_task_create("Task", computation_amount, 0, NULL);
+    if (use_bound)
+      MSG_task_set_bound(task, bound);
+    MSG_task_execute(task);
+    MSG_task_destroy(task);
+
+    double clock_end = MSG_get_clock();
+    double duration = clock_end - clock_sta;
+    double flops_per_sec = computation_amount / duration;
+
+    if (use_bound)
+      XBT_INFO("bound to %f => duration %f (%f flops/s)", bound, duration, flops_per_sec);
+    else
+      XBT_INFO("not bound => duration %f (%f flops/s)", duration, flops_per_sec);
+  }
+
+  return 0;
+}
+
+static void launch_worker(msg_host_t host, const char *pr_name, double computation_amount, int use_bound, double bound)
+{
+  char **argv = xbt_new(char *, 5);
+  argv[0] = xbt_strdup(pr_name);
+  argv[1] = bprintf("%f", computation_amount);
+  argv[2] = bprintf("%d", use_bound);
+  argv[3] = bprintf("%f", bound);
+  argv[4] = NULL;
+
+  MSG_process_create_with_arguments(pr_name, worker_main, NULL, host, 4, argv);
+}
+
+
+
+static int worker_busy_loop_main(int argc, char *argv[])
+{
+  msg_task_t *task = MSG_process_get_data(MSG_process_self());
+  for (;;)
+    MSG_task_execute(*task);
+
+  return 0;
+}
+
+/* FIXME: */
+#define DOUBLE_MAX 1e11
+
+static void test_dynamic_change(void)
+{
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+
+  msg_host_t vm0 = MSG_vm_create_core(pm0, "VM0");
+  msg_host_t vm1 = MSG_vm_create_core(pm0, "VM1");
+  MSG_vm_start(vm0);
+  MSG_vm_start(vm1);
+
+  msg_task_t task0 = MSG_task_create("Task0", DOUBLE_MAX, 0, NULL);
+  msg_task_t task1 = MSG_task_create("Task1", DOUBLE_MAX, 0, NULL);
+  msg_process_t pr0 = MSG_process_create("worker0", worker_busy_loop_main, &task0, vm0);
+  msg_process_t pr1 = MSG_process_create("worker1", worker_busy_loop_main, &task1, vm1);
+
+
+  double task0_remain_prev = MSG_task_get_remaining_computation(task0);
+  double task1_remain_prev = MSG_task_get_remaining_computation(task1);
+
+  {
+    const double cpu_speed = MSG_get_host_speed(pm0);
+    int i = 0;
+    for (i = 0; i < 10; i++) {
+      double new_bound = (cpu_speed / 10) * i;
+      XBT_INFO("set bound of VM1 to %f", new_bound);
+      MSG_vm_set_bound(vm1, new_bound);
+      MSG_process_sleep(100);
+
+      double task0_remain_now = MSG_task_get_remaining_computation(task0);
+      double task1_remain_now = MSG_task_get_remaining_computation(task1);
+
+      double task0_flops_per_sec = task0_remain_prev - task0_remain_now;
+      double task1_flops_per_sec = task1_remain_prev - task1_remain_now;
+
+      XBT_INFO("Task0@VM0: %f flops/s", task0_flops_per_sec / 100);
+      XBT_INFO("Task1@VM1: %f flops/s", task1_flops_per_sec / 100);
+
+      task0_remain_prev = task0_remain_now;
+      task1_remain_prev = task1_remain_now;
+    }
+  }
+
+  MSG_process_kill(pr0);
+  MSG_process_kill(pr1);
+  
+  MSG_vm_destroy(vm0);
+  MSG_vm_destroy(vm1);
+}
+
+
+
+static void test_one_task(msg_host_t hostA)
+{
+  const double cpu_speed = MSG_get_host_speed(hostA);
+  const double computation_amount = cpu_speed * 10;
+  const char *hostA_name = MSG_host_get_name(hostA);
+
+  XBT_INFO("### Test: with/without MSG_task_set_bound");
+
+#if 0
+  /* Easy-to-understand code (without calling MSG_task_set_bound) */
+  {
+    double clock_sta = MSG_get_clock();
+
+    msg_task_t task = MSG_task_create("Task", computation_amount, 0, NULL);
+    MSG_task_execute(task);
+    MSG_task_destroy(task);
+
+    double clock_end = MSG_get_clock();
+    double duration = clock_end - clock_sta;
+    double flops_per_sec = computation_amount / duration;
+
+    XBT_INFO("not bound => duration %f (%f flops/s)", duration, flops_per_sec);
+  }
+
+  /* Easy-to-understand code (with calling MSG_task_set_bound) */
+  {
+    double clock_sta = MSG_get_clock();
+
+    msg_task_t task = MSG_task_create("Task", computation_amount, 0, NULL);
+    MSG_task_set_bound(task, cpu_speed / 2);
+    MSG_task_execute(task);
+    MSG_task_destroy(task);
+
+    double clock_end = MSG_get_clock();
+    double duration = clock_end - clock_sta;
+    double flops_per_sec = computation_amount / duration;
+
+    XBT_INFO("bound to 0.5 => duration %f (%f flops/s)", duration, flops_per_sec);
+  }
+#endif
+
+  {
+    XBT_INFO("### Test: no bound for Task1@%s", hostA_name);
+    launch_worker(hostA, "worker0", computation_amount, 0, 0);
+  }
+
+  MSG_process_sleep(1000);
+
+  {
+    XBT_INFO("### Test: 50%% for Task1@%s", hostA_name);
+    launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed / 2);
+  }
+
+  MSG_process_sleep(1000);
+
+  {
+    XBT_INFO("### Test: 33%% for Task1@%s", hostA_name);
+    launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed / 3);
+  }
+
+  MSG_process_sleep(1000);
+
+  {
+    XBT_INFO("### Test: zero for Task1@%s (i.e., unlimited)", hostA_name);
+    launch_worker(hostA, "worker0", computation_amount, 1, 0);
+  }
+
+  MSG_process_sleep(1000);
+
+  {
+    XBT_INFO("### Test: 200%% for Task1@%s (i.e., meaningless)", hostA_name);
+    launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed * 2);
+  }
+
+  MSG_process_sleep(1000);
+}
+
+
+static void test_two_tasks(msg_host_t hostA, msg_host_t hostB)
+{
+  const double cpu_speed = MSG_get_host_speed(hostA);
+  xbt_assert(cpu_speed == MSG_get_host_speed(hostB));
+  const double computation_amount = cpu_speed * 10;
+  const char *hostA_name = MSG_host_get_name(hostA);
+  const char *hostB_name = MSG_host_get_name(hostB);
+
+  {
+    XBT_INFO("### Test: no bound for Task1@%s, no bound for Task2@%s", hostA_name, hostB_name);
+    launch_worker(hostA, "worker0", computation_amount, 0, 0);
+    launch_worker(hostB, "worker1", computation_amount, 0, 0);
+  }
+
+  MSG_process_sleep(1000);
+
+  {
+    XBT_INFO("### Test: 0 for Task1@%s, 0 for Task2@%s (i.e., unlimited)", hostA_name, hostB_name);
+    launch_worker(hostA, "worker0", computation_amount, 1, 0);
+    launch_worker(hostB, "worker1", computation_amount, 1, 0);
+  }
+
+  MSG_process_sleep(1000);
+
+  {
+    XBT_INFO("### Test: 50%% for Task1@%s, 50%% for Task2@%s", hostA_name, hostB_name);
+    launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed / 2);
+    launch_worker(hostB, "worker1", computation_amount, 1, cpu_speed / 2);
+  }
+
+  MSG_process_sleep(1000);
+
+  {
+    XBT_INFO("### Test: 25%% for Task1@%s, 25%% for Task2@%s", hostA_name, hostB_name);
+    launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed / 4);
+    launch_worker(hostB, "worker1", computation_amount, 1, cpu_speed / 4);
+  }
+
+  MSG_process_sleep(1000);
+
+  {
+    XBT_INFO("### Test: 75%% for Task1@%s, 100%% for Task2@%s", hostA_name, hostB_name);
+    launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed * 0.75);
+    launch_worker(hostB, "worker1", computation_amount, 1, cpu_speed);
+  }
+
+  MSG_process_sleep(1000);
+
+  {
+    XBT_INFO("### Test: no bound for Task1@%s, 25%% for Task2@%s", hostA_name, hostB_name);
+    launch_worker(hostA, "worker0", computation_amount, 0, 0);
+    launch_worker(hostB, "worker1", computation_amount, 1, cpu_speed / 4);
+  }
+
+  MSG_process_sleep(1000);
+
+  {
+    XBT_INFO("### Test: 75%% for Task1@%s, 25%% for Task2@%s", hostA_name, hostB_name);
+    launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed * 0.75);
+    launch_worker(hostB, "worker1", computation_amount, 1, cpu_speed / 4);
+  }
+
+  MSG_process_sleep(1000);
+}
+
+static int master_main(int argc, char *argv[])
+{
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+  msg_host_t pm1 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+
+
+  {
+    XBT_INFO("# 1. Put a single task on a PM. ");
+    test_one_task(pm0);
+    XBT_INFO(" ");
+
+
+    XBT_INFO("# 2. Put two tasks on a PM.");
+    test_two_tasks(pm0, pm0);
+    XBT_INFO(" ");
+  }
+
+
+  {
+    msg_host_t vm0 = MSG_vm_create_core(pm0, "VM0");
+    MSG_vm_start(vm0);
+
+    XBT_INFO("# 3. Put a single task on a VM. ");
+    test_one_task(vm0);
+    XBT_INFO(" ");
+
+    XBT_INFO("# 4. Put two tasks on a VM.");
+    test_two_tasks(vm0, vm0);
+    XBT_INFO(" ");
+
+
+    MSG_vm_destroy(vm0);
+  }
+
+
+  {
+    msg_host_t vm0 = MSG_vm_create_core(pm0, "VM0");
+    MSG_vm_start(vm0);
+
+    XBT_INFO("# 6. Put a task on a PM and a task on a VM.");
+    test_two_tasks(pm0, vm0);
+    XBT_INFO(" ");
+
+
+    MSG_vm_destroy(vm0);
+  }
+
+
+  {
+    msg_host_t vm0 = MSG_vm_create_core(pm0, "VM0");
+    const double cpu_speed = MSG_get_host_speed(pm0);
+    MSG_vm_set_bound(vm0, cpu_speed / 10);
+    MSG_vm_start(vm0);
+
+    XBT_INFO("# 7. Put a single task on the VM capped by 10%%.");
+    test_one_task(vm0);
+    XBT_INFO(" ");
+
+    XBT_INFO("# 8. Put two tasks on the VM capped by 10%%.");
+    test_two_tasks(vm0, vm0);
+    XBT_INFO(" ");
+
+    XBT_INFO("# 9. Put a task on a PM and a task on the VM capped by 10%%.");
+    test_two_tasks(pm0, vm0);
+    XBT_INFO(" ");
+
+    MSG_vm_destroy(vm0);
+  }
+
+
+  {
+    msg_host_t vm0 = MSG_vm_create_core(pm0, "VM0");
+
+    s_ws_params_t params;
+    memset(&params, 0, sizeof(params));
+    params.ramsize = 1L * 1000 * 1000 * 1000; // 1Gbytes
+    MSG_host_set_params(vm0, &params);
+    MSG_vm_start(vm0);
+
+    const double cpu_speed = MSG_get_host_speed(pm0);
+    MSG_vm_start(vm0);
+
+    XBT_INFO("# 10. Test migration");
+    const double computation_amount = cpu_speed * 10;
+
+    XBT_INFO("# 10. (a) Put a task on a VM without any bound.");
+    launch_worker(vm0, "worker0", computation_amount, 0, 0);
+    MSG_process_sleep(1000);
+    XBT_INFO(" ");
+
+    XBT_INFO("# 10. (b) set 10%% bound to the VM, and then put a task on the VM.");
+    MSG_vm_set_bound(vm0, cpu_speed / 10);
+    launch_worker(vm0, "worker0", computation_amount, 0, 0);
+    MSG_process_sleep(1000);
+    XBT_INFO(" ");
+
+    XBT_INFO("# 10. (c) migrate");
+    MSG_vm_migrate(vm0, pm1);
+    XBT_INFO(" ");
+
+    XBT_INFO("# 10. (d) Put a task again on the VM.");
+    launch_worker(vm0, "worker0", computation_amount, 0, 0);
+    MSG_process_sleep(1000);
+    XBT_INFO(" ");
+
+    MSG_vm_destroy(vm0);
+  }
+
+
+  XBT_INFO("# 11. Change a bound dynamically.");
+  test_dynamic_change();
+
+  return 0;
+}
+
+static void launch_master(msg_host_t host)
+{
+  const char *pr_name = "master_";
+  char **argv = xbt_new(char *, 2);
+  argv[0] = xbt_strdup(pr_name);
+  argv[1] = NULL;
+
+  MSG_process_create_with_arguments(pr_name, master_main, NULL, host, 1, argv);
+}
+
+int main(int argc, char *argv[])
+{
+  /* Get the arguments */
+  MSG_init(&argc, argv);
+
+  /* load the platform file */
+  if (argc != 2) {
+    printf("Usage: %s example/msg/cloud/simple_plat.xml\n", argv[0]);
+    return 1;
+  }
+
+  MSG_create_environment(argv[1]);
+
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+  launch_master(pm0);
+
+  int res = MSG_main();
+  XBT_INFO("Bye (simulation time %g)", MSG_get_clock());
+
+
+  return !(res == MSG_OK);
+}
diff --git a/examples/msg/cloud/masterslave_virtual_machines.c b/examples/msg/cloud/masterslave_virtual_machines.c
deleted file mode 100644 (file)
index 33513a0..0000000
+++ /dev/null
@@ -1,232 +0,0 @@
-/* Copyright (c) 2007-2013. 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 "msg/msg.h"            /* Yeah! If you want to use msg, you need to include msg/msg.h */
-#include "xbt/sysdep.h"         /* calloc, printf */
-
-/* Create a log channel to have nice outputs. */
-#include "xbt/log.h"
-#include "xbt/asserts.h"
-XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
-                             "Messages specific for this msg example");
-
-/** @addtogroup MSG_examples
- * 
- *  - <b>cloud/masterslave_virtual_machines.c: Master/slaves
- *    example, Ã  la cloud</b>. The classical example revisited to demonstrate the use of virtual machines.
- */
-
-double task_comp_size = 10000000;
-double task_comm_size = 10000000;
-
-
-int master(int argc, char *argv[]);
-int slave_fun(int argc, char *argv[]);
-
-static void work_batch(int slaves_count) {
-  int i;
-  for (i = 0; i < slaves_count; i++) {
-    char taskname_buffer[64];
-    char mailbox_buffer[64];
-
-    sprintf(taskname_buffer, "Task_%d", i);
-    sprintf(mailbox_buffer,"Slave_%d",i);
-
-    XBT_INFO("Sending \"%s\" to \"%s\"",taskname_buffer,mailbox_buffer);
-    MSG_task_send(MSG_task_create(taskname_buffer, task_comp_size, task_comm_size,NULL),
-        mailbox_buffer);
-  }
-}
-
-int master(int argc, char *argv[]) {
-  int slaves_count = 10;
-  msg_host_t *slaves = xbt_new(msg_host_t,10);
-
-  msg_vm_t vm;
-  unsigned int i;
-
-  /* Retrive the hostnames constituting our playground today */
-  for (i = 1; i < argc; i++) {
-    slaves[i - 1] = MSG_get_host_by_name(argv[i]);
-    xbt_assert(slaves[i - 1] != NULL, "Cannot use inexistent host %s", argv[i]);
-  }
-
-  /* Launch the sub processes: one VM per host, with one process inside each */
-
-  for (i=0;i<slaves_count;i++) {
-    char slavename[64];
-    sprintf(slavename,"Slave %d",i);
-    char**argv=xbt_new(char*,3);
-    argv[0] = xbt_strdup(slavename);
-    argv[1] = bprintf("%d",i);
-    argv[2] = NULL;
-
-    char vmName[64];
-    snprintf(vmName, 64, "vm_%d", i);
-
-    msg_vm_t vm = MSG_vm_start(slaves[i],vmName,2);
-    MSG_vm_bind(vm, MSG_process_create_with_arguments(slavename,slave_fun,NULL,slaves[i],2,argv));
-  }
-
-
-  xbt_dynar_t vms = MSG_vms_as_dynar();
-  XBT_INFO("Launched %ld VMs", xbt_dynar_length(vms));
-
-  /* Send a bunch of work to every one */
-  XBT_INFO("Send a first batch of work to every one");
-  work_batch(slaves_count);
-
-  XBT_INFO("Now suspend all VMs, just for fun");
-
-  xbt_dynar_foreach(vms,i,vm) {
-    MSG_vm_suspend(vm);
-  }
-
-  XBT_INFO("Wait a while");
-  MSG_process_sleep(2);
-
-  XBT_INFO("Enough. Let's resume everybody.");
-  xbt_dynar_foreach(vms,i,vm) {
-    MSG_vm_resume(vm);
-  }
-  XBT_INFO("Sleep long enough for everyone to be done with previous batch of work");
-  MSG_process_sleep(1000-MSG_get_clock());
-
-  XBT_INFO("Add one more process per VM");
-  xbt_dynar_foreach(vms,i,vm) {
-    msg_vm_t vm = xbt_dynar_get_as(vms,i,msg_vm_t);
-    char slavename[64];
-    sprintf(slavename,"Slave %ld",i+xbt_dynar_length(vms));
-    char**argv=xbt_new(char*,3);
-    argv[0] = xbt_strdup(slavename);
-    argv[1] = bprintf("%ld",i+xbt_dynar_length(vms));
-    argv[2] = NULL;
-    MSG_vm_bind(vm, MSG_process_create_with_arguments(slavename,slave_fun,NULL,slaves[i],2,argv));
-  }
-
-  XBT_INFO("Reboot all the VMs");
-  xbt_dynar_foreach(vms,i,vm) {
-    MSG_vm_reboot(vm);
-  }
-
-  work_batch(slaves_count*2);
-
-  XBT_INFO("Migrate everyone to the second host.");
-  xbt_dynar_foreach(vms,i,vm) {
-    MSG_vm_migrate(vm,slaves[1]);
-  }
-  XBT_INFO("Suspend everyone, move them to the third host, and resume them.");
-  xbt_dynar_foreach(vms,i,vm) {
-    MSG_vm_suspend(vm);
-    MSG_vm_migrate(vm,slaves[2]);
-    MSG_vm_resume(vm);
-  }
-
-
-  XBT_INFO("Let's shut down the simulation. 10 first processes will be shut down cleanly while the second half will forcefully get killed");
-  for (i = 0; i < slaves_count; i++) {
-    char mailbox_buffer[64];
-    sprintf(mailbox_buffer,"Slave_%d",i);
-    msg_task_t finalize = MSG_task_create("finalize", 0, 0, 0);
-    MSG_task_send(finalize, mailbox_buffer);
-  }
-
-  XBT_INFO("Wait a while before effective shutdown.");
-  MSG_process_sleep(2);
-
-  xbt_dynar_foreach(vms,i,vm) {
-    MSG_vm_shutdown(vm);
-    MSG_vm_destroy(vm);
-  }
-
-  XBT_INFO("Goodbye now!");
-  free(slaves);
-  xbt_dynar_free(&vms);
-  return 0;
-}                               /* end_of_master */
-
-/** Receiver function  */
-int slave_fun(int argc, char *argv[])
-{
-  char mailbox_name[128];
-  msg_task_t task = NULL;
-  _XBT_GNUC_UNUSED int res;
-  /* since the slaves will move around, use slave_%d as mailbox names instead of hostnames */
-  xbt_assert(argc>=2, "slave processes need to be given their rank as parameter");
-  sprintf(mailbox_name,"Slave_%s",argv[1]);
-  XBT_INFO("Slave listenning on %s",argv[1]);
-  while (1) {
-    res = MSG_task_receive(&(task),mailbox_name);
-    xbt_assert(res == MSG_OK, "MSG_task_get failed");
-
-    XBT_INFO("Received \"%s\" from mailbox %s", MSG_task_get_name(task),mailbox_name);
-    if (!strcmp(MSG_task_get_name(task), "finalize")) {
-      MSG_task_destroy(task);
-      break;
-    }
-
-    MSG_task_execute(task);
-    XBT_INFO("\"%s\" done", MSG_task_get_name(task));
-    MSG_task_destroy(task);
-    task = NULL;
-  }
-
-  return 0;
-}                               /* end_of_slave */
-
-/** Main function */
-int main(int argc, char *argv[])
-{
-  msg_error_t res = MSG_OK;
-  xbt_dynar_t hosts_dynar;
-  msg_host_t*hosts= xbt_new(msg_host_t,10);
-  char**hostnames= xbt_new(char*,10);
-  char**masterargv=xbt_new(char*,12);
-  int i;
-
-  /* Get the arguments */
-  MSG_init(&argc, argv);
-  if (argc < 2) {
-    printf("Usage: %s platform_file\n", argv[0]);
-    printf("example: %s msg_platform.xml\n", argv[0]);
-    exit(1);
-  } if (argc>2) {
-    printf("Usage: %s platform_file\n", argv[0]);
-    printf("Other parameters (such as the deployment file) are ignored.");
-  }
-
-  /* load the platform file */
-  MSG_create_environment(argv[1]);
-  /* Retrieve the 10 first hosts of the platform file */
-  hosts_dynar = MSG_hosts_as_dynar();
-  xbt_assert(xbt_dynar_length(hosts_dynar)>10,
-      "I need at least 10 hosts in the platform file, but %s contains only %ld hosts_dynar.",
-      argv[1],xbt_dynar_length(hosts_dynar));
-  for (i=0;i<10;i++) {
-    hosts[i] = xbt_dynar_get_as(hosts_dynar,i,msg_host_t);
-    hostnames[i] = xbt_strdup(MSG_host_get_name(hosts[i]));
-  }
-  masterargv[0]=xbt_strdup("master");
-  for (i=1;i<11;i++) {
-    masterargv[i] = xbt_strdup(MSG_host_get_name(hosts[i-1]));
-  }
-  masterargv[11]=NULL;
-  MSG_process_create_with_arguments("master",master,NULL,hosts[0],11,masterargv);
-  res = MSG_main();
-  XBT_INFO("Simulation time %g", MSG_get_clock());
-
-  free(hosts);
-  for (i=0;i<10;i++) 
-     free(hostnames[i]);
-  free(hostnames);
-  xbt_dynar_free(&hosts_dynar);
-
-  if (res == MSG_OK)
-    return 0;
-  else
-    return 1;
-}                               /* end_of_main */
diff --git a/examples/msg/cloud/masterslave_virtual_machines.tesh b/examples/msg/cloud/masterslave_virtual_machines.tesh
deleted file mode 100644 (file)
index b3dd73a..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-#! ./tesh
-
-p Testing the Cloud API with a simple masterslave
-
-! output sort
-$ $SG_TEST_EXENV ${bindir:=.}/cloud/masterslave_virtual_machines$EXEEXT ${srcdir:=.}/msg_platform.xml --log=root.fmt:"[%12.6r]%e(%i:%P@%h)%e%m%n"
-> [    0.000000] (10:Slave 8@Jean_Yves) Slave listenning on 8
-> [    0.000000] (11:Slave 9@Fafard) Slave listenning on 9
-> [    0.000000] (1:master@Jacquelin) Launched 10 VMs
-> [    0.000000] (1:master@Jacquelin) Send a first batch of work to every one
-> [    0.000000] (1:master@Jacquelin) Sending "Task_0" to "Slave_0"
-> [    0.000000] (2:Slave 0@Jacquelin) Slave listenning on 0
-> [    0.000000] (3:Slave 1@Intel) Slave listenning on 1
-> [    0.000000] (4:Slave 2@Provost) Slave listenning on 2
-> [    0.000000] (5:Slave 3@Fernand) Slave listenning on 3
-> [    0.000000] (6:Slave 4@Bescherelle) Slave listenning on 4
-> [    0.000000] (7:Slave 5@Ethernet) Slave listenning on 5
-> [    0.000000] (8:Slave 6@Kuenning) Slave listenning on 6
-> [    0.000000] (9:Slave 7@Dodge) Slave listenning on 7
-> [    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
-> [   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
-> [ 1000.000000] (15:Slave 13@Fernand) Slave listenning on 13
-> [ 1000.000000] (16:Slave 14@Bescherelle) Slave listenning on 14
-> [ 1000.000000] (17:Slave 15@Ethernet) Slave listenning on 15
-> [ 1000.000000] (18:Slave 16@Kuenning) Slave listenning on 16
-> [ 1000.000000] (19:Slave 17@Dodge) Slave listenning on 17
-> [ 1000.000000] (1:master@Jacquelin) Add one more process per VM
-> [ 1000.000000] (1:master@Jacquelin) Reboot all the VMs
-> [ 1000.000000] (1:master@Jacquelin) Sending "Task_0" to "Slave_0"
-> [ 1000.000000] (20:Slave 18@Jean_Yves) Slave listenning on 18
-> [ 1000.000000] (21:Slave 19@Fafard) Slave listenning on 19
-> [ 1000.000000] (22:Slave 0@Jacquelin) Slave listenning on 0
-> [ 1000.000000] (23:Slave 10@Jacquelin) Slave listenning on 10
-> [ 1000.000000] (24:Slave 1@Intel) Slave listenning on 1
-> [ 1000.000000] (25:Slave 11@Intel) Slave listenning on 11
-> [ 1000.000000] (26:Slave 2@Provost) Slave listenning on 2
-> [ 1000.000000] (27:Slave 12@Provost) Slave listenning on 12
-> [ 1000.000000] (28:Slave 3@Fernand) Slave listenning on 3
-> [ 1000.000000] (29:Slave 13@Fernand) Slave listenning on 13
-> [ 1000.000000] (30:Slave 4@Bescherelle) Slave listenning on 4
-> [ 1000.000000] (31:Slave 14@Bescherelle) Slave listenning on 14
-> [ 1000.000000] (32:Slave 5@Ethernet) Slave listenning on 5
-> [ 1000.000000] (33:Slave 15@Ethernet) Slave listenning on 15
-> [ 1000.000000] (34:Slave 6@Kuenning) Slave listenning on 6
-> [ 1000.000000] (35:Slave 16@Kuenning) Slave listenning on 16
-> [ 1000.000000] (36:Slave 7@Dodge) Slave listenning on 7
-> [ 1000.000000] (37:Slave 17@Dodge) Slave listenning on 17
-> [ 1000.000000] (38:Slave 8@Jean_Yves) Slave listenning on 8
-> [ 1000.000000] (39:Slave 18@Jean_Yves) Slave listenning on 18
-> [ 1000.000000] (40:Slave 9@Fafard) Slave listenning on 9
-> [ 1000.000000] (41:Slave 19@Fafard) Slave listenning on 19
-> [ 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
-> [ 1023.866678] (1:master@Jacquelin) Sending "Task_2" to "Slave_2"
-> [ 1023.866678] (24:Slave 1@Intel) Received "Task_1" from mailbox Slave_1
-> [ 1023.939494] (24:Slave 1@Intel) "Task_1" done
-> [ 1048.674036] (1:master@Jacquelin) Sending "Task_3" to "Slave_3"
-> [ 1048.674036] (26:Slave 2@Provost) Received "Task_2" from mailbox Slave_2
-> [ 1048.746852] (26:Slave 2@Provost) "Task_2" done
-> [ 1056.325710] (1:master@Jacquelin) Sending "Task_4" to "Slave_4"
-> [ 1056.325710] (28:Slave 3@Fernand) Received "Task_3" from mailbox Slave_3
-> [ 1056.777157] (28:Slave 3@Fernand) "Task_3" done
-> [ 1064.574878] (1:master@Jacquelin) Sending "Task_5" to "Slave_5"
-> [ 1064.574878] (30:Slave 4@Bescherelle) Received "Task_4" from mailbox Slave_4
-> [ 1064.647694] (30:Slave 4@Bescherelle) "Task_4" done
-> [ 1073.010762] (1:master@Jacquelin) Sending "Task_6" to "Slave_6"
-> [ 1073.010762] (32:Slave 5@Ethernet) Received "Task_5" from mailbox Slave_5
-> [ 1073.112704] (32:Slave 5@Ethernet) "Task_5" done
-> [ 1081.730603] (1:master@Jacquelin) Sending "Task_7" to "Slave_7"
-> [ 1081.730603] (34:Slave 6@Kuenning) Received "Task_6" from mailbox Slave_6
-> [ 1081.847108] (34:Slave 6@Kuenning) "Task_6" done
-> [ 1126.150095] (1:master@Jacquelin) Sending "Task_8" to "Slave_8"
-> [ 1126.150095] (36:Slave 7@Dodge) Received "Task_7" from mailbox Slave_7
-> [ 1126.237474] (36:Slave 7@Dodge) "Task_7" done
-> [ 1169.839597] (1:master@Jacquelin) Sending "Task_9" to "Slave_9"
-> [ 1169.839597] (38:Slave 8@Jean_Yves) Received "Task_8" from mailbox Slave_8
-> [ 1169.941539] (38:Slave 8@Jean_Yves) "Task_8" done
-> [ 1176.014409] (1:master@Jacquelin) Sending "Task_10" to "Slave_10"
-> [ 1176.014409] (40:Slave 9@Fafard) Received "Task_9" from mailbox Slave_9
-> [ 1176.034684] (1:master@Jacquelin) Sending "Task_11" to "Slave_11"
-> [ 1176.034684] (23:Slave 10@Jacquelin) Received "Task_10" from mailbox Slave_10
-> [ 1176.087225] (40:Slave 9@Fafard) "Task_9" done
-> [ 1176.107500] (23:Slave 10@Jacquelin) "Task_10" done
-> [ 1199.881087] (1:master@Jacquelin) Sending "Task_12" to "Slave_12"
-> [ 1199.881087] (25:Slave 11@Intel) Received "Task_11" from mailbox Slave_11
-> [ 1199.953902] (25:Slave 11@Intel) "Task_11" done
-> [ 1224.688445] (1:master@Jacquelin) Sending "Task_13" to "Slave_13"
-> [ 1224.688445] (27:Slave 12@Provost) Received "Task_12" from mailbox Slave_12
-> [ 1224.761260] (27:Slave 12@Provost) "Task_12" done
-> [ 1232.340119] (1:master@Jacquelin) Sending "Task_14" to "Slave_14"
-> [ 1232.340119] (29:Slave 13@Fernand) Received "Task_13" from mailbox Slave_13
-> [ 1232.791566] (29:Slave 13@Fernand) "Task_13" done
-> [ 1240.589287] (1:master@Jacquelin) Sending "Task_15" to "Slave_15"
-> [ 1240.589287] (31:Slave 14@Bescherelle) Received "Task_14" from mailbox Slave_14
-> [ 1240.662103] (31:Slave 14@Bescherelle) "Task_14" done
-> [ 1249.025171] (1:master@Jacquelin) Sending "Task_16" to "Slave_16"
-> [ 1249.025171] (33:Slave 15@Ethernet) Received "Task_15" from mailbox Slave_15
-> [ 1249.127113] (33:Slave 15@Ethernet) "Task_15" done
-> [ 1257.745012] (1:master@Jacquelin) Sending "Task_17" to "Slave_17"
-> [ 1257.745012] (35:Slave 16@Kuenning) Received "Task_16" from mailbox Slave_16
-> [ 1257.861517] (35:Slave 16@Kuenning) "Task_16" done
-> [ 1302.164504] (1:master@Jacquelin) Sending "Task_18" to "Slave_18"
-> [ 1302.164504] (37:Slave 17@Dodge) Received "Task_17" from mailbox Slave_17
-> [ 1302.251883] (37:Slave 17@Dodge) "Task_17" done
-> [ 1345.854006] (1:master@Jacquelin) Sending "Task_19" to "Slave_19"
-> [ 1345.854006] (39:Slave 18@Jean_Yves) Received "Task_18" from mailbox Slave_18
-> [ 1345.955948] (39: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] (41:Slave 19@Fafard) Received "Task_19" from mailbox Slave_19
-> [ 1352.029013] (22:Slave 0@Provost) Received "finalize" from mailbox Slave_0
-> [ 1352.101633] (41:Slave 19@Provost) "Task_19" done
-> [ 1352.947711] (24:Slave 1@Provost) Received "finalize" from mailbox Slave_1
-> [ 1354.827365] (26:Slave 2@Provost) Received "finalize" from mailbox Slave_2
-> [ 1356.653021] (28:Slave 3@Provost) Received "finalize" from mailbox Slave_3
-> [ 1357.515808] (30:Slave 4@Provost) Received "finalize" from mailbox Slave_4
-> [ 1358.576004] (32:Slave 5@Provost) Received "finalize" from mailbox Slave_5
-> [ 1359.433313] (34:Slave 6@Provost) Received "finalize" from mailbox Slave_6
-> [ 1360.833461] (36:Slave 7@Provost) Received "finalize" from mailbox Slave_7
-> [ 1361.758549] (38:Slave 8@Provost) Received "finalize" from mailbox Slave_8
-> [ 1363.743206] (1:master@Jacquelin) Wait a while before effective shutdown.
-> [ 1363.743206] (40:Slave 9@Provost) Received "finalize" from mailbox Slave_9
-> [ 1365.743206] (0:@) Simulation time 1365.74
-> [ 1365.743206] (1:master@Jacquelin) Goodbye now!
diff --git a/examples/msg/cloud/masterslave_virtual_machines.xml b/examples/msg/cloud/masterslave_virtual_machines.xml
deleted file mode 100644 (file)
index 83bcdda..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="master">
-     <argument value="20"/>       <!-- Number of tasks -->
-     <argument value="50000000"/>  <!-- Computation size of tasks -->
-     <argument value="1000000"/>   <!-- Communication size of tasks -->
-     <argument value="Jupiter"/>  <!-- First slave -->
-     <argument value="Fafard"/>   <!-- Second slave -->
-     <argument value="Ginette"/>  <!-- Third slave -->
-     <argument value="Bourassa"/> <!-- Last slave -->
-  </process>
-  <!-- The slave process (with no argument) -->
-  <process host="Tremblay" function="slave"/>
-  <process host="Jupiter" function="slave"/>
-  <process host="Fafard" function="slave"/>
-  <process host="Ginette" function="slave"/>
-  <process host="Bourassa" function="slave"/>
-</platform>
diff --git a/examples/msg/cloud/migrate_vm.c b/examples/msg/cloud/migrate_vm.c
new file mode 100644 (file)
index 0000000..7d263c7
--- /dev/null
@@ -0,0 +1,164 @@
+/* Copyright (c) 2007-2014. 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 "msg/msg.h"
+#include "xbt/sysdep.h"         /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+                             "Messages specific for this msg example");
+
+
+static void vm_migrate(msg_vm_t vm, msg_host_t dst_pm)
+{
+  msg_host_t src_pm = MSG_vm_get_pm(vm);
+  double mig_sta = MSG_get_clock();
+  MSG_vm_migrate(vm, dst_pm);
+  double mig_end = MSG_get_clock();
+
+  XBT_INFO("%s migrated: %s->%s in %g s", MSG_vm_get_name(vm),
+                 MSG_host_get_name(src_pm), MSG_host_get_name(dst_pm),
+                 mig_end - mig_sta);
+}
+
+static int migration_worker_main(int argc, char *argv[])
+{
+  xbt_assert(argc == 3);
+  char *vm_name = argv[1];
+  char *dst_pm_name = argv[2];
+
+  msg_vm_t vm = MSG_get_host_by_name(vm_name);
+  msg_host_t dst_pm = MSG_get_host_by_name(dst_pm_name);
+
+  vm_migrate(vm, dst_pm);
+
+  return 0;
+}
+
+static void vm_migrate_async(msg_vm_t vm, msg_host_t dst_pm)
+{
+  const char *vm_name = MSG_vm_get_name(vm);
+  const char *dst_pm_name = MSG_host_get_name(dst_pm);
+  msg_host_t host = MSG_host_self();
+
+  const char *pr_name = "mig_wrk";
+  char **argv = xbt_new(char *, 4);
+  argv[0] = xbt_strdup(pr_name);
+  argv[1] = xbt_strdup(vm_name);
+  argv[2] = xbt_strdup(dst_pm_name);
+  argv[3] = NULL;
+
+  MSG_process_create_with_arguments(pr_name, migration_worker_main, NULL, host, 3, argv);
+}
+
+static int master_main(int argc, char *argv[])
+{
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+  msg_host_t pm1 = xbt_dynar_get_as(hosts_dynar, 1, msg_host_t);
+  msg_host_t pm2 = xbt_dynar_get_as(hosts_dynar, 2, msg_host_t);
+  msg_vm_t vm0, vm1;
+  s_ws_params_t params;
+  memset(&params, 0, sizeof(params));
+
+
+
+  vm0 = MSG_vm_create_core(pm0, "VM0");
+  params.ramsize = 1L * 1000 * 1000 * 1000; // 1Gbytes
+  MSG_host_set_params(vm0, &params);
+  MSG_vm_start(vm0);
+
+  XBT_INFO("Test: Migrate a VM with %llu Mbytes RAM", params.ramsize / 1000 / 1000);
+  vm_migrate(vm0, pm1);
+
+  MSG_vm_destroy(vm0);
+
+
+
+  vm0 = MSG_vm_create_core(pm0, "VM0");
+  params.ramsize = 1L * 1000 * 1000 * 100; // 100Mbytes
+  MSG_host_set_params(vm0, &params);
+  MSG_vm_start(vm0);
+
+  XBT_INFO("Test: Migrate a VM with %llu Mbytes RAM", params.ramsize / 1000 / 1000);
+  vm_migrate(vm0, pm1);
+
+  MSG_vm_destroy(vm0);
+
+
+
+  vm0 = MSG_vm_create_core(pm0, "VM0");
+  vm1 = MSG_vm_create_core(pm0, "VM1");
+
+  params.ramsize = 1L * 1000 * 1000 * 1000; // 1Gbytes
+  MSG_host_set_params(vm0, &params);
+  MSG_host_set_params(vm1, &params);
+  MSG_vm_start(vm0);
+  MSG_vm_start(vm1);
+
+  XBT_INFO("Test: Migrate two VMs at once from PM0 to PM1");
+  vm_migrate_async(vm0, pm1);
+  vm_migrate_async(vm1, pm1);
+  MSG_process_sleep(10000);
+
+  MSG_vm_destroy(vm0);
+  MSG_vm_destroy(vm1);
+
+
+
+  vm0 = MSG_vm_create_core(pm0, "VM0");
+  vm1 = MSG_vm_create_core(pm0, "VM1");
+
+  params.ramsize = 1L * 1000 * 1000 * 1000; // 1Gbytes
+  MSG_host_set_params(vm0, &params);
+  MSG_host_set_params(vm1, &params);
+  MSG_vm_start(vm0);
+  MSG_vm_start(vm1);
+
+  XBT_INFO("Test: Migrate two VMs at once to different PMs");
+  vm_migrate_async(vm0, pm1);
+  vm_migrate_async(vm1, pm2);
+  MSG_process_sleep(10000);
+
+  MSG_vm_destroy(vm0);
+  MSG_vm_destroy(vm1);
+
+
+  return 0;
+}
+
+static void launch_master(msg_host_t host)
+{
+  const char *pr_name = "master_";
+  char **argv = xbt_new(char *, 2);
+  argv[0] = xbt_strdup(pr_name);
+  argv[1] = NULL;
+
+  MSG_process_create_with_arguments(pr_name, master_main, NULL, host, 1, argv);
+}
+
+
+int main(int argc, char *argv[])
+{
+  /* Get the arguments */
+  MSG_init(&argc, argv);
+
+  /* load the platform file */
+  MSG_create_environment(argv[1]);
+
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+  launch_master(pm0);
+
+  int res = MSG_main();
+  XBT_INFO("Bye (simulation time %g)", MSG_get_clock());
+
+
+  return !(res == MSG_OK);
+}
diff --git a/examples/msg/cloud/multicore.c b/examples/msg/cloud/multicore.c
new file mode 100644 (file)
index 0000000..64a00c3
--- /dev/null
@@ -0,0 +1,389 @@
+/* Copyright (c) 2007-2014. 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 "msg/msg.h"
+#include "xbt/sysdep.h"         /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
+
+
+
+
+
+static int worker_main(int argc, char *argv[])
+{
+  msg_task_t task = MSG_process_get_data(MSG_process_self());
+  MSG_task_execute(task);
+
+  XBT_INFO("task %p bye", task);
+
+  return 0;
+}
+
+
+struct task_data {
+       msg_task_t task;
+       double prev_computation_amount;
+       double prev_clock;
+};
+
+
+static void task_data_init_clock(struct task_data *t)
+{
+  t->prev_computation_amount = MSG_task_get_remaining_computation(t->task);
+  t->prev_clock = MSG_get_clock();
+}
+
+
+static void task_data_get_clock(struct task_data *t)
+{
+  double now_computation_amount = MSG_task_get_remaining_computation(t->task);
+  double now_clock = MSG_get_clock();
+
+  double done = t->prev_computation_amount - now_computation_amount;
+  double duration = now_clock - t->prev_clock;
+
+  XBT_INFO("%s: %f fops/s", MSG_task_get_name(t->task), done / duration);
+
+  t->prev_computation_amount = now_computation_amount;
+  t->prev_clock = now_clock;
+}
+
+
+static void test_pm_pin(void)
+{
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+  msg_host_t pm1 = xbt_dynar_get_as(hosts_dynar, 1, msg_host_t);
+  msg_host_t pm2 = xbt_dynar_get_as(hosts_dynar, 2, msg_host_t);
+
+
+  struct task_data t1;
+  struct task_data t2;
+  struct task_data t3;
+  struct task_data t4;
+
+  t1.task = MSG_task_create("Task1", 1e16, 0, NULL);
+  t2.task = MSG_task_create("Task2", 1e16, 0, NULL);
+  t3.task = MSG_task_create("Task3", 1e16, 0, NULL);
+  t4.task = MSG_task_create("Task4", 1e16, 0, NULL);
+
+  MSG_process_create("worker1", worker_main, t1.task, pm1);
+  MSG_process_create("worker2", worker_main, t2.task, pm1);
+  MSG_process_create("worker3", worker_main, t3.task, pm1);
+  MSG_process_create("worker4", worker_main, t4.task, pm1);
+
+
+  XBT_INFO("## 1. start 4 tasks on PM1 (2 cores)");
+  task_data_init_clock(&t1);
+  task_data_init_clock(&t2);
+  task_data_init_clock(&t3);
+  task_data_init_clock(&t4);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+  task_data_get_clock(&t4);
+
+
+  XBT_INFO("## 2. pin all tasks to CPU0");
+  MSG_task_set_affinity(t1.task, pm1, 0x01);
+  MSG_task_set_affinity(t2.task, pm1, 0x01);
+  MSG_task_set_affinity(t3.task, pm1, 0x01);
+  MSG_task_set_affinity(t4.task, pm1, 0x01);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+  task_data_get_clock(&t4);
+
+
+  XBT_INFO("## 3. clear the affinity of task4");
+  MSG_task_set_affinity(t4.task, pm1, 0);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+  task_data_get_clock(&t4);
+
+
+  XBT_INFO("## 4. clear the affinity of task3");
+  MSG_task_set_affinity(t3.task, pm1, 0);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+  task_data_get_clock(&t4);
+
+
+  XBT_INFO("## 5. clear the affinity of task2");
+  MSG_task_set_affinity(t2.task, pm1, 0);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+  task_data_get_clock(&t4);
+
+
+  XBT_INFO("## 6. pin all tasks to CPU0 of another PM (no effect now)");
+  MSG_task_set_affinity(t1.task, pm0, 0);
+  MSG_task_set_affinity(t2.task, pm0, 0);
+  MSG_task_set_affinity(t3.task, pm2, 0);
+  MSG_task_set_affinity(t4.task, pm2, 0);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+  task_data_get_clock(&t4);
+
+
+
+  MSG_task_cancel(t1.task);
+  MSG_task_cancel(t2.task);
+  MSG_task_cancel(t3.task);
+  MSG_task_cancel(t4.task);
+  MSG_process_sleep(10);
+  MSG_task_destroy(t1.task);
+  MSG_task_destroy(t2.task);
+  MSG_task_destroy(t3.task);
+  MSG_task_destroy(t4.task);
+}
+
+
+static void test_vm_pin(void)
+{
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t); // 1 cores
+  msg_host_t pm1 = xbt_dynar_get_as(hosts_dynar, 1, msg_host_t); // 2 cores
+  msg_host_t pm2 = xbt_dynar_get_as(hosts_dynar, 2, msg_host_t); // 4 cores
+
+
+  /* set up VMs on PM2 (4 cores) */
+  msg_vm_t vm0 = MSG_vm_create_core(pm2, "VM0");
+  msg_vm_t vm1 = MSG_vm_create_core(pm2, "VM1");
+  msg_vm_t vm2 = MSG_vm_create_core(pm2, "VM2");
+  msg_vm_t vm3 = MSG_vm_create_core(pm2, "VM3");
+
+  s_ws_params_t params;
+  memset(&params, 0, sizeof(params));
+  params.ramsize = 1L * 1024 * 1024;
+  params.skip_stage1 = 1;
+  params.skip_stage2 = 1;
+  //params.mig_speed = 1L * 1024 * 1024;
+  MSG_host_set_params(vm0, &params);
+  MSG_host_set_params(vm1, &params);
+  MSG_host_set_params(vm2, &params);
+  MSG_host_set_params(vm3, &params);
+
+  MSG_vm_start(vm0);
+  MSG_vm_start(vm1);
+  MSG_vm_start(vm2);
+  MSG_vm_start(vm3);
+
+
+  /* set up tasks and processes */
+  struct task_data t0;
+  struct task_data t1;
+  struct task_data t2;
+  struct task_data t3;
+
+  t0.task = MSG_task_create("Task0", 1e16, 0, NULL);
+  t1.task = MSG_task_create("Task1", 1e16, 0, NULL);
+  t2.task = MSG_task_create("Task2", 1e16, 0, NULL);
+  t3.task = MSG_task_create("Task3", 1e16, 0, NULL);
+
+  MSG_process_create("worker0", worker_main, t0.task, vm0);
+  MSG_process_create("worker1", worker_main, t1.task, vm1);
+  MSG_process_create("worker2", worker_main, t2.task, vm2);
+  MSG_process_create("worker3", worker_main, t3.task, vm3);
+
+
+  /* start experiments */
+  XBT_INFO("## 1. start 4 VMs on PM2 (4 cores)");
+  task_data_init_clock(&t0);
+  task_data_init_clock(&t1);
+  task_data_init_clock(&t2);
+  task_data_init_clock(&t3);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t0);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+
+
+  XBT_INFO("## 2. pin all VMs to CPU0 of PM2");
+  MSG_vm_set_affinity(vm0, pm2, 0x01);
+  MSG_vm_set_affinity(vm1, pm2, 0x01);
+  MSG_vm_set_affinity(vm2, pm2, 0x01);
+  MSG_vm_set_affinity(vm3, pm2, 0x01);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t0);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+
+
+  XBT_INFO("## 3. pin all VMs to CPU0 of PM1 (no effect at now)");
+  /* Because VMs are on PM2, the below operations do not effect computation now. */
+  MSG_vm_set_affinity(vm0, pm1, 0x01);
+  MSG_vm_set_affinity(vm1, pm1, 0x01);
+  MSG_vm_set_affinity(vm2, pm1, 0x01);
+  MSG_vm_set_affinity(vm3, pm1, 0x01);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t0);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+
+
+  XBT_INFO("## 4. unpin VM0, and pin VM2 and VM3 to CPU1 of PM2");
+  MSG_vm_set_affinity(vm0, pm2, 0x00);
+  MSG_vm_set_affinity(vm2, pm2, 0x02);
+  MSG_vm_set_affinity(vm3, pm2, 0x02);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t0);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+
+
+  XBT_INFO("## 5. migrate all VMs to PM0 (only 1 CPU core)");
+  MSG_vm_migrate(vm0, pm0);
+  MSG_vm_migrate(vm1, pm0);
+  MSG_vm_migrate(vm2, pm0);
+  MSG_vm_migrate(vm3, pm0);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t0);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t0);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+
+
+  XBT_INFO("## 6. migrate all VMs to PM1 (2 CPU cores, with affinity settings)");
+  MSG_vm_migrate(vm0, pm1);
+  MSG_vm_migrate(vm1, pm1);
+  MSG_vm_migrate(vm2, pm1);
+  MSG_vm_migrate(vm3, pm1);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t0);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t0);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+
+
+  XBT_INFO("## 7. clear affinity settings on PM1");
+  MSG_vm_set_affinity(vm0, pm1, 0);
+  MSG_vm_set_affinity(vm1, pm1, 0);
+  MSG_vm_set_affinity(vm2, pm1, 0);
+  MSG_vm_set_affinity(vm3, pm1, 0);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t0);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+
+  MSG_process_sleep(10);
+  task_data_get_clock(&t0);
+  task_data_get_clock(&t1);
+  task_data_get_clock(&t2);
+  task_data_get_clock(&t3);
+
+
+  /* clean up everything */
+  MSG_task_cancel(t0.task);
+  MSG_task_cancel(t1.task);
+  MSG_task_cancel(t2.task);
+  MSG_task_cancel(t3.task);
+  MSG_process_sleep(10);
+  MSG_task_destroy(t0.task);
+  MSG_task_destroy(t1.task);
+  MSG_task_destroy(t2.task);
+  MSG_task_destroy(t3.task);
+
+  MSG_vm_destroy(vm0);
+  MSG_vm_destroy(vm1);
+  MSG_vm_destroy(vm2);
+  MSG_vm_destroy(vm3);
+}
+
+
+static int master_main(int argc, char *argv[])
+{
+  XBT_INFO("=== Test PM (set affinity) ===");
+  test_pm_pin();
+
+  XBT_INFO("=== Test VM (set affinity) ===");
+  test_vm_pin();
+
+  return 0;
+}
+
+
+int main(int argc, char *argv[])
+{
+  /* Get the arguments */
+  MSG_init(&argc, argv);
+
+  /* load the platform file */
+  if (argc != 2) {
+    printf("Usage: %s examples/msg/cloud/multicore_plat.xml\n", argv[0]);
+    return 1;
+  }
+
+  MSG_create_environment(argv[1]);
+
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+  msg_host_t pm1 = xbt_dynar_get_as(hosts_dynar, 1, msg_host_t);
+  msg_host_t pm2 = xbt_dynar_get_as(hosts_dynar, 2, msg_host_t);
+
+
+  XBT_INFO("%s: %d core(s), %f flops/s per each", MSG_host_get_name(pm0), MSG_host_get_core_number(pm0), MSG_get_host_speed(pm0));
+  XBT_INFO("%s: %d core(s), %f flops/s per each", MSG_host_get_name(pm1), MSG_host_get_core_number(pm1), MSG_get_host_speed(pm1));
+  XBT_INFO("%s: %d core(s), %f flops/s per each", MSG_host_get_name(pm2), MSG_host_get_core_number(pm2), MSG_get_host_speed(pm2));
+
+
+
+  MSG_process_create("master", master_main, NULL, pm0);
+
+
+
+
+  int res = MSG_main();
+  XBT_INFO("Bye (simulation time %g)", MSG_get_clock());
+
+
+  return !(res == MSG_OK);
+}
diff --git a/examples/msg/cloud/multicore_plat.xml b/examples/msg/cloud/multicore_plat.xml
new file mode 100644 (file)
index 0000000..3a1b616
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+       <AS id="siteA" routing="Full">
+               <host id="PM0" power="1E8" core="1"/>
+               <host id="PM1" power="1E8" core="2"/>
+               <host id="PM2" power="1E8" core="4"/>
+
+               <!-- <link id="link1" bandwidth="1E6" latency="1E-2" /> -->
+               <link id="link1" bandwidth="12500000" latency="1E-2" />
+
+               <route src="PM0" dst="PM1">
+                       <link_ctn id="link1"/>
+               </route>
+
+               <route src="PM0" dst="PM2">
+                       <link_ctn id="link1"/>
+               </route>
+
+               <route src="PM1" dst="PM2">
+                       <link_ctn id="link1"/>
+               </route>
+       </AS>
+</platform>
diff --git a/examples/msg/cloud/scale.c b/examples/msg/cloud/scale.c
new file mode 100644 (file)
index 0000000..54a0bfe
--- /dev/null
@@ -0,0 +1,217 @@
+/* Copyright (c) 2007-2014. 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 <sys/time.h>
+#include "msg/msg.h"
+#include "xbt/sysdep.h"         /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+                             "Messages specific for this msg example");
+
+/*
+ * Usage:
+ * ./examples/msg/cloud/scale ../examples/platforms/g5k.xml
+ *
+ * 1. valgrind --tool=callgrind ./examples/msg/cloud/scale ../examples/platforms/g5k.xml
+ * 2. kcachegrind
+ **/
+
+static double time_precise(void)
+{
+       struct timeval tv;
+       int ret = gettimeofday(&tv, NULL);
+  if (ret < 0)
+    xbt_die("gettimeofday");
+
+       double now = (double) tv.tv_sec + tv.tv_usec * 0.001 * 0.001;
+
+       return now;
+}
+
+static int computation_fun(int argc, char *argv[])
+{
+  for (;;) {
+    // double clock_sta = time_precise();
+
+    msg_task_t task = MSG_task_create("Task", 10000000, 0, NULL);
+    MSG_task_execute(task);
+    MSG_task_destroy(task);
+
+    // double clock_end = time_precise();
+
+    // XBT_INFO("%f", clock_end - clock_sta);
+  }
+
+
+  return 0;
+}
+
+static void launch_computation_worker(msg_host_t host)
+{
+  MSG_process_create("compute", computation_fun, NULL, host);
+}
+
+#if 0
+struct task_priv {
+  msg_host_t tx_host;
+  msg_process_t tx_proc;
+  double clock_sta;
+};
+
+static int communication_tx_fun(int argc, char *argv[])
+{
+  xbt_assert(argc == 2);
+  const char *mbox = argv[1];
+
+  msg_task_t task = MSG_task_create("Task", 1000000, 1000000, NULL);
+
+  struct task_priv *priv = xbt_new(struct task_priv, 1);
+  priv->tx_proc = MSG_process_self();
+  priv->tx_host = MSG_host_self();
+  priv->clock_sta = MSG_get_clock();
+
+  MSG_task_set_data(task, priv);
+
+  MSG_task_send(task, mbox);
+
+  return 0;
+}
+
+static int communication_rx_fun(int argc, char *argv[])
+{
+  const char *pr_name = MSG_process_get_name(MSG_process_self());
+  const char *host_name = MSG_host_get_name(MSG_host_self());
+  xbt_assert(argc == 2);
+  const char *mbox = argv[1];
+
+  msg_task_t task = NULL;
+  MSG_task_recv(&task, mbox);
+
+  struct task_priv *priv = MSG_task_get_data(task);
+  double clock_end = MSG_get_clock();
+
+  XBT_INFO("%s:%s to %s:%s => %g sec",
+      MSG_host_get_name(priv->tx_host),
+      MSG_process_get_name(priv->tx_proc),
+      host_name, pr_name, clock_end - priv->clock_sta);
+
+  MSG_task_destroy(task);
+
+  return 0;
+}
+
+static void launch_communication_worker(msg_host_t tx_host, msg_host_t rx_host)
+{
+  char *mbox = bprintf("MBOX:%s-%s",
+      MSG_host_get_name(tx_host),
+      MSG_host_get_name(rx_host));
+  char **argv = NULL;
+  
+  const char *pr_name_tx =  "comm_tx";
+  argv = xbt_new(char *, 3);
+  argv[0] = xbt_strdup(pr_name_tx);
+  argv[1] = xbt_strdup(mbox);
+  argv[2] = NULL;
+
+  MSG_process_create_with_arguments(pr_name_tx, communication_tx_fun, NULL, tx_host, 2, argv);
+
+  const char *pr_name_rx =  "comm_rx";  
+  argv = xbt_new(char *, 3);
+  argv[0] = xbt_strdup(pr_name_rx);
+  argv[1] = xbt_strdup(mbox);
+  argv[2] = NULL;
+
+  MSG_process_create_with_arguments(pr_name_rx, communication_rx_fun, NULL, rx_host, 2, argv);
+
+  xbt_free(mbox);
+}
+#endif
+
+
+
+
+
+
+static int master_main(int argc, char *argv[])
+{
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+
+  int npm = 10;
+  int nvm = 1000;
+
+  msg_host_t *pm = xbt_new(msg_host_t, npm);
+  msg_vm_t   *vm = xbt_new(msg_vm_t, nvm);
+
+  int i = 0;
+  for (i = 0; i < npm; i++) {
+         pm[i] = xbt_dynar_get_as(hosts_dynar, i, msg_host_t);
+  }
+
+  for (i = 0; i < nvm; i++) {
+         int pm_index = i % npm;
+         char *vm_name = bprintf("vm%d", i);
+         vm[i] = MSG_vm_create_core(pm[pm_index], vm_name);
+         MSG_vm_start(vm[i]);
+
+    launch_computation_worker(vm[i]);
+
+         xbt_free(vm_name);
+  }
+
+
+  XBT_INFO("## Test (start)");
+
+  for (i = 0; i < 10; i++) {
+         double clock_sta = time_precise();
+         MSG_process_sleep(1);
+         double clock_end = time_precise();
+         XBT_INFO("duration %f", clock_end - clock_sta);
+  }
+
+
+  for (i = 0; i < nvm; i++) {
+         MSG_vm_destroy(vm[i]);
+  }
+
+  XBT_INFO("## Test (ended)");
+  
+  return 0;
+}
+
+static void launch_master(msg_host_t host)
+{
+  const char *pr_name = "master_";
+  char **argv = xbt_new(char *, 2);
+  argv[0] = xbt_strdup(pr_name);
+  argv[1] = NULL;
+
+  MSG_process_create_with_arguments(pr_name, master_main, NULL, host, 1, argv);
+}
+
+
+int main(int argc, char *argv[])
+{
+  /* Get the arguments */
+  MSG_init(&argc, argv);
+
+  /* load the platform file */
+  xbt_assert(argc == 2);
+  MSG_create_environment(argv[1]);
+
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+  launch_master(pm0);
+
+  int res = MSG_main();
+  XBT_INFO("Bye (simulation time %g)", MSG_get_clock());
+
+
+  return !(res == MSG_OK);
+}
diff --git a/examples/msg/cloud/simple_plat.xml b/examples/msg/cloud/simple_plat.xml
new file mode 100644 (file)
index 0000000..9bc4478
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+       <AS id="siteA" routing="Full">
+               <host id="PM0" power="1E8"/>
+               <host id="PM1" power="1E8"/>
+               <host id="PM2" power="1E8"/>
+
+               <!-- <link id="link1" bandwidth="1E6" latency="1E-2" /> -->
+               <link id="link1" bandwidth="12500000" latency="1E-2" />
+
+               <route src="PM0" dst="PM1">
+                       <link_ctn id="link1"/>
+               </route>
+
+               <route src="PM0" dst="PM2">
+                       <link_ctn id="link1"/>
+               </route>
+
+               <route src="PM1" dst="PM2">
+                       <link_ctn id="link1"/>
+               </route>
+       </AS>
+</platform>
diff --git a/examples/msg/cloud/simple_vm.c b/examples/msg/cloud/simple_vm.c
new file mode 100644 (file)
index 0000000..624bdc4
--- /dev/null
@@ -0,0 +1,306 @@
+/* Copyright (c) 2007-2014. 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 "msg/msg.h"
+#include "xbt/sysdep.h"         /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+                             "Messages specific for this msg example");
+
+
+static int computation_fun(int argc, char *argv[])
+{
+  const char *pr_name = MSG_process_get_name(MSG_process_self());
+  const char *host_name = MSG_host_get_name(MSG_host_self());
+
+  msg_task_t task = MSG_task_create("Task", 1000000, 1000000, NULL);
+
+  double clock_sta = MSG_get_clock();
+  MSG_task_execute(task);
+  double clock_end = MSG_get_clock();
+
+  XBT_INFO("%s:%s task executed %g", host_name, pr_name, clock_end - clock_sta);
+
+  MSG_task_destroy(task);
+
+  return 0;
+}
+
+static void launch_computation_worker(msg_host_t host)
+{
+  const char *pr_name = "compute";
+  char **argv = xbt_new(char *, 2);
+  argv[0] = xbt_strdup(pr_name);
+  argv[1] = NULL;
+
+  MSG_process_create_with_arguments(pr_name, computation_fun, NULL, host, 1, argv);
+}
+
+struct task_priv {
+  msg_host_t tx_host;
+  msg_process_t tx_proc;
+  double clock_sta;
+};
+
+static int communication_tx_fun(int argc, char *argv[])
+{
+  xbt_assert(argc == 2);
+  const char *mbox = argv[1];
+
+  msg_task_t task = MSG_task_create("Task", 1000000, 1000000, NULL);
+
+  struct task_priv *priv = xbt_new(struct task_priv, 1);
+  priv->tx_proc = MSG_process_self();
+  priv->tx_host = MSG_host_self();
+  priv->clock_sta = MSG_get_clock();
+
+  MSG_task_set_data(task, priv);
+
+  MSG_task_send(task, mbox);
+
+  return 0;
+}
+
+static int communication_rx_fun(int argc, char *argv[])
+{
+  const char *pr_name = MSG_process_get_name(MSG_process_self());
+  const char *host_name = MSG_host_get_name(MSG_host_self());
+  xbt_assert(argc == 2);
+  const char *mbox = argv[1];
+
+  msg_task_t task = NULL;
+  MSG_task_recv(&task, mbox);
+
+  struct task_priv *priv = MSG_task_get_data(task);
+  double clock_end = MSG_get_clock();
+
+  XBT_INFO("%s:%s to %s:%s => %g sec",
+      MSG_host_get_name(priv->tx_host),
+      MSG_process_get_name(priv->tx_proc),
+      host_name, pr_name, clock_end - priv->clock_sta);
+
+  xbt_free(priv);
+  MSG_task_destroy(task);
+
+  return 0;
+}
+
+static void launch_communication_worker(msg_host_t tx_host, msg_host_t rx_host)
+{
+  char *mbox = bprintf("MBOX:%s-%s",
+      MSG_host_get_name(tx_host),
+      MSG_host_get_name(rx_host));
+  char **argv = NULL;
+  
+  const char *pr_name_tx =  "comm_tx";
+  argv = xbt_new(char *, 3);
+  argv[0] = xbt_strdup(pr_name_tx);
+  argv[1] = xbt_strdup(mbox);
+  argv[2] = NULL;
+
+  MSG_process_create_with_arguments(pr_name_tx, communication_tx_fun, NULL, tx_host, 2, argv);
+
+  const char *pr_name_rx =  "comm_rx";  
+  argv = xbt_new(char *, 3);
+  argv[0] = xbt_strdup(pr_name_rx);
+  argv[1] = xbt_strdup(mbox);
+  argv[2] = NULL;
+
+  MSG_process_create_with_arguments(pr_name_rx, communication_rx_fun, NULL, rx_host, 2, argv);
+
+  xbt_free(mbox);
+}
+
+
+static int master_main(int argc, char *argv[])
+{
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+  msg_host_t pm1 = xbt_dynar_get_as(hosts_dynar, 1, msg_host_t);
+  msg_host_t pm2 = xbt_dynar_get_as(hosts_dynar, 2, msg_host_t);
+  msg_vm_t vm0, vm1;
+
+
+  XBT_INFO("## Test 1 (started): check computation on normal PMs");
+
+  XBT_INFO("### Put a task on a PM");
+  launch_computation_worker(pm0);
+  MSG_process_sleep(2);
+
+  XBT_INFO("### Put two tasks on a PM");
+  launch_computation_worker(pm0);
+  launch_computation_worker(pm0);
+  MSG_process_sleep(2);
+
+  XBT_INFO("### Put a task on each PM");
+  launch_computation_worker(pm0);
+  launch_computation_worker(pm1);
+  MSG_process_sleep(2);
+
+  XBT_INFO("## Test 1 (ended)");
+
+
+  XBT_INFO("## Test 2 (started): check impact of running a task inside a VM (there is no degradation for the moment)");
+
+  XBT_INFO("### Put a VM on a PM, and put a task to the VM");
+  vm0 = MSG_vm_create_core(pm0, "VM0");
+  MSG_vm_start(vm0);
+  launch_computation_worker(vm0);
+  MSG_process_sleep(2);
+  MSG_vm_destroy(vm0);
+
+  XBT_INFO("## Test 2 (ended)");
+
+  
+  XBT_INFO("## Test 3 (started): check impact of running a task collocated with a VM (there is no VM noise for the moment)");
+
+  XBT_INFO("### Put a VM on a PM, and put a task to the PM");
+  vm0 = MSG_vm_create_core(pm0, "VM0");
+  MSG_vm_start(vm0);
+  launch_computation_worker(pm0);
+  MSG_process_sleep(2);
+  MSG_vm_destroy(vm0);
+
+  XBT_INFO("## Test 3 (ended)");
+
+
+  XBT_INFO("## Test 4 (started): compare the cost of running two tasks inside two different VMs collocated or not (for the moment, there is no degradation for the VMs. Hence, the time should be equals to the time of test 1");
+
+  XBT_INFO("### Put two VMs on a PM, and put a task to each VM");
+  vm0 = MSG_vm_create_core(pm0, "VM0");
+  vm1 = MSG_vm_create_core(pm0, "VM1");
+  MSG_vm_start(vm0);
+  MSG_vm_start(vm1);
+  launch_computation_worker(vm0);
+  launch_computation_worker(vm1);
+  MSG_process_sleep(2);
+  MSG_vm_destroy(vm0);
+  MSG_vm_destroy(vm1);
+
+  XBT_INFO("### Put a VM on each PM, and put a task to each VM");
+  vm0 = MSG_vm_create_core(pm0, "VM0");
+  vm1 = MSG_vm_create_core(pm1, "VM1");
+  MSG_vm_start(vm0);
+  MSG_vm_start(vm1);
+  launch_computation_worker(vm0);
+  launch_computation_worker(vm1);
+  MSG_process_sleep(2);
+  MSG_vm_destroy(vm0);
+  MSG_vm_destroy(vm1);
+  XBT_INFO("## Test 4 (ended)");
+
+  
+  XBT_INFO("## Test 5  (started): Analyse network impact");
+  XBT_INFO("### Make a connection between PM0 and PM1");
+  launch_communication_worker(pm0, pm1);
+  MSG_process_sleep(5);
+
+  XBT_INFO("### Make two connection between PM0 and PM1");
+  launch_communication_worker(pm0, pm1);
+  launch_communication_worker(pm0, pm1);
+  MSG_process_sleep(5);
+
+  XBT_INFO("### Make a connection between PM0 and VM0@PM0");
+  vm0 = MSG_vm_create_core(pm0, "VM0");
+  MSG_vm_start(vm0);
+  launch_communication_worker(pm0, vm0);
+  MSG_process_sleep(5);
+  MSG_vm_destroy(vm0);
+
+  XBT_INFO("### Make a connection between PM0 and VM0@PM1");
+  vm0 = MSG_vm_create_core(pm1, "VM0");
+  MSG_vm_start(vm0);
+  launch_communication_worker(pm0, vm0);
+  MSG_process_sleep(5);
+  MSG_vm_destroy(vm0);
+
+  XBT_INFO("### Make two connections between PM0 and VM0@PM1");
+  vm0 = MSG_vm_create_core(pm1, "VM0");
+  MSG_vm_start(vm0);
+  launch_communication_worker(pm0, vm0);
+  launch_communication_worker(pm0, vm0);
+  MSG_process_sleep(5);
+  MSG_vm_destroy(vm0);
+
+  XBT_INFO("### Make a connection between PM0 and VM0@PM1, and also make a connection between PM0 and PM1");
+  vm0 = MSG_vm_create_core(pm1, "VM0");
+  MSG_vm_start(vm0);
+  launch_communication_worker(pm0, vm0);
+  launch_communication_worker(pm0, pm1);
+  MSG_process_sleep(5);
+  MSG_vm_destroy(vm0);
+
+  XBT_INFO("### Make a connection between VM0@PM0 and PM1@PM1, and also make a connection between VM0@PM0 and VM1@PM1");
+  vm0 = MSG_vm_create_core(pm0, "VM0");
+  vm1 = MSG_vm_create_core(pm1, "VM1");
+  MSG_vm_start(vm0);
+  MSG_vm_start(vm1);
+  launch_communication_worker(vm0, vm1);
+  launch_communication_worker(vm0, vm1);
+  MSG_process_sleep(5);
+  MSG_vm_destroy(vm0);
+  MSG_vm_destroy(vm1);
+
+  XBT_INFO("## Test 5 (ended)");
+
+
+  XBT_INFO("## Test 6 (started): Check migration impact (not yet implemented neither on the CPU resource nor on the network one");
+  XBT_INFO("### Relocate VM0 between PM0 and PM1");
+  vm0 = MSG_vm_create_core(pm0, "VM0");
+  {
+    s_ws_params_t params;
+    memset(&params, 0, sizeof(params));
+    params.ramsize = 1L * 1024 * 1024 * 1024; // 1Gbytes
+    MSG_host_set_params(vm0, &params);
+  }
+  MSG_vm_start(vm0);
+  launch_communication_worker(vm0, pm2);
+  MSG_process_sleep(0.01);
+  MSG_vm_migrate(vm0, pm1);
+  MSG_process_sleep(0.01);
+  MSG_vm_migrate(vm0, pm0);
+  MSG_process_sleep(5);
+  MSG_vm_destroy(vm0);
+  XBT_INFO("## Test 6 (ended)");
+  
+  xbt_dynar_free(&hosts_dynar);
+  return 0;
+}
+
+static void launch_master(msg_host_t host)
+{
+  const char *pr_name = "master_";
+  char **argv = xbt_new(char *, 2);
+  argv[0] = xbt_strdup(pr_name);
+  argv[1] = NULL;
+
+  MSG_process_create_with_arguments(pr_name, master_main, NULL, host, 1, argv);
+}
+
+
+int main(int argc, char *argv[])
+{
+  /* Get the arguments */
+  MSG_init(&argc, argv);
+
+  /* load the platform file */
+  xbt_assert(argc == 2);
+  MSG_create_environment(argv[1]);
+
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+  launch_master(pm0);
+
+  int res = MSG_main();
+  XBT_INFO("Bye (simulation time %g)", MSG_get_clock());
+  xbt_dynar_free(&hosts_dynar);
+
+  return !(res == MSG_OK);
+}
diff --git a/examples/msg/cloud/simple_vm.tesh b/examples/msg/cloud/simple_vm.tesh
new file mode 100644 (file)
index 0000000..12d0ad2
--- /dev/null
@@ -0,0 +1,86 @@
+#! ./tesh
+
+p Testing a vm with two successive tasks
+
+$ $SG_TEST_EXENV ${bindir:=.}/simple_vm$EXEEXT --log=no_loc ${srcdir:=.}/simple_plat.xml
+> [PM0:master_:(1) 0.000000] [msg_test/INFO] ## Test 1 (started): check computation on normal PMs
+> [PM0:master_:(1) 0.000000] [msg_test/INFO] ### Put a task on a PM
+> [PM0:compute:(2) 0.010000] [msg_test/INFO] PM0:compute task executed 0.01
+> [PM0:master_:(1) 2.000000] [msg_test/INFO] ### Put two tasks on a PM
+> [PM0:compute:(4) 2.020000] [msg_test/INFO] PM0:compute task executed 0.02
+> [PM0:compute:(3) 2.020000] [msg_test/INFO] PM0:compute task executed 0.02
+> [PM0:master_:(1) 4.000000] [msg_test/INFO] ### Put a task on each PM
+> [PM0:compute:(5) 4.010000] [msg_test/INFO] PM0:compute task executed 0.01
+> [PM1:compute:(6) 4.010000] [msg_test/INFO] PM1:compute task executed 0.01
+> [PM0:master_:(1) 6.000000] [msg_test/INFO] ## Test 1 (ended)
+> [PM0:master_:(1) 6.000000] [msg_test/INFO] ## Test 2 (started): check impact of running a task inside a VM (there is no degradation for the moment)
+> [PM0:master_:(1) 6.000000] [msg_test/INFO] ### Put a VM on a PM, and put a task to the VM
+> [6.000000] [surf_vm_workstation/INFO] Create VM(VM0)@PM(PM0) with 0 mounted disks
+> [VM0:compute:(7) 6.010000] [msg_test/INFO] VM0:compute task executed 0.01
+> [PM0:master_:(1) 8.000000] [msg_test/INFO] ## Test 2 (ended)
+> [PM0:master_:(1) 8.000000] [msg_test/INFO] ## Test 3 (started): check impact of running a task collocated with a VM (there is no VM noise for the moment)
+> [PM0:master_:(1) 8.000000] [msg_test/INFO] ### Put a VM on a PM, and put a task to the PM
+> [8.000000] [surf_vm_workstation/INFO] Create VM(VM0)@PM(PM0) with 0 mounted disks
+> [PM0:compute:(8) 8.010000] [msg_test/INFO] PM0:compute task executed 0.01
+> [PM0:master_:(1) 10.000000] [msg_test/INFO] ## Test 3 (ended)
+> [PM0:master_:(1) 10.000000] [msg_test/INFO] ## Test 4 (started): compare the cost of running two tasks inside two different VMs collocated or not (for the moment, there is no degradation for the VMs. Hence, the time should be equals to the time of test 1
+> [PM0:master_:(1) 10.000000] [msg_test/INFO] ### Put two VMs on a PM, and put a task to each VM
+> [10.000000] [surf_vm_workstation/INFO] Create VM(VM0)@PM(PM0) with 0 mounted disks
+> [10.000000] [surf_vm_workstation/INFO] Create VM(VM1)@PM(PM0) with 0 mounted disks
+> [VM0:compute:(9) 10.020000] [msg_test/INFO] VM0:compute task executed 0.02
+> [VM1:compute:(10) 10.020000] [msg_test/INFO] VM1:compute task executed 0.02
+> [PM0:master_:(1) 12.000000] [msg_test/INFO] ### Put a VM on each PM, and put a task to each VM
+> [12.000000] [surf_vm_workstation/INFO] Create VM(VM0)@PM(PM0) with 0 mounted disks
+> [12.000000] [surf_vm_workstation/INFO] Create VM(VM1)@PM(PM1) with 0 mounted disks
+> [VM0:compute:(11) 12.010000] [msg_test/INFO] VM0:compute task executed 0.01
+> [VM1:compute:(12) 12.010000] [msg_test/INFO] VM1:compute task executed 0.01
+> [PM0:master_:(1) 14.000000] [msg_test/INFO] ## Test 4 (ended)
+> [PM0:master_:(1) 14.000000] [msg_test/INFO] ## Test 5  (started): Analyse network impact
+> [PM0:master_:(1) 14.000000] [msg_test/INFO] ### Make a connection between PM0 and PM1
+> [PM1:comm_rx:(14) 14.216698] [msg_test/INFO] PM0:comm_tx to PM1:comm_rx => 0.216698 sec
+> [PM0:master_:(1) 19.000000] [msg_test/INFO] ### Make two connection between PM0 and PM1
+> [PM1:comm_rx:(18) 19.303296] [msg_test/INFO] PM0:comm_tx to PM1:comm_rx => 0.303296 sec
+> [PM1:comm_rx:(16) 19.303296] [msg_test/INFO] PM0:comm_tx to PM1:comm_rx => 0.303296 sec
+> [PM0:master_:(1) 24.000000] [msg_test/INFO] ### Make a connection between PM0 and VM0@PM0
+> [24.000000] [surf_vm_workstation/INFO] Create VM(VM0)@PM(PM0) with 0 mounted disks
+> [VM0:comm_rx:(20) 24.002203] [msg_test/INFO] PM0:comm_tx to VM0:comm_rx => 0.00220318 sec
+> [PM0:master_:(1) 29.000000] [msg_test/INFO] ### Make a connection between PM0 and VM0@PM1
+> [29.000000] [surf_vm_workstation/INFO] Create VM(VM0)@PM(PM1) with 0 mounted disks
+> [VM0:comm_rx:(22) 29.216698] [msg_test/INFO] PM0:comm_tx to VM0:comm_rx => 0.216698 sec
+> [PM0:master_:(1) 34.000000] [msg_test/INFO] ### Make two connections between PM0 and VM0@PM1
+> [34.000000] [surf_vm_workstation/INFO] Create VM(VM0)@PM(PM1) with 0 mounted disks
+> [VM0:comm_rx:(26) 34.303296] [msg_test/INFO] PM0:comm_tx to VM0:comm_rx => 0.303296 sec
+> [VM0:comm_rx:(24) 34.303296] [msg_test/INFO] PM0:comm_tx to VM0:comm_rx => 0.303296 sec
+> [PM0:master_:(1) 39.000000] [msg_test/INFO] ### Make a connection between PM0 and VM0@PM1, and also make a connection between PM0 and PM1
+> [39.000000] [surf_vm_workstation/INFO] Create VM(VM0)@PM(PM1) with 0 mounted disks
+> [PM1:comm_rx:(30) 39.303296] [msg_test/INFO] PM0:comm_tx to PM1:comm_rx => 0.303296 sec
+> [VM0:comm_rx:(28) 39.303296] [msg_test/INFO] PM0:comm_tx to VM0:comm_rx => 0.303296 sec
+> [PM0:master_:(1) 44.000000] [msg_test/INFO] ### Make a connection between VM0@PM0 and PM1@PM1, and also make a connection between VM0@PM0 and VM1@PM1
+> [44.000000] [surf_vm_workstation/INFO] Create VM(VM0)@PM(PM0) with 0 mounted disks
+> [44.000000] [surf_vm_workstation/INFO] Create VM(VM1)@PM(PM1) with 0 mounted disks
+> [VM1:comm_rx:(34) 44.303296] [msg_test/INFO] VM0:comm_tx to VM1:comm_rx => 0.303296 sec
+> [VM1:comm_rx:(32) 44.303296] [msg_test/INFO] VM0:comm_tx to VM1:comm_rx => 0.303296 sec
+> [PM0:master_:(1) 49.000000] [msg_test/INFO] ## Test 5 (ended)
+> [PM0:master_:(1) 49.000000] [msg_test/INFO] ## Test 6 (started): Check migration impact (not yet implemented neither on the CPU resource nor on the network one
+> [PM0:master_:(1) 49.000000] [msg_test/INFO] ### Relocate VM0 between PM0 and PM1
+> [49.000000] [surf_vm_workstation/INFO] Create VM(VM0)@PM(PM0) with 0 mounted disks
+> [PM0:__pr_mig_tx:VM0(PM0-PM1):(38) 49.010000] [msg_vm/WARNING] use the default max_downtime value 30ms
+> [PM0:__pr_mig_tx:VM0(PM0-PM1):(38) 49.010000] [msg_vm/INFO] mig-stage1: remaining_size 1073741824.000000
+> [PM2:comm_rx:(36) 49.293296] [msg_test/INFO] VM0:comm_tx to PM2:comm_rx => 0.293296 sec
+> [PM0:__pr_mig_tx:VM0(PM0-PM1):(38) 142.200526] [msg_vm/INFO] actual banwdidth 10.988241 (MB/s), threshold 345660.187833
+> [PM0:__pr_mig_tx:VM0(PM0-PM1):(38) 142.200526] [msg_vm/INFO] mig-stage 2:0 updated_size 0.000000 computed_during_stage1 0.000000 dp_rate 0.000000 dp_cap 0.000000
+> [PM0:__pr_mig_tx:VM0(PM0-PM1):(38) 142.200526] [msg_vm/INFO] mig-stage2.0: remaining_size 0.000000 (< threshold 345660.187833)
+> [PM0:__pr_mig_tx:VM0(PM0-PM1):(38) 142.200526] [msg_vm/INFO] mig-stage3: remaining_size 0.000000
+> [142.330626] [surf_vm_workstation/INFO] migrate VM(VM0): set bound (100000000.000000) at PM1
+> [PM1:__pr_mig_rx:VM0(PM0-PM1):(37) 142.330626] [msg_vm/INFO] set affinity(0x0000@PM1) for VM0
+> [PM1:__pr_mig_tx:VM0(PM1-PM0):(42) 142.470726] [msg_vm/WARNING] use the default max_downtime value 30ms
+> [PM1:__pr_mig_tx:VM0(PM1-PM0):(42) 142.470726] [msg_vm/INFO] mig-stage1: remaining_size 1073741824.000000
+> [PM1:__pr_mig_tx:VM0(PM1-PM0):(42) 235.584654] [msg_vm/INFO] actual banwdidth 10.997281 (MB/s), threshold 345944.536891
+> [PM1:__pr_mig_tx:VM0(PM1-PM0):(42) 235.584654] [msg_vm/INFO] mig-stage 2:0 updated_size 0.000000 computed_during_stage1 0.000000 dp_rate 0.000000 dp_cap 0.000000
+> [PM1:__pr_mig_tx:VM0(PM1-PM0):(42) 235.584654] [msg_vm/INFO] mig-stage2.0: remaining_size 0.000000 (< threshold 345944.536891)
+> [PM1:__pr_mig_tx:VM0(PM1-PM0):(42) 235.584654] [msg_vm/INFO] mig-stage3: remaining_size 0.000000
+> [235.714754] [surf_vm_workstation/CRITICAL] FIXME: may need a proper handling, 1
+> [235.714754] [surf_vm_workstation/INFO] migrate VM(VM0): set bound (100000000.000000) at PM0
+> [PM0:__pr_mig_rx:VM0(PM1-PM0):(41) 235.714754] [msg_vm/INFO] set affinity(0x0000@PM0) for VM0
+> [PM0:master_:(1) 240.714949] [msg_test/INFO] ## Test 6 (ended)
+> [240.714949] [msg_test/INFO] Bye (simulation time 240.715)
diff --git a/examples/msg/cloud/two_tasks_vm.c b/examples/msg/cloud/two_tasks_vm.c
new file mode 100644 (file)
index 0000000..0e2aaab
--- /dev/null
@@ -0,0 +1,113 @@
+/* Copyright (c) 2014. 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 "msg/msg.h"
+#include "xbt/sysdep.h"
+
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+                             "Messages specific for this msg example");
+
+msg_task_t atask = NULL;
+
+static int computation_fun(int argc, char *argv[])
+{
+  const char *pr_name = MSG_process_get_name(MSG_process_self());
+  const char *host_name = MSG_host_get_name(MSG_host_self());
+  double clock_sta, clock_end;
+  atask = MSG_task_create("Task1", 1e9, 1e9, NULL);
+  clock_sta = MSG_get_clock();
+  XBT_INFO("%s:%s task 1 created %g", host_name, pr_name, clock_sta);
+  MSG_task_execute(atask);
+  clock_end = MSG_get_clock();
+
+  XBT_INFO("%s:%s task 1 executed %g", host_name, pr_name, clock_end - clock_sta);
+
+  MSG_task_destroy(atask);
+  atask = NULL;
+
+  MSG_process_sleep(1);
+
+  atask = MSG_task_create("Task2", 1e10, 1e10, NULL);
+
+  clock_sta = MSG_get_clock();
+  XBT_INFO("%s:%s task 2 created %g", host_name, pr_name, clock_sta);
+  MSG_task_execute(atask);
+  clock_end = MSG_get_clock();
+
+  XBT_INFO("%s:%s task 2 executed %g", host_name, pr_name, clock_end - clock_sta);
+
+  MSG_task_destroy(atask);
+  atask = NULL;
+
+  return 0;
+}
+
+static void launch_computation_worker(msg_host_t host)
+{
+  const char *pr_name = "compute";
+  char **argv = xbt_new(char *, 2);
+  argv[0] = xbt_strdup(pr_name);
+  argv[1] = NULL;
+
+  MSG_process_create_with_arguments(pr_name, computation_fun, NULL, host, 1, argv);
+}
+
+static int master_main(int argc, char *argv[])
+{
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+  msg_vm_t vm0;
+  vm0 = MSG_vm_create_core(pm0, "VM0");
+  MSG_vm_start(vm0);
+  //MSG_process_sleep(1);
+
+  launch_computation_worker(vm0);
+
+  while(MSG_get_clock()<100) {
+       if (atask != NULL)
+         XBT_INFO("aTask remaining duration: %g", MSG_task_get_remaining_computation(atask));
+       MSG_process_sleep(1);
+  }
+
+  MSG_process_sleep(10000);
+  MSG_vm_destroy(vm0);
+  xbt_dynar_free(&hosts_dynar);
+  return 1;
+}
+
+static void launch_master(msg_host_t host)
+{
+  const char *pr_name = "master_";
+  char **argv = xbt_new(char *, 2);
+  argv[0] = xbt_strdup(pr_name);
+  argv[1] = NULL;
+
+  MSG_process_create_with_arguments(pr_name, master_main, NULL, host, 1, argv);
+}
+
+int main(int argc, char *argv[]){
+  MSG_init(&argc, argv);
+
+  xbt_assert(argc == 2);
+  MSG_create_environment(argv[1]);
+
+  xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+  msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+  launch_master(pm0);
+
+  int res = MSG_main();
+  XBT_INFO("Bye (simulation time %g)", MSG_get_clock());
+  xbt_dynar_free(&hosts_dynar);
+
+  return !(res == MSG_OK);
+}
+
+
+
+
diff --git a/examples/msg/cloud/two_tasks_vm.tesh b/examples/msg/cloud/two_tasks_vm.tesh
new file mode 100644 (file)
index 0000000..05952d9
--- /dev/null
@@ -0,0 +1,110 @@
+#! ./tesh
+
+p Testing a vm with two successive tasks
+
+$ $SG_TEST_EXENV ${bindir:=.}/two_tasks_vm$EXEEXT ${srcdir:=.}/simple_plat.xml
+> [0.000000] [surf_vm_workstation/INFO] Create VM(VM0)@PM(PM0) with 0 mounted disks
+> [VM0:compute:(2) 0.000000] [msg_test/INFO] VM0:compute task 1 created 0
+> [PM0:master_:(1) 0.000000] [msg_test/INFO] aTask remaining duration: 1e+09
+> [PM0:master_:(1) 1.000000] [msg_test/INFO] aTask remaining duration: 9e+08
+> [PM0:master_:(1) 2.000000] [msg_test/INFO] aTask remaining duration: 8e+08
+> [PM0:master_:(1) 3.000000] [msg_test/INFO] aTask remaining duration: 7e+08
+> [PM0:master_:(1) 4.000000] [msg_test/INFO] aTask remaining duration: 6e+08
+> [PM0:master_:(1) 5.000000] [msg_test/INFO] aTask remaining duration: 5e+08
+> [PM0:master_:(1) 6.000000] [msg_test/INFO] aTask remaining duration: 4e+08
+> [PM0:master_:(1) 7.000000] [msg_test/INFO] aTask remaining duration: 3e+08
+> [PM0:master_:(1) 8.000000] [msg_test/INFO] aTask remaining duration: 2e+08
+> [PM0:master_:(1) 9.000000] [msg_test/INFO] aTask remaining duration: 1e+08
+> [VM0:compute:(2) 10.000000] [msg_test/INFO] VM0:compute task 1 executed 10
+> [PM0:master_:(1) 10.000000] [msg_test/INFO] aTask remaining duration: 0
+> [VM0:compute:(2) 11.000000] [msg_test/INFO] VM0:compute task 2 created 11
+> [PM0:master_:(1) 12.000000] [msg_test/INFO] aTask remaining duration: 9.9e+09
+> [PM0:master_:(1) 13.000000] [msg_test/INFO] aTask remaining duration: 9.8e+09
+> [PM0:master_:(1) 14.000000] [msg_test/INFO] aTask remaining duration: 9.7e+09
+> [PM0:master_:(1) 15.000000] [msg_test/INFO] aTask remaining duration: 9.6e+09
+> [PM0:master_:(1) 16.000000] [msg_test/INFO] aTask remaining duration: 9.5e+09
+> [PM0:master_:(1) 17.000000] [msg_test/INFO] aTask remaining duration: 9.4e+09
+> [PM0:master_:(1) 18.000000] [msg_test/INFO] aTask remaining duration: 9.3e+09
+> [PM0:master_:(1) 19.000000] [msg_test/INFO] aTask remaining duration: 9.2e+09
+> [PM0:master_:(1) 20.000000] [msg_test/INFO] aTask remaining duration: 9.1e+09
+> [PM0:master_:(1) 21.000000] [msg_test/INFO] aTask remaining duration: 9e+09
+> [PM0:master_:(1) 22.000000] [msg_test/INFO] aTask remaining duration: 8.9e+09
+> [PM0:master_:(1) 23.000000] [msg_test/INFO] aTask remaining duration: 8.8e+09
+> [PM0:master_:(1) 24.000000] [msg_test/INFO] aTask remaining duration: 8.7e+09
+> [PM0:master_:(1) 25.000000] [msg_test/INFO] aTask remaining duration: 8.6e+09
+> [PM0:master_:(1) 26.000000] [msg_test/INFO] aTask remaining duration: 8.5e+09
+> [PM0:master_:(1) 27.000000] [msg_test/INFO] aTask remaining duration: 8.4e+09
+> [PM0:master_:(1) 28.000000] [msg_test/INFO] aTask remaining duration: 8.3e+09
+> [PM0:master_:(1) 29.000000] [msg_test/INFO] aTask remaining duration: 8.2e+09
+> [PM0:master_:(1) 30.000000] [msg_test/INFO] aTask remaining duration: 8.1e+09
+> [PM0:master_:(1) 31.000000] [msg_test/INFO] aTask remaining duration: 8e+09
+> [PM0:master_:(1) 32.000000] [msg_test/INFO] aTask remaining duration: 7.9e+09
+> [PM0:master_:(1) 33.000000] [msg_test/INFO] aTask remaining duration: 7.8e+09
+> [PM0:master_:(1) 34.000000] [msg_test/INFO] aTask remaining duration: 7.7e+09
+> [PM0:master_:(1) 35.000000] [msg_test/INFO] aTask remaining duration: 7.6e+09
+> [PM0:master_:(1) 36.000000] [msg_test/INFO] aTask remaining duration: 7.5e+09
+> [PM0:master_:(1) 37.000000] [msg_test/INFO] aTask remaining duration: 7.4e+09
+> [PM0:master_:(1) 38.000000] [msg_test/INFO] aTask remaining duration: 7.3e+09
+> [PM0:master_:(1) 39.000000] [msg_test/INFO] aTask remaining duration: 7.2e+09
+> [PM0:master_:(1) 40.000000] [msg_test/INFO] aTask remaining duration: 7.1e+09
+> [PM0:master_:(1) 41.000000] [msg_test/INFO] aTask remaining duration: 7e+09
+> [PM0:master_:(1) 42.000000] [msg_test/INFO] aTask remaining duration: 6.9e+09
+> [PM0:master_:(1) 43.000000] [msg_test/INFO] aTask remaining duration: 6.8e+09
+> [PM0:master_:(1) 44.000000] [msg_test/INFO] aTask remaining duration: 6.7e+09
+> [PM0:master_:(1) 45.000000] [msg_test/INFO] aTask remaining duration: 6.6e+09
+> [PM0:master_:(1) 46.000000] [msg_test/INFO] aTask remaining duration: 6.5e+09
+> [PM0:master_:(1) 47.000000] [msg_test/INFO] aTask remaining duration: 6.4e+09
+> [PM0:master_:(1) 48.000000] [msg_test/INFO] aTask remaining duration: 6.3e+09
+> [PM0:master_:(1) 49.000000] [msg_test/INFO] aTask remaining duration: 6.2e+09
+> [PM0:master_:(1) 50.000000] [msg_test/INFO] aTask remaining duration: 6.1e+09
+> [PM0:master_:(1) 51.000000] [msg_test/INFO] aTask remaining duration: 6e+09
+> [PM0:master_:(1) 52.000000] [msg_test/INFO] aTask remaining duration: 5.9e+09
+> [PM0:master_:(1) 53.000000] [msg_test/INFO] aTask remaining duration: 5.8e+09
+> [PM0:master_:(1) 54.000000] [msg_test/INFO] aTask remaining duration: 5.7e+09
+> [PM0:master_:(1) 55.000000] [msg_test/INFO] aTask remaining duration: 5.6e+09
+> [PM0:master_:(1) 56.000000] [msg_test/INFO] aTask remaining duration: 5.5e+09
+> [PM0:master_:(1) 57.000000] [msg_test/INFO] aTask remaining duration: 5.4e+09
+> [PM0:master_:(1) 58.000000] [msg_test/INFO] aTask remaining duration: 5.3e+09
+> [PM0:master_:(1) 59.000000] [msg_test/INFO] aTask remaining duration: 5.2e+09
+> [PM0:master_:(1) 60.000000] [msg_test/INFO] aTask remaining duration: 5.1e+09
+> [PM0:master_:(1) 61.000000] [msg_test/INFO] aTask remaining duration: 5e+09
+> [PM0:master_:(1) 62.000000] [msg_test/INFO] aTask remaining duration: 4.9e+09
+> [PM0:master_:(1) 63.000000] [msg_test/INFO] aTask remaining duration: 4.8e+09
+> [PM0:master_:(1) 64.000000] [msg_test/INFO] aTask remaining duration: 4.7e+09
+> [PM0:master_:(1) 65.000000] [msg_test/INFO] aTask remaining duration: 4.6e+09
+> [PM0:master_:(1) 66.000000] [msg_test/INFO] aTask remaining duration: 4.5e+09
+> [PM0:master_:(1) 67.000000] [msg_test/INFO] aTask remaining duration: 4.4e+09
+> [PM0:master_:(1) 68.000000] [msg_test/INFO] aTask remaining duration: 4.3e+09
+> [PM0:master_:(1) 69.000000] [msg_test/INFO] aTask remaining duration: 4.2e+09
+> [PM0:master_:(1) 70.000000] [msg_test/INFO] aTask remaining duration: 4.1e+09
+> [PM0:master_:(1) 71.000000] [msg_test/INFO] aTask remaining duration: 4e+09
+> [PM0:master_:(1) 72.000000] [msg_test/INFO] aTask remaining duration: 3.9e+09
+> [PM0:master_:(1) 73.000000] [msg_test/INFO] aTask remaining duration: 3.8e+09
+> [PM0:master_:(1) 74.000000] [msg_test/INFO] aTask remaining duration: 3.7e+09
+> [PM0:master_:(1) 75.000000] [msg_test/INFO] aTask remaining duration: 3.6e+09
+> [PM0:master_:(1) 76.000000] [msg_test/INFO] aTask remaining duration: 3.5e+09
+> [PM0:master_:(1) 77.000000] [msg_test/INFO] aTask remaining duration: 3.4e+09
+> [PM0:master_:(1) 78.000000] [msg_test/INFO] aTask remaining duration: 3.3e+09
+> [PM0:master_:(1) 79.000000] [msg_test/INFO] aTask remaining duration: 3.2e+09
+> [PM0:master_:(1) 80.000000] [msg_test/INFO] aTask remaining duration: 3.1e+09
+> [PM0:master_:(1) 81.000000] [msg_test/INFO] aTask remaining duration: 3e+09
+> [PM0:master_:(1) 82.000000] [msg_test/INFO] aTask remaining duration: 2.9e+09
+> [PM0:master_:(1) 83.000000] [msg_test/INFO] aTask remaining duration: 2.8e+09
+> [PM0:master_:(1) 84.000000] [msg_test/INFO] aTask remaining duration: 2.7e+09
+> [PM0:master_:(1) 85.000000] [msg_test/INFO] aTask remaining duration: 2.6e+09
+> [PM0:master_:(1) 86.000000] [msg_test/INFO] aTask remaining duration: 2.5e+09
+> [PM0:master_:(1) 87.000000] [msg_test/INFO] aTask remaining duration: 2.4e+09
+> [PM0:master_:(1) 88.000000] [msg_test/INFO] aTask remaining duration: 2.3e+09
+> [PM0:master_:(1) 89.000000] [msg_test/INFO] aTask remaining duration: 2.2e+09
+> [PM0:master_:(1) 90.000000] [msg_test/INFO] aTask remaining duration: 2.1e+09
+> [PM0:master_:(1) 91.000000] [msg_test/INFO] aTask remaining duration: 2e+09
+> [PM0:master_:(1) 92.000000] [msg_test/INFO] aTask remaining duration: 1.9e+09
+> [PM0:master_:(1) 93.000000] [msg_test/INFO] aTask remaining duration: 1.8e+09
+> [PM0:master_:(1) 94.000000] [msg_test/INFO] aTask remaining duration: 1.7e+09
+> [PM0:master_:(1) 95.000000] [msg_test/INFO] aTask remaining duration: 1.6e+09
+> [PM0:master_:(1) 96.000000] [msg_test/INFO] aTask remaining duration: 1.5e+09
+> [PM0:master_:(1) 97.000000] [msg_test/INFO] aTask remaining duration: 1.4e+09
+> [PM0:master_:(1) 98.000000] [msg_test/INFO] aTask remaining duration: 1.3e+09
+> [PM0:master_:(1) 99.000000] [msg_test/INFO] aTask remaining duration: 1.2e+09
+> [VM0:compute:(2) 111.000000] [msg_test/INFO] VM0:compute task 2 executed 100
+> [10100.000000] [msg_test/INFO] Bye (simulation time 10100)
index 74013fb..6a3085d 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2007-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. 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 "xbt/sysdep.h"         /* calloc */
 
index cc2d47d..2446550 100644 (file)
@@ -3,7 +3,7 @@
 p Testing the DVFS-related functions
 
 ! output sort
-$ $SG_TEST_EXENV energy/e1/e1$EXEEXT ${srcdir:=.}/energy/e1/platform_e1.xml ${srcdir:=.}/energy/e1/deployment_e1.xml --log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n
+$ $SG_TEST_EXENV energy/e1/e1$EXEEXT ${srcdir:=.}/energy/e1/platform_e1.xml ${srcdir:=.}/energy/e1/deployment_e1.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (1:dvfs_test@MyHost1) Number of Processor states=3
 > [  0.000000] (2:dvfs_test@MyHost2) Number of Processor states=1
 > [  0.000000] (1:dvfs_test@MyHost1) Current power peak=100000000.000000
index d0ea20b..1be86ff 100644 (file)
@@ -1,5 +1,4 @@
-
-/* Copyright (c) 2007-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -9,6 +8,7 @@
 
 #include "msg/msg.h"
 #include "xbt/sysdep.h"         /* calloc */
+#include "simgrid/plugins.h"
 
 /* Create a log channel to have nice outputs. */
 #include "xbt/log.h"
@@ -70,14 +70,13 @@ int dvfs(int argc, char *argv[])
   consumed_energy = MSG_get_host_consumed_energy(host);
   XBT_INFO("Total energy (Joules): %f", consumed_energy);
 
-
   return 0;
 }
 
 int main(int argc, char *argv[])
 {
   msg_error_t res = MSG_OK;
-
+  sg_energy_plugin_init();
   MSG_init(&argc, argv);
 
   if (argc != 3) {
index 56f87a0..105621b 100644 (file)
@@ -3,7 +3,7 @@
 p Testing the mechanism for computing host energy consumption 
 
 ! output sort
-$ $SG_TEST_EXENV energy/e2/e2$EXEEXT ${srcdir:=.}/energy/e2/platform_e2.xml ${srcdir:=.}/energy/e2/deployment_e2.xml --log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n
+$ $SG_TEST_EXENV energy/e2/e2$EXEEXT ${srcdir:=.}/energy/e2/platform_e2.xml ${srcdir:=.}/energy/e2/deployment_e2.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (1:dvfs_test@MyHost1) Current power peak=100000000.000000
 > [  0.000000] (1:dvfs_test@MyHost1) Total energy (Joules): 0.000000
 > [  1.000000] (1:dvfs_test@MyHost1) Task1 simulation time: 1.000000e+00
@@ -14,3 +14,4 @@ $ $SG_TEST_EXENV energy/e2/e2$EXEEXT ${srcdir:=.}/energy/e2/platform_e2.xml ${sr
 > [  9.000000] (1:dvfs_test@MyHost1) Task3 (sleep) simulation time: 4.000000e+00
 > [  9.000000] (1:dvfs_test@MyHost1) Total energy (Joules): 1220.000000
 > [  9.000000] (0:@) Total simulation time: 9.000000e+00
+> [  9.000000] (0:@) Total energy (Joules) of host MyHost1: 1220.000000
index a7d7eac..9cf2d89 100644 (file)
@@ -3,7 +3,7 @@
 p Testing the mechanism for computing host energy consumption for concurrent tasks 
 
 ! output sort
-$ $SG_TEST_EXENV energy/e3/e3$EXEEXT ${srcdir:=.}/energy/e3/platform_e3.xml ${srcdir:=.}/energy/e3/deployment_e3.xml --log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n
+$ $SG_TEST_EXENV energy/e3/e3$EXEEXT ${srcdir:=.}/energy/e3/platform_e3.xml ${srcdir:=.}/energy/e3/deployment_e3.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (1:dvfs_test@MyHost1) Current power peak=100000000.000000
 > [  0.000000] (1:dvfs_test@MyHost1) Total energy (Joules): 0.000000
 > [  2.000000] (4:proc3@MyHost1) Process proc3 executed task sleep cpu=0.000000, duration = 2.000000
@@ -19,3 +19,4 @@ $ $SG_TEST_EXENV energy/e3/e3$EXEEXT ${srcdir:=.}/energy/e3/platform_e3.xml ${sr
 > [  8.000000] (1:dvfs_test@MyHost1) Task simulation time: 8.000000e+00
 > [  8.000000] (1:dvfs_test@MyHost1) Total energy (Joules): 1390.000000
 > [  8.000000] (0:@) Total simulation time: 8.000000e+00
+> [  8.000000] (0:@) Total energy (Joules) of host MyHost1: 1390.000000
index 4230a8e..1eab1b8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -8,6 +8,7 @@
 
 #include "msg/msg.h"
 #include "xbt/sysdep.h"         /* calloc */
+#include "simgrid/plugins.h"
 
 /* Create a log channel to have nice outputs. */
 #include "xbt/log.h"
@@ -99,7 +100,7 @@ static int dvfs(int argc, char *argv[])
 int main(int argc, char *argv[])
 {
   msg_error_t res = MSG_OK;
-
+  sg_energy_plugin_init();
   MSG_init(&argc, argv);
 
   if (argc != 3) {
index bb7661d..c968e89 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 488f40b..eb7a880 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index ef9e78b..59f0d3e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d60cae3..d754270 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index bfbda57..2026f88 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3285b5e..13a39a6 100644 (file)
@@ -4,19 +4,23 @@ set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
 
 add_executable(file file.c)
 add_executable(file_unlink file_unlink.c)
+add_executable(storage storage.c)
 
 ### Add definitions for compile
 if(NOT WIN32)
   target_link_libraries(file simgrid pthread)
   target_link_libraries(file_unlink simgrid pthread)
+  target_link_libraries(storage simgrid pthread)
 else()
   target_link_libraries(file simgrid)
   target_link_libraries(file_unlink simgrid)
+  target_link_libraries(storage simgrid)
 endif()
 
 set(tesh_files
   ${tesh_files}
   ${CMAKE_CURRENT_SOURCE_DIR}/io.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/storage.tesh
   PARENT_SCOPE
   )
 set(xml_files
@@ -27,6 +31,7 @@ set(examples_src
   ${examples_src}
   ${CMAKE_CURRENT_SOURCE_DIR}/file.c
   ${CMAKE_CURRENT_SOURCE_DIR}/file_unlink.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/storage.c
   PARENT_SCOPE
   )
 set(bin_files
index ef7808f..1da705b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2008-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -16,7 +16,7 @@
  */
 
 #define FILENAME1 "./doc/simgrid/examples/platforms/g5k.xml"
-#define FILENAME2 "./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml"
+#define FILENAME2 ".\\Windows\\setupact.log"
 #define FILENAME3 "./doc/simgrid/examples/platforms/g5k_cabinets.xml"
 #define FILENAME4 "./doc/simgrid/examples/platforms/nancy.xml"
 
@@ -24,7 +24,6 @@
 #include <stdlib.h>
 #include "msg/msg.h"
 #include "surf/surf_private.h"
-#include "inttypes.h"
 
 int host(int argc, char *argv[]);
 
@@ -35,29 +34,31 @@ int host(int argc, char *argv[])
 {
   msg_file_t file = NULL;
   char* mount = xbt_strdup("/home");
-  sg_storage_size_t read,write;
+  sg_size_t read,write;
 
   if(!strcmp(MSG_process_get_name(MSG_process_self()),"0")){
     file = MSG_file_open(mount,FILENAME1, NULL);
     MSG_file_dump(file);
-  } else if(!strcmp(MSG_process_get_name(MSG_process_self()),"1"))
+  } else if(!strcmp(MSG_process_get_name(MSG_process_self()),"1")) {
+    free(mount);
+    mount = xbt_strdup("/windows");
     file = MSG_file_open(mount,FILENAME2, NULL);
-  else if(!strcmp(MSG_process_get_name(MSG_process_self()),"2"))
+  } else if(!strcmp(MSG_process_get_name(MSG_process_self()),"2")){
     file = MSG_file_open(mount,FILENAME3, NULL);
-  else if(!strcmp(MSG_process_get_name(MSG_process_self()),"3"))
+  else if(!strcmp(MSG_process_get_name(MSG_process_self()),"3"))
     file = MSG_file_open(mount,FILENAME4, NULL);
   else xbt_die("FILENAME NOT DEFINED %s",MSG_process_get_name(MSG_process_self()));
 
   XBT_INFO("\tOpen file '%s'",file->fullname);
 
   read = MSG_file_read(file, 10000000);     // Read for 10MB
-  XBT_INFO("\tHave read    %" PRIu64 " on %s",read,file->fullname);
+  XBT_INFO("\tHave read    %llu on %s",read,file->fullname);
 
   write = MSG_file_write(file, 100000);  // Write for 100KB
-  XBT_INFO("\tHave written %" PRIu64 " on %s",write,file->fullname);
+  XBT_INFO("\tHave written %llu on %s",write,file->fullname);
 
   read = MSG_file_read(file, 110000);     // Read for 110KB
-  XBT_INFO("\tHave read    %" PRIu64 " on %s (of size %" PRIu64 ")",read,file->fullname,
+  XBT_INFO("\tHave read    %llu on %s (of size %llu)",read,file->fullname,
       MSG_file_get_size(file));
 
   XBT_INFO("\tClose file '%s'",file->fullname);
index ec901da..49f0523 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2008-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -21,7 +21,6 @@
 #include <stdlib.h>
 #include "msg/msg.h"
 #include "surf/surf_private.h"
-#include "inttypes.h"
 
 int host(int argc, char *argv[]);
 
@@ -32,7 +31,7 @@ int host(int argc, char *argv[])
 {
   msg_file_t file = NULL;
   char* mount = xbt_strdup("/home");
-  sg_storage_size_t write;
+  sg_size_t write;
 
   // First open
   XBT_INFO("\tOpen file '%s'",FILENAME1);
@@ -48,7 +47,7 @@ int host(int argc, char *argv[])
 
   // Write into the new file
   write = MSG_file_write(file,100000);  // Write for 100Ko
-  XBT_INFO("\tHave written %" PRIu64 " on %s",write,file->fullname);
+  XBT_INFO("\tHave written %llu on %s",write,file->fullname);
 
   // Close the file
   XBT_INFO("\tClose file '%s'",file->fullname);
index bf4bdc2..e612c10 100644 (file)
@@ -2,7 +2,7 @@
 
 $ ${bindir:=.}/io/file ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (0:@) Number of host '4'
-> [  0.000000] (2:1@alice)     Open file './doc/simgrid/examples/platforms/One_cluster_no_backbone.xml'
+> [  0.000000] (2:1@alice)     Open file '.\Windows\setupact.log'
 > [  0.000000] (3:2@carl)      Open file './doc/simgrid/examples/platforms/g5k_cabinets.xml'
 > [  0.000000] (4:3@bob)       Open file './doc/simgrid/examples/platforms/nancy.xml'
 > [  0.000000] (1:0@denise) File Descriptor information:
@@ -13,77 +13,45 @@ $ ${bindir:=.}/io/file ${srcdir:=.}/examples/platforms/storage.xml "--log=root.f
 >              Storage Type: 'single_SSD'
 >              Content Type: 'txt_unix'
 > [  0.000000] (1:0@denise)    Open file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.000005] (2:1@alice)     Have read    482 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml
 > [  0.000040] (4:3@bob)       Have read    4028 on ./doc/simgrid/examples/platforms/nancy.xml
-> [  0.000170] (1:0@denise)    Have read    17028 on ./doc/simgrid/examples/platforms/g5k.xml
+> [  0.000085] (1:0@denise)    Have read    17028 on ./doc/simgrid/examples/platforms/g5k.xml
 > [  0.000226] (3:2@carl)      Have read    22645 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml
-> [  0.003338] (2:1@alice)     Have written 100000 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml
+> [  0.000508] (2:1@alice)     Have read    101663 on .\Windows\setupact.log
+> [  0.001752] (1:0@denise)    Have written 100000 on ./doc/simgrid/examples/platforms/g5k.xml
+> [  0.002175] (2:1@alice)     Have written 100000 on .\Windows\setupact.log
+> [  0.002439] (1:0@denise)    Have read    110000 on ./doc/simgrid/examples/platforms/g5k.xml (of size 117026)
+> [  0.002439] (1:0@denise)    Close file './doc/simgrid/examples/platforms/g5k.xml'
+> [  0.002862] (2:1@alice)     Have read    110000 on .\Windows\setupact.log (of size 201662)
+> [  0.002862] (2:1@alice)     Close file '.\Windows\setupact.log'
 > [  0.003374] (4:3@bob)       Have written 100000 on ./doc/simgrid/examples/platforms/nancy.xml
-> [  0.003504] (1:0@denise)    Have written 100000 on ./doc/simgrid/examples/platforms/g5k.xml
 > [  0.003560] (3:2@carl)      Have written 100000 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml
-> [  0.004343] (2:1@alice)     Have read    100481 on ./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml (of size 100481)
-> [  0.004343] (2:1@alice)     Close file './doc/simgrid/examples/platforms/One_cluster_no_backbone.xml'
-> [  0.004414] (4:3@bob)       Have read    104027 on ./doc/simgrid/examples/platforms/nancy.xml (of size 104027)
-> [  0.004414] (4:3@bob)       Close file './doc/simgrid/examples/platforms/nancy.xml'
-> [  0.004604] (1:0@denise)    Have read    110000 on ./doc/simgrid/examples/platforms/g5k.xml (of size 117027)
-> [  0.004604] (1:0@denise)    Close file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.004660] (3:2@carl)      Have read    110000 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml (of size 122644)
-> [  0.004660] (3:2@carl)      Close file './doc/simgrid/examples/platforms/g5k_cabinets.xml'
-> [  0.004660] (0:@) Simulation time 0.00465978
+> [  0.004529] (4:3@bob)       Have read    104023 on ./doc/simgrid/examples/platforms/nancy.xml (of size 104023)
+> [  0.004529] (4:3@bob)       Close file './doc/simgrid/examples/platforms/nancy.xml'
+> [  0.004782] (3:2@carl)      Have read    110000 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml (of size 122641)
+> [  0.004782] (3:2@carl)      Close file './doc/simgrid/examples/platforms/g5k_cabinets.xml'
+> [  0.004782] (0:@) Simulation time 0.00478201
 
 $ ${bindir:=.}/io/file_unlink ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (0:@) Number of host '4'
 > [  0.000000] (1:0@denise)    Open file './doc/simgrid/examples/platforms/g5k.xml'
 > [  0.000000] (1:0@denise)    Unlink file './doc/simgrid/examples/platforms/g5k.xml'
 > [  0.000000] (1:0@denise)    Open file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.003333] (1:0@denise)    Have written 100000 on ./doc/simgrid/examples/platforms/g5k.xml
-> [  0.003333] (1:0@denise)    Close file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.003333] (1:0@denise)  
-> [  0.003333] (1:0@denise) ls ./
-> [  0.003333] (1:0@denise) DIR  : include
-> [  0.003333] (1:0@denise) DIR  : lib
-> [  0.003333] (1:0@denise) DIR  : bin
-> [  0.003333] (1:0@denise) DIR  : doc
-> [  0.003333] (1:0@denise)  
-> [  0.003333] (1:0@denise) ls ./doc/simgrid/examples/platforms/
-> [  0.003333] (1:0@denise) FILE : lcg_sept2004_grid.xml
-> [  0.003333] (1:0@denise) FILE : prop.xml
-> [  0.003333] (1:0@denise) FILE : multicore_machine.xml
-> [  0.003333] (1:0@denise) FILE : g5k.xml
-> [  0.003333] (1:0@denise) FILE : vivaldi.xml
-> [  0.003333] (1:0@denise) FILE : gdx.xml
-> [  0.003333] (1:0@denise) FILE : griffon.xml
-> [  0.003333] (1:0@denise) FILE : Two_clusters.xml
-> [  0.003333] (1:0@denise) FILE : One_cluster_no_backbone.xml
-> [  0.003333] (1:0@denise) FILE : median_harvard.xml
-> [  0.003333] (1:0@denise) FILE : nancy.xml
-> [  0.003333] (1:0@denise) FILE : One_cluster.xml
-> [  0.003333] (1:0@denise) FILE : g5k_cabinets.xml
-> [  0.003333] (1:0@denise) FILE : gridpp_grid_2004.xml
-> [  0.003333] (1:0@denise)  
-> [  0.003333] (1:0@denise) ls ./doc/simgrid/examples/msg/
-> [  0.003333] (1:0@denise) DIR  : parallel_contexts
-> [  0.003333] (1:0@denise) DIR  : alias
-> [  0.003333] (1:0@denise) DIR  : trace
-> [  0.003333] (1:0@denise) FILE : small_platform.xml
-> [  0.003333] (1:0@denise) DIR  : priority
-> [  0.003333] (1:0@denise) DIR  : tracing
-> [  0.003333] (1:0@denise) DIR  : properties
-> [  0.003333] (1:0@denise) FILE : README
-> [  0.003333] (1:0@denise) DIR  : chord
-> [  0.003333] (1:0@denise) DIR  : mc
-> [  0.003333] (1:0@denise) DIR  : gtnets
-> [  0.003333] (1:0@denise) DIR  : suspend
-> [  0.003333] (1:0@denise) FILE : small_platform_with_routers.xml
-> [  0.003333] (1:0@denise) DIR  : pmm
-> [  0.003333] (1:0@denise) FILE : msg_platform.xml
-> [  0.003333] (1:0@denise) DIR  : token_ring
-> [  0.003333] (1:0@denise) DIR  : actions
-> [  0.003333] (1:0@denise) FILE : small_platform_with_failures.xml
-> [  0.003333] (1:0@denise) DIR  : ns3
-> [  0.003333] (1:0@denise) DIR  : sendrecv
-> [  0.003333] (1:0@denise) DIR  : parallel_task
-> [  0.003333] (1:0@denise) DIR  : masterslave
-> [  0.003333] (1:0@denise) DIR  : icomms
-> [  0.003333] (1:0@denise) DIR  : migration
-> [  0.003333] (0:@) Simulation time 0.00333333
\ No newline at end of file
+> [  0.001667] (1:0@denise)    Have written 100000 on ./doc/simgrid/examples/platforms/g5k.xml
+> [  0.001667] (1:0@denise)    Close file './doc/simgrid/examples/platforms/g5k.xml'
+> [  0.001667] (1:0@denise)  
+> [  0.001667] (1:0@denise) ls ./
+> [  0.001667] (1:0@denise) DIR  : include
+> [  0.001667] (1:0@denise) DIR  : lib
+> [  0.001667] (1:0@denise) DIR  : bin
+> [  0.001667] (1:0@denise) DIR  : doc
+> [  0.001667] (1:0@denise)  
+> [  0.001667] (1:0@denise) ls ./doc/simgrid/examples/platforms/
+> [  0.001667] (1:0@denise) FILE : g5k.xml
+> [  0.001667] (1:0@denise)  
+> [  0.001667] (1:0@denise) ls ./doc/simgrid/examples/msg/
+> [  0.001667] (1:0@denise) DIR  : alias
+> [  0.001667] (1:0@denise) DIR  : trace
+> [  0.001667] (1:0@denise) FILE : README
+> [  0.001667] (1:0@denise) DIR  : parallel_task
+> [  0.001667] (1:0@denise) DIR  : icomms
+> [  0.001667] (0:@) Simulation time 0.00166667
\ No newline at end of file
diff --git a/examples/msg/io/storage.c b/examples/msg/io/storage.c
new file mode 100644 (file)
index 0000000..e2778d0
--- /dev/null
@@ -0,0 +1,148 @@
+/* Copyright (c) 2006-2014. 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. */
+
+/********************* Files and Storage handling ****************************
+ * This example implements all main storage and file functions of the MSG API
+ *
+ * Scenario :
+ * - display information on the disks mounted by the current host
+ * - create a 200,000 bytes file
+ * - completely read the created file
+ * - write 100,000 bytes in the file
+ * - rename the created file
+ * - attach some user data to a disk
+ * - dump disk's contents
+ *
+******************************************************************************/
+
+#include "msg/msg.h"
+#include "xbt/log.h"
+#include "xbt/dict.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(storage,"Messages specific for this simulation");
+
+static int host(int argc, char *argv[]){
+  const char* host_name = MSG_host_get_name(MSG_host_self());
+
+  // display information on the disks mounted by the current host
+  XBT_INFO("*** Storage info on %s ***", host_name);
+
+  xbt_dict_cursor_t cursor = NULL;
+  char* mount_name;
+  char* storage_name;
+  msg_storage_t storage;
+
+  // Retrieve all mount points of current host
+  xbt_dict_t storage_list = MSG_host_get_storage_list(MSG_host_self());
+
+  xbt_dict_foreach(storage_list,cursor,mount_name,storage_name)  {
+    // For each disk mounted on host
+    XBT_INFO("Storage name: %s, mount name: %s", storage_name, mount_name);
+    storage = MSG_storage_get_by_name(storage_name);
+
+    // Retrieve disk's information
+    sg_size_t free_size = MSG_storage_get_free_size(mount_name);
+    sg_size_t used_size = MSG_storage_get_used_size(mount_name);
+    sg_size_t size = MSG_storage_get_size(storage);
+
+    XBT_INFO("Total size: %llu bytes", size);
+    XBT_INFO("Free size: %llu bytes", free_size);
+    XBT_INFO("Used size: %llu bytes", used_size);
+  }
+  xbt_dict_free(&storage_list);
+
+
+  // Create a 200,000 bytes file named './tmp/data.txt' on /sd1
+
+  char* mount = xbt_strdup("/home");
+  char* file_name = xbt_strdup("./tmp/data.txt");
+  msg_file_t file = NULL;
+  sg_size_t write, read, file_size;
+
+  // Open an non-existing file amounts to create it!
+  file = MSG_file_open(mount, file_name, NULL);
+  write = MSG_file_write(file, 200000);  // Write 200,000 bytes
+  XBT_INFO("Create a %llu bytes file named '%s' on /sd1", write, file_name);
+  MSG_file_dump(file);
+
+  // check that sizes have changed
+  XBT_INFO("Free size: %llu bytes", MSG_storage_get_free_size("/home"));
+  XBT_INFO("Used size: %llu bytes", MSG_storage_get_used_size("/home"));
+
+
+  // Now retrieve the size of created file and read it completely
+  file_size = MSG_file_get_size(file);
+  read = MSG_file_read(file, file_size);
+  XBT_INFO("Read %llu bytes on %s", read, file_name);
+
+  // Now write 100,000 bytes in tmp/data.txt
+  write = MSG_file_write(file, 100000);  // Write 100,000 bytes
+  XBT_INFO("Write %llu bytes on %s", write, file_name);
+  MSG_file_dump(file);
+
+  MSG_file_close(file);
+  free(mount);
+  free(file_name);
+
+  storage_name = xbt_strdup("Disk4");
+  storage = MSG_storage_get_by_name(storage_name);
+
+  // Now rename file from ./tmp/data.txt to ./tmp/simgrid.readme
+  XBT_INFO("*** Renaming './tmp/data.txt' into './tmp/simgrid.readme'");
+  MSG_storage_file_rename(storage, "./tmp/data.txt", "./tmp/simgrid.readme");
+
+  // Now attach some user data to disk1
+  XBT_INFO("*** Get/set data for storage element: %s ***",storage_name);
+
+  char *data = MSG_storage_get_data(storage);
+
+  XBT_INFO("Get data: '%s'", data);
+
+  MSG_storage_set_data(storage,strdup("Some user data"));
+  data = MSG_storage_get_data(storage);
+  XBT_INFO("Set and get data: '%s'", data);
+  xbt_free(storage_name);
+
+
+  // Dump disks contents
+  XBT_INFO("*** Dump content of %s ***",MSG_host_get_name(MSG_host_self()));
+  xbt_dict_t contents = NULL;
+  contents = MSG_host_get_storage_content(MSG_host_self()); // contents is a dict of dicts
+  xbt_dict_cursor_t curs, curs2 = NULL;
+  char* mountname;
+  xbt_dict_t content;
+  char* path;
+  sg_size_t *size;
+  xbt_dict_foreach(contents, curs, mountname, content){
+    XBT_INFO("Print the content of mount point: %s",mountname);
+    xbt_dict_foreach(content,curs2,path,size){
+       XBT_INFO("%s size: %llu bytes", path,*((sg_size_t*)size));
+    }
+  xbt_dict_free(&content);
+  }
+  xbt_dict_free(&contents);
+  return 1;
+}
+
+
+int main(int argc, char *argv[])
+{
+
+  MSG_init(&argc, argv);
+  MSG_create_environment(argv[1]);
+  MSG_function_register("host", host);
+  xbt_dynar_t hosts =  MSG_hosts_as_dynar();
+  MSG_process_create(NULL, host, NULL, xbt_dynar_get_as(hosts,0,msg_host_t) );
+  xbt_dynar_free(&hosts);
+
+  msg_error_t res = MSG_main();
+  XBT_INFO("Simulated time: %g", MSG_get_clock());
+
+  if (res == MSG_OK)
+    return 0;
+  else
+    return 1;
+}
diff --git a/examples/msg/io/storage.tesh b/examples/msg/io/storage.tesh
new file mode 100644 (file)
index 0000000..3cd10b5
--- /dev/null
@@ -0,0 +1,106 @@
+#! ./tesh
+
+$ ${bindir:=.}/io/storage ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%8.6r]%e(%i@%h)%e%m%n"
+> [0.000000] (1@denise) *** Storage info on denise ***
+> [0.000000] (1@denise) Storage name: Disk4, mount name: /home
+> [0.000000] (1@denise) Total size: 536870912000 bytes
+> [0.000000] (1@denise) Free size: 536857690006 bytes
+> [0.000000] (1@denise) Used size: 13221994 bytes
+> [0.000000] (1@denise) Storage name: Disk2, mount name: /windows
+> [0.000000] (1@denise) Total size: 536870912000 bytes
+> [0.000000] (1@denise) Free size: 534479374867 bytes
+> [0.000000] (1@denise) Used size: 2391537133 bytes
+> [0.003333] (1@denise) Create a 200000 bytes file named './tmp/data.txt' on /sd1
+> [0.003333] (1@denise) File Descriptor information:
+>              Full name: './tmp/data.txt'
+>              Size: 200000
+>              Mount point: '/home'
+>              Storage Id: 'Disk4'
+>              Storage Type: 'single_SSD'
+>              Content Type: 'txt_unix'
+> [0.003333] (1@denise) Free size: 536857490006 bytes
+> [0.003333] (1@denise) Used size: 13421994 bytes
+> [0.004583] (1@denise) Read 200000 bytes on ./tmp/data.txt
+> [0.007917] (1@denise) Write 100000 bytes on ./tmp/data.txt
+> [0.007917] (1@denise) File Descriptor information:
+>              Full name: './tmp/data.txt'
+>              Size: 300000
+>              Mount point: '/home'
+>              Storage Id: 'Disk4'
+>              Storage Type: 'single_SSD'
+>              Content Type: 'txt_unix'
+> [0.007917] (1@denise) *** Renaming './tmp/data.txt' into './tmp/simgrid.readme'
+> [0.007917] (1@denise) *** Get/set data for storage element: Disk4 ***
+> [0.007917] (1@denise) Get data: '(null)'
+> [0.007917] (1@denise) Set and get data: 'Some user data'
+> [0.007917] (1@denise) *** Dump content of denise ***
+> [0.007917] (1@denise) Print the content of mount point: /home
+> [0.007917] (1@denise) ./doc/simgrid/examples/platforms/g5k.xml size: 17028 bytes
+> [0.007917] (1@denise) ./include/surf/simgrid_dtd.h size: 23583 bytes
+> [0.007917] (1@denise) ./bin/smpicc size: 918 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/mc_bugged2.c size: 1387 bytes
+> [0.007917] (1@denise) ./include/simdag/simdag.h size: 10325 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/sys/README size: 1461 bytes
+> [0.007917] (1@denise) ./tmp/simgrid.readme size: 300000 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/common/randdp.c size: 1441 bytes
+> [0.007917] (1@denise) ./include/msg/datatypes.h size: 4635 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/EP/randlc.c size: 3300 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml size: 654 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/msg/icomms/small_platform.xml size: 972 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/msg/trace/test9.xml size: 598 bytes
+> [0.007917] (1@denise) ./include/simix/simix.h size: 13003 bytes
+> [0.007917] (1@denise) ./include/mc/modelchecker.h size: 96 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/msg/README size: 4805 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/README size: 1857 bytes
+> [0.007917] (1@denise) ./include/instr/instr.h size: 5750 bytes
+> [0.007917] (1@denise) ./doc/simgrid/html/group__XBT__str.html size: 36192 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/EP/README size: 347 bytes
+> [0.007917] (1@denise) ./bin/tesh size: 356434 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/DT/README size: 999 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/FT/README size: 276 bytes
+> [0.007917] (1@denise) ./lib/libsimgrid.so.3.6.2 size: 12710497 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/xbt/sem_basic.c size: 1970 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c size: 6217 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/SP/README size: 926 bytes
+> [0.007917] (1@denise) ./include/xbt/fifo.h size: 3626 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/MPI_dummy/README size: 2406 bytes
+> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/MG/README size: 5465 bytes
+> [0.007917] (1@denise) ./include/smpi/mpif.h size: 4826 bytes
+> [0.007917] (1@denise) Print the content of mount point: /windows
+> [0.007917] (1@denise) .\Windows\dcmdev64.exe size: 93288 bytes
+> [0.007917] (1@denise) .\Windows\WLXPGSS.SCR size: 322048 bytes
+> [0.007917] (1@denise) .\Windows\twain_32.dll size: 50176 bytes
+> [0.007917] (1@denise) .\Windows\bootstat.dat size: 67584 bytes
+> [0.007917] (1@denise) .\Windows\avastSS.scr size: 41664 bytes
+> [0.007917] (1@denise) .\Windows\font1.sii size: 4907 bytes
+> [0.007917] (1@denise) .\Windows\write.exe size: 10752 bytes
+> [0.007917] (1@denise) .\Windows\font2.sii size: 8698 bytes
+> [0.007917] (1@denise) .\Windows\DtcInstall.log size: 1955 bytes
+> [0.007917] (1@denise) .\Windows\vmgcoinstall.log size: 1585 bytes
+> [0.007917] (1@denise) .\Windows\_isusr32.dll size: 180320 bytes
+> [0.007917] (1@denise) .\Windows\winhlp32.exe size: 10752 bytes
+> [0.007917] (1@denise) .\Windows\setuperr.log size: 0 bytes
+> [0.007917] (1@denise) .\Windows\system.ini size: 219 bytes
+> [0.007917] (1@denise) .\Windows\hapint.exe size: 382056 bytes
+> [0.007917] (1@denise) .\Windows\Professional.xml size: 31881 bytes
+> [0.007917] (1@denise) .\Windows\setupact.log size: 101663 bytes
+> [0.007917] (1@denise) .\Windows\notepad.exe size: 243712 bytes
+> [0.007917] (1@denise) .\Windows\explorer.exe size: 2380944 bytes
+> [0.007917] (1@denise) .\Windows\bfsvc.exe size: 75264 bytes
+> [0.007917] (1@denise) .\Windows\WMSysPr9.prx size: 316640 bytes
+> [0.007917] (1@denise) .\Windows\PFRO.log size: 6770 bytes
+> [0.007917] (1@denise) .\Windows\csup.txt size: 12 bytes
+> [0.007917] (1@denise) .\Windows\win.ini size: 92 bytes
+> [0.007917] (1@denise) .\Windows\mib.bin size: 43131 bytes
+> [0.007917] (1@denise) .\Windows\Starter.xml size: 31537 bytes
+> [0.007917] (1@denise) .\Windows\CoreSingleLanguage.xml size: 31497 bytes
+> [0.007917] (1@denise) .\Windows\regedit.exe size: 159232 bytes
+> [0.007917] (1@denise) .\Windows\dchcfg64.exe size: 335464 bytes
+> [0.007917] (1@denise) .\Windows\HelpPane.exe size: 883712 bytes
+> [0.007917] (1@denise) .\Windows\WindowsUpdate.log size: 1518934 bytes
+> [0.007917] (1@denise) .\Windows\hh.exe size: 17408 bytes
+> [0.007917] (1@denise) .\Windows\DPINST.LOG size: 18944 bytes
+> [0.007917] (1@denise) .\Windows\DirectX.log size: 10486 bytes
+> [0.007917] (1@denise) .\Windows\splwow64.exe size: 126464 bytes
+> [0.007917] (1@denise) .\Windows\MEMORY.DMP size: 2384027342 bytes
+> [0.007917] (0@) Simulated time: 0.00791667
index 1475d1c..ee1082b 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "answer.h"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(msg_kademlia_node);
index a0cea3e..24902dd 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #ifndef _KADEMLIA_EXAMPLES_ANSWER_H_
 #define _KADEMLIA_EXAMPLES_ANSWER_H_
 #include <xbt/dynar.h>
index 5e743be..14770e2 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #ifndef _KADEMLIA_EXAMPLES_COMMON
 #define _KADEMLIA_EXAMPLES_COMMON
 #define max_join_trials 4
index 19b483e..b475120 100755 (executable)
@@ -1,5 +1,11 @@
 #!/usr/bin/python
 
+# Copyright (c) 2012, 2014. 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.
+
 import sys, random
 
 if len(sys.argv) != 4:
index 0173515..5f9bb6a 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "kademlia.h"
 #include "node.h"
 #include "task.h"
index 142a7c0..1fce788 100644 (file)
@@ -1,9 +1,9 @@
-
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #ifndef _MSG_EXAMPLES_KADEMLIA_H
 #define _MSG_EXAMPLES_KADEMLIA_H
 #include "node.h"
index 5cdc918..574afbe 100644 (file)
@@ -1,5 +1,4 @@
-
-/* Copyright (c) 2010, 2012. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 2db9a51..e93549b 100644 (file)
@@ -1,5 +1,4 @@
-
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 4587f28..3d1fcb1 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "routing_table.h"
 #include "node.h"
 #include "msg/msg.h"
index df34fa5..6baa1cf 100644 (file)
@@ -1,5 +1,4 @@
-
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 770cd62..5268482 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "task.h"
 #include "answer.h"
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_kademlia_task,
index e116282..4924549 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #ifndef _MSG_KADEMLIA_EXAMPLES_TASK
 #define _MSG_KADEMLIA_EXAMPLES_TASK
 #include "common.h"
index fd97d2a..7bf9f87 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 35e3d93..2a4148f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 74a7493..085d574 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 867c729..90ffa87 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 1764ba0..ee179e5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 643ca79..7aa8861 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 6473646..22d18ff 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2009-2012. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 76dad72..b9f8af6 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 9d8f3cd..11d3c2f 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2012-2014. 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/platf_generator.h"
 #include "xbt.h"
index a8f62e7..62539cd 100644 (file)
@@ -1,10 +1,9 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
 
-
 /******************** Non-deterministic message ordering  *********************/
 /* Server assumes a fixed order in the reception of messages from its clients */
 /* which is incorrect because the message ordering is non-deterministic       */
index bcebdf8..504b90e 100644 (file)
@@ -24,16 +24,16 @@ $ ${bindir:=.}/bugged1 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%
 > [  0.000000] (1:server@HostA) *** PROPERTY NOT VALID ***
 > [  0.000000] (1:server@HostA) **************************
 > [  0.000000] (1:server@HostA) Counter-example execution trace:
-> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv(dst=(1)HostA (server), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (1:server@HostA) [(2)HostB (client)] iSend(src=(2)HostB (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait(comm=(verbose only) [(2)HostB (client)-> (1)HostA (server)]) (62)
-> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv(dst=(1)HostA (server), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (1:server@HostA) [(2)HostB (client)] Wait(comm=(verbose only) [(2)HostB (client)-> (1)HostA (server)]) (62)
-> [  0.000000] (1:server@HostA) [(4)HostD (client)] iSend(src=(4)HostD (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait(comm=(verbose only) [(4)HostD (client)-> (1)HostA (server)]) (62)
-> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv(dst=(1)HostA (server), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (1:server@HostA) [(3)HostC (client)] iSend(src=(3)HostC (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait(comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)]) (62)
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv(dst=(1)HostA (server), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(2)HostB (client)] iSend(src=(2)HostB (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait(comm=(verbose only) [(2)HostB (client)-> (1)HostA (server)])
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv(dst=(1)HostA (server), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(2)HostB (client)] Wait(comm=(verbose only) [(2)HostB (client)-> (1)HostA (server)])
+> [  0.000000] (1:server@HostA) [(4)HostD (client)] iSend(src=(4)HostD (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait(comm=(verbose only) [(4)HostD (client)-> (1)HostA (server)])
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv(dst=(1)HostA (server), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(3)HostC (client)] iSend(src=(3)HostC (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait(comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)])
 > [  0.000000] (1:server@HostA) Expanded states = 22
 > [  0.000000] (1:server@HostA) Visited states = 56
 > [  0.000000] (1:server@HostA) Executed transitions = 52
index b6949dd..09d3746 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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. */
+
 /***************** Centralized Mutual Exclusion Algorithm *********************/
 /* This example implements a centralized mutual exclusion algorithm.          */
 /* Bug : CS requests of client 1 not satisfied                                      */
index 6ca2dfc..7246422 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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 _BUGGED1_LIVENESS_H
 #define _BUGGED1_LIVENESS_H
 
index 63bee18..fd34555 100644 (file)
@@ -2,7 +2,7 @@
 
 ! expect signal SIGABRT
 ! timeout 20
-$ ${bindir:=.}/bugged1_liveness ${bindir:=.}/../msg_platform.xml ${bindir:=.}/deploy_bugged1_liveness.xml --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=contexts/factory:ucontext
+$ ${bindir:=.}/bugged1_liveness ${srcdir:=.}/../msg_platform.xml ${srcdir:=.}/deploy_bugged1_liveness.xml --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=contexts/factory:ucontext
 > [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
 > [  0.000000] (0:@) Check the liveness property promela_bugged1_liveness
 > [  0.000000] (0:@) Get debug information ...
@@ -20,26 +20,26 @@ $ ${bindir:=.}/bugged1_liveness ${bindir:=.}/../msg_platform.xml ${bindir:=.}/de
 > [  0.000000] (0:@) |             ACCEPTANCE CYCLE            |
 > [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
 > [  0.000000] (0:@) Counter-example that violates formula :
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(3)Fafard (client)] iRecv(dst=(3)Fafard (client), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (3)Fafard (client)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (3)Fafard (client)]) (62)
-> [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(3)Fafard (client)] iRecv(dst=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (3)Fafard (client)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (3)Fafard (client)])
+> [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
 > [  0.000000] (0:@) Expanded pairs = 21
 > [  0.000000] (0:@) Visited pairs = 21
 > [  0.000000] (0:@) Executed transitions = 20
index 2537720..f117bb4 100644 (file)
@@ -2,7 +2,7 @@
 
 ! expect signal SIGABRT
 ! timeout 90
-$ ${bindir:=.}/bugged1_liveness ${bindir:=.}/../msg_platform.xml ${bindir:=.}/deploy_bugged1_liveness_visited.xml --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=contexts/factory:ucontext --cfg=model-check/visited:100
+$ ${bindir:=.}/bugged1_liveness ${srcdir:=.}/../msg_platform.xml ${srcdir:=.}/deploy_bugged1_liveness_visited.xml --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" --cfg=contexts/factory:ucontext --cfg=model-check/visited:100
 > [  0.000000] (0:@) Configuration change: Set 'model-check' to '1'
 > [  0.000000] (0:@) Configuration change: Set 'model-check/visited' to '100'
 > [  0.000000] (0:@) Check the liveness property promela_bugged1_liveness
@@ -78,56 +78,56 @@ $ ${bindir:=.}/bugged1_liveness ${bindir:=.}/../msg_platform.xml ${bindir:=.}/de
 > [  0.000000] (0:@) |             ACCEPTANCE CYCLE            |
 > [  0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
 > [  0.000000] (0:@) Counter-example that violates formula :
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
-> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
-> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
-> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62)
-> [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
-> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62)
-> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54)
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)Fafard (client)] iSend(src=(3)Fafard (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+> [  0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only))
+> [  0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)])
+> [  0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only))
 > [  0.000000] (0:@) Expanded pairs = 57
 > [  0.000000] (0:@) Visited pairs = 208
 > [  0.000000] (0:@) Executed transitions = 207
index 528dd1b..5d0e375 100644 (file)
@@ -1,10 +1,9 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
 
-
 /******************** Non-deterministic message ordering  *********************/
 /* Server assumes a fixed order in the reception of messages from its clients */
 /* which is incorrect because the message ordering is non-deterministic       */
index df06aaf..3d65e67 100644 (file)
@@ -889,13 +889,13 @@ $ ${bindir:=.}/bugged2 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%
 > [  0.000000] (1:server@HostA) *** PROPERTY NOT VALID ***
 > [  0.000000] (1:server@HostA) **************************
 > [  0.000000] (1:server@HostA) Counter-example execution trace:
-> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv(dst=(1)HostA (server), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (1:server@HostA) [(3)HostC (client)] iSend(src=(3)HostC (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait(comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)]) (62)
-> [  0.000000] (1:server@HostA) [(3)HostC (client)] Wait(comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)]) (62)
-> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv(dst=(1)HostA (server), buff=(verbose only), size=(verbose only)) (56)
-> [  0.000000] (1:server@HostA) [(3)HostC (client)] iSend(src=(3)HostC (client), buff=(verbose only), size=(verbose only)) (54)
-> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait(comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)]) (62)
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv(dst=(1)HostA (server), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(3)HostC (client)] iSend(src=(3)HostC (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait(comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)])
+> [  0.000000] (1:server@HostA) [(3)HostC (client)] Wait(comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)])
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] iRecv(dst=(1)HostA (server), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(3)HostC (client)] iSend(src=(3)HostC (client), buff=(verbose only), size=(verbose only))
+> [  0.000000] (1:server@HostA) [(1)HostA (server)] Wait(comm=(verbose only) [(3)HostC (client)-> (1)HostA (server)])
 > [  0.000000] (1:server@HostA) Expanded states = 461
 > [  0.000000] (1:server@HostA) Visited states = 2271
 > [  0.000000] (1:server@HostA) Executed transitions = 2117
index 26f2b31..d6beac0 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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. */
+
 /***************************** Bugged2 ****************************************/
 /* This example implements a centralized mutual exclusion algorithm.          */
 /* One client stay always in critical section                                 */
index b44121e..ec62e31 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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 _BUGGED2_LIVENESS_H
 #define _BUGGED2_LIVENESS_H
 
index 91d00c1..5f949c0 100644 (file)
@@ -1,10 +1,9 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
 
-
 /**************** Shared buffer between asynchronous receives *****************/
 /* Server process assumes that the data from the second communication comm2   */
 /* will overwrite the one from the first communication, because of the order  */
index 3403c88..d7231e1 100644 (file)
@@ -1,10 +1,9 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
 
-
 /***************** Centralized Mutual Exclusion Algorithm *********************/
 /* This example implements a centralized mutual exclusion algorithm.          */
 /* There is no bug on it, it is just provided to test the state space         */
index cfe23b7..0e03141 100644 (file)
@@ -1,10 +1,9 @@
-/* Copyright (c) 2013. The SimGrid Team.
+/* Copyright (c) 2013-2014. 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. */
 
-
 /******************** Non-deterministic message ordering  *********************/
 /* This example implements one process which receives messages from two other */
 /* processes. There is no bug on it, it is just provided to test the soundness*/ 
index 898682f..2319598 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d1ffeee..31ef941 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index cb26e47..52094b2 100644 (file)
@@ -29,11 +29,11 @@ p One cluster
 $ ns3/ns3 ${srcdir:=.}/examples/platforms/cluster.xml ${srcdir:=.}/examples/msg/ns3/One_cluster-d.xml --cfg=network/model:NS3
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/model' to 'NS3'
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
-> [c-6.me:slave:(2) 0.006614] [msg_test/INFO] FLOW[1] : Receive 100 bytes from c-2.me to c-6.me
+> [c-6.me:slave:(2) 0.006755] [msg_test/INFO] FLOW[1] : Receive 100 bytes from c-2.me to c-6.me
 
 p Two clusters
 
 $ ns3/ns3 ${srcdir:=.}/examples/platforms/clusters_routing_full.xml ${srcdir:=.}/examples/msg/ns3/Two_clusters-d.xml --cfg=network/model:NS3
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/model' to 'NS3'
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
-> [c-16.me:slave:(2) 0.012453] [msg_test/INFO] FLOW[1] : Receive 100 bytes from c-3.me to c-16.me
+> [c-16.me:slave:(2) 0.012729] [msg_test/INFO] FLOW[1] : Receive 100 bytes from c-3.me to c-16.me
index 5b25179..a3dda64 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 0e26463..8626a98 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2012. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index cbcfcd5..45300c7 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 <math.h>
 #include "msg/msg.h"
index 1acf31c..59d9e1b 100644 (file)
@@ -1,10 +1,11 @@
 /* pmm - parallel matrix multiplication "double diffusion"                  */
 
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. 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 "xbt/matrix.h"
 #include "xbt/log.h"
index 3940a08..43258dd 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 368a09d..e660024 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index b66b1d3..cc10147 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "msg/msg.h"
index 1f74408..0656eb2 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index fc03c40..72ce30c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 5edb0af..1ce043b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2009-2012. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 9a7de6e..dd6107f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2012. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 2091603..44a1c7d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2008-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 170145e..908624d 100644 (file)
@@ -25,7 +25,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/token_ring ${srcdir:=.}/examples/platforms/two_pee
 > [    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
+$ $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.030364] (2:1@host-2.cluster2) Host "1" received "Token"
index d0dadbd..238e8ef 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 63a19e9..f9c4c22 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index c975460..1ee390d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d9a713f..aed734e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index c81c26a..1c832b7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index cb25e32..6f9e686 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 094c657..026524f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 5017fc0..4b585c3 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 5b021e2..7e5369a 100644 (file)
@@ -1,4 +1,11 @@
 #!/usr/bin/perl -w
+
+# Copyright (c) 2011, 2014. 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.
+
 use strict;
 
 if($#ARGV!=0) {
diff --git a/examples/platforms/content/small_content.txt b/examples/platforms/content/small_content.txt
new file mode 100644 (file)
index 0000000..41bab56
--- /dev/null
@@ -0,0 +1,30 @@
+./doc/simgrid/examples/platforms/g5k.xml  17028
+./doc/simgrid/examples/smpi/mc_bugged2.c  1387
+./doc/simgrid/examples/smpi/NAS/README  1857
+./doc/simgrid/examples/smpi/NAS/MPI_dummy/README 2406
+./doc/simgrid/examples/smpi/NAS/common/randdp.c 1441
+./doc/simgrid/examples/smpi/NAS/sys/README  1461
+./doc/simgrid/examples/smpi/NAS/SP/README  926
+./doc/simgrid/examples/smpi/NAS/FT/README  276
+./doc/simgrid/examples/smpi/NAS/DT/README  999
+./doc/simgrid/examples/smpi/NAS/EP/README  347
+./doc/simgrid/examples/smpi/NAS/EP/randlc.c  3300
+./doc/simgrid/examples/smpi/NAS/MG/README  5465
+./doc/simgrid/examples/xbt/sem_basic.c  1970
+./doc/simgrid/examples/msg/README  4805
+./doc/simgrid/examples/msg/icomms/small_platform.xml 972
+./doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml  654
+./doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c  6217
+./doc/simgrid/examples/msg/trace/test9.xml  598
+./doc/simgrid/html/group__XBT__str.html  36192
+./include/smpi/mpif.h  4826
+./include/xbt/fifo.h  3626
+./include/msg/datatypes.h 4635
+./include/mc/modelchecker.h  96
+./include/surf/simgrid_dtd.h  23583
+./include/instr/instr.h  5750
+./include/simdag/simdag.h  10325
+./include/simix/simix.h  13003
+./lib/libsimgrid.so.3.6.2  12710497
+./bin/smpicc  918
+./bin/tesh  356434
\ No newline at end of file
index 61384e5..33877a1 100755 (executable)
@@ -1,6 +1,11 @@
 #! /usr/bin/perl
 
-# L.Bobelin (Perl newbie) 25th of November
+# Copyright (c) 2011-2012, 2014. 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.
+
 # Quick script to generate hierarchical clusters. Usage : <the script> p s d  where :
 # - p : 2^p gives the total number of hosts.
 # - s : cluster size
index 1acf037..654f604 100755 (executable)
@@ -1,6 +1,11 @@
 #! /usr/bin/perl
 
-# L.Bobelin (Perl newbie) 24th of November
+# Copyright (c) 2011-2012, 2014. 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.
+
 # Quick script to generate hierarchical clusters. Usage : add the special cluster tag (description below) in your "normal" platform file. Then run the script :
 # - First arg : the input file where you midified your cluster tag
 # - Second one : the output file where all the stuff will be generated.
index a69de09..023ffac 100755 (executable)
@@ -1,4 +1,11 @@
 #!/usr/bin/perl -w
+
+# Copyright (c) 2011, 2014. 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.
+
 use strict;
 use Switch;
 my $toversion=3;
index ac90840..2205650 100755 (executable)
@@ -1,4 +1,11 @@
 #!/usr/bin/perl -w
+
+# Copyright (c) 2011, 2014. 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.
+
 use strict;
 use Switch;
 
index 84310bd..7f755de 100644 (file)
    <storage_type id="single_HDD" model="linear_no_lat" 
                  content="content/storage_content.txt" size="500GiB"
                  content_type="txt_unix">
-                       <prop id="Bwrite" value="30MBps" />
-                       <prop id="Bread" value="100MBps" />
-                       <prop id="Bconnection" value="150MBps" />
+      <model_prop id="Bwrite" value="30MBps" />
+      <model_prop id="Bread" value="100MBps" />
+      <model_prop id="Bconnection" value="120MBps" />
    </storage_type>
 
-   <storage_type id="single_SSD" model="linear_no_lat"
-                 content="content/storage_content.txt" size="500GiB">
-                       <prop id="Bwrite" value="30MBps" />
-                       <prop id="Bread" value="100MBps" />
-                       <prop id="Bconnection" value="150MBps" />
-               </storage_type>
-
-               <storage id="Disk1" typeId="single_HDD"/>
-               <storage id="Disk2" typeId="single_SSD"/>
-               <storage id="Disk3" typeId="single_HDD"
-                         content="content/storage_content.txt" 
-                        content_type="txt_unix"/>
-               <storage id="Disk4" typeId="single_SSD"/>
-
-               <host id="bob" power="1Gf">
-                       <mount storageId="Disk1" name="/home"/>                 
-               </host>         
-               
-               <host id="alice" power="1Gf">
-                       <mount storageId="Disk2" name="/home"/>
-               </host>
-
-               <host id="carl" power="1Gf">            
-                       <mount storageId="Disk3" name="/home"/>         
-               </host>
-               
-               <host id="denise" power="1Gf">
-                       <mount storageId="Disk4" name="/home"/> 
-               </host>
-
-               <link id="link1" bandwidth="125MBps" latency="50us" />
-               <link id="link2" bandwidth="125MBps" latency="50us" />
-               <link id="link3" bandwidth="125MBps" latency="50us" />
-       
-               <route src="bob" dst="alice" symmetrical="YES">
-                       <link_ctn id="link1" />
-                       <link_ctn id="link2" />
-                       <link_ctn id="link3" />
-               </route>        
-
-       </AS>
+   <storage_type id="single_SSD" model="linear_no_lat" size="500GiB">
+      <model_prop id="Bwrite" value="60MBps" />
+      <model_prop id="Bread" value="200MBps" />
+      <model_prop id="Bconnection" value="220MBps" />
+   </storage_type>
+
+    <storage id="Disk1" typeId="single_HDD" />
+    <storage id="Disk2" typeId="single_SSD"
+             content="content/win_storage_content.txt"
+             content_type="txt_windows" />
+    <storage id="Disk3" typeId="single_HDD" />
+    <storage id="Disk4" typeId="single_SSD"
+             content="content/small_content.txt"
+             content_type="txt_unix" />
+
+    <host id="bob" power="1Gf">
+      <mount storageId="Disk1" name="/home"/>
+    </host>
+
+    <host id="alice" power="1Gf">
+      <mount storageId="Disk2" name="/windows"/>
+    </host>
+
+    <host id="carl" power="1Gf">
+      <mount storageId="Disk3" name="/home"/>
+    </host>
+
+    <host id="denise" power="1Gf">
+      <mount storageId="Disk2" name="/windows"/>       
+      <mount storageId="Disk4" name="/home"/>  
+    </host>
+
+    <link id="link1" bandwidth="125MBps" latency="50us" />
+    <link id="link2" bandwidth="125MBps" latency="50us" />
+    <link id="link3" bandwidth="125MBps" latency="50us" />
+
+    <route src="bob" dst="alice" symmetrical="YES">
+      <link_ctn id="link1" />
+      <link_ctn id="link2" />
+      <link_ctn id="link3" />
+    </route>
+  </AS>
 </platform>
index 659ae83..a01bceb 100755 (executable)
@@ -1,4 +1,11 @@
 #!/usr/bin/perl -w
+
+# Copyright (c) 2011, 2014. 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.
+
 use strict;
 
 my $toversion=3;
diff --git a/examples/platforms/torus_cluster.xml b/examples/platforms/torus_cluster.xml
new file mode 100644 (file)
index 0000000..3ec3036
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+<AS id="AS0" routing="Full">
+  <cluster id="bob_cluster" prefix="bob" suffix=".hamburger.edu"
+   radical="0-11" power="1Gf" bw="125MBps" lat="50us" topology="TORUS" topo_parameters="3,2,2" 
+   loopback_bw="100000000" loopback_lat="0"/>
+</AS>
+</platform>
index ee1d207..81be5cf 100644 (file)
@@ -3,6 +3,7 @@
 ! output sort
 
 $ java -classpath ${classpath:=.} masterslave/Masterslave ${srcdir:=.}/platform.xml ${srcdir:=.}/masterslave/masterslaveDeployment.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (0:@) Using regular java threads. Coroutines could speed your simulation up.
 > [  0.000000] (1:masterslave.Master@Jacquelin) Hello! Got 7 slaves and 5 tasks to process
 > [  0.000000] (2:masterslave.Forwarder@Jackson) Receiving on 'slave_0'
 > [  0.000000] (3:masterslave.Forwarder@Casavant) Receiving on 'slave_1'
@@ -29,4 +30,3 @@ $ java -classpath ${classpath:=.} masterslave/Masterslave ${srcdir:=.}/platform.
 > [ 17.251680] (0:@) MSG_main finished; Cleaning up the simulation...
 > [ 17.251680] (1:masterslave.Master@Jacquelin) Goodbye now!
 > [ 17.251680] (8:masterslave.Slave@Browne) Received Finalize. I'm done. See you!
-> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up.
index 99ec01e..d33f9f8 100644 (file)
@@ -1,6 +1,6 @@
 /* simple test trying to load a DAX file.                                   */
 
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index ba0bcd9..aafcab1 100755 (executable)
@@ -1,5 +1,11 @@
 #! /usr/bin/perl
 
+# Copyright (c) 2009, 2014. 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.
+
 use strict;
 
 my $node_count = int($ARGV[0]) || die "Usage: $0 node_count level_count\n";
index 0166b14..ec59f83 100755 (executable)
@@ -1,5 +1,11 @@
 #! /usr/bin/perl
 
+# Copyright (c) 2009, 2014. 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.
+
 use strict;
 
 sub job {
index e586334..6f62578 100644 (file)
@@ -1,6 +1,6 @@
 /* simple test trying to load a DOT file.                                   */
 
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index ea5a4c7..d065aad 100644 (file)
@@ -1,6 +1,6 @@
 /* simple test trying to load a DOT file.                                   */
 
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index f206fff..cdaf555 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013. The SimGrid Team.
+/* Copyright (c) 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 880fe56..e16cb56 100644 (file)
@@ -1,6 +1,6 @@
 /* simple test trying to load a DOT file.                                   */
 
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3991256..fa2251f 100644 (file)
@@ -1,16 +1,16 @@
 /* Example of scatter communication, accepting a large amount of processes. 
  * This based the experiment of Fig. 4 in http://hal.inria.fr/hal-00650233/
  * That experiment is a comparison to the LogOPSim simulator, that takes 
- *  GOAL files as an input, thus the file name. But there is no actual link
- *  to the GOAL formalism beside of this.
- * 
- * Copyright (c) 2011-2013. 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.
+ * GOAL files as an input, thus the file name. But there is no actual link
+ * to the GOAL formalism beside of this.
  */
 
+/* Copyright (c) 2011-2014. 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 <stdio.h>
 #include "simdag/simdag.h"
index 201b147..928bd2e 100644 (file)
@@ -2,6 +2,7 @@
 
 $ ${bindir:=.}/io/sd_io ${srcdir:=.}/examples/platforms/storage.xml 
 > [0.000000] [sd_io/INFO] Workstation 'denise' mounts '/home'
-> [0.000000] [sd_io/INFO] Workstation 'alice' mounts '/home'
+> [0.000000] [sd_io/INFO] Workstation 'denise' mounts '/windows'
+> [0.000000] [sd_io/INFO] Workstation 'alice' mounts '/windows'
 > [0.000000] [sd_io/INFO] Workstation 'carl' mounts '/home'
 > [0.000000] [sd_io/INFO] Workstation 'bob' mounts '/home'
index 5d30703..9d62bc6 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013. The SimGrid Team.
+/* Copyright (c) 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 17947d7..d126b9d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index b60cfba..f72f9b3 100644 (file)
@@ -1,3 +1,9 @@
+-- Copyright (c) 2010-2011, 2014. 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.
+
 require "simgrid"
 
   simgrid.AS.new{id="AS0",mode="Full"};
index 88bfb7d..5736762 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 97947d0..8790718 100644 (file)
@@ -1,6 +1,6 @@
 /* simple test to schedule a DAX file with the Min-Min algorithm.           */
 
-/* Copyright (c) 2009-2012. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 4e75195..51eec52 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 1364f6e..b43af37 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2006-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 0338b0a..eb1fd82 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2006-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index a35b80a..e4cb0e6 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index bd98080..f3e1d5d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2012. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3eff0d3..781a7d4 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index f262166..c64bacb 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2006-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 737f84a..b93f1a2 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 686b26e..d6e3291 100644 (file)
@@ -1,4 +1,11 @@
 #! @BASH@ -e
+
+# Copyright (c) 2006, 2014. 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.
+
 if [ x@EXEEXT@ = x ] ; then 
   exenv=$SG_TEST_EXENV
 else
index c83548e..041342e 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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. */
+
 /*!
  * 2.5D Block Matrix Multiplication example
  *
index 6a92c33..3415d6b 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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 <mpi.h>
 double two_dot_five(
                     size_t m, size_t k, size_t n,
index d112cde..871f83e 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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. */
+
 /*
  * Block Matrix Multiplication example
  *
index 7492f43..fe56602 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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 "Matrix_init.h"
 #include <math.h>
 #include <stdio.h>
index a4c04d0..223f712 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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>
 //#undef CYCLIC
 #define CYCLIC
index b2fb9aa..cb51445 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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. */
+
 /*!
  * Classical Block Matrix Multiplication example
  *
index ef0dccc..c0ce248 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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 <mpi.h>
 double Summa(
                      double *a, double *b, double *c,
index 3ae635e..daea198 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index aac0673..c77fdd9 100644 (file)
@@ -1,9 +1,10 @@
 p Test smpi bindings for dvfs functions (C example)
-$ ../../../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platform ${srcdir:=.}/platform.xml --cfg=smpi/cpu_threshold:-1 ${bindir:=.}/se
+$ ../../../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platform ${srcdir:=.}/platform.xml --cfg=smpi/cpu_threshold:-1 ${bindir:=.}/se --cfg=plugin:Energy --log=smpi_kernel.thres:warning
 > [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.000000] [xbt_cfg/INFO] Configuration change: Set 'smpi/cpu_threshold' to '-1'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'plugin' to 'Energy'
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
 > [0.000000] [rank 1] Pstates: 1; Powers: 100000000
 > [0.000000] [rank 0] Pstates: 3; Powers: 100000000, 50000000, 20000000
@@ -15,3 +16,5 @@ $ ../../../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platf
 > [30.000000] [rank 0] Energy consumed: 5400 Joules.
 > [30.000000] [rank 0] Current pstate: 2; Current power: 20000000
 > [80.000000] [rank 0] Energy consumed: 12900 Joules.
+> [80.000000] [surf_energy/INFO] Total energy (Joules) of host MyHost1: 12900.000000
+> [80.000000] [surf_energy/INFO] Total energy (Joules) of host MyHost2: 2000.000000
index 86ceca6..c23f3f8 100644 (file)
@@ -1,21 +1,25 @@
 p Test smpi bindings for dvfs functions (Fortran 77 example)
-$ ../../../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platform ${srcdir:=.}/platform.xml --cfg=smpi/cpu_threshold:-1 ${bindir:=.}/f77/sef
+! output sort 1
+$ ../../../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platform ${srcdir:=.}/platform.xml --cfg=smpi/cpu_threshold:-1 ${bindir:=.}/f77/sef --cfg=plugin:Energy --log=smpi_kernel.thres:warning
 > [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.000000] [xbt_cfg/INFO] Configuration change: Set 'smpi/cpu_threshold' to '-1'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'plugin' to 'Energy'
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
->  [  0.] [rank  0] 3pstates available
->  [  0.] [rank  1] 1pstates available
+> [80.000000] [surf_energy/INFO] Total energy (Joules) of host MyHost1: 12900.000000
+> [80.000000] [surf_energy/INFO] Total energy (Joules) of host MyHost2: 2000.000000
+>  [  0.] [rank  0] 3 pstates available
+>  [  0.] [rank  1] 1 pstates available
 >  [  0.] [rank  0] Power:   100000000.
 >  [  0.] [rank  1] Power:   100000000.
 >  [  0.] [rank  0] Power:   50000000.
 >  [  0.] [rank  0] Power:   20000000.
 >  [  0.] [rank  1] Current pstate:  0; Current power:   100000000.
 >  [  0.] [rank  0] Current pstate:  0; Current power:   100000000.
->  [  10.] [rank  1]Energy consumed (Joules):   2000.
->  [  10.] [rank  0]Energy consumed (Joules):   2000.
+>  [  10.] [rank  1] Energy consumed (Joules):   2000.
+>  [  10.] [rank  0] Energy consumed (Joules):   2000.
 >  [  10.] [rank  0] Current pstate:  1; Current power:   50000000.
->  [  30.] [rank  0]Energy consumed (Joules):   5400.
+>  [  30.] [rank  0] Energy consumed (Joules):   5400.
 >  [  30.] [rank  0] Current pstate:  2; Current power:   20000000.
->  [  80.] [rank  0]Energy consumed (Joules):   12900.
+>  [  80.] [rank  0] Energy consumed (Joules):   12900.
index a1588be..51a6ea2 100644 (file)
@@ -1,3 +1,9 @@
+! Copyright (c) 2013-2014. 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.
+
       program main
       include 'mpif.h'
 
@@ -14,7 +20,7 @@
       t = MPI_Wtime()
 
       print *, '[', t, '] [rank ', rank, ']',
-     &     pstates, 'pstates available'
+     &     pstates, ' pstates available'
 
       do i = 0, pstates - 1
          p = smpi_get_host_power_peak_at(i)
@@ -34,7 +40,7 @@
          t = MPI_Wtime()
          e = smpi_get_host_consumed_energy()
          print *, '[', t, '] [rank ', rank, ']',
-     &        'Energy consumed (Joules): ', e
+     &        ' Energy consumed (Joules): ', e
       end do
 
       call MPI_Finalize(ierr)
index fe1859b..c39d8bd 100644 (file)
@@ -1,10 +1,14 @@
 p Test smpi bindings for dvfs functions (Fortran 90 example)
-$ ../../../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platform ${srcdir:=.}/platform.xml --cfg=smpi/cpu_threshold:-1 ${bindir:=.}/f90/sef90
+! output sort 1
+$ ../../../smpi_script/bin/smpirun -np 2 -hostfile ${srcdir:=.}/hostfile  -platform ${srcdir:=.}/platform.xml --cfg=smpi/cpu_threshold:-1 ${bindir:=.}/f90/sef90 --cfg=plugin:Energy  --log=smpi_kernel.thres:warning
 > [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.000000] [xbt_cfg/INFO] Configuration change: Set 'smpi/cpu_threshold' to '-1'
+> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'plugin' to 'Energy'
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
+> [80.000000] [surf_energy/INFO] Total energy (Joules) of host MyHost1: 12900.000000
+> [80.000000] [surf_energy/INFO] Total energy (Joules) of host MyHost2: 2000.000000
 >  [   0.0000000000000000      ] [rank            0 ]           3 pstates available
 >  [   0.0000000000000000      ] [rank            1 ]           1 pstates available
 >  [   0.0000000000000000      ] [rank            0 ] Power:    100000000.00000000     
index 59b3fbf..f1db81a 100644 (file)
@@ -1,3 +1,9 @@
+! Copyright (c) 2013-2014. 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.
+
 program main
   use mpi
 
index ad57cca..cb6d332 100644 (file)
@@ -12,5 +12,9 @@
   <host id="MyHost2" power="100.0Mf" >
         <prop id="power_per_state" value="95.0:200.0" />
   </host>
+
+  <link id="link1" bandwidth="100kBps" latency="0"/>
+  <route src="MyHost1" dst="MyHost2"><link_ctn id="link1"/></route>
+  
 </AS>
 </platform>
index 6632e3d..ba969e5 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 <mpi.h>
@@ -12,7 +18,7 @@ int main(int argc, char *argv[])
   size_t sz, x;
 
   if (MPI_Init(&argc, &argv) != MPI_SUCCESS) {
-    printf("MPI initialization failed!\n");
+    fprintf(stderr, "MPI initialization failed!\n");
     exit(EXIT_FAILURE);
   }
 
@@ -38,19 +44,19 @@ int main(int argc, char *argv[])
     } else
       sz = 0;
   }
-  printf("%s%s\n", buf, (sz ? "" : " [...]"));
+  fprintf(stderr, "%s%s\n", buf, (sz ? "" : " [...]"));
 
   for (i = 0; i < pstates; i++) {
     smpi_set_host_power_peak_at(i);
-    printf("[%.6f] [rank %d] Current pstate: %d; Current power: %.0f\n",
-           MPI_Wtime(), rank, i, smpi_get_host_current_power_peak());
+    fprintf(stderr, "[%.6f] [rank %d] Current pstate: %d; Current power: %.0f\n",
+            MPI_Wtime(), rank, i, smpi_get_host_current_power_peak());
 
     SMPI_SAMPLE_FLOPS(1e9) {
       /* imagine here some code running for 1e9 flops... */
     }
 
-    printf("[%.6f] [rank %d] Energy consumed: %g Joules.\n",
-           MPI_Wtime(), rank, smpi_get_host_consumed_energy());
+    fprintf(stderr, "[%.6f] [rank %d] Energy consumed: %g Joules.\n",
+            MPI_Wtime(), rank, smpi_get_host_consumed_energy());
   }
 
   return MPI_Finalize();
index 7047aff..b319f0f 100644 (file)
@@ -1,6 +1,6 @@
 /* A simple bugged MPI_ISend and MPI_IRecv test */
 
-/* Copyright (c) 2009, 2011, 2013. The SimGrid Team.
+/* Copyright (c) 2009, 2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index eab2b55..cc784eb 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /***************** Centralized Mutual Exclusion Algorithm *********************/
 /* This example implements a centralized mutual exclusion algorithm.          */
 /* Bug : CS requests of process 1 not satisfied                                      */
index fdd691c..42de583 100644 (file)
@@ -1,6 +1,6 @@
 /* A simple bugged MPI_ISend and MPI_IRecv test */
 
-/* Copyright (c) 2009, 2011, 2013. The SimGrid Team.
+/* Copyright (c) 2009, 2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index cacc0da..15a9e7e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 4880da3..06b9f9b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2012. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 589c0c8..4cbef48 100644 (file)
@@ -8,7 +8,7 @@ p Test of trace replay with SMPI (one trace for all processes)
 $ mkfile replay/one_trace
 ! timeout 60
 
-$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace
+$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace --log=smpi_kernel.thres:warning
 > [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'
@@ -29,7 +29,7 @@ $ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --
 > [Jupiter:1:(0) 14.286929] [smpi_replay/VERBOSE] 1 reduce 5e4 5e8 6.553424
 > [Tremblay:0:(0) 18.250974] [smpi_replay/VERBOSE] 0 reduce 5e4 5e8 8.056774
 > [Fafard:2:(0) 19.691622] [smpi_replay/VERBOSE] 2 reduce 5e4 5e8 6.553424
-> [Fafard:2:(0) 19.691622] [smpi_replay/INFO] Simulation time 19.6916
+> [Fafard:2:(0) 19.691622] [smpi_replay/INFO] Simulation time 19.691622
 
 $ rm -f replay/one_trace
 
@@ -38,7 +38,7 @@ p The same with tracing activated
 < replay/actions_bcast.txt
 $ mkfile replay/one_trace
 
-$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=no_loc  --cfg=tracing:yes --cfg=tracing/smpi:yes --cfg=tracing/smpi/computing:yes --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace
+$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=no_loc  --cfg=tracing:yes --cfg=tracing/smpi:yes --cfg=tracing/smpi/computing:yes --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace --log=smpi_kernel.thres:warning
 > [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'
@@ -47,7 +47,7 @@ $ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/smpi/computing' to 'yes'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'smpi/cpu_threshold' to '-1'
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
-> [Fafard:2:(0) 19.691622] [smpi_replay/INFO] Simulation time 19.6916
+> [Fafard:2:(0) 19.691622] [smpi_replay/INFO] Simulation time 19.691622
 
 $ rm -f replay/one_trace
 
@@ -213,13 +213,13 @@ $ tail -n +3 ./simgrid.trace
 > 13 19.691622 2 3
 > 12 19.695603 2 1 8
 > 12 19.698548 2 2 8
-> 13 19.698548 2 2
-> 7 19.698548 1 2
 > 12 19.699584 2 3 8
-> 13 19.699584 2 3
-> 7 19.699584 1 3
-> 13 19.705603 2 1
-> 7 19.705603 1 1
+> 13 19.703022 2 2
+> 7 19.703022 1 2
+> 13 19.703536 2 3
+> 7 19.703536 1 3
+> 13 19.703536 2 1
+> 7 19.703536 1 1
 
 
 $ rm -f ./simgrid.trace
@@ -230,7 +230,7 @@ p Another test of trace replay with SMPI (one trace per process)
 < replay/actions1.txt
 $ mkfile ./split_traces_tesh
 
-$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 2 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay ./split_traces_tesh
+$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 2 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay ./split_traces_tesh --log=smpi_kernel.thres:warning
 > [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'
@@ -244,7 +244,7 @@ $ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --
 > [Tremblay:0:(0) 13.435773] [smpi_replay/VERBOSE] 0 recv 1 1e6 13.271310
 > [Jupiter:1:(0) 13.600235] [smpi_replay/VERBOSE] 1 wait 0.328926
 > [Tremblay:0:(0) 13.600235] [smpi_replay/VERBOSE] 0 send 1 1e6 0.164463
-> [Jupiter:1:(0) 13.600235] [smpi_replay/INFO] Simulation time 13.6002
+> [Jupiter:1:(0) 13.600235] [smpi_replay/INFO] Simulation time 13.600235
 
 $ rm -f ./split_traces_tesh
 
@@ -253,7 +253,7 @@ p Test of barrier replay with SMPI (one trace for all processes)
 < replay/actions_barrier.txt
 $ mkfile replay/one_trace
 
-$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace
+$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace --log=smpi_kernel.thres:warning
 > [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'
@@ -267,7 +267,7 @@ $ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --
 > [Tremblay:0:(0) 2.495453] [smpi_replay/VERBOSE] 0 compute 98095000 1.000000
 > [Jupiter:1:(0) 2.498398] [smpi_replay/VERBOSE] 1 compute 76296000 1.000000
 > [Fafard:2:(0) 2.499434] [smpi_replay/VERBOSE] 2 compute 76296000 1.000000
-> [Fafard:2:(0) 2.499434] [smpi_replay/INFO] Simulation time 2.49943
+> [Fafard:2:(0) 2.499434] [smpi_replay/INFO] Simulation time 2.499434
 
 $ rm -f replay/one_trace
 
@@ -276,7 +276,7 @@ p Test of Isend replay with SMPI (one trace for all processes)
 < replay/actions_with_isend.txt
 $ mkfile replay/one_trace
 
-$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace
+$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace --log=smpi_kernel.thres:warning
 > [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'
@@ -294,7 +294,7 @@ $ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --
 > [Fafard:2:(0) 13.294318] [smpi_replay/VERBOSE] 2 Isend 0 1e6 0.000000
 > [Tremblay:0:(0) 13.447633] [smpi_replay/VERBOSE] 0 recv 2 1e6 3.088971
 > [Fafard:2:(0) 19.847741] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
-> [Fafard:2:(0) 19.847741] [smpi_replay/INFO] Simulation time 19.8477
+> [Fafard:2:(0) 19.847741] [smpi_replay/INFO] Simulation time 19.847741
 
 
 $ rm -f replay/one_trace
@@ -304,7 +304,7 @@ p Test of Isend replay with SMPI (one trace for all processes)
 < replay/actions_allReduce.txt
 $ mkfile replay/one_trace
 
-$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace
+$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace --log=smpi_kernel.thres:warning
 > [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'
@@ -316,7 +316,7 @@ $ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --
 > [Tremblay:0:(0) 10.209875] [smpi_replay/VERBOSE] 0 compute 5e8 5.097100
 > [Jupiter:1:(0) 13.121883] [smpi_replay/VERBOSE] 1 compute 5e8 6.553424
 > [Fafard:2:(0) 13.122523] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
-> [Fafard:2:(0) 13.122523] [smpi_replay/INFO] Simulation time 13.1225
+> [Fafard:2:(0) 13.122523] [smpi_replay/INFO] Simulation time 13.122523
 
 $ rm -f replay/one_trace
 
@@ -325,7 +325,7 @@ p Test of AllToAll replay with SMPI (one trace for all processes)
 < replay/actions_alltoall.txt
 $ mkfile replay/one_trace
 
-$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace
+$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace --log=smpi_kernel.thres:warning
 > [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'
@@ -334,7 +334,7 @@ $ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --
 > [Tremblay:0:(0) 0.004041] [smpi_replay/VERBOSE] 0 allToAll 500 500 0.004041
 > [Jupiter:1:(0) 0.006920] [smpi_replay/VERBOSE] 1 allToAll 500 500 0.006920
 > [Fafard:2:(0) 0.006920] [smpi_replay/VERBOSE] 2 allToAll 500 500 0.006920
-> [Fafard:2:(0) 0.006920] [smpi_replay/INFO] Simulation time 0.00692004
+> [Fafard:2:(0) 0.006920] [smpi_replay/INFO] Simulation time 0.006920
 
 $ rm -f replay/one_trace
 
@@ -343,7 +343,7 @@ p Test of AllToAllv replay with SMPI (one trace for all processes)
 < replay/actions_alltoallv.txt
 $ mkfile replay/one_trace
 
-$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace
+$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace --log=smpi_kernel.thres:warning
 > [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'
@@ -352,7 +352,7 @@ $ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --
 > [Tremblay:0:(0) 0.003999] [smpi_replay/VERBOSE] 0 allToAllV 100 1 40 30 1000 1 80 100 0.003999
 > [Jupiter:1:(0) 0.006934] [smpi_replay/VERBOSE] 1 allToAllV 1000 80 1 40 1000 40 1 30 0.006934
 > [Fafard:2:(0) 0.006936] [smpi_replay/VERBOSE] 2 allToAllV 1000 100 30 1 1000 30 40 1 0.006936
-> [Fafard:2:(0) 0.006936] [smpi_replay/INFO] Simulation time 0.00693554
+> [Fafard:2:(0) 0.006936] [smpi_replay/INFO] Simulation time 0.006936
 
 $ rm -f replay/one_trace
 
@@ -361,7 +361,7 @@ p Test of AllGatherv replay with SMPI (one trace for all processes)
 < replay/actions_allgatherv.txt
 $ mkfile replay/one_trace
 
-$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace
+$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace --log=smpi_kernel.thres:warning
 > [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'
@@ -370,7 +370,7 @@ $ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --
 > [Tremblay:0:(0) 0.841244] [smpi_replay/VERBOSE] 0 allGatherV 275427 275427 275427 275427 204020 0 0 0.841244
 > [Fafard:2:(0) 1.239482] [smpi_replay/VERBOSE] 2 allGatherV 275427 275427 275427 275427 204020 0 0 1.239482
 > [Jupiter:1:(0) 1.239482] [smpi_replay/VERBOSE] 1 allGatherV 275427 275427 275427 275427 204020 0 0 1.239482
-> [Jupiter:1:(0) 1.239482] [smpi_replay/INFO] Simulation time 1.23948
+> [Jupiter:1:(0) 1.239482] [smpi_replay/INFO] Simulation time 1.239482
 
 $ rm -f replay/one_trace
 
@@ -379,7 +379,7 @@ p Test of waitall replay with SMPI (one trace for all processes)
 < replay/actions_waitall.txt
 $ mkfile replay/one_trace
 
-$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace
+$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc --cfg=smpi/cpu_threshold:-1 -np 3 -platform ${srcdir:=.}/replay/replay_platform.xml -hostfile ${srcdir:=.}/hostfile ./smpi_replay replay/one_trace --log=smpi_kernel.thres:warning
 > [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'
@@ -394,6 +394,6 @@ $ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.thresh:critical --
 > [Fafard:2:(0) 0.000000] [smpi_replay/VERBOSE] 2 Isend 0 3000 0.000000
 > [Tremblay:0:(0) 0.003787] [smpi_replay/VERBOSE] 0 waitAll 0.003787
 > [Fafard:2:(0) 0.006220] [smpi_replay/VERBOSE] 2 waitAll 0.006220
-> [Fafard:2:(0) 0.006220] [smpi_replay/INFO] Simulation time 0.00622039
+> [Fafard:2:(0) 0.006220] [smpi_replay/INFO] Simulation time 0.006220
 
 $ rm -f replay/one_trace
index fdde9a5..18ee76c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index b983230..a12e36f 100644 (file)
@@ -3,7 +3,7 @@
 # Go for the first test
 
 p Test instrumentation of SMPI
-$ ../../smpi_script/bin/smpirun -trace -trace-resource -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced
+$ ../../smpi_script/bin/smpirun -trace -trace-resource -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced --log=smpi_kernel.thres:warning
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to 'yes'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'smpi_traced.trace'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/smpi' to 'yes'
@@ -15,7 +15,7 @@ $ ../../smpi_script/bin/smpirun -trace -trace-resource -trace-file smpi_traced.t
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
 
 p Another SMPI test
-$ ../../smpi_script/bin/smpirun -trace -trace-resource -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced_simple
+$ ../../smpi_script/bin/smpirun -trace -trace-resource -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced_simple --log=smpi_kernel.thres:warning
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to 'yes'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'smpi_traced.trace'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/smpi' to 'yes'
@@ -27,14 +27,14 @@ $ ../../smpi_script/bin/smpirun -trace -trace-resource -trace-file smpi_traced.t
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
 
 p Testing without trace parameters
-$ ../../smpi_script/bin/smpirun -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced_simple
+$ ../../smpi_script/bin/smpirun -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced_simple --log=smpi_kernel.thres:warning
 > [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.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
 
 p Testing grouped tracing
-$ ../../smpi_script/bin/smpirun -trace -trace-grouped -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced_simple
+$ ../../smpi_script/bin/smpirun -trace -trace-grouped -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced_simple --log=smpi_kernel.thres:warning
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to 'yes'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'smpi_traced.trace'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/smpi' to 'yes'
@@ -45,7 +45,7 @@ $ ../../smpi_script/bin/smpirun -trace -trace-grouped -trace-file smpi_traced.tr
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
 
 p Testing generation of viva configuration files
-$ ../../smpi_script/bin/smpirun -trace -trace-resource -trace-viva -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml --cfg=smpi/cpu_threshold:-1 -np 3 ./smpi_traced_simple
+$ ../../smpi_script/bin/smpirun -trace -trace-resource -trace-viva -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml --cfg=smpi/cpu_threshold:-1 -np 3 ./smpi_traced_simple --log=smpi_kernel.thres:warning
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to 'yes'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'smpi_traced.trace'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/smpi' to 'yes'
@@ -58,10 +58,10 @@ $ ../../smpi_script/bin/smpirun -trace -trace-resource -trace-viva -trace-file s
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/TCP_gamma' to '4194304'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'smpi/cpu_threshold' to '-1'
 > [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 viva graph configuration
+> [0.011914] [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)
-$ ../../smpi_script/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
+$ ../../smpi_script/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 --log=smpi_kernel.thres:warning
 > [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 ff92c0e..027c5f8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index ebf2ecb..7a7299a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2010-2012. The SimGrid Team.
+/* Copyright (c) 2007, 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d69ff26..c6af2d9 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2008, 2010-2012. The SimGrid Team.
+/* Copyright (c) 2007-2008, 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3979835..325a0ae 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 1a665a8..1e88da8 100644 (file)
@@ -1,9 +1,8 @@
-/*
- * jedule_events.h
- *
- *  Created on: Nov 30, 2010
- *      Author: sascha
- */
+/* Copyright (c) 2010-2012, 2014. 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 JEDULE_EVENTS_H_
 #define JEDULE_EVENTS_H_
index 1e3287a..04a134a 100644 (file)
@@ -1,9 +1,8 @@
-/*
- * jedule_output.h
- *
- *  Created on: Nov 30, 2010
- *      Author: sascha
- */
+/* Copyright (c) 2010-2012, 2014. 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 JEDULE_OUTPUT_H_
 #define JEDULE_OUTPUT_H_
index 282821e..f015b77 100644 (file)
@@ -1,9 +1,8 @@
-/*
- * jed_simgrid_platform.h
- *
- *  Created on: Nov 30, 2010
- *      Author: sascha
- */
+/* Copyright (c) 2010-2012, 2014. 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 JED_SIMGRID_PLATFORM_H_
 #define JED_SIMGRID_PLATFORM_H_
index 74c3cb3..53d62ee 100644 (file)
@@ -1,9 +1,8 @@
-/*
- * jedule_sd_binding.h
- *
- *  Created on: Dec 2, 2010
- *      Author: sascha
- */
+/* Copyright (c) 2010-2011, 2013-2014. 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 JEDULE_SD_BINDING_H_
 #define JEDULE_SD_BINDING_H_
index efee4e6..ed95a57 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -28,7 +28,7 @@ SG_BEGIN_DECL()
 typedef struct s_smx_rvpoint *msg_mailbox_t;
 
 /* ******************************** Environment ************************************ */
-typedef struct s_as *msg_as_t;
+typedef struct As *msg_as_t;
 
 /* ******************************** Host ************************************ */
 
@@ -48,7 +48,12 @@ typedef xbt_dictelm_t msg_host_t;
 typedef s_xbt_dictelm_t s_msg_host_t;
 
 typedef struct msg_host_priv {
-  xbt_swag_t vms;
+  int        dp_enabled;
+  xbt_dict_t dp_objs;
+  double     dp_updated_by_deleted_tasks;
+
+  xbt_dict_t affinity_mask_db;
+
 #ifdef MSG_USE_DEPRECATED
   msg_mailbox_t *mailboxes;     /**< the channels  */
 #endif
@@ -83,28 +88,19 @@ typedef struct msg_task {
  */
 typedef struct msg_task *msg_task_t;
 
-/* ********************************  VM ************************************* */
-typedef struct msg_vm *msg_vm_t;
+/* ******************************** VM ************************************* */
+typedef msg_host_t msg_vm_t;
+typedef msg_host_priv_t msg_vm_priv_t;
 
-typedef enum {
-  msg_vm_state_suspended, msg_vm_state_running, msg_vm_state_migrating
-} e_msg_vm_state_t;
-
-typedef struct msg_vm {
-  char *name;
-  s_xbt_swag_hookup_t all_vms_hookup;
-  s_xbt_swag_hookup_t host_vms_hookup;
-  xbt_dynar_t processes;
-  e_msg_vm_state_t state;
-  msg_host_t location;
-  int coreAmount;
-} s_msg_vm_t;
+static inline msg_vm_priv_t MSG_vm_priv(msg_vm_t vm){
+  return (msg_vm_priv_t) xbt_lib_get_level(vm, MSG_HOST_LEVEL);
+}
 
 /* ******************************** File ************************************ */
 typedef struct simdata_file *simdata_file_t;
 
 typedef struct s_msg_file_info {
-  sg_storage_size_t size;
+  sg_size_t size;
   char* mount_point;
   char* storageId;
   char* storage_type;
index 144d42b..9f983ca 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -81,26 +81,25 @@ XBT_PUBLIC(const char *) MSG_environment_as_get_model(msg_as_t as);
 XBT_PUBLIC(xbt_dynar_t) MSG_environment_as_get_hosts(msg_as_t as);
 
 /************************** File handling ***********************************/
-XBT_PUBLIC(sg_storage_size_t) MSG_file_read(msg_file_t fd, sg_storage_size_t size);
-XBT_PUBLIC(sg_storage_size_t) MSG_file_write(msg_file_t fd, sg_storage_size_t size);
+XBT_PUBLIC(sg_size_t) MSG_file_read(msg_file_t fd, sg_size_t size);
+XBT_PUBLIC(sg_size_t) MSG_file_write(msg_file_t fd, sg_size_t size);
 XBT_PUBLIC(msg_file_t) MSG_file_open(const char* mount, const char* path,
                                      void* data);
 XBT_PUBLIC(void*) MSG_file_get_data(msg_file_t fd);
 XBT_PUBLIC(msg_error_t) MSG_file_set_data(msg_file_t fd, void * data);
 XBT_PUBLIC(int) MSG_file_close(msg_file_t fd);
-XBT_PUBLIC(sg_storage_size_t) MSG_file_get_size(msg_file_t fd);
+XBT_PUBLIC(sg_size_t) MSG_file_get_size(msg_file_t fd);
 XBT_PUBLIC(void) MSG_file_dump(msg_file_t fd);
 XBT_PUBLIC(int) MSG_file_unlink(msg_file_t fd);
 XBT_PUBLIC(xbt_dict_t) MSG_file_ls(const char *mount, const char *path);
-XBT_PUBLIC(msg_error_t) MSG_file_move (msg_file_t fd, msg_host_t dest, char* mount, char* fullname);
-XBT_PUBLIC(msg_error_t) MSG_file_seek (msg_file_t fd, sg_storage_size_t offset, int whence);
-XBT_PUBLIC(msg_error_t) MSG_file_rename (msg_file_t fd, char* new_name);
+XBT_PUBLIC(msg_error_t) MSG_file_seek(msg_file_t fd, sg_size_t offset, int origin);
+XBT_PUBLIC(sg_size_t) MSG_file_tell (msg_file_t fd);
 XBT_PUBLIC(void) __MSG_file_get_info(msg_file_t fd);
 /************************** Storage handling ***********************************/
 XBT_PUBLIC(msg_host_t) MSG_get_storage_by_name(const char *name);
 XBT_PUBLIC(const char *) MSG_storage_get_name(msg_storage_t storage);
-XBT_PUBLIC(sg_storage_size_t) MSG_storage_get_free_size(const char* name);
-XBT_PUBLIC(sg_storage_size_t) MSG_storage_get_used_size(const char* name);
+XBT_PUBLIC(sg_size_t) MSG_storage_get_free_size(const char* name);
+XBT_PUBLIC(sg_size_t) MSG_storage_get_used_size(const char* name);
 XBT_PUBLIC(msg_storage_t) MSG_storage_get_by_name(const char *name);
 XBT_PUBLIC(xbt_dict_t) MSG_storage_get_properties(msg_storage_t storage);
 XBT_PUBLIC(void) MSG_storage_set_property_value(msg_storage_t storage, const char *name, char *value,void_f_pvoid_t free_ctn);
@@ -108,7 +107,9 @@ XBT_PUBLIC(xbt_dynar_t) MSG_storages_as_dynar(void);
 XBT_PUBLIC(msg_error_t) MSG_storage_set_data(msg_storage_t host, void *data);
 XBT_PUBLIC(void *) MSG_storage_get_data(msg_storage_t storage);
 XBT_PUBLIC(xbt_dict_t) MSG_storage_get_content(msg_storage_t storage);
-XBT_PUBLIC(sg_storage_size_t) MSG_storage_get_size(msg_storage_t storage);
+XBT_PUBLIC(sg_size_t) MSG_storage_get_size(msg_storage_t storage);
+XBT_PUBLIC(msg_error_t) MSG_storage_file_move(msg_file_t fd, msg_host_t dest, char* mount, char* fullname);
+XBT_PUBLIC(msg_error_t) MSG_storage_file_rename(msg_storage_t storage, const char* src,  const char* dest);
 /************************** AS Router handling ************************************/
 XBT_PUBLIC(const char *) MSG_as_router_get_property_value(const char* asr, const char *name);
 XBT_PUBLIC(xbt_dict_t) MSG_as_router_get_properties(const char* asr);
@@ -118,14 +119,16 @@ XBT_PUBLIC(void) MSG_as_router_set_property_value(const char* asr, const char *n
 XBT_PUBLIC(msg_error_t) MSG_host_set_data(msg_host_t host, void *data);
 XBT_PUBLIC(void *) MSG_host_get_data(msg_host_t host);
 XBT_PUBLIC(const char *) MSG_host_get_name(msg_host_t host);
+XBT_PUBLIC(void) MSG_host_on(msg_host_t host);
+XBT_PUBLIC(void) MSG_host_off(msg_host_t host);
 XBT_PUBLIC(msg_host_t) MSG_host_self(void);
 XBT_PUBLIC(int) MSG_get_host_msgload(msg_host_t host);
-/* int MSG_get_msgload(void); This function lacks specification; discard it */
 XBT_PUBLIC(double) MSG_get_host_speed(msg_host_t h);
 XBT_PUBLIC(int) MSG_host_get_core_number(msg_host_t h);
 XBT_PUBLIC(xbt_swag_t) MSG_host_get_process_list(msg_host_t h);
 XBT_PUBLIC(int) MSG_host_is_avail(msg_host_t h);
-XBT_PUBLIC(void) __MSG_host_destroy(msg_host_priv_t host);
+XBT_PUBLIC(void) __MSG_host_priv_free(msg_host_priv_t priv);
+XBT_PUBLIC(void) __MSG_host_destroy(msg_host_t host);
 
 XBT_PUBLIC(double) MSG_get_host_power_peak_at(msg_host_t h, int pstate_index);
 XBT_PUBLIC(double) MSG_get_host_current_power_peak(msg_host_t h);
@@ -147,6 +150,8 @@ XBT_PUBLIC(void) MSG_create_environment(const char *file);
 XBT_PUBLIC(msg_host_t) MSG_get_host_by_name(const char *name);
 XBT_PUBLIC(xbt_dynar_t) MSG_hosts_as_dynar(void);
 XBT_PUBLIC(int) MSG_get_host_number(void);
+XBT_PUBLIC(void) MSG_host_get_params(msg_host_t ind_pm, ws_params_t params);
+XBT_PUBLIC(void) MSG_host_set_params(msg_host_t ind_pm, ws_params_t params);
 XBT_PUBLIC(xbt_dict_t) MSG_host_get_storage_list(msg_host_t host);
 XBT_PUBLIC(xbt_dict_t) MSG_host_get_storage_content(msg_host_t host);
 /************************** Process handling *********************************/
@@ -238,6 +243,8 @@ XBT_PUBLIC(msg_error_t) MSG_task_receive_from_host_bounded(msg_task_t * task, co
 XBT_PUBLIC(msg_error_t) MSG_task_execute(msg_task_t task);
 XBT_PUBLIC(msg_error_t) MSG_parallel_task_execute(msg_task_t task);
 XBT_PUBLIC(void) MSG_task_set_priority(msg_task_t task, double priority);
+XBT_PUBLIC(void) MSG_task_set_bound(msg_task_t task, double bound);
+XBT_PUBLIC(void) MSG_task_set_affinity(msg_task_t task, msg_host_t host, unsigned long mask);
 
 XBT_PUBLIC(msg_error_t) MSG_process_sleep(double nb_sec);
 
@@ -411,30 +418,47 @@ XBT_PUBLIC(int) MSG_sem_would_block(msg_sem_t sem);
  * Usual lack of guaranty of any kind applies here, and is even increased.
  *
  */
-/* This function should not be called directly, but rather from MSG_vm_start_from_template that does not exist yet*/
-XBT_PUBLIC(msg_vm_t) MSG_vm_start(msg_host_t location, const char *name, int coreAmount);
 
-XBT_PUBLIC(int) MSG_vm_is_suspended(msg_vm_t);
+XBT_PUBLIC(int) MSG_vm_is_created(msg_vm_t);
 XBT_PUBLIC(int) MSG_vm_is_running(msg_vm_t);
+XBT_PUBLIC(int) MSG_vm_is_migrating(msg_vm_t);
 
-XBT_PUBLIC(void) MSG_vm_bind(msg_vm_t vm, msg_process_t process);
-XBT_PUBLIC(void) MSG_vm_unbind(msg_vm_t vm, msg_process_t process); // simple wrapper over process_kill
+XBT_PUBLIC(int) MSG_vm_is_suspended(msg_vm_t);
+XBT_PUBLIC(int) MSG_vm_is_saving(msg_vm_t);
+XBT_PUBLIC(int) MSG_vm_is_saved(msg_vm_t);
+XBT_PUBLIC(int) MSG_vm_is_restoring(msg_vm_t);
 
-XBT_PUBLIC(void) MSG_vm_migrate(msg_vm_t vm, msg_host_t destination);
 
-XBT_PUBLIC(void) MSG_vm_suspend(msg_vm_t vm);
-  // \forall p in VM, MSG_process_suspend(p) // Freeze the processes
+XBT_PUBLIC(const char*) MSG_vm_get_name(msg_vm_t);
 
-XBT_PUBLIC(void) MSG_vm_resume(msg_vm_t vm);  // Simulate the fact of reading the processes from disk and resuming them
-  // \forall p in VM, MSG_process_resume(p) // unfreeze them
+// TODO add VDI later
+XBT_PUBLIC(msg_vm_t) MSG_vm_create_core(msg_host_t location, const char *name);
+XBT_PUBLIC(msg_vm_t) MSG_vm_create(msg_host_t ind_pm, const char *name,
+    int core_nb, int mem_cap, int net_cap, char *disk_path, int disk_size, int mig_netspeed, int dp_intensity);
 
-XBT_PUBLIC(void) MSG_vm_shutdown(msg_vm_t vm); // killall
+XBT_PUBLIC(void) MSG_vm_destroy(msg_vm_t vm);
 
-XBT_PUBLIC(void) MSG_vm_reboot(msg_vm_t vm);
+XBT_PUBLIC(void) MSG_vm_start(msg_vm_t);
 
-XBT_PUBLIC(void) MSG_vm_destroy(msg_vm_t vm);
+/* Shutdown the guest operating system. */
+XBT_PUBLIC(void) MSG_vm_shutdown(msg_vm_t vm);
+
+XBT_PUBLIC(void) MSG_vm_migrate(msg_vm_t vm, msg_host_t destination);
+
+/* Suspend the execution of the VM, but keep its state on memory. */
+XBT_PUBLIC(void) MSG_vm_suspend(msg_vm_t vm);
+XBT_PUBLIC(void) MSG_vm_resume(msg_vm_t vm);
+
+/* Save the VM state to a disk. */
+XBT_PUBLIC(void) MSG_vm_save(msg_vm_t vm);
+XBT_PUBLIC(void) MSG_vm_restore(msg_vm_t vm);
+
+XBT_PUBLIC(msg_host_t) MSG_vm_get_pm(msg_vm_t vm);
+XBT_PUBLIC(void) MSG_vm_set_bound(msg_vm_t vm, double bound);
+XBT_PUBLIC(void) MSG_vm_set_affinity(msg_vm_t vm, msg_host_t pm, unsigned long mask);
 
-XBT_PUBLIC(xbt_dynar_t) MSG_vms_as_dynar(void);
+/* TODO: do we need this? */
+// XBT_PUBLIC(xbt_dynar_t) MSG_vms_as_dynar(void);
 
 /*
 void* MSG_process_get_property(msg_process_t, char* key)
index f80d5ef..b4399cd 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006, 2008-2013. The SimGrid Team.
+/* Copyright (c) 2006, 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d78288f..4f2a3e5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2006-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
diff --git a/include/simgrid.h b/include/simgrid.h
new file mode 100644 (file)
index 0000000..c407a51
--- /dev/null
@@ -0,0 +1,25 @@
+/* simgrid.h - Public interface all SimGrid APIs                            */
+
+/* Copyright (c) 2014. 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 SIMGRID_H
+#define SIMGRID_H
+
+#include <xbt.h>
+
+#include <simgrid/datatypes.h>
+#include <simgrid/modelchecker.h>
+#include <simgrid/platf_generator.h>
+#include <simgrid/platf.h>
+#include <simgrid/simix.h>
+#include <simgrid/plugins.h>
+
+// SG_BEGIN_DECL()
+// nothing
+// SG_END_DECL()
+
+#endif                          /* SG_PLATF_H */
diff --git a/include/simgrid/datatypes.h b/include/simgrid/datatypes.h
new file mode 100644 (file)
index 0000000..006da0a
--- /dev/null
@@ -0,0 +1,32 @@
+/* Copyright (c) 2013-2014. 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 SIMGRID_DATATYPES_H_
+#define SIMGRID_DATATYPES_H_
+
+typedef struct ws_params {
+  int ncpus;
+  sg_size_t ramsize;
+  int overcommit;
+
+  /* The size of other states than memory pages, which is out-of-scope of dirty
+   * page tracking. */
+  sg_size_t devsize;
+  int skip_stage1;
+  int skip_stage2;
+  double max_downtime;
+
+  double dp_rate;
+  double dp_cap; /* bytes per 1 flop execution */
+
+  double xfer_cpu_overhead;
+  double dpt_cpu_overhead;
+
+  /* set migration speed */
+  double mig_speed;
+} s_ws_params_t, *ws_params_t;
+
+#endif /* SIMGRID_DATATYPES_H_ */
index f97be05..34d9124 100644 (file)
@@ -1,6 +1,6 @@
 /* simgrid/modelchecker.h - Formal Verification made possible in SimGrid    */
 
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -13,6 +13,8 @@
 #ifndef SIMGRID_MODELCHECKER_H
 #define SIMGRID_MODELCHECKER_H
 
+SG_BEGIN_DECL()
+
 #ifdef HAVE_MC
 
 extern int _sg_do_model_check; /* please don't use directly: we inline MC_is_active, but that's what you should use */
@@ -44,6 +46,6 @@ XBT_PUBLIC(void) MC_ignore(void *addr, size_t size);
 
 #endif
 
-
+SG_END_DECL()
 
 #endif /* SIMGRID_MODELCHECKER_H */
index ff9095d..f3619f3 100644 (file)
@@ -1,6 +1,6 @@
 /* platf.h - Public interface to the SimGrid platforms                      */
 
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 
 #include <xbt.h>
 
-typedef void *sg_routing_link_t; /* The actual type is model-dependent so use void* instead*/
-typedef struct s_routing_edge *sg_routing_edge_t;
+SG_BEGIN_DECL()
+
+typedef void *sg_routing_link_t; /* FIXME:The actual type is model-dependent so use void* instead*/
+typedef struct RoutingEdge *sg_routing_edge_t;
 
 XBT_PUBLIC(sg_routing_edge_t) sg_routing_edge_by_name_or_null(const char *name);
 
-/** Defines whether a given resource is working or not */
+/** @ingroup SURF_interface
+* @brief Defines whether a given resource is working or not */
 typedef enum {
   SURF_RESOURCE_ON = 1,                   /**< Up & ready        */
   SURF_RESOURCE_OFF = 0                   /**< Down & broken     */
@@ -41,6 +44,11 @@ typedef enum {
   SURF_PROCESS_ON_FAILURE_RESTART = 0
 } e_surf_process_on_failure_t;
 
+typedef enum {
+  SURF_CLUSTER_FLAT = 1,
+  SURF_CLUSTER_TORUS = 0
+} e_surf_cluster_topology_t;
+
 
 typedef struct tmgr_trace *tmgr_trace_t; /**< Opaque structure defining an availability trace */
 
@@ -71,6 +79,7 @@ XBT_PUBLIC(probabilist_event_generator_t) tmgr_event_generator_new_exponential(c
 XBT_PUBLIC(probabilist_event_generator_t) tmgr_event_generator_new_weibull(const char* id,
                                                                            double scale,
                                                                            double shape);
+
 typedef xbt_dictelm_t sg_host_t;
 static inline char* sg_host_name(sg_host_t host) {
   return host->key;
@@ -80,9 +89,10 @@ typedef xbt_dictelm_t sg_storage_t;
 static inline char* sg_storage_name(sg_storage_t storage) {
   return storage->key;
 }
-/* Type for any integer storage size  */
-typedef uint64_t sg_storage_size_t;
-
+/** @ingroup m_datatypes_management_details
+ * @brief Type for any simgrid size
+ */
+typedef unsigned long long sg_size_t;
 
 /*
  * Platform creation functions. Instead of passing 123 arguments to the creation functions
@@ -199,6 +209,8 @@ typedef struct s_sg_platf_cluster_cbarg {
   double loopback_bw;
   double loopback_lat;
   double limiter_link;
+  e_surf_cluster_topology_t topology;
+  const char* topo_parameters;
   xbt_dict_t properties;
   const char* router_id;
   e_surf_link_sharing_policy_t sharing_policy;
@@ -239,7 +251,8 @@ typedef struct {
   const char* content;
   const char* content_type;
   xbt_dict_t properties;
-  sg_storage_size_t size;
+  xbt_dict_t model_properties;
+  sg_size_t size;
 } s_sg_platf_storage_type_cbarg_t, *sg_platf_storage_type_cbarg_t;
 
 #define SG_PLATF_STORAGE_TYPE_INITIALIZER {NULL,NULL,NULL,NULL,NULL}
@@ -368,5 +381,6 @@ XBT_PUBLIC(void) sg_platf_ASroute_add_link (const char* link_id, sg_platf_route_
 typedef void (*sg_platf_process_cb_t)(sg_platf_process_cbarg_t);
 XBT_PUBLIC(void) sg_platf_process_add_cb(sg_platf_process_cb_t fct);
 
+SG_END_DECL()
 
 #endif                          /* SG_PLATF_H */
index 84a385b..fbe912c 100644 (file)
@@ -1,7 +1,7 @@
 
 /* platf_generator.h - Public interface to the SimGrid platforms generator  */
 
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
diff --git a/include/simgrid/plugins.h b/include/simgrid/plugins.h
new file mode 100644 (file)
index 0000000..0855430
--- /dev/null
@@ -0,0 +1,19 @@
+/* Copyright (c) 2014. 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 PLUGINS_H_
+#define PLUGINS_H_
+
+SG_BEGIN_DECL()
+
+/** \ingroup SURF_plugins
+ *  \brief The cpu energy consumption plugin
+ */
+XBT_PUBLIC(void) sg_energy_plugin_init(void);
+
+SG_END_DECL()
+
+#endif /* PLUGINS_H_ */
index ecdd1d6..91a6269 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -14,6 +14,7 @@
 #include "xbt/parmap.h"
 #include "xbt/swag.h"
 #include "simgrid/platf.h"
+#include "simgrid/datatypes.h"
 
 SG_BEGIN_DECL()
 
@@ -51,7 +52,6 @@ typedef enum {
 } e_smx_state_t;
 /** @} */
 
-
 typedef struct s_smx_timer* smx_timer_t;
 
 /* ******************************** Synchro ************************************ */
@@ -140,8 +140,8 @@ typedef void (*void_pfn_smxhost_t) (smx_host_t);
    factory should implement */
 
 
-typedef smx_context_t(*smx_pfn_context_factory_create_context_t)
-  (xbt_main_func_t, int, char **, void_pfn_smxprocess_t, void* data);
+typedef smx_context_t (*smx_pfn_context_factory_create_context_t)(
+  xbt_main_func_t, int, char **, void_pfn_smxprocess_t, smx_process_t process);
 typedef int (*smx_pfn_context_factory_finalize_t) (smx_context_factory_t*);
 typedef void (*smx_pfn_context_free_t) (smx_context_t);
 typedef void (*smx_pfn_context_start_t) (smx_context_t);
@@ -149,7 +149,7 @@ typedef void (*smx_pfn_context_stop_t) (smx_context_t);
 typedef void (*smx_pfn_context_suspend_t) (smx_context_t context);
 typedef void (*smx_pfn_context_runall_t) (void);
 typedef smx_context_t (*smx_pfn_context_self_t) (void);
-typedef void* (*smx_pfn_context_get_data_t) (smx_context_t context);
+typedef smx_process_t (*smx_pfn_context_get_process_t) (smx_context_t context);
 
 /* interface of the context factories */
 typedef struct s_smx_context_factory {
@@ -161,7 +161,7 @@ typedef struct s_smx_context_factory {
   smx_pfn_context_suspend_t suspend;
   smx_pfn_context_runall_t runall;
   smx_pfn_context_self_t self;
-  smx_pfn_context_get_data_t get_data;
+  smx_pfn_context_get_process_t get_process;
 } s_smx_context_factory_t;
 
 /* Hack: let msg load directly the right factory */
@@ -182,7 +182,7 @@ typedef struct s_smx_context {
   s_xbt_swag_hookup_t hookup;
   xbt_main_func_t code;
   void_pfn_smxprocess_t cleanup_func;
-  void *data;   /* Here SIMIX stores the smx_process_t containing the context */
+  smx_process_t process;
   char **argv;
   int argc;
   unsigned iwannadie:1;
@@ -193,15 +193,14 @@ XBT_PUBLIC(void) smx_ctx_base_factory_init(smx_context_factory_t *factory);
 XBT_PUBLIC(int) smx_ctx_base_factory_finalize(smx_context_factory_t *factory);
 
 XBT_PUBLIC(smx_context_t)
-smx_ctx_base_factory_create_context_sized(size_t size,
-                                          xbt_main_func_t code, int argc,
-                                          char **argv,
+smx_ctx_base_factory_create_context_sized(size_t size, xbt_main_func_t code,
+                                          int argc, char **argv,
                                           void_pfn_smxprocess_t cleanup,
-                                          void* data);
+                                          smx_process_t process);
 XBT_PUBLIC(void) smx_ctx_base_free(smx_context_t context);
 XBT_PUBLIC(void) smx_ctx_base_stop(smx_context_t context);
 XBT_PUBLIC(smx_context_t) smx_ctx_base_self(void);
-XBT_PUBLIC(void) *smx_ctx_base_get_data(smx_context_t context);
+XBT_PUBLIC(smx_process_t) smx_ctx_base_get_process(smx_context_t context);
 
 XBT_PUBLIC(xbt_dynar_t) SIMIX_process_get_runnable(void);
 XBT_PUBLIC(smx_process_t) SIMIX_process_from_PID(int PID);
@@ -260,10 +259,10 @@ XBT_PUBLIC(smx_host_t) SIMIX_host_get_by_name(const char *name);
 XBT_PUBLIC(smx_host_t) SIMIX_host_self(void);
 XBT_PUBLIC(const char*) SIMIX_host_self_get_name(void);
 XBT_PUBLIC(const char*) SIMIX_host_get_name(smx_host_t host); /* FIXME: make private: only the name of SIMIX_host_self() should be public without request */
+XBT_PUBLIC(void) SIMIX_host_on(smx_host_t host);
+XBT_PUBLIC(void) SIMIX_host_off(smx_host_t host, smx_process_t issuer);
 XBT_PUBLIC(void) SIMIX_host_self_set_data(void *data);
 XBT_PUBLIC(void*) SIMIX_host_self_get_data(void);
-XBT_PUBLIC(void*) SIMIX_host_get_data(smx_host_t host);
-XBT_PUBLIC(void) SIMIX_host_set_data(smx_host_t host, void *data);
 XBT_PUBLIC(xbt_dict_t) SIMIX_host_get_storage_list(smx_host_t host);
 /********************************* Process ************************************/
 XBT_PUBLIC(int) SIMIX_process_count(void);
@@ -303,6 +302,8 @@ XBT_PUBLIC(void) SIMIX_file_set_data(smx_file_t fd, void *data);
 XBT_PUBLIC(smx_host_t) simcall_host_get_by_name(const char *name);
 XBT_PUBLIC(const char *) simcall_host_get_name(smx_host_t host);
 XBT_PUBLIC(xbt_dict_t) simcall_host_get_properties(smx_host_t host);
+XBT_PUBLIC(void) simcall_host_on(smx_host_t host);
+XBT_PUBLIC(void) simcall_host_off(smx_host_t host);
 XBT_PUBLIC(int) simcall_host_get_core(smx_host_t host);
 XBT_PUBLIC(xbt_swag_t) simcall_host_get_process_list(smx_host_t host);
 XBT_PUBLIC(double) simcall_host_get_speed(smx_host_t host);
@@ -321,7 +322,7 @@ XBT_PUBLIC(double) simcall_host_get_consumed_energy(smx_host_t host);
 
 XBT_PUBLIC(smx_action_t) simcall_host_execute(const char *name, smx_host_t host,
                                                 double computation_amount,
-                                                double priority);
+                                                double priority, double bound, unsigned long affinity_mask);
 XBT_PUBLIC(smx_action_t) simcall_host_parallel_execute(const char *name,
                                                      int host_nb,
                                                      smx_host_t *host_list,
@@ -334,8 +335,28 @@ XBT_PUBLIC(void) simcall_host_execution_cancel(smx_action_t execution);
 XBT_PUBLIC(double) simcall_host_execution_get_remains(smx_action_t execution);
 XBT_PUBLIC(e_smx_state_t) simcall_host_execution_get_state(smx_action_t execution);
 XBT_PUBLIC(void) simcall_host_execution_set_priority(smx_action_t execution, double priority);
+XBT_PUBLIC(void) simcall_host_execution_set_bound(smx_action_t execution, double bound);
+XBT_PUBLIC(void) simcall_host_execution_set_affinity(smx_action_t execution, smx_host_t host, unsigned long mask);
 XBT_PUBLIC(e_smx_state_t) simcall_host_execution_wait(smx_action_t execution);
 XBT_PUBLIC(xbt_dict_t) simcall_host_get_storage_list(smx_host_t host);
+XBT_PUBLIC(void) simcall_host_get_params(smx_host_t vm, ws_params_t param);
+XBT_PUBLIC(void) simcall_host_set_params(smx_host_t vm, ws_params_t param);
+
+/******************************* VM simcalls ********************************/
+// Create the vm_workstation at the SURF level
+XBT_PUBLIC(void*) simcall_vm_create(const char *name, smx_host_t host);
+XBT_PUBLIC(int) simcall_vm_get_state(smx_host_t vm);
+XBT_PUBLIC(void) simcall_vm_start(smx_host_t vm);
+XBT_PUBLIC(void) simcall_vm_migrate(smx_host_t vm, smx_host_t dst_pm);
+XBT_PUBLIC(void *) simcall_vm_get_pm(smx_host_t vm);
+XBT_PUBLIC(void) simcall_vm_set_bound(smx_host_t vm, double bound);
+XBT_PUBLIC(void) simcall_vm_set_affinity(smx_host_t vm, smx_host_t pm, unsigned long mask);
+XBT_PUBLIC(void) simcall_vm_resume(smx_host_t vm);
+XBT_PUBLIC(void) simcall_vm_save(smx_host_t vm);
+XBT_PUBLIC(void) simcall_vm_restore(smx_host_t vm);
+XBT_PUBLIC(void) simcall_vm_suspend(smx_host_t vm);
+XBT_PUBLIC(void) simcall_vm_destroy(smx_host_t vm);
+XBT_PUBLIC(void) simcall_vm_shutdown(smx_host_t vm);
 
 /**************************** Process simcalls ********************************/
 /* Constructor and Destructor */
@@ -405,26 +426,15 @@ XBT_PUBLIC(smx_action_t) simcall_comm_isend(smx_rdv_t rdv, double task_size,
                                               void *data, int detached);
 
 XBT_PUBLIC(void) simcall_comm_recv(smx_rdv_t rdv, void *dst_buff,
-                                     size_t * dst_buff_size,
-                                     int (*match_fun)(void *, void *, smx_action_t),
-                                     void *data, double timeout);
+                                   size_t * dst_buff_size,
+                                   int (*match_fun)(void *, void *, smx_action_t),
+                                   void *data, double timeout, double rate);
 
 XBT_PUBLIC(smx_action_t) simcall_comm_irecv(smx_rdv_t rdv, void *dst_buff,
-                                              size_t * dst_buff_size,
-                                              int (*match_fun)(void *, void *, smx_action_t),
-                                              void *data);
+                                            size_t * dst_buff_size,
+                                            int (*match_fun)(void *, void *, smx_action_t),
+                                            void *data, double rate);
 
-XBT_PUBLIC(void) simcall_comm_recv_bounded(smx_rdv_t rdv, void *dst_buff,
-                                     size_t * dst_buff_size,
-                                     int (*match_fun)(void *, void *, smx_action_t),
-                                     void *data, double timeout, double rate);
-
-XBT_PUBLIC(smx_action_t) simcall_comm_irecv_bounded(smx_rdv_t rdv, void *dst_buff,
-                                              size_t * dst_buff_size,
-                                              int (*match_fun)(void *, void *, smx_action_t),
-                                              void *data, double rate);
-
-XBT_PUBLIC(void) simcall_comm_destroy(smx_action_t comm);
 XBT_PUBLIC(smx_action_t) simcall_comm_iprobe(smx_rdv_t rdv, int src, int tag,
                                 int (*match_fun)(void *, void *, smx_action_t), void *data);
 XBT_PUBLIC(void) simcall_comm_cancel(smx_action_t comm);
@@ -481,25 +491,27 @@ XBT_PUBLIC(int) simcall_sem_get_capacity(smx_sem_t sem);
 /*****************************   File   **********************************/
 XBT_PUBLIC(void *) simcall_file_get_data(smx_file_t fd);
 XBT_PUBLIC(void) simcall_file_set_data(smx_file_t fd, void *data);
-XBT_PUBLIC(sg_storage_size_t) simcall_file_read(smx_file_t fd, sg_storage_size_t size);
-XBT_PUBLIC(sg_storage_size_t) simcall_file_write(smx_file_t fd, sg_storage_size_t size);
+XBT_PUBLIC(sg_size_t) simcall_file_read(smx_file_t fd, sg_size_t size);
+XBT_PUBLIC(sg_size_t) simcall_file_write(smx_file_t fd, sg_size_t size);
 XBT_PUBLIC(smx_file_t) simcall_file_open(const char* storage, const char* path);
 XBT_PUBLIC(int) simcall_file_close(smx_file_t fd);
 XBT_PUBLIC(int) simcall_file_unlink(smx_file_t fd);
 XBT_PUBLIC(xbt_dict_t) simcall_file_ls(const char* mount, const char* path);
-XBT_PUBLIC(sg_storage_size_t) simcall_file_get_size(smx_file_t fd);
+XBT_PUBLIC(sg_size_t) simcall_file_get_size(smx_file_t fd);
 XBT_PUBLIC(xbt_dynar_t) simcall_file_get_info(smx_file_t fd);
-
+XBT_PUBLIC(sg_size_t) simcall_file_tell(smx_file_t fd);
+XBT_PUBLIC(int) simcall_file_seek(smx_file_t fd, sg_size_t offset, int origin);
 /*****************************   Storage   **********************************/
-XBT_PUBLIC(sg_storage_size_t) simcall_storage_get_free_size (const char* name);
-XBT_PUBLIC(sg_storage_size_t) simcall_storage_get_used_size (const char* name);
+XBT_PUBLIC(sg_size_t) simcall_storage_get_free_size (const char* name);
+XBT_PUBLIC(sg_size_t) simcall_storage_get_used_size (const char* name);
 XBT_PUBLIC(xbt_dict_t) simcall_storage_get_properties(smx_storage_t storage);
 XBT_PUBLIC(void*) SIMIX_storage_get_data(smx_storage_t storage);
 XBT_PUBLIC(void) SIMIX_storage_set_data(smx_storage_t storage, void *data);
 XBT_PUBLIC(xbt_dict_t) SIMIX_storage_get_content(smx_storage_t storage);
 XBT_PUBLIC(xbt_dict_t) simcall_storage_get_content(smx_storage_t storage);
 XBT_PUBLIC(const char*) SIMIX_storage_get_name(smx_host_t host);
-XBT_PUBLIC(sg_storage_size_t) SIMIX_storage_get_size(smx_storage_t storage);
+XBT_PUBLIC(sg_size_t) SIMIX_storage_get_size(smx_storage_t storage);
+XBT_PUBLIC(void) simcall_storage_file_rename(smx_storage_t storage, const char* src,  const char* dest);
 /************************** AS router   **********************************/
 XBT_PUBLIC(xbt_dict_t) SIMIX_asr_get_properties(const char *name);
 /************************** AS router simcalls ***************************/
index 789464f..b3a3fdf 100644 (file)
@@ -1,7 +1,7 @@
 /* simgrid_config.h - Results of the configure made visible to user code    */
 
-/* Copyright (c) 2009-2013. The SimGrid Team.
  All rights reserved.                                                     */
+/* Copyright (c) 2009-2014. 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. */
@@ -70,8 +70,8 @@ XBT_PUBLIC_DATA(xbt_dynar_t) sg_cmdline;
 #endif
 
 
-/* Define to 1 if you have the `mmap' function. */
-#cmakedefine HAVE_MMAP @HAVE_MMAP@
+/* Define to 1 if mmalloc is compiled in. */
+#cmakedefine HAVE_MMALLOC @HAVE_MMALLOC@
 
 /* Get the config */
 #undef SIMGRID_NEED_ASPRINTF
index e8aa3ea..4224e7f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 213fe84..b74f559 100644 (file)
@@ -1,5 +1,5 @@
 ! -*- fortran -*-
-! Copyright (c) 2010, 2012-2013. The SimGrid Team.
+! Copyright (c) 2010, 2012-2014. The SimGrid Team.
 ! All rights reserved.
 
 ! This program is free software; you can redistribute it and/or modify it
@@ -18,7 +18,7 @@
       integer MPI_MAX_DATAREP_STRIN, MPI_MAX_INFO_KEY
       integer MPI_MAX_INFO_VAL, MPI_MAX_OBJECT_NAME, MPI_MAX_PORT_NAME
       integer MPI_ANY_SOURCE, MPI_PROC_NULL, MPI_ANY_TAG, MPI_UNDEFINED
-      integer MPI_IN_PLACE, MPI_BOTTOM, MPI_TAG_UB, MPI_TAG_LB
+      integer MPI_TAG_UB, MPI_TAG_LB
       integer MPI_SOURCE, MPI_TAG, MPI_ERROR
       integer MPI_VERSION, MPI_SUBVERSION
       parameter(MPI_MAX_PROCESSOR_NAME=100)
@@ -32,8 +32,6 @@
       parameter(MPI_PROC_NULL=-666)
       parameter(MPI_ANY_TAG=-444)
       parameter(MPI_UNDEFINED=-333)
-      parameter(MPI_IN_PLACE=-222)
-      parameter(MPI_BOTTOM=-111)
       parameter(MPI_SOURCE=1)
       parameter(MPI_TAG=2)
       parameter(MPI_ERROR=3)
       parameter(MPI_ERRHANDLER_NULL=2)
 
 ! This should be equal to the number of int fields in MPI_Status
-      integer MPI_STATUS_SIZE, MPI_STATUSES_IGNORE
+      integer MPI_STATUS_SIZE
       parameter(MPI_STATUS_SIZE=4)
-      parameter(MPI_STATUSES_IGNORE=-1)
 
-      integer MPI_STATUS_IGNORE
-      parameter(MPI_STATUS_IGNORE=-1)
+! These should be ordered as in smpi_f77.c
+      integer MPI_IN_PLACE, MPI_BOTTOM
+      integer MPI_STATUS_IGNORE, MPI_STATUSES_IGNORE
+      common /smpi/ MPI_IN_PLACE, MPI_BOTTOM
+      common /smpi/ MPI_STATUS_IGNORE, MPI_STATUSES_IGNORE
 
       integer MPI_REQUEST_NULL
       parameter(MPI_REQUEST_NULL=-1)
       integer MPI_INTEGER_KIND
       parameter(MPI_INTEGER_KIND=4)
 
-! These should be ordered as in smpi_f77.c
       integer MPI_DATATYPE_NULL, MPI_BYTE, MPI_CHARACTER, MPI_LOGICAL
       integer MPI_INTEGER, MPI_INTEGER1, MPI_INTEGER2, MPI_INTEGER4
       integer MPI_INTEGER8, MPI_REAL, MPI_REAL4, MPI_REAL8
index 3901734..5fd5a7c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -41,12 +41,10 @@ SG_BEGIN_DECL()
 #define SMPI_RAND_SEED 5
 #define MPI_ANY_SOURCE -555
 #define MPI_BOTTOM (void *)-111
-#define MPI_FORTRAN_BOTTOM -111
 #define MPI_PROC_NULL -666
 #define MPI_ANY_TAG -444
 #define MPI_UNDEFINED -333
 #define MPI_IN_PLACE (void *)-222
-#define MPI_FORTRAN_IN_PLACE -222
 
 // errorcodes
 #define MPI_SUCCESS       0
@@ -167,8 +165,6 @@ typedef struct {
 
 #define MPI_STATUS_IGNORE ((MPI_Status*)NULL)
 #define MPI_STATUSES_IGNORE ((MPI_Status*)NULL)
-#define MPI_FORTRAN_STATUS_IGNORE -1
-#define MPI_FORTRAN_STATUSES_IGNORE -1
 
 #define MPI_DATATYPE_NULL ((MPI_Datatype)NULL)
 XBT_PUBLIC_DATA( MPI_Datatype ) MPI_CHAR;
@@ -677,6 +673,7 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Comm_get_parent,( MPI_Comm *parent));
 //FIXME: End of all the not yet implemented stuff
 
 // smpi functions
+XBT_PUBLIC(int) smpi_global_size(void);
 XBT_PUBLIC(MPI_Comm) smpi_process_comm_self(void);
 /*
 XBT_PUBLIC(void) smpi_exit(int);
index 534c443..c4ea46f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2013. The SimGrid Team.
+/* Copyright (c) 2011-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 
 #define SMPI_VARINIT_GLOBAL(name,type)                          \
 type *name = NULL;                                              \
-void __attribute__((weak,constructor)) __preinit_##name(void) { \
+static void __attribute__((constructor)) __preinit_##name(void) { \
    if(!name)                                                    \
-      name = (type*)malloc(smpi_global_size() * sizeof(type));  \
+      name = (type*)calloc(smpi_global_size(), sizeof(type));   \
 }                                                               \
-void __attribute__((weak,destructor)) __postfini_##name(void) { \
+static void __attribute__((destructor)) __postfini_##name(void) { \
    free(name);                                                  \
    name = NULL;                                                 \
 }
 
 #define SMPI_VARINIT_GLOBAL_AND_SET(name,type,expr)             \
 type *name = NULL;                                              \
-void __attribute__((weak,constructor)) __preinit_##name(void) { \
+static void __attribute__((constructor)) __preinit_##name(void) { \
    size_t size = smpi_global_size();                            \
    size_t i;                                                    \
    type value = expr;                                           \
@@ -35,7 +35,7 @@ void __attribute__((weak,constructor)) __preinit_##name(void) { \
       }                                                         \
    }                                                            \
 }                                                               \
-void __attribute__((weak,destructor)) __postfini_##name(void) { \
+static void __attribute__((destructor)) __postfini_##name(void) { \
    free(name);                                                  \
    name = NULL;                                                 \
 }
@@ -55,7 +55,7 @@ XBT_PUBLIC(void) smpi_free_static(void);
 #define SMPI_VARINIT_STATIC(name,type)                      \
 static type *name = NULL;                                   \
 if(!name) {                                                 \
-   name = (type*)malloc(smpi_global_size() * sizeof(type)); \
+   name = (type*)calloc(smpi_global_size(), sizeof(type));  \
    smpi_register_static(name, xbt_free);                    \
 }
 
index 08874c7..b22ab7c 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 main smpi_windows_main__(int argc, char **argv);\
 int main(int argc, char **argv){\
 smpi_main(&smpi_windows_main__,argc,argv);\
index e558101..a61dabc 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 
 #include <xbt/misc.h>
 #include <smpi/smpi.h>
+/* those are defined in f2c.h */
+#undef min
+#undef max
 #include <f2c.h>
 
 XBT_PUBLIC_DATA(__thread int) smpi_current_rank;
 
 XBT_PUBLIC(int) smpi_process_argc(void);
 XBT_PUBLIC(int) smpi_process_getarg(integer* index, char* dst, ftnlen len);
-XBT_PUBLIC(int) smpi_global_size(void);
 
 #define smpi_sample_local__(pi,pt) \
    { \
index df32d1b..cb57fd8 100644 (file)
@@ -104,6 +104,8 @@ XBT_PUBLIC(void) STag_surfxml_config(void);
 XBT_PUBLIC(void) ETag_surfxml_config(void);
 XBT_PUBLIC(void) STag_surfxml_prop(void);
 XBT_PUBLIC(void) ETag_surfxml_prop(void);
+XBT_PUBLIC(void) STag_surfxml_model___prop(void);
+XBT_PUBLIC(void) ETag_surfxml_model___prop(void);
 
 /* XML application data. */
 typedef int AT_surfxml_mount_name;
@@ -127,6 +129,8 @@ typedef int AT_surfxml_link_latency___file;
 #define AU_surfxml_link_latency___file NULL
 typedef int AT_surfxml_peer_availability___file;
 #define AU_surfxml_peer_availability___file NULL
+typedef int AT_surfxml_model___prop_value;
+#define AU_surfxml_model___prop_value NULL
 typedef enum { AU_surfxml_link___ctn_direction, A_surfxml_link___ctn_direction_UP,A_surfxml_link___ctn_direction_DOWN,A_surfxml_link___ctn_direction_NONE } AT_surfxml_link___ctn_direction;
 typedef enum { AU_surfxml_host_state, A_surfxml_host_state_ON,A_surfxml_host_state_OFF } AT_surfxml_host_state;
 typedef int AT_surfxml_AS_id;
@@ -151,6 +155,8 @@ typedef int AT_surfxml_bypassASroute_dst;
 #define AU_surfxml_bypassASroute_dst NULL
 typedef int AT_surfxml_host___link_id;
 #define AU_surfxml_host___link_id NULL
+typedef int AT_surfxml_model___prop_id;
+#define AU_surfxml_model___prop_id NULL
 typedef int AT_surfxml_ASroute_src;
 #define AU_surfxml_ASroute_src NULL
 typedef int AT_surfxml_cluster_prefix;
@@ -185,7 +191,7 @@ typedef int AT_surfxml_cluster_loopback___bw;
 #define AU_surfxml_cluster_loopback___bw NULL
 typedef int AT_surfxml_ASroute_gw___src;
 #define AU_surfxml_ASroute_gw___src NULL
-typedef enum { AU_surfxml_AS_routing, A_surfxml_AS_routing_Full,A_surfxml_AS_routing_Floyd,A_surfxml_AS_routing_Dijkstra,A_surfxml_AS_routing_DijkstraCache,A_surfxml_AS_routing_None,A_surfxml_AS_routing_Vivaldi,A_surfxml_AS_routing_Cluster } AT_surfxml_AS_routing;
+typedef enum { AU_surfxml_AS_routing, A_surfxml_AS_routing_Full,A_surfxml_AS_routing_Floyd,A_surfxml_AS_routing_Dijkstra,A_surfxml_AS_routing_DijkstraCache,A_surfxml_AS_routing_None,A_surfxml_AS_routing_Vivaldi,A_surfxml_AS_routing_Cluster,A_surfxml_AS_routing_Cluster___torus } AT_surfxml_AS_routing;
 typedef int AT_surfxml_link_bandwidth;
 #define AU_surfxml_link_bandwidth NULL
 typedef int AT_surfxml_cluster_id;
@@ -224,6 +230,7 @@ typedef int AT_surfxml_random_max;
 #define AU_surfxml_random_max NULL
 typedef int AT_surfxml_link_id;
 #define AU_surfxml_link_id NULL
+typedef enum { AU_surfxml_cluster_topology, A_surfxml_cluster_topology_FLAT,A_surfxml_cluster_topology_TORUS } AT_surfxml_cluster_topology;
 typedef int AT_surfxml_process_host;
 #define AU_surfxml_process_host NULL
 typedef int AT_surfxml_cabinet_id;
@@ -261,6 +268,8 @@ typedef int AT_surfxml_trace___connect_trace;
 #define AU_surfxml_trace___connect_trace NULL
 typedef int AT_surfxml_cluster_power;
 #define AU_surfxml_cluster_power NULL
+typedef int AT_surfxml_cluster_topo___parameters;
+#define AU_surfxml_cluster_topo___parameters NULL
 typedef int AT_surfxml_process_function;
 #define AU_surfxml_process_function NULL
 typedef int AT_surfxml_peer_id;
@@ -365,6 +374,9 @@ XBT_PUBLIC_DATA(short int) surfxml_link_latency___file_isset;
 XBT_PUBLIC_DATA(AT_surfxml_peer_availability___file) AX_surfxml_peer_availability___file;
 #define A_surfxml_peer_availability___file (surfxml_bufferstack + AX_surfxml_peer_availability___file)
 XBT_PUBLIC_DATA(short int) surfxml_peer_availability___file_isset;
+XBT_PUBLIC_DATA(AT_surfxml_model___prop_value) AX_surfxml_model___prop_value;
+#define A_surfxml_model___prop_value (surfxml_bufferstack + AX_surfxml_model___prop_value)
+XBT_PUBLIC_DATA(short int) surfxml_model___prop_value_isset;
 XBT_PUBLIC_DATA(AT_surfxml_link___ctn_direction) AX_surfxml_link___ctn_direction;
 #define A_surfxml_link___ctn_direction AX_surfxml_link___ctn_direction
 XBT_PUBLIC_DATA(short int) surfxml_link___ctn_direction_isset;
@@ -404,6 +416,9 @@ XBT_PUBLIC_DATA(short int) surfxml_bypassASroute_dst_isset;
 XBT_PUBLIC_DATA(AT_surfxml_host___link_id) AX_surfxml_host___link_id;
 #define A_surfxml_host___link_id (surfxml_bufferstack + AX_surfxml_host___link_id)
 XBT_PUBLIC_DATA(short int) surfxml_host___link_id_isset;
+XBT_PUBLIC_DATA(AT_surfxml_model___prop_id) AX_surfxml_model___prop_id;
+#define A_surfxml_model___prop_id (surfxml_bufferstack + AX_surfxml_model___prop_id)
+XBT_PUBLIC_DATA(short int) surfxml_model___prop_id_isset;
 XBT_PUBLIC_DATA(AT_surfxml_ASroute_src) AX_surfxml_ASroute_src;
 #define A_surfxml_ASroute_src (surfxml_bufferstack + AX_surfxml_ASroute_src)
 XBT_PUBLIC_DATA(short int) surfxml_ASroute_src_isset;
@@ -521,6 +536,9 @@ XBT_PUBLIC_DATA(short int) surfxml_random_max_isset;
 XBT_PUBLIC_DATA(AT_surfxml_link_id) AX_surfxml_link_id;
 #define A_surfxml_link_id (surfxml_bufferstack + AX_surfxml_link_id)
 XBT_PUBLIC_DATA(short int) surfxml_link_id_isset;
+XBT_PUBLIC_DATA(AT_surfxml_cluster_topology) AX_surfxml_cluster_topology;
+#define A_surfxml_cluster_topology AX_surfxml_cluster_topology
+XBT_PUBLIC_DATA(short int) surfxml_cluster_topology_isset;
 XBT_PUBLIC_DATA(AT_surfxml_process_host) AX_surfxml_process_host;
 #define A_surfxml_process_host (surfxml_bufferstack + AX_surfxml_process_host)
 XBT_PUBLIC_DATA(short int) surfxml_process_host_isset;
@@ -578,6 +596,9 @@ XBT_PUBLIC_DATA(short int) surfxml_trace___connect_trace_isset;
 XBT_PUBLIC_DATA(AT_surfxml_cluster_power) AX_surfxml_cluster_power;
 #define A_surfxml_cluster_power (surfxml_bufferstack + AX_surfxml_cluster_power)
 XBT_PUBLIC_DATA(short int) surfxml_cluster_power_isset;
+XBT_PUBLIC_DATA(AT_surfxml_cluster_topo___parameters) AX_surfxml_cluster_topo___parameters;
+#define A_surfxml_cluster_topo___parameters (surfxml_bufferstack + AX_surfxml_cluster_topo___parameters)
+XBT_PUBLIC_DATA(short int) surfxml_cluster_topo___parameters_isset;
 XBT_PUBLIC_DATA(AT_surfxml_process_function) AX_surfxml_process_function;
 #define A_surfxml_process_function (surfxml_bufferstack + AX_surfxml_process_function)
 XBT_PUBLIC_DATA(short int) surfxml_process_function_isset;
index d9e91ef..5c0e90c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -10,6 +10,8 @@
 #include "xbt/lib.h"
 #include "simgrid/platf_interface.h"
 
+SG_BEGIN_DECL()
+
 XBT_PUBLIC(xbt_lib_t) host_lib;
 XBT_PUBLIC(int) ROUTING_HOST_LEVEL; //Routing level
 XBT_PUBLIC(int)  SURF_CPU_LEVEL;    //Surf cpu level
@@ -47,4 +49,6 @@ void routing_AS_end(sg_platf_AS_cbarg_t AS);
 
 void routing_cluster_add_backbone(void* bb);
 
+SG_END_DECL()
+
 #endif                          /* _SURF_SURF_H */
index b143fa8..8431616 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 96c204a..21dd04c 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt.h - Public interface to the xbt (SimGrid's toolbox)                  */
 
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index cb3041f..8b80e54 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2012, 2014. 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. */
 
 /* RngStream.h for ANSI C */
 #ifndef RNGSTREAM_H
index 4d90d1d..58c226d 100644 (file)
@@ -1,6 +1,6 @@
 /*  xbt/asserts.h -- assertion mecanism                                     */
 
-/* Copyright (c) 2005-2007, 2009-2012. The SimGrid Team.
+/* Copyright (c) 2005-2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 0cdf31f..c24453f 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2011-2014. 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_AUTOMATON_H
 #define _XBT_AUTOMATON_H
 
@@ -28,7 +34,7 @@ typedef struct xbt_automaton {
 typedef struct xbt_automaton* xbt_automaton_t;
 
 typedef struct xbt_automaton_exp_label{
-  enum{or=0, and=1, not=2, predicat=3, one=4} type;
+  enum{AUT_OR=0, AUT_AND=1, AUT_NOT=2, AUT_PREDICAT=3, AUT_ONE=4} type;
   union{
     struct{
       struct xbt_automaton_exp_label* left_exp;
index cc255f3..f109024 100644 (file)
@@ -2,7 +2,7 @@
 
 /* This is useful to build named structs, like option or property sets.     */
 
-/* Copyright (c) 2004-2007, 2009-2013. The SimGrid Team.
+/* Copyright (c) 2004-2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 6440034..37df800 100644 (file)
@@ -1,6 +1,6 @@
 /* cunit - A little C Unit facility                                         */
 
-/* Copyright (c) 2005-2012. The SimGrid Team.
+/* Copyright (c) 2005-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 4f2a88c..41a4aba 100644 (file)
@@ -1,12 +1,11 @@
 /* xbt/dict.h -- api to a generic dictionary                                */
 
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. 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_DICT_H
 #define _XBT_DICT_H
 
@@ -114,6 +113,12 @@ XBT_PUBLIC(uintptr_t) xbt_dicti_get(xbt_dict_t dict, uintptr_t key);
 XBT_PUBLIC(void) xbt_dicti_remove(xbt_dict_t dict, uintptr_t key);
 #endif
 
+struct s_xbt_dict_cursor {
+  xbt_dictelm_t current;
+  int line;
+  xbt_dict_t dict;
+};
+
 /** @} */
 /** @defgroup XBT_dict_curs Cursors on dictionaries
  *  @ingroup XBT_dict
@@ -137,11 +142,6 @@ XBT_PUBLIC(void) xbt_dicti_remove(xbt_dict_t dict, uintptr_t key);
  *  @{ */
 
   /** @brief Cursor on dictionaries (opaque type) */
-struct s_xbt_dict_cursor {
-  xbt_dictelm_t current;
-  int line;
-  xbt_dict_t dict;
-};
 typedef struct s_xbt_dict_cursor *xbt_dict_cursor_t;
 
 static inline xbt_dictelm_t xbt_dict_cursor_get_elm(xbt_dict_cursor_t cursor) {
index f0c14cc..823dd41 100644 (file)
@@ -1,6 +1,6 @@
 /* dynar - a generic dynamic array                                          */
 
-/* Copyright (c) 2004-2007, 2009-2013. The SimGrid Team.
+/* Copyright (c) 2004-2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index e57f166..dd79d32 100644 (file)
@@ -1,6 +1,8 @@
 /* ex - Exception Handling                                                  */
 
-/*  Copyright (c) 2005-2013. The SimGrid Team.                              */
+/* Copyright (c) 2005-2014. The SimGrid Team.
+ * All rights reserved.                                                     */
+
 /*  Copyright (c) 2002-2004 Ralf S. Engelschall <rse@engelschall.com>       */
 /*  Copyright (c) 2002-2004 The OSSP Project <http://www.ossp.org/>         */
 /*  Copyright (c) 2002-2004 Cable & Wireless <http://www.cw.com/>           */
@@ -262,7 +264,8 @@ typedef enum {
   thread_error,                 /**< error while [un]locking */
   host_error,                   /**< host failed */
   tracing_error,                /**< error during the simulation tracing */
-  io_error                      /**< disk or file error */
+  io_error,                     /**< disk or file error */
+  vm_error                      /**< vm  error */
 } xbt_errcat_t;
 
 XBT_PUBLIC(const char *) xbt_ex_catname(xbt_errcat_t cat);
index e1871ba..c57456b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2007, 2009-2012. The SimGrid Team.
+/* Copyright (c) 2004-2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 42a8cf1..18d8c25 100644 (file)
@@ -1,6 +1,6 @@
 /* function_type.h - classical types for pointer to function                */
 
-/* Copyright (c) 2006-2007, 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2006-2007, 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index c92df8c..6fb5718 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2007, 2009-2012. The SimGrid Team.
+/* Copyright (c) 2006-2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8f45895..c10c029 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2006-2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index dcefb7c..a5014dd 100644 (file)
@@ -1,6 +1,6 @@
 /* hash.h - Various hashing functions.                                      */
 
-/* Copyright (c) 2008-2011. The SimGrid Team.
+/* Copyright (c) 2008-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 29a9149..02fdf0d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2004-2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -10,6 +10,8 @@
 #include "xbt/misc.h"
 #include "xbt/dynar.h"          /* void_f_pvoid_t */
 
+SG_BEGIN_DECL()
+
 /** @addtogroup XBT_heap
  *  @brief This section describes the API to generic heap with O(log(n)) access.
  *
@@ -33,6 +35,6 @@ XBT_PUBLIC(void) xbt_heap_set_update_callback(xbt_heap_t H,
                                                                        *,
                                                                        int));
 XBT_PUBLIC(void *) xbt_heap_remove(xbt_heap_t H, int i);
-
 /* @} */
+SG_END_DECL()
 #endif                          /* _XBT_HEAP_H */
index 5139ff8..cfb7702 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt/lib.h - api to a generic library                                     */
 
-/* Copyright (c) 2011, 2013. The SimGrid Team.
+/* Copyright (c) 2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -26,10 +26,12 @@ XBT_PUBLIC(void) xbt_lib_free(xbt_lib_t * lib);
 XBT_PUBLIC(int) xbt_lib_add_level(xbt_lib_t lib, void_f_pvoid_t free_f);
 XBT_PUBLIC(void) xbt_lib_set(xbt_lib_t lib, const char *name, int level,
                              void *obj);
+XBT_PUBLIC(void) xbt_lib_unset(xbt_lib_t lib, const char *key, int level, int invoke_callback);
 XBT_PUBLIC(void *) xbt_lib_get_or_null(xbt_lib_t lib, const char *name,
                                        int level);
 XBT_PUBLIC(xbt_dictelm_t) xbt_lib_get_elm_or_null(xbt_lib_t lib, const char *key);
 XBT_PUBLIC(void *) xbt_lib_get_level(xbt_dictelm_t elm, int level);
+XBT_PUBLIC(void) xbt_lib_remove(xbt_lib_t lib, const char *key);
 
 #define xbt_lib_length(lib) xbt_dict_length((lib)->dict)
 
index 697cb50..c33d0ff 100644 (file)
@@ -1,6 +1,6 @@
 /* log - a generic logging facility in the spirit of log4j                  */
 
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -126,6 +126,7 @@ typedef enum {
  * to avoid an extra declaration of root when XBT_LOG_NEW_SUBCATEGORY is called by
  * XBT_LOG_NEW_CATEGORY */
 #define XBT_LOG_NEW_SUBCATEGORY_helper(catName, parent, desc)           \
+  SG_BEGIN_DECL()                                                       \
   XBT_PUBLIC(void) _XBT_LOGV_CTOR(catName)(void) _XBT_LOGV_CTOR_ATTRIBUTE; \
   void _XBT_LOGV_CTOR(catName)(void)                                    \
   {                                                                     \
@@ -134,6 +135,7 @@ typedef enum {
       _xbt_log_cat_init(&_XBT_LOGV(catName), xbt_log_priority_uninitialized); \
     }                                                                   \
   }                                                                     \
+  SG_END_DECL()                                                         \
   XBT_EXPORT_NO_IMPORT(s_xbt_log_category_t) _XBT_LOGV(catName) = {     \
     &_XBT_LOGV(parent),                                                 \
     NULL /* firstChild */,                                              \
@@ -181,7 +183,7 @@ typedef enum {
  * Indicates which category is the default one.
  */
 
-#if defined(XBT_LOG_MAYDAY) || defined(SUPERNOVAE_MODE) /*|| defined (NLOG) * turning logging off */
+#if defined(XBT_LOG_MAYDAY) /*|| defined (NLOG) * turning logging off */
 # define XBT_LOG_DEFAULT_CATEGORY(cname)
 #else
 # define XBT_LOG_DEFAULT_CATEGORY(cname) \
index dcf75a5..6241313 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt/mallocator.h -- api to recycle allocated objects                     */
 
-/* Copyright (c) 2006-2007, 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2006-2007, 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 5ce5bab..dfbc6bb 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt_matrix_t management functions                                        */
 
-/* Copyright (c) 2006-2007, 2009-2010. The SimGrid Team.
+/* Copyright (c) 2006-2007, 2009-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index a6f65de..43fb347 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt.h - Public interface to the xbt (simgrid's toolbox)                     */
 
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index cf50ddf..dc3a51c 100644 (file)
@@ -1,13 +1,12 @@
 /* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
    This file was then part of the GNU C Library. */
 
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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 MMALLOC_H
 #define MMALLOC_H 1
 
index b5b9a82..9405484 100644 (file)
@@ -1,6 +1,6 @@
 /* module - modularize the code                                             */
 
-/* Copyright (c) 2004-2007, 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2004-2007, 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 
 #include <xbt/misc.h>           /* XBT_PUBLIC */
 
+SG_BEGIN_DECL()
+
 XBT_PUBLIC(void) xbt_init(int *argc, char **argv);
 XBT_PUBLIC(void) xbt_exit(void);
+
+SG_END_DECL()
+
 #endif                          /* _XBT_MODULE_H */
index 624d278..51e5cc6 100644 (file)
@@ -1,6 +1,6 @@
 /* A thread pool.                                          */
 
-/* Copyright (c) 2007, 2009-2013. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index a0767c0..4e402c0 100644 (file)
@@ -1,6 +1,6 @@
 /* peer.h - peer (remote processes) management functions                    */
 
-/* Copyright (c) 2006-2007, 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2006-2007, 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index b23dd50..4576938 100644 (file)
@@ -1,7 +1,7 @@
 /* A (synchronized) message queue.                                          */
 /* Popping an empty queue is blocking, as well as pushing a full one        */
 
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 069052d..675a5ad 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt/replay_reader.h -- Tools to parse a replay file                */
 
-/* Copyright (c) 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -28,6 +28,8 @@ XBT_PUBLIC(const char *) xbt_replay_reader_position(xbt_replay_reader_t reader);
 
 XBT_PUBLIC(int) xbt_replay_action_runner(int argc, char *argv[]);
 
+XBT_PUBLIC(int) _xbt_replay_is_active(void);
+
 XBT_PUBLIC(void) _xbt_replay_action_init(void);
 XBT_PUBLIC(void) _xbt_replay_action_exit(void);
 
index 6264d25..1d87320 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt/set.h -- api to a generic dictionary                                 */
 
-/* Copyright (c) 2004-2007, 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2004-2007, 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 2c11a20..f325d2f 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2010, 2014. 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_SETSET_H
 #define _XBT_SETSET_H
 #include "xbt/misc.h"
index dc164b7..be647e8 100644 (file)
@@ -1,6 +1,6 @@
 /* str.h - XBT string related functions.                                    */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3ed91f4..79b2658 100644 (file)
@@ -1,6 +1,6 @@
 /* strbuff -- string buffers                                                */
 
-/* Copyright (c) 2007-2011. The SimGrid Team.
+/* Copyright (c) 2007-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 2e3bed9..df2bdfd 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3a3d3e2..c41c26c 100644 (file)
@@ -1,7 +1,7 @@
 /* xbt/synchro_core.h -- Synchronization tools                              */
 /* Usable in simulator, (or in real life when mixing with GRAS)             */
 
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8d3a61e..390ef24 100644 (file)
@@ -2,7 +2,7 @@
 /*  no system header should be loaded out of this file so that we have only */
 /*  one file to check when porting to another OS                            */
 
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index cf25980..3b0a63e 100644 (file)
@@ -1,10 +1,10 @@
 /* virtu - virtualization layer for XBT to choose between GRAS and MSG implementation */
 
-/* Copyright (c) 2007, 2009-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2010, 2012-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef __XBT_VIRTU_H__
 #define __XBT_VIRTU_H__
index 0cc53b6..f58a6d9 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2010, 2014. The SimGrid Team.\r
+ * All rights reserved.                                                     */\r
+\r
+/* This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of the license (GNU LGPL) which comes with this package. */\r
+\r
 /*\r
  *      win32-ucontext: Unix ucontext_t operations on Windows platforms\r
  *      Copyright(C) 2007 Panagiotis E. Hadjidoukas\r
index 6283cfc..eede122 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt/xbt_os_thread.h -- Thread portability layer                          */
 
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index c626424..807cf17 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
similarity index 98%
rename from src/bindings/java/MANIFEST.MF
rename to src/bindings/java/MANIFEST.MF.in
index 8d2c039..fc7cbba 100644 (file)
@@ -2,4 +2,3 @@ Manifest-Version: 1.0
 Built-By: Da SimGrid team
 Main-Class: org.simgrid.msg.Msg
 Class-Path: .
-
index 3599905..bfc4115 100644 (file)
@@ -1,10 +1,10 @@
 /* Java Wrappers to the MSG API.                                            */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <msg/msg.h>
 #include <simgrid/simix.h>
@@ -33,6 +33,8 @@
 #endif
 /* end of eclipse-mandated pimple */
 
+int JAVA_HOST_LEVEL;
+
 static int create_jprocess(int argc, char *argv[]);
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg);
@@ -79,6 +81,10 @@ Java_org_simgrid_msg_Msg_getClock(JNIEnv * env, jclass cls)
   return (jdouble) MSG_get_clock();
 }
 
+static void __JAVA_host_priv_free(void *host)
+{
+}
+
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs)
 {
@@ -95,14 +101,10 @@ Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs)
 
   (*env)->GetJavaVM(env, &__java_vm);
 
-  if ((*env)->FindClass(env, "java/dyn/Coroutine")) {
-       XBT_INFO("Using Coroutines. Your simulation is on steroid.");
-       smx_factory_initializer_to_use = SIMIX_ctx_cojava_factory_init;
-  }
-  else {
-       XBT_INFO("Using regular java threads. Coroutines could speed your simulation up.");
-       smx_factory_initializer_to_use = SIMIX_ctx_java_factory_init;
-  }
+  if ((*env)->FindClass(env, "java/dyn/Coroutine"))
+    smx_factory_initializer_to_use = SIMIX_ctx_cojava_factory_init;
+  else
+    smx_factory_initializer_to_use = SIMIX_ctx_java_factory_init;
   jthrowable exc = (*env)->ExceptionOccurred(env);
   if (exc) {
     (*env)->ExceptionClear(env);
@@ -127,10 +129,19 @@ Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs)
 
   MSG_init(&argc, argv);
 
+  JAVA_HOST_LEVEL = xbt_lib_add_level(host_lib, (void_f_pvoid_t) __JAVA_host_priv_free);
+
   for (index = 0; index < argc; index++)
     free(argv[index]);
 
   free(argv);
+
+  if (smx_factory_initializer_to_use == SIMIX_ctx_cojava_factory_init)
+    XBT_INFO("Using Coroutines. Your simulation is on steroid.");
+  else if (smx_factory_initializer_to_use == SIMIX_ctx_java_factory_init)
+    XBT_INFO("Using regular java threads. Coroutines could speed your simulation up.");
+  else
+    xbt_die("Unknown context factory. Please report bug.");
 }
 
 JNIEXPORT void JNICALL
@@ -152,7 +163,7 @@ JNIEXPORT void JNICALL
   /* Cleanup java hosts */
   hosts = MSG_hosts_as_dynar();
   for (index = 0; index < xbt_dynar_length(hosts) - 1; index++) {
-    jhost = (jobject) MSG_host_get_data(xbt_dynar_get_as(hosts,index,msg_host_t));
+    jhost = (jobject) xbt_lib_get_level(xbt_dynar_get_as(hosts,index,msg_host_t), JAVA_HOST_LEVEL);
     if (jhost)
       jhost_unref(env, jhost);
 
index 092bcfd..c6c8625 100644 (file)
@@ -1,16 +1,19 @@
 /* Java Wrappers to the MSG API.                                            */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef MSG4JAVA_H
 #define MSG4JAVA_H
 #include <msg/msg.h>
 #include <jni.h>
 
+extern int JAVA_HOST_LEVEL;
+extern xbt_lib_t host_lib;
+
 JavaVM *get_java_VM(void);
 JNIEnv *get_current_thread_env(void);
 /**
index 3589783..a3daec6 100644 (file)
@@ -1,10 +1,10 @@
 /* Functions related to the java host instances.                            */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "xbt/str.h"
 #include "xbt/dict.h"
@@ -158,7 +158,7 @@ Java_org_simgrid_msg_As_getHosts(JNIEnv * env, jobject jas)
 
     host = xbt_dynar_get_as(table,index,msg_host_t);
 
-    jhost = (jobject) (MSG_host_get_data(host));
+    jhost = (jobject) xbt_lib_get_level(host, JAVA_HOST_LEVEL);
     if (!jhost) {
       jname = (*env)->NewStringUTF(env, MSG_host_get_name(host));
 
index 139c286..ad928b6 100644 (file)
@@ -1,11 +1,10 @@
 /* Functions related to the java As instances.                            */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef MSG_JAS_H
 #define MSG_JAS_H
index 6a4a66e..85b70d6 100644 (file)
@@ -1,7 +1,11 @@
 /* Functions related to the java comm instances                             */
 
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "jmsg_comm.h"
 #include "jxbt_utilities.h"
 #include "jmsg.h"
index 13b1b7e..5cb7ba5 100644 (file)
@@ -1,8 +1,11 @@
 /* Functions related to the java comm instances                             */
 
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #ifndef MSG_JCOMM_H
 #define MSG_JCOMM_H
 #include <jni.h>
index fb2557a..f8adbda 100644 (file)
@@ -1,9 +1,11 @@
 /* Functions related to the java file API.                            */
-/* Copyright (c) 2012-2013. The SimGrid Team.
+
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "jmsg_file.h"
 #include "jxbt_utilities.h"
 
@@ -38,13 +40,13 @@ Java_org_simgrid_msg_File_open(JNIEnv *env, jobject jfile, jobject jstorage, job
 JNIEXPORT jlong JNICALL
 Java_org_simgrid_msg_File_read(JNIEnv *env, jobject jfile, jlong jsize) {
   msg_file_t file = jfile_get_native(env, jfile);
-  return (jlong)MSG_file_read(file, (sg_storage_size_t)jsize);
+  return (jlong)MSG_file_read(file, (sg_size_t)jsize);
 }
 
 JNIEXPORT jlong JNICALL
 Java_org_simgrid_msg_File_write(JNIEnv *env, jobject jfile, jlong jsize) {
   msg_file_t file = jfile_get_native(env, jfile);
-  return (jlong)MSG_file_write(file, (sg_storage_size_t)jsize);
+  return (jlong)MSG_file_write(file, (sg_size_t)jsize);
 }
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_File_close(JNIEnv *env, jobject jfile) {
index f79ae22..05dc575 100644 (file)
@@ -1,9 +1,10 @@
 /* Functions related to the java file API.                            */
-/* Copyright (c) 2012-2013. The SimGrid Team.
+
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef MSG_JFILE_H
 #define MSG_JFILE_H
index 9a3a1ff..81ed7f7 100644 (file)
@@ -1,10 +1,10 @@
 /* Functions related to the java host instances.                            */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "xbt/str.h"
 #include "msg/msg.h"
@@ -18,7 +18,6 @@ static jmethodID jhost_method_Host_constructor;
 static jfieldID jhost_field_Host_bind;
 static jfieldID jhost_field_Host_name;
 
-
 jobject jhost_new_instance(JNIEnv * env) {
   jclass cls = jxbt_get_class(env, "org/simgrid/msg/Host");
   return (*env)->NewObject(env, cls, jhost_method_Host_constructor);
@@ -85,7 +84,7 @@ Java_org_simgrid_msg_Host_getByName(JNIEnv * env, jclass cls,
   }
   (*env)->ReleaseStringUTFChars(env, jname, name);
 
-  if (!MSG_host_get_data(host)) {       /* native host not associated yet with java host */
+  if (!xbt_lib_get_level(host, JAVA_HOST_LEVEL)) {       /* native host not associated yet with java host */
 
     /* Instantiate a new java host */
     jhost = jhost_new_instance(env);
@@ -110,11 +109,11 @@ Java_org_simgrid_msg_Host_getByName(JNIEnv * env, jclass cls,
     /* the native host data field is set with the global reference to the
      * java host returned by this function
      */
-    MSG_host_set_data(host, (void *) jhost);
+    xbt_lib_set(host_lib, host->key, JAVA_HOST_LEVEL, (void *) jhost);
   }
 
   /* return the global reference to the java host instance */
-  return (jobject) MSG_host_get_data(host);
+  return (jobject) xbt_lib_get_level(host, JAVA_HOST_LEVEL);
 }
 
 JNIEXPORT jobject JNICALL
@@ -123,7 +122,7 @@ Java_org_simgrid_msg_Host_currentHost(JNIEnv * env, jclass cls) {
 
   msg_host_t host = MSG_host_self();
 
-  if (!MSG_host_get_data(host)) {
+  if (!xbt_lib_get_level(host, JAVA_HOST_LEVEL)) {
     /* the native host not yet associated with the java host instance */
 
     /* instanciate a new java host instance */
@@ -147,13 +146,26 @@ Java_org_simgrid_msg_Host_currentHost(JNIEnv * env, jclass cls) {
     (*env)->SetObjectField(env, jhost, jhost_field_Host_name, jname);
     /* Bind & store it */
     jhost_bind(jhost, host, env);
-    MSG_host_set_data(host, (void *) jhost);
+    xbt_lib_set(host_lib, host->key, JAVA_HOST_LEVEL, (void *) jhost);
   } else {
-    jhost = (jobject) MSG_host_get_data(host);
+    jhost = (jobject) xbt_lib_get_level(host, JAVA_HOST_LEVEL);
   }
 
   return jhost;
 }
+
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Host_on(JNIEnv *env, jobject jhost) {
+  msg_host_t host = jhost_get_native(env, jhost);
+  MSG_host_on(host);
+}
+
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Host_off(JNIEnv *env, jobject jhost) {
+  msg_host_t host = jhost_get_native(env, jhost);
+  MSG_host_off(host);
+}
+
 JNIEXPORT jint JNICALL
 Java_org_simgrid_msg_Host_getCount(JNIEnv * env, jclass cls) {
   xbt_dynar_t hosts =  MSG_hosts_as_dynar();
@@ -278,7 +290,7 @@ Java_org_simgrid_msg_Host_all(JNIEnv * env, jclass cls_arg)
 
   for (index = 0; index < count; index++) {
     host = xbt_dynar_get_as(table,index,msg_host_t);
-    jhost = (jobject) (MSG_host_get_data(host));
+    jhost = (jobject) (xbt_lib_get_level(host, JAVA_HOST_LEVEL));
 
     if (!jhost) {
       jname = (*env)->NewStringUTF(env, MSG_host_get_name(host));
index 5eff534..429f8f3 100644 (file)
@@ -1,10 +1,10 @@
 /* Functions related to the java host instances.                            */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef MSG_JHOST_H
 #define MSG_JHOST_H
@@ -112,6 +112,24 @@ Java_org_simgrid_msg_Host_nativeInit(JNIEnv *env, jclass cls);
 JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Host_getByName
     (JNIEnv *, jclass, jstring);
 
+/**
+ * This function start the host if it is off
+ *
+ * @param jhost                        The host to test the validity.
+ * @param env                  The environment of the current thread
+ *
+ */
+JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_on(JNIEnv *env, jobject jhost);
+
+/**
+ * This function stop the host if it is on
+ *
+ * @param jhost                        The host to test the validity.
+ * @param env                  The environment of the current thread
+ *
+ */
+JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_off(JNIEnv *env, jobject jhost);
+
 /*
  * Class               org_simgrid_msg_Host
  * Method              currentHost
index ec9c9d4..fd7b069 100644 (file)
@@ -1,10 +1,11 @@
 /* Functions related to the java process instances.                         */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "jmsg_process.h"
 
 #include "jmsg.h"
index b77e986..54b211d 100644 (file)
@@ -1,10 +1,10 @@
 /* Functions related to the java process instances.                         */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef MSG_JPROCESS_H
 #define MSG_JPROCESS_H
index d8e2c47..5bf195b 100644 (file)
@@ -1,11 +1,10 @@
 /* Functions related to the RngStream Java port                         */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
-
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "jmsg_rngstream.h"
 #include "jxbt_utilities.h"
index e41be2a..e50b218 100644 (file)
@@ -1,10 +1,11 @@
 /* Functions related to the RngStream Java port                         */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #ifndef MSG_RNGSTREAM_H
 #define MSG_RNGSTREAM_H
 #include <jni.h>
index 2fd40e4..71ba2ef 100644 (file)
@@ -1,6 +1,6 @@
 /* Functions exporting the simgrid synchronization mechanisms to the Java world */
 
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index e5e1c42..a42e9b6 100644 (file)
@@ -1,10 +1,10 @@
 /* Functions related to the java process instances.                         */
 
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef MSG_JSYNCHRO_H
 #define MSG_JSYNCHRO_H
index 01c30ce..77aa315 100644 (file)
@@ -1,10 +1,10 @@
 /* Functions related to the java task instances.                            */
 
-/* Copyright (c) 2007, 2009-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2010, 2013-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "jmsg.h"
 
@@ -225,6 +225,18 @@ Java_org_simgrid_msg_Task_execute(JNIEnv * env, jobject jtask)
   }
 }
 
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_Task_setBound(JNIEnv * env, jobject jtask, jdouble load)
+{
+  msg_task_t task = jtask_to_native_task(jtask, env);
+
+  if (!task) {
+    jxbt_throw_notbound(env, "task", jtask);
+    return;
+  }
+  MSG_task_set_bound(task, load);
+}
+
 JNIEXPORT jstring JNICALL
 Java_org_simgrid_msg_Task_getName(JNIEnv * env,
                                        jobject jtask) {
@@ -273,12 +285,12 @@ Java_org_simgrid_msg_Task_getSource(JNIEnv * env,
   if (host == NULL) {
        return NULL;
   }
-  if (!MSG_host_get_data(host)) {
+  if (!xbt_lib_get_level(host, JAVA_HOST_LEVEL)) {
     jxbt_throw_jni(env, "MSG_task_get_source() failed");
     return NULL;
   }
 
-  return (jobject) MSG_host_get_data(host);
+  return (jobject) xbt_lib_get_level(host, JAVA_HOST_LEVEL);
 }
 
 JNIEXPORT jdouble JNICALL
index 197d86a..068dee0 100644 (file)
@@ -1,10 +1,10 @@
 /* Functions related to the java task instances.                            */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef MSG_JTASK_H
 #define MSG_JTASK_H
@@ -124,6 +124,14 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_cancel
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_execute
     (JNIEnv *, jobject);
 
+/*
+ * Class               org_simgrid_msg_Task
+ * Method              setBound
+ * Signature   ()V
+ */
+JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_setBound
+    (JNIEnv *, jobject, jdouble);
+
 /*
  * Class               org_simgrid_msg_Task
  * Method              getName
index 5c54c1f..e508db1 100644 (file)
@@ -1,10 +1,12 @@
 /* Functions related to the MSG VM API. */
 
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "jmsg.h"
 #include "jmsg_vm.h"
 #include "jmsg_host.h"
 #include "jmsg_process.h"
@@ -29,100 +31,161 @@ Java_org_simgrid_msg_VM_nativeInit(JNIEnv *env, jclass cls) {
     jxbt_throw_native(env,bprintf("Can't find some fields in Java class. You should report this bug."));
   }
 }
+
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isCreated(JNIEnv * env, jobject jvm) {
+  msg_vm_t vm = jvm_get_native(env,jvm);
+  return (jint) MSG_vm_is_created(vm);
+}
+
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isRunning(JNIEnv * env, jobject jvm) {
+  msg_vm_t vm = jvm_get_native(env,jvm);
+  return (jint) MSG_vm_is_running(vm);
+}
+
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isMigrating(JNIEnv * env, jobject jvm) {
+  msg_vm_t vm = jvm_get_native(env,jvm);
+  return (jint) MSG_vm_is_migrating(vm);
+}
+
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isSuspended(JNIEnv * env, jobject jvm) {
+  msg_vm_t vm = jvm_get_native(env,jvm);
+  return (jint) MSG_vm_is_suspended(vm);
+}
+
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isSaving(JNIEnv * env, jobject jvm) {
+  msg_vm_t vm = jvm_get_native(env,jvm);
+  return (jint) MSG_vm_is_saving(vm);
+}
+
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isSaved(JNIEnv * env, jobject jvm) {
+  msg_vm_t vm = jvm_get_native(env,jvm);
+  return (jint) MSG_vm_is_saved(vm);
+}
+
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isRestoring(JNIEnv * env, jobject jvm) {
+  msg_vm_t vm = jvm_get_native(env,jvm);
+  return (jint) MSG_vm_is_restoring(vm);
+}
+
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_VM_setBound(JNIEnv *env, jobject jvm, jint load) { 
+
+       msg_vm_t vm = jvm_get_native(env,jvm);
+       double bound = MSG_get_host_speed(vm) * load / 100;
+       MSG_vm_set_bound(vm, bound); 
+}
+
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_VM_start(JNIEnv *env, jobject jvm, jobject jhost, jstring jname, jint jcoreamount) {
+Java_org_simgrid_msg_VM_create(JNIEnv *env, jobject jvm, jobject jhost, jstring jname,
+                              jint jncore, jint jramsize, jint jnetcap, jstring jdiskpath, jint jdisksize, jint jmig_netspeed, jint jdp_intensity) {
+
   msg_host_t host = jhost_get_native(env, jhost);
 
   const char *name;
   name = (*env)->GetStringUTFChars(env, jname, 0);
   name = xbt_strdup(name);
-  
-  msg_vm_t vm = MSG_vm_start(host, name, (int)jcoreamount);
+
+  // TODO disk concerns are not taken into account yet
+  // const char *diskpath;
+  // disk_path = (*env)->GetStringUTFChars(env, jdiskpath, 0);
+  // disk_path = xbt_strdup(disk_path);
+
+  msg_vm_t vm = MSG_vm_create(host, name, (int) jncore, (int) jramsize,
+                 (int) jnetcap, NULL, (int) jdisksize, (int) jmig_netspeed, (int) jdp_intensity);
 
   jvm_bind(env,jvm,vm);
 }
+
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_VM_destroy(JNIEnv *env, jobject jvm) {
   msg_vm_t vm = jvm_get_native(env,jvm);
   MSG_vm_destroy(vm);
 }
-JNIEXPORT jboolean JNICALL
-Java_org_simgrid_msg_VM_isSuspended(JNIEnv *env, jobject jvm) {
-  msg_vm_t vm = jvm_get_native(env,jvm);
-
-  return MSG_vm_is_suspended(vm) ? JNI_TRUE : JNI_FALSE;
-}
-JNIEXPORT jboolean JNICALL
-Java_org_simgrid_msg_VM_isRunning(JNIEnv *env, jobject jvm) {
-  msg_vm_t vm = jvm_get_native(env,jvm);
 
-  return MSG_vm_is_running(vm) ? JNI_TRUE : JNI_FALSE;
-}
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_VM_bind(JNIEnv *env, jobject jvm, jobject jprocess) {
+Java_org_simgrid_msg_VM_start(JNIEnv *env, jobject jvm) {
   msg_vm_t vm = jvm_get_native(env,jvm);
-  msg_process_t process = jprocess_to_native_process(jprocess,env);
-
-  xbt_assert((vm != NULL), "VM object is not bound");
-  xbt_assert((process != NULL), "Process object is not bound.");
-
-  MSG_vm_bind(vm,process);
+  MSG_vm_start(vm);
 }
+
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_VM_unbind(JNIEnv *env, jobject jvm, jobject jprocess) {
+Java_org_simgrid_msg_VM_shutdown(JNIEnv *env, jobject jvm) {
   msg_vm_t vm = jvm_get_native(env,jvm);
-  msg_process_t process = jprocess_to_native_process(jprocess,env);
-
-  MSG_vm_unbind(vm,process);
+  MSG_vm_shutdown(vm);
 }
+
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_VM_migrate(JNIEnv *env, jobject jvm, jobject jhost) {
+Java_org_simgrid_msg_VM_internalmig(JNIEnv *env, jobject jvm, jobject jhost) {
   msg_vm_t vm = jvm_get_native(env,jvm);
   msg_host_t host = jhost_get_native(env, jhost);
-
   MSG_vm_migrate(vm,host);
 }
+
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_VM_suspend(JNIEnv *env, jobject jvm) {
   msg_vm_t vm = jvm_get_native(env,jvm);
-  xbt_ex_t e;
-  TRY {
-    MSG_vm_suspend(vm);
-  }
-  CATCH(e) {
-    xbt_ex_free(e);
-  }
+  MSG_vm_suspend(vm);
 }
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_VM_resume(JNIEnv *env, jobject jvm) {
   msg_vm_t vm = jvm_get_native(env,jvm);
-  xbt_ex_t e;
-  TRY {
-    MSG_vm_resume(vm);
-  }
-  CATCH(e) {
-    xbt_ex_free(e);
-  }
+  MSG_vm_resume(vm);
 }
+
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_VM_shutdown(JNIEnv *env, jobject jvm) {
+Java_org_simgrid_msg_VM_save(JNIEnv *env, jobject jvm) {
   msg_vm_t vm = jvm_get_native(env,jvm);
-  xbt_ex_t e;
-  TRY {
-    MSG_vm_shutdown(vm);
-  }
-  CATCH(e) {
-    xbt_ex_free(e);
-  }
+  MSG_vm_save(vm);
 }
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_VM_reboot(JNIEnv *env, jobject jvm) {
+Java_org_simgrid_msg_VM_restore(JNIEnv *env, jobject jvm) {
   msg_vm_t vm = jvm_get_native(env,jvm);
-  xbt_ex_t e;
-  TRY {
-    MSG_vm_reboot(vm);
-  }
-  CATCH(e) {
-    xbt_ex_free(e);
+  MSG_vm_restore(vm);
+}
+
+
+
+JNIEXPORT jobject JNICALL
+Java_org_simgrid_msg_VM_get_pm(JNIEnv *env, jobject jvm) {
+  jobject jhost;
+  msg_vm_t vm = jvm_get_native(env,jvm);
+  msg_host_t host = MSG_vm_get_pm(vm);
+
+  if (!xbt_lib_get_level(host, JAVA_HOST_LEVEL)) {
+    /* the native host not yet associated with the java host instance */
+
+    /* instanciate a new java host instance */
+    jhost = jhost_new_instance(env);
+
+    if (!jhost) {
+      jxbt_throw_jni(env, "java host instantiation failed");
+      return NULL;
+    }
+
+    /* get a global reference to the newly created host */
+    jhost = jhost_ref(env, jhost);
+
+    if (!jhost) {
+      jxbt_throw_jni(env, "global ref allocation failed");
+      return NULL;
+    }
+    /* Sets the host name */
+    const char *name = MSG_host_get_name(host);
+    jobject jname = (*env)->NewStringUTF(env,name);
+    (*env)->SetObjectField(env, jhost, jxbt_get_jfield(env, (*env)->FindClass(env, "org/simgrid/msg/Host"), "name", "Ljava/lang/String;"), jname);
+    /* Bind & store it */
+    jhost_bind(jhost, host, env);
+    xbt_lib_set(host_lib, host->key, JAVA_HOST_LEVEL, (void *) jhost);
+  } else {
+    jhost = (jobject) xbt_lib_get_level(host, JAVA_HOST_LEVEL);
   }
+
+  return jhost;
 }
index 6bf4284..ba07003 100644 (file)
@@ -1,6 +1,6 @@
 /* Functions related to the MSG VM API. */
 
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -22,55 +22,101 @@ msg_vm_t jvm_get_native(JNIEnv *env, jobject jvm);
  */
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_VM_nativeInit(JNIEnv *env, jclass);
+
 /**
  * Class                       org_simgrid_msg_VM
- * Method                      start
- * Signature   (I)V
+ * Method                      isCreated
+ * Signature   ()B
  */
-JNIEXPORT void JNICALL
-Java_org_simgrid_msg_VM_start(JNIEnv *env, jobject jvm, jobject jhost, jstring jname, jint jcoreamount);
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isCreated(JNIEnv *env, jobject jvm);
 /**
- * Class            org_simgrid_msg_VM
- * Method           destroy
- * Signature    ()V
+ * Class                       org_simgrid_msg_VM
+ * Method                      isRunning
+ * Signature   ()B
  */
-JNIEXPORT void JNICALL
-Java_org_simgrid_msg_VM_destroy(JNIEnv *env, jobject jvm);
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isRunning(JNIEnv *env, jobject jvm);
+/**
+ * Class                       org_simgrid_msg_VM
+ * Method                      isMigrating
+ * Signature   ()B
+ */
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isMigrating(JNIEnv *env, jobject jvm);
 /**
  * Class                       org_simgrid_msg_VM
  * Method                      isSuspended
  * Signature   ()B
  */
-JNIEXPORT jboolean JNICALL
+JNIEXPORT jint JNICALL
 Java_org_simgrid_msg_VM_isSuspended(JNIEnv *env, jobject jvm);
 /**
  * Class                       org_simgrid_msg_VM
- * Method                      isRunning
+ * Method                      isResuming
  * Signature   ()B
  */
-JNIEXPORT jboolean JNICALL
-Java_org_simgrid_msg_VM_isRunning(JNIEnv *env, jobject jvm);
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isResuming(JNIEnv *env, jobject jvm);
+/**
+ * Class                       org_simgrid_msg_VM
+ * Method                      isSuspended
+ * Signature   ()B
+ */
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isSaving(JNIEnv *env, jobject jvm);
 /**
  * Class                       org_simgrid_msg_VM
- * Method                      bind
- * Signature   (Lorg/simgrid/msg/Process;)V
+ * Method                      isSave
+ * Signature   ()B
+ */
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isSaved(JNIEnv *env, jobject jvm);
+/**
+ * Class                       org_simgrid_msg_VM
+ * Method                      isResuming
+ * Signature   ()B
+ */
+JNIEXPORT jint JNICALL
+Java_org_simgrid_msg_VM_isRestoring(JNIEnv *env, jobject jvm);
+/**
+ * Class                       org_simgrid_msg_VM
+ * Method                      setBound
+ * Signature   ()B
+ */
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_VM_setBound(JNIEnv *env, jobject jvm, jint load); 
+
+/**
+ * Class            org_simgrid_msg_VM
+ * Method           create
+ * Signature    ()V
  */
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_VM_bind(JNIEnv *env, jobject jvm, jobject jprocess);
+Java_org_simgrid_msg_VM_create(JNIEnv *env, jobject jvm, jobject jhost, jstring jname,
+                              jint jncore, jint jramsize, jint jnetcap, jstring jdiskpath, jint jdisksize, jint dprate, jint mig_netspeed);
+
+/**
+ * Class            org_simgrid_msg_VM
+ * Method           destroy
+ * Signature    ()V
+ */
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_VM_destroy(JNIEnv *env, jobject jvm);
 /**
  * Class                       org_simgrid_msg_VM
- * Method                      unbind
- * Signature   (Lorg/simgrid/msg/Process;)V
+ * Method                      start
+ * Signature   (I)V
  */
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_VM_unbind(JNIEnv *env, jobject jvm, jobject jprocess);
+Java_org_simgrid_msg_VM_start(JNIEnv *env, jobject jvm);
 /**
  * Class                       org_simgrid_msg_VM
- * Method                      migrate
+ * Method                      nativeMigrate
  * Signature   (Lorg/simgrid/msg/Host;)V
  */
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_VM_migrate(JNIEnv *env, jobject jvm, jobject jhost);
+Java_org_simgrid_msg_VM_internalmig(JNIEnv *env, jobject jvm, jobject jhost);
 /**
  * Class                       org_simgrid_msg_VM
  * Method                      suspend
@@ -94,11 +140,18 @@ JNIEXPORT void JNICALL
 Java_org_simgrid_msg_VM_shutdown(JNIEnv *env, jobject jvm);
 /**
  * Class            org_simgrid_msg_VM
- * Method           reboot
+ * Method           save
+ * Signature    ()V
+ */
+JNIEXPORT void JNICALL
+Java_org_simgrid_msg_VM_save(JNIEnv *env, jobject jvm);
+/**
+ * Class            org_simgrid_msg_VM
+ * Method           save
  * Signature    ()V
  */
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_VM_reboot(JNIEnv *env, jobject jvm);
+Java_org_simgrid_msg_VM_restore(JNIEnv *env, jobject jvm);
 
 JNIEXPORT jobject JNICALL
 Java_org_simgrid_msg_VM_get_pm(JNIEnv *env, jobject jvm);
index d18072c..4e602b4 100644 (file)
@@ -1,11 +1,10 @@
 /* Java Wrappers to the TRACE API.                                           */
 
-/* Copyright (c) 2012-2013. The SimGrid Team.
- * All rights reserved.                                                      */
+/* Copyright (c) 2012-2014. 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. */
-
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 // Please note, this file strongly relies on the jmsg.c, 
 // It will be great that a JNI expert gives a look to validate it - Adrien ;)
index 62d9160..8163775 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /* DO NOT EDIT THIS FILE - it is machine generated */
 #include <jni.h>
 /* Header for class org_simgrid_trace_Trace */
index 0f270e0..9d6e309 100644 (file)
@@ -1,10 +1,10 @@
 /* Various JNI helper functions                                             */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <stdlib.h>             /* abort */
 #include "xbt/misc.h"
index 79450a2..401fe85 100644 (file)
@@ -1,10 +1,10 @@
 /* Various JNI helper functions                                             */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef JXBT_UTILITY_H
 #define JXBT_UTILITY_H
index 0ce5532..e8a7a98 100644 (file)
@@ -1,14 +1,9 @@
-/*
- * Bindings to the MSG hosts
- *
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right 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. 
- *
- */  
+/* Copyright (c) 2006-2014. 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. */
+
 package org.simgrid.msg;
 
 public class As {
index a085ed0..672e702 100644 (file)
@@ -1,13 +1,11 @@
+/* Copyright (c) 2012-2014. 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. */
+
 package org.simgrid.msg;
-/**
-* Copyright (c) 2012-2013. 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.
-*
-*/
+
 /**
  * Communication action, representing an ongoing communication
  * between processes.
index 89c7b97..db3ff43 100644 (file)
@@ -1,13 +1,10 @@
+/* Copyright (c) 2012-2014. 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. */
+
 package org.simgrid.msg;
-/**
-* Copyright (c) 2012-2013. 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.
-*
-*/
 
 public class File {
        protected String storage;
index fc48cba..a1d5736 100644 (file)
@@ -1,14 +1,11 @@
-/*
- * Bindings to the MSG hosts
- *
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right 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. 
- *
- */  
+/* Bindings to the MSG hosts */
+
+/* Copyright (c) 2006-2014. 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. */
+
 package org.simgrid.msg;
 
 /**
@@ -53,7 +50,7 @@ public class Host {
        /**
         * Host name
         */
-       private String name;
+       protected String name;
 
        /**
         * User data.
@@ -66,6 +63,11 @@ public class Host {
                this.bind = 0;
                this.data = null;
        };
+       
+       public String toString (){
+               return this.name; 
+               
+       }
 
        /**
         * This static method gets an host instance associated with a native
@@ -123,6 +125,7 @@ public class Host {
        public String getName() {
                return name;
        }
+
        /**
         * Sets the data of the host.
      * @param data
@@ -148,6 +151,17 @@ public class Host {
                return null != this.data;
        }
 
+       /**
+        * This method start the host if it is off
+        */ 
+       public native void on();
+
+       /**
+        * This method stop the host if it is on
+        */ 
+       public native void off();
+
+
        /**
         * This method returns the number of tasks currently running on a host.
         * The external load is not taken in account.
@@ -177,11 +191,13 @@ public class Host {
         * Returns the value of a given host property. 
         */
        public native String getProperty(String name);
+       
        /**
         * Change the value of a given host property. 
         */
        public native void setProperty(String name, String value);
-    /** This method tests if a host is available.
+    
+       /** This method tests if a host is available.
      * @return True if the host is available.
      */
        public native boolean isAvail();
index cc328f5..01eb5b9 100644 (file)
@@ -1,13 +1,10 @@
-/*
- * This exception is raised when looking for a non-existing host.
- *
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right 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 exception is raised when looking for a non-existing host. */
+
+/* Copyright (c) 2006-2014. 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. */
 
 package org.simgrid.msg;
 
index 3bcc46c..86b830e 100644 (file)
@@ -1,13 +1,10 @@
-/*
- * This exception is raised when looking for a non-existing host.
- *
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right 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 exception is raised when looking for a non-existing host. */
+
+/* Copyright (c) 2006-2014. 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. */
 
 package org.simgrid.msg;
 
index ce2fd39..ee3cafe 100644 (file)
@@ -1,13 +1,11 @@
-/*
- * This exception is raised when there is a problem within the bindings (in JNI). 
- *
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right 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 exception is raised when there is a problem within the bindings (in JNI). */
+
+/* Copyright (c) 2006-2014. 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. */
+
 package org.simgrid.msg;
 
 /**
index 93409c5..108c7b5 100644 (file)
@@ -1,13 +1,10 @@
-/*
- * JNI interface to C code for MSG.
- * 
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right 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.
- */
+/* JNI interface to C code for MSG. */
+
+/* Copyright (c) 2006-2014. 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. */
 
 package org.simgrid.msg;
 
@@ -37,19 +34,7 @@ public final class Msg {
                nativeInit();
        }
        private static void loadLib (String name) {
-               String Os = System.getProperty("os.name");
-               String Arch = System.getProperty("os.arch");
-               // Some OS/Arch may be different between Java and Cmake,
-               // which generated the path
-               if (Os.toLowerCase().startsWith("win"))
-                       Os = "Windows";
-               else if (Os.contains("OS X"))
-                       Os = "Darwin";
-               if (Arch.equalsIgnoreCase("x86"))
-                       Arch = "i386";
-               else if (Arch.equalsIgnoreCase("x86_64"))
-                       Arch = "amd64";
-               String Path = "NATIVE/" + Os + "/" + Arch + "/";
+               String Path = NativeLib.getPath();
 
                String filename=name;
                InputStream in = Msg.class.getClassLoader().getResourceAsStream(Path+filename);
index 7baa8eb..166d5e3 100644 (file)
@@ -1,13 +1,11 @@
-/*
- * This exception is an abstract class grouping all MSG-related exceptions
- *
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right 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 exception is an abstract class grouping all MSG-related exceptions */
+
+/* Copyright (c) 2006-2014. 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. */
+
 package org.simgrid.msg;
 
 /**
index 1b76bb8..96dca06 100644 (file)
@@ -1,12 +1,9 @@
-/* 
- * Copyright (c) 2012-2013. 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.
- *
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package org.simgrid.msg;
 /** A mutex  implemented on top of SimGrid synchronization mechanisms. 
  * You can use it exactly the same way that you use the mutexes, 
index 39beed7..0787db1 100644 (file)
@@ -1,13 +1,11 @@
-/*
- * This exception is raised when there is an error within the C world of SimGrid.
- *
- * Copyright (c) 2006-2013. 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 exception is raised when there is an error within the C world of SimGrid. */
+
+/* Copyright (c) 2006-2014. 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. */
+
 package org.simgrid.msg;
 
 /**
diff --git a/src/bindings/java/org/simgrid/msg/NativeLib.java b/src/bindings/java/org/simgrid/msg/NativeLib.java
new file mode 100644 (file)
index 0000000..151fb95
--- /dev/null
@@ -0,0 +1,28 @@
+package org.simgrid.msg;
+
+public final class NativeLib {
+    public static String getPath() {
+        String prefix = "NATIVE";
+        String os = System.getProperty("os.name");
+        String arch = System.getProperty("os.arch");
+
+        if (os.toLowerCase().startsWith("^win"))
+            os = "Windows";
+        else if (os.contains("OS X"))
+            os = "Darwin";
+
+        if (arch.matches("^i[3-6]86$"))
+            arch = "x86";
+        else if (arch.equalsIgnoreCase("amd64"))
+            arch = "x86_64";
+
+        os = os.replace(' ', '_');
+        arch = arch.replace(' ', '_');
+
+        return prefix + "/" + os + "/" + arch + "/";
+    }
+
+    public static void main(String[] args) {
+        System.out.println(getPath());
+    }
+}
index 0077c04..2fe319e 100644 (file)
@@ -1,11 +1,8 @@
-/*
- * Copyright (c) 2006-2013. 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.
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package org.simgrid.msg;
  
index 144f7fb..023e5cf 100644 (file)
@@ -1,11 +1,9 @@
-/*
- * Copyright (c) 2006-2013. 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.
- */
+/* Copyright (c) 2006-2014. 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. */
+
 package org.simgrid.msg;
 
 /** This error class is only used to interrupt the java user code 
index 19047e4..6f90ce6 100644 (file)
@@ -1,13 +1,10 @@
-/*
- * This exception is raised when looking for a non-existing process.
- *
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right 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 exception is raised when looking for a non-existing process. */
+
+/* Copyright (c) 2006-2014. 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. */
 
 package org.simgrid.msg;
 
index bc6c3f2..6d5638c 100644 (file)
@@ -1,13 +1,11 @@
-/*
- * JNI interface to C RngStream code
- * 
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right 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.
- */
+/* JNI interface to C RngStream code */
+
+/* Copyright (c) 2006-2014. 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. */
+
 package org.simgrid.msg;
 /**
  * Export of RngStreams for Java
index c49d9a1..f8e4e14 100644 (file)
@@ -1,12 +1,9 @@
-/* 
- * Copyright (c) 2012-2013. 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.
- *
- */
+/* Copyright (c) 2012-2014. 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. */
+
 package org.simgrid.msg;
 /** A semaphore implemented on top of SimGrid synchronization mechanisms. 
  * You can use it exactly the same way that you use classical semaphores
index 319aee6..4be7046 100644 (file)
@@ -1,11 +1,8 @@
-/*
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right 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.
- */
+/* Copyright (c) 2006-2014. 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. */
 
 package org.simgrid.msg;
 
@@ -168,6 +165,11 @@ public class Task {
      * @throws TaskCancelledException
      */
        public native void execute() throws HostFailureException,TaskCancelledException;
+       /**
+        * Bound a computation to a certain load
+        *
+        */
+       public native void setBound(double load); 
        /**
         * Cancels a task.
         *
index a4fd085..950899d 100644 (file)
@@ -1,13 +1,10 @@
-/*
- * This exception is raised when looking for a non-existing host.
- *
- * Copyright (c) 2006-2007, 2010, 2013. The SimGrid Team.
- * All right 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 exception is raised when looking for a non-existing host. */
+
+/* Copyright (c) 2006-2007, 2010, 2013-2014. 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. */
 
 package org.simgrid.msg;
 
index b6b3c3b..1600fae 100644 (file)
@@ -1,13 +1,10 @@
-/*
- * This exception is raised when looking for a non-existing host.
- *
- * Copyright (c) 2006-2007, 2010, 2013. The SimGrid Team.
- * All right 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 exception is raised when looking for a non-existing host. */
+
+/* Copyright (c) 2006-2007, 2010, 2013-2014. 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. */
 
 package org.simgrid.msg;
 
index 1d6fedd..9ba2df9 100644 (file)
@@ -1,13 +1,10 @@
-/*
- * This exception is raised when looking for a non-existing host.
- *
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right 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 exception is raised when looking for a non-existing host. */
+
+/* Copyright (c) 2006-2014. 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. */
 
 package org.simgrid.msg;
 
index 5c9c8e3..f77a4af 100644 (file)
-/*
- * JNI interface to Cloud interface in Simgrid
- * 
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right 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.
- */
+/* JNI interface to virtual machine in Simgrid */
+
+/* Copyright (c) 2006-2014. 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. */
+
 package org.simgrid.msg;
 
 import org.simgrid.msg.Host;
 import org.simgrid.msg.Process;
 
-public class VM {
-       /**
-        * This attribute represents a bind between a java task object and
-        * a native task. Even if this attribute is public you must never
-        * access to it. It is set automatically during the build of the object.
-        */
-       private long bind = 0;
+public class VM extends Host{
+       // Please note that we are not declaring a new bind variable 
+       //(the bind variable has been inherited from the super class Host)
        
-       private int coreAmount;
+       /* Static functions */ 
+       // GetByName is inherited from the super class Host
+       
+
+        private static VM[] vms=null;    
+    private Host currentHost; 
+
+       /* Constructors / destructors */
+    /**
+        * Create a `basic' VM (i.e. 1 core, 1GB of RAM, other values are not taken into account).
+        */
+       public VM(Host host, String name) {
+               this(host,name,1,1024, -1, null, -1,0 , 0);
+       }
 
-        private String name;
        /**
-        * Create a new empty VM.
-        * NOTE: it is expected that in the future, the coreAmount parameter will be used
-        * to add extra constraints on the execution, but the argument is ignored for now.
+        * Create a  VM
+        * @param host  Host node
+        * @param name name of the machine
+        * @param nCore number of core
+        * @param ramSize size of the RAM that should be allocated (in MBytes)
+        * @param netCap (not used for the moment)
+        * @param diskPath (not used for the moment)
+        * @param diskSize (not used for the moment)
+        * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;))
+        * @param dpIntensity (dirty page percentage according to migNetSpeed, [0-100], if you don't know put zero ;))
         */
-       public VM(Host host, String name, int coreAmount) {
-               this.coreAmount = coreAmount;
-               this.name = name;
-               start(host,name,coreAmount);
+       public VM(Host host, String name, int nCore,  int ramSize, 
+                       int netCap, String diskPath, int diskSize, int migNetSpeed, int dpIntensity){
+               super();
+               super.name = name; 
+               this.currentHost = host; 
+               create(host, name, nCore, ramSize, netCap, diskPath, diskSize, migNetSpeed, dpIntensity);
+               VM.addVM(this);
+       }
+
+       private static void addVM(VM vm){
+               VM[] vmsN=null; 
+               int i=0;
+               if(VM.vms == null)
+                       vmsN = new VM[1]; 
+               else
+                       vmsN = new VM[vms.length+1]; 
+               
+               for (i=0; i<vmsN.length-1 ; i ++){
+                       vmsN[i]=vms[i]; 
+               } 
+               vmsN[i]=vm;
+               vms=vmsN;
+       }
+   public static VM[] all(){
+               return vms;
+       }
+       public static VM getVMByName(String name){
+               for (int i=0 ; i < vms.length ; i++){
+                         if (vms[i].getName().equals(name))
+                                       return vms[i];          
+               }
+               return null; 
        }
        protected void finalize() {
                destroy();
        }
-       /**
-        * Destroy the VM
-        */
-       protected native void destroy();
-       /**
-        * Natively implemented method starting the VM.
-        * @param coreAmount
-        */
-       private native void start(Host host, String name, int coreAmount);
-               
+       
+
+       /* JNI / Native code */
+
+       /* get/set property methods are inherited from the Host class. */
+       
        /** Returns whether the given VM is currently suspended
         */     
-       public native boolean isSuspended();
+       public native int isCreated();
+       
        /** Returns whether the given VM is currently running
         */
-       public native boolean isRunning();
-       /** Add the given process into the VM.
-        * Afterward, when the VM is migrated or suspended or whatever, the process will have the corresponding handling, too.
-        */     
-       public native void bind(Process process);
-       /** Removes the given process from the given VM, and kill it
-        *  Will raise a ProcessNotFound exception if the process were not bound to that VM
+       public native int isRunning();
+
+       /** Returns whether the given VM is currently running
+        */
+       public native int isMigrating();
+       
+       /** Returns whether the given VM is currently suspended
         */     
-       public native void unbind(Process process);
-       /** Immediately change the host on which all processes are running
-        *
-        * No migration cost occurs. If you want to simulate this too, you want to use a
-        * Task.send() before or after, depending on whether you want to do cold or hot
-        * migration.
+       public native int isSuspended();
+               
+       /** Returns whether the given VM is currently saving
+        */
+       public native int isSaving();
+       
+       /** Returns whether the given VM is currently saved
+        */
+       public native int isSaved();
+
+       /** Returns whether the given VM is currently restoring its state
+        */
+       public native boolean isRestoring();
+       
+       /**
+        * Natively implemented method create the VM.
+        * @param nCore number of core
+        * @param ramSize size of the RAM that should be allocated (in MB)
+        * @param netCap (not used for the moment)
+        * @param diskPath (not used for the moment)
+        * @param diskSize (not used for the moment)
+        * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;))
+        * @param dpIntensity (dirty page intensity, a percentage of migNetSpeed [0-100],  if you don't know put zero ;))
+        */
+       private native void create(Host host, String name, int nCore, int ramSize, 
+                        int netCap, String diskPath, int diskSize, int migNetSpeed, int dpIntensity);
+
+
+       /**
+        * Bound the VM to a certain % of its vcpu capability (e.g. 75% of vm.getSpeed())
+        * @param load percentage (between [0,100]
+        */
+       public native void setBound(int load);
+
+       /**
+        * start the VM
+        */
+       public native void start();
+
+       
+       /**
+        * Immediately kills all processes within the given VM. Any memory that they allocated will be leaked.
+        * No extra delay occurs. If you want to simulate this too, you want to use a MSG_process_sleep() or something
+        */
+       public native void shutdown();
+       
+       /**  
+        * Invoke native migration routine
+       */
+       public native void internalmig(Host destination);
+
+       
+       /** Change the host on which all processes are running
+        * (pre-copy is implemented)
         */     
-       public native void migrate(Host destination);
+       public void migrate(Host destination){
+               this.internalmig(destination);
+               this.currentHost = destination; 
+       }
+       
        /** Immediately suspend the execution of all processes within the given VM
         *
         * No suspension cost occurs. If you want to simulate this too, you want to
@@ -75,6 +165,7 @@ public class VM {
         * of VM suspend to you.
         */     
        public native void suspend();
+       
        /** Immediately resumes the execution of all processes within the given VM
         *
         * No resume cost occurs. If you want to simulate this too, you want to
@@ -82,19 +173,33 @@ public class VM {
         * of VM resume to you.
         */
        public native void resume();
-       /**
-        * Immediately kills all processes within the given VM. Any memory that they allocated will be leaked.
-        * No extra delay occurs. If you want to simulate this too, you want to use a MSG_process_sleep() or something
+       
+       /** Immediately suspend the execution of all processes within the given VM 
+        *  and save its state on the persistent HDD
+        *  Not yet implemented (for the moment it behaves like suspend)
+        *  No suspension cost occurs. If you want to simulate this too, you want to
+        *  use a \ref File.write() before or after, depending on the exact semantic
+        *  of VM suspend to you.
+        */     
+       public native void save();
+       
+       /** Immediately resumes the execution of all processes previously saved 
+        * within the given VM
+        *  Not yet implemented (for the moment it behaves like resume)
+        *
+        * No resume cost occurs. If you want to simulate this too, you want to
+        * use a \ref File.read() before or after, depending on the exact semantic
+        * of VM resume to you.
         */
-       public native void shutdown();
+       public native void restore();
+       
+
        /**
-        * Reboot the VM, restarting all the processes in it.
+        * Destroy the VM
         */
-       public native void reboot();
+       public native void destroy();
 
-       public String getName() {
-               return name;
-       }               
+       
 
        /**
         * Class initializer, to initialize various JNI stuff
index 4723c98..2a14056 100644 (file)
@@ -1,13 +1,11 @@
-/*
- * JNI interface to C code for the TRACES part of SimGrid.
- * 
- * Copyright (c) 2012-2013. The SimGrid Team.
- * All right 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.
- */
+/* JNI interface to C code for the TRACES part of SimGrid. */
+
+/* Copyright (c) 2012-2014. 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. */
+
 package org.simgrid.trace;
 
 import org.simgrid.msg.Msg;
index a998d69..3503536 100644 (file)
@@ -1,12 +1,11 @@
 /* context_cojava - implementation of context switching for java coroutines */
 
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-
 #include <xbt/function_types.h>
 #include <simgrid/simix.h>
 #include <xbt/ex.h>
@@ -39,10 +38,10 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg);
 
 
 static smx_context_t
-smx_ctx_cojava_factory_create_context(xbt_main_func_t code, int argc,
-                                    char **argv,
-                                    void_pfn_smxprocess_t cleanup_func,
-                                    void *data);
+smx_ctx_cojava_factory_create_context(xbt_main_func_t code,
+                                      int argc, char **argv,
+                                      void_pfn_smxprocess_t cleanup_func,
+                                      smx_process_t process);
 
 static void smx_ctx_cojava_free(smx_context_t context);
 static void smx_ctx_cojava_suspend(smx_context_t context);
@@ -64,7 +63,7 @@ void SIMIX_ctx_cojava_factory_init(smx_context_factory_t * factory)
   (*factory)->name = "ctx_cojava_factory";
   //(*factory)->finalize = smx_ctx_base_factory_finalize;
   (*factory)->self = smx_ctx_cojava_self;
-  (*factory)->get_data = smx_ctx_base_get_data;
+  (*factory)->get_process = smx_ctx_base_get_process;
 
   global_env = get_current_thread_env();
 
@@ -115,10 +114,10 @@ smx_context_t smx_ctx_cojava_self(void)
 }
 
 static smx_context_t
-smx_ctx_cojava_factory_create_context(xbt_main_func_t code, int argc,
-                                    char **argv,
-                                    void_pfn_smxprocess_t cleanup_func,
-                                    void* data)
+smx_ctx_cojava_factory_create_context(xbt_main_func_t code,
+                                      int argc, char **argv,
+                                      void_pfn_smxprocess_t cleanup_func,
+                                      smx_process_t process)
 {
        smx_ctx_cojava_t context = xbt_new0(s_smx_ctx_cojava_t, 1);
   /* If the user provided a function for the process then use it
@@ -144,7 +143,7 @@ smx_ctx_cojava_factory_create_context(xbt_main_func_t code, int argc,
        maestro_context = (smx_context_t)context;
   }
   context->bound = 0;
-  context->super.data = data;
+  context->super.process = process;
   return (smx_context_t) context;
 }
 
index 6fe924e..85b8c03 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef _XBT_CONTEXT_COJAVA_H
 #define _XBT_CONTEXT_COJAVA_H
index 6d4e75c..de35188 100644 (file)
@@ -1,12 +1,11 @@
 /* context_java - implementation of context switching for java threads */
 
-/* Copyright (c) 2009-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-
 #include <xbt/function_types.h>
 #include <simgrid/simix.h>
 #include <xbt/ex.h>
@@ -18,10 +17,10 @@ extern JavaVM *__java_vm;
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(jmsg, bindings, "MSG for Java(TM)");
 
 static smx_context_t
-smx_ctx_java_factory_create_context(xbt_main_func_t code, int argc,
-                                    char **argv,
+smx_ctx_java_factory_create_context(xbt_main_func_t code,
+                                    int argc, char **argv,
                                     void_pfn_smxprocess_t cleanup_func,
-                                    void *data);
+                                    smx_process_t process);
 
 static void smx_ctx_java_free(smx_context_t context);
 static void smx_ctx_java_suspend(smx_context_t context);
@@ -42,7 +41,7 @@ void SIMIX_ctx_java_factory_init(smx_context_factory_t * factory)
   (*factory)->name = "ctx_java_factory";
   //(*factory)->finalize = smx_ctx_base_factory_finalize;
   (*factory)->self = smx_ctx_java_self;
-  (*factory)->get_data = smx_ctx_base_get_data;
+  (*factory)->get_process = smx_ctx_base_get_process;
 }
 smx_context_t smx_ctx_java_self(void)
 {
@@ -50,10 +49,10 @@ smx_context_t smx_ctx_java_self(void)
 }
 
 static smx_context_t
-smx_ctx_java_factory_create_context(xbt_main_func_t code, int argc,
-                                    char **argv,
+smx_ctx_java_factory_create_context(xbt_main_func_t code,
+                                    int argc, char **argv,
                                     void_pfn_smxprocess_t cleanup_func,
-                                    void* data)
+                                    smx_process_t process)
 {
   static int thread_amount=0;
   smx_ctx_java_t context = xbt_new0(s_smx_ctx_java_t, 1);
@@ -87,7 +86,7 @@ smx_ctx_java_factory_create_context(xbt_main_func_t code, int argc,
        context->thread = NULL;
     xbt_os_thread_set_extra_data(context);
   }
-  context->super.data = data;
+  context->super.process = process;
   
   return (smx_context_t) context;
 }
@@ -111,18 +110,23 @@ static void* smx_ctx_java_thread_run(void *data) {
     (*env)->SetLongField(env, context->jprocess, jprocess_field_Process_bind,
                          (intptr_t)process);
   }
-  xbt_assert((context->jprocess != NULL), "Process not created...");
-  //wait for the process to be able to begin
-  //TODO: Cache it
+
+  // Adrien, ugly path, just to bypass creation of context at low levels
+  // (i.e such as for the VM migration for instance)
+  if(context->jprocess != NULL){
+       xbt_assert((context->jprocess != NULL), "Process not created...");
+       //wait for the process to be able to begin
+       //TODO: Cache it
        jfieldID jprocess_field_Process_startTime = jxbt_get_sfield(env, "org/simgrid/msg/Process", "startTime", "D");
-  jdouble startTime =  (*env)->GetDoubleField(env, context->jprocess, jprocess_field_Process_startTime);
-  if (startTime > MSG_get_clock()) {
-       MSG_process_sleep(startTime - MSG_get_clock());
+       jdouble startTime =  (*env)->GetDoubleField(env, context->jprocess, jprocess_field_Process_startTime);
+       if (startTime > MSG_get_clock()) {
+               MSG_process_sleep(startTime - MSG_get_clock());
+       }
+       //Execution of the "run" method.
+       jmethodID id = jxbt_get_smethod(env, "org/simgrid/msg/Process", "run", "()V");
+       xbt_assert( (id != NULL), "Method not found...");
+       (*env)->CallVoidMethod(env, context->jprocess, id);
   }
-  //Execution of the "run" method.
-  jmethodID id = jxbt_get_smethod(env, "org/simgrid/msg/Process", "run", "()V");
-  xbt_assert( (id != NULL), "Method not found...");
-  (*env)->CallVoidMethod(env, context->jprocess, id);
   smx_ctx_java_stop((smx_context_t)context);
 
   return NULL;
index a65e41d..fbeee13 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2009-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef _XBT_CONTEXT_JAVA_H
 #define _XBT_CONTEXT_JAVA_H
index 0a38965..138c309 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 9e33f3c..21c697c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -184,7 +184,7 @@ static int l_host_sleep(lua_State *L)
 static int l_host_destroy(lua_State *L)
 {
   msg_host_t ht = sglua_check_host(L, 1);
-  __MSG_host_destroy(MSG_host_priv(ht));
+  __MSG_host_priv_free(MSG_host_priv(ht));
   return 0;
 }
 
index 477e3b9..aa2dc2d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index e9dc6b1..e551413 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 4878208..4ce814f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3f1452f..5128ec5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 7129539..0c323e4 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2011. The SimGrid Team.
+/* Copyright (c) 2010-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8e8e193..41c744e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 444f15d..7ab708b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3ccfe8c..42e28c2 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2011. The SimGrid Team.
+/* Copyright (c) 2010-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index db5f4e0..2098267 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index af2b38d..958440d 100644 (file)
@@ -1,3 +1,6 @@
+/* Copyright (c) 2010-2014. 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. */
 
index 3217ead..6643fd9 100644 (file)
@@ -1,3 +1,6 @@
+/* Copyright (c) 2008, 2011, 2014. 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. */
 
index 52664c7..0901fbd 100644 (file)
@@ -1,5 +1,13 @@
+/* Copyright (c) 2012-2014. 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"
 
+SG_BEGIN_DECL()
+
 XBT_PUBLIC(int) TRACE_start (void);
 XBT_PUBLIC(int) TRACE_end (void);
 XBT_PUBLIC(void) TRACE_global_init(int *argc, char **argv);
@@ -8,3 +16,5 @@ XBT_PUBLIC(void) TRACE_surf_resource_utilization_alloc(void);
 XBT_PUBLIC(void) TRACE_surf_resource_utilization_release(void);
 XBT_PUBLIC(void) TRACE_add_start_function(void (*func)(void));
 XBT_PUBLIC(void) TRACE_add_end_function(void (*func)(void));
+
+SG_END_DECL()
index baeb22d..2c4f48d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -60,7 +60,7 @@ struct s_dw_type{
   int byte_size; /* Size in bytes */
   int element_count; /* Number of elements for array type */
   char *dw_type_id; /* DW_AT_type */
-  xbt_dynar_t members; /* if DW_TAG_structure_type, DW_TAG_union_type*/
+  xbt_dynar_t members; /* if DW_TAG_structure_type, DW_TAG_class_type, DW_TAG_union_type*/
   int is_pointer_type;
   int offset;
   dw_type_t subtype;
index bbcdc2f..21d00c1 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 2ecc52a..c5eb402 100644 (file)
@@ -1,6 +1,6 @@
 /* platf_interface.h - Internal interface to the SimGrid platforms          */
 
-/* Copyright (c) 2004-2007, 2009-2012. The SimGrid Team.
+/* Copyright (c) 2004-2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -12,6 +12,8 @@
 #include "simgrid/platf.h" /* public interface */
 #include "xbt/RngStream.h"
 
+SG_BEGIN_DECL()
+
 /* Module management functions */
 XBT_PUBLIC(void) sg_platf_init(void);
 XBT_PUBLIC(void) sg_platf_exit(void);
@@ -80,4 +82,6 @@ XBT_PUBLIC(void) surf_config_models_setup(void);
 XBT_PUBLIC(void) sg_platf_rng_stream_init(unsigned long seed[6]);
 XBT_PUBLIC(RngStream) sg_platf_rng_stream_get(const char* id);
 
+SG_END_DECL()
+
 #endif                          /* SG_PLATF_INTERFACE_H */
index e4142a9..2c1c75a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -9,9 +9,13 @@
 /*******************************************/
 /*** Config Globals **************************/
 /*******************************************/
+
+SG_BEGIN_DECL()
+
 XBT_PUBLIC_DATA(xbt_cfg_t) _sg_cfg_set;
 XBT_PUBLIC_DATA(int) _sg_cfg_init_status;
 XBT_PUBLIC_DATA(int) _sg_cfg_exit_asap;
+XBT_PUBLIC(int) sg_cfg_is_default_value(const char* name);
 XBT_PUBLIC(int) sg_cfg_get_int(const char* name);
 XBT_PUBLIC(double) sg_cfg_get_double(const char* name);
 XBT_PUBLIC(char*) sg_cfg_get_string(const char* name);
@@ -21,3 +25,5 @@ XBT_PUBLIC(xbt_dynar_t) sg_cfg_get_dynar(const char* name);
 
 void sg_config_init(int *argc, char **argv);
 void sg_config_finalize(void);
+
+SG_END_DECL()
index 2a44cfe..d3cab53 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 _SMPI_INTERFACE_H
 #define _SMPI_INTERFACE_H
 #include "smpi/smpi.h"
index 31375cd..23b9a78 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -7,22 +7,6 @@
 #ifndef MAXMIN_DATATYPES_H
 #define MAXMIN_DATATYPES_H
 
-/** \ingroup SURF_models
- *  \brief Model datatype
- *
- *  Generic data structure for a model. The workstations,
- *  the CPUs and the network links are examples of models.
- */
-typedef struct surf_model *surf_model_t;
-
-/** \ingroup SURF_actions
- *  \brief Action datatype
- *
- * An action is some working amount on a model.
- * It is represented as a cost, a priority, a duration and a state.
- */
-typedef struct surf_action *surf_action_t;
-typedef struct surf_file *surf_file_t;
 typedef struct surf_storage *surf_storage_t;
 typedef struct surf_stat *surf_stat_t;
 
index acd57fb..86600a4 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 #include "surf/datatypes.h"
 #include <math.h>
 
+
+/** @addtogroup SURF_lmm 
+ * @details 
+ * A linear maxmin solver to resolves inequations systems.
+ * 
+ * A system is composed of variables, constraints and elements linking them.
+ * Constraint: 
+ *  - bound (set)
+ *  - shared (set)
+ *  - usage (computed)
+ * Variable:
+ *  - weight (set)
+ *  - bound (set)
+ *  - value (computed)
+ * Element:
+ *  - value (set)
+ * 
+ * A possible system could be:
+ * - three variables: `var1`, `var2`, `var3`
+ * - two constraints: `cons1`, `cons2`
+ * - four elements linking:
+ *  - `elem1` linking `var1` and `cons1`
+ *  - `elem2` linking `var2` and `cons1`
+ *  - `elem3` linking `var2` and `cons2`
+ *  - `elem4` linking `var3` and `cons2`
+ * 
+ * And the corresponding inequations will be:
+ * 
+ *     var1.value <= var1.bound
+ *     var2.value <= var2.bound
+ *     var3.value <= var3.bound
+ *     var1.weight * var1.value * elem1.value + var2.weight * var2.value * elem2.value <= cons1.bound
+ *     var2.weight * var2.value * elem3.value + var3.weight * var3.value * elem4.value <= cons2.bound
+ * 
+ * where `var1.value`, `var2.value` and `var3.value` are the unknown values
+ * 
+ * if a constraint is not shared the sum is replace by a max
+ * 
+ * Its usefull for the sharing of resources for various models.
+ * For instance for the network model the link are associated 
+ * to consrtaint and the communications to variables.
+ */
+
 extern double sg_maxmin_precision;
 #define MAXMIN_PRECISION sg_maxmin_precision
 static XBT_INLINE void double_update(double *variable, double value)
@@ -31,70 +74,283 @@ static XBT_INLINE int double_equals(double value1, double value2)
   return (fabs(value1 - value2) < MAXMIN_PRECISION);
 }
 
+SG_BEGIN_DECL()
+
+/** @{ @ingroup SURF_lmm */
+/**
+ * @brief Create a new Linear MaxMim system
+ * 
+ * @param selective_update [description]
+ */
 XBT_PUBLIC(lmm_system_t) lmm_system_new(int selective_update);
+
+/**
+ * @brief Free an existing Linear MaxMin system
+ * 
+ * @param sys The lmm system to free
+ */
 XBT_PUBLIC(void) lmm_system_free(lmm_system_t sys);
 
+/**
+ * @brief Create a new Linear MaxMin constraint
+ * 
+ * @param sys The system in which we add a constraint
+ * @param id Data associated to the constraint (e.g.: a network link)
+ * @param bound_value The bound value of the constraint 
+ */
 XBT_PUBLIC(lmm_constraint_t) lmm_constraint_new(lmm_system_t sys, void *id,
                                                 double bound_value);
+
+/**
+ * @brief Share a constraint
+ * @details [long description]
+ * 
+ * @param cnst The constraint to share
+ */
 void lmm_constraint_shared(lmm_constraint_t cnst);
+
+/**
+ * @brief Check if a constraint is shared (shared by default)
+ * 
+ * @param cnst The constraint to share
+ * @return 1 if shared, 0 otherwise
+ */
 int lmm_constraint_is_shared(lmm_constraint_t cnst);
 
+/**
+ * @brief Free a constraint
+ * 
+ * @param sys The system associated to the constraint
+ * @param cnst The constraint to free
+ */
 void lmm_constraint_free(lmm_system_t sys, lmm_constraint_t cnst);
 
+/**
+ * @brief Get the usage of the constraint after the last lmm solve
+ * 
+ * @param cnst A constraint
+ * @return The usage of the constraint
+ */
 double lmm_constraint_get_usage(lmm_constraint_t cnst);
 
+/**
+ * @brief Create a new Linear MaxMin variable
+ * 
+ * @param sys The system in which we add a constaint
+ * @param id Data associated to the variable (e.g.: a network communication)
+ * @param weight_value The weight of the variable (0.0 if not used)
+ * @param bound The maximum value of the variable (-1.0 if no maximum value)
+ * @param number_of_constraints The maximum number of constraint to associate to the variable
+ */
 XBT_PUBLIC(lmm_variable_t) lmm_variable_new(lmm_system_t sys, void *id,
                                             double weight_value,
                                             double bound,
                                             int number_of_constraints);
+/**
+ * @brief Free a variable
+ * 
+ * @param sys The system associated to the variable
+ * @param var The variable to free
+ */
 XBT_PUBLIC(void) lmm_variable_free(lmm_system_t sys, lmm_variable_t var);
+
+/**
+ * @brief Get the value of the variable after the last lmm solve
+ * 
+ * @param var A variable
+ * @return The value of the variable
+ */
 XBT_PUBLIC(double) lmm_variable_getvalue(lmm_variable_t var);
+
+/**
+ * @brief Get the maximum value of the variable (-1.0 if no maximum value)
+ * 
+ * @param var A variable
+ * @return The bound of the variable
+ */
 XBT_PUBLIC(double) lmm_variable_getbound(lmm_variable_t var);
 
+/**
+ * @brief Remove a variable from a constraint
+ * 
+ * @param sys A system
+ * @param cnst A constraint
+ * @param var The variable to remove
+ */
+XBT_PUBLIC(void) lmm_shrink(lmm_system_t sys, lmm_constraint_t cnst,
+                            lmm_variable_t var);
+
+/**
+ * @brief Associate a variable to a constraint with a coefficient
+ * 
+ * @param sys A system
+ * @param cnst A constraint
+ * @param var A variable
+ * @param value The coefficient associated to the variable in the constraint
+ */
 XBT_PUBLIC(void) lmm_expand(lmm_system_t sys, lmm_constraint_t cnst,
                             lmm_variable_t var, double value);
+
+/**
+ * @brief Add value to the coefficient between a constraint and a variable or 
+ *        create one
+ * 
+ * @param sys A system
+ * @param cnst A constraint
+ * @param var A variable
+ * @param value The value to add to the coefficient associated to the variable in the constraint
+ */
 void lmm_expand_add(lmm_system_t sys, lmm_constraint_t cnst,
                     lmm_variable_t var, double value);
-void lmm_elem_set_value(lmm_system_t sys, lmm_constraint_t cnst,
-                        lmm_variable_t var, double value);
 
+/**
+ * @brief Get the numth constraint associated to the variable
+ * 
+ * @param sys The system associated to the variable (not used)
+ * @param var A variable
+ * @param num The rank of constraint we want to get
+ * @return The numth constraint
+ */
 lmm_constraint_t lmm_get_cnst_from_var(lmm_system_t sys,
                                        lmm_variable_t var, int num);
+
+/**
+ * @brief Get the weigth of the numth constraint associated to the variable
+ * 
+ * @param sys The system associated to the variable (not used)
+ * @param var A variable
+ * @param num The rank of constraint we want to get
+ * @return The numth constraint
+ */
 double lmm_get_cnst_weight_from_var(lmm_system_t sys, lmm_variable_t var,
                                     int num);
+
+/**
+ * @brief Get the number of constraint associated to a variable
+ * 
+ * @param sys The system associated to the variable (not used)
+ * @param var A variable
+ * @return The number of constraint associated to the variable
+ */
 int lmm_get_number_of_cnst_from_var(lmm_system_t sys, lmm_variable_t var);
+
+/**
+ * @brief Get a var associated to a constraint 
+ * @details Get the first variable of the next variable of elem if elem is not NULL
+ * 
+ * @param sys The system associated to the variable (not used)
+ * @param cnst A constraint
+ * @param elem A element of constraint of the constraint or NULL
+ * @return A variable associated to a constraint
+ */
 lmm_variable_t lmm_get_var_from_cnst(lmm_system_t sys,
                                      lmm_constraint_t cnst,
                                      lmm_element_t * elem);
 
+/**
+ * @brief Get the first active constraint of a system
+ * 
+ * @param sys A system
+ * @return The first active constraint
+ */
 lmm_constraint_t lmm_get_first_active_constraint(lmm_system_t sys);
+
+/**
+ * @brief Get the next active constraint of a constraint in a system
+ * 
+ * @param sys A system
+ * @param cnst An active constraint of the system
+ * 
+ * @return The next active constraint
+ */
 lmm_constraint_t lmm_get_next_active_constraint(lmm_system_t sys,
                                                 lmm_constraint_t cnst);
+
 #ifdef HAVE_LATENCY_BOUND_TRACKING
 XBT_PUBLIC(int) lmm_is_variable_limited_by_latency(lmm_variable_t var);
 #endif
 
+/**
+ * @brief Get the data associated to a constraint
+ * 
+ * @param cnst A constraint
+ * @return The data associated to the constraint
+ */
 void *lmm_constraint_id(lmm_constraint_t cnst);
+
+/**
+ * @brief Get the data associated to a variable
+ * 
+ * @param var A variable
+ * @return The data associated to the variable
+ */
 void *lmm_variable_id(lmm_variable_t var);
 
+/**
+ * @brief Update the value of element linking the constraint and the variable
+ * 
+ * @param sys A system
+ * @param cnst A constraint
+ * @param var A variable
+ * @param value The new value
+ */
 void lmm_update(lmm_system_t sys, lmm_constraint_t cnst,
                 lmm_variable_t var, double value);
+
+/**
+ * @brief Update the bound of a variable
+ * 
+ * @param sys A system
+ * @param var A constraint
+ * @param bound The new bound
+ */
 void lmm_update_variable_bound(lmm_system_t sys, lmm_variable_t var,
                                double bound);
 
-
+/**
+ * @brief Update the weight of a variable
+ * 
+ * @param sys A system
+ * @param var A variable
+ * @param weight The new weight of the variable
+ */
 XBT_PUBLIC(void) lmm_update_variable_weight(lmm_system_t sys,
                                             lmm_variable_t var,
                                             double weight);
+
+/**
+ * @brief Get the weight of a variable
+ * 
+ * @param var A variable
+ * @return The weight of the variable
+ */
 double lmm_get_variable_weight(lmm_variable_t var);
 
+/**
+ * @brief Update a constraint bound
+ * 
+ * @param sys A system
+ * @param cnst A constraint
+ * @param bound The new bound of the consrtaint
+ */
 XBT_PUBLIC(void) lmm_update_constraint_bound(lmm_system_t sys,
                                              lmm_constraint_t cnst,
                                              double bound);
 
+/**
+ * @brief [brief description]
+ * 
+ * @param sys A system
+ * @param cnst A constraint
+ * @return [description]
+ */
 int lmm_constraint_used(lmm_system_t sys, lmm_constraint_t cnst);
 
-
+/**
+ * @brief Solve the lmm system
+ * 
+ * @param sys The lmm system to solve
+ */
 XBT_PUBLIC(void) lmm_solve(lmm_system_t sys);
 
 XBT_PUBLIC(void) lagrange_solve(lmm_system_t sys);
@@ -127,5 +383,7 @@ XBT_PUBLIC(double func_vegas_f) (lmm_variable_t var, double x);
 XBT_PUBLIC(double func_vegas_fp) (lmm_variable_t var, double x);
 XBT_PUBLIC(double func_vegas_fpi) (lmm_variable_t var, double x);
 
+/** @} */
+SG_END_DECL()
 
 #endif                          /* _SURF_MAXMIN_H */
index 7705f0b..19b4a15 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef _SURF_RMGR_H
 #define _SURF_RMGR_H
index 0f0694a..196cb15 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -18,6 +18,8 @@
 #include "xbt/lib.h"
 #include "surf/surf_routing.h"
 #include "simgrid/platf_interface.h"
+#include "simgrid/datatypes.h"
+#include "simgrid/plugins.h"
 
 SG_BEGIN_DECL()
 /* Actions and models are highly connected structures... */
@@ -35,7 +37,6 @@ extern int sg_gtnets_jitter_seed;
 #endif
 extern xbt_dynar_t surf_path;
 
-
 typedef enum {
   SURF_NETWORK_ELEMENT_NULL = 0,        /* NULL */
   SURF_NETWORK_ELEMENT_HOST,    /* host type */
@@ -43,6 +44,80 @@ typedef enum {
   SURF_NETWORK_ELEMENT_AS       /* AS type */
 } e_surf_network_element_type_t;
 
+#ifdef __cplusplus
+class Model;
+class CpuModel;
+class WorkstationModel;
+class WorkstationVMModel;
+class NetworkModel;
+class StorageModel;
+class Resource;
+class ResourceLmm;
+class WorkstationCLM03;
+class NetworkCm02Link;
+class Cpu;
+class Action;
+class ActionLmm;
+class StorageActionLmm;
+struct As;
+struct RoutingEdge;
+class RoutingPlatf;
+#else
+typedef struct Model Model;
+typedef struct CpuModel CpuModel;
+typedef struct WorkstationModel WorkstationModel;
+typedef struct WorkstationVMModel WorkstationVMModel;
+typedef struct NetworkModel NetworkModel;
+typedef struct StorageModel StorageModel;
+typedef struct Resource Resource;
+typedef struct ResourceLmm ResourceLmm;
+typedef struct WorkstationCLM03 WorkstationCLM03;
+typedef struct NetworkCm02Link NetworkCm02Link;
+typedef struct Cpu Cpu;
+typedef struct Action Action;
+typedef struct ActionLmm ActionLmm;
+typedef struct StorageActionLmm StorageActionLmm;
+typedef struct As As;
+typedef struct RoutingEdge RoutingEdge;
+typedef struct RoutingPlatf RoutingPlatf;
+#endif
+
+/** @ingroup SURF_c_bindings
+ *  \brief Model datatype
+ *
+ *  Generic data structure for a model. The workstations,
+ *  the CPUs and the network links are examples of models.
+ */
+typedef Model *surf_model_t;
+typedef CpuModel *surf_cpu_model_t;
+typedef WorkstationModel *surf_workstation_model_t;
+typedef WorkstationVMModel *surf_vm_workstation_model_t;
+
+typedef NetworkModel *surf_network_model_t;
+typedef StorageModel *surf_storage_model_t;
+
+typedef xbt_dictelm_t surf_resource_t;
+typedef Resource *surf_cpp_resource_t;
+typedef WorkstationCLM03 *surf_workstation_CLM03_t;
+typedef NetworkCm02Link *surf_network_link_t;
+typedef Cpu *surf_cpu_t;
+
+/** @ingroup SURF_c_bindings 
+ *  \brief Action structure
+ *
+ *  Never create s_surf_action_t by yourself ! The actions are created
+ *  on the fly when you call execute or communicate on a model.
+ *
+ *  \see e_surf_action_state_t
+ */
+typedef Action *surf_action_t;
+
+typedef As *AS_t;
+typedef RoutingEdge *routing_edge_t;
+typedef RoutingPlatf *routing_platf_t;
+
+typedef struct surf_file *surf_file_t;
+
 XBT_PUBLIC(e_surf_network_element_type_t)
   routing_get_network_element_type(const char* name);
 
@@ -72,64 +147,12 @@ XBT_PUBLIC(int) find_model_description(s_surf_model_description_t * table,
 XBT_PUBLIC(void) model_help(const char *category,
                             s_surf_model_description_t * table);
 
-enum heap_action_type{
-  LATENCY = 100,
-  MAX_DURATION,
-  NORMAL,
-  NOTSET
-};
-
-/** \ingroup SURF_actions
- *  \brief Action structure
- *
- *  Never create s_surf_action_t by yourself ! The actions are created
- *  on the fly when you call execute or communicate on a model.
- *
- *  \see e_surf_action_state_t
- */
-typedef struct surf_action {
-  s_xbt_swag_hookup_t state_hookup;
-  xbt_swag_t state_set;
-  double cost;                  /**< cost        */
-  double priority;              /**< priority (1.0 by default) */
-  double max_duration;          /**< max_duration (may fluctuate until
-           the task is completed) */
-  double remains;               /**< How much of that cost remains to
-         * be done in the currently running task */
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-  int latency_limited;               /**< Set to 1 if is limited by latency, 0 otherwise */
-#endif
-
-  double start;                 /**< start time  */
-  double finish;                /**< finish time : this is modified during the run
-         * and fluctuates until the task is completed */
-  void *data;                   /**< for your convenience */
-  int refcount;
-  surf_model_t model_type;
-#ifdef HAVE_TRACING
-  char *category;               /**< tracing category for categorized resource utilization monitoring */
-#endif
-  surf_file_t file;        /**< surf_file_t for storage model */
-  xbt_dict_t ls_dict;
-} s_surf_action_t;
-
-typedef struct surf_action_lmm {
-  s_surf_action_t generic_action;
-  lmm_variable_t variable;
-  int suspended;
-  s_xbt_swag_hookup_t action_list_hookup;
-  int index_heap;
-  double last_update;
-  double last_value;
-  enum heap_action_type hat;
-} s_surf_action_lmm_t, *surf_action_lmm_t;
-
-/** \ingroup SURF_actions
- *  \brief Action states
+/** @ingroup SURF_interface
+ *  @brief Action states
  *
  *  Action states.
  *
- *  \see surf_action_t, surf_action_state_t
+ *  @see Action
  */
 typedef enum {
   SURF_ACTION_READY = 0,        /**< Ready        */
@@ -141,228 +164,40 @@ typedef enum {
                                 /**< Not in the system anymore. Why did you ask ? */
 } e_surf_action_state_t;
 
-/** \ingroup SURF_actions
- *  \brief Action state sets
- *
- *  This structure contains some sets of actions.
- *  It provides a fast access to the actions in each state.
- *
- *  \see surf_action_t, e_surf_action_state_t
- */
-typedef struct surf_action_state {
-  xbt_swag_t ready_action_set;
-                                 /**< Actions in state SURF_ACTION_READY */
-  xbt_swag_t running_action_set;
-                                 /**< Actions in state SURF_ACTION_RUNNING */
-  xbt_swag_t failed_action_set;
-                                 /**< Actions in state SURF_ACTION_FAILED */
-  xbt_swag_t done_action_set;
-                                 /**< Actions in state SURF_ACTION_DONE */
-} s_surf_action_state_t, *surf_action_state_t;
-
-/***************************/
-/* Generic model object */
-/***************************/
-typedef struct s_routing_platf s_routing_platf_t, *routing_platf_t;
-XBT_PUBLIC_DATA(routing_platf_t) routing_platf;
-
-/*******************************************
- *  TUTORIAL: New model
- *  New model extension public
- *  Public functions specific to a New model.
+/** @ingroup SURF_vm_interface
+ * 
+ * 
  */
-typedef struct surf_new_model_extension_public {
-  surf_action_t(*fct) ();
-  void* (*create_resource) ();
-} s_surf_model_extension_new_model_t;
-/*******************************************/
-
-/** \ingroup SURF_models
- *  \brief Private data available on all models
- */
-typedef struct surf_model_private *surf_model_private_t;
-
-     /* Cpu model */
-
-     /** \ingroup SURF_models
-      *  \brief CPU model extension public
-      *
-      *  Public functions specific to the CPU model.
-      */
-typedef struct surf_cpu_model_extension_public {
-  surf_action_t(*execute) (void *cpu, double size);
-  surf_action_t(*sleep) (void *cpu, double duration);
-  e_surf_resource_state_t(*get_state) (void *cpu);
-  int (*get_core) (void *cpu);
-  double (*get_speed) (void *cpu, double load);
-  double (*get_available_speed) (void *cpu);
-  double (*get_current_power_peak) (void *cpu);
-  double (*get_power_peak_at) (void *cpu, int pstate_index);
-  int (*get_nb_pstates) (void *cpu);
-  void (*set_power_peak_at) (void *cpu, int pstate_index);
-  double (*get_consumed_energy) (void *cpu);
-  void (*add_traces) (void);
-} s_surf_model_extension_cpu_t;
-
-     /* Network model */
-
-     /** \ingroup SURF_models
-      *  \brief Network model extension public
-      *
-      *  Public functions specific to the network model
-      */
-typedef struct surf_network_model_extension_public {
-  surf_action_t (*communicate) (sg_routing_edge_t src,
-                                sg_routing_edge_t dst,
-                                double size, double rate);
-  xbt_dynar_t(*get_route) (void *src, void *dst); //FIXME: kill field? That is done by the routing nowadays
-  double (*get_link_bandwidth) (const void *link);
-  double (*get_link_latency) (const void *link);
-  int (*link_shared) (const void *link);
-  void (*add_traces) (void);
-} s_surf_model_extension_network_t;
-
-/* Storage model */
-
-/** \ingroup SURF_models
- *  \brief Storage model extension public
- *
- *  Public functions specific to the Storage model.
- */
-
-typedef struct surf_storage_model_extension_public {
-  surf_action_t(*open) (void *storage, const char* mount, const char* path);
-  surf_action_t(*close) (void *storage, surf_file_t fd);
-  surf_action_t(*read) (void *storage, surf_file_t fd, sg_storage_size_t size);
-  surf_action_t(*write) (void *storage, surf_file_t fd, sg_storage_size_t size);
-  surf_action_t(*stat) (void *storage, surf_file_t fd);
-  surf_action_t(*ls) (void *storage, const char *path);
-  xbt_dict_t(*get_properties) (const void *storage);
-  xbt_dict_t(*get_content) (void *storage);
-  sg_storage_size_t(*get_size) (void *storage);
-} s_surf_model_extension_storage_t;
-
-     /** \ingroup SURF_models
-      *  \brief Workstation model extension public
-      *
-      *  Public functions specific to the workstation model.
-      */
-typedef struct surf_workstation_model_extension_public {
-  surf_action_t(*execute) (void *workstation, double size);                                /**< Execute a computation amount on a workstation
-                                      and create the corresponding action */
-  surf_action_t(*sleep) (void *workstation, double duration);                              /**< Make a workstation sleep during a given duration */
-  e_surf_resource_state_t(*get_state) (void *workstation);                                      /**< Return the CPU state of a workstation */
-
-  int (*get_core) (void *workstation); 
-  double (*get_speed) (void *workstation, double load);                                    /**< Return the speed of a workstation */
-  double (*get_available_speed) (void *workstation);                                       /**< Return tha available speed of a workstation */
-
-  double (*get_current_power_peak) (void *workstation);                                          /**< Return the current CPU speed of a workstation */
-  double (*get_power_peak_at) (void *workstation, int pstate_index);                     /**< Return the speed of a workstation for a specific pstate,
-                                                                                                (where higher pstate values represent lower processor speeds) */
-  int (*get_nb_pstates) (void *workstation);                                             /**< Return the number of pstates defined for a workstation (default is 1) */
-  void (*set_power_peak_at) (void *workstation, int pstate_index);                       /**< Set the processor speed of a workstation to the speed associated with the pstate_index pstate */
-  double (*get_consumed_energy) (void *workstation);                                     /**< Return the total energy consumed by a workstation */
-
-   surf_action_t(*communicate) (void *workstation_src,                                     /**< Execute a communication amount between two workstations */
-                                void *workstation_dst, double size,
-                                double max_rate);
-   // FIXME: kill next field, which duplicates the routing
-   xbt_dynar_t(*get_route) (void *workstation_src, void *workstation_dst);                 /**< Get the list of links between two ws */
-
-   surf_action_t(*execute_parallel_task) (int workstation_nb,                              /**< Execute a parallel task on several workstations */
-                                          void **workstation_list,
-                                          double *computation_amount,
-                                          double *communication_amount,
-                                          double rate);
-  double (*get_link_bandwidth) (const void *link);                                         /**< Return the current bandwidth of a network link */
-  double (*get_link_latency) (const void *link);                                           /**< Return the current latency of a network link */
-  surf_action_t(*open) (void *workstation, const char* storage,
-                        const char* path);
-  surf_action_t(*close) (void *workstation, surf_file_t fd);
-  surf_action_t(*read) (void *workstation, surf_file_t fd, sg_storage_size_t size);
-  surf_action_t(*write) (void *workstation, surf_file_t fd, sg_storage_size_t size);
-  surf_action_t(*stat) (void *workstation, surf_file_t fd);
-  int(*unlink) (void *workstation, surf_file_t fd);
-  surf_action_t(*ls) (void *workstation, const char* mount, const char *path);
-  sg_storage_size_t (*get_size) (void *workstation, surf_file_t fd);
-  xbt_dynar_t (*get_info) (void *workstation, surf_file_t fd);
-
-  int (*link_shared) (const void *link);
-  xbt_dict_t(*get_properties) (const void *resource);
-  void (*add_traces) (void);
-
-  sg_storage_size_t (*get_free_size) (void *workstation,const char* name);
-  sg_storage_size_t (*get_used_size) (void *workstation,const char* name);
-  xbt_dict_t (*get_storage_list) (void *workstation);
-
-} s_surf_model_extension_workstation_t;
-
-
+/* FIXME: Where should the VM state be defined? */
+typedef enum {
+  SURF_VM_STATE_CREATED, /**< created, but not yet started */
 
+  SURF_VM_STATE_RUNNING,
+  SURF_VM_STATE_MIGRATING,
 
-/** \ingroup SURF_models
- *  \brief Model datatype
- *
- *  Generic data structure for a model. The workstations,
- *  the CPUs and the network links are examples of models.
- */
-typedef struct surf_model {
-  const char *name;     /**< Name of this model */
-  s_surf_action_state_t states;      /**< Any living action on this model */
-
-   e_surf_action_state_t(*action_state_get) (surf_action_t action);
-                                                                       /**< Return the state of an action */
-  void (*action_state_set) (surf_action_t action,
-                            e_surf_action_state_t state);
-                                                                  /**< Change an action state*/
-
-  double (*action_get_start_time) (surf_action_t action);     /**< Return the start time of an action */
-  double (*action_get_finish_time) (surf_action_t action);     /**< Return the finish time of an action */
-  int (*action_unref) (surf_action_t action);     /**< Specify that we don't use that action anymore. Returns true if the action was destroyed and false if someone still has references on it. */
-  void (*action_cancel) (surf_action_t action);     /**< Cancel a running action */
-  void (*action_recycle) (surf_action_t action);     /**< Recycle an action */
-  void (*action_data_set) (surf_action_t action, void *data);     /**< Set the user data of an action */
-  void (*suspend) (surf_action_t action);     /**< Suspend an action */
-  void (*resume) (surf_action_t action);     /**< Resume a suspended action */
-  int (*is_suspended) (surf_action_t action);     /**< Return whether an action is suspended */
-  void (*set_max_duration) (surf_action_t action, double duration);     /**< Set the max duration of an action*/
-  void (*set_priority) (surf_action_t action, double priority);     /**< Set the priority of an action */
-#ifdef HAVE_TRACING
-  void (*set_category) (surf_action_t action, const char *category); /**< Set the category of an action */
-#endif
-  double (*get_remains) (surf_action_t action);     /**< Get the remains of an action */
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-  int (*get_latency_limited) (surf_action_t action);     /**< Return 1 if action is limited by latency, 0 otherwise */
-#endif
+  SURF_VM_STATE_SUSPENDED, /**< Suspend/resume does not involve disk I/O, so we assume there is no transition states. */
 
-  void (*gap_remove) (surf_action_lmm_t action);
+  SURF_VM_STATE_SAVING, /**< Save/restore involves disk I/O, so there should be transition states. */
+  SURF_VM_STATE_SAVED,
+  SURF_VM_STATE_RESTORING,
 
-  surf_model_private_t model_private;
+} e_surf_vm_state_t;
 
-  union extension {
-    s_surf_model_extension_cpu_t cpu;
-    s_surf_model_extension_network_t network;
-    s_surf_model_extension_storage_t storage;
-    s_surf_model_extension_workstation_t workstation;
-    /*******************************************/
-    /* TUTORIAL: New model                     */
-    s_surf_model_extension_new_model_t new_model;
-    /*******************************************/
-  } extension;
-} s_surf_model_t;
+/***************************/
+/* Generic model object */
+/***************************/
 
-surf_model_t surf_model_init(void);
-void surf_model_exit(surf_model_t model);
+//FIXME:REMOVE typedef struct s_routing_platf s_routing_platf_t, *routing_platf_t;
+XBT_PUBLIC_DATA(routing_platf_t) routing_platf;
 
 static inline void *surf_cpu_resource_priv(const void *host) {
-  return xbt_lib_get_level((void *)host, SURF_CPU_LEVEL);
+  return xbt_lib_get_level((xbt_dictelm_t)host, SURF_CPU_LEVEL);
 }
 static inline void *surf_workstation_resource_priv(const void *host){
-  return xbt_lib_get_level((void *)host, SURF_WKS_LEVEL);
+  return (void*)xbt_lib_get_level((xbt_dictelm_t)host, SURF_WKS_LEVEL);
 }
 static inline void *surf_storage_resource_priv(const void *storage){
-  return xbt_lib_get_level((void *)storage, SURF_STORAGE_LEVEL);
+  return (void*)xbt_lib_get_level((xbt_dictelm_t)storage, SURF_STORAGE_LEVEL);
 }
 
 static inline void *surf_cpu_resource_by_name(const char *name) {
@@ -375,39 +210,712 @@ static inline void *surf_storage_resource_by_name(const char *name){
   return xbt_lib_get_elm_or_null(storage_lib, name);
 }
 
-typedef struct surf_resource {
-  surf_model_t model;
-  char *name;
-  xbt_dict_t properties;
-  void_f_pvoid_t free_f;
-} s_surf_resource_t, *surf_resource_t;
+
+XBT_PUBLIC(char *) surf_routing_edge_name(sg_routing_edge_t edge);
+XBT_PUBLIC(void *) surf_as_cluster_get_backbone(AS_t as);
+XBT_PUBLIC(void) surf_as_cluster_set_backbone(AS_t as, void* backbone);
+
+/** @{ @ingroup SURF_c_bindings */
+
+/** 
+ * @brief Get the name of a surf model
+ * 
+ * @param model A model
+ * @return The name of the model
+ */
+XBT_PUBLIC(const char *) surf_model_name(surf_model_t model);
+
+/**
+ * @brief Pop an action from the done actions set
+ * 
+ * @param model The model from which the action is extracted
+ * @return An action in done state
+ */
+XBT_PUBLIC(surf_action_t) surf_model_extract_done_action_set(surf_model_t model);
+
+/**
+ * @brief Pop an action from the failed actions set
+ * 
+ * @param model The model from which the action is extracted
+ * @return An action in failed state
+ */
+XBT_PUBLIC(surf_action_t) surf_model_extract_failed_action_set(surf_model_t model);
+
+/**
+ * @brief Pop an action from the ready actions set
+ * 
+ * @param model The model from which the action is extracted
+ * @return An action in ready state
+ */
+XBT_PUBLIC(surf_action_t) surf_model_extract_ready_action_set(surf_model_t model);
+
+/**
+ * @brief Pop an action from the running actions set
+ * 
+ * @param model The model from which the action is extracted
+ * @return An action in running state
+ */
+XBT_PUBLIC(surf_action_t) surf_model_extract_running_action_set(surf_model_t model);
+
+/**
+ * @brief Get the size of the running action set of a model
+ * 
+ * @param model The model
+ * @return The size of the running action set
+ */
+XBT_PUBLIC(int) surf_model_running_action_set_size(surf_model_t model);
+
+/**
+ * @brief Execute a parallel task
+ * @details [long description]
+ * 
+ * @param model The model which handle the parallelisation
+ * @param workstation_nb The number of workstations 
+ * @param workstation_list The list of workstations on which the task is executed
+ * @param computation_amount The processing amount (in flop) needed to process
+ * @param communication_amount The amount of data (in bytes) needed to transfer
+ * @param rate [description]
+ * @return The action corresponding to the parallele execution task
+ */
+XBT_PUBLIC(surf_action_t) surf_workstation_model_execute_parallel_task(surf_workstation_model_t model,
+                                                   int workstation_nb,
+                                            void **workstation_list,
+                                            double *computation_amount,
+                                            double *communication_amount,
+                                            double rate);
+
+/**
+ * @brief Create a communication between two hosts
+ * 
+ * @param model The model which handle the communication
+ * @param src The source host
+ * @param dst The destination host
+ * @param size The amount of data (in bytes) needed to transfer
+ * @param rate [description]
+ * @return The action corresponding to the communication
+ */
+XBT_PUBLIC(surf_action_t) surf_workstation_model_communicate(surf_workstation_model_t model, surf_resource_t src, surf_resource_t dst, double size, double rate);
+
+/**
+ * @brief Get the route between two hosts
+ * @details [long description]
+ * 
+ * @param model The model which handle the routes
+ * @param src The source host
+ * @param dst The destination host
+ * @return The list of [TODO] from the source to the host
+ */
+XBT_PUBLIC(xbt_dynar_t) surf_workstation_model_get_route(surf_workstation_model_t model, surf_resource_t src, surf_resource_t dst);
+
+/**
+ * @brief Create a new VM on the specified host
+ * 
+ * @param name The name of the workstation
+ * @param ind_phys_host The host on which the VM is created
+ */
+XBT_PUBLIC(void) surf_vm_workstation_model_create(const char *name, surf_resource_t ind_phys_host);
+
+/**
+ * @brief Create a communication between two routing edges [TODO]
+ * @details [long description]
+ * 
+ * @param model The model which handle the communication
+ * @param src The source host
+ * @param dst The destination host
+ * @param size The amount of data (in bytes) needed to transfer
+ * @param rate [description]
+ * @return The action corresponding to the communication
+ */
+XBT_PUBLIC(surf_action_t) surf_network_model_communicate(surf_network_model_t model, sg_routing_edge_t src, sg_routing_edge_t dst, double size, double rate);
+
+/**
+ * @brief Get the name of a surf resource (cpu, workstation, network, â€¦)
+ * 
+ * @param resource The surf resource
+ * @return The name of the surf resource
+ */
+XBT_PUBLIC(const char * ) surf_resource_name(surf_cpp_resource_t resource);
+
+/**
+ * @brief Get the properties of a surf resource (cpu, workstation, network, â€¦)
+ * 
+ * @param resource The surf resource
+ * @return The properties of the surf resource
+ */
+XBT_PUBLIC(xbt_dict_t) surf_resource_get_properties(surf_cpp_resource_t resource);
+
+/**
+ * @brief Get the state of a surf resource (cpu, workstation, network, â€¦)
+ * 
+ * @param resource The surf resource
+ * @return The state of the surf resource
+ */
+XBT_PUBLIC(e_surf_resource_state_t) surf_resource_get_state(surf_cpp_resource_t resource);
+
+/**
+ * @brief Set the state of a surf resource (cpu, workstation, network, â€¦)
+ * 
+ * @param resource The surf resource
+ * @param state The new state of the surf resource
+ */
+XBT_PUBLIC(void) surf_resource_set_state(surf_cpp_resource_t resource, e_surf_resource_state_t state);
+
+/**
+ * @brief Get the speed of the cpu associtated to a workstation
+ * 
+ * @param resource The surf workstation
+ * @param load [description]
+ * 
+ * @return [description]
+ */
+XBT_PUBLIC(double) surf_workstation_get_speed(surf_resource_t resource, double load);
+
+/**
+ * @brief Get the available speed of cpu associtated to a workstation
+ * 
+ * @param resource The surf workstation
+ * @return [description]
+ */
+XBT_PUBLIC(double) surf_workstation_get_available_speed(surf_resource_t resource);
+
+/**
+ * @brief Get the number of cores of the cpu associated to a workstation
+ * 
+ * @param resource The surf workstation
+ * @return The number of cores
+ */
+XBT_PUBLIC(int) surf_workstation_get_core(surf_resource_t resource);
+
+/**
+ * @brief Execute some quantity of computation
+ *
+ * @param resource The surf workstation
+ * @param size The value of the processing amount (in flop) needed to process
+ * 
+ * @return The surf action corresponding to the processing
+ */
+XBT_PUBLIC(surf_action_t) surf_workstation_execute(surf_resource_t resource, double size);
+
+/**
+ * @brief Make the workstation sleep
+ * 
+ * @param resource The surf workstation
+ * @param duration The number of seconds to sleep
+ * @return The surf action corresponding to the sleep
+ */
+XBT_PUBLIC(surf_action_t) surf_workstation_sleep(surf_resource_t resource, double duration);
+
+/**
+ * @brief Open a file on a workstation
+ * 
+ * @param workstation The surf workstation
+ * @param mount The mount point
+ * @param path The path to the file
+ * @return The surf action corresponding to the openning
+ */
+XBT_PUBLIC(surf_action_t) surf_workstation_open(surf_resource_t workstation, const char* mount, const char* path);
+
+/**
+ * @brief Close a file descriptor on a workstation
+ * 
+ * @param workstation The surf workstation
+ * @param fd The file descriptor
+ * 
+ * @return The surf action corresponding to the closing
+ */
+XBT_PUBLIC(surf_action_t) surf_workstation_close(surf_resource_t workstation, surf_file_t fd);
+
+/**
+ * @brief Read a file
+ * 
+ * @param resource The surf workstation
+ * @param fd The file descriptor to read
+ * @param size The size in bytes to read
+ * @return The surf action corresponding to the reading
+ */
+XBT_PUBLIC(surf_action_t) surf_workstation_read(surf_resource_t resource, surf_file_t fd, sg_size_t size);
+
+/**
+ * @brief Write a file
+ * 
+ * @param resource The surf workstation
+ * @param fd The file descriptor to write
+ * @param size The size in bytes to write
+ * @return The surf action corresponding to the writing
+ */
+XBT_PUBLIC(surf_action_t) surf_workstation_write(surf_resource_t resource, surf_file_t fd, sg_size_t size);
+
+/**
+ * @brief Get the informations of a file descriptor
+ * @details The returned xbt_dynar_t contains:
+ *  - the size of the file,
+ *  - the mount point,
+ *  - the storage name,
+ *  - the storage typeId,
+ *  - the storage content type
+ * 
+ * @param resource The surf workstation
+ * @param fd The file descriptor
+ * @return An xbt_dynar_t with the file informations
+ */
+XBT_PUBLIC(xbt_dynar_t) surf_workstation_get_info(surf_resource_t resource, surf_file_t fd);
+
+/**
+ * @brief Get the available space of the storage at the mount point
+ * 
+ * @param resource The surf workstation
+ * @param name The mount point
+ * @return The amount of availble space in bytes
+ */
+XBT_PUBLIC(sg_size_t) surf_workstation_get_free_size(surf_resource_t resource, const char* name);
+
+/**
+ * @brief Get the used space of the storage at the mount point
+ * 
+ * @param resource The surf workstation
+ * @param name The mount point
+ * @return The amount of used space in bytes
+ */
+XBT_PUBLIC(sg_size_t) surf_workstation_get_used_size(surf_resource_t resource, const char* name);
+
+/**
+ * @brief Get the VMs hosted on the workstation
+ * 
+ * @param resource The surf workstation
+ * @return The list of VMs on the workstation
+ */
+XBT_PUBLIC(xbt_dynar_t) surf_workstation_get_vms(surf_resource_t resource);
+
+/**
+ * @brief [brief description]
+ * @details [long description]
+ * 
+ * @param resource [description]
+ * @param params [description]
+ */
+XBT_PUBLIC(void) surf_workstation_get_params(surf_resource_t resource, ws_params_t params);
+
+/**
+ * @brief [brief description]
+ * @details [long description]
+ * 
+ * @param resource [description]
+ * @param params [description]
+ */
+XBT_PUBLIC(void) surf_workstation_set_params(surf_resource_t resource, ws_params_t params);
+
+/**
+ * @brief Destroy a Workstation VM
+ * 
+ * @param resource The surf workstation vm
+ */
+XBT_PUBLIC(void) surf_vm_workstation_destroy(surf_resource_t resource);
+
+/**
+ * @brief Suspend a Workstation VM
+ * 
+ * @param resource The surf workstation vm
+ */
+XBT_PUBLIC(void) surf_vm_workstation_suspend(surf_resource_t resource);
+
+/**
+ * @brief Resume a Workstation VM
+ * 
+ * @param resource The surf workstation vm
+ */
+XBT_PUBLIC(void) surf_vm_workstation_resume(surf_resource_t resource);
+
+/**
+ * @brief Save the Workstation VM (Not yet implemented)
+ * 
+ * @param resource The surf workstation vm
+ */
+XBT_PUBLIC(void) surf_vm_workstation_save(surf_resource_t resource);
+
+/**
+ * @brief Restore the Workstation VM (Not yet implemented)
+ * 
+ * @param resource The surf workstation vm
+ */
+XBT_PUBLIC(void) surf_vm_workstation_restore(surf_resource_t resource);
+
+/**
+ * @brief Migrate the VM to the destination host
+ * 
+ * @param resource The surf workstation vm
+ * @param ind_vm_ws_dest The destination host
+ */
+XBT_PUBLIC(void) surf_vm_workstation_migrate(surf_resource_t resource, surf_resource_t ind_vm_ws_dest);
+
+/**
+ * @brief Get the physical machine hosting the VM
+ * 
+ * @param resource The surf workstation vm
+ * @return The physical machine hosting the VM
+ */
+XBT_PUBLIC(surf_resource_t) surf_vm_workstation_get_pm(surf_resource_t resource);
+
+/**
+ * @brief [brief description]
+ * @details [long description]
+ * 
+ * @param resource [description]
+ * @param bound [description]
+ */
+XBT_PUBLIC(void) surf_vm_workstation_set_bound(surf_resource_t resource, double bound);
+
+/**
+ * @brief [brief description]
+ * @details [long description]
+ * 
+ * @param resource [description]
+ * @param cpu [description]
+ * @param mask [description]
+ */
+XBT_PUBLIC(void) surf_vm_workstation_set_affinity(surf_resource_t resource, surf_resource_t cpu, unsigned long mask);
+
+/**
+ * @brief Execute some quantity of computation
+ * 
+ * @param cpu The surf cpu
+ * @param size The value of the processing amount (in flop) needed to process
+ * @return The surf action corresponding to the processing
+ */
+XBT_PUBLIC(surf_action_t) surf_cpu_execute(surf_resource_t cpu, double size);
+
+/**
+ * @brief Make the cpu sleep for duration (in seconds)
+ * @details [long description]
+ * 
+ * @param cpu The surf cpu
+ * @param duration The number of seconds to sleep
+ * @return The surf action corresponding to the sleeping
+ */
+XBT_PUBLIC(surf_action_t) surf_cpu_sleep(surf_resource_t cpu, double duration);
+
+/**
+ * @brief Get the workstation power peak
+ * @details [long description]
+ * 
+ * @param host The surf workstation
+ * @return The power peak
+ */
+XBT_PUBLIC(double) surf_workstation_get_current_power_peak(surf_resource_t host);
+
+/**
+ * @brief [brief description]
+ * @details [long description]
+ * 
+ * @param host [description]
+ * @param pstate_index [description]
+ * 
+ * @return [description]
+ */
+XBT_PUBLIC(double) surf_workstation_get_power_peak_at(surf_resource_t host, int pstate_index);
+
+/**
+ * @brief [brief description]
+ * @details [long description]
+ * 
+ * @param host [description]
+ * @return [description]
+ */
+XBT_PUBLIC(int) surf_workstation_get_nb_pstates(surf_resource_t host);
+
+/**
+ * @brief [brief description]
+ * @details [long description]
+ * 
+ * @param host [description]
+ * @param pstate_index [description]
+ */
+XBT_PUBLIC(void) surf_workstation_set_power_peak_at(surf_resource_t host, int pstate_index);
+
+/**
+ * @brief Get the consumed energy (in joules) of a workstation
+ * 
+ * @param host The surf workstation
+ * @return The consumed energy
+ */
+XBT_PUBLIC(double) surf_workstation_get_consumed_energy(surf_resource_t host);
+
+/**
+ * @brief Get the list of storages of a workstation
+ * 
+ * @param workstation The surf workstation
+ * @return Dictionary of mount point, Storage
+ */
+XBT_PUBLIC(xbt_dict_t) surf_workstation_get_storage_list(surf_resource_t workstation);
+
+/**
+ * @brief Unlink a file descriptor
+ * 
+ * @param workstation The surf workstation
+ * @param fd The file descriptor
+ * 
+ * @return 0 if failed to unlink, 1 otherwise
+ */
+XBT_PUBLIC(int) surf_workstation_unlink(surf_resource_t workstation, surf_file_t fd);
+
+/**
+ * @brief List directory contents of a path
+ * @details [long description]
+ * 
+ * @param workstation The surf workstation
+ * @param mount The mount point
+ * @param path The path to the directory
+ * @return The surf action corresponding to the ls action
+ */
+XBT_PUBLIC(surf_action_t) surf_workstation_ls(surf_resource_t workstation, const char* mount, const char *path);
+
+/**
+ * @brief Get the size of a file on a workstation
+ * 
+ * @param workstation The surf workstation
+ * @param fd The file descriptor
+ * 
+ * @return The size in bytes of the file
+ */
+XBT_PUBLIC(size_t) surf_workstation_get_size(surf_resource_t workstation, surf_file_t fd);
+
+/**
+ * @brief Get the current position of the file descriptor
+ * 
+ * @param workstation The surf workstation
+ * @param fd The file descriptor
+ * @return The current position of the file descriptor
+ */
+XBT_PUBLIC(size_t) surf_workstation_file_tell(surf_resource_t workstation, surf_file_t fd);
+
+/**
+ * @brief Set the position indictator assiociated with the file descriptor to a new position
+ * @details [long description]
+ * 
+ * @param workstation The surf workstation
+ * @param fd The file descriptor
+ * @param offset The offset from the origin
+ * @param origin Position used as a reference for the offset
+ *  - SEEK_SET: beginning of the file
+ *  - SEEK_CUR: current position indicator
+ *  - SEEK_END: end of the file
+ * @return MSG_OK if successful, otherwise MSG_TASK_CANCELED
+ */
+XBT_PUBLIC(int) surf_workstation_file_seek(surf_resource_t workstation, surf_file_t fd, sg_size_t offset, int origin);
 
 /**
- * Resource which have a metric handled by a maxmin system
+ * @brief [brief description]
+ * @details [long description]
+ * 
+ * @param link [description]
+ * @return [description]
  */
-typedef struct {
-  double scale;
-  double peak;
-  tmgr_trace_event_t event;
-} s_surf_metric_t;
+XBT_PUBLIC(int) surf_network_link_is_shared(surf_cpp_resource_t link);
 
-typedef struct surf_resource_lmm {
-  s_surf_resource_t generic_resource;
-  lmm_constraint_t constraint;
-  e_surf_resource_state_t state_current;
-  tmgr_trace_event_t state_event;
-  s_surf_metric_t power;
-} s_surf_resource_lmm_t, *surf_resource_lmm_t;
+/**
+ * @brief Get the bandwidth of a link in bytes per second
+ * 
+ * @param link The surf link
+ * @return The bandwidth in bytes per second
+ */
+XBT_PUBLIC(double) surf_network_link_get_bandwidth(surf_cpp_resource_t link);
+
+/**
+ * @brief Get the latency of a link in seconds
+ * 
+ * @param link The surf link
+ * @return The latency in seconds
+ */
+XBT_PUBLIC(double) surf_network_link_get_latency(surf_cpp_resource_t link);
+
+/**
+ * @brief Get the content of a storage
+ * 
+ * @param resource The surf storage
+ * @return A xbt_dict_t with path as keys and size in bytes as values
+ */
+XBT_PUBLIC(xbt_dict_t) surf_storage_get_content(surf_resource_t resource);
+
+/**
+ * @brief Get the size in bytes of a storage
+ * 
+ * @param resource The surf storage
+ * @return The size in bytes of the storage
+ */
+XBT_PUBLIC(sg_size_t) surf_storage_get_size(surf_resource_t resource);
+
+/**
+ * @brief Rename a path
+ * 
+ * @param resource The surf storage
+ * @param src The old path
+ * @param dest The new path
+ */
+XBT_PUBLIC(void) surf_storage_rename(surf_resource_t resource, const char* src, const char* dest);
+
+/**
+ * @brief Get the data associated to the action
+ * 
+ * @param action The surf action
+ * @return The data associated to the action
+ */
+XBT_PUBLIC(void*) surf_action_get_data(surf_action_t action);
+
+/**
+ * @brief Set the data associated to the action
+ * @details [long description]
+ * 
+ * @param action The surf action
+ * @param data The new data associated to the action
+ */
+XBT_PUBLIC(void) surf_action_set_data(surf_action_t action, void *data);
+
+/**
+ * @brief Unreference an action
+ * 
+ * @param action The surf action
+ */
+XBT_PUBLIC(void) surf_action_unref(surf_action_t action);
+
+/**
+ * @brief Get the start time of an action
+ * 
+ * @param action The surf action
+ * @return The start time in seconds from the beginning of the simulation
+ */
+XBT_PUBLIC(double) surf_action_get_start_time(surf_action_t action);
+
+/**
+ * @brief Get the finish time of an action
+ * 
+ * @param action The surf action
+ * @return The finish time in seconds from the beginning of the simulation
+ */
+XBT_PUBLIC(double) surf_action_get_finish_time(surf_action_t action);
+
+/**
+ * @brief Get the remains amount of work to do of an action
+ * 
+ * @param action The surf action
+ * @return  The remains amount of work to do
+ */
+XBT_PUBLIC(double) surf_action_get_remains(surf_action_t action);
+
+/**
+ * @brief Suspend an action
+ * 
+ * @param action The surf action
+ */
+XBT_PUBLIC(void) surf_action_suspend(surf_action_t action);
+
+/**
+ * @brief Resume an action
+ * 
+ * @param action The surf action
+ */
+XBT_PUBLIC(void) surf_action_resume(surf_action_t action);
+
+/**
+ * @brief Cancel an action
+ * 
+ * @param action The surf action
+ */
+XBT_PUBLIC(void) surf_action_cancel(surf_action_t action);
+
+/**
+ * @brief Set the priority of an action
+ * @details [long description]
+ * 
+ * @param action The surf action
+ * @param priority The new priority [TODO]
+ */
+XBT_PUBLIC(void) surf_action_set_priority(surf_action_t action, double priority);
+
+/**
+ * @brief Set the category of an action
+ * @details [long description]
+ * 
+ * @param action The surf action
+ * @param category The new category of the action
+ */
+XBT_PUBLIC(void) surf_action_set_category(surf_action_t action, const char *category);
+
+/**
+ * @brief Get the state of an action 
+ * 
+ * @param action The surf action
+ * @return The state of the action
+ */
+XBT_PUBLIC(e_surf_action_state_t) surf_action_get_state(surf_action_t action);
+
+/**
+ * @brief Get the cost of an action
+ * 
+ * @param action The surf action
+ * @return The cost of the action
+ */
+XBT_PUBLIC(double) surf_action_get_cost(surf_action_t action);
+
+/**
+ * @brief [brief desrciption]
+ * @details [long description]
+ * 
+ * @param action The surf cpu action
+ * @param cpu [description]
+ * @param mask [description]
+ */
+XBT_PUBLIC(void) surf_cpu_action_set_affinity(surf_action_t action, surf_resource_t cpu, unsigned long mask);
+
+/**
+ * @brief [brief description]
+ * @details [long description]
+ * 
+ * @param action The surf cpu action
+ * @param bound [description]
+ */
+XBT_PUBLIC(void) surf_cpu_action_set_bound(surf_action_t action, double bound);
+
+/**
+ * @brief [brief description]
+ * @details [long description]
+ *
+ * @param action The surf network action
+ */
+XBT_PUBLIC(double) surf_network_action_get_latency_limited(surf_action_t action);
+
+/**
+ * @brief Get the file associated to a storage action
+ * 
+ * @param action The surf storage action
+ * @return The file associated to a storage action
+ */
+XBT_PUBLIC(surf_file_t) surf_storage_action_get_file(surf_action_t action);
+
+/**
+ * @brief Get the result dictionary of an ls action
+ * 
+ * @param action The surf storage action
+ * @return The dictionry listing a path
+ */
+XBT_PUBLIC(xbt_dict_t) surf_storage_action_get_ls_dict(surf_action_t action);
+
+XBT_PUBLIC(surf_model_t) surf_resource_model(const void *host, int level);
+
+/** @} */
 
 /**************************************/
 /* Implementations of model object */
 /**************************************/
 
+/** \ingroup SURF_models
+ *  \brief The CPU model object for the physical machine layer
+ */
+XBT_PUBLIC_DATA(surf_cpu_model_t) surf_cpu_model_pm;
 
 /** \ingroup SURF_models
- *  \brief The CPU model
+ *  \brief The CPU model object for the virtual machine layer
  */
-XBT_PUBLIC_DATA(surf_model_t) surf_cpu_model;
+XBT_PUBLIC_DATA(surf_cpu_model_t) surf_cpu_model_vm;
+
 
 /** \ingroup SURF_models
  *  \brief Initializes the CPU model with the model Cas01
@@ -434,6 +942,11 @@ XBT_PUBLIC(void) surf_cpu_model_init_ti(void);
  */
 XBT_PUBLIC_DATA(s_surf_model_description_t) surf_optimization_mode_description[];
 
+/** \ingroup SURF_plugins
+ *  \brief The list of all available surf plugins
+ */
+XBT_PUBLIC_DATA(s_surf_model_description_t) surf_plugin_description[];
+
 /** \ingroup SURF_models
  *  \brief The list of all available cpu model models
  */
@@ -452,7 +965,7 @@ XBT_PUBLIC_DATA(s_surf_model_description_t) surf_cpu_model_description[];
  *  model should be accessed because depending on the platform model,
  *  the network model can be NULL.
  */
-XBT_PUBLIC_DATA(surf_model_t) surf_network_model;
+XBT_PUBLIC_DATA(surf_network_model_t) surf_network_model;
 
 /** \ingroup SURF_models
  *  \brief Same as network model 'LagrangeVelho', only with different correction factors.
@@ -588,7 +1101,7 @@ XBT_PUBLIC(void) surf_storage_model_init_default(void);
  */
 XBT_PUBLIC_DATA(s_surf_model_description_t) surf_storage_model_description[];
 
-XBT_PUBLIC_DATA(surf_model_t) surf_storage_model;
+XBT_PUBLIC_DATA(surf_storage_model_t) surf_storage_model;
 
 /** \ingroup SURF_models
  *  \brief The workstation model
@@ -598,7 +1111,17 @@ XBT_PUBLIC_DATA(surf_model_t) surf_storage_model;
  *  because depending on the platform model, the network model and the CPU model
  *  may not exist.
  */
-XBT_PUBLIC_DATA(surf_model_t) surf_workstation_model;
+XBT_PUBLIC_DATA(surf_workstation_model_t) surf_workstation_model;
+
+/** \ingroup SURF_models
+ *  \brief The vm_workstation model
+ *
+ *  Note that when you create an API on top of SURF,
+ *  the vm_workstation model should be the only one you use
+ *  because depending on the platform model, the network model and the CPU model
+ *  may not exist.
+ */
+XBT_PUBLIC_DATA(surf_vm_workstation_model_t) surf_vm_workstation_model;
 
 /** \ingroup SURF_models
  *  \brief Initializes the platform with a compound workstation model
@@ -637,17 +1160,31 @@ XBT_PUBLIC(void) surf_workstation_model_init_ptask_L07(void);
 XBT_PUBLIC_DATA(s_surf_model_description_t)
     surf_workstation_model_description[];
 
-/*******************************************
- *  TUTORIAL: New model
+/** \ingroup SURF_models
+ *  \brief Initializes the platform with the current best network and cpu models at hand
+ *
+ *  This platform model seperates the workstation model and the network model.
+ *  The workstation model will be initialized with the model compound, the network
+ *  model with the model LV08 (with cross traffic support) and the CPU model with
+ *  the model Cas01.
+ *  Such model is subject to modification with warning in the ChangeLog so monitor it!
+ *
+ */
+XBT_PUBLIC(void) surf_vm_workstation_model_init_current_default(void);
+
+/** \ingroup SURF_models
+ *  \brief The list of all available vm workstation model models
  */
-XBT_PUBLIC(void) surf_new_model_init_default(void);
-XBT_PUBLIC_DATA(s_surf_model_description_t) surf_new_model_description[];
+XBT_PUBLIC_DATA(s_surf_model_description_t)
+    surf_vm_workstation_model_description[];
+
 /*******************************************/
 
 /** \ingroup SURF_models
  *  \brief List of initialized models
  */
 XBT_PUBLIC_DATA(xbt_dynar_t) model_list;
+XBT_PUBLIC_DATA(xbt_dynar_t) model_list_invoke;
 
 /** \ingroup SURF_simulation
  *  \brief List of hosts that have juste restarted and whose autorestart process should be restarted.
@@ -662,13 +1199,14 @@ XBT_PUBLIC(xbt_dict_t) watched_hosts_lib;
 /*******************************************/
 /*** SURF Platform *************************/
 /*******************************************/
-typedef struct s_as *AS_t;
-
 XBT_PUBLIC_DATA(AS_t) surf_AS_get_routing_root(void); 
 XBT_PUBLIC_DATA(const char *) surf_AS_get_name(AS_t as);
 XBT_PUBLIC_DATA(xbt_dict_t) surf_AS_get_routing_sons(AS_t as);
 XBT_PUBLIC_DATA(const char *) surf_AS_get_model(AS_t as);
 XBT_PUBLIC_DATA(xbt_dynar_t) surf_AS_get_hosts(AS_t as);
+XBT_PUBLIC_DATA(void) surf_AS_get_graph(AS_t as, xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges);
+XBT_PUBLIC_DATA(AS_t) surf_platf_get_root(routing_platf_t platf);
+XBT_PUBLIC_DATA(e_surf_network_element_type_t) surf_routing_edge_get_rc_type(sg_routing_edge_t edge);
 
 /*******************************************/
 /*** SURF Globals **************************/
@@ -727,6 +1265,9 @@ XBT_PUBLIC(void) surf_exit(void);
 /* Prototypes of the functions that handle the properties */
 XBT_PUBLIC_DATA(xbt_dict_t) current_property_set;       /* the prop set for the currently parsed element (also used in SIMIX) */
 
+/* The same for model_prop set*/
+XBT_PUBLIC_DATA(xbt_dict_t) current_model_property_set;
+
 /* surf parse file related (public because called from a test suite) */
 XBT_PUBLIC(void) parse_platform_file(const char *file);
 
@@ -765,7 +1306,7 @@ void instr_routing_define_callbacks (void);
 void instr_new_variable_type (const char *new_typename, const char *color);
 void instr_new_user_variable_type  (const char *father_type, const char *new_typename, const char *color);
 void instr_new_user_state_type (const char *father_type, const char *new_typename);
-void instr_new_value_for_user_state_type (const char *typename, const char *value, const char *color);
+void instr_new_value_for_user_state_type (const char *_typename, const char *value, const char *color);
 int instr_platform_traced (void);
 xbt_graph_t instr_routing_platform_graph (void);
 void instr_routing_platform_graph_export_graphviz (xbt_graph_t g, const char *filename);
index 963fdff..38df8be 100644 (file)
@@ -1,5 +1,5 @@
 
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -9,7 +9,7 @@
 #ifndef SURF_RESOURCE_H
 #define SURF_RESOURCE_H
 
-static XBT_INLINE
+/*FIXME:DELETEstatic XBT_INLINE
     surf_resource_t surf_resource_new(size_t childsize,
                                       surf_model_t model, const char *name,
                                       xbt_dict_t props, void_f_pvoid_t free_f)
@@ -40,6 +40,6 @@ static XBT_INLINE const char *surf_resource_name(const void *resource)
 static XBT_INLINE xbt_dict_t surf_resource_properties(const void *resource)
 {
   return ((surf_resource_t) resource)->properties;
-}
+}*/
 
 #endif                          /* SURF_RESOURCE_H */
index 44bfeaf..b0d7e33 100644 (file)
@@ -1,5 +1,5 @@
 
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -11,7 +11,7 @@
 #include "surf/trace_mgr.h"
 #include "surf/surf_resource.h"
 
-
+#ifdef TOMATO
 static XBT_INLINE
     surf_resource_lmm_t surf_resource_lmm_new(size_t childsize,
                                               /* for superclass */
@@ -43,7 +43,7 @@ static XBT_INLINE
         tmgr_history_add_trace(history, metric_trace, 0.0, 0, res);
   return res;
 }
-
+#endif
 
 static XBT_INLINE e_surf_resource_state_t surf_resource_lmm_get_state(void
                                                                       *r)
index 93b09e3..3d6db8b 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2011-2013. The SimGrid Team.
+/* Copyright (c) 2011-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef SURFXML_PARSE_VALUES_H_
 #define SURFXML_PARSE_VALUES_H_
@@ -12,8 +12,6 @@ typedef struct s_surf_parsing_link_up_down *surf_parsing_link_up_down_t;
 typedef struct s_surf_parsing_link_up_down {
   void* link_up;
   void* link_down;
-  void* limiter_link;
-  void* loopback_link;
 } s_surf_parsing_link_up_down_t;
 
 #endif /* SURFXML_PARSE_VALUES_H_ */
index 85c80a6..62cf3ac 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2007, 2009-2012. The SimGrid Team.
+/* Copyright (c) 2004-2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -13,6 +13,8 @@
 #include "surf/datatypes.h"
 #include "simgrid/platf_interface.h"
 
+SG_BEGIN_DECL()
+
 /* Creation functions */
 XBT_PUBLIC(tmgr_history_t) tmgr_history_new(void);
 XBT_PUBLIC(void) tmgr_history_free(tmgr_history_t history);
@@ -43,4 +45,6 @@ XBT_PUBLIC(tmgr_trace_event_t)
 
 XBT_PUBLIC(void) tmgr_finalize(void);
 
+SG_END_DECL()
+
 #endif                          /* _SURF_TMGR_H */
index 2a42835..b258f2f 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2008-2010, 2014. 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. */
+
 /*
  * Declarations for DBGHELP
  *
index 42a0c4d..90b1304 100644 (file)
@@ -1,7 +1,7 @@
 /*  xbt/xbt_portability.h -- all system dependency                          */
 /* Private portability layer                                                */
 
-/* Copyright (c) 2007, 2009-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 83e7103..2975472 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "instr/instr_private.h"
 #include "xbt/virtu.h" /* sg_cmdline */
 #include "xbt/xbt_os_time.h"
@@ -71,7 +72,11 @@ void print_TICreateContainer(paje_event_t event)
     char *folder_name = bprintf("%s_files", TRACE_get_filename());
     char *filename = bprintf("%s/%f_%s.txt", folder_name, prefix,
                              ((createContainer_t) event->data)->container->name);
+#ifdef WIN32
+    mkdir(folder_name);
+#else
     mkdir(folder_name, S_IRWXU | S_IRWXG | S_IRWXO);
+#endif
     temp = fopen(filename, "w");
     if (temp == NULL)
       xbt_die("Tracefile %s could not be opened for writing: %s",
index 6300219..8fa57c0 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
 #include "simgrid/sg_config.h"
@@ -585,17 +585,18 @@ void TRACE_help (int detailed)
       "  information that would be registered otherwise.",
       detailed);
   print_line (OPT_TRACING_DISPLAY_SIZES, "Only works for SMPI now. Add message size information",
-      "Message size (in bytes) is added to links, and to states. For collectives, the displayed value \n"
-      "is the more relevant to the collective (total sent by the process, usually)",
+      "  Message size (in bytes) is added to links, and to states. For collectives,\n"
+      "  the displayed value is the more relevant to the collective (total sent by\n"
+      "  the process, usually)",
       detailed);
   print_line (OPT_TRACING_FORMAT, "Only works for SMPI now. Switch output format",
-      "Default format is Paje. Time independent traces are also supported, \n"
-      "to output traces that can later be used by the trace replay tool",
+      "  Default format is Paje. Time independent traces are also supported,\n"
+      "  to output traces that can later be used by the trace replay tool",
       detailed);
   print_line (OPT_TRACING_FORMAT_TI_ONEFILE, "Only works for SMPI now, and TI output format",
-      "By default, each process outputs to a separate file, inside a filename_files folder \n"
-      "By setting this option to yes, all processes will output to only one file \n"
-      "This is meant to avoid opening thousands of files with large simulations",
+      "  By default, each process outputs to a separate file, inside a filename_files folder\n"
+      "  By setting this option to yes, all processes will output to only one file\n"
+      "  This is meant to avoid opening thousands of files with large simulations",
       detailed);
   print_line (OPT_TRACING_COMMENT, "Comment to be added on the top of the trace file.",
       "  Use this to add a comment line to the top of the trace file.",
index 052144c..a8e97d3 100644 (file)
@@ -1,14 +1,15 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "simgrid_config.h"
 
 #ifdef HAVE_TRACING
 #include "instr/instr_private.h"
-#include "surf/network_private.h"
+#include "surf/surf.h"
+#include "surf/surf_private.h"
 
 typedef enum {
   INSTR_US_DECLARE,
@@ -374,7 +375,7 @@ static void instr_user_srcdst_variable(double time,
   unsigned int i;
   void *link;
   xbt_dynar_foreach (route, i, link) {
-    char *link_name = ((link_CM02_t)link)->lmm_resource.generic_resource.name;
+    char *link_name = (char*)surf_resource_name(link);
     instr_user_variable (time, link_name, variable, father_type, value, what, NULL, user_link_variables);
   }
 }
index 327e57c..0dc0d0a 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
 #include "xbt/lib.h"
index e8716bf..b4ca75a 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
 
index 46603c6..e99bb30 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
 #include "xbt/virtu.h" /* sg_cmdline */
index c2c4c42..32177de 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "instr/instr_private.h"
 
 #ifdef HAVE_TRACING
index a2e5748..8e81a9f 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
-  * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "instr/instr_private.h"
 
 #ifdef HAVE_TRACING
index 2c0fc4b..908ecd6 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef INSTR_PRIVATE_H_
 #define INSTR_PRIVATE_H_
@@ -14,6 +14,8 @@
 
 #ifdef HAVE_TRACING
 
+SG_BEGIN_DECL()
+
 /* Need to define function drand48 for Windows */
 #ifdef _WIN32
 #  define drand48() (rand()/(RAND_MAX + 1.0))
@@ -345,7 +347,6 @@ XBT_PUBLIC(val_t)  PJ_value_get_or_new (const char *name, const char *color, typ
 XBT_PUBLIC(val_t)  PJ_value_get (const char *name, const type_t father);
 void PJ_value_free (val_t value);
 
-
 void print_pajeDefineContainerType(paje_event_t event);
 void print_pajeDefineVariableType(paje_event_t event);
 void print_pajeDefineStateType(paje_event_t event);
@@ -458,15 +459,12 @@ typedef struct s_instr_extra_data {
   int num_processes;
 } s_instr_extra_data_t;
 
+SG_END_DECL()
+
 #endif /* HAVE_TRACING */
 
 #ifdef HAVE_JEDULE
 #include "instr/jedule/jedule_sd_binding.h"
 #endif
 
-
-
-
-
-
 #endif /* INSTR_PRIVATE_H_ */
index d6b8891..c3be529 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
 
index 005ec35..8481697 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
 #include "xbt/virtu.h" /* sg_cmdline */
index 489cdc7..07a5dca 100644 (file)
@@ -1,9 +1,8 @@
-/*
- * jedule_events.c
- *
- *  Created on: Nov 30, 2010
- *      Author: sascha
- */
+/* Copyright (c) 2010-2014. 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>
index 401b09b..aa286e5 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * jedule_output.c
- *
- *  Created on: Dec 1, 2010
- *      Author: sascha
- */
+/* Copyright (c) 2010-2014. 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>
index 29eda01..b096eed 100644 (file)
@@ -1,9 +1,8 @@
-/*
- * jed_simgrid_platform.c
- *
- *  Created on: Nov 30, 2010
- *      Author: sascha
- */
+/* Copyright (c) 2010-2014. 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>
index 2932fc6..ab945ff 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 9a923b2..3e1f4cb 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -236,6 +236,14 @@ void MC_find_object_address(memory_map_t maps, mc_object_info_t result) {
 /************************************* Take Snapshot ************************************/
 /****************************************************************************************/
 
+static bool mc_valid_variable(dw_variable_t var, dw_frame_t frame, const void* ip) {
+  // The variable is not yet valid:
+  if((const void*)((const char*) frame->low_pc + var->start_scope) > ip)
+    return false;
+  else
+    return true;
+}
+
 static xbt_dynar_t MC_get_local_variables_values(xbt_dynar_t stack_frames){
 
   unsigned cursor1 = 0;
@@ -248,6 +256,9 @@ static xbt_dynar_t MC_get_local_variables_values(xbt_dynar_t stack_frames){
     dw_variable_t current_variable;
     xbt_dynar_foreach(stack_frame->frame->variables, cursor2, current_variable){
       
+      if(!mc_valid_variable(current_variable, stack_frame->frame, (void*) stack_frame->ip))
+        continue;
+
       int region_type;
       if((long)stack_frame->ip > (long)mc_libsimgrid_info->start_exec)
         region_type = 1;
index 193a90c..ca2d81a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -107,6 +107,9 @@ static int compare_areas_with_type(void *area1, void *area2, mc_object_info_t in
   void *addr_pointed1, *addr_pointed2;
 
   switch(type->type){
+  case DW_TAG_unspecified_type:
+    return 1;
+
   case DW_TAG_base_type:
   case DW_TAG_enumeration_type:
   case DW_TAG_union_type:
@@ -120,10 +123,16 @@ static int compare_areas_with_type(void *area1, void *area2, mc_object_info_t in
   case DW_TAG_array_type:
     subtype = type->subtype;
     switch(subtype->type){
+    case DW_TAG_unspecified_type:
+      return 1;
+
     case DW_TAG_base_type:
     case DW_TAG_enumeration_type:
     case DW_TAG_pointer_type:
+    case DW_TAG_reference_type:
+    case DW_TAG_rvalue_reference_type:
     case DW_TAG_structure_type:
+    case DW_TAG_class_type:
     case DW_TAG_union_type:
       if(subtype->byte_size == 0){ /*declaration of the type, need the complete description */
           subtype = subtype->other_object_same_type;
@@ -155,6 +164,8 @@ static int compare_areas_with_type(void *area1, void *area2, mc_object_info_t in
     }
     break;
   case DW_TAG_pointer_type:
+  case DW_TAG_reference_type:
+  case DW_TAG_rvalue_reference_type:
     if(type->subtype && type->subtype->type == DW_TAG_subroutine_type){
       addr_pointed1 = *((void **)(area1)); 
       addr_pointed2 = *((void **)(area2));
@@ -198,6 +209,7 @@ static int compare_areas_with_type(void *area1, void *area2, mc_object_info_t in
     }
     break;
   case DW_TAG_structure_type:
+  case DW_TAG_class_type:
     xbt_dynar_foreach(type->members, cursor, member){
       XBT_DEBUG("Compare member %s", member->name);
       res = compare_areas_with_type((char *)area1 + member->offset, (char *)area2 + member->offset, info, other_info, member->subtype, region_size, region_type, start_data, pointer_level);
index 7aaa065..5ab8aed 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -214,6 +214,8 @@ static mc_visited_state_t visited_state_new(){
  *  The subrange is the subrange of "equivalence" of the given state.
  */
 static int get_search_interval(xbt_dynar_t all_states, mc_visited_state_t state, int *min, int *max){
+  XBT_VERB("Searching interval for state %i: nd_processes=%zu heap_bytes_used=%zu",
+    state->num, (size_t)state->nb_processes, (size_t)state->heap_bytes_used);
 
   int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
index 4f86800..aa5f9f0 100644 (file)
@@ -50,11 +50,11 @@ static uint64_t MC_dwarf_array_element_count(Dwarf_Die* die, Dwarf_Die* unit);
  *  \param unit the DIE of the compile unit of the current DIE
  *  \param frame containg frame if any
  */
-static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame);
+static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace);
 
 /** \brief Process a type DIE
  */
-static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit);
+static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace);
 
 /** \brief Calls MC_dwarf_handle_die on all childrend of the given die
  *
@@ -63,7 +63,7 @@ static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die* die, Dwar
  *  \param unit the DIE of the compile unit of the current DIE
  *  \param frame containg frame if any
  */
-static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame);
+static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace);
 
 /** \brief Handle a variable (DW_TAG_variable or other)
  *
@@ -72,7 +72,7 @@ static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die* die, Dwar
  *  \param unit the DIE of the compile unit of the current DIE
  *  \param frame containg frame if any
  */
-static void MC_dwarf_handle_variable_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame);
+static void MC_dwarf_handle_variable_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace);
 
 /** \brief Convert a libdw DWARF expression into a MC representation of the location
  *
@@ -98,7 +98,7 @@ const char* MC_dwarf_attrname(int attr) {
   switch (attr) {
 #include "mc_dwarf_attrnames.h"
   default:
-    return "DW_AT_unkown";
+    return "DW_AT_unknown";
   }
 }
 
@@ -113,7 +113,68 @@ const char* MC_dwarf_tagname(int tag) {
   case DW_TAG_invalid:
     return "DW_TAG_invalid";
   default:
-    return "DW_TAG_unkown";
+    return "DW_TAG_unknown";
+  }
+}
+
+/** \brief A class of DWARF tags (DW_TAG_*)
+ */
+typedef enum mc_tag_class {
+  mc_tag_unknown,
+  mc_tag_type,
+  mc_tag_subprogram,
+  mc_tag_variable,
+  mc_tag_scope,
+  mc_tag_namespace
+} mc_tag_class;
+
+static mc_tag_class MC_dwarf_tag_classify(int tag) {
+  switch (tag) {
+
+    case DW_TAG_array_type:
+    case DW_TAG_class_type:
+    case DW_TAG_enumeration_type:
+    case DW_TAG_typedef:
+    case DW_TAG_pointer_type:
+    case DW_TAG_reference_type:
+    case DW_TAG_rvalue_reference_type:
+    case DW_TAG_string_type:
+    case DW_TAG_structure_type:
+    case DW_TAG_subroutine_type:
+    case DW_TAG_union_type:
+    case DW_TAG_ptr_to_member_type:
+    case DW_TAG_set_type:
+    case DW_TAG_subrange_type:
+    case DW_TAG_base_type:
+    case DW_TAG_const_type:
+    case DW_TAG_file_type:
+    case DW_TAG_packed_type:
+    case DW_TAG_volatile_type:
+    case DW_TAG_restrict_type:
+    case DW_TAG_interface_type:
+    case DW_TAG_unspecified_type:
+    case DW_TAG_mutable_type:
+    case DW_TAG_shared_type:
+      return mc_tag_type;
+
+    case DW_TAG_subprogram:
+      return mc_tag_subprogram;
+
+    case DW_TAG_variable:
+    case DW_TAG_formal_parameter:
+      return mc_tag_variable;
+
+    case DW_TAG_lexical_block:
+    case DW_TAG_try_block:
+    case DW_TAG_inlined_subroutine:
+      return mc_tag_scope;
+
+    case DW_TAG_namespace:
+      return mc_tag_namespace;
+
+    default:
+      return mc_tag_unknown;
+
   }
 }
 
@@ -560,6 +621,15 @@ static void MC_dwarf_add_members(mc_object_info_t info, Dwarf_Die* die, Dwarf_Di
   type->members = xbt_dynar_new(sizeof(dw_type_t), (void(*)(void*))dw_type_free);
   for (res=dwarf_child(die, &child); res==0; res=dwarf_siblingof(&child,&child)) {
     if (dwarf_tag(&child)==DW_TAG_member) {
+
+      // Skip declarations:
+      if (MC_dwarf_attr_flag(&child, DW_AT_declaration, false))
+        continue;
+
+      // Skip compile time constants:
+      if(dwarf_hasattr(&child, DW_AT_const_value))
+        continue;
+
       // TODO, we should use another type (because is is not a type but a member)
       dw_type_t member = xbt_new0(s_dw_type_t, 1);
       member->type = -1;
@@ -600,7 +670,7 @@ static void MC_dwarf_add_members(mc_object_info_t info, Dwarf_Die* die, Dwarf_Di
  *  \param unit compilation unit of the current DIE
  *  \return MC representation of the type
  */
-static dw_type_t MC_dwarf_die_to_type(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit) {
+static dw_type_t MC_dwarf_die_to_type(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace) {
 
   dw_type_t type = xbt_new0(s_dw_type_t, 1);
   type->type = -1;
@@ -653,13 +723,18 @@ static dw_type_t MC_dwarf_die_to_type(mc_object_info_t info, Dwarf_Die* die, Dwa
   case DW_TAG_union_type:
   case DW_TAG_class_type:
          MC_dwarf_add_members(info, die, unit, type);
+         char* new_namespace = namespace == NULL ? xbt_strdup(type->name)
+           : bprintf("%s::%s", namespace, type->name);
+         MC_dwarf_handle_children(info, die, unit, frame, new_namespace);
+         free(new_namespace);
+         break;
   }
 
   return type;
 }
 
-static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit) {
-  dw_type_t type = MC_dwarf_die_to_type(info, die, unit);
+static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace) {
+  dw_type_t type = MC_dwarf_die_to_type(info, die, unit, frame, namespace);
 
   char* key = bprintf("%" PRIx64, (uint64_t) type->id);
   xbt_dict_set(info->types, key, type, NULL);
@@ -830,11 +905,15 @@ static dw_location_t MC_dwarf_get_expression(Dwarf_Op* expr,  size_t len) {
 
 static int mc_anonymous_variable_index = 0;
 
-static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame) {
-  // Drop declaration:
+static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace) {
+  // Skip declarations:
   if (MC_dwarf_attr_flag(die, DW_AT_declaration, false))
     return NULL;
 
+  // Skip compile time constants:
+  if(dwarf_hasattr(die, DW_AT_const_value))
+    return NULL;
+
   Dwarf_Attribute attr_location;
   if (dwarf_attr(die, DW_AT_location, &attr_location)==NULL) {
     // No location: do not add it ?
@@ -844,7 +923,10 @@ static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die* die, D
   dw_variable_t variable = xbt_new0(s_dw_variable_t, 1);
   variable->dwarf_offset = dwarf_dieoffset(die);
   variable->global = frame == NULL; // Can be override base on DW_AT_location
-  variable->name = xbt_strdup(MC_dwarf_attr_string(die, DW_AT_name));
+
+  const char* name = MC_dwarf_attr_string(die, DW_AT_name);
+  variable->name = xbt_strdup(name);
+
   variable->type_origin = MC_dwarf_at_type(die);
 
   int form = dwarf_whatform(&attr_location);
@@ -884,6 +966,31 @@ static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die* die, D
       form, form, klass, klass, (void*) variable->dwarf_offset, variable->name);
   }
 
+  // Handle start_scope:
+  if (dwarf_hasattr(die, DW_AT_start_scope)) {
+    Dwarf_Attribute attr;
+    dwarf_attr(die, DW_AT_start_scope, &attr);
+    int form  = dwarf_whatform(&attr);
+    int klass = MC_dwarf_form_get_class(form);
+    switch(klass) {
+    case MC_DW_CLASS_CONSTANT:
+    {
+      Dwarf_Word value;
+      variable->start_scope = dwarf_formudata(&attr, &value) == 0 ? (size_t) value : 0;
+      break;
+    }
+    default:
+      xbt_die("Unhandled form 0x%x, class 0x%X for DW_AT_start_scope of variable %s",
+        form, klass, name==NULL ? "?" : name);
+    }
+  }
+
+  if(namespace && variable->global) {
+    char* old_name = variable->name;
+    variable->name = bprintf("%s::%s", namespace, old_name);
+    free(old_name);
+  }
+
   // The current code needs a variable name,
   // generate a fake one:
   if(!variable->name) {
@@ -893,22 +1000,20 @@ static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die* die, D
   return variable;
 }
 
-static void MC_dwarf_handle_variable_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame) {
-  dw_variable_t variable = MC_die_to_variable(info, die, unit, frame);
+static void MC_dwarf_handle_variable_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace) {
+  dw_variable_t variable = MC_die_to_variable(info, die, unit, frame, namespace);
   if(variable==NULL)
       return;
   MC_dwarf_register_variable(info, frame, variable);
 }
 
-static void MC_dwarf_handle_subprogram_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t parent_frame) {
+static void MC_dwarf_handle_subprogram_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t parent_frame, const char* namespace) {
   dw_frame_t frame = xbt_new0(s_dw_frame_t, 1);
 
   frame->start = dwarf_dieoffset(die);
 
-  const char* name = MC_dwarf_at_linkage_name(die);
-  if (name==NULL)
-    name = MC_dwarf_attr_string(die, DW_AT_name);
-  frame->name = xbt_strdup(name);
+  const char* name = MC_dwarf_attr_string(die, DW_AT_name);
+  frame->name = namespace ? bprintf("%s::%s", namespace, name) : xbt_strdup(name);
 
   // This is the base address for DWARF addresses.
   // Relocated addresses are offset from this base address.
@@ -922,60 +1027,64 @@ static void MC_dwarf_handle_subprogram_die(mc_object_info_t info, Dwarf_Die* die
   frame->frame_base = MC_dwarf_at_location(info, die, DW_AT_frame_base);
   frame->end = -1; // This one is now useless:
 
+  // Register it:
+  xbt_dynar_push(info->subprograms, &frame);
+
   // Handle children:
-  MC_dwarf_handle_children(info, die, unit, frame);
+  MC_dwarf_handle_children(info, die, unit, frame, namespace);
+}
 
-  // Register it:
-  xbt_dict_set(info->local_variables, frame->name, frame, NULL);
+static void mc_dwarf_handle_namespace_die(
+    mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace) {
+  const char* name = MC_dwarf_attr_string(die, DW_AT_name);
+  if(frame)
+    xbt_die("Unexpected namespace in a subprogram");
+  char* new_namespace = namespace == NULL ? xbt_strdup(name)
+    : bprintf("%s::%s", namespace, name);
+  MC_dwarf_handle_children(info, die, unit, frame, new_namespace);
 }
 
-static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame) {
+static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace) {
   Dwarf_Die child;
   int res;
   for (res=dwarf_child(die, &child); res==0; res=dwarf_siblingof(&child,&child)) {
-    MC_dwarf_handle_die(info, &child, unit, frame);
+    MC_dwarf_handle_die(info, &child, unit, frame, namespace);
   }
 }
 
-static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame) {
+static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace) {
   int tag = dwarf_tag(die);
-  switch (tag) {
-    case DW_TAG_array_type:
-    case DW_TAG_class_type:
-    case DW_TAG_enumeration_type:
-    case DW_TAG_typedef:
-    case DW_TAG_pointer_type:
-    case DW_TAG_string_type:
-    case DW_TAG_structure_type:
-    case DW_TAG_subroutine_type:
-    case DW_TAG_union_type:
-    case DW_TAG_ptr_to_member_type:
-    case DW_TAG_set_type:
-    case DW_TAG_subrange_type:
-    case DW_TAG_base_type:
-    case DW_TAG_const_type:
-    case DW_TAG_file_type:
-    case DW_TAG_packed_type:
-    case DW_TAG_volatile_type:
-    case DW_TAG_restrict_type:
-    case DW_TAG_interface_type:
-    case DW_TAG_unspecified_type:
-    case DW_TAG_mutable_type:
-    case DW_TAG_shared_type:
-      MC_dwarf_handle_type_die(info, die, unit);
+  mc_tag_class klass = MC_dwarf_tag_classify(tag);
+  switch (klass) {
+
+    // Type:
+    case mc_tag_type:
+      MC_dwarf_handle_type_die(info, die, unit, frame, namespace);
       break;
-    case DW_TAG_subprogram:
-      MC_dwarf_handle_subprogram_die(info, die, unit, frame);
+
+    // Program:
+    case mc_tag_subprogram:
+      MC_dwarf_handle_subprogram_die(info, die, unit, frame, namespace);
       return;
-    // case DW_TAG_formal_parameter:
-    case DW_TAG_variable:
-    case DW_TAG_formal_parameter:
-      MC_dwarf_handle_variable_die(info, die, unit, frame);
+
+    // Variable:
+    case mc_tag_variable:
+      MC_dwarf_handle_variable_die(info, die, unit, frame, namespace);
+      break;
+
+    // Scope:
+    case mc_tag_scope:
+      // TODO
+      break;
+
+    case mc_tag_namespace:
+      mc_dwarf_handle_namespace_die(info, die, unit, frame, namespace);
+      break;
+
+    default:
       break;
-  }
 
-  // Recursive processing of children DIE:
-  MC_dwarf_handle_children(info, die, unit, frame);
+  }
 }
 
 void MC_dwarf_get_variables(mc_object_info_t info) {
@@ -992,10 +1101,14 @@ void MC_dwarf_get_variables(mc_object_info_t info) {
   Dwarf_Off next_offset = 0;
   size_t length;
   while (dwarf_nextcu (dwarf, offset, &next_offset, &length, NULL, NULL, NULL) == 0) {
-    Dwarf_Die die;
+    Dwarf_Die unit_die;
 
-    if(dwarf_offdie(dwarf, offset+length, &die)!=NULL) {
-      MC_dwarf_handle_die(info, &die, &die, NULL);
+    if(dwarf_offdie(dwarf, offset+length, &unit_die)!=NULL) {
+      Dwarf_Die child;
+      int res;
+      for (res=dwarf_child(&unit_die, &child); res==0; res=dwarf_siblingof(&child,&child)) {
+        MC_dwarf_handle_die(info, &child, &unit_die, NULL, NULL);
+      }
     }
     offset = next_offset;
   }
index ceee7f9..133343e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -199,17 +199,16 @@ void dw_variable_free_voidp(void *t){
 
 mc_object_info_t MC_new_object_info(void) {
   mc_object_info_t res = xbt_new0(s_mc_object_info_t, 1);
-  res->local_variables = xbt_dict_new_homogeneous(NULL);
+  res->subprograms = xbt_dynar_new(sizeof(dw_frame_t), NULL);
   res->global_variables = xbt_dynar_new(sizeof(dw_variable_t), dw_variable_free_voidp);
   res->types = xbt_dict_new_homogeneous(NULL);
   res->types_by_name = xbt_dict_new_homogeneous(NULL);
   return res;
 }
 
-
 void MC_free_object_info(mc_object_info_t* info) {
   xbt_free(&(*info)->file_name);
-  xbt_dict_free(&(*info)->local_variables);
+  xbt_dynar_free(&(*info)->subprograms);
   xbt_dynar_free(&(*info)->global_variables);
   xbt_dict_free(&(*info)->types);
   xbt_dict_free(&(*info)->types_by_name);
@@ -243,9 +242,8 @@ static void MC_make_functions_index(mc_object_info_t info) {
 
   // Populate the array:
   dw_frame_t frame = NULL;
-  xbt_dict_cursor_t cursor = NULL;
-  const char* name = NULL;
-  xbt_dict_foreach(info->local_variables, cursor, name, frame) {
+  unsigned cursor = 0;
+  xbt_dynar_foreach(info->subprograms, cursor, frame) {
     if(frame->low_pc==NULL)
       continue;
     s_mc_function_index_item_t entry;
@@ -315,10 +313,9 @@ static void MC_post_process_variables(mc_object_info_t info) {
 }
 
 static void MC_post_process_functions(mc_object_info_t info) {
-  xbt_dict_cursor_t cursor = NULL;
-  char* key = NULL;
+  unsigned cursor = 0;
   dw_frame_t function = NULL;
-  xbt_dict_foreach(info->local_variables, cursor, key, function) {
+  xbt_dynar_foreach(info->subprograms, cursor, function) {
     unsigned cursor2 = 0;
     dw_variable_t variable = NULL;
     xbt_dynar_foreach(function->variables, cursor2, variable) {
@@ -352,7 +349,7 @@ static dw_location_t MC_dwarf_get_location(xbt_dict_t location_list, char *expr)
 
   if(location_list != NULL){
     
-    char *key = bprintf("%d", (int)strtoul(expr, NULL, 16));
+    char *key = bprintf("%lu", strtoul(expr, NULL, 16));
     loc->type = e_dw_loclist;
     loc->location.loclist =  (xbt_dynar_t)xbt_dict_get_or_null(location_list, key);
     if(loc->location.loclist == NULL)
@@ -482,7 +479,6 @@ static dw_location_t MC_dwarf_get_location(xbt_dict_t location_list, char *expr)
 
 }
 
-
 /** \brief Finds a frame (DW_TAG_subprogram) from an DWARF offset in the rangd of this subprogram
  *
  * The offset can be an offset of a child DW_TAG_variable.
@@ -755,72 +751,50 @@ void MC_ignore_global_variable(const char *name){
     MC_UNSET_RAW_MEM;
 }
 
+static void MC_ignore_local_variable_in_object(const char *var_name, const char *frame_name, mc_object_info_t info) {
+  unsigned cursor2;
+  dw_frame_t frame;
+  int start, end;
+  int cursor = 0;
+  dw_variable_t current_var;
+
+  xbt_dynar_foreach(info->subprograms, cursor2, frame) {
+
+    if(frame_name && strcmp(frame_name, frame->name))
+      continue;
+
+    start = 0;
+    end = xbt_dynar_length(frame->variables) - 1;
+    while(start <= end){
+      cursor = (start + end) / 2;
+      current_var = (dw_variable_t)xbt_dynar_get_as(frame->variables, cursor, dw_variable_t);
+
+      int compare = strcmp(current_var->name, var_name);
+      if(compare == 0){
+        xbt_dynar_remove_at(frame->variables, cursor, NULL);
+        start = 0;
+        end = xbt_dynar_length(frame->variables) - 1;
+      }else if(compare < 0){
+        start = cursor + 1;
+      }else{
+        end = cursor - 1;
+      }
+    }
+  }
+}
+
 void MC_ignore_local_variable(const char *var_name, const char *frame_name){
   
   int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
+  if(strcmp(frame_name, "*") == 0)
+    frame_name = NULL;
+
   MC_SET_RAW_MEM;
 
-    unsigned int cursor = 0;
-    dw_variable_t current_var;
-    int start, end;
-    if(strcmp(frame_name, "*") == 0){ /* Remove variable in all frames */
-      xbt_dict_cursor_t dict_cursor;
-      char *current_frame_name;
-      dw_frame_t frame;
-      xbt_dict_foreach(mc_libsimgrid_info->local_variables, dict_cursor, current_frame_name, frame){
-        start = 0;
-        end = xbt_dynar_length(frame->variables) - 1;
-        while(start <= end){
-          cursor = (start + end) / 2;
-          current_var = (dw_variable_t)xbt_dynar_get_as(frame->variables, cursor, dw_variable_t); 
-          if(strcmp(current_var->name, var_name) == 0){
-            xbt_dynar_remove_at(frame->variables, cursor, NULL);
-            start = 0;
-            end = xbt_dynar_length(frame->variables) - 1;
-          }else if(strcmp(current_var->name, var_name) < 0){
-            start = cursor + 1;
-          }else{
-            end = cursor - 1;
-          } 
-        }
-      }
-       xbt_dict_foreach(mc_binary_info->local_variables, dict_cursor, current_frame_name, frame){
-        start = 0;
-        end = xbt_dynar_length(frame->variables) - 1;
-        while(start <= end){
-          cursor = (start + end) / 2;
-          current_var = (dw_variable_t)xbt_dynar_get_as(frame->variables, cursor, dw_variable_t); 
-          if(strcmp(current_var->name, var_name) == 0){
-            xbt_dynar_remove_at(frame->variables, cursor, NULL);
-            start = 0;
-            end = xbt_dynar_length(frame->variables) - 1;
-          }else if(strcmp(current_var->name, var_name) < 0){
-            start = cursor + 1;
-          }else{
-            end = cursor - 1;
-          } 
-        }
-      }
-    }else{
-      xbt_dynar_t variables_list = ((dw_frame_t)xbt_dict_get_or_null(
-                                      mc_libsimgrid_info->local_variables, frame_name))->variables;
-      start = 0;
-      end = xbt_dynar_length(variables_list) - 1;
-      while(start <= end){
-        cursor = (start + end) / 2;
-        current_var = (dw_variable_t)xbt_dynar_get_as(variables_list, cursor, dw_variable_t);
-        if(strcmp(current_var->name, var_name) == 0){
-          xbt_dynar_remove_at(variables_list, cursor, NULL);
-          start = 0;
-          end = xbt_dynar_length(variables_list) - 1;
-        }else if(strcmp(current_var->name, var_name) < 0){
-          start = cursor + 1;
-        }else{
-          end = cursor - 1;
-        } 
-      }
-    } 
+  MC_ignore_local_variable_in_object(var_name, frame_name, mc_libsimgrid_info);
+  if(frame_name!=NULL)
+    MC_ignore_local_variable_in_object(var_name, frame_name, mc_binary_info);
 
   if(!raw_mem_set)
     MC_UNSET_RAW_MEM;
index 533548b..627e708 100644 (file)
@@ -77,6 +77,11 @@ static void mc_hash_value(mc_hash_t* hash, mc_hashing_state* state, mc_object_in
   top:
 
   switch(type->type){
+
+  // Not relevant, do nothing:
+  case DW_TAG_unspecified_type:
+    return;
+
   // Simple case, hash this has binary:
   case DW_TAG_base_type:
   case DW_TAG_enumeration_type:
index 54f5143..96e6513 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2013. The SimGrid Team.
+/* Copyright (c) 2011-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 110b848..cc6350b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 1056f44..59f2764 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013. The SimGrid Team.
+/* Copyright (c) 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index bda10fd..e901815 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -341,7 +341,7 @@ struct s_mc_object_info {
   char *start_exec, *end_exec; // Executable segment
   char *start_rw, *end_rw; // Read-write segment
   char *start_ro, *end_ro; // read-only segment
-  xbt_dict_t local_variables; // xbt_dict_t<frame_name, dw_frame_t>
+  xbt_dynar_t subprograms; // xbt_dynar_t<dw_frame_t>
   xbt_dynar_t global_variables; // xbt_dynar_t<dw_variable_t>
   xbt_dict_t types; // xbt_dict_t<origin as hexadecimal string, dw_type_t>
   xbt_dict_t types_by_name; // xbt_dict_t<name, dw_type_t> (full defined type only)
@@ -443,6 +443,8 @@ typedef struct s_dw_variable{
   dw_location_t location;
   void* address;
 
+  size_t start_scope;
+
 }s_dw_variable_t, *dw_variable_t;
 
 struct s_dw_frame{
index 1a3d2aa..9fb5ad5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -279,9 +279,9 @@ char *MC_request_to_string(smx_simcall_t req, int value)
   }
 
   if(args != NULL){
-    str = bprintf("[(%lu)%s (%s)] %s(%s) (%d)", req->issuer->pid , MSG_host_get_name(req->issuer->smx_host), req->issuer->name, type, args, req->call);
+    str = bprintf("[(%lu)%s (%s)] %s(%s)", req->issuer->pid , MSG_host_get_name(req->issuer->smx_host), req->issuer->name, type, args);
   }else{
-    str = bprintf("[(%lu)%s (%s)] %s (%d) ", req->issuer->pid , MSG_host_get_name(req->issuer->smx_host), req->issuer->name, type, req->call);
+    str = bprintf("[(%lu)%s (%s)] %s ", req->issuer->pid , MSG_host_get_name(req->issuer->smx_host), req->issuer->name, type);
   }
 
   xbt_free(args);
index 7036c25..64dcb1a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d893439..e63cab7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
diff --git a/src/mk_supernovae.pl b/src/mk_supernovae.pl
deleted file mode 100644 (file)
index bd99ab4..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-#! /usr/bin/perl
-
-use strict;
-use Getopt::Long qw(GetOptions);
-
-#open TMP,">mk_supernovae.pl.args";
-#map {print TMP "$_ "} @ARGV;
-#close TMP;
-
-sub usage($) {
-    my $ret;
-    print "USAGE: mk_supernovae.pl [--fragile=file]* --out=file file1 file2*\n";
-    print "  --help: show this message\n";
-    print "  --fragile=file: specify that file is fragile and shouldn't be supernovaed\n";
-    print "  --out=file: specify the name of the output file\n";
-    print "elements may be separated by semi-columns (;) instead of spaces, too\n";
-    exit $ret;
-}
-
-my @fragile_files=undef;
-my $outfile=undef;
-my $help;
-
-Getopt::Long::config('permute','no_getopt_compat', 'no_auto_abbrev');
-GetOptions(
-    'help|h'                => \$help,
-
-    'fragile=s' =>\@fragile_files,
-    'out=s'     =>\$outfile) or usage(1);
-
-@fragile_files = split(/;/,join(';',@fragile_files));
-@fragile_files = split(/ /,join(' ',@fragile_files));
-
-usage(0) if (defined($help));
-unless(defined($outfile)) {
-    print "ERROR: No outfile defined.\n";
-    usage(1);
-}
-
-#print "mk_supernovae: generate $outfile\n";  
-
-open OUT, ">$outfile" or die "ERROR: cannot open $outfile: $!\n";
-
-print OUT <<EOF
-#define SUPERNOVAE_MODE 1
-#ifndef _GNU_SOURCE
-#  define _GNU_SOURCE     /* for getline() with older libc */
-#endif
-#ifndef _SVID_SOURCE
-#  define _SVID_SOURCE    /* strdup() */
-#endif
-#ifndef _ISOC99_SOURCE
-#  define _ISOC99_SOURCE  /* isfinite() */
-#endif
-#ifndef _ISO_C99_SOURCE
-#  define _ISO_C99_SOURCE /* isfinite() */
-#endif
-#include <ctype.h>
-#include "portable.h"
-#include "xbt.h"
-  
-EOF
-  ;
-
-sub readfile($) {
-    my $filename=shift;
-    open IN,"$filename" || die "ERROR: cannot read $filename: $!\n";
-    my $res;
-    while (<IN>) {
-       $res .= $_;
-    }
-    close IN;  
-    return $res;
-}
-
-
-my %fragile;
-map {$fragile{$_}=1} @fragile_files;
-my @args = split(/;/,join(';',@ARGV));
-@args = split(/ /,join(' ',@args));
-my $nbfile=0;
-foreach my $file (@args) {
-    if ($fragile{$file}) {
-       print "mk_supernovae: $file is fragile, skip it\n";
-       next;
-    } 
-#      print "mk_supernovae: process $file\n";
-    $nbfile++;
-
-    my $needundef=1;
-    print OUT "/* file $file */\n";
-    if ($file eq "xbt/log.c") {
-       print OUT "  #define _simgrid_log_category__default &_simgrid_log_category__log\n";
-    } else {
-       my $ctn = readfile($file);
-       if ($ctn =~ m/XBT_LOG_[^ ]*?DEFAULT_[^ ]*?CATEGORY/s) {
-           my $default=$ctn;
-           $default =~ s/.*XBT_LOG_[^ ]*?DEFAULT_[^ ]*?CATEGORY[^(]*\(([^,)]*).*$/$1/s;
-           print OUT "  #define _simgrid_log_category__default &_simgrid_log_category__$default\n";
-       } else {
-           print OUT "  /* no default category in file $file */\n";
-           $needundef = 0;
-       }
-    }
-    print OUT "  #include \"$file\"\n";
-    print OUT "  #undef _simgrid_log_category__default\n" if $needundef;
-    print OUT "\n";
-}
-close OUT;
-print "mk_supernovae: $outfile contains $nbfile files inlined\n";
index bb79416..e23f5d8 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "msg_private.h"
 
index c8e3288..4334eac 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
 #include "msg_private.h"
index c72cbfc..481d26b 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "msg_private.h"
 
@@ -13,7 +13,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_msg_vm, instr, "MSG VM");
 
 char *instr_vm_id (msg_vm_t vm, char *str, int len)
 {
-  return instr_vm_id_2 (vm->name, str, len);
+       return instr_vm_id_2 (MSG_vm_get_name(vm), str, len);
 }
 
 char *instr_vm_id_2 (const char *vm_name, char *str, int len)
@@ -55,7 +55,7 @@ void TRACE_msg_vm_change_host(msg_vm_t vm, msg_host_t old_host, msg_host_t new_h
   }
 }
 
-void TRACE_msg_vm_create (const char *vm_name, msg_host_t host)
+void TRACE_msg_vm_create(const char *vm_name, msg_host_t host)
 {
   if (TRACE_msg_vm_is_enabled()){
     int len = INSTR_DEFAULT_STR_SIZE;
@@ -66,6 +66,20 @@ void TRACE_msg_vm_create (const char *vm_name, msg_host_t host)
   }
 }
 
+void TRACE_msg_vm_start(msg_vm_t vm)
+{
+  if (TRACE_msg_vm_is_enabled()){
+    int len = INSTR_DEFAULT_STR_SIZE;
+    char str[INSTR_DEFAULT_STR_SIZE];
+
+    container_t vm_container = PJ_container_get (instr_vm_id(vm, str, len));
+    type_t type = PJ_type_get ("MSG_VM_STATE", vm_container->type);
+    val_t value = PJ_value_get ("start", type);
+    new_pajePushState (MSG_get_clock(), vm_container, type, value);
+  }
+
+}
+
 void TRACE_msg_vm_kill(msg_vm_t vm) {
   if (TRACE_msg_vm_is_enabled()) {
     int len = INSTR_DEFAULT_STR_SIZE;
@@ -103,7 +117,7 @@ void TRACE_msg_vm_resume(msg_vm_t vm)
   }
 }
 
-void TRACE_msg_vm_sleep_in(msg_vm_t vm)
+void TRACE_msg_vm_save(msg_vm_t vm)
 {
   if (TRACE_msg_vm_is_enabled()){
     int len = INSTR_DEFAULT_STR_SIZE;
@@ -111,12 +125,12 @@ void TRACE_msg_vm_sleep_in(msg_vm_t vm)
 
     container_t vm_container = PJ_container_get (instr_vm_id(vm, str, len));
     type_t type = PJ_type_get ("MSG_VM_STATE", vm_container->type);
-    val_t value = PJ_value_get ("sleep", type);
+    val_t value = PJ_value_get ("save", type);
     new_pajePushState (MSG_get_clock(), vm_container, type, value);
   }
 }
 
-void TRACE_msg_vm_sleep_out(msg_vm_t vm)
+void TRACE_msg_vm_restore(msg_vm_t vm)
 {
   if (TRACE_msg_vm_is_enabled()){
     int len = INSTR_DEFAULT_STR_SIZE;
index 9b5fe16..93bb48f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index c72f553..3735942 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 279f4ad..74fc81b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d98766c..eee4578 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -38,7 +38,6 @@ void MSG_init_nocheck(int *argc, char **argv) {
 
   xbt_getpid = MSG_process_self_PID;
   if (!msg_global) {
-    s_msg_vm_t vm; // to compute the offset
 
     SIMIX_global_init(argc, argv);
     
@@ -50,7 +49,6 @@ void MSG_init_nocheck(int *argc, char **argv) {
     msg_global->sent_msg = 0;
     msg_global->task_copy_callback = NULL;
     msg_global->process_data_cleanup = NULL;
-    msg_global->vms = xbt_swag_new(xbt_swag_offset(vm,all_vms_hookup));
 
     /* initialization of the action module */
     _MSG_action_init();
@@ -71,7 +69,7 @@ void MSG_init_nocheck(int *argc, char **argv) {
 #endif
 
   XBT_DEBUG("ADD MSG LEVELS");
-  MSG_HOST_LEVEL = xbt_lib_add_level(host_lib, (void_f_pvoid_t) __MSG_host_destroy);
+  MSG_HOST_LEVEL = xbt_lib_add_level(host_lib, (void_f_pvoid_t) __MSG_host_priv_free);
   MSG_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, (void_f_pvoid_t) __MSG_storage_destroy);
 
   if(sg_cfg_get_boolean("clean_atexit")) atexit(MSG_exit);
@@ -177,7 +175,6 @@ static void MSG_exit(void) {
   TRACE_end();
 #endif
 
-  xbt_swag_free(msg_global->vms);
   free(msg_global);
   msg_global = NULL;
 }
index 3bdc8d8..b80ae0f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -24,7 +24,15 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_gos, msg,
  */
 msg_error_t MSG_task_execute(msg_task_t task)
 {
-  return MSG_parallel_task_execute(task);
+  /* TODO: add this to other locations */
+  msg_host_t host = MSG_process_get_host(MSG_process_self());
+  MSG_host_add_task(host, task);
+
+  msg_error_t ret = MSG_parallel_task_execute(task);
+
+  MSG_host_del_task(host, task);
+
+  return ret;
 }
 
 /** \ingroup msg_task_usage
@@ -75,10 +83,16 @@ msg_error_t MSG_parallel_task_execute(msg_task_t task)
                                                        1.0, -1.0);
       XBT_DEBUG("Parallel execution action created: %p", simdata->compute);
     } else {
+      unsigned long affinity_mask = (unsigned long) xbt_dict_get_or_null_ext(simdata->affinity_mask_db, (char *) p_simdata->m_host, sizeof(msg_host_t));
+      XBT_DEBUG("execute %s@%s with affinity(0x%04lx)", MSG_task_get_name(task), MSG_host_get_name(p_simdata->m_host), affinity_mask);
+
       simdata->compute = simcall_host_execute(task->name,
                                               p_simdata->m_host,
                                               simdata->computation_amount,
-                                              simdata->priority);
+                                              simdata->priority,
+                                              simdata->bound,
+                                              affinity_mask
+                                              );
 
     }
 #ifdef HAVE_TRACING
@@ -142,7 +156,7 @@ msg_error_t MSG_process_sleep(double nb_sec)
   /*proc->simdata->waiting_action = act_sleep;
 
   FIXME: check if not setting the waiting_action breaks something on msg
-  
+
   proc->simdata->waiting_action = NULL;*/
 
   TRY {
@@ -218,7 +232,7 @@ MSG_task_receive_from_host(msg_task_t * task, const char *alias,
  */
 msg_error_t
 MSG_task_receive_from_host_bounded(msg_task_t * task, const char *alias,
-                           msg_host_t host, double rate)
+                                   msg_host_t host, double rate)
 {
   return MSG_task_receive_ext_bounded(task, alias, -1, host, rate);
 }
@@ -253,7 +267,8 @@ msg_error_t MSG_task_receive(msg_task_t * task, const char *alias)
  * #MSG_OK if the task was successfully received,
  * #MSG_HOST_FAILURE, or #MSG_TRANSFER_FAILURE otherwise.
  */
-msg_error_t MSG_task_receive_bounded(msg_task_t * task, const char *alias, double rate)
+msg_error_t MSG_task_receive_bounded(msg_task_t * task, const char *alias,
+                                     double rate)
 {
   return MSG_task_receive_with_timeout_bounded(task, alias, -1, rate);
 }
@@ -295,9 +310,9 @@ MSG_task_receive_with_timeout(msg_task_t * task, const char *alias,
  */
 msg_error_t
 MSG_task_receive_with_timeout_bounded(msg_task_t * task, const char *alias,
-                              double timeout,double rate)
+                                      double timeout,double rate)
 {
-  return MSG_task_receive_ext_bounded(task, alias, timeout, NULL,rate);
+  return MSG_task_receive_ext_bounded(task, alias, timeout, NULL, rate);
 }
 
 /** \ingroup msg_task_usage
@@ -359,15 +374,76 @@ MSG_task_receive_ext(msg_task_t * task, const char *alias, double timeout,
  */
 msg_error_t
 MSG_task_receive_ext_bounded(msg_task_t * task, const char *alias, double timeout,
-                     msg_host_t host, double rate)
+                             msg_host_t host, double rate)
 {
   XBT_DEBUG
       ("MSG_task_receive_ext: Trying to receive a message on mailbox '%s'",
        alias);
   return MSG_mailbox_get_task_ext_bounded(MSG_mailbox_get_by_alias(alias), task,
-                                  host, timeout, rate);
+                                          host, timeout, rate);
 }
 
+/* Internal function used to factorize code between
+ * MSG_task_isend_with_matching() and MSG_task_dsend().
+ */
+static XBT_INLINE
+msg_comm_t MSG_task_isend_internal(msg_task_t task, const char *alias,
+                                   int (*match_fun)(void*,void*, smx_action_t),
+                                   void *match_data, void_f_pvoid_t cleanup,
+                                   int detached)
+{
+  simdata_task_t t_simdata = NULL;
+  msg_process_t process = MSG_process_self();
+  msg_mailbox_t mailbox = MSG_mailbox_get_by_alias(alias);
+
+#ifdef HAVE_TRACING
+  int call_end = TRACE_msg_task_put_start(task);
+#endif
+
+  /* Prepare the task to send */
+  t_simdata = task->simdata;
+  t_simdata->sender = process;
+  t_simdata->source = ((simdata_process_t) SIMIX_process_self_get_data(process))->m_host;
+
+  xbt_assert(t_simdata->isused == 0,
+              "This task is still being used somewhere else. You cannot send it now. Go fix your code!");
+
+  t_simdata->isused = 1;
+  t_simdata->comm = NULL;
+  msg_global->sent_msg++;
+
+  /* Send it by calling SIMIX network layer */
+  smx_action_t act = simcall_comm_isend(mailbox, t_simdata->message_size,
+                                        t_simdata->rate, task, sizeof(void *),
+                                        match_fun, cleanup, match_data,detached);
+  t_simdata->comm = act; /* FIXME: is the field t_simdata->comm still useful? */
+
+  msg_comm_t comm;
+  if (detached) {
+    comm = NULL;
+  } else {
+    comm = xbt_new0(s_msg_comm_t, 1);
+    comm->task_sent = task;
+    comm->task_received = NULL;
+    comm->status = MSG_OK;
+    comm->s_comm = act;
+  }
+
+#ifdef HAVE_TRACING
+    if (TRACE_is_enabled()) {
+      simcall_set_category(comm->s_comm, task->category);
+    }
+#endif
+
+#ifdef HAVE_TRACING
+  if (call_end)
+    TRACE_msg_task_put_end();
+#endif
+
+  return comm;
+}
+
+
 /** \ingroup msg_task_usage
  * \brief Sends a task on a mailbox.
  *
@@ -380,7 +456,7 @@ MSG_task_receive_ext_bounded(msg_task_t * task, const char *alias, double timeou
  */
 msg_comm_t MSG_task_isend(msg_task_t task, const char *alias)
 {
-  return MSG_task_isend_with_matching(task,alias,NULL,NULL);
+  return MSG_task_isend_internal(task, alias, NULL, NULL, NULL, 0);
 }
 
 /** \ingroup msg_task_usage
@@ -395,10 +471,11 @@ msg_comm_t MSG_task_isend(msg_task_t task, const char *alias)
  * \param maxrate the maximum communication rate for sending this task .
  * \return the msg_comm_t communication created
  */
-msg_comm_t MSG_task_isend_bounded(msg_task_t task, const char *alias, double maxrate)
+msg_comm_t MSG_task_isend_bounded(msg_task_t task, const char *alias,
+                                  double maxrate)
 {
   task->simdata->rate = maxrate;
-  return MSG_task_isend_with_matching(task,alias,NULL,NULL);
+  return MSG_task_isend_internal(task, alias, NULL, NULL, NULL, 0);
 }
 
 
@@ -417,51 +494,12 @@ msg_comm_t MSG_task_isend_bounded(msg_task_t task, const char *alias, double max
  * \param match_data user provided data passed to match_fun
  * \return the msg_comm_t communication created
  */
-XBT_INLINE msg_comm_t MSG_task_isend_with_matching(msg_task_t task, const char *alias,
-    int (*match_fun)(void*,void*, smx_action_t),
-    void *match_data)
+msg_comm_t MSG_task_isend_with_matching(msg_task_t task, const char *alias,
+                                        int (*match_fun)(void*, void*,
+                                                         smx_action_t),
+                                        void *match_data)
 {
-  simdata_task_t t_simdata = NULL;
-  msg_process_t process = MSG_process_self();
-  msg_mailbox_t mailbox = MSG_mailbox_get_by_alias(alias);
-
-#ifdef HAVE_TRACING
-  int call_end = TRACE_msg_task_put_start(task);
-#endif
-
-  /* Prepare the task to send */
-  t_simdata = task->simdata;
-  t_simdata->sender = process;
-  t_simdata->source = ((simdata_process_t) SIMIX_process_self_get_data(process))->m_host;
-
-  xbt_assert(t_simdata->isused == 0,
-              "This task is still being used somewhere else. You cannot send it now. Go fix your code!");
-
-  t_simdata->isused = 1;
-  t_simdata->comm = NULL;
-  msg_global->sent_msg++;
-
-  /* Send it by calling SIMIX network layer */
-  msg_comm_t comm = xbt_new0(s_msg_comm_t, 1);
-  comm->task_sent = task;
-  comm->task_received = NULL;
-  comm->status = MSG_OK;
-  comm->s_comm =
-    simcall_comm_isend(mailbox, t_simdata->message_size,
-                         t_simdata->rate, task, sizeof(void *), match_fun, NULL, match_data, 0);
-  t_simdata->comm = comm->s_comm; /* FIXME: is the field t_simdata->comm still useful? */
-#ifdef HAVE_TRACING
-    if (TRACE_is_enabled()) {
-      simcall_set_category(comm->s_comm, task->category);
-    }
-#endif
-
-#ifdef HAVE_TRACING
-  if (call_end)
-    TRACE_msg_task_put_end();
-#endif
-
-  return comm;
+  return MSG_task_isend_internal(task, alias, match_fun, match_data, NULL, 0);
 }
 
 /** \ingroup msg_task_usage
@@ -483,43 +521,9 @@ XBT_INLINE msg_comm_t MSG_task_isend_with_matching(msg_task_t task, const char *
  */
 void MSG_task_dsend(msg_task_t task, const char *alias, void_f_pvoid_t cleanup)
 {
-  simdata_task_t t_simdata = NULL;
-  msg_process_t process = MSG_process_self();
-  msg_mailbox_t mailbox = MSG_mailbox_get_by_alias(alias);
-
-  /* Prepare the task to send */
-  t_simdata = task->simdata;
-  t_simdata->sender = process;
-  t_simdata->source = ((simdata_process_t) SIMIX_process_self_get_data(process))->m_host;
-
-  xbt_assert(t_simdata->isused == 0,
-              "This task is still being used somewhere else. You cannot send it now. Go fix your code!");
-
-  t_simdata->isused = 1;
-  t_simdata->comm = NULL;
-  msg_global->sent_msg++;
-
-#ifdef HAVE_TRACING
-  int call_end = TRACE_msg_task_put_start(task);
-#endif
-
-  /* Send it by calling SIMIX network layer */
-  smx_action_t comm = simcall_comm_isend(mailbox, t_simdata->message_size,
-                       t_simdata->rate, task, sizeof(void *), NULL, cleanup, NULL, 1);
-  t_simdata->comm = comm;
-#ifdef HAVE_TRACING
-    if (TRACE_is_enabled()) {
-      simcall_set_category(comm, task->category);
-    }
-#endif
-
-#ifdef HAVE_TRACING
-  if (call_end)
-    TRACE_msg_task_put_end();
-#endif
+  MSG_task_isend_internal(task, alias, NULL, NULL, cleanup, 1);
 }
 
-
 /** \ingroup msg_task_usage
  * \brief Sends a task on a mailbox with a maximal rate.
  *
@@ -537,46 +541,13 @@ void MSG_task_dsend(msg_task_t task, const char *alias, void_f_pvoid_t cleanup)
  * communication fails, e.g. MSG_task_destroy
  * (if NULL, no function will be called)
  * \param maxrate the maximum communication rate for sending this task
- * 
+ *
  */
-void MSG_task_dsend_bounded(msg_task_t task, const char *alias, void_f_pvoid_t cleanup, double maxrate)
+void MSG_task_dsend_bounded(msg_task_t task, const char *alias,
+                            void_f_pvoid_t cleanup, double maxrate)
 {
   task->simdata->rate = maxrate;
-  
-  simdata_task_t t_simdata = NULL;
-  msg_process_t process = MSG_process_self();
-  msg_mailbox_t mailbox = MSG_mailbox_get_by_alias(alias);
-
-  /* Prepare the task to send */
-  t_simdata = task->simdata;
-  t_simdata->sender = process;
-  t_simdata->source = ((simdata_process_t) SIMIX_process_self_get_data(process))->m_host;
-
-  xbt_assert(t_simdata->isused == 0,
-              "This task is still being used somewhere else. You cannot send it now. Go fix your code!");
-
-  t_simdata->isused = 1;
-  t_simdata->comm = NULL;
-  msg_global->sent_msg++;
-
-#ifdef HAVE_TRACING
-  int call_end = TRACE_msg_task_put_start(task);
-#endif
-
-  /* Send it by calling SIMIX network layer */
-  smx_action_t comm = simcall_comm_isend(mailbox, t_simdata->message_size,
-                       t_simdata->rate, task, sizeof(void *), NULL, cleanup, NULL, 1);
-  t_simdata->comm = comm;
-#ifdef HAVE_TRACING
-    if (TRACE_is_enabled()) {
-      simcall_set_category(comm, task->category);
-    }
-#endif
-
-#ifdef HAVE_TRACING
-  if (call_end)
-    TRACE_msg_task_put_end();
-#endif
+  MSG_task_dsend(task, alias, cleanup);
 }
 
 /** \ingroup msg_task_usage
@@ -584,32 +555,14 @@ void MSG_task_dsend_bounded(msg_task_t task, const char *alias, void_f_pvoid_t c
  *
  * This is a non blocking function: use MSG_comm_wait() or MSG_comm_test()
  * to end the communication.
- * 
+ *
  * \param task a memory location for storing a #msg_task_t. has to be valid until the end of the communication.
  * \param name of the mailbox to receive the task on
  * \return the msg_comm_t communication created
  */
 msg_comm_t MSG_task_irecv(msg_task_t *task, const char *name)
 {
-  smx_rdv_t rdv = MSG_mailbox_get_by_alias(name);
-
-  /* FIXME: these functions are not traceable */
-
-  /* Sanity check */
-  xbt_assert(task, "Null pointer for the task storage");
-
-  if (*task)
-    XBT_CRITICAL
-        ("MSG_task_irecv() was asked to write in a non empty task struct.");
-
-  /* Try to receive it by calling SIMIX network layer */
-  msg_comm_t comm = xbt_new0(s_msg_comm_t, 1);
-  comm->task_sent = NULL;
-  comm->task_received = task;
-  comm->status = MSG_OK;
-  comm->s_comm = simcall_comm_irecv(rdv, task, NULL, NULL, NULL);
-
-  return comm;
+  return MSG_task_irecv_bounded(task, name, -1.0);
 }
 
 /** \ingroup msg_task_usage
@@ -621,10 +574,9 @@ msg_comm_t MSG_task_irecv(msg_task_t *task, const char *name)
  * \param rate limit the bandwidth to the given rate
  * \return the msg_comm_t communication created
  */
-msg_comm_t MSG_task_irecv_bounded(msg_task_t *task, const char *name, double rate)
+msg_comm_t MSG_task_irecv_bounded(msg_task_t *task, const char *name,
+                                  double rate)
 {
-
-
   smx_rdv_t rdv = MSG_mailbox_get_by_alias(name);
 
   /* FIXME: these functions are not traceable */
@@ -641,7 +593,7 @@ msg_comm_t MSG_task_irecv_bounded(msg_task_t *task, const char *name, double rat
   comm->task_sent = NULL;
   comm->task_received = task;
   comm->status = MSG_OK;
-  comm->s_comm = simcall_comm_irecv_bounded(rdv, task, NULL, NULL, NULL, rate);
+  comm->s_comm = simcall_comm_irecv(rdv, task, NULL, NULL, NULL, rate);
 
   return comm;
 }
@@ -759,7 +711,7 @@ void MSG_comm_destroy(msg_comm_t comm)
  *
  * It takes two parameters.
  * \param comm the communication to wait.
- * \param timeout Wait until the communication terminates or the timeout 
+ * \param timeout Wait until the communication terminates or the timeout
  * occurs. You can provide a -1 timeout to obtain an infinite timeout.
  * \return msg_error_t
  */
@@ -1218,7 +1170,7 @@ MSG_task_put_with_timeout(msg_task_t task, msg_host_t dest,
               && (channel < msg_global->max_channel), "Invalid channel %d",
               channel);
 
-  XBT_DEBUG("MSG_task_put_with_timout: Trying to send a task to '%s'", SIMIX_host_get_name(dest->smx_host));
+  XBT_DEBUG("MSG_task_put_with_timout: Trying to send a task to '%s'", MSG_host_get_name(dest));
   return
       MSG_mailbox_put_with_timeout(MSG_mailbox_get_by_channel
                                    (dest, channel), task, timeout);
index 4dbe948..5c2eec8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -29,28 +29,32 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(msg);
 msg_host_t __MSG_host_create(smx_host_t workstation)
 {
   const char *name = SIMIX_host_get_name(workstation);
-  msg_host_priv_t host = xbt_new0(s_msg_host_priv_t, 1);
-  s_msg_vm_t vm; // simply to compute the offset
-
-  host->vms = xbt_swag_new(xbt_swag_offset(vm,host_vms_hookup));
+  msg_host_priv_t priv = xbt_new0(s_msg_host_priv_t, 1);
 
 #ifdef MSG_USE_DEPRECATED
   int i;
   char alias[MAX_ALIAS_NAME + 1] = { 0 };       /* buffer used to build the key of the mailbox */
 
-  if (msg_global->max_channel > 0)
-    host->mailboxes = xbt_new0(msg_mailbox_t, msg_global->max_channel);
+  priv->mailboxes = (msg_global->max_channel > 0) ?
+    xbt_new0(msg_mailbox_t, msg_global->max_channel) : NULL;
 
   for (i = 0; i < msg_global->max_channel; i++) {
     sprintf(alias, "%s:%d", name, i);
 
     /* the key of the mailbox (in this case) is build from the name of the host and the channel number */
-    host->mailboxes[i] = MSG_mailbox_new(alias);
+    priv->mailboxes[i] = MSG_mailbox_new(alias);
     memset(alias, 0, MAX_ALIAS_NAME + 1);
   }
 #endif
 
-  xbt_lib_set(host_lib,name,MSG_HOST_LEVEL,host);
+
+  priv->dp_objs = xbt_dict_new();
+  priv->dp_enabled = 0;
+  priv->dp_updated_by_deleted_tasks = 0;
+
+  priv->affinity_mask_db = xbt_dict_new_homogeneous(NULL);
+
+  xbt_lib_set(host_lib, name, MSG_HOST_LEVEL, priv);
   
   return xbt_lib_get_elm_or_null(host_lib, name);
 }
@@ -68,17 +72,17 @@ msg_host_t MSG_get_host_by_name(const char *name)
   return (msg_host_t) xbt_lib_get_elm_or_null(host_lib,name);
 }
 
+static const char *msg_data = "data";
 /** \ingroup m_host_management
  *
  * \brief Set the user data of a #msg_host_t.
  *
- * This functions checks whether some data has already been associated to \a host 
+ * This functions checks whether some data has already been associated to \a host
    or not and attach \a data to \a host if it is possible.
  */
 msg_error_t MSG_host_set_data(msg_host_t host, void *data)
 {
-  SIMIX_host_set_data(host,data);
-
+  MSG_host_set_property_value(host, msg_data, data, NULL);
   return MSG_OK;
 }
 
@@ -91,7 +95,7 @@ msg_error_t MSG_host_set_data(msg_host_t host, void *data)
  */
 void *MSG_host_get_data(msg_host_t host)
 {
-  return SIMIX_host_get_data(host);
+  return (void *)MSG_host_get_property_value(host, msg_data);
 }
 
 /** \ingroup m_host_management
@@ -114,20 +118,53 @@ msg_host_t MSG_host_self(void)
   return MSG_process_get_host(NULL);
 }
 
+
 /*
- * \brief Destroys a host (internal call only)
+ * \brief Start the host if it is off
  */
-void __MSG_host_destroy(msg_host_priv_t host) {
+void MSG_host_on(msg_host_t host)
+{
+  simcall_host_on(host);
+}
+
+/*
+ * \brief Stop the host if it is on
+ */
+void MSG_host_off(msg_host_t host)
+{
+  simcall_host_off(host);
+}
+
+/*
+ * \brief Frees private data of a host (internal call only)
+ */
+void __MSG_host_priv_free(msg_host_priv_t priv)
+{
+  unsigned int size = xbt_dict_size(priv->dp_objs);
+  if (size > 0)
+    XBT_WARN("dp_objs: %u pending task?", size);
+  xbt_dict_free(&priv->dp_objs);
+  xbt_dict_free(&priv->affinity_mask_db);
 
 #ifdef MSG_USE_DEPRECATED
-  if (msg_global->max_channel > 0)
-    free(host->mailboxes);
+  free(priv->mailboxes);
 #endif
-  if (xbt_swag_size(host->vms) > 0 ) {
-    XBT_VERB("Host shut down, but it still hosts %d VMs. They will be leaked.",xbt_swag_size(host->vms));
-  }
-  xbt_swag_free(host->vms);
-  free(host);
+
+  free(priv);
+}
+
+/*
+ * \brief Destroys a host (internal call only)
+ */
+void __MSG_host_destroy(msg_host_t host)
+{
+  const char *name = MSG_host_get_name(host);
+  /* TODO:
+   * What happens if VMs still remain on this host?
+   * Revisit here after the surf layer gets stable.
+   **/
+
+  xbt_lib_unset(host_lib, name, MSG_HOST_LEVEL, 1);
 }
 
 /** \ingroup m_host_management
@@ -281,6 +318,28 @@ int MSG_host_is_avail(msg_host_t host)
   return (simcall_host_get_state(host));
 }
 
+/** \ingroup m_host_management
+ * \brief Set the parameters of a given host
+ *
+ * \param host a host
+ * \param params a prameter object
+ */
+void MSG_host_set_params(msg_host_t host, ws_params_t params)
+{
+  simcall_host_set_params(host, params);
+}
+
+/** \ingroup m_host_management
+ * \brief Get the parameters of a given host
+ *
+ * \param host a host
+ * \param params a prameter object
+ */
+void MSG_host_get_params(msg_host_t host, ws_params_t params)
+{
+  simcall_host_get_params(host, params);
+}
+
 /** \ingroup m_host_management
  * \brief Return the speed of the processor (in flop/s) at a given pstate
  *
@@ -366,9 +425,10 @@ xbt_dict_t MSG_host_get_storage_content(msg_host_t host)
   xbt_dict_t storage_list = simcall_host_get_storage_list(host);
 
   xbt_dict_foreach(storage_list,cursor,mount_name,storage_name){
-       storage = (msg_storage_t)xbt_lib_get_elm_or_null(storage_lib,storage_name);
-       xbt_dict_t content = simcall_storage_get_content(storage);
-       xbt_dict_set(contents,mount_name, content,NULL);
+    storage = (msg_storage_t)xbt_lib_get_elm_or_null(storage_lib,storage_name);
+    xbt_dict_t content = simcall_storage_get_content(storage);
+    xbt_dict_set(contents,mount_name, content,NULL);
   }
+  xbt_dict_free(&storage_list);
   return contents;
 }
index cb2018a..0037056 100644 (file)
@@ -1,12 +1,11 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
- * All rights reserved.                                                       */
+/* Copyright (c) 2004-2014. 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.   */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "msg_private.h"
 #include "xbt/log.h"
-#include <inttypes.h>
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_io, msg,
                                 "Logging specific to MSG (io)");
@@ -21,13 +20,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_io, msg,
 /********************************* File **************************************/
 void __MSG_file_get_info(msg_file_t fd){
   xbt_dynar_t info = simcall_file_get_info(fd->simdata->smx_file);
-  sg_storage_size_t *psize;
+  sg_size_t *psize;
 
   fd->info->content_type = xbt_dynar_pop_as(info, char *);
   fd->info->storage_type = xbt_dynar_pop_as(info, char *);
   fd->info->storageId = xbt_dynar_pop_as(info, char *);
   fd->info->mount_point = xbt_dynar_pop_as(info, char *);
-  psize = xbt_dynar_pop_as(info, sg_storage_size_t*);
+  psize = xbt_dynar_pop_as(info, sg_size_t*);
   fd->info->size = *psize;
   xbt_free(psize);
   xbt_dynar_free_container(&info);
@@ -71,7 +70,7 @@ void MSG_file_dump (msg_file_t fd){
   __MSG_file_get_info(fd);
   XBT_INFO("File Descriptor information:\n"
            "\t\tFull name: '%s'\n"
-           "\t\tSize: %" PRIu64 "\n"
+           "\t\tSize: %llu\n"
            "\t\tMount point: '%s'\n"
            "\t\tStorage Id: '%s'\n"
            "\t\tStorage Type: '%s'\n"
@@ -88,7 +87,7 @@ void MSG_file_dump (msg_file_t fd){
  * \param fd is a the file descriptor
  * \return the number of bytes successfully read
  */
-sg_storage_size_t MSG_file_read(msg_file_t fd, sg_storage_size_t size)
+sg_size_t MSG_file_read(msg_file_t fd, sg_size_t size)
 {
   return simcall_file_read(fd->simdata->smx_file, size);
 }
@@ -100,7 +99,7 @@ sg_storage_size_t MSG_file_read(msg_file_t fd, sg_storage_size_t size)
  * \param fd is a the file descriptor
  * \return the number of bytes successfully write
  */
-sg_storage_size_t MSG_file_write(msg_file_t fd, sg_storage_size_t size)
+sg_size_t MSG_file_write(msg_file_t fd, sg_size_t size)
 {
   return simcall_file_write(fd->simdata->smx_file, size);
 }
@@ -161,9 +160,9 @@ int MSG_file_unlink(msg_file_t fd)
  * \brief Return the size of a file
  *
  * \param fd is the file descriptor (#msg_file_t)
- * \return the size of the file (as a sg_storage_size_t)
+ * \return the size of the file (as a #sg_size_t)
  */
-sg_storage_size_t MSG_file_get_size(msg_file_t fd){
+sg_size_t MSG_file_get_size(msg_file_t fd){
   return simcall_file_get_size(fd->simdata->smx_file);
 }
 
@@ -192,35 +191,40 @@ xbt_dict_t MSG_file_ls(const char *mount, const char *path)
 }
 
 /*
- * Move a file to another location. Depending on the values of dest, dest, mount,
- * and fullname, this move can be local or remote and, within a host, on the same
- * mounted disk or between mounted disks.
+ * \ingroup msg_file_management
+ * \brief Set the file position indicator in the msg_file_t by adding offset bytes
+ * to the position specified by origin (either SEEK_SET, SEEK_CUR, or SEEK_END).
+ *
+ * \param fd : file object that identifies the stream
+ * \param offset : number of bytes to offset from origin
+ * \param origin : Position used as reference for the offset. It is specified by
+ * one of the following constants defined in <cstdio> exclusively to be used as
+ * arguments for this function (SEEK_SET = beginning of file, SEEK_CUR = current
+ * position of the file pointer, SEEK_END = end of file)
+ *
+ * \return If successful, the function returns MSG_OK (=0). Otherwise, it returns
+ * MSG_TASK_CANCELED (=8).
  *
  */
-msg_error_t MSG_file_move (msg_file_t fd, msg_host_t dest, char* mount, char* fullname)
+msg_error_t MSG_file_seek(msg_file_t fd, sg_size_t offset, int origin)
 {
-  THROW_UNIMPLEMENTED;
-  return MSG_OK;
+  //THROW_UNIMPLEMENTED;
+  return simcall_file_seek(fd->simdata->smx_file, offset, origin);
 }
 
 /*
- * Set the file position indicator in the msg_file_t by adding offset bytes
- * to the position specified by whence (either SEEK_SET, SEEK_CUR, or SEEK_END).
+ * \ingroup msg_file_management
+ * \brief Returns the current value of the position indicator of the file
+ *
+ * \param fd : file object that identifies the stream
+ * \return On success, the current value of the position indicator is returned.
+ *
  */
-msg_error_t MSG_file_seek (msg_file_t fd, sg_storage_size_t offset, int whence)
+sg_size_t MSG_file_tell(msg_file_t fd)
 {
-  THROW_UNIMPLEMENTED;
-  return MSG_OK;
+  return simcall_file_tell(fd->simdata->smx_file);
 }
 
-/*
- * Rename the file in the contents of its associated storage.
- */
-msg_error_t MSG_file_rename (msg_file_t fd, char* new_name)
-{
-  THROW_UNIMPLEMENTED;
-  return MSG_OK;
-}
 
 /********************************* Storage **************************************/
 
@@ -260,18 +264,18 @@ const char *MSG_storage_get_name(msg_storage_t storage) {
 /** \ingroup msg_storage_management
  * \brief Returns the free space size of a storage element
  * \param name the name of a storage
- * \return the free space size of the storage element (as a sg_storage_size_t)
+ * \return the free space size of the storage element (as a #sg_size_t)
  */
-sg_storage_size_t MSG_storage_get_free_size(const char* name){
+sg_size_t MSG_storage_get_free_size(const char* name){
   return simcall_storage_get_free_size(name);
 }
 
 /** \ingroup msg_storage_management
  * \brief Returns the used space size of a storage element
  * \param name the name of a storage
- * \return the used space size of the storage element (as a sg_storage_size_t)
+ * \return the used space size of the storage element (as a #sg_size_t)
  */
-sg_storage_size_t MSG_storage_get_used_size(const char* name){
+sg_size_t MSG_storage_get_used_size(const char* name){
   return simcall_storage_get_used_size(name);
 }
 
@@ -365,8 +369,31 @@ xbt_dict_t MSG_storage_get_content(msg_storage_t storage)
   return SIMIX_storage_get_content(storage);
 }
 
-sg_storage_size_t MSG_storage_get_size(msg_storage_t storage)
+sg_size_t MSG_storage_get_size(msg_storage_t storage)
 {
   return SIMIX_storage_get_size(storage);
 }
 
+/*
+ * \ingroup msg_storage_management
+ *
+ * \brief Rename the file in the contents of its associated storage.
+ */
+msg_error_t MSG_storage_file_rename(msg_storage_t storage, const char* src,  const char* dest)
+{
+  simcall_storage_file_rename(storage, src, dest);
+  return MSG_OK;
+}
+
+/*
+ * \ingroup msg_storage_management
+ * \brief Move a file to another location. Depending on the values of dest, dest, mount,
+ * and fullname, this move can be local or remote and, within a host, on the same
+ * mounted disk or between mounted disks.
+ *
+ */
+msg_error_t MSG_storage_file_move (msg_file_t fd, msg_host_t dest, char* mount, char* fullname)
+{
+  THROW_UNIMPLEMENTED;
+  return MSG_OK;
+}
index 83840e5..b8b63a2 100644 (file)
@@ -1,6 +1,6 @@
 /* Mailboxes in MSG */
 
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -87,58 +87,10 @@ void MSG_mailbox_set_async(const char *alias){
  * #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_mailbox_get_task_ext(msg_mailbox_t mailbox, msg_task_t *task,
                          msg_host_t host, double timeout)
 {
-  xbt_ex_t e;
-  msg_error_t ret = MSG_OK;
-  /* We no longer support getting a task from a specific host */
-  if (host)
-    THROW_UNIMPLEMENTED;
-
-#ifdef HAVE_TRACING
-  TRACE_msg_task_get_start();
-  double start_time = MSG_get_clock();
-#endif
-
-  /* Sanity check */
-  xbt_assert(task, "Null pointer for the task storage");
-
-  if (*task)
-    XBT_WARN
-        ("Asked to write the received task in a non empty struct -- proceeding.");
-
-  /* Try to receive it by calling SIMIX network layer */
-  TRY {
-    simcall_comm_recv(mailbox, task, NULL, NULL, NULL, timeout);
-    XBT_DEBUG("Got task %s from %p",(*task)->name,mailbox);
-    (*task)->simdata->isused=0;
-  }
-  CATCH(e) {
-    switch (e.category) {
-    case cancel_error:
-      ret = MSG_HOST_FAILURE;
-      break;
-    case network_error:
-      ret = MSG_TRANSFER_FAILURE;
-      break;
-    case timeout_error:
-      ret = MSG_TIMEOUT;
-      break;
-    default:
-      RETHROW;
-    }
-    xbt_ex_free(e);
-  }
-
-#ifdef HAVE_TRACING
-  if (ret != MSG_HOST_FAILURE &&
-      ret != MSG_TRANSFER_FAILURE &&
-      ret != MSG_TIMEOUT) {
-    TRACE_msg_task_get_end(start_time, *task);
-  }
-#endif
-  MSG_RETURN(ret);
+  return MSG_mailbox_get_task_ext_bounded(mailbox, task, host, timeout, -1.0);
 }
 
 /** \ingroup msg_mailbox_management
@@ -156,7 +108,7 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, msg_task_t * task,
  */
 msg_error_t
 MSG_mailbox_get_task_ext_bounded(msg_mailbox_t mailbox, msg_task_t * task,
-                         msg_host_t host, double timeout, double rate)
+                                 msg_host_t host, double timeout, double rate)
 {
   xbt_ex_t e;
   msg_error_t ret = MSG_OK;
@@ -178,7 +130,7 @@ MSG_mailbox_get_task_ext_bounded(msg_mailbox_t mailbox, msg_task_t * task,
 
   /* Try to receive it by calling SIMIX network layer */
   TRY {
-    simcall_comm_recv_bounded(mailbox, task, NULL, NULL, NULL, timeout, rate);
+    simcall_comm_recv(mailbox, task, NULL, NULL, NULL, timeout, rate);
     XBT_DEBUG("Got task %s from %p",(*task)->name,mailbox);
     (*task)->simdata->isused=0;
   }
@@ -292,6 +244,6 @@ msg_mailbox_t MSG_mailbox_get_by_channel(msg_host_t host,
               && (channel < msg_global->max_channel), "Invalid channel %d",
               channel);
 
-  return host->mailboxes[(size_t) channel];
+  return MSG_host_priv(host)->mailboxes[(size_t) channel];
 }
 #endif
index 71c4c30..ce93121 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef MSG_MAILBOX_H
 #define MSG_MAILBOX_H
index 96dda60..0bc6ba8 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2004-2012. The SimGrid Team.
- * All rights reserved.                                                                  */
+/* Copyright (c) 2004-2014. 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.              */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "msg_private.h"
 #include "xbt/log.h"
index f3e1b89..d4cc33b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -31,7 +31,12 @@ typedef struct simdata_task {
   msg_process_t receiver;
   msg_host_t source;
   double priority;
-  double rate;
+  double bound; /* Capping for CPU resource */
+  double rate;  /* Capping for network resource */
+
+  /* CPU affinity database of this task */
+  xbt_dict_t affinity_mask_db; /* smx_host_t host => unsigned long mask */
+
   int isused;  /* Indicates whether the task is used in SIMIX currently */
   int host_nb;                  /* ==0 if sequential task; parallel task if not */
   /*******  Parallel Tasks Only !!!! *******/
@@ -73,8 +78,6 @@ typedef struct simdata_process {
   int argc;                     /* arguments number if any */
   msg_error_t last_errno;       /* the last value returned by a MSG_function */
 
-  msg_vm_t vm;                 /* virtual machine the process is in */
-
   void* data;                   /* user data */
 } s_simdata_process_t, *simdata_process_t;
 
@@ -94,21 +97,21 @@ typedef struct msg_comm {
   msg_task_t *task_received;      /* where the task will be received (NULL for the sender) */
   msg_error_t status;           /* status of the communication once finished */
 } s_msg_comm_t;
-/*
-typedef enum {
-  msg_vm_state_suspended, msg_vm_state_running, msg_vm_state_migrating
-} e_msg_vm_state_t;
 
-typedef struct msg_vm {
-  const char *name;
-  s_xbt_swag_hookup_t all_vms_hookup;
-  s_xbt_swag_hookup_t host_vms_hookup;
-  xbt_dynar_t processes;
-  e_msg_vm_state_t state;
-  msg_host_t location;
-  int coreAmount;
-} s_msg_vm_t;
-*/
+
+/******************************* VM *************************************/
+typedef struct dirty_page {
+  double prev_clock;
+  double prev_remaining;
+  msg_task_t task;
+} s_dirty_page, *dirty_page_t;
+
+XBT_PUBLIC_DATA(const char*) MSG_vm_get_property_value(msg_vm_t vm, const char *name);
+XBT_PUBLIC_DATA(xbt_dict_t) MSG_vm_get_properties(msg_vm_t vm);
+XBT_PUBLIC_DATA(void) MSG_vm_set_property_value(msg_vm_t vm, const char *name, void *value, void_f_pvoid_t free_ctn);
+XBT_PUBLIC_DATA(msg_vm_t) MSG_vm_get_by_name(const char *name);
+XBT_PUBLIC_DATA(const char*) MSG_vm_get_name(msg_vm_t vm);
+
 /************************** Global variables ********************************/
 typedef struct MSG_Global {
   xbt_fifo_t host;
@@ -119,7 +122,6 @@ typedef struct MSG_Global {
   unsigned long int sent_msg;   /* Total amount of messages sent during the simulation */
   void (*task_copy_callback) (msg_task_t task, msg_process_t src, msg_process_t dst);
   void_f_pvoid_t process_data_cleanup;
-  xbt_swag_t vms;
 } s_MSG_Global_t, *MSG_Global_t;
 
 /*extern MSG_Global_t msg_global;*/
@@ -142,7 +144,7 @@ XBT_PUBLIC_DATA(MSG_Global_t) msg_global;
 
 msg_host_t __MSG_host_create(smx_host_t workstation);
 msg_storage_t __MSG_storage_create(smx_storage_t storage);
-void __MSG_host_destroy(msg_host_priv_t host);
+void __MSG_host_destroy(msg_host_t host);
 void __MSG_storage_destroy(msg_storage_priv_t host);
 
 void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc);
@@ -157,6 +159,13 @@ void _MSG_action_exit(void);
 
 void MSG_post_create_environment(void);
 
+static inline void *msg_host_resource_priv(const void *host) {
+  return xbt_lib_get_level((void *)host, MSG_HOST_LEVEL);
+}
+
+void MSG_host_add_task(msg_host_t host, msg_task_t task);
+void MSG_host_del_task(msg_host_t host, msg_task_t task);
+
 /********** Tracing **********/
 /* declaration of instrumentation functions from msg_task_instr.c */
 void TRACE_msg_set_task_category(msg_task_t task, const char *category);
@@ -184,16 +193,17 @@ void TRACE_msg_process_sleep_out(msg_process_t process);
 void TRACE_msg_process_end(msg_process_t process);
 
 /* declaration of instrumentation functions from instr_msg_vm.c */
-char *instr_vm_id (msg_vm_t vm, char *str, int len);
-char *instr_vm_id_2 (const char *vm_name, char *str, int len);
+char *instr_vm_id(msg_vm_t vm, char *str, int len);
+char *instr_vm_id_2(const char *vm_name, char *str, int len);
 void TRACE_msg_vm_change_host(msg_vm_t vm, msg_host_t old_host,
                                    msg_host_t new_host);
-void TRACE_msg_vm_create (const char *vm_name, msg_host_t host);
+void TRACE_msg_vm_start(msg_vm_t vm);
+void TRACE_msg_vm_create(const char *vm_name, msg_host_t host);
 void TRACE_msg_vm_kill(msg_vm_t process);
 void TRACE_msg_vm_suspend(msg_vm_t vm);
 void TRACE_msg_vm_resume(msg_vm_t vm);
-void TRACE_msg_vm_sleep_in(msg_vm_t vm);
-void TRACE_msg_vm_sleep_out(msg_vm_t vm);
+void TRACE_msg_vm_save(msg_vm_t vm);
+void TRACE_msg_vm_restore(msg_vm_t vm);
 void TRACE_msg_vm_end(msg_vm_t vm);
 
 SG_END_DECL()
index 2cefbc7..6fbe364 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -50,12 +50,6 @@ void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc)
     msg_global->process_data_cleanup(msg_proc->data);
   }
 
-  // remove the process from its virtual machine
-  if (msg_proc && msg_proc->vm) {
-    int pos = xbt_dynar_search(msg_proc->vm->processes,&smx_proc);
-    xbt_dynar_remove_at(msg_proc->vm->processes,pos, NULL);
-  }
-
   // free the MSG process
   xbt_free(msg_proc);
 }
@@ -175,9 +169,9 @@ msg_process_t MSG_process_create_with_environment(const char *name,
  simcall_process_create(&process, name, code, simdata, sg_host_name(host), -1,
                            argc, argv, properties,0);
 
-  #ifdef HAVE_TRACING
-    TRACE_msg_process_create(name, simcall_process_get_PID(process), simdata->m_host);
-  #endif
+#ifdef HAVE_TRACING
+  TRACE_msg_process_create(name, simcall_process_get_PID(process), host);
+#endif
 
   if (!process) {
     /* Undo everything we have just changed */
index 963fa9c..8c3fa8d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013. The SimGrid Team.
+/* Copyright (c) 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index f104387..bdbbc47 100644 (file)
@@ -1,10 +1,11 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. 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_private.h"
+#include "simix/smx_private.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
 
@@ -62,6 +63,8 @@ msg_task_t MSG_task_create(const char *name, double compute_duration,
   simdata->receiver = NULL;
   simdata->source = NULL;
   simdata->priority = 1.0;
+  simdata->bound = 0;
+  simdata->affinity_mask_db = xbt_dict_new_homogeneous(NULL);
   simdata->rate = -1.0;
   simdata->isused = 0;
 
@@ -283,6 +286,8 @@ msg_error_t MSG_task_destroy(msg_task_t task)
   /* parallel tasks only */
   xbt_free(task->simdata->host_list);
 
+  xbt_dict_free(&task->simdata->affinity_mask_db);
+
   /* free main structures */
   xbt_free(task->simdata);
   xbt_free(task);
@@ -438,3 +443,111 @@ void MSG_task_set_priority(msg_task_t task, double priority)
     simcall_host_execution_set_priority(task->simdata->compute,
                                       task->simdata->priority);
 }
+
+
+/** \ingroup m_task_management
+ * \brief Changes the maximum CPU utilization of a computation task.
+ *        Unit is flops/s.
+ *
+ * For VMs, there is a pitfall. Please see MSG_vm_set_bound().
+ */
+void MSG_task_set_bound(msg_task_t task, double bound)
+{
+  xbt_assert(task, "Invalid parameter");
+  xbt_assert(task->simdata, "Invalid parameter");
+
+  if (bound == 0)
+    XBT_INFO("bound == 0 means no capping (i.e., unlimited).");
+
+  task->simdata->bound = bound;
+  if (task->simdata->compute)
+    simcall_host_execution_set_bound(task->simdata->compute,
+                                      task->simdata->bound);
+}
+
+
+/** \ingroup m_task_management
+ * \brief Changes the CPU affinity of a computation task.
+ *
+ * When pinning the given task to the first CPU core of the given host, use
+ * 0x01 for the mask value. Each bit of the mask value corresponds to each CPU
+ * core. See taskset(1) on Linux.
+ *
+ * \param task a target task
+ * \param host the host having a multi-core CPU
+ * \param mask the bit mask of a new CPU affinity setting for the task
+ *
+ *
+ * Usage:
+ * 0. Define a host with multiple cores.
+ *    \<host id="PM0" power="1E8" core="2"/\>
+ *
+ * 1. Pin a given task to the first CPU core of a host.
+ *   MSG_task_set_affinity(task, pm0, 0x01);
+ *
+ * 2. Pin a given task to the third CPU core of a host. Turn on the third bit of the mask.
+ *   MSG_task_set_affinity(task, pm0, 0x04); // 0x04 == 100B
+ *
+ * 3. Pin a given VM to the first CPU core of a host.
+ *   MSG_vm_set_affinity(vm, pm0, 0x01);
+ *
+ * See examples/msg/cloud/multicore.c for more information.
+ *
+ *
+ * Note:
+ * 1. The current code does not allow an affinity of a task to multiple cores.
+ * The mask value 0x03 (i.e., a given task will be executed on the first core
+ * or the second core) is not allowed. The mask value 0x01 or 0x02 works. See
+ * cpu_cas01.c for details.
+ *
+ * 2. It is recommended to first compare simulation results in both the Lazy
+ * and Full calculation modes (using --cfg=cpu/optim:Full or not). Fix
+ * cpu_cas01.c if you find wrong results in the Lazy mode.
+ *
+ */
+void MSG_task_set_affinity(msg_task_t task, msg_host_t host, unsigned long mask)
+{
+  xbt_assert(task, "Invalid parameter");
+  xbt_assert(task->simdata, "Invalid parameter");
+
+  if (mask == 0) {
+    /* 0 means clear */
+    {
+      /* We need remove_ext() not throwing exception. */
+      void *ret = xbt_dict_get_or_null_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(msg_host_t));
+      if (ret != NULL)
+        xbt_dict_remove_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(host));
+    }
+  } else
+    xbt_dict_set_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(host), (void *) mask, NULL);
+
+  /* We set affinity data of this task. If the task is being executed, we
+   * actually change the affinity setting of the task. Otherwise, this change
+   * will be applied when the task is executed. */
+
+  if (!task->simdata->compute) {
+    /* task is not yet executed */
+    XBT_INFO("set affinity(0x%04lx@%s) for %s (not active now)", mask, MSG_host_get_name(host), MSG_task_get_name(task));
+    return;
+  }
+
+  {
+    smx_action_t compute = task->simdata->compute;
+    msg_host_t host_now = compute->execution.host;  // simix_private.h is necessary
+    if (host_now != host) {
+      /* task is not yet executed on this host */
+      XBT_INFO("set affinity(0x%04lx@%s) for %s (not active now)", mask, MSG_host_get_name(host), MSG_task_get_name(task));
+      return;
+    }
+
+    /* task is being executed on this host. so change the affinity now */
+    {
+      /* check it works. remove me if it works. */
+      unsigned long affinity_mask = (unsigned long) xbt_dict_get_or_null_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(msg_host_t));
+      xbt_assert(affinity_mask == mask);
+    }
+
+    XBT_INFO("set affinity(0x%04lx@%s) for %s", mask, MSG_host_get_name(host), MSG_task_get_name(task));
+    simcall_host_execution_set_affinity(task->simdata->compute, host, mask);
+  }
+}
index d5bff35..a4d0401 100644 (file)
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+// QUESTIONS:
+// 1./ check how and where a new VM is added to the list of the hosts
+// 2./ Diff between SIMIX_Actions and SURF_Actions
+// => SIMIX_actions : point synchro entre processus de niveau (theoretically speaking I do not have to create such SIMIX_ACTION
+// =>  Surf_Actions
+
+// TODO
+//     MSG_TRACE can be revisited in order to use  the host
+//     To implement a mixed model between workstation and vm_workstation,
+//     please give a look at surf_model_private_t model_private at SURF Level and to the share resource functions
+//     double (*share_resources) (double now);
+//     For the action into the vm workstation model, we should be able to leverage the usual one (and if needed, look at
+//             the workstation model.
+
 #include "msg_private.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
+#include "simgrid/platf.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_vm, msg,
                                 "Cloud-oriented parts of the MSG API");
 
-/** @brief Create a new (empty) VMs.
- *  @ingroup msg_VMs
+
+/* **** ******** GENERAL ********* **** */
+
+/** \ingroup m_vm_management
+ * \brief Returns the value of a given vm property
  *
- *  @bug it is expected that in the future, the coreAmount parameter will be used
- *  to add extra constraints on the execution, but the argument is ignored for now.
+ * \param vm a vm
+ * \param name a property name
+ * \return value of a property (or NULL if property not set)
  */
 
-msg_vm_t MSG_vm_start(msg_host_t location, const char *name, int coreAmount) {
-  msg_vm_t res = xbt_new0(s_msg_vm_t,1);
-  res->all_vms_hookup.prev = NULL;
-  res->host_vms_hookup.prev = NULL;
-  res->state = msg_vm_state_running;
-  res->location = location;
-  res->coreAmount = coreAmount;
-  res->name = xbt_strdup(name);
-  res->processes = xbt_dynar_new(sizeof(msg_process_t),NULL);
+const char *MSG_vm_get_property_value(msg_vm_t vm, const char *name)
+{
+  return MSG_host_get_property_value(vm, name);
+}
 
-  xbt_swag_insert(res,msg_global->vms);
-  xbt_swag_insert(res, MSG_host_priv(location)->vms);
+/** \ingroup m_vm_management
+ * \brief Returns a xbt_dict_t consisting of the list of properties assigned to this host
+ *
+ * \param vm a vm
+ * \return a dict containing the properties
+ */
+xbt_dict_t MSG_vm_get_properties(msg_vm_t vm)
+{
+  xbt_assert((vm != NULL), "Invalid parameters (vm is NULL)");
 
-  #ifdef HAVE_TRACING
-  TRACE_msg_vm_create(name, location);
-  #endif
+  return (simcall_host_get_properties(vm));
+}
+
+/** \ingroup m_host_management
+ * \brief Change the value of a given host property
+ *
+ * \param vm a vm
+ * \param name a property name
+ * \param value what to change the property to
+ * \param free_ctn the freeing function to use to kill the value on need
+ */
+void MSG_vm_set_property_value(msg_vm_t vm, const char *name, void *value, void_f_pvoid_t free_ctn)
+{
+  xbt_dict_set(MSG_host_get_properties(vm), name, value, free_ctn);
+}
 
+/** \ingroup msg_vm_management
+ * \brief Finds a msg_vm_t using its name.
+ *
+ * This is a name directory service
+ * \param name the name of a vm.
+ * \return the corresponding vm
+ *
+ * Please note that a VM is a specific host. Hence, you should give a different name
+ * for each VM/PM.
+ */
 
-  return res;
+msg_vm_t MSG_vm_get_by_name(const char *name)
+{
+       return MSG_get_host_by_name(name);
 }
-/** @brief Returns a newly constructed dynar containing all existing VMs in the system.
- *  @ingroup msg_VMs
+
+/** \ingroup m_vm_management
+ *
+ * \brief Return the name of the #msg_host_t.
  *
- * Don't forget to free the dynar after use.
+ * This functions checks whether \a host is a valid pointer or not and return
+   its name.
  */
-xbt_dynar_t MSG_vms_as_dynar(void) {
-  xbt_dynar_t res = xbt_dynar_new(sizeof(msg_vm_t),NULL);
-  msg_vm_t vm;
-  xbt_swag_foreach(vm,msg_global->vms) {
-    xbt_dynar_push(res,&vm);
-  }
-  return res;
+const char *MSG_vm_get_name(msg_vm_t vm)
+{
+  return MSG_host_get_name(vm);
 }
 
-/** @brief Returns whether the given VM is currently suspended
+
+/* **** Check state of a VM **** */
+static inline int __MSG_vm_is_state(msg_vm_t vm, e_surf_vm_state_t state)
+{
+  return simcall_vm_get_state(vm) == state;
+}
+
+/** @brief Returns whether the given VM has just reated, not running.
  *  @ingroup msg_VMs
  */
-int MSG_vm_is_suspended(msg_vm_t vm) {
-  return vm->state == msg_vm_state_suspended;
+int MSG_vm_is_created(msg_vm_t vm)
+{
+  return __MSG_vm_is_state(vm, SURF_VM_STATE_CREATED);
 }
+
 /** @brief Returns whether the given VM is currently running
  *  @ingroup msg_VMs
  */
-int MSG_vm_is_running(msg_vm_t vm) {
-  return vm->state == msg_vm_state_running;
+int MSG_vm_is_running(msg_vm_t vm)
+{
+  return __MSG_vm_is_state(vm, SURF_VM_STATE_RUNNING);
 }
-/** @brief Add the given process into the VM.
+
+/** @brief Returns whether the given VM is currently migrating
  *  @ingroup msg_VMs
- *
- * Afterward, when the VM is migrated or suspended or whatever, the process will have the corresponding handling, too.
- *
  */
-void MSG_vm_bind(msg_vm_t vm, msg_process_t process) {
-  /* check if the process is already in a VM */
-  simdata_process_t simdata = simcall_process_get_data(process);
-  if (simdata->vm) {
-    msg_vm_t old_vm = simdata->vm;
-    int pos = xbt_dynar_search(old_vm->processes,&process);
-    xbt_dynar_remove_at(old_vm->processes,pos, NULL);
-  }
-  /* check if the host is in the right host */
-  if (simdata->m_host != vm->location) {
-    MSG_process_migrate(process,vm->location);
-  }
-  simdata->vm = vm;
+int MSG_vm_is_migrating(msg_vm_t vm)
+{
+  return __MSG_vm_is_state(vm, SURF_VM_STATE_MIGRATING);
+}
 
-  XBT_DEBUG("binding Process %s to %p",MSG_process_get_name(process),vm);
+/** @brief Returns whether the given VM is currently suspended, not running.
+ *  @ingroup msg_VMs
+ */
+int MSG_vm_is_suspended(msg_vm_t vm)
+{
+  return __MSG_vm_is_state(vm, SURF_VM_STATE_SUSPENDED);
+}
 
-  xbt_dynar_push_as(vm->processes,msg_process_t,process);
+/** @brief Returns whether the given VM is being saved (FIXME: live saving or not?).
+ *  @ingroup msg_VMs
+ */
+int MSG_vm_is_saving(msg_vm_t vm)
+{
+  return __MSG_vm_is_state(vm, SURF_VM_STATE_SAVING);
 }
-/** @brief Removes the given process from the given VM, and kill it
+
+/** @brief Returns whether the given VM has been saved, not running.
  *  @ingroup msg_VMs
- *
- *  Will raise a not_found exception if the process were not bound to that VM
  */
-void MSG_vm_unbind(msg_vm_t vm, msg_process_t process) {
-  int pos = xbt_dynar_search(vm->processes,process);
-  xbt_dynar_remove_at(vm->processes,pos, NULL);
-  MSG_process_kill(process);
+int MSG_vm_is_saved(msg_vm_t vm)
+{
+  return __MSG_vm_is_state(vm, SURF_VM_STATE_SAVED);
 }
 
-/** @brief Immediately change the host on which all processes are running.
+/** @brief Returns whether the given VM is being restored, not running.
  *  @ingroup msg_VMs
+ */
+int MSG_vm_is_restoring(msg_vm_t vm)
+{
+  return __MSG_vm_is_state(vm, SURF_VM_STATE_RESTORING);
+}
+
+
+
+/* ------------------------------------------------------------------------- */
+/* ------------------------------------------------------------------------- */
+
+/* **** ******** MSG vm actions ********* **** */
+
+/** @brief Create a new VM with specified parameters.
+ *  @ingroup msg_VMs*
+ *  All parameters are in MBytes
  *
- * No migration cost occurs. If you want to simulate this too, you want to use a
- * MSG_task_send() before or after, depending on whether you want to do cold or hot
- * migration.
  */
-void MSG_vm_migrate(msg_vm_t vm, msg_host_t destination) {
-  unsigned int cpt;
-  msg_process_t process;
-  xbt_dynar_foreach(vm->processes,cpt,process) {
-    MSG_process_migrate(process,destination);
+msg_vm_t MSG_vm_create(msg_host_t ind_pm, const char *name,
+                       int ncpus, int ramsize,
+                       int net_cap, char *disk_path, int disksize,
+                       int mig_netspeed, int dp_intensity)
+{
+  /* For the moment, intensity_rate is the percentage against the migration
+   * bandwidth */
+  double host_speed = MSG_get_host_speed(ind_pm);
+  double update_speed = ((double)dp_intensity/100) * mig_netspeed;
+       
+  msg_vm_t vm = MSG_vm_create_core(ind_pm, name);
+  s_ws_params_t params;
+  memset(&params, 0, sizeof(params));
+  params.ramsize = (sg_size_t)ramsize * 1024 * 1024;
+  //params.overcommit = 0;
+  params.devsize = 0;
+  params.skip_stage2 = 0;
+  params.max_downtime = 0.03;
+  params.dp_rate = (update_speed * 1024 * 1024) / host_speed;
+  params.dp_cap = params.ramsize / 0.9; // working set memory is 90%
+  params.mig_speed = (double)mig_netspeed * 1024 * 1024; // mig_speed
+
+  //XBT_INFO("dp rate %f migspeed : %f intensity mem : %d, updatespeed %f, hostspeed %f",params.dp_rate, params.mig_speed, dp_intensity, update_speed, host_speed);
+  simcall_host_set_params(vm, &params);
+
+  return vm;
+}
+
+
+/** @brief Create a new VM object. The VM is not yet started. The resource of the VM is allocated upon MSG_vm_start().
+ *  @ingroup msg_VMs*
+ *
+ * A VM is treated as a host. The name of the VM must be unique among all hosts.
+ */
+msg_vm_t MSG_vm_create_core(msg_host_t ind_pm, const char *name)
+{
+  /* make sure the VM of the same name does not exit */
+  {
+    void *ind_host_tmp = xbt_lib_get_elm_or_null(host_lib, name);
+    if (ind_host_tmp) {
+      XBT_ERROR("host %s already exits", name);
+      return NULL;
+    }
   }
-  xbt_swag_remove(vm, MSG_host_priv(vm->location)->vms);
-  xbt_swag_insert_at_tail(vm, MSG_host_priv(destination)->vms);
-  
+
+  /* Note: ind_vm and vm_workstation point to the same elm object. */
+  msg_vm_t ind_vm = NULL;
+  void *ind_vm_workstation =  NULL;
+
+  /* Ask the SIMIX layer to create the surf vm resource */
+  ind_vm_workstation = simcall_vm_create(name, ind_pm);
+  ind_vm = (msg_vm_t) __MSG_host_create(ind_vm_workstation);
+
+  XBT_DEBUG("A new VM (%s) has been created", name);
+
   #ifdef HAVE_TRACING
-  TRACE_msg_vm_change_host(vm,vm->location,destination);
+  TRACE_msg_vm_create(name, ind_pm);
   #endif
 
-  vm->location = destination;
+  return ind_vm;
 }
 
-/** @brief Immediately suspend the execution of all processes within the given VM.
+/** @brief Destroy a VM. Destroy the VM object from the simulation.
  *  @ingroup msg_VMs
- *
- * No suspension cost occurs. If you want to simulate this too, you want to
- * use a \ref MSG_file_write() before or after, depending on the exact semantic
- * of VM suspend to you.
  */
-void MSG_vm_suspend(msg_vm_t vm) {
-  unsigned int cpt;
-  msg_process_t process;
-  xbt_dynar_foreach(vm->processes,cpt,process) {
-    XBT_DEBUG("suspend process %s of host %s",MSG_process_get_name(process),MSG_host_get_name(MSG_process_get_host(process)));
-    MSG_process_suspend(process);
+void MSG_vm_destroy(msg_vm_t vm)
+{
+  /* First, terminate all processes on the VM if necessary */
+  if (MSG_vm_is_running(vm))
+      simcall_vm_shutdown(vm);
+
+  if (!MSG_vm_is_created(vm)) {
+    XBT_CRITICAL("shutdown the given VM before destroying it");
+    DIE_IMPOSSIBLE;
   }
 
+  /* Then, destroy the VM object */
+  simcall_vm_destroy(vm);
+
+  __MSG_host_destroy(vm);
+
   #ifdef HAVE_TRACING
-  TRACE_msg_vm_suspend(vm);
+  TRACE_msg_vm_end(vm);
   #endif
 }
 
-/** @brief Immediately resumes the execution of all processes within the given VM.
+
+/** @brief Start a vm (i.e., boot the guest operating system)
  *  @ingroup msg_VMs
  *
- * No resume cost occurs. If you want to simulate this too, you want to
- * use a \ref MSG_file_read() before or after, depending on the exact semantic
- * of VM resume to you.
+ *  If the VM cannot be started, an exception is generated.
+ *
  */
-void MSG_vm_resume(msg_vm_t vm) {
-  unsigned int cpt;
-  msg_process_t process;
-  xbt_dynar_foreach(vm->processes,cpt,process) {
-    XBT_DEBUG("resume process %s of host %s",MSG_process_get_name(process),MSG_host_get_name(MSG_process_get_host(process)));
-    MSG_process_resume(process);
-  }
+void MSG_vm_start(msg_vm_t vm)
+{
+  simcall_vm_start(vm);
 
   #ifdef HAVE_TRACING
-  TRACE_msg_vm_resume(vm);
+  TRACE_msg_vm_start(vm);
   #endif
 }
 
+
+
 /** @brief Immediately kills all processes within the given VM. Any memory that they allocated will be leaked.
  *  @ingroup msg_VMs
  *
- * No extra delay occurs. If you want to simulate this too, you want to
+ * FIXME: No extra delay occurs. If you want to simulate this too, you want to
  * use a #MSG_process_sleep() or something. I'm not quite sure.
  */
 void MSG_vm_shutdown(msg_vm_t vm)
 {
-  msg_process_t process;
-  XBT_DEBUG("%lu processes in the VM", xbt_dynar_length(vm->processes));
-  while (!xbt_dynar_is_empty(vm->processes)) {
-    process = xbt_dynar_get_as(vm->processes,0,msg_process_t);
-    MSG_process_kill(process);
+  /* msg_vm_t equals to msg_host_t */
+  simcall_vm_shutdown(vm);
+
+  // #ifdef HAVE_TRACING
+  // TRACE_msg_vm_(vm);
+  // #endif
+}
+
+
+
+/* We have two mailboxes. mbox is used to transfer migration data between
+ * source and destiantion PMs. mbox_ctl is used to detect the completion of a
+ * migration. The names of these mailboxes must not conflict with others. */
+static inline char *get_mig_mbox_src_dst(const char *vm_name, const char *src_pm_name, const char *dst_pm_name)
+{
+  return bprintf("__mbox_mig_src_dst:%s(%s-%s)", vm_name, src_pm_name, dst_pm_name);
+}
+
+static inline char *get_mig_mbox_ctl(const char *vm_name, const char *src_pm_name, const char *dst_pm_name)
+{
+  return bprintf("__mbox_mig_ctl:%s(%s-%s)", vm_name, src_pm_name, dst_pm_name);
+}
+
+static inline char *get_mig_process_tx_name(const char *vm_name, const char *src_pm_name, const char *dst_pm_name)
+{
+  return bprintf("__pr_mig_tx:%s(%s-%s)", vm_name, src_pm_name, dst_pm_name);
+}
+
+static inline char *get_mig_process_rx_name(const char *vm_name, const char *src_pm_name, const char *dst_pm_name)
+{
+  return bprintf("__pr_mig_rx:%s(%s-%s)", vm_name, src_pm_name, dst_pm_name);
+}
+
+static inline char *get_mig_task_name(const char *vm_name, const char *src_pm_name, const char *dst_pm_name, int stage)
+{
+  return bprintf("__task_mig_stage%d:%s(%s-%s)", stage, vm_name, src_pm_name, dst_pm_name);
+}
+
+static void launch_deferred_exec_process(msg_host_t host, double computation, double prio);
+
+static int migration_rx_fun(int argc, char *argv[])
+{
+  XBT_DEBUG("mig: rx_start");
+
+  xbt_assert(argc == 4);
+  const char *vm_name = argv[1];
+  const char *src_pm_name  = argv[2];
+  const char *dst_pm_name  = argv[3];
+  msg_vm_t vm = MSG_get_host_by_name(vm_name);
+  msg_host_t src_pm = MSG_get_host_by_name(src_pm_name);
+  msg_host_t dst_pm = MSG_get_host_by_name(dst_pm_name);
+
+
+  s_ws_params_t params;
+  simcall_host_get_params(vm, &params);
+  const double xfer_cpu_overhead = params.xfer_cpu_overhead;
+
+
+  int need_exit = 0;
+
+  char *mbox = get_mig_mbox_src_dst(vm_name, src_pm_name, dst_pm_name);
+  char *mbox_ctl = get_mig_mbox_ctl(vm_name, src_pm_name, dst_pm_name);
+  char *finalize_task_name = get_mig_task_name(vm_name, src_pm_name, dst_pm_name, 3);
+
+  for (;;) {
+    msg_task_t task = NULL;
+    MSG_task_recv(&task, mbox);
+    {
+      double received = MSG_task_get_data_size(task);
+      /* TODO: clean up */
+      // const double alpha = 0.22L * 1.0E8 / (80L * 1024 * 1024);
+      launch_deferred_exec_process(vm, received * xfer_cpu_overhead, 1);
+    }
+
+    if (strcmp(task->name, finalize_task_name) == 0)
+      need_exit = 1;
+
+    MSG_task_destroy(task);
+
+    if (need_exit)
+      break;
+  }
+
+
+  /* deinstall the current affinity setting */
+  simcall_vm_set_affinity(vm, src_pm, 0);
+
+  simcall_vm_migrate(vm, dst_pm);
+  simcall_vm_resume(vm);
+
+  /* install the affinity setting of the VM on the destination pm */
+  {
+    msg_host_priv_t priv = msg_host_resource_priv(vm);
+
+    unsigned long affinity_mask = (unsigned long) xbt_dict_get_or_null_ext(priv->affinity_mask_db, (char *) dst_pm, sizeof(msg_host_t));
+    simcall_vm_set_affinity(vm, dst_pm, affinity_mask);
+    XBT_INFO("set affinity(0x%04lx@%s) for %s", affinity_mask, MSG_host_get_name(dst_pm), MSG_host_get_name(vm));
+  }
+
+  {
+    char *task_name = get_mig_task_name(vm_name, src_pm_name, dst_pm_name, 4);
+
+    msg_task_t task = MSG_task_create(task_name, 0, 0, NULL);
+    msg_error_t ret = MSG_task_send(task, mbox_ctl);
+    xbt_assert(ret == MSG_OK);
+
+    xbt_free(task_name);
+  }
+
+
+  xbt_free(mbox);
+  xbt_free(mbox_ctl);
+  xbt_free(finalize_task_name);
+
+  XBT_DEBUG("mig: rx_done");
+
+  return 0;
+}
+
+static void reset_dirty_pages(msg_vm_t vm)
+{
+  msg_host_priv_t priv = msg_host_resource_priv(vm);
+
+  char *key = NULL;
+  xbt_dict_cursor_t cursor = NULL;
+  dirty_page_t dp = NULL;
+  xbt_dict_foreach(priv->dp_objs, cursor, key, dp) {
+    double remaining = MSG_task_get_remaining_computation(dp->task);
+    dp->prev_clock = MSG_get_clock();
+    dp->prev_remaining = remaining;
+
+    // XBT_INFO("%s@%s remaining %f", key, sg_host_name(vm), remaining);
+  }
+}
+
+static void start_dirty_page_tracking(msg_vm_t vm)
+{
+  msg_host_priv_t priv = msg_host_resource_priv(vm);
+  priv->dp_enabled = 1;
+
+  reset_dirty_pages(vm);
+}
+
+static void stop_dirty_page_tracking(msg_vm_t vm)
+{
+  msg_host_priv_t priv = msg_host_resource_priv(vm);
+  priv->dp_enabled = 0;
+}
+
+#if 0
+/* It might be natural that we define dp_rate for each task. But, we will also
+ * have to care about how each task behavior affects the memory update behavior
+ * at the operating system level. It may not be easy to model it with a simple algorithm. */
+double calc_updated_pages(char *key, msg_vm_t vm, dirty_page_t dp, double remaining, double clock)
+{
+    double computed = dp->prev_remaining - remaining;
+    double duration = clock - dp->prev_clock;
+    double updated = dp->task->dp_rate * computed;
+
+    XBT_INFO("%s@%s: computated %f ops (remaining %f -> %f) in %f secs (%f -> %f)",
+        key, sg_host_name(vm), computed, dp->prev_remaining, remaining, duration, dp->prev_clock, clock);
+    XBT_INFO("%s@%s: updated %f bytes, %f Mbytes/s",
+        key, sg_host_name(vm), updated, updated / duration / 1000 / 1000);
+
+    return updated;
+}
+#endif
+
+static double get_computed(char *key, msg_vm_t vm, dirty_page_t dp, double remaining, double clock)
+{
+  double computed = dp->prev_remaining - remaining;
+  double duration = clock - dp->prev_clock;
+
+  XBT_DEBUG("%s@%s: computated %f ops (remaining %f -> %f) in %f secs (%f -> %f)",
+      key, sg_host_name(vm), computed, dp->prev_remaining, remaining, duration, dp->prev_clock, clock);
+
+  return computed;
+}
+
+static double lookup_computed_flop_counts(msg_vm_t vm, int stage_for_fancy_debug, int stage2_round_for_fancy_debug)
+{
+  msg_host_priv_t priv = msg_host_resource_priv(vm);
+  double total = 0;
+
+  char *key = NULL;
+  xbt_dict_cursor_t cursor = NULL;
+  dirty_page_t dp = NULL;
+  xbt_dict_foreach(priv->dp_objs, cursor, key, dp) {
+    double remaining = MSG_task_get_remaining_computation(dp->task);
+   
+        double clock = MSG_get_clock();
+
+    // total += calc_updated_pages(key, vm, dp, remaining, clock);
+    total += get_computed(key, vm, dp, remaining, clock);
+
+    dp->prev_remaining = remaining;
+    dp->prev_clock = clock;
+  }
+
+  total += priv->dp_updated_by_deleted_tasks;
+
+  XBT_DEBUG("mig-stage%d.%d: computed %f flop_counts (including %f by deleted tasks)",
+      stage_for_fancy_debug,
+      stage2_round_for_fancy_debug,
+      total, priv->dp_updated_by_deleted_tasks);
+
+
+
+  priv->dp_updated_by_deleted_tasks = 0;
+
+
+  return total;
+}
+
+// TODO Is this code redundant with the information provided by
+// msg_process_t MSG_process_create(const char *name, xbt_main_func_t code, void *data, msg_host_t host)
+void MSG_host_add_task(msg_host_t host, msg_task_t task)
+{
+  msg_host_priv_t priv = msg_host_resource_priv(host);
+  double remaining = MSG_task_get_remaining_computation(task);
+  char *key = bprintf("%s-%lld", task->name, task->counter);
+
+  dirty_page_t dp = xbt_new0(s_dirty_page, 1);
+  dp->task = task;
+
+  /* It should be okay that we add a task onto a migrating VM. */
+  if (priv->dp_enabled) {
+    dp->prev_clock = MSG_get_clock();
+    dp->prev_remaining = remaining;
+  }
+
+  xbt_assert(xbt_dict_get_or_null(priv->dp_objs, key) == NULL);
+  xbt_dict_set(priv->dp_objs, key, dp, NULL);
+  XBT_DEBUG("add %s on %s (remaining %f, dp_enabled %d)", key, sg_host_name(host), remaining, priv->dp_enabled);
+
+  xbt_free(key);
+}
+
+void MSG_host_del_task(msg_host_t host, msg_task_t task)
+{
+  msg_host_priv_t priv = msg_host_resource_priv(host);
+
+  char *key = bprintf("%s-%lld", task->name, task->counter);
+
+  dirty_page_t dp = xbt_dict_get_or_null(priv->dp_objs, key);
+  xbt_assert(dp->task == task);
+
+  /* If we are in the middle of dirty page tracking, we record how much
+   * computaion has been done until now, and keep the information for the
+   * lookup_() function that will called soon. */
+  if (priv->dp_enabled) {
+    double remaining = MSG_task_get_remaining_computation(task);
+    double clock = MSG_get_clock();
+    // double updated = calc_updated_pages(key, host, dp, remaining, clock);
+    double updated = get_computed(key, host, dp, remaining, clock);
+
+    priv->dp_updated_by_deleted_tasks += updated;
+  }
+
+  xbt_dict_remove(priv->dp_objs, key);
+  xbt_free(dp);
+
+  XBT_DEBUG("del %s on %s", key, sg_host_name(host));
+
+  xbt_free(key);
+}
+
+
+static int deferred_exec_fun(int argc, char *argv[])
+{
+  xbt_assert(argc == 3);
+  const char *comp_str = argv[1];
+  double computaion = atof(comp_str);
+  const char *prio_str = argv[2];
+  double prio = atof(prio_str);
+
+  msg_task_t task = MSG_task_create("__task_deferred", computaion, 0, NULL);
+  // XBT_INFO("exec deferred %f", computaion);
+
+  /* dpt is the results of the VM activity */
+  MSG_task_set_priority(task, prio);
+  MSG_task_execute(task);
+
+
+
+  MSG_task_destroy(task);
+
+  return 0;
+}
+
+static void launch_deferred_exec_process(msg_host_t host, double computation, double prio)
+{
+  char *pr_name = bprintf("__pr_deferred_exec_%s", MSG_host_get_name(host));
+
+  int nargvs = 4;
+  char **argv = xbt_new(char *, nargvs);
+  argv[0] = pr_name;
+  argv[1] = bprintf("%f", computation);
+  argv[2] = bprintf("%f", prio);
+  argv[3] = NULL;
+
+  MSG_process_create_with_arguments(pr_name, deferred_exec_fun, NULL, host, nargvs - 1, argv);
+}
+
+
+static int task_tx_overhead_fun(int argc, char *argv[])
+{
+  xbt_assert(argc == 2);
+  const char *mbox = argv[1];
+
+  int need_exit = 0;
+
+  // XBT_INFO("start %s", mbox);
+
+  for (;;) {
+    msg_task_t task = NULL;
+    MSG_task_recv(&task, mbox);
+
+    // XBT_INFO("task->name %s", task->name);
+
+    if (strcmp(task->name, "finalize_making_overhead") == 0)
+      need_exit = 1;
+
+    // XBT_INFO("exec");
+    // MSG_task_set_priority(task, 1000000);
+    MSG_task_execute(task);
+    MSG_task_destroy(task);
+
+    if (need_exit)
+      break;
   }
 
+  // XBT_INFO("bye");
+
+  return 0;
+}
+
+static void start_overhead_process(msg_task_t comm_task)
+{
+  char *pr_name = bprintf("__pr_task_tx_overhead_%s", MSG_task_get_name(comm_task));
+  char *mbox    = bprintf("__mb_task_tx_overhead_%s", MSG_task_get_name(comm_task));
+
+  int nargvs = 3;
+  char **argv = xbt_new(char *, nargvs);
+  argv[0] = pr_name;
+  argv[1] = mbox;
+  argv[2] = NULL;
+
+  // XBT_INFO("micro start: mbox %s", mbox);
+  MSG_process_create_with_arguments(pr_name, task_tx_overhead_fun, NULL, MSG_host_self(), nargvs - 1, argv);
+}
+
+static void shutdown_overhead_process(msg_task_t comm_task)
+{
+  char *mbox = bprintf("__mb_task_tx_overhead_%s", MSG_task_get_name(comm_task));
+
+  msg_task_t task = MSG_task_create("finalize_making_overhead", 0, 0, NULL);
+
+  // XBT_INFO("micro shutdown: mbox %s", mbox);
+  msg_error_t ret = MSG_task_send(task, mbox);
+  xbt_assert(ret == MSG_OK);
+
+  xbt_free(mbox);
+  // XBT_INFO("shutdown done");
+}
+
+static void request_overhead(msg_task_t comm_task, double computation)
+{
+  char *mbox = bprintf("__mb_task_tx_overhead_%s", MSG_task_get_name(comm_task));
+
+  msg_task_t task = MSG_task_create("micro", computation, 0, NULL);
+
+  // XBT_INFO("req overhead");
+  msg_error_t ret = MSG_task_send(task, mbox);
+  xbt_assert(ret == MSG_OK);
+
+  xbt_free(mbox);
+}
+
+/* alpha is (floating_operations / bytes).
+ *
+ * When actual migration traffic was 32 mbytes/s, we observed the CPU
+ * utilization of the main thread of the Qemu process was 10 %. 
+ *   alpha = 0.1 * C / (32 * 1024 * 1024)
+ * where the CPU capacity of the PM is C flops/s.
+ *
+ * */
+static void task_send_bounded_with_cpu_overhead(msg_task_t comm_task, char *mbox, double mig_speed, double alpha)
+{
+  const double chunk_size = 1024 * 1024 * 10;
+  double remaining = MSG_task_get_data_size(comm_task);
+
+  start_overhead_process(comm_task);
+
+
+  while (remaining > 0) {
+    double data_size = chunk_size;
+    if (remaining < chunk_size)
+      data_size = remaining;
+
+    remaining -= data_size;
+
+    // XBT_INFO("remaining %f bytes", remaining);
+
+
+    double clock_sta = MSG_get_clock();
+
+    /* create a micro task */
+    {
+      char *mtask_name = bprintf("__micro_%s", MSG_task_get_name(comm_task));
+      msg_task_t mtask = MSG_task_create(mtask_name, 0, data_size, NULL);
+
+      request_overhead(comm_task, data_size * alpha);
+
+      msg_error_t ret = MSG_task_send(mtask, mbox);
+      xbt_assert(ret == MSG_OK);
+
+      xbt_free(mtask_name);
+    }
+
+#if 0
+    {
+      /* In the real world, sending data involves small CPU computation. */
+      char *mtask_name = bprintf("__micro_%s", MSG_task_get_name(comm_task));
+      msg_task_t mtask = MSG_task_create(mtask_name, data_size * alpha, data_size, NULL);
+      MSG_task_execute(mtask);
+      MSG_task_destroy(mtask);
+      xbt_free(mtask_name);
+    }
+#endif
+   
+    /* TODO */
+
+    double clock_end = MSG_get_clock();
+
+
+    if (mig_speed > 0) {
+      /*
+       * (max bandwidth) > data_size / ((elapsed time) + time_to_sleep)
+       *
+       * Thus, we get
+       *   time_to_sleep > data_size / (max bandwidth) - (elapsed time)
+       *
+       * If time_to_sleep is smaller than zero, the elapsed time was too big. We
+       * do not need a micro sleep.
+       **/
+      double time_to_sleep = data_size / mig_speed - (clock_end - clock_sta);
+      if (time_to_sleep > 0)
+        MSG_process_sleep(time_to_sleep);
+
+
+      //XBT_INFO("duration %f", clock_end - clock_sta);
+      //XBT_INFO("time_to_sleep %f", time_to_sleep);
+    }
+  }
+
+  // XBT_INFO("%s", MSG_task_get_name(comm_task));
+  shutdown_overhead_process(comm_task);
+
+}
+
+
+#if 0
+static void make_cpu_overhead_of_data_transfer(msg_task_t comm_task, double init_comm_size)
+{
+  double prev_remaining = init_comm_size;
+
+  for (;;) {
+    double remaining = MSG_task_get_remaining_communication(comm_task);
+    if (remaining == 0)
+      need_exit = 1;
+
+    double sent = prev_remaining - remaining;
+    double comp_size = sent * overhead;
+
+
+    char *comp_task_name = bprintf("__sender_overhead%s", MSG_task_get_name(comm_task));
+    msg_task_t comp_task = MSG_task_create(comp_task_name, comp_size, 0, NULL);
+    MSG_task_execute(comp_task);
+    MSG_task_destroy(comp_task);
+
+    if (need_exit)
+      break;
+
+    prev_remaining = remaining;
+
+  }
+
+  xbt_free(comp_task_name);
+}
+#endif
+
+// #define USE_MICRO_TASK 1
+
+#if 0
+// const double alpha = 0.1L * 1.0E8 / (32L * 1024 * 1024);
+// const double alpha = 0.25L * 1.0E8 / (85L * 1024 * 1024);
+// const double alpha = 0.20L * 1.0E8 / (85L * 1024 * 1024);
+// const double alpha = 0.25L * 1.0E8 / (85L * 1024 * 1024);
+// const double alpha = 0.32L * 1.0E8 / (24L * 1024 * 1024);   // makes super good values for 32 mbytes/s
+//const double alpha = 0.32L * 1.0E8 / (32L * 1024 * 1024);
+// const double alpha = 0.56L * 1.0E8 / (80L * 1024 * 1024);
+////const double alpha = 0.20L * 1.0E8 / (80L * 1024 * 1024);
+// const double alpha = 0.56L * 1.0E8 / (90L * 1024 * 1024);
+// const double alpha = 0.66L * 1.0E8 / (90L * 1024 * 1024);
+// const double alpha = 0.20L * 1.0E8 / (80L * 1024 * 1024);
+
+/* CPU 22% when 80Mbyte/s */
+const double alpha = 0.22L * 1.0E8 / (80L * 1024 * 1024);
+#endif
+
+
+static void send_migration_data(const char *vm_name, const char *src_pm_name, const char *dst_pm_name,
+    sg_size_t size, char *mbox, int stage, int stage2_round, double mig_speed, double xfer_cpu_overhead)
+{
+  char *task_name = get_mig_task_name(vm_name, src_pm_name, dst_pm_name, stage);
+  msg_task_t task = MSG_task_create(task_name, 0, size, NULL);
+
+  /* TODO: clean up */
+
+  double clock_sta = MSG_get_clock();
+
+#ifdef USE_MICRO_TASK
+
+  task_send_bounded_with_cpu_overhead(task, mbox, mig_speed, xfer_cpu_overhead);
+
+#else
+  msg_error_t ret;
+  if (mig_speed > 0)
+    ret = MSG_task_send_bounded(task, mbox, mig_speed);
+  else
+    ret = MSG_task_send(task, mbox);
+  xbt_assert(ret == MSG_OK);
+#endif
+
+  double clock_end = MSG_get_clock();
+  double duration = clock_end - clock_sta;
+  double actual_speed = size / duration;
+#ifdef USE_MICRO_TASK
+  double cpu_utilization = size * xfer_cpu_overhead / duration / 1.0E8;
+#else
+  double cpu_utilization = 0;
+#endif
+
+
+
+
+  if (stage == 2){
+    XBT_DEBUG("mig-stage%d.%d: sent %llu duration %f actual_speed %f (target %f) cpu %f", stage, stage2_round, size, duration, actual_speed, mig_speed, cpu_utilization);}
+  else{
+    XBT_DEBUG("mig-stage%d: sent %llu duration %f actual_speed %f (target %f) cpu %f", stage, size, duration, actual_speed, mig_speed, cpu_utilization);
+  }
+
+  xbt_free(task_name);
+
+
+
+#ifdef USE_MICRO_TASK
+  /* The name of a micro task starts with __micro, which does not match the
+   * special name that finalizes the receiver loop. Thus, we send the special task.
+   **/
+  {
+    if (stage == 3) {
+      char *task_name = get_mig_task_name(vm_name, src_pm_name, dst_pm_name, stage);
+      msg_task_t task = MSG_task_create(task_name, 0, 0, NULL);
+      msg_error_t ret = MSG_task_send(task, mbox);
+      xbt_assert(ret == MSG_OK);
+      xbt_free(task_name);
+    }
+  }
+#endif
+}
+
+static double get_updated_size(double computed, double dp_rate, double dp_cap)
+{
+  double updated_size = computed * dp_rate;
+  XBT_DEBUG("updated_size %f dp_rate %f", updated_size, dp_rate);
+  if (updated_size > dp_cap) {
+    // XBT_INFO("mig-stage2.%d: %f bytes updated, but cap it with the working set size %f", stage2_round, updated_size, dp_cap);
+    updated_size = dp_cap;
+  }
+
+  return updated_size;
+}
+
+static double send_stage1(msg_host_t vm, const char *src_pm_name, const char *dst_pm_name,
+    sg_size_t ramsize, double mig_speed, double xfer_cpu_overhead, double dp_rate, double dp_cap, double dpt_cpu_overhead)
+{
+  const char *vm_name = MSG_host_get_name(vm);
+  char *mbox = get_mig_mbox_src_dst(vm_name, src_pm_name, dst_pm_name);
+
+  // const long chunksize = (sg_size_t)1024 * 1024 * 100;
+  const sg_size_t chunksize = (sg_size_t)1024 * 1024 * 100000;
+  sg_size_t remaining = ramsize;
+  double computed_total = 0;
+
+  while (remaining > 0) {
+    sg_size_t datasize = chunksize;
+    if (remaining < chunksize)
+      datasize = remaining;
+
+    remaining -= datasize;
+
+    send_migration_data(vm_name, src_pm_name, dst_pm_name, datasize, mbox, 1, 0, mig_speed, xfer_cpu_overhead);
+    double computed = lookup_computed_flop_counts(vm, 1, 0);
+    computed_total += computed;
+
+    // {
+    //   double updated_size = get_updated_size(computed, dp_rate, dp_cap);
+
+    //   double overhead = dpt_cpu_overhead * updated_size;
+    //   launch_deferred_exec_process(vm, overhead, 10000);
+    // }
+  }
+  xbt_free(mbox);
+  return computed_total;
+}
+
+
+
+static double get_threshold_value(double bandwidth, double max_downtime)
+{
+  /* This value assumes the network link is 1Gbps. */
+  // double threshold = max_downtime * 125 * 1024 * 1024;
+  double threshold = max_downtime * bandwidth;
+
+  return threshold;
+}
+
+static int migration_tx_fun(int argc, char *argv[])
+{
+  XBT_DEBUG("mig: tx_start");
+
+  xbt_assert(argc == 4);
+  const char *vm_name = argv[1];
+  const char *src_pm_name  = argv[2];
+  const char *dst_pm_name  = argv[3];
+  msg_vm_t vm = MSG_get_host_by_name(vm_name);
+
+
+  s_ws_params_t params;
+  simcall_host_get_params(vm, &params);
+  const sg_size_t ramsize   = params.ramsize;
+  const sg_size_t devsize   = params.devsize;
+  const int skip_stage1     = params.skip_stage1;
+  const int skip_stage2     = params.skip_stage2;
+  const double dp_rate      = params.dp_rate;
+  const double dp_cap       = params.dp_cap;
+  const double mig_speed    = params.mig_speed;
+  const double xfer_cpu_overhead = params.xfer_cpu_overhead;
+  const double dpt_cpu_overhead = params.dpt_cpu_overhead;
+
+  double remaining_size = ramsize + devsize;
+
+  double max_downtime = params.max_downtime;
+  if (max_downtime == 0) {
+    XBT_WARN("use the default max_downtime value 30ms");
+    max_downtime = 0.03;
+  }
+
+  double threshold = 0.00001; /* TODO: cleanup */
+
+  /* setting up parameters has done */
+
+
+  if (ramsize == 0)
+    XBT_WARN("migrate a VM, but ramsize is zero");
+
+  char *mbox = get_mig_mbox_src_dst(vm_name, src_pm_name, dst_pm_name);
+
+  XBT_INFO("mig-stage1: remaining_size %f", remaining_size);
+
+  /* Stage1: send all memory pages to the destination. */
+  start_dirty_page_tracking(vm);
+
+  double computed_during_stage1 = 0;
+  if (!skip_stage1) {
+    // send_migration_data(vm_name, src_pm_name, dst_pm_name, ramsize, mbox, 1, 0, mig_speed, xfer_cpu_overhead);
+
+    /* send ramsize, but split it */
+    double clock_prev_send = MSG_get_clock();
+
+    computed_during_stage1 = send_stage1(vm, src_pm_name, dst_pm_name, ramsize, mig_speed, xfer_cpu_overhead, dp_rate, dp_cap, dpt_cpu_overhead);
+    remaining_size -= ramsize;
+
+    double clock_post_send = MSG_get_clock();
+    double bandwidth = ramsize / (clock_post_send - clock_prev_send);
+    threshold = get_threshold_value(bandwidth, max_downtime);
+    XBT_INFO("actual banwdidth %f (MB/s), threshold %f", bandwidth / 1024 / 1024, threshold);
+  }
+
+
+  /* Stage2: send update pages iteratively until the size of remaining states
+   * becomes smaller than the threshold value. */
+  if (skip_stage2)
+    goto stage3;
+  if (max_downtime == 0) {
+    XBT_WARN("no max_downtime parameter, skip stage2");
+    goto stage3;
+  }
+
+
+  int stage2_round = 0;
+  for (;;) {
+
+    double updated_size = 0;
+    if (stage2_round == 0)  {
+      /* just after stage1, nothing has been updated. But, we have to send the data updated during stage1 */
+      updated_size = get_updated_size(computed_during_stage1, dp_rate, dp_cap);
+    } else {
+      double computed = lookup_computed_flop_counts(vm, 2, stage2_round);
+      updated_size = get_updated_size(computed, dp_rate, dp_cap);
+    }
+
+    XBT_INFO("mig-stage 2:%d updated_size %f computed_during_stage1 %f dp_rate %f dp_cap %f",
+        stage2_round, updated_size, computed_during_stage1, dp_rate, dp_cap);
+
+
+    // if (stage2_round != 0) {
+    //   /* during stage1, we have already created overhead tasks */
+    //   double overhead = dpt_cpu_overhead * updated_size;
+    //   XBT_DEBUG("updated %f overhead %f", updated_size, overhead);
+    //   launch_deferred_exec_process(vm, overhead, 10000);
+    // }
+
+
+    {
+      remaining_size += updated_size;
+
+      XBT_INFO("mig-stage2.%d: remaining_size %f (%s threshold %f)", stage2_round,
+          remaining_size, (remaining_size < threshold) ? "<" : ">", threshold);
+
+      if (remaining_size < threshold)
+        break;
+    }
+
+    double clock_prev_send = MSG_get_clock();
+
+    send_migration_data(vm_name, src_pm_name, dst_pm_name, updated_size, mbox, 2, stage2_round, mig_speed, xfer_cpu_overhead);
+
+    double clock_post_send = MSG_get_clock();
+
+    double bandwidth = updated_size / (clock_post_send - clock_prev_send);
+    threshold = get_threshold_value(bandwidth, max_downtime);
+    XBT_INFO("actual banwdidth %f, threshold %f", bandwidth / 1024 / 1024, threshold);
+
+
+
+
+
+
+
+    remaining_size -= updated_size;
+    stage2_round += 1;
+  }
+
+
+stage3:
+  /* Stage3: stop the VM and copy the rest of states. */
+  XBT_INFO("mig-stage3: remaining_size %f", remaining_size);
+  simcall_vm_suspend(vm);
+  stop_dirty_page_tracking(vm);
+
+  send_migration_data(vm_name, src_pm_name, dst_pm_name, remaining_size, mbox, 3, 0, mig_speed, xfer_cpu_overhead);
+
+  xbt_free(mbox);
+
+  XBT_DEBUG("mig: tx_done");
+
+  return 0;
+}
+
+
+
+static void do_migration(msg_vm_t vm, msg_host_t src_pm, msg_host_t dst_pm)
+{
+  char *mbox_ctl = get_mig_mbox_ctl(sg_host_name(vm), sg_host_name(src_pm), sg_host_name(dst_pm));
+
+  {
+    char *pr_name = get_mig_process_rx_name(sg_host_name(vm), sg_host_name(src_pm), sg_host_name(dst_pm));
+    int nargvs = 5;
+    char **argv = xbt_new(char *, nargvs);
+    argv[0] = pr_name;
+    argv[1] = xbt_strdup(sg_host_name(vm));
+    argv[2] = xbt_strdup(sg_host_name(src_pm));
+    argv[3] = xbt_strdup(sg_host_name(dst_pm));
+    argv[4] = NULL;
+
+    MSG_process_create_with_arguments(pr_name, migration_rx_fun, NULL, dst_pm, nargvs - 1, argv);
+  }
+
+  {
+    char *pr_name = get_mig_process_tx_name(sg_host_name(vm), sg_host_name(src_pm), sg_host_name(dst_pm));
+    int nargvs = 5;
+    char **argv = xbt_new(char *, nargvs);
+    argv[0] = pr_name;
+    argv[1] = xbt_strdup(sg_host_name(vm));
+    argv[2] = xbt_strdup(sg_host_name(src_pm));
+    argv[3] = xbt_strdup(sg_host_name(dst_pm));
+    argv[4] = NULL;
+    MSG_process_create_with_arguments(pr_name, migration_tx_fun, NULL, src_pm, nargvs - 1, argv);
+  }
+
+  /* wait until the migration have finished */
+  {
+    msg_task_t task = NULL;
+    msg_error_t ret = MSG_task_recv(&task, mbox_ctl);
+
+    xbt_assert(ret == MSG_OK);
+
+    char *expected_task_name = get_mig_task_name(sg_host_name(vm), sg_host_name(src_pm), sg_host_name(dst_pm), 4);
+    xbt_assert(strcmp(task->name, expected_task_name) == 0);
+    xbt_free(expected_task_name);
+    MSG_task_destroy(task);
+  }
+
+  xbt_free(mbox_ctl);
+}
+
+
+/** @brief Migrate the VM to the given host.
+ *  @ingroup msg_VMs
+ *
+ * FIXME: No migration cost occurs. If you want to simulate this too, you want to use a
+ * MSG_task_send() before or after, depending on whether you want to do cold or hot
+ * migration.
+ */
+void MSG_vm_migrate(msg_vm_t vm, msg_host_t new_pm)
+{
+  /* some thoughts:
+   * - One approach is ...
+   *   We first create a new VM (i.e., destination VM) on the destination
+   *   physical host. The destination VM will receive the state of the source
+   *   VM over network. We will finally destroy the source VM.
+   *   - This behavior is similar to the way of migration in the real world.
+   *     Even before a migration is completed, we will see a destination VM,
+   *     consuming resources.
+   *   - We have to relocate all processes. The existing process migraion code
+   *     will work for this?
+   *   - The name of the VM is a somewhat unique ID in the code. It is tricky
+   *     for the destination VM?
+   *
+   * - Another one is ...
+   *   We update the information of the given VM to place it to the destination
+   *   physical host.
+   *
+   * The second one would be easier.
+   *   
+   */
+
+  msg_host_t old_pm = simcall_vm_get_pm(vm);
+
+  if (simcall_vm_get_state(vm) != SURF_VM_STATE_RUNNING)
+    THROWF(vm_error, 0, "VM(%s) is not running", sg_host_name(vm));
+
+  do_migration(vm, old_pm, new_pm);
+
+
+
+  XBT_DEBUG("VM(%s) moved from PM(%s) to PM(%s)", vm->key, old_pm->key, new_pm->key);
+
   #ifdef HAVE_TRACING
-  TRACE_msg_vm_kill(vm);
+  TRACE_msg_vm_change_host(vm, old_pm, new_pm);
   #endif
+}
+
+
+/** @brief Immediately suspend the execution of all processes within the given VM.
+ *  @ingroup msg_VMs
+ *
+ * This function stops the exection of the VM. All the processes on this VM
+ * will pause. The state of the VM is perserved. We can later resume it again.
+ *
+ * No suspension cost occurs.
+ */
+void MSG_vm_suspend(msg_vm_t vm)
+{
+  simcall_vm_suspend(vm);
+
+  XBT_DEBUG("vm_suspend done");
 
+  #ifdef HAVE_TRACING
+  TRACE_msg_vm_suspend(vm);
+  #endif
 }
 
-/**
- * \ingroup msg_VMs
- * \brief Reboot the VM, restarting all the processes in it.
+
+/** @brief Resume the execution of the VM. All processes on the VM run again.
+ *  @ingroup msg_VMs
+ *
+ * No resume cost occurs.
  */
-void MSG_vm_reboot(msg_vm_t vm)
+void MSG_vm_resume(msg_vm_t vm)
 {
-  xbt_dynar_t process_list = xbt_dynar_new(sizeof(msg_process_t), NULL);
-  msg_process_t process;
-  unsigned int cpt;
+  simcall_vm_resume(vm);
 
-  xbt_dynar_foreach(vm->processes, cpt, process) {
-    xbt_dynar_push_as(process_list, msg_process_t, process);
-  }
+  #ifdef HAVE_TRACING
+  TRACE_msg_vm_resume(vm);
+  #endif
+}
 
-  xbt_dynar_foreach(process_list, cpt, process) {
-    msg_process_t new_process = MSG_process_restart(process);
-    MSG_vm_bind(vm, new_process);
-  }
 
-  xbt_dynar_free(&process_list);
+/** @brief Immediately save the execution of all processes within the given VM.
+ *  @ingroup msg_VMs
+ *
+ * This function stops the exection of the VM. All the processes on this VM
+ * will pause. The state of the VM is perserved. We can later resume it again.
+ *
+ * FIXME: No suspension cost occurs. If you want to simulate this too, you want to
+ * use a \ref MSG_file_write() before or after, depending on the exact semantic
+ * of VM save to you.
+ */
+void MSG_vm_save(msg_vm_t vm)
+{
+  simcall_vm_save(vm);
+  #ifdef HAVE_TRACING
+  TRACE_msg_vm_save(vm);
+  #endif
 }
 
-/** @brief Destroy a msg_vm_t.
+/** @brief Restore the execution of the VM. All processes on the VM run again.
  *  @ingroup msg_VMs
+ *
+ * FIXME: No restore cost occurs. If you want to simulate this too, you want to
+ * use a \ref MSG_file_read() before or after, depending on the exact semantic
+ * of VM restore to you.
  */
-void MSG_vm_destroy(msg_vm_t vm) {
-  unsigned int cpt;
-  msg_process_t process;
-  xbt_dynar_foreach(vm->processes,cpt,process) {
-    //FIXME: Slow ?
-    simdata_process_t simdata = simcall_process_get_data(process);
-    simdata->vm = NULL;
-  }
+void MSG_vm_restore(msg_vm_t vm)
+{
+  simcall_vm_restore(vm);
 
   #ifdef HAVE_TRACING
-  TRACE_msg_vm_end(vm);
+  TRACE_msg_vm_restore(vm);
   #endif
+}
+
+
+/** @brief Get the physical host of a given VM.
+ *  @ingroup msg_VMs
+ */
+msg_host_t MSG_vm_get_pm(msg_vm_t vm)
+{
+  return simcall_vm_get_pm(vm);
+}
+
+
+/** @brief Set a CPU bound for a given VM.
+ *  @ingroup msg_VMs
+ *
+ * 1.
+ * Note that in some cases MSG_task_set_bound() may not intuitively work for VMs.
+ *
+ * For example,
+ *  On PM0, there are Task1 and VM0.
+ *  On VM0, there is Task2.
+ * Now we bound 75% to Task1\@PM0 and bound 25% to Task2\@VM0.
+ * Then, 
+ *  Task1\@PM0 gets 50%.
+ *  Task2\@VM0 gets 25%.
+ * This is NOT 75% for Task1\@PM0 and 25% for Task2\@VM0, respectively.
+ *
+ * This is because a VM has the dummy CPU action in the PM layer. Putting a
+ * task on the VM does not affect the bound of the dummy CPU action. The bound
+ * of the dummy CPU action is unlimited.
+ *
+ * There are some solutions for this problem. One option is to update the bound
+ * of the dummy CPU action automatically. It should be the sum of all tasks on
+ * the VM. But, this solution might be costy, because we have to scan all tasks
+ * on the VM in share_resource() or we have to trap both the start and end of
+ * task execution.
+ *
+ * The current solution is to use MSG_vm_set_bound(), which allows us to
+ * directly set the bound of the dummy CPU action.
+ *
+ *
+ * 2.
+ * Note that bound == 0 means no bound (i.e., unlimited). But, if a host has
+ * multiple CPU cores, the CPU share of a computation task (or a VM) never
+ * exceeds the capacity of a CPU core.
+ */
+void MSG_vm_set_bound(msg_vm_t vm, double bound)
+{
+       return simcall_vm_set_bound(vm, bound);
+}
+
+
+/** @brief Set the CPU affinity of a given VM.
+ *  @ingroup msg_VMs
+ *
+ * This function changes the CPU affinity of a given VM. Usage is the same as
+ * MSG_task_set_affinity(). See the MSG_task_set_affinity() for details.
+ */
+void MSG_vm_set_affinity(msg_vm_t vm, msg_host_t pm, unsigned long mask)
+{
+  msg_host_priv_t priv = msg_host_resource_priv(vm);
+
+  if (mask == 0)
+    xbt_dict_remove_ext(priv->affinity_mask_db, (char *) pm, sizeof(pm));
+  else
+    xbt_dict_set_ext(priv->affinity_mask_db, (char *) pm, sizeof(pm), (void *) mask, NULL);
 
-  xbt_free(vm->name);
-  xbt_dynar_free(&vm->processes);
-  xbt_free(vm);
+  msg_host_t pm_now = MSG_vm_get_pm(vm);
+  if (pm_now == pm) {
+    XBT_INFO("set affinity(0x%04lx@%s) for %s", mask, MSG_host_get_name(pm), MSG_host_get_name(vm));
+    simcall_vm_set_affinity(vm, pm, mask);
+  } else
+    XBT_INFO("set affinity(0x%04lx@%s) for %s (not active now)", mask, MSG_host_get_name(pm), MSG_host_get_name(vm));
 }
index fdb6f48..6da7550 100644 (file)
@@ -1,11 +1,11 @@
 /* portable -- header loading to write portable code                         */
 /* loads much more stuff than sysdep.h since the latter is in public interface*/
 
-/* Copyright (c) 2004-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2004-2010, 2012-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef SIMGRID_PORTABLE_H
 #define SIMGRID_PORTABLE_H
index 8e1cded..2fcbd20 100644 (file)
@@ -1337,81 +1337,81 @@ const char dax__flexml_version[] = "1.9.6";
 int dax__pcdata_ix;
 extern char *dax__bufferstack;
 #define dax__pcdata (dax__bufferstack + dax__pcdata_ix)
-AT_dax__adag_version AX_dax__adag_version;
-#define A_dax__adag_version (dax__bufferstack + AX_dax__adag_version)
-short int dax__adag_version_isset;
-AT_dax__uses_type AX_dax__uses_type;
-#define A_dax__uses_type (dax__bufferstack + AX_dax__uses_type)
-short int dax__uses_type_isset;
-AT_dax__uses_optional AX_dax__uses_optional;
-#define A_dax__uses_optional AX_dax__uses_optional
-short int dax__uses_optional_isset;
-AT_dax__adag_name AX_dax__adag_name;
-#define A_dax__adag_name (dax__bufferstack + AX_dax__adag_name)
-short int dax__adag_name_isset;
-AT_dax__child_ref AX_dax__child_ref;
-#define A_dax__child_ref (dax__bufferstack + AX_dax__child_ref)
-short int dax__child_ref_isset;
-AT_dax__adag_xmlns AX_dax__adag_xmlns;
-#define A_dax__adag_xmlns (dax__bufferstack + AX_dax__adag_xmlns)
-short int dax__adag_xmlns_isset;
-AT_dax__uses_transfer AX_dax__uses_transfer;
-#define A_dax__uses_transfer AX_dax__uses_transfer
-short int dax__uses_transfer_isset;
 AT_dax__job_id AX_dax__job_id;
 #define A_dax__job_id (dax__bufferstack + AX_dax__job_id)
 short int dax__job_id_isset;
-AT_dax__uses_file AX_dax__uses_file;
-#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file)
-short int dax__uses_file_isset;
 AT_dax__parent_ref AX_dax__parent_ref;
 #define A_dax__parent_ref (dax__bufferstack + AX_dax__parent_ref)
 short int dax__parent_ref_isset;
-AT_dax__adag_count AX_dax__adag_count;
-#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count)
-short int dax__adag_count_isset;
-AT_dax__adag_xmlns_c_xsi AX_dax__adag_xmlns_c_xsi;
-#define A_dax__adag_xmlns_c_xsi (dax__bufferstack + AX_dax__adag_xmlns_c_xsi)
-short int dax__adag_xmlns_c_xsi_isset;
-AT_dax__adag_index AX_dax__adag_index;
-#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index)
-short int dax__adag_index_isset;
+AT_dax__adag_fileCount AX_dax__adag_fileCount;
+#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount)
+short int dax__adag_fileCount_isset;
+AT_dax__adag_jobCount AX_dax__adag_jobCount;
+#define A_dax__adag_jobCount (dax__bufferstack + AX_dax__adag_jobCount)
+short int dax__adag_jobCount_isset;
+AT_dax__adag_xmlns AX_dax__adag_xmlns;
+#define A_dax__adag_xmlns (dax__bufferstack + AX_dax__adag_xmlns)
+short int dax__adag_xmlns_isset;
+AT_dax__uses_register AX_dax__uses_register;
+#define A_dax__uses_register AX_dax__uses_register
+short int dax__uses_register_isset;
+AT_dax__adag_name AX_dax__adag_name;
+#define A_dax__adag_name (dax__bufferstack + AX_dax__adag_name)
+short int dax__adag_name_isset;
+AT_dax__adag_xsi_c_schemaLocation AX_dax__adag_xsi_c_schemaLocation;
+#define A_dax__adag_xsi_c_schemaLocation (dax__bufferstack + AX_dax__adag_xsi_c_schemaLocation)
+short int dax__adag_xsi_c_schemaLocation_isset;
+AT_dax__job_level AX_dax__job_level;
+#define A_dax__job_level (dax__bufferstack + AX_dax__job_level)
+short int dax__job_level_isset;
+AT_dax__uses_optional AX_dax__uses_optional;
+#define A_dax__uses_optional AX_dax__uses_optional
+short int dax__uses_optional_isset;
 AT_dax__uses_size AX_dax__uses_size;
 #define A_dax__uses_size (dax__bufferstack + AX_dax__uses_size)
 short int dax__uses_size_isset;
-AT_dax__adag_childCount AX_dax__adag_childCount;
-#define A_dax__adag_childCount (dax__bufferstack + AX_dax__adag_childCount)
-short int dax__adag_childCount_isset;
 AT_dax__uses_link AX_dax__uses_link;
 #define A_dax__uses_link AX_dax__uses_link
 short int dax__uses_link_isset;
-AT_dax__job_runtime AX_dax__job_runtime;
-#define A_dax__job_runtime (dax__bufferstack + AX_dax__job_runtime)
-short int dax__job_runtime_isset;
-AT_dax__job_level AX_dax__job_level;
-#define A_dax__job_level (dax__bufferstack + AX_dax__job_level)
-short int dax__job_level_isset;
+AT_dax__uses_transfer AX_dax__uses_transfer;
+#define A_dax__uses_transfer AX_dax__uses_transfer
+short int dax__uses_transfer_isset;
+AT_dax__uses_type AX_dax__uses_type;
+#define A_dax__uses_type (dax__bufferstack + AX_dax__uses_type)
+short int dax__uses_type_isset;
+AT_dax__adag_childCount AX_dax__adag_childCount;
+#define A_dax__adag_childCount (dax__bufferstack + AX_dax__adag_childCount)
+short int dax__adag_childCount_isset;
 AT_dax__job_namespace AX_dax__job_namespace;
 #define A_dax__job_namespace (dax__bufferstack + AX_dax__job_namespace)
 short int dax__job_namespace_isset;
-AT_dax__job_name AX_dax__job_name;
-#define A_dax__job_name (dax__bufferstack + AX_dax__job_name)
-short int dax__job_name_isset;
-AT_dax__adag_jobCount AX_dax__adag_jobCount;
-#define A_dax__adag_jobCount (dax__bufferstack + AX_dax__adag_jobCount)
-short int dax__adag_jobCount_isset;
+AT_dax__child_ref AX_dax__child_ref;
+#define A_dax__child_ref (dax__bufferstack + AX_dax__child_ref)
+short int dax__child_ref_isset;
+AT_dax__uses_file AX_dax__uses_file;
+#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file)
+short int dax__uses_file_isset;
 AT_dax__job_version AX_dax__job_version;
 #define A_dax__job_version (dax__bufferstack + AX_dax__job_version)
 short int dax__job_version_isset;
-AT_dax__adag_xsi_c_schemaLocation AX_dax__adag_xsi_c_schemaLocation;
-#define A_dax__adag_xsi_c_schemaLocation (dax__bufferstack + AX_dax__adag_xsi_c_schemaLocation)
-short int dax__adag_xsi_c_schemaLocation_isset;
-AT_dax__uses_register AX_dax__uses_register;
-#define A_dax__uses_register AX_dax__uses_register
-short int dax__uses_register_isset;
-AT_dax__adag_fileCount AX_dax__adag_fileCount;
-#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount)
-short int dax__adag_fileCount_isset;
+AT_dax__job_runtime AX_dax__job_runtime;
+#define A_dax__job_runtime (dax__bufferstack + AX_dax__job_runtime)
+short int dax__job_runtime_isset;
+AT_dax__adag_index AX_dax__adag_index;
+#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index)
+short int dax__adag_index_isset;
+AT_dax__adag_version AX_dax__adag_version;
+#define A_dax__adag_version (dax__bufferstack + AX_dax__adag_version)
+short int dax__adag_version_isset;
+AT_dax__adag_count AX_dax__adag_count;
+#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count)
+short int dax__adag_count_isset;
+AT_dax__job_name AX_dax__job_name;
+#define A_dax__job_name (dax__bufferstack + AX_dax__job_name)
+short int dax__job_name_isset;
+AT_dax__adag_xmlns_c_xsi AX_dax__adag_xmlns_c_xsi;
+#define A_dax__adag_xmlns_c_xsi (dax__bufferstack + AX_dax__adag_xmlns_c_xsi)
+short int dax__adag_xmlns_c_xsi_isset;
 
 /* XML state. */
 #ifdef FLEX_DEBUG
@@ -2204,10 +2204,10 @@ YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</adag>' expected.",dax_text[0]);
        YY_BREAK
 case YY_STATE_EOF(S_dax__adag_1):
-case YY_STATE_EOF(S_dax__adag_5):
-case YY_STATE_EOF(E_dax__adag):
 case YY_STATE_EOF(S_dax__adag_3):
+case YY_STATE_EOF(E_dax__adag):
 case YY_STATE_EOF(S_dax__adag):
+case YY_STATE_EOF(S_dax__adag_5):
 FAIL("Premature EOF: `</adag>' expected.");
        YY_BREAK
 
@@ -2313,7 +2313,7 @@ YY_RULE_SETUP
   if (!AX_dax__job_runtime) FAIL("Required attribute `runtime' not set for `job' element.");
   LEAVE; STag_dax__job(); dax__pcdata_ix = 0; ETag_dax__job(); popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_dax__adag_2: case S_dax__adag_3: case S_dax__adag: SET(S_dax__adag_3); break;
+   case S_dax__adag: case S_dax__adag_3: case S_dax__adag_2: SET(S_dax__adag_3); break;
   }
  }
        YY_BREAK
@@ -2337,7 +2337,7 @@ YY_RULE_SETUP
   ETag_dax__job();
   popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_dax__adag_2: case S_dax__adag_3: case S_dax__adag: SET(S_dax__adag_3); break;
+   case S_dax__adag: case S_dax__adag_3: case S_dax__adag_2: SET(S_dax__adag_3); break;
   }
  }
        YY_BREAK
@@ -2350,9 +2350,9 @@ case 65:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</job>' expected.",dax_text[0]);
        YY_BREAK
-case YY_STATE_EOF(S_dax__job):
-case YY_STATE_EOF(E_dax__job):
 case YY_STATE_EOF(S_dax__job_2):
+case YY_STATE_EOF(E_dax__job):
+case YY_STATE_EOF(S_dax__job):
 FAIL("Premature EOF: `</job>' expected.");
        YY_BREAK
 
@@ -2486,7 +2486,7 @@ YY_RULE_SETUP
   if (!AX_dax__uses_size) FAIL("Required attribute `size' not set for `uses' element.");
   LEAVE; STag_dax__uses(); dax__pcdata_ix = 0; ETag_dax__uses(); popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_dax__job: case S_dax__job_2: case S_dax__job_1: SET(S_dax__job_2); break;
+   case S_dax__job_2: case S_dax__job_1: case S_dax__job: SET(S_dax__job_2); break;
   }
  }
        YY_BREAK
@@ -2510,7 +2510,7 @@ YY_RULE_SETUP
   ETag_dax__uses();
   popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_dax__job: case S_dax__job_2: case S_dax__job_1: SET(S_dax__job_2); break;
+   case S_dax__job_2: case S_dax__job_1: case S_dax__job: SET(S_dax__job_2); break;
   }
  }
        YY_BREAK
@@ -2565,7 +2565,7 @@ YY_RULE_SETUP
   if (!AX_dax__child_ref) FAIL("Required attribute `ref' not set for `child' element.");
   LEAVE; STag_dax__child(); dax__pcdata_ix = 0; ETag_dax__child(); popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_dax__adag_1: case S_dax__adag_4: case S_dax__adag_5: case S_dax__adag_3: case S_dax__adag: SET(S_dax__adag_5); break;
+   case S_dax__adag_4: case S_dax__adag_1: case S_dax__adag_3: case S_dax__adag: case S_dax__adag_5: SET(S_dax__adag_5); break;
   }
  }
        YY_BREAK
@@ -2589,7 +2589,7 @@ YY_RULE_SETUP
   ETag_dax__child();
   popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_dax__adag_1: case S_dax__adag_4: case S_dax__adag_5: case S_dax__adag_3: case S_dax__adag: SET(S_dax__adag_5); break;
+   case S_dax__adag_4: case S_dax__adag_1: case S_dax__adag_3: case S_dax__adag: case S_dax__adag_5: SET(S_dax__adag_5); break;
   }
  }
        YY_BREAK
@@ -2602,9 +2602,9 @@ case 107:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</child>' expected.",dax_text[0]);
        YY_BREAK
-case YY_STATE_EOF(S_dax__child_2):
-case YY_STATE_EOF(E_dax__child):
 case YY_STATE_EOF(S_dax__child):
+case YY_STATE_EOF(E_dax__child):
+case YY_STATE_EOF(S_dax__child_2):
 FAIL("Premature EOF: `</child>' expected.");
        YY_BREAK
 
index e31871d..8629a08 100644 (file)
@@ -60,132 +60,132 @@ XBT_PUBLIC(void) STag_dax__parent(void);
 XBT_PUBLIC(void) ETag_dax__parent(void);
 
 /* XML application data. */
-typedef int AT_dax__adag_version;
-#define AU_dax__adag_version NULL
-typedef int AT_dax__uses_type;
-#define AU_dax__uses_type NULL
-typedef enum { AU_dax__uses_optional, A_dax__uses_optional_false,A_dax__uses_optional_true } AT_dax__uses_optional;
 typedef int AT_dax__adag_name;
 #define AU_dax__adag_name NULL
+typedef int AT_dax__job_level;
+#define AU_dax__job_level NULL
+typedef int AT_dax__uses_type;
+#define AU_dax__uses_type NULL
+typedef int AT_dax__adag_fileCount;
+#define AU_dax__adag_fileCount NULL
 typedef int AT_dax__child_ref;
 #define AU_dax__child_ref NULL
+typedef enum { AU_dax__uses_link, A_dax__uses_link_input,A_dax__uses_link_output } AT_dax__uses_link;
+typedef int AT_dax__adag_count;
+#define AU_dax__adag_count NULL
+typedef int AT_dax__uses_file;
+#define AU_dax__uses_file NULL
+typedef int AT_dax__adag_xsi_c_schemaLocation;
+#define AU_dax__adag_xsi_c_schemaLocation NULL
+typedef int AT_dax__job_runtime;
+#define AU_dax__job_runtime NULL
+typedef int AT_dax__job_namespace;
+#define AU_dax__job_namespace NULL
 typedef int AT_dax__adag_xmlns;
 #define AU_dax__adag_xmlns NULL
-typedef enum { AU_dax__uses_transfer, A_dax__uses_transfer_false,A_dax__uses_transfer_true } AT_dax__uses_transfer;
 typedef int AT_dax__job_id;
 #define AU_dax__job_id NULL
-typedef int AT_dax__uses_file;
-#define AU_dax__uses_file NULL
-typedef int AT_dax__parent_ref;
-#define AU_dax__parent_ref NULL
-typedef int AT_dax__adag_count;
-#define AU_dax__adag_count NULL
+typedef int AT_dax__job_version;
+#define AU_dax__job_version NULL
+typedef enum { AU_dax__uses_optional, A_dax__uses_optional_false,A_dax__uses_optional_true } AT_dax__uses_optional;
 typedef int AT_dax__adag_xmlns_c_xsi;
 #define AU_dax__adag_xmlns_c_xsi NULL
-typedef int AT_dax__adag_index;
-#define AU_dax__adag_index NULL
 typedef int AT_dax__uses_size;
 #define AU_dax__uses_size NULL
-typedef int AT_dax__adag_childCount;
-#define AU_dax__adag_childCount NULL
-typedef enum { AU_dax__uses_link, A_dax__uses_link_input,A_dax__uses_link_output } AT_dax__uses_link;
-typedef int AT_dax__job_runtime;
-#define AU_dax__job_runtime NULL
-typedef int AT_dax__job_level;
-#define AU_dax__job_level NULL
-typedef int AT_dax__job_namespace;
-#define AU_dax__job_namespace NULL
 typedef int AT_dax__job_name;
 #define AU_dax__job_name NULL
+typedef int AT_dax__adag_childCount;
+#define AU_dax__adag_childCount NULL
+typedef enum { AU_dax__uses_transfer, A_dax__uses_transfer_false,A_dax__uses_transfer_true } AT_dax__uses_transfer;
+typedef int AT_dax__parent_ref;
+#define AU_dax__parent_ref NULL
+typedef int AT_dax__adag_version;
+#define AU_dax__adag_version NULL
 typedef int AT_dax__adag_jobCount;
 #define AU_dax__adag_jobCount NULL
-typedef int AT_dax__job_version;
-#define AU_dax__job_version NULL
-typedef int AT_dax__adag_xsi_c_schemaLocation;
-#define AU_dax__adag_xsi_c_schemaLocation NULL
 typedef enum { AU_dax__uses_register, A_dax__uses_register_false,A_dax__uses_register_true } AT_dax__uses_register;
-typedef int AT_dax__adag_fileCount;
-#define AU_dax__adag_fileCount NULL
+typedef int AT_dax__adag_index;
+#define AU_dax__adag_index NULL
 
 /* FleXML-provided data. */
 XBT_PUBLIC_DATA(int) dax__pcdata_ix;
 XBT_PUBLIC_DATA(char *) dax__bufferstack;
 #define dax__pcdata (dax__bufferstack + dax__pcdata_ix)
-XBT_PUBLIC_DATA(AT_dax__adag_version) AX_dax__adag_version;
-#define A_dax__adag_version (dax__bufferstack + AX_dax__adag_version)
-XBT_PUBLIC_DATA(short int) dax__adag_version_isset;
-XBT_PUBLIC_DATA(AT_dax__uses_type) AX_dax__uses_type;
-#define A_dax__uses_type (dax__bufferstack + AX_dax__uses_type)
-XBT_PUBLIC_DATA(short int) dax__uses_type_isset;
-XBT_PUBLIC_DATA(AT_dax__uses_optional) AX_dax__uses_optional;
-#define A_dax__uses_optional AX_dax__uses_optional
-XBT_PUBLIC_DATA(short int) dax__uses_optional_isset;
 XBT_PUBLIC_DATA(AT_dax__adag_name) AX_dax__adag_name;
 #define A_dax__adag_name (dax__bufferstack + AX_dax__adag_name)
 XBT_PUBLIC_DATA(short int) dax__adag_name_isset;
+XBT_PUBLIC_DATA(AT_dax__job_level) AX_dax__job_level;
+#define A_dax__job_level (dax__bufferstack + AX_dax__job_level)
+XBT_PUBLIC_DATA(short int) dax__job_level_isset;
+XBT_PUBLIC_DATA(AT_dax__uses_type) AX_dax__uses_type;
+#define A_dax__uses_type (dax__bufferstack + AX_dax__uses_type)
+XBT_PUBLIC_DATA(short int) dax__uses_type_isset;
+XBT_PUBLIC_DATA(AT_dax__adag_fileCount) AX_dax__adag_fileCount;
+#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount)
+XBT_PUBLIC_DATA(short int) dax__adag_fileCount_isset;
 XBT_PUBLIC_DATA(AT_dax__child_ref) AX_dax__child_ref;
 #define A_dax__child_ref (dax__bufferstack + AX_dax__child_ref)
 XBT_PUBLIC_DATA(short int) dax__child_ref_isset;
+XBT_PUBLIC_DATA(AT_dax__uses_link) AX_dax__uses_link;
+#define A_dax__uses_link AX_dax__uses_link
+XBT_PUBLIC_DATA(short int) dax__uses_link_isset;
+XBT_PUBLIC_DATA(AT_dax__adag_count) AX_dax__adag_count;
+#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count)
+XBT_PUBLIC_DATA(short int) dax__adag_count_isset;
+XBT_PUBLIC_DATA(AT_dax__uses_file) AX_dax__uses_file;
+#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file)
+XBT_PUBLIC_DATA(short int) dax__uses_file_isset;
+XBT_PUBLIC_DATA(AT_dax__adag_xsi_c_schemaLocation) AX_dax__adag_xsi_c_schemaLocation;
+#define A_dax__adag_xsi_c_schemaLocation (dax__bufferstack + AX_dax__adag_xsi_c_schemaLocation)
+XBT_PUBLIC_DATA(short int) dax__adag_xsi_c_schemaLocation_isset;
+XBT_PUBLIC_DATA(AT_dax__job_runtime) AX_dax__job_runtime;
+#define A_dax__job_runtime (dax__bufferstack + AX_dax__job_runtime)
+XBT_PUBLIC_DATA(short int) dax__job_runtime_isset;
+XBT_PUBLIC_DATA(AT_dax__job_namespace) AX_dax__job_namespace;
+#define A_dax__job_namespace (dax__bufferstack + AX_dax__job_namespace)
+XBT_PUBLIC_DATA(short int) dax__job_namespace_isset;
 XBT_PUBLIC_DATA(AT_dax__adag_xmlns) AX_dax__adag_xmlns;
 #define A_dax__adag_xmlns (dax__bufferstack + AX_dax__adag_xmlns)
 XBT_PUBLIC_DATA(short int) dax__adag_xmlns_isset;
-XBT_PUBLIC_DATA(AT_dax__uses_transfer) AX_dax__uses_transfer;
-#define A_dax__uses_transfer AX_dax__uses_transfer
-XBT_PUBLIC_DATA(short int) dax__uses_transfer_isset;
 XBT_PUBLIC_DATA(AT_dax__job_id) AX_dax__job_id;
 #define A_dax__job_id (dax__bufferstack + AX_dax__job_id)
 XBT_PUBLIC_DATA(short int) dax__job_id_isset;
-XBT_PUBLIC_DATA(AT_dax__uses_file) AX_dax__uses_file;
-#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file)
-XBT_PUBLIC_DATA(short int) dax__uses_file_isset;
-XBT_PUBLIC_DATA(AT_dax__parent_ref) AX_dax__parent_ref;
-#define A_dax__parent_ref (dax__bufferstack + AX_dax__parent_ref)
-XBT_PUBLIC_DATA(short int) dax__parent_ref_isset;
-XBT_PUBLIC_DATA(AT_dax__adag_count) AX_dax__adag_count;
-#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count)
-XBT_PUBLIC_DATA(short int) dax__adag_count_isset;
+XBT_PUBLIC_DATA(AT_dax__job_version) AX_dax__job_version;
+#define A_dax__job_version (dax__bufferstack + AX_dax__job_version)
+XBT_PUBLIC_DATA(short int) dax__job_version_isset;
+XBT_PUBLIC_DATA(AT_dax__uses_optional) AX_dax__uses_optional;
+#define A_dax__uses_optional AX_dax__uses_optional
+XBT_PUBLIC_DATA(short int) dax__uses_optional_isset;
 XBT_PUBLIC_DATA(AT_dax__adag_xmlns_c_xsi) AX_dax__adag_xmlns_c_xsi;
 #define A_dax__adag_xmlns_c_xsi (dax__bufferstack + AX_dax__adag_xmlns_c_xsi)
 XBT_PUBLIC_DATA(short int) dax__adag_xmlns_c_xsi_isset;
-XBT_PUBLIC_DATA(AT_dax__adag_index) AX_dax__adag_index;
-#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index)
-XBT_PUBLIC_DATA(short int) dax__adag_index_isset;
 XBT_PUBLIC_DATA(AT_dax__uses_size) AX_dax__uses_size;
 #define A_dax__uses_size (dax__bufferstack + AX_dax__uses_size)
 XBT_PUBLIC_DATA(short int) dax__uses_size_isset;
-XBT_PUBLIC_DATA(AT_dax__adag_childCount) AX_dax__adag_childCount;
-#define A_dax__adag_childCount (dax__bufferstack + AX_dax__adag_childCount)
-XBT_PUBLIC_DATA(short int) dax__adag_childCount_isset;
-XBT_PUBLIC_DATA(AT_dax__uses_link) AX_dax__uses_link;
-#define A_dax__uses_link AX_dax__uses_link
-XBT_PUBLIC_DATA(short int) dax__uses_link_isset;
-XBT_PUBLIC_DATA(AT_dax__job_runtime) AX_dax__job_runtime;
-#define A_dax__job_runtime (dax__bufferstack + AX_dax__job_runtime)
-XBT_PUBLIC_DATA(short int) dax__job_runtime_isset;
-XBT_PUBLIC_DATA(AT_dax__job_level) AX_dax__job_level;
-#define A_dax__job_level (dax__bufferstack + AX_dax__job_level)
-XBT_PUBLIC_DATA(short int) dax__job_level_isset;
-XBT_PUBLIC_DATA(AT_dax__job_namespace) AX_dax__job_namespace;
-#define A_dax__job_namespace (dax__bufferstack + AX_dax__job_namespace)
-XBT_PUBLIC_DATA(short int) dax__job_namespace_isset;
 XBT_PUBLIC_DATA(AT_dax__job_name) AX_dax__job_name;
 #define A_dax__job_name (dax__bufferstack + AX_dax__job_name)
 XBT_PUBLIC_DATA(short int) dax__job_name_isset;
+XBT_PUBLIC_DATA(AT_dax__adag_childCount) AX_dax__adag_childCount;
+#define A_dax__adag_childCount (dax__bufferstack + AX_dax__adag_childCount)
+XBT_PUBLIC_DATA(short int) dax__adag_childCount_isset;
+XBT_PUBLIC_DATA(AT_dax__uses_transfer) AX_dax__uses_transfer;
+#define A_dax__uses_transfer AX_dax__uses_transfer
+XBT_PUBLIC_DATA(short int) dax__uses_transfer_isset;
+XBT_PUBLIC_DATA(AT_dax__parent_ref) AX_dax__parent_ref;
+#define A_dax__parent_ref (dax__bufferstack + AX_dax__parent_ref)
+XBT_PUBLIC_DATA(short int) dax__parent_ref_isset;
+XBT_PUBLIC_DATA(AT_dax__adag_version) AX_dax__adag_version;
+#define A_dax__adag_version (dax__bufferstack + AX_dax__adag_version)
+XBT_PUBLIC_DATA(short int) dax__adag_version_isset;
 XBT_PUBLIC_DATA(AT_dax__adag_jobCount) AX_dax__adag_jobCount;
 #define A_dax__adag_jobCount (dax__bufferstack + AX_dax__adag_jobCount)
 XBT_PUBLIC_DATA(short int) dax__adag_jobCount_isset;
-XBT_PUBLIC_DATA(AT_dax__job_version) AX_dax__job_version;
-#define A_dax__job_version (dax__bufferstack + AX_dax__job_version)
-XBT_PUBLIC_DATA(short int) dax__job_version_isset;
-XBT_PUBLIC_DATA(AT_dax__adag_xsi_c_schemaLocation) AX_dax__adag_xsi_c_schemaLocation;
-#define A_dax__adag_xsi_c_schemaLocation (dax__bufferstack + AX_dax__adag_xsi_c_schemaLocation)
-XBT_PUBLIC_DATA(short int) dax__adag_xsi_c_schemaLocation_isset;
 XBT_PUBLIC_DATA(AT_dax__uses_register) AX_dax__uses_register;
 #define A_dax__uses_register AX_dax__uses_register
 XBT_PUBLIC_DATA(short int) dax__uses_register_isset;
-XBT_PUBLIC_DATA(AT_dax__adag_fileCount) AX_dax__adag_fileCount;
-#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount)
-XBT_PUBLIC_DATA(short int) dax__adag_fileCount_isset;
+XBT_PUBLIC_DATA(AT_dax__adag_index) AX_dax__adag_index;
+#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index)
+XBT_PUBLIC_DATA(short int) dax__adag_index_isset;
 
 /* XML application utilities. */
 XBT_PUBLIC(int) dax__element_context(int);
index 5060997..be63a53 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013. The SimGrid Team.
+/* Copyright (c) 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 20cc654..513dd1e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 87b0c9d..6113d3c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index f635a0f..cc4edd1 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 54feb2d..e3f62b1 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -310,13 +310,13 @@ xbt_swag_t SD_simulate_swag(double how_long) {
     if (elapsed_time > 0.0)
       total_time += elapsed_time;
 
+    /* FIXME: shoud look at model_list or model_list_invoke? */
     /* let's see which tasks are done */
     xbt_dynar_foreach(model_list, iter, model) {
-      while ((action = xbt_swag_extract(model->states.done_action_set))) {
-        task = action->data;
-        task->start_time =
-            surf_workstation_model->
-            action_get_start_time(task->surf_action);
+      while ((action = surf_model_extract_done_action_set(model))) {
+        task = surf_action_get_data(action);
+        task->start_time = surf_action_get_start_time(task->surf_action);
+
         task->finish_time = surf_get_clock();
         XBT_VERB("Task '%s' done", SD_task_get_name(task));
         XBT_DEBUG("Calling __SD_task_just_done");
@@ -380,15 +380,13 @@ xbt_swag_t SD_simulate_swag(double how_long) {
       }
 
       /* let's see which tasks have just failed */
-      while ((action = xbt_swag_extract(model->states.failed_action_set))) {
-        task = action->data;
-        task->start_time =
-            surf_workstation_model->
-            action_get_start_time(task->surf_action);
+      while ((action = surf_model_extract_failed_action_set(model))) {
+        task = surf_action_get_data(action);
+        task->start_time = surf_action_get_start_time(task->surf_action);
         task->finish_time = surf_get_clock();
         XBT_VERB("Task '%s' failed", SD_task_get_name(task));
         __SD_task_set_state(task, SD_FAILED);
-        surf_workstation_model->action_unref(action);
+        surf_action_unref(action);
         task->surf_action = NULL;
 
         xbt_swag_insert(task,sd_global->return_set);
index e147c42..b59b1b4 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2012. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@ SD_link_t __SD_link_create(void *surf_link, void *data)
   link = xbt_new(s_SD_link_t, 1);
   link->surf_link = surf_link;
   link->data = data;            /* user data */
-  if (surf_workstation_model->extension.workstation.link_shared(surf_link))
+  if (surf_network_link_is_shared(surf_link))
     link->sharing_policy = SD_LINK_SHARED;
   else
     link->sharing_policy = SD_LINK_FATPIPE;
@@ -118,8 +118,7 @@ const char *SD_link_get_name(SD_link_t link)
  */
 double SD_link_get_current_bandwidth(SD_link_t link)
 {
-  return surf_workstation_model->extension.workstation.
-      get_link_bandwidth(link->surf_link);
+  return surf_network_link_get_bandwidth(link->surf_link);
 }
 
 /**
@@ -130,8 +129,7 @@ double SD_link_get_current_bandwidth(SD_link_t link)
  */
 double SD_link_get_current_latency(SD_link_t link)
 {
-  return surf_workstation_model->extension.workstation.
-      get_link_latency(link->surf_link);
+  return surf_network_link_get_latency(link->surf_link);
 }
 
 /**
index c098fd1..9c00ca4 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -257,7 +257,7 @@ void SD_task_destroy(SD_task_t task)
   xbt_free(task->name);
 
   if (task->surf_action != NULL)
-    surf_workstation_model->action_unref(task->surf_action);
+       surf_action_unref(task->surf_action);
 
   xbt_free(task->workstation_list);
   xbt_free(task->communication_amount);
@@ -358,13 +358,11 @@ void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state)
     break;
   case SD_RUNNING:
     task->state_set = sd_global->running_task_set;
-    task->start_time =
-        surf_workstation_model->action_get_start_time(task->surf_action);
+    task->start_time = surf_action_get_start_time(task->surf_action);
     break;
   case SD_DONE:
     task->state_set = sd_global->done_task_set;
-    task->finish_time =
-        surf_workstation_model->action_get_finish_time(task->surf_action);
+    task->finish_time = surf_action_get_finish_time(task->surf_action);
     task->remains = 0;
 #ifdef HAVE_JEDULE
     jedule_log_sd_event(task);
@@ -519,7 +517,7 @@ double SD_task_get_alpha(SD_task_t task)
 double SD_task_get_remaining_amount(SD_task_t task)
 {
   if (task->surf_action)
-    return surf_workstation_model->get_remains(task->surf_action);
+       return surf_action_get_remains(task->surf_action);
   else
     return task->remains;
 }
@@ -1067,7 +1065,7 @@ void SD_task_unschedule(SD_task_t task)
   }
 
   if (__SD_task_is_running(task))       /* the task should become SD_FAILED */
-    surf_workstation_model->action_cancel(task->surf_action);
+       surf_action_cancel(task->surf_action);
   else {
     if (task->unsatisfied_dependencies == 0)
       __SD_task_set_state(task, SD_SCHEDULABLE);
@@ -1134,7 +1132,7 @@ void __SD_task_really_run(SD_task_t task)
   surf_workstations = xbt_new(void *, workstation_nb);
 
   for (i = 0; i < workstation_nb; i++)
-    surf_workstations[i] = task->workstation_list[i];
+    surf_workstations[i] =  surf_workstation_resource_priv(task->workstation_list[i]);
 
   double *computation_amount = xbt_new0(double, workstation_nb);
   double *communication_amount = xbt_new0(double, workstation_nb * workstation_nb);
@@ -1147,15 +1145,14 @@ void __SD_task_really_run(SD_task_t task)
     memcpy(communication_amount, task->communication_amount,
            sizeof(double) * workstation_nb * workstation_nb);
 
-  task->surf_action =
-        surf_workstation_model->extension.
-        workstation.execute_parallel_task(workstation_nb,
-                                          surf_workstations,
-                                          computation_amount,
-                                          communication_amount,
-                                          task->rate);
+  task->surf_action = surf_workstation_model_execute_parallel_task((surf_workstation_model_t)surf_workstation_model,
+                                                                    workstation_nb,
+                                                                    surf_workstations,
+                                                                    computation_amount,
+                                                                    communication_amount,
+                                                                    task->rate);
 
-  surf_workstation_model->action_data_set(task->surf_action, task);
+  surf_action_set_data(task->surf_action, task);
 
   XBT_DEBUG("surf_action = %p", task->surf_action);
 
@@ -1244,7 +1241,7 @@ void __SD_task_just_done(SD_task_t task)
   candidates = xbt_new(SD_task_t, 8);
 
   __SD_task_set_state(task, SD_DONE);
-  surf_workstation_model->action_unref(task->surf_action);
+  surf_action_unref(task->surf_action);
   task->surf_action = NULL;
 
   XBT_DEBUG("Looking for candidates");
@@ -1402,8 +1399,7 @@ static void __SD_task_remove_dependencies(SD_task_t task)
 double SD_task_get_start_time(SD_task_t task)
 {
   if (task->surf_action)
-    return surf_workstation_model->
-        action_get_start_time(task->surf_action);
+    return surf_action_get_start_time(task->surf_action);
   else
     return task->start_time;
 }
@@ -1422,8 +1418,7 @@ double SD_task_get_start_time(SD_task_t task)
 double SD_task_get_finish_time(SD_task_t task)
 {
   if (task->surf_action)        /* should never happen as actions are destroyed right after their completion */
-    return surf_workstation_model->
-        action_get_finish_time(task->surf_action);
+    return surf_action_get_finish_time(task->surf_action);
   else
     return task->finish_time;
 }
index 14a0c70..730ef98 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -12,8 +12,6 @@
 #include "surf/surf.h"
 #include "surf/surf_resource.h"
 
-
-
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_workstation, sd,
                                 "Logging specific to SimDag (workstation)");
 
@@ -178,8 +176,7 @@ const char *SD_workstation_get_property_value(SD_workstation_t ws,
  */
 xbt_dict_t SD_workstation_get_properties(SD_workstation_t workstation)
 {
-  return surf_workstation_model->extension.
-      workstation.get_properties(surf_workstation_resource_priv(workstation));
+  return surf_resource_get_properties(surf_workstation_resource_priv(workstation));
 }
 
 
@@ -247,9 +244,9 @@ const SD_link_t *SD_route_get_list(SD_workstation_t src,
 
   surf_src = src;
   surf_dst = dst;
-  surf_route =
-      surf_workstation_model->extension.workstation.get_route(surf_src,
-                                                              surf_dst);
+
+  surf_route = surf_workstation_model_get_route((surf_workstation_model_t)surf_workstation_model,
+                                                       surf_src, surf_dst);
 
   xbt_dynar_foreach(surf_route, cpt, surf_link) {
     link_name = surf_resource_name(surf_link);
@@ -269,8 +266,8 @@ const SD_link_t *SD_route_get_list(SD_workstation_t src,
  */
 int SD_route_get_size(SD_workstation_t src, SD_workstation_t dst)
 {
-  return xbt_dynar_length(surf_workstation_model->extension.
-                          workstation.get_route(src, dst));
+  return xbt_dynar_length(surf_workstation_model_get_route(
+                   (surf_workstation_model_t)surf_workstation_model, src, dst));
 }
 
 /**
@@ -282,8 +279,7 @@ int SD_route_get_size(SD_workstation_t src, SD_workstation_t dst)
  */
 double SD_workstation_get_power(SD_workstation_t workstation)
 {
-  return surf_workstation_model->extension.workstation.
-      get_speed(workstation, 1.0);
+  return surf_workstation_get_speed(workstation, 1.0);
 }
 
 /**
@@ -295,8 +291,7 @@ double SD_workstation_get_power(SD_workstation_t workstation)
  */
 double SD_workstation_get_available_power(SD_workstation_t workstation)
 {
-  return surf_workstation_model->extension.
-      workstation.get_available_speed(workstation);
+  return surf_workstation_get_available_speed(workstation);
 }
 
 /**
@@ -482,7 +477,7 @@ void SD_workstation_set_access_mode(SD_workstation_t workstation,
  * \return a dynar containing all mounted storages on the workstation
  */
 xbt_dict_t SD_workstation_get_storage_list(SD_workstation_t workstation){
-  return surf_workstation_model->extension.workstation.get_storage_list(workstation);
+  return surf_workstation_get_storage_list(workstation);
 }
 
 /* Returns whether a task can start now on a workstation*/
index dafa406..4ebfb8e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -67,6 +67,7 @@ static void sg_config_cmd_line(int *argc, char **argv)
 "Each of these configurations can be used by adding\n"
 "    --cfg=<option name>:<option value>\n"
 "to the command line.\n"
+"\n"
 "You can also use --help-models to see the details of all models known by this simulator.\n"
 #ifdef HAVE_TRACING
 "\n"
@@ -111,6 +112,27 @@ static void sg_config_cmd_line(int *argc, char **argv)
     sg_cfg_exit_early();
 }
 
+/* callback of the plugin variable */
+static void _sg_cfg_cb__plugin(const char *name, int pos)
+{
+  char *val;
+
+  XBT_VERB("PLUGIN");
+  xbt_assert(_sg_cfg_init_status < 2,
+              "Cannot load a plugin after the initialization");
+
+  val = xbt_cfg_get_string(_sg_cfg_set, name);
+
+  if (!strcmp(val, "help")) {
+    model_help("plugin", surf_plugin_description);
+    sg_cfg_exit_early();
+  }
+
+  /* New Module missing */
+  int plugin_id = find_model_description(surf_plugin_description, val);
+  surf_plugin_description[plugin_id].model_init_preparse();
+}
+
 /* callback of the workstation/model variable */
 static void _sg_cfg_cb__workstation_model(const char *name, int pos)
 {
@@ -130,6 +152,25 @@ static void _sg_cfg_cb__workstation_model(const char *name, int pos)
   find_model_description(surf_workstation_model_description, val);
 }
 
+/* callback of the vm_workstation/model variable */
+static void _sg_cfg_cb__vm_workstation_model(const char *name, int pos)
+{
+  char *val;
+
+  xbt_assert(_sg_cfg_init_status < 2,
+              "Cannot change the model after the initialization");
+
+  val = xbt_cfg_get_string(_sg_cfg_set, name);
+
+  if (!strcmp(val, "help")) {
+    model_help("vm_workstation", surf_vm_workstation_model_description);
+    sg_cfg_exit_early();
+  }
+
+  /* Make sure that the model exists */
+  find_model_description(surf_vm_workstation_model_description, val);
+}
+
 /* callback of the cpu/model variable */
 static void _sg_cfg_cb__cpu_model(const char *name, int pos)
 {
@@ -407,106 +448,81 @@ static void _sg_cfg_cb__gtnets_jitter_seed(const char *name, int pos)
 }
 #endif
 
+/* build description line with possible values */
+static void describe_model(char *result,
+                           const s_surf_model_description_t model_description[],
+                           const char *name,
+                           const char *description)
+{
+  char *p = result +
+    sprintf(result, "%s. Possible values: %s", description,
+            model_description[0].name ? model_description[0].name : "n/a");
+  int i;
+  for (i = 1; model_description[i].name; i++)
+    p += sprintf(p, ", %s", model_description[i].name);
+  sprintf(p,
+      ".\n       (use 'help' as a value to see the long description of each %s)",
+          name);
+}
+
 /* create the config set, register what should be and parse the command line*/
 void sg_config_init(int *argc, char **argv)
 {
-  char *description = xbt_malloc(1024);
-  char *p;
-  int i;
+  char description[1024];
 
   /* Create the configuration support */
   if (_sg_cfg_init_status == 0) { /* Only create stuff if not already inited */
-    sprintf(description,
-            "The model to use for the CPU. Possible values: ");
-    p = description;
-    while (*(++p) != '\0');
-    for (i = 0; surf_cpu_model_description[i].name; i++)
-      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
-                   surf_cpu_model_description[i].name);
-    sprintf(p,
-            ".\n       (use 'help' as a value to see the long description of each model)");
+
+    /* Plugins configuration */
+    describe_model(description, surf_plugin_description,
+                   "plugin", "The plugins");
+    xbt_cfg_register(&_sg_cfg_set, "plugin", description,
+                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__plugin, NULL);
+
+    describe_model(description, surf_cpu_model_description,
+                   "model", "The model to use for the CPU");
     xbt_cfg_register(&_sg_cfg_set, "cpu/model", description,
                      xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__cpu_model, NULL);
     xbt_cfg_setdefault_string(_sg_cfg_set, "cpu/model", "Cas01");
 
-    while (*(++p) != '\0');
-    for (i = 0; surf_optimization_mode_description[i].name; i++)
-      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
-                   surf_optimization_mode_description[i].name);
-    sprintf(p,
-            ".\n       (use 'help' as a value to see the long description of each optimization mode)");
+    describe_model(description, surf_optimization_mode_description,
+                   "optimization mode",
+                   "The optimization modes to use for the CPU");
     xbt_cfg_register(&_sg_cfg_set, "cpu/optim", description,
                      xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__optimization_mode, NULL);
     xbt_cfg_setdefault_string(_sg_cfg_set, "cpu/optim", "Lazy");
 
-    sprintf(description,
-            "The model to use for the storage. Possible values: ");
-    p = description;
-    while (*(++p) != '\0');
-    for (i = 0; surf_storage_model_description[i].name; i++)
-      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
-                   surf_storage_model_description[i].name);
-    sprintf(p,
-            ".\n       (use 'help' as a value to see the long description of each model)");
+    describe_model(description, surf_storage_model_description,
+                   "model", "The model to use for the storage");
     xbt_cfg_register(&_sg_cfg_set, "storage/model", description,
                      xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__storage_mode, NULL);
     xbt_cfg_setdefault_string(_sg_cfg_set, "storage/model", "default");
 
-    /* ********************************************************************* */
-    /* TUTORIAL: New model                                                   */
-    sprintf(description,
-            "The model to use for the New model. Possible values: ");
-    p = description;
-    while (*(++p) != '\0');
-    for (i = 0; surf_new_model_description[i].name; i++)
-      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
-                   surf_new_model_description[i].name);
-    sprintf(p,
-            ".\n       (use 'help' as a value to see the long description of each model)");
-    xbt_cfg_register(&_sg_cfg_set, "new_model/model", description,
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__storage_mode, NULL);
-    xbt_cfg_setdefault_string(_sg_cfg_set, "new_model/model", "default");
-    /* ********************************************************************* */
-
-    sprintf(description,
-            "The model to use for the network. Possible values: ");
-    p = description;
-    while (*(++p) != '\0');
-    for (i = 0; surf_network_model_description[i].name; i++)
-      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
-                   surf_network_model_description[i].name);
-    sprintf(p,
-            ".\n       (use 'help' as a value to see the long description of each model)");
+    describe_model(description, surf_network_model_description,
+                   "model", "The model to use for the network");
     xbt_cfg_register(&_sg_cfg_set, "network/model", description,
                      xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__network_model, NULL);
     xbt_cfg_setdefault_string(_sg_cfg_set, "network/model", "LV08");
 
-    sprintf(description,
-            "The optimization modes to use for the network. Possible values: ");
-    p = description;
-    while (*(++p) != '\0');
-    for (i = 0; surf_optimization_mode_description[i].name; i++)
-      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
-                   surf_optimization_mode_description[i].name);
-    sprintf(p,
-            ".\n       (use 'help' as a value to see the long description of each optimization mode)");
+    describe_model(description, surf_optimization_mode_description,
+                   "optimization mode",
+                   "The optimization modes to use for the network");
     xbt_cfg_register(&_sg_cfg_set, "network/optim", description,
                      xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__optimization_mode, NULL);
     xbt_cfg_setdefault_string(_sg_cfg_set, "network/optim", "Lazy");
 
-    sprintf(description,
-            "The model to use for the workstation. Possible values: ");
-    p = description;
-    while (*(++p) != '\0');
-    for (i = 0; surf_workstation_model_description[i].name; i++)
-      p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
-                   surf_workstation_model_description[i].name);
-    sprintf(p,
-            ".\n       (use 'help' as a value to see the long description of each model)");
+    describe_model(description, surf_workstation_model_description,
+                   "model", "The model to use for the workstation");
     xbt_cfg_register(&_sg_cfg_set, "workstation/model", description,
                      xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__workstation_model, NULL);
     xbt_cfg_setdefault_string(_sg_cfg_set, "workstation/model", "default");
 
+    describe_model(description, surf_vm_workstation_model_description,
+                   "model", "The model to use for the vm workstation");
+    xbt_cfg_register(&_sg_cfg_set, "vm_workstation/model", description,
+                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__vm_workstation_model, NULL);
+    xbt_cfg_setdefault_string(_sg_cfg_set, "vm_workstation/model", "default");
+
     xbt_cfg_register(&_sg_cfg_set, "network/TCP_gamma",
                      "Size of the biggest TCP window (cat /proc/sys/net/ipv4/tcp_[rw]mem for recv/send window; Use the last given value, which is the max window size)",
                      xbt_cfgelm_double, 1, 1, _sg_cfg_cb__tcp_gamma, NULL);
@@ -630,18 +646,22 @@ void sg_config_init(int *argc, char **argv)
     xbt_cfg_setdefault_boolean(_sg_cfg_set, "verbose-exit", "yes");
 
     /* context factory */
-    sprintf(description,
-            "Context factory to use in SIMIX. Possible values: thread");
     const char *dflt_ctx_fact = "thread";
+    {
+      char *p = description +
+        sprintf(description,
+                "Context factory to use in SIMIX. Possible values: %s",
+                dflt_ctx_fact);
 #ifdef CONTEXT_UCONTEXT
-    dflt_ctx_fact = "ucontext";
-    strcat(strcat(description, ", "), dflt_ctx_fact);
+      dflt_ctx_fact = "ucontext";
+      p += sprintf(p, ", %s", dflt_ctx_fact);
 #endif
 #ifdef HAVE_RAWCTX
-    dflt_ctx_fact = "raw";
-    strcat(strcat(description, ", "), dflt_ctx_fact);
+      dflt_ctx_fact = "raw";
+      p += sprintf(p, ", %s", dflt_ctx_fact);
 #endif
-    strcat(description, ".");
+      sprintf(p, ".");
+    }
     xbt_cfg_register(&_sg_cfg_set, "contexts/factory", description,
                      xbt_cfgelm_string, 1, 1, _sg_cfg_cb_context_factory, NULL);
     xbt_cfg_setdefault_string(_sg_cfg_set, "contexts/factory", dflt_ctx_fact);
@@ -842,8 +862,6 @@ void sg_config_init(int *argc, char **argv)
   } else {
     XBT_WARN("Call to sg_config_init() after initialization ignored");
   }
-
-  xbt_free(description);
 }
 
 void sg_config_finalize(void)
@@ -859,7 +877,9 @@ void sg_config_finalize(void)
 void surf_config_models_setup()
 {
   const char *workstation_model_name;
+  const char *vm_workstation_model_name;
   int workstation_id = -1;
+  int vm_workstation_id = -1;
   char *network_model_name = NULL;
   char *cpu_model_name = NULL;
   int storage_id = -1;
@@ -867,6 +887,8 @@ void surf_config_models_setup()
 
   workstation_model_name =
       xbt_cfg_get_string(_sg_cfg_set, "workstation/model");
+  vm_workstation_model_name =
+      xbt_cfg_get_string(_sg_cfg_set, "vm_workstation/model");
   network_model_name = xbt_cfg_get_string(_sg_cfg_set, "network/model");
   cpu_model_name = xbt_cfg_get_string(_sg_cfg_set, "cpu/model");
   storage_model_name = xbt_cfg_get_string(_sg_cfg_set, "storage/model");
@@ -911,47 +933,48 @@ void surf_config_models_setup()
   XBT_DEBUG("Call workstation_model_init");
   surf_workstation_model_description[workstation_id].model_init_preparse();
 
+  XBT_DEBUG("Call vm_workstation_model_init");
+  vm_workstation_id = find_model_description(surf_vm_workstation_model_description,
+                                          vm_workstation_model_name);
+  surf_vm_workstation_model_description[vm_workstation_id].model_init_preparse();
+
   XBT_DEBUG("Call storage_model_init");
   storage_id = find_model_description(surf_storage_model_description, storage_model_name);
   surf_storage_model_description[storage_id].model_init_preparse();
 
-  /* ********************************************************************* */
-  /* TUTORIAL: New model                                                   */
-  int new_model_id = -1;
-  char *new_model_name = NULL;
-  new_model_name = xbt_cfg_get_string(_sg_cfg_set, "new_model/model");
-  XBT_DEBUG("Call new model_init");
-  new_model_id = find_model_description(surf_new_model_description, new_model_name);
-  surf_new_model_description[new_model_id].model_init_preparse();
-  /* ********************************************************************* */
+}
+
+int sg_cfg_is_default_value(const char *name)
+{
+  return xbt_cfg_is_default_value(_sg_cfg_set, name);
 }
 
 int sg_cfg_get_int(const char* name)
 {
-  return xbt_cfg_get_int(_sg_cfg_set,name);
+  return xbt_cfg_get_int(_sg_cfg_set, name);
 }
 
 double sg_cfg_get_double(const char* name)
 {
-  return xbt_cfg_get_double(_sg_cfg_set,name);
+  return xbt_cfg_get_double(_sg_cfg_set, name);
 }
 
 char* sg_cfg_get_string(const char* name)
 {
-  return xbt_cfg_get_string(_sg_cfg_set,name);
+  return xbt_cfg_get_string(_sg_cfg_set, name);
 }
 
 int sg_cfg_get_boolean(const char* name)
 {
-  return xbt_cfg_get_boolean(_sg_cfg_set,name);
+  return xbt_cfg_get_boolean(_sg_cfg_set, name);
 }
 
 void sg_cfg_get_peer(const char *name, char **peer, int *port)
 {
-  xbt_cfg_get_peer(_sg_cfg_set,name, peer, port);
+  xbt_cfg_get_peer(_sg_cfg_set, name, peer, port);
 }
 
 xbt_dynar_t sg_cfg_get_dynar(const char* name)
 {
-  return xbt_cfg_get_dynar(_sg_cfg_set,name);
+  return xbt_cfg_get_dynar(_sg_cfg_set, name);
 }
diff --git a/src/simix/simcalls.in b/src/simix/simcalls.in
new file mode 100644 (file)
index 0000000..fcf133e
--- /dev/null
@@ -0,0 +1,135 @@
+# Copyright (c) 2014. 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.
+
+# name has_answer (restype,rescast) (arg0name,arg0type,arg0cast) (arg1name,arg1type,arg1cast)
+host_get_by_name True (void*, smx_host_t) (name, const char*)
+host_get_name True (const char*) (host, void*, smx_host_t)
+host_on True (void) (host, void*, smx_host_t)
+host_off True (void) (host, void*, smx_host_t)
+host_get_properties True (void*, xbt_dict_t) (host, void*, smx_host_t)
+host_get_core True (int) (host, void*, smx_host_t)
+host_get_process_list True (void*, xbt_swag_t) (host, void*, smx_host_t)
+host_get_speed True (double) (host, void*, smx_host_t)
+host_get_available_speed True (double) (host, void*, smx_host_t)
+host_get_state True (int) (host, void*, smx_host_t)
+host_get_current_power_peak True (double) (host, void*, smx_host_t)
+host_get_power_peak_at True (double) (host, void*, smx_host_t) (pstate_index, int)
+host_get_nb_pstates True (int) (host, void*, smx_host_t)
+host_set_power_peak_at True (void) (host, void*, smx_host_t) (pstate_index, int)
+host_get_consumed_energy True (double) (host, void*, smx_host_t)
+host_execute True (void*, smx_action_t) (name, const char*) (host, void*, smx_host_t) (computation_amount, double) (priority, double) (bound, double) (affinity_mask, unsigned long)
+host_parallel_execute True (void*, smx_action_t) (name, const char*) (host_nb, int) (host_list, void*, smx_host_t*) (computation_amount, void*, double*) (communication_amount, void*, double*) (amount, double) (rate, double)
+host_execution_destroy True (void) (execution, void*, smx_action_t)
+host_execution_cancel True (void) (execution, void*, smx_action_t)
+host_execution_get_remains True (double) (execution, void*, smx_action_t)
+host_execution_get_state True (int) (execution, void*, smx_action_t)
+host_execution_set_priority True (void) (execution, void*, smx_action_t) (priority, double)
+host_execution_set_bound True (void) (execution, void*, smx_action_t) (bound, double)
+host_execution_set_affinity True (void) (execution, void*, smx_action_t) (ws, void*, smx_host_t) (mask, unsigned long)
+host_execution_wait False (int) (execution, void*, smx_action_t)
+host_get_storage_list True (void*, xbt_dict_t) (host, void*, smx_host_t)
+host_get_params True (void) (ind_vm, void*, smx_host_t) (params, void*, ws_params_t)
+host_set_params True (void) (ind_vm, void*, smx_host_t) (params, void*, ws_params_t)
+vm_create True (void*) (name, const char*) (ind_pm, void*, smx_host_t)
+vm_start True (void) (ind_vm, void*, smx_host_t)
+vm_get_state True (int) (ind_vm, void*, smx_host_t)
+vm_migrate True (void) (ind_vm, void*, smx_host_t) (ind_dst_pm, void*, smx_host_t)
+vm_get_pm True (void*) (ind_vm, void*, smx_host_t)
+vm_set_bound True (void) (ind_vm, void*, smx_host_t) (bound, double)
+vm_set_affinity True (void) (ind_vm, void*, smx_host_t) (ind_pm, void*, smx_host_t) (mask, unsigned long)
+vm_destroy True (void) (ind_vm, void*, smx_host_t)
+vm_suspend True (void) (ind_vm, void*, smx_host_t)
+vm_resume True (void) (ind_vm, void*, smx_host_t)
+vm_shutdown True (void) (ind_vm, void*, smx_host_t)
+vm_save True (void) (ind_vm, void*, smx_host_t)
+vm_restore True (void) (ind_vm, void*, smx_host_t)
+process_create True (void) (process, void*, smx_process_t*) (name, const char*) (code, FPtr, xbt_main_func_t) (data, void*) (hostname, const char*) (kill_time, double) (argc, int) (argv, void*, char**) (properties, void*, xbt_dict_t) (auto_restart, int)
+process_kill True (void) (process, void*, smx_process_t)
+process_killall True (void) (reset_pid, int)
+process_cleanup True (void) (process, void*, smx_process_t)
+process_change_host True (void) (process, void*, smx_process_t) (dest, void*, smx_host_t)
+process_suspend False (void) (process, void*, smx_process_t)
+process_resume True (void) (process, void*, smx_process_t)
+process_count True (int) 
+process_get_PID True (int) (process, void*, smx_process_t)
+process_get_PPID True (int) (process, void*, smx_process_t)
+process_get_data True (void*) (process, void*, smx_process_t)
+process_set_data True (void) (process, void*, smx_process_t) (data, void*)
+process_get_host True (void*, smx_host_t) (process, void*, smx_process_t)
+process_get_name True (const char*) (process, void*, smx_process_t)
+process_is_suspended True (int) (process, void*, smx_process_t)
+process_get_properties True (void*, xbt_dict_t) (process, void*, smx_process_t)
+process_sleep False (int) (duration, double)
+process_on_exit True (void) (process, void*, smx_process_t) (fun, FPtr, int_f_pvoid_t) (data, void*)
+process_auto_restart_set True (void) (process, void*, smx_process_t) (auto_restart, int)
+process_restart True (void*, smx_process_t) (process, void*, smx_process_t)
+rdv_create True (void*, smx_rdv_t) (name, const char*)
+rdv_destroy True (void) (rdv, void*, smx_rdv_t)
+rdv_get_by_name True (void*, smx_host_t) (name, const char*)
+rdv_comm_count_by_host True (unsigned int) (rdv, void*, smx_rdv_t) (host, void*, smx_host_t)
+rdv_get_head True (void*, smx_action_t) (rdv, void*, smx_rdv_t)
+rdv_set_receiver True (void) (rdv, void*, smx_rdv_t) (receiver, void*, smx_process_t)
+rdv_get_receiver True (void*, smx_process_t) (rdv, void*, smx_rdv_t)
+comm_iprobe True (void*, smx_action_t) (rdv, void*, smx_rdv_t) (src, int) (tag, int) (match_fun, FPtr, simix_match_func_t) (data, void*)
+comm_send False (void) (rdv, void*, smx_rdv_t) (task_size, double) (rate, double) (src_buff, void*) (src_buff_size, size_t) (match_fun, FPtr, simix_match_func_t) (data, void*) (timeout, double)
+comm_isend True (void*, smx_action_t) (rdv, void*, smx_rdv_t) (task_size, double) (rate, double) (src_buff, void*) (src_buff_size, size_t) (match_fun, FPtr, simix_match_func_t) (clean_fun, FPtr, simix_clean_func_t) (data, void*) (detached, int)
+comm_recv False (void) (rdv, void*, smx_rdv_t) (dst_buff, void*) (dst_buff_size, void*, size_t*) (match_fun, FPtr, simix_match_func_t) (data, void*) (timeout, double) (rate, double)
+comm_irecv True (void*, smx_action_t) (rdv, void*, smx_rdv_t) (dst_buff, void*) (dst_buff_size, void*, size_t*) (match_fun, FPtr, simix_match_func_t) (data, void*) (rate, double)
+comm_cancel True (void) (comm, void*, smx_action_t)
+comm_waitany False (int) (comms, void*, xbt_dynar_t)
+comm_wait False (void) (comm, void*, smx_action_t) (timeout, double)
+comm_test False (int) (comm, void*, smx_action_t)
+comm_testany False (int) (comms, void*, xbt_dynar_t)
+comm_get_remains True (double) (comm, void*, smx_action_t)
+comm_get_state True (int) (comm, void*, smx_action_t)
+comm_get_src_data True (void*) (comm, void*, smx_action_t)
+comm_get_dst_data True (void*) (comm, void*, smx_action_t)
+comm_get_src_proc True (void*, smx_process_t) (comm, void*, smx_action_t)
+comm_get_dst_proc True (void*, smx_process_t) (comm, void*, smx_action_t)
+mutex_init True (void*, smx_mutex_t) 
+mutex_destroy True (void) (mutex, void*, smx_mutex_t)
+mutex_lock False (void) (mutex, void*, smx_mutex_t)
+mutex_trylock True (int) (mutex, void*, smx_mutex_t)
+mutex_unlock True (void) (mutex, void*, smx_mutex_t)
+cond_init True (void*, smx_cond_t) 
+cond_destroy True (void) (cond, void*, smx_cond_t)
+cond_signal True (void) (cond, void*, smx_cond_t)
+cond_wait False (void) (cond, void*, smx_cond_t) (mutex, void*, smx_mutex_t)
+cond_wait_timeout False (void) (cond, void*, smx_cond_t) (mutex, void*, smx_mutex_t) (timeout, double)
+cond_broadcast True (void) (cond, void*, smx_cond_t)
+sem_init True (void*, smx_sem_t) (capacity, int)
+sem_destroy True (void) (sem, void*, smx_sem_t)
+sem_release True (void) (sem, void*, smx_sem_t)
+sem_would_block True (int) (sem, void*, smx_sem_t)
+sem_acquire False (void) (sem, void*, smx_sem_t)
+sem_acquire_timeout False (void) (sem, void*, smx_sem_t) (timeout, double)
+sem_get_capacity True (int) (sem, void*, smx_sem_t)
+file_get_data True (void*) (fd, void*, smx_file_t)
+file_set_data True (void) (fd, void*, smx_file_t) (data, void*)
+file_read False (sg_size_t) (fd, void*, smx_file_t) (size, sg_size_t)
+file_write False (sg_size_t) (fd, void*, smx_file_t) (size, sg_size_t)
+file_open False (void*, smx_file_t) (mount, const char*) (path, const char*)
+file_close False (int) (fd, void*, smx_file_t)
+file_unlink True (int) (fd, void*, smx_file_t)
+file_ls False (void*, xbt_dict_t) (mount, const char*) (path, const char*)
+file_get_size True (sg_size_t) (fd, void*, smx_file_t)
+file_tell True (sg_size_t) (fd, void*, smx_file_t)
+file_seek True (int) (fd, void*, smx_file_t) (offset, sg_size_t) (origin, int)
+file_get_info True (void*, xbt_dynar_t) (fd, void*, smx_file_t)
+storage_file_rename True (void) (storage, void*, smx_storage_t) (src, const char*) (dest, const char*)
+storage_get_free_size True (sg_size_t) (name, const char*)
+storage_get_used_size True (sg_size_t) (name, const char*)
+storage_get_properties True (void*, xbt_dict_t) (storage, void*, smx_storage_t)
+storage_get_content True (void*, xbt_dict_t) (storage, void*, smx_storage_t)
+asr_get_properties True (void*, xbt_dict_t) (name, const char*)
+## HAVE_LATENCY_BOUND_TRACKING
+comm_is_latency_bounded True (int) (comm, void*, smx_action_t)
+## HAVE_TRACING
+set_category True (void) (action, void*, smx_action_t) (category, const char*)
+## HAVE_MC
+mc_snapshot True (void*) 
+mc_compare_snapshots True (int) (s1, void*) (s2, void*)
+mc_random True (int) (min, int) (max, int)
diff --git a/src/simix/simcalls.py b/src/simix/simcalls.py
new file mode 100755 (executable)
index 0000000..27d6504
--- /dev/null
@@ -0,0 +1,228 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2014. 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.
+
+import re, glob
+
+types = [('TCHAR', 'char', 'c')
+        ,('TSTRING', 'const char*', 'cc')
+        ,('TINT', 'int', 'i')
+        ,('TLONG', 'long', 'l')
+        ,('TUCHAR', 'unsigned char', 'uc')
+        ,('TUSHORT', 'unsigned short', 'us')
+        ,('TUINT', 'unsigned int', 'ui')
+        ,('TULONG', 'unsigned long', 'ul')
+        ,('TFLOAT', 'float', 'f')
+        ,('TDOUBLE', 'double', 'd')
+        ,('TDPTR', 'void*', 'dp')
+        ,('TFPTR', 'FPtr', 'fp')
+        ,('TCPTR', 'const void*', 'cp')
+        ,('TSIZE', 'size_t', 'sz')
+        ,('TSGSIZE', 'sg_size_t', 'sgsz')
+        ,('TVOID', 'void', '')
+        ,('TDSPEC', 'void*', 'dp')
+        ,('TFSPEC', 'FPtr', 'fp')]
+
+class Arg(object):
+  simcall_types = {k:v for _,k,v in types}
+  def __init__(self, name, type, casted=None):
+    self.name = name 
+    self.type = type
+    self.casted = casted
+    assert type in self.simcall_types, '%s not in (%s)'%(type, ', '.join(self.simcall_types.keys()))
+
+  def field(self):
+    return self.simcall_types[self.type]
+
+  def ret(self):
+    return '%s'%self.casted if self.casted else self.type
+
+  def cast(self):
+    return '(%s)'%self.casted if self.casted else '' 
+
+class Simcall(object):
+  simcalls_BODY = None
+  simcalls_PRE = None
+  def __init__(self, name, res, args, has_answer=True):
+    self.name = name
+    self.res = res
+    self.args = args
+    self.has_answer = has_answer
+
+  def check(self):
+    # smx_user.c  simcall_BODY_
+    # smx_*.c void SIMIX_pre_host_on(smx_simcall_t simcall, smx_host_t h)
+    self.check_body()
+    self.check_pre()
+
+  def check_body(self):
+    if self.simcalls_BODY is None:
+      f = open('smx_user.c')
+      self.simcalls_BODY = set(re.findall('simcall_BODY_(.*?)\(', f.read()))
+      f.close()
+    if self.name not in self.simcalls_BODY:
+      print '# ERROR: No function calling simcall_BODY_%s'%self.name
+      print '# Add something like this to smx_user.c:'
+      print '''%s simcall_%s(%s)
+{
+  return simcall_BODY_%s(%s);
+}\n'''%(self.res.ret()
+     ,self.name
+     ,', '.join('%s %s'%(arg.ret(), arg.name)
+                  for arg in self.args)
+     ,self.name
+     ,', '.join(arg.name for arg in self.args))
+      return False
+    return True
+
+  def check_pre(self):
+    if self.simcalls_PRE is None:
+      self.simcalls_PRE = set()
+      for fn in glob.glob('smx_*') + glob.glob('../mc/*'):
+        f = open(fn)
+        self.simcalls_PRE |= set(re.findall('SIMIX_pre_(.*?)\(', f.read()))
+        f.close()
+    if self.name not in self.simcalls_PRE:
+      print '# ERROR: No function called SIMIX_pre_%s'%self.name
+      print '# Add something like this to smx_.*.c:'
+      print '''%s SIMIX_pre_%s(smx_simcall_t simcall%s)
+{
+  // Your code handling the simcall
+}\n'''%(self.res.ret()
+       ,self.name
+       ,''.join(', %s %s'%(arg.ret(), arg.name)
+                  for arg in self.args))
+      return False
+    return True
+
+  def enum(self):
+    return 'SIMCALL_%s,'%(self.name.upper())
+
+  def string(self):
+    return '[SIMCALL_%s] = "SIMCALL_%s",'%(self.name.upper(), self.name.upper())       
+  
+  def result_getter_setter(self):
+    return '%s\n%s'%(self.result_getter(), self.result_setter())
+  
+  def result_getter(self):
+    return '' if self.res.type == 'void' else '''static inline %s simcall_%s__get__result(smx_simcall_t simcall){
+  return %s simcall->result.%s;
+}'''%(self.res.ret(), self.name, self.res.cast(), self.res.field())
+
+  def result_setter(self):
+    return '' if self.res.type == 'void' else '''static inline void simcall_%s__set__result(smx_simcall_t simcall, %s result){
+    simcall->result.%s = result;
+}'''%(self.name, self.res.type, self.res.field())
+
+  def args_getter_setter(self):
+    res = []
+    for i in range(len(self.args)):
+      res.append(self.arg_getter(i))
+      res.append(self.arg_setter(i))
+    return '\n'.join(res)
+
+  def arg_getter(self, i):
+    arg = self.args[i]
+    return '''static inline %s simcall_%s__get__%s(smx_simcall_t simcall){
+  return %s simcall->args[%i].%s;
+}'''%(arg.ret(), self.name, arg.name, arg.cast(), i, arg.field())
+
+  def arg_setter(self, i):
+    arg = self.args[i]
+    return '''static inline void simcall_%s__set__%s(smx_simcall_t simcall, %s arg){
+    simcall->args[%i].%s = arg;
+}'''%(self.name, arg.name, arg.type, i, arg.field())
+
+  def case(self):
+    return '''case SIMCALL_%s:
+      %sSIMIX_pre_%s(simcall %s);
+      %sbreak;  
+'''%(self.name.upper(), 
+     'simcall->result.%s = '%self.res.field() if self.res.type != 'void' and self.has_answer else ' ',
+     self.name,
+     ''.join(', %s simcall->args[%d].%s'%(arg.cast(), i, arg.field()) 
+             for i, arg in enumerate(self.args)),
+     'SIMIX_simcall_answer(simcall);\n      ' if self.has_answer else ' ')
+
+  def body(self):
+    return '''  inline static %s simcall_BODY_%s(%s) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_%s;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+%s
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%%s' on simcall %%s (%%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    %s
+  }'''%(self.res.ret()
+       ,self.name
+       ,', '.join('%s %s'%(arg.ret(), arg.name)
+                  for arg in self.args)
+       ,self.name.upper()
+       ,'\n'.join('    self->simcall.args[%d].%s = (%s) %s;'%(i, arg.field(), arg.type, arg.name)
+                  for i, arg in enumerate(self.args))
+       ,'' if self.res.type == 'void' else 'return self->simcall.result.%s;'%self.res.field())
+
+def parse(fn):
+  res = []
+  resdi = None
+  resd = {}
+  for line in open(fn).read().split('\n'):
+    if line.startswith('##'):
+      resdi = []
+      resd[re.search(r'## *(.*)', line).group(1)] = resdi
+    if line.startswith('#') or not line:
+      continue
+    match = re.match(r'(\S*?) *(\S*?) *\((.*?)(?:, *(.*?))?\) *(.*)', line)
+    assert match, line
+    name, ans, rest, resc, args = match.groups()
+    sargs = []
+    for n,t,c in re.findall(r'\((.*?), *(.*?)(?:, *(.*?))?\)', args):
+      sargs.append(Arg(n,t,c))
+    sim = Simcall(name, Arg('result', rest, resc), sargs, ans == 'True')
+    if resdi is None:
+      res.append(sim)
+    else:
+      resdi.append(sim)
+  return res, resd
+
+def write(fn, func, scs, scd):
+  f = open(fn, 'w')
+  f.write('/*********************************************\n')
+  f.write(' * File Generated by src/simix/simcalls.py   *\n')
+  f.write(' *                from src/simix/simcalls.in *\n')
+  f.write(' * Do not modify this file, add new simcalls *\n')
+  f.write(' * in src/simix/simcalls.in                  *\n')  
+  f.write(' *********************************************/\n\n')
+  f.write('\n'.join(func(sc) for sc in scs))
+  for k, v in scd.items():
+    f.write('\n#ifdef %s\n%s\n#endif\n'%(k, '\n'.join(func(sc) for sc in v)))
+  f.close()
+
+if __name__=='__main__':
+  import sys
+  simcalls, simcalls_dict = parse('simcalls.in')
+  
+  ok = True
+  ok &= all(map(Simcall.check, simcalls))
+  for k,v in simcalls_dict.items():
+    ok &= all(map(Simcall.check, v))
+  #if not ok:
+  #  sys.exit(1)
+
+  write('simcalls_generated_enum.h', Simcall.enum, simcalls, simcalls_dict)
+  write('simcalls_generated_string.c', Simcall.string, simcalls, simcalls_dict)
+  write('simcalls_generated_res_getter_setter.h', Simcall.result_getter_setter, simcalls, simcalls_dict)
+  write('simcalls_generated_args_getter_setter.h', Simcall.args_getter_setter, simcalls, simcalls_dict)
+  write('simcalls_generated_case.c', Simcall.case, simcalls, simcalls_dict)
+  write('simcalls_generated_body.c', Simcall.body, simcalls, simcalls_dict)
diff --git a/src/simix/simcalls_generated_args_getter_setter.h b/src/simix/simcalls_generated_args_getter_setter.h
new file mode 100644 (file)
index 0000000..af7235f
--- /dev/null
@@ -0,0 +1,1267 @@
+/*********************************************
+ * File Generated by src/simix/simcalls.py   *
+ *                from src/simix/simcalls.in *
+ * Do not modify this file, add new simcalls *
+ * in src/simix/simcalls.in                  *
+ *********************************************/
+
+static inline const char* simcall_host_get_by_name__get__name(smx_simcall_t simcall){
+  return  simcall->args[0].cc;
+}
+static inline void simcall_host_get_by_name__set__name(smx_simcall_t simcall, const char* arg){
+    simcall->args[0].cc = arg;
+}
+static inline smx_host_t simcall_host_get_name__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_name__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_on__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_on__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_off__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_off__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_properties__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_properties__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_core__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_core__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_process_list__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_process_list__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_speed__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_speed__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_available_speed__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_available_speed__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_state__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_state__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_current_power_peak__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_current_power_peak__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_power_peak_at__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_power_peak_at__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline int simcall_host_get_power_peak_at__get__pstate_index(smx_simcall_t simcall){
+  return  simcall->args[1].i;
+}
+static inline void simcall_host_get_power_peak_at__set__pstate_index(smx_simcall_t simcall, int arg){
+    simcall->args[1].i = arg;
+}
+static inline smx_host_t simcall_host_get_nb_pstates__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_nb_pstates__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_set_power_peak_at__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_set_power_peak_at__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline int simcall_host_set_power_peak_at__get__pstate_index(smx_simcall_t simcall){
+  return  simcall->args[1].i;
+}
+static inline void simcall_host_set_power_peak_at__set__pstate_index(smx_simcall_t simcall, int arg){
+    simcall->args[1].i = arg;
+}
+static inline smx_host_t simcall_host_get_consumed_energy__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_consumed_energy__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline const char* simcall_host_execute__get__name(smx_simcall_t simcall){
+  return  simcall->args[0].cc;
+}
+static inline void simcall_host_execute__set__name(smx_simcall_t simcall, const char* arg){
+    simcall->args[0].cc = arg;
+}
+static inline smx_host_t simcall_host_execute__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_host_execute__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline double simcall_host_execute__get__computation_amount(smx_simcall_t simcall){
+  return  simcall->args[2].d;
+}
+static inline void simcall_host_execute__set__computation_amount(smx_simcall_t simcall, double arg){
+    simcall->args[2].d = arg;
+}
+static inline double simcall_host_execute__get__priority(smx_simcall_t simcall){
+  return  simcall->args[3].d;
+}
+static inline void simcall_host_execute__set__priority(smx_simcall_t simcall, double arg){
+    simcall->args[3].d = arg;
+}
+static inline double simcall_host_execute__get__bound(smx_simcall_t simcall){
+  return  simcall->args[4].d;
+}
+static inline void simcall_host_execute__set__bound(smx_simcall_t simcall, double arg){
+    simcall->args[4].d = arg;
+}
+static inline unsigned long simcall_host_execute__get__affinity_mask(smx_simcall_t simcall){
+  return  simcall->args[5].ul;
+}
+static inline void simcall_host_execute__set__affinity_mask(smx_simcall_t simcall, unsigned long arg){
+    simcall->args[5].ul = arg;
+}
+static inline const char* simcall_host_parallel_execute__get__name(smx_simcall_t simcall){
+  return  simcall->args[0].cc;
+}
+static inline void simcall_host_parallel_execute__set__name(smx_simcall_t simcall, const char* arg){
+    simcall->args[0].cc = arg;
+}
+static inline int simcall_host_parallel_execute__get__host_nb(smx_simcall_t simcall){
+  return  simcall->args[1].i;
+}
+static inline void simcall_host_parallel_execute__set__host_nb(smx_simcall_t simcall, int arg){
+    simcall->args[1].i = arg;
+}
+static inline smx_host_t* simcall_host_parallel_execute__get__host_list(smx_simcall_t simcall){
+  return (smx_host_t*) simcall->args[2].dp;
+}
+static inline void simcall_host_parallel_execute__set__host_list(smx_simcall_t simcall, void* arg){
+    simcall->args[2].dp = arg;
+}
+static inline double* simcall_host_parallel_execute__get__computation_amount(smx_simcall_t simcall){
+  return (double*) simcall->args[3].dp;
+}
+static inline void simcall_host_parallel_execute__set__computation_amount(smx_simcall_t simcall, void* arg){
+    simcall->args[3].dp = arg;
+}
+static inline double* simcall_host_parallel_execute__get__communication_amount(smx_simcall_t simcall){
+  return (double*) simcall->args[4].dp;
+}
+static inline void simcall_host_parallel_execute__set__communication_amount(smx_simcall_t simcall, void* arg){
+    simcall->args[4].dp = arg;
+}
+static inline double simcall_host_parallel_execute__get__amount(smx_simcall_t simcall){
+  return  simcall->args[5].d;
+}
+static inline void simcall_host_parallel_execute__set__amount(smx_simcall_t simcall, double arg){
+    simcall->args[5].d = arg;
+}
+static inline double simcall_host_parallel_execute__get__rate(smx_simcall_t simcall){
+  return  simcall->args[6].d;
+}
+static inline void simcall_host_parallel_execute__set__rate(smx_simcall_t simcall, double arg){
+    simcall->args[6].d = arg;
+}
+static inline smx_action_t simcall_host_execution_destroy__get__execution(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_destroy__set__execution(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_host_execution_cancel__get__execution(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_cancel__set__execution(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_host_execution_get_remains__get__execution(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_get_remains__set__execution(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_host_execution_get_state__get__execution(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_get_state__set__execution(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_host_execution_set_priority__get__execution(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_set_priority__set__execution(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline double simcall_host_execution_set_priority__get__priority(smx_simcall_t simcall){
+  return  simcall->args[1].d;
+}
+static inline void simcall_host_execution_set_priority__set__priority(smx_simcall_t simcall, double arg){
+    simcall->args[1].d = arg;
+}
+static inline smx_action_t simcall_host_execution_set_bound__get__execution(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_set_bound__set__execution(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline double simcall_host_execution_set_bound__get__bound(smx_simcall_t simcall){
+  return  simcall->args[1].d;
+}
+static inline void simcall_host_execution_set_bound__set__bound(smx_simcall_t simcall, double arg){
+    simcall->args[1].d = arg;
+}
+static inline smx_action_t simcall_host_execution_set_affinity__get__execution(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_set_affinity__set__execution(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_execution_set_affinity__get__ws(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_host_execution_set_affinity__set__ws(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline unsigned long simcall_host_execution_set_affinity__get__mask(smx_simcall_t simcall){
+  return  simcall->args[2].ul;
+}
+static inline void simcall_host_execution_set_affinity__set__mask(smx_simcall_t simcall, unsigned long arg){
+    simcall->args[2].ul = arg;
+}
+static inline smx_action_t simcall_host_execution_wait__get__execution(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_wait__set__execution(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_storage_list__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_storage_list__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_params__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_params__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline ws_params_t simcall_host_get_params__get__params(smx_simcall_t simcall){
+  return (ws_params_t) simcall->args[1].dp;
+}
+static inline void simcall_host_get_params__set__params(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline smx_host_t simcall_host_set_params__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_set_params__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline ws_params_t simcall_host_set_params__get__params(smx_simcall_t simcall){
+  return (ws_params_t) simcall->args[1].dp;
+}
+static inline void simcall_host_set_params__set__params(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline const char* simcall_vm_create__get__name(smx_simcall_t simcall){
+  return  simcall->args[0].cc;
+}
+static inline void simcall_vm_create__set__name(smx_simcall_t simcall, const char* arg){
+    simcall->args[0].cc = arg;
+}
+static inline smx_host_t simcall_vm_create__get__ind_pm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_vm_create__set__ind_pm(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline smx_host_t simcall_vm_start__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_start__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_get_state__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_get_state__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_migrate__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_migrate__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_migrate__get__ind_dst_pm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_vm_migrate__set__ind_dst_pm(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline smx_host_t simcall_vm_get_pm__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_get_pm__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_set_bound__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_set_bound__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline double simcall_vm_set_bound__get__bound(smx_simcall_t simcall){
+  return  simcall->args[1].d;
+}
+static inline void simcall_vm_set_bound__set__bound(smx_simcall_t simcall, double arg){
+    simcall->args[1].d = arg;
+}
+static inline smx_host_t simcall_vm_set_affinity__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_set_affinity__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_set_affinity__get__ind_pm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_vm_set_affinity__set__ind_pm(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline unsigned long simcall_vm_set_affinity__get__mask(smx_simcall_t simcall){
+  return  simcall->args[2].ul;
+}
+static inline void simcall_vm_set_affinity__set__mask(smx_simcall_t simcall, unsigned long arg){
+    simcall->args[2].ul = arg;
+}
+static inline smx_host_t simcall_vm_destroy__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_destroy__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_suspend__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_suspend__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_resume__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_resume__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_shutdown__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_shutdown__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_save__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_save__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_restore__get__ind_vm(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_restore__set__ind_vm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_process_t* simcall_process_create__get__process(smx_simcall_t simcall){
+  return (smx_process_t*) simcall->args[0].dp;
+}
+static inline void simcall_process_create__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline const char* simcall_process_create__get__name(smx_simcall_t simcall){
+  return  simcall->args[1].cc;
+}
+static inline void simcall_process_create__set__name(smx_simcall_t simcall, const char* arg){
+    simcall->args[1].cc = arg;
+}
+static inline xbt_main_func_t simcall_process_create__get__code(smx_simcall_t simcall){
+  return (xbt_main_func_t) simcall->args[2].fp;
+}
+static inline void simcall_process_create__set__code(smx_simcall_t simcall, FPtr arg){
+    simcall->args[2].fp = arg;
+}
+static inline void* simcall_process_create__get__data(smx_simcall_t simcall){
+  return  simcall->args[3].dp;
+}
+static inline void simcall_process_create__set__data(smx_simcall_t simcall, void* arg){
+    simcall->args[3].dp = arg;
+}
+static inline const char* simcall_process_create__get__hostname(smx_simcall_t simcall){
+  return  simcall->args[4].cc;
+}
+static inline void simcall_process_create__set__hostname(smx_simcall_t simcall, const char* arg){
+    simcall->args[4].cc = arg;
+}
+static inline double simcall_process_create__get__kill_time(smx_simcall_t simcall){
+  return  simcall->args[5].d;
+}
+static inline void simcall_process_create__set__kill_time(smx_simcall_t simcall, double arg){
+    simcall->args[5].d = arg;
+}
+static inline int simcall_process_create__get__argc(smx_simcall_t simcall){
+  return  simcall->args[6].i;
+}
+static inline void simcall_process_create__set__argc(smx_simcall_t simcall, int arg){
+    simcall->args[6].i = arg;
+}
+static inline char** simcall_process_create__get__argv(smx_simcall_t simcall){
+  return (char**) simcall->args[7].dp;
+}
+static inline void simcall_process_create__set__argv(smx_simcall_t simcall, void* arg){
+    simcall->args[7].dp = arg;
+}
+static inline xbt_dict_t simcall_process_create__get__properties(smx_simcall_t simcall){
+  return (xbt_dict_t) simcall->args[8].dp;
+}
+static inline void simcall_process_create__set__properties(smx_simcall_t simcall, void* arg){
+    simcall->args[8].dp = arg;
+}
+static inline int simcall_process_create__get__auto_restart(smx_simcall_t simcall){
+  return  simcall->args[9].i;
+}
+static inline void simcall_process_create__set__auto_restart(smx_simcall_t simcall, int arg){
+    simcall->args[9].i = arg;
+}
+static inline smx_process_t simcall_process_kill__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_kill__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline int simcall_process_killall__get__reset_pid(smx_simcall_t simcall){
+  return  simcall->args[0].i;
+}
+static inline void simcall_process_killall__set__reset_pid(smx_simcall_t simcall, int arg){
+    simcall->args[0].i = arg;
+}
+static inline smx_process_t simcall_process_cleanup__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_cleanup__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_change_host__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_change_host__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_process_change_host__get__dest(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_process_change_host__set__dest(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline smx_process_t simcall_process_suspend__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_suspend__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_resume__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_resume__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+
+static inline smx_process_t simcall_process_get_PID__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_get_PID__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_get_PPID__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_get_PPID__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_get_data__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_get_data__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_set_data__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_set_data__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline void* simcall_process_set_data__get__data(smx_simcall_t simcall){
+  return  simcall->args[1].dp;
+}
+static inline void simcall_process_set_data__set__data(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline smx_process_t simcall_process_get_host__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_get_host__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_get_name__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_get_name__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_is_suspended__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_is_suspended__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_get_properties__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_get_properties__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline double simcall_process_sleep__get__duration(smx_simcall_t simcall){
+  return  simcall->args[0].d;
+}
+static inline void simcall_process_sleep__set__duration(smx_simcall_t simcall, double arg){
+    simcall->args[0].d = arg;
+}
+static inline smx_process_t simcall_process_on_exit__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_on_exit__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline int_f_pvoid_t simcall_process_on_exit__get__fun(smx_simcall_t simcall){
+  return (int_f_pvoid_t) simcall->args[1].fp;
+}
+static inline void simcall_process_on_exit__set__fun(smx_simcall_t simcall, FPtr arg){
+    simcall->args[1].fp = arg;
+}
+static inline void* simcall_process_on_exit__get__data(smx_simcall_t simcall){
+  return  simcall->args[2].dp;
+}
+static inline void simcall_process_on_exit__set__data(smx_simcall_t simcall, void* arg){
+    simcall->args[2].dp = arg;
+}
+static inline smx_process_t simcall_process_auto_restart_set__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_auto_restart_set__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline int simcall_process_auto_restart_set__get__auto_restart(smx_simcall_t simcall){
+  return  simcall->args[1].i;
+}
+static inline void simcall_process_auto_restart_set__set__auto_restart(smx_simcall_t simcall, int arg){
+    simcall->args[1].i = arg;
+}
+static inline smx_process_t simcall_process_restart__get__process(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_restart__set__process(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline const char* simcall_rdv_create__get__name(smx_simcall_t simcall){
+  return  simcall->args[0].cc;
+}
+static inline void simcall_rdv_create__set__name(smx_simcall_t simcall, const char* arg){
+    simcall->args[0].cc = arg;
+}
+static inline smx_rdv_t simcall_rdv_destroy__get__rdv(smx_simcall_t simcall){
+  return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_rdv_destroy__set__rdv(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline const char* simcall_rdv_get_by_name__get__name(smx_simcall_t simcall){
+  return  simcall->args[0].cc;
+}
+static inline void simcall_rdv_get_by_name__set__name(smx_simcall_t simcall, const char* arg){
+    simcall->args[0].cc = arg;
+}
+static inline smx_rdv_t simcall_rdv_comm_count_by_host__get__rdv(smx_simcall_t simcall){
+  return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_rdv_comm_count_by_host__set__rdv(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_rdv_comm_count_by_host__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_rdv_comm_count_by_host__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline smx_rdv_t simcall_rdv_get_head__get__rdv(smx_simcall_t simcall){
+  return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_rdv_get_head__set__rdv(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_rdv_t simcall_rdv_set_receiver__get__rdv(smx_simcall_t simcall){
+  return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_rdv_set_receiver__set__rdv(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_rdv_set_receiver__get__receiver(smx_simcall_t simcall){
+  return (smx_process_t) simcall->args[1].dp;
+}
+static inline void simcall_rdv_set_receiver__set__receiver(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline smx_rdv_t simcall_rdv_get_receiver__get__rdv(smx_simcall_t simcall){
+  return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_rdv_get_receiver__set__rdv(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_rdv_t simcall_comm_iprobe__get__rdv(smx_simcall_t simcall){
+  return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_iprobe__set__rdv(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline int simcall_comm_iprobe__get__src(smx_simcall_t simcall){
+  return  simcall->args[1].i;
+}
+static inline void simcall_comm_iprobe__set__src(smx_simcall_t simcall, int arg){
+    simcall->args[1].i = arg;
+}
+static inline int simcall_comm_iprobe__get__tag(smx_simcall_t simcall){
+  return  simcall->args[2].i;
+}
+static inline void simcall_comm_iprobe__set__tag(smx_simcall_t simcall, int arg){
+    simcall->args[2].i = arg;
+}
+static inline simix_match_func_t simcall_comm_iprobe__get__match_fun(smx_simcall_t simcall){
+  return (simix_match_func_t) simcall->args[3].fp;
+}
+static inline void simcall_comm_iprobe__set__match_fun(smx_simcall_t simcall, FPtr arg){
+    simcall->args[3].fp = arg;
+}
+static inline void* simcall_comm_iprobe__get__data(smx_simcall_t simcall){
+  return  simcall->args[4].dp;
+}
+static inline void simcall_comm_iprobe__set__data(smx_simcall_t simcall, void* arg){
+    simcall->args[4].dp = arg;
+}
+static inline smx_rdv_t simcall_comm_send__get__rdv(smx_simcall_t simcall){
+  return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_send__set__rdv(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline double simcall_comm_send__get__task_size(smx_simcall_t simcall){
+  return  simcall->args[1].d;
+}
+static inline void simcall_comm_send__set__task_size(smx_simcall_t simcall, double arg){
+    simcall->args[1].d = arg;
+}
+static inline double simcall_comm_send__get__rate(smx_simcall_t simcall){
+  return  simcall->args[2].d;
+}
+static inline void simcall_comm_send__set__rate(smx_simcall_t simcall, double arg){
+    simcall->args[2].d = arg;
+}
+static inline void* simcall_comm_send__get__src_buff(smx_simcall_t simcall){
+  return  simcall->args[3].dp;
+}
+static inline void simcall_comm_send__set__src_buff(smx_simcall_t simcall, void* arg){
+    simcall->args[3].dp = arg;
+}
+static inline size_t simcall_comm_send__get__src_buff_size(smx_simcall_t simcall){
+  return  simcall->args[4].sz;
+}
+static inline void simcall_comm_send__set__src_buff_size(smx_simcall_t simcall, size_t arg){
+    simcall->args[4].sz = arg;
+}
+static inline simix_match_func_t simcall_comm_send__get__match_fun(smx_simcall_t simcall){
+  return (simix_match_func_t) simcall->args[5].fp;
+}
+static inline void simcall_comm_send__set__match_fun(smx_simcall_t simcall, FPtr arg){
+    simcall->args[5].fp = arg;
+}
+static inline void* simcall_comm_send__get__data(smx_simcall_t simcall){
+  return  simcall->args[6].dp;
+}
+static inline void simcall_comm_send__set__data(smx_simcall_t simcall, void* arg){
+    simcall->args[6].dp = arg;
+}
+static inline double simcall_comm_send__get__timeout(smx_simcall_t simcall){
+  return  simcall->args[7].d;
+}
+static inline void simcall_comm_send__set__timeout(smx_simcall_t simcall, double arg){
+    simcall->args[7].d = arg;
+}
+static inline smx_rdv_t simcall_comm_isend__get__rdv(smx_simcall_t simcall){
+  return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_isend__set__rdv(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline double simcall_comm_isend__get__task_size(smx_simcall_t simcall){
+  return  simcall->args[1].d;
+}
+static inline void simcall_comm_isend__set__task_size(smx_simcall_t simcall, double arg){
+    simcall->args[1].d = arg;
+}
+static inline double simcall_comm_isend__get__rate(smx_simcall_t simcall){
+  return  simcall->args[2].d;
+}
+static inline void simcall_comm_isend__set__rate(smx_simcall_t simcall, double arg){
+    simcall->args[2].d = arg;
+}
+static inline void* simcall_comm_isend__get__src_buff(smx_simcall_t simcall){
+  return  simcall->args[3].dp;
+}
+static inline void simcall_comm_isend__set__src_buff(smx_simcall_t simcall, void* arg){
+    simcall->args[3].dp = arg;
+}
+static inline size_t simcall_comm_isend__get__src_buff_size(smx_simcall_t simcall){
+  return  simcall->args[4].sz;
+}
+static inline void simcall_comm_isend__set__src_buff_size(smx_simcall_t simcall, size_t arg){
+    simcall->args[4].sz = arg;
+}
+static inline simix_match_func_t simcall_comm_isend__get__match_fun(smx_simcall_t simcall){
+  return (simix_match_func_t) simcall->args[5].fp;
+}
+static inline void simcall_comm_isend__set__match_fun(smx_simcall_t simcall, FPtr arg){
+    simcall->args[5].fp = arg;
+}
+static inline simix_clean_func_t simcall_comm_isend__get__clean_fun(smx_simcall_t simcall){
+  return (simix_clean_func_t) simcall->args[6].fp;
+}
+static inline void simcall_comm_isend__set__clean_fun(smx_simcall_t simcall, FPtr arg){
+    simcall->args[6].fp = arg;
+}
+static inline void* simcall_comm_isend__get__data(smx_simcall_t simcall){
+  return  simcall->args[7].dp;
+}
+static inline void simcall_comm_isend__set__data(smx_simcall_t simcall, void* arg){
+    simcall->args[7].dp = arg;
+}
+static inline int simcall_comm_isend__get__detached(smx_simcall_t simcall){
+  return  simcall->args[8].i;
+}
+static inline void simcall_comm_isend__set__detached(smx_simcall_t simcall, int arg){
+    simcall->args[8].i = arg;
+}
+static inline smx_rdv_t simcall_comm_recv__get__rdv(smx_simcall_t simcall){
+  return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_recv__set__rdv(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline void* simcall_comm_recv__get__dst_buff(smx_simcall_t simcall){
+  return  simcall->args[1].dp;
+}
+static inline void simcall_comm_recv__set__dst_buff(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline size_t* simcall_comm_recv__get__dst_buff_size(smx_simcall_t simcall){
+  return (size_t*) simcall->args[2].dp;
+}
+static inline void simcall_comm_recv__set__dst_buff_size(smx_simcall_t simcall, void* arg){
+    simcall->args[2].dp = arg;
+}
+static inline simix_match_func_t simcall_comm_recv__get__match_fun(smx_simcall_t simcall){
+  return (simix_match_func_t) simcall->args[3].fp;
+}
+static inline void simcall_comm_recv__set__match_fun(smx_simcall_t simcall, FPtr arg){
+    simcall->args[3].fp = arg;
+}
+static inline void* simcall_comm_recv__get__data(smx_simcall_t simcall){
+  return  simcall->args[4].dp;
+}
+static inline void simcall_comm_recv__set__data(smx_simcall_t simcall, void* arg){
+    simcall->args[4].dp = arg;
+}
+static inline double simcall_comm_recv__get__timeout(smx_simcall_t simcall){
+  return  simcall->args[5].d;
+}
+static inline void simcall_comm_recv__set__timeout(smx_simcall_t simcall, double arg){
+    simcall->args[5].d = arg;
+}
+static inline double simcall_comm_recv__get__rate(smx_simcall_t simcall){
+  return  simcall->args[6].d;
+}
+static inline void simcall_comm_recv__set__rate(smx_simcall_t simcall, double arg){
+    simcall->args[6].d = arg;
+}
+static inline smx_rdv_t simcall_comm_irecv__get__rdv(smx_simcall_t simcall){
+  return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_irecv__set__rdv(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline void* simcall_comm_irecv__get__dst_buff(smx_simcall_t simcall){
+  return  simcall->args[1].dp;
+}
+static inline void simcall_comm_irecv__set__dst_buff(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline size_t* simcall_comm_irecv__get__dst_buff_size(smx_simcall_t simcall){
+  return (size_t*) simcall->args[2].dp;
+}
+static inline void simcall_comm_irecv__set__dst_buff_size(smx_simcall_t simcall, void* arg){
+    simcall->args[2].dp = arg;
+}
+static inline simix_match_func_t simcall_comm_irecv__get__match_fun(smx_simcall_t simcall){
+  return (simix_match_func_t) simcall->args[3].fp;
+}
+static inline void simcall_comm_irecv__set__match_fun(smx_simcall_t simcall, FPtr arg){
+    simcall->args[3].fp = arg;
+}
+static inline void* simcall_comm_irecv__get__data(smx_simcall_t simcall){
+  return  simcall->args[4].dp;
+}
+static inline void simcall_comm_irecv__set__data(smx_simcall_t simcall, void* arg){
+    simcall->args[4].dp = arg;
+}
+static inline double simcall_comm_irecv__get__rate(smx_simcall_t simcall){
+  return  simcall->args[5].d;
+}
+static inline void simcall_comm_irecv__set__rate(smx_simcall_t simcall, double arg){
+    simcall->args[5].d = arg;
+}
+static inline smx_action_t simcall_comm_cancel__get__comm(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_cancel__set__comm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline xbt_dynar_t simcall_comm_waitany__get__comms(smx_simcall_t simcall){
+  return (xbt_dynar_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_waitany__set__comms(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_wait__get__comm(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_wait__set__comm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline double simcall_comm_wait__get__timeout(smx_simcall_t simcall){
+  return  simcall->args[1].d;
+}
+static inline void simcall_comm_wait__set__timeout(smx_simcall_t simcall, double arg){
+    simcall->args[1].d = arg;
+}
+static inline smx_action_t simcall_comm_test__get__comm(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_test__set__comm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline xbt_dynar_t simcall_comm_testany__get__comms(smx_simcall_t simcall){
+  return (xbt_dynar_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_testany__set__comms(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_get_remains__get__comm(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_get_remains__set__comm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_get_state__get__comm(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_get_state__set__comm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_get_src_data__get__comm(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_get_src_data__set__comm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_get_dst_data__get__comm(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_get_dst_data__set__comm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_get_src_proc__get__comm(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_get_src_proc__set__comm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_get_dst_proc__get__comm(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_get_dst_proc__set__comm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+
+static inline smx_mutex_t simcall_mutex_destroy__get__mutex(smx_simcall_t simcall){
+  return (smx_mutex_t) simcall->args[0].dp;
+}
+static inline void simcall_mutex_destroy__set__mutex(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_mutex_t simcall_mutex_lock__get__mutex(smx_simcall_t simcall){
+  return (smx_mutex_t) simcall->args[0].dp;
+}
+static inline void simcall_mutex_lock__set__mutex(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_mutex_t simcall_mutex_trylock__get__mutex(smx_simcall_t simcall){
+  return (smx_mutex_t) simcall->args[0].dp;
+}
+static inline void simcall_mutex_trylock__set__mutex(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_mutex_t simcall_mutex_unlock__get__mutex(smx_simcall_t simcall){
+  return (smx_mutex_t) simcall->args[0].dp;
+}
+static inline void simcall_mutex_unlock__set__mutex(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+
+static inline smx_cond_t simcall_cond_destroy__get__cond(smx_simcall_t simcall){
+  return (smx_cond_t) simcall->args[0].dp;
+}
+static inline void simcall_cond_destroy__set__cond(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_cond_t simcall_cond_signal__get__cond(smx_simcall_t simcall){
+  return (smx_cond_t) simcall->args[0].dp;
+}
+static inline void simcall_cond_signal__set__cond(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_cond_t simcall_cond_wait__get__cond(smx_simcall_t simcall){
+  return (smx_cond_t) simcall->args[0].dp;
+}
+static inline void simcall_cond_wait__set__cond(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_mutex_t simcall_cond_wait__get__mutex(smx_simcall_t simcall){
+  return (smx_mutex_t) simcall->args[1].dp;
+}
+static inline void simcall_cond_wait__set__mutex(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline smx_cond_t simcall_cond_wait_timeout__get__cond(smx_simcall_t simcall){
+  return (smx_cond_t) simcall->args[0].dp;
+}
+static inline void simcall_cond_wait_timeout__set__cond(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_mutex_t simcall_cond_wait_timeout__get__mutex(smx_simcall_t simcall){
+  return (smx_mutex_t) simcall->args[1].dp;
+}
+static inline void simcall_cond_wait_timeout__set__mutex(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline double simcall_cond_wait_timeout__get__timeout(smx_simcall_t simcall){
+  return  simcall->args[2].d;
+}
+static inline void simcall_cond_wait_timeout__set__timeout(smx_simcall_t simcall, double arg){
+    simcall->args[2].d = arg;
+}
+static inline smx_cond_t simcall_cond_broadcast__get__cond(smx_simcall_t simcall){
+  return (smx_cond_t) simcall->args[0].dp;
+}
+static inline void simcall_cond_broadcast__set__cond(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline int simcall_sem_init__get__capacity(smx_simcall_t simcall){
+  return  simcall->args[0].i;
+}
+static inline void simcall_sem_init__set__capacity(smx_simcall_t simcall, int arg){
+    simcall->args[0].i = arg;
+}
+static inline smx_sem_t simcall_sem_destroy__get__sem(smx_simcall_t simcall){
+  return (smx_sem_t) simcall->args[0].dp;
+}
+static inline void simcall_sem_destroy__set__sem(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_sem_t simcall_sem_release__get__sem(smx_simcall_t simcall){
+  return (smx_sem_t) simcall->args[0].dp;
+}
+static inline void simcall_sem_release__set__sem(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_sem_t simcall_sem_would_block__get__sem(smx_simcall_t simcall){
+  return (smx_sem_t) simcall->args[0].dp;
+}
+static inline void simcall_sem_would_block__set__sem(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_sem_t simcall_sem_acquire__get__sem(smx_simcall_t simcall){
+  return (smx_sem_t) simcall->args[0].dp;
+}
+static inline void simcall_sem_acquire__set__sem(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_sem_t simcall_sem_acquire_timeout__get__sem(smx_simcall_t simcall){
+  return (smx_sem_t) simcall->args[0].dp;
+}
+static inline void simcall_sem_acquire_timeout__set__sem(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline double simcall_sem_acquire_timeout__get__timeout(smx_simcall_t simcall){
+  return  simcall->args[1].d;
+}
+static inline void simcall_sem_acquire_timeout__set__timeout(smx_simcall_t simcall, double arg){
+    simcall->args[1].d = arg;
+}
+static inline smx_sem_t simcall_sem_get_capacity__get__sem(smx_simcall_t simcall){
+  return (smx_sem_t) simcall->args[0].dp;
+}
+static inline void simcall_sem_get_capacity__set__sem(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_file_t simcall_file_get_data__get__fd(smx_simcall_t simcall){
+  return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_get_data__set__fd(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_file_t simcall_file_set_data__get__fd(smx_simcall_t simcall){
+  return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_set_data__set__fd(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline void* simcall_file_set_data__get__data(smx_simcall_t simcall){
+  return  simcall->args[1].dp;
+}
+static inline void simcall_file_set_data__set__data(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline smx_file_t simcall_file_read__get__fd(smx_simcall_t simcall){
+  return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_read__set__fd(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline sg_size_t simcall_file_read__get__size(smx_simcall_t simcall){
+  return  simcall->args[1].sgsz;
+}
+static inline void simcall_file_read__set__size(smx_simcall_t simcall, sg_size_t arg){
+    simcall->args[1].sgsz = arg;
+}
+static inline smx_file_t simcall_file_write__get__fd(smx_simcall_t simcall){
+  return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_write__set__fd(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline sg_size_t simcall_file_write__get__size(smx_simcall_t simcall){
+  return  simcall->args[1].sgsz;
+}
+static inline void simcall_file_write__set__size(smx_simcall_t simcall, sg_size_t arg){
+    simcall->args[1].sgsz = arg;
+}
+static inline const char* simcall_file_open__get__mount(smx_simcall_t simcall){
+  return  simcall->args[0].cc;
+}
+static inline void simcall_file_open__set__mount(smx_simcall_t simcall, const char* arg){
+    simcall->args[0].cc = arg;
+}
+static inline const char* simcall_file_open__get__path(smx_simcall_t simcall){
+  return  simcall->args[1].cc;
+}
+static inline void simcall_file_open__set__path(smx_simcall_t simcall, const char* arg){
+    simcall->args[1].cc = arg;
+}
+static inline smx_file_t simcall_file_close__get__fd(smx_simcall_t simcall){
+  return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_close__set__fd(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_file_t simcall_file_unlink__get__fd(smx_simcall_t simcall){
+  return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_unlink__set__fd(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline const char* simcall_file_ls__get__mount(smx_simcall_t simcall){
+  return  simcall->args[0].cc;
+}
+static inline void simcall_file_ls__set__mount(smx_simcall_t simcall, const char* arg){
+    simcall->args[0].cc = arg;
+}
+static inline const char* simcall_file_ls__get__path(smx_simcall_t simcall){
+  return  simcall->args[1].cc;
+}
+static inline void simcall_file_ls__set__path(smx_simcall_t simcall, const char* arg){
+    simcall->args[1].cc = arg;
+}
+static inline smx_file_t simcall_file_get_size__get__fd(smx_simcall_t simcall){
+  return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_get_size__set__fd(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_file_t simcall_file_tell__get__fd(smx_simcall_t simcall){
+  return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_tell__set__fd(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_file_t simcall_file_seek__get__fd(smx_simcall_t simcall){
+  return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_seek__set__fd(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline sg_size_t simcall_file_seek__get__offset(smx_simcall_t simcall){
+  return  simcall->args[1].sgsz;
+}
+static inline void simcall_file_seek__set__offset(smx_simcall_t simcall, sg_size_t arg){
+    simcall->args[1].sgsz = arg;
+}
+static inline int simcall_file_seek__get__origin(smx_simcall_t simcall){
+  return  simcall->args[2].i;
+}
+static inline void simcall_file_seek__set__origin(smx_simcall_t simcall, int arg){
+    simcall->args[2].i = arg;
+}
+static inline smx_file_t simcall_file_get_info__get__fd(smx_simcall_t simcall){
+  return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_get_info__set__fd(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_storage_t simcall_storage_file_rename__get__storage(smx_simcall_t simcall){
+  return (smx_storage_t) simcall->args[0].dp;
+}
+static inline void simcall_storage_file_rename__set__storage(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline const char* simcall_storage_file_rename__get__src(smx_simcall_t simcall){
+  return  simcall->args[1].cc;
+}
+static inline void simcall_storage_file_rename__set__src(smx_simcall_t simcall, const char* arg){
+    simcall->args[1].cc = arg;
+}
+static inline const char* simcall_storage_file_rename__get__dest(smx_simcall_t simcall){
+  return  simcall->args[2].cc;
+}
+static inline void simcall_storage_file_rename__set__dest(smx_simcall_t simcall, const char* arg){
+    simcall->args[2].cc = arg;
+}
+static inline const char* simcall_storage_get_free_size__get__name(smx_simcall_t simcall){
+  return  simcall->args[0].cc;
+}
+static inline void simcall_storage_get_free_size__set__name(smx_simcall_t simcall, const char* arg){
+    simcall->args[0].cc = arg;
+}
+static inline const char* simcall_storage_get_used_size__get__name(smx_simcall_t simcall){
+  return  simcall->args[0].cc;
+}
+static inline void simcall_storage_get_used_size__set__name(smx_simcall_t simcall, const char* arg){
+    simcall->args[0].cc = arg;
+}
+static inline smx_storage_t simcall_storage_get_properties__get__storage(smx_simcall_t simcall){
+  return (smx_storage_t) simcall->args[0].dp;
+}
+static inline void simcall_storage_get_properties__set__storage(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_storage_t simcall_storage_get_content__get__storage(smx_simcall_t simcall){
+  return (smx_storage_t) simcall->args[0].dp;
+}
+static inline void simcall_storage_get_content__set__storage(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline const char* simcall_asr_get_properties__get__name(smx_simcall_t simcall){
+  return  simcall->args[0].cc;
+}
+static inline void simcall_asr_get_properties__set__name(smx_simcall_t simcall, const char* arg){
+    simcall->args[0].cc = arg;
+}
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+static inline smx_action_t simcall_comm_is_latency_bounded__get__comm(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_is_latency_bounded__set__comm(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+#endif
+
+#ifdef HAVE_TRACING
+static inline smx_action_t simcall_set_category__get__action(smx_simcall_t simcall){
+  return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_set_category__set__action(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline const char* simcall_set_category__get__category(smx_simcall_t simcall){
+  return  simcall->args[1].cc;
+}
+static inline void simcall_set_category__set__category(smx_simcall_t simcall, const char* arg){
+    simcall->args[1].cc = arg;
+}
+#endif
+
+#ifdef HAVE_MC
+
+static inline void* simcall_mc_compare_snapshots__get__s1(smx_simcall_t simcall){
+  return  simcall->args[0].dp;
+}
+static inline void simcall_mc_compare_snapshots__set__s1(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline void* simcall_mc_compare_snapshots__get__s2(smx_simcall_t simcall){
+  return  simcall->args[1].dp;
+}
+static inline void simcall_mc_compare_snapshots__set__s2(smx_simcall_t simcall, void* arg){
+    simcall->args[1].dp = arg;
+}
+static inline int simcall_mc_random__get__min(smx_simcall_t simcall){
+  return  simcall->args[0].i;
+}
+static inline void simcall_mc_random__set__min(smx_simcall_t simcall, int arg){
+    simcall->args[0].i = arg;
+}
+static inline int simcall_mc_random__get__max(smx_simcall_t simcall){
+  return  simcall->args[1].i;
+}
+static inline void simcall_mc_random__set__max(smx_simcall_t simcall, int arg){
+    simcall->args[1].i = arg;
+}
+#endif
diff --git a/src/simix/simcalls_generated_body.c b/src/simix/simcalls_generated_body.c
new file mode 100644 (file)
index 0000000..b81e906
--- /dev/null
@@ -0,0 +1,1977 @@
+/*********************************************
+ * File Generated by src/simix/simcalls.py   *
+ *                from src/simix/simcalls.in *
+ * Do not modify this file, add new simcalls *
+ * in src/simix/simcalls.in                  *
+ *********************************************/
+
+  inline static smx_host_t simcall_BODY_host_get_by_name(const char* name) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_BY_NAME;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].cc = (const char*) name;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static const char* simcall_BODY_host_get_name(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_NAME;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.cc;
+  }
+  inline static void simcall_BODY_host_on(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_ON;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_host_off(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_OFF;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static xbt_dict_t simcall_BODY_host_get_properties(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_PROPERTIES;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static int simcall_BODY_host_get_core(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_CORE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static xbt_swag_t simcall_BODY_host_get_process_list(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_PROCESS_LIST;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static double simcall_BODY_host_get_speed(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_SPEED;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.d;
+  }
+  inline static double simcall_BODY_host_get_available_speed(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_AVAILABLE_SPEED;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.d;
+  }
+  inline static int simcall_BODY_host_get_state(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_STATE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static double simcall_BODY_host_get_current_power_peak(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_CURRENT_POWER_PEAK;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.d;
+  }
+  inline static double simcall_BODY_host_get_power_peak_at(smx_host_t host, int pstate_index) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_POWER_PEAK_AT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    self->simcall.args[1].i = (int) pstate_index;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.d;
+  }
+  inline static int simcall_BODY_host_get_nb_pstates(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_NB_PSTATES;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static void simcall_BODY_host_set_power_peak_at(smx_host_t host, int pstate_index) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_SET_POWER_PEAK_AT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    self->simcall.args[1].i = (int) pstate_index;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static double simcall_BODY_host_get_consumed_energy(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_CONSUMED_ENERGY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.d;
+  }
+  inline static smx_action_t simcall_BODY_host_execute(const char* name, smx_host_t host, double computation_amount, double priority, double bound, unsigned long affinity_mask) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_EXECUTE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].cc = (const char*) name;
+    self->simcall.args[1].dp = (void*) host;
+    self->simcall.args[2].d = (double) computation_amount;
+    self->simcall.args[3].d = (double) priority;
+    self->simcall.args[4].d = (double) bound;
+    self->simcall.args[5].ul = (unsigned long) affinity_mask;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static smx_action_t simcall_BODY_host_parallel_execute(const char* name, int host_nb, smx_host_t* host_list, double* computation_amount, double* communication_amount, double amount, double rate) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_PARALLEL_EXECUTE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].cc = (const char*) name;
+    self->simcall.args[1].i = (int) host_nb;
+    self->simcall.args[2].dp = (void*) host_list;
+    self->simcall.args[3].dp = (void*) computation_amount;
+    self->simcall.args[4].dp = (void*) communication_amount;
+    self->simcall.args[5].d = (double) amount;
+    self->simcall.args[6].d = (double) rate;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_host_execution_destroy(smx_action_t execution) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_EXECUTION_DESTROY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) execution;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_host_execution_cancel(smx_action_t execution) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_EXECUTION_CANCEL;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) execution;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static double simcall_BODY_host_execution_get_remains(smx_action_t execution) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_EXECUTION_GET_REMAINS;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) execution;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.d;
+  }
+  inline static int simcall_BODY_host_execution_get_state(smx_action_t execution) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_EXECUTION_GET_STATE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) execution;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static void simcall_BODY_host_execution_set_priority(smx_action_t execution, double priority) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_EXECUTION_SET_PRIORITY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) execution;
+    self->simcall.args[1].d = (double) priority;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_host_execution_set_bound(smx_action_t execution, double bound) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_EXECUTION_SET_BOUND;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) execution;
+    self->simcall.args[1].d = (double) bound;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_host_execution_set_affinity(smx_action_t execution, smx_host_t ws, unsigned long mask) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_EXECUTION_SET_AFFINITY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) execution;
+    self->simcall.args[1].dp = (void*) ws;
+    self->simcall.args[2].ul = (unsigned long) mask;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static int simcall_BODY_host_execution_wait(smx_action_t execution) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_EXECUTION_WAIT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) execution;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static xbt_dict_t simcall_BODY_host_get_storage_list(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_STORAGE_LIST;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_host_get_params(smx_host_t ind_vm, ws_params_t params) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_PARAMS;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    self->simcall.args[1].dp = (void*) params;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_host_set_params(smx_host_t ind_vm, ws_params_t params) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_SET_PARAMS;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    self->simcall.args[1].dp = (void*) params;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void* simcall_BODY_vm_create(const char* name, smx_host_t ind_pm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_CREATE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].cc = (const char*) name;
+    self->simcall.args[1].dp = (void*) ind_pm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_vm_start(smx_host_t ind_vm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_START;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static int simcall_BODY_vm_get_state(smx_host_t ind_vm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_GET_STATE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static void simcall_BODY_vm_migrate(smx_host_t ind_vm, smx_host_t ind_dst_pm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_MIGRATE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    self->simcall.args[1].dp = (void*) ind_dst_pm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void* simcall_BODY_vm_get_pm(smx_host_t ind_vm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_GET_PM;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_vm_set_bound(smx_host_t ind_vm, double bound) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_SET_BOUND;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    self->simcall.args[1].d = (double) bound;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_vm_set_affinity(smx_host_t ind_vm, smx_host_t ind_pm, unsigned long mask) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_SET_AFFINITY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    self->simcall.args[1].dp = (void*) ind_pm;
+    self->simcall.args[2].ul = (unsigned long) mask;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_vm_destroy(smx_host_t ind_vm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_DESTROY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_vm_suspend(smx_host_t ind_vm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_SUSPEND;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_vm_resume(smx_host_t ind_vm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_RESUME;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_vm_shutdown(smx_host_t ind_vm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_SHUTDOWN;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_vm_save(smx_host_t ind_vm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_SAVE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_vm_restore(smx_host_t ind_vm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_VM_RESTORE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) ind_vm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_process_create(smx_process_t* process, const char* name, xbt_main_func_t code, void* data, const char* hostname, double kill_time, int argc, char** argv, xbt_dict_t properties, int auto_restart) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_CREATE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    self->simcall.args[1].cc = (const char*) name;
+    self->simcall.args[2].fp = (FPtr) code;
+    self->simcall.args[3].dp = (void*) data;
+    self->simcall.args[4].cc = (const char*) hostname;
+    self->simcall.args[5].d = (double) kill_time;
+    self->simcall.args[6].i = (int) argc;
+    self->simcall.args[7].dp = (void*) argv;
+    self->simcall.args[8].dp = (void*) properties;
+    self->simcall.args[9].i = (int) auto_restart;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_process_kill(smx_process_t process) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_KILL;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_process_killall(int reset_pid) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_KILLALL;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].i = (int) reset_pid;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_process_cleanup(smx_process_t process) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_CLEANUP;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_process_change_host(smx_process_t process, smx_host_t dest) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_CHANGE_HOST;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    self->simcall.args[1].dp = (void*) dest;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_process_suspend(smx_process_t process) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_SUSPEND;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_process_resume(smx_process_t process) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_RESUME;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static int simcall_BODY_process_count() {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_COUNT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static int simcall_BODY_process_get_PID(smx_process_t process) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_GET_PID;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static int simcall_BODY_process_get_PPID(smx_process_t process) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_GET_PPID;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static void* simcall_BODY_process_get_data(smx_process_t process) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_GET_DATA;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_process_set_data(smx_process_t process, void* data) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_SET_DATA;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    self->simcall.args[1].dp = (void*) data;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static smx_host_t simcall_BODY_process_get_host(smx_process_t process) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_GET_HOST;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static const char* simcall_BODY_process_get_name(smx_process_t process) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_GET_NAME;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.cc;
+  }
+  inline static int simcall_BODY_process_is_suspended(smx_process_t process) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_IS_SUSPENDED;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static xbt_dict_t simcall_BODY_process_get_properties(smx_process_t process) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_GET_PROPERTIES;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static int simcall_BODY_process_sleep(double duration) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_SLEEP;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].d = (double) duration;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static void simcall_BODY_process_on_exit(smx_process_t process, int_f_pvoid_t fun, void* data) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_ON_EXIT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    self->simcall.args[1].fp = (FPtr) fun;
+    self->simcall.args[2].dp = (void*) data;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_process_auto_restart_set(smx_process_t process, int auto_restart) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_AUTO_RESTART_SET;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    self->simcall.args[1].i = (int) auto_restart;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static smx_process_t simcall_BODY_process_restart(smx_process_t process) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_PROCESS_RESTART;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) process;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static smx_rdv_t simcall_BODY_rdv_create(const char* name) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_RDV_CREATE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].cc = (const char*) name;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_rdv_destroy(smx_rdv_t rdv) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_RDV_DESTROY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) rdv;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static smx_host_t simcall_BODY_rdv_get_by_name(const char* name) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_RDV_GET_BY_NAME;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].cc = (const char*) name;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static unsigned int simcall_BODY_rdv_comm_count_by_host(smx_rdv_t rdv, smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_RDV_COMM_COUNT_BY_HOST;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) rdv;
+    self->simcall.args[1].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.ui;
+  }
+  inline static smx_action_t simcall_BODY_rdv_get_head(smx_rdv_t rdv) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_RDV_GET_HEAD;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) rdv;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_rdv_set_receiver(smx_rdv_t rdv, smx_process_t receiver) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_RDV_SET_RECEIVER;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) rdv;
+    self->simcall.args[1].dp = (void*) receiver;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static smx_process_t simcall_BODY_rdv_get_receiver(smx_rdv_t rdv) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_RDV_GET_RECEIVER;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) rdv;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static smx_action_t simcall_BODY_comm_iprobe(smx_rdv_t rdv, int src, int tag, simix_match_func_t match_fun, void* data) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_IPROBE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) rdv;
+    self->simcall.args[1].i = (int) src;
+    self->simcall.args[2].i = (int) tag;
+    self->simcall.args[3].fp = (FPtr) match_fun;
+    self->simcall.args[4].dp = (void*) data;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_comm_send(smx_rdv_t rdv, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, void* data, double timeout) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_SEND;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) rdv;
+    self->simcall.args[1].d = (double) task_size;
+    self->simcall.args[2].d = (double) rate;
+    self->simcall.args[3].dp = (void*) src_buff;
+    self->simcall.args[4].sz = (size_t) src_buff_size;
+    self->simcall.args[5].fp = (FPtr) match_fun;
+    self->simcall.args[6].dp = (void*) data;
+    self->simcall.args[7].d = (double) timeout;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static smx_action_t simcall_BODY_comm_isend(smx_rdv_t rdv, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, void* data, int detached) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_ISEND;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) rdv;
+    self->simcall.args[1].d = (double) task_size;
+    self->simcall.args[2].d = (double) rate;
+    self->simcall.args[3].dp = (void*) src_buff;
+    self->simcall.args[4].sz = (size_t) src_buff_size;
+    self->simcall.args[5].fp = (FPtr) match_fun;
+    self->simcall.args[6].fp = (FPtr) clean_fun;
+    self->simcall.args[7].dp = (void*) data;
+    self->simcall.args[8].i = (int) detached;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_comm_recv(smx_rdv_t rdv, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, void* data, double timeout, double rate) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_RECV;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) rdv;
+    self->simcall.args[1].dp = (void*) dst_buff;
+    self->simcall.args[2].dp = (void*) dst_buff_size;
+    self->simcall.args[3].fp = (FPtr) match_fun;
+    self->simcall.args[4].dp = (void*) data;
+    self->simcall.args[5].d = (double) timeout;
+    self->simcall.args[6].d = (double) rate;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static smx_action_t simcall_BODY_comm_irecv(smx_rdv_t rdv, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, void* data, double rate) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_IRECV;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) rdv;
+    self->simcall.args[1].dp = (void*) dst_buff;
+    self->simcall.args[2].dp = (void*) dst_buff_size;
+    self->simcall.args[3].fp = (FPtr) match_fun;
+    self->simcall.args[4].dp = (void*) data;
+    self->simcall.args[5].d = (double) rate;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_comm_cancel(smx_action_t comm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_CANCEL;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) comm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static int simcall_BODY_comm_waitany(xbt_dynar_t comms) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_WAITANY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) comms;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static void simcall_BODY_comm_wait(smx_action_t comm, double timeout) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_WAIT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) comm;
+    self->simcall.args[1].d = (double) timeout;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static int simcall_BODY_comm_test(smx_action_t comm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_TEST;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) comm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static int simcall_BODY_comm_testany(xbt_dynar_t comms) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_TESTANY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) comms;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static double simcall_BODY_comm_get_remains(smx_action_t comm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_GET_REMAINS;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) comm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.d;
+  }
+  inline static int simcall_BODY_comm_get_state(smx_action_t comm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_GET_STATE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) comm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static void* simcall_BODY_comm_get_src_data(smx_action_t comm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_GET_SRC_DATA;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) comm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void* simcall_BODY_comm_get_dst_data(smx_action_t comm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_GET_DST_DATA;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) comm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static smx_process_t simcall_BODY_comm_get_src_proc(smx_action_t comm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_GET_SRC_PROC;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) comm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static smx_process_t simcall_BODY_comm_get_dst_proc(smx_action_t comm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_GET_DST_PROC;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) comm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static smx_mutex_t simcall_BODY_mutex_init() {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_MUTEX_INIT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_mutex_destroy(smx_mutex_t mutex) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_MUTEX_DESTROY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) mutex;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_mutex_lock(smx_mutex_t mutex) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_MUTEX_LOCK;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) mutex;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static int simcall_BODY_mutex_trylock(smx_mutex_t mutex) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_MUTEX_TRYLOCK;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) mutex;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static void simcall_BODY_mutex_unlock(smx_mutex_t mutex) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_MUTEX_UNLOCK;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) mutex;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static smx_cond_t simcall_BODY_cond_init() {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COND_INIT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_cond_destroy(smx_cond_t cond) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COND_DESTROY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) cond;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_cond_signal(smx_cond_t cond) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COND_SIGNAL;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) cond;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_cond_wait(smx_cond_t cond, smx_mutex_t mutex) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COND_WAIT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) cond;
+    self->simcall.args[1].dp = (void*) mutex;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COND_WAIT_TIMEOUT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) cond;
+    self->simcall.args[1].dp = (void*) mutex;
+    self->simcall.args[2].d = (double) timeout;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_cond_broadcast(smx_cond_t cond) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COND_BROADCAST;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) cond;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static smx_sem_t simcall_BODY_sem_init(int capacity) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_SEM_INIT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].i = (int) capacity;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_sem_destroy(smx_sem_t sem) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_SEM_DESTROY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) sem;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_sem_release(smx_sem_t sem) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_SEM_RELEASE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) sem;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static int simcall_BODY_sem_would_block(smx_sem_t sem) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_SEM_WOULD_BLOCK;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) sem;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static void simcall_BODY_sem_acquire(smx_sem_t sem) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_SEM_ACQUIRE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) sem;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static void simcall_BODY_sem_acquire_timeout(smx_sem_t sem, double timeout) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_SEM_ACQUIRE_TIMEOUT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) sem;
+    self->simcall.args[1].d = (double) timeout;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static int simcall_BODY_sem_get_capacity(smx_sem_t sem) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_SEM_GET_CAPACITY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) sem;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static void* simcall_BODY_file_get_data(smx_file_t fd) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_FILE_GET_DATA;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) fd;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_file_set_data(smx_file_t fd, void* data) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_FILE_SET_DATA;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) fd;
+    self->simcall.args[1].dp = (void*) data;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static sg_size_t simcall_BODY_file_read(smx_file_t fd, sg_size_t size) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_FILE_READ;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) fd;
+    self->simcall.args[1].sgsz = (sg_size_t) size;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.sgsz;
+  }
+  inline static sg_size_t simcall_BODY_file_write(smx_file_t fd, sg_size_t size) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_FILE_WRITE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) fd;
+    self->simcall.args[1].sgsz = (sg_size_t) size;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.sgsz;
+  }
+  inline static smx_file_t simcall_BODY_file_open(const char* mount, const char* path) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_FILE_OPEN;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].cc = (const char*) mount;
+    self->simcall.args[1].cc = (const char*) path;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static int simcall_BODY_file_close(smx_file_t fd) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_FILE_CLOSE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) fd;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static int simcall_BODY_file_unlink(smx_file_t fd) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_FILE_UNLINK;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) fd;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static xbt_dict_t simcall_BODY_file_ls(const char* mount, const char* path) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_FILE_LS;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].cc = (const char*) mount;
+    self->simcall.args[1].cc = (const char*) path;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static sg_size_t simcall_BODY_file_get_size(smx_file_t fd) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_FILE_GET_SIZE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) fd;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.sgsz;
+  }
+  inline static sg_size_t simcall_BODY_file_tell(smx_file_t fd) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_FILE_TELL;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) fd;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.sgsz;
+  }
+  inline static int simcall_BODY_file_seek(smx_file_t fd, sg_size_t offset, int origin) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_FILE_SEEK;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) fd;
+    self->simcall.args[1].sgsz = (sg_size_t) offset;
+    self->simcall.args[2].i = (int) origin;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static xbt_dynar_t simcall_BODY_file_get_info(smx_file_t fd) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_FILE_GET_INFO;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) fd;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static void simcall_BODY_storage_file_rename(smx_storage_t storage, const char* src, const char* dest) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_STORAGE_FILE_RENAME;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) storage;
+    self->simcall.args[1].cc = (const char*) src;
+    self->simcall.args[2].cc = (const char*) dest;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+  inline static sg_size_t simcall_BODY_storage_get_free_size(const char* name) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_STORAGE_GET_FREE_SIZE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].cc = (const char*) name;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.sgsz;
+  }
+  inline static sg_size_t simcall_BODY_storage_get_used_size(const char* name) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_STORAGE_GET_USED_SIZE;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].cc = (const char*) name;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.sgsz;
+  }
+  inline static xbt_dict_t simcall_BODY_storage_get_properties(smx_storage_t storage) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_STORAGE_GET_PROPERTIES;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) storage;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static xbt_dict_t simcall_BODY_storage_get_content(smx_storage_t storage) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_STORAGE_GET_CONTENT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) storage;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static xbt_dict_t simcall_BODY_asr_get_properties(const char* name) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_ASR_GET_PROPERTIES;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].cc = (const char*) name;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+  inline static int simcall_BODY_comm_is_latency_bounded(smx_action_t comm) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_COMM_IS_LATENCY_BOUNDED;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) comm;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+#endif
+
+#ifdef HAVE_TRACING
+  inline static void simcall_BODY_set_category(smx_action_t action, const char* category) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_SET_CATEGORY;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) action;
+    self->simcall.args[1].cc = (const char*) category;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    
+  }
+#endif
+
+#ifdef HAVE_MC
+  inline static void* simcall_BODY_mc_snapshot() {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_MC_SNAPSHOT;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static int simcall_BODY_mc_compare_snapshots(void* s1, void* s2) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_MC_COMPARE_SNAPSHOTS;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) s1;
+    self->simcall.args[1].dp = (void*) s2;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+  inline static int simcall_BODY_mc_random(int min, int max) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_MC_RANDOM;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].i = (int) min;
+    self->simcall.args[1].i = (int) max;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.i;
+  }
+#endif
diff --git a/src/simix/simcalls_generated_case.c b/src/simix/simcalls_generated_case.c
new file mode 100644 (file)
index 0000000..1fc92a5
--- /dev/null
@@ -0,0 +1,621 @@
+/*********************************************
+ * File Generated by src/simix/simcalls.py   *
+ *                from src/simix/simcalls.in *
+ * Do not modify this file, add new simcalls *
+ * in src/simix/simcalls.in                  *
+ *********************************************/
+
+case SIMCALL_HOST_GET_BY_NAME:
+      simcall->result.dp = SIMIX_pre_host_get_by_name(simcall ,  simcall->args[0].cc);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_NAME:
+      simcall->result.cc = SIMIX_pre_host_get_name(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_ON:
+       SIMIX_pre_host_on(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_OFF:
+       SIMIX_pre_host_off(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_PROPERTIES:
+      simcall->result.dp = SIMIX_pre_host_get_properties(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_CORE:
+      simcall->result.i = SIMIX_pre_host_get_core(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_PROCESS_LIST:
+      simcall->result.dp = SIMIX_pre_host_get_process_list(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_SPEED:
+      simcall->result.d = SIMIX_pre_host_get_speed(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_AVAILABLE_SPEED:
+      simcall->result.d = SIMIX_pre_host_get_available_speed(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_STATE:
+      simcall->result.i = SIMIX_pre_host_get_state(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_CURRENT_POWER_PEAK:
+      simcall->result.d = SIMIX_pre_host_get_current_power_peak(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_POWER_PEAK_AT:
+      simcall->result.d = SIMIX_pre_host_get_power_peak_at(simcall , (smx_host_t) simcall->args[0].dp,  simcall->args[1].i);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_NB_PSTATES:
+      simcall->result.i = SIMIX_pre_host_get_nb_pstates(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_SET_POWER_PEAK_AT:
+       SIMIX_pre_host_set_power_peak_at(simcall , (smx_host_t) simcall->args[0].dp,  simcall->args[1].i);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_CONSUMED_ENERGY:
+      simcall->result.d = SIMIX_pre_host_get_consumed_energy(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_EXECUTE:
+      simcall->result.dp = SIMIX_pre_host_execute(simcall ,  simcall->args[0].cc, (smx_host_t) simcall->args[1].dp,  simcall->args[2].d,  simcall->args[3].d,  simcall->args[4].d,  simcall->args[5].ul);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_PARALLEL_EXECUTE:
+      simcall->result.dp = SIMIX_pre_host_parallel_execute(simcall ,  simcall->args[0].cc,  simcall->args[1].i, (smx_host_t*) simcall->args[2].dp, (double*) simcall->args[3].dp, (double*) simcall->args[4].dp,  simcall->args[5].d,  simcall->args[6].d);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_EXECUTION_DESTROY:
+       SIMIX_pre_host_execution_destroy(simcall , (smx_action_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_EXECUTION_CANCEL:
+       SIMIX_pre_host_execution_cancel(simcall , (smx_action_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_EXECUTION_GET_REMAINS:
+      simcall->result.d = SIMIX_pre_host_execution_get_remains(simcall , (smx_action_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_EXECUTION_GET_STATE:
+      simcall->result.i = SIMIX_pre_host_execution_get_state(simcall , (smx_action_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_EXECUTION_SET_PRIORITY:
+       SIMIX_pre_host_execution_set_priority(simcall , (smx_action_t) simcall->args[0].dp,  simcall->args[1].d);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_EXECUTION_SET_BOUND:
+       SIMIX_pre_host_execution_set_bound(simcall , (smx_action_t) simcall->args[0].dp,  simcall->args[1].d);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_EXECUTION_SET_AFFINITY:
+       SIMIX_pre_host_execution_set_affinity(simcall , (smx_action_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp,  simcall->args[2].ul);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_EXECUTION_WAIT:
+       SIMIX_pre_host_execution_wait(simcall , (smx_action_t) simcall->args[0].dp);
+       break;  
+
+case SIMCALL_HOST_GET_STORAGE_LIST:
+      simcall->result.dp = SIMIX_pre_host_get_storage_list(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_PARAMS:
+       SIMIX_pre_host_get_params(simcall , (smx_host_t) simcall->args[0].dp, (ws_params_t) simcall->args[1].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_SET_PARAMS:
+       SIMIX_pre_host_set_params(simcall , (smx_host_t) simcall->args[0].dp, (ws_params_t) simcall->args[1].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_CREATE:
+      simcall->result.dp = SIMIX_pre_vm_create(simcall ,  simcall->args[0].cc, (smx_host_t) simcall->args[1].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_START:
+       SIMIX_pre_vm_start(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_GET_STATE:
+      simcall->result.i = SIMIX_pre_vm_get_state(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_MIGRATE:
+       SIMIX_pre_vm_migrate(simcall , (smx_host_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_GET_PM:
+      simcall->result.dp = SIMIX_pre_vm_get_pm(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_SET_BOUND:
+       SIMIX_pre_vm_set_bound(simcall , (smx_host_t) simcall->args[0].dp,  simcall->args[1].d);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_SET_AFFINITY:
+       SIMIX_pre_vm_set_affinity(simcall , (smx_host_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp,  simcall->args[2].ul);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_DESTROY:
+       SIMIX_pre_vm_destroy(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_SUSPEND:
+       SIMIX_pre_vm_suspend(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_RESUME:
+       SIMIX_pre_vm_resume(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_SHUTDOWN:
+       SIMIX_pre_vm_shutdown(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_SAVE:
+       SIMIX_pre_vm_save(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_VM_RESTORE:
+       SIMIX_pre_vm_restore(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_CREATE:
+       SIMIX_pre_process_create(simcall , (smx_process_t*) simcall->args[0].dp,  simcall->args[1].cc, (xbt_main_func_t) simcall->args[2].fp,  simcall->args[3].dp,  simcall->args[4].cc,  simcall->args[5].d,  simcall->args[6].i, (char**) simcall->args[7].dp, (xbt_dict_t) simcall->args[8].dp,  simcall->args[9].i);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_KILL:
+       SIMIX_pre_process_kill(simcall , (smx_process_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_KILLALL:
+       SIMIX_pre_process_killall(simcall ,  simcall->args[0].i);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_CLEANUP:
+       SIMIX_pre_process_cleanup(simcall , (smx_process_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_CHANGE_HOST:
+       SIMIX_pre_process_change_host(simcall , (smx_process_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_SUSPEND:
+       SIMIX_pre_process_suspend(simcall , (smx_process_t) simcall->args[0].dp);
+       break;  
+
+case SIMCALL_PROCESS_RESUME:
+       SIMIX_pre_process_resume(simcall , (smx_process_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_COUNT:
+      simcall->result.i = SIMIX_pre_process_count(simcall );
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_GET_PID:
+      simcall->result.i = SIMIX_pre_process_get_PID(simcall , (smx_process_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_GET_PPID:
+      simcall->result.i = SIMIX_pre_process_get_PPID(simcall , (smx_process_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_GET_DATA:
+      simcall->result.dp = SIMIX_pre_process_get_data(simcall , (smx_process_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_SET_DATA:
+       SIMIX_pre_process_set_data(simcall , (smx_process_t) simcall->args[0].dp,  simcall->args[1].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_GET_HOST:
+      simcall->result.dp = SIMIX_pre_process_get_host(simcall , (smx_process_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_GET_NAME:
+      simcall->result.cc = SIMIX_pre_process_get_name(simcall , (smx_process_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_IS_SUSPENDED:
+      simcall->result.i = SIMIX_pre_process_is_suspended(simcall , (smx_process_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_GET_PROPERTIES:
+      simcall->result.dp = SIMIX_pre_process_get_properties(simcall , (smx_process_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_SLEEP:
+       SIMIX_pre_process_sleep(simcall ,  simcall->args[0].d);
+       break;  
+
+case SIMCALL_PROCESS_ON_EXIT:
+       SIMIX_pre_process_on_exit(simcall , (smx_process_t) simcall->args[0].dp, (int_f_pvoid_t) simcall->args[1].fp,  simcall->args[2].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_AUTO_RESTART_SET:
+       SIMIX_pre_process_auto_restart_set(simcall , (smx_process_t) simcall->args[0].dp,  simcall->args[1].i);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_PROCESS_RESTART:
+      simcall->result.dp = SIMIX_pre_process_restart(simcall , (smx_process_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_RDV_CREATE:
+      simcall->result.dp = SIMIX_pre_rdv_create(simcall ,  simcall->args[0].cc);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_RDV_DESTROY:
+       SIMIX_pre_rdv_destroy(simcall , (smx_rdv_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_RDV_GET_BY_NAME:
+      simcall->result.dp = SIMIX_pre_rdv_get_by_name(simcall ,  simcall->args[0].cc);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_RDV_COMM_COUNT_BY_HOST:
+      simcall->result.ui = SIMIX_pre_rdv_comm_count_by_host(simcall , (smx_rdv_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_RDV_GET_HEAD:
+      simcall->result.dp = SIMIX_pre_rdv_get_head(simcall , (smx_rdv_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_RDV_SET_RECEIVER:
+       SIMIX_pre_rdv_set_receiver(simcall , (smx_rdv_t) simcall->args[0].dp, (smx_process_t) simcall->args[1].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_RDV_GET_RECEIVER:
+      simcall->result.dp = SIMIX_pre_rdv_get_receiver(simcall , (smx_rdv_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COMM_IPROBE:
+      simcall->result.dp = SIMIX_pre_comm_iprobe(simcall , (smx_rdv_t) simcall->args[0].dp,  simcall->args[1].i,  simcall->args[2].i, (simix_match_func_t) simcall->args[3].fp,  simcall->args[4].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COMM_SEND:
+       SIMIX_pre_comm_send(simcall , (smx_rdv_t) simcall->args[0].dp,  simcall->args[1].d,  simcall->args[2].d,  simcall->args[3].dp,  simcall->args[4].sz, (simix_match_func_t) simcall->args[5].fp,  simcall->args[6].dp,  simcall->args[7].d);
+       break;  
+
+case SIMCALL_COMM_ISEND:
+      simcall->result.dp = SIMIX_pre_comm_isend(simcall , (smx_rdv_t) simcall->args[0].dp,  simcall->args[1].d,  simcall->args[2].d,  simcall->args[3].dp,  simcall->args[4].sz, (simix_match_func_t) simcall->args[5].fp, (simix_clean_func_t) simcall->args[6].fp,  simcall->args[7].dp,  simcall->args[8].i);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COMM_RECV:
+       SIMIX_pre_comm_recv(simcall , (smx_rdv_t) simcall->args[0].dp,  simcall->args[1].dp, (size_t*) simcall->args[2].dp, (simix_match_func_t) simcall->args[3].fp,  simcall->args[4].dp,  simcall->args[5].d,  simcall->args[6].d);
+       break;  
+
+case SIMCALL_COMM_IRECV:
+      simcall->result.dp = SIMIX_pre_comm_irecv(simcall , (smx_rdv_t) simcall->args[0].dp,  simcall->args[1].dp, (size_t*) simcall->args[2].dp, (simix_match_func_t) simcall->args[3].fp,  simcall->args[4].dp,  simcall->args[5].d);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COMM_CANCEL:
+       SIMIX_pre_comm_cancel(simcall , (smx_action_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COMM_WAITANY:
+       SIMIX_pre_comm_waitany(simcall , (xbt_dynar_t) simcall->args[0].dp);
+       break;  
+
+case SIMCALL_COMM_WAIT:
+       SIMIX_pre_comm_wait(simcall , (smx_action_t) simcall->args[0].dp,  simcall->args[1].d);
+       break;  
+
+case SIMCALL_COMM_TEST:
+       SIMIX_pre_comm_test(simcall , (smx_action_t) simcall->args[0].dp);
+       break;  
+
+case SIMCALL_COMM_TESTANY:
+       SIMIX_pre_comm_testany(simcall , (xbt_dynar_t) simcall->args[0].dp);
+       break;  
+
+case SIMCALL_COMM_GET_REMAINS:
+      simcall->result.d = SIMIX_pre_comm_get_remains(simcall , (smx_action_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COMM_GET_STATE:
+      simcall->result.i = SIMIX_pre_comm_get_state(simcall , (smx_action_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COMM_GET_SRC_DATA:
+      simcall->result.dp = SIMIX_pre_comm_get_src_data(simcall , (smx_action_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COMM_GET_DST_DATA:
+      simcall->result.dp = SIMIX_pre_comm_get_dst_data(simcall , (smx_action_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COMM_GET_SRC_PROC:
+      simcall->result.dp = SIMIX_pre_comm_get_src_proc(simcall , (smx_action_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COMM_GET_DST_PROC:
+      simcall->result.dp = SIMIX_pre_comm_get_dst_proc(simcall , (smx_action_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_MUTEX_INIT:
+      simcall->result.dp = SIMIX_pre_mutex_init(simcall );
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_MUTEX_DESTROY:
+       SIMIX_pre_mutex_destroy(simcall , (smx_mutex_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_MUTEX_LOCK:
+       SIMIX_pre_mutex_lock(simcall , (smx_mutex_t) simcall->args[0].dp);
+       break;  
+
+case SIMCALL_MUTEX_TRYLOCK:
+      simcall->result.i = SIMIX_pre_mutex_trylock(simcall , (smx_mutex_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_MUTEX_UNLOCK:
+       SIMIX_pre_mutex_unlock(simcall , (smx_mutex_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COND_INIT:
+      simcall->result.dp = SIMIX_pre_cond_init(simcall );
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COND_DESTROY:
+       SIMIX_pre_cond_destroy(simcall , (smx_cond_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COND_SIGNAL:
+       SIMIX_pre_cond_signal(simcall , (smx_cond_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_COND_WAIT:
+       SIMIX_pre_cond_wait(simcall , (smx_cond_t) simcall->args[0].dp, (smx_mutex_t) simcall->args[1].dp);
+       break;  
+
+case SIMCALL_COND_WAIT_TIMEOUT:
+       SIMIX_pre_cond_wait_timeout(simcall , (smx_cond_t) simcall->args[0].dp, (smx_mutex_t) simcall->args[1].dp,  simcall->args[2].d);
+       break;  
+
+case SIMCALL_COND_BROADCAST:
+       SIMIX_pre_cond_broadcast(simcall , (smx_cond_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_SEM_INIT:
+      simcall->result.dp = SIMIX_pre_sem_init(simcall ,  simcall->args[0].i);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_SEM_DESTROY:
+       SIMIX_pre_sem_destroy(simcall , (smx_sem_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_SEM_RELEASE:
+       SIMIX_pre_sem_release(simcall , (smx_sem_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_SEM_WOULD_BLOCK:
+      simcall->result.i = SIMIX_pre_sem_would_block(simcall , (smx_sem_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_SEM_ACQUIRE:
+       SIMIX_pre_sem_acquire(simcall , (smx_sem_t) simcall->args[0].dp);
+       break;  
+
+case SIMCALL_SEM_ACQUIRE_TIMEOUT:
+       SIMIX_pre_sem_acquire_timeout(simcall , (smx_sem_t) simcall->args[0].dp,  simcall->args[1].d);
+       break;  
+
+case SIMCALL_SEM_GET_CAPACITY:
+      simcall->result.i = SIMIX_pre_sem_get_capacity(simcall , (smx_sem_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_FILE_GET_DATA:
+      simcall->result.dp = SIMIX_pre_file_get_data(simcall , (smx_file_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_FILE_SET_DATA:
+       SIMIX_pre_file_set_data(simcall , (smx_file_t) simcall->args[0].dp,  simcall->args[1].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_FILE_READ:
+       SIMIX_pre_file_read(simcall , (smx_file_t) simcall->args[0].dp,  simcall->args[1].sgsz);
+       break;  
+
+case SIMCALL_FILE_WRITE:
+       SIMIX_pre_file_write(simcall , (smx_file_t) simcall->args[0].dp,  simcall->args[1].sgsz);
+       break;  
+
+case SIMCALL_FILE_OPEN:
+       SIMIX_pre_file_open(simcall ,  simcall->args[0].cc,  simcall->args[1].cc);
+       break;  
+
+case SIMCALL_FILE_CLOSE:
+       SIMIX_pre_file_close(simcall , (smx_file_t) simcall->args[0].dp);
+       break;  
+
+case SIMCALL_FILE_UNLINK:
+      simcall->result.i = SIMIX_pre_file_unlink(simcall , (smx_file_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_FILE_LS:
+       SIMIX_pre_file_ls(simcall ,  simcall->args[0].cc,  simcall->args[1].cc);
+       break;  
+
+case SIMCALL_FILE_GET_SIZE:
+      simcall->result.sgsz = SIMIX_pre_file_get_size(simcall , (smx_file_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_FILE_TELL:
+      simcall->result.sgsz = SIMIX_pre_file_tell(simcall , (smx_file_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_FILE_SEEK:
+      simcall->result.i = SIMIX_pre_file_seek(simcall , (smx_file_t) simcall->args[0].dp,  simcall->args[1].sgsz,  simcall->args[2].i);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_FILE_GET_INFO:
+      simcall->result.dp = SIMIX_pre_file_get_info(simcall , (smx_file_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_STORAGE_FILE_RENAME:
+       SIMIX_pre_storage_file_rename(simcall , (smx_storage_t) simcall->args[0].dp,  simcall->args[1].cc,  simcall->args[2].cc);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_STORAGE_GET_FREE_SIZE:
+      simcall->result.sgsz = SIMIX_pre_storage_get_free_size(simcall ,  simcall->args[0].cc);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_STORAGE_GET_USED_SIZE:
+      simcall->result.sgsz = SIMIX_pre_storage_get_used_size(simcall ,  simcall->args[0].cc);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_STORAGE_GET_PROPERTIES:
+      simcall->result.dp = SIMIX_pre_storage_get_properties(simcall , (smx_storage_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_STORAGE_GET_CONTENT:
+      simcall->result.dp = SIMIX_pre_storage_get_content(simcall , (smx_storage_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_ASR_GET_PROPERTIES:
+      simcall->result.dp = SIMIX_pre_asr_get_properties(simcall ,  simcall->args[0].cc);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+case SIMCALL_COMM_IS_LATENCY_BOUNDED:
+      simcall->result.i = SIMIX_pre_comm_is_latency_bounded(simcall , (smx_action_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+#endif
+
+#ifdef HAVE_TRACING
+case SIMCALL_SET_CATEGORY:
+       SIMIX_pre_set_category(simcall , (smx_action_t) simcall->args[0].dp,  simcall->args[1].cc);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+#endif
+
+#ifdef HAVE_MC
+case SIMCALL_MC_SNAPSHOT:
+      simcall->result.dp = SIMIX_pre_mc_snapshot(simcall );
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_MC_COMPARE_SNAPSHOTS:
+      simcall->result.i = SIMIX_pre_mc_compare_snapshots(simcall ,  simcall->args[0].dp,  simcall->args[1].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_MC_RANDOM:
+      simcall->result.i = SIMIX_pre_mc_random(simcall ,  simcall->args[0].i,  simcall->args[1].i);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+#endif
diff --git a/src/simix/simcalls_generated_enum.h b/src/simix/simcalls_generated_enum.h
new file mode 100644 (file)
index 0000000..50460e2
--- /dev/null
@@ -0,0 +1,140 @@
+/*********************************************
+ * File Generated by src/simix/simcalls.py   *
+ *                from src/simix/simcalls.in *
+ * Do not modify this file, add new simcalls *
+ * in src/simix/simcalls.in                  *
+ *********************************************/
+
+SIMCALL_HOST_GET_BY_NAME,
+SIMCALL_HOST_GET_NAME,
+SIMCALL_HOST_ON,
+SIMCALL_HOST_OFF,
+SIMCALL_HOST_GET_PROPERTIES,
+SIMCALL_HOST_GET_CORE,
+SIMCALL_HOST_GET_PROCESS_LIST,
+SIMCALL_HOST_GET_SPEED,
+SIMCALL_HOST_GET_AVAILABLE_SPEED,
+SIMCALL_HOST_GET_STATE,
+SIMCALL_HOST_GET_CURRENT_POWER_PEAK,
+SIMCALL_HOST_GET_POWER_PEAK_AT,
+SIMCALL_HOST_GET_NB_PSTATES,
+SIMCALL_HOST_SET_POWER_PEAK_AT,
+SIMCALL_HOST_GET_CONSUMED_ENERGY,
+SIMCALL_HOST_EXECUTE,
+SIMCALL_HOST_PARALLEL_EXECUTE,
+SIMCALL_HOST_EXECUTION_DESTROY,
+SIMCALL_HOST_EXECUTION_CANCEL,
+SIMCALL_HOST_EXECUTION_GET_REMAINS,
+SIMCALL_HOST_EXECUTION_GET_STATE,
+SIMCALL_HOST_EXECUTION_SET_PRIORITY,
+SIMCALL_HOST_EXECUTION_SET_BOUND,
+SIMCALL_HOST_EXECUTION_SET_AFFINITY,
+SIMCALL_HOST_EXECUTION_WAIT,
+SIMCALL_HOST_GET_STORAGE_LIST,
+SIMCALL_HOST_GET_PARAMS,
+SIMCALL_HOST_SET_PARAMS,
+SIMCALL_VM_CREATE,
+SIMCALL_VM_START,
+SIMCALL_VM_GET_STATE,
+SIMCALL_VM_MIGRATE,
+SIMCALL_VM_GET_PM,
+SIMCALL_VM_SET_BOUND,
+SIMCALL_VM_SET_AFFINITY,
+SIMCALL_VM_DESTROY,
+SIMCALL_VM_SUSPEND,
+SIMCALL_VM_RESUME,
+SIMCALL_VM_SHUTDOWN,
+SIMCALL_VM_SAVE,
+SIMCALL_VM_RESTORE,
+SIMCALL_PROCESS_CREATE,
+SIMCALL_PROCESS_KILL,
+SIMCALL_PROCESS_KILLALL,
+SIMCALL_PROCESS_CLEANUP,
+SIMCALL_PROCESS_CHANGE_HOST,
+SIMCALL_PROCESS_SUSPEND,
+SIMCALL_PROCESS_RESUME,
+SIMCALL_PROCESS_COUNT,
+SIMCALL_PROCESS_GET_PID,
+SIMCALL_PROCESS_GET_PPID,
+SIMCALL_PROCESS_GET_DATA,
+SIMCALL_PROCESS_SET_DATA,
+SIMCALL_PROCESS_GET_HOST,
+SIMCALL_PROCESS_GET_NAME,
+SIMCALL_PROCESS_IS_SUSPENDED,
+SIMCALL_PROCESS_GET_PROPERTIES,
+SIMCALL_PROCESS_SLEEP,
+SIMCALL_PROCESS_ON_EXIT,
+SIMCALL_PROCESS_AUTO_RESTART_SET,
+SIMCALL_PROCESS_RESTART,
+SIMCALL_RDV_CREATE,
+SIMCALL_RDV_DESTROY,
+SIMCALL_RDV_GET_BY_NAME,
+SIMCALL_RDV_COMM_COUNT_BY_HOST,
+SIMCALL_RDV_GET_HEAD,
+SIMCALL_RDV_SET_RECEIVER,
+SIMCALL_RDV_GET_RECEIVER,
+SIMCALL_COMM_IPROBE,
+SIMCALL_COMM_SEND,
+SIMCALL_COMM_ISEND,
+SIMCALL_COMM_RECV,
+SIMCALL_COMM_IRECV,
+SIMCALL_COMM_CANCEL,
+SIMCALL_COMM_WAITANY,
+SIMCALL_COMM_WAIT,
+SIMCALL_COMM_TEST,
+SIMCALL_COMM_TESTANY,
+SIMCALL_COMM_GET_REMAINS,
+SIMCALL_COMM_GET_STATE,
+SIMCALL_COMM_GET_SRC_DATA,
+SIMCALL_COMM_GET_DST_DATA,
+SIMCALL_COMM_GET_SRC_PROC,
+SIMCALL_COMM_GET_DST_PROC,
+SIMCALL_MUTEX_INIT,
+SIMCALL_MUTEX_DESTROY,
+SIMCALL_MUTEX_LOCK,
+SIMCALL_MUTEX_TRYLOCK,
+SIMCALL_MUTEX_UNLOCK,
+SIMCALL_COND_INIT,
+SIMCALL_COND_DESTROY,
+SIMCALL_COND_SIGNAL,
+SIMCALL_COND_WAIT,
+SIMCALL_COND_WAIT_TIMEOUT,
+SIMCALL_COND_BROADCAST,
+SIMCALL_SEM_INIT,
+SIMCALL_SEM_DESTROY,
+SIMCALL_SEM_RELEASE,
+SIMCALL_SEM_WOULD_BLOCK,
+SIMCALL_SEM_ACQUIRE,
+SIMCALL_SEM_ACQUIRE_TIMEOUT,
+SIMCALL_SEM_GET_CAPACITY,
+SIMCALL_FILE_GET_DATA,
+SIMCALL_FILE_SET_DATA,
+SIMCALL_FILE_READ,
+SIMCALL_FILE_WRITE,
+SIMCALL_FILE_OPEN,
+SIMCALL_FILE_CLOSE,
+SIMCALL_FILE_UNLINK,
+SIMCALL_FILE_LS,
+SIMCALL_FILE_GET_SIZE,
+SIMCALL_FILE_TELL,
+SIMCALL_FILE_SEEK,
+SIMCALL_FILE_GET_INFO,
+SIMCALL_STORAGE_FILE_RENAME,
+SIMCALL_STORAGE_GET_FREE_SIZE,
+SIMCALL_STORAGE_GET_USED_SIZE,
+SIMCALL_STORAGE_GET_PROPERTIES,
+SIMCALL_STORAGE_GET_CONTENT,
+SIMCALL_ASR_GET_PROPERTIES,
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+SIMCALL_COMM_IS_LATENCY_BOUNDED,
+#endif
+
+#ifdef HAVE_TRACING
+SIMCALL_SET_CATEGORY,
+#endif
+
+#ifdef HAVE_MC
+SIMCALL_MC_SNAPSHOT,
+SIMCALL_MC_COMPARE_SNAPSHOTS,
+SIMCALL_MC_RANDOM,
+#endif
diff --git a/src/simix/simcalls_generated_res_getter_setter.h b/src/simix/simcalls_generated_res_getter_setter.h
new file mode 100644 (file)
index 0000000..2e051f6
--- /dev/null
@@ -0,0 +1,561 @@
+/*********************************************
+ * File Generated by src/simix/simcalls.py   *
+ *                from src/simix/simcalls.in *
+ * Do not modify this file, add new simcalls *
+ * in src/simix/simcalls.in                  *
+ *********************************************/
+
+static inline smx_host_t simcall_host_get_by_name__get__result(smx_simcall_t simcall){
+  return (smx_host_t) simcall->result.dp;
+}
+static inline void simcall_host_get_by_name__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline const char* simcall_host_get_name__get__result(smx_simcall_t simcall){
+  return  simcall->result.cc;
+}
+static inline void simcall_host_get_name__set__result(smx_simcall_t simcall, const char* result){
+    simcall->result.cc = result;
+}
+
+
+
+
+static inline xbt_dict_t simcall_host_get_properties__get__result(smx_simcall_t simcall){
+  return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_host_get_properties__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline int simcall_host_get_core__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_host_get_core__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline xbt_swag_t simcall_host_get_process_list__get__result(smx_simcall_t simcall){
+  return (xbt_swag_t) simcall->result.dp;
+}
+static inline void simcall_host_get_process_list__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline double simcall_host_get_speed__get__result(smx_simcall_t simcall){
+  return  simcall->result.d;
+}
+static inline void simcall_host_get_speed__set__result(smx_simcall_t simcall, double result){
+    simcall->result.d = result;
+}
+static inline double simcall_host_get_available_speed__get__result(smx_simcall_t simcall){
+  return  simcall->result.d;
+}
+static inline void simcall_host_get_available_speed__set__result(smx_simcall_t simcall, double result){
+    simcall->result.d = result;
+}
+static inline int simcall_host_get_state__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_host_get_state__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline double simcall_host_get_current_power_peak__get__result(smx_simcall_t simcall){
+  return  simcall->result.d;
+}
+static inline void simcall_host_get_current_power_peak__set__result(smx_simcall_t simcall, double result){
+    simcall->result.d = result;
+}
+static inline double simcall_host_get_power_peak_at__get__result(smx_simcall_t simcall){
+  return  simcall->result.d;
+}
+static inline void simcall_host_get_power_peak_at__set__result(smx_simcall_t simcall, double result){
+    simcall->result.d = result;
+}
+static inline int simcall_host_get_nb_pstates__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_host_get_nb_pstates__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+
+
+static inline double simcall_host_get_consumed_energy__get__result(smx_simcall_t simcall){
+  return  simcall->result.d;
+}
+static inline void simcall_host_get_consumed_energy__set__result(smx_simcall_t simcall, double result){
+    simcall->result.d = result;
+}
+static inline smx_action_t simcall_host_execute__get__result(smx_simcall_t simcall){
+  return (smx_action_t) simcall->result.dp;
+}
+static inline void simcall_host_execute__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline smx_action_t simcall_host_parallel_execute__get__result(smx_simcall_t simcall){
+  return (smx_action_t) simcall->result.dp;
+}
+static inline void simcall_host_parallel_execute__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+
+
+static inline double simcall_host_execution_get_remains__get__result(smx_simcall_t simcall){
+  return  simcall->result.d;
+}
+static inline void simcall_host_execution_get_remains__set__result(smx_simcall_t simcall, double result){
+    simcall->result.d = result;
+}
+static inline int simcall_host_execution_get_state__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_host_execution_get_state__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+
+
+
+
+
+
+static inline int simcall_host_execution_wait__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_host_execution_wait__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline xbt_dict_t simcall_host_get_storage_list__get__result(smx_simcall_t simcall){
+  return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_host_get_storage_list__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+
+
+static inline void* simcall_vm_create__get__result(smx_simcall_t simcall){
+  return  simcall->result.dp;
+}
+static inline void simcall_vm_create__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+static inline int simcall_vm_get_state__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_vm_get_state__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+
+
+static inline void* simcall_vm_get_pm__get__result(smx_simcall_t simcall){
+  return  simcall->result.dp;
+}
+static inline void simcall_vm_get_pm__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+static inline int simcall_process_count__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_process_count__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline int simcall_process_get_PID__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_process_get_PID__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline int simcall_process_get_PPID__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_process_get_PPID__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline void* simcall_process_get_data__get__result(smx_simcall_t simcall){
+  return  simcall->result.dp;
+}
+static inline void simcall_process_get_data__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+static inline smx_host_t simcall_process_get_host__get__result(smx_simcall_t simcall){
+  return (smx_host_t) simcall->result.dp;
+}
+static inline void simcall_process_get_host__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline const char* simcall_process_get_name__get__result(smx_simcall_t simcall){
+  return  simcall->result.cc;
+}
+static inline void simcall_process_get_name__set__result(smx_simcall_t simcall, const char* result){
+    simcall->result.cc = result;
+}
+static inline int simcall_process_is_suspended__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_process_is_suspended__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline xbt_dict_t simcall_process_get_properties__get__result(smx_simcall_t simcall){
+  return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_process_get_properties__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline int simcall_process_sleep__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_process_sleep__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+
+
+
+
+static inline smx_process_t simcall_process_restart__get__result(smx_simcall_t simcall){
+  return (smx_process_t) simcall->result.dp;
+}
+static inline void simcall_process_restart__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline smx_rdv_t simcall_rdv_create__get__result(smx_simcall_t simcall){
+  return (smx_rdv_t) simcall->result.dp;
+}
+static inline void simcall_rdv_create__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+static inline smx_host_t simcall_rdv_get_by_name__get__result(smx_simcall_t simcall){
+  return (smx_host_t) simcall->result.dp;
+}
+static inline void simcall_rdv_get_by_name__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline unsigned int simcall_rdv_comm_count_by_host__get__result(smx_simcall_t simcall){
+  return  simcall->result.ui;
+}
+static inline void simcall_rdv_comm_count_by_host__set__result(smx_simcall_t simcall, unsigned int result){
+    simcall->result.ui = result;
+}
+static inline smx_action_t simcall_rdv_get_head__get__result(smx_simcall_t simcall){
+  return (smx_action_t) simcall->result.dp;
+}
+static inline void simcall_rdv_get_head__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+static inline smx_process_t simcall_rdv_get_receiver__get__result(smx_simcall_t simcall){
+  return (smx_process_t) simcall->result.dp;
+}
+static inline void simcall_rdv_get_receiver__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline smx_action_t simcall_comm_iprobe__get__result(smx_simcall_t simcall){
+  return (smx_action_t) simcall->result.dp;
+}
+static inline void simcall_comm_iprobe__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+static inline smx_action_t simcall_comm_isend__get__result(smx_simcall_t simcall){
+  return (smx_action_t) simcall->result.dp;
+}
+static inline void simcall_comm_isend__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+static inline smx_action_t simcall_comm_irecv__get__result(smx_simcall_t simcall){
+  return (smx_action_t) simcall->result.dp;
+}
+static inline void simcall_comm_irecv__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+static inline int simcall_comm_waitany__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_comm_waitany__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+
+
+static inline int simcall_comm_test__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_comm_test__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline int simcall_comm_testany__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_comm_testany__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline double simcall_comm_get_remains__get__result(smx_simcall_t simcall){
+  return  simcall->result.d;
+}
+static inline void simcall_comm_get_remains__set__result(smx_simcall_t simcall, double result){
+    simcall->result.d = result;
+}
+static inline int simcall_comm_get_state__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_comm_get_state__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline void* simcall_comm_get_src_data__get__result(smx_simcall_t simcall){
+  return  simcall->result.dp;
+}
+static inline void simcall_comm_get_src_data__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline void* simcall_comm_get_dst_data__get__result(smx_simcall_t simcall){
+  return  simcall->result.dp;
+}
+static inline void simcall_comm_get_dst_data__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline smx_process_t simcall_comm_get_src_proc__get__result(smx_simcall_t simcall){
+  return (smx_process_t) simcall->result.dp;
+}
+static inline void simcall_comm_get_src_proc__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline smx_process_t simcall_comm_get_dst_proc__get__result(smx_simcall_t simcall){
+  return (smx_process_t) simcall->result.dp;
+}
+static inline void simcall_comm_get_dst_proc__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline smx_mutex_t simcall_mutex_init__get__result(smx_simcall_t simcall){
+  return (smx_mutex_t) simcall->result.dp;
+}
+static inline void simcall_mutex_init__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+
+
+static inline int simcall_mutex_trylock__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_mutex_trylock__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+
+
+static inline smx_cond_t simcall_cond_init__get__result(smx_simcall_t simcall){
+  return (smx_cond_t) simcall->result.dp;
+}
+static inline void simcall_cond_init__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+
+
+
+
+
+
+
+
+static inline smx_sem_t simcall_sem_init__get__result(smx_simcall_t simcall){
+  return (smx_sem_t) simcall->result.dp;
+}
+static inline void simcall_sem_init__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+
+
+static inline int simcall_sem_would_block__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_sem_would_block__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+
+
+
+
+static inline int simcall_sem_get_capacity__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_sem_get_capacity__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline void* simcall_file_get_data__get__result(smx_simcall_t simcall){
+  return  simcall->result.dp;
+}
+static inline void simcall_file_get_data__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+static inline sg_size_t simcall_file_read__get__result(smx_simcall_t simcall){
+  return  simcall->result.sgsz;
+}
+static inline void simcall_file_read__set__result(smx_simcall_t simcall, sg_size_t result){
+    simcall->result.sgsz = result;
+}
+static inline sg_size_t simcall_file_write__get__result(smx_simcall_t simcall){
+  return  simcall->result.sgsz;
+}
+static inline void simcall_file_write__set__result(smx_simcall_t simcall, sg_size_t result){
+    simcall->result.sgsz = result;
+}
+static inline smx_file_t simcall_file_open__get__result(smx_simcall_t simcall){
+  return (smx_file_t) simcall->result.dp;
+}
+static inline void simcall_file_open__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline int simcall_file_close__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_file_close__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline int simcall_file_unlink__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_file_unlink__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline xbt_dict_t simcall_file_ls__get__result(smx_simcall_t simcall){
+  return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_file_ls__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline sg_size_t simcall_file_get_size__get__result(smx_simcall_t simcall){
+  return  simcall->result.sgsz;
+}
+static inline void simcall_file_get_size__set__result(smx_simcall_t simcall, sg_size_t result){
+    simcall->result.sgsz = result;
+}
+static inline sg_size_t simcall_file_tell__get__result(smx_simcall_t simcall){
+  return  simcall->result.sgsz;
+}
+static inline void simcall_file_tell__set__result(smx_simcall_t simcall, sg_size_t result){
+    simcall->result.sgsz = result;
+}
+static inline int simcall_file_seek__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_file_seek__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline xbt_dynar_t simcall_file_get_info__get__result(smx_simcall_t simcall){
+  return (xbt_dynar_t) simcall->result.dp;
+}
+static inline void simcall_file_get_info__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+
+
+static inline sg_size_t simcall_storage_get_free_size__get__result(smx_simcall_t simcall){
+  return  simcall->result.sgsz;
+}
+static inline void simcall_storage_get_free_size__set__result(smx_simcall_t simcall, sg_size_t result){
+    simcall->result.sgsz = result;
+}
+static inline sg_size_t simcall_storage_get_used_size__get__result(smx_simcall_t simcall){
+  return  simcall->result.sgsz;
+}
+static inline void simcall_storage_get_used_size__set__result(smx_simcall_t simcall, sg_size_t result){
+    simcall->result.sgsz = result;
+}
+static inline xbt_dict_t simcall_storage_get_properties__get__result(smx_simcall_t simcall){
+  return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_storage_get_properties__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline xbt_dict_t simcall_storage_get_content__get__result(smx_simcall_t simcall){
+  return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_storage_get_content__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline xbt_dict_t simcall_asr_get_properties__get__result(smx_simcall_t simcall){
+  return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_asr_get_properties__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+static inline int simcall_comm_is_latency_bounded__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_comm_is_latency_bounded__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+#endif
+
+#ifdef HAVE_TRACING
+
+
+#endif
+
+#ifdef HAVE_MC
+static inline void* simcall_mc_snapshot__get__result(smx_simcall_t simcall){
+  return  simcall->result.dp;
+}
+static inline void simcall_mc_snapshot__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline int simcall_mc_compare_snapshots__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_mc_compare_snapshots__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+static inline int simcall_mc_random__get__result(smx_simcall_t simcall){
+  return  simcall->result.i;
+}
+static inline void simcall_mc_random__set__result(smx_simcall_t simcall, int result){
+    simcall->result.i = result;
+}
+#endif
diff --git a/src/simix/simcalls_generated_string.c b/src/simix/simcalls_generated_string.c
new file mode 100644 (file)
index 0000000..6bbf280
--- /dev/null
@@ -0,0 +1,140 @@
+/*********************************************
+ * File Generated by src/simix/simcalls.py   *
+ *                from src/simix/simcalls.in *
+ * Do not modify this file, add new simcalls *
+ * in src/simix/simcalls.in                  *
+ *********************************************/
+
+[SIMCALL_HOST_GET_BY_NAME] = "SIMCALL_HOST_GET_BY_NAME",
+[SIMCALL_HOST_GET_NAME] = "SIMCALL_HOST_GET_NAME",
+[SIMCALL_HOST_ON] = "SIMCALL_HOST_ON",
+[SIMCALL_HOST_OFF] = "SIMCALL_HOST_OFF",
+[SIMCALL_HOST_GET_PROPERTIES] = "SIMCALL_HOST_GET_PROPERTIES",
+[SIMCALL_HOST_GET_CORE] = "SIMCALL_HOST_GET_CORE",
+[SIMCALL_HOST_GET_PROCESS_LIST] = "SIMCALL_HOST_GET_PROCESS_LIST",
+[SIMCALL_HOST_GET_SPEED] = "SIMCALL_HOST_GET_SPEED",
+[SIMCALL_HOST_GET_AVAILABLE_SPEED] = "SIMCALL_HOST_GET_AVAILABLE_SPEED",
+[SIMCALL_HOST_GET_STATE] = "SIMCALL_HOST_GET_STATE",
+[SIMCALL_HOST_GET_CURRENT_POWER_PEAK] = "SIMCALL_HOST_GET_CURRENT_POWER_PEAK",
+[SIMCALL_HOST_GET_POWER_PEAK_AT] = "SIMCALL_HOST_GET_POWER_PEAK_AT",
+[SIMCALL_HOST_GET_NB_PSTATES] = "SIMCALL_HOST_GET_NB_PSTATES",
+[SIMCALL_HOST_SET_POWER_PEAK_AT] = "SIMCALL_HOST_SET_POWER_PEAK_AT",
+[SIMCALL_HOST_GET_CONSUMED_ENERGY] = "SIMCALL_HOST_GET_CONSUMED_ENERGY",
+[SIMCALL_HOST_EXECUTE] = "SIMCALL_HOST_EXECUTE",
+[SIMCALL_HOST_PARALLEL_EXECUTE] = "SIMCALL_HOST_PARALLEL_EXECUTE",
+[SIMCALL_HOST_EXECUTION_DESTROY] = "SIMCALL_HOST_EXECUTION_DESTROY",
+[SIMCALL_HOST_EXECUTION_CANCEL] = "SIMCALL_HOST_EXECUTION_CANCEL",
+[SIMCALL_HOST_EXECUTION_GET_REMAINS] = "SIMCALL_HOST_EXECUTION_GET_REMAINS",
+[SIMCALL_HOST_EXECUTION_GET_STATE] = "SIMCALL_HOST_EXECUTION_GET_STATE",
+[SIMCALL_HOST_EXECUTION_SET_PRIORITY] = "SIMCALL_HOST_EXECUTION_SET_PRIORITY",
+[SIMCALL_HOST_EXECUTION_SET_BOUND] = "SIMCALL_HOST_EXECUTION_SET_BOUND",
+[SIMCALL_HOST_EXECUTION_SET_AFFINITY] = "SIMCALL_HOST_EXECUTION_SET_AFFINITY",
+[SIMCALL_HOST_EXECUTION_WAIT] = "SIMCALL_HOST_EXECUTION_WAIT",
+[SIMCALL_HOST_GET_STORAGE_LIST] = "SIMCALL_HOST_GET_STORAGE_LIST",
+[SIMCALL_HOST_GET_PARAMS] = "SIMCALL_HOST_GET_PARAMS",
+[SIMCALL_HOST_SET_PARAMS] = "SIMCALL_HOST_SET_PARAMS",
+[SIMCALL_VM_CREATE] = "SIMCALL_VM_CREATE",
+[SIMCALL_VM_START] = "SIMCALL_VM_START",
+[SIMCALL_VM_GET_STATE] = "SIMCALL_VM_GET_STATE",
+[SIMCALL_VM_MIGRATE] = "SIMCALL_VM_MIGRATE",
+[SIMCALL_VM_GET_PM] = "SIMCALL_VM_GET_PM",
+[SIMCALL_VM_SET_BOUND] = "SIMCALL_VM_SET_BOUND",
+[SIMCALL_VM_SET_AFFINITY] = "SIMCALL_VM_SET_AFFINITY",
+[SIMCALL_VM_DESTROY] = "SIMCALL_VM_DESTROY",
+[SIMCALL_VM_SUSPEND] = "SIMCALL_VM_SUSPEND",
+[SIMCALL_VM_RESUME] = "SIMCALL_VM_RESUME",
+[SIMCALL_VM_SHUTDOWN] = "SIMCALL_VM_SHUTDOWN",
+[SIMCALL_VM_SAVE] = "SIMCALL_VM_SAVE",
+[SIMCALL_VM_RESTORE] = "SIMCALL_VM_RESTORE",
+[SIMCALL_PROCESS_CREATE] = "SIMCALL_PROCESS_CREATE",
+[SIMCALL_PROCESS_KILL] = "SIMCALL_PROCESS_KILL",
+[SIMCALL_PROCESS_KILLALL] = "SIMCALL_PROCESS_KILLALL",
+[SIMCALL_PROCESS_CLEANUP] = "SIMCALL_PROCESS_CLEANUP",
+[SIMCALL_PROCESS_CHANGE_HOST] = "SIMCALL_PROCESS_CHANGE_HOST",
+[SIMCALL_PROCESS_SUSPEND] = "SIMCALL_PROCESS_SUSPEND",
+[SIMCALL_PROCESS_RESUME] = "SIMCALL_PROCESS_RESUME",
+[SIMCALL_PROCESS_COUNT] = "SIMCALL_PROCESS_COUNT",
+[SIMCALL_PROCESS_GET_PID] = "SIMCALL_PROCESS_GET_PID",
+[SIMCALL_PROCESS_GET_PPID] = "SIMCALL_PROCESS_GET_PPID",
+[SIMCALL_PROCESS_GET_DATA] = "SIMCALL_PROCESS_GET_DATA",
+[SIMCALL_PROCESS_SET_DATA] = "SIMCALL_PROCESS_SET_DATA",
+[SIMCALL_PROCESS_GET_HOST] = "SIMCALL_PROCESS_GET_HOST",
+[SIMCALL_PROCESS_GET_NAME] = "SIMCALL_PROCESS_GET_NAME",
+[SIMCALL_PROCESS_IS_SUSPENDED] = "SIMCALL_PROCESS_IS_SUSPENDED",
+[SIMCALL_PROCESS_GET_PROPERTIES] = "SIMCALL_PROCESS_GET_PROPERTIES",
+[SIMCALL_PROCESS_SLEEP] = "SIMCALL_PROCESS_SLEEP",
+[SIMCALL_PROCESS_ON_EXIT] = "SIMCALL_PROCESS_ON_EXIT",
+[SIMCALL_PROCESS_AUTO_RESTART_SET] = "SIMCALL_PROCESS_AUTO_RESTART_SET",
+[SIMCALL_PROCESS_RESTART] = "SIMCALL_PROCESS_RESTART",
+[SIMCALL_RDV_CREATE] = "SIMCALL_RDV_CREATE",
+[SIMCALL_RDV_DESTROY] = "SIMCALL_RDV_DESTROY",
+[SIMCALL_RDV_GET_BY_NAME] = "SIMCALL_RDV_GET_BY_NAME",
+[SIMCALL_RDV_COMM_COUNT_BY_HOST] = "SIMCALL_RDV_COMM_COUNT_BY_HOST",
+[SIMCALL_RDV_GET_HEAD] = "SIMCALL_RDV_GET_HEAD",
+[SIMCALL_RDV_SET_RECEIVER] = "SIMCALL_RDV_SET_RECEIVER",
+[SIMCALL_RDV_GET_RECEIVER] = "SIMCALL_RDV_GET_RECEIVER",
+[SIMCALL_COMM_IPROBE] = "SIMCALL_COMM_IPROBE",
+[SIMCALL_COMM_SEND] = "SIMCALL_COMM_SEND",
+[SIMCALL_COMM_ISEND] = "SIMCALL_COMM_ISEND",
+[SIMCALL_COMM_RECV] = "SIMCALL_COMM_RECV",
+[SIMCALL_COMM_IRECV] = "SIMCALL_COMM_IRECV",
+[SIMCALL_COMM_CANCEL] = "SIMCALL_COMM_CANCEL",
+[SIMCALL_COMM_WAITANY] = "SIMCALL_COMM_WAITANY",
+[SIMCALL_COMM_WAIT] = "SIMCALL_COMM_WAIT",
+[SIMCALL_COMM_TEST] = "SIMCALL_COMM_TEST",
+[SIMCALL_COMM_TESTANY] = "SIMCALL_COMM_TESTANY",
+[SIMCALL_COMM_GET_REMAINS] = "SIMCALL_COMM_GET_REMAINS",
+[SIMCALL_COMM_GET_STATE] = "SIMCALL_COMM_GET_STATE",
+[SIMCALL_COMM_GET_SRC_DATA] = "SIMCALL_COMM_GET_SRC_DATA",
+[SIMCALL_COMM_GET_DST_DATA] = "SIMCALL_COMM_GET_DST_DATA",
+[SIMCALL_COMM_GET_SRC_PROC] = "SIMCALL_COMM_GET_SRC_PROC",
+[SIMCALL_COMM_GET_DST_PROC] = "SIMCALL_COMM_GET_DST_PROC",
+[SIMCALL_MUTEX_INIT] = "SIMCALL_MUTEX_INIT",
+[SIMCALL_MUTEX_DESTROY] = "SIMCALL_MUTEX_DESTROY",
+[SIMCALL_MUTEX_LOCK] = "SIMCALL_MUTEX_LOCK",
+[SIMCALL_MUTEX_TRYLOCK] = "SIMCALL_MUTEX_TRYLOCK",
+[SIMCALL_MUTEX_UNLOCK] = "SIMCALL_MUTEX_UNLOCK",
+[SIMCALL_COND_INIT] = "SIMCALL_COND_INIT",
+[SIMCALL_COND_DESTROY] = "SIMCALL_COND_DESTROY",
+[SIMCALL_COND_SIGNAL] = "SIMCALL_COND_SIGNAL",
+[SIMCALL_COND_WAIT] = "SIMCALL_COND_WAIT",
+[SIMCALL_COND_WAIT_TIMEOUT] = "SIMCALL_COND_WAIT_TIMEOUT",
+[SIMCALL_COND_BROADCAST] = "SIMCALL_COND_BROADCAST",
+[SIMCALL_SEM_INIT] = "SIMCALL_SEM_INIT",
+[SIMCALL_SEM_DESTROY] = "SIMCALL_SEM_DESTROY",
+[SIMCALL_SEM_RELEASE] = "SIMCALL_SEM_RELEASE",
+[SIMCALL_SEM_WOULD_BLOCK] = "SIMCALL_SEM_WOULD_BLOCK",
+[SIMCALL_SEM_ACQUIRE] = "SIMCALL_SEM_ACQUIRE",
+[SIMCALL_SEM_ACQUIRE_TIMEOUT] = "SIMCALL_SEM_ACQUIRE_TIMEOUT",
+[SIMCALL_SEM_GET_CAPACITY] = "SIMCALL_SEM_GET_CAPACITY",
+[SIMCALL_FILE_GET_DATA] = "SIMCALL_FILE_GET_DATA",
+[SIMCALL_FILE_SET_DATA] = "SIMCALL_FILE_SET_DATA",
+[SIMCALL_FILE_READ] = "SIMCALL_FILE_READ",
+[SIMCALL_FILE_WRITE] = "SIMCALL_FILE_WRITE",
+[SIMCALL_FILE_OPEN] = "SIMCALL_FILE_OPEN",
+[SIMCALL_FILE_CLOSE] = "SIMCALL_FILE_CLOSE",
+[SIMCALL_FILE_UNLINK] = "SIMCALL_FILE_UNLINK",
+[SIMCALL_FILE_LS] = "SIMCALL_FILE_LS",
+[SIMCALL_FILE_GET_SIZE] = "SIMCALL_FILE_GET_SIZE",
+[SIMCALL_FILE_TELL] = "SIMCALL_FILE_TELL",
+[SIMCALL_FILE_SEEK] = "SIMCALL_FILE_SEEK",
+[SIMCALL_FILE_GET_INFO] = "SIMCALL_FILE_GET_INFO",
+[SIMCALL_STORAGE_FILE_RENAME] = "SIMCALL_STORAGE_FILE_RENAME",
+[SIMCALL_STORAGE_GET_FREE_SIZE] = "SIMCALL_STORAGE_GET_FREE_SIZE",
+[SIMCALL_STORAGE_GET_USED_SIZE] = "SIMCALL_STORAGE_GET_USED_SIZE",
+[SIMCALL_STORAGE_GET_PROPERTIES] = "SIMCALL_STORAGE_GET_PROPERTIES",
+[SIMCALL_STORAGE_GET_CONTENT] = "SIMCALL_STORAGE_GET_CONTENT",
+[SIMCALL_ASR_GET_PROPERTIES] = "SIMCALL_ASR_GET_PROPERTIES",
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+[SIMCALL_COMM_IS_LATENCY_BOUNDED] = "SIMCALL_COMM_IS_LATENCY_BOUNDED",
+#endif
+
+#ifdef HAVE_TRACING
+[SIMCALL_SET_CATEGORY] = "SIMCALL_SET_CATEGORY",
+#endif
+
+#ifdef HAVE_MC
+[SIMCALL_MC_SNAPSHOT] = "SIMCALL_MC_SNAPSHOT",
+[SIMCALL_MC_COMPARE_SNAPSHOTS] = "SIMCALL_MC_COMPARE_SNAPSHOTS",
+[SIMCALL_MC_RANDOM] = "SIMCALL_MC_RANDOM",
+#endif
index 707cf77..214ea71 100644 (file)
@@ -1,6 +1,6 @@
 /* a fast and simple context switching library                              */
 
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 7d386c9..5dc3a74 100644 (file)
@@ -1,12 +1,11 @@
 /* context_base - Code factorization across context switching implementations */
 
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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/function_types.h"
 #include "simgrid/simix.h"
 #include "smx_private.h"
@@ -26,7 +25,7 @@ void smx_ctx_base_factory_init(smx_context_factory_t *factory)
   (*factory)->suspend = NULL;
   (*factory)->runall = NULL;
   (*factory)->self = smx_ctx_base_self;
-  (*factory)->get_data = smx_ctx_base_get_data;
+  (*factory)->get_process = smx_ctx_base_get_process;
 
   (*factory)->name = "base context factory";
 }
@@ -39,11 +38,10 @@ int smx_ctx_base_factory_finalize(smx_context_factory_t * factory)
 }
 
 smx_context_t
-smx_ctx_base_factory_create_context_sized(size_t size,
-                                          xbt_main_func_t code, int argc,
-                                          char **argv,
+smx_ctx_base_factory_create_context_sized(size_t size, xbt_main_func_t code,
+                                          int argc, char **argv,
                                           void_pfn_smxprocess_t cleanup_func,
-                                          void *data)
+                                          smx_process_t process)
 {
   smx_context_t context = xbt_malloc0(size);
 
@@ -62,7 +60,7 @@ smx_ctx_base_factory_create_context_sized(size_t size,
   } else {
     SIMIX_context_set_current(context);
   }
-  context->data = data;
+  context->process = process;
 
   return context;
 }
@@ -88,9 +86,10 @@ void smx_ctx_base_free(smx_context_t context)
 void smx_ctx_base_stop(smx_context_t context)
 {
   if (context->cleanup_func)
-    context->cleanup_func(context->data);
+    context->cleanup_func(context->process);
+  context->process->suspended = 0;
   context->iwannadie = 0;
-  simcall_process_cleanup(context->data);
+  simcall_process_cleanup(context->process);
   context->iwannadie = 1;
 }
 
@@ -99,7 +98,7 @@ smx_context_t smx_ctx_base_self(void)
   return SIMIX_context_get_current();
 }
 
-void *smx_ctx_base_get_data(smx_context_t context)
+smx_process_t smx_ctx_base_get_process(smx_context_t context)
 {
-  return context->data;
+  return context->process;
 }
index 829f47e..d475f6b 100644 (file)
@@ -1,6 +1,6 @@
 /* context_raw - fast context switching inspired from System V ucontexts   */
 
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -210,7 +210,7 @@ static char new_sr = 0;
 static void smx_ctx_raw_wrapper(smx_ctx_raw_t context);
 static int smx_ctx_raw_factory_finalize(smx_context_factory_t *factory);
 static smx_context_t smx_ctx_raw_create_context(xbt_main_func_t code, int argc,
-    char **argv, void_pfn_smxprocess_t cleanup_func, void *data);
+    char **argv, void_pfn_smxprocess_t cleanup_func, smx_process_t process);
 static void smx_ctx_raw_free(smx_context_t context);
 static void smx_ctx_raw_wrapper(smx_ctx_raw_t context);
 static void smx_ctx_raw_stop(smx_context_t context);
@@ -296,12 +296,12 @@ static int smx_ctx_raw_factory_finalize(smx_context_factory_t *factory)
  * \param argv arguments to pass to the main function
  * \param cleanup_func a function to call to free the user data when the
  * context finished
- * \param data user data
+ * \param process SIMIX process
  */
 static smx_context_t
 smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv,
-    void_pfn_smxprocess_t cleanup_func,
-    void *data)
+                           void_pfn_smxprocess_t cleanup_func,
+                           smx_process_t process)
 {
 
   smx_ctx_raw_t context =
@@ -311,7 +311,7 @@ smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv,
           argc,
           argv,
           cleanup_func,
-          data);
+          process);
 
   /* if the user provided a function for the process then use it,
      otherwise it is the context for maestro */
@@ -328,7 +328,7 @@ smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv,
 #endif                          /* HAVE_VALGRIND_VALGRIND_H */
 
      } else {
-       if(data != NULL && raw_maestro_context==NULL)
+       if(process != NULL && raw_maestro_context==NULL)
          raw_maestro_context = context;
 
        if(MC_is_active())
index 3af7b3c..b1906cc 100644 (file)
@@ -1,10 +1,10 @@
 /* context_sysv - context switching with ucontexts from System V           */
 
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. 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 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 <stdarg.h>
 
@@ -51,11 +51,11 @@ smx_ctx_sysv_create_context_sized(size_t structure_size,
                                   xbt_main_func_t code, int argc,
                                   char **argv,
                                   void_pfn_smxprocess_t cleanup_func,
-                                  void *data);
+                                  smx_process_t process);
 static void smx_ctx_sysv_free(smx_context_t context);
 static smx_context_t
 smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv,
-    void_pfn_smxprocess_t cleanup_func, void* data);
+    void_pfn_smxprocess_t cleanup_func, smx_process_t process);
 
 static void smx_ctx_sysv_wrapper(int count, ...);
 
@@ -120,7 +120,7 @@ static smx_context_t
 smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
                                   int argc, char **argv,
                                   void_pfn_smxprocess_t cleanup_func,
-                                  void *data)
+                                  smx_process_t process)
 {
   int ctx_addr[CTX_ADDR_LEN];
   smx_ctx_sysv_t context =
@@ -129,7 +129,7 @@ smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
                                                                  argc,
                                                                  argv,
                                                                  cleanup_func,
-                                                                 data);
+                                                                 process);
 
   /* if the user provided a function for the process then use it,
      otherwise it is the context for maestro */
@@ -166,25 +166,27 @@ smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
               sizeof(smx_ctx_sysv_t), sizeof(int), CTX_ADDR_LEN);
     }
   } else {
-    if(data != NULL && sysv_maestro_context == NULL)
+    if (process != NULL && sysv_maestro_context == NULL)
       sysv_maestro_context = context;
   }
 
   if(MC_is_active() && code)
-    MC_new_stack_area(context, ((smx_process_t)((smx_context_t)context)->data)->name, &(context->uc), size);
+    MC_new_stack_area(context, ((smx_context_t)context)->process->name,
+                      &(context->uc), size);
 
   return (smx_context_t) context;
 }
 
 static smx_context_t
 smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv,
-    void_pfn_smxprocess_t cleanup_func,
-    void *data)
+                            void_pfn_smxprocess_t cleanup_func,
+                            smx_process_t process)
 {
 
-  return smx_ctx_sysv_create_context_sized(sizeof(s_smx_ctx_sysv_t) + smx_context_stack_size,
+  return smx_ctx_sysv_create_context_sized(sizeof(s_smx_ctx_sysv_t) +
+                                           smx_context_stack_size,
                                            code, argc, argv, cleanup_func,
-                                           data);
+                                           process);
 
 }
 
index e254af4..ea06db0 100644 (file)
@@ -1,6 +1,6 @@
 /* context_thread - implementation of context switching with native threads */
 
-/* Copyright (c) 2009-2012. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -25,10 +25,10 @@ typedef struct s_smx_ctx_thread {
 static xbt_os_sem_t smx_ctx_thread_sem;
 
 static smx_context_t
-smx_ctx_thread_factory_create_context(xbt_main_func_t code, int argc,
-                                      char **argv,
+smx_ctx_thread_factory_create_context(xbt_main_func_t code,
+                                      int argc, char **argv,
                                       void_pfn_smxprocess_t cleanup_func,
-                                      void *data);
+                                      smx_process_t process);
 
 static void smx_ctx_thread_free(smx_context_t context);
 static void smx_ctx_thread_stop(smx_context_t context);
@@ -80,12 +80,12 @@ static smx_context_t
 smx_ctx_thread_factory_create_context(xbt_main_func_t code, int argc,
                                       char **argv,
                                       void_pfn_smxprocess_t cleanup_func,
-                                      void *data)
+                                      smx_process_t process)
 {
   smx_ctx_thread_t context = (smx_ctx_thread_t)
       smx_ctx_base_factory_create_context_sized(sizeof(s_smx_ctx_thread_t),
                                                 code, argc, argv,
-                                                cleanup_func, data);
+                                                cleanup_func, process);
 
   /* If the user provided a function for the process then use it
      otherwise is the context for maestro */
index 3b53ec8..894de3c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2009-2013. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -36,6 +36,23 @@ static void parse_process(sg_platf_process_cbarg_t process)
   smx_process_arg_t arg = NULL;
   smx_process_t process_created = NULL;
 
+  arg = xbt_new0(s_smx_process_arg_t, 1);
+  arg->code = parse_code;
+  arg->data = NULL;
+  arg->hostname = sg_host_name(host);
+  arg->argc = process->argc;
+  arg->argv = xbt_new(char *,process->argc);
+  int i;
+  for (i=0; i<process->argc; i++)
+    arg->argv[i] = xbt_strdup(process->argv[i]);
+  arg->name = xbt_strdup(arg->argv[0]);
+  arg->kill_time = kill_time;
+  arg->properties = current_property_set;
+  if (!SIMIX_host_priv(host)->boot_processes) {
+    SIMIX_host_priv(host)->boot_processes = xbt_dynar_new(sizeof(smx_process_arg_t), _SIMIX_host_free_process_arg);
+  }
+  xbt_dynar_push_as(SIMIX_host_priv(host)->boot_processes,smx_process_arg_t,arg);
+
   if (start_time > SIMIX_get_clock()) {
     arg = xbt_new0(s_smx_process_arg_t, 1);
     arg->name = (char*)(process->argv)[0];
@@ -67,7 +84,7 @@ static void parse_process(sg_platf_process_cbarg_t process)
     else
       simcall_process_create(&process_created, (char*)(process->argv)[0], parse_code, NULL, sg_host_name(host), kill_time, process->argc,
           (char**)process->argv, current_property_set,auto_restart);
-
+    
     /* verify if process has been created (won't be the case if the host is currently dead, but that's fine) */
     if (!process_created) {
       return;
index b8655fa..7317c36 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 48127cb..5d2b942 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -215,7 +215,6 @@ void SIMIX_run(void)
 {
   double time = 0;
   smx_process_t process;
-  xbt_swag_t set;
   surf_action_t action;
   smx_timer_t timer;
   surf_model_t model;
@@ -324,14 +323,18 @@ void SIMIX_run(void)
          ((void (*)(void*))timer->func)(timer->args);
        xbt_free(timer);
     }
+
     /* Wake up all processes waiting for a Surf action to finish */
     xbt_dynar_foreach(model_list, iter, model) {
-      set = model->states.failed_action_set;
-      while ((action = xbt_swag_extract(set)))
-        SIMIX_simcall_post((smx_action_t) action->data);
-      set = model->states.done_action_set;
-      while ((action = xbt_swag_extract(set)))
-        SIMIX_simcall_post((smx_action_t) action->data);
+      while ((action = surf_model_extract_failed_action_set(model)))
+
+      SIMIX_simcall_post((smx_action_t) surf_action_get_data(action));
+
+      while ((action = surf_model_extract_done_action_set(model)))
+        if (surf_action_get_data(action) == NULL)
+          XBT_DEBUG("probably vcpu's action %p, skip", action);
+        else
+          SIMIX_simcall_post((smx_action_t) surf_action_get_data(action));
     }
 
     /* Autorestart all process */
@@ -347,6 +350,11 @@ void SIMIX_run(void)
     /* Clean processes to destroy */
     SIMIX_process_empty_trash();
 
+
+    XBT_DEBUG("### time %f, empty %d", time, xbt_dynar_is_empty(simix_global->process_to_run));
+    // !(time == -1.0 && xbt_dynar_is_empty()) 
+
+
   } while (time != -1.0 || !xbt_dynar_is_empty(simix_global->process_to_run));
 
   if (xbt_swag_size(simix_global->process_list) != 0) {
index 2480bbd..2f88f82 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -28,14 +28,93 @@ smx_host_t SIMIX_host_create(const char *name,
   s_smx_process_t proc;
 
   /* Host structure */
-  smx_host->data = data;
   smx_host->process_list =
       xbt_swag_new(xbt_swag_offset(proc, host_proc_hookup));
 
   /* Update global variables */
   xbt_lib_set(host_lib,name,SIMIX_HOST_LEVEL,smx_host);
+  
+  return xbt_lib_get_elm_or_null(host_lib, name);
+}
 
-  return xbt_lib_get_or_null(host_lib, name, SIMIX_HOST_LEVEL);
+void SIMIX_pre_host_on(smx_simcall_t simcall, smx_host_t h)
+{
+  SIMIX_host_on(h);
+}
+
+/**
+ * \brief Start the host if it is off
+ *
+ */
+void SIMIX_host_on(smx_host_t h)
+{
+  smx_host_priv_t host = SIMIX_host_priv(h);
+
+  xbt_assert((host != NULL), "Invalid parameters");
+
+  if (surf_resource_get_state(surf_workstation_resource_priv(h))==SURF_RESOURCE_OFF) {
+       surf_resource_set_state(surf_workstation_resource_priv(h), SURF_RESOURCE_ON);
+    unsigned int cpt;
+    smx_process_arg_t arg;
+    xbt_dynar_foreach(host->boot_processes,cpt,arg) {
+      smx_process_t process;
+
+      XBT_DEBUG("Booting Process %s(%s) right now", arg->argv[0], arg->hostname);
+      if (simix_global->create_process_function) {
+        simix_global->create_process_function(&process,
+                                              arg->argv[0],
+                                              arg->code,
+                                              NULL,
+                                              arg->hostname,
+                                              arg->kill_time,
+                                              arg->argc,
+                                              arg->argv,
+                                              arg->properties,
+                                              arg->auto_restart);
+      }
+      else {
+        simcall_process_create(&process,
+                                              arg->argv[0],
+                                              arg->code,
+                                              NULL,
+                                              arg->hostname,
+                                              arg->kill_time,
+                                              arg->argc,
+                                              arg->argv,
+                                              arg->properties,
+                                              arg->auto_restart);
+      }
+    }
+  }
+}
+
+void SIMIX_pre_host_off(smx_simcall_t simcall, smx_host_t h)
+{
+  SIMIX_host_off(h, simcall->issuer);
+}
+
+/**
+ * \brief Stop the host if it is on
+ *
+ */
+void SIMIX_host_off(smx_host_t h, smx_process_t issuer)
+{
+  smx_host_priv_t host = SIMIX_host_priv(h);
+
+  xbt_assert((host != NULL), "Invalid parameters");
+  
+  if (surf_resource_get_state(surf_workstation_resource_priv(h))==SURF_RESOURCE_OFF) {
+       surf_resource_set_state(surf_workstation_resource_priv(h), SURF_RESOURCE_ON);
+
+    /* Clean Simulator data */
+    if (xbt_swag_size(host->process_list) != 0) {
+      smx_process_t process = NULL;
+      xbt_swag_foreach(process, host->process_list) {
+        SIMIX_process_kill(process, issuer);
+       XBT_DEBUG("Killing %s on %s by %s", process->name,  sg_host_name(process->smx_host), issuer->name);
+      }
+    }
+  }
 }
 
 /**
@@ -64,6 +143,7 @@ void SIMIX_host_destroy(void *h)
     THROWF(arg_error, 0, "%s", msg);
   }
   xbt_dynar_free(&host->auto_restart_processes);
+  xbt_dynar_free(&host->boot_processes);
   xbt_swag_free(host->process_list);
 
   /* Clean host structure */
@@ -135,7 +215,7 @@ xbt_dict_t SIMIX_pre_host_get_properties(smx_simcall_t simcall, smx_host_t host)
 xbt_dict_t SIMIX_host_get_properties(smx_host_t host){
   xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
 
-  return surf_workstation_model->extension.workstation.get_properties(host);
+  return surf_resource_get_properties(surf_workstation_resource_priv(host));
 }
 
 double SIMIX_pre_host_get_speed(smx_simcall_t simcall, smx_host_t host){
@@ -143,9 +223,7 @@ double SIMIX_pre_host_get_speed(smx_simcall_t simcall, smx_host_t host){
 }
 double SIMIX_host_get_speed(smx_host_t host){
   xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
-
-  return surf_workstation_model->extension.workstation.
-      get_speed(host, 1.0);
+  return surf_workstation_get_speed(host, 1.0);
 }
 
 int SIMIX_pre_host_get_core(smx_simcall_t simcall, smx_host_t host){
@@ -154,8 +232,7 @@ int SIMIX_pre_host_get_core(smx_simcall_t simcall, smx_host_t host){
 int SIMIX_host_get_core(smx_host_t host){
   xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
 
-  return surf_workstation_model->extension.workstation.
-      get_core(host);
+  return surf_workstation_get_core(host);
 }
 
 xbt_swag_t SIMIX_pre_host_get_process_list(smx_simcall_t simcall, smx_host_t host){
@@ -176,8 +253,7 @@ double SIMIX_pre_host_get_available_speed(smx_simcall_t simcall, smx_host_t host
 double SIMIX_host_get_available_speed(smx_host_t host){
   xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
 
-  return surf_workstation_model->extension.workstation.
-      get_available_speed(host);
+  return surf_workstation_get_available_speed(host);
 }
 
 double SIMIX_pre_host_get_current_power_peak(smx_simcall_t simcall, smx_host_t host){
@@ -185,8 +261,7 @@ double SIMIX_pre_host_get_current_power_peak(smx_simcall_t simcall, smx_host_t h
 }
 double SIMIX_host_get_current_power_peak(smx_host_t host) {
          xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
-         return surf_workstation_model->extension.workstation.
-                     get_current_power_peak(host);
+         return surf_workstation_get_current_power_peak(host);
 }
 
 double SIMIX_pre_host_get_power_peak_at(smx_simcall_t simcall, smx_host_t host, int pstate_index){
@@ -195,8 +270,7 @@ double SIMIX_pre_host_get_power_peak_at(smx_simcall_t simcall, smx_host_t host,
 double SIMIX_host_get_power_peak_at(smx_host_t host, int pstate_index) {
          xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
 
-         return surf_workstation_model->extension.workstation.
-             get_power_peak_at(host, pstate_index);
+         return surf_workstation_get_power_peak_at(host, pstate_index);
 }
 
 int SIMIX_pre_host_get_nb_pstates(smx_simcall_t simcall, smx_host_t host){
@@ -205,8 +279,7 @@ int SIMIX_pre_host_get_nb_pstates(smx_simcall_t simcall, smx_host_t host){
 int SIMIX_host_get_nb_pstates(smx_host_t host) {
          xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
 
-         return surf_workstation_model->extension.workstation.
-             get_nb_pstates(host);
+         return surf_workstation_get_nb_pstates(host);
 }
 
 
@@ -216,8 +289,7 @@ void SIMIX_pre_host_set_power_peak_at(smx_simcall_t simcall, smx_host_t host, in
 void SIMIX_host_set_power_peak_at(smx_host_t host, int pstate_index) {
          xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
 
-         surf_workstation_model->extension.workstation.
-             set_power_peak_at(host, pstate_index);
+         surf_workstation_set_power_peak_at(host, pstate_index);
 }
 
 double SIMIX_pre_host_get_consumed_energy(smx_simcall_t simcall, smx_host_t host){
@@ -225,8 +297,7 @@ double SIMIX_pre_host_get_consumed_energy(smx_simcall_t simcall, smx_host_t host
 }
 double SIMIX_host_get_consumed_energy(smx_host_t host) {
          xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
-         return surf_workstation_model->extension.workstation.
-                     get_consumed_energy(host);
+         return surf_workstation_get_consumed_energy(host);
 }
 
 int SIMIX_pre_host_get_state(smx_simcall_t simcall, smx_host_t host){
@@ -235,35 +306,10 @@ int SIMIX_pre_host_get_state(smx_simcall_t simcall, smx_host_t host){
 int SIMIX_host_get_state(smx_host_t host){
   xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
 
-  return surf_workstation_model->extension.workstation.
-      get_state(host);
-}
-
-void* SIMIX_pre_host_self_get_data(smx_simcall_t simcall){
-  return SIMIX_host_self_get_data();
-}
-void* SIMIX_host_self_get_data(void)
-{
-  smx_host_t self = SIMIX_host_self();
-  return SIMIX_host_get_data(self);
-}
-
-void SIMIX_host_self_set_data(void *data)
-{
-  smx_host_t self = SIMIX_host_self();
-  SIMIX_host_set_data(self, data);
-}
-
-void* SIMIX_pre_host_get_data(smx_simcall_t simcall,smx_host_t host){
-  return SIMIX_host_get_data(host);
-}
-void* SIMIX_host_get_data(smx_host_t host){
-  xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
-
-  return SIMIX_host_priv(host)->data;
+  return surf_resource_get_state(surf_workstation_resource_priv(host));
 }
 
-static void _SIMIX_host_free_process_arg(void *data)
+void _SIMIX_host_free_process_arg(void *data)
 {
   smx_process_arg_t arg = *(void**)data;
   int i;
@@ -376,22 +422,12 @@ void SIMIX_host_autorestart(smx_host_t host)
     xbt_die("No function for simix_global->autorestart");
 }
 
-void SIMIX_pre_host_set_data(smx_simcall_t simcall, smx_host_t host, void *data) {
-  SIMIX_host_set_data(host, data);
-}
-void SIMIX_host_set_data(smx_host_t host, void *data){
-  xbt_assert((host != NULL), "Invalid parameters");
-  xbt_assert((SIMIX_host_priv(host)->data == NULL), "Data already set");
-
-  SIMIX_host_priv(host)->data = data;
-}
-
 smx_action_t SIMIX_pre_host_execute(smx_simcall_t simcall,const char *name,
-    smx_host_t host, double computation_amount, double priority){
-  return SIMIX_host_execute(name, host, computation_amount, priority);
+    smx_host_t host, double computation_amount, double priority, double bound, unsigned long affinity_mask){
+  return SIMIX_host_execute(name, host, computation_amount, priority, bound, affinity_mask);
 }
 smx_action_t SIMIX_host_execute(const char *name,
-    smx_host_t host, double computation_amount, double priority){
+    smx_host_t host, double computation_amount, double priority, double bound, unsigned long affinity_mask){
 
   /* alloc structures and initialize */
   smx_action_t action = xbt_mallocator_get(simix_global->action_mallocator);
@@ -406,11 +442,24 @@ smx_action_t SIMIX_host_execute(const char *name,
 
   /* set surf's action */
   if (!MC_is_active()) {
-    action->execution.surf_exec =
-      surf_workstation_model->extension.workstation.execute(host,
-    computation_amount);
-    surf_workstation_model->action_data_set(action->execution.surf_exec, action);
-    surf_workstation_model->set_priority(action->execution.surf_exec, priority);
+
+    action->execution.surf_exec = surf_workstation_execute(host, computation_amount);
+    surf_action_set_data(action->execution.surf_exec, action);
+    surf_action_set_priority(action->execution.surf_exec, priority);
+
+    /* Note (hypervisor): for multicore, the bound value being passed to the
+     * surf layer should not be zero (i.e., unlimited). It should be the
+     * capacity of a CPU core. */
+    if (bound == 0)
+      surf_cpu_action_set_bound(action->execution.surf_exec, SIMIX_host_get_speed(host));
+    else
+      surf_cpu_action_set_bound(action->execution.surf_exec, bound);
+
+    if (affinity_mask != 0) {
+      /* just a double check to confirm that this host is the host where this task is running. */
+      xbt_assert(action->execution.host == host);
+      surf_cpu_action_set_affinity(action->execution.surf_exec, host, affinity_mask);
+    }
   }
 
   XBT_DEBUG("Create execute action %p", action);
@@ -447,22 +496,43 @@ smx_action_t SIMIX_host_parallel_execute(const char *name,
   /* set surf's action */
   workstation_list = xbt_new0(void *, host_nb);
   for (i = 0; i < host_nb; i++)
-    workstation_list[i] = host_list[i];
+    workstation_list[i] = surf_workstation_resource_priv(host_list[i]);
+
+
+  /* FIXME: what happens if host_list contains VMs and PMs. If
+   * execute_parallel_task() does not change the state of the model, we can mix
+   * them. */
+  surf_model_t ws_model = surf_resource_model(host_list[0], SURF_WKS_LEVEL);
+  for (i = 1; i < host_nb; i++) {
+    surf_model_t ws_model_tmp = surf_resource_model(host_list[i], SURF_WKS_LEVEL);
+    if (ws_model_tmp != ws_model) {
+      XBT_CRITICAL("mixing VMs and PMs is not supported");
+      DIE_IMPOSSIBLE;
+    }
+  }
 
   /* set surf's action */
   if (!MC_is_active()) {
     action->execution.surf_exec =
-      surf_workstation_model->extension.workstation.
-      execute_parallel_task(host_nb, workstation_list, computation_amount,
-                      communication_amount, rate);
+      surf_workstation_model_execute_parallel_task((surf_workstation_model_t)surf_workstation_model,
+                 host_nb, workstation_list, computation_amount, communication_amount, rate);
 
-    surf_workstation_model->action_data_set(action->execution.surf_exec, action);
+    surf_action_set_data(action->execution.surf_exec, action);
   }
   XBT_DEBUG("Create parallel execute action %p", action);
 
   return action;
 }
 
+//FIXME: REMOVE not used
+static surf_model_t get_ws_model_from_action(smx_action_t action)
+{
+  xbt_assert(action->type == SIMIX_ACTION_EXECUTE);
+  smx_host_t host = action->execution.host;
+  surf_model_t model = surf_resource_model(host, SURF_WKS_LEVEL);
+  return model;
+}
+
 void SIMIX_pre_host_execution_destroy(smx_simcall_t simcall, smx_action_t action){
   SIMIX_host_execution_destroy(action);
 }
@@ -470,7 +540,7 @@ void SIMIX_host_execution_destroy(smx_action_t action){
   XBT_DEBUG("Destroy action %p", action);
 
   if (action->execution.surf_exec) {
-    surf_workstation_model->action_unref(action->execution.surf_exec);
+    surf_action_unref(action->execution.surf_exec);
     action->execution.surf_exec = NULL;
   }
   xbt_free(action->name);
@@ -484,7 +554,7 @@ void SIMIX_host_execution_cancel(smx_action_t action){
   XBT_DEBUG("Cancel action %p", action);
 
   if (action->execution.surf_exec)
-    surf_workstation_model->action_cancel(action->execution.surf_exec);
+    surf_action_cancel(action->execution.surf_exec);
 }
 
 double SIMIX_pre_host_execution_get_remains(smx_simcall_t simcall, smx_action_t action){
@@ -494,7 +564,7 @@ double SIMIX_host_execution_get_remains(smx_action_t action){
   double result = 0.0;
 
   if (action->state == SIMIX_RUNNING)
-    result = surf_workstation_model->get_remains(action->execution.surf_exec);
+    result = surf_action_get_remains(action->execution.surf_exec);
 
   return result;
 }
@@ -508,11 +578,36 @@ e_smx_state_t SIMIX_host_execution_get_state(smx_action_t action){
 
 void SIMIX_pre_host_execution_set_priority(smx_simcall_t simcall, smx_action_t action,
                                        double priority){
-  return SIMIX_host_execution_set_priority(action, priority);
+  SIMIX_host_execution_set_priority(action, priority);
 }
 void SIMIX_host_execution_set_priority(smx_action_t action, double priority){
+
+  if(action->execution.surf_exec)
+       surf_action_set_priority(action->execution.surf_exec, priority);
+}
+
+void SIMIX_pre_host_execution_set_bound(smx_simcall_t simcall, smx_action_t action,
+                                       double bound){
+  SIMIX_host_execution_set_bound(action, bound);
+}
+void SIMIX_host_execution_set_bound(smx_action_t action, double bound){
+
   if(action->execution.surf_exec)
-    surf_workstation_model->set_priority(action->execution.surf_exec, priority);
+       surf_cpu_action_set_bound(action->execution.surf_exec, bound);
+}
+
+void SIMIX_pre_host_execution_set_affinity(smx_simcall_t simcall,
+    smx_action_t action, smx_host_t host, unsigned long mask){
+  SIMIX_host_execution_set_affinity(action, host, mask);
+}
+void SIMIX_host_execution_set_affinity(smx_action_t action, smx_host_t host, unsigned long mask){
+  xbt_assert(action->type == SIMIX_ACTION_EXECUTE);
+
+  if (action->execution.surf_exec) {
+    /* just a double check to confirm that this host is the host where this task is running. */
+    xbt_assert(action->execution.host == host);
+    surf_cpu_action_set_affinity(action->execution.surf_exec, host, mask);
+  }
 }
 
 void SIMIX_pre_host_execution_wait(smx_simcall_t simcall, smx_action_t action){
@@ -538,13 +633,13 @@ void SIMIX_pre_host_execution_wait(smx_simcall_t simcall, smx_action_t action){
 void SIMIX_host_execution_suspend(smx_action_t action)
 {
   if(action->execution.surf_exec)
-    surf_workstation_model->suspend(action->execution.surf_exec);
+    surf_action_suspend(action->execution.surf_exec);
 }
 
 void SIMIX_host_execution_resume(smx_action_t action)
 {
   if(action->execution.surf_exec)
-    surf_workstation_model->resume(action->execution.surf_exec);
+    surf_action_resume(action->execution.surf_exec);
 }
 
 void SIMIX_execution_finish(smx_action_t action)
@@ -577,8 +672,7 @@ void SIMIX_execution_finish(smx_action_t action)
             (int)action->state);
     }
     /* check if the host is down */
-    if (surf_workstation_model->extension.
-        workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) {
+    if (surf_resource_get_state(surf_workstation_resource_priv(simcall->issuer->smx_host)) != SURF_RESOURCE_ON) {
       simcall->issuer->context->iwannadie = 1;
     }
 
@@ -591,15 +685,16 @@ void SIMIX_execution_finish(smx_action_t action)
   SIMIX_host_execution_destroy(action);
 }
 
+
 void SIMIX_post_host_execute(smx_action_t action)
 {
   if (action->type == SIMIX_ACTION_EXECUTE && /* FIMXE: handle resource failure
                                                * for parallel tasks too */
-      surf_workstation_model->extension.workstation.get_state(action->execution.host) == SURF_RESOURCE_OFF) {
+      surf_resource_get_state(surf_workstation_resource_priv(action->execution.host)) == SURF_RESOURCE_OFF) {
     /* If the host running the action failed, notice it so that the asking
      * process can be killed if it runs on that host itself */
     action->state = SIMIX_FAILED;
-  } else if (surf_workstation_model->action_state_get(action->execution.surf_exec) == SURF_ACTION_FAILED) {
+  } else if (surf_action_get_state(action->execution.surf_exec) == SURF_ACTION_FAILED) {
     /* If the host running the action didn't fail, then the action was
      * canceled */
     action->state = SIMIX_CANCELED;
@@ -608,7 +703,7 @@ void SIMIX_post_host_execute(smx_action_t action)
   }
 
   if (action->execution.surf_exec) {
-    surf_workstation_model->action_unref(action->execution.surf_exec);
+    surf_action_unref(action->execution.surf_exec);
     action->execution.surf_exec = NULL;
   }
 
@@ -628,18 +723,47 @@ void SIMIX_set_category(smx_action_t action, const char *category)
 {
   if (action->state != SIMIX_RUNNING) return;
   if (action->type == SIMIX_ACTION_EXECUTE){
-    surf_workstation_model->set_category(action->execution.surf_exec, category);
+    surf_action_set_category(action->execution.surf_exec, category);
   }else if (action->type == SIMIX_ACTION_COMMUNICATE){
-    surf_workstation_model->set_category(action->comm.surf_comm, category);
+    surf_action_set_category(action->comm.surf_comm, category);
   }
 }
 #endif
 
+/**
+ * \brief Function to get the parameters of the given the SIMIX host.
+ *
+ * \param host the host to get_phys_host (a smx_host_t)
+ * \param param the parameter object space to be overwritten (a ws_params_t)
+ */
+void SIMIX_host_get_params(smx_host_t ind_vm, ws_params_t params)
+{
+  /* jump to ws_get_params(). */
+  surf_workstation_get_params(ind_vm, params);
+}
+
+void SIMIX_pre_host_get_params(smx_simcall_t simcall, smx_host_t ind_vm, ws_params_t params)
+{
+  SIMIX_host_get_params(ind_vm, params);
+}
+
+void SIMIX_host_set_params(smx_host_t ind_vm, ws_params_t params)
+{
+  /* jump to ws_set_params(). */
+  surf_workstation_set_params(ind_vm, params);
+}
+
+void SIMIX_pre_host_set_params(smx_simcall_t simcall, smx_host_t ind_vm, ws_params_t params)
+{
+  SIMIX_host_set_params(ind_vm, params);
+}
+
 xbt_dict_t SIMIX_pre_host_get_storage_list(smx_simcall_t simcall, smx_host_t host){
   return SIMIX_host_get_storage_list(host);
 }
+
 xbt_dict_t SIMIX_host_get_storage_list(smx_host_t host){
   xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
 
-  return surf_workstation_model->extension.workstation.get_storage_list(host);
+  return surf_workstation_get_storage_list(host);
 }
index f91d19d..3fe2fa7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 #include "simgrid/simix.h"
 #include "smx_smurf_private.h"
 
+SG_BEGIN_DECL()
+
 /** @brief Host datatype */
 typedef struct s_smx_host_priv {
   xbt_swag_t process_list;
   xbt_dynar_t auto_restart_processes;
-  void *data;              /**< @brief user data */
+  xbt_dynar_t boot_processes; 
 } s_smx_host_priv_t;
 
 static inline smx_host_priv_t SIMIX_host_priv(smx_host_t host){
-  return xbt_lib_get_level(host, SIMIX_HOST_LEVEL);
+  return (smx_host_priv_t) xbt_lib_get_level(host, SIMIX_HOST_LEVEL);
 }
 
-
+void _SIMIX_host_free_process_arg(void *);
 smx_host_t SIMIX_host_create(const char *name, void *workstation, void *data);
 void SIMIX_host_destroy(void *host);
 
@@ -43,13 +45,15 @@ xbt_swag_t SIMIX_host_get_process_list(smx_host_t host);
 double SIMIX_host_get_speed(smx_host_t host);
 double SIMIX_host_get_available_speed(smx_host_t host);
 int SIMIX_host_get_state(smx_host_t host);
+void SIMIX_host_on(smx_host_t host);
+void SIMIX_host_off(smx_host_t host, smx_process_t issuer);
 double SIMIX_host_get_current_power_peak(smx_host_t host);
 double SIMIX_host_get_power_peak_at(smx_host_t host, int pstate_index);
 int SIMIX_host_get_nb_pstates(smx_host_t host);
 double SIMIX_host_get_consumed_energy(smx_host_t host);
 void SIMIX_host_set_power_peak_at(smx_host_t host, int pstate_index);
 smx_action_t SIMIX_host_execute(const char *name,
-    smx_host_t host, double computation_amount, double priority);
+    smx_host_t host, double computation_amount, double priority, double bound, unsigned long affinity_mask);
 smx_action_t SIMIX_host_parallel_execute(const char *name,
     int host_nb, smx_host_t *host_list,
     double *computation_amount, double *communication_amount,
@@ -59,6 +63,8 @@ void SIMIX_host_execution_cancel(smx_action_t action);
 double SIMIX_host_execution_get_remains(smx_action_t action);
 e_smx_state_t SIMIX_host_execution_get_state(smx_action_t action);
 void SIMIX_host_execution_set_priority(smx_action_t action, double priority);
+void SIMIX_host_execution_set_bound(smx_action_t action, double bound);
+void SIMIX_host_execution_set_affinity(smx_action_t action, smx_host_t host, unsigned long mask);
 void SIMIX_pre_host_execution_wait(smx_simcall_t simcall, smx_action_t action);
 xbt_dict_t SIMIX_host_get_storage_list(smx_host_t host);
 
@@ -66,6 +72,8 @@ xbt_dict_t SIMIX_host_get_storage_list(smx_host_t host);
 smx_host_t SIMIX_pre_host_get_by_name(smx_simcall_t, const char*);
 const char* SIMIX_pre_host_self_get_name(smx_simcall_t);
 const char* SIMIX_pre_host_get_name(smx_simcall_t, smx_host_t);
+void SIMIX_pre_host_on(smx_simcall_t, smx_host_t host);
+void SIMIX_pre_host_off(smx_simcall_t, smx_host_t host);
 xbt_dict_t SIMIX_pre_host_get_properties(smx_simcall_t, smx_host_t);
 int SIMIX_pre_host_get_core(smx_simcall_t, smx_host_t);
 xbt_swag_t SIMIX_pre_host_get_process_list(smx_simcall_t, smx_host_t host);
@@ -78,9 +86,7 @@ int SIMIX_pre_host_get_nb_pstates(smx_simcall_t, smx_host_t host);
 void SIMIX_pre_host_set_power_peak_at(smx_simcall_t, smx_host_t host, int pstate_index);
 double SIMIX_pre_host_get_consumed_energy(smx_simcall_t, smx_host_t);
 void* SIMIX_pre_host_self_get_data(smx_simcall_t);
-void* SIMIX_pre_host_get_data(smx_simcall_t, smx_host_t);
-void SIMIX_pre_host_set_data(smx_simcall_t, smx_host_t, void*);
-smx_action_t SIMIX_pre_host_execute(smx_simcall_t, const char*, smx_host_t, double, double);
+smx_action_t SIMIX_pre_host_execute(smx_simcall_t, const char*, smx_host_t, double, double, double, unsigned long);
 smx_action_t SIMIX_pre_host_parallel_execute(smx_simcall_t, const char*, int, smx_host_t*,
                                              double*, double*, double, double);
 void SIMIX_pre_host_execution_destroy(smx_simcall_t, smx_action_t);
@@ -88,6 +94,8 @@ void SIMIX_pre_host_execution_cancel(smx_simcall_t, smx_action_t);
 double SIMIX_pre_host_execution_get_remains(smx_simcall_t, smx_action_t);
 e_smx_state_t SIMIX_pre_host_execution_get_state(smx_simcall_t, smx_action_t);
 void SIMIX_pre_host_execution_set_priority(smx_simcall_t, smx_action_t, double);
+void SIMIX_pre_host_execution_set_bound(smx_simcall_t simcall, smx_action_t action, double bound);
+void SIMIX_pre_host_execution_set_affinity(smx_simcall_t simcall, smx_action_t action, smx_host_t host, unsigned long mask);
 
 void SIMIX_host_execution_suspend(smx_action_t action);
 void SIMIX_host_execution_resume(smx_action_t action);
@@ -99,6 +107,54 @@ void SIMIX_pre_set_category(smx_simcall_t simcall, smx_action_t action,
                            const char *category);
 void SIMIX_set_category(smx_action_t action, const char *category);
 #endif
+/* vm related stuff */
+smx_host_t SIMIX_vm_create(const char *name, smx_host_t ind_phys_host);
+smx_host_t SIMIX_pre_vm_create(smx_simcall_t simcall, const char *name, smx_host_t ind_phys_host);
+
+void SIMIX_vm_destroy(smx_host_t ind_vm);
+void SIMIX_pre_vm_destroy(smx_simcall_t simcall, smx_host_t ind_vm);
+// --
+void SIMIX_vm_resume(smx_host_t ind_vm, smx_process_t issuer);
+void SIMIX_pre_vm_resume(smx_simcall_t simcall, smx_host_t ind_vm);
+
+void SIMIX_vm_suspend(smx_host_t ind_vm, smx_process_t issuer);
+void SIMIX_pre_vm_suspend(smx_simcall_t simcall, smx_host_t ind_vm);
+// --
+void SIMIX_vm_save(smx_host_t ind_vm, smx_process_t issuer);
+void SIMIX_pre_vm_save(smx_simcall_t simcall, smx_host_t ind_vm);
+
+void SIMIX_vm_restore(smx_host_t ind_vm, smx_process_t issuer);
+void SIMIX_pre_vm_restore(smx_simcall_t simcall, smx_host_t ind_vm);
+// --
+void SIMIX_vm_start(smx_host_t ind_vm);
+void SIMIX_pre_vm_start(smx_simcall_t simcall, smx_host_t ind_vm);
+
+void SIMIX_vm_shutdown(smx_host_t ind_vm, smx_process_t issuer);
+void SIMIX_pre_vm_shutdown(smx_simcall_t simcall, smx_host_t ind_vm);
+// --
+
+int SIMIX_vm_get_state(smx_host_t ind_vm);
+int SIMIX_pre_vm_get_state(smx_simcall_t simcall, smx_host_t ind_vm);
+// --
+void SIMIX_vm_migrate(smx_host_t ind_vm, smx_host_t ind_dst_pm);
+void SIMIX_pre_vm_migrate(smx_simcall_t simcall, smx_host_t ind_vm, smx_host_t ind_dst_pm);
+
+void *SIMIX_vm_get_pm(smx_host_t ind_vm);
+void *SIMIX_pre_vm_get_pm(smx_simcall_t simcall, smx_host_t ind_vm);
+
+void SIMIX_vm_set_bound(smx_host_t ind_vm, double bound);
+void SIMIX_pre_vm_set_bound(smx_simcall_t simcall, smx_host_t ind_vm, double bound);
+
+void SIMIX_vm_set_affinity(smx_host_t ind_vm, smx_host_t ind_pm, unsigned long mask);
+void SIMIX_pre_vm_set_affinity(smx_simcall_t simcall, smx_host_t ind_vm, smx_host_t ind_pm, unsigned long mask);
+
+void SIMIX_host_get_params(smx_host_t ind_vm, ws_params_t params);
+void SIMIX_pre_host_get_params(smx_simcall_t simcall, smx_host_t ind_vm, ws_params_t params);
+
+void SIMIX_host_set_params(smx_host_t ind_vm, ws_params_t params);
+void SIMIX_pre_host_set_params(smx_simcall_t simcall, smx_host_t ind_vm, ws_params_t params);
+
+SG_END_DECL()
 
 #endif
 
index 07a354c..f504da4 100644 (file)
@@ -1,11 +1,11 @@
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. 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 "smx_private.h"
-#include "surf/storage_private.h"
+//#include "surf/storage_private.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
 #include "xbt/dict.h"
@@ -29,8 +29,7 @@ smx_storage_t SIMIX_storage_create(const char *name, void *storage, void *data)
 
   /* Update global variables */
   xbt_lib_set(storage_lib,name,SIMIX_STORAGE_LEVEL,smx_storage);
-
-  return xbt_lib_get_or_null(storage_lib, name, SIMIX_STORAGE_LEVEL);
+  return xbt_lib_get_elm_or_null(storage_lib, name);
 }
 
 /**
@@ -71,21 +70,20 @@ void SIMIX_file_set_data(smx_file_t fd, void *data){
 }
 
 //SIMIX FILE READ
-void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_storage_size_t size)
+void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_size_t size)
 {
   smx_action_t action = SIMIX_file_read(simcall->issuer, fd, size);
   xbt_fifo_push(action->simcalls, simcall);
   simcall->issuer->waiting_action = action;
 }
 
-smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_storage_size_t size)
+smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_size_t size)
 {
   smx_action_t action;
   smx_host_t host = process->smx_host;
 
   /* check if the host is active */
-  if (surf_workstation_model->extension.
-      workstation.get_state(host) != SURF_RESOURCE_ON) {
+  if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
            sg_host_name(host));
   }
@@ -98,31 +96,29 @@ smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_storage_si
 #endif
 
   action->io.host = host;
-  action->io.surf_io =
-      surf_workstation_model->extension.workstation.read(host, fd->surf_file, size);
+  action->io.surf_io = surf_workstation_read(host, fd->surf_file, size);
 
-  surf_workstation_model->action_data_set(action->io.surf_io, action);
+  surf_action_set_data(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
 
   return action;
 }
 
 //SIMIX FILE WRITE
-void SIMIX_pre_file_write(smx_simcall_t simcall, smx_file_t fd, sg_storage_size_t size)
+void SIMIX_pre_file_write(smx_simcall_t simcall, smx_file_t fd, sg_size_t size)
 {
   smx_action_t action = SIMIX_file_write(simcall->issuer, fd,  size);
   xbt_fifo_push(action->simcalls, simcall);
   simcall->issuer->waiting_action = action;
 }
 
-smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_storage_size_t size)
+smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_size_t size)
 {
   smx_action_t action;
   smx_host_t host = process->smx_host;
 
   /* check if the host is active */
-  if (surf_workstation_model->extension.
-      workstation.get_state(host) != SURF_RESOURCE_ON) {
+  if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
            sg_host_name(host));
   }
@@ -135,10 +131,9 @@ smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_storage_s
 #endif
 
   action->io.host = host;
-  action->io.surf_io =
-      surf_workstation_model->extension.workstation.write(host, fd->surf_file, size);
+  action->io.surf_io = surf_workstation_write(host, fd->surf_file, size);
 
-  surf_workstation_model->action_data_set(action->io.surf_io, action);
+  surf_action_set_data(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
 
   return action;
@@ -160,8 +155,7 @@ smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount,
   smx_host_t host = process->smx_host;
 
   /* check if the host is active */
-  if (surf_workstation_model->extension.
-      workstation.get_state(host) != SURF_RESOURCE_ON) {
+  if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
            sg_host_name(host));
   }
@@ -174,10 +168,9 @@ smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount,
 #endif
 
   action->io.host = host;
-  action->io.surf_io =
-      surf_workstation_model->extension.workstation.open(host, mount, path);
+  action->io.surf_io = surf_workstation_open(host, mount, path);
 
-  surf_workstation_model->action_data_set(action->io.surf_io, action);
+  surf_action_set_data(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
 
   return action;
@@ -197,8 +190,7 @@ smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fd)
   smx_host_t host = process->smx_host;
 
   /* check if the host is active */
-  if (surf_workstation_model->extension.
-      workstation.get_state(host) != SURF_RESOURCE_ON) {
+  if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
            sg_host_name(host));
   }
@@ -211,9 +203,9 @@ smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fd)
 #endif
 
   action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.close(host, fd->surf_file);
+  action->io.surf_io = surf_workstation_close(host, fd->surf_file);
 
-  surf_workstation_model->action_data_set(action->io.surf_io, action);
+  surf_action_set_data(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
 
   return action;
@@ -230,13 +222,12 @@ int SIMIX_file_unlink(smx_process_t process, smx_file_t fd)
 {
   smx_host_t host = process->smx_host;
   /* check if the host is active */
-  if (surf_workstation_model->extension.
-      workstation.get_state(host) != SURF_RESOURCE_ON) {
+  if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
            sg_host_name(host));
   }
 
-  if (surf_workstation_model->extension.workstation.unlink(host, fd->surf_file)){
+  if (surf_workstation_unlink(host, fd->surf_file)){
     xbt_free(fd);
     return 1;
   } else
@@ -256,7 +247,7 @@ smx_action_t SIMIX_file_ls(smx_process_t process, const char* mount, const char
   smx_action_t action;
   smx_host_t host = process->smx_host;
   /* check if the host is active */
-  if (surf_workstation_model->extension.workstation.get_state(host) != SURF_RESOURCE_ON) {
+  if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
            sg_host_name(host));
   }
@@ -269,25 +260,36 @@ smx_action_t SIMIX_file_ls(smx_process_t process, const char* mount, const char
 #endif
 
   action->io.host = host;
-  action->io.surf_io = surf_workstation_model->extension.workstation.ls(host,mount,path);
+  action->io.surf_io = surf_workstation_ls(host,mount,path);
 
-  surf_workstation_model->action_data_set(action->io.surf_io, action);
+  surf_action_set_data(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
   return action;
 }
 
-sg_storage_size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd)
+sg_size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd)
 {
   return SIMIX_file_get_size(simcall->issuer, fd);
 }
 
-sg_storage_size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd)
+sg_size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd)
+{
+  smx_host_t host = process->smx_host;
+  return  surf_workstation_get_size(host, fd->surf_file);
+}
+
+sg_size_t SIMIX_pre_file_tell(smx_simcall_t simcall, smx_file_t fd)
+{
+  return SIMIX_file_tell(simcall->issuer, fd);
+}
+
+sg_size_t SIMIX_file_tell(smx_process_t process, smx_file_t fd)
 {
   smx_host_t host = process->smx_host;
-  return  surf_workstation_model->extension.workstation.get_size(host,
-      fd->surf_file);
+  return  surf_workstation_file_tell(host, fd->surf_file);
 }
 
+
 xbt_dynar_t SIMIX_pre_file_get_info(smx_simcall_t simcall, smx_file_t fd)
 {
   return SIMIX_file_get_info(simcall->issuer, fd);
@@ -296,30 +298,50 @@ xbt_dynar_t SIMIX_pre_file_get_info(smx_simcall_t simcall, smx_file_t fd)
 xbt_dynar_t SIMIX_file_get_info(smx_process_t process, smx_file_t fd)
 {
   smx_host_t host = process->smx_host;
-  return  surf_workstation_model->extension.workstation.get_info(host,
-      fd->surf_file);
+  return  surf_workstation_get_info(host, fd->surf_file);
+}
+
+int SIMIX_pre_file_seek(smx_simcall_t simcall, smx_file_t fd, sg_size_t offset, int origin)
+{
+  return SIMIX_file_seek(simcall->issuer, fd, offset, origin);
 }
 
-sg_storage_size_t SIMIX_pre_storage_get_free_size(smx_simcall_t simcall, const char* name)
+int SIMIX_file_seek(smx_process_t process, smx_file_t fd, sg_size_t offset, int origin)
+{
+  smx_host_t host = process->smx_host;
+  return  surf_workstation_file_seek(host, fd->surf_file, offset, origin);
+}
+
+void SIMIX_pre_storage_file_rename(smx_simcall_t simcall, smx_storage_t storage, const char* src, const char* dest)
+{
+  return SIMIX_storage_file_rename(simcall->issuer, storage, src, dest);
+}
+
+void SIMIX_storage_file_rename(smx_process_t process, smx_storage_t storage, const char* src, const char* dest)
+{
+  return  surf_storage_rename(storage, src, dest);
+}
+
+sg_size_t SIMIX_pre_storage_get_free_size(smx_simcall_t simcall, const char* name)
 {
   return SIMIX_storage_get_free_size(simcall->issuer, name);
 }
 
-sg_storage_size_t SIMIX_storage_get_free_size(smx_process_t process, const char* name)
+sg_size_t SIMIX_storage_get_free_size(smx_process_t process, const char* name)
 {
   smx_host_t host = process->smx_host;
-  return  surf_workstation_model->extension.workstation.get_free_size(host,name);
+  return  surf_workstation_get_free_size(host, name);
 }
 
-sg_storage_size_t SIMIX_pre_storage_get_used_size(smx_simcall_t simcall, const char* name)
+sg_size_t SIMIX_pre_storage_get_used_size(smx_simcall_t simcall, const char* name)
 {
   return SIMIX_storage_get_used_size(simcall->issuer, name);
 }
 
-sg_storage_size_t SIMIX_storage_get_used_size(smx_process_t process, const char* name)
+sg_size_t SIMIX_storage_get_used_size(smx_process_t process, const char* name)
 {
   smx_host_t host = process->smx_host;
-  return  surf_workstation_model->extension.workstation.get_used_size(host,name);
+  return  surf_workstation_get_used_size(host, name);
 }
 
 xbt_dict_t SIMIX_pre_storage_get_properties(smx_simcall_t simcall, smx_storage_t storage){
@@ -327,7 +349,7 @@ xbt_dict_t SIMIX_pre_storage_get_properties(smx_simcall_t simcall, smx_storage_t
 }
 xbt_dict_t SIMIX_storage_get_properties(smx_storage_t storage){
   xbt_assert((storage != NULL), "Invalid parameters (simix storage is NULL)");
-  return surf_storage_model->extension.storage.get_properties(storage);
+  return surf_resource_get_properties(surf_storage_resource_priv(storage));
 }
 
 const char* SIMIX_pre_storage_get_name(smx_simcall_t simcall, smx_storage_t storage){
@@ -365,12 +387,12 @@ xbt_dict_t SIMIX_pre_storage_get_content(smx_simcall_t simcall, smx_storage_t st
 
 xbt_dict_t SIMIX_storage_get_content(smx_storage_t storage){
   xbt_assert((storage != NULL), "Invalid parameters (simix storage is NULL)");
-  return surf_storage_model->extension.storage.get_content(storage);
+  return surf_storage_get_content(storage);
 }
 
-sg_storage_size_t SIMIX_storage_get_size(smx_storage_t storage){
+sg_size_t SIMIX_storage_get_size(smx_storage_t storage){
   xbt_assert((storage != NULL), "Invalid parameters (simix storage is NULL)");
-  return surf_storage_model->extension.storage.get_size(storage);
+  return surf_storage_get_size(storage);
 }
 
 void SIMIX_post_io(smx_action_t action)
@@ -386,7 +408,7 @@ void SIMIX_post_io(smx_action_t action)
     switch (simcall->call) {
     case SIMCALL_FILE_OPEN:;
       smx_file_t tmp = xbt_new(s_smx_file_t,1);
-      tmp->surf_file = (action->io.surf_io)->file;
+      tmp->surf_file = surf_storage_action_get_file(action->io.surf_io);
       simcall_file_open__set__result(simcall, tmp);
       break;
 
@@ -394,13 +416,12 @@ void SIMIX_post_io(smx_action_t action)
       xbt_free(simcall_file_close__get__fd(simcall));
       simcall_file_close__set__result(simcall, 0);
       break;
-
     case SIMCALL_FILE_WRITE:
-      simcall_file_write__set__result(simcall, (action->io.surf_io)->cost);
+      simcall_file_write__set__result(simcall, surf_action_get_cost(action->io.surf_io));
       break;
 
     case SIMCALL_FILE_READ:
-      simcall_file_read__set__result(simcall, (action->io.surf_io)->cost);
+      simcall_file_read__set__result(simcall, surf_action_get_cost(action->io.surf_io));
       break;
 
     case SIMCALL_FILE_LS:
@@ -412,14 +433,14 @@ void SIMIX_post_io(smx_action_t action)
 //          xbt_dict_set((action->io.surf_io)->ls_dict,key,dst,xbt_free);
 //        }
 //      }
-      simcall_file_ls__set__result(simcall, (action->io.surf_io)->ls_dict);
+      simcall_file_ls__set__result(simcall, surf_storage_action_get_ls_dict(action->io.surf_io));
       break;
     default:
       break;
     }
   }
 
-  switch (surf_workstation_model->action_state_get(action->io.surf_io)) {
+  switch (surf_action_get_state(action->io.surf_io)) {
 
     case SURF_ACTION_FAILED:
       action->state = SIMIX_FAILED;
@@ -441,7 +462,7 @@ void SIMIX_io_destroy(smx_action_t action)
 {
   XBT_DEBUG("Destroy action %p", action);
   if (action->io.surf_io)
-    action->io.surf_io->model_type->action_unref(action->io.surf_io);
+    surf_action_unref(action->io.surf_io);
   xbt_mallocator_release(simix_global->action_mallocator, action);
 }
 
@@ -471,8 +492,7 @@ void SIMIX_io_finish(smx_action_t action)
             (int)action->state);
     }
 
-    if (surf_workstation_model->extension.
-        workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) {
+    if (surf_resource_get_state(surf_workstation_resource_priv(simcall->issuer->smx_host)) != SURF_RESOURCE_ON) {
       simcall->issuer->context->iwannadie = 1;
     }
 
index a3fea00..6bd066e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -24,35 +24,41 @@ smx_storage_t SIMIX_storage_create(const char *name, void *storage, void *data);
 void SIMIX_storage_destroy(void *s);
 void* SIMIX_pre_file_get_data(smx_simcall_t simcall,smx_file_t fd);
 void SIMIX_pre_file_set_data(smx_simcall_t simcall, smx_file_t fd, void *data);
-void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_storage_size_t size);
-void SIMIX_pre_file_write(smx_simcall_t simcall,smx_file_t fd, sg_storage_size_t size);
+void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_size_t size);
+void SIMIX_pre_file_write(smx_simcall_t simcall,smx_file_t fd, sg_size_t size);
 void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount,
                         const char* path);
 void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fd);
 int SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd);
 void SIMIX_pre_file_ls(smx_simcall_t simcall,
                        const char* mount, const char* path);
-sg_storage_size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd);
+sg_size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd);
+sg_size_t SIMIX_pre_file_tell(smx_simcall_t simcall, smx_file_t fd);
 xbt_dynar_t SIMIX_pre_file_get_info(smx_simcall_t simcall, smx_file_t fd);
+int SIMIX_pre_file_seek(smx_simcall_t simcall, smx_file_t fd, sg_size_t offset, int origin);
+void SIMIX_pre_storage_file_rename(smx_simcall_t simcall,smx_storage_t storage, const char* src, const char* dest);
 
 void* SIMIX_file_get_data(smx_file_t fd);
 void SIMIX_file_set_data(smx_file_t fd, void *data);
-smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_storage_size_t size);
-smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_storage_size_t size);
+smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_size_t size);
+smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_size_t size);
 smx_action_t SIMIX_file_open(smx_process_t process, const char* storage,
                              const char* path);
 smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fd);
 int SIMIX_file_unlink(smx_process_t process, smx_file_t fd);
 smx_action_t SIMIX_file_ls(smx_process_t process, const char *mount,
                            const char *path);
-sg_storage_size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd);
+sg_size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd);
+sg_size_t SIMIX_file_tell(smx_process_t process, smx_file_t fd);
 xbt_dynar_t SIMIX_file_get_info(smx_process_t process, smx_file_t fd);
+int SIMIX_file_seek(smx_process_t process, smx_file_t fd, sg_size_t offset, int origin);
 
-sg_storage_size_t SIMIX_pre_storage_get_free_size(smx_simcall_t simcall,const char* name);
-sg_storage_size_t SIMIX_storage_get_free_size(smx_process_t process,const char* name);
+void SIMIX_storage_file_rename(smx_process_t process, smx_storage_t storage, const char* src, const char* dest);
+sg_size_t SIMIX_pre_storage_get_free_size(smx_simcall_t simcall,const char* name);
+sg_size_t SIMIX_storage_get_free_size(smx_process_t process,const char* name);
 
-sg_storage_size_t SIMIX_pre_storage_get_used_size(smx_simcall_t simcall,const char* name);
-sg_storage_size_t SIMIX_storage_get_used_size(smx_process_t process,const char* name);
+sg_size_t SIMIX_pre_storage_get_used_size(smx_simcall_t simcall,const char* name);
+sg_size_t SIMIX_storage_get_used_size(smx_process_t process,const char* name);
 
 xbt_dict_t SIMIX_storage_get_properties(smx_storage_t storage);
 xbt_dict_t SIMIX_pre_storage_get_properties(smx_simcall_t, smx_storage_t);
index 1068eef..09ab3cf 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -288,9 +288,6 @@ smx_action_t SIMIX_comm_new(e_smx_comm_type_t type)
   return act;
 }
 
-void SIMIX_pre_comm_destroy(smx_simcall_t simcall, smx_action_t action){
-  SIMIX_comm_destroy(action);
-}
 /**
  *  \brief Destroy a communicate action
  *  \param action The communicate action to be destroyed
@@ -339,17 +336,17 @@ void SIMIX_comm_destroy_internal_actions(smx_action_t action)
 #ifdef HAVE_LATENCY_BOUND_TRACKING
     action->latency_limited = SIMIX_comm_is_latency_bounded(action);
 #endif
-    action->comm.surf_comm->model_type->action_unref(action->comm.surf_comm);
+    surf_action_unref(action->comm.surf_comm);
     action->comm.surf_comm = NULL;
   }
 
   if (action->comm.src_timeout){
-    action->comm.src_timeout->model_type->action_unref(action->comm.src_timeout);
+    surf_action_unref(action->comm.src_timeout);
     action->comm.src_timeout = NULL;
   }
 
   if (action->comm.dst_timeout){
-    action->comm.dst_timeout->model_type->action_unref(action->comm.dst_timeout);
+    surf_action_unref(action->comm.dst_timeout);
     action->comm.dst_timeout = NULL;
   }
 }
@@ -451,20 +448,11 @@ smx_action_t SIMIX_comm_isend(smx_process_t src_proc, smx_rdv_t rdv,
 }
 
 void SIMIX_pre_comm_recv(smx_simcall_t simcall, smx_rdv_t rdv,
-                                  void *dst_buff, size_t *dst_buff_size,
-                                  int (*match_fun)(void *, void *, smx_action_t),
-                                 void *data, double timeout){
+                         void *dst_buff, size_t *dst_buff_size,
+                         int (*match_fun)(void *, void *, smx_action_t),
+                         void *data, double timeout, double rate)
+{
   smx_action_t comm = SIMIX_comm_irecv(simcall->issuer, rdv, dst_buff,
-                                      dst_buff_size, match_fun, data);
-  simcall->mc_value = 0;
-  SIMIX_pre_comm_wait(simcall, comm, timeout);
-}
-
-void SIMIX_pre_comm_recv_bounded(smx_simcall_t simcall, smx_rdv_t rdv,
-                                  void *dst_buff, size_t *dst_buff_size,
-                                  int (*match_fun)(void *, void *, smx_action_t),
-                                 void *data, double timeout, double rate){
-  smx_action_t comm = SIMIX_comm_irecv_bounded(simcall->issuer, rdv, dst_buff,
                                       dst_buff_size, match_fun, data, rate);
   simcall->mc_value = 0;
   SIMIX_pre_comm_wait(simcall, comm, timeout);
@@ -473,107 +461,16 @@ void SIMIX_pre_comm_recv_bounded(smx_simcall_t simcall, smx_rdv_t rdv,
 smx_action_t SIMIX_pre_comm_irecv(smx_simcall_t simcall, smx_rdv_t rdv,
                                   void *dst_buff, size_t *dst_buff_size,
                                   int (*match_fun)(void *, void *, smx_action_t),
-                                 void *data){
-  return SIMIX_comm_irecv(simcall->issuer, rdv, dst_buff, dst_buff_size,
-                         match_fun, data);
-}
-
-smx_action_t SIMIX_comm_irecv(smx_process_t dst_proc, smx_rdv_t rdv,
-                              void *dst_buff, size_t *dst_buff_size,
-                              int (*match_fun)(void *, void *, smx_action_t), void *data)
+                                 void *data, double rate)
 {
-  XBT_DEBUG("recv from %p %p\n", rdv, rdv->comm_fifo);
-  smx_action_t this_action = SIMIX_comm_new(SIMIX_COMM_RECEIVE);
-
-  smx_action_t other_action;
-  //communication already done, get it inside the fifo of completed comms
-  //permanent receive v1
-  //int already_received=0;
-  if(rdv->permanent_receiver && xbt_fifo_size(rdv->done_comm_fifo)!=0){
-
-    XBT_DEBUG("We have a comm that has probably already been received, trying to match it, to skip the communication\n");
-    //find a match in the already received fifo
-    other_action = SIMIX_fifo_get_comm(rdv->done_comm_fifo, SIMIX_COMM_SEND, match_fun, data, this_action);
-    //if not found, assume the receiver came first, register it to the mailbox in the classical way
-    if (!other_action)  {
-      XBT_DEBUG("We have messages in the permanent receive list, but not the one we are looking for, pushing request into fifo\n");
-      other_action = this_action;
-      SIMIX_rdv_push(rdv, this_action);
-    }else{
-      if(other_action->comm.surf_comm &&       SIMIX_comm_get_remains(other_action)==0.0)
-      {
-        XBT_DEBUG("comm %p has been already sent, and is finished, destroy it\n",&(other_action->comm));
-        other_action->state = SIMIX_DONE;
-        other_action->comm.type = SIMIX_COMM_DONE;
-        other_action->comm.rdv = NULL;
-        //SIMIX_comm_destroy(this_action);
-        //--smx_total_comms; // this creation was a pure waste
-        //already_received=1;
-        //other_action->comm.refcount--;
-      }/*else{
-         XBT_DEBUG("Not yet finished, we have to wait %d\n", xbt_fifo_size(rdv->comm_fifo));
-         }*/
-      other_action->comm.refcount--;
-      SIMIX_comm_destroy(this_action);
-      --smx_total_comms; // this creation was a pure waste
-    }
-  }else{
-    /* Prepare an action describing us, so that it gets passed to the user-provided filter of other side */
-
-    /* Look for communication action matching our needs. We also provide a description of
-     * ourself so that the other side also gets a chance of choosing if it wants to match with us.
-     *
-     * If it is not found then push our communication into the rendez-vous point */
-    other_action = SIMIX_fifo_get_comm(rdv->comm_fifo, SIMIX_COMM_SEND, match_fun, data, this_action);
-
-    if (!other_action) {
-      XBT_DEBUG("Receive pushed first %d\n", xbt_fifo_size(rdv->comm_fifo));
-      other_action = this_action;
-      SIMIX_rdv_push(rdv, this_action);
-    } else {
-      SIMIX_comm_destroy(this_action);
-      --smx_total_comms; // this creation was a pure waste
-      other_action->state = SIMIX_READY;
-      other_action->comm.type = SIMIX_COMM_READY;
-      //other_action->comm.refcount--;
-    }
-    xbt_fifo_push(dst_proc->comms, other_action);
-  }
-
-  /* Setup communication action */
-  other_action->comm.dst_proc = dst_proc;
-  other_action->comm.dst_buff = dst_buff;
-  other_action->comm.dst_buff_size = dst_buff_size;
-  other_action->comm.dst_data = data;
-
-  other_action->comm.match_fun = match_fun;
-
-
-  /*if(already_received)//do the actual copy, because the first one after the comm didn't have all the info
-    SIMIX_comm_copy_data(other_action);*/
-
-
-  if (MC_is_active()) {
-    other_action->state = SIMIX_RUNNING;
-    return other_action;
-  }
-
-  SIMIX_comm_start(other_action);
-  // }
-  return other_action;
-}
-
-smx_action_t SIMIX_pre_comm_irecv_bounded(smx_simcall_t simcall, smx_rdv_t rdv,
-                                  void *dst_buff, size_t *dst_buff_size,
-                                  int (*match_fun)(void *, void *, smx_action_t),
-                                 void *data, double rate){
-  return SIMIX_comm_irecv_bounded(simcall->issuer, rdv, dst_buff, dst_buff_size,
+  return SIMIX_comm_irecv(simcall->issuer, rdv, dst_buff, dst_buff_size,
                          match_fun, data, rate);
 }
 
-smx_action_t SIMIX_comm_irecv_bounded(smx_process_t dst_proc, smx_rdv_t rdv,
+smx_action_t SIMIX_comm_irecv(smx_process_t dst_proc, smx_rdv_t rdv,
                               void *dst_buff, size_t *dst_buff_size,
-                              int (*match_fun)(void *, void *, smx_action_t), void *data, double rate)
+                              int (*match_fun)(void *, void *, smx_action_t),
+                              void *data, double rate)
 {
   XBT_DEBUG("recv from %p %p\n", rdv, rdv->comm_fifo);
   smx_action_t this_action = SIMIX_comm_new(SIMIX_COMM_RECEIVE);
@@ -639,8 +536,9 @@ smx_action_t SIMIX_comm_irecv_bounded(smx_process_t dst_proc, smx_rdv_t rdv,
   other_action->comm.dst_buff_size = dst_buff_size;
   other_action->comm.dst_data = data;
 
-  if (rate < other_action->comm.rate || other_action->comm.rate == -1.0)
-         other_action->comm.rate = rate;
+  if (rate != -1.0 &&
+      (other_action->comm.rate == -1.0 || rate < other_action->comm.rate))
+    other_action->comm.rate = rate;
 
   other_action->comm.match_fun = match_fun;
 
@@ -728,8 +626,8 @@ void SIMIX_pre_comm_wait(smx_simcall_t simcall, smx_action_t action, double time
   if (action->state != SIMIX_WAITING && action->state != SIMIX_RUNNING) {
     SIMIX_comm_finish(action);
   } else { /* if (timeout >= 0) { we need a surf sleep action even when there is no timeout, otherwise surf won't tell us when the host fails */
-    sleep = surf_workstation_model->extension.workstation.sleep(simcall->issuer->smx_host, timeout);
-    surf_workstation_model->action_data_set(sleep, action);
+    sleep = surf_workstation_sleep(simcall->issuer->smx_host, timeout);
+    surf_action_set_data(sleep, action);
 
     if (simcall->issuer == action->comm.src_proc)
       action->comm.src_timeout = sleep;
@@ -845,15 +743,16 @@ static XBT_INLINE void SIMIX_comm_start(smx_action_t action)
     XBT_DEBUG("Starting communication %p from '%s' to '%s'", action,
               SIMIX_host_get_name(sender), SIMIX_host_get_name(receiver));
 
-    action->comm.surf_comm = surf_workstation_model->extension.workstation.
-      communicate(sender, receiver, action->comm.task_size, action->comm.rate);
+    action->comm.surf_comm = surf_workstation_model_communicate(surf_workstation_model,
+                                                                   sender, receiver,
+                                                                   action->comm.task_size, action->comm.rate);
 
-    surf_workstation_model->action_data_set(action->comm.surf_comm, action);
+    surf_action_set_data(action->comm.surf_comm, action);
 
     action->state = SIMIX_RUNNING;
 
     /* If a link is failed, detect it immediately */
-    if (surf_workstation_model->action_state_get(action->comm.surf_comm) == SURF_ACTION_FAILED) {
+    if (surf_action_get_state(action->comm.surf_comm) == SURF_ACTION_FAILED) {
       XBT_DEBUG("Communication from '%s' to '%s' failed to start because of a link failure",
                 SIMIX_host_get_name(sender), SIMIX_host_get_name(receiver));
       action->state = SIMIX_LINK_FAILURE;
@@ -873,7 +772,7 @@ static XBT_INLINE void SIMIX_comm_start(smx_action_t action)
         XBT_DEBUG("The communication is suspended on startup because dst (%s:%s) were suspended since it initiated the communication",
                   SIMIX_host_get_name(action->comm.dst_proc->smx_host), action->comm.dst_proc->name);
 
-      surf_workstation_model->suspend(action->comm.surf_comm);
+      surf_action_suspend(action->comm.surf_comm);
 
     }
   }
@@ -888,6 +787,7 @@ void SIMIX_comm_finish(smx_action_t action)
   unsigned int destroy_count = 0;
   smx_simcall_t simcall;
 
+
   while ((simcall = xbt_fifo_shift(action->simcalls))) {
 
     /* If a waitany simcall is waiting for this action to finish, then remove
@@ -979,21 +879,40 @@ void SIMIX_comm_finish(smx_action_t action)
       }
     }
 
-    if (surf_workstation_model->extension.
-        workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) {
+    if (surf_resource_get_state(surf_workstation_resource_priv(simcall->issuer->smx_host)) != SURF_RESOURCE_ON) {
       simcall->issuer->context->iwannadie = 1;
     }
 
     simcall->issuer->waiting_action = NULL;
     xbt_fifo_remove(simcall->issuer->comms, action);
     if(action->comm.detached){
+      smx_process_t proc;
+      int still_alive = 0;
+
       if(simcall->issuer == action->comm.src_proc){
-        if(action->comm.dst_proc)
-          xbt_fifo_remove(action->comm.dst_proc->comms, action);
+        if(action->comm.dst_proc){
+            xbt_swag_foreach(proc, simix_global->process_list)
+            {
+               if(proc==action->comm.dst_proc){
+                   still_alive=1;
+                   break;
+               }
+            }
+        }
+        if(still_alive) xbt_fifo_remove(action->comm.dst_proc->comms, action);
       }
       if(simcall->issuer == action->comm.dst_proc){
         if(action->comm.src_proc)
-          xbt_fifo_remove(action->comm.src_proc->comms, action);
+          if(action->comm.dst_proc){
+            xbt_swag_foreach(proc, simix_global->process_list)
+            {
+              if(proc==action->comm.src_proc){
+                  still_alive=1;
+                  break;
+              }
+            }
+          }
+          if(still_alive) xbt_fifo_remove(action->comm.src_proc->comms, action);
       }
     }
     SIMIX_simcall_answer(simcall);
@@ -1012,19 +931,19 @@ void SIMIX_post_comm(smx_action_t action)
 {
   /* Update action state */
   if (action->comm.src_timeout &&
-      surf_workstation_model->action_state_get(action->comm.src_timeout) == SURF_ACTION_DONE)
+      surf_action_get_state(action->comm.src_timeout) == SURF_ACTION_DONE)
     action->state = SIMIX_SRC_TIMEOUT;
   else if (action->comm.dst_timeout &&
-           surf_workstation_model->action_state_get(action->comm.dst_timeout) == SURF_ACTION_DONE)
+         surf_action_get_state(action->comm.dst_timeout) == SURF_ACTION_DONE)
     action->state = SIMIX_DST_TIMEOUT;
   else if (action->comm.src_timeout &&
-           surf_workstation_model->action_state_get(action->comm.src_timeout) == SURF_ACTION_FAILED)
+         surf_action_get_state(action->comm.src_timeout) == SURF_ACTION_FAILED)
     action->state = SIMIX_SRC_HOST_FAILURE;
   else if (action->comm.dst_timeout &&
-           surf_workstation_model->action_state_get(action->comm.dst_timeout) == SURF_ACTION_FAILED)
+      surf_action_get_state(action->comm.dst_timeout) == SURF_ACTION_FAILED)
     action->state = SIMIX_DST_HOST_FAILURE;
   else if (action->comm.surf_comm &&
-           surf_workstation_model->action_state_get(action->comm.surf_comm) == SURF_ACTION_FAILED) {
+         surf_action_get_state(action->comm.surf_comm) == SURF_ACTION_FAILED) {
     XBT_DEBUG("Puta madre. Surf says that the link broke");
     action->state = SIMIX_LINK_FAILURE;
   } else
@@ -1065,7 +984,7 @@ void SIMIX_comm_cancel(smx_action_t action)
   else if (!MC_is_active() /* when running the MC there are no surf actions */
            && (action->state == SIMIX_READY || action->state == SIMIX_RUNNING)) {
 
-    surf_workstation_model->action_cancel(action->comm.surf_comm);
+    surf_action_cancel(action->comm.surf_comm);
   }
 }
 
@@ -1073,7 +992,7 @@ void SIMIX_comm_suspend(smx_action_t action)
 {
   /*FIXME: shall we suspend also the timeout actions? */
   if (action->comm.surf_comm)
-    surf_workstation_model->suspend(action->comm.surf_comm);
+    surf_action_suspend(action->comm.surf_comm);
   /* in the other case, the action will be suspended on creation, in SIMIX_comm_start() */
 }
 
@@ -1081,7 +1000,7 @@ void SIMIX_comm_resume(smx_action_t action)
 {
   /*FIXME: check what happen with the timeouts */
   if (action->comm.surf_comm)
-    surf_workstation_model->resume(action->comm.surf_comm);
+    surf_action_resume(action->comm.surf_comm);
   /* in the other case, the action were not really suspended yet, see SIMIX_comm_suspend() and SIMIX_comm_start() */
 }
 
@@ -1106,7 +1025,7 @@ double SIMIX_comm_get_remains(smx_action_t action)
   switch (action->state) {
 
   case SIMIX_RUNNING:
-    remains = surf_workstation_model->get_remains(action->comm.surf_comm);
+    remains = surf_action_get_remains(action->comm.surf_comm);
     break;
 
   case SIMIX_WAITING:
@@ -1181,14 +1100,14 @@ int SIMIX_pre_comm_is_latency_bounded(smx_simcall_t simcall, smx_action_t action
  *  \brief verify if communication is latency bounded
  *  \param comm The communication
  */
-XBT_INLINE int SIMIX_comm_is_latency_bounded(smx_action_t action)
+int SIMIX_comm_is_latency_bounded(smx_action_t action)
 {
   if(!action){
     return 0;
   }
   if (action->comm.surf_comm){
     XBT_DEBUG("Getting latency limited for surf_action (%p)", action->comm.surf_comm);
-    action->latency_limited = surf_workstation_model->get_latency_limited(action->comm.surf_comm);
+    action->latency_limited = surf_network_action_get_latency_limited(action->comm.surf_comm);
     XBT_DEBUG("Action limited is %d", action->latency_limited);
   }
   return action->latency_limited;
index fecdd3e..e85cf58 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@ void SIMIX_network_init(void);
 void SIMIX_network_exit(void);
 
 #ifdef HAVE_LATENCY_BOUND_TRACKING
-XBT_INLINE XBT_PUBLIC(int) SIMIX_comm_is_latency_bounded(smx_action_t comm);
+XBT_PUBLIC(int) SIMIX_comm_is_latency_bounded(smx_action_t comm);
 #endif
 
 smx_rdv_t SIMIX_rdv_create(const char *name);
@@ -43,10 +43,8 @@ smx_action_t SIMIX_comm_isend(smx_process_t src_proc, smx_rdv_t rdv,
                               int detached);
 smx_action_t SIMIX_comm_irecv(smx_process_t dst_proc, smx_rdv_t rdv,
                               void *dst_buff, size_t *dst_buff_size,
-                              int (*)(void *, void *, smx_action_t), void *data);
-smx_action_t SIMIX_comm_irecv_bounded(smx_process_t dst_proc, smx_rdv_t rdv,
-                              void *dst_buff, size_t *dst_buff_size,
-                              int (*)(void *, void *, smx_action_t), void *data, double rate);
+                              int (*)(void *, void *, smx_action_t),
+                              void *data, double rate);
 void SIMIX_comm_destroy(smx_action_t action);
 void SIMIX_comm_destroy_internal_actions(smx_action_t action);
 smx_action_t SIMIX_comm_iprobe(smx_process_t dst_proc, smx_rdv_t rdv, int src,
@@ -89,22 +87,13 @@ smx_action_t SIMIX_pre_comm_isend(smx_simcall_t simcall, smx_rdv_t rdv,
                                   void (*clean_fun)(void *), 
                                  void *data, int detached);
 void SIMIX_pre_comm_recv(smx_simcall_t simcall, smx_rdv_t rdv,
-                                  void *dst_buff, size_t *dst_buff_size,
-                                  int (*match_fun)(void *, void *, smx_action_t),
-                                 void *data, double timeout);
-void SIMIX_pre_comm_recv_bounded(smx_simcall_t simcall, smx_rdv_t rdv,
-                                  void *dst_buff, size_t *dst_buff_size,
-                                  int (*match_fun)(void *, void *, smx_action_t),
-                                 void *data, double timeout, double rate);
+                         void *dst_buff, size_t *dst_buff_size,
+                         int (*match_fun)(void *, void *, smx_action_t),
+                         void *data, double timeout, double rate);
 smx_action_t SIMIX_pre_comm_irecv(smx_simcall_t simcall, smx_rdv_t rdv,
-                                  void *dst_buff, size_t *dst_buff_size,
-                                  int (*match_fun)(void *, void *, smx_action_t),
-                                 void *data);
-smx_action_t SIMIX_pre_comm_irecv_bounded(smx_simcall_t simcall, smx_rdv_t rdv,
                                   void *dst_buff, size_t *dst_buff_size,
                                   int (*match_fun)(void *, void *, smx_action_t),
                                  void *data, double rate);
-void SIMIX_pre_comm_destroy(smx_simcall_t simcall, smx_action_t action);
 void SIMIX_pre_comm_cancel(smx_simcall_t simcall, smx_action_t action);
 double SIMIX_pre_comm_get_remains(smx_simcall_t simcall, smx_action_t action);
 e_smx_state_t SIMIX_pre_comm_get_state(smx_simcall_t simcall, smx_action_t action);
index eb0a9f1..f419842 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -43,7 +43,7 @@ void SIMIX_post_new_api(smx_action_t action)
     }
   }
 
-  switch (surf_workstation_model->action_state_get(action->new_api.surf_new_api)) {
+  switch (surf_action_get_state(action->new_api.surf_new_api)) {
 
     case SURF_ACTION_FAILED:
       action->state = SIMIX_FAILED;
@@ -67,8 +67,7 @@ smx_action_t SIMIX_new_api_fct(smx_process_t process, const char* param1, double
   smx_host_t host = process->smx_host;
 
   /* check if the host is active */
-  if (surf_workstation_model->extension.
-      workstation.get_state(host) != SURF_RESOURCE_ON) {
+  if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
            sg_host_name(host));
   }
@@ -81,9 +80,9 @@ smx_action_t SIMIX_new_api_fct(smx_process_t process, const char* param1, double
 #endif
 
   // Called the function from the new model
-  action->new_api.surf_new_api = surf_workstation_model->extension.new_model.fct();
+  //FIXME:CHECK WHAT TO DO action->new_api.surf_new_api = surf_workstation_model->extension.new_model.fct();
 
-  surf_workstation_model->action_data_set(action->new_api.surf_new_api, action);
+  surf_action_set_data(action->new_api.surf_new_api, action);
   XBT_DEBUG("Create NEW MODEL action %p", action);
 
   return action;
@@ -93,7 +92,7 @@ void SIMIX_new_api_destroy(smx_action_t action)
 {
   XBT_DEBUG("Destroy action %p", action);
   if (action->new_api.surf_new_api)
-    action->new_api.surf_new_api->model_type->action_unref(action->new_api.surf_new_api);
+    surf_action_unref(action->new_api.surf_new_api);
   xbt_mallocator_release(simix_global->action_mallocator, action);
 }
 
@@ -123,8 +122,7 @@ void SIMIX_new_api_finish(smx_action_t action)
             (int)action->state);
     }
 
-    if (surf_workstation_model->extension.
-        workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) {
+    if (surf_resource_get_state(surf_workstation_resource_priv(simcall->issuer->smx_host)) != SURF_RESOURCE_ON) {
       simcall->issuer->context->iwannadie = 1;
     }
 
index 61ac1ce..2c1f78f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d8c2519..8462493 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -320,13 +320,13 @@ static XBT_INLINE smx_context_t SIMIX_context_self(void)
 }
 
 /**
- \brief returns the data associated to a context
+ \brief returns the SIMIX process associated to a context
  \param context The context
- \return The data
+ \return The SIMIX process
  */
-static XBT_INLINE void* SIMIX_context_get_data(smx_context_t context)
+static XBT_INLINE smx_process_t SIMIX_context_get_process(smx_context_t context)
 {
-  return simix_global->context_factory->get_data(context);
+  return simix_global->context_factory->get_process(context);
 }
 
 XBT_PUBLIC(int) SIMIX_process_get_maxpid(void);
index bc5c087..74a4d26 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -26,7 +26,7 @@ XBT_INLINE smx_process_t SIMIX_process_self(void)
 {
   smx_context_t self_context = SIMIX_context_self();
 
-  return self_context ? SIMIX_context_get_data(self_context) : NULL;
+  return self_context ? SIMIX_context_get_process(self_context) : NULL;
 }
 
 /**
@@ -491,7 +491,8 @@ smx_action_t SIMIX_process_suspend(smx_process_t process, smx_process_t issuer)
       return NULL;
     }
   } else {
-    return SIMIX_host_execute("suspend", process->smx_host, 0.0, 1.0);
+    /* FIXME: computation size is zero. Is it okay that bound is zero ? */
+    return SIMIX_host_execute("suspend", process->smx_host, 0.0, 1.0, 0.0, 0);
   }
 }
 
@@ -695,8 +696,7 @@ smx_action_t SIMIX_process_sleep(smx_process_t process, double duration)
   smx_host_t host = process->smx_host;
 
   /* check if the host is active */
-  if (surf_workstation_model->extension.
-      workstation.get_state(host) != SURF_RESOURCE_ON) {
+  if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
     THROWF(host_error, 0, "Host %s failed, you cannot call this function",
            sg_host_name(host));
   }
@@ -710,9 +710,9 @@ smx_action_t SIMIX_process_sleep(smx_process_t process, double duration)
 
   action->sleep.host = host;
   action->sleep.surf_sleep =
-      surf_workstation_model->extension.workstation.sleep(host, duration);
+      surf_workstation_sleep(host, duration);
 
-  surf_workstation_model->action_data_set(action->sleep.surf_sleep, action);
+  surf_action_set_data(action->sleep.surf_sleep, action);
   XBT_DEBUG("Create sleep action %p", action);
 
   return action;
@@ -723,9 +723,11 @@ void SIMIX_post_process_sleep(smx_action_t action)
   smx_simcall_t simcall;
   e_smx_state_t state;
 
+  xbt_assert(action->type == SIMIX_ACTION_SLEEP);
+
   while ((simcall = xbt_fifo_shift(action->simcalls))) {
 
-    switch(surf_workstation_model->action_state_get(action->sleep.surf_sleep)){
+    switch(surf_action_get_state(action->sleep.surf_sleep)){
       case SURF_ACTION_FAILED:
         simcall->issuer->context->iwannadie = 1;
         //SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed");
@@ -740,8 +742,7 @@ void SIMIX_post_process_sleep(smx_action_t action)
         THROW_IMPOSSIBLE;
         break;
     }
-    if (surf_workstation_model->extension.
-        workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) {
+    if (surf_resource_get_state(surf_workstation_resource_priv(simcall->issuer->smx_host)) != SURF_RESOURCE_ON) {
       simcall->issuer->context->iwannadie = 1;
     }
     simcall_process_sleep__set__result(simcall, state);
@@ -755,19 +756,23 @@ void SIMIX_post_process_sleep(smx_action_t action)
 void SIMIX_process_sleep_destroy(smx_action_t action)
 {
   XBT_DEBUG("Destroy action %p", action);
+  xbt_assert(action->type == SIMIX_ACTION_SLEEP);
+
   if (action->sleep.surf_sleep)
-    action->sleep.surf_sleep->model_type->action_unref(action->sleep.surf_sleep);
+    surf_action_unref(action->sleep.surf_sleep);
   xbt_mallocator_release(simix_global->action_mallocator, action);
 }
 
 void SIMIX_process_sleep_suspend(smx_action_t action)
 {
-  surf_workstation_model->suspend(action->sleep.surf_sleep);
+  xbt_assert(action->type == SIMIX_ACTION_SLEEP);
+  surf_action_suspend(action->sleep.surf_sleep);
 }
 
 void SIMIX_process_sleep_resume(smx_action_t action)
 {
-  surf_workstation_model->resume(action->sleep.surf_sleep);
+  xbt_assert(action->type == SIMIX_ACTION_SLEEP);
+  surf_action_resume(action->sleep.surf_sleep);
 }
 
 /** 
index aedee85..ac0126e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index aec3439..77623e7 100644 (file)
@@ -1,7 +1,15 @@
+/* Copyright (c) 2010-2014. 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 "smx_private.h"
 #include "xbt/fifo.h"
 #include "xbt/xbt_os_thread.h"
-#include "../mc/mc_private.h"
+#ifdef HAVE_MC
+#include "mc/mc_private.h"
+#endif
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_smurf, simix,
                                 "Logging specific to SIMIX (SMURF)");
@@ -49,8 +57,10 @@ void SIMIX_simcall_pre(smx_simcall_t simcall, int value)
 {
   XBT_DEBUG("Handling simcall %p: %s", simcall, SIMIX_simcall_name(simcall->call));
   simcall->mc_value = value;
+  if (simcall->issuer->context->iwannadie && simcall->call != SIMCALL_PROCESS_CLEANUP)
+    return;
   switch (simcall->call) {
-SIMCALL_LIST(SIMCALL_CASE, SIMCALL_SEP_NOTHING)
+#include "simcalls_generated_case.c"
     case NUM_SIMCALLS:;
       break;
     case SIMCALL_NONE:;
index 1e191f7..f14c89d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -7,6 +7,8 @@
 #ifndef _SIMIX_SMURF_PRIVATE_H
 #define _SIMIX_SMURF_PRIVATE_H
 
+SG_BEGIN_DECL()
+
 /********************************* Simcalls *********************************/
 
 /* we want to build the e_smx_simcall_t enumeration, the table of the
  * automatically, using macros.
  * To add a new simcall follow the following syntax:
  *
- * SIMCALL_ENUM_ELEMENT(<simcall_enumeration_id>, <simcall_handler_function>)
- *
  * */
 
-/****************************
- * SIMCALL GENERATING MACRO *
- ****************************
- *
- * action(ENUM_NAME, func_name, result_type, params…) 
- *
- **/
-
-/*
- * Some macro machinery to get a MAP over the arguments of a variadic macro.
- * It uses a FOLD to apply a macro to every argument, and because there is
- * no recursion in the C preprocessor we must create a new macro for every
- * depth of FOLD's recursion.
- */
-
-/* FOLD macro */
-#define FE_0(WHAT, X, ...)
-#define FE_1(I, WHAT, X) WHAT(I, X)
-#define FE_2(I, WHAT, X, ...) WHAT(I, X), FE_1(I+1, WHAT, __VA_ARGS__)
-#define FE_3(I, WHAT, X, ...) WHAT(I, X), FE_2(I+1, WHAT, __VA_ARGS__)
-#define FE_4(I, WHAT, X, ...) WHAT(I, X), FE_3(I+1, WHAT, __VA_ARGS__)
-#define FE_5(I, WHAT, X, ...) WHAT(I, X), FE_4(I+1, WHAT, __VA_ARGS__)
-#define FE_6(I, WHAT, X, ...) WHAT(I, X), FE_5(I+1, WHAT, __VA_ARGS__)
-#define FE_7(I, WHAT, X, ...) WHAT(I, X), FE_6(I+1, WHAT, __VA_ARGS__)
-#define FE_8(I, WHAT, X, ...) WHAT(I, X), FE_7(I+1, WHAT, __VA_ARGS__)
-#define FE_9(I, WHAT, X, ...) WHAT(I, X), FE_8(I+1, WHAT, __VA_ARGS__)
-#define FE_10(I, WHAT, X, ...) WHAT(I, X), FE_9(I+1, WHAT, __VA_ARGS__)
-
-/* NOTE: add as many FE_n as needed (maximum number of simcall arguments )*/
-
-/* Make a MAP macro usgin FOLD (will apply 'action' to the arguments.
- * GET_MACRO is a smart hack that counts the number of arguments passed to
- * the variadic macro, and it is used to invoke the right FOLD depth.
- */
-#define GET_MACRO(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,NAME,...) NAME
-#define MAP(action, ...) \
-  GET_MACRO(, ##__VA_ARGS__, FE_10,FE_9,FE_8,FE_7,FE_6,FE_5,FE_4,FE_3,FE_2,FE_1, FE_0) (0, action, __VA_ARGS__)
-
-/* MAP with default arguments */
-#define APPLY_MAP(WHAT, I, X, ...) WHAT(I, __VA_ARGS__, X)
-#define FE_DA_0(I, WHAT, args, X, ...)
-#define FE_DA_1(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args)
-#define FE_DA_2(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_1(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_3(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_2(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_4(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_3(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_5(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_4(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_6(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_5(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_7(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_6(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_8(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_7(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_9(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_8(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_10(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_9(I+1, WHAT, args, __VA_ARGS__)
-
-#define MAP_WITH_DEFAULT_ARGS(action, args, ...) \
-  GET_MACRO(, ##__VA_ARGS__, FE_DA_10,FE_DA_9,FE_DA_8,FE_DA_7,FE_DA_6,FE_DA_5,FE_DA_4,FE_DA_3,FE_DA_2,FE_DA_1, FE_DA_0) (0, action, args, __VA_ARGS__)
-
-/*
- * Define scalar type wrappers to ease the use of simcalls.
- * These are used to wrap the arguments in SIMIX_simcall macro.
- */
-#define TCHAR(n) (n, char, c)
-#define TSTRING(n) (n, const char*, cc)
-#define TSHORT(n) (n, short, s)
-#define TINT(n) (n, int, i)
-#define TLONG(n) (n, long, l)
-#define TUCHAR(n) (n, unsigned char, uc)
-#define TUSHORT(n) (n, unsigned short, us)
-#define TUINT(n) (n, unsigned int, ui)
-#define TULONG(n) (n, unsigned long, ul)
-#define TFLOAT(n) (n, float, f)
-#define TDOUBLE(n) (n, double, d)
-#define TPTR(n) (n, void*, p)
-#define TCPTR(n) (n, const void*, cp)
-#define TSIZE(n) (n, size_t, si)
-#define TVOID(n) (n, void)
-#define TSPEC(n,t) (n, t, p)
-
-/* use comma or nothing to separate elements*/
-#define SIMCALL_SEP_COMMA ,
-#define SIMCALL_SEP_NOTHING
-
-/* get the name of the parameter */
-#define SIMCALL_NAME_(name, type, field) name
-#define SIMCALL_NAME(i, v) SIMCALL_NAME_ v
-
-/* get the %s format code of the parameter */
-#define SIMCALL_FORMAT_(name, type, field) %field
-#define SIMCALL_FORMAT(i, v) SIMCALL_FORMAT_ v
-
-/* get the field of the parameter */
-#define SIMCALL_FIELD_(name, type, field) field
-#define SIMCALL_FIELD(i, v) SIMCALL_FIELD_ v
-
-/* get the parameter declaration */
-#define SIMCALL_ARG_(name, type, field) type name
-#define SIMCALL_ARG(i, v) SIMCALL_ARG_ v
-
-/* get the parameter initialisation field */
-#define SIMCALL_INIT_FIELD_(name, type, field) .field = name
-#define SIMCALL_INIT_FIELD(i, d, v) self->simcall.args[i]SIMCALL_INIT_FIELD_ v;
-
-/* get the case of the parameter */
-#define SIMCALL_CASE_PARAM_(name, type, field) field
-#define SIMCALL_CASE_PARAM(i, v) simcall->args[i].SIMCALL_CASE_PARAM_ v
-
-/* generate some code for SIMCALL_CASE if the simcall has an answer */
-#define MAYBE2(_0, _1, func, ...) func
-
-#define SIMCALL_WITH_RESULT_BEGIN(name, type, field) simcall->result.field =
-#define SIMCALL_WITHOUT_RESULT_BEGIN(name, type, field)
-#define SIMCALL_RESULT_BEGIN_(name, type, ...)\
-        MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_RESULT_BEGIN, SIMCALL_WITHOUT_RESULT_BEGIN)\
-       (name, type, __VA_ARGS__)
-#define SIMCALL_RESULT_BEGIN(answer, res) answer(SIMCALL_RESULT_BEGIN_ res)
-
-#define SIMCALL_RESULT_END_(name, type, ...)\
-       SIMIX_simcall_answer(simcall);
-#define SIMCALL_RESULT_END(answer, res) answer(SIMCALL_RESULT_END_ res)
-
-/* generate some code for BODY function */
-#define SIMCALL_FUNC_RETURN_TYPE_(name, type, ...) type
-#define SIMCALL_FUNC_RETURN_TYPE(res) SIMCALL_FUNC_RETURN_TYPE_ res
-
-#define SIMCALL_WITH_FUNC_SIMCALL(name, type, field) smx_simcall_t simcall = 
-#define SIMCALL_WITHOUT_FUNC_SIMCALL(name, type, field)
-#define SIMCALL_FUNC_SIMCALL_(name, type, ...)\
-        MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_FUNC_SIMCALL, SIMCALL_WITHOUT_FUNC_SIMCALL)\
-       (name, type, __VA_ARGS__)
-#define SIMCALL_FUNC_SIMCALL(res) SIMCALL_FUNC_SIMCALL_ res
-
-#define SIMCALL_WITH_FUNC_RETURN(name, type, field) return self->simcall.result.field;
-#define SIMCALL_WITHOUT_FUNC_RETURN(name, type, field)
-#define SIMCALL_FUNC_RETURN_(name, type, ...)\
-        MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_FUNC_RETURN, SIMCALL_WITHOUT_FUNC_RETURN)\
-       (name, type, __VA_ARGS__)
-#define SIMCALL_FUNC_RETURN(res) SIMCALL_FUNC_RETURN_ res
-
-
-/* generate the simcall enumeration */
-#define SIMCALL_ENUM(type, ...)\
-       type
-
-/* generate the strings name from the enumeration values */
-#define SIMCALL_STRING_TYPE(type, name, answer, res, ...)\
-       [type] = STRINGIFY(type)
-
-/* generate strings from the enumeration values */
-#define SIMCALL_TYPE(type, name, answer, res, ...)\
-       [type] = STRINGIFY(MAP(SIMCALL_FORMAT, __VA_ARGS__))
-
-/* generate the simcalls BODY functions */
-#define SIMCALL_FUNC(TYPE, NAME, ANSWER, RES, ...)\
-  inline static SIMCALL_FUNC_RETURN_TYPE(RES) simcall_BODY_##NAME(MAP(SIMCALL_ARG, ##__VA_ARGS__)) { \
-    smx_process_t self = SIMIX_process_self(); \
-    self->simcall.call = TYPE; \
-    memset(&self->simcall.result, 0, sizeof(self->simcall.result)); \
-    memset(self->simcall.args, 0, sizeof(self->simcall.args)); \
-    MAP_WITH_DEFAULT_ARGS(SIMCALL_INIT_FIELD, (), ##__VA_ARGS__) \
-    if (self != simix_global->maestro_process) { \
-      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name, \
-                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call); \
-      SIMIX_process_yield(self); \
-    } else { \
-      SIMIX_simcall_pre(&self->simcall, 0); \
-    } \
-    SIMCALL_FUNC_RETURN(RES) \
-  }
-
-/* generate a comma if there is an argument*/
-#define WITHOUT_COMMA 
-#define WITH_COMMA ,
-#define GET_CLEAN(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10, NAME,...) NAME
-#define MAYBE_COMMA(...) GET_CLEAN(,##__VA_ARGS__,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITHOUT_COMMA)
-
-/* generate the simcalls cases for the SIMIX_simcall_pre function */
-#define WITH_ANSWER(...) __VA_ARGS__
-#define WITHOUT_ANSWER(...) 
-#define SIMCALL_CASE(type, name, answer, res, ...)\
-    case type:\
-      SIMCALL_RESULT_BEGIN(answer, res) SIMIX_pre_ ## name(simcall MAYBE_COMMA(__VA_ARGS__) MAP(SIMCALL_CASE_PARAM, ##__VA_ARGS__));\
-      SIMCALL_RESULT_END(answer, res)\
-      break;
-
-
-/*
- * Generate simcall args and result getter/setter
- */
-#define SIMCALL_GS_SC_NAME_(n) n
-#define SIMCALL_GS_SC_NAME(n) SIMCALL_GS_SC_NAME_ n
-#define SIMCALL_GS_ARG_NAME(n) SIMCALL_NAME_ n
-#define JOIN2(_0, _1) _0 ##__## _1
-#define JOIN3(_0, _1, _2) JOIN2(_0 ##__## _1, _2)
-#define JOIN4(_0, _1, _2, _3) JOIN3(_0 ##_## _1, _2, _3)
-#define SIMCALL_GS_FUNC(scname, setget, vname) \
-   JOIN4(simcall, scname, setget, vname)
-
-/* generate the simcalls args getter/setter */
-#define SIMCALL_ARG_GETSET_(i, name, v) \
-  static inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME(name), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall){\
-    return simcall->args[i].SIMCALL_FIELD_ v ;\
-  }\
-  static inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME(name), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v){\
-    simcall->args[i].SIMCALL_FIELD_ v = SIMCALL_NAME_ v ;\
-  }
-
-#define SIMCALL_ARG_GETSET(type, name, answer, res, ...)\
-    MAP_WITH_DEFAULT_ARGS(SIMCALL_ARG_GETSET_, (name), ##__VA_ARGS__)
-
-/* generate the simcalls result getter/setter */
-#define SIMCALL_WITH_RES_GETSET(name, v) \
-  static inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall){\
-    return simcall->result.SIMCALL_FIELD_ v ;\
-  }\
-  static inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v){\
-    simcall->result.SIMCALL_FIELD_ v = SIMCALL_NAME_ v ;\
-  }
-#define SIMCALL_WITHOUT_RES_GETSET(name, v)
-#define SIMCALL_RES_GETSET__(name, type, ...)\
-        MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_RES_GETSET, SIMCALL_WITHOUT_RES_GETSET)
-#define SIMCALL_RES_GETSET_(scname, v)\
-        SIMCALL_RES_GETSET__ v (scname, v)
-#define SIMCALL_RES_GETSET(type, name, answer, res, ...)\
-  SIMCALL_RES_GETSET_(name, res)
-
-/* generate the simcalls result getter/setter protos*/
-#define SIMCALL_WITH_RES_GETSET_PROTO(name, v) \
-  inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall);\
-  inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v);
-#define SIMCALL_WITHOUT_RES_GETSET_PROTO(name, v)
-#define SIMCALL_RES_GETSET_PROTO__(name, type, ...)\
-        MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_RES_GETSET_PROTO, SIMCALL_WITHOUT_RES_GETSET_PROTO)
-#define SIMCALL_RES_GETSET_PROTO_(scname, v)\
-        SIMCALL_RES_GETSET_PROTO__ v (scname, v)
-#define SIMCALL_RES_GETSET_PROTO(type, name, answer, res, ...)\
-  SIMCALL_RES_GETSET_PROTO_(name, res)
-
-/* stringify arguments */
-#define STRINGIFY_(...) #__VA_ARGS__
-#define STRINGIFY(...) STRINGIFY_(__VA_ARGS__)
-
-/* the list of simcalls definitions */
-#define SIMCALL_LIST1(ACTION, sep) \
-ACTION(SIMCALL_HOST_GET_BY_NAME, host_get_by_name, WITH_ANSWER, TSPEC(result, smx_host_t), TSTRING(name)) sep \
-ACTION(SIMCALL_HOST_GET_NAME, host_get_name, WITH_ANSWER, TSTRING(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_PROPERTIES, host_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_CORE, host_get_core, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_PROCESS_LIST, host_get_process_list, WITH_ANSWER, TSPEC(result, xbt_swag_t), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_SPEED, host_get_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_AVAILABLE_SPEED, host_get_available_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_STATE, host_get_state, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_DATA, host_get_data, WITH_ANSWER, TPTR(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_SET_DATA, host_set_data, WITH_ANSWER, TVOID(result), TSPEC(host, smx_host_t), TPTR(data)) sep \
-ACTION(SIMCALL_HOST_GET_CURRENT_POWER_PEAK, host_get_current_power_peak, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_POWER_PEAK_AT, host_get_power_peak_at, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t), TINT(pstate_index)) sep \
-ACTION(SIMCALL_HOST_GET_NB_PSTATES, host_get_nb_pstates, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_SET_POWER_PEAK_AT, host_set_power_peak_at, WITH_ANSWER, TVOID(result), TSPEC(host, smx_host_t), TINT(pstate_index)) sep \
-ACTION(SIMCALL_HOST_GET_CONSUMED_ENERGY, host_get_consumed_energy, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_EXECUTE, host_execute, WITH_ANSWER, TSPEC(result, smx_action_t), TSTRING(name), TSPEC(host, smx_host_t), TDOUBLE(computation_amount), TDOUBLE(priority)) sep \
-ACTION(SIMCALL_HOST_PARALLEL_EXECUTE, host_parallel_execute, WITH_ANSWER, TSPEC(result, smx_action_t), TSTRING(name), TINT(host_nb), TSPEC(host_list, smx_host_t*), TSPEC(computation_amount, double*), TSPEC(communication_amount, double*), TDOUBLE(amount), TDOUBLE(rate)) sep \
-ACTION(SIMCALL_HOST_EXECUTION_DESTROY, host_execution_destroy, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t)) sep \
-ACTION(SIMCALL_HOST_EXECUTION_CANCEL, host_execution_cancel, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t)) sep \
-ACTION(SIMCALL_HOST_EXECUTION_GET_REMAINS, host_execution_get_remains, WITH_ANSWER, TDOUBLE(result), TSPEC(execution, smx_action_t)) sep \
-ACTION(SIMCALL_HOST_EXECUTION_GET_STATE, host_execution_get_state, WITH_ANSWER, TINT(result), TSPEC(execution, smx_action_t)) sep \
-ACTION(SIMCALL_HOST_EXECUTION_SET_PRIORITY, host_execution_set_priority, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t), TDOUBLE(priority)) sep \
-ACTION(SIMCALL_HOST_EXECUTION_WAIT, host_execution_wait, WITHOUT_ANSWER, TINT(result), TSPEC(execution, smx_action_t)) sep \
-ACTION(SIMCALL_HOST_GET_STORAGE_LIST, host_get_storage_list, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_PROCESS_CREATE, process_create, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t*), TSTRING(name), TSPEC(code, xbt_main_func_t), TPTR(data), TSTRING(hostname), TDOUBLE(kill_time), TINT(argc), TSPEC(argv, char**), TSPEC(properties, xbt_dict_t), TINT(auto_restart)) sep \
-ACTION(SIMCALL_PROCESS_KILL, process_kill, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_KILLALL, process_killall, WITH_ANSWER, TVOID(result), TINT(reset_pid)) sep \
-ACTION(SIMCALL_PROCESS_CLEANUP, process_cleanup, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_CHANGE_HOST, process_change_host, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TSPEC(dest, smx_host_t)) sep \
-ACTION(SIMCALL_PROCESS_SUSPEND, process_suspend, WITHOUT_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_RESUME, process_resume, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_COUNT, process_count, WITH_ANSWER, TINT(result)) sep \
-ACTION(SIMCALL_PROCESS_GET_PID, process_get_PID, WITH_ANSWER, TINT(result), TSPEC(process, smx_process_t)) sep  \
-ACTION(SIMCALL_PROCESS_GET_PPID, process_get_PPID, WITH_ANSWER, TINT(result), TSPEC(process, smx_process_t)) sep  \
-ACTION(SIMCALL_PROCESS_GET_DATA, process_get_data, WITH_ANSWER, TPTR(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_SET_DATA, process_set_data, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TPTR(data)) sep \
-ACTION(SIMCALL_PROCESS_GET_HOST, process_get_host, WITH_ANSWER, TSPEC(result, smx_host_t), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_GET_NAME, process_get_name, WITH_ANSWER, TSTRING(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_IS_SUSPENDED, process_is_suspended, WITH_ANSWER, TINT(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_GET_PROPERTIES, process_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_SLEEP, process_sleep, WITHOUT_ANSWER, TINT(result), TDOUBLE(duration)) sep \
-ACTION(SIMCALL_PROCESS_ON_EXIT, process_on_exit, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TSPEC(fun, int_f_pvoid_t), TPTR(data)) sep \
-ACTION(SIMCALL_PROCESS_AUTO_RESTART_SET, process_auto_restart_set, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TINT(auto_restart)) sep \
-ACTION(SIMCALL_PROCESS_RESTART, process_restart, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_RDV_CREATE, rdv_create, WITH_ANSWER, TSPEC(result, smx_rdv_t), TSTRING(name)) sep \
-ACTION(SIMCALL_RDV_DESTROY, rdv_destroy, WITH_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t)) sep \
-ACTION(SIMCALL_RDV_GET_BY_NAME, rdv_get_by_name, WITH_ANSWER, TSPEC(result, smx_host_t), TSTRING(name)) sep \
-ACTION(SIMCALL_RDV_COMM_COUNT_BY_HOST, rdv_comm_count_by_host, WITH_ANSWER, TUINT(result), TSPEC(rdv, smx_rdv_t), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_RDV_GET_HEAD, rdv_get_head, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t)) sep \
-ACTION(SIMCALL_RDV_SET_RECV, rdv_set_receiver, WITH_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TSPEC(receiver, smx_process_t)) sep \
-ACTION(SIMCALL_RDV_GET_RECV, rdv_get_receiver, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(rdv, smx_rdv_t)) sep \
-ACTION(SIMCALL_COMM_IPROBE, comm_iprobe, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TINT(src), TINT(tag), TSPEC(match_fun, simix_match_func_t), TPTR(data)) sep \
-ACTION(SIMCALL_COMM_SEND, comm_send, WITHOUT_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TDOUBLE(task_size), TDOUBLE(rate), TPTR(src_buff), TSIZE(src_buff_size), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(timeout)) sep \
-ACTION(SIMCALL_COMM_ISEND, comm_isend, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TDOUBLE(task_size), TDOUBLE(rate), TPTR(src_buff), TSIZE(src_buff_size), TSPEC(match_fun, simix_match_func_t), TSPEC(clean_fun, simix_clean_func_t), TPTR(data), TINT(detached)) sep \
-ACTION(SIMCALL_COMM_RECV, comm_recv, WITHOUT_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(timeout)) sep \
-ACTION(SIMCALL_COMM_IRECV, comm_irecv, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data)) sep \
-ACTION(SIMCALL_COMM_RECV_BOUNDED, comm_recv_bounded, WITHOUT_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(timeout), TDOUBLE(rate)) sep \
-ACTION(SIMCALL_COMM_IRECV_BOUNDED, comm_irecv_bounded, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(rate)) sep \
-ACTION(SIMCALL_COMM_DESTROY, comm_destroy, WITH_ANSWER, TVOID(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_CANCEL, comm_cancel, WITH_ANSWER, TVOID(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_WAITANY, comm_waitany, WITHOUT_ANSWER, TINT(result), TSPEC(comms, xbt_dynar_t)) sep \
-ACTION(SIMCALL_COMM_WAIT, comm_wait, WITHOUT_ANSWER, TVOID(result), TSPEC(comm, smx_action_t), TDOUBLE(timeout)) sep \
-ACTION(SIMCALL_COMM_TEST, comm_test, WITHOUT_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_TESTANY, comm_testany, WITHOUT_ANSWER, TINT(result), TSPEC(comms, xbt_dynar_t)) sep \
-ACTION(SIMCALL_COMM_GET_REMAINS, comm_get_remains, WITH_ANSWER, TDOUBLE(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_GET_STATE, comm_get_state, WITH_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_GET_SRC_DATA, comm_get_src_data, WITH_ANSWER, TPTR(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_GET_DST_DATA, comm_get_dst_data, WITH_ANSWER, TPTR(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_GET_SRC_PROC, comm_get_src_proc, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_GET_DST_PROC, comm_get_dst_proc, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_MUTEX_INIT, mutex_init, WITH_ANSWER, TSPEC(result, smx_mutex_t)) sep \
-ACTION(SIMCALL_MUTEX_DESTROY, mutex_destroy, WITH_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \
-ACTION(SIMCALL_MUTEX_LOCK, mutex_lock, WITHOUT_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \
-ACTION(SIMCALL_MUTEX_TRYLOCK, mutex_trylock, WITH_ANSWER, TINT(result), TSPEC(mutex, smx_mutex_t)) sep \
-ACTION(SIMCALL_MUTEX_UNLOCK, mutex_unlock, WITH_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \
-ACTION(SIMCALL_COND_INIT, cond_init, WITH_ANSWER, TSPEC(result, smx_cond_t)) sep \
-ACTION(SIMCALL_COND_DESTROY, cond_destroy, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \
-ACTION(SIMCALL_COND_SIGNAL, cond_signal, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \
-ACTION(SIMCALL_COND_WAIT, cond_wait, WITHOUT_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t), TSPEC(mutex, smx_mutex_t)) sep \
-ACTION(SIMCALL_COND_WAIT_TIMEOUT, cond_wait_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t), TSPEC(mutex, smx_mutex_t), TDOUBLE(timeout)) sep \
-ACTION(SIMCALL_COND_BROADCAST, cond_broadcast, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \
-ACTION(SIMCALL_SEM_INIT, sem_init, WITH_ANSWER, TSPEC(result, smx_sem_t), TINT(capacity)) sep \
-ACTION(SIMCALL_SEM_DESTROY, sem_destroy, WITH_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \
-ACTION(SIMCALL_SEM_RELEASE, sem_release, WITH_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \
-ACTION(SIMCALL_SEM_WOULD_BLOCK, sem_would_block, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \
-ACTION(SIMCALL_SEM_ACQUIRE, sem_acquire, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \
-ACTION(SIMCALL_SEM_ACQUIRE_TIMEOUT, sem_acquire_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t), TDOUBLE(timeout)) sep \
-ACTION(SIMCALL_SEM_GET_CAPACITY, sem_get_capacity, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \
-ACTION(SIMCALL_FILE_GET_DATA, file_get_data, WITH_ANSWER, TPTR(result), TSPEC(fd, smx_file_t)) sep \
-ACTION(SIMCALL_FILE_SET_DATA, file_set_data, WITH_ANSWER, TVOID(result), TSPEC(fd, smx_file_t), TPTR(data)) sep \
-ACTION(SIMCALL_FILE_READ, file_read, WITHOUT_ANSWER, TSIZE(result), TSPEC(fd, smx_file_t), TSIZE(size)) sep \
-ACTION(SIMCALL_FILE_WRITE, file_write, WITHOUT_ANSWER, TSIZE(result), TSPEC(fd, smx_file_t), TSIZE(size)) sep \
-ACTION(SIMCALL_FILE_OPEN, file_open, WITHOUT_ANSWER, TSPEC(result, smx_file_t), TSTRING(mount), TSTRING(path)) sep \
-ACTION(SIMCALL_FILE_CLOSE, file_close, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \
-ACTION(SIMCALL_FILE_UNLINK, file_unlink, WITH_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \
-ACTION(SIMCALL_FILE_LS, file_ls, WITHOUT_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(mount), TSTRING(path)) sep \
-ACTION(SIMCALL_FILE_GET_SIZE, file_get_size, WITH_ANSWER, TSIZE(result), TSPEC(fd, smx_file_t)) sep \
-ACTION(SIMCALL_FILE_GET_INFO, file_get_info, WITH_ANSWER, TSPEC(result, xbt_dynar_t), TSPEC(fd, smx_file_t)) sep \
-ACTION(SIMCALL_STORAGE_GET_FREE_SIZE, storage_get_free_size, WITH_ANSWER, TSIZE(result), TSTRING(name)) sep \
-ACTION(SIMCALL_STORAGE_GET_USED_SIZE, storage_get_used_size, WITH_ANSWER, TSIZE(result), TSTRING(name)) sep \
-ACTION(SIMCALL_STORAGE_GET_PROPERTIES, storage_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(storage, smx_storage_t)) sep \
-ACTION(SIMCALL_STORAGE_GET_CONTENT, storage_get_content, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(storage, smx_storage_t)) sep \
-ACTION(SIMCALL_ASR_GET_PROPERTIES, asr_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(name)) sep 
-
-/* SIMCALL_COMM_IS_LATENCY_BOUNDED and SIMCALL_SET_CATEGORY make things complicated
- * because they are not always present */
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-#define SIMCALL_LIST2(ACTION, sep) \
-ACTION(SIMCALL_COMM_IS_LATENCY_BOUNDED, comm_is_latency_bounded, WITH_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep
-#else
-#define SIMCALL_LIST2(ACTION, sep)
-#endif
-
-#ifdef HAVE_TRACING
-#define SIMCALL_LIST3(ACTION, sep) \
-ACTION(SIMCALL_SET_CATEGORY, set_category, WITH_ANSWER, TVOID(result), TSPEC(action, smx_action_t), TSTRING(category)) sep
-#else
-#define SIMCALL_LIST3(ACTION, sep)
-#endif
-
-#ifdef HAVE_MC
-#define SIMCALL_LIST4(ACTION, sep) \
-ACTION(SIMCALL_MC_SNAPSHOT, mc_snapshot, WITH_ANSWER, TPTR(result)) sep \
-ACTION(SIMCALL_MC_COMPARE_SNAPSHOTS, mc_compare_snapshots, WITH_ANSWER, TINT(result), TPTR(s1), TPTR(s2)) sep \
-ACTION(SIMCALL_MC_RANDOM, mc_random, WITH_ANSWER, TINT(result), TINT(min), TINT(max)) sep
-#else
-#define SIMCALL_LIST4(ACTION, sep)
-#endif
-
-/* SIMCALL_LIST is the final macro to use */
-#define SIMCALL_LIST(ACTION, ...) \
-  SIMCALL_LIST1(ACTION, ##__VA_ARGS__)\
-  SIMCALL_LIST2(ACTION, ##__VA_ARGS__)\
-  SIMCALL_LIST3(ACTION, ##__VA_ARGS__)\
-  SIMCALL_LIST4(ACTION, ##__VA_ARGS__)
-
-
-/* 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) */
-#define SIMCALL_ENUM_ELEMENT(x, y) x
-
 /**
  * \brief All possible simcalls.
  */
 typedef enum {
 SIMCALL_NONE,
-SIMCALL_LIST(SIMCALL_ENUM, SIMCALL_SEP_COMMA)
+#include "simcalls_generated_enum.h"
 SIMCALL_NEW_API_INIT,
 NUM_SIMCALLS
 } e_smx_simcall_t;
 
 typedef int (*simix_match_func_t)(void *, void *, smx_action_t);
 typedef void (*simix_clean_func_t)(void *);
+typedef void (*FPtr)(void); // Hide the ugliness
 
 /* Pack all possible scalar types in an union */
 union u_smx_scalar {
@@ -426,8 +45,10 @@ union u_smx_scalar {
   unsigned long   ul;
   float           f;
   double          d;
-  size_t          si;
-  void*           p;
+  size_t          sz;
+  sg_size_t       sgsz;
+  void*           dp;
+  FPtr            fp;
   const void*     cp;
 };
 
@@ -451,8 +72,8 @@ typedef struct s_smx_simcall {
   };
 } s_smx_simcall_t, *smx_simcall_t;
 
-SIMCALL_LIST(SIMCALL_RES_GETSET, SIMCALL_SEP_NOTHING)
-SIMCALL_LIST(SIMCALL_ARG_GETSET, SIMCALL_SEP_NOTHING)
+#include "simcalls_generated_res_getter_setter.h"
+#include "simcalls_generated_args_getter_setter.h"
 
 /******************************** General *************************************/
 
@@ -472,5 +93,6 @@ typedef smx_action_t (*simcall_handler_t)(u_smx_scalar_t *);
 extern const char *simcall_types[];
 extern simcall_handler_t simcall_table[];
 
-#endif
+SG_END_DECL()
 
+#endif
index c9d14d0..22e7180 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -23,14 +23,15 @@ static void _SIMIX_sem_wait(smx_sem_t sem, double timeout, smx_process_t issuer,
 static smx_action_t SIMIX_synchro_wait(smx_host_t smx_host, double timeout)
 {
   XBT_IN("(%p, %f)",smx_host,timeout);
+
   smx_action_t action;
   action = xbt_mallocator_get(simix_global->action_mallocator);
   action->type = SIMIX_ACTION_SYNCHRO;
   action->name = xbt_strdup("synchro");
   action->synchro.sleep = 
-    surf_workstation_model->extension.workstation.sleep(smx_host, timeout);
+    surf_workstation_sleep(smx_host, timeout);
 
-  surf_workstation_model->action_data_set(action->synchro.sleep, action);
+  surf_action_set_data(action->synchro.sleep, action);
   XBT_OUT();
   return action;
 }
@@ -70,7 +71,8 @@ void SIMIX_synchro_destroy(smx_action_t action)
 {
   XBT_IN("(%p)",action);
   XBT_DEBUG("Destroying synchro %p", action);
-  action->synchro.sleep->model_type->action_unref(action->synchro.sleep);
+  xbt_assert(action->type == SIMIX_ACTION_SYNCHRO);
+  surf_action_unref(action->synchro.sleep);
   xbt_free(action->name);
   xbt_mallocator_release(simix_global->action_mallocator, action);
   XBT_OUT();
@@ -79,9 +81,10 @@ void SIMIX_synchro_destroy(smx_action_t action)
 void SIMIX_post_synchro(smx_action_t action)
 {
   XBT_IN("(%p)",action);
-  if (surf_workstation_model->action_state_get(action->synchro.sleep) == SURF_ACTION_FAILED)
+  xbt_assert(action->type == SIMIX_ACTION_SYNCHRO);
+  if (surf_action_get_state(action->synchro.sleep) == SURF_ACTION_FAILED)
     action->state = SIMIX_FAILED;
-  else if(surf_workstation_model->action_state_get(action->synchro.sleep) == SURF_ACTION_DONE)
+  else if(surf_action_get_state(action->synchro.sleep) == SURF_ACTION_DONE)
     action->state = SIMIX_SRC_TIMEOUT;
 
   SIMIX_synchro_finish(action);  
index 5b73ad8..ad411fd 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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 _SIMIX_SYNCHRO_PRIVATE_H
 #define _SIMIX_SYNCHRO_PRIVATE_H
 
index a4453a8..9b6720e 100644 (file)
@@ -1,7 +1,7 @@
 /* smx_user.c - public interface to simix                                   */
 
-/* Copyright (c) 2010-2013. The SimGrid Team.
  All rights reserved.                                                     */
+/* Copyright (c) 2010-2014. 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. */
@@ -15,11 +15,11 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix);
 
 /* generate strings from the enumeration values */
 static const char* simcall_names[] = {
-SIMCALL_LIST(SIMCALL_STRING_TYPE, SIMCALL_SEP_COMMA)
+#include "simcalls_generated_string.c"
 [SIMCALL_NONE] = "NONE"
 };
 
-SIMCALL_LIST(SIMCALL_FUNC, SIMCALL_SEP_NOTHING)
+#include "simcalls_generated_body.c"
 
 /**
  * \ingroup simix_host_management
@@ -45,6 +45,28 @@ const char* simcall_host_get_name(smx_host_t host)
   return simcall_BODY_host_get_name(host);
 }
 
+/**
+ * \ingroup simix_host_management
+ * \brief Start the host if it is off
+ *
+ * \param host A SIMIX host
+ */
+void simcall_host_on(smx_host_t host)
+{
+  simcall_BODY_host_on(host);
+}
+
+/**
+ * \ingroup simix_host_management
+ * \brief Stop the host if it is on
+ *
+ * \param host A SIMIX host
+ */
+void simcall_host_off(smx_host_t host)
+{
+  simcall_BODY_host_off(host);
+}
+
 /**
  * \ingroup simix_host_management
  * \brief Returns a dict of the properties assigned to a host.
@@ -132,31 +154,6 @@ int simcall_host_get_state(smx_host_t host)
   return simcall_BODY_host_get_state(host);
 }
 
-/**
- * \ingroup simix_host_management
- * \brief Returns the user data associated to a host.
- *
- * \param host SIMIX host
- * \return the user data of this host
- */
-void* simcall_host_get_data(smx_host_t host)
-{
-  return simcall_BODY_host_get_data(host);
-}
-
-/**
- * \ingroup simix_host_management
- * \brief Sets the user data associated to a host.
- *
- * The host must not have previous user data associated to it.
- * \param host A SIMIX host
- * \param data The user data to set
- */
-void simcall_host_set_data(smx_host_t host, void *data)
-{
-  simcall_host_set_data(host, data);
-}
-
 /**
  * \ingroup simix_host_management
  * \brief Returns the power peak of a host.
@@ -231,17 +228,19 @@ double simcall_host_get_consumed_energy(smx_host_t host)
  * \param host SIMIX host where the action will be executed
  * \param computation_amount amount Computation amount (in bytes)
  * \param priority computation priority
+ * \param bound
+ * \param affinity_mask
  * \return A new SIMIX execution action
  */
 smx_action_t simcall_host_execute(const char *name, smx_host_t host,
                                     double computation_amount,
-                                    double priority)
+                                    double priority, double bound, unsigned long affinity_mask)
 {
   /* checking for infinite values */
   xbt_assert(isfinite(computation_amount), "computation_amount is not finite!");
   xbt_assert(isfinite(priority), "priority is not finite!");
   
-  return simcall_BODY_host_execute(name, host, computation_amount, priority);
+  return simcall_BODY_host_execute(name, host, computation_amount, priority, bound, affinity_mask);
 }
 
 /**
@@ -351,6 +350,33 @@ void simcall_host_execution_set_priority(smx_action_t execution, double priority
   simcall_BODY_host_execution_set_priority(execution, priority);
 }
 
+/**
+ * \ingroup simix_host_management
+ * \brief Changes the capping (the maximum CPU utilization) of an execution action.
+ *
+ * This functions changes the capping only. It calls a surf function.
+ * \param execution The execution action
+ * \param bound The new bound
+ */
+void simcall_host_execution_set_bound(smx_action_t execution, double bound)
+{
+  simcall_BODY_host_execution_set_bound(execution, bound);
+}
+
+/**
+ * \ingroup simix_host_management
+ * \brief Changes the CPU affinity of an execution action.
+ *
+ * This functions changes the CPU affinity of an execution action. See taskset(1) on Linux.
+ * \param execution The execution action
+ * \param host Host
+ * \param mask Affinity mask
+ */
+void simcall_host_execution_set_affinity(smx_action_t execution, smx_host_t host, unsigned long mask)
+{
+  simcall_BODY_host_execution_set_affinity(execution, host, mask);
+}
+
 /**
  * \ingroup simix_host_management
  * \brief Waits for the completion of an execution action and destroy it.
@@ -362,6 +388,169 @@ e_smx_state_t simcall_host_execution_wait(smx_action_t execution)
   return simcall_BODY_host_execution_wait(execution);
 }
 
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Create a VM on the given physical host.
+ *
+ * \param name VM name
+ * \param host Physical host
+ *
+ * \return The host object of the VM
+ */
+void* simcall_vm_create(const char *name, smx_host_t phys_host){
+  /* will jump to SIMIX_pre_vm_create() in src/simix/smx_smurf_private.h */
+  return simcall_BODY_vm_create(name, phys_host);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Start the given VM to the given physical host
+ *
+ * \param vm VM
+ */
+void simcall_vm_start(smx_host_t vm)
+{
+  /* will jump to SIMIX_pre_vm_start in src/simix/smx_smurf_private.h */
+  simcall_BODY_vm_start(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Get the state of the given VM
+ *
+ * \param vm VM
+ * \return The state of the VM
+ */
+int simcall_vm_get_state(smx_host_t vm)
+{
+  /* will jump to SIMIX_pre_vm_get_state in src/simix/smx_smurf_private.h */
+  return simcall_BODY_vm_get_state(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Get the name of the physical host on which the given VM runs.
+ *
+ * \param vm VM
+ * \return The name of the physical host
+ */
+void *simcall_vm_get_pm(smx_host_t vm)
+{
+  /* will jump to SIMIX_pre_vm_migrate in src/simix/smx_smurf_private.h */
+  return simcall_BODY_vm_get_pm(vm);
+}
+
+void simcall_vm_set_bound(smx_host_t vm, double bound)
+{
+  /* will jump to SIMIX_pre_vm_set_bound in src/simix/smx_smurf_private.h */
+  simcall_BODY_vm_set_bound(vm, bound);
+}
+
+void simcall_vm_set_affinity(smx_host_t vm, smx_host_t pm, unsigned long mask)
+{
+  /* will jump to SIMIX_pre_vm_set_affinity in src/simix/smx_smurf_private.h */
+  simcall_BODY_vm_set_affinity(vm, pm, mask);
+}
+
+void simcall_host_get_params(smx_host_t vm, ws_params_t params)
+{
+  /* will jump to SIMIX_pre_host_get_params in src/simix/smx_smurf_private.h */
+  simcall_BODY_host_get_params(vm, params);
+}
+
+void simcall_host_set_params(smx_host_t vm, ws_params_t params)
+{
+  /* will jump to SIMIX_pre_host_set_params in src/simix/smx_smurf_private.h */
+  simcall_BODY_host_set_params(vm, params);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Migrate the given VM to the given physical host
+ *
+ * \param vm VM
+ * \param host Destination physical host
+ */
+void simcall_vm_migrate(smx_host_t vm, smx_host_t host)
+{
+  /* will jump to SIMIX_pre_vm_migrate in src/simix/smx_smurf_private.h */
+  simcall_BODY_vm_migrate(vm, host);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Suspend the given VM
+ *
+ * \param vm VM
+ */
+void simcall_vm_suspend(smx_host_t vm)
+{
+  /* will jump to SIMIX_pre_vm_suspend in src/simix/smx_smurf_private.h */
+  simcall_BODY_vm_suspend(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Resume the given VM
+ *
+ * \param vm VM
+ */
+void simcall_vm_resume(smx_host_t vm)
+{
+  /* will jump to SIMIX_pre_vm_resume in src/simix/smx_smurf_private.h */
+  simcall_BODY_vm_resume(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Save the given VM
+ *
+ * \param vm VM
+ */
+void simcall_vm_save(smx_host_t vm)
+{
+  /* will jump to SIMIX_pre_vm_save in src/simix/smx_smurf_private.h */
+  simcall_BODY_vm_save(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Restore the given VM
+ *
+ * \param vm VM
+ */
+void simcall_vm_restore(smx_host_t vm)
+{
+  /* will jump to SIMIX_pre_vm_restore in src/simix/smx_smurf_private.h */
+  simcall_BODY_vm_restore(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Shutdown the given VM
+ *
+ * \param vm VM
+ */
+void simcall_vm_shutdown(smx_host_t vm)
+{
+  /* will jump to SIMIX_pre_vm_shutdown in src/simix/smx_smurf_private.h */
+  simcall_BODY_vm_shutdown(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Destroy the given VM
+ *
+ * \param vm VM
+ */
+void simcall_vm_destroy(smx_host_t vm)
+{
+   /* will jump to SIMIX_pre_vm_destroy in src/simix/smx_smurf_private.h */
+  simcall_BODY_vm_destroy(vm);
+}
+
+
 /**
  * \ingroup simix_process_management
  * \brief Creates and runs a new SIMIX process.
@@ -699,13 +888,6 @@ smx_rdv_t simcall_rdv_get_by_name(const char *name)
    * skipping the simcall (for now). It works in parallel, it won't work on
    * distributed but probably we will change MSG for that. */
 
-  /*
-  smx_simcall_t simcall = simcall_mine();
-  simcall->call = SIMCALL_RDV_GEY_BY_NAME;
-  simcall->rdv_get_by_name.name = name;
-  SIMIX_simcall_push(simcall->issuer);
-  return simcall->rdv_get_by_name.result;*/
-
   return SIMIX_rdv_get_by_name(name);
 }
 
@@ -792,11 +974,13 @@ smx_action_t simcall_comm_isend(smx_rdv_t rdv, double task_size, double rate,
                                  src_buff_size, match_fun,
                                  clean_fun, data, detached);
 }
+
 /**
  * \ingroup simix_comm_management
  */
 void simcall_comm_recv(smx_rdv_t rdv, void *dst_buff, size_t * dst_buff_size,
-                         int (*match_fun)(void *, void *, smx_action_t), void *data, double timeout)
+                       int (*match_fun)(void *, void *, smx_action_t),
+                       void *data, double timeout, double rate)
 {
   xbt_assert(isfinite(timeout), "timeout is not finite!");
   xbt_assert(rdv, "No rendez-vous point defined for recv");
@@ -805,61 +989,28 @@ void simcall_comm_recv(smx_rdv_t rdv, void *dst_buff, size_t * dst_buff_size,
     /* the model-checker wants two separate simcalls */
     smx_action_t comm = NULL; /* MC needs the comm to be set to NULL during the simcall */
     comm = simcall_comm_irecv(rdv, dst_buff, dst_buff_size,
-        match_fun, data);
+                              match_fun, data, rate);
     simcall_comm_wait(comm, timeout);
     comm = NULL;
   }
   else {
     simcall_BODY_comm_recv(rdv, dst_buff, dst_buff_size,
-                           match_fun, data, timeout);
-  }
-}
-/**
- * \ingroup simix_comm_management
- */
-smx_action_t simcall_comm_irecv(smx_rdv_t rdv, void *dst_buff, size_t *dst_buff_size,
-                                  int (*match_fun)(void *, void *, smx_action_t), void *data)
-{
-  xbt_assert(rdv, "No rendez-vous point defined for irecv");
-
-  return simcall_BODY_comm_irecv(rdv, dst_buff, dst_buff_size, 
-                                 match_fun, data);
-}
-
-
-/**
- * \ingroup simix_comm_management
- */
-void simcall_comm_recv_bounded(smx_rdv_t rdv, void *dst_buff, size_t * dst_buff_size,
-                         int (*match_fun)(void *, void *, smx_action_t), void *data, double timeout, double rate)
-{
-  xbt_assert(isfinite(timeout), "timeout is not finite!");
-  xbt_assert(rdv, "No rendez-vous point defined for recv");
-
-  if (MC_is_active()) {
-    /* the model-checker wants two separate simcalls */
-    smx_action_t comm = simcall_comm_irecv_bounded(rdv, dst_buff, dst_buff_size,
-        match_fun, data, rate);
-    simcall_comm_wait(comm, timeout);
-  }
-  else {
-    simcall_BODY_comm_recv_bounded(rdv, dst_buff, dst_buff_size,
                            match_fun, data, timeout, rate);
   }
 }
 /**
  * \ingroup simix_comm_management
  */
-smx_action_t simcall_comm_irecv_bounded(smx_rdv_t rdv, void *dst_buff, size_t *dst_buff_size,
-                                  int (*match_fun)(void *, void *, smx_action_t), void *data, double rate)
+smx_action_t simcall_comm_irecv(smx_rdv_t rdv, void *dst_buff, size_t *dst_buff_size,
+                                int (*match_fun)(void *, void *, smx_action_t),
+                                void *data, double rate)
 {
   xbt_assert(rdv, "No rendez-vous point defined for irecv");
 
-  return simcall_BODY_comm_irecv_bounded(rdv, dst_buff, dst_buff_size,
+  return simcall_BODY_comm_irecv(rdv, dst_buff, dst_buff_size,
                                  match_fun, data, rate);
 }
 
-
 /**
  * \ingroup simix_comm_management
  */
@@ -871,22 +1022,6 @@ smx_action_t simcall_comm_iprobe(smx_rdv_t rdv, int src, int tag,
   return simcall_BODY_comm_iprobe(rdv, src, tag, match_fun, data);
 }
 
-void simcall_comm_destroy(smx_action_t comm)
-{
-  xbt_assert(comm, "Invalid parameter");
-
-  /* FIXME remove this simcall type: comms are auto-destroyed now */
-
-  /*
-  smx_simcall_t simcall = simcall_mine();
-
-  simcall->call = SIMCALL_COMM_DESTROY;
-  simcall->comm_destroy.comm = comm;
-
-  SIMIX_simcall_push(simcall->issuer);
-  */
-}
-
 /**
  * \ingroup simix_comm_management
  */
@@ -1130,7 +1265,7 @@ smx_sem_t simcall_sem_init(int capacity)
  */
 void simcall_sem_destroy(smx_sem_t sem)
 {
-  simcall_sem_destroy(sem);
+  simcall_BODY_sem_destroy(sem);
 }
 
 /**
@@ -1200,14 +1335,14 @@ void* simcall_file_get_data(smx_file_t fd)
  */
 void simcall_file_set_data(smx_file_t fd, void *data)
 {
-  simcall_file_set_data(fd, data);
+  simcall_BODY_file_set_data(fd, data);
 }
 
 /**
  * \ingroup simix_file_management
  *
  */
-sg_storage_size_t simcall_file_read(smx_file_t fd, sg_storage_size_t size)
+sg_size_t simcall_file_read(smx_file_t fd, sg_size_t size)
 {
   return simcall_BODY_file_read(fd, size);
 }
@@ -1216,7 +1351,7 @@ sg_storage_size_t simcall_file_read(smx_file_t fd, sg_storage_size_t size)
  * \ingroup simix_file_management
  *
  */
-sg_storage_size_t simcall_file_write(smx_file_t fd, sg_storage_size_t size)
+sg_size_t simcall_file_write(smx_file_t fd, sg_size_t size)
 {
   return simcall_BODY_file_write(fd, size);
 }
@@ -1260,10 +1395,18 @@ xbt_dict_t simcall_file_ls(const char* mount, const char* path)
  * \ingroup simix_file_management
  *
  */
-sg_storage_size_t simcall_file_get_size (smx_file_t fd){
+sg_size_t simcall_file_get_size(smx_file_t fd){
   return simcall_BODY_file_get_size(fd);
 }
 
+/**
+ * \ingroup simix_file_management
+ *
+ */
+sg_size_t simcall_file_tell(smx_file_t fd){
+  return simcall_BODY_file_tell(fd);
+}
+
 /**
  * \ingroup simix_file_management
  *
@@ -1273,13 +1416,30 @@ xbt_dynar_t simcall_file_get_info(smx_file_t fd)
   return simcall_BODY_file_get_info(fd);
 }
 
+/**
+ * \ingroup simix_file_management
+ *
+ */
+int simcall_file_seek(smx_file_t fd, sg_size_t offset, int origin){
+  return simcall_BODY_file_seek(fd, offset, origin);
+}
+
+/**
+ * \ingroup simix_file_management
+ *
+ */
+void simcall_storage_file_rename(smx_storage_t storage, const char* src,  const char* dest)
+{
+  return simcall_BODY_storage_file_rename(storage, src, dest);
+}
+
 /**
  * \ingroup simix_storage_management
  * \brief Returns the free space size on a given storage element.
  * \param storage name
- * \return Return the free space size on a given storage element (as sg_storage_size_t)
+ * \return Return the free space size on a given storage element (as sg_size_t)
  */
-sg_storage_size_t simcall_storage_get_free_size (const char* name){
+sg_size_t simcall_storage_get_free_size (const char* name){
   return simcall_BODY_storage_get_free_size(name);
 }
 
@@ -1287,9 +1447,9 @@ sg_storage_size_t simcall_storage_get_free_size (const char* name){
  * \ingroup simix_storage_management
  * \brief Returns the used space size on a given storage element.
  * \param storage name
- * \return Return the used space size on a given storage element (as sg_storage_size_t)
+ * \return Return the used space size on a given storage element (as sg_size_t)
  */
-sg_storage_size_t simcall_storage_get_used_size (const char* name){
+sg_size_t simcall_storage_get_used_size (const char* name){
   return simcall_BODY_storage_get_used_size(name);
 }
 
diff --git a/src/simix/smx_vm.c b/src/simix/smx_vm.c
new file mode 100644 (file)
index 0000000..091e92a
--- /dev/null
@@ -0,0 +1,395 @@
+/* Copyright (c) 2007-2014. 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 "smx_private.h"
+#include "xbt/sysdep.h"
+#include "xbt/log.h"
+#include "xbt/dict.h"
+#include "mc/mc.h"
+
+//If you need to log some stuffs, just uncomment these two lines and uses XBT_DEBUG for instance
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_vm, simix, "Logging specific to SIMIX (vms)");
+
+/* **** create a VM **** */
+
+/**
+ * \brief Internal function to create a SIMIX host.
+ * \param name name of the host to create
+ * \param data some user data (may be NULL)
+ */
+smx_host_t SIMIX_vm_create(const char *name, smx_host_t ind_phys_host)
+{
+  /* Create surf associated resource */
+  surf_vm_workstation_model_create(name, ind_phys_host);
+
+  smx_host_t smx_host = SIMIX_host_create(name, ind_phys_host, NULL);
+
+  /* We will be able to register the VM to its physical host, so that we can promptly
+   * retrieve the list VMs on the physical host. */
+
+  return smx_host;
+}
+
+
+smx_host_t SIMIX_pre_vm_create(smx_simcall_t simcall, const char *name, smx_host_t ind_phys_host)
+{
+  return SIMIX_vm_create(name, ind_phys_host);
+}
+
+
+/* works for VMs and PMs */
+static long host_get_ramsize(smx_host_t vm, int *overcommit)
+{
+  s_ws_params_t params;
+  surf_workstation_get_params(vm, &params);
+
+  if (overcommit)
+    *overcommit = params.overcommit;
+
+  return params.ramsize;
+}
+
+/* **** start a VM **** */
+static int __can_be_started(smx_host_t vm)
+{
+  smx_host_t pm = surf_vm_workstation_get_pm(vm);
+
+  int pm_overcommit = 0;
+  long pm_ramsize = host_get_ramsize(pm, &pm_overcommit);
+  long vm_ramsize = host_get_ramsize(vm, NULL);
+
+  if (!pm_ramsize) {
+    /* We assume users do not want to care about ramsize. */
+    return 1;
+  }
+
+  if (pm_overcommit) {
+    XBT_INFO("%s allows memory overcommit.", pm->key);
+    return 1;
+  }
+
+  long total_ramsize_of_vms = 0;
+  xbt_dynar_t dyn_vms = surf_workstation_get_vms(pm);
+  {
+    unsigned int cursor = 0;
+    smx_host_t another_vm;
+    xbt_dynar_foreach(dyn_vms, cursor, another_vm) {
+      long another_vm_ramsize = host_get_ramsize(vm, NULL);
+      total_ramsize_of_vms += another_vm_ramsize;
+    }
+  }
+
+  if (vm_ramsize > pm_ramsize - total_ramsize_of_vms) {
+    XBT_WARN("cannnot start %s@%s due to memory shortage: vm_ramsize %ld, free %ld, pm_ramsize %ld (bytes).",
+        vm->key, pm->key, vm_ramsize, pm_ramsize - total_ramsize_of_vms, pm_ramsize);
+    xbt_dynar_free(&dyn_vms);
+    return 0;
+  }
+
+  xbt_dynar_free(&dyn_vms);
+       return 1;
+}
+
+void SIMIX_vm_start(smx_host_t ind_vm)
+{
+  if (__can_be_started(ind_vm))
+    surf_resource_set_state(surf_workstation_resource_priv(ind_vm),
+                            (int)SURF_VM_STATE_RUNNING);
+  else
+    THROWF(vm_error, 0, "The VM %s cannot be started", SIMIX_host_get_name(ind_vm));
+}
+
+
+
+void SIMIX_pre_vm_start(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+  SIMIX_vm_start(ind_vm);
+}
+
+int SIMIX_vm_get_state(smx_host_t ind_vm)
+{
+  return surf_resource_get_state(surf_workstation_resource_priv(ind_vm));
+}
+
+int SIMIX_pre_vm_get_state(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+  return SIMIX_vm_get_state(ind_vm);
+}
+
+
+/**
+ * \brief Function to migrate a SIMIX VM host. 
+ *
+ * \param host the vm host to migrate (a smx_host_t)
+ */
+void SIMIX_vm_migrate(smx_host_t ind_vm, smx_host_t ind_dst_pm)
+{
+  /* precopy migration makes the VM temporally paused */
+  e_surf_vm_state_t state = SIMIX_vm_get_state(ind_vm);
+  xbt_assert(state == SURF_VM_STATE_SUSPENDED);
+
+  /* jump to vm_ws_migrate(). this will update the vm location. */
+  surf_vm_workstation_migrate(ind_vm, ind_dst_pm);
+}
+
+void SIMIX_pre_vm_migrate(smx_simcall_t simcall, smx_host_t ind_vm, smx_host_t ind_dst_pm)
+{
+  SIMIX_vm_migrate(ind_vm, ind_dst_pm);
+}
+
+
+/**
+ * \brief Function to get the physical host of the given SIMIX VM host.
+ *
+ * \param host the vm host to get_phys_host (a smx_host_t)
+ */
+void *SIMIX_vm_get_pm(smx_host_t ind_vm)
+{
+  /* jump to vm_ws_get_pm(). this will return the vm name. */
+  return surf_vm_workstation_get_pm(ind_vm);
+}
+
+void *SIMIX_pre_vm_get_pm(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+  return SIMIX_vm_get_pm(ind_vm);
+}
+
+
+/**
+ * \brief Function to set the CPU bound of the given SIMIX VM host.
+ *
+ * \param host the vm host (a smx_host_t)
+ * \param bound bound (a double)
+ */
+void SIMIX_vm_set_bound(smx_host_t ind_vm, double bound)
+{
+  /* jump to vm_ws_set_vm_bound(). */
+  surf_vm_workstation_set_bound(ind_vm, bound);
+}
+
+void SIMIX_pre_vm_set_bound(smx_simcall_t simcall, smx_host_t ind_vm, double bound)
+{
+  SIMIX_vm_set_bound(ind_vm, bound);
+}
+
+
+/**
+ * \brief Function to set the CPU affinity of the given SIMIX VM host.
+ *
+ * \param host the vm host (a smx_host_t)
+ * \param host the pm host (a smx_host_t)
+ * \param mask affinity mask (a unsigned long)
+ */
+void SIMIX_vm_set_affinity(smx_host_t ind_vm, smx_host_t ind_pm, unsigned long mask)
+{
+  /* make sure this at the MSG layer. */
+  xbt_assert(SIMIX_vm_get_pm(ind_vm) == ind_pm);
+
+  /* jump to vm_ws_set_vm_affinity(). */
+  surf_vm_workstation_set_affinity(ind_vm, ind_pm, mask);
+}
+
+void SIMIX_pre_vm_set_affinity(smx_simcall_t simcall, smx_host_t ind_vm, smx_host_t ind_pm, unsigned long mask)
+{
+  SIMIX_vm_set_affinity(ind_vm, ind_pm, mask);
+}
+
+
+/**
+ * \brief Function to suspend a SIMIX VM host. This function stops the exection of the
+ * VM. All the processes on this VM will pause. The state of the VM is
+ * preserved on memory. We can later resume it again.
+ *
+ * \param host the vm host to suspend (a smx_host_t)
+ */
+void SIMIX_vm_suspend(smx_host_t ind_vm, smx_process_t issuer)
+{
+  const char *name = SIMIX_host_get_name(ind_vm);
+
+  if (SIMIX_vm_get_state(ind_vm) != SURF_VM_STATE_RUNNING)
+    THROWF(vm_error, 0, "VM(%s) is not running", name);
+
+  XBT_DEBUG("suspend VM(%s), where %d processes exist", name, xbt_swag_size(SIMIX_host_priv(ind_vm)->process_list));
+
+  /* jump to vm_ws_suspend. The state will be set. */
+  surf_vm_workstation_suspend(ind_vm);
+
+  smx_process_t smx_process, smx_process_safe;
+  xbt_swag_foreach_safe(smx_process, smx_process_safe, SIMIX_host_priv(ind_vm)->process_list) {
+    XBT_DEBUG("suspend %s", smx_process->name);
+    SIMIX_process_suspend(smx_process, issuer);
+  }
+
+  XBT_DEBUG("suspend all processes on the VM done done");
+}
+
+void SIMIX_pre_vm_suspend(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+  if (simcall->issuer->smx_host == ind_vm) {
+    XBT_ERROR("cannot suspend the VM where I run");
+    DIE_IMPOSSIBLE;
+  }
+
+  SIMIX_vm_suspend(ind_vm, simcall->issuer);
+
+  XBT_DEBUG("SIMIX_pre_vm_suspend done");
+}
+
+
+/**
+ * \brief Function to resume a SIMIX VM host. This function restart the execution of the
+ * VM. All the processes on this VM will run again. 
+ *
+ * \param host the vm host to resume (a smx_host_t)
+ */
+void SIMIX_vm_resume(smx_host_t ind_vm, smx_process_t issuer)
+{
+  const char *name = SIMIX_host_get_name(ind_vm);
+
+  if (SIMIX_vm_get_state(ind_vm) != SURF_VM_STATE_SUSPENDED)
+    THROWF(vm_error, 0, "VM(%s) was not suspended", name);
+
+  XBT_DEBUG("resume VM(%s), where %d processes exist", name, xbt_swag_size(SIMIX_host_priv(ind_vm)->process_list));
+
+  /* jump to vm_ws_resume() */
+  surf_vm_workstation_resume(ind_vm);
+
+  smx_process_t smx_process, smx_process_safe;
+  xbt_swag_foreach_safe(smx_process, smx_process_safe, SIMIX_host_priv(ind_vm)->process_list) {
+    XBT_DEBUG("resume %s", smx_process->name);
+    SIMIX_process_resume(smx_process, issuer);
+  }
+}
+
+void SIMIX_pre_vm_resume(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+  SIMIX_vm_resume(ind_vm, simcall->issuer);
+}
+
+
+/**
+ * \brief Function to save a SIMIX VM host.
+ * This function is the same as vm_suspend, but the state of the VM is saved to the disk, and not preserved on memory.
+ * We can later restore it again.
+ *
+ * \param host the vm host to save (a smx_host_t)
+ */
+void SIMIX_vm_save(smx_host_t ind_vm, smx_process_t issuer)
+{
+  const char *name = SIMIX_host_get_name(ind_vm);
+
+  if (SIMIX_vm_get_state(ind_vm) != SURF_VM_STATE_RUNNING)
+    THROWF(vm_error, 0, "VM(%s) is not running", name);
+
+
+  XBT_DEBUG("save VM(%s), where %d processes exist", name, xbt_swag_size(SIMIX_host_priv(ind_vm)->process_list));
+
+  /* jump to vm_ws_save() */
+  surf_vm_workstation_save(ind_vm);
+
+  smx_process_t smx_process, smx_process_safe;
+  xbt_swag_foreach_safe(smx_process, smx_process_safe, SIMIX_host_priv(ind_vm)->process_list) {
+    XBT_DEBUG("suspend %s", smx_process->name);
+    SIMIX_process_suspend(smx_process, issuer);
+  }
+}
+
+void SIMIX_pre_vm_save(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+  SIMIX_vm_save(ind_vm, simcall->issuer);
+}
+
+
+/**
+ * \brief Function to restore a SIMIX VM host. This function restart the execution of the
+ * VM. All the processes on this VM will run again. 
+ *
+ * \param host the vm host to restore (a smx_host_t)
+ */
+void SIMIX_vm_restore(smx_host_t ind_vm, smx_process_t issuer)
+{
+  const char *name = SIMIX_host_get_name(ind_vm);
+
+  if (SIMIX_vm_get_state(ind_vm) != SURF_VM_STATE_SAVED)
+    THROWF(vm_error, 0, "VM(%s) was not saved", name);
+
+  XBT_DEBUG("restore VM(%s), where %d processes exist", name, xbt_swag_size(SIMIX_host_priv(ind_vm)->process_list));
+
+  /* jump to vm_ws_restore() */
+  surf_vm_workstation_resume(ind_vm);
+
+  smx_process_t smx_process, smx_process_safe;
+  xbt_swag_foreach_safe(smx_process, smx_process_safe, SIMIX_host_priv(ind_vm)->process_list) {
+    XBT_DEBUG("resume %s", smx_process->name);
+    SIMIX_process_resume(smx_process, issuer);
+  }
+}
+
+void SIMIX_pre_vm_restore(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+  SIMIX_vm_restore(ind_vm, simcall->issuer);
+}
+
+
+/**
+ * \brief Function to shutdown a SIMIX VM host. This function powers off the
+ * VM. All the processes on this VM will be killed. But, the state of the VM is
+ * preserved on memory. We can later start it again.
+ *
+ * \param host the vm host to shutdown (a smx_host_t)
+ */
+void SIMIX_vm_shutdown(smx_host_t ind_vm, smx_process_t issuer)
+{
+  const char *name = SIMIX_host_get_name(ind_vm);
+
+  if (SIMIX_vm_get_state(ind_vm) != SURF_VM_STATE_RUNNING)
+    THROWF(vm_error, 0, "VM(%s) is not running", name);
+
+  XBT_DEBUG("shutdown %s", name);
+  XBT_DEBUG("%d processes in the VM", xbt_swag_size(SIMIX_host_priv(ind_vm)->process_list));
+
+  smx_process_t smx_process, smx_process_safe;
+  xbt_swag_foreach_safe(smx_process, smx_process_safe, SIMIX_host_priv(ind_vm)->process_list) {
+    XBT_DEBUG("kill %s", smx_process->name);
+    SIMIX_process_kill(smx_process, issuer);
+  }
+
+  /* FIXME: we may have to do something at the surf layer, e.g., vcpu action */
+  surf_resource_set_state(surf_workstation_resource_priv(ind_vm),
+                          (int)SURF_VM_STATE_CREATED);
+}
+
+void SIMIX_pre_vm_shutdown(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+  SIMIX_vm_shutdown(ind_vm, simcall->issuer);
+}
+
+
+/**
+ * \brief Function to destroy a SIMIX VM host.
+ *
+ * \param host the vm host to destroy (a smx_host_t)
+ */
+void SIMIX_vm_destroy(smx_host_t ind_vm)
+{
+  /* this code basically performs a similar thing like SIMIX_host_destroy() */
+
+  xbt_assert((ind_vm != NULL), "Invalid parameters");
+  const char *hostname = SIMIX_host_get_name(ind_vm);
+
+  XBT_DEBUG("destroy %s", hostname);
+
+  /* this will call the registered callback function, i.e., SIMIX_host_destroy().  */
+  xbt_lib_unset(host_lib, hostname, SIMIX_HOST_LEVEL, 1);
+
+  /* jump to vm_ws_destroy(). The surf level resource will be freed. */
+  surf_vm_workstation_destroy(ind_vm);
+}
+
+void SIMIX_pre_vm_destroy(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+  SIMIX_vm_destroy(ind_vm);
+}
index 602d540..6bec72d 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
@@ -120,7 +126,7 @@ smpi_coll_tuned_allgather_2dmesh(void *send_buff, int send_count, MPI_Datatype
   block_size = extent * send_count;
 
   if (!is_2dmesh(num_procs, &X, &Y))
-    return MPI_ERR_COMM;
+    THROWF(arg_error,0, "allgather_2dmesh algorithm can't be used with this number of processes! ");
 
   my_row_base = (rank / Y) * Y;
   my_col_base = rank % Y;
index 5a22437..ab964a1 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
@@ -103,7 +109,9 @@ int smpi_coll_tuned_allgather_3dmesh(void *send_buff, int send_count,
   num_procs = smpi_comm_size(comm);
   extent = smpi_datatype_get_extent(send_type);
 
-  is_3dmesh(num_procs, &X, &Y, &Z);
+  if (!is_3dmesh(num_procs, &X, &Y, &Z))
+    THROWF(arg_error,0, "allgather_3dmesh algorithm can't be used with this number of processes! ");
+
 
   num_reqs = X;
 
index 5783741..b1bcc88 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 // Allgather - gather/bcast algorithm
index 0873395..2cabbcd 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 // Allgather-Non-Topoloty-Scecific-Logical-Ring algorithm
index 28ab0b3..659be11 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 // Allgather-Non-Topoloty-Scecific-Logical-Ring algorithm
index 3bbad64..81c1449 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 #ifndef NUM_CORE
 #define NUM_CORE 8
@@ -18,13 +24,23 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount,
 
   int i, send_offset, recv_offset;
   int intra_rank, inter_rank;
-  intra_rank = rank % NUM_CORE;
-  inter_rank = rank / NUM_CORE;
-  int inter_comm_size = (comm_size + NUM_CORE - 1) / NUM_CORE;
-  int num_core_in_current_smp = NUM_CORE;
+
+  int num_core = simcall_host_get_core(SIMIX_host_self());
+  // do we use the default one or the number of cores in the platform ?
+  // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+  if (num_core == 1) num_core = NUM_CORE;
+
+
+  intra_rank = rank % num_core;
+  inter_rank = rank / num_core;
+  int inter_comm_size = (comm_size + num_core - 1) / num_core;
+  int num_core_in_current_smp = num_core;
+
+  if(comm_size%num_core)
+    THROWF(arg_error,0, "allgather SMP NTS algorithm can't be used with non multiple of NUM_CORE=%d number of processes ! ", num_core);
 
   /* for too small number of processes, use default implementation */
-  if (comm_size <= NUM_CORE) {
+  if (comm_size <= num_core) {
     XBT_WARN("MPI_allgather_SMP_NTS use default MPI_allgather.");        
     smpi_mpi_allgather(sbuf, scount, stype, rbuf, rcount, rtype, comm);
     return MPI_SUCCESS;    
@@ -32,7 +48,7 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount,
 
   // the last SMP node may have fewer number of running processes than all others
   if (inter_rank == (inter_comm_size - 1)) {
-    num_core_in_current_smp = comm_size - (inter_rank * NUM_CORE);
+    num_core_in_current_smp = comm_size - (inter_rank * num_core);
   }
   //copy corresponding message from sbuf to rbuf
   recv_offset = rank * rextent * rcount;
@@ -45,9 +61,9 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount,
   for (i = 1; i < num_core_in_current_smp; i++) {
 
     dst =
-        (inter_rank * NUM_CORE) + (intra_rank + i) % (num_core_in_current_smp);
+        (inter_rank * num_core) + (intra_rank + i) % (num_core_in_current_smp);
     src =
-        (inter_rank * NUM_CORE) + (intra_rank - i +
+        (inter_rank * num_core) + (intra_rank - i +
                                    num_core_in_current_smp) %
         (num_core_in_current_smp);
     recv_offset = src * rextent * rcount;
@@ -67,35 +83,35 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount,
     MPI_Request *rrequest_array = xbt_new(MPI_Request, inter_comm_size - 1);
     MPI_Request *srequest_array = xbt_new(MPI_Request, inter_comm_size - 1);
 
-    src = ((inter_rank - 1 + inter_comm_size) % inter_comm_size) * NUM_CORE;
-    dst = ((inter_rank + 1) % inter_comm_size) * NUM_CORE;
+    src = ((inter_rank - 1 + inter_comm_size) % inter_comm_size) * num_core;
+    dst = ((inter_rank + 1) % inter_comm_size) * num_core;
 
     // post all inter Irecv
     for (i = 0; i < inter_comm_size - 1; i++) {
       recv_offset =
           ((inter_rank - i - 1 +
-            inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount;
-      rrequest_array[i] = smpi_mpi_irecv((char *)rbuf + recv_offset, rcount * NUM_CORE,
+            inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
+      rrequest_array[i] = smpi_mpi_irecv((char *)rbuf + recv_offset, rcount * num_core,
                                          rtype, src, tag + i, comm);
     }
 
     // send first message
     send_offset =
         ((inter_rank +
-          inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount;
-    srequest_array[0] = smpi_mpi_isend((char *)rbuf + send_offset, scount * NUM_CORE,
+          inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
+    srequest_array[0] = smpi_mpi_isend((char *)rbuf + send_offset, scount * num_core,
                                        stype, dst, tag, comm);
 
     // loop : recv-inter , send-inter, send-intra (linear-bcast)
     for (i = 0; i < inter_comm_size - 2; i++) {
       recv_offset =
           ((inter_rank - i - 1 +
-            inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount;
+            inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
       smpi_mpi_wait(&rrequest_array[i], MPI_STATUS_IGNORE);
-      srequest_array[i + 1] = smpi_mpi_isend((char *)rbuf + recv_offset, scount * NUM_CORE,
+      srequest_array[i + 1] = smpi_mpi_isend((char *)rbuf + recv_offset, scount * num_core,
                                              stype, dst, tag + i + 1, comm);
       if (num_core_in_current_smp > 1) {
-        smpi_mpi_send((char *)rbuf + recv_offset, scount * NUM_CORE,
+        smpi_mpi_send((char *)rbuf + recv_offset, scount * num_core,
                       stype, (rank + 1), tag + i + 1, comm);
       }
     }
@@ -103,12 +119,12 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount,
     // recv last message and send_intra
     recv_offset =
         ((inter_rank - i - 1 +
-          inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount;
-    //recv_offset = ((inter_rank + 1) % inter_comm_size) * NUM_CORE * sextent * scount;
+          inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
+    //recv_offset = ((inter_rank + 1) % inter_comm_size) * num_core * sextent * scount;
     //i=inter_comm_size-2;
     smpi_mpi_wait(&rrequest_array[i], MPI_STATUS_IGNORE);
     if (num_core_in_current_smp > 1) {
-      smpi_mpi_send((char *)rbuf + recv_offset, scount * NUM_CORE,
+      smpi_mpi_send((char *)rbuf + recv_offset, scount * num_core,
                                   stype, (rank + 1), tag + i + 1, comm);
     }
 
@@ -121,8 +137,8 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount,
     for (i = 0; i < inter_comm_size - 1; i++) {
       recv_offset =
           ((inter_rank - i - 1 +
-            inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount;
-      smpi_mpi_recv((char *) rbuf + recv_offset, (rcount * NUM_CORE), rtype,
+            inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
+      smpi_mpi_recv((char *) rbuf + recv_offset, (rcount * num_core), rtype,
                     rank - 1, tag + i + 1, comm, MPI_STATUS_IGNORE);
     }
   }
@@ -131,10 +147,10 @@ int smpi_coll_tuned_allgather_SMP_NTS(void *sbuf, int scount,
     for (i = 0; i < inter_comm_size - 1; i++) {
       recv_offset =
           ((inter_rank - i - 1 +
-            inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount;
-      smpi_mpi_recv((char *) rbuf + recv_offset, (rcount * NUM_CORE), rtype,
+            inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
+      smpi_mpi_recv((char *) rbuf + recv_offset, (rcount * num_core), rtype,
                     rank - 1, tag + i + 1, comm, MPI_STATUS_IGNORE);
-      smpi_mpi_send((char *) rbuf + recv_offset, (scount * NUM_CORE), stype,
+      smpi_mpi_send((char *) rbuf + recv_offset, (scount * num_core), stype,
                     (rank + 1), tag + i + 1, comm);
     }
   }
index 2b49321..eeaab1f 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
index 04c7faf..bed1abf 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 #ifndef NUM_CORE
@@ -16,6 +22,15 @@ int smpi_coll_tuned_allgather_loosely_lr(void *sbuf, int scount,
   int inter_dst, inter_src;
 
   comm_size = smpi_comm_size(comm);
+
+  int num_core = simcall_host_get_core(SIMIX_host_self());
+  // do we use the default one or the number of cores in the platform ?
+  // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+  if (num_core == 1) num_core = NUM_CORE;
+
+  if(comm_size%num_core)
+    THROWF(arg_error,0, "allgather loosely lr algorithm can't be used with non multiple of NUM_CORE=%d number of processes ! ",num_core);
+
   rank = smpi_comm_rank(comm);
   MPI_Aint rextent, sextent;
   rextent = smpi_datatype_get_extent(rtype);
@@ -32,10 +47,10 @@ int smpi_coll_tuned_allgather_loosely_lr(void *sbuf, int scount,
 
   MPI_Status status;
 
-  intra_rank = rank % NUM_CORE;
-  inter_rank = rank / NUM_CORE;
-  inter_comm_size = (comm_size + NUM_CORE - 1) / NUM_CORE;
-  intra_comm_size = NUM_CORE;
+  intra_rank = rank % num_core;
+  inter_rank = rank / num_core;
+  inter_comm_size = (comm_size + num_core - 1) / num_core;
+  intra_comm_size = num_core;
 
   int src_seg, dst_seg;
 
@@ -104,7 +119,7 @@ int smpi_coll_tuned_allgather_loosely_lr(void *sbuf, int scount,
     }                           // intra loop
 
 
-    // wait for inter communication to finish for these rounds (# of round equals NUM_CORE)
+    // wait for inter communication to finish for these rounds (# of round equals num_core)
     if (i != inter_comm_size - 1) {
       smpi_mpi_wait(&inter_rrequest, &status);
     }
index d416a66..9a3ccd9 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /*
  * ompi_coll_tuned_allgather_intra_neighborexchange
  *
index 6075723..46cde2d 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
@@ -75,6 +81,10 @@ smpi_coll_tuned_allgather_pair(void *send_buff, int send_count,
 
   rank = smpi_comm_rank(comm);
   num_procs = smpi_comm_size(comm);
+
+  if((num_procs&(num_procs-1)))
+    THROWF(arg_error,0, "allgather pair algorithm can't be used with non power of two number of processes ! ");
+
   extent = smpi_datatype_get_extent(send_type);
 
   // local send/recv
index 26467de..06e2f4b 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 int
index aceb283..c2e0cb4 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 // now only work with power of two processes
@@ -21,6 +27,10 @@ smpi_coll_tuned_allgather_rhv(void *sbuf, int send_count,
 
   // get size of the communicator, followed by rank 
   num_procs = smpi_comm_size(comm);
+
+  if((num_procs&(num_procs-1)))
+    THROWF(arg_error,0, "allgather rhv algorithm can't be used with non power of two number of processes ! ");
+
   rank = smpi_comm_rank(comm);
 
   // get size of single element's type for send buffer and recv buffer
index 4634ddc..0e96a53 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
index 1438870..1a38857 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 #ifndef NUM_CORE
 #define NUM_CORE 8
@@ -10,6 +16,15 @@ int smpi_coll_tuned_allgather_smp_simple(void *send_buf, int scount,
 {
   int src, dst, comm_size, rank;
   comm_size = smpi_comm_size(comm);
+
+  int num_core = simcall_host_get_core(SIMIX_host_self());
+  // do we use the default one or the number of cores in the platform ?
+  // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+  if (num_core == 1) num_core = NUM_CORE;
+
+  if(comm_size%num_core)
+     THROWF(arg_error,0, "allgather SMP simple algorithm can't be used with non multiple of NUM_CORE=%d number of processes ! ", num_core);
+
   rank = smpi_comm_rank(comm);
   MPI_Aint rextent, sextent;
   rextent = smpi_datatype_get_extent(rtype);
@@ -18,7 +33,6 @@ int smpi_coll_tuned_allgather_smp_simple(void *send_buf, int scount,
   MPI_Status status;
   int i, send_offset, recv_offset;
   int intra_rank, inter_rank;
-  int num_core = NUM_CORE;
   intra_rank = rank % num_core;
   inter_rank = rank / num_core;
   int inter_comm_size = (comm_size + num_core - 1) / num_core;
index c7dfbc9..1f51ea4 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
index 2a60a47..1dd6103 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 // Allgather - gather/bcast algorithm
index 8094db0..8e92b6f 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
         /* Short or medium size message and power-of-two no. of processes. Use
          * recursive doubling algorithm */
 #include "colls_private.h"
index 83a07f8..fc72645 100644 (file)
@@ -1,12 +1,17 @@
-#include "colls_private.h"
+/* Copyright (c) 2013-2014. 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. */
 
-/* -*- Mode: C; c-basic-offset:4 ; -*- */
 /*
  *
  *  (C) 2001 by Argonne National Laboratory.
  *      See COPYRIGHT in top-level directory.
  */
 
+#include "colls_private.h"
+
 /*****************************************************************************
  * Function: allgather_mpich_ring
  * return: int
index bffcbac..d554938 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /*
  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
  *                         University Research and Technology
  * Copyright (c) 2004-2005 The Regents of the University of California.
  *                         All rights reserved.
  * Copyright (c) 2009      University of Houston. All rights reserved.
- * $COPYRIGHT$
  *
  * Additional copyrights may follow
- *
- * $HEADER$
  */
 
 #include "colls_private.h"
index 3692a38..f6fc137 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2013-2014. 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. */
 
 /*
  * ompi_coll_tuned_allgatherv_intra_neighborexchange
index c73366e..3087d46 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
@@ -75,6 +81,10 @@ smpi_coll_tuned_allgatherv_pair(void *send_buff, int send_count,
 
   rank = smpi_comm_rank(comm);
   num_procs = smpi_comm_size(comm);
+
+  if((num_procs&(num_procs-1)))
+    THROWF(arg_error,0, "allgatherv pair algorithm can't be used with non power of two number of processes ! ");
+
   extent = smpi_datatype_get_extent(send_type);
 
   // local send/recv
index fc7598c..8ac68b7 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
index 664c707..9bcf75c 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /* IMPLEMENTED BY PITCH PATARASUK 
index 4034388..d230b91 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /*
  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
  *                         University Research and Technology
  * Copyright (c) 2004-2005 The Regents of the University of California.
  *                         All rights reserved.
  * Copyright (c) 2009      University of Houston. All rights reserved.
- * $COPYRIGHT$
  *
  * Additional copyrights may follow
  *
- * $HEADER$
  *  Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
  * met:
  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
  */
 
-
-
 /*
  *  ompi_coll_tuned_allreduce_intra_ring_segmented
  *
index 6024607..ce690e2 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 int smpi_coll_tuned_allreduce_rab_rdb(void *sbuff, void *rbuff, int count,
index 66862da..2e80e45 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 //#include <star-reduction.c>
 
@@ -16,6 +22,9 @@ int smpi_coll_tuned_allreduce_rab1(void *sbuff, void *rbuff,
   rank = smpi_comm_rank(comm);
   nprocs = smpi_comm_size(comm);
 
+  if((nprocs&(nprocs-1)))
+    THROWF(arg_error,0, "allreduce rab1 algorithm can't be used with non power of two number of processes ! ");
+
   extent = smpi_datatype_get_extent(dtype);
 
   pof2 = 1;
index 982933c..3643321 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 //#include <star-reduction.c>
 
index 23e7e30..cc56d4a 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 //#include <star-reduction.c>
 
index ca9b8fc..20b4481 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 int smpi_coll_tuned_allreduce_redbcast(void *buf, void *buf2, int count,
index 68c99f5..44dfcb7 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /* IMPLEMENTED BY PITCH PATARASUK 
    Non-topoloty-specific (however, number of cores/node need to be changed) 
@@ -46,7 +52,10 @@ int smpi_coll_tuned_allreduce_smp_binomial_pipeline(void *send_buf,
   int tag = COLL_TAG_ALLREDUCE;
   int mask, src, dst;
   MPI_Status status;
-  int num_core = NUM_CORE;
+  int num_core = simcall_host_get_core(SIMIX_host_self());
+  // do we use the default one or the number of cores in the platform ?
+  // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+  if (num_core == 1) num_core = NUM_CORE;
 
   comm_size = smpi_comm_size(comm);
   rank = smpi_comm_rank(comm);
index 77a5abc..97183fb 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /* IMPLEMENTED BY PITCH PATARASUK 
    Non-topoloty-specific (however, number of cores/node need to be changed) 
@@ -34,7 +40,12 @@ int smpi_coll_tuned_allreduce_smp_binomial(void *send_buf, void *recv_buf,
   void *tmp_buf;
   int tag = COLL_TAG_ALLREDUCE;
   int mask, src, dst;
-  int num_core = NUM_CORE;
+
+
+  int num_core = simcall_host_get_core(SIMIX_host_self());
+  // do we use the default one or the number of cores in the platform ?
+  // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+  if (num_core == 1) num_core = NUM_CORE;
   MPI_Status status;
 
   comm_size=smpi_comm_size(comm);
index b6def2e..5b67e5a 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /* IMPLEMENTED BY PITCH PATARASUK 
    Non-topoloty-specific (however, number of cores/node need to be changed) 
@@ -34,7 +40,10 @@ int smpi_coll_tuned_allreduce_smp_rdb(void *send_buf, void *recv_buf, int count,
   int tag = COLL_TAG_ALLREDUCE;
   int mask, src, dst;
   MPI_Status status;
-  int num_core = NUM_CORE;
+  int num_core = simcall_host_get_core(SIMIX_host_self());
+  // do we use the default one or the number of cores in the platform ?
+  // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+  if (num_core == 1) num_core = NUM_CORE;
   /*
      #ifdef MPICH2_REDUCTION
      MPI_User_function * uop = MPIR_Op_table[op % 16 - 1];
index ce90781..746eecb 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 //#include <star-reduction.c>
 
@@ -23,7 +29,10 @@ int smpi_coll_tuned_allreduce_smp_rsag_lr(void *send_buf, void *recv_buf,
   int tag = COLL_TAG_ALLREDUCE;
   int mask, src, dst;
   MPI_Status status;
-  int num_core = NUM_CORE;
+  int num_core = simcall_host_get_core(SIMIX_host_self());
+  // do we use the default one or the number of cores in the platform ?
+  // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+  if (num_core == 1) num_core = NUM_CORE;
   /*
      #ifdef MPICH2_REDUCTION
      MPI_User_function * uop = MPIR_Op_table[op % 16 - 1];
index cec7521..3709357 100644 (file)
@@ -1,7 +1,13 @@
-#include "colls_private.h"
+/* Copyright (c) 2013-2014. 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. */
+
 /* 
  * implemented by Pitch Patarasuk, 07/01/2007
  */
+#include "colls_private.h"
 //#include <star-reduction.c>
 
 /* change number of core per smp-node
@@ -26,9 +32,16 @@ int smpi_coll_tuned_allreduce_smp_rsag_rab(void *sbuf, void *rbuf, int count,
   int tag = COLL_TAG_ALLREDUCE;
   int mask, src, dst;
   MPI_Status status;
-  int num_core = NUM_CORE;
+  int num_core = simcall_host_get_core(SIMIX_host_self());
+  // do we use the default one or the number of cores in the platform ?
+  // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+  if (num_core == 1) num_core = NUM_CORE;
 
   comm_size = smpi_comm_size(comm);
+
+  if((comm_size&(comm_size-1)))
+    THROWF(arg_error,0, "allreduce smp rsag rab algorithm can't be used with non power of two number of processes ! ");
+
   rank = smpi_comm_rank(comm);
   MPI_Aint extent;
   extent = smpi_datatype_get_extent(dtype);
index 573f5c6..8d751c8 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /* change number of core per smp-node
@@ -22,7 +28,10 @@ int smpi_coll_tuned_allreduce_smp_rsag(void *send_buf, void *recv_buf,
   int tag = COLL_TAG_ALLREDUCE;
   int mask, src, dst;
   MPI_Status status;
-  int num_core = NUM_CORE;
+  int num_core = simcall_host_get_core(SIMIX_host_self());
+  // do we use the default one or the number of cores in the platform ?
+  // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+  if (num_core == 1) num_core = NUM_CORE;
   /*
      #ifdef MPICH2_REDUCTION
      MPI_User_function * uop = MPIR_Op_table[op % 16 - 1];
index 08f4db2..4ac0575 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 #include <math.h>
 
index c226927..e0224b2 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 #include <math.h>
 
index 9e3117c..8dd710c 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /*****************************************************************************
 
  * Function: alltoall_bruck
index 65ae5f8..0232b51 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
@@ -39,6 +45,10 @@ smpi_coll_tuned_alltoall_pair_light_barrier(void *send_buff, int send_count,
 
   rank = smpi_comm_rank(comm);
   num_procs = smpi_comm_size(comm);
+
+  if((num_procs&(num_procs-1)))
+    THROWF(arg_error,0, "alltoall pair algorithm can't be used with non power of two number of processes ! ");
+
   send_chunk = smpi_datatype_get_extent(send_type);
   recv_chunk = smpi_datatype_get_extent(recv_type);
 
index 20dd573..42823b5 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
@@ -36,6 +42,10 @@ smpi_coll_tuned_alltoall_pair_mpi_barrier(void *send_buff, int send_count,
 
   rank = smpi_comm_rank(comm);
   num_procs = smpi_comm_size(comm);
+
+  if((num_procs&(num_procs-1)))
+    THROWF(arg_error,0, "alltoall pair algorithm can't be used with non power of two number of processes ! ");
+
   send_chunk = smpi_datatype_get_extent(send_type);
   recv_chunk = smpi_datatype_get_extent(recv_type);
 
index 209fa81..a0ac128 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
@@ -37,6 +43,10 @@ smpi_coll_tuned_alltoall_pair_one_barrier(void *send_buff, int send_count,
 
   rank = smpi_comm_rank(comm);
   num_procs = smpi_comm_size(comm);
+
+  if((num_procs&(num_procs-1)))
+    THROWF(arg_error,0, "alltoall pair algorithm can't be used with non power of two number of processes ! ");
+
   send_chunk = smpi_datatype_get_extent(send_type);
   recv_chunk = smpi_datatype_get_extent(recv_type);
 
index 66c4767..b480859 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
@@ -74,6 +80,10 @@ int smpi_coll_tuned_alltoall_pair(void *send_buff, int send_count,
 
   rank = smpi_comm_rank(comm);
   num_procs = smpi_comm_size(comm);
+
+  if((num_procs&(num_procs-1)))
+    THROWF(arg_error,0, "alltoall pair algorithm can't be used with non power of two number of processes ! ");
+
   send_chunk = smpi_datatype_get_extent(send_type);
   recv_chunk = smpi_datatype_get_extent(recv_type);
 
index 9c0b9cc..41511f8 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
index df280bb..eb3de84 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
index 469127a..970a265 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
index 677008c..49f7802 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
index 16ba29c..af1cdbf 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
index 656b373..f7ca532 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /**
index fe035ae..c4218e8 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*  
index 60e2647..20deb83 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
@@ -39,6 +45,10 @@ smpi_coll_tuned_alltoallv_pair_light_barrier(void *send_buff, int *send_counts,
 
   rank = smpi_comm_rank(comm);
   num_procs = smpi_comm_size(comm);
+
+  if((num_procs&(num_procs-1)))
+    THROWF(arg_error,0, "alltoallv pair algorithm can't be used with non power of two number of processes ! ");
+
   send_chunk = smpi_datatype_get_extent(send_type);
   recv_chunk = smpi_datatype_get_extent(recv_type);
 
index 62b0d71..b5b05e8 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
@@ -36,6 +42,10 @@ smpi_coll_tuned_alltoallv_pair_mpi_barrier(void *send_buff, int *send_counts, in
 
   rank = smpi_comm_rank(comm);
   num_procs = smpi_comm_size(comm);
+
+  if((num_procs&(num_procs-1)))
+    THROWF(arg_error,0, "alltoallv pair algorithm can't be used with non power of two number of processes ! ");
+
   send_chunk = smpi_datatype_get_extent(send_type);
   recv_chunk = smpi_datatype_get_extent(recv_type);
 
index 7bea7e7..1039812 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
@@ -36,6 +42,10 @@ smpi_coll_tuned_alltoallv_pair_one_barrier(void *send_buff, int *send_counts, in
 
   rank = smpi_comm_rank(comm);
   num_procs = smpi_comm_size(comm);
+
+  if((num_procs&(num_procs-1)))
+    THROWF(arg_error,0, "alltoallv pair algorithm can't be used with non power of two number of processes ! ");
+
   send_chunk = smpi_datatype_get_extent(send_type);
   recv_chunk = smpi_datatype_get_extent(recv_type);
 
index 6692eeb..43940e7 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
@@ -36,6 +42,10 @@ int smpi_coll_tuned_alltoallv_pair(void *send_buff, int *send_counts, int *send_
 
   rank = smpi_comm_rank(comm);
   num_procs = smpi_comm_size(comm);
+
+  if((num_procs&(num_procs-1)))
+    THROWF(arg_error,0, "alltoallv pair algorithm can't be used with non power of two number of processes ! ");
+
   send_chunk = smpi_datatype_get_extent(send_type);
   recv_chunk = smpi_datatype_get_extent(recv_type);
 
index d9653e3..b493dd7 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
index 36af835..723354b 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
index 7f5e795..e4fdbc4 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
index dcbb9f4..4e48add 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 /*****************************************************************************
 
index 8a210fe..d61177d 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /*
  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
  *                         University Research and Technology
  * Copyright (c) 2004-2005 The Regents of the University of California.
  *                         All rights reserved.
  * Copyright (c) 2008      Sun Microsystems, Inc.  All rights reserved.
- * $COPYRIGHT$
  *
  * Additional copyrights may follow
- *
- * $HEADER$
  */
 
 #include "colls_private.h"
index 1af70f6..6913780 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 int bcast_NTSB_segment_size_in_byte = 8192;
index 70edbef..5a3db64 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 static int bcast_NTSL_segment_size_in_byte = 8192;
index 23a51bc..c1cf563 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 static int bcast_NTSL_segment_size_in_byte = 8192;
index 1645e71..19cf892 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 #ifndef NUM_CORE
 #define NUM_CORE 8
@@ -21,23 +27,30 @@ int smpi_coll_tuned_bcast_SMP_binary(void *buf, int count,
 
   rank = smpi_comm_rank(comm);
   size = smpi_comm_size(comm);
+  int host_num_core = simcall_host_get_core(SIMIX_host_self());
+  // do we use the default one or the number of cores in the platform ?
+  // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+  if (host_num_core == 1) host_num_core = NUM_CORE;
+
+  if(size%host_num_core)
+    THROWF(arg_error,0, "bcast SMP binary can't be used with non multiple of NUM_CORE=%d number of processes ! ",host_num_core);
 
   int segment = bcast_SMP_binary_segment_byte / extent;
   int pipe_length = count / segment;
   int remainder = count % segment;
 
-  int to_intra_left = (rank / NUM_CORE) * NUM_CORE + (rank % NUM_CORE) * 2 + 1;
-  int to_intra_right = (rank / NUM_CORE) * NUM_CORE + (rank % NUM_CORE) * 2 + 2;
-  int to_inter_left = ((rank / NUM_CORE) * 2 + 1) * NUM_CORE;
-  int to_inter_right = ((rank / NUM_CORE) * 2 + 2) * NUM_CORE;
-  int from_inter = (((rank / NUM_CORE) - 1) / 2) * NUM_CORE;
-  int from_intra = (rank / NUM_CORE) * NUM_CORE + ((rank % NUM_CORE) - 1) / 2;
+  int to_intra_left = (rank / host_num_core) * host_num_core + (rank % host_num_core) * 2 + 1;
+  int to_intra_right = (rank / host_num_core) * host_num_core + (rank % host_num_core) * 2 + 2;
+  int to_inter_left = ((rank / host_num_core) * 2 + 1) * host_num_core;
+  int to_inter_right = ((rank / host_num_core) * 2 + 2) * host_num_core;
+  int from_inter = (((rank / host_num_core) - 1) / 2) * host_num_core;
+  int from_intra = (rank / host_num_core) * host_num_core + ((rank % host_num_core) - 1) / 2;
   int increment = segment * extent;
 
-  int base = (rank / NUM_CORE) * NUM_CORE;
-  int num_core = NUM_CORE;
-  if (((rank / NUM_CORE) * NUM_CORE) == ((size / NUM_CORE) * NUM_CORE))
-    num_core = size - (rank / NUM_CORE) * NUM_CORE;
+  int base = (rank / host_num_core) * host_num_core;
+  int num_core = host_num_core;
+  if (((rank / host_num_core) * host_num_core) == ((size / host_num_core) * host_num_core))
+    num_core = size - (rank / host_num_core) * host_num_core;
 
   // if root is not zero send to rank zero first
   if (root != 0) {
@@ -49,7 +62,7 @@ int smpi_coll_tuned_bcast_SMP_binary(void *buf, int count,
   // when a message is smaller than a block size => no pipeline 
   if (count <= segment) {
     // case ROOT-of-each-SMP
-    if (rank % NUM_CORE == 0) {
+    if (rank % host_num_core == 0) {
       // case ROOT
       if (rank == 0) {
         //printf("node %d left %d right %d\n",rank,to_inter_left,to_inter_right);
@@ -114,7 +127,7 @@ int smpi_coll_tuned_bcast_SMP_binary(void *buf, int count,
         (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status));
 
     // case ROOT-of-each-SMP
-    if (rank % NUM_CORE == 0) {
+    if (rank % host_num_core == 0) {
       // case ROOT
       if (rank == 0) {
         for (i = 0; i < pipe_length; i++) {
index c2b24a4..a45dca5 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 #ifndef NUM_CORE
 #define NUM_CORE 8
@@ -16,14 +22,22 @@ int smpi_coll_tuned_bcast_SMP_binomial(void *buf, int count,
   size = smpi_comm_size(comm);
   rank = smpi_comm_rank(comm);
 
+  int num_core = simcall_host_get_core(SIMIX_host_self());
+  // do we use the default one or the number of cores in the platform ?
+  // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+  if (num_core == 1) num_core = NUM_CORE;
+
+  if(size%num_core)
+    THROWF(arg_error,0, "bcast SMP binomial can't be used with non multiple of NUM_CORE=%d number of processes ! ",num_core);
+
   int to_intra, to_inter;
   int from_intra, from_inter;
-  int inter_rank = rank / NUM_CORE;
-  int inter_size = (size - 1) / NUM_CORE + 1;
-  int intra_rank = rank % NUM_CORE;
-  int intra_size = NUM_CORE;
-  if (((rank / NUM_CORE) * NUM_CORE) == ((size / NUM_CORE) * NUM_CORE))
-    intra_size = size - (rank / NUM_CORE) * NUM_CORE;
+  int inter_rank = rank / num_core;
+  int inter_size = (size - 1) / num_core + 1;
+  int intra_rank = rank % num_core;
+  int intra_size = num_core;
+  if (((rank / num_core) * num_core) == ((size / num_core) * num_core))
+    intra_size = size - (rank / num_core) * num_core;
 
   // if root is not zero send to rank zero first
   if (root != 0) {
@@ -40,7 +54,7 @@ int smpi_coll_tuned_bcast_SMP_binomial(void *buf, int count,
     mask = 1;
     while (mask < inter_size) {
       if (inter_rank & mask) {
-        from_inter = (inter_rank - mask) * NUM_CORE;
+        from_inter = (inter_rank - mask) * num_core;
         //printf("Node %d recv from node %d when mask is %d\n", rank, from_inter, mask);
         smpi_mpi_recv(buf, count, datatype, from_inter, tag, comm, &status);
         break;
@@ -53,7 +67,7 @@ int smpi_coll_tuned_bcast_SMP_binomial(void *buf, int count,
 
     while (mask > 0) {
       if (inter_rank < inter_size) {
-        to_inter = (inter_rank + mask) * NUM_CORE;
+        to_inter = (inter_rank + mask) * num_core;
         if (to_inter < size) {
           //printf("Node %d send to node %d when mask is %d\n", rank, to_inter, mask);
           smpi_mpi_send(buf, count, datatype, to_inter, tag, comm);
@@ -64,7 +78,7 @@ int smpi_coll_tuned_bcast_SMP_binomial(void *buf, int count,
   }
   // SECOND STEP every root-of-each-SMP send to all children with binomial tree
   // base is a rank of root-of-each-SMP
-  int base = (rank / NUM_CORE) * NUM_CORE;
+  int base = (rank / num_core) * num_core;
   mask = 1;
   while (mask < intra_size) {
     if (intra_rank & mask) {
index b999b39..9fafa1b 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 #ifndef NUM_CORE
 #define NUM_CORE 8
@@ -21,6 +27,13 @@ int smpi_coll_tuned_bcast_SMP_linear(void *buf, int count,
 
   rank = smpi_comm_rank(comm);
   size = smpi_comm_size(comm);
+  int num_core = simcall_host_get_core(SIMIX_host_self());
+  // do we use the default one or the number of cores in the platform ?
+  // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+  if (num_core == 1) num_core = NUM_CORE;
+
+  if(size%num_core)
+    THROWF(arg_error,0, "bcast SMP linear can't be used with non multiple of num_core=%d number of processes!",num_core);
 
   int segment = bcast_SMP_linear_segment_byte / extent;
   int pipe_length = count / segment;
@@ -30,13 +43,13 @@ int smpi_coll_tuned_bcast_SMP_linear(void *buf, int count,
 
   /* leader of each SMP do inter-communication
      and act as a root for intra-communication */
-  int to_inter = (rank + NUM_CORE) % size;
+  int to_inter = (rank + num_core) % size;
   int to_intra = (rank + 1) % size;
-  int from_inter = (rank - NUM_CORE + size) % size;
+  int from_inter = (rank - num_core + size) % size;
   int from_intra = (rank + size - 1) % size;
 
   // call native when MPI communication size is too small
-  if (size <= NUM_CORE) {
+  if (size <= num_core) {
     XBT_WARN("MPI_bcast_SMP_linear use default MPI_bcast.");             
     smpi_mpi_bcast(buf, count, datatype, root, comm);
     return MPI_SUCCESS;            
@@ -56,20 +69,20 @@ int smpi_coll_tuned_bcast_SMP_linear(void *buf, int count,
       smpi_mpi_send(buf, count, datatype, to_intra, tag, comm);
     }
     // case last ROOT of each SMP
-    else if (rank == (((size - 1) / NUM_CORE) * NUM_CORE)) {
+    else if (rank == (((size - 1) / num_core) * num_core)) {
       request = smpi_mpi_irecv(buf, count, datatype, from_inter, tag, comm);
       smpi_mpi_wait(&request, &status);
       smpi_mpi_send(buf, count, datatype, to_intra, tag, comm);
     }
     // case intermediate ROOT of each SMP
-    else if (rank % NUM_CORE == 0) {
+    else if (rank % num_core == 0) {
       request = smpi_mpi_irecv(buf, count, datatype, from_inter, tag, comm);
       smpi_mpi_wait(&request, &status);
       smpi_mpi_send(buf, count, datatype, to_inter, tag, comm);
       smpi_mpi_send(buf, count, datatype, to_intra, tag, comm);
     }
     // case last non-ROOT of each SMP
-    else if (((rank + 1) % NUM_CORE == 0) || (rank == (size - 1))) {
+    else if (((rank + 1) % num_core == 0) || (rank == (size - 1))) {
       request = smpi_mpi_irecv(buf, count, datatype, from_intra, tag, comm);
       smpi_mpi_wait(&request, &status);
     }
@@ -89,7 +102,7 @@ int smpi_coll_tuned_bcast_SMP_linear(void *buf, int count,
         (MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status));
 
     // case ROOT of each SMP
-    if (rank % NUM_CORE == 0) {
+    if (rank % num_core == 0) {
       // case real root
       if (rank == 0) {
         for (i = 0; i < pipe_length; i++) {
@@ -100,7 +113,7 @@ int smpi_coll_tuned_bcast_SMP_linear(void *buf, int count,
         }
       }
       // case last ROOT of each SMP
-      else if (rank == (((size - 1) / NUM_CORE) * NUM_CORE)) {
+      else if (rank == (((size - 1) / num_core) * num_core)) {
         for (i = 0; i < pipe_length; i++) {
           request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype,
                     from_inter, (tag + i), comm);
@@ -126,7 +139,7 @@ int smpi_coll_tuned_bcast_SMP_linear(void *buf, int count,
         }
       }
     } else {                    // case last non-ROOT of each SMP
-      if (((rank + 1) % NUM_CORE == 0) || (rank == (size - 1))) {
+      if (((rank + 1) % num_core == 0) || (rank == (size - 1))) {
         for (i = 0; i < pipe_length; i++) {
           request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype,
                     from_intra, (tag + i), comm);
index 06693db..fdb963f 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 int bcast_arrival_pattern_aware_wait_segment_size_in_byte = 8192;
index 39498ea..7336674 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 static int bcast_NTSL_segment_size_in_byte = 8192;
index 609490d..7e700eb 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 #ifndef BCAST_ARRIVAL_PATTERN_AWARE_HEADER_SIZE
index 0b37d39..955a814 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
index 434b684..3054e17 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 int flattree_segment_in_byte = 8192;
index 4cf3308..5d4708d 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 int
index 7085562..2547d19 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
  #include "coll_tuned_topo.h"
 
index a0f1876..dae4d27 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /*
  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
  *                         University Research and Technology
  * Copyright (c) 2004-2005 The Regents of the University of California.
  *                         All rights reserved.
  * Copyright (c) 2009      University of Houston. All rights reserved.
- * $COPYRIGHT$
  *
  * Additional copyrights may follow
  *
- * $HEADER$
  *  Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
  * met:
@@ -49,9 +53,8 @@
  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
  */
+
   #include "colls_private.h"
   #include "coll_tuned_topo.h"
   #define MAXTREEFANOUT 32
index bf7a05a..87d84ca 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
index 43cf25d..7bda0f7 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*****************************************************************************
index 2fc8df4..a5c53b1 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /*
  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
  *                         University Research and Technology
@@ -9,11 +15,8 @@
  *                         University of Stuttgart.  All rights reserved.
  * Copyright (c) 2004-2005 The Regents of the University of California.
  *                         All rights reserved.
- * $COPYRIGHT$
  * 
  * Additional copyrights may follow
- * 
- * $HEADER$
  */
 
 #include "colls_private.h"
index 73b0361..24006e4 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /*
  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
  *                         University Research and Technology
@@ -9,11 +15,8 @@
  *                         University of Stuttgart.  All rights reserved.
  * Copyright (c) 2004-2005 The Regents of the University of California.
  *                         All rights reserved.
- * $COPYRIGHT$
  * 
  * Additional copyrights may follow
- * 
- * $HEADER$
  */
 
 #ifndef MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED
index b70a313..edff8c9 100644 (file)
@@ -1,9 +1,16 @@
+/* Copyright (c) 2013-2014. 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 SMPI_COLLS_H
 #define SMPI_COLLS_H
 
 #include <math.h>
 #include "smpi/mpi.h"
 #include "smpi/private.h"
+#include "xbt/ex.h"
 #include "xbt.h"
 
 #define COLL_DESCRIPTION(cat, ret, args, name) \
index 65d5285..8d383ca 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_colls, smpi,
index 66a2114..cedb4bb 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 SMPI_COLLS_PRIVATE_H
 #define SMPI_COLLS_PRIVATE_H
 
index df34f27..06a9488 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /*
  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
  *                         University Research and Technology
@@ -9,11 +15,8 @@
  *                         University of Stuttgart.  All rights reserved.
  * Copyright (c) 2004-2005 The Regents of the University of California.
  *                         All rights reserved.
- * $COPYRIGHT$
  *
  * Additional copyrights may follow
- *
- * $HEADER$
  */
 
 #include "colls_private.h"
index f02a7ff..4f1dc0d 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 //#include <star-reduction.c>
 
index 6fe89cc..3c20887 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 //#include <star-reduction.c>
 
index c3b4067..597c2e4 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 //#include <star-reduction.c>
index 9241be1..78be7fd 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 //#include <star-reduction.c>
 
index 0b71d60..24a25db 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /*
  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
  *                         University Research and Technology
@@ -9,11 +15,8 @@
  *                         University of Stuttgart.  All rights reserved.
  * Copyright (c) 2004-2005 The Regents of the University of California.
  *                         All rights reserved.
- * $COPYRIGHT$
  *
  * Additional copyrights may follow
- *
- * $HEADER$
  */
 
 #include "colls_private.h"
index af317fb..92249bd 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 /*
index 76cbf0f..50c4d58 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
 
 static inline int MPIU_Mirror_permutation(unsigned int x, int bits)
index bb01dee..f8c716f 100644 (file)
@@ -1,4 +1,9 @@
-/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
+/* Copyright (c) 2013-2014. 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. */
+
 /*
  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
  *                         University Research and Technology
  *                         All rights reserved.
  * Copyright (c) 2008      Sun Microsystems, Inc.  All rights reserved.
  * Copyright (c) 2009      University of Houston. All rights reserved.
- * $COPYRIGHT$
  *
  * Additional copyrights may follow
- *
- * $HEADER$
  */
 
 #include "colls_private.h"
index 9d30811..130ec40 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /*
  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
  *                         University Research and Technology
@@ -9,11 +15,8 @@
  *                         University of Stuttgart.  All rights reserved.
  * Copyright (c) 2004-2005 The Regents of the University of California.
  *                         All rights reserved.
- * $COPYRIGHT$
  *
  * Additional copyrights may follow
- *
- * $HEADER$
  */
 
 
index ded62ec..83e6ac3 100644 (file)
@@ -1,5 +1,13 @@
+/* Copyright (c) 2013-2014. 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 "colls_private.h"
+#ifdef HAVE_MC
 #include "mc/mc_private.h"
+#endif
 #include <float.h>
 
 //attempt to do a quick autotuning version of the collective,
@@ -24,8 +32,9 @@
     ret smpi_coll_tuned_ ## cat ## _ ## automatic(COLL_UNPAREN args)\
 {\
   double time1, time2, time_min=DBL_MAX;\
-  int min_coll=-1, global_coll=-1;\
-  int i;\
+  volatile int min_coll=-1, global_coll=-1;\
+  volatile int i;\
+  xbt_ex_t ex;\
   double buf_in, buf_out, max_min=DBL_MAX;\
   for (i = 0; mpi_coll_##cat##_description[i].name; i++){\
       if(!strcmp(mpi_coll_##cat##_description[i].name, "automatic"))continue;\
       smpi_mpi_barrier(comm);\
       TRACE_AUTO_COLL(cat)\
       time1 = SIMIX_get_clock();\
+      TRY{\
       ((int (*) args)\
           mpi_coll_##cat##_description[i].coll) args2 ;\
+      }\
+      CATCH(ex) {\
+        xbt_ex_free(ex);\
+        continue;\
+      }\
       time2 = SIMIX_get_clock();\
       buf_out=time2-time1;\
       smpi_mpi_reduce((void*)&buf_out,(void*)&buf_in, 1, MPI_DOUBLE, MPI_MAX, 0,comm );\
index 5ecdb86..a43b6d8 100644 (file)
@@ -1,6 +1,6 @@
 /* selector for collective algorithms based on mpich decision logic */
 
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 49a12c3..c344fa9 100644 (file)
@@ -1,6 +1,6 @@
 /* selector for collective algorithms based on openmpi's default coll_tuned_decision_fixed selector */
 
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index e9ce510..2bc55d9 100755 (executable)
@@ -1,5 +1,11 @@
 #!/usr/bin/perl
 
+# Copyright (c) 2011, 2014. 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.
+
 # Add include for mandatory header file
 print "#include <smpi_cocci.h>\n";
 
index c968bed..a097ed6 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "private.h"
 #include <ctype.h>
@@ -79,16 +79,28 @@ static char *smpi_container(int rank, char *container, int n)
   return container;
 }
 
+static char *TRACE_smpi_get_key(int src, int dst, char *key, int n);
+
+
 static char *TRACE_smpi_put_key(int src, int dst, char *key, int n)
 {
   //get the dynar for src#dst
   char aux[INSTR_DEFAULT_STR_SIZE];
   snprintf(aux, INSTR_DEFAULT_STR_SIZE, "%d#%d", src, dst);
   xbt_dynar_t d = xbt_dict_get_or_null(keys, aux);
+
+
+  if(!xbt_dynar_is_empty(d)){
+    //receive was already pushed, perform a get instead
+    TRACE_smpi_get_key(src , dst, key ,n);
+    return key;
+  }
+
   if (d == NULL) {
     d = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
     xbt_dict_set(keys, aux, d, NULL);
   }
+
   //generate the key
   static unsigned long long counter = 0;
 
@@ -107,8 +119,15 @@ static char *TRACE_smpi_get_key(int src, int dst, char *key, int n)
   snprintf(aux, INSTR_DEFAULT_STR_SIZE, "%d#%d", src, dst);
   xbt_dynar_t d = xbt_dict_get_or_null(keys, aux);
 
-  xbt_assert(!xbt_dynar_is_empty(d),
-      "Trying to get a link key (for message reception) that has no corresponding send (%s).", __FUNCTION__);
+ // xbt_assert(!xbt_dynar_is_empty(d),
+ //     "Trying to get a link key (for message reception) that has no corresponding send (%s).", __FUNCTION__);
+
+  // sometimes the receive may be posted before the send
+  if(xbt_dynar_is_empty(d)){
+      TRACE_smpi_put_key(src, dst, key, n);
+      return key;
+  }
+
   char *s = xbt_dynar_get_as (d, 0, char *);
   snprintf (key, n, "%s", s);
   xbt_dynar_remove_at (d, 0, NULL);
index 89e981b..38fd745 100755 (executable)
@@ -1,4 +1,11 @@
 #!/bin/bash
+
+# Copyright (c) 2011, 2014. 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.
+
 INFILE="$1"
 OUTFILE="$2"
 SPFILE="replace_globals.cocci"
index 26847a6..4906753 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2007, 2009-2013. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef SMPI_PRIVATE_H
 #define SMPI_PRIVATE_H
@@ -28,6 +28,14 @@ typedef struct s_smpi_process_data *smpi_process_data_t;
 #define ISEND          0x20
 #define SSEND          0x40
 #define PREPARED       0x80
+
+
+enum smpi_process_state{
+  SMPI_UNINITIALIZED,
+  SMPI_INITIALIZED,
+  SMPI_FINALIZED
+};
+
 // this struct is here to handle the problem of non-contignous data
 // for each such structure these function should be implemented (vector
 // index hvector hindex struct)
index 2597663..fa4e70d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -77,7 +77,8 @@ xbt_dynar_t smpi_ois_values = NULL;
 
 static int factor_cmp(const void *pa, const void *pb)
 {
-  return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor);
+  return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor) ? 1 :
+         (((s_smpi_factor_t*)pa)->factor < ((s_smpi_factor_t*)pb)->factor) ? -1 : 0;
 }
 
 
@@ -93,6 +94,7 @@ static xbt_dynar_t parse_factor(const char *smpi_coef_string)
   smpi_factor = xbt_dynar_new(sizeof(s_smpi_factor_t), NULL);
   radical_elements = xbt_str_split(smpi_coef_string, ";");
   xbt_dynar_foreach(radical_elements, iter, value) {
+    memset(&fact, 0, sizeof(s_smpi_factor_t));
     radical_elements2 = xbt_str_split(value, ":");
     if (xbt_dynar_length(radical_elements2) <2 || xbt_dynar_length(radical_elements2) > 5)
       xbt_die("Malformed radical for smpi factor!");
@@ -329,7 +331,9 @@ void smpi_mpi_start(MPI_Request request)
     request->real_size=request->size;
     smpi_datatype_use(request->old_type);
     smpi_comm_use(request->comm);
-    request->action = simcall_comm_irecv(mailbox, request->buf, &request->real_size, &match_recv, request);
+    request->action = simcall_comm_irecv(mailbox, request->buf,
+                                         &request->real_size, &match_recv,
+                                         request, -1.0);
 
     //integrate pseudo-timing for buffering of small messages, do not bother to execute the simcall if 0
     double sleeptime = request->detached ? smpi_or(request->size) : 0.0;
@@ -366,7 +370,7 @@ void smpi_mpi_start(MPI_Request request)
       request->refcount++;
       if(request->old_type->has_subtype == 0){
         oldbuf = request->buf;
-        if (oldbuf && request->size!=0){
+        if (!_xbt_replay_is_active() && oldbuf && request->size!=0){
           request->buf = xbt_malloc(request->size);
           memcpy(request->buf,oldbuf,request->size);
         }
@@ -395,7 +399,7 @@ void smpi_mpi_start(MPI_Request request)
       simcall_comm_isend(mailbox, request->size, -1.0,
                          request->buf, request->real_size,
                          &match_send,
-                         &smpi_mpi_request_free_voidp, // how to free the userdata if a detached send fails
+                         &xbt_free, // how to free the userdata if a detached send fails
                          request,
                          // detach if msg size < eager/rdv switch limit
                          request->detached);
@@ -760,12 +764,11 @@ void smpi_mpi_wait(MPI_Request * request, MPI_Status * status)
 
   if ((*request)->action != NULL) { // this is not a detached send
     simcall_comm_wait((*request)->action, -1.0);
-  }
-
 #ifdef HAVE_MC
   if(MC_is_active() && (*request)->action)
     (*request)->action->comm.dst_data = NULL; // dangling pointer : dst_data is freed with a wait, need to set it to NULL for system state comparison
 #endif
+  }
 
   finish_wait(request, status);
   *request = MPI_REQUEST_NULL;
index b0f25dc..9387099 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2007, 2009-2013. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "private.h"
 #include "xbt/dict.h"
@@ -142,8 +142,8 @@ void smpi_execute_flops(double flops) {
   smx_action_t action;
   smx_host_t host;
   host = SIMIX_host_self();
-  XBT_DEBUG("Handle real computation time: %g flops", flops);
-  action = simcall_host_execute("computation", host, flops, 1);
+  XBT_DEBUG("Handle real computation time: %f flops", flops);
+  action = simcall_host_execute("computation", host, flops, 1, 0, 0);
 #ifdef HAVE_TRACING
   simcall_set_category (action, TRACE_internal_smpi_get_category());
 #endif
@@ -201,7 +201,7 @@ unsigned int smpi_sleep(unsigned int secs)
 
   double flops = (double) secs*simcall_host_get_speed(SIMIX_host_self());
   XBT_DEBUG("Sleep for: %f flops", flops);
-  action = simcall_host_execute("computation", SIMIX_host_self(), flops, 1);
+  action = simcall_host_execute("computation", SIMIX_host_self(), flops, 1, 0, 0);
   #ifdef HAVE_TRACING
     simcall_set_category (action, TRACE_internal_smpi_get_category());
   #endif
index 567f26a..15e49df 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2011-2013. The SimGrid Team.
+/* Copyright (c) 2011-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <xbt/dynar.h>
 #include "private.h"
index 70fdb14..346408c 100644 (file)
@@ -1,6 +1,6 @@
 /* smpi_coll.c -- various optimized routing for collectives                   */
 
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8f02e2e..1c36589 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <stdlib.h>
 
index 4a71979..a8ab0ae 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2013. The SimGrid Team.
+/* Copyright (c) 2013-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "xbt/log.h"
 #include "simgrid/simix.h"
index 0f49e2e..7c3e483 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <limits.h>
 #include <stdio.h>
@@ -20,13 +20,32 @@ static xbt_dict_t datatype_lookup = NULL;
 static xbt_dict_t op_lookup = NULL;
 static int running_processes = 0;
 
-
-
-/* Convert between Fortran and C MPI_BOTTOM */
-#define F2C_BOTTOM(addr)    ((addr!=MPI_IN_PLACE && *(int*)addr == MPI_FORTRAN_BOTTOM) ? MPI_BOTTOM : (addr))
-#define F2C_IN_PLACE(addr)  ((addr!=MPI_BOTTOM &&*(int*)addr == MPI_FORTRAN_IN_PLACE) ? MPI_IN_PLACE : (addr))
-#define F2C_STATUS_IGNORE(addr) ((*(int*)addr == MPI_FORTRAN_STATUS_IGNORE) ? MPI_STATUS_IGNORE : (addr))
-#define F2C_STATUSES_IGNORE(addr) ((*(int*)addr == MPI_FORTRAN_STATUSES_IGNORE) ? MPI_STATUSES_IGNORE : (addr))
+/* Bindings for MPI special values */
+union u_smpi_common {
+  struct s_smpi_common {
+    integer mpi_in_place;
+    integer mpi_bottom;
+    integer mpi_status_ignore;
+    integer mpi_statuses_ignore;
+  } f90;                        /* with gftortran */
+  struct s_smpi_common *f77;    /* with f2c */
+} smpi_;
+
+/* Convert between Fortran and C */
+static XBT_INLINE void *f2c_addr(void *addr, void *cval, void *chk1, void *chk2)
+{
+  return (addr == chk1 || addr == chk2) ? cval : addr;
+}
+#define F2C_ADDR(addr, cval, fval) \
+  f2c_addr(addr, cval, &smpi_.f90.fval, &smpi_.f77[smpi_current_rank].fval)
+#define F2C_BOTTOM(addr) \
+  F2C_ADDR(addr, MPI_BOTTOM, mpi_bottom)
+#define F2C_IN_PLACE(addr) \
+  F2C_ADDR(addr, MPI_IN_PLACE, mpi_in_place)
+#define F2C_STATUS_IGNORE(addr) \
+  F2C_ADDR(addr, MPI_STATUS_IGNORE, mpi_status_ignore)
+#define F2C_STATUSES_IGNORE(addr) \
+  F2C_ADDR(addr, MPI_STATUSES_IGNORE, mpi_statuses_ignore)
 
 #define KEY_SIZE (sizeof(int) * 2 + 1)
 
index b5b05af..3bdb895 100644 (file)
@@ -1,12 +1,13 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "private.h"
 #include "smpi_mpi_dt_private.h"
 #include "mc/mc.h"
+#include "xbt/replay.h"
 #include "surf/surf.h"
 #include "simix/smx_private.h"
 #include "simgrid/sg_config.h"
@@ -29,7 +30,7 @@ typedef struct s_smpi_process_data {
   MPI_Comm comm_self;
   void *data;                   /* user data */
   int index;
-  int initialized;
+  char state;
   int sampling;                 /* inside an SMPI_SAMPLE_ block? */
 } s_smpi_process_data_t;
 
@@ -68,6 +69,9 @@ void smpi_process_init(int *argc, char ***argv)
   if (argc && argv) {
     proc = SIMIX_process_self();
     index = atoi((*argv)[1]);
+#ifdef SMPI_F2C
+    smpi_current_rank = index;
+#endif
     data = smpi_process_remote_data(index);
     simcall_process_set_data(proc, data);
     if (*argc > 2) {
@@ -87,7 +91,7 @@ void smpi_process_init(int *argc, char ***argv)
 void smpi_process_destroy(void)
 {
   int index = smpi_process_index();
-  process_data[index]->index = -100;
+  process_data[index]->state = SMPI_FINALIZED;
   XBT_DEBUG("<%d> Process left the game", index);
 }
 
@@ -96,10 +100,44 @@ void smpi_process_destroy(void)
  */
 void smpi_process_finalize(void)
 {
+#if 0
   // wait for all pending asynchronous comms to finish
   while (SIMIX_process_has_pending_comms(SIMIX_process_self())) {
     simcall_process_sleep(0.01);
   }
+#else
+  int i;
+  int size = smpi_comm_size(MPI_COMM_WORLD);
+  int rank = smpi_comm_rank(MPI_COMM_WORLD);
+  /* All non-root send & receive zero-length message. */
+  if (rank > 0) {
+    smpi_mpi_ssend (NULL, 0, MPI_BYTE, 0,
+                    COLL_TAG_BARRIER,
+                    MPI_COMM_WORLD);
+    smpi_mpi_recv (NULL, 0, MPI_BYTE, 0,
+                    COLL_TAG_BARRIER,
+                    MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+  }
+  /* The root collects and broadcasts the messages. */
+  else {
+    MPI_Request* requests;
+    requests = (MPI_Request*)malloc( size * sizeof(MPI_Request) );
+    for (i = 1; i < size; ++i) {
+      requests[i] = smpi_mpi_irecv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE,
+                                   COLL_TAG_BARRIER, MPI_COMM_WORLD
+                                   );
+    }
+    smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE );
+    for (i = 1; i < size; ++i) {
+      requests[i] = smpi_mpi_issend(NULL, 0, MPI_BYTE, i,
+                                   COLL_TAG_BARRIER,
+                                   MPI_COMM_WORLD
+                                   );
+    }
+    smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE );
+    free( requests );
+  }
+#endif
 }
 
 /**
@@ -107,8 +145,11 @@ void smpi_process_finalize(void)
  */
 int smpi_process_finalized()
 {
-  return (smpi_process_index() == -100);
-  // If finalized, this value has been set to -100;
+  int index = smpi_process_index();
+    if (index != MPI_UNDEFINED)
+      return (process_data[index]->state == SMPI_FINALIZED);
+    else
+      return 0;
 }
 
 /**
@@ -117,8 +158,8 @@ int smpi_process_finalized()
 int smpi_process_initialized(void)
 {
   int index = smpi_process_index();
-  return ((index != -100) && (index != MPI_UNDEFINED)
-          && (process_data[index]->initialized));
+  return ( (index != MPI_UNDEFINED)
+          && (process_data[index]->state == SMPI_INITIALIZED));
 }
 
 /**
@@ -127,8 +168,8 @@ int smpi_process_initialized(void)
 void smpi_process_mark_as_initialized(void)
 {
   int index = smpi_process_index();
-  if ((index != -100) && (index != MPI_UNDEFINED))
-    process_data[index]->initialized = 1;
+  if ((index != MPI_UNDEFINED) && (!process_data[index]->state != SMPI_FINALIZED))
+    process_data[index]->state = SMPI_INITIALIZED;
 }
 
 
@@ -157,6 +198,7 @@ int smpi_process_getarg(integer * index, char *dst, ftnlen len)
   }
   return 0;
 }
+#endif
 
 int smpi_global_size(void)
 {
@@ -169,7 +211,6 @@ int smpi_global_size(void)
   }
   return atoi(value);
 }
-#endif
 
 smpi_process_data_t smpi_process_data(void)
 {
@@ -251,6 +292,12 @@ double smpi_process_simulated_elapsed(void)
 MPI_Comm smpi_process_comm_self(void)
 {
   smpi_process_data_t data = smpi_process_data();
+  if(data->comm_self==MPI_COMM_NULL){
+    MPI_Group group = smpi_group_new(1);
+    data->comm_self = smpi_comm_new(group);
+    smpi_group_set_mapping(group, smpi_process_index(), 0);
+  }
+
   return data->comm_self;
 }
 
@@ -278,6 +325,7 @@ static void smpi_comm_copy_buffer_callback(smx_action_t comm,
                                            void *buff, size_t buff_size)
 {
   XBT_DEBUG("Copy the data over");
+  if(_xbt_replay_is_active()) return;
   memcpy(comm->comm.dst_buff, buff, buff_size);
   if (comm->comm.detached) {
     // if this is a detached send, the source buffer was duplicated by SMPI
@@ -311,12 +359,9 @@ void smpi_global_init(void)
     process_data[i]->timer = xbt_os_timer_new();
     if (MC_is_active())
       MC_ignore_heap(process_data[i]->timer, xbt_os_timer_size());
-    group = smpi_group_new(1);
-    process_data[i]->comm_self = smpi_comm_new(group);
-    process_data[i]->initialized = 0;
+    process_data[i]->comm_self = MPI_COMM_NULL;
+    process_data[i]->state = SMPI_UNINITIALIZED;
     process_data[i]->sampling = 0;
-
-    smpi_group_set_mapping(group, i, 0);
   }
   group = smpi_group_new(process_count);
   MPI_COMM_WORLD = smpi_comm_new(group);
@@ -329,6 +374,13 @@ void smpi_global_init(void)
 
   xbt_assert(sg_cfg_get_int("smpi/async_small_thres") <=
              sg_cfg_get_int("smpi/send_is_detached_thres"));
+
+  if (sg_cfg_is_default_value("smpi/running_power")) {
+    XBT_INFO("You did not set the power of the host running the simulation.  "
+             "The timings will certainly not be accurate.  "
+             "Use the option \"--cfg=smpi/running_power:<flops>\" to set its value."
+             "Check http://simgrid.org/simgrid/latest/doc/options.html#options_smpi_bench for more information. ");
+  }
 }
 
 void smpi_global_destroy(void)
@@ -341,8 +393,10 @@ void smpi_global_destroy(void)
   xbt_free(MPI_COMM_WORLD);
   MPI_COMM_WORLD = MPI_COMM_NULL;
   for (i = 0; i < count; i++) {
-    smpi_group_unuse(smpi_comm_group(process_data[i]->comm_self));
-    smpi_comm_destroy(process_data[i]->comm_self);
+    if(process_data[i]->comm_self!=MPI_COMM_NULL){
+      smpi_group_unuse(smpi_comm_group(process_data[i]->comm_self));
+      smpi_comm_destroy(process_data[i]->comm_self);
+    }
     xbt_os_timer_free(process_data[i]->timer);
     simcall_rdv_destroy(process_data[i]->mailbox);
     simcall_rdv_destroy(process_data[i]->mailbox_small);
@@ -371,7 +425,6 @@ int __attribute__ ((weak)) smpi_simulated_main_(int argc, char **argv)
 {
   smpi_process_init(&argc, &argv);
   user_main_();
-  //xbt_die("Should not be in this smpi_simulated_main");
   return 0;
 }
 
index 2e0125e..587ab1d 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2010, 2013. The SimGrid Team.
+/* Copyright (c) 2010, 2013-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "private.h"
 
index e6c5423..99c5274 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "private.h"
 #include "simgrid/sg_config.h"
index 1e47ae2..8be8134 100644 (file)
@@ -1,7 +1,7 @@
 /* smpi_mpi_dt.c -- MPI primitives to handle datatypes                        */
 /* FIXME: a very incomplete implementation                                    */
 
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -14,6 +14,7 @@
 #include "private.h"
 #include "smpi_mpi_dt_private.h"
 #include "mc/mc.h"
+#include "xbt/replay.h"
 #include "simgrid/modelchecker.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_mpi_dt, smpi,
@@ -165,7 +166,7 @@ int smpi_datatype_copy(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     count = sendcount < recvcount ? sendcount : recvcount;
 
     if(sendtype->has_subtype == 0 && recvtype->has_subtype == 0) {
-      memcpy(recvbuf, sendbuf, count);
+      if(!_xbt_replay_is_active()) memcpy(recvbuf, sendbuf, count);
     }
     else if (sendtype->has_subtype == 0)
     {
@@ -1488,5 +1489,6 @@ void smpi_op_destroy(MPI_Op op)
 void smpi_op_apply(MPI_Op op, void *invec, void *inoutvec, int *len,
                    MPI_Datatype * datatype)
 {
+  if(!_xbt_replay_is_active())
   op->func(invec, inoutvec, len, datatype);
 }
index b526a23..6e81df3 100644 (file)
@@ -1,10 +1,10 @@
 /* smpi_mpi_dt_private.h -- functions of smpi_mpi_dt.c that are exported to other SMPI modules. */
 
-/* Copyright (c) 2009-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef SMPI_DT_PRIVATE_H
 #define SMPI_DT_PRIVATE_H
index 9206f28..f59f2e6 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "private.h"
 #include "smpi_mpi_dt_private.h"
@@ -1230,9 +1230,11 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag,
 
 #ifdef HAVE_TRACING
   //the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE)
-  if(status!=MPI_STATUS_IGNORE)src_traced = smpi_group_index(smpi_comm_group(comm), status->MPI_SOURCE);
+  if(status!=MPI_STATUS_IGNORE){
+    src_traced = smpi_group_index(smpi_comm_group(comm), status->MPI_SOURCE);
+    TRACE_smpi_recv(rank, src_traced, rank);
+  }
   TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__);
-  TRACE_smpi_recv(rank, src_traced, rank);
 #endif
   }
 
index 507957f..9e00ae9 100644 (file)
@@ -1,10 +1,9 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. 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 "private.h"
 #include <stdio.h>
 #include <xbt.h>
@@ -259,6 +258,12 @@ static void action_recv(const char *const *action) {
   TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__, extra);
 #endif
 
+  //unknow size from the receiver pov
+  if(size==-1){
+      smpi_mpi_probe(from, 0, MPI_COMM_WORLD, &status);
+      size=status.count;
+  }
+
   smpi_mpi_recv(NULL, size, MPI_CURRENT_TYPE, from, 0, MPI_COMM_WORLD, &status);
 
 #ifdef HAVE_TRACING
@@ -290,6 +295,12 @@ static void action_Irecv(const char *const *action)
   extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
   TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__, extra);
 #endif
+  MPI_Status status;
+  //unknow size from the receiver pov
+  if(size==-1){
+      smpi_mpi_probe(from, 0, MPI_COMM_WORLD, &status);
+      size=status.count;
+  }
 
   request = smpi_mpi_irecv(NULL, size, MPI_CURRENT_TYPE, from, 0, MPI_COMM_WORLD);
 
@@ -986,7 +997,7 @@ int smpi_replay_finalize(){
     /* Last process alive speaking */
     /* end the simulated timer */
     sim_time = smpi_process_simulated_elapsed();
-    XBT_INFO("Simulation time %g", sim_time);
+    XBT_INFO("Simulation time %f", sim_time);
     _xbt_replay_action_exit();
     xbt_free(reqq);
     reqq = NULL;
index 3b501a7..d18e0f1 100755 (executable)
@@ -1,42 +1,57 @@
-#! /usr/bin/env bash
+#! /bin/sh
+
+# Copyright (c) 2007-2014. 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.
 
 CC=@CMAKE_C_COMPILER@
 
 INCLUDEARGS="@includeflag@"
 CMAKE_LINKARGS="-L@libdir@"
 
+@SMPITOOLS_SH@
+
+list_set CFLAGS
+list_set LINKARGS
 if [ "@WIN32@" != "1" ]; then
-  CFLAGS="-Dmain=smpi_simulated_main_"
-  LINKARGS="-lsimgrid"
+    list_add CFLAGS "-Dmain=smpi_simulated_main_"
+    list_add LINKARGS "-lsimgrid"
 else
-  CFLAGS="-include @includedir@/smpi/smpi_main.h"
-  LINKARGS="@libdir@\libsimgrid.dll"
+    list_add CFLAGS "-include" "@includedir@/smpi/smpi_main.h"
+    list_add LINKARGS "@libdir@\libsimgrid.dll"
 fi
 
-CMDLINE=""
-while [ -n "$1" ]; do
-  ARG="$1"
-  shift
-  case "${ARG}" in
-   -c)
-      CMAKE_LINKARGS=""
-      LINKARGS=""
-      CMDLINE="${CMDLINE} -c "
-      ;;
-   *.c)
-      SRCFILE="$(readlink -f ${ARG} 2>/dev/null)"
-      if [ -z $SRCFILE ] ; then
-         SRCFILE="$ARG"
-      fi
-      CMDLINE="${CMDLINE} ${SRCFILE} "
-      ;;
-   *)
-      CMDLINE="${CMDLINE} ${ARG} "
+list_set CMDARGS
+while [ $# -gt 0 ]; do
+    ARG="$1"
+    shift
+    case "${ARG}" in
+        -c)
+            CMAKE_LINKARGS=""
+            LINKARGS=""
+            list_add CMDARGS "-c"
+            ;;
+        *.c)
+            SRCFILE="$(readlink -f ${ARG} 2>/dev/null)"
+            if [ -z "$SRCFILE" ] ; then
+                SRCFILE="$ARG"
+            fi
+            list_add CMDARGS "${SRCFILE}"
+            ;;
+        *)
+            list_add CMDARGS "${ARG}"
       ;;
   esac
 done
 
-CMDLINE="${CC} ${CFLAGS} ${CMDLINE} ${INCLUDEARGS} ${CMAKE_LINKARGS} ${LINKARGS}"
+list_set CMDLINE "${CC}"
+list_add_not_empty CMDLINE "${CFLAGS}"
+list_add_not_empty CMDLINE ${INCLUDEARGS}
+list_add_not_empty CMDLINE ${CMAKE_LINKARGS}
+list_add_not_empty CMDLINE "${CMDARGS}"
+list_add_not_empty CMDLINE "${LINKARGS}"
 
-#echo "${CMDLINE}"
-${CMDLINE}
+eval $(list_get CMDLINE)
+"$@"
index 0a48d50..e79c31f 100755 (executable)
@@ -1,5 +1,11 @@
 #! /usr/bin/env perl
 
+# Copyright (c) 2010-2014. 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.
+
 use warnings;
 use strict;
 use File::Temp;
index bba2ffa..9e30ca3 100644 (file)
@@ -1,59 +1,57 @@
-#! /usr/bin/env bash
+#! /bin/sh
+
+# Copyright (c) 2012-2014. 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.
 
 F90=@GFORTRAN_EXE@
 
 INCLUDEARGS="@includeflag@"
 CMAKE_LINKARGS="-L@libdir@"
 
-FFLAGS="-ff2c  -fno-second-underscore"
-LINKARGS="-lsimgrid -lm -lgfortran"
+@SMPITOOLS_SH@
+
+list_set FFLAGS "-ff2c" "-fno-second-underscore"
+list_set LINKARGS "-lsimgrid" "-lm" "-lgfortran"
+list_set TMPFILES
 main_name=main
 
-declare -a TMPFILES
-trap 'rm -f "${TMPFILES[@]}"' EXIT
-
-# $1: prefix, $2: suffix
-mymktemp () {
-    tmp=$(mktemp --suffix="$2" "$1_XXXXXXXXXX" 2> /dev/null)
-    if [ -z "$tmp" ]; then
-        # mktemp failed (unsupported --suffix ?), try unsafe mode
-        tmp=$(mktemp -u "$1_XXXXXXXXXX" 2> /dev/null)
-        if [ -z "$tmp" ]; then
-            # mktemp failed again (doesn't exist ?), try very unsafe mode
-            tmp="$1_$$x$RANDOM"
-        fi
-        tmp="${tmp}$2"
-        # create temp file, and exit if it existed before
-        sh -C -c "true > \"${tmp}\"" || exit 1
-    fi
-    echo "${tmp}"
+cleanup () {
+    eval $(list_get TMPFILES)
+    rm -f "$@"
 }
-
-CMDLINE=""
-while [ -n "$1" ]; do
-  ARG="$1"
-  shift
-  case "${ARG}" in
-   -c)
-      CMAKE_LINKARGS=""
-      LINKARGS=""
-      CMDLINE="${CMDLINE} -c "
-      ;;
-   *.f90|*.F90)
-      TMPFILE=$(mymktemp "${ARG}" ".f90")
-      TMPFILES+="${TMPFILE}"
+trap 'cleanup' EXIT
+
+list_set CMDLINE "${F90}"
+list_add_not_empty CMDLINE "${FFLAGS}"
+while [ $# -gt 0 ]; do
+    ARG="$1"
+    shift
+    case "${ARG}" in
+        -c)
+            CMAKE_LINKARGS=""
+            LINKARGS=""
+            list_add CMDLINE "-c"
+            ;;
+        *.f90|*.F90)
+            TMPFILE=$(mymktemp "${ARG}" ".f90")
+            list_add TMPFILES "${TMPFILE}"
       #replace "program main_name by subroutine user\_main (and the end clause as well)"
-      sed 's/[[:space:]]*program[[:space:]]*\([a-zA-Z0-9\-\_]*\)/subroutine user\_main /gI;s/[[:space:]]*use[[:space:]]*mpi/\include \"mpif\.h\" /gI'  ${ARG} > ${TMPFILE}
-      SRCFILE="${TMPFILE}"
-      CMDLINE="${CMDLINE} ${SRCFILE} "
-      ;;
-   *)
-      CMDLINE="${CMDLINE} ${ARG} "
-      ;;
-  esac
+            sed 's/[[:space:]]*program[[:space:]]*\([a-zA-Z0-9\-\_]*\)/subroutine user\_main /gI;s/[[:space:]]*use[[:space:]]*mpi/\include \"mpif\.h\" /gI' "${ARG}" > "${TMPFILE}"
+            SRCFILE="${TMPFILE}"
+            list_add CMDLINE "${SRCFILE}"
+            ;;
+        *)
+            list_add CMDLINE "${ARG}"
+            ;;
+    esac
 done
 
-CMDLINE="${F90} ${FFLAGS} ${CMDLINE} ${INCLUDEARGS} ${CMAKE_LINKARGS} ${LINKARGS}"
+list_add_not_empty CMDLINE ${INCLUDEARGS}
+list_add_not_empty CMDLINE ${CMAKE_LINKARGS}
+list_add_not_empty CMDLINE "${LINKARGS}"
 
-#echo "${CMDLINE}"
-${CMDLINE}
+eval $(list_get CMDLINE)
+"$@"
index 33093fc..13955eb 100644 (file)
@@ -1,64 +1,70 @@
-#! /usr/bin/env bash
+#! /bin/sh
+
+# Copyright (c) 2010-2014. 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.
+
 prefix="@exec_prefix@"
+smpicc="$prefix/bin/smpicc"
+smpif2c="$prefix/bin/smpif2c"
 
-ARGS="-DMAIN__=user_main -Diargc_=smpi_process_argc -Dgetarg_=smpi_process_getarg"
-LINKARGS="-L@F2C_LIBRARY_PATH@ -lf2c -lm"
-declare -a SRCFILES
+@SMPITOOLS_SH@
 
-# $1: prefix, $2: suffix
-mymktemp () {
-    tmp=$(mktemp --suffix="$2" "$1_XXXXXXXXXX" 2> /dev/null)
-    if [ -z "$tmp" ]; then
-        # mktemp failed (unsupported --suffix ?), try unsafe mode
-        tmp=$(mktemp -u "$1_XXXXXXXXXX" 2> /dev/null)
-        if [ -z "$tmp" ]; then
-            # mktemp failed again (doesn't exist ?), try very unsafe mode
-            tmp="$1_$$x$RANDOM"
-        fi
-        tmp="${tmp}$2"
-        # create temp file, and exit if it existed before
-        sh -C -c "true > \"${tmp}\"" || exit 1
-    fi
-    echo "${tmp}"
-}
+list_set ARGS "-DMAIN__=user_main" "-Diargc_=smpi_process_argc" "-Dgetarg_=smpi_process_getarg"
+list_set LINKARGS "-L@F2C_LIBRARY_PATH@" "-lf2c" "-lm"
+list_set SRCFILES
 
-while [ -n "$1" ]; do
-  ARG="$1"
-  shift
-  case "${ARG}" in
-    *.f)
-      SRCFILE="$(readlink -f ${ARG} 2>/dev/null)"
-       if [ -z "$SRCFILE" ] ; then
-         SRCFILE="$ARG"
-       fi
-       SRCFILES+="${SRCFILE}"
-       ;;
-    *)
-      if [ "${ARG}" = "-c" ]; then
-          LINKARGS=""
-      fi
-      ARGS="${ARGS} ${ARG}"
-      ;;
-  esac
+while [ $# -gt 0 ]; do
+    ARG="$1"
+    shift
+    case "${ARG}" in
+        *.f)
+            SRCFILE="$(readlink -f ${ARG} 2>/dev/null)"
+            if [ -z "$SRCFILE" ] ; then
+                SRCFILE="$ARG"
+            fi
+            list_add SRCFILES "${SRCFILE}"
+            ;;
+        *)
+            if [ "${ARG}" = "-c" ]; then
+                LINKARGS=""
+            fi
+            list_add ARGS "${ARG}"
+            ;;
+    esac
 done
-ARGS="${ARGS} ${LINKARGS}"
+list_add_not_empty ARGS "${LINKARGS}"
+
+build () {
+    local SRCFILE
+    SRCFILE="$1"
+    TMPFILE=$(mymktemp "${SRCFILE}" ".f")
+    CFILE="${TMPFILE%.f}.c"
+
+    eval $(list_get ARGS)
+
+    cp "${SRCFILE}" "${TMPFILE}" \
+        && "$smpif2c" "${TMPFILE}" \
+        && "$smpicc" "$@" "${CFILE}" \
+        && rm -f "${CFILE}" \
+        && rm -f "${TMPFILE}" \
+        || exit $?
+
+    # When the file is compiled with "-c" and no output file is specified with
+    # "-o", rename the output.  FIXME: do it properly.
+    if [ -f "${CFILE%.c}.o" ]; then
+        mv "${CFILE%.c}.o" "${SRCFILE%.f}.o"
+    fi
+}
 
-if [ -n "${SRCFILES}" ]
-then
-   for SRCFILE in "${SRCFILES[@]}"
-   do
-      TMPFILE=$(mymktemp "${SRCFILE}" ".f")
-      cp ${SRCFILE} ${TMPFILE}
-      CFILE="${TMPFILE%.f}.c"
-      #echo "$prefix/bin/smpif2c ${TMPFILE} && $prefix/bin/smpicc ${ARGS} ${CFILE} && rm ${CFILE} && rm ${TMPFILE}"
-      $prefix/bin/smpif2c ${TMPFILE} && $prefix/bin/smpicc ${ARGS} ${CFILE} && rm ${CFILE} && rm ${TMPFILE} || exit $?
-      # When the file is compiled with "-c" and no output file is specified with
-      # "-o", rename the output.  FIXME: do it properly.
-      if [ -f ${CFILE%.c}.o ]; then
-          mv ${CFILE%.c}.o ${SRCFILE%.f}.o
-      fi
-   done
+if [ -n "${SRCFILES}" ]; then
+    eval $(list_get SRCFILES)
+    for SRCFILE in "$@"; do
+        build "$SRCFILE"
+    done
 else
-   #echo "$prefix/bin/smpicc ${ARGS}"
-   $prefix/bin/smpicc ${ARGS}
+    eval $(list_get ARGS)
+    "$smpicc" "$@"
 fi
index 2aaea16..7126a55 100755 (executable)
@@ -1,4 +1,10 @@
-#! /usr/bin/env bash
+#! /bin/sh
+
+# Copyright (c) 2007-2014. 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.
 
 @CMAKE_SMPI_COMMAND@
 
@@ -18,7 +24,7 @@ POWER="${DEFAULT_POWER}"
 SIMOPTS="--cfg=maxmin/precision:1e-9 --cfg=network/model:SMPI --cfg=network/TCP_gamma:4194304"
 
 #usage to print the way this script should be called
-function usage () {
+usage () {
 cat <<EOF
 Usage: $0 [OPTIONS] -platform <xmldesc> -hostfile <hostfile> program [program-options]
 Options:
@@ -33,7 +39,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-viva               # generate configuration for Viva'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)
 
@@ -52,6 +58,7 @@ fi
 
 EXTOPT=""
 WRAPPER=""
+HOSTFILE=""
 
 while true; do
   case "$1" in
@@ -84,6 +91,15 @@ while true; do
        shift 2
     ;;
 
+   "-machinefile")
+       HOSTFILE="$2"
+      if [ ! -f "${HOSTFILE}" ]; then
+               echo "[$0] ** error: the file '${HOSTFILE}' does not exist. Aborting."
+               exit 1
+      fi
+       shift 2
+    ;;
+
    "-ext")
       EXTOPT="$2"
       shift 2
@@ -190,12 +206,6 @@ done
 
 ##-----------------------------------
 
-# Basic checks on the provided arguments
-if [ -z "${EXEC}" ] ; then
-    echo "You must provide a program to execute."
-    usage
-    exit 1
-fi
 
 if [ -z "${HOSTFILE}" ] && [ -z "${PLATFORM}" ] ; then
     echo "No hostfile nor platform specified."
@@ -209,6 +219,21 @@ if [ -z "${HOSTFILE}" ] ; then
     HOSTFILE="$(mktemp tmphostXXXXXX)"
     perl -ne 'print "$1\n" if /.*<host.*?id="(.*?)".*?\/>.*/' ${PLATFORM} > ${HOSTFILE}
 fi
+UNROLLEDHOSTFILETMP=0
+
+#parse if our lines are terminated by :num_process
+multiple_processes=`grep -c ":" $HOSTFILE`
+if [ "${multiple_processes}" -gt 0 ] ; then
+    UNROLLEDHOSTFILETMP=1
+    UNROLLEDHOSTFILE="$(mktemp tmphostXXXXXX)"
+    perl -ne ' do{ for ( 1 .. $2 ) { print "$1\n" } } if /(.*?):(\d+).*/'  ${HOSTFILE}  > ${UNROLLEDHOSTFILE}
+    if [ ${HOSTFILETMP} = 1 ] ; then
+        rm ${HOSTFILE}
+        HOSTFILETMP=0
+    fi
+    HOSTFILE=$UNROLLEDHOSTFILE
+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`
@@ -234,20 +259,26 @@ if [ -z "${PLATFORM}" ]; then
 <AS id="AS0" routing="Full">
 PLATFORMHEAD
 
-for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
+i=${NUMPROCS}
+while [ $i -gt 0 ]; do
   echo "  <host id=\"host$i\" power=\"${POWER}\"/>" >> ${PLATFORMTMP}
   echo "  <link id=\"loop$i\" bandwidth=\"${LOOPBACK_BANDWIDTH}\" latency=\"${LOOPBACK_LATENCY}\"/>" >> ${PLATFORMTMP}
   echo "  <link id=\"link$i\" bandwidth=\"${NETWORK_BANDWIDTH}\" latency=\"${NETWORK_LATENCY}\"/>" >> ${PLATFORMTMP}
+  i=$((i - 1))
 done
 
-for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
-  for (( j=${NUMPROCS}; $j ; j=$j-1 )) do
+i=${NUMPROCS}
+while [ $i -gt 0 ]; do
+  j=${NUMPROCS}
+  while [ $j -gt 0 ]; do
     if [ $i -eq $j ]; then
       echo "  <route src=\"host$i\" dst=\"host$j\"><link_ctn id=\"loop$i\"/></route>" >> ${PLATFORMTMP}
     else
       echo "  <route src=\"host$i\" dst=\"host$j\"><link_ctn id=\"link$i\"/><link_ctn id=\"link$j\"/></route>" >> ${PLATFORMTMP}
     fi
+    j=$((j - 1))
   done
+  i=$((i - 1))
 done
 
 cat >> ${PLATFORMTMP} <<PLATFORMFOOT
@@ -273,15 +304,15 @@ APPLICATIONHEAD
 
 ##---- cache hostnames of hostfile---------------
 if [ -n "${HOSTFILE}" ] && [ -f ${HOSTFILE} ]; then
-       hostnames=(`cat ${HOSTFILE} | tr \\\n " "`)
-      NUMHOSTS=`cat ${HOSTFILE} | wc -l`
+  hostnames=$(cat ${HOSTFILE} | tr '\n\r' '  ')
+  NUMHOSTS=$(cat ${HOSTFILE} | wc -l)
 fi
 
 if [ "${EXTOPT}" = "smpi_replay" ]; then
   APP_TRACES=$PROC_ARGS
   if [ -n "${APP_TRACES}" ] && [ -f "${APP_TRACES}" ]; then
-     hosttraces=(`cat ${APP_TRACES} | tr \\\n " "`)
-     NUMTRACES=`cat ${APP_TRACES} | wc -l`
+     hosttraces=$(cat ${APP_TRACES} | tr '\n\r' '  ' )
+     NUMTRACES=$(cat ${APP_TRACES} | wc -l)
   else
      printf "File not found: %s\n", "${APP_TRACES:-\${APP_TRACES\}}" >&2
      exit 1
@@ -312,25 +343,25 @@ fi
 for i in ${SEQ}
 do
   if [ -n "${HOSTFILE}" ]; then
-       j=$(( $i % ${NUMHOSTS} ))
+       j=$(( $i % ${NUMHOSTS} + 1 ))
   fi
   ##---- optional display of ranks to process mapping
   if [ -n "${MAPOPT}" ]; then
-       echo "[rank $i] -> ${hostnames[$j]}"
+       echo "[rank $i] -> $(echo $hostnames|cut -d' ' -f$j)"
   fi
 
-  if [ -z "${hostnames[$j]}" ]; then
-       host="host"$(($j+1))
+  if [ -z "$(echo $hostnames|cut -d' ' -f$j)" ]; then
+       host="host"$($j)
   else
-       host="${hostnames[$j]}"
+       host="$(echo $hostnames|cut -d' ' -f$j)"
   fi
   echo "  <process host=\"${host}\" function=\"$i\"> <!-- function name used only for logging -->" >> ${APPLICATIONTMP}
   echo "    <argument value=\"$i\"/> <!-- rank -->" >> ${APPLICATIONTMP}
   if [ "${EXTOPT}" = "smpi_replay" ]; then
     if  [ ${NUMTRACES} -gt 1 ]; then
-      echo "    <argument value=\"${hosttraces[$j]}\"/>" >> ${APPLICATIONTMP}
+      echo "    <argument value=\"$(echo $hosttraces|cut -d' ' -f$j)\"/>" >> ${APPLICATIONTMP}
     else
-      echo "    <argument value=\"${hosttraces[0]}\"/>" >> ${APPLICATIONTMP}
+      echo "    <argument value=\"$(echo $hosttraces|cut -d' ' -f1)\"/>" >> ${APPLICATIONTMP}
     fi
   else 
     for ARG in $PROC_ARGS; do
@@ -388,10 +419,17 @@ if [ -n "${KEEP}" ] ; then
   if [ ${HOSTFILETMP} = 1 ] ; then
     echo "Generated hostfile ${HOSTFILE} keeped."
   fi
+  if [ ${UNROLLEDHOSTFILETMP} = 1 ] ; then
+    echo "Generated unrolled hostfile ${UNROLLEDHOSTFILE} keeped." 
+  fi
 fi
 ${EXEC} ${TRACEOPTIONS} ${SIMOPTS} ${PLATFORMTMP} ${APPLICATIONTMP}
 status=$?
 
+if [ ${status} = 139 ]; then echo "ERROR: A segmentation fault was triggered. 
+A common cause in SimGrid may be the use of a too small stack size for the simulated processes (default 128KiB).
+Please see contexts/stack_size parameter , or http://simgrid.org/simgrid/latest/doc/options.html#options_virt_stacksize "; fi
+
 if [ -z "${KEEP}" ] ; then
    if [ -z "${PLATFORM}" ]; then
        rm ${PLATFORMTMP}
@@ -399,6 +437,9 @@ if [ -z "${KEEP}" ] ; then
    if [ ${HOSTFILETMP} = 1 ] ; then
         rm ${HOSTFILE}
    fi
+   if [ ${UNROLLEDHOSTFILETMP} = 1 ] ; then
+        rm ${UNROLLEDHOSTFILE}
+   fi
    rm ${APPLICATIONTMP}
 fi
 
diff --git a/src/smpi/smpitools.sh b/src/smpi/smpitools.sh
new file mode 100644 (file)
index 0000000..bb41e7c
--- /dev/null
@@ -0,0 +1,78 @@
+#!/bin/sh
+#---- smpitools.sh --------------------------------------------------------#
+
+# Copyright (c) 2013-2014. 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.
+
+SAVEIFS="$IFS"
+LISTSEP="$(printf '\b')"
+
+# Create a temporary file, with its name of the form $1_XXX$2, where XXX is
+# replaced by an unique string.
+# $1: prefix, $2: suffix
+mymktemp () {
+    tmp=$(mktemp --suffix="$2" "$1_XXXXXXXXXX" 2> /dev/null)
+    if [ -z "$tmp" ]; then
+        # mktemp failed (unsupported --suffix ?), try unsafe mode
+        tmp=$(mktemp -u "$1_XXXXXXXXXX" 2> /dev/null)
+        if [ -z "$tmp" ]; then
+            # mktemp failed again (doesn't exist ?), try very unsafe mode
+            if [ -z "${mymktemp_seq}" ]; then
+                mymktemp_seq=$(date +%d%H%M%S)
+            fi
+            tmp="$1_$$x${mymktemp_seq}"
+            mymktemp_seq=$((mymktemp_seq + 1))
+        fi
+        tmp="${tmp}$2"
+        # create temp file, and exit if it existed before
+        sh -C -c "true > \"${tmp}\"" || exit 1
+    fi
+    echo "${tmp}"
+}
+
+# Add a word to the end of a list (words separated by LISTSEP)
+# $1: list, $2...: words to add
+list_add () {
+    local list content newcontent
+    list="$1"
+    shift
+    if [ $# -gt 0 ]; then
+        eval content=\"\${$list}\"
+        IFS="$LISTSEP"
+        newcontent="$*"
+        IFS="$SAVEIFS"
+        if [ -z "$content" ]; then
+            content="$newcontent"
+        else
+            content="$content${LISTSEP}$newcontent"
+        fi
+        eval $list=\"\${content}\"
+    fi
+}
+
+# Like list_add, but only if first word to add ($2) is not empty
+list_add_not_empty () {
+    if [ -n "$2" ]; then
+        list_add "$@"
+    fi
+}
+
+# Set contents of a list (words separated by LISTSEP)
+# $1: list, $2...: words to set
+list_set () {
+    eval $1=""
+    list_add "$@"
+}
+
+# Get the content of a list: positional parameters ($1, $2, ...) are set to the
+# content of the list
+# $1: list
+# usage:  eval $(list_get list)
+list_get () {
+    printf 'IFS="$LISTSEP"; eval set -- \\$%s; IFS="$SAVEIFS"' "$1"
+}
+
+#---- end of smpitools.sh -------------------------------------------------#
diff --git a/src/surf/cpu_cas01.c b/src/surf/cpu_cas01.c
deleted file mode 100644 (file)
index 15cf998..0000000
+++ /dev/null
@@ -1,601 +0,0 @@
-/* Copyright (c) 2009-2013. 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 "surf_private.h"
-#include "surf/surf_resource.h"
-#include "maxmin_private.h"
-#include "simgrid/sg_config.h"
-#include "cpu_cas01_private.h"
-
-#include "string.h"
-#include "stdlib.h"
-
-surf_model_t surf_cpu_model = NULL;
-
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu, surf,
-                                "Logging specific to the SURF CPU IMPROVED module");
-
-static xbt_swag_t
-    cpu_running_action_set_that_does_not_need_being_checked = NULL;
-
-/* Additionnal callback function to cleanup some data, called from surf_resource_free */
-
-static void cpu_cas01_cleanup(void* r){
-  cpu_Cas01_t cpu = (cpu_Cas01_t)r;
-  unsigned int iter;
-  xbt_dynar_t power_tuple = NULL;
-  xbt_dynar_foreach(cpu->energy->power_range_watts_list, iter, power_tuple)
-    xbt_dynar_free(&power_tuple);
-  xbt_dynar_free(&cpu->energy->power_range_watts_list);
-  xbt_dynar_free(&cpu->power_peak_list);
-  xbt_free(cpu->energy);
-  return;
-}
-
-/* This function is registered as a callback to sg_platf_new_host() and never called directly */
-static void *cpu_create_resource(const char *name, xbt_dynar_t power_peak,
-                                                                int pstate,
-                                 double power_scale,
-                                 tmgr_trace_t power_trace,
-                                 int core,
-                                 e_surf_resource_state_t state_initial,
-                                 tmgr_trace_t state_trace,
-                                 xbt_dict_t cpu_properties)
-{
-  cpu_Cas01_t cpu = NULL;
-
-  xbt_assert(!surf_cpu_resource_priv(surf_cpu_resource_by_name(name)),
-             "Host '%s' declared several times in the platform file",
-             name);
-  cpu = (cpu_Cas01_t) surf_resource_new(sizeof(s_cpu_Cas01_t),
-                                        surf_cpu_model, name,
-                                        cpu_properties,  &cpu_cas01_cleanup);
-  cpu->power_peak = xbt_dynar_get_as(power_peak, pstate, double);
-  cpu->power_peak_list = power_peak;
-  cpu->pstate = pstate;
-
-  cpu->energy = xbt_new(s_energy_cpu_cas01_t, 1);
-  cpu->energy->total_energy = 0;
-  cpu->energy->power_range_watts_list = cpu_get_watts_range_list(cpu);
-  cpu->energy->last_updated = surf_get_clock();
-
-  XBT_DEBUG("CPU create: peak=%f, pstate=%d",cpu->power_peak, cpu->pstate);
-
-  xbt_assert(cpu->power_peak > 0, "Power has to be >0");
-  cpu->power_scale = power_scale;
-  cpu->core = core;
-  xbt_assert(core > 0, "Invalid number of cores %d", core);
-
-  if (power_trace)
-    cpu->power_event =
-        tmgr_history_add_trace(history, power_trace, 0.0, 0, cpu);
-
-  cpu->state_current = state_initial;
-  if (state_trace)
-    cpu->state_event =
-        tmgr_history_add_trace(history, state_trace, 0.0, 0, cpu);
-
-  cpu->constraint =
-      lmm_constraint_new(surf_cpu_model->model_private->maxmin_system, cpu,
-                         cpu->core * cpu->power_scale * cpu->power_peak);
-
-  xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, cpu);
-
-  return xbt_lib_get_elm_or_null(host_lib, name);;
-}
-
-
-static void parse_cpu_init(sg_platf_host_cbarg_t host)
-{
-  cpu_create_resource(host->id,
-                      host->power_peak,
-                      host->pstate,
-                      host->power_scale,
-                      host->power_trace,
-                      host->core_amount,
-                      host->initial_state,
-                      host->state_trace, host->properties);
-}
-
-static void cpu_add_traces_cpu(void)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *trace_name, *elm;
-  static int called = 0;
-  if (called)
-    return;
-  called = 1;
-
-  /* connect all traces relative to hosts */
-  xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
-    tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
-    cpu_Cas01_t host = surf_cpu_resource_by_name(elm);
-
-    xbt_assert(host, "Host %s undefined", elm);
-    xbt_assert(trace, "Trace %s undefined", trace_name);
-
-    host->state_event =
-        tmgr_history_add_trace(history, trace, 0.0, 0, host);
-  }
-
-  xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) {
-    tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
-    cpu_Cas01_t host = surf_cpu_resource_by_name(elm);
-
-    xbt_assert(host, "Host %s undefined", elm);
-    xbt_assert(trace, "Trace %s undefined", trace_name);
-
-    host->power_event =
-        tmgr_history_add_trace(history, trace, 0.0, 0, host);
-  }
-}
-
-static void cpu_define_callbacks()
-{
-  sg_platf_host_add_cb(parse_cpu_init);
-  sg_platf_postparse_add_cb(cpu_add_traces_cpu);
-}
-
-static int cpu_resource_used(void *resource)
-{
-  return lmm_constraint_used(surf_cpu_model->model_private->maxmin_system,
-                             ((cpu_Cas01_t) resource)->constraint);
-}
-
-static double cpu_share_resources_lazy(double now)
-{
-  return generic_share_resources_lazy(now, surf_cpu_model);
-}
-
-static double cpu_share_resources_full(double now)
-{
-  s_surf_action_cpu_Cas01_t action;
-  return generic_maxmin_share_resources(surf_cpu_model->states.
-                                        running_action_set,
-                                        xbt_swag_offset(action,
-                                                        generic_lmm_action.
-                                                        variable),
-                                        surf_cpu_model->model_private->maxmin_system, lmm_solve);
-}
-
-static void cpu_update_actions_state_lazy(double now, double delta)
-{
-  generic_update_actions_state_lazy(now, delta, surf_cpu_model);
-}
-
-static void cpu_update_actions_state_full(double now, double delta)
-{
-  generic_update_actions_state_full(now, delta, surf_cpu_model);
-}
-
-xbt_dynar_t cpu_get_watts_range_list(cpu_Cas01_t cpu_model)
-{
-       xbt_dynar_t power_range_list;
-       xbt_dynar_t power_tuple;
-       int i = 0, pstate_nb=0;
-       xbt_dynar_t current_power_values;
-       double min_power, max_power;
-       xbt_dict_t props = cpu_model->generic_resource.properties;
-
-       if (props == NULL)
-               return NULL;
-
-       char* all_power_values_str = xbt_dict_get_or_null(props, "power_per_state");
-
-       if (all_power_values_str == NULL)
-               return NULL;
-
-
-       power_range_list = xbt_dynar_new(sizeof(xbt_dynar_t), NULL);
-       xbt_dynar_t all_power_values = xbt_str_split(all_power_values_str, ",");
-
-       pstate_nb = xbt_dynar_length(all_power_values);
-       for (i=0; i< pstate_nb; i++)
-       {
-               /* retrieve the power values associated with the current pstate */
-               current_power_values = xbt_str_split(xbt_dynar_get_as(all_power_values, i, char*), ":");
-               xbt_assert(xbt_dynar_length(current_power_values) > 1,
-                               "Power properties incorrectly defined - could not retrieve min and max power values for host %s",
-                               cpu_model->generic_resource.name);
-
-               /* min_power corresponds to the idle power (cpu load = 0) */
-               /* max_power is the power consumed at 100% cpu load       */
-               min_power = atof(xbt_dynar_get_as(current_power_values, 0, char*));
-               max_power = atof(xbt_dynar_get_as(current_power_values, 1, char*));
-
-               power_tuple = xbt_dynar_new(sizeof(double), NULL);
-               xbt_dynar_push_as(power_tuple, double, min_power);
-               xbt_dynar_push_as(power_tuple, double, max_power);
-
-               xbt_dynar_push_as(power_range_list, xbt_dynar_t, power_tuple);
-               xbt_dynar_free(&current_power_values);
-       }
-       xbt_dynar_free(&all_power_values);
-       return power_range_list;
-
-}
-
-/**
- * Computes the power consumed by the host according to the current pstate and processor load
- *
- */
-static double cpu_get_current_watts_value(cpu_Cas01_t cpu_model, double cpu_load)
-{
-       xbt_dynar_t power_range_list = cpu_model->energy->power_range_watts_list;
-
-       if (power_range_list == NULL)
-       {
-               XBT_DEBUG("No power range properties specified for host %s", cpu_model->generic_resource.name);
-               return 0;
-       }
-       xbt_assert(xbt_dynar_length(power_range_list) == xbt_dynar_length(cpu_model->power_peak_list),
-                                               "The number of power ranges in the properties does not match the number of pstates for host %s",
-                                               cpu_model->generic_resource.name);
-
-    /* retrieve the power values associated with the current pstate */
-    xbt_dynar_t current_power_values = xbt_dynar_get_as(power_range_list, cpu_model->pstate, xbt_dynar_t);
-
-    /* min_power corresponds to the idle power (cpu load = 0) */
-    /* max_power is the power consumed at 100% cpu load       */
-    double min_power = xbt_dynar_get_as(current_power_values, 0, double);
-    double max_power = xbt_dynar_get_as(current_power_values, 1, double);
-    double power_slope = max_power - min_power;
-
-    double current_power = min_power + cpu_load * power_slope;
-
-       XBT_DEBUG("[get_current_watts] min_power=%f, max_power=%f, slope=%f", min_power, max_power, power_slope);
-    XBT_DEBUG("[get_current_watts] Current power (watts) = %f, load = %f", current_power, cpu_load);
-
-       return current_power;
-
-}
-
-/**
- * Updates the total energy consumed as the sum of the current energy and
- *                                              the energy consumed by the current action
- */
-void cpu_update_energy(cpu_Cas01_t cpu_model, double cpu_load)
-{
-
-  double start_time = cpu_model->energy->last_updated;
-  double finish_time = surf_get_clock();
-
-  XBT_DEBUG("[cpu_update_energy] action time interval=(%f-%f), current power peak=%f, current pstate=%d",
-                 start_time, finish_time, cpu_model->power_peak, cpu_model->pstate);
-  double current_energy = cpu_model->energy->total_energy;
-  double action_energy = cpu_get_current_watts_value(cpu_model, cpu_load)*(finish_time-start_time);
-
-  cpu_model->energy->total_energy = current_energy + action_energy;
-  cpu_model->energy->last_updated = finish_time;
-
-  XBT_DEBUG("[cpu_update_energy] old_energy_value=%f, action_energy_value=%f", current_energy, action_energy);
-
-}
-
-static void cpu_update_resource_state(void *id,
-                                      tmgr_trace_event_t event_type,
-                                      double value, double date)
-{
-  cpu_Cas01_t cpu = id;
-  lmm_variable_t var = NULL;
-  lmm_element_t elem = NULL;
-
-  if (event_type == cpu->power_event) {
-    cpu->power_scale = value;
-    lmm_update_constraint_bound(surf_cpu_model->model_private->maxmin_system, cpu->constraint,
-                                cpu->core * cpu->power_scale *
-                                cpu->power_peak);
-#ifdef HAVE_TRACING
-    TRACE_surf_host_set_power(date, cpu->generic_resource.name,
-                              cpu->core * cpu->power_scale *
-                              cpu->power_peak);
-#endif
-    while ((var = lmm_get_var_from_cnst
-            (surf_cpu_model->model_private->maxmin_system, cpu->constraint, &elem))) {
-      surf_action_cpu_Cas01_t action = lmm_variable_id(var);
-      lmm_update_variable_bound(surf_cpu_model->model_private->maxmin_system,
-                                GENERIC_LMM_ACTION(action).variable,
-                                cpu->power_scale * cpu->power_peak);
-    }
-    if (tmgr_trace_event_free(event_type))
-      cpu->power_event = NULL;
-  } else if (event_type == cpu->state_event) {
-    if (value > 0) {
-      if(cpu->state_current == SURF_RESOURCE_OFF)
-        xbt_dynar_push_as(host_that_restart, char*, (cpu->generic_resource.name));
-      cpu->state_current = SURF_RESOURCE_ON;
-    } else {
-      lmm_constraint_t cnst = cpu->constraint;
-
-      cpu->state_current = SURF_RESOURCE_OFF;
-
-      while ((var = lmm_get_var_from_cnst(surf_cpu_model->model_private->maxmin_system, cnst, &elem))) {
-        surf_action_t action = lmm_variable_id(var);
-
-        if (surf_action_state_get(action) == SURF_ACTION_RUNNING ||
-            surf_action_state_get(action) == SURF_ACTION_READY ||
-            surf_action_state_get(action) ==
-            SURF_ACTION_NOT_IN_THE_SYSTEM) {
-          action->finish = date;
-          surf_action_state_set(action, SURF_ACTION_FAILED);
-        }
-      }
-    }
-    if (tmgr_trace_event_free(event_type))
-      cpu->state_event = NULL;
-  } else {
-    XBT_CRITICAL("Unknown event ! \n");
-    xbt_abort();
-  }
-
-  return;
-}
-
-static surf_action_t cpu_execute(void *cpu, double size)
-{
-  surf_action_cpu_Cas01_t action = NULL;
-  //xbt_dict_cursor_t cursor = NULL;
-  cpu_Cas01_t CPU = surf_cpu_resource_priv(cpu);
-  //xbt_dict_t props = CPU->generic_resource.properties;
-
-  XBT_IN("(%s,%g)", surf_resource_name(CPU), size);
-  action =
-      surf_action_new(sizeof(s_surf_action_cpu_Cas01_t), size,
-                      surf_cpu_model,
-                      CPU->state_current != SURF_RESOURCE_ON);
-
-  GENERIC_LMM_ACTION(action).suspended = 0;     /* Should be useless because of the
-                                                   calloc but it seems to help valgrind... */
-
-  GENERIC_LMM_ACTION(action).variable =
-      lmm_variable_new(surf_cpu_model->model_private->maxmin_system, action,
-                       GENERIC_ACTION(action).priority,
-                       CPU->power_scale * CPU->power_peak, 1);
-  if (surf_cpu_model->model_private->update_mechanism == UM_LAZY) {
-    GENERIC_LMM_ACTION(action).index_heap = -1;
-    GENERIC_LMM_ACTION(action).last_update = surf_get_clock();
-    GENERIC_LMM_ACTION(action).last_value = 0.0;
-  }
-
-  lmm_expand(surf_cpu_model->model_private->maxmin_system, CPU->constraint,
-             GENERIC_LMM_ACTION(action).variable, 1.0);
-  XBT_OUT();
-  return (surf_action_t) action;
-}
-
-static surf_action_t cpu_action_sleep(void *cpu, double duration)
-{
-  surf_action_cpu_Cas01_t action = NULL;
-
-  if (duration > 0)
-    duration = MAX(duration, MAXMIN_PRECISION);
-
-  XBT_IN("(%s,%g)", surf_resource_name(surf_cpu_resource_priv(cpu)), duration);
-  action = (surf_action_cpu_Cas01_t) cpu_execute(cpu, 1.0);
-  // FIXME: sleep variables should not consume 1.0 in lmm_expand
-  GENERIC_ACTION(action).max_duration = duration;
-  GENERIC_LMM_ACTION(action).suspended = 2;
-  if (duration == NO_MAX_DURATION) {
-    /* Move to the *end* of the corresponding action set. This convention
-       is used to speed up update_resource_state  */
-    xbt_swag_remove(action, ((surf_action_t) action)->state_set);
-    ((surf_action_t) action)->state_set =
-        cpu_running_action_set_that_does_not_need_being_checked;
-    xbt_swag_insert(action, ((surf_action_t) action)->state_set);
-  }
-
-  lmm_update_variable_weight(surf_cpu_model->model_private->maxmin_system,
-                             GENERIC_LMM_ACTION(action).variable, 0.0);
-  if (surf_cpu_model->model_private->update_mechanism == UM_LAZY) {     // remove action from the heap
-    surf_action_lmm_heap_remove(surf_cpu_model->model_private->action_heap,(surf_action_lmm_t)action);
-    // this is necessary for a variable with weight 0 since such
-    // variables are ignored in lmm and we need to set its max_duration
-    // correctly at the next call to share_resources
-    xbt_swag_insert_at_head(action,surf_cpu_model->model_private->modified_set);
-  }
-
-  XBT_OUT();
-  return (surf_action_t) action;
-}
-
-static e_surf_resource_state_t cpu_get_state(void *cpu)
-{
-  return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->state_current;
-}
-
-static double cpu_get_speed(void *cpu, double load)
-{
-  return load * ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->power_peak;
-}
-
-static int cpu_get_core(void *cpu)
-{
-  return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->core;
-}
-
-
-static double cpu_get_available_speed(void *cpu)
-{
-  /* number between 0 and 1 */
-  return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->power_scale;
-}
-
-static double cpu_get_current_power_peak(void *cpu)
-{
-  return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->power_peak;
-}
-
-static double cpu_get_power_peak_at(void *cpu, int pstate_index)
-{
-  xbt_dynar_t plist = ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->power_peak_list;
-  xbt_assert((pstate_index <= xbt_dynar_length(plist)), "Invalid parameters (pstate index out of bounds)");
-
-  return xbt_dynar_get_as(plist, pstate_index, double);
-}
-
-static int cpu_get_nb_pstates(void *cpu)
-{
-  return xbt_dynar_length(((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->power_peak_list);
-}
-
-static void cpu_set_power_peak_at(void *cpu, int pstate_index)
-{
-  cpu_Cas01_t cpu_implem = (cpu_Cas01_t)surf_cpu_resource_priv(cpu);
-  xbt_dynar_t plist = cpu_implem->power_peak_list;
-  xbt_assert((pstate_index <= xbt_dynar_length(plist)), "Invalid parameters (pstate index out of bounds)");
-
-  double new_power_peak = xbt_dynar_get_as(plist, pstate_index, double);
-  cpu_implem->pstate = pstate_index;
-  cpu_implem->power_peak = new_power_peak;
-}
-
-static double cpu_get_consumed_energy(void *cpu)
-{
-  return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->energy->total_energy;
-}
-
-static void cpu_finalize(void)
-{
-  lmm_system_free(surf_cpu_model->model_private->maxmin_system);
-  surf_cpu_model->model_private->maxmin_system = NULL;
-
-  if (surf_cpu_model->model_private->action_heap)
-    xbt_heap_free(surf_cpu_model->model_private->action_heap);
-  xbt_swag_free(surf_cpu_model->model_private->modified_set);
-
-  surf_model_exit(surf_cpu_model);
-  surf_cpu_model = NULL;
-
-  xbt_swag_free(cpu_running_action_set_that_does_not_need_being_checked);
-  cpu_running_action_set_that_does_not_need_being_checked = NULL;
-}
-
-static void surf_cpu_model_init_internal()
-{
-  s_surf_action_t action;
-  s_surf_action_cpu_Cas01_t comp;
-
-  char *optim = xbt_cfg_get_string(_sg_cfg_set, "cpu/optim");
-  int select =
-      xbt_cfg_get_boolean(_sg_cfg_set, "cpu/maxmin_selective_update");
-
-  surf_cpu_model = surf_model_init();
-
-  if (!strcmp(optim, "Full")) {
-    surf_cpu_model->model_private->update_mechanism = UM_FULL;
-    surf_cpu_model->model_private->selective_update = select;
-  } else if (!strcmp(optim, "Lazy")) {
-    surf_cpu_model->model_private->update_mechanism = UM_LAZY;
-    surf_cpu_model->model_private->selective_update = 1;
-    xbt_assert((select == 1)
-               ||
-               (xbt_cfg_is_default_value
-                (_sg_cfg_set, "cpu/maxmin_selective_update")),
-               "Disabling selective update while using the lazy update mechanism is dumb!");
-  } else {
-    xbt_die("Unsupported optimization (%s) for this model", optim);
-  }
-
-  cpu_running_action_set_that_does_not_need_being_checked =
-      xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
-  surf_cpu_model->name = "cpu";
-
-  surf_cpu_model->action_unref = surf_action_unref;
-  surf_cpu_model->action_cancel = surf_action_cancel;
-  surf_cpu_model->action_state_set = surf_action_state_set;
-
-  surf_cpu_model->model_private->resource_used = cpu_resource_used;
-
-  if (surf_cpu_model->model_private->update_mechanism == UM_LAZY) {
-    surf_cpu_model->model_private->share_resources =
-        cpu_share_resources_lazy;
-    surf_cpu_model->model_private->update_actions_state =
-        cpu_update_actions_state_lazy;
-  } else if (surf_cpu_model->model_private->update_mechanism == UM_FULL) {
-    surf_cpu_model->model_private->share_resources =
-        cpu_share_resources_full;
-    surf_cpu_model->model_private->update_actions_state =
-        cpu_update_actions_state_full;
-  } else
-    xbt_die("Invalid cpu update mechanism!");
-
-  surf_cpu_model->model_private->update_resource_state =
-      cpu_update_resource_state;
-  surf_cpu_model->model_private->finalize = cpu_finalize;
-
-  surf_cpu_model->suspend = surf_action_suspend;
-  surf_cpu_model->resume = surf_action_resume;
-  surf_cpu_model->is_suspended = surf_action_is_suspended;
-  surf_cpu_model->set_max_duration = surf_action_set_max_duration;
-  surf_cpu_model->set_priority = surf_action_set_priority;
-#ifdef HAVE_TRACING
-  surf_cpu_model->set_category = surf_action_set_category;
-#endif
-  surf_cpu_model->get_remains = surf_action_get_remains;
-
-  surf_cpu_model->extension.cpu.execute = cpu_execute;
-  surf_cpu_model->extension.cpu.sleep = cpu_action_sleep;
-
-  surf_cpu_model->extension.cpu.get_state = cpu_get_state;
-  surf_cpu_model->extension.cpu.get_core = cpu_get_core;
-  surf_cpu_model->extension.cpu.get_speed = cpu_get_speed;
-  surf_cpu_model->extension.cpu.get_available_speed =
-      cpu_get_available_speed;
-  surf_cpu_model->extension.cpu.get_current_power_peak = cpu_get_current_power_peak;
-  surf_cpu_model->extension.cpu.get_power_peak_at = cpu_get_power_peak_at;
-  surf_cpu_model->extension.cpu.get_nb_pstates = cpu_get_nb_pstates;
-  surf_cpu_model->extension.cpu.set_power_peak_at = cpu_set_power_peak_at;
-  surf_cpu_model->extension.cpu.get_consumed_energy = cpu_get_consumed_energy;
-
-  surf_cpu_model->extension.cpu.add_traces = cpu_add_traces_cpu;
-
-  if (!surf_cpu_model->model_private->maxmin_system) {
-    surf_cpu_model->model_private->maxmin_system = lmm_system_new(surf_cpu_model->model_private->selective_update);
-  }
-  if (surf_cpu_model->model_private->update_mechanism == UM_LAZY) {
-    surf_cpu_model->model_private->action_heap = xbt_heap_new(8, NULL);
-    xbt_heap_set_update_callback(surf_cpu_model->model_private->action_heap,
-        surf_action_lmm_update_index_heap);
-    surf_cpu_model->model_private->modified_set =
-        xbt_swag_new(xbt_swag_offset(comp, generic_lmm_action.action_list_hookup));
-    surf_cpu_model->model_private->maxmin_system->keep_track = surf_cpu_model->model_private->modified_set;
-  }
-}
-
-/*********************************************************************/
-/* Basic sharing model for CPU: that is where all this started... ;) */
-/*********************************************************************/
-/* @InProceedings{casanova01simgrid, */
-/*   author =       "H. Casanova", */
-/*   booktitle =    "Proceedings of the IEEE Symposium on Cluster Computing */
-/*                  and the Grid (CCGrid'01)", */
-/*   publisher =    "IEEE Computer Society", */
-/*   title =        "Simgrid: {A} Toolkit for the Simulation of Application */
-/*                  Scheduling", */
-/*   year =         "2001", */
-/*   month =        may, */
-/*   note =         "Available at */
-/*                  \url{http://grail.sdsc.edu/papers/simgrid_ccgrid01.ps.gz}." */
-/* } */
-
-void surf_cpu_model_init_Cas01()
-{
-  char *optim = xbt_cfg_get_string(_sg_cfg_set, "cpu/optim");
-
-  if (surf_cpu_model)
-    return;
-
-  if (!strcmp(optim, "TI")) {
-    surf_cpu_model_init_ti();
-    return;
-  }
-
-  surf_cpu_model_init_internal();
-  cpu_define_callbacks();
-  xbt_dynar_push(model_list, &surf_cpu_model);
-}
diff --git a/src/surf/cpu_cas01.cpp b/src/surf/cpu_cas01.cpp
new file mode 100644 (file)
index 0000000..c746e9a
--- /dev/null
@@ -0,0 +1,394 @@
+/* Copyright (c) 2009-2011, 2013-2014. 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 "cpu_cas01.hpp"
+#include "cpu_ti.hpp"
+#include "plugins/energy.hpp"
+#include "maxmin_private.hpp"
+#include "simgrid/sg_config.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu_cas, surf_cpu,
+                                "Logging specific to the SURF CPU IMPROVED module");
+
+/*************
+ * CallBacks *
+ *************/
+
+static void parse_cpu_init(sg_platf_host_cbarg_t host){
+  ((CpuCas01ModelPtr)surf_cpu_model_pm)->parseInit(host);
+}
+
+static void cpu_add_traces_cpu(){
+  surf_cpu_model_pm->addTraces();
+}
+
+static void cpu_define_callbacks()
+{
+  sg_platf_host_add_cb(parse_cpu_init);
+  sg_platf_postparse_add_cb(cpu_add_traces_cpu);
+}
+
+/*********
+ * Model *
+ *********/
+void surf_cpu_model_init_Cas01()
+{
+  char *optim = xbt_cfg_get_string(_sg_cfg_set, "cpu/optim");
+
+  xbt_assert(!surf_cpu_model_pm);
+  xbt_assert(!surf_cpu_model_vm);
+
+  if (!strcmp(optim, "TI")) {
+    surf_cpu_model_init_ti();
+    return;
+  }
+
+  surf_cpu_model_pm = new CpuCas01Model();
+  surf_cpu_model_vm  = new CpuCas01Model();
+
+  cpu_define_callbacks();
+  ModelPtr model_pm = static_cast<ModelPtr>(surf_cpu_model_pm);
+  ModelPtr model_vm = static_cast<ModelPtr>(surf_cpu_model_vm);
+  xbt_dynar_push(model_list, &model_pm);
+  xbt_dynar_push(model_list, &model_vm);
+}
+
+CpuCas01Model::CpuCas01Model() : CpuModel("cpu")
+{
+  char *optim = xbt_cfg_get_string(_sg_cfg_set, "cpu/optim");
+  int select = xbt_cfg_get_boolean(_sg_cfg_set, "cpu/maxmin_selective_update");
+
+  if (!strcmp(optim, "Full")) {
+    p_updateMechanism = UM_FULL;
+    m_selectiveUpdate = select;
+  } else if (!strcmp(optim, "Lazy")) {
+    p_updateMechanism = UM_LAZY;
+    m_selectiveUpdate = 1;
+    xbt_assert((select == 1)
+               ||
+               (xbt_cfg_is_default_value
+                (_sg_cfg_set, "cpu/maxmin_selective_update")),
+               "Disabling selective update while using the lazy update mechanism is dumb!");
+  } else {
+    xbt_die("Unsupported optimization (%s) for this model", optim);
+  }
+
+  p_cpuRunningActionSetThatDoesNotNeedBeingChecked = new ActionList();
+
+  if (getUpdateMechanism() == UM_LAZY) {
+       shareResources = &CpuCas01Model::shareResourcesLazy;
+       updateActionsState = &CpuCas01Model::updateActionsStateLazy;
+
+  } else if (getUpdateMechanism() == UM_FULL) {
+       shareResources = &CpuCas01Model::shareResourcesFull;
+       updateActionsState = &CpuCas01Model::updateActionsStateFull;
+  } else
+    xbt_die("Invalid cpu update mechanism!");
+
+  if (!p_maxminSystem) {
+    p_maxminSystem = lmm_system_new(m_selectiveUpdate);
+  }
+
+  if (getUpdateMechanism() == UM_LAZY) {
+    p_actionHeap = xbt_heap_new(8, NULL);
+    xbt_heap_set_update_callback(p_actionHeap,  surf_action_lmm_update_index_heap);
+    p_modifiedSet = new ActionLmmList();
+    p_maxminSystem->keep_track = p_modifiedSet;
+  }
+}
+
+CpuCas01Model::~CpuCas01Model()
+{
+  lmm_system_free(p_maxminSystem);
+  p_maxminSystem = NULL;
+
+  if (p_actionHeap)
+    xbt_heap_free(p_actionHeap);
+  delete p_modifiedSet;
+
+  surf_cpu_model_pm = NULL;
+
+  delete p_cpuRunningActionSetThatDoesNotNeedBeingChecked;
+}
+
+void CpuCas01Model::parseInit(sg_platf_host_cbarg_t host)
+{
+  createResource(host->id,
+        host->power_peak,
+        host->pstate,
+        host->power_scale,
+        host->power_trace,
+        host->core_amount,
+        host->initial_state,
+        host->state_trace,
+        host->properties);
+}
+
+CpuPtr CpuCas01Model::createResource(const char *name, xbt_dynar_t power_peak,
+                                 int pstate, double power_scale,
+                          tmgr_trace_t power_trace, int core,
+                          e_surf_resource_state_t state_initial,
+                          tmgr_trace_t state_trace,
+                          xbt_dict_t cpu_properties)
+{
+  CpuPtr cpu = NULL;
+  xbt_assert(!surf_cpu_resource_priv(surf_cpu_resource_by_name(name)),
+             "Host '%s' declared several times in the platform file",
+             name);
+  xbt_assert(xbt_dynar_getfirst_as(power_peak, double) > 0.0,
+      "Power has to be >0.0");
+  xbt_assert(core > 0, "Invalid number of cores %d", core);
+
+  cpu = new CpuCas01(this, name, power_peak, pstate, power_scale, power_trace, core, state_initial, state_trace, cpu_properties);
+  xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, static_cast<ResourcePtr>(cpu));
+
+  return cpu;
+}
+
+double CpuCas01Model::shareResourcesFull(double /*now*/)
+{
+  return Model::shareResourcesMaxMin(getRunningActionSet(),
+                             p_maxminSystem, lmm_solve);
+}
+
+void CpuCas01Model::addTraces()
+{
+  xbt_dict_cursor_t cursor = NULL;
+  char *trace_name, *elm;
+  static int called = 0;
+  if (called)
+    return;
+  called = 1;
+
+  /* connect all traces relative to hosts */
+  xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
+    tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+    CpuCas01Ptr host = static_cast<CpuCas01Ptr>(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)));
+
+    xbt_assert(host, "Host %s undefined", elm);
+    xbt_assert(trace, "Trace %s undefined", trace_name);
+
+    host->setStateEvent(tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(host)));
+  }
+
+  xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) {
+    tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+    CpuCas01Ptr host = static_cast<CpuCas01Ptr>(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)));
+
+    xbt_assert(host, "Host %s undefined", elm);
+    xbt_assert(trace, "Trace %s undefined", trace_name);
+
+    host->setPowerEvent(tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(host)));
+  }
+}
+
+/************
+ * Resource *
+ ************/
+CpuCas01::CpuCas01(CpuCas01ModelPtr model, const char *name, xbt_dynar_t powerPeak,
+                         int pstate, double powerScale, tmgr_trace_t powerTrace, int core,
+                         e_surf_resource_state_t stateInitial, tmgr_trace_t stateTrace,
+                         xbt_dict_t properties)
+: Cpu(model, name, properties,
+         lmm_constraint_new(model->getMaxminSystem(), this, core * powerScale * xbt_dynar_get_as(powerPeak, pstate, double)),
+         core, xbt_dynar_get_as(powerPeak, pstate, double), powerScale) {
+  p_powerEvent = NULL;
+  p_powerPeakList = powerPeak;
+  m_pstate = pstate;
+
+  XBT_DEBUG("CPU create: peak=%f, pstate=%d", m_powerPeak, m_pstate);
+
+  m_core = core;
+  setState(stateInitial);
+  if (powerTrace)
+    p_powerEvent = tmgr_history_add_trace(history, powerTrace, 0.0, 0, static_cast<ResourcePtr>(this));
+
+  if (stateTrace)
+    p_stateEvent = tmgr_history_add_trace(history, stateTrace, 0.0, 0, static_cast<ResourcePtr>(this));
+}
+
+CpuCas01::~CpuCas01(){
+  if (getModel() == surf_cpu_model_pm)
+    xbt_dynar_free(&p_powerPeakList);
+}
+
+void CpuCas01::setStateEvent(tmgr_trace_event_t stateEvent)
+{
+  p_stateEvent = stateEvent;
+}
+
+void CpuCas01::setPowerEvent(tmgr_trace_event_t powerEvent)
+{
+  p_powerEvent = powerEvent;
+}
+
+xbt_dynar_t CpuCas01::getPowerPeakList(){
+  return p_powerPeakList;
+}
+
+int CpuCas01::getPState()
+{
+  return m_pstate;
+}
+
+bool CpuCas01::isUsed()
+{
+  return lmm_constraint_used(getModel()->getMaxminSystem(), getConstraint());
+}
+
+void CpuCas01::updateState(tmgr_trace_event_t event_type, double value, double date)
+{
+  lmm_variable_t var = NULL;
+  lmm_element_t elem = NULL;
+
+  if (event_type == p_powerEvent) {
+       /* TODO (Hypervisor): do the same thing for constraint_core[i] */
+       xbt_assert(m_core == 1, "FIXME: add power scaling code also for constraint_core[i]");
+
+    m_powerScale = value;
+    lmm_update_constraint_bound(getModel()->getMaxminSystem(), getConstraint(),
+                                m_core * m_powerScale *
+                                m_powerPeak);
+#ifdef HAVE_TRACING
+    TRACE_surf_host_set_power(date, getName(),
+                              m_core * m_powerScale *
+                              m_powerPeak);
+#endif
+    while ((var = lmm_get_var_from_cnst
+            (getModel()->getMaxminSystem(), getConstraint(), &elem))) {
+      CpuCas01ActionPtr action = static_cast<CpuCas01ActionPtr>(static_cast<ActionPtr>(lmm_variable_id(var)));
+
+      lmm_update_variable_bound(getModel()->getMaxminSystem(),
+                                action->getVariable(),
+                                m_powerScale * m_powerPeak);
+    }
+    if (tmgr_trace_event_free(event_type))
+      p_powerEvent = NULL;
+  } else if (event_type == p_stateEvent) {
+       /* TODO (Hypervisor): do the same thing for constraint_core[i] */
+    xbt_assert(m_core == 1, "FIXME: add state change code also for constraint_core[i]");
+
+    if (value > 0) {
+      if(getState() == SURF_RESOURCE_OFF)
+        xbt_dynar_push_as(host_that_restart, char*, (char *)getName());
+      setState(SURF_RESOURCE_ON);
+    } else {
+      lmm_constraint_t cnst = getConstraint();
+
+      setState(SURF_RESOURCE_OFF);
+
+      while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), cnst, &elem))) {
+        ActionPtr action = static_cast<ActionPtr>(lmm_variable_id(var));
+
+        if (action->getState() == SURF_ACTION_RUNNING ||
+            action->getState() == SURF_ACTION_READY ||
+            action->getState() == SURF_ACTION_NOT_IN_THE_SYSTEM) {
+          action->setFinishTime(date);
+          action->setState(SURF_ACTION_FAILED);
+        }
+      }
+    }
+    if (tmgr_trace_event_free(event_type))
+      p_stateEvent = NULL;
+  } else {
+    XBT_CRITICAL("Unknown event ! \n");
+    xbt_abort();
+  }
+
+  return;
+}
+
+CpuActionPtr CpuCas01::execute(double size)
+{
+
+  XBT_IN("(%s,%g)", getName(), size);
+  CpuCas01ActionPtr action = new CpuCas01Action(getModel(), size, getState() != SURF_RESOURCE_ON,
+                                                             m_powerScale * m_powerPeak, getConstraint());
+
+  XBT_OUT();
+  return action;
+}
+
+CpuActionPtr CpuCas01::sleep(double duration)
+{
+  if (duration > 0)
+    duration = MAX(duration, MAXMIN_PRECISION);
+
+  XBT_IN("(%s,%g)", getName(), duration);
+  CpuCas01ActionPtr action = new CpuCas01Action(getModel(), 1.0, getState() != SURF_RESOURCE_ON,
+                                                      m_powerScale * m_powerPeak, getConstraint());
+
+
+  // FIXME: sleep variables should not consume 1.0 in lmm_expand
+  action->m_maxDuration = duration;
+  action->m_suspended = 2;
+  if (duration == NO_MAX_DURATION) {
+    /* Move to the *end* of the corresponding action set. This convention
+       is used to speed up update_resource_state  */
+       action->getStateSet()->erase(action->getStateSet()->iterator_to(*action));
+    action->p_stateSet = static_cast<CpuCas01ModelPtr>(getModel())->p_cpuRunningActionSetThatDoesNotNeedBeingChecked;
+    action->getStateSet()->push_back(*action);
+  }
+
+  lmm_update_variable_weight(getModel()->getMaxminSystem(),
+                             action->getVariable(), 0.0);
+  if (getModel()->getUpdateMechanism() == UM_LAZY) {     // remove action from the heap
+    action->heapRemove(getModel()->getActionHeap());
+    // this is necessary for a variable with weight 0 since such
+    // variables are ignored in lmm and we need to set its max_duration
+    // correctly at the next call to share_resources
+    getModel()->getModifiedSet()->push_front(*action);
+  }
+
+  XBT_OUT();
+  return action;
+}
+
+double CpuCas01::getCurrentPowerPeak()
+{
+  return m_powerPeak;
+}
+
+double CpuCas01::getPowerPeakAt(int pstate_index)
+{
+  xbt_dynar_t plist = p_powerPeakList;
+  xbt_assert((pstate_index <= (int)xbt_dynar_length(plist)), "Invalid parameters (pstate index out of bounds)");
+
+  return xbt_dynar_get_as(plist, pstate_index, double);
+}
+
+int CpuCas01::getNbPstates()
+{
+  return xbt_dynar_length(p_powerPeakList);
+}
+
+void CpuCas01::setPowerPeakAt(int pstate_index)
+{
+  xbt_dynar_t plist = p_powerPeakList;
+  xbt_assert((pstate_index <= (int)xbt_dynar_length(plist)), "Invalid parameters (pstate index out of bounds)");
+
+  double new_power_peak = xbt_dynar_get_as(plist, pstate_index, double);
+  m_pstate = pstate_index;
+  m_powerPeak = new_power_peak;
+}
+
+/**********
+ * Action *
+ **********/
+
+CpuCas01Action::CpuCas01Action(ModelPtr model, double cost, bool failed, double power, lmm_constraint_t constraint)
+ : CpuAction(model, cost, failed,
+                    lmm_variable_new(model->getMaxminSystem(), static_cast<ActionPtr>(this),
+                    1.0, power, 1))
+{
+  m_suspended = 0;
+  if (model->getUpdateMechanism() == UM_LAZY) {
+    m_indexHeap = -1;
+    m_lastUpdate = surf_get_clock();
+    m_lastValue = 0.0;
+  }
+  lmm_expand(model->getMaxminSystem(), constraint, getVariable(), 1.0);
+}
diff --git a/src/surf/cpu_cas01.hpp b/src/surf/cpu_cas01.hpp
new file mode 100644 (file)
index 0000000..685cd4c
--- /dev/null
@@ -0,0 +1,88 @@
+/* Copyright (c) 2013-2014. 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 "cpu_interface.hpp"
+
+/***********
+ * Classes *
+ ***********/
+class CpuCas01Model;
+typedef CpuCas01Model *CpuCas01ModelPtr;
+
+class CpuCas01;
+typedef CpuCas01 *CpuCas01Ptr;
+
+class CpuCas01Action;
+typedef CpuCas01Action *CpuCas01ActionPtr;
+
+/*********
+ * Model *
+ *********/
+class CpuCas01Model : public CpuModel {
+public:
+  CpuCas01Model();
+  ~CpuCas01Model();
+
+  double (CpuCas01Model::*shareResources)(double now);
+  void (CpuCas01Model::*updateActionsState)(double now, double delta);
+
+  void parseInit(sg_platf_host_cbarg_t host);  
+  CpuPtr createResource(const char *name, xbt_dynar_t power_peak, int pstate,
+                                 double power_scale,
+                          tmgr_trace_t power_trace, int core,
+                          e_surf_resource_state_t state_initial,
+                          tmgr_trace_t state_trace,
+                          xbt_dict_t cpu_properties);
+  double shareResourcesFull(double now);  
+  void addTraces();
+  ActionListPtr p_cpuRunningActionSetThatDoesNotNeedBeingChecked;
+};
+
+/************
+ * Resource *
+ ************/
+
+class CpuCas01 : public Cpu {
+public:
+  CpuCas01(CpuCas01ModelPtr model, const char *name, xbt_dynar_t power_peak,
+        int pstate, double powerScale, tmgr_trace_t powerTrace, int core,
+        e_surf_resource_state_t stateInitial, tmgr_trace_t stateTrace,
+       xbt_dict_t properties) ;
+  ~CpuCas01();
+  void updateState(tmgr_trace_event_t event_type, double value, double date);
+  CpuActionPtr execute(double size);
+  CpuActionPtr sleep(double duration);
+
+  double getCurrentPowerPeak();
+  double getPowerPeakAt(int pstate_index);
+  int getNbPstates();
+  void setPowerPeakAt(int pstate_index);
+  bool isUsed();
+  void setStateEvent(tmgr_trace_event_t stateEvent);
+  void setPowerEvent(tmgr_trace_event_t stateEvent);
+  xbt_dynar_t getPowerPeakList();
+
+  int getPState();
+
+private:
+  tmgr_trace_event_t p_stateEvent;
+  tmgr_trace_event_t p_powerEvent;
+  xbt_dynar_t p_powerPeakList;                         /*< List of supported CPU capacities */
+  int m_pstate;                                                                /*< Current pstate (index in the power_peak_list)*/
+};
+
+/**********
+ * Action *
+ **********/
+class CpuCas01Action: public CpuAction {
+  friend CpuActionPtr CpuCas01::execute(double size);
+  friend CpuActionPtr CpuCas01::sleep(double duration);
+public:
+  CpuCas01Action() {};
+  CpuCas01Action(ModelPtr model, double cost, bool failed, double power, lmm_constraint_t constraint);
+
+  ~CpuCas01Action() {};
+};
diff --git a/src/surf/cpu_cas01_private.h b/src/surf/cpu_cas01_private.h
deleted file mode 100644 (file)
index cb13350..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-
-/* Copyright (c) 2009-2010, 2013. 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 _SURF_CPU_CAS01_PRIVATE_H
-#define _SURF_CPU_CAS01_PRIVATE_H
-
-#undef GENERIC_LMM_ACTION
-#undef GENERIC_ACTION
-#undef ACTION_GET_CPU
-#define GENERIC_LMM_ACTION(action) action->generic_lmm_action
-#define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action
-#define ACTION_GET_CPU(action) ((surf_action_cpu_Cas01_t) action)->cpu
-
-typedef struct surf_action_cpu_cas01 {
-  s_surf_action_lmm_t generic_lmm_action;
-} s_surf_action_cpu_Cas01_t, *surf_action_cpu_Cas01_t;
-
-
-/*
- * Energy-related properties for the cpu_cas01 model
- */
-typedef struct energy_cpu_cas01 {
-       xbt_dynar_t power_range_watts_list;             /*< List of (min_power,max_power) pairs corresponding to each cpu pstate */
-       double total_energy;                                    /*< Total energy consumed by the host */
-       double last_updated;                                    /*< Timestamp of the last energy update event*/
-} s_energy_cpu_cas01_t, *energy_cpu_cas01_t;
-
-
-typedef struct cpu_Cas01 {
-  s_surf_resource_t generic_resource;
-  s_xbt_swag_hookup_t modified_cpu_hookup;
-  double power_peak;
-  double power_scale;
-  tmgr_trace_event_t power_event;
-  int core;
-  e_surf_resource_state_t state_current;
-  tmgr_trace_event_t state_event;
-  lmm_constraint_t constraint;
-
-  xbt_dynar_t power_peak_list;                         /*< List of supported CPU capacities */
-  int pstate;                                                          /*< Current pstate (index in the power_peak_list)*/
-  energy_cpu_cas01_t energy;                           /*< Structure with energy-consumption data */
-
-} s_cpu_Cas01_t, *cpu_Cas01_t;
-
-xbt_dynar_t cpu_get_watts_range_list(cpu_Cas01_t cpu_model);
-void cpu_update_energy(cpu_Cas01_t cpu_model, double cpu_load);
-
-#endif                          /* _SURF_CPU_CAS01_PRIVATE_H */
diff --git a/src/surf/cpu_interface.cpp b/src/surf/cpu_interface.cpp
new file mode 100644 (file)
index 0000000..736b29e
--- /dev/null
@@ -0,0 +1,314 @@
+/* Copyright (c) 2013-2014. 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 "cpu_interface.hpp"
+
+XBT_LOG_EXTERNAL_CATEGORY(surf_kernel);
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu, surf,
+                                "Logging specific to the SURF cpu module");
+
+CpuModelPtr surf_cpu_model_pm;
+CpuModelPtr surf_cpu_model_vm;
+
+/*************
+ * Callbacks *
+ *************/
+
+CpuPtr getActionCpu(CpuActionPtr action) {
+  return static_cast<CpuPtr>(lmm_constraint_id(lmm_get_cnst_from_var
+                                        (action->getModel()->getMaxminSystem(),
+                                        action->getVariable(), 0)));
+}
+
+surf_callback(void, CpuPtr) cpuCreatedCallbacks;
+surf_callback(void, CpuPtr) cpuDestructedCallbacks;
+surf_callback(void, CpuPtr) cpuStateChangedCallbacks;
+surf_callback(void, CpuActionPtr) cpuActionStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+
+void CpuModel::updateActionsStateLazy(double now, double /*delta*/)
+{
+  CpuActionPtr action;
+  while ((xbt_heap_size(getActionHeap()) > 0)
+         && (double_equals(xbt_heap_maxkey(getActionHeap()), now))) {
+    action = static_cast<CpuActionPtr>(static_cast<ActionPtr>(xbt_heap_pop(getActionHeap())));
+    XBT_CDEBUG(surf_kernel, "Something happened to action %p", action);
+#ifdef HAVE_TRACING
+    if (TRACE_is_enabled()) {
+      CpuPtr cpu = static_cast<CpuPtr>(lmm_constraint_id(lmm_get_cnst_from_var(getMaxminSystem(), action->getVariable(), 0)));
+      TRACE_surf_host_set_utilization(cpu->getName(), action->getCategory(),
+                                      lmm_variable_getvalue(action->getVariable()),
+                                      action->getLastUpdate(),
+                                      now - action->getLastUpdate());
+    }
+#endif
+
+    action->finish();
+    XBT_CDEBUG(surf_kernel, "Action %p finished", action);
+
+    /* set the remains to 0 due to precision problems when updating the remaining amount */
+    action->setRemains(0);
+    action->setState(SURF_ACTION_DONE);
+    action->heapRemove(getActionHeap()); //FIXME: strange call since action was already popped
+  }
+#ifdef HAVE_TRACING
+  if (TRACE_is_enabled()) {
+    //defining the last timestamp that we can safely dump to trace file
+    //without losing the event ascending order (considering all CPU's)
+    double smaller = -1;
+    ActionListPtr actionSet = getRunningActionSet();
+    for(ActionList::iterator it(actionSet->begin()), itend(actionSet->end())
+       ; it != itend ; ++it) {
+      action = static_cast<CpuActionPtr>(&*it);
+        if (smaller < 0) {
+          smaller = action->getLastUpdate();
+          continue;
+        }
+        if (action->getLastUpdate() < smaller) {
+          smaller = action->getLastUpdate();
+        }
+    }
+    if (smaller > 0) {
+      TRACE_last_timestamp_to_dump = smaller;
+    }
+  }
+#endif
+  return;
+}
+
+void CpuModel::updateActionsStateFull(double now, double delta)
+{
+  CpuActionPtr action = NULL;
+  ActionListPtr running_actions = getRunningActionSet();
+
+  for(ActionList::iterator it(running_actions->begin()), itNext=it, itend(running_actions->end())
+     ; it != itend ; it=itNext) {
+       ++itNext;
+    action = static_cast<CpuActionPtr>(&*it);
+#ifdef HAVE_TRACING
+    if (TRACE_is_enabled()) {
+      CpuPtr x = (CpuPtr) lmm_constraint_id(lmm_get_cnst_from_var
+                              (getMaxminSystem(), action->getVariable(), 0));
+
+      TRACE_surf_host_set_utilization(x->getName(),
+                                      action->getCategory(),
+                                      lmm_variable_getvalue(action->getVariable()),
+                                      now - delta,
+                                      delta);
+      TRACE_last_timestamp_to_dump = now - delta;
+    }
+#endif
+
+    action->updateRemains(lmm_variable_getvalue(action->getVariable()) * delta);
+
+
+    if (action->getMaxDuration() != NO_MAX_DURATION)
+      action->updateMaxDuration(delta);
+
+
+    if ((action->getRemainsNoUpdate() <= 0) &&
+        (lmm_get_variable_weight(action->getVariable()) > 0)) {
+      action->finish();
+      action->setState(SURF_ACTION_DONE);
+    } else if ((action->getMaxDuration() != NO_MAX_DURATION) &&
+               (action->getMaxDuration() <= 0)) {
+      action->finish();
+      action->setState(SURF_ACTION_DONE);
+    }
+  }
+
+  return;
+}
+
+/************
+ * Resource *
+ ************/
+
+Cpu::Cpu(){
+  surf_callback_emit(cpuCreatedCallbacks, this);
+}
+
+Cpu::Cpu(ModelPtr model, const char *name, xbt_dict_t props,
+                int core, double powerPeak, double powerScale)
+ : Resource(model, name, props)
+ , m_core(core)
+ , m_powerPeak(powerPeak)
+ , m_powerScale(powerScale)
+ , p_constraintCore(NULL)
+ , p_constraintCoreId(NULL)
+{
+  surf_callback_emit(cpuCreatedCallbacks, this);
+}
+
+Cpu::Cpu(ModelPtr model, const char *name, xbt_dict_t props,
+                lmm_constraint_t constraint, int core, double powerPeak, double powerScale)
+ : Resource(model, name, props, constraint)
+ , m_core(core)
+ , m_powerPeak(powerPeak)
+ , m_powerScale(powerScale)
+{
+  surf_callback_emit(cpuCreatedCallbacks, this);
+  /* At now, we assume that a VM does not have a multicore CPU. */
+  if (core > 1)
+    xbt_assert(model == surf_cpu_model_pm);
+
+  p_constraintCore = NULL;
+  p_constraintCoreId = NULL;
+  if (model->getUpdateMechanism() != UM_UNDEFINED) {
+       p_constraintCore = xbt_new(lmm_constraint_t, core);
+       p_constraintCoreId = xbt_new(void*, core);
+
+    int i;
+    for (i = 0; i < core; i++) {
+      /* just for a unique id, never used as a string. */
+      p_constraintCoreId[i] = bprintf("%s:%i", name, i);
+      p_constraintCore[i] = lmm_constraint_new(model->getMaxminSystem(), p_constraintCoreId[i], m_powerScale * m_powerPeak);
+    }
+  }
+}
+
+Cpu::~Cpu(){
+  surf_callback_emit(cpuDestructedCallbacks, this);
+  if (p_constraintCoreId){
+    for (int i = 0; i < m_core; i++) {
+         xbt_free(p_constraintCoreId[i]);
+    }
+    xbt_free(p_constraintCore);
+  }
+  if (p_constraintCoreId)
+    xbt_free(p_constraintCoreId);
+}
+
+double Cpu::getSpeed(double load)
+{
+  return load * m_powerPeak;
+}
+
+double Cpu::getAvailableSpeed()
+{
+/* number between 0 and 1 */
+  return m_powerScale;
+}
+
+int Cpu::getCore()
+{
+  return m_core;
+}
+
+void Cpu::setState(e_surf_resource_state_t state)
+{
+  Resource::setState(state);
+  surf_callback_emit(cpuStateChangedCallbacks, this);
+}
+/**********
+ * Action *
+ **********/
+
+void CpuAction::updateRemainingLazy(double now)
+{
+  double delta = 0.0;
+
+  xbt_assert(getStateSet() == getModel()->getRunningActionSet(),
+      "You're updating an action that is not running.");
+
+  /* bogus priority, skip it */
+  xbt_assert(getPriority() > 0,
+      "You're updating an action that seems suspended.");
+
+  delta = now - m_lastUpdate;
+
+  if (m_remains > 0) {
+    XBT_CDEBUG(surf_kernel, "Updating action(%p): remains was %f, last_update was: %f", this, m_remains, m_lastUpdate);
+    double_update(&(m_remains), m_lastValue * delta);
+
+#ifdef HAVE_TRACING
+    if (TRACE_is_enabled()) {
+      CpuPtr cpu = static_cast<CpuPtr>(lmm_constraint_id(lmm_get_cnst_from_var(getModel()->getMaxminSystem(), getVariable(), 0)));
+      TRACE_surf_host_set_utilization(cpu->getName(), getCategory(), m_lastValue, m_lastUpdate, now - m_lastUpdate);
+    }
+#endif
+    XBT_CDEBUG(surf_kernel, "Updating action(%p): remains is now %f", this, m_remains);
+  }
+
+  m_lastUpdate = now;
+  m_lastValue = lmm_variable_getvalue(getVariable());
+}
+
+/*
+ *
+ * This function formulates a constraint problem that pins a given task to
+ * particular cores. Currently, it is possible to pin a task to an exactly one
+ * specific core. The system links the variable object of the task to the
+ * per-core constraint object.
+ *
+ * But, the taskset command on Linux takes a mask value specifying a CPU
+ * affinity setting of a given task. If the mask value is 0x03, the given task
+ * will be executed on the first core (CPU0) or the second core (CPU1) on the
+ * given PM. The schedular will determine appropriate placements of tasks,
+ * considering given CPU affinities and task activities.
+ *
+ * How should the system formulate constraint problems for an affinity to
+ * multiple cores?
+ *
+ * The cpu argument must be the host where the task is being executed. The
+ * action object does not have the information about the location where the
+ * action is being executed.
+ */
+void CpuAction::setAffinity(CpuPtr cpu, unsigned long mask)
+{
+  lmm_variable_t var_obj = getVariable();
+  XBT_IN("(%p,%lx)", this, mask);
+
+  {
+    unsigned long nbits = 0;
+
+    /* FIXME: There is much faster algorithms doing this. */
+    for (int i = 0; i < cpu->m_core; i++) {
+      unsigned long has_affinity = (1UL << i) & mask;
+      if (has_affinity)
+        nbits += 1;
+    }
+
+    if (nbits > 1) {
+      XBT_CRITICAL("Do not specify multiple cores for an affinity mask.");
+      XBT_CRITICAL("See the comment in cpu_action_set_affinity().");
+      DIE_IMPOSSIBLE;
+    }
+  }
+
+  for (int i = 0; i < cpu->m_core; i++) {
+    XBT_DEBUG("clear affinity %p to cpu-%d@%s", this, i,  cpu->getName());
+    lmm_shrink(cpu->getModel()->getMaxminSystem(), cpu->p_constraintCore[i], var_obj);
+
+    unsigned long has_affinity = (1UL << i) & mask;
+    if (has_affinity) {
+      /* This function only accepts an affinity setting on the host where the
+       * task is now running. In future, a task might move to another host.
+       * But, at this moment, this function cannot take an affinity setting on
+       * that future host.
+       *
+       * It might be possible to extend the code to allow this function to
+       * accept affinity settings on a future host. We might be able to assign
+       * zero to elem->value to maintain such inactive affinity settings in the
+       * system. But, this will make the system complex. */
+      XBT_DEBUG("set affinity %p to cpu-%d@%s", this, i, cpu->getName());
+      lmm_expand(cpu->getModel()->getMaxminSystem(), cpu->p_constraintCore[i], var_obj, 1.0);
+    }
+  }
+
+  if (cpu->getModel()->getUpdateMechanism() == UM_LAZY) {
+    /* FIXME (hypervisor): Do we need to do something for the LAZY mode? */
+  }
+  XBT_OUT();
+}
+
+void CpuAction::setState(e_surf_action_state_t state){
+  Action::setState(state);
+  surf_callback_emit(cpuActionStateChangedCallbacks, this);
+}
diff --git a/src/surf/cpu_interface.hpp b/src/surf/cpu_interface.hpp
new file mode 100644 (file)
index 0000000..c72e0f5
--- /dev/null
@@ -0,0 +1,257 @@
+/* Copyright (c) 2004-2014. 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 "surf_interface.hpp"
+#include "maxmin_private.hpp"
+
+#ifndef SURF_CPU_INTERFACE_HPP_
+#define SURF_CPU_INTERFACE_HPP_
+
+/***********
+ * Classes *
+ ***********/
+class CpuModel;
+typedef CpuModel *CpuModelPtr;
+
+class Cpu;
+typedef Cpu *CpuPtr;
+
+class CpuAction;
+typedef CpuAction *CpuActionPtr;
+
+class CpuPlugin;
+typedef CpuPlugin *CpuPluginPtr;
+
+/*************
+ * Callbacks *
+ *************/
+CpuPtr getActionCpu(CpuActionPtr action);
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after Cpu creation * 
+ * @details Callback functions have the following signature: `void(CpuPtr)`
+ */
+extern surf_callback(void, CpuPtr) cpuCreatedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after Cpu destruction * 
+ * @details Callback functions have the following signature: `void(CpuPtr)`
+ */
+extern surf_callback(void, CpuPtr) cpuDestructedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after Cpu State changed * 
+ * @details Callback functions have the following signature: `void(CpuActionPtr)`
+ */
+extern surf_callback(void, CpuPtr) cpuStateChangedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after CpuAction State changed * 
+ * @details Callback functions have the following signature: `void(CpuActionPtr)`
+ */
+extern surf_callback(void, CpuActionPtr) cpuActionStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+
+ /** @ingroup SURF_cpu_interface
+ * @brief SURF cpu model interface class
+ * @details A model is an object which handle the interactions between its Resources and its Actions
+ */
+class CpuModel : public Model {
+public:
+  /**
+   * @brief CpuModel constructor
+   * 
+   * @param name The name of the model
+   */
+  CpuModel(const char *name) : Model(name) {};
+
+  /**
+   * @brief Create a Cpu
+   * 
+   * @param name The name of the Cpu
+   * 
+   * @return The created Cpu
+   */
+  CpuPtr createResource(string name);
+
+  void setState(e_surf_resource_state_t state);
+
+  void updateActionsStateLazy(double now, double delta);
+  void updateActionsStateFull(double now, double delta);
+
+  virtual void addTraces() =0;
+};
+
+/************
+ * Resource *
+ ************/
+
+/** @ingroup SURF_cpu_interface
+* @brief SURF cpu resource interface class
+* @details A Cpu represent a cpu associated to a workstation
+*/
+class Cpu : public Resource {
+public:
+  /**
+   * @brief Cpu constructor
+   */
+  Cpu();
+
+  /**
+   * @brief Cpu constructor
+   * 
+   * @param model The CpuModel associated to this Cpu
+   * @param name The name of the Cpu
+   * @param props Dictionary of properties associated to this Cpu
+   * @param constraint The lmm constraint associated to this Cpu if it is part of a LMM component
+   * @param core The number of core of this Cpu
+   * @param powerPeak The power peak of this Cpu
+   * @param powerScale The power scale of this Cpu
+   */
+  Cpu(ModelPtr model, const char *name, xbt_dict_t props,
+         lmm_constraint_t constraint, int core, double powerPeak, double powerScale);
+
+  /**
+   * @brief Cpu constructor
+   * 
+   * @param model The CpuModel associated to this Cpu
+   * @param name The name of the Cpu
+   * @param props Dictionary of properties associated to this Cpu
+   * @param core The number of core of this Cpu
+   * @param powerPeak The power peak of this Cpu in [TODO]
+   * @param powerScale The power scale of this Cpu in [TODO]
+   */
+  Cpu(ModelPtr model, const char *name, xbt_dict_t props,
+         int core, double powerPeak, double powerScale);
+
+  /**
+   * @brief Cpu destructor
+   */
+  ~Cpu();
+
+  /**
+   * @brief Execute some quantity of computation
+   * 
+   * @param size The value of the processing amount (in flop) needed to process
+   * @return The CpuAction corresponding to the processing
+   */
+  virtual CpuActionPtr execute(double size)=0;
+
+  /**
+   * @brief Make a process sleep for duration (in seconds)
+   * 
+   * @param duration The number of seconds to sleep
+   * @return The CpuAction corresponding to the sleeping
+   */
+  virtual CpuActionPtr sleep(double duration)=0;
+
+  /**
+   * @brief Get the number of cores of the current Cpu
+   * 
+   * @return The number of cores of the current Cpu
+   */
+  virtual int getCore();
+
+  /**
+   * @brief Get the speed of the current Cpu
+   * @details [TODO] load * m_powerPeak
+   * 
+   * @param load [TODO]
+   * 
+   * @return The speed of the current Cpu
+   */
+  virtual double getSpeed(double load);
+
+  /**
+   * @brief Get the available speed of the current Cpu
+   * @details [TODO]
+   * 
+   * @return The available speed of the current Cpu
+   */
+  virtual double getAvailableSpeed();
+
+  /**
+   * @brief Get the current Cpu power peak
+   * 
+   * @return The current Cpu power peak
+   */
+  virtual double getCurrentPowerPeak()=0;
+
+
+  virtual double getPowerPeakAt(int pstate_index)=0;
+  
+  virtual int getNbPstates()=0;
+  
+  virtual void setPowerPeakAt(int pstate_index)=0;
+
+  void setState(e_surf_resource_state_t state);
+
+  void addTraces(void);
+  int m_core;
+  double m_powerPeak;            /*< CPU power peak */
+  double m_powerScale;           /*< Percentage of CPU disponible */
+
+  /* Note (hypervisor): */
+  lmm_constraint_t *p_constraintCore;
+  void **p_constraintCoreId;
+};
+
+/**********
+ * Action *
+ **********/
+
+ /** @ingroup SURF_cpu_interface
+ * @brief SURF Cpu action interface class
+ * @details A CpuAction represent the execution of code on a Cpu
+ */
+class CpuAction : public Action {
+friend CpuPtr getActionCpu(CpuActionPtr action);
+public:
+  /**
+   * @brief CpuAction constructor
+   */
+  CpuAction() {};
+
+  /**
+   * @brief CpuAction constructor
+   * 
+   * @param model The CpuModel associated to this CpuAction
+   * @param cost [TODO]
+   * @param failed [TODO]
+   */
+  CpuAction(ModelPtr model, double cost, bool failed)
+    : Action(model, cost, failed) {} //FIXME:REMOVE
+
+  /**
+   * @brief CpuAction constructor
+   * 
+   * @param model The CpuModel associated to this CpuAction
+   * @param cost [TODO]
+   * @param failed [TODO]
+   * @param var The lmm variable associated to this CpuAction if it is part of a LMM component
+   */
+  CpuAction(ModelPtr model, double cost, bool failed, lmm_variable_t var)
+    : Action(model, cost, failed, var) {}
+
+  /**
+   * @brief Set the affinity of the current CpuAction
+   * @details [TODO]
+   * 
+   * @param cpu [TODO]
+   * @param mask [TODO]
+   */
+  virtual void setAffinity(CpuPtr cpu, unsigned long mask);
+
+  void setState(e_surf_action_state_t state);
+
+  void updateRemainingLazy(double now);
+
+};
+
+#endif /* SURF_CPU_INTERFACE_HPP_ */
diff --git a/src/surf/cpu_ti.c b/src/surf/cpu_ti.c
deleted file mode 100644 (file)
index b14ceec..0000000
+++ /dev/null
@@ -1,1099 +0,0 @@
-
-/* Copyright (c) 2009-2013. 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. */
-
-/*
-  commit: e2d6799c4182f00443b3013aadb1c2412372460f
-  This commit retrieves the old implementation of CPU_TI with multi-levels.
-*/
-
-#include "surf_private.h"
-#include "trace_mgr_private.h"
-#include "cpu_ti_private.h"
-#include "xbt/heap.h"
-#include "surf/surf_resource.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu_ti, surf,
-                                "Logging specific to the SURF CPU TRACE INTEGRATION module");
-
-
-static xbt_swag_t
-    cpu_ti_running_action_set_that_does_not_need_being_checked = NULL;
-static xbt_swag_t cpu_ti_modified_cpu = NULL;
-static xbt_heap_t cpu_ti_action_heap;
-
-/* prototypes of new trace functions */
-static double surf_cpu_ti_integrate_trace(surf_cpu_ti_tgmr_t trace,
-                                          double a, double b);
-
-
-static double surf_cpu_ti_solve_trace(surf_cpu_ti_tgmr_t trace, double a,
-                                      double amount);
-static double surf_cpu_ti_solve_trace_somewhat_simple(surf_cpu_ti_tgmr_t
-                                                      trace, double a,
-                                                      double amount);
-
-static void surf_cpu_ti_free_tmgr(surf_cpu_ti_tgmr_t trace);
-
-static double surf_cpu_ti_integrate_trace_simple(surf_cpu_ti_trace_t trace,
-                                                 double a, double b);
-static double surf_cpu_ti_integrate_trace_simple_point(surf_cpu_ti_trace_t
-                                                       trace, double a);
-static double surf_cpu_ti_solve_trace_simple(surf_cpu_ti_trace_t trace,
-                                             double a, double amount);
-static int surf_cpu_ti_binary_search(double *array, double a, int low,
-                                     int high);
-/* end prototypes */
-
-static void surf_cpu_ti_free_trace(surf_cpu_ti_trace_t trace)
-{
-  xbt_free(trace->time_points);
-  xbt_free(trace->integral);
-  xbt_free(trace);
-}
-
-static void surf_cpu_ti_free_tmgr(surf_cpu_ti_tgmr_t trace)
-{
-  if (trace->trace)
-    surf_cpu_ti_free_trace(trace->trace);
-  xbt_free(trace);
-}
-
-static surf_cpu_ti_trace_t surf_cpu_ti_trace_new(tmgr_trace_t power_trace)
-{
-  surf_cpu_ti_trace_t trace;
-  s_tmgr_event_t val;
-  unsigned int cpt;
-  double integral = 0;
-  double time = 0;
-  int i = 0;
-  trace = xbt_new0(s_surf_cpu_ti_trace_t, 1);
-  trace->time_points =
-      xbt_malloc0(sizeof(double) *
-                  (xbt_dynar_length(power_trace->s_list.event_list) + 1));
-  trace->integral =
-      xbt_malloc0(sizeof(double) *
-                  (xbt_dynar_length(power_trace->s_list.event_list) + 1));
-  trace->nb_points = xbt_dynar_length(power_trace->s_list.event_list);
-  xbt_dynar_foreach(power_trace->s_list.event_list, cpt, val) {
-    trace->time_points[i] = time;
-    trace->integral[i] = integral;
-    integral += val.delta * val.value;
-    time += val.delta;
-    i++;
-  }
-  trace->time_points[i] = time;
-  trace->integral[i] = integral;
-  return trace;
-}
-
-/**
-* \brief Creates a new integration trace from a tmgr_trace_t
-*
-* \param  power_trace    CPU availability trace
-* \param  value          Percentage of CPU power available (useful to fixed tracing)
-* \param  spacing        Initial spacing
-* \return  Integration trace structure
-*/
-static surf_cpu_ti_tgmr_t cpu_ti_parse_trace(tmgr_trace_t power_trace,
-                                             double value)
-{
-  surf_cpu_ti_tgmr_t trace;
-  double total_time = 0.0;
-  s_tmgr_event_t val;
-  unsigned int cpt;
-  trace = xbt_new0(s_surf_cpu_ti_tgmr_t, 1);
-
-/* no availability file, fixed trace */
-  if (!power_trace) {
-    trace->type = TRACE_FIXED;
-    trace->value = value;
-    XBT_DEBUG("No availability trace. Constant value = %f", value);
-    return trace;
-  }
-
-  /* only one point available, fixed trace */
-  if (xbt_dynar_length(power_trace->s_list.event_list) == 1) {
-    xbt_dynar_get_cpy(power_trace->s_list.event_list, 0, &val);
-    trace->type = TRACE_FIXED;
-    trace->value = val.value;
-    return trace;
-  }
-
-  trace->type = TRACE_DYNAMIC;
-  trace->power_trace = power_trace;
-
-  /* count the total time of trace file */
-  xbt_dynar_foreach(power_trace->s_list.event_list, cpt, val) {
-    total_time += val.delta;
-  }
-  trace->trace = surf_cpu_ti_trace_new(power_trace);
-  trace->last_time = total_time;
-  trace->total =
-      surf_cpu_ti_integrate_trace_simple(trace->trace, 0, total_time);
-
-  XBT_DEBUG("Total integral %f, last_time %f ",
-         trace->total, trace->last_time);
-
-  return trace;
-}
-
-
-static void* cpu_ti_create_resource(const char *name, xbt_dynar_t power_peak,
-                                                  int pstate,
-                           double power_scale,
-                           tmgr_trace_t power_trace,
-                           int core,
-                           e_surf_resource_state_t state_initial,
-                           tmgr_trace_t state_trace,
-                           xbt_dict_t cpu_properties)
-{
-  tmgr_trace_t empty_trace;
-  s_tmgr_event_t val;
-  cpu_ti_t cpu = NULL;
-  s_surf_action_cpu_ti_t ti_action;
-  xbt_assert(core==1,"Multi-core not handled with this model yet");
-  xbt_assert(!surf_cpu_resource_priv(surf_cpu_resource_by_name(name)),
-              "Host '%s' declared several times in the platform file",
-              name);
-  xbt_assert(core==1,"Multi-core not handled with this model yet");
-  cpu = (cpu_ti_t) surf_resource_new(sizeof(s_cpu_ti_t),
-          surf_cpu_model, name,cpu_properties, NULL);
-  cpu->action_set =
-      xbt_swag_new(xbt_swag_offset(ti_action, cpu_list_hookup));
-
-  xbt_dynar_get_cpy(power_peak, 0, &cpu->power_peak);
-  xbt_dynar_free(&power_peak);  /* kill memory leak */
-  //cpu->power_peak = power_peak;
-  cpu->pstate = pstate;
-  XBT_DEBUG("CPU create: peak=%f, pstate=%d",cpu->power_peak, cpu->pstate);
-
-  xbt_assert(cpu->power_peak > 0, "Power has to be >0");
-  XBT_DEBUG("power scale %f", power_scale);
-  cpu->power_scale = power_scale;
-  cpu->avail_trace = cpu_ti_parse_trace(power_trace, power_scale);
-  cpu->state_current = state_initial;
-  if (state_trace)
-    cpu->state_event =
-        tmgr_history_add_trace(history, state_trace, 0.0, 0, cpu);
-  if (power_trace && xbt_dynar_length(power_trace->s_list.event_list) > 1) {
-    /* add a fake trace event if periodicity == 0 */
-    xbt_dynar_get_cpy(power_trace->s_list.event_list,
-                      xbt_dynar_length(power_trace->s_list.event_list) - 1, &val);
-    if (val.delta == 0) {
-      empty_trace = tmgr_empty_trace_new();
-      cpu->power_event =
-          tmgr_history_add_trace(history, empty_trace,
-                                 cpu->avail_trace->last_time, 0, cpu);
-    }
-  }
-  xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, cpu);
-
-  return xbt_lib_get_elm_or_null(host_lib, name);
-}
-
-
-static void parse_cpu_ti_init(sg_platf_host_cbarg_t host)
-{
-  cpu_ti_create_resource(host->id,
-        host->power_peak,
-        host->pstate,
-        host->power_scale,
-        host->power_trace,
-        host->core_amount,
-        host->initial_state,
-        host->state_trace,
-        host->properties);
-
-}
-
-static void add_traces_cpu_ti(void)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *trace_name, *elm;
-
-  static int called = 0;
-
-  if (called)
-    return;
-  called = 1;
-
-/* connect all traces relative to hosts */
-  xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
-    tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
-    cpu_ti_t cpu = surf_cpu_resource_priv(surf_cpu_resource_by_name(elm));
-
-    xbt_assert(cpu, "Host %s undefined", elm);
-    xbt_assert(trace, "Trace %s undefined", trace_name);
-
-    if (cpu->state_event) {
-      XBT_DEBUG("Trace already configured for this CPU(%s), ignoring it",
-             elm);
-      continue;
-    }
-    XBT_DEBUG("Add state trace: %s to CPU(%s)", trace_name, elm);
-    cpu->state_event = tmgr_history_add_trace(history, trace, 0.0, 0, cpu);
-  }
-
-  xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) {
-    tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
-    cpu_ti_t cpu = surf_cpu_resource_priv(surf_cpu_resource_by_name(elm));
-
-    xbt_assert(cpu, "Host %s undefined", elm);
-    xbt_assert(trace, "Trace %s undefined", trace_name);
-
-    XBT_DEBUG("Add power trace: %s to CPU(%s)", trace_name, elm);
-    if (cpu->avail_trace)
-      surf_cpu_ti_free_tmgr(cpu->avail_trace);
-
-    cpu->avail_trace = cpu_ti_parse_trace(trace, cpu->power_scale);
-
-    /* add a fake trace event if periodicity == 0 */
-    if (trace && xbt_dynar_length(trace->s_list.event_list) > 1) {
-      s_tmgr_event_t val;
-      xbt_dynar_get_cpy(trace->s_list.event_list,
-                        xbt_dynar_length(trace->s_list.event_list) - 1, &val);
-      if (val.delta == 0) {
-        tmgr_trace_t empty_trace;
-        empty_trace = tmgr_empty_trace_new();
-        cpu->power_event =
-            tmgr_history_add_trace(history, empty_trace,
-                                   cpu->avail_trace->last_time, 0, cpu);
-      }
-    }
-  }
-}
-
-static void cpu_ti_define_callbacks()
-{
-  sg_platf_host_add_cb(parse_cpu_ti_init);
-  sg_platf_postparse_add_cb(add_traces_cpu_ti);
-}
-
-static int cpu_ti_resource_used(void *resource_id)
-{
-  cpu_ti_t cpu = resource_id;
-  return xbt_swag_size(cpu->action_set);
-}
-
-static int cpu_ti_action_unref(surf_action_t action)
-{
-  action->refcount--;
-  if (!action->refcount) {
-    xbt_swag_remove(action, action->state_set);
-    /* remove from action_set */
-    xbt_swag_remove(action, ((cpu_ti_t)surf_cpu_resource_priv(ACTION_GET_CPU(action)))->action_set);
-    /* remove from heap */
-    xbt_heap_remove(cpu_ti_action_heap,
-                    ((surf_action_cpu_ti_t) action)->index_heap);
-    xbt_swag_insert(((cpu_ti_t)surf_cpu_resource_priv(ACTION_GET_CPU(action))), cpu_ti_modified_cpu);
-    surf_action_free(&action);
-    return 1;
-  }
-  return 0;
-}
-
-static void cpu_ti_action_cancel(surf_action_t action)
-{
-  surf_action_state_set(action, SURF_ACTION_FAILED);
-  xbt_heap_remove(cpu_ti_action_heap,
-                  ((surf_action_cpu_ti_t) action)->index_heap);
-  xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu);
-  return;
-}
-
-static void cpu_ti_action_state_set(surf_action_t action,
-                                    e_surf_action_state_t state)
-{
-  surf_action_state_set(action, state);
-  xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu);
-  return;
-}
-
-/**
-* \brief Update the remaining amount of actions
-*
-* \param  cpu    Cpu on which the actions are running
-* \param  now    Current time
-*/
-static void cpu_ti_update_remaining_amount(cpu_ti_t cpu, double now)
-{
-  double area_total;
-  surf_action_cpu_ti_t action;
-
-/* already updated */
-  if (cpu->last_update >= now)
-    return;
-
-/* calcule the surface */
-  area_total =
-      surf_cpu_ti_integrate_trace(cpu->avail_trace, cpu->last_update,
-                                  now) * cpu->power_peak;
-  XBT_DEBUG("Flops total: %f, Last update %f", area_total,
-         cpu->last_update);
-
-  xbt_swag_foreach(action, cpu->action_set) {
-    surf_action_t generic = (surf_action_t)action;
-    /* action not running, skip it */
-    if (generic->state_set !=
-        surf_cpu_model->states.running_action_set)
-      continue;
-
-    /* bogus priority, skip it */
-    if (generic->priority <= 0)
-      continue;
-
-    /* action suspended, skip it */
-    if (action->suspended != 0)
-      continue;
-
-    /* action don't need update */
-    if (generic->start >= now)
-      continue;
-
-    /* skip action that are finishing now */
-    if (generic->finish >= 0
-        && generic->finish <= now)
-      continue;
-
-    /* update remaining */
-    double_update(&(generic->remains),
-                  area_total / (cpu->sum_priority *
-                                generic->priority));
-    XBT_DEBUG("Update remaining action(%p) remaining %f", action,
-           generic->remains);
-  }
-  cpu->last_update = now;
-#undef GENERIC_ACTION
-}
-
-/**
-* \brief Update the finish date of action if necessary
-*
-* \param  cpu    Cpu on which the actions are running
-* \param  now    Current time
-*/
-static void cpu_ti_update_action_finish_date(cpu_ti_t cpu, double now)
-{
-#define GENERIC_ACTION(action) action->generic_action
-  surf_action_cpu_ti_t action;
-  double sum_priority = 0.0, total_area, min_finish = -1;
-
-/* update remaning amount of actions */
-  cpu_ti_update_remaining_amount(cpu, now);
-
-  xbt_swag_foreach(action, cpu->action_set) {
-    /* action not running, skip it */
-    if (GENERIC_ACTION(action).state_set !=
-        surf_cpu_model->states.running_action_set)
-      continue;
-
-    /* bogus priority, skip it */
-    if (GENERIC_ACTION(action).priority <= 0)
-      continue;
-
-    /* action suspended, skip it */
-    if (action->suspended != 0)
-      continue;
-
-    sum_priority += 1.0 / GENERIC_ACTION(action).priority;
-  }
-  cpu->sum_priority = sum_priority;
-
-  xbt_swag_foreach(action, cpu->action_set) {
-    min_finish = -1;
-    /* action not running, skip it */
-    if (GENERIC_ACTION(action).state_set !=
-        surf_cpu_model->states.running_action_set)
-      continue;
-
-    /* verify if the action is really running on cpu */
-    if (action->suspended == 0 && GENERIC_ACTION(action).priority > 0) {
-      /* total area needed to finish the action. Used in trace integration */
-      total_area =
-          (GENERIC_ACTION(action).remains) * sum_priority *
-          GENERIC_ACTION(action).priority;
-
-      total_area /= cpu->power_peak;
-
-      GENERIC_ACTION(action).finish =
-          surf_cpu_ti_solve_trace(cpu->avail_trace, now, total_area);
-      /* verify which event will happen before (max_duration or finish time) */
-      if ((GENERIC_ACTION(action).max_duration != NO_MAX_DURATION) &&
-          (GENERIC_ACTION(action).start +
-           GENERIC_ACTION(action).max_duration <
-           GENERIC_ACTION(action).finish))
-        min_finish = GENERIC_ACTION(action).start +
-            GENERIC_ACTION(action).max_duration;
-      else
-        min_finish = GENERIC_ACTION(action).finish;
-    } else {
-      /* put the max duration time on heap */
-      if (GENERIC_ACTION(action).max_duration != NO_MAX_DURATION)
-        min_finish =
-            (GENERIC_ACTION(action).start +
-             GENERIC_ACTION(action).max_duration);
-    }
-    /* add in action heap */
-    XBT_DEBUG("action(%p) index %d", action, action->index_heap);
-    if (action->index_heap >= 0) {
-      surf_action_cpu_ti_t heap_act =
-          xbt_heap_remove(cpu_ti_action_heap, action->index_heap);
-      if (heap_act != action)
-        DIE_IMPOSSIBLE;
-    }
-    if (min_finish != NO_MAX_DURATION)
-      xbt_heap_push(cpu_ti_action_heap, action, min_finish);
-
-    XBT_DEBUG
-        ("Update finish time: Cpu(%s) Action: %p, Start Time: %f Finish Time: %f Max duration %f",
-         cpu->generic_resource.name, action, GENERIC_ACTION(action).start,
-         GENERIC_ACTION(action).finish,
-         GENERIC_ACTION(action).max_duration);
-  }
-/* remove from modified cpu */
-  xbt_swag_remove(cpu, cpu_ti_modified_cpu);
-#undef GENERIC_ACTION
-}
-
-static double cpu_ti_share_resources(double now)
-{
-  cpu_ti_t cpu, cpu_next;
-  double min_action_duration = -1;
-
-/* iterates over modified cpus to update share resources */
-  xbt_swag_foreach_safe(cpu, cpu_next, cpu_ti_modified_cpu) {
-    cpu_ti_update_action_finish_date(cpu, now);
-  }
-/* get the min next event if heap not empty */
-  if (xbt_heap_size(cpu_ti_action_heap) > 0)
-    min_action_duration = xbt_heap_maxkey(cpu_ti_action_heap) - now;
-
-  XBT_DEBUG("Share resources, min next event date: %f", min_action_duration);
-
-  return min_action_duration;
-}
-
-static void cpu_ti_update_actions_state(double now, double delta)
-{
-#define GENERIC_ACTION(action) action->generic_action
-  surf_action_cpu_ti_t action;
-  while ((xbt_heap_size(cpu_ti_action_heap) > 0)
-         && (xbt_heap_maxkey(cpu_ti_action_heap) <= now)) {
-    action = xbt_heap_pop(cpu_ti_action_heap);
-    XBT_DEBUG("Action %p: finish", action);
-    GENERIC_ACTION(action).finish = surf_get_clock();
-    /* set the remains to 0 due to precision problems when updating the remaining amount */
-    GENERIC_ACTION(action).remains = 0;
-    cpu_ti_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
-    /* update remaining amount of all actions */
-    cpu_ti_update_remaining_amount(surf_cpu_resource_priv(action->cpu), surf_get_clock());
-  }
-#undef GENERIC_ACTION
-}
-
-static void cpu_ti_update_resource_state(void *id,
-                                         tmgr_trace_event_t event_type,
-                                         double value, double date)
-{
-  cpu_ti_t cpu = id;
-  surf_action_cpu_ti_t action;
-
-  if (event_type == cpu->power_event) {
-    tmgr_trace_t power_trace;
-    surf_cpu_ti_tgmr_t trace;
-    s_tmgr_event_t val;
-
-    XBT_DEBUG("Finish trace date: %f value %f date %f", surf_get_clock(),
-           value, date);
-    /* update remaining of actions and put in modified cpu swag */
-    cpu_ti_update_remaining_amount(cpu, date);
-    xbt_swag_insert(cpu, cpu_ti_modified_cpu);
-
-    power_trace = cpu->avail_trace->power_trace;
-    xbt_dynar_get_cpy(power_trace->s_list.event_list,
-                      xbt_dynar_length(power_trace->s_list.event_list) - 1, &val);
-    /* free old trace */
-    surf_cpu_ti_free_tmgr(cpu->avail_trace);
-    cpu->power_scale = val.value;
-
-    trace = xbt_new0(s_surf_cpu_ti_tgmr_t, 1);
-    trace->type = TRACE_FIXED;
-    trace->value = val.value;
-    XBT_DEBUG("value %f", val.value);
-
-    cpu->avail_trace = trace;
-
-    if (tmgr_trace_event_free(event_type))
-      cpu->power_event = NULL;
-
-  } else if (event_type == cpu->state_event) {
-    if (value > 0) {
-      if(cpu->state_current == SURF_RESOURCE_OFF)
-        xbt_dynar_push_as(host_that_restart, char*, (cpu->generic_resource.name));
-      cpu->state_current = SURF_RESOURCE_ON;
-    } else {
-      cpu->state_current = SURF_RESOURCE_OFF;
-
-      /* put all action running on cpu to failed */
-      xbt_swag_foreach(action, cpu->action_set) {
-        if (surf_action_state_get((surf_action_t) action) ==
-            SURF_ACTION_RUNNING
-            || surf_action_state_get((surf_action_t) action) ==
-            SURF_ACTION_READY
-            || surf_action_state_get((surf_action_t) action) ==
-            SURF_ACTION_NOT_IN_THE_SYSTEM) {
-          action->generic_action.finish = date;
-          cpu_ti_action_state_set((surf_action_t) action,
-                                  SURF_ACTION_FAILED);
-          if (action->index_heap >= 0) {
-            surf_action_cpu_ti_t heap_act =
-                xbt_heap_remove(cpu_ti_action_heap, action->index_heap);
-            if (heap_act != action)
-              DIE_IMPOSSIBLE;
-          }
-        }
-      }
-    }
-    if (tmgr_trace_event_free(event_type))
-      cpu->state_event = NULL;
-  } else {
-    XBT_CRITICAL("Unknown event ! \n");
-    xbt_abort();
-  }
-
-  return;
-}
-
-static surf_action_t cpu_ti_execute(void *cpu, double size)
-{
-  surf_action_cpu_ti_t action = NULL;
-  cpu_ti_t CPU = surf_cpu_resource_priv(cpu);
-
-  XBT_IN("(%s,%g)", surf_resource_name(CPU), size);
-  action =
-      surf_action_new(sizeof(s_surf_action_cpu_ti_t), size, surf_cpu_model,
-                      CPU->state_current != SURF_RESOURCE_ON);
-  action->cpu = cpu;
-  action->index_heap = -1;
-
-  xbt_swag_insert(CPU, cpu_ti_modified_cpu);
-
-  xbt_swag_insert(action, CPU->action_set);
-
-  action->suspended = 0;        /* Should be useless because of the
-                                   calloc but it seems to help valgrind... */
-
-  XBT_OUT();
-  return (surf_action_t) action;
-}
-
-static void cpu_ti_action_update_index_heap(void *action, int i)
-{
-  ((surf_action_cpu_ti_t) action)->index_heap = i;
-}
-
-static surf_action_t cpu_ti_action_sleep(void *cpu, double duration)
-{
-  surf_action_cpu_ti_t action = NULL;
-
-  if (duration > 0)
-    duration = MAX(duration, MAXMIN_PRECISION);
-
-  XBT_IN("(%s,%g)", surf_resource_name(surf_cpu_resource_priv(cpu)), duration);
-  action = (surf_action_cpu_ti_t) cpu_ti_execute(cpu, 1.0);
-  action->generic_action.max_duration = duration;
-  action->suspended = 2;
-  if (duration == NO_MAX_DURATION) {
-    /* Move to the *end* of the corresponding action set. This convention
-       is used to speed up update_resource_state  */
-    xbt_swag_remove(action, ((surf_action_t) action)->state_set);
-    ((surf_action_t) action)->state_set =
-        cpu_ti_running_action_set_that_does_not_need_being_checked;
-    xbt_swag_insert(action, ((surf_action_t) action)->state_set);
-  }
-  XBT_OUT();
-  return (surf_action_t) action;
-}
-
-static void cpu_ti_action_suspend(surf_action_t action)
-{
-  XBT_IN("(%p)", action);
-  if (((surf_action_cpu_ti_t) action)->suspended != 2) {
-    ((surf_action_cpu_ti_t) action)->suspended = 1;
-    xbt_heap_remove(cpu_ti_action_heap,
-                    ((surf_action_cpu_ti_t) action)->index_heap);
-    xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu);
-  }
-  XBT_OUT();
-}
-
-static void cpu_ti_action_resume(surf_action_t action)
-{
-  XBT_IN("(%p)", action);
-  if (((surf_action_cpu_ti_t) action)->suspended != 2) {
-    ((surf_action_cpu_ti_t) action)->suspended = 0;
-    xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu);
-  }
-  XBT_OUT();
-}
-
-static int cpu_ti_action_is_suspended(surf_action_t action)
-{
-  return (((surf_action_cpu_ti_t) action)->suspended == 1);
-}
-
-static void cpu_ti_action_set_max_duration(surf_action_t action,
-                                           double duration)
-{
-  surf_action_cpu_ti_t ACT = (surf_action_cpu_ti_t) action;
-  double min_finish;
-
-  XBT_IN("(%p,%g)", action, duration);
-
-  action->max_duration = duration;
-
-  if (duration >= 0)
-    min_finish =
-        (action->start + action->max_duration) <
-        action->finish ? (action->start +
-                          action->max_duration) : action->finish;
-  else
-    min_finish = action->finish;
-
-/* add in action heap */
-  if (ACT->index_heap >= 0) {
-    surf_action_cpu_ti_t heap_act =
-        xbt_heap_remove(cpu_ti_action_heap, ACT->index_heap);
-    if (heap_act != ACT)
-      DIE_IMPOSSIBLE;
-  }
-  xbt_heap_push(cpu_ti_action_heap, ACT, min_finish);
-
-  XBT_OUT();
-}
-
-static void cpu_ti_action_set_priority(surf_action_t action,
-                                       double priority)
-{
-  XBT_IN("(%p,%g)", action, priority);
-  action->priority = priority;
-  xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu);
-  XBT_OUT();
-}
-
-static double cpu_ti_action_get_remains(surf_action_t action)
-{
-  XBT_IN("(%p)", action);
-  cpu_ti_update_remaining_amount((cpu_ti_t)
-                                 ((surf_action_cpu_ti_t) action)->cpu,
-                                 surf_get_clock());
-  XBT_OUT();
-  return action->remains;
-}
-
-static e_surf_resource_state_t cpu_ti_get_state(void *cpu)
-{
-  return ((cpu_ti_t)surf_cpu_resource_priv(cpu))->state_current;
-}
-
-static double cpu_ti_get_speed(void *cpu, double load)
-{
-  return load * ((cpu_ti_t)surf_cpu_resource_priv(cpu))->power_peak;
-}
-
-/**
-* \brief Auxiliary function to update the CPU power scale.
-*
-*  This function uses the trace structure to return the power scale at the determined time a.
-* \param trace    Trace structure to search the updated power scale
-* \param a        Time
-* \return CPU power scale
-*/
-static double surf_cpu_ti_get_power_scale(surf_cpu_ti_tgmr_t trace,
-                                          double a)
-{
-  double reduced_a;
-  int point;
-  s_tmgr_event_t val;
-
-  reduced_a = a - floor(a / trace->last_time) * trace->last_time;
-  point =
-      surf_cpu_ti_binary_search(trace->trace->time_points, reduced_a, 0,
-                                trace->trace->nb_points - 1);
-  xbt_dynar_get_cpy(trace->power_trace->s_list.event_list, point, &val);
-  return val.value;
-}
-
-static double cpu_ti_get_available_speed(void *cpu)
-{
-  cpu_ti_t CPU = surf_cpu_resource_priv(cpu);
-  CPU->power_scale =
-      surf_cpu_ti_get_power_scale(CPU->avail_trace, surf_get_clock());
-/* number between 0 and 1 */
-  return CPU->power_scale;
-}
-
-static void cpu_ti_finalize(void)
-{
-  void **cpu;
-  xbt_lib_cursor_t cursor;
-  char *key;
-
-  xbt_lib_foreach(host_lib, cursor, key, cpu){
-    if(cpu[SURF_CPU_LEVEL])
-    {
-        cpu_ti_t CPU = cpu[SURF_CPU_LEVEL];
-        xbt_swag_free(CPU->action_set);
-        surf_cpu_ti_free_tmgr(CPU->avail_trace);
-    }
-  }
-
-  surf_model_exit(surf_cpu_model);
-  surf_cpu_model = NULL;
-
-  xbt_swag_free
-      (cpu_ti_running_action_set_that_does_not_need_being_checked);
-  xbt_swag_free(cpu_ti_modified_cpu);
-  cpu_ti_running_action_set_that_does_not_need_being_checked = NULL;
-  xbt_heap_free(cpu_ti_action_heap);
-}
-
-static void surf_cpu_ti_model_init_internal(void)
-{
-  s_surf_action_t action;
-  s_cpu_ti_t cpu;
-
-  surf_cpu_model = surf_model_init();
-
-  cpu_ti_running_action_set_that_does_not_need_being_checked =
-      xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
-  cpu_ti_modified_cpu =
-      xbt_swag_new(xbt_swag_offset(cpu, modified_cpu_hookup));
-
-  surf_cpu_model->name = "cpu_ti";
-
-  surf_cpu_model->action_unref = cpu_ti_action_unref;
-  surf_cpu_model->action_cancel = cpu_ti_action_cancel;
-  surf_cpu_model->action_state_set = cpu_ti_action_state_set;
-
-  surf_cpu_model->model_private->resource_used = cpu_ti_resource_used;
-  surf_cpu_model->model_private->share_resources = cpu_ti_share_resources;
-  surf_cpu_model->model_private->update_actions_state =
-      cpu_ti_update_actions_state;
-  surf_cpu_model->model_private->update_resource_state =
-      cpu_ti_update_resource_state;
-  surf_cpu_model->model_private->finalize = cpu_ti_finalize;
-
-  surf_cpu_model->suspend = cpu_ti_action_suspend;
-  surf_cpu_model->resume = cpu_ti_action_resume;
-  surf_cpu_model->is_suspended = cpu_ti_action_is_suspended;
-  surf_cpu_model->set_max_duration = cpu_ti_action_set_max_duration;
-  surf_cpu_model->set_priority = cpu_ti_action_set_priority;
-  surf_cpu_model->get_remains = cpu_ti_action_get_remains;
-
-  surf_cpu_model->extension.cpu.execute = cpu_ti_execute;
-  surf_cpu_model->extension.cpu.sleep = cpu_ti_action_sleep;
-
-  surf_cpu_model->extension.cpu.get_state = cpu_ti_get_state;
-  surf_cpu_model->extension.cpu.get_speed = cpu_ti_get_speed;
-  surf_cpu_model->extension.cpu.get_available_speed =
-      cpu_ti_get_available_speed;
-  surf_cpu_model->extension.cpu.add_traces = add_traces_cpu_ti;
-
-  cpu_ti_action_heap = xbt_heap_new(8, NULL);
-  xbt_heap_set_update_callback(cpu_ti_action_heap,
-                               cpu_ti_action_update_index_heap);
-
-}
-
-void surf_cpu_model_init_ti()
-{
-  xbt_assert(!surf_cpu_model,"CPU model already initialized. This should not happen.");
-  surf_cpu_ti_model_init_internal();
-  cpu_ti_define_callbacks();
-  xbt_dynar_push(model_list, &surf_cpu_model);
-}
-
-
-/**
-* \brief Integrate trace
-*
-* Wrapper around surf_cpu_integrate_trace_simple() to get
-* the cyclic effect.
-*
-* \param trace Trace structure.
-* \param a      Begin of interval
-* \param b      End of interval
-* \return the integrate value. -1 if an error occurs.
-*/
-static double surf_cpu_ti_integrate_trace(surf_cpu_ti_tgmr_t trace,
-                                          double a, double b)
-{
-  double first_chunk;
-  double middle_chunk;
-  double last_chunk;
-  int a_index, b_index;
-
-  if ((a < 0.0) || (a > b)) {
-    XBT_CRITICAL
-        ("Error, invalid integration interval [%.2f,%.2f]. You probably have a task executing with negative computation amount. Check your code.",
-         a, b);
-    xbt_abort();
-  }
-  if (a == b)
-    return 0.0;
-
-  if (trace->type == TRACE_FIXED) {
-    return ((b - a) * trace->value);
-  }
-
-  if (ceil(a / trace->last_time) == a / trace->last_time)
-    a_index = 1 + (int) (ceil(a / trace->last_time));
-  else
-    a_index = (int) (ceil(a / trace->last_time));
-
-  b_index = (int) (floor(b / trace->last_time));
-
-  if (a_index > b_index) {      /* Same chunk */
-    return surf_cpu_ti_integrate_trace_simple(trace->trace,
-                                              a - (a_index -
-                                                   1) * trace->last_time,
-                                              b -
-                                              (b_index) *
-                                              trace->last_time);
-  }
-
-  first_chunk = surf_cpu_ti_integrate_trace_simple(trace->trace,
-                                                   a - (a_index -
-                                                        1) *
-                                                   trace->last_time,
-                                                   trace->last_time);
-  middle_chunk = (b_index - a_index) * trace->total;
-  last_chunk = surf_cpu_ti_integrate_trace_simple(trace->trace,
-                                                  0.0,
-                                                  b -
-                                                  (b_index) *
-                                                  trace->last_time);
-
-  XBT_DEBUG("first_chunk=%.2f  middle_chunk=%.2f  last_chunk=%.2f\n",
-         first_chunk, middle_chunk, last_chunk);
-
-  return (first_chunk + middle_chunk + last_chunk);
-}
-
-/**
- * \brief Auxiliary function to calculate the integral between a and b.
- *     It simply calculates the integral at point a and b and returns the difference 
- *   between them.
- * \param trace    Trace structure
- * \param a        Initial point
- * \param b  Final point
- * \return  Integral
-*/
-static double surf_cpu_ti_integrate_trace_simple(surf_cpu_ti_trace_t trace,
-                                                 double a, double b)
-{
-  return surf_cpu_ti_integrate_trace_simple_point(trace,
-                                                  b) -
-      surf_cpu_ti_integrate_trace_simple_point(trace, a);
-}
-
-/**
- * \brief Auxiliary function to calculate the integral at point a.
- * \param trace    Trace structure
- * \param a        point
- * \return  Integral
-*/
-static double surf_cpu_ti_integrate_trace_simple_point(surf_cpu_ti_trace_t
-                                                       trace, double a)
-{
-  double integral = 0;
-  int ind;
-  double a_aux = a;
-  ind =
-      surf_cpu_ti_binary_search(trace->time_points, a, 0,
-                                trace->nb_points - 1);
-  integral += trace->integral[ind];
-  XBT_DEBUG
-      ("a %f ind %d integral %f ind + 1 %f ind %f time +1 %f time %f",
-       a, ind, integral, trace->integral[ind + 1], trace->integral[ind],
-       trace->time_points[ind + 1], trace->time_points[ind]);
-  double_update(&a_aux, trace->time_points[ind]);
-  if (a_aux > 0)
-    integral +=
-        ((trace->integral[ind + 1] -
-          trace->integral[ind]) / (trace->time_points[ind + 1] -
-                                   trace->time_points[ind])) * (a -
-                                                                trace->
-                                                                time_points
-                                                                [ind]);
-  XBT_DEBUG("Integral a %f = %f", a, integral);
-
-  return integral;
-}
-
-/**
-* \brief Calculate the time needed to execute "amount" on cpu.
-*
-* Here, amount can span multiple trace periods
-*
-* \param trace   CPU trace structure
-* \param a        Initial time
-* \param amount  Amount to be executed
-* \return  End time
-*/
-static double surf_cpu_ti_solve_trace(surf_cpu_ti_tgmr_t trace, double a,
-                                      double amount)
-{
-  int quotient;
-  double reduced_b;
-  double reduced_amount;
-  double reduced_a;
-  double b;
-
-/* Fix very small negative numbers */
-  if ((a < 0.0) && (a > -EPSILON)) {
-    a = 0.0;
-  }
-  if ((amount < 0.0) && (amount > -EPSILON)) {
-    amount = 0.0;
-  }
-
-/* Sanity checks */
-  if ((a < 0.0) || (amount < 0.0)) {
-    XBT_CRITICAL
-        ("Error, invalid parameters [a = %.2f, amount = %.2f]. You probably have a task executing with negative computation amount. Check your code.",
-         a, amount);
-    xbt_abort();
-  }
-
-/* At this point, a and amount are positive */
-
-  if (amount < EPSILON)
-    return a;
-
-/* Is the trace fixed ? */
-  if (trace->type == TRACE_FIXED) {
-    return (a + (amount / trace->value));
-  }
-
-  XBT_DEBUG("amount %f total %f", amount, trace->total);
-/* Reduce the problem to one where amount <= trace_total */
-  quotient = (int) (floor(amount / trace->total));
-  reduced_amount = (trace->total) * ((amount / trace->total) -
-                                     floor(amount / trace->total));
-  reduced_a = a - (trace->last_time) * (int) (floor(a / trace->last_time));
-
-  XBT_DEBUG("Quotient: %d reduced_amount: %f reduced_a: %f", quotient,
-         reduced_amount, reduced_a);
-
-/* Now solve for new_amount which is <= trace_total */
-/*
-   fprintf(stderr,"reduced_a = %.2f\n",reduced_a);
-   fprintf(stderr,"reduced_amount = %.2f\n",reduced_amount);
- */
-  reduced_b =
-      surf_cpu_ti_solve_trace_somewhat_simple(trace, reduced_a,
-                                              reduced_amount);
-
-/* Re-map to the original b and amount */
-  b = (trace->last_time) * (int) (floor(a / trace->last_time)) +
-      (quotient * trace->last_time) + reduced_b;
-  return b;
-}
-
-/**
-* \brief Auxiliary function to solve integral
-*
-* Here, amount is <= trace->total
-* and a <=trace->last_time
-*
-*/
-static double surf_cpu_ti_solve_trace_somewhat_simple(surf_cpu_ti_tgmr_t
-                                                      trace, double a,
-                                                      double amount)
-{
-  double amount_till_end;
-  double b;
-
-  XBT_DEBUG("Solve integral: [%.2f, amount=%.2f]", a, amount);
-  amount_till_end =
-      surf_cpu_ti_integrate_trace(trace, a, trace->last_time);
-/*
-   fprintf(stderr,"amount_till_end=%.2f\n",amount_till_end);
- */
-
-  if (amount_till_end > amount) {
-    b = surf_cpu_ti_solve_trace_simple(trace->trace, a, amount);
-  } else {
-    b = trace->last_time +
-        surf_cpu_ti_solve_trace_simple(trace->trace, 0.0,
-                                       amount - amount_till_end);
-  }
-  return b;
-}
-
-/**
- * \brief Auxiliary function to solve integral.
- *  It returns the date when the requested amount of flops is available
- * \param trace    Trace structure
- * \param a        Initial point
- * \param amount  Amount of flops 
- * \return The date when amount is available.
-*/
-static double surf_cpu_ti_solve_trace_simple(surf_cpu_ti_trace_t trace,
-                                             double a, double amount)
-{
-  double integral_a;
-  int ind;
-  double time;
-  integral_a = surf_cpu_ti_integrate_trace_simple_point(trace, a);
-  ind =
-      surf_cpu_ti_binary_search(trace->integral, integral_a + amount, 0,
-                                trace->nb_points - 1);
-  time = trace->time_points[ind];
-  time +=
-      (integral_a + amount -
-       trace->integral[ind]) / ((trace->integral[ind + 1] -
-                                 trace->integral[ind]) /
-                                (trace->time_points[ind + 1] -
-                                 trace->time_points[ind]));
-
-  return time;
-}
-
-/**
- * \brief Binary search in array.
- *  It returns the first point of the interval in which "a" is. 
- * \param array    Array
- * \param a        Value to search
- * \param low     Low bound to search in array
- * \param high    Upper bound to search in array
- * \return Index of point
-*/
-static int surf_cpu_ti_binary_search(double *array, double a, int low,
-                                     int high)
-{
-  xbt_assert(low < high, "Wrong parameters: low (%d) should be smaller than"
-      " high (%d)", low, high);
-
-  int mid;
-  do {
-    mid = low + (high - low) / 2;
-    XBT_DEBUG("a %f low %d high %d mid %d value %f", a, low, high, mid,
-        array[mid]);
-
-    if (array[mid] > a)
-      high = mid;
-    else
-      low = mid;
-  }
-  while (low < high - 1);
-
-  return low;
-}
diff --git a/src/surf/cpu_ti.cpp b/src/surf/cpu_ti.cpp
new file mode 100644 (file)
index 0000000..af08127
--- /dev/null
@@ -0,0 +1,997 @@
+/* Copyright (c) 2013-2014. 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 "cpu_ti.hpp"
+#include "trace_mgr_private.h"
+#include "xbt/heap.h"
+
+#ifndef SURF_MODEL_CPUTI_H_
+#define SURF_MODEL_CPUTI_H_
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu_ti, surf_cpu,
+                                "Logging specific to the SURF CPU TRACE INTEGRATION module");
+
+static void cpu_ti_action_update_index_heap(void *action, int i);
+
+/*********
+ * Trace *
+ *********/
+
+CpuTiTrace::CpuTiTrace(tmgr_trace_t power_trace)
+{
+  s_tmgr_event_t val;
+  unsigned int cpt;
+  double integral = 0;
+  double time = 0;
+  int i = 0;
+  p_timePoints = (double*) xbt_malloc0(sizeof(double) *
+                  (xbt_dynar_length(power_trace->s_list.event_list) + 1));
+  p_integral = (double*) xbt_malloc0(sizeof(double) *
+                  (xbt_dynar_length(power_trace->s_list.event_list) + 1));
+  m_nbPoints = xbt_dynar_length(power_trace->s_list.event_list);
+  xbt_dynar_foreach(power_trace->s_list.event_list, cpt, val) {
+    p_timePoints[i] = time;
+    p_integral[i] = integral;
+    integral += val.delta * val.value;
+    time += val.delta;
+    i++;
+  }
+  p_timePoints[i] = time;
+  p_integral[i] = integral;
+}
+
+CpuTiTrace::~CpuTiTrace()
+{
+  xbt_free(p_timePoints);
+  xbt_free(p_integral);
+}
+
+CpuTiTgmr::~CpuTiTgmr()
+{
+  if (p_trace)
+    delete p_trace;
+}
+
+/**
+* \brief Integrate trace
+*
+* Wrapper around surf_cpu_integrate_trace_simple() to get
+* the cyclic effect.
+*
+* \param trace Trace structure.
+* \param a      Begin of interval
+* \param b      End of interval
+* \return the integrate value. -1 if an error occurs.
+*/
+double CpuTiTgmr::integrate(double a, double b)
+{
+  double first_chunk;
+  double middle_chunk;
+  double last_chunk;
+  int a_index, b_index;
+
+  if ((a < 0.0) || (a > b)) {
+    XBT_CRITICAL
+        ("Error, invalid integration interval [%.2f,%.2f]. You probably have a task executing with negative computation amount. Check your code.",
+         a, b);
+    xbt_abort();
+  }
+  if (a == b)
+    return 0.0;
+
+  if (m_type == TRACE_FIXED) {
+    return ((b - a) * m_value);
+  }
+
+  if (ceil(a / m_lastTime) == a / m_lastTime)
+    a_index = 1 + (int) (ceil(a / m_lastTime));
+  else
+    a_index = (int) (ceil(a / m_lastTime));
+
+  b_index = (int) (floor(b / m_lastTime));
+
+  if (a_index > b_index) {      /* Same chunk */
+    return p_trace->integrateSimple(a - (a_index -
+                                              1) * m_lastTime,
+                                         b -
+                                         (b_index) *
+                                         m_lastTime);
+  }
+
+  first_chunk = p_trace->integrateSimple(a - (a_index -
+                                                   1) *
+                                              m_lastTime,
+                                              m_lastTime);
+  middle_chunk = (b_index - a_index) * m_total;
+  last_chunk = p_trace->integrateSimple(0.0,
+                                             b -
+                                             (b_index) *
+                                             m_lastTime);
+
+  XBT_DEBUG("first_chunk=%.2f  middle_chunk=%.2f  last_chunk=%.2f\n",
+         first_chunk, middle_chunk, last_chunk);
+
+  return (first_chunk + middle_chunk + last_chunk);
+}
+
+/**
+ * \brief Auxiliary function to calculate the integral between a and b.
+ *     It simply calculates the integral at point a and b and returns the difference 
+ *   between them.
+ * \param trace    Trace structure
+ * \param a        Initial point
+ * \param b  Final point
+ * \return  Integral
+*/
+double CpuTiTrace::integrateSimple(double a, double b)
+{
+  return integrateSimplePoint(b) - integrateSimplePoint(a);
+}
+
+/**
+ * \brief Auxiliary function to calculate the integral at point a.
+ * \param trace    Trace structure
+ * \param a        point
+ * \return  Integral
+*/
+double CpuTiTrace::integrateSimplePoint(double a)
+{
+  double integral = 0;
+  int ind;
+  double a_aux = a;
+  ind = binarySearch(p_timePoints, a, 0, m_nbPoints - 1);
+  integral += p_integral[ind];
+  XBT_DEBUG
+      ("a %f ind %d integral %f ind + 1 %f ind %f time +1 %f time %f",
+       a, ind, integral, p_integral[ind + 1], p_integral[ind],
+       p_timePoints[ind + 1], p_timePoints[ind]);
+  double_update(&a_aux, p_timePoints[ind]);
+  if (a_aux > 0)
+    integral +=
+        ((p_integral[ind + 1] -
+          p_integral[ind]) / (p_timePoints[ind + 1] -
+                              p_timePoints[ind])) * (a - p_timePoints[ind]);
+  XBT_DEBUG("Integral a %f = %f", a, integral);
+
+  return integral;
+}
+
+/**
+* \brief Calculate the time needed to execute "amount" on cpu.
+*
+* Here, amount can span multiple trace periods
+*
+* \param trace   CPU trace structure
+* \param a        Initial time
+* \param amount  Amount to be executed
+* \return  End time
+*/
+double CpuTiTgmr::solve(double a, double amount)
+{
+  int quotient;
+  double reduced_b;
+  double reduced_amount;
+  double reduced_a;
+  double b;
+
+/* Fix very small negative numbers */
+  if ((a < 0.0) && (a > -EPSILON)) {
+    a = 0.0;
+  }
+  if ((amount < 0.0) && (amount > -EPSILON)) {
+    amount = 0.0;
+  }
+
+/* Sanity checks */
+  if ((a < 0.0) || (amount < 0.0)) {
+    XBT_CRITICAL
+        ("Error, invalid parameters [a = %.2f, amount = %.2f]. You probably have a task executing with negative computation amount. Check your code.",
+         a, amount);
+    xbt_abort();
+  }
+
+/* At this point, a and amount are positive */
+
+  if (amount < EPSILON)
+    return a;
+
+/* Is the trace fixed ? */
+  if (m_type == TRACE_FIXED) {
+    return (a + (amount / m_value));
+  }
+
+  XBT_DEBUG("amount %f total %f", amount, m_total);
+/* Reduce the problem to one where amount <= trace_total */
+  quotient = (int) (floor(amount / m_total));
+  reduced_amount = (m_total) * ((amount / m_total) -
+                                     floor(amount / m_total));
+  reduced_a = a - (m_lastTime) * (int) (floor(a / m_lastTime));
+
+  XBT_DEBUG("Quotient: %d reduced_amount: %f reduced_a: %f", quotient,
+         reduced_amount, reduced_a);
+
+/* Now solve for new_amount which is <= trace_total */
+/*
+   fprintf(stderr,"reduced_a = %.2f\n",reduced_a);
+   fprintf(stderr,"reduced_amount = %.2f\n",reduced_amount);
+ */
+  reduced_b = solveSomewhatSimple(reduced_a, reduced_amount);
+
+/* Re-map to the original b and amount */
+  b = (m_lastTime) * (int) (floor(a / m_lastTime)) +
+      (quotient * m_lastTime) + reduced_b;
+  return b;
+}
+
+/**
+* \brief Auxiliary function to solve integral
+*
+* Here, amount is <= trace->total
+* and a <=trace->last_time
+*
+*/
+double CpuTiTgmr::solveSomewhatSimple(double a, double amount)
+{
+  double amount_till_end;
+  double b;
+
+  XBT_DEBUG("Solve integral: [%.2f, amount=%.2f]", a, amount);
+  amount_till_end = integrate(a, m_lastTime);
+/*
+   fprintf(stderr,"amount_till_end=%.2f\n",amount_till_end);
+ */
+
+  if (amount_till_end > amount) {
+    b = p_trace->solveSimple(a, amount);
+  } else {
+    b = m_lastTime + p_trace->solveSimple(0.0, amount - amount_till_end);
+  }
+  return b;
+}
+
+/**
+ * \brief Auxiliary function to solve integral.
+ *  It returns the date when the requested amount of flops is available
+ * \param trace    Trace structure
+ * \param a        Initial point
+ * \param amount  Amount of flops 
+ * \return The date when amount is available.
+*/
+double CpuTiTrace::solveSimple(double a, double amount)
+{
+  double integral_a;
+  int ind;
+  double time;
+  integral_a = integrateSimplePoint(a);
+  ind = binarySearch(p_integral, integral_a + amount, 0, m_nbPoints - 1);
+  time = p_timePoints[ind];
+  time +=
+      (integral_a + amount -
+       p_integral[ind]) / ((p_integral[ind + 1] -
+                                 p_integral[ind]) /
+                                (p_timePoints[ind + 1] -
+                                 p_timePoints[ind]));
+
+  return time;
+}
+
+/**
+* \brief Auxiliary function to update the CPU power scale.
+*
+*  This function uses the trace structure to return the power scale at the determined time a.
+* \param trace    Trace structure to search the updated power scale
+* \param a        Time
+* \return CPU power scale
+*/
+double CpuTiTgmr::getPowerScale(double a)
+{
+  double reduced_a;
+  int point;
+  s_tmgr_event_t val;
+
+  reduced_a = a - floor(a / m_lastTime) * m_lastTime;
+  point = p_trace->binarySearch(p_trace->p_timePoints, reduced_a, 0,
+                                p_trace->m_nbPoints - 1);
+  xbt_dynar_get_cpy(p_powerTrace->s_list.event_list, point, &val);
+  return val.value;
+}
+
+/**
+* \brief Creates a new integration trace from a tmgr_trace_t
+*
+* \param  power_trace    CPU availability trace
+* \param  value          Percentage of CPU power available (useful to fixed tracing)
+* \param  spacing        Initial spacing
+* \return  Integration trace structure
+*/
+CpuTiTgmr::CpuTiTgmr(tmgr_trace_t power_trace, double value)
+{
+  double total_time = 0.0;
+  s_tmgr_event_t val;
+  unsigned int cpt;
+  p_trace = 0;
+
+/* no availability file, fixed trace */
+  if (!power_trace) {
+    m_type = TRACE_FIXED;
+    m_value = value;
+    XBT_DEBUG("No availability trace. Constant value = %f", value);
+    return;
+  }
+
+  /* only one point available, fixed trace */
+  if (xbt_dynar_length(power_trace->s_list.event_list) == 1) {
+    xbt_dynar_get_cpy(power_trace->s_list.event_list, 0, &val);
+    m_type = TRACE_FIXED;
+    m_value = val.value;
+    return;
+  }
+
+  m_type = TRACE_DYNAMIC;
+  p_powerTrace = power_trace;
+
+  /* count the total time of trace file */
+  xbt_dynar_foreach(power_trace->s_list.event_list, cpt, val) {
+    total_time += val.delta;
+  }
+  p_trace = new CpuTiTrace(power_trace);
+  m_lastTime = total_time;
+  m_total = p_trace->integrateSimple(0, total_time);
+
+  XBT_DEBUG("Total integral %f, last_time %f ",
+            m_total, m_lastTime);
+}
+
+/**
+ * \brief Binary search in array.
+ *  It returns the first point of the interval in which "a" is. 
+ * \param array    Array
+ * \param a        Value to search
+ * \param low     Low bound to search in array
+ * \param high    Upper bound to search in array
+ * \return Index of point
+*/
+int CpuTiTrace::binarySearch(double *array, double a, int low, int high)
+{
+  xbt_assert(low < high, "Wrong parameters: low (%d) should be smaller than"
+      " high (%d)", low, high);
+
+  int mid;
+  do {
+    mid = low + (high - low) / 2;
+    XBT_DEBUG("a %f low %d high %d mid %d value %f", a, low, high, mid,
+        array[mid]);
+
+    if (array[mid] > a)
+      high = mid;
+    else
+      low = mid;
+  }
+  while (low < high - 1);
+
+  return low;
+}
+
+/*************
+ * CallBacks *
+ *************/
+
+static void parse_cpu_ti_init(sg_platf_host_cbarg_t host){
+  ((CpuTiModelPtr)surf_cpu_model_pm)->parseInit(host);
+}
+
+static void add_traces_cpu_ti(){
+  surf_cpu_model_pm->addTraces();
+}
+
+static void cpu_ti_define_callbacks()
+{
+  sg_platf_host_add_cb(parse_cpu_ti_init);
+  sg_platf_postparse_add_cb(add_traces_cpu_ti);
+}
+
+/*********
+ * Model *
+ *********/
+
+void surf_cpu_model_init_ti()
+{
+  xbt_assert(!surf_cpu_model_pm,"CPU model already initialized. This should not happen.");
+  xbt_assert(!surf_cpu_model_vm,"CPU model already initialized. This should not happen.");
+
+  surf_cpu_model_pm = new CpuTiModel();
+  surf_cpu_model_vm  = new CpuTiModel();
+
+  cpu_ti_define_callbacks();
+  ModelPtr model_pm = static_cast<ModelPtr>(surf_cpu_model_pm);
+  ModelPtr model_vm = static_cast<ModelPtr>(surf_cpu_model_vm);
+  xbt_dynar_push(model_list, &model_pm);
+  xbt_dynar_push(model_list, &model_vm);
+}
+
+CpuTiModel::CpuTiModel() : CpuModel("cpu_ti")
+{
+  CpuTiPtr cpu = NULL;
+
+  p_runningActionSetThatDoesNotNeedBeingChecked = new ActionList();
+
+  p_modifiedCpu =
+      xbt_swag_new(xbt_swag_offset(*cpu, p_modifiedCpuHookup));
+
+  p_tiActionHeap = xbt_heap_new(8, NULL);
+  xbt_heap_set_update_callback(p_tiActionHeap,
+                               cpu_ti_action_update_index_heap);
+}
+
+CpuTiModel::~CpuTiModel()
+{
+  surf_cpu_model_pm = NULL;
+
+  delete p_runningActionSetThatDoesNotNeedBeingChecked;
+  xbt_swag_free(p_modifiedCpu);
+  xbt_heap_free(p_tiActionHeap);
+}
+
+void CpuTiModel::parseInit(sg_platf_host_cbarg_t host)
+{
+  createResource(host->id,
+        host->power_peak,
+        host->pstate,
+        host->power_scale,
+        host->power_trace,
+        host->core_amount,
+        host->initial_state,
+        host->state_trace,
+        host->properties);
+}
+
+CpuTiPtr CpuTiModel::createResource(const char *name,
+                              xbt_dynar_t powerPeak,
+                              int pstate,
+                           double powerScale,
+                           tmgr_trace_t powerTrace,
+                           int core,
+                           e_surf_resource_state_t stateInitial,
+                           tmgr_trace_t stateTrace,
+                           xbt_dict_t cpuProperties)
+{
+  xbt_assert(core==1,"Multi-core not handled with this model yet");
+  xbt_assert(!surf_cpu_resource_priv(surf_cpu_resource_by_name(name)),
+              "Host '%s' declared several times in the platform file",
+              name);
+  CpuTiPtr cpu = new CpuTi(this, name, powerPeak, pstate, powerScale, powerTrace,
+                          core, stateInitial, stateTrace, cpuProperties);
+  xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, static_cast<ResourcePtr>(cpu));
+  return cpu;
+}
+
+CpuTiActionPtr CpuTiModel::createAction(double /*cost*/, bool /*failed*/)
+{
+  return NULL;//new CpuTiAction(this, cost, failed);
+}
+
+double CpuTiModel::shareResources(double now)
+{
+  void *_cpu, *_cpu_next;
+  double min_action_duration = -1;
+
+/* iterates over modified cpus to update share resources */
+  xbt_swag_foreach_safe(_cpu, _cpu_next, p_modifiedCpu) {
+    static_cast<CpuTiPtr>(_cpu)->updateActionsFinishTime(now);
+  }
+/* get the min next event if heap not empty */
+  if (xbt_heap_size(p_tiActionHeap) > 0)
+    min_action_duration = xbt_heap_maxkey(p_tiActionHeap) - now;
+
+  XBT_DEBUG("Share resources, min next event date: %f", min_action_duration);
+
+  return min_action_duration;
+}
+
+void CpuTiModel::updateActionsState(double now, double /*delta*/)
+{
+  while ((xbt_heap_size(p_tiActionHeap) > 0)
+         && (xbt_heap_maxkey(p_tiActionHeap) <= now)) {
+    CpuTiActionPtr action = (CpuTiActionPtr) xbt_heap_pop(p_tiActionHeap);
+    XBT_DEBUG("Action %p: finish", action);
+    action->finish();
+    /* set the remains to 0 due to precision problems when updating the remaining amount */
+    action->setRemains(0);
+    action->setState(SURF_ACTION_DONE);
+    /* update remaining amount of all actions */
+    action->p_cpu->updateRemainingAmount(surf_get_clock());
+  }
+}
+
+void CpuTiModel::addTraces()
+{
+  xbt_dict_cursor_t cursor = NULL;
+  char *trace_name, *elm;
+
+  static int called = 0;
+
+  if (called)
+    return;
+  called = 1;
+
+/* connect all traces relative to hosts */
+  xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
+    tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+    CpuTiPtr cpu = static_cast<CpuTiPtr>(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)));
+
+    xbt_assert(cpu, "Host %s undefined", elm);
+    xbt_assert(trace, "Trace %s undefined", trace_name);
+
+    if (cpu->p_stateEvent) {
+      XBT_DEBUG("Trace already configured for this CPU(%s), ignoring it",
+             elm);
+      continue;
+    }
+    XBT_DEBUG("Add state trace: %s to CPU(%s)", trace_name, elm);
+    cpu->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(cpu));
+  }
+
+  xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) {
+    tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+    CpuTiPtr cpu = static_cast<CpuTiPtr>(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)));
+
+    xbt_assert(cpu, "Host %s undefined", elm);
+    xbt_assert(trace, "Trace %s undefined", trace_name);
+
+    XBT_DEBUG("Add power trace: %s to CPU(%s)", trace_name, elm);
+    if (cpu->p_availTrace)
+      delete cpu->p_availTrace;
+
+    cpu->p_availTrace = new CpuTiTgmr(trace, cpu->m_powerScale);
+
+    /* add a fake trace event if periodicity == 0 */
+    if (trace && xbt_dynar_length(trace->s_list.event_list) > 1) {
+      s_tmgr_event_t val;
+      xbt_dynar_get_cpy(trace->s_list.event_list,
+                        xbt_dynar_length(trace->s_list.event_list) - 1, &val);
+      if (val.delta == 0) {
+        tmgr_trace_t empty_trace;
+        empty_trace = tmgr_empty_trace_new();
+        cpu->p_powerEvent =
+            tmgr_history_add_trace(history, empty_trace,
+                                   cpu->p_availTrace->m_lastTime, 0, static_cast<ResourcePtr>(cpu));
+      }
+    }
+  }
+}
+
+/************
+ * Resource *
+ ************/
+CpuTi::CpuTi(CpuTiModelPtr model, const char *name, xbt_dynar_t powerPeak,
+        int pstate, double powerScale, tmgr_trace_t powerTrace, int core,
+        e_surf_resource_state_t stateInitial, tmgr_trace_t stateTrace,
+       xbt_dict_t properties)
+: Cpu(model, name, properties, core, 0, powerScale)
+{
+  p_powerEvent = NULL;
+  setState(stateInitial);
+  m_powerScale = powerScale;
+  m_core = core;
+  tmgr_trace_t empty_trace;            
+  s_tmgr_event_t val;          
+  xbt_assert(core==1,"Multi-core not handled with this model yet");
+  XBT_DEBUG("power scale %f", powerScale);
+  p_availTrace = new CpuTiTgmr(powerTrace, powerScale);
+
+  CpuTiActionPtr action = NULL;
+  p_actionSet = xbt_swag_new(xbt_swag_offset(*action, p_cpuListHookup));
+
+  m_lastUpdate = 0;
+
+  xbt_dynar_get_cpy(powerPeak, 0, &m_powerPeak);
+  xbt_dynar_free(&powerPeak);  /* kill memory leak */
+  m_pstate = pstate;
+  XBT_DEBUG("CPU create: peak=%f, pstate=%d", m_powerPeak, m_pstate);
+
+  p_modifiedCpuHookup.prev = 0;
+  p_modifiedCpuHookup.next = 0;
+
+  if (stateTrace)
+    p_stateEvent = tmgr_history_add_trace(history, stateTrace, 0.0, 0, static_cast<ResourcePtr>(this));
+  if (powerTrace && xbt_dynar_length(powerTrace->s_list.event_list) > 1) {
+    // add a fake trace event if periodicity == 0 
+    xbt_dynar_get_cpy(powerTrace->s_list.event_list,
+                      xbt_dynar_length(powerTrace->s_list.event_list) - 1, &val);
+    if (val.delta == 0) {
+      empty_trace = tmgr_empty_trace_new();
+      p_powerEvent =
+        tmgr_history_add_trace(history, empty_trace,
+                               p_availTrace->m_lastTime, 0, static_cast<ResourcePtr>(this));
+    }
+  }
+};
+
+CpuTi::~CpuTi(){
+delete p_availTrace;
+xbt_swag_free(p_actionSet);
+}
+
+void CpuTi::updateState(tmgr_trace_event_t event_type,
+                        double value, double date)
+{
+  void *_action;
+  CpuTiActionPtr action;
+
+  if (event_type == p_powerEvent) {
+    tmgr_trace_t power_trace;
+    CpuTiTgmrPtr trace;
+    s_tmgr_event_t val;
+
+    XBT_DEBUG("Finish trace date: %f value %f date %f", surf_get_clock(),
+           value, date);
+    /* update remaining of actions and put in modified cpu swag */
+    updateRemainingAmount(date);
+    xbt_swag_insert(this, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+
+    power_trace = p_availTrace->p_powerTrace;
+    xbt_dynar_get_cpy(power_trace->s_list.event_list,
+                      xbt_dynar_length(power_trace->s_list.event_list) - 1, &val);
+    /* free old trace */
+    delete p_availTrace;
+    m_powerScale = val.value;
+
+    trace = new CpuTiTgmr(TRACE_FIXED, val.value);
+    XBT_DEBUG("value %f", val.value);
+
+    p_availTrace = trace;
+
+    if (tmgr_trace_event_free(event_type))
+      p_powerEvent = NULL;
+
+  } else if (event_type == p_stateEvent) {
+    if (value > 0) {
+      if(getState() == SURF_RESOURCE_OFF)
+        xbt_dynar_push_as(host_that_restart, char*, (char *)getName());
+      setState(SURF_RESOURCE_ON);
+    } else {
+      setState(SURF_RESOURCE_OFF);
+
+      /* put all action running on cpu to failed */
+      xbt_swag_foreach(_action, p_actionSet) {
+       action = static_cast<CpuTiActionPtr>(_action);
+        if (action->getState() == SURF_ACTION_RUNNING
+         || action->getState() == SURF_ACTION_READY
+         || action->getState() == SURF_ACTION_NOT_IN_THE_SYSTEM) {
+          action->setFinishTime(date);
+          action->setState(SURF_ACTION_FAILED);
+          if (action->m_indexHeap >= 0) {
+            CpuTiActionPtr heap_act = (CpuTiActionPtr)
+                xbt_heap_remove(reinterpret_cast<CpuTiModelPtr>(getModel())->p_tiActionHeap, action->m_indexHeap);
+            if (heap_act != action)
+              DIE_IMPOSSIBLE;
+          }
+        }
+      }
+    }
+    if (tmgr_trace_event_free(event_type))
+      p_stateEvent = NULL;
+  } else {
+    XBT_CRITICAL("Unknown event ! \n");
+    xbt_abort();
+  }
+
+  return;
+}
+
+void CpuTi::updateActionsFinishTime(double now)
+{
+  void *_action;
+  CpuTiActionPtr action;
+  double sum_priority = 0.0, total_area, min_finish = -1;
+
+/* update remaning amount of actions */
+updateRemainingAmount(now);
+
+  xbt_swag_foreach(_action, p_actionSet) {
+    action = static_cast<CpuTiActionPtr>(_action);
+    /* action not running, skip it */
+    if (action->getStateSet() !=
+        surf_cpu_model_pm->getRunningActionSet())
+      continue;
+
+    /* bogus priority, skip it */
+    if (action->getPriority() <= 0)
+      continue;
+
+    /* action suspended, skip it */
+    if (action->m_suspended != 0)
+      continue;
+
+    sum_priority += 1.0 / action->getPriority();
+  }
+  m_sumPriority = sum_priority;
+
+  xbt_swag_foreach(_action, p_actionSet) {
+    action = static_cast<CpuTiActionPtr>(_action);
+    min_finish = -1;
+    /* action not running, skip it */
+    if (action->getStateSet() !=
+        surf_cpu_model_pm->getRunningActionSet())
+      continue;
+
+    /* verify if the action is really running on cpu */
+    if (action->m_suspended == 0 && action->getPriority() > 0) {
+      /* total area needed to finish the action. Used in trace integration */
+      total_area =
+          (action->getRemains()) * sum_priority *
+           action->getPriority();
+
+      total_area /= m_powerPeak;
+
+      action->setFinishTime(p_availTrace->solve(now, total_area));
+      /* verify which event will happen before (max_duration or finish time) */
+      if (action->getMaxDuration() != NO_MAX_DURATION &&
+          action->getStartTime() + action->getMaxDuration() < action->m_finish)
+        min_finish = action->getStartTime() + action->getMaxDuration();
+      else
+        min_finish = action->m_finish;
+    } else {
+      /* put the max duration time on heap */
+      if (action->getMaxDuration() != NO_MAX_DURATION)
+        min_finish = action->getStartTime() + action->getMaxDuration();
+    }
+    /* add in action heap */
+    XBT_DEBUG("action(%p) index %d", action, action->m_indexHeap);
+    if (action->m_indexHeap >= 0) {
+      CpuTiActionPtr heap_act = (CpuTiActionPtr)
+          xbt_heap_remove(reinterpret_cast<CpuTiModelPtr>(getModel())->p_tiActionHeap, action->m_indexHeap);
+      if (heap_act != action)
+        DIE_IMPOSSIBLE;
+    }
+    if (min_finish != NO_MAX_DURATION)
+      xbt_heap_push(reinterpret_cast<CpuTiModelPtr>(getModel())->p_tiActionHeap, action, min_finish);
+
+    XBT_DEBUG
+        ("Update finish time: Cpu(%s) Action: %p, Start Time: %f Finish Time: %f Max duration %f",
+         getName(), action, action->getStartTime(),
+         action->m_finish,
+         action->getMaxDuration());
+  }
+/* remove from modified cpu */
+  xbt_swag_remove(this, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+}
+
+bool CpuTi::isUsed()
+{
+  return xbt_swag_size(p_actionSet);
+}
+
+
+
+double CpuTi::getAvailableSpeed()
+{
+  m_powerScale = p_availTrace->getPowerScale(surf_get_clock());
+  return Cpu::getAvailableSpeed();
+}
+
+/**
+* \brief Update the remaining amount of actions
+*
+* \param  now    Current time
+*/
+void CpuTi::updateRemainingAmount(double now)
+{
+  double area_total;
+  void* _action;
+  CpuTiActionPtr action;
+
+  /* already updated */
+  if (m_lastUpdate >= now)
+    return;
+
+/* calcule the surface */
+  area_total = p_availTrace->integrate(m_lastUpdate, now) * m_powerPeak;
+  XBT_DEBUG("Flops total: %f, Last update %f", area_total,
+         m_lastUpdate);
+
+  xbt_swag_foreach(_action, p_actionSet) {
+    action = static_cast<CpuTiActionPtr>(_action);
+    /* action not running, skip it */
+    if (action->getStateSet() !=
+        getModel()->getRunningActionSet())
+      continue;
+
+    /* bogus priority, skip it */
+    if (action->getPriority() <= 0)
+      continue;
+
+    /* action suspended, skip it */
+    if (action->m_suspended != 0)
+      continue;
+
+    /* action don't need update */
+    if (action->getStartTime() >= now)
+      continue;
+
+    /* skip action that are finishing now */
+    if (action->m_finish >= 0
+        && action->m_finish <= now)
+      continue;
+
+    /* update remaining */
+    action->updateRemains(area_total / (m_sumPriority * action->getPriority()));
+    XBT_DEBUG("Update remaining action(%p) remaining %f", action,
+           action->m_remains);
+  }
+  m_lastUpdate = now;
+}
+
+CpuActionPtr CpuTi::execute(double size)
+{
+  XBT_IN("(%s,%g)", getName(), size);
+  CpuTiActionPtr action = new CpuTiAction(static_cast<CpuTiModelPtr>(getModel()), size, getState() != SURF_RESOURCE_ON, this);
+
+  xbt_swag_insert(action, p_actionSet);
+
+  XBT_OUT();
+  return action;
+}
+
+
+CpuActionPtr CpuTi::sleep(double duration)
+{
+  if (duration > 0)
+    duration = MAX(duration, MAXMIN_PRECISION);
+
+  XBT_IN("(%s,%g)", getName(), duration);
+  CpuTiActionPtr action = new CpuTiAction(static_cast<CpuTiModelPtr>(getModel()), 1.0, getState() != SURF_RESOURCE_ON, this);
+
+  action->m_maxDuration = duration;
+  action->m_suspended = 2;
+  if (duration == NO_MAX_DURATION) {
+   /* Move to the *end* of the corresponding action set. This convention
+      is used to speed up update_resource_state  */
+       action->getStateSet()->erase(action->getStateSet()->iterator_to(*action));
+    action->p_stateSet = reinterpret_cast<CpuTiModelPtr>(getModel())->p_runningActionSetThatDoesNotNeedBeingChecked;
+    action->getStateSet()->push_back(*static_cast<ActionPtr>(action));
+  }
+
+  xbt_swag_insert(action, p_actionSet);
+
+  XBT_OUT();
+  return action;
+}
+
+/**********
+ * Action *
+ **********/
+
+static void cpu_ti_action_update_index_heap(void *action, int i)
+{
+((CpuTiActionPtr)action)->updateIndexHeap(i);
+}
+
+CpuTiAction::CpuTiAction(CpuTiModelPtr model_, double cost, bool failed,
+                                CpuTiPtr cpu)
+ : CpuAction(model_, cost, failed)
+{
+  p_cpuListHookup.next = 0;
+  p_cpuListHookup.prev = 0;
+
+  m_suspended = 0;        /* Should be useless because of the
+                                calloc but it seems to help valgrind... */
+  p_cpu = cpu;
+  m_indexHeap = -1;
+  xbt_swag_insert(cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+}
+
+void CpuTiAction::updateIndexHeap(int i)
+{
+  m_indexHeap = i;
+}
+
+void CpuTiAction::setState(e_surf_action_state_t state)
+{
+  Action::setState(state);
+  xbt_swag_insert(p_cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+}
+
+int CpuTiAction::unref()
+{
+  m_refcount--;
+  if (!m_refcount) {
+       if (actionHook::is_linked())
+         getStateSet()->erase(getStateSet()->iterator_to(*this));
+    /* remove from action_set */
+    xbt_swag_remove(this, p_cpu->p_actionSet);
+    /* remove from heap */
+    xbt_heap_remove(reinterpret_cast<CpuTiModelPtr>(getModel())->p_tiActionHeap, this->m_indexHeap);
+    xbt_swag_insert(p_cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+    delete this;
+    return 1;
+  }
+  return 0;
+}
+
+void CpuTiAction::cancel()
+{
+  this->setState(SURF_ACTION_FAILED);
+  xbt_heap_remove(getModel()->getActionHeap(), this->m_indexHeap);
+  xbt_swag_insert(p_cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+  return;
+}
+
+void CpuTiAction::recycle()
+{
+  DIE_IMPOSSIBLE;
+}
+
+void CpuTiAction::suspend()
+{
+  XBT_IN("(%p)", this);
+  if (m_suspended != 2) {
+    m_suspended = 1;
+    xbt_heap_remove(getModel()->getActionHeap(), m_indexHeap);
+    xbt_swag_insert(p_cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+  }
+  XBT_OUT();
+}
+
+void CpuTiAction::resume()
+{
+  XBT_IN("(%p)", this);
+  if (m_suspended != 2) {
+    m_suspended = 0;
+    xbt_swag_insert(p_cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+  }
+  XBT_OUT();
+}
+
+bool CpuTiAction::isSuspended()
+{
+  return m_suspended == 1;
+}
+
+void CpuTiAction::setMaxDuration(double duration)
+{
+  double min_finish;
+
+  XBT_IN("(%p,%g)", this, duration);
+
+  m_maxDuration = duration;
+
+  if (duration >= 0)
+    min_finish = (getStartTime() + getMaxDuration()) < getFinishTime() ?
+                 (getStartTime() + getMaxDuration()) : getFinishTime();
+  else
+    min_finish = getFinishTime();
+
+/* add in action heap */
+  if (m_indexHeap >= 0) {
+    CpuTiActionPtr heap_act = (CpuTiActionPtr)
+        xbt_heap_remove(getModel()->getActionHeap(), m_indexHeap);
+    if (heap_act != this)
+      DIE_IMPOSSIBLE;
+  }
+  xbt_heap_push(getModel()->getActionHeap(), this, min_finish);
+
+  XBT_OUT();
+}
+
+void CpuTiAction::setPriority(double priority)
+{
+  XBT_IN("(%p,%g)", this, priority);
+  m_priority = priority;
+  xbt_swag_insert(p_cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+  XBT_OUT();
+}
+
+double CpuTiAction::getRemains()
+{
+  XBT_IN("(%p)", this);
+  p_cpu->updateRemainingAmount(surf_get_clock());
+  XBT_OUT();
+  return m_remains;
+}
+
+#endif /* SURF_MODEL_CPUTI_H_ */
+
diff --git a/src/surf/cpu_ti.hpp b/src/surf/cpu_ti.hpp
new file mode 100644 (file)
index 0000000..4e1ac71
--- /dev/null
@@ -0,0 +1,185 @@
+/* Copyright (c) 2013-2014. 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 "cpu_interface.hpp"
+#include "trace_mgr_private.h"
+#include "surf/surf_routing.h"
+
+/* Epsilon */
+#define EPSILON 0.000000001
+
+/***********
+ * Classes *
+ ***********/
+class CpuTiTrace;
+typedef CpuTiTrace *CpuTiTracePtr;
+
+class CpuTiTgmr;
+typedef CpuTiTgmr *CpuTiTgmrPtr;
+
+class CpuTiModel;
+typedef CpuTiModel *CpuTiModelPtr;
+
+class CpuTi;
+typedef CpuTi *CpuTiPtr;
+
+class CpuTiAction;
+typedef CpuTiAction *CpuTiActionPtr;
+
+/*********
+ * Trace *
+ *********/
+class CpuTiTrace {
+public:
+  CpuTiTrace(tmgr_trace_t powerTrace);
+  ~CpuTiTrace();
+
+  double integrateSimple(double a, double b);
+  double integrateSimplePoint(double a);
+  double solveSimple(double a, double amount);
+
+  double *p_timePoints;
+  double *p_integral;
+  int m_nbPoints;
+  int binarySearch(double *array, double a, int low, int high);
+
+private:
+};
+
+enum trace_type {
+  
+  TRACE_FIXED,                /*< Trace fixed, no availability file */
+  TRACE_DYNAMIC               /*< Dynamic, availability file disponible */
+};
+
+class CpuTiTgmr {
+public:
+  CpuTiTgmr(trace_type type, double value): m_type(type), m_value(value){};
+  CpuTiTgmr(tmgr_trace_t power_trace, double value);
+  ~CpuTiTgmr();
+
+  double integrate(double a, double b);
+  double solve(double a, double amount);
+  double solveSomewhatSimple(double a, double amount);
+  double getPowerScale(double a);
+
+  trace_type m_type;
+  double m_value;                 /*< Percentage of cpu power disponible. Value fixed between 0 and 1 */
+
+  /* Dynamic */
+  double m_lastTime;             /*< Integral interval last point (discret time) */
+  double m_total;                 /*< Integral total between 0 and last_pointn */
+
+  CpuTiTracePtr p_trace;
+  tmgr_trace_t p_powerTrace;
+};
+
+/*********
+ * Model *
+ *********/
+class CpuTiModel : public CpuModel {
+public:
+  CpuTiModel();
+  ~CpuTiModel();
+
+  void parseInit(sg_platf_host_cbarg_t host);
+  CpuTiPtr createResource(const char *name,  xbt_dynar_t powerPeak,
+                          int pstate, double power_scale,
+                          tmgr_trace_t power_trace, int core,
+                          e_surf_resource_state_t state_initial,
+                          tmgr_trace_t state_trace,
+                          xbt_dict_t cpu_properties);
+  CpuTiActionPtr createAction(double cost, bool failed);
+  double shareResources(double now);
+  void updateActionsState(double now, double delta);
+  void addTraces();
+
+  ActionListPtr p_runningActionSetThatDoesNotNeedBeingChecked;
+  xbt_swag_t p_modifiedCpu;
+  xbt_heap_t p_tiActionHeap;
+
+protected:
+  void NotifyResourceTurnedOn(ResourcePtr){};
+  void NotifyResourceTurnedOff(ResourcePtr){};
+
+  void NotifyActionCancel(ActionPtr){};
+  void NotifyActionResume(ActionPtr){};
+  void NotifyActionSuspend(ActionPtr){};
+};
+
+/************
+ * Resource *
+ ************/
+class CpuTi : public Cpu {
+public:
+  CpuTi() {};
+  CpuTi(CpuTiModelPtr model, const char *name, xbt_dynar_t powerPeak,
+        int pstate, double powerScale, tmgr_trace_t powerTrace, int core,
+        e_surf_resource_state_t stateInitial, tmgr_trace_t stateTrace,
+       xbt_dict_t properties) ;
+  ~CpuTi();
+
+  void updateState(tmgr_trace_event_t event_type, double value, double date);  
+  void updateActionsFinishTime(double now);
+  bool isUsed();
+  void printCpuTiModel();
+  CpuActionPtr execute(double size);
+  CpuActionPtr sleep(double duration);
+  double getAvailableSpeed();
+
+  double getCurrentPowerPeak() {THROW_UNIMPLEMENTED;};
+  double getPowerPeakAt(int /*pstate_index*/) {THROW_UNIMPLEMENTED;};
+  int getNbPstates() {THROW_UNIMPLEMENTED;};
+  void setPowerPeakAt(int /*pstate_index*/) {THROW_UNIMPLEMENTED;};
+
+  CpuTiTgmrPtr p_availTrace;       /*< Structure with data needed to integrate trace file */
+  tmgr_trace_event_t p_stateEvent;       /*< trace file with states events (ON or OFF) */
+  tmgr_trace_event_t p_powerEvent;       /*< trace file with availability events */
+  xbt_swag_t p_actionSet;        /*< set with all actions running on cpu */
+  s_xbt_swag_hookup_t p_modifiedCpuHookup;      /*< hookup to swag that indicates whether share resources must be recalculated or not */
+  double m_sumPriority;          /*< the sum of actions' priority that are running on cpu */
+  double m_lastUpdate;           /*< last update of actions' remaining amount done */
+
+  int m_pstate;                                                                /*< Current pstate (index in the power_peak_list)*/
+  double current_frequency;
+
+  void updateRemainingAmount(double now);
+};
+
+/**********
+ * Action *
+ **********/
+
+class CpuTiAction: public CpuAction {
+  friend CpuActionPtr CpuTi::execute(double size);
+  friend CpuActionPtr CpuTi::sleep(double duration);
+  friend void CpuTi::updateActionsFinishTime(double now);//FIXME
+  friend void CpuTi::updateRemainingAmount(double now);//FIXME
+
+public:
+  CpuTiAction() {};
+  CpuTiAction(CpuTiModelPtr model, double cost, bool failed,
+                                CpuTiPtr cpu);
+
+  void setState(e_surf_action_state_t state);
+  int unref();
+  void cancel();
+  void recycle();
+  void updateIndexHeap(int i);
+  void suspend();
+  void resume();
+  bool isSuspended();
+  void setMaxDuration(double duration);
+  void setPriority(double priority);
+  double getRemains();
+  void setAffinity(CpuPtr /*cpu*/, unsigned long /*mask*/) {};
+
+  CpuTiPtr p_cpu;
+  int m_indexHeap;
+  s_xbt_swag_hookup_t p_cpuListHookup;
+  int m_suspended;
+private:
+};
diff --git a/src/surf/cpu_ti_private.h b/src/surf/cpu_ti_private.h
deleted file mode 100644 (file)
index ba570d9..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-
-/* Copyright (c) 2009-2010, 2013. 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 _SURF_CPU_TI_PRIVATE_H
-#define _SURF_CPU_TI_PRIVATE_H
-
-typedef struct surf_cpu_ti_trace {
-  double *time_points;
-  double *integral;
-  int nb_points;
-} s_surf_cpu_ti_trace_t, *surf_cpu_ti_trace_t;
-
-/* TRACE */
-typedef struct surf_cpu_ti_tgmr {
-  enum trace_type {
-    TRACE_FIXED,                /*< Trace fixed, no availability file */
-    TRACE_DYNAMIC               /*< Dynamic, availability file disponible */
-  } type;
-
-  double value;                 /*< Percentage of cpu power disponible. Value fixed between 0 and 1 */
-
-  /* Dynamic */
-  double last_time;             /*< Integral interval last point (discret time) */
-  double total;                 /*< Integral total between 0 and last_pointn */
-
-  surf_cpu_ti_trace_t trace;
-  tmgr_trace_t power_trace;
-
-} s_surf_cpu_ti_tgmr_t, *surf_cpu_ti_tgmr_t;
-
-
-/* CPU with trace integration feature */
-typedef struct cpu_ti {
-  s_surf_resource_t generic_resource;   /*< Structure with generic data. Needed at begin to interate with SURF */
-  double power_peak;            /*< CPU power peak */
-  int pstate;
-  double power_scale;           /*< Percentage of CPU disponible */
-  surf_cpu_ti_tgmr_t avail_trace;       /*< Structure with data needed to integrate trace file */
-  e_surf_resource_state_t state_current;        /*< CPU current state (ON or OFF) */
-  tmgr_trace_event_t state_event;       /*< trace file with states events (ON or OFF) */
-  tmgr_trace_event_t power_event;       /*< trace file with availability events */
-  xbt_swag_t action_set;        /*< set with all actions running on cpu */
-  s_xbt_swag_hookup_t modified_cpu_hookup;      /*< hookup to swag that indicacates whether share resources must be recalculated or not */
-  double sum_priority;          /*< the sum of actions' priority that are running on cpu */
-  double last_update;           /*< last update of actions' remaining amount done */
-  double current_frequency;
-} s_cpu_ti_t, *cpu_ti_t;
-
-typedef struct surf_action_ti {
-  s_surf_action_t generic_action;
-  s_xbt_swag_hookup_t cpu_list_hookup;
-  void *cpu;
-  int suspended;
-  int index_heap;
-} s_surf_action_cpu_ti_t, *surf_action_cpu_ti_t;
-
-/* Epsilon */
-#define EPSILON 0.000000001
-/* Usefull define to get the cpu where action is running on */
-#define ACTION_GET_CPU(action) ((cpu_ti_t)((surf_action_cpu_ti_t)action)->cpu)
-
-
-#endif                          /* _SURF_CPU_TI_PRIVATE_H */
similarity index 85%
rename from src/surf/fair_bottleneck.c
rename to src/surf/fair_bottleneck.cpp
index 8830107..1e9c3f7 100644 (file)
@@ -1,13 +1,12 @@
-/* Copyright (c) 2007-2011. The SimGrid Team.
+/* Copyright (c) 2007-2011, 2013-2014. 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/log.h"
-#include "maxmin_private.h"
+#include "maxmin_private.hpp"
 #include <stdlib.h>
 #include <math.h>
 
@@ -18,11 +17,10 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_maxmin);
 
 void bottleneck_solve(lmm_system_t sys)
 {
+  void *_var, *_var_next, *_cnst, *_cnst_next, *_elem;
   lmm_variable_t var = NULL;
-  lmm_variable_t var_next = NULL;
   lmm_constraint_t cnst = NULL;
   s_lmm_constraint_t s_cnst;
-  lmm_constraint_t cnst_next = NULL;
   lmm_element_t elem = NULL;
   xbt_swag_t cnst_list = NULL;
   xbt_swag_t var_list = NULL;
@@ -40,7 +38,8 @@ void bottleneck_solve(lmm_system_t sys)
 
   var_list = &(sys->variable_set);
   XBT_DEBUG("Variable set : %d", xbt_swag_size(var_list));
-  xbt_swag_foreach(var, var_list) {
+  xbt_swag_foreach(_var, var_list) {
+       var = (lmm_variable_t)_var;
     int nb = 0;
     var->value = 0.0;
     XBT_DEBUG("Handling variable %p", var);
@@ -65,11 +64,13 @@ void bottleneck_solve(lmm_system_t sys)
 
   cnst_list = &(sys->active_constraint_set);
   XBT_DEBUG("Active constraints : %d", xbt_swag_size(cnst_list));
-  xbt_swag_foreach(cnst, cnst_list) {
+  xbt_swag_foreach(_cnst, cnst_list) {
+       cnst = (lmm_constraint_t)_cnst;
     xbt_swag_insert(cnst, &(sys->saturated_constraint_set));
   }
   cnst_list = &(sys->saturated_constraint_set);
-  xbt_swag_foreach(cnst, cnst_list) {
+  xbt_swag_foreach(_cnst, cnst_list) {
+       cnst = (lmm_constraint_t)_cnst;
     cnst->remaining = cnst->bound;
     cnst->usage = 0.0;
   }
@@ -86,12 +87,14 @@ void bottleneck_solve(lmm_system_t sys)
     }
     XBT_DEBUG("******* Constraints to process: %d *******",
            xbt_swag_size(cnst_list));
-    xbt_swag_foreach_safe(cnst, cnst_next, cnst_list) {
+    xbt_swag_foreach_safe(_cnst, _cnst_next, cnst_list) {
+      cnst = (lmm_constraint_t)_cnst;
       int nb = 0;
       XBT_DEBUG("Processing cnst %p ", cnst);
       elem_list = &(cnst->element_set);
       cnst->usage = 0.0;
-      xbt_swag_foreach(elem, elem_list) {
+      xbt_swag_foreach(_elem, elem_list) {
+       elem = (lmm_element_t)_elem;
         if (elem->variable->weight <= 0)
           break;
         if ((elem->value > 0)
@@ -112,7 +115,8 @@ void bottleneck_solve(lmm_system_t sys)
              cnst->usage, nb);
     }
 
-    xbt_swag_foreach_safe(var, var_next, var_list) {
+    xbt_swag_foreach_safe(_var, _var_next, var_list) {
+      var = (lmm_variable_t)_var;
       double min_inc =
           var->cnsts[0].constraint->usage / var->cnsts[0].value;
       for (i = 1; i < var->cnsts_number; i++) {
@@ -129,10 +133,12 @@ void bottleneck_solve(lmm_system_t sys)
       }
     }
 
-    xbt_swag_foreach_safe(cnst, cnst_next, cnst_list) {
+    xbt_swag_foreach_safe(_cnst, _cnst_next, cnst_list) {
+      cnst = (lmm_constraint_t)_cnst;
       XBT_DEBUG("Updating cnst %p ", cnst);
       elem_list = &(cnst->element_set);
-      xbt_swag_foreach(elem, elem_list) {
+      xbt_swag_foreach(_elem, elem_list) {
+        elem = (lmm_element_t)_elem;
         if (elem->variable->weight <= 0)
           break;
         if (cnst->shared) {
@@ -160,7 +166,8 @@ void bottleneck_solve(lmm_system_t sys)
         XBT_DEBUG("\tGet rid of constraint %p", cnst);
 
         xbt_swag_remove(cnst, cnst_list);
-        xbt_swag_foreach(elem, elem_list) {
+        xbt_swag_foreach(_elem, elem_list) {
+          elem = (lmm_element_t)_elem;
           if (elem->variable->weight <= 0)
             break;
           if (elem->value > 0) {
index 0d41371..b278ed7 100644 (file)
@@ -1,9 +1,9 @@
-/* Copyright (c) 2007 Kayo Fujiwara. All rights reserved.                  */
+/* Copyright (c) 2007-2011, 2014. 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 "gtnets_simulator.h"
 #include "gtnets_interface.h"
 #ifdef XBT_DEBUG
index 0c36743..0b8ff38 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -8,29 +8,28 @@
 #ifndef _GTNETS_INTERFACE_H
 #define _GTNETS_INTERFACE_H
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+#include "xbt/misc.h"           /* SG_{BEGIN,END}_DECL() */
+
+SG_BEGIN_DECL()
+
+int gtnets_initialize(int wsize);
+int gtnets_add_link(int id, double bandwidth, double latency);
+int gtnets_add_route(int src, int dst, int *links, int nlink);
+int gtnets_add_router(int id);
+int gtnets_add_onehop_route(int src, int dst, int link);
+int gtnets_create_flow(int src, int dst, long datasize, void *metadata);
+double gtnets_get_time_to_next_flow_completion();
+double gtnets_run_until_next_flow_completion(void ***metadata,
+                                             int *number_of_flows);
+double gtnets_get_flow_rx(void *metadata);
+
+void gtnets_print_topology(void);
+
+int gtnets_run(double delta);
+int gtnets_finalize();
+void gtnets_set_jitter(double);
+void gtnets_set_jitter_seed(int);
+
+SG_END_DECL()
 
-  int gtnets_initialize(int wsize);
-  int gtnets_add_link(int id, double bandwidth, double latency);
-  int gtnets_add_route(int src, int dst, int *links, int nlink);
-  int gtnets_add_router(int id);
-  int gtnets_add_onehop_route(int src, int dst, int link);
-  int gtnets_create_flow(int src, int dst, long datasize, void *metadata);
-  double gtnets_get_time_to_next_flow_completion();
-  double gtnets_run_until_next_flow_completion(void ***metadata,
-                                               int *number_of_flows);
-  double gtnets_get_flow_rx(void *metadata);
-
-  void gtnets_print_topology(void);
-
-  int gtnets_run(double delta);
-  int gtnets_finalize();
-  void gtnets_set_jitter(double);
-  void gtnets_set_jitter_seed(int);
-
-#ifdef __cplusplus
-}
-#endif
 #endif
index 626d2ca..920b915 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (c) 2007 Kayo Fujiwara. All rights reserved.                  */
+/* Copyright (c) 2007-2011, 2014. 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. */
index 9549978..c988d84 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2010. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d3f2f13..7d39731 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (c) 2007 Kayo Fujiwara. All rights reserved.                  */
+/* Copyright (c) 2007-2011, 2014. 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. */
index 6ec3800..5efd413 100644 (file)
@@ -1,10 +1,9 @@
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. 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 _GTNETS_TOPOLOGY_H
 #define _GTNETS_TOPOLOGY_H
 
index e3e652f..50c5769 100644 (file)
@@ -1,14 +1,13 @@
-/* Copyright (c) 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
 
 #ifdef HAVE_TRACING
 #include "surf/surf_private.h"
-#include "surf/network_private.h"
 #include "xbt/graph.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_routing, instr, "Tracing platform hierarchy");
@@ -130,14 +129,14 @@ static void recursiveGraphExtraction (AS_t rc, container_t container, xbt_dict_t
     XBT_DEBUG("Graph extraction disabled by user.");
     return;
   }
-  XBT_DEBUG ("Graph extraction for routing_component = %s", rc->name);
-  if (!xbt_dict_is_empty(rc->routing_sons)){
+  XBT_DEBUG ("Graph extraction for routing_component = %s", surf_AS_get_name(rc));
+  if (!xbt_dict_is_empty(surf_AS_get_routing_sons(rc))){
     xbt_dict_cursor_t cursor = NULL;
     AS_t rc_son;
     char *child_name;
     //bottom-up recursion
-    xbt_dict_foreach(rc->routing_sons, cursor, child_name, rc_son) {
-      container_t child_container = xbt_dict_get (container->children, rc_son->name);
+    xbt_dict_foreach(surf_AS_get_routing_sons(rc), cursor, child_name, rc_son) {
+      container_t child_container = xbt_dict_get (container->children, surf_AS_get_name(rc_son));
       recursiveGraphExtraction (rc_son, child_container, filter);
     }
   }
@@ -151,7 +150,7 @@ static void recursiveGraphExtraction (AS_t rc, container_t container, xbt_dict_t
     xbt_dict_cursor_t cursor = NULL;
     char *edge_name;
 
-    rc->get_graph(graph,nodes,edges,rc);
+    surf_AS_get_graph(rc, graph, nodes, edges);
     xbt_dict_foreach(edges,cursor,edge_name,edge) {
         linkContainers(PJ_container_get(edge->src->data), PJ_container_get(edge->dst->data), filter);
     }
@@ -329,7 +328,7 @@ static void instr_routing_parse_end_platform ()
   currentContainer = NULL;
   xbt_dict_t filter = xbt_dict_new_homogeneous(xbt_free);
   XBT_DEBUG ("Starting graph extraction.");
-  recursiveGraphExtraction (routing_platf->root, PJ_container_get_root(), filter);
+  recursiveGraphExtraction (surf_platf_get_root(routing_platf), PJ_container_get_root(), filter);
   XBT_DEBUG ("Graph extraction finished.");
   xbt_dict_free(&filter);
   platform_created = 1;
@@ -449,18 +448,18 @@ int instr_platform_traced ()
 static void recursiveXBTGraphExtraction (xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges,
     AS_t rc, container_t container)
 {
-  if (!xbt_dict_is_empty(rc->routing_sons)){
+  if (!xbt_dict_is_empty(surf_AS_get_routing_sons(rc))){
     xbt_dict_cursor_t cursor = NULL;
     AS_t rc_son;
     char *child_name;
     //bottom-up recursion
-    xbt_dict_foreach(rc->routing_sons, cursor, child_name, rc_son) {
-      container_t child_container = xbt_dict_get (container->children, rc_son->name);
+    xbt_dict_foreach(surf_AS_get_routing_sons(rc), cursor, child_name, rc_son) {
+      container_t child_container = xbt_dict_get (container->children, surf_AS_get_name(rc_son));
       recursiveXBTGraphExtraction (graph, nodes, edges, rc_son, child_container);
     }
   }
 
-  rc->get_graph(graph,nodes,edges,rc);
+  surf_AS_get_graph(rc, graph, nodes, edges);
 }
 
 xbt_graph_t instr_routing_platform_graph (void)
@@ -468,7 +467,7 @@ xbt_graph_t instr_routing_platform_graph (void)
   xbt_graph_t ret = xbt_graph_new_graph (0, NULL);
   xbt_dict_t nodes = xbt_dict_new_homogeneous(NULL);
   xbt_dict_t edges = xbt_dict_new_homogeneous(NULL);
-  recursiveXBTGraphExtraction (ret, nodes, edges, routing_platf->root, PJ_container_get_root());
+  recursiveXBTGraphExtraction (ret, nodes, edges, surf_platf_get_root(routing_platf), PJ_container_get_root());
   xbt_dict_free (&nodes);
   xbt_dict_free (&edges);
   return ret;
index e9570dd..f0f3df2 100644 (file)
@@ -1,12 +1,12 @@
-/* Copyright (c) 2010, 2012. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. 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. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
 #include "surf/surf_private.h"
-#include "surf/network_gtnets_private.h"
+//FIXME:#include "surf/network_gtnets_private.h"
 
 #ifdef HAVE_TRACING
 
@@ -43,9 +43,9 @@ void TRACE_surf_link_set_bandwidth(double date, const char *resource, double ban
 /* to trace gtnets */
 void TRACE_surf_gtnets_communicate(void *action, void *src, void *dst)
 {
-  surf_action_network_GTNETS_t gtnets_action = (surf_action_network_GTNETS_t)action;
+  /*FIXME:surf_action_network_GTNETS_t gtnets_action = (surf_action_network_GTNETS_t)action;
   gtnets_action->src = src;
-  gtnets_action->dst = dst;
+  gtnets_action->dst = dst;*/
 }
 
 void TRACE_surf_action(surf_action_t surf_action, const char *category)
@@ -57,6 +57,6 @@ void TRACE_surf_action(surf_action_t surf_action, const char *category)
   if (!category)
     return;
 
-  surf_action->category = xbt_strdup(category);
+  surf_action_set_category(surf_action, category);
 }
 #endif /* HAVE_TRACING */
similarity index 95%
rename from src/surf/lagrange.c
rename to src/surf/lagrange.cpp
index a07c268..c62055b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -11,7 +11,7 @@
  */
 #include "xbt/log.h"
 #include "xbt/sysdep.h"
-#include "maxmin_private.h"
+#include "maxmin_private.hpp"
 
 #include <stdlib.h>
 #ifndef MATH
@@ -43,6 +43,7 @@ static double partial_diff_lambda(double lambda, void *param_cnst);
 static int __check_feasible(xbt_swag_t cnst_list, xbt_swag_t var_list,
                             int warn)
 {
+  void *_cnst, *_elem, *_var;
   xbt_swag_t elem_list = NULL;
   lmm_element_t elem = NULL;
   lmm_constraint_t cnst = NULL;
@@ -50,10 +51,12 @@ static int __check_feasible(xbt_swag_t cnst_list, xbt_swag_t var_list,
 
   double tmp;
 
-  xbt_swag_foreach(cnst, cnst_list) {
+  xbt_swag_foreach(_cnst, cnst_list) {
+       cnst = (lmm_constraint_t)_cnst;
     tmp = 0;
     elem_list = &(cnst->element_set);
-    xbt_swag_foreach(elem, elem_list) {
+    xbt_swag_foreach(_elem, elem_list) {
+      elem = (lmm_element_t)_elem;
       var = elem->variable;
       if (var->weight <= 0)
         continue;
@@ -72,7 +75,8 @@ static int __check_feasible(xbt_swag_t cnst_list, xbt_swag_t var_list,
          cnst, tmp - cnst->bound, cnst->lambda);
   }
 
-  xbt_swag_foreach(var, var_list) {
+  xbt_swag_foreach(_var, var_list) {
+       var = (lmm_variable_t)_var;
     if (!var->weight)
       break;
     if (var->bound < 0)
@@ -124,12 +128,14 @@ static double new_mu(lmm_variable_t var)
 
 static double dual_objective(xbt_swag_t var_list, xbt_swag_t cnst_list)
 {
+  void *_cnst, *_var;
   lmm_constraint_t cnst = NULL;
   lmm_variable_t var = NULL;
 
   double obj = 0.0;
 
-  xbt_swag_foreach(var, var_list) {
+  xbt_swag_foreach(_var, var_list) {
+       var = (lmm_variable_t)_var;
     double sigma_i = 0.0;
     int j;
 
@@ -151,8 +157,10 @@ static double dual_objective(xbt_swag_t var_list, xbt_swag_t cnst_list)
       obj += var->mu * var->bound;
   }
 
-  xbt_swag_foreach(cnst, cnst_list)
+  xbt_swag_foreach(_cnst, cnst_list) {
+      cnst = (lmm_constraint_t)_cnst;
       obj += cnst->lambda * cnst->bound;
+  }
 
   return obj;
 }
@@ -172,9 +180,11 @@ void lagrange_solve(lmm_system_t sys)
    * fairness. See docummentation for more details.
    */
   xbt_swag_t cnst_list = NULL;
+  void *_cnst;
   lmm_constraint_t cnst = NULL;
 
   xbt_swag_t var_list = NULL;
+  void *_var;
   lmm_variable_t var = NULL;
 
   /*
@@ -204,7 +214,8 @@ void lagrange_solve(lmm_system_t sys)
    * Initialize lambda.
    */
   cnst_list = &(sys->active_constraint_set);
-  xbt_swag_foreach(cnst, cnst_list) {
+  xbt_swag_foreach(_cnst, cnst_list) {
+       cnst = (lmm_constraint_t)_cnst;
     cnst->lambda = 1.0;
     cnst->new_lambda = 2.0;
     XBT_DEBUG("#### cnst(%p)->lambda :  %e", cnst, cnst->lambda);
@@ -216,7 +227,8 @@ void lagrange_solve(lmm_system_t sys)
    */
   var_list = &(sys->variable_set);
   i = 0;
-  xbt_swag_foreach(var, var_list) {
+  xbt_swag_foreach(_var, var_list) {
+       var = (lmm_variable_t)_var;
     if (!var->weight)
       var->value = 0.0;
     else {
@@ -262,7 +274,8 @@ void lagrange_solve(lmm_system_t sys)
     /*                       
      * Improve the value of mu_i
      */
-    xbt_swag_foreach(var, var_list) {
+    xbt_swag_foreach(_var, var_list) {
+      var = (lmm_variable_t)_var;
       if (!var->weight)
         break;
       if (var->bound >= 0) {
@@ -286,7 +299,8 @@ void lagrange_solve(lmm_system_t sys)
     /*
      * Improve the value of lambda_i
      */
-    xbt_swag_foreach(cnst, cnst_list) {
+    xbt_swag_foreach(_cnst, cnst_list) {
+      cnst = (lmm_constraint_t)_cnst;
       XBT_DEBUG("Working on cnst (%p)", cnst);
       cnst->new_lambda =
           dichotomy(cnst->lambda, partial_diff_lambda, cnst,
@@ -311,7 +325,8 @@ void lagrange_solve(lmm_system_t sys)
      */
     XBT_DEBUG("-------------- Check convergence ----------");
     overall_modification = 0;
-    xbt_swag_foreach(var, var_list) {
+    xbt_swag_foreach(_var, var_list) {
+      var = (lmm_variable_t)_var;
       if (var->weight <= 0)
         var->value = 0.0;
       else {
@@ -478,6 +493,7 @@ static double partial_diff_lambda(double lambda, void *param_cnst)
 {
 
   int j;
+  void *_elem;
   xbt_swag_t elem_list = NULL;
   lmm_element_t elem = NULL;
   lmm_variable_t var = NULL;
@@ -490,7 +506,8 @@ static double partial_diff_lambda(double lambda, void *param_cnst)
 
   XBT_CDEBUG(surf_lagrange_dichotomy, "Computing diff of cnst (%p)", cnst);
 
-  xbt_swag_foreach(elem, elem_list) {
+  xbt_swag_foreach(_elem, elem_list) {
+       elem = (lmm_element_t)_elem;
     var = elem->variable;
     if (var->weight <= 0)
       continue;
similarity index 81%
rename from src/surf/maxmin.c
rename to src/surf/maxmin.cpp
index 420695c..cb60858 100644 (file)
@@ -1,14 +1,13 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. 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/log.h"
 #include "xbt/mallocator.h"
-#include "maxmin_private.h"
+#include "maxmin_private.hpp"
 #include <stdlib.h>
 #include <stdio.h>              /* sprintf */
 #include <math.h>
@@ -79,14 +78,14 @@ void lmm_system_free(lmm_system_t sys)
   lmm_variable_t var = NULL;
   lmm_constraint_t cnst = NULL;
 
-  while ((var = extract_variable(sys))) {
+  while ((var = (lmm_variable_t) extract_variable(sys))) {
     XBT_WARN
         ("Variable %p (%d) still in LMM system when freing it: this may be a bug",
          var, var->id_int);
     lmm_var_free(sys, var);
   }
 
-  while ((cnst = extract_constraint(sys)))
+  while ((cnst = (lmm_constraint_t) extract_constraint(sys)))
     lmm_cnst_free(sys, cnst);
 
   xbt_mallocator_free(sys->variable_mallocator);
@@ -163,12 +162,12 @@ lmm_constraint_t lmm_constraint_new(lmm_system_t sys, void *id,
   return cnst;
 }
 
-XBT_INLINE void lmm_constraint_shared(lmm_constraint_t cnst)
+void lmm_constraint_shared(lmm_constraint_t cnst)
 {
   cnst->shared = 0;
 }
 
-XBT_INLINE int lmm_constraint_is_shared(lmm_constraint_t cnst)
+int lmm_constraint_is_shared(lmm_constraint_t cnst)
 {
   return (cnst->shared);
 }
@@ -203,10 +202,10 @@ lmm_variable_t lmm_variable_new(lmm_system_t sys, void *id,
   XBT_IN("(sys=%p, id=%p, weight=%f, bound=%f, num_cons =%d)",
           sys, id, weight, bound, number_of_constraints);
 
-  var = xbt_mallocator_get(sys->variable_mallocator);
+  var = (lmm_variable_t) xbt_mallocator_get(sys->variable_mallocator);
   var->id = id;
   var->id_int = Global_debug_id++;
-  var->cnsts = xbt_realloc(var->cnsts, number_of_constraints * sizeof(s_lmm_element_t));
+  var->cnsts = (s_lmm_element_t *) xbt_realloc(var->cnsts, number_of_constraints * sizeof(s_lmm_element_t));
   for (i = 0; i < number_of_constraints; i++) {
     var->cnsts[i].element_set_hookup.next = NULL;
     var->cnsts[i].element_set_hookup.prev = NULL;
@@ -248,16 +247,100 @@ void lmm_variable_free(lmm_system_t sys, lmm_variable_t var)
   lmm_var_free(sys, var);
 }
 
-XBT_INLINE double lmm_variable_getvalue(lmm_variable_t var)
+double lmm_variable_getvalue(lmm_variable_t var)
 {
   return (var->value);
 }
 
-XBT_INLINE double lmm_variable_getbound(lmm_variable_t var)
+double lmm_variable_getbound(lmm_variable_t var)
 {
   return (var->bound);
 }
 
+/* Replace the content of elem_a with elem_b. The content of elem_b is cleared. */
+static void renew_elem_entry(lmm_element_t elem_a, lmm_element_t elem_b)
+{
+    elem_a->constraint = elem_b->constraint;
+    elem_a->variable   = elem_b->variable;
+    elem_a->value      = elem_b->value;
+
+    /* If elem_b is in the element_set swag, register the new element to the swag. */
+    if (xbt_swag_remove(elem_b, &(elem_b->constraint->element_set))) {
+      if (elem_a->variable->weight)
+        xbt_swag_insert_at_head(elem_a, &(elem_a->constraint->element_set));
+      else
+        xbt_swag_insert_at_tail(elem_a, &(elem_a->constraint->element_set));
+    }
+
+    if (xbt_swag_remove(elem_b, &(elem_b->constraint->active_element_set))) {
+      if (elem_a->variable->weight)
+        xbt_swag_insert_at_head(elem_a, &(elem_a->constraint->active_element_set));
+      else
+        xbt_swag_insert_at_tail(elem_a, &(elem_a->constraint->active_element_set));
+    }
+
+    elem_b->constraint = NULL;
+    elem_b->variable   = NULL;
+    elem_b->value      = 0;
+}
+
+void lmm_shrink(lmm_system_t sys, lmm_constraint_t cnst,
+                lmm_variable_t var)
+{
+  lmm_element_t elem = NULL;
+  int found = 0;
+
+  int i;
+  for (i = 0; i < var->cnsts_number; i++) {
+    elem = &(var->cnsts[i]);
+    if (elem->constraint == cnst) {
+      found = 1;
+      break;
+    }
+  }
+
+  if (!found) {
+    XBT_DEBUG("cnst %p is not found in var %p", cnst, var);
+    return;
+  }
+
+  sys->modified = 1;
+
+  XBT_DEBUG("remove elem(value %f, cnst %p, var %p) in var %p",
+      elem->value, elem->constraint, elem->variable, var);
+
+
+
+  /* We are going to change the constraint object and the variable object.
+   * Propagate this change to other objects. Calling here (not after
+   * modification) is correct? */
+  lmm_update_modified_set(sys, cnst);
+  lmm_update_modified_set(sys, var->cnsts[0].constraint); // will look up element_set of this constraint, and then each var in the element_set, and each var->cnsts[i].
+
+
+
+  /* now var->cnsts[i] is not necessary any more */
+
+  xbt_swag_remove(elem, &(elem->constraint->element_set));
+  xbt_swag_remove(elem, &(elem->constraint->active_element_set));
+  elem->constraint = NULL;
+  elem->variable = NULL;
+  elem->value = 0;
+
+
+
+  /* We do not want to have an empty element entry before the last entry. So,
+   * plug up the hole with the last one. */
+  if (i < var->cnsts_number - 1)
+    renew_elem_entry(&var->cnsts[i], &var->cnsts[var->cnsts_number - 1]);
+
+  var->cnsts_number -= 1;
+
+
+  if (xbt_swag_size(&(cnst->element_set)) == 0)
+    make_constraint_inactive(sys, cnst);
+}
+
 void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst,
                 lmm_variable_t var, double value)
 {
@@ -307,24 +390,7 @@ void lmm_expand_add(lmm_system_t sys, lmm_constraint_t cnst,
     lmm_expand(sys, cnst, var, value);
 }
 
-void lmm_elem_set_value(lmm_system_t sys, lmm_constraint_t cnst,
-                        lmm_variable_t var, double value)
-{
-  int i;
-
-  for (i = 0; i < var->cnsts_number; i++)
-    if (var->cnsts[i].constraint == cnst)
-      break;
-
-  if (i < var->cnsts_number) {
-    var->cnsts[i].value = value;
-    sys->modified = 1;
-    lmm_update_modified_set(sys, cnst);
-  } else
-    DIE_IMPOSSIBLE;
-}
-
-XBT_INLINE lmm_constraint_t lmm_get_cnst_from_var(lmm_system_t sys,
+lmm_constraint_t lmm_get_cnst_from_var(lmm_system_t /*sys*/,
                                                   lmm_variable_t var,
                                                   int num)
 {
@@ -334,7 +400,7 @@ XBT_INLINE lmm_constraint_t lmm_get_cnst_from_var(lmm_system_t sys,
     return NULL;
 }
 
-XBT_INLINE double lmm_get_cnst_weight_from_var(lmm_system_t sys,
+double lmm_get_cnst_weight_from_var(lmm_system_t /*sys*/,
                                                          lmm_variable_t var,
                                                          int num)
 {
@@ -344,32 +410,32 @@ XBT_INLINE double lmm_get_cnst_weight_from_var(lmm_system_t sys,
     return 0.0;
 }
 
-XBT_INLINE int lmm_get_number_of_cnst_from_var(lmm_system_t sys,
+int lmm_get_number_of_cnst_from_var(lmm_system_t /*sys*/,
                                                lmm_variable_t var)
 {
   return (var->cnsts_number);
 }
 
-lmm_variable_t lmm_get_var_from_cnst(lmm_system_t sys,
+lmm_variable_t lmm_get_var_from_cnst(lmm_system_t /*sys*/,
                                      lmm_constraint_t cnst,
                                      lmm_element_t * elem)
 {
   if (!(*elem))
-    *elem = xbt_swag_getFirst(&(cnst->element_set));
+    *elem = (lmm_element_t) xbt_swag_getFirst(&(cnst->element_set));
   else
-    *elem = xbt_swag_getNext(*elem, cnst->element_set.offset);
+    *elem = (lmm_element_t) xbt_swag_getNext(*elem, cnst->element_set.offset);
   if (*elem)
     return (*elem)->variable;
   else
     return NULL;
 }
 
-XBT_INLINE void *lmm_constraint_id(lmm_constraint_t cnst)
+void *lmm_constraint_id(lmm_constraint_t cnst)
 {
   return cnst->id;
 }
 
-XBT_INLINE void *lmm_variable_id(lmm_variable_t var)
+void *lmm_variable_id(lmm_variable_t var)
 {
   return var->id;
 }
@@ -389,7 +455,7 @@ static XBT_INLINE void saturated_constraint_set_update(double usage,
   } else if (*min_usage == usage) {
     if(saturated_constraint_set->pos == saturated_constraint_set->size) { // realloc the size
       saturated_constraint_set->size *= 2;
-      saturated_constraint_set->data = xbt_realloc(saturated_constraint_set->data, (saturated_constraint_set->size) * sizeof(int));
+      saturated_constraint_set->data = (int*) xbt_realloc(saturated_constraint_set->data, (saturated_constraint_set->size) * sizeof(int));
     }
     saturated_constraint_set->data[saturated_constraint_set->pos] = cnst_light_num;
     saturated_constraint_set->pos++;
@@ -402,13 +468,15 @@ static XBT_INLINE void saturated_variable_set_update(
     lmm_system_t sys)
 {
   lmm_constraint_light_t cnst = NULL;
+  void *_elem;
   lmm_element_t elem = NULL;
   xbt_swag_t elem_list = NULL;
   int i;
   for(i = 0; i< saturated_constraint_set->pos; i++){
     cnst = &cnst_light_tab[saturated_constraint_set->data[i]];
     elem_list = &(cnst->cnst->active_element_set);
-    xbt_swag_foreach(elem, elem_list) {
+    xbt_swag_foreach(_elem, elem_list) {
+      elem = (lmm_element_t)_elem;
       if (elem->variable->weight <= 0)
         break;
       if ((elem->value > 0))
@@ -419,6 +487,7 @@ static XBT_INLINE void saturated_variable_set_update(
 
 void lmm_print(lmm_system_t sys)
 {
+  void *_cnst, *_elem, *_var;
   lmm_constraint_t cnst = NULL;
   lmm_element_t elem = NULL;
   lmm_variable_t var = NULL;
@@ -426,23 +495,24 @@ void lmm_print(lmm_system_t sys)
   xbt_swag_t var_list = NULL;
   xbt_swag_t elem_list = NULL;
   char print_buf[1024];
-  char *trace_buf = xbt_malloc0(sizeof(char));
+  char *trace_buf = (char*) xbt_malloc0(sizeof(char));
   double sum = 0.0;
 
   /* Printing Objective */
   var_list = &(sys->variable_set);
   sprintf(print_buf, "MAX-MIN ( ");
-  trace_buf =
+  trace_buf = (char*)
       xbt_realloc(trace_buf, strlen(trace_buf) + strlen(print_buf) + 1);
   strcat(trace_buf, print_buf);
-  xbt_swag_foreach(var, var_list) {
+  xbt_swag_foreach(_var, var_list) {
+       var = (lmm_variable_t)_var;
     sprintf(print_buf, "'%d'(%f) ", var->id_int, var->weight);
-    trace_buf =
+    trace_buf = (char*)
         xbt_realloc(trace_buf, strlen(trace_buf) + strlen(print_buf) + 1);
     strcat(trace_buf, print_buf);
   }
   sprintf(print_buf, ")");
-  trace_buf =
+  trace_buf = (char*)
       xbt_realloc(trace_buf, strlen(trace_buf) + strlen(print_buf) + 1);
   strcat(trace_buf, print_buf);
   XBT_DEBUG("%20s", trace_buf);
@@ -451,22 +521,24 @@ void lmm_print(lmm_system_t sys)
   XBT_DEBUG("Constraints");
   /* Printing Constraints */
   cnst_list = &(sys->active_constraint_set);
-  xbt_swag_foreach(cnst, cnst_list) {
+  xbt_swag_foreach(_cnst, cnst_list) {
+       cnst = (lmm_constraint_t)_cnst;
     sum = 0.0;
     elem_list = &(cnst->element_set);
     sprintf(print_buf, "\t");
-    trace_buf =
+    trace_buf = (char*)
         xbt_realloc(trace_buf, strlen(trace_buf) + strlen(print_buf) + 1);
     strcat(trace_buf, print_buf);
     sprintf(print_buf, "%s(",(cnst->shared)?"":"max");
-    trace_buf =
+    trace_buf = (char*)
       xbt_realloc(trace_buf,
       strlen(trace_buf) + strlen(print_buf) + 1);
     strcat(trace_buf, print_buf);      
-    xbt_swag_foreach(elem, elem_list) {
+    xbt_swag_foreach(_elem, elem_list) {
+      elem = (lmm_element_t)_elem;
       sprintf(print_buf, "%f.'%d'(%f) %s ", elem->value,
               elem->variable->id_int, elem->variable->value,(cnst->shared)?"+":",");
-      trace_buf =
+      trace_buf = (char*)
           xbt_realloc(trace_buf,
                       strlen(trace_buf) + strlen(print_buf) + 1);
       strcat(trace_buf, print_buf);
@@ -476,13 +548,13 @@ void lmm_print(lmm_system_t sys)
   sum = MAX(sum,elem->value * elem->variable->value);
     }
     sprintf(print_buf, "0) <= %f ('%d')", cnst->bound, cnst->id_int);
-    trace_buf =
+    trace_buf = (char*)
         xbt_realloc(trace_buf, strlen(trace_buf) + strlen(print_buf) + 1);
     strcat(trace_buf, print_buf);
 
     if (!cnst->shared) {
       sprintf(print_buf, " [MAX-Constraint]");
-      trace_buf =
+      trace_buf = (char*)
           xbt_realloc(trace_buf,
                       strlen(trace_buf) + strlen(print_buf) + 1);
       strcat(trace_buf, print_buf);
@@ -496,7 +568,8 @@ void lmm_print(lmm_system_t sys)
 
   XBT_DEBUG("Variables");
   /* Printing Result */
-  xbt_swag_foreach(var, var_list) {
+  xbt_swag_foreach(_var, var_list) {
+       var = (lmm_variable_t)_var;
     if (var->bound > 0) {
       XBT_DEBUG("'%d'(%f) : %f (<=%f)", var->id_int, var->weight, var->value,
              var->bound);
@@ -513,9 +586,9 @@ void lmm_print(lmm_system_t sys)
 
 void lmm_solve(lmm_system_t sys)
 {
+  void *_var, *_cnst, *_cnst_next, *_elem;
   lmm_variable_t var = NULL;
   lmm_constraint_t cnst = NULL;
-  lmm_constraint_t cnst_next = NULL;
   lmm_element_t elem = NULL;
   xbt_swag_t cnst_list = NULL;
   xbt_swag_t var_list = NULL;
@@ -538,11 +611,12 @@ void lmm_solve(lmm_system_t sys)
 
   XBT_DEBUG("Active constraints : %d", xbt_swag_size(cnst_list));
   /* Init: Only modified code portions */
-  xbt_swag_foreach(cnst, cnst_list) {
+  xbt_swag_foreach(_cnst, cnst_list) {
+       cnst = (lmm_constraint_t)_cnst;
     elem_list = &(cnst->element_set);
     //XBT_DEBUG("Variable set : %d", xbt_swag_size(elem_list));
-    xbt_swag_foreach(elem, elem_list) {
-      var = elem->variable;
+    xbt_swag_foreach(_elem, elem_list) {
+      var = ((lmm_element_t)_elem)->variable;
       if (var->weight <= 0.0)
         break;
       var->value = 0.0;
@@ -555,14 +629,16 @@ void lmm_solve(lmm_system_t sys)
   saturated_constraint_set->size = 5;
   saturated_constraint_set->data = xbt_new0(int, saturated_constraint_set->size);
 
-  xbt_swag_foreach_safe(cnst, cnst_next, cnst_list) {
+  xbt_swag_foreach_safe(_cnst, _cnst_next, cnst_list) {
+       cnst = (lmm_constraint_t)_cnst;
     /* INIT */
     cnst->remaining = cnst->bound;
     if (cnst->remaining == 0)
       continue;
     cnst->usage = 0;
     elem_list = &(cnst->element_set);
-    xbt_swag_foreach(elem, elem_list) {
+    xbt_swag_foreach(_elem, elem_list) {
+      elem = (lmm_element_t)_elem;
       /* 0-weighted elements (ie, sleep actions) are at the end of the swag and we don't want to consider them */
       if (elem->variable->weight <= 0)
         break;
@@ -573,8 +649,9 @@ void lmm_solve(lmm_system_t sys)
           cnst->usage = elem->value / elem->variable->weight;
 
         make_elem_active(elem);
-        if (sys->keep_track)
-          xbt_swag_insert(elem->variable->id, sys->keep_track);
+        ActionPtr action = static_cast<ActionPtr>(elem->variable->id);
+        if (sys->keep_track && !action->is_linked())
+          sys->keep_track->push_back(*action);
       }
     }
     XBT_DEBUG("Constraint Usage '%d' : %f", cnst->id_int, cnst->usage);
@@ -600,7 +677,8 @@ void lmm_solve(lmm_system_t sys)
     /* Fix the variables that have to be */
     var_list = &(sys->saturated_variable_set);
 
-    xbt_swag_foreach(var, var_list) {
+    xbt_swag_foreach(_var, var_list) {
+      var = (lmm_variable_t)_var;
       if (var->weight <= 0.0)
         DIE_IMPOSSIBLE;
       /* First check if some of these variables have reach their upper
@@ -619,7 +697,7 @@ void lmm_solve(lmm_system_t sys)
     }
 
 
-    while ((var = xbt_swag_getFirst(var_list))) {
+    while ((var = (lmm_variable_t)xbt_swag_getFirst(var_list))) {
       int i;
 
       if (min_bound < 0) {
@@ -662,7 +740,8 @@ void lmm_solve(lmm_system_t sys)
           cnst->usage = 0.0;
           make_elem_inactive(elem);
           elem_list = &(cnst->element_set);
-          xbt_swag_foreach(elem, elem_list) {
+          xbt_swag_foreach(_elem, elem_list) {
+               elem = (lmm_element_t)_elem;
             if (elem->variable->weight <= 0 || elem->variable->value > 0)
               break;
             if (elem->value > 0)
@@ -791,12 +870,12 @@ void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var,
   XBT_OUT();
 }
 
-XBT_INLINE double lmm_get_variable_weight(lmm_variable_t var)
+double lmm_get_variable_weight(lmm_variable_t var)
 {
   return var->weight;
 }
 
-XBT_INLINE void lmm_update_constraint_bound(lmm_system_t sys,
+void lmm_update_constraint_bound(lmm_system_t sys,
                                             lmm_constraint_t cnst,
                                             double bound)
 {
@@ -805,7 +884,7 @@ XBT_INLINE void lmm_update_constraint_bound(lmm_system_t sys,
   cnst->bound = bound;
 }
 
-XBT_INLINE int lmm_constraint_used(lmm_system_t sys, lmm_constraint_t cnst)
+int lmm_constraint_used(lmm_system_t sys, lmm_constraint_t cnst)
 {
   return xbt_swag_belongs(cnst, &(sys->active_constraint_set));
 }
@@ -813,7 +892,7 @@ XBT_INLINE int lmm_constraint_used(lmm_system_t sys, lmm_constraint_t cnst)
 XBT_INLINE lmm_constraint_t lmm_get_first_active_constraint(lmm_system_t
                                                             sys)
 {
-  return xbt_swag_getFirst(&(sys->active_constraint_set));
+  return (lmm_constraint_t)xbt_swag_getFirst(&(sys->active_constraint_set));
 }
 
 XBT_INLINE lmm_constraint_t lmm_get_next_active_constraint(lmm_system_t
@@ -821,7 +900,7 @@ XBT_INLINE lmm_constraint_t lmm_get_next_active_constraint(lmm_system_t
                                                            lmm_constraint_t
                                                            cnst)
 {
-  return xbt_swag_getNext(cnst, (sys->active_constraint_set).offset);
+  return (lmm_constraint_t)xbt_swag_getNext(cnst, (sys->active_constraint_set).offset);
 }
 
 #ifdef HAVE_LATENCY_BOUND_TRACKING
@@ -845,10 +924,10 @@ XBT_INLINE int lmm_is_variable_limited_by_latency(lmm_variable_t var)
 static void lmm_update_modified_set_rec(lmm_system_t sys,
                                         lmm_constraint_t cnst)
 {
-  lmm_element_t elem;
+  void* _elem;
 
-  xbt_swag_foreach(elem, &cnst->element_set) {
-    lmm_variable_t var = elem->variable;
+  xbt_swag_foreach(_elem, &cnst->element_set) {
+    lmm_variable_t var = ((lmm_element_t)_elem)->variable;
     s_lmm_element_t *cnsts = var->cnsts;
     int i;
     for (i = 0; var->visited != sys->visited_counter
@@ -883,9 +962,9 @@ static void lmm_remove_all_modified_set(lmm_system_t sys)
 {
   if (++sys->visited_counter == 1) {
     /* the counter wrapped around, reset each variable->visited */
-    lmm_variable_t var;
-    xbt_swag_foreach(var, &sys->variable_set)
-      var->visited = 0;
+       void *_var;
+    xbt_swag_foreach(_var, &sys->variable_set)
+      ((lmm_variable_t)_var)->visited = 0;
   }
   xbt_swag_reset(&sys->modified_constraint_set);
 }
@@ -899,9 +978,11 @@ static void lmm_remove_all_modified_set(lmm_system_t sys)
 double lmm_constraint_get_usage(lmm_constraint_t cnst) {
    double usage = 0.0;
    xbt_swag_t elem_list = &(cnst->element_set);
+   void *_elem;
    lmm_element_t elem = NULL;
 
-   xbt_swag_foreach(elem, elem_list) {
+   xbt_swag_foreach(_elem, elem_list) {
+        elem = (lmm_element_t)_elem;
      /* 0-weighted elements (ie, sleep actions) are at the end of the swag and we don't want to consider them */
      if (elem->variable->weight <= 0)
        break;
similarity index 90%
rename from src/surf/maxmin_private.h
rename to src/surf/maxmin_private.hpp
index a753f96..d3ab7f9 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 #include "surf/maxmin.h"
 #include "xbt/swag.h"
 #include "xbt/mallocator.h"
+#include "surf_interface.hpp"
 
+/** @ingroup SURF_lmm
+ * @brief LMM element
+ */
 typedef struct lmm_element {
   /* hookup to constraint */
   s_xbt_swag_hookup_t element_set_hookup;
@@ -28,6 +32,9 @@ typedef struct lmm_constraint_light {
   lmm_constraint_t cnst;
 } s_lmm_constraint_light_t;
 
+/** @ingroup SURF_lmm
+ * @brief LMM constraint
+ */
 typedef struct lmm_constraint {
   /* hookup to system */
   s_xbt_swag_hookup_t constraint_set_hookup;
@@ -48,6 +55,9 @@ typedef struct lmm_constraint {
   lmm_constraint_light_t cnst_light;
 } s_lmm_constraint_t;
 
+/** @ingroup SURF_lmm
+ * @brief LMM variable
+ */
 typedef struct lmm_variable {
   /* hookup to system */
   s_xbt_swag_hookup_t variable_set_hookup;
@@ -71,6 +81,9 @@ typedef struct lmm_variable {
   /* \end{For Lagrange only} */
 } s_lmm_variable_t;
 
+/** @ingroup SURF_lmm
+ * @brief LMM system
+ */
 typedef struct lmm_system {
   int modified;
   int selective_update_active;  /* flag to update partially the system only selecting changed portions */
@@ -84,7 +97,7 @@ typedef struct lmm_system {
   s_xbt_swag_t saturated_variable_set;  /* a list of lmm_variable_t */
   s_xbt_swag_t saturated_constraint_set;        /* a list of lmm_constraint_t_t */
 
-  xbt_swag_t keep_track;
+  ActionLmmListPtr keep_track;
 
   xbt_mallocator_t variable_mallocator;
 } s_lmm_system_t;
@@ -101,6 +114,11 @@ typedef struct lmm_system {
   do { xbt_swag_remove(cnst, &sys->active_constraint_set);              \
     xbt_swag_remove(cnst, &sys->modified_constraint_set); } while (0)
 
+/** @ingroup SURF_lmm
+ * @brief Print informations about a lmm system
+ * 
+ * @param sys A lmm system
+ */
 void lmm_print(lmm_system_t sys);
 
 extern double (*func_f_def) (lmm_variable_t, double);
diff --git a/src/surf/network.c b/src/surf/network.c
deleted file mode 100644 (file)
index d521acf..0000000
+++ /dev/null
@@ -1,986 +0,0 @@
-
-/*
- * Network with improved management of tasks, IM (Improved Management).
- * Uses a heap to store actions so that the share_resources is faster.
- * This model automatically sets the selective update flag to 1 and is
- * highly dependent on the maxmin lmm module.
- */
-
-/* Copyright (c) 2004-2013. 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 "network_private.h"
-#include "xbt/log.h"
-#include "xbt/str.h"
-
-#include "surf_private.h"
-#include "xbt/dict.h"
-#include "maxmin_private.h"
-#include "surf/surfxml_parse_values.h"
-#include "surf/surf_resource.h"
-#include "surf/surf_resource_lmm.h"
-#include "simgrid/sg_config.h"
-
-#undef GENERIC_LMM_ACTION
-#undef GENERIC_ACTION
-#define GENERIC_LMM_ACTION(action) (action)->generic_lmm_action
-#define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action
-
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network, surf,
-                                "Logging specific to the SURF network module");
-
-surf_model_t surf_network_model = NULL;
-static void (*network_solve) (lmm_system_t) = NULL;
-
-xbt_dynar_t smpi_bw_factor = NULL;
-xbt_dynar_t smpi_lat_factor = NULL;
-
-typedef struct s_smpi_factor *smpi_factor_t;
-typedef struct s_smpi_factor {
-  long factor;
-  double value;
-} s_smpi_factor_t;
-
-
-double sg_sender_gap = 0.0;
-double sg_latency_factor = 1.0; /* default value; can be set by model or from command line */
-double sg_bandwidth_factor = 1.0;       /* default value; can be set by model or from command line */
-double sg_weight_S_parameter = 0.0;     /* default value; can be set by model or from command line */
-
-double sg_tcp_gamma = 0.0;
-int sg_network_crosstraffic = 0;
-
-xbt_dict_t gap_lookup = NULL;
-
-/******************************************************************************/
-/*                           Factors callbacks                                */
-/******************************************************************************/
-static double constant_latency_factor(double size)
-{
-  return sg_latency_factor;
-}
-
-static double constant_bandwidth_factor(double size)
-{
-  return sg_bandwidth_factor;
-}
-
-static double constant_bandwidth_constraint(double rate, double bound,
-                                            double size)
-{
-  return rate;
-}
-
-/**********************/
-/*   SMPI callbacks   */
-/**********************/
-
-static int factor_cmp(const void *pa, const void *pb)
-{
-  return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor);
-}
-
-
-static xbt_dynar_t parse_factor(const char *smpi_coef_string)
-{
-  char *value = NULL;
-  unsigned int iter = 0;
-  s_smpi_factor_t fact;
-  xbt_dynar_t smpi_factor, radical_elements, radical_elements2 = NULL;
-
-  smpi_factor = xbt_dynar_new(sizeof(s_smpi_factor_t), NULL);
-  radical_elements = xbt_str_split(smpi_coef_string, ";");
-  xbt_dynar_foreach(radical_elements, iter, value) {
-
-    radical_elements2 = xbt_str_split(value, ":");
-    if (xbt_dynar_length(radical_elements2) != 2)
-      xbt_die("Malformed radical for smpi factor!");
-    fact.factor = atol(xbt_dynar_get_as(radical_elements2, 0, char *));
-    fact.value = atof(xbt_dynar_get_as(radical_elements2, 1, char *));
-    xbt_dynar_push_as(smpi_factor, s_smpi_factor_t, fact);
-    XBT_DEBUG("smpi_factor:\t%ld : %f", fact.factor, fact.value);
-    xbt_dynar_free(&radical_elements2);
-  }
-  xbt_dynar_free(&radical_elements);
-  iter=0;
-  xbt_dynar_sort(smpi_factor, &factor_cmp);
-  xbt_dynar_foreach(smpi_factor, iter, fact) {
-    XBT_DEBUG("ordered smpi_factor:\t%ld : %f", fact.factor, fact.value);
-
-  }
-  return smpi_factor;
-}
-
-static double smpi_bandwidth_factor(double size)
-{
-  if (!smpi_bw_factor)
-    smpi_bw_factor =
-        parse_factor(sg_cfg_get_string("smpi/bw_factor"));
-
-  unsigned int iter = 0;
-  s_smpi_factor_t fact;
-  double current=1.0;
-  xbt_dynar_foreach(smpi_bw_factor, iter, fact) {
-    if (size <= fact.factor) {
-      XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current);
-      return current;
-    }else
-      current=fact.value;
-  }
-  XBT_DEBUG("%f > %ld return %f", size, fact.factor, current);
-
-  return current;
-}
-
-static double smpi_latency_factor(double size)
-{
-  if (!smpi_lat_factor)
-    smpi_lat_factor =
-        parse_factor(sg_cfg_get_string("smpi/lat_factor"));
-
-  unsigned int iter = 0;
-  s_smpi_factor_t fact;
-  double current=1.0;
-  xbt_dynar_foreach(smpi_lat_factor, iter, fact) {
-    if (size <= fact.factor) {
-      XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current);
-      return current;
-    }else
-      current=fact.value;
-  }
-  XBT_DEBUG("%f > %ld return %f", size, fact.factor, current);
-
-  return current;
-}
-
-/**--------- <copy/paste C code snippet in surf/network.c> -----------*/
-
-static double smpi_bandwidth_constraint(double rate, double bound,
-                                        double size)
-{
-  return rate < 0 ? bound : min(bound, rate * smpi_bandwidth_factor(size));
-}
-
-static double (*latency_factor_callback) (double) =
-    &constant_latency_factor;
-static double (*bandwidth_factor_callback) (double) =
-    &constant_bandwidth_factor;
-static double (*bandwidth_constraint_callback) (double, double, double) =
-    &constant_bandwidth_constraint;
-
-static void (*gap_append) (double, const link_CM02_t,
-                           surf_action_network_CM02_t) = NULL;
-
-static void *net_create_resource(const char *name,
-                                 double bw_initial,
-                                 tmgr_trace_t bw_trace,
-                                 double lat_initial,
-                                 tmgr_trace_t lat_trace,
-                                 e_surf_resource_state_t
-                                 state_initial,
-                                 tmgr_trace_t state_trace,
-                                 e_surf_link_sharing_policy_t
-                                 policy, xbt_dict_t properties)
-{
-  link_CM02_t nw_link = (link_CM02_t)
-      surf_resource_lmm_new(sizeof(s_link_CM02_t),
-                            surf_network_model, name, properties,
-                            surf_network_model->model_private->maxmin_system,
-                            sg_bandwidth_factor * bw_initial,
-                            history,
-                            state_initial, state_trace,
-                            bw_initial, bw_trace);
-
-  xbt_assert(!xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL),
-             "Link '%s' declared several times in the platform file.",
-             name);
-
-  nw_link->lat_current = lat_initial;
-  if (lat_trace)
-    nw_link->lat_event =
-        tmgr_history_add_trace(history, lat_trace, 0.0, 0, nw_link);
-
-  if (policy == SURF_LINK_FATPIPE)
-    lmm_constraint_shared(nw_link->lmm_resource.constraint);
-
-  xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, nw_link);
-  XBT_DEBUG("Create link '%s'",name);
-
-  return nw_link;
-}
-
-static void net_parse_link_init(sg_platf_link_cbarg_t link)
-{
-  if (link->policy == SURF_LINK_FULLDUPLEX) {
-    char *link_id;
-    link_id = bprintf("%s_UP", link->id);
-    net_create_resource(link_id,
-                        link->bandwidth,
-                        link->bandwidth_trace,
-                        link->latency,
-                        link->latency_trace,
-                        link->state,
-                        link->state_trace, link->policy, link->properties);
-    xbt_free(link_id);
-    link_id = bprintf("%s_DOWN", link->id);
-    net_create_resource(link_id,
-                        link->bandwidth,
-                        link->bandwidth_trace,
-                        link->latency,
-                        link->latency_trace,
-                        link->state,
-                        link->state_trace, link->policy, link->properties);
-    xbt_free(link_id);
-  } else {
-    net_create_resource(link->id,
-                        link->bandwidth,
-                        link->bandwidth_trace,
-                        link->latency,
-                        link->latency_trace,
-                        link->state,
-                        link->state_trace, link->policy, link->properties);
-  }
-}
-
-static void net_add_traces(void)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *trace_name, *elm;
-
-  static int called = 0;
-  if (called)
-    return;
-  called = 1;
-
-  /* connect all traces relative to network */
-  xbt_dict_foreach(trace_connect_list_link_avail, cursor, trace_name, elm) {
-    tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
-    link_CM02_t link = xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL);
-
-    xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
-               trace_name, elm);
-    xbt_assert(trace,
-               "Cannot connect trace %s to link %s: trace undefined",
-               trace_name, elm);
-
-    link->lmm_resource.state_event =
-        tmgr_history_add_trace(history, trace, 0.0, 0, link);
-  }
-
-  xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) {
-    tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
-    link_CM02_t link = xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL);
-
-    xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
-               trace_name, elm);
-    xbt_assert(trace,
-               "Cannot connect trace %s to link %s: trace undefined",
-               trace_name, elm);
-
-    link->lmm_resource.power.event =
-        tmgr_history_add_trace(history, trace, 0.0, 0, link);
-  }
-
-  xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) {
-    tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
-    link_CM02_t link = xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL);
-
-    xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
-               trace_name, elm);
-    xbt_assert(trace,
-               "Cannot connect trace %s to link %s: trace undefined",
-               trace_name, elm);
-
-    link->lat_event = tmgr_history_add_trace(history, trace, 0.0, 0, link);
-  }
-}
-
-static void net_define_callbacks(void)
-{
-  /* Figuring out the network links */
-  sg_platf_link_add_cb(net_parse_link_init);
-  sg_platf_postparse_add_cb(net_add_traces);
-}
-
-static int net_resource_used(void *resource_id)
-{
-  return lmm_constraint_used(surf_network_model->model_private->maxmin_system, ((surf_resource_lmm_t)
-                                                     resource_id)->
-                             constraint);
-}
-
-void net_action_recycle(surf_action_t action)
-{
-  return;
-}
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-int net_get_link_latency_limited(surf_action_t action)
-{
-  return action->latency_limited;
-}
-#endif
-
-static double net_share_resources_full(double now)
-{
-  s_surf_action_lmm_t s_action;
-  surf_action_network_CM02_t action = NULL;
-  xbt_swag_t running_actions =
-      surf_network_model->states.running_action_set;
-  double min;
-
-  min = generic_maxmin_share_resources(running_actions,
-                                       xbt_swag_offset(s_action,
-                                                       variable),
-                                                       surf_network_model->model_private->maxmin_system,
-                                       network_solve);
-
-#define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + xbt_swag_offset(s_action, variable)  )))
-
-  xbt_swag_foreach(action, running_actions) {
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-    if (lmm_is_variable_limited_by_latency(GENERIC_LMM_ACTION(action).variable)) {
-      action->latency_limited = 1;
-    } else {
-      action->latency_limited = 0;
-    }
-#endif
-    if (action->latency > 0) {
-      min = (min < 0) ? action->latency : min(min, action->latency);
-    }
-  }
-
-  XBT_DEBUG("Min of share resources %f", min);
-
-  return min;
-}
-
-static double net_share_resources_lazy(double now)
-{
-  return generic_share_resources_lazy(now, surf_network_model);
-}
-
-static void net_update_actions_state_full(double now, double delta)
-{
-  generic_update_actions_state_full(now, delta, surf_network_model);
-}
-
-static void net_update_actions_state_lazy(double now, double delta)
-{
-  generic_update_actions_state_lazy(now, delta, surf_network_model);
-}
-
-static void net_update_resource_state(void *id,
-                                      tmgr_trace_event_t event_type,
-                                      double value, double date)
-{
-  link_CM02_t nw_link = id;
-  /*   printf("[" "%g" "] Asking to update network card \"%s\" with value " */
-  /*     "%g" " for event %p\n", surf_get_clock(), nw_link->name, */
-  /*     value, event_type); */
-
-  if (event_type == nw_link->lmm_resource.power.event) {
-    double delta =
-        sg_weight_S_parameter / value - sg_weight_S_parameter /
-        (nw_link->lmm_resource.power.peak *
-         nw_link->lmm_resource.power.scale);
-    lmm_variable_t var = NULL;
-    lmm_element_t elem = NULL;
-    surf_action_network_CM02_t action = NULL;
-
-    nw_link->lmm_resource.power.peak = value;
-    lmm_update_constraint_bound(surf_network_model->model_private->maxmin_system,
-                                nw_link->lmm_resource.constraint,
-                                sg_bandwidth_factor *
-                                (nw_link->lmm_resource.power.peak *
-                                 nw_link->lmm_resource.power.scale));
-#ifdef HAVE_TRACING
-    TRACE_surf_link_set_bandwidth(date,
-                                  (char
-                                   *) (((nw_link->lmm_resource).
-                                        generic_resource).name),
-                                  sg_bandwidth_factor *
-                                  (nw_link->lmm_resource.power.peak *
-                                   nw_link->lmm_resource.power.scale));
-#endif
-    if (sg_weight_S_parameter > 0) {
-      while ((var = lmm_get_var_from_cnst
-              (surf_network_model->model_private->maxmin_system, nw_link->lmm_resource.constraint,
-               &elem))) {
-        action = lmm_variable_id(var);
-        action->weight += delta;
-        if (!(GENERIC_LMM_ACTION(action).suspended))
-          lmm_update_variable_weight(surf_network_model->model_private->maxmin_system,
-                                     GENERIC_LMM_ACTION(action).variable, action->weight);
-      }
-    }
-    if (tmgr_trace_event_free(event_type))
-      nw_link->lmm_resource.power.event = NULL;
-  } else if (event_type == nw_link->lat_event) {
-    double delta = value - nw_link->lat_current;
-    lmm_variable_t var = NULL;
-    lmm_element_t elem = NULL;
-    surf_action_network_CM02_t action = NULL;
-
-    nw_link->lat_current = value;
-    while ((var = lmm_get_var_from_cnst
-            (surf_network_model->model_private->maxmin_system, nw_link->lmm_resource.constraint,
-             &elem))) {
-      action = lmm_variable_id(var);
-      action->lat_current += delta;
-      action->weight += delta;
-      if (action->rate < 0)
-        lmm_update_variable_bound(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable,
-                                  sg_tcp_gamma / (2.0 *
-                                                  action->lat_current));
-      else {
-        lmm_update_variable_bound(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable,
-                                  min(action->rate,
-                                      sg_tcp_gamma / (2.0 *
-                                                      action->
-                                                      lat_current)));
-
-        if (action->rate < sg_tcp_gamma / (2.0 * action->lat_current)) {
-          XBT_INFO("Flow is limited BYBANDWIDTH");
-        } else {
-          XBT_INFO("Flow is limited BYLATENCY, latency of flow is %f",
-                   action->lat_current);
-        }
-      }
-      if (!(GENERIC_LMM_ACTION(action).suspended))
-        lmm_update_variable_weight(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable,
-                                   action->weight);
-
-    }
-    if (tmgr_trace_event_free(event_type))
-      nw_link->lat_event = NULL;
-  } else if (event_type == nw_link->lmm_resource.state_event) {
-    if (value > 0)
-      nw_link->lmm_resource.state_current = SURF_RESOURCE_ON;
-    else {
-      lmm_constraint_t cnst = nw_link->lmm_resource.constraint;
-      lmm_variable_t var = NULL;
-      lmm_element_t elem = NULL;
-
-      nw_link->lmm_resource.state_current = SURF_RESOURCE_OFF;
-      while ((var = lmm_get_var_from_cnst
-              (surf_network_model->model_private->maxmin_system, cnst, &elem))) {
-        surf_action_t action = lmm_variable_id(var);
-
-        if (surf_action_state_get(action) == SURF_ACTION_RUNNING ||
-            surf_action_state_get(action) == SURF_ACTION_READY) {
-          action->finish = date;
-          surf_network_model->action_state_set(action, SURF_ACTION_FAILED);
-        }
-      }
-    }
-    if (tmgr_trace_event_free(event_type))
-      nw_link->lmm_resource.state_event = NULL;
-  } else {
-    XBT_CRITICAL("Unknown event ! \n");
-    xbt_abort();
-  }
-
-  XBT_DEBUG
-      ("There were a resource state event, need to update actions related to the constraint (%p)",
-       nw_link->lmm_resource.constraint);
-  return;
-}
-
-
-static surf_action_t net_communicate(sg_routing_edge_t src,
-                                     sg_routing_edge_t dst,
-                                     double size, double rate)
-{
-  unsigned int i;
-  link_CM02_t link;
-  int failed = 0;
-  surf_action_network_CM02_t action = NULL;
-  double bandwidth_bound;
-  double latency = 0.0;
-  xbt_dynar_t back_route = NULL;
-  int constraints_per_variable = 0;
-
-  xbt_dynar_t route = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
-
-  XBT_IN("(%s,%s,%g,%g)", src->name, dst->name, size, rate);
-
-  routing_get_route_and_latency(src, dst, &route, &latency);
-  xbt_assert(!xbt_dynar_is_empty(route) || latency,
-             "You're trying to send data from %s to %s but there is no connection at all between these two hosts.",
-             src->name, dst->name);
-
-  xbt_dynar_foreach(route, i, link) {
-    if (link->lmm_resource.state_current == SURF_RESOURCE_OFF) {
-      failed = 1;
-      break;
-    }
-  }
-  if (sg_network_crosstraffic == 1) {
-    routing_get_route_and_latency(dst, src, &back_route, NULL);
-    xbt_dynar_foreach(back_route, i, link) {
-      if (link->lmm_resource.state_current == SURF_RESOURCE_OFF) {
-        failed = 1;
-        break;
-      }
-    }
-  }
-
-  action =
-      surf_action_new(sizeof(s_surf_action_network_CM02_t), size,
-                      surf_network_model, failed);
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-  action->latency_limited = 0;
-#endif
-  action->weight = action->latency = latency;
-
-  xbt_swag_insert(action, ((surf_action_t)action)->state_set);
-  action->rate = rate;
-  if (surf_network_model->model_private->update_mechanism == UM_LAZY) {
-    GENERIC_LMM_ACTION(action).index_heap = -1;
-    GENERIC_LMM_ACTION(action).last_update = surf_get_clock();
-  }
-
-  bandwidth_bound = -1.0;
-  if (sg_weight_S_parameter > 0) {
-    xbt_dynar_foreach(route, i, link) {
-      action->weight +=
-          sg_weight_S_parameter /
-          (link->lmm_resource.power.peak * link->lmm_resource.power.scale);
-    }
-  }
-  xbt_dynar_foreach(route, i, link) {
-    double bb = bandwidth_factor_callback(size) *
-        (link->lmm_resource.power.peak * link->lmm_resource.power.scale);
-    bandwidth_bound =
-        (bandwidth_bound < 0.0) ? bb : min(bandwidth_bound, bb);
-  }
-
-  action->lat_current = action->latency;
-  action->latency *= latency_factor_callback(size);
-  action->rate =
-      bandwidth_constraint_callback(action->rate, bandwidth_bound, size);
-  if (gap_append) {
-    xbt_assert(!xbt_dynar_is_empty(route),
-               "Using a model with a gap (e.g., SMPI) with a platform without links (e.g. vivaldi)!!!");
-
-    link = *(link_CM02_t *) xbt_dynar_get_ptr(route, 0);
-    gap_append(size, link, action);
-    XBT_DEBUG("Comm %p: %s -> %s gap=%f (lat=%f)",
-              action, src->name, dst->name, action->sender.gap,
-              action->latency);
-  }
-
-  constraints_per_variable = xbt_dynar_length(route);
-  if (back_route != NULL)
-    constraints_per_variable += xbt_dynar_length(back_route);
-
-  if (action->latency > 0) {
-    GENERIC_LMM_ACTION(action).variable =
-        lmm_variable_new(surf_network_model->model_private->maxmin_system, action, 0.0, -1.0,
-                         constraints_per_variable);
-    if (surf_network_model->model_private->update_mechanism == UM_LAZY) {
-      // add to the heap the event when the latency is payed
-      XBT_DEBUG("Added action (%p) one latency event at date %f", action,
-                action->latency + GENERIC_LMM_ACTION(action).last_update);
-      surf_action_lmm_heap_insert(surf_network_model->model_private->action_heap,(surf_action_lmm_t)action, action->latency + GENERIC_LMM_ACTION(action).last_update,
-                  xbt_dynar_is_empty(route) ? NORMAL : LATENCY);
-    }
-  } else
-    GENERIC_LMM_ACTION(action).variable =
-        lmm_variable_new(surf_network_model->model_private->maxmin_system, action, 1.0, -1.0,
-                         constraints_per_variable);
-
-  if (action->rate < 0) {
-    lmm_update_variable_bound(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable,
-                              (action->lat_current > 0) ?
-                              sg_tcp_gamma / (2.0 *
-                                              action->lat_current) : -1.0);
-  } else {
-    lmm_update_variable_bound(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable,
-                              (action->lat_current > 0) ?
-                              min(action->rate,
-                                  sg_tcp_gamma / (2.0 *
-                                                  action->lat_current))
-                              : action->rate);
-  }
-
-  xbt_dynar_foreach(route, i, link) {
-    lmm_expand(surf_network_model->model_private->maxmin_system, link->lmm_resource.constraint,
-               GENERIC_LMM_ACTION(action).variable, 1.0);
-  }
-
-  if (sg_network_crosstraffic == 1) {
-    XBT_DEBUG("Fullduplex active adding backward flow using 5%%");
-    xbt_dynar_foreach(back_route, i, link) {
-      lmm_expand(surf_network_model->model_private->maxmin_system, link->lmm_resource.constraint,
-                 GENERIC_LMM_ACTION(action).variable, .05);
-    }
-  }
-
-  xbt_dynar_free(&route);
-  XBT_OUT();
-
-  return (surf_action_t) action;
-}
-
-static xbt_dynar_t net_get_route(void *src, void *dst)
-{
-  xbt_dynar_t route = NULL;
-  routing_get_route_and_latency(src, dst, &route, NULL);
-  return route;
-}
-
-static double net_get_link_bandwidth(const void *link)
-{
-  surf_resource_lmm_t lmm = (surf_resource_lmm_t) link;
-  return lmm->power.peak * lmm->power.scale;
-}
-
-static double net_get_link_latency(const void *link)
-{
-  return ((link_CM02_t) link)->lat_current;
-}
-
-static int net_link_shared(const void *link)
-{
-  return
-      lmm_constraint_is_shared(((surf_resource_lmm_t) link)->constraint);
-}
-
-static void net_finalize(void)
-{
-  lmm_system_free(surf_network_model->model_private->maxmin_system);
-  surf_network_model->model_private->maxmin_system = NULL;
-
-  if (surf_network_model->model_private->update_mechanism == UM_LAZY) {
-    xbt_heap_free(surf_network_model->model_private->action_heap);
-    xbt_swag_free(surf_network_model->model_private->modified_set);
-  }
-
-  surf_model_exit(surf_network_model);
-  surf_network_model = NULL;
-
-  xbt_dict_free(&gap_lookup);
-  xbt_dynar_free(&smpi_bw_factor);
-  xbt_dynar_free(&smpi_lat_factor);
-}
-
-static void smpi_gap_append(double size, const link_CM02_t link,
-                            surf_action_network_CM02_t action)
-{
-  const char *src = link->lmm_resource.generic_resource.name;
-  xbt_fifo_t fifo;
-  //surf_action_network_CM02_t last_action;
-  //double bw;
-
-  if (sg_sender_gap > 0.0) {
-    if (!gap_lookup) {
-      gap_lookup = xbt_dict_new_homogeneous(NULL);
-    }
-    fifo = (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup, src);
-    action->sender.gap = 0.0;
-    if (fifo && xbt_fifo_size(fifo) > 0) {
-      /* Compute gap from last send */
-      /*last_action =
-          (surf_action_network_CM02_t)
-          xbt_fifo_get_item_content(xbt_fifo_get_last_item(fifo));*/
-     // bw = net_get_link_bandwidth(link);
-      action->sender.gap = sg_sender_gap;
-        /*  max(sg_sender_gap,last_action->sender.size / bw);*/
-      action->latency += action->sender.gap;
-    }
-    /* Append action as last send */
-    /*action->sender.link_name = link->lmm_resource.generic_resource.name;
-    fifo =
-        (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup,
-                                          action->sender.link_name);
-    if (!fifo) {
-      fifo = xbt_fifo_new();
-      xbt_dict_set(gap_lookup, action->sender.link_name, fifo, NULL);
-    }
-    action->sender.fifo_item = xbt_fifo_push(fifo, action);*/
-    action->sender.size = size;
-  }
-}
-
-static void smpi_gap_remove(surf_action_lmm_t lmm_action)
-{
-  xbt_fifo_t fifo;
-  size_t size;
-  surf_action_network_CM02_t action = (surf_action_network_CM02_t)(lmm_action);
-
-  if (sg_sender_gap > 0.0 && action->sender.link_name
-      && action->sender.fifo_item) {
-    fifo =
-        (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup,
-                                          action->sender.link_name);
-    xbt_fifo_remove_item(fifo, action->sender.fifo_item);
-    size = xbt_fifo_size(fifo);
-    if (size == 0) {
-      xbt_fifo_free(fifo);
-      xbt_dict_remove(gap_lookup, action->sender.link_name);
-      size = xbt_dict_length(gap_lookup);
-      if (size == 0) {
-        xbt_dict_free(&gap_lookup);
-      }
-    }
-  }
-}
-
-static void set_update_mechanism(void)
-{
-  char *optim = xbt_cfg_get_string(_sg_cfg_set, "network/optim");
-  int select =
-      xbt_cfg_get_boolean(_sg_cfg_set, "network/maxmin_selective_update");
-
-  if (!strcmp(optim, "Full")) {
-    surf_network_model->model_private->update_mechanism = UM_FULL;
-    surf_network_model->model_private->selective_update = select;
-  } else if (!strcmp(optim, "Lazy")) {
-    surf_network_model->model_private->update_mechanism = UM_LAZY;
-    surf_network_model->model_private->selective_update = 1;
-    xbt_assert((select == 1)
-               ||
-               (xbt_cfg_is_default_value
-                (_sg_cfg_set, "network/maxmin_selective_update")),
-               "Disabling selective update while using the lazy update mechanism is dumb!");
-  } else {
-    xbt_die("Unsupported optimization (%s) for this model", optim);
-  }
-}
-
-static void surf_network_model_init_internal(void)
-{
-  s_surf_action_network_CM02_t comm;
-  surf_network_model = surf_model_init();
-
-  set_update_mechanism();
-
-  surf_network_model->name = "network";
-  surf_network_model->action_unref = surf_action_unref;
-  surf_network_model->action_cancel = surf_action_cancel;
-  surf_network_model->action_recycle = net_action_recycle;
-
-  surf_network_model->get_remains = surf_action_get_remains;
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-  surf_network_model->get_latency_limited = net_get_link_latency_limited;
-#endif
-#ifdef HAVE_TRACING
-  surf_network_model->set_category = surf_action_set_category;
-#endif
-
-  surf_network_model->model_private->resource_used = net_resource_used;
-  if (surf_network_model->model_private->update_mechanism == UM_LAZY) {
-    surf_network_model->model_private->share_resources =
-        net_share_resources_lazy;
-    surf_network_model->model_private->update_actions_state =
-        net_update_actions_state_lazy;
-  } else if (surf_network_model->model_private->update_mechanism == UM_FULL) {
-    surf_network_model->model_private->share_resources =
-        net_share_resources_full;
-    surf_network_model->model_private->update_actions_state =
-        net_update_actions_state_full;
-  }
-
-  surf_network_model->model_private->update_resource_state =
-      net_update_resource_state;
-  surf_network_model->model_private->finalize = net_finalize;
-
-  surf_network_model->suspend = surf_action_suspend;
-  surf_network_model->resume = surf_action_resume;
-  surf_network_model->is_suspended = surf_action_is_suspended;
-  surf_cpu_model->set_max_duration = surf_action_set_max_duration;
-
-  surf_network_model->extension.network.communicate = net_communicate;
-  surf_network_model->extension.network.get_route = net_get_route;
-  surf_network_model->extension.network.get_link_bandwidth =
-      net_get_link_bandwidth;
-  surf_network_model->extension.network.get_link_latency =
-      net_get_link_latency;
-  surf_network_model->extension.network.link_shared = net_link_shared;
-  surf_network_model->extension.network.add_traces = net_add_traces;
-
-  if (!surf_network_model->model_private->maxmin_system)
-    surf_network_model->model_private->maxmin_system = lmm_system_new(surf_network_model->model_private->selective_update);
-
-  routing_model_create(net_create_resource("__loopback__",
-                                           498000000, NULL, 0.000015, NULL,
-                                           SURF_RESOURCE_ON, NULL,
-                                           SURF_LINK_FATPIPE, NULL));
-
-  if (surf_network_model->model_private->update_mechanism == UM_LAZY) {
-    surf_network_model->model_private->action_heap = xbt_heap_new(8, NULL);
-    xbt_heap_set_update_callback(surf_network_model->model_private->action_heap,
-                                 surf_action_lmm_update_index_heap);
-    surf_network_model->model_private->modified_set =
-        xbt_swag_new(xbt_swag_offset(comm, generic_lmm_action.action_list_hookup));
-    surf_network_model->model_private->maxmin_system->keep_track = surf_network_model->model_private->modified_set;
-  }
-
-  surf_network_model->gap_remove = NULL;
-}
-
-/************************************************************************/
-/* New model based on LV08 and experimental results of MPI ping-pongs   */
-/************************************************************************/
-/* @Inproceedings{smpi_ipdps, */
-/*  author={Pierre-Nicolas Clauss and Mark Stillwell and Stéphane Genaud and Frédéric Suter and Henri Casanova and Martin Quinson}, */
-/*  title={Single Node On-Line Simulation of {MPI} Applications with SMPI}, */
-/*  booktitle={25th IEEE International Parallel and Distributed Processing Symposium (IPDPS'11)}, */
-/*  address={Anchorage (Alaska) USA}, */
-/*  month=may, */
-/*  year={2011} */
-/*  } */
-void surf_network_model_init_SMPI(void)
-{
-
-  if (surf_network_model)
-    return;
-
-  surf_network_model_init_internal();
-  latency_factor_callback = &smpi_latency_factor;
-  bandwidth_factor_callback = &smpi_bandwidth_factor;
-  bandwidth_constraint_callback = &smpi_bandwidth_constraint;
-  gap_append = &smpi_gap_append;
-  surf_network_model->gap_remove = &smpi_gap_remove;
-  net_define_callbacks();
-  xbt_dynar_push(model_list, &surf_network_model);
-  network_solve = lmm_solve;
-
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/sender_gap", 10e-6);
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
-}
-
-/************************************************************************/
-/* New model based on optimizations discussed during Pedro Velho's thesis*/
-/************************************************************************/
-/* @techreport{VELHO:2011:HAL-00646896:1, */
-/*      url = {http://hal.inria.fr/hal-00646896/en/}, */
-/*      title = {{Flow-level network models: have we reached the limits?}}, */
-/*      author = {Velho, Pedro and Schnorr, Lucas and Casanova, Henri and Legrand, Arnaud}, */
-/*      type = {Rapport de recherche}, */
-/*      institution = {INRIA}, */
-/*      number = {RR-7821}, */
-/*      year = {2011}, */
-/*      month = Nov, */
-/*      pdf = {http://hal.inria.fr/hal-00646896/PDF/rr-validity.pdf}, */
-/*  } */
-void surf_network_model_init_LegrandVelho(void)
-{
-  if (surf_network_model)
-    return;
-
-  surf_network_model_init_internal();
-  net_define_callbacks();
-  xbt_dynar_push(model_list, &surf_network_model);
-  network_solve = lmm_solve;
-
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor",
-                            13.01);
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
-                            0.97);
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 20537);
-}
-
-/***************************************************************************/
-/* The nice TCP sharing model designed by Loris Marchal and Henri Casanova */
-/***************************************************************************/
-/* @TechReport{      rr-lip2002-40, */
-/*   author        = {Henri Casanova and Loris Marchal}, */
-/*   institution   = {LIP}, */
-/*   title         = {A Network Model for Simulation of Grid Application}, */
-/*   number        = {2002-40}, */
-/*   month         = {oct}, */
-/*   year          = {2002} */
-/* } */
-void surf_network_model_init_CM02(void)
-{
-
-  if (surf_network_model)
-    return;
-
-  surf_network_model_init_internal();
-  net_define_callbacks();
-  xbt_dynar_push(model_list, &surf_network_model);
-  network_solve = lmm_solve;
-
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 1.0);
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
-                            1.0);
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 0.0);
-}
-
-/***************************************************************************/
-/* The models from Steven H. Low                                           */
-/***************************************************************************/
-/* @article{Low03,                                                         */
-/*   author={Steven H. Low},                                               */
-/*   title={A Duality Model of {TCP} and Queue Management Algorithms},     */
-/*   year={2003},                                                          */
-/*   journal={{IEEE/ACM} Transactions on Networking},                      */
-/*    volume={11}, number={4},                                             */
-/*  }                                                                      */
-void surf_network_model_init_Reno(void)
-{
-  if (surf_network_model)
-    return;
-
-  surf_network_model_init_internal();
-  net_define_callbacks();
-
-  xbt_dynar_push(model_list, &surf_network_model);
-  lmm_set_default_protocol_function(func_reno_f, func_reno_fp,
-                                    func_reno_fpi);
-  network_solve = lagrange_solve;
-
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4);
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
-                            0.92);
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
-}
-
-
-void surf_network_model_init_Reno2(void)
-{
-  if (surf_network_model)
-    return;
-
-  surf_network_model_init_internal();
-  net_define_callbacks();
-
-  xbt_dynar_push(model_list, &surf_network_model);
-  lmm_set_default_protocol_function(func_reno2_f, func_reno2_fp,
-                                    func_reno2_fpi);
-  network_solve = lagrange_solve;
-
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4);
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
-                            0.92);
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S_parameter",
-                            8775);
-}
-
-void surf_network_model_init_Vegas(void)
-{
-  if (surf_network_model)
-    return;
-
-  surf_network_model_init_internal();
-  net_define_callbacks();
-
-  xbt_dynar_push(model_list, &surf_network_model);
-  lmm_set_default_protocol_function(func_vegas_f, func_vegas_fp,
-                                    func_vegas_fpi);
-  network_solve = lagrange_solve;
-
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4);
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
-                            0.92);
-  xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
-}
diff --git a/src/surf/network_cm02.cpp b/src/surf/network_cm02.cpp
new file mode 100644 (file)
index 0000000..b80ddfd
--- /dev/null
@@ -0,0 +1,662 @@
+/* Copyright (c) 2013-2014. 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 "network_cm02.hpp"
+#include "maxmin_private.hpp"
+#include "simgrid/sg_config.h"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network);
+
+double sg_sender_gap = 0.0;
+double sg_latency_factor = 1.0; /* default value; can be set by model or from command line */
+double sg_bandwidth_factor = 1.0;       /* default value; can be set by model or from command line */
+double sg_weight_S_parameter = 0.0;     /* default value; can be set by model or from command line */
+
+double sg_tcp_gamma = 0.0;
+int sg_network_crosstraffic = 0;
+
+/*************
+ * CallBacks *
+ *************/
+
+static void net_parse_link_init(sg_platf_link_cbarg_t link){
+  if (link->policy == SURF_LINK_FULLDUPLEX) {
+    char *link_id;
+    link_id = bprintf("%s_UP", link->id);
+    surf_network_model->createResource(link_id,
+                      link->bandwidth,
+                      link->bandwidth_trace,
+                      link->latency,
+                      link->latency_trace,
+                      link->state,
+                      link->state_trace, link->policy, link->properties);
+    xbt_free(link_id);
+    link_id = bprintf("%s_DOWN", link->id);
+    surf_network_model->createResource(link_id,
+                      link->bandwidth,
+                      link->bandwidth_trace,
+                      link->latency,
+                      link->latency_trace,
+                      link->state,
+                      link->state_trace, link->policy, link->properties);
+    xbt_free(link_id);
+  } else {
+       surf_network_model->createResource(link->id,
+                      link->bandwidth,
+                      link->bandwidth_trace,
+                      link->latency,
+                      link->latency_trace,
+                      link->state,
+                      link->state_trace, link->policy, link->properties);
+  }
+}
+
+static void net_add_traces(void){
+  xbt_dict_cursor_t cursor = NULL;
+  char *trace_name, *elm;
+
+  static int called = 0;
+  if (called)
+    return;
+  called = 1;
+
+  /* connect all traces relative to network */
+  xbt_dict_foreach(trace_connect_list_link_avail, cursor, trace_name, elm) {
+    tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+    NetworkCm02LinkPtr link = static_cast<NetworkCm02LinkPtr>(
+                                   xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL));
+
+    xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
+               trace_name, elm);
+    xbt_assert(trace,
+               "Cannot connect trace %s to link %s: trace undefined",
+               trace_name, elm);
+
+    link->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(link));
+  }
+
+  xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) {
+    tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+    NetworkCm02LinkPtr link = static_cast<NetworkCm02LinkPtr>(
+                                xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL));
+
+    xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
+               trace_name, elm);
+    xbt_assert(trace,
+               "Cannot connect trace %s to link %s: trace undefined",
+               trace_name, elm);
+
+    link->p_power.event = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(link));
+  }
+
+  xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) {
+    tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+    NetworkCm02LinkPtr link = static_cast<NetworkCm02LinkPtr>(
+                                   xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL));
+
+    xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
+               trace_name, elm);
+    xbt_assert(trace,
+               "Cannot connect trace %s to link %s: trace undefined",
+               trace_name, elm);
+
+    link->p_latEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(link));
+  }
+}
+
+void net_define_callbacks(void)
+{
+  /* Figuring out the network links */
+  sg_platf_link_add_cb(net_parse_link_init);
+  sg_platf_postparse_add_cb(net_add_traces);
+}
+
+/*********
+ * Model *
+ *********/
+
+/************************************************************************/
+/* New model based on optimizations discussed during Pedro Velho's thesis*/
+/************************************************************************/
+/* @techreport{VELHO:2011:HAL-00646896:1, */
+/*      url = {http://hal.inria.fr/hal-00646896/en/}, */
+/*      title = {{Flow-level network models: have we reached the limits?}}, */
+/*      author = {Velho, Pedro and Schnorr, Lucas and Casanova, Henri and Legrand, Arnaud}, */
+/*      type = {Rapport de recherche}, */
+/*      institution = {INRIA}, */
+/*      number = {RR-7821}, */
+/*      year = {2011}, */
+/*      month = Nov, */
+/*      pdf = {http://hal.inria.fr/hal-00646896/PDF/rr-validity.pdf}, */
+/*  } */
+void surf_network_model_init_LegrandVelho(void)
+{
+  if (surf_network_model)
+    return;
+
+  surf_network_model = new NetworkCm02Model();
+  net_define_callbacks();
+  ModelPtr model = static_cast<ModelPtr>(surf_network_model);
+  xbt_dynar_push(model_list, &model);
+
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor",
+                            13.01);
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
+                            0.97);
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 20537);
+}
+
+/***************************************************************************/
+/* The nice TCP sharing model designed by Loris Marchal and Henri Casanova */
+/***************************************************************************/
+/* @TechReport{      rr-lip2002-40, */
+/*   author        = {Henri Casanova and Loris Marchal}, */
+/*   institution   = {LIP}, */
+/*   title         = {A Network Model for Simulation of Grid Application}, */
+/*   number        = {2002-40}, */
+/*   month         = {oct}, */
+/*   year          = {2002} */
+/* } */
+void surf_network_model_init_CM02(void)
+{
+
+  if (surf_network_model)
+    return;
+
+  surf_network_model = new NetworkCm02Model();
+  net_define_callbacks();
+  ModelPtr model = static_cast<ModelPtr>(surf_network_model);
+  xbt_dynar_push(model_list, &model);
+
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 1.0);
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
+                            1.0);
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 0.0);
+}
+
+/***************************************************************************/
+/* The models from Steven H. Low                                           */
+/***************************************************************************/
+/* @article{Low03,                                                         */
+/*   author={Steven H. Low},                                               */
+/*   title={A Duality Model of {TCP} and Queue Management Algorithms},     */
+/*   year={2003},                                                          */
+/*   journal={{IEEE/ACM} Transactions on Networking},                      */
+/*    volume={11}, number={4},                                             */
+/*  }                                                                      */
+void surf_network_model_init_Reno(void)
+{
+  if (surf_network_model)
+    return;
+
+  surf_network_model = new NetworkCm02Model();
+  net_define_callbacks();
+  ModelPtr model = static_cast<ModelPtr>(surf_network_model);
+  xbt_dynar_push(model_list, &model);
+  lmm_set_default_protocol_function(func_reno_f, func_reno_fp,
+                                    func_reno_fpi);
+  surf_network_model->f_networkSolve = lagrange_solve;
+
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4);
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
+                            0.92);
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
+}
+
+
+void surf_network_model_init_Reno2(void)
+{
+  if (surf_network_model)
+    return;
+
+  surf_network_model = new NetworkCm02Model();
+  net_define_callbacks();
+  ModelPtr model = static_cast<ModelPtr>(surf_network_model);
+  xbt_dynar_push(model_list, &model);
+  lmm_set_default_protocol_function(func_reno2_f, func_reno2_fp,
+                                    func_reno2_fpi);
+  surf_network_model->f_networkSolve = lagrange_solve;
+
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4);
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
+                            0.92);
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S_parameter",
+                            8775);
+}
+
+void surf_network_model_init_Vegas(void)
+{
+  if (surf_network_model)
+    return;
+
+  surf_network_model = new NetworkCm02Model();
+  net_define_callbacks();
+  ModelPtr model = static_cast<ModelPtr>(surf_network_model);
+  xbt_dynar_push(model_list, &model);
+  lmm_set_default_protocol_function(func_vegas_f, func_vegas_fp,
+                                    func_vegas_fpi);
+  surf_network_model->f_networkSolve = lagrange_solve;
+
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4);
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
+                            0.92);
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
+}
+
+void NetworkCm02Model::initialize()
+{
+  char *optim = xbt_cfg_get_string(_sg_cfg_set, "network/optim");
+  int select =
+      xbt_cfg_get_boolean(_sg_cfg_set, "network/maxmin_selective_update");
+
+  if (!strcmp(optim, "Full")) {
+    p_updateMechanism = UM_FULL;
+    m_selectiveUpdate = select;
+  } else if (!strcmp(optim, "Lazy")) {
+    p_updateMechanism = UM_LAZY;
+    m_selectiveUpdate = 1;
+    xbt_assert((select == 1)
+               ||
+               (xbt_cfg_is_default_value
+                (_sg_cfg_set, "network/maxmin_selective_update")),
+               "Disabling selective update while using the lazy update mechanism is dumb!");
+  } else {
+    xbt_die("Unsupported optimization (%s) for this model", optim);
+  }
+
+  if (!p_maxminSystem)
+       p_maxminSystem = lmm_system_new(m_selectiveUpdate);
+
+  const char* lb_name = "__loopback__";
+  routing_model_create(static_cast<ResourcePtr>(createResource(lb_name,
+                                                  498000000, NULL, 0.000015, NULL,
+                                                  SURF_RESOURCE_ON, NULL,
+                                                  SURF_LINK_FATPIPE, NULL)));
+
+  if (p_updateMechanism == UM_LAZY) {
+       p_actionHeap = xbt_heap_new(8, NULL);
+       xbt_heap_set_update_callback(p_actionHeap, surf_action_lmm_update_index_heap);
+       p_modifiedSet = new ActionLmmList();
+       p_maxminSystem->keep_track = p_modifiedSet;
+  }
+
+  m_haveGap = false;
+}
+
+NetworkLinkPtr NetworkCm02Model::createResource(const char *name,
+                                 double bw_initial,
+                                 tmgr_trace_t bw_trace,
+                                 double lat_initial,
+                                 tmgr_trace_t lat_trace,
+                                 e_surf_resource_state_t state_initial,
+                                 tmgr_trace_t state_trace,
+                                 e_surf_link_sharing_policy_t policy,
+                                 xbt_dict_t properties)
+{
+  xbt_assert(!xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL),
+             "Link '%s' declared several times in the platform file.",
+             name);
+
+  NetworkCm02LinkPtr nw_link =
+                 new NetworkCm02Link(this, name, properties, p_maxminSystem, sg_bandwidth_factor * bw_initial, history,
+                                                state_initial, state_trace, bw_initial, bw_trace, lat_initial, lat_trace, policy);
+
+
+  xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, static_cast<ResourcePtr>(nw_link));
+  XBT_DEBUG("Create link '%s'",name);
+
+  return nw_link;
+}
+
+void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/)
+{
+  NetworkCm02ActionPtr action;
+  while ((xbt_heap_size(p_actionHeap) > 0)
+         && (double_equals(xbt_heap_maxkey(p_actionHeap), now))) {
+    action = (NetworkCm02ActionPtr) xbt_heap_pop(p_actionHeap);
+    XBT_DEBUG("Something happened to action %p", action);
+#ifdef HAVE_TRACING
+    if (TRACE_is_enabled()) {
+      int n = lmm_get_number_of_cnst_from_var(p_maxminSystem, action->getVariable());
+      int i;
+      for (i = 0; i < n; i++){
+        lmm_constraint_t constraint = lmm_get_cnst_from_var(p_maxminSystem,
+                                                            action->getVariable(),
+                                                            i);
+        NetworkCm02LinkPtr link = static_cast<NetworkCm02LinkPtr>(lmm_constraint_id(constraint));
+        TRACE_surf_link_set_utilization(link->getName(),
+                                        action->getCategory(),
+                                        (lmm_variable_getvalue(action->getVariable())*
+                                            lmm_get_cnst_weight_from_var(p_maxminSystem,
+                                                action->getVariable(),
+                                                i)),
+                                        action->getLastUpdate(),
+                                        now - action->getLastUpdate());
+      }
+    }
+#endif
+
+    // if I am wearing a latency hat
+    if (action->getHat() == LATENCY) {
+      XBT_DEBUG("Latency paid for action %p. Activating", action);
+      lmm_update_variable_weight(p_maxminSystem, action->getVariable(), action->m_weight);
+      action->heapRemove(p_actionHeap);
+      action->refreshLastUpdate();
+
+        // if I am wearing a max_duration or normal hat
+    } else if (action->getHat() == MAX_DURATION ||
+        action->getHat() == NORMAL) {
+        // no need to communicate anymore
+        // assume that flows that reached max_duration have remaining of 0
+      XBT_DEBUG("Action %p finished", action);
+      action->setRemains(0);
+      action->finish();
+      action->setState(SURF_ACTION_DONE);
+      action->heapRemove(p_actionHeap);
+
+      action->gapRemove();
+    }
+  }
+  return;
+}
+
+ActionPtr NetworkCm02Model::communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+                                                double size, double rate)
+{
+  unsigned int i;
+  void *_link;
+  NetworkCm02LinkPtr link;
+  int failed = 0;
+  NetworkCm02ActionPtr action = NULL;
+  double bandwidth_bound;
+  double latency = 0.0;
+  xbt_dynar_t back_route = NULL;
+  int constraints_per_variable = 0;
+
+  xbt_dynar_t route = xbt_dynar_new(sizeof(RoutingEdgePtr), NULL);
+
+  XBT_IN("(%s,%s,%g,%g)", src->getName(), dst->getName(), size, rate);
+
+  routing_platf->getRouteAndLatency(src, dst, &route, &latency);
+  xbt_assert(!xbt_dynar_is_empty(route) || latency,
+             "You're trying to send data from %s to %s but there is no connection at all between these two hosts.",
+             src->getName(), dst->getName());
+
+  xbt_dynar_foreach(route, i, _link) {
+       link = static_cast<NetworkCm02LinkPtr>(_link);
+    if (link->getState() == SURF_RESOURCE_OFF) {
+      failed = 1;
+      break;
+    }
+  }
+  if (sg_network_crosstraffic == 1) {
+         routing_platf->getRouteAndLatency(dst, src, &back_route, NULL);
+    xbt_dynar_foreach(back_route, i, _link) {
+      link = static_cast<NetworkCm02LinkPtr>(_link);
+      if (link->getState() == SURF_RESOURCE_OFF) {
+        failed = 1;
+        break;
+      }
+    }
+  }
+
+  action = new NetworkCm02Action(this, size, failed);
+
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+  action->m_latencyLimited = 0;
+#endif
+  action->m_weight = action->m_latency = latency;
+
+  action->m_rate = rate;
+  if (p_updateMechanism == UM_LAZY) {
+    action->m_indexHeap = -1;
+    action->m_lastUpdate = surf_get_clock();
+  }
+
+  bandwidth_bound = -1.0;
+  if (sg_weight_S_parameter > 0) {
+    xbt_dynar_foreach(route, i, _link) {
+      link = static_cast<NetworkCm02LinkPtr>(_link);
+      action->m_weight += sg_weight_S_parameter / link->getBandwidth();
+    }
+  }
+  xbt_dynar_foreach(route, i, _link) {
+       link = static_cast<NetworkCm02LinkPtr>(_link);
+    double bb = bandwidthFactor(size) * link->getBandwidth(); //(link->p_power.peak * link->p_power.scale);
+    bandwidth_bound =
+        (bandwidth_bound < 0.0) ? bb : min(bandwidth_bound, bb);
+  }
+
+  action->m_latCurrent = action->m_latency;
+  action->m_latency *= latencyFactor(size);
+  action->m_rate = bandwidthConstraint(action->m_rate, bandwidth_bound, size);
+  if (m_haveGap) {
+    xbt_assert(!xbt_dynar_is_empty(route),
+               "Using a model with a gap (e.g., SMPI) with a platform without links (e.g. vivaldi)!!!");
+
+    link = *static_cast<NetworkCm02LinkPtr *>(xbt_dynar_get_ptr(route, 0));
+    gapAppend(size, link, action);
+    XBT_DEBUG("Comm %p: %s -> %s gap=%f (lat=%f)",
+              action, src->getName(), dst->getName(), action->m_senderGap,
+              action->m_latency);
+  }
+
+  constraints_per_variable = xbt_dynar_length(route);
+  if (back_route != NULL)
+    constraints_per_variable += xbt_dynar_length(back_route);
+
+  if (action->m_latency > 0) {
+    action->p_variable = lmm_variable_new(p_maxminSystem, static_cast<ActionPtr>(action), 0.0, -1.0,
+                         constraints_per_variable);
+    if (p_updateMechanism == UM_LAZY) {
+      // add to the heap the event when the latency is payed
+      XBT_DEBUG("Added action (%p) one latency event at date %f", action,
+                action->m_latency + action->m_lastUpdate);
+      action->heapInsert(p_actionHeap, action->m_latency + action->m_lastUpdate, xbt_dynar_is_empty(route) ? NORMAL : LATENCY);
+    }
+  } else
+    action->p_variable = lmm_variable_new(p_maxminSystem, static_cast<ActionPtr>(action), 1.0, -1.0, constraints_per_variable);
+
+  if (action->m_rate < 0) {
+    lmm_update_variable_bound(p_maxminSystem, action->getVariable(), (action->m_latCurrent > 0) ? sg_tcp_gamma / (2.0 * action->m_latCurrent) : -1.0);
+  } else {
+    lmm_update_variable_bound(p_maxminSystem, action->getVariable(), (action->m_latCurrent > 0) ? min(action->m_rate, sg_tcp_gamma / (2.0 * action->m_latCurrent)) : action->m_rate);
+  }
+
+  xbt_dynar_foreach(route, i, _link) {
+       link = static_cast<NetworkCm02LinkPtr>(_link);
+    lmm_expand(p_maxminSystem, link->getConstraint(), action->getVariable(), 1.0);
+  }
+
+  if (sg_network_crosstraffic == 1) {
+    XBT_DEBUG("Fullduplex active adding backward flow using 5%%");
+    xbt_dynar_foreach(back_route, i, _link) {
+      link = static_cast<NetworkCm02LinkPtr>(_link);
+      lmm_expand(p_maxminSystem, link->getConstraint(), action->getVariable(), .05);
+    }
+  }
+
+  xbt_dynar_free(&route);
+  XBT_OUT();
+
+  return action;
+}
+
+
+
+/************
+ * Resource *
+ ************/
+NetworkCm02Link::NetworkCm02Link(NetworkCm02ModelPtr model, const char *name, xbt_dict_t props,
+                                  lmm_system_t system,
+                                  double constraint_value,
+                                  tmgr_history_t history,
+                                  e_surf_resource_state_t state_init,
+                                  tmgr_trace_t state_trace,
+                                  double metric_peak,
+                                  tmgr_trace_t metric_trace,
+                                  double lat_initial,
+                                  tmgr_trace_t lat_trace,
+                                  e_surf_link_sharing_policy_t policy)
+: NetworkLink(model, name, props, lmm_constraint_new(system, this, constraint_value), history, state_trace)
+{
+  setState(state_init);
+
+  p_power.scale = 1.0;
+  p_power.peak = metric_peak;
+  if (metric_trace)
+    p_power.event = tmgr_history_add_trace(history, metric_trace, 0.0, 0, static_cast<ResourcePtr>(this));
+  else
+    p_power.event = NULL;
+
+  m_latCurrent = lat_initial;
+  if (lat_trace)
+       p_latEvent = tmgr_history_add_trace(history, lat_trace, 0.0, 0, static_cast<ResourcePtr>(this));
+
+  if (policy == SURF_LINK_FATPIPE)
+       lmm_constraint_shared(getConstraint());
+}
+
+
+
+void NetworkCm02Link::updateState(tmgr_trace_event_t event_type,
+                                      double value, double date)
+{
+  /*   printf("[" "%g" "] Asking to update network card \"%s\" with value " */
+  /*     "%g" " for event %p\n", surf_get_clock(), nw_link->name, */
+  /*     value, event_type); */
+
+  if (event_type == p_power.event) {
+    double delta =
+        sg_weight_S_parameter / value - sg_weight_S_parameter /
+        (p_power.peak * p_power.scale);
+    lmm_variable_t var = NULL;
+    lmm_element_t elem = NULL;
+    NetworkCm02ActionPtr action = NULL;
+
+    p_power.peak = value;
+    lmm_update_constraint_bound(getModel()->getMaxminSystem(),
+                                   getConstraint(),
+                                sg_bandwidth_factor *
+                                (p_power.peak * p_power.scale));
+#ifdef HAVE_TRACING
+    TRACE_surf_link_set_bandwidth(date, getName(), sg_bandwidth_factor * p_power.peak * p_power.scale);
+#endif
+    if (sg_weight_S_parameter > 0) {
+      while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), getConstraint(), &elem))) {
+        action = (NetworkCm02ActionPtr) lmm_variable_id(var);
+        action->m_weight += delta;
+        if (!action->isSuspended())
+          lmm_update_variable_weight(getModel()->getMaxminSystem(), action->getVariable(), action->m_weight);
+      }
+    }
+    if (tmgr_trace_event_free(event_type))
+      p_power.event = NULL;
+  } else if (event_type == p_latEvent) {
+    double delta = value - m_latCurrent;
+    lmm_variable_t var = NULL;
+    lmm_element_t elem = NULL;
+    NetworkCm02ActionPtr action = NULL;
+
+    m_latCurrent = value;
+    while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), getConstraint(), &elem))) {
+      action = (NetworkCm02ActionPtr) lmm_variable_id(var);
+      action->m_latCurrent += delta;
+      action->m_weight += delta;
+      if (action->m_rate < 0)
+        lmm_update_variable_bound(getModel()->getMaxminSystem(), action->getVariable(), sg_tcp_gamma / (2.0 * action->m_latCurrent));
+      else {
+        lmm_update_variable_bound(getModel()->getMaxminSystem(), action->getVariable(),
+                                  min(action->m_rate, sg_tcp_gamma / (2.0 * action->m_latCurrent)));
+
+        if (action->m_rate < sg_tcp_gamma / (2.0 * action->m_latCurrent)) {
+          XBT_INFO("Flow is limited BYBANDWIDTH");
+        } else {
+          XBT_INFO("Flow is limited BYLATENCY, latency of flow is %f",
+                   action->m_latCurrent);
+        }
+      }
+      if (!action->isSuspended())
+        lmm_update_variable_weight(getModel()->getMaxminSystem(), action->getVariable(), action->m_weight);
+
+    }
+    if (tmgr_trace_event_free(event_type))
+      p_latEvent = NULL;
+  } else if (event_type == p_stateEvent) {
+    if (value > 0)
+      setState(SURF_RESOURCE_ON);
+    else {
+      lmm_constraint_t cnst = getConstraint();
+      lmm_variable_t var = NULL;
+      lmm_element_t elem = NULL;
+
+      setState(SURF_RESOURCE_OFF);
+      while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), cnst, &elem))) {
+        ActionPtr action = (ActionPtr) lmm_variable_id(var);
+
+        if (action->getState() == SURF_ACTION_RUNNING ||
+            action->getState() == SURF_ACTION_READY) {
+          action->setFinishTime(date);
+          action->setState(SURF_ACTION_FAILED);
+        }
+      }
+    }
+    if (tmgr_trace_event_free(event_type))
+      p_stateEvent = NULL;
+  } else {
+    XBT_CRITICAL("Unknown event ! \n");
+    xbt_abort();
+  }
+
+  XBT_DEBUG
+      ("There were a resource state event, need to update actions related to the constraint (%p)",
+       getConstraint());
+  return;
+}
+
+/**********
+ * Action *
+ **********/
+void NetworkCm02Action::updateRemainingLazy(double now)
+{
+  double delta = 0.0;
+
+  if (m_suspended != 0)
+    return;
+
+  delta = now - m_lastUpdate;
+
+  if (m_remains > 0) {
+    XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", this, m_remains, m_lastUpdate);
+    double_update(&(m_remains), m_lastValue * delta);
+
+    XBT_DEBUG("Updating action(%p): remains is now %f", this, m_remains);
+  }
+
+  if (m_maxDuration != NO_MAX_DURATION)
+    double_update(&m_maxDuration, delta);
+
+  if (m_remains <= 0 &&
+      (lmm_get_variable_weight(getVariable()) > 0)) {
+    finish();
+    setState(SURF_ACTION_DONE);
+
+    heapRemove(getModel()->getActionHeap());
+  } else if (((m_maxDuration != NO_MAX_DURATION)
+      && (m_maxDuration <= 0))) {
+    finish();
+    setState(SURF_ACTION_DONE);
+    heapRemove(getModel()->getActionHeap());
+  }
+
+  m_lastUpdate = now;
+  m_lastValue = lmm_variable_getvalue(getVariable());
+}
+void NetworkCm02Action::recycle()
+{
+  return;
+}
+
diff --git a/src/surf/network_cm02.hpp b/src/surf/network_cm02.hpp
new file mode 100644 (file)
index 0000000..b4d4048
--- /dev/null
@@ -0,0 +1,100 @@
+/* Copyright (c) 2013-2014. 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 "network_interface.hpp"
+#include "xbt/fifo.h"
+#include "xbt/graph.h"
+
+#ifndef SURF_NETWORK_CM02_HPP_
+#define SURF_NETWORK_CM02_HPP_
+
+/***********
+ * Classes *
+ ***********/
+class NetworkCm02Model;
+typedef NetworkCm02Model *NetworkCm02ModelPtr;
+
+class NetworkCm02Link;
+typedef NetworkCm02Link *NetworkCm02LinkPtr;
+
+class NetworkCm02Action;
+typedef NetworkCm02Action *NetworkCm02ActionPtr;
+
+/*********
+ * Tools *
+ *********/
+
+void net_define_callbacks(void);
+
+/*********
+ * Model *
+ *********/
+class NetworkCm02Model : public NetworkModel {
+private:
+  void initialize();
+public:
+  NetworkCm02Model(int /*i*/) : NetworkModel("network") {
+       f_networkSolve = lmm_solve;
+       m_haveGap = false;
+  };//FIXME: add network clean interface
+  NetworkCm02Model(const char *name) : NetworkModel(name) {
+    this->initialize();
+  }
+  NetworkCm02Model() : NetworkModel("network") {
+    this->initialize();
+  }
+  ~NetworkCm02Model() {
+  }
+  NetworkLinkPtr createResource(const char *name,
+                                   double bw_initial,
+                                   tmgr_trace_t bw_trace,
+                                   double lat_initial,
+                                   tmgr_trace_t lat_trace,
+                                   e_surf_resource_state_t state_initial,
+                                   tmgr_trace_t state_trace,
+                                   e_surf_link_sharing_policy_t policy,
+                                   xbt_dict_t properties);
+  void updateActionsStateLazy(double now, double delta);
+  ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+                                          double size, double rate);
+};
+
+/************
+ * Resource *
+ ************/
+
+class NetworkCm02Link : public NetworkLink {
+public:
+  NetworkCm02Link(NetworkCm02ModelPtr model, const char *name, xbt_dict_t props,
+                                  lmm_system_t system,
+                                  double constraint_value,
+                                  tmgr_history_t history,
+                                  e_surf_resource_state_t state_init,
+                                  tmgr_trace_t state_trace,
+                                  double metric_peak,
+                                  tmgr_trace_t metric_trace,
+                                  double lat_initial,
+                                  tmgr_trace_t lat_trace,
+                               e_surf_link_sharing_policy_t policy);
+  void updateState(tmgr_trace_event_t event_type, double value, double date);
+};
+
+
+/**********
+ * Action *
+ **********/
+
+class NetworkCm02Action : public NetworkAction {
+  friend ActionPtr NetworkCm02Model::communicate(RoutingEdgePtr src, RoutingEdgePtr dst, double size, double rate);
+
+public:
+  NetworkCm02Action(ModelPtr model, double cost, bool failed)
+ : NetworkAction(model, cost, failed) {};
+  void updateRemainingLazy(double now);
+  void recycle();
+};
+
+#endif /* SURF_NETWORK_CM02_HPP_ */
diff --git a/src/surf/network_constant.c b/src/surf/network_constant.c
deleted file mode 100644 (file)
index 8d0b9da..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
-/* Copyright (c) 2008-2013. 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 "surf_private.h"
-#include "surf/random_mgr.h"
-#include "xbt/dict.h"
-#include "xbt/str.h"
-#include "xbt/log.h"
-
-typedef struct surf_action_network_Constant {
-  s_surf_action_t generic_action;
-  double latency;
-  double lat_init;
-  int suspended;
-} s_surf_action_network_Constant_t, *surf_action_network_Constant_t;
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network);
-static int host_number_int = 0;
-
-static void netcste_count_hosts(sg_platf_host_cbarg_t h) {
-  host_number_int++;
-}
-
-static void netcste_define_callbacks(void) {
-  sg_platf_host_add_cb(netcste_count_hosts);
-}
-
-static int netcste_resource_used(void *resource_id)
-{
-  return 0;
-}
-
-static int netcste_action_unref(surf_action_t action)
-{
-  action->refcount--;
-  if (!action->refcount) {
-    xbt_swag_remove(action, action->state_set);
-    surf_action_free(&action);
-    return 1;
-  }
-  return 0;
-}
-
-static void netcste_action_cancel(surf_action_t action)
-{
-  return;
-}
-
-static double netcste_share_resources(double now)
-{
-  surf_action_network_Constant_t action = NULL;
-  xbt_swag_t running_actions =
-      surf_network_model->states.running_action_set;
-  double min = -1.0;
-
-  xbt_swag_foreach(action, running_actions) {
-    if (action->latency > 0) {
-      if (min < 0)
-        min = action->latency;
-      else if (action->latency < min)
-        min = action->latency;
-    }
-  }
-
-  return min;
-}
-
-static void netcste_update_actions_state(double now, double delta)
-{
-  surf_action_network_Constant_t action = NULL;
-  surf_action_network_Constant_t next_action = NULL;
-  xbt_swag_t running_actions =
-      surf_network_model->states.running_action_set;
-
-  xbt_swag_foreach_safe(action, next_action, running_actions) {
-    if (action->latency > 0) {
-      if (action->latency > delta) {
-        double_update(&(action->latency), delta);
-      } else {
-        action->latency = 0.0;
-      }
-    }
-    double_update(&(action->generic_action.remains),
-                  action->generic_action.cost * delta / action->lat_init);
-    if (action->generic_action.max_duration != NO_MAX_DURATION)
-      double_update(&(action->generic_action.max_duration), delta);
-
-    if (action->generic_action.remains <= 0) {
-      action->generic_action.finish = surf_get_clock();
-      surf_network_model->action_state_set((surf_action_t) action,
-                                           SURF_ACTION_DONE);
-    } else if ((action->generic_action.max_duration != NO_MAX_DURATION)
-               && (action->generic_action.max_duration <= 0)) {
-      action->generic_action.finish = surf_get_clock();
-      surf_network_model->action_state_set((surf_action_t) action,
-                                           SURF_ACTION_DONE);
-    }
-  }
-}
-
-static void netcste_update_resource_state(void *id,
-                                          tmgr_trace_event_t event_type,
-                                          double value, double time)
-{
-  DIE_IMPOSSIBLE;
-}
-
-static surf_action_t netcste_communicate(sg_routing_edge_t src,
-                                         sg_routing_edge_t dst,
-                                         double size, double rate)
-{
-  surf_action_network_Constant_t action = NULL;
-
-  char *src_name = src->name;
-  char *dst_name = dst->name;
-
-  XBT_IN("(%s,%s,%g,%g)", src_name, dst_name, size, rate);
-
-  action =
-      surf_action_new(sizeof(s_surf_action_network_Constant_t), size,
-                      surf_network_model, 0);
-
-  action->suspended = 0;
-
-  action->latency = sg_latency_factor;
-  action->lat_init = action->latency;
-
-  if (action->latency <= 0.0) {
-    action->generic_action.state_set =
-        surf_network_model->states.done_action_set;
-    xbt_swag_insert(action, action->generic_action.state_set);
-  }
-
-  XBT_OUT();
-
-  return (surf_action_t) action;
-}
-
-#ifdef HAVE_TRACING
-static void netcste_action_set_category(surf_action_t action, const char *category)
-{
-  //ignore completely the categories in constant model, they are not traced
-}
-#endif
-
-static double netcste_get_link_bandwidth(const void *link)
-{
-  DIE_IMPOSSIBLE;
-  return -1.0; /* useless since DIE actually abort(), but eclipse prefer to have a useless and harmless return */
-}
-
-static double netcste_get_link_latency(const void *link)
-{
-  DIE_IMPOSSIBLE;
-  return -1.0; /* useless since DIE actually abort(), but eclipse prefer to have a useless and harmless return */
-}
-
-static int link_shared(const void *link)
-{
-  DIE_IMPOSSIBLE;
-  return -1; /* useless since DIE actually abort(), but eclipse prefer to have a useless and harmless return */
-}
-
-static void netcste_action_suspend(surf_action_t action)
-{
-  ((surf_action_network_Constant_t) action)->suspended = 1;
-}
-
-static void netcste_action_resume(surf_action_t action)
-{
-  if (((surf_action_network_Constant_t) action)->suspended)
-    ((surf_action_network_Constant_t) action)->suspended = 0;
-}
-
-static int netcste_action_is_suspended(surf_action_t action)
-{
-  return ((surf_action_network_Constant_t) action)->suspended;
-}
-
-static void netcste_finalize(void)
-{
-  surf_model_exit(surf_network_model);
-  surf_network_model = NULL;
-}
-
-
-
-void surf_network_model_init_Constant()
-{
-  xbt_assert(surf_network_model == NULL);
-  if (surf_network_model)
-    return;
-  surf_network_model = surf_model_init();
-
-  surf_network_model->name = "constant time network";
-  surf_network_model->action_unref = netcste_action_unref;
-  surf_network_model->action_cancel = netcste_action_cancel;
-  surf_network_model->action_recycle = net_action_recycle;
-  surf_network_model->get_remains = surf_action_get_remains;
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-  surf_network_model->get_latency_limited = net_get_link_latency_limited;
-#endif
-
-  surf_network_model->model_private->resource_used = netcste_resource_used;
-  surf_network_model->model_private->share_resources =
-      netcste_share_resources;
-  surf_network_model->model_private->update_actions_state =
-      netcste_update_actions_state;
-  surf_network_model->model_private->update_resource_state =
-      netcste_update_resource_state;
-  surf_network_model->model_private->finalize = netcste_finalize;
-
-  surf_network_model->suspend = netcste_action_suspend;
-  surf_network_model->resume = netcste_action_resume;
-  surf_network_model->is_suspended = netcste_action_is_suspended;
-  surf_cpu_model->set_max_duration = surf_action_set_max_duration;
-
-  surf_network_model->extension.network.communicate = netcste_communicate;
-  surf_network_model->extension.network.get_link_bandwidth =
-      netcste_get_link_bandwidth;
-  surf_network_model->extension.network.get_link_latency =
-      netcste_get_link_latency;
-  surf_network_model->extension.network.link_shared = link_shared;
-#ifdef HAVE_TRACING
-  surf_network_model->set_category = netcste_action_set_category;
-#endif
-
-  netcste_define_callbacks();
-  xbt_dynar_push(model_list, &surf_network_model);
-
-  routing_model_create(NULL);
-}
diff --git a/src/surf/network_constant.cpp b/src/surf/network_constant.cpp
new file mode 100644 (file)
index 0000000..d9f36dd
--- /dev/null
@@ -0,0 +1,174 @@
+/* Copyright (c) 2013-2014. 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 "network_constant.hpp"
+#include "surf/random_mgr.h"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network);
+static int host_number_int = 0;
+
+static void netcste_count_hosts(sg_platf_host_cbarg_t /*h*/) {
+  host_number_int++;
+}
+
+/*********
+ * Model *
+ *********/
+void surf_network_model_init_Constant()
+{
+  xbt_assert(surf_network_model == NULL);
+  surf_network_model = new NetworkConstantModel();
+
+  sg_platf_host_add_cb(netcste_count_hosts);
+
+  ModelPtr model = static_cast<ModelPtr>(surf_network_model);
+  xbt_dynar_push(model_list, &model);
+}
+
+double NetworkConstantModel::shareResources(double /*now*/)
+{
+  NetworkConstantActionPtr action = NULL;
+  double min = -1.0;
+
+  ActionListPtr actionSet = getRunningActionSet();
+  for(ActionList::iterator it(actionSet->begin()), itend(actionSet->end())
+        ; it != itend ; ++it) {
+       action = static_cast<NetworkConstantActionPtr>(&*it);
+    if (action->m_latency > 0) {
+      if (min < 0)
+        min = action->m_latency;
+      else if (action->m_latency < min)
+        min = action->m_latency;
+    }
+  }
+
+  return min;
+}
+
+void NetworkConstantModel::updateActionsState(double /*now*/, double delta)
+{
+  NetworkConstantActionPtr action = NULL;
+  ActionListPtr actionSet = getRunningActionSet();
+  for(ActionList::iterator it(actionSet->begin()), itNext=it, itend(actionSet->end())
+     ; it != itend ; it=itNext) {
+    ++itNext;
+       action = static_cast<NetworkConstantActionPtr>(&*it);
+    if (action->m_latency > 0) {
+      if (action->m_latency > delta) {
+        double_update(&(action->m_latency), delta);
+      } else {
+        action->m_latency = 0.0;
+      }
+    }
+    action->updateRemains(action->getCost() * delta / action->m_latInit);
+    if (action->getMaxDuration() != NO_MAX_DURATION)
+      action->updateMaxDuration(delta);
+
+    if (action->getRemainsNoUpdate() <= 0) {
+      action->finish();
+      action->setState(SURF_ACTION_DONE);
+    } else if ((action->getMaxDuration() != NO_MAX_DURATION)
+               && (action->getMaxDuration() <= 0)) {
+      action->finish();
+      action->setState(SURF_ACTION_DONE);
+    }
+  }
+}
+
+ActionPtr NetworkConstantModel::communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+                                        double size, double rate)
+{
+  char *src_name = src->getName();
+  char *dst_name = dst->getName();
+
+  XBT_IN("(%s,%s,%g,%g)", src_name, dst_name, size, rate);
+  NetworkConstantActionPtr action = new NetworkConstantAction(this, size, sg_latency_factor);
+  XBT_OUT();
+
+  return action;
+}
+
+/************
+ * Resource *
+ ************/
+bool NetworkConstantLink::isUsed()
+{
+  return 0;
+}
+
+void NetworkConstantLink::updateState(tmgr_trace_event_t /*event_type*/,
+                                         double /*value*/, double /*time*/)
+{
+  DIE_IMPOSSIBLE;
+}
+
+double NetworkConstantLink::getBandwidth()
+{
+  DIE_IMPOSSIBLE;
+  return -1.0; /* useless since DIE actually abort(), but eclipse prefer to have a useless and harmless return */
+}
+
+double NetworkConstantLink::getLatency()
+{
+  DIE_IMPOSSIBLE;
+  return -1.0; /* useless since DIE actually abort(), but eclipse prefer to have a useless and harmless return */
+}
+
+bool NetworkConstantLink::isShared()
+{
+  DIE_IMPOSSIBLE;
+  return -1; /* useless since DIE actually abort(), but eclipse prefer to have a useless and harmless return */
+}
+
+/**********
+ * Action *
+ **********/
+
+int NetworkConstantAction::unref()
+{
+  m_refcount--;
+  if (!m_refcount) {
+       if (actionHook::is_linked())
+         p_stateSet->erase(p_stateSet->iterator_to(*this));
+    delete this;
+  return 1;
+  }
+  return 0;
+}
+
+void NetworkConstantAction::cancel()
+{
+  return;
+}
+
+#ifdef HAVE_TRACING
+void NetworkConstantAction::setCategory(const char */*category*/)
+{
+  //ignore completely the categories in constant model, they are not traced
+}
+#endif
+
+void NetworkConstantAction::suspend()
+{
+  m_suspended = true;
+}
+
+void NetworkConstantAction::resume()
+{
+  if (m_suspended)
+       m_suspended = false;
+}
+
+void NetworkConstantAction::recycle()
+{
+  return;
+}
+
+bool NetworkConstantAction::isSuspended()
+{
+  return m_suspended;
+}
+
diff --git a/src/surf/network_constant.hpp b/src/surf/network_constant.hpp
new file mode 100644 (file)
index 0000000..46ac808
--- /dev/null
@@ -0,0 +1,82 @@
+/* Copyright (c) 2013-2014. 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 "network_cm02.hpp"
+
+#ifndef NETWORK_CONSTANT_HPP_
+#define NETWORK_CONSTANT_HPP_
+
+/***********
+ * Classes *
+ ***********/
+class NetworkConstantModel;
+typedef NetworkConstantModel *NetworkConstantModelPtr;
+
+class NetworkConstantLink;
+typedef NetworkConstantLink *NetworkConstantLinkPtr;
+
+class NetworkConstantAction;
+typedef NetworkConstantAction *NetworkConstantActionPtr;
+
+/*********
+ * Model *
+ *********/
+class NetworkConstantModel : public NetworkCm02Model {
+public:
+  NetworkConstantModel()
+  : NetworkCm02Model("constant time network")
+  {
+    p_updateMechanism = UM_UNDEFINED;
+  };
+  double shareResources(double now);
+  void updateActionsState(double now, double delta);
+  ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+                                          double size, double rate);
+  void gapRemove(ActionPtr action);
+  //FIXME:virtual void addTraces() =0;
+};
+
+/************
+ * Resource *
+ ************/
+class NetworkConstantLink : public NetworkCm02Link {
+public:
+  NetworkConstantLink(NetworkCm02ModelPtr model, const char* name, xbt_dict_t properties);
+  bool isUsed();
+  void updateState(tmgr_trace_event_t event_type, double value, double date);
+  double getBandwidth();
+  double getLatency();
+  bool isShared();
+};
+
+/**********
+ * Action *
+ **********/
+class NetworkConstantAction : public NetworkCm02Action {
+public:
+  NetworkConstantAction(NetworkConstantModelPtr model_, double size, double latency)
+  : NetworkCm02Action(model_, size, false)
+  , m_latInit(latency)
+  {
+       m_latency = latency;
+       if (m_latency <= 0.0) {
+         p_stateSet = getModel()->getDoneActionSet();
+         p_stateSet->push_back(*this);
+       }
+       p_variable = NULL;
+  };
+  int unref();
+  void recycle();
+  void cancel();
+  void setCategory(const char *category);
+  void suspend();
+  void resume();
+  bool isSuspended();
+  double m_latInit;
+  int m_suspended;
+};
+
+#endif /* NETWORK_CONSTANT_HPP_ */
diff --git a/src/surf/network_gtnets.c b/src/surf/network_gtnets.c
deleted file mode 100644 (file)
index 4392bb3..0000000
+++ /dev/null
@@ -1,468 +0,0 @@
-/* Copyright (c) 2007-2013. 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 "network_gtnets_private.h"
-#include "gtnets/gtnets_interface.h"
-#include "xbt/str.h"
-#include "surf/surfxml_parse_values.h"
-
-static double time_to_next_flow_completion = -1;
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets, surf,
-                                "Logging specific to the SURF network GTNetS module");
-
-extern routing_platf_t routing_platf;
-
-double sg_gtnets_jitter = 0.0;
-int sg_gtnets_jitter_seed = 10;
-
-static void link_new(const char *name, double bw, double lat, xbt_dict_t props)
-{
-  static int link_count = -1;
-  network_link_GTNETS_t gtnets_link;
-
-  if (xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL)) {
-    return;
-  }
-
-  XBT_DEBUG("Scanning link name %s", name);
-
-
-  gtnets_link = xbt_new0(s_network_link_GTNETS_t, 1);
-  gtnets_link->generic_resource.name = xbt_strdup(name);
-  gtnets_link->generic_resource.properties = props;
-  gtnets_link->bw_current = bw;
-  gtnets_link->lat_current = lat;
-
-  link_count++;
-
-  XBT_DEBUG("Adding new link, linkid %d, name %s, latency %g, bandwidth %g",
-           link_count, name, lat, bw);
-
-  if (gtnets_add_link(link_count, bw, lat)) {
-    xbt_die("Cannot create GTNetS link");
-  }
-  gtnets_link->id = link_count;
-
-  xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, gtnets_link);
-}
-
-static void route_new(int src_id, int dst_id, xbt_dynar_t links,
-                      int nb_link)
-{
-  network_link_GTNETS_t link;
-  unsigned int cursor;
-  int i = 0;
-  int *gtnets_links;
-
-  XBT_IN("(src_id=%d, dst_id=%d, links=%p, nb_link=%d)",
-          src_id, dst_id, links, nb_link);
-
-  /* Build the list of gtnets link IDs */
-  gtnets_links = xbt_new0(int, nb_link);
-  i = 0;
-  xbt_dynar_foreach(links, cursor, link) {
-    gtnets_links[i++] = link->id;
-  }
-
-  if (gtnets_add_route(src_id, dst_id, gtnets_links, nb_link)) {
-    xbt_die("Cannot create GTNetS route");
-  }
-  XBT_OUT();
-}
-
-static void route_onehop_new(int src_id, int dst_id,
-                             network_link_GTNETS_t link)
-{
-  if (gtnets_add_onehop_route(src_id, dst_id, link->id)) {
-    xbt_die("Cannot create GTNetS route");
-  }
-}
-
-/* Parse the XML for a network link */
-static void parse_link_init(sg_platf_link_cbarg_t link)
-{
-  XBT_DEBUG("link_gtnets");
-
-  if (link->bandwidth_trace)
-    XBT_INFO
-        ("The GTNetS network model doesn't support bandwidth state traces");
-  if (link->latency_trace)
-    XBT_INFO("The GTNetS network model doesn't support latency state traces");
-  if (link->state_trace)
-    XBT_INFO("The GTNetS network model doesn't support link state traces");
-
-  if (link->policy == SURF_LINK_FULLDUPLEX)
-  {
-    link_new(bprintf("%s_UP",link->id), link->bandwidth, link->latency, current_property_set);
-    link_new(bprintf("%s_DOWN",link->id), link->bandwidth, link->latency, current_property_set);
-
-  }
-  else  link_new(link->id, link->bandwidth, link->latency, current_property_set);
-  current_property_set = NULL;
-}
-
-/* Create the gtnets topology based on routing strategy */
-static void create_gtnets_topology(void)
-{
-   XBT_DEBUG("Starting topology generation");
-// FIXME: We should take the list of hosts/routers (in the routing module), number the elements of this list,
-//   and then you can use the id to reimplement properly the following GTNets calls
-
-   //get the onelinks from the parsed platform
-   xbt_dynar_t onelink_routes = routing_platf->get_onelink_routes();
-   if (!onelink_routes)
-     return;
-
-   //save them in trace file
-   onelink_t onelink;
-   unsigned int iter;
-   xbt_dynar_foreach(onelink_routes, iter, onelink) {
-     void *link = onelink->link_ptr;
-
-     if(onelink->src->id != onelink->dst->id){
-     XBT_DEBUG("Link (#%p), src (#%s), dst (#%s), src_id = %d, dst_id = %d",
-         link,
-         onelink->src->name,
-         onelink->dst->name,
-         onelink->src->id,
-         onelink->dst->id);
-     XBT_DEBUG("Calling one link route");
-        if(onelink->src->rc_type == SURF_NETWORK_ELEMENT_ROUTER){
-          gtnets_add_router(onelink->src->id);
-        }
-        if(onelink->dst->rc_type == SURF_NETWORK_ELEMENT_ROUTER){
-         gtnets_add_router(onelink->dst->id);
-        }
-        route_onehop_new(onelink->src->id, onelink->dst->id, (network_link_GTNETS_t)(link));
-     }
-   }
-
-   if (XBT_LOG_ISENABLED(surf_network_gtnets, xbt_log_priority_debug)) {
-        gtnets_print_topology();
-   }
-}
-
-/* Main XML parsing */
-static void define_callbacks(void)
-{
-  /* Figuring out the network links */
-  sg_platf_link_add_cb (&parse_link_init);
-  sg_platf_postparse_add_cb(&create_gtnets_topology);
-}
-
-static int resource_used(void *resource_id)
-{
-  xbt_die("The resource_used feature is not implemented in GTNets model");
-}
-
-static int action_unref(surf_action_t action)
-{
-  action->refcount--;
-  if (!action->refcount) {
-    xbt_swag_remove(action, action->state_set);
-#ifdef HAVE_TRACING
-    xbt_free(action->category);
-#endif
-    surf_action_free(&action);
-    return 1;
-  }
-  return 0;
-}
-
-static void action_cancel(surf_action_t action)
-{
-  xbt_die("Cannot cancel GTNetS flow");
-  return;
-}
-
-static void action_recycle(surf_action_t action)
-{
-  xbt_die("Cannot recycle GTNetS flow");
-  return;
-}
-
-static double action_get_remains(surf_action_t action)
-{
-  return action->remains;
-}
-
-static void action_state_set(surf_action_t action,
-                             e_surf_action_state_t state)
-{
-  surf_action_state_set(action, state);
-}
-
-static double share_resources(double now)
-{
-  xbt_swag_t running_actions =
-      surf_network_model->states.running_action_set;
-
-  //get the first relevant value from the running_actions list
-  if (!xbt_swag_size(running_actions))
-    return -1.0;
-
-  xbt_assert(time_to_next_flow_completion,
-              "Time to next flow completion not initialized!\n");
-
-  XBT_DEBUG("Calling gtnets_get_time_to_next_flow_completion");
-  time_to_next_flow_completion = gtnets_get_time_to_next_flow_completion();
-  XBT_DEBUG("gtnets_get_time_to_next_flow_completion received %g",
-         time_to_next_flow_completion);
-
-  return time_to_next_flow_completion;
-}
-
-static void update_actions_state(double now, double delta)
-{
-  surf_action_network_GTNETS_t action = NULL;
-  xbt_swag_t running_actions =
-      surf_network_model->states.running_action_set;
-
-  /* If there are no running flows, just return */
-  if (time_to_next_flow_completion < 0.0) {
-    return;
-  }
-
-  /* if delta == time_to_next_flow_completion, too. */
-  if (time_to_next_flow_completion <= delta) {  /* run until the first flow completes */
-    void **metadata;
-    int i, num_flows;
-
-    num_flows = 0;
-
-    if (gtnets_run_until_next_flow_completion(&metadata, &num_flows)) {
-      xbt_die("Cannot run GTNetS simulation until next flow completion");
-    }
-    if (num_flows < 1) {
-      xbt_die("GTNetS simulation couldn't find a flow that would complete");
-    }
-
-    xbt_swag_foreach(action, running_actions) {
-      XBT_DEBUG("Action (%p) remains old value: %f", action,
-             action->generic_action.remains);
-      double sent = gtnets_get_flow_rx(action);
-
-      XBT_DEBUG("Sent value returned by GTNetS : %f", sent);
-
-#ifdef HAVE_TRACING
-      action->last_remains = action->generic_action.remains;
-#endif
-
-     //need to trust this remain value
-     if (sent == 0) {
-       action->generic_action.remains = 0;
-      } else {
-        action->generic_action.remains =
-            action->generic_action.cost - sent;
-      }
-
-     // verify that this action is a finishing action.
-     int found=0;
-     for (i = 0; i < num_flows; i++) {
-       if(action == (surf_action_network_GTNETS_t) (metadata[i])){
-           found = 1;
-           break;
-       }
-     }
-
-     // indeed this action have not yet started
-     // because of that we need to fix the remaining to the
-     // original total cost
-     if(found != 1 && action->generic_action.remains == 0 ){
-         action->generic_action.remains = action->generic_action.cost;
-     }
-
-     XBT_DEBUG("Action (%p) remains new value: %f", action,
-             action->generic_action.remains);
-
-#ifdef HAVE_TRACING
-      if (TRACE_is_enabled()) {
-        double last_amount_sent = (action->generic_action.cost - action->last_remains);
-        double amount_sent = (action->generic_action.cost - action->generic_action.remains);
-
-        // tracing resource utilization
-        xbt_dynar_t route = NULL;
-
-        routing_get_route_and_latency (action->src, action->dst, &route, NULL);
-
-        unsigned int i;
-        for (i = 0; i < xbt_dynar_length (route); i++){
-          network_link_GTNETS_t *link = ((network_link_GTNETS_t*)xbt_dynar_get_ptr (route, i));
-          TRACE_surf_link_set_utilization ((*link)->generic_resource.name,
-                                            ((surf_action_t) action)->category,
-                                            (amount_sent - last_amount_sent)/(delta),
-                                            now-delta,
-                                            delta);
-      }
-      }
-#endif
-
-
-    }
-
-    for (i = 0; i < num_flows; i++) {
-      action = (surf_action_network_GTNETS_t) (metadata[i]);
-
-
-
-      action->generic_action.finish = now + time_to_next_flow_completion;
-      action_state_set((surf_action_t) action, SURF_ACTION_DONE);
-      XBT_DEBUG("----> Action (%p) just terminated", action);
-
-    }
-
-
-  } else {                      /* run for a given number of seconds */
-    if (gtnets_run(delta)) {
-      xbt_die("Cannot run GTNetS simulation");
-    }
-  }
-
-  return;
-}
-
-static void update_resource_state(void *id,
-                                  tmgr_trace_event_t event_type,
-                                  double value, double date)
-{
-  xbt_die("Cannot update model state for GTNetS simulation");
-}
-
-/* Max durations are not supported */
-static surf_action_t communicate(sg_routing_edge_t src_card,
-                                 sg_routing_edge_t dst_card,
-                                 double size, double rate)
-{
-  surf_action_network_GTNETS_t action = NULL;
-
-  int src = src_card->id;
-  int dst = dst_card->id;
-  char *src_name = src_card->name;
-  char *dst_name = dst_card->name;
-
-  xbt_assert((src >= 0
-               && dst >= 0), "Either src or dst have invalid id (id<0)");
-
-  XBT_DEBUG("Setting flow src %d \"%s\", dst %d \"%s\"", src, src_name, dst,
-         dst_name);
-
-  xbt_dynar_t route = NULL;
-
-  routing_get_route_and_latency(src_card, dst_card, &route, NULL);
-
-  route_new(src, dst, route, xbt_dynar_length(route));
-
-  action =
-      surf_action_new(sizeof(s_surf_action_network_GTNETS_t), size,
-                      surf_network_model, 0);
-
-#ifdef HAVE_TRACING
-  action->last_remains = 0;
-#endif
-
-  /* Add a flow to the GTNets Simulation, associated to this action */
-  if (gtnets_create_flow(src, dst, size, (void *) action) < 0) {
-    xbt_die("Not route between host %s and host %s", src_name, dst_name);
-  }
-#ifdef HAVE_TRACING
-  TRACE_surf_gtnets_communicate(action, src_card, dst_card);
-#endif
-
-  return (surf_action_t) action;
-}
-
-/* Suspend a flow() */
-static void action_suspend(surf_action_t action)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-/* Resume a flow() */
-static void action_resume(surf_action_t action)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-/* Test whether a flow is suspended */
-static int action_is_suspended(surf_action_t action)
-{
-  return 0;
-}
-
-#ifdef HAVE_TRACING
-static void gtnets_action_set_category(surf_action_t action, const char *category)
-{
-  action->category = xbt_strdup (category);
-}
-#endif
-
-static void finalize(void)
-{
-  gtnets_finalize();
-}
-
-static void surf_network_model_init_internal(void)
-{
-  surf_network_model = surf_model_init();
-
-  surf_network_model->name = "network GTNetS";
-  surf_network_model->action_unref = action_unref;
-  surf_network_model->action_cancel = action_cancel;
-  surf_network_model->action_recycle = action_recycle;
-  surf_network_model->action_state_set = action_state_set;
-  surf_network_model->get_remains = action_get_remains;
-
-  surf_network_model->model_private->resource_used = resource_used;
-  surf_network_model->model_private->share_resources = share_resources;
-  surf_network_model->model_private->update_actions_state =
-      update_actions_state;
-  surf_network_model->model_private->update_resource_state =
-      update_resource_state;
-  surf_network_model->model_private->finalize = finalize;
-
-  surf_network_model->suspend = action_suspend;
-  surf_network_model->resume = action_resume;
-  surf_network_model->is_suspended = action_is_suspended;
-#ifdef HAVE_TRACING
-  surf_network_model->set_category = gtnets_action_set_category;
-#endif
-
-  surf_network_model->extension.network.communicate = communicate;
-
-  /* Added the initialization for GTNetS interface */
-  if (gtnets_initialize(sg_tcp_gamma)) {
-    xbt_die("Impossible to initialize GTNetS interface");
-  }
-
-  routing_model_create(NULL);
-}
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-static int get_latency_limited(surf_action_t action)
-{
-  return 0;
-}
-#endif
-
-void surf_network_model_init_GTNETS(void)
-{
-  if (surf_network_model)
-    return;
-
-  surf_network_model_init_internal();
-  define_callbacks();
-  xbt_dynar_push(model_list, &surf_network_model);
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-  surf_network_model->get_latency_limited = get_latency_limited;
-#endif
-
-  if (sg_gtnets_jitter > 0.0) {
-    gtnets_set_jitter(sg_gtnets_jitter);
-    gtnets_set_jitter_seed(sg_gtnets_jitter_seed);
-  }
-}
diff --git a/src/surf/network_gtnets.cpp b/src/surf/network_gtnets.cpp
new file mode 100644 (file)
index 0000000..894feae
--- /dev/null
@@ -0,0 +1,114 @@
+/* Copyright (c) 2013-2014. 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 "network_gtnets.hpp"
+
+static double time_to_next_flow_completion = -1;
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets, surf,
+                                "Logging specific to the SURF network GTNetS module");
+
+extern routing_platf_t routing_platf;
+
+double sg_gtnets_jitter = 0.0;
+int sg_gtnets_jitter_seed = 10;
+
+/*********
+ * Model *
+ *********/
+
+void newRoute(int src_id, int dst_id,
+                     xbt_dynar_t links, int nb_link)
+{
+  void *_link;
+  NetworkGTNetsLinkPtr link;
+  unsigned int cursor;
+  int i = 0;
+  int *gtnets_links;
+
+  XBT_IN("(src_id=%d, dst_id=%d, links=%p, nb_link=%d)",
+          src_id, dst_id, links, nb_link);
+
+  /* Build the list of gtnets link IDs */
+  gtnets_links = xbt_new0(int, nb_link);
+  i = 0;
+  xbt_dynar_foreach(links, cursor, _link) {
+       link = (NetworkGTNetsLinkPtr) _link;
+    gtnets_links[i++] = link->m_id;
+  }
+
+  if (gtnets_add_route(src_id, dst_id, gtnets_links, nb_link)) {
+    xbt_die("Cannot create GTNetS route");
+  }
+  XBT_OUT();
+}
+
+void newRouteOnehop(int src_id, int dst_id,
+                    NetworkGTNetsLinkPtr link)
+{
+  if (gtnets_add_onehop_route(src_id, dst_id, link->m_id)) {
+    xbt_die("Cannot create GTNetS route");
+  }
+}
+
+int NetworkGTNetsModel::addLink(ind id, double bandwidth, double latency)
+{
+  double bw = bandwidth * 8; //Bandwidth in bits (used in GTNETS).
+
+  map<int,GTNETS_Link*>::iterator iter = p_links.find(id);
+  xbt_assert((iter == p_links.end()), "Link %d already exists", id);
+
+  if(iter == p_links.end()) {
+    GTNETS_Link* link= new GTNETS_Link(id);
+    p_links[id] = link;
+  }
+
+  XBT_DEBUG("Creating a new P2P, linkid %d, bandwidth %gl, latency %gl", id, bandwidth, latency);
+  p_gtnetsLinks_[id] = new Linkp2p(bw, latency);
+         if(jitter_ > 0){
+               XBT_DEBUG("Using jitter %f, and seed %u", jitter_, jitter_seed_);
+               double min = -1*jitter_*latency;
+               double max = jitter_*latency;
+               uniform_jitter_generator_[id] = new Uniform(min,max);
+               gtnets_links_[id]->Jitter((const Random &) *(uniform_jitter_generator_[id]));
+         }
+
+         return 0;
+}
+
+/************
+ * Resource *
+ ************/
+NetworkGTNetsLink::NetworkGTNetsLink(NetworkGTNetsModelPtr model, const char* name, double bw, double lat, xbt_dict_t properties)
+  :NetworkCm02Link(model, name, properties), m_bwCurrent(bw), m_latCurrent(lat)
+{
+
+  static int link_count = -1;
+
+  if (xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL)) {
+    return;
+  }
+
+  XBT_DEBUG("Scanning link name %s", name);
+
+  link_count++;
+
+  XBT_DEBUG("Adding new link, linkid %d, name %s, latency %g, bandwidth %g",
+           link_count, name, lat, bw);
+
+
+
+  if (gtnets_add_link(link_count, bw, lat)) {
+    xbt_die("Cannot create GTNetS link");
+  }
+  m_id = link_count;
+
+  xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, this);
+}
+
+/**********
+ * Action *
+ **********/
diff --git a/src/surf/network_gtnets.hpp b/src/surf/network_gtnets.hpp
new file mode 100644 (file)
index 0000000..2cbcf73
--- /dev/null
@@ -0,0 +1,130 @@
+/* Copyright (c) 2013-2014. 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 "network.hpp"
+
+#ifndef NETWORK_GTNETS_HPP_
+#define NETWORK_GTNETS_HPP_
+
+#include "simulator.h"          // Definitions for the Simulator Object
+#include "node.h"               // Definitions for the Node Object
+#include "linkp2p.h"            // Definitions for point-to-point link objects
+#include "ratetimeparse.h"      // Definitions for Rate and Time objects
+#include "application-tcpserver.h"      // Definitions for TCPServer application
+#include "application-tcpsend.h"        // Definitions for TCP Sending application
+#include "tcp-tahoe.h"          // Definitions for TCP Tahoe
+#include "tcp-reno.h"
+#include "tcp-newreno.h"
+#include "event.h"
+#include "routing-manual.h"
+#include "red.h"
+
+xbt_dict_t network_card_ids;
+
+/***********
+ * Classes *
+ ***********/
+class NetworkGTNetsModel;
+typedef NetworkGTNetsModel *NetworkGTNetsModelPtr;
+
+class NetworkGTNetsLink;
+typedef NetworkGTNetsLink *NetworkGTNetsLinkPtr;
+
+class NetworkGTNetsAction;
+typedef NetworkGTNetsAction *NetworkGTNetsActionPtr;
+
+class NetworkGTNetsActionLmm;
+typedef NetworkGTNetsActionLmm *NetworkGTNetsActionLmmPtr;
+
+/*********
+ * Model *
+ *********/
+class NetworkGTNetsModel : public NetworkCm02Model {
+public:
+  NetworkGTNetsModel() : NetworkCm02Model("constant time network") {};
+  int addLink(int id, double bandwidth, double latency);
+  int addOnehop_route(int src, int dst, int link);
+  int addRoute(int src, int dst, int *links, int nlink);
+  int addRouter(int id);
+  int createFlow(int src, int dst, long datasize, void *metadata);
+  double getTimeToNextFlowCompletion();
+  int runUntilNextFlowCompletion(void ***metadata,
+                                     int *number_of_flows);
+  int run(double deltat);
+  // returns the total received by the TCPServer peer of the given action
+  double gtNetsGetFlowRx(void *metadata);
+  void createGTNetsTopology();
+  void printTopology();
+  void setJitter(double);
+  void setJitterSeed(int);
+private:
+  void addNodes();
+  void nodeConnect();
+
+  bool nodeInclude(int);
+  bool linkInclude(int);
+  Simulator *p_sim;
+  GTNETS_Topology *p_topo;
+  RoutingManual *p_rm;
+  REDQueue *p_redQueue;
+  int m_nnode;
+  int m_isTopology;
+  int m_nflow;
+  double m_jitter;
+  int m_jitterSeed;
+   map<int, Uniform*> p_uniformJitterGenerator;
+
+   map<int, TCPServer*> p_gtnetsServers;
+   map<int, TCPSend*> p_gtnetsClients;
+   map<int, Linkp2p*> p_gtnetsLinks_;
+   map<int, Node*> p_gtnetsNodes;
+   map<void*, int> p_gtnetsActionToFlow;
+
+   map <int, void*> p_gtnetsMetadata;
+
+   // From Topology
+   int m_nodeID;
+   map<int, GTNETS_Link*> p_links;
+   vector<GTNETS_Node*> p_nodes;
+   map<int, int> p_hosts;      //hostid->nodeid
+   set<int > p_routers;
+};
+
+/************
+ * Resource *
+ ************/
+class NetworkGTNetsLink : public NetworkCm02Link {
+public:
+  NetworkGTNetsLink(NetworkGTNetsModelPtr model, const char* name, double bw, double lat, xbt_dict_t properties);
+  /* Using this object with the public part of
+  model does not make sense */
+  double m_bwCurrent;
+  double m_latCurrent;
+  int m_id;
+};
+
+/**********
+ * Action *
+ **********/
+class NetworkGTNetsAction : public NetworkCm02Action {
+public:
+  NetworkGTNetsAction(NetworkGTNetsModelPtr model, double latency){};
+
+  double m_latency;
+  double m_latCurrent;
+#ifdef HAVE_TRACING
+  int m_lastRemains;
+#endif
+  lmm_variable_t p_variable;
+  double m_rate;
+  int m_suspended;
+#ifdef HAVE_TRACING
+  RoutingEdgePtr src;
+  RoutingEdgePtr dst;
+#endif //HAVE_TRACING
+};
+
+#endif /* NETWORK_GTNETS_HPP_ */
diff --git a/src/surf/network_gtnets_private.h b/src/surf/network_gtnets_private.h
deleted file mode 100644 (file)
index 293ac16..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Copyright (c) 2007-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. */
-
-#ifndef _SURF_NETWORK_GTNETS_PRIVATE_H
-#define _SURF_NETWORK_GTNETS_PRIVATE_H
-
-#include "surf_private.h"
-#include "xbt/dict.h"
-
-typedef struct network_link_GTNETS {
-  s_surf_resource_t generic_resource;   /* Must remain first to allow casting */
-  /* Using this object with the public part of
-     model does not make sense */
-  double bw_current;
-  double lat_current;
-  int id;
-} s_network_link_GTNETS_t, *network_link_GTNETS_t;
-
-typedef struct surf_action_network_GTNETS {
-  s_surf_action_t generic_action;
-  double latency;
-  double lat_current;
-#ifdef HAVE_TRACING
-  int last_remains;
-#endif
-  lmm_variable_t variable;
-  double rate;
-  int suspended;
-#ifdef HAVE_TRACING
-  sg_routing_edge_t src;
-  sg_routing_edge_t dst;
-#endif //HAVE_TRACING
-} s_surf_action_network_GTNETS_t, *surf_action_network_GTNETS_t;
-
-xbt_dict_t network_card_ids;
-
-
-
-#endif                          /* _SURF_NETWORK_PRIVATE_H */
diff --git a/src/surf/network_interface.cpp b/src/surf/network_interface.cpp
new file mode 100644 (file)
index 0000000..244b688
--- /dev/null
@@ -0,0 +1,112 @@
+/* Copyright (c) 2013-2014. 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 "network_interface.hpp"
+#include "simgrid/sg_config.h"
+
+#ifndef NETWORK_INTERFACE_CPP_
+#define NETWORK_INTERFACE_CPP_
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network, surf,
+                                "Logging specific to the SURF network module");
+
+/*************
+ * Callbacks *
+ *************/
+
+surf_callback(void, NetworkLinkPtr) networkLinkCreatedCallbacks;
+surf_callback(void, NetworkLinkPtr) networkLinkDestructedCallbacks;
+surf_callback(void, NetworkLinkPtr) networkLinkStateChangedCallbacks;
+surf_callback(void, NetworkActionPtr) networkActionStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+
+NetworkModelPtr surf_network_model = NULL;
+
+xbt_dynar_t NetworkModel::getRoute(RoutingEdgePtr src, RoutingEdgePtr dst)
+{
+  xbt_dynar_t route = NULL;
+  routing_platf->getRouteAndLatency(src, dst, &route, NULL);
+  return route;
+}
+
+double NetworkModel::latencyFactor(double /*size*/) {
+  return sg_latency_factor;
+}
+
+double NetworkModel::bandwidthFactor(double /*size*/) {
+  return sg_bandwidth_factor;
+}
+
+double NetworkModel::bandwidthConstraint(double rate, double /*bound*/, double /*size*/) {
+  return rate;
+}
+
+/************
+ * Resource *
+ ************/
+
+NetworkLink::NetworkLink(NetworkModelPtr model, const char *name, xbt_dict_t props)
+: Resource(model, name, props)
+, p_latEvent(NULL)
+{
+  surf_callback_emit(networkLinkCreatedCallbacks, this);
+}
+
+NetworkLink::NetworkLink(NetworkModelPtr model, const char *name, xbt_dict_t props,
+                                lmm_constraint_t constraint,
+                            tmgr_history_t history,
+                            tmgr_trace_t state_trace)
+: Resource(model, name, props, constraint),
+  p_latEvent(NULL)
+{
+  surf_callback_emit(networkLinkCreatedCallbacks, this);
+  if (state_trace)
+    p_stateEvent = tmgr_history_add_trace(history, state_trace, 0.0, 0, static_cast<ResourcePtr>(this));
+}
+
+NetworkLink::~NetworkLink()
+{
+  surf_callback_emit(networkLinkDestructedCallbacks, this);
+}
+
+bool NetworkLink::isUsed()
+{
+  return lmm_constraint_used(getModel()->getMaxminSystem(), getConstraint());
+}
+
+double NetworkLink::getLatency()
+{
+  return m_latCurrent;
+}
+
+double NetworkLink::getBandwidth()
+{
+  return p_power.peak * p_power.scale;
+}
+
+bool NetworkLink::isShared()
+{
+  return lmm_constraint_is_shared(getConstraint());
+}
+
+void NetworkLink::setState(e_surf_resource_state_t state){
+  Resource::setState(state);
+  surf_callback_emit(networkLinkStateChangedCallbacks, this);
+}
+
+/**********
+ * Action *
+ **********/
+
+void NetworkAction::setState(e_surf_action_state_t state){
+  Action::setState(state);
+  surf_callback_emit(networkActionStateChangedCallbacks, this);
+}
+
+#endif /* NETWORK_INTERFACE_CPP_ */
diff --git a/src/surf/network_interface.hpp b/src/surf/network_interface.hpp
new file mode 100644 (file)
index 0000000..994991b
--- /dev/null
@@ -0,0 +1,321 @@
+/* Copyright (c) 2004-2014. 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 "surf_interface.hpp"
+#include "surf_routing.hpp"
+
+#ifndef SURF_NETWORK_INTERFACE_HPP_
+#define SURF_NETWORK_INTERFACE_HPP_
+
+/***********
+ * Classes *
+ ***********/
+class NetworkModel;
+typedef NetworkModel *NetworkModelPtr;
+
+class NetworkLink;
+typedef NetworkLink *NetworkLinkPtr;
+
+class NetworkAction;
+typedef NetworkAction *NetworkActionPtr;
+
+/*************
+ * Callbacks *
+ *************/
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after NetworkLink creation *
+ * @details Callback functions have the following signature: `void(NetworkLinkPtr)`
+ */
+extern surf_callback(void, NetworkLinkPtr) networkLinkCreatedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after NetworkLink destruction *
+ * @details Callback functions have the following signature: `void(NetworkLinkPtr)`
+ */
+extern surf_callback(void, NetworkLinkPtr) networkLinkDestructedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after NetworkLink State changed *
+ * @details Callback functions have the following signature: `void(NetworkLinkActionPtr)`
+ */
+extern surf_callback(void, NetworkLinkPtr) networkLinkStateChangedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after NetworkAction State changed *
+ * @details Callback functions have the following signature: `void(NetworkActionPtr)`
+ */
+extern surf_callback(void, NetworkActionPtr) networkActionStateChangedCallbacks;
+
+/*********
+ * Tools *
+ *********/
+
+void net_define_callbacks(void);
+
+/*********
+ * Model *
+ *********/
+/** @ingroup SURF_network_interface
+ * @brief SURF network model interface class
+ * @details A model is an object which handle the interactions between its Resources and its Actions
+ */
+class NetworkModel : public Model {
+public:
+  /**
+   * @brief NetworkModel constructor
+   */
+  NetworkModel() : Model("network") {
+  };
+
+  /**
+   * @brief NetworkModel constructor
+   * 
+   * @param name The name of the NetworkModel
+   */
+  NetworkModel(const char *name) : Model(name) {
+       f_networkSolve = lmm_solve;
+       m_haveGap = false;
+  };
+
+  /**
+   * @brief The destructor of the NetworkModel
+   */
+  ~NetworkModel() {
+       if (p_maxminSystem)
+         lmm_system_free(p_maxminSystem);
+       if (p_actionHeap)
+         xbt_heap_free(p_actionHeap);
+       if (p_modifiedSet)
+         delete p_modifiedSet;
+  }
+
+  /**
+   * @brief Create a NetworkLink
+   * 
+   * @param name The name of the NetworkLink
+   * @param bw_initial The initial bandwidth of the NetworkLink in bytes per second
+   * @param bw_trace The trace associated to the NetworkLink bandwidth [TODO]
+   * @param lat_initial The initial latency of the NetworkLink in seconds
+   * @param lat_trace The trace associated to the NetworkLink latency [TODO]
+   * @param state_initial The initial NetworkLink (state)[e_surf_resource_state_t]
+   * @param state_trace The trace associated to the NetworkLink (state)[e_surf_resource_state_t] [TODO]
+   * @param policy The sharing policy of the NetworkLink
+   * @param properties Dictionary of properties associated to this Resource
+   * @return The created NetworkLink
+   */
+  virtual NetworkLinkPtr createResource(const char *name,
+                                   double bw_initial,
+                                   tmgr_trace_t bw_trace,
+                                   double lat_initial,
+                                   tmgr_trace_t lat_trace,
+                                   e_surf_resource_state_t state_initial,
+                                   tmgr_trace_t state_trace,
+                                   e_surf_link_sharing_policy_t policy,
+                                   xbt_dict_t properties)=0;
+
+
+  virtual void gapAppend(double /*size*/, const NetworkLinkPtr /*link*/, NetworkActionPtr /*action*/) {};
+
+  /**
+   * @brief Create a communication between two [TODO]
+   * @details [TODO]
+   * 
+   * @param src The source [TODO]
+   * @param dst The destination [TODO]
+   * @param size The size of the communication in bytes
+   * @param rate The 
+   * @return The action representing the communication
+   */
+  virtual ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+                                          double size, double rate)=0;
+
+  /**
+   * @brief Get the route between two RoutingEdge
+   * @details [TODO]
+   * 
+   * @param src [TODO]
+   * @param dst [TODO]
+   * 
+   * @return A xbt_dynar_t of [TODO]
+   */
+  virtual xbt_dynar_t getRoute(RoutingEdgePtr src, RoutingEdgePtr dst); //FIXME: kill field? That is done by the routing nowadays
+
+  /**
+   * @brief Function pointer to the function to use to solve the lmm_system_t
+   * 
+   * @param system The lmm_system_t to solve
+   */
+  void (*f_networkSolve)(lmm_system_t);
+
+  /**
+   * @brief [brief description]
+   * @details [long description]
+   * 
+   * @param size [description]
+   * @return [description]
+   */
+  virtual double latencyFactor(double size);
+
+  /**
+   * @brief [brief description]
+   * @details [long description]
+   * 
+   * @param size [description]
+   * @return [description]
+   */
+  virtual double bandwidthFactor(double size);
+
+  /**
+   * @brief [brief description]
+   * @details [long description]
+   * 
+   * @param rate [description]
+   * @param bound [description]
+   * @param size [description]
+   * @return [description]
+   */
+  virtual double bandwidthConstraint(double rate, double bound, double size);
+  bool m_haveGap;
+};
+
+/************
+ * Resource *
+ ************/
+ /** @ingroup SURF_network_interface
+  * @brief SURF network link interface class
+  * @details A NetworkLink represent the link between two [Workstations](\ref Workstation)
+  */
+class NetworkLink : public Resource {
+public:
+  /**
+   * @brief NetworkLink constructor
+   * 
+   * @param model The CpuModel associated to this NetworkLink
+   * @param name The name of the NetworkLink
+   * @param props Dictionary of properties associated to this NetworkLink
+   */
+  NetworkLink(NetworkModelPtr model, const char *name, xbt_dict_t props);
+
+  /**
+   * @brief NetworkLink constructor
+   * 
+   * @param model The CpuModel associated to this NetworkLink
+   * @param name The name of the NetworkLink
+   * @param props Dictionary of properties associated to this NetworkLink
+   * @param constraint The lmm constraint associated to this Cpu if it is part of a LMM component
+   * @param history [TODO]
+   * @param state_trace [TODO]
+   */
+  NetworkLink(NetworkModelPtr model, const char *name, xbt_dict_t props,
+                     lmm_constraint_t constraint,
+                 tmgr_history_t history,
+                 tmgr_trace_t state_trace);
+
+  /**
+   * @brief NetworkLink destructor
+   */
+  ~NetworkLink();
+
+  /**
+   * @brief Get the bandwidth in bytes per second of current NetworkLink
+   * 
+   * @return The bandwith in bytes per second of the current NetworkLink
+   */
+  virtual double getBandwidth();
+
+  /**
+   * @brief Get the latency in seconds of current NetworkLink
+   * 
+   * @return The latency in seconds of the current NetworkLink
+   */
+  virtual double getLatency();
+
+  /**
+   * @brief Check if the NetworkLink is shared
+   * @details [long description]
+   * 
+   * @return true if the current NetwokrLink is shared, false otherwise
+   */
+  virtual bool isShared();
+
+  /**
+   * @brief Check if the NetworkLink is used
+   * 
+   * @return true if the current NetwokrLink is used, false otherwise
+   */
+  bool isUsed();
+
+  void setState(e_surf_resource_state_t state);
+
+  /* Using this object with the public part of
+    model does not make sense */
+  double m_latCurrent;
+  tmgr_trace_event_t p_latEvent;
+
+  /* LMM */
+  tmgr_trace_event_t p_stateEvent;
+  s_surf_metric_t p_power;
+};
+
+/**********
+ * Action *
+ **********/
+/** @ingroup SURF_network_interface
+ * @brief SURF network action interface class
+ * @details A NetworkAction represent a communication bettween two [Workstations](\ref Workstation)
+ */
+class NetworkAction : public Action {
+public:
+  /**
+   * @brief NetworkAction constructor
+   * 
+   * @param model The NetworkModel associated to this NetworkAction
+   * @param cost The cost of this  NetworkAction in [TODO]
+   * @param failed [description]
+   */
+  NetworkAction(ModelPtr model, double cost, bool failed)
+  : Action(model, cost, failed) {}
+
+  /**
+   * @brief NetworkAction constructor
+   * 
+   * @param model The NetworkModel associated to this NetworkAction
+   * @param cost The cost of this  NetworkAction in [TODO]
+   * @param failed [description]
+   * @param var The lmm variable associated to this Action if it is part of a LMM component
+   */
+  NetworkAction(ModelPtr model, double cost, bool failed, lmm_variable_t var)
+  : Action(model, cost, failed, var) {};
+
+  void setState(e_surf_action_state_t state);
+
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+  /**
+   * @brief Check if the action is limited by latency.
+   *
+   * @return 1 if action is limited by latency, 0 otherwise
+   */
+  virtual int getLatencyLimited() {return m_latencyLimited;}
+#endif
+
+  double m_latency;
+  double m_latCurrent;
+  double m_weight;
+  double m_rate;
+  const char* p_senderLinkName;
+  double m_senderGap;
+  double m_senderSize;
+  xbt_fifo_item_t p_senderFifoItem;
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+  int m_latencyLimited;
+#endif
+
+};
+
+#endif /* SURF_NETWORK_INTERFACE_HPP_ */
+
+
similarity index 51%
rename from src/surf/network_ns3.c
rename to src/surf/network_ns3.cpp
index 6398a4b..4fecb0f 100644 (file)
@@ -1,40 +1,26 @@
 /* Copyright (c) 2007-2013. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
+ *
+ * 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 "network_ns3.hpp"
 #include "surf_private.h"
-#include "surf/maxmin.h"
-#include "surf/ns3/ns3_interface.h"
-#include "xbt/lib.h"
-#include "surf/network_ns3_private.h"
-#include "xbt/str.h"
+#include "simgrid/sg_config.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_ns3, surf,
+                                "Logging specific to the SURF network NS3 module");
 
 extern xbt_lib_t host_lib;
 extern xbt_lib_t link_lib;
 extern xbt_lib_t as_router_lib;
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_ns3, surf,
-                                "Logging specific to the SURF network NS3 module");
-
-extern routing_platf_t routing_platf;
 extern xbt_dict_t dict_socket;
 
+xbt_dynar_t IPV4addr;
 static double time_to_next_flow_completion = -1;
 
-static double ns3_share_resources(double min);
-static void ns3_update_actions_state(double now, double delta);
-static void finalize(void);
-static surf_action_t ns3_communicate(sg_routing_edge_t src_elm,
-                                     sg_routing_edge_t dst_elm,
-                                     double size, double rate);
-static void action_suspend(surf_action_t action);
-static void action_resume(surf_action_t action);
-static int action_is_suspended(surf_action_t action);
-static int action_unref(surf_action_t action);
-
-xbt_dynar_t IPV4addr;
+/*************
+ * Callbacks *
+ *************/
 
 static void replace_bdw_ns3(char ** bdw)
 {
@@ -69,34 +55,16 @@ static void parse_ns3_add_link(sg_platf_link_cbarg_t link)
 
   if(!IPV4addr) IPV4addr = xbt_dynar_new(sizeof(char*),free);
 
-  tmgr_trace_t bw_trace;
-  tmgr_trace_t state_trace;
-  tmgr_trace_t lat_trace;
-
-  bw_trace = link->bandwidth_trace;
-  lat_trace = link->latency_trace;
-  state_trace = link->state_trace;
-
-  if (bw_trace)
-    XBT_INFO("The NS3 network model doesn't support bandwidth state traces");
-  if (lat_trace)
-    XBT_INFO("The NS3 network model doesn't support latency state traces");
-  if (state_trace)
-    XBT_INFO("The NS3 network model doesn't support link state traces");
-
-  ns3_link_t link_ns3 = xbt_new0(s_ns3_link_t,1);;
-  link_ns3->id = xbt_strdup((char*)(link->id));
-  link_ns3->bdw = bprintf("%f",link->bandwidth);
-  link_ns3->lat = bprintf("%f",link->latency);
-
-  surf_ns3_link_t l = xbt_new0(s_surf_ns3_link_t,1);
-  l->generic_resource.name = xbt_strdup(link->id);
-  l->generic_resource.properties = current_property_set;
-  l->data = link_ns3;
-  l->created = 1;
-
-  xbt_lib_set(link_lib,link->id,NS3_LINK_LEVEL,link_ns3);
-  xbt_lib_set(link_lib,link->id,SURF_LINK_LEVEL,l);
+  NetworkLinkPtr net_link = surf_network_model->createResource(link->id,
+                                     link->bandwidth,
+                                     link->bandwidth_trace,
+                                     link->latency,
+                                     link->latency_trace,
+                                     link->state,
+                                     link->state_trace,
+                                     link->policy,
+                                     link->properties);
+  xbt_lib_set(link_lib, link->id, SURF_LINK_LEVEL, net_link);
 }
 
 static void parse_ns3_add_router(sg_platf_router_cbarg_t router)
@@ -192,8 +160,8 @@ static void parse_ns3_add_cluster(sg_platf_cluster_cbarg_t cluster)
     router_id = bprintf("ns3_%s%d%s", cluster_prefix, elmts, cluster_suffix);
     XBT_DEBUG("Create link from '%s' to '%s'",host_id,router_id);
 
-    ns3_nodes_t host_src = xbt_lib_get_or_null(host_lib,host_id,  NS3_HOST_LEVEL);
-    ns3_nodes_t host_dst = xbt_lib_get_or_null(host_lib,router_id,NS3_HOST_LEVEL);
+    ns3_nodes_t host_src = static_cast<ns3_nodes_t>(xbt_lib_get_or_null(host_lib,host_id,  NS3_HOST_LEVEL));
+    ns3_nodes_t host_dst = static_cast<ns3_nodes_t>(xbt_lib_get_or_null(host_lib,router_id,NS3_HOST_LEVEL));
 
     if(host_src && host_dst){}
     else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num);
@@ -215,34 +183,7 @@ static void parse_ns3_add_cluster(sg_platf_cluster_cbarg_t cluster)
   replace_bdw_ns3(&bw);
   ns3_add_cluster(bw,lat,cluster->id);
   xbt_free(lat);
-  xbt_free(bw);  
-}
-
-static double ns3_get_link_latency (const void *link)
-{
-  double lat;
-  //XBT_DEBUG("link_id:%s link_lat:%s link_bdw:%s",((surf_ns3_link_t)link)->data->id,((surf_ns3_link_t)link)->data->lat,((surf_ns3_link_t)link)->data->bdw);
-  sscanf(((surf_ns3_link_t)link)->data->lat,"%lg",&lat);
-  return lat;
-}
-static double ns3_get_link_bandwidth (const void *link)
-{
-  double bdw;
-  //XBT_DEBUG("link_id:%s link_lat:%s link_bdw:%s",((surf_ns3_link_t)link)->data->id,((surf_ns3_link_t)link)->data->lat,((surf_ns3_link_t)link)->data->bdw);
-  sscanf(((surf_ns3_link_t)link)->data->bdw,"%lg",&bdw);
-  return bdw;
-}
-
-static xbt_dynar_t ns3_get_route(void *src_card, void *dst_card)
-{
-  xbt_dynar_t route = NULL;
-  routing_get_route_and_latency(src_card, dst_card, &route, NULL);
-  return route;
-}
-
-static void parse_ns3_end_platform(void)
-{
-  ns3_end_platform();
+  xbt_free(bw);
 }
 
 /* Create the ns3 topology based on routing strategy */
@@ -253,36 +194,34 @@ static void create_ns3_topology(void)
   xbt_dynar_shrink(IPV4addr,0);
 
   //get the onelinks from the parsed platform
-  xbt_dynar_t onelink_routes = routing_platf->get_onelink_routes();
+  xbt_dynar_t onelink_routes = routing_platf->getOneLinkRoutes();
   if (!onelink_routes)
     xbt_die("There is no routes!");
   XBT_DEBUG("Have get_onelink_routes, found %ld routes",onelink_routes->used);
   //save them in trace file
-  onelink_t onelink;
+  OnelinkPtr onelink;
   unsigned int iter;
   xbt_dynar_foreach(onelink_routes, iter, onelink) {
-    char *src = onelink->src->name;
-    char *dst = onelink->dst->name;
-    void *link = onelink->link_ptr;
-    if( strcmp(src,dst) && ((surf_ns3_link_t)link)->created){
-      XBT_DEBUG("Route from '%s' to '%s' with link '%s'",src,dst,((surf_ns3_link_t)link)->data->id);
-      char * link_bdw = xbt_strdup(((surf_ns3_link_t)link)->data->bdw);
-      char * link_lat = xbt_strdup(((surf_ns3_link_t)link)->data->lat);
+    char *src = onelink->p_src->getName();
+    char *dst = onelink->p_dst->getName();
+    NetworkNS3LinkPtr link = static_cast<NetworkNS3LinkPtr>(onelink->p_link);
+
+    if (strcmp(src,dst) && link->m_created){
+      XBT_DEBUG("Route from '%s' to '%s' with link '%s'", src, dst, link->getName());
+      char * link_bdw = xbt_strdup(link->p_bdw);
+      char * link_lat = xbt_strdup(link->p_lat);
       replace_lat_ns3(&link_lat);
       replace_bdw_ns3(&link_bdw);
-      ((surf_ns3_link_t)link)->created = 0;
+      link->m_created = 0;
 
       //   XBT_DEBUG("src (%s), dst (%s), src_id = %d, dst_id = %d",src,dst, src_id, dst_id);
-      XBT_DEBUG("\tLink (%s) bdw:%s lat:%s",((surf_ns3_link_t)link)->data->id,
-                link_bdw,
-                link_lat
-        );
+      XBT_DEBUG("\tLink (%s) bdw:%s lat:%s", link->getName(), link_bdw, link_lat);
 
       //create link ns3
-      ns3_nodes_t host_src = xbt_lib_get_or_null(host_lib,src,NS3_HOST_LEVEL);
-      if(!host_src) host_src = xbt_lib_get_or_null(as_router_lib,src,NS3_ASR_LEVEL);
-      ns3_nodes_t host_dst = xbt_lib_get_or_null(host_lib,dst,NS3_HOST_LEVEL);
-      if(!host_dst) host_dst = xbt_lib_get_or_null(as_router_lib,dst,NS3_ASR_LEVEL);
+      ns3_nodes_t host_src = static_cast<ns3_nodes_t>(xbt_lib_get_or_null(host_lib,src,NS3_HOST_LEVEL));
+      if(!host_src) host_src = static_cast<ns3_nodes_t>(xbt_lib_get_or_null(as_router_lib,src,NS3_ASR_LEVEL));
+      ns3_nodes_t host_dst = static_cast<ns3_nodes_t>(xbt_lib_get_or_null(host_lib,dst,NS3_HOST_LEVEL));
+      if(!host_dst) host_dst = static_cast<ns3_nodes_t>(xbt_lib_get_or_null(as_router_lib,dst,NS3_ASR_LEVEL));
 
       if(host_src && host_dst){}
       else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num);
@@ -295,6 +234,11 @@ static void create_ns3_topology(void)
   }
 }
 
+static void parse_ns3_end_platform(void)
+{
+  ns3_end_platform();
+}
+
 static void define_callbacks_ns3(void)
 {
   sg_platf_host_add_cb (&parse_ns3_add_host);
@@ -306,112 +250,113 @@ static void define_callbacks_ns3(void)
   sg_platf_postparse_add_cb(&parse_ns3_end_platform); //InitializeRoutes
 }
 
+/*********
+ * Model *
+ *********/
 static void free_ns3_link(void * elmts)
 {
-  ns3_link_t link = elmts;
-  free(link->id);
-  free(link->bdw);
-  free(link->lat);
-  free(link);
+  delete static_cast<NetworkNS3LinkPtr>(elmts);
 }
 
 static void free_ns3_host(void * elmts)
 {
-  ns3_nodes_t host = elmts;
+  ns3_nodes_t host = static_cast<ns3_nodes_t>(elmts);
   free(host);
 }
 
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-static int ns3_get_link_latency_limited(surf_action_t action)
-{
-  return 0;
-}
-#endif
-
-#ifdef HAVE_TRACING
-static void ns3_action_set_category(surf_action_t action, const char *category)
-{
-  action->category = xbt_strdup (category);
-}
-#endif
-
 void surf_network_model_init_NS3()
 {
   if (surf_network_model)
     return;
 
-  surf_network_model = surf_model_init();
-  surf_network_model->name = "network NS3";
-  surf_network_model->extension.network.get_link_latency = ns3_get_link_latency;
-  surf_network_model->extension.network.get_link_bandwidth = ns3_get_link_bandwidth;
-  surf_network_model->extension.network.get_route = ns3_get_route;
-
-  surf_network_model->model_private->share_resources = ns3_share_resources;
-  surf_network_model->model_private->update_actions_state = ns3_update_actions_state;
-  surf_network_model->model_private->finalize = finalize;
-
-  surf_network_model->suspend = action_suspend;
-  surf_network_model->resume = action_resume;
-  surf_network_model->is_suspended = action_is_suspended;
-  surf_network_model->action_unref = action_unref;
-  surf_network_model->extension.network.communicate = ns3_communicate;
-
-#ifdef HAVE_TRACING
-  surf_network_model->set_category = ns3_action_set_category;
-#endif
+  surf_network_model = new NetworkNS3Model();
 
-  /* Added the initialization for NS3 interface */
+  xbt_dynar_push(model_list, &surf_network_model);
+}
 
+NetworkNS3Model::NetworkNS3Model() : NetworkModel("network NS3") {
   if (ns3_initialize(xbt_cfg_get_string(_sg_cfg_set, "ns3/TcpModel"))) {
     xbt_die("Impossible to initialize NS3 interface");
   }
-
   routing_model_create(NULL);
   define_callbacks_ns3();
 
   NS3_HOST_LEVEL = xbt_lib_add_level(host_lib,(void_f_pvoid_t)free_ns3_host);
   NS3_ASR_LEVEL  = xbt_lib_add_level(as_router_lib,(void_f_pvoid_t)free_ns3_host);
   NS3_LINK_LEVEL = xbt_lib_add_level(link_lib,(void_f_pvoid_t)free_ns3_link);
-
-  xbt_dynar_push(model_list, &surf_network_model);
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-  surf_network_model->get_latency_limited = ns3_get_link_latency_limited;
-#endif
 }
 
-static void finalize(void)
-{
+NetworkNS3Model::~NetworkNS3Model() {
   ns3_finalize();
   xbt_dynar_free_container(&IPV4addr);
   xbt_dict_free(&dict_socket);
 }
 
-static double ns3_share_resources(double min)
+NetworkLinkPtr NetworkNS3Model::createResource(const char *name,
+                                        double bw_initial,
+                                        tmgr_trace_t bw_trace,
+                                        double lat_initial,
+                                        tmgr_trace_t lat_trace,
+                                        e_surf_resource_state_t state_initial,
+                                        tmgr_trace_t state_trace,
+                                        e_surf_link_sharing_policy_t policy,
+                                        xbt_dict_t properties){
+  if (bw_trace)
+    XBT_INFO("The NS3 network model doesn't support bandwidth state traces");
+  if (lat_trace)
+    XBT_INFO("The NS3 network model doesn't support latency state traces");
+  if (state_trace)
+    XBT_INFO("The NS3 network model doesn't support link state traces");
+  return new NetworkNS3Link(this, name, properties, bw_initial, lat_initial);
+}
+
+xbt_dynar_t NetworkNS3Model::getRoute(RoutingEdgePtr src, RoutingEdgePtr dst)
 {
-  XBT_DEBUG("ns3_share_resources");
+  xbt_dynar_t route = NULL;
+  routing_get_route_and_latency(src, dst, &route, NULL);
+  //routing_platf->getRouteAndLatency(src, dst, &route, NULL);
+  return route;
+}
+
+ActionPtr NetworkNS3Model::communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+                                              double size, double rate)
+{
+  XBT_DEBUG("Communicate from %s to %s", src->getName(), dst->getName());
+  NetworkNS3ActionPtr action = new NetworkNS3Action(this, size, 0);
 
-  xbt_swag_t running_actions =
-    surf_network_model->states.running_action_set;
+  ns3_create_flow(src->getName(), dst->getName(), surf_get_clock(), size, action);
+
+#ifdef HAVE_TRACING
+  action->m_lastSent = 0;
+  action->p_srcElm = src;
+  action->p_dstElm = dst;
+#endif
+
+  return (surf_action_t) action;
+}
+
+double NetworkNS3Model::shareResources(double now)
+{
+  XBT_DEBUG("ns3_share_resources");
 
   //get the first relevant value from the running_actions list
-  if (!xbt_swag_size(running_actions) || min == 0.0)
+  if (!getRunningActionSet()->size() || now == 0.0)
     return -1.0;
   else
     do {
-      ns3_simulator(min);
-      time_to_next_flow_completion = ns3_time() - surf_get_clock();
-    } while(double_equals(time_to_next_flow_completion,0));
+      ns3_simulator(now);
+      time_to_next_flow_completion = ns3_time() - surf_get_clock();//FIXME: use now instead ?
+    } while(double_equals(time_to_next_flow_completion, 0));
 
-  XBT_DEBUG("min       : %f",min);
-  XBT_DEBUG("ns3  time : %f",ns3_time());
-  XBT_DEBUG("surf time : %f",surf_get_clock());
-  XBT_DEBUG("Next completion %f :",time_to_next_flow_completion);
+  XBT_DEBUG("min       : %f", now);
+  XBT_DEBUG("ns3  time : %f", ns3_time());
+  XBT_DEBUG("surf time : %f", surf_get_clock());
+  XBT_DEBUG("Next completion %f :", time_to_next_flow_completion);
 
   return time_to_next_flow_completion;
 }
 
-static void ns3_update_actions_state(double now, double delta)
+void NetworkNS3Model::updateActionsState(double now, double delta)
 {
   xbt_dict_cursor_t cursor = NULL;
   char *key;
@@ -420,50 +365,47 @@ static void ns3_update_actions_state(double now, double delta)
   static xbt_dynar_t socket_to_destroy = NULL;
   if(!socket_to_destroy) socket_to_destroy = xbt_dynar_new(sizeof(char*),NULL);
 
-  surf_action_network_ns3_t action = NULL;
-  xbt_swag_t running_actions =
-    surf_network_model->states.running_action_set;
-
   /* If there are no running flows, just return */
-  if (!xbt_swag_size(running_actions)) {
+  if (!getRunningActionSet()->size()) {
     while(double_positive(now-ns3_time())) {
       ns3_simulator(now-ns3_time());
     }
     return;
   }
 
+  NetworkNS3ActionPtr action;
   xbt_dict_foreach(dict_socket,cursor,key,data){
-    action = (surf_action_network_ns3_t)ns3_get_socket_action(data);
+    action = static_cast<NetworkNS3ActionPtr>(ns3_get_socket_action(data));
     XBT_DEBUG("Processing socket %p (action %p)",data,action);
-    action->generic_action.remains = action->generic_action.cost - ns3_get_socket_sent(data);
-
-#ifdef HAVE_TRACING
-    if (TRACE_is_enabled() &&
-        surf_action_state_get(&(action->generic_action)) == SURF_ACTION_RUNNING){
-      double data_sent = ns3_get_socket_sent(data);
-      double data_delta_sent = data_sent - action->last_sent;
-
-      xbt_dynar_t route = NULL;
-
-      routing_get_route_and_latency (action->src_elm, action->dst_elm, &route, NULL);
-      unsigned int i;
-      for (i = 0; i < xbt_dynar_length (route); i++){
-        surf_ns3_link_t *link = ((surf_ns3_link_t*)xbt_dynar_get_ptr (route, i));
-        TRACE_surf_link_set_utilization ((*link)->generic_resource.name,
-                                         ((surf_action_t) action)->category,
-                                         (data_delta_sent)/delta,
-                                         now-delta,
-                                         delta);
+    action->setRemains(action->getCost() - ns3_get_socket_sent(data));
+
+    #ifdef HAVE_TRACING
+      if (TRACE_is_enabled() &&
+          action->getState() == SURF_ACTION_RUNNING){
+        double data_sent = ns3_get_socket_sent(data);
+        double data_delta_sent = data_sent - action->m_lastSent;
+
+        xbt_dynar_t route = NULL;
+
+        routing_get_route_and_latency (action->p_srcElm, action->p_dstElm, &route, NULL);
+        unsigned int i;
+        for (i = 0; i < xbt_dynar_length (route); i++){
+               NetworkNS3LinkPtr link = ((NetworkNS3LinkPtr)xbt_dynar_get_ptr (route, i));
+          TRACE_surf_link_set_utilization (link->getName(),
+                                           action->getCategory(),
+                                           (data_delta_sent)/delta,
+                                           now-delta,
+                                           delta);
+        }
+        action->m_lastSent = data_sent;
       }
-      action->last_sent = data_sent;
-    }
-#endif
+    #endif
 
     if(ns3_get_socket_is_finished(data) == 1){
       xbt_dynar_push(socket_to_destroy,&key);
       XBT_DEBUG("Destroy socket %p of action %p", key, action);
-      action->generic_action.finish = now;
-      surf_action_state_set(&(action->generic_action), SURF_ACTION_DONE);
+      action->finish();
+      action->setState(SURF_ACTION_DONE);
     }
   }
 
@@ -471,63 +413,81 @@ static void ns3_update_actions_state(double now, double delta)
     xbt_dynar_pop(socket_to_destroy,&key);
 
     void *data = xbt_dict_get (dict_socket, key);
-    surf_action_network_ns3_t action = (surf_action_network_ns3_t)ns3_get_socket_action(data);
+    action = static_cast<NetworkNS3ActionPtr>(ns3_get_socket_action(data));
     XBT_DEBUG ("Removing socket %p of action %p", key, action);
-    xbt_dict_remove(dict_socket,key);
+    xbt_dict_remove(dict_socket, key);
   }
   return;
 }
 
-/* Max durations are not supported */
-static surf_action_t ns3_communicate(sg_routing_edge_t src_elm,
-                                     sg_routing_edge_t dst_elm,
-                                     double size, double rate)
+/************
+ * Resource *
+ ************/
+
+NetworkNS3Link::NetworkNS3Link(NetworkNS3ModelPtr model, const char *name, xbt_dict_t props,
+                                      double bw_initial, double lat_initial)
+ : NetworkLink(model, name, props)
+ , p_bdw(bprintf("%f", bw_initial))
+ , p_lat(bprintf("%f", lat_initial))
+ , m_created(1)
 {
-  surf_action_network_ns3_t action = NULL;
+}
 
-  XBT_DEBUG("Communicate from %s to %s", src_elm->name, dst_elm->name);
-  action = surf_action_new(sizeof(s_surf_action_network_ns3_t), size, surf_network_model, 0);
+NetworkNS3Link::~NetworkNS3Link()
+{
+}
 
-  ns3_create_flow(src_elm->name, dst_elm->name, surf_get_clock(), size, action);
+void NetworkNS3Link::updateState(tmgr_trace_event_t event_type, double value, double date)
+{
 
-#ifdef HAVE_TRACING
-  action->last_sent = 0;
-  action->src_elm = src_elm;
-  action->dst_elm = dst_elm;
-#endif
+}
+double NetworkNS3Link::getLatency()
+{
 
-  return (surf_action_t) action;
 }
+double NetworkNS3Link::getBandwidth()
+{
+
+}
+
+/**********
+ * Action *
+ **********/
+
+NetworkNS3Action::NetworkNS3Action(ModelPtr model, double cost, bool failed)
+: NetworkAction(model, cost, failed)
+{}
 
-/* Suspend a flow() */
-static void action_suspend(surf_action_t action)
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+  int NetworkNS3Action::getLatencyLimited() {
+    return m_latencyLimited;
+  }
+#endif
+
+ void NetworkNS3Action::suspend()
 {
   THROW_UNIMPLEMENTED;
 }
 
-/* Resume a flow() */
-static void action_resume(surf_action_t action)
+void NetworkNS3Action::resume()
 {
   THROW_UNIMPLEMENTED;
 }
 
-/* Test whether a flow is suspended */
-static int action_is_suspended(surf_action_t action)
+  /* Test whether a flow is suspended */
+bool NetworkNS3Action::isSuspended()
 {
   return 0;
 }
 
-static int action_unref(surf_action_t action)
+int NetworkNS3Action::unref()
 {
-  action->refcount--;
-  if (!action->refcount) {
-    xbt_swag_remove(action, action->state_set);
-
-#ifdef HAVE_TRACING
-    xbt_free(action->category);
-#endif
-    XBT_DEBUG ("Removing action %p", action);
-    surf_action_free(&action);
+  m_refcount--;
+  if (!m_refcount) {
+       if (actionHook::is_linked())
+         p_stateSet->erase(p_stateSet->iterator_to(*this));
+    XBT_DEBUG ("Removing action %p", this);
+       delete this;
     return 1;
   }
   return 0;
diff --git a/src/surf/network_ns3.hpp b/src/surf/network_ns3.hpp
new file mode 100644 (file)
index 0000000..f5389b8
--- /dev/null
@@ -0,0 +1,99 @@
+/* Copyright (c) 2004-2014. The SimGrid Team.
+ *
+ * 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 "network_interface.hpp"
+#include "surf/ns3/ns3_interface.h"
+
+#ifndef NETWORK_NS3_HPP_
+#define NETWORK_NS3_HPP_
+
+/***********
+ * Classes *
+ ***********/
+class NetworkNS3Model;
+typedef NetworkNS3Model *NetworkNS3ModelPtr;
+
+class NetworkNS3Link;
+typedef NetworkNS3Link *NetworkNS3LinkPtr;
+
+class NetworkNS3Action;
+typedef NetworkNS3Action *NetworkNS3ActionPtr;
+
+/*********
+ * Tools *
+ *********/
+
+void net_define_callbacks(void);
+
+/*********
+ * Model *
+ *********/
+
+class NetworkNS3Model : public NetworkModel {
+public:
+  NetworkNS3Model();
+
+  ~NetworkNS3Model();
+  NetworkLinkPtr createResource(const char *name,
+                                        double bw_initial,
+                                        tmgr_trace_t bw_trace,
+                                        double lat_initial,
+                                        tmgr_trace_t lat_trace,
+                                        e_surf_resource_state_t state_initial,
+                                        tmgr_trace_t state_trace,
+                                        e_surf_link_sharing_policy_t policy,
+                                        xbt_dict_t properties);
+  xbt_dynar_t getRoute(RoutingEdgePtr src, RoutingEdgePtr dst);
+  ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+                                          double size, double rate);
+  double shareResources(double now);
+  void updateActionsState(double now, double delta);
+};
+
+/************
+ * Resource *
+ ************/
+class NetworkNS3Link : public NetworkLink {
+public:
+  NetworkNS3Link(NetworkNS3ModelPtr model, const char *name, xbt_dict_t props,
+                        double bw_initial, double lat_initial);
+  ~NetworkNS3Link();
+
+  void updateState(tmgr_trace_event_t event_type, double value, double date);
+  double getLatency();
+  double getBandwidth();
+
+//private:
+ char *p_id;
+ char *p_lat;
+ char *p_bdw;
+ int m_created;
+};
+
+/**********
+ * Action *
+ **********/
+class NetworkNS3Action : public NetworkAction {
+public:
+  NetworkNS3Action(ModelPtr model, double cost, bool failed);
+
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+  int getLatencyLimited();
+#endif
+
+bool isSuspended();
+int unref();
+void suspend();
+void resume();
+
+//private:
+#ifdef HAVE_TRACING
+  double m_lastSent;
+  RoutingEdgePtr p_srcElm;
+  RoutingEdgePtr p_dstElm;
+#endif //HAVE_TRACING
+};
+
+
+#endif /* NETWORK_NS3_HPP_ */
diff --git a/src/surf/network_ns3_private.h b/src/surf/network_ns3_private.h
deleted file mode 100644 (file)
index ed0ef1e..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Copyright (c) 2007-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. */
-
-#ifndef _SURF_NETWORK_NS3_PRIVATE_H
-#define _SURF_NETWORK_NS3_PRIVATE_H
-
-#include "surf_private.h"
-#include "xbt/dict.h"
-
-typedef struct ns3_link{
-  char * id;
-  char * lat;
-  char * bdw;
-}s_ns3_link_t, *ns3_link_t;
-
-typedef struct surf_ns3_link{
-  s_surf_resource_t generic_resource;
-  ns3_link_t data;
-  int created;
-}s_surf_ns3_link_t, *surf_ns3_link_t;
-
-typedef struct surf_action_network_ns3 {
-  s_surf_action_t generic_action;
-#ifdef HAVE_TRACING
-  double last_sent;
-  sg_routing_edge_t src_elm;
-  sg_routing_edge_t dst_elm;
-#endif //HAVE_TRACING
-} s_surf_action_network_ns3_t, *surf_action_network_ns3_t;
-
-#endif                          /* _SURF_NETWORK_NS3_PRIVATE_H */
diff --git a/src/surf/network_private.h b/src/surf/network_private.h
deleted file mode 100644 (file)
index e9c56fb..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* 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. */
-
-#ifndef _SURF_NETWORK_PRIVATE_H
-#define _SURF_NETWORK_PRIVATE_H
-
-#include "surf_private.h"
-#include "xbt/dict.h"
-#include "xbt/fifo.h"
-
-typedef struct network_link_CM02 {
-  s_surf_resource_lmm_t lmm_resource;   /* must remain first to be added to a trace */
-
-  /* Using this object with the public part of
-     model does not make sense */
-  double lat_current;
-  tmgr_trace_event_t lat_event;
-} s_link_CM02_t, *link_CM02_t;
-
-typedef struct surf_action_network_CM02 {
-  s_surf_action_lmm_t generic_lmm_action;
-  double latency;
-  double lat_current;
-  double weight;
-  double rate;
-  struct {
-     const char* link_name;
-     double gap;
-     double size;
-     xbt_fifo_item_t fifo_item;
-  } sender;
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-  int latency_limited;
-#endif
-} s_surf_action_network_CM02_t, *surf_action_network_CM02_t;
-
-#endif                          /* _SURF_NETWORK_PRIVATE_H */
diff --git a/src/surf/network_smpi.cpp b/src/surf/network_smpi.cpp
new file mode 100644 (file)
index 0000000..e9dea0e
--- /dev/null
@@ -0,0 +1,224 @@
+/* Copyright (c) 2013-2014. 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 "network_smpi.hpp"
+#include "simgrid/sg_config.h"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network);
+
+xbt_dynar_t smpi_bw_factor = NULL;
+xbt_dynar_t smpi_lat_factor = NULL;
+
+typedef struct s_smpi_factor *smpi_factor_t;
+typedef struct s_smpi_factor {
+  long factor;
+  double value;
+} s_smpi_factor_t;
+
+xbt_dict_t gap_lookup = NULL;
+
+static int factor_cmp(const void *pa, const void *pb)
+{
+ return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor) ? 1 :
+         (((s_smpi_factor_t*)pa)->factor < ((s_smpi_factor_t*)pb)->factor) ? -1 : 0;
+}
+
+
+static xbt_dynar_t parse_factor(const char *smpi_coef_string)
+{
+  char *value = NULL;
+  unsigned int iter = 0;
+  s_smpi_factor_t fact;
+  xbt_dynar_t smpi_factor, radical_elements, radical_elements2 = NULL;
+
+  smpi_factor = xbt_dynar_new(sizeof(s_smpi_factor_t), NULL);
+  radical_elements = xbt_str_split(smpi_coef_string, ";");
+  xbt_dynar_foreach(radical_elements, iter, value) {
+
+    radical_elements2 = xbt_str_split(value, ":");
+    if (xbt_dynar_length(radical_elements2) != 2)
+      xbt_die("Malformed radical for smpi factor!");
+    fact.factor = atol(xbt_dynar_get_as(radical_elements2, 0, char *));
+    fact.value = atof(xbt_dynar_get_as(radical_elements2, 1, char *));
+    xbt_dynar_push_as(smpi_factor, s_smpi_factor_t, fact);
+    XBT_DEBUG("smpi_factor:\t%ld : %f", fact.factor, fact.value);
+    xbt_dynar_free(&radical_elements2);
+  }
+  xbt_dynar_free(&radical_elements);
+  iter=0;
+  xbt_dynar_sort(smpi_factor, &factor_cmp);
+  xbt_dynar_foreach(smpi_factor, iter, fact) {
+    XBT_DEBUG("ordered smpi_factor:\t%ld : %f", fact.factor, fact.value);
+
+  }
+  return smpi_factor;
+}
+
+/*********
+ * Model *
+ *********/
+
+/************************************************************************/
+/* New model based on LV08 and experimental results of MPI ping-pongs   */
+/************************************************************************/
+/* @Inproceedings{smpi_ipdps, */
+/*  author={Pierre-Nicolas Clauss and Mark Stillwell and Stéphane Genaud and Frédéric Suter and Henri Casanova and Martin Quinson}, */
+/*  title={Single Node On-Line Simulation of {MPI} Applications with SMPI}, */
+/*  booktitle={25th IEEE International Parallel and Distributed Processing Symposium (IPDPS'11)}, */
+/*  address={Anchorage (Alaska) USA}, */
+/*  month=may, */
+/*  year={2011} */
+/*  } */
+void surf_network_model_init_SMPI(void)
+{
+
+  if (surf_network_model)
+    return;
+  surf_network_model = new NetworkSmpiModel();
+  net_define_callbacks();
+  xbt_dynar_push(model_list, &surf_network_model);
+  //network_solve = lmm_solve;
+
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/sender_gap", 10e-6);
+  xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
+}
+
+NetworkSmpiModel::NetworkSmpiModel()
+ : NetworkCm02Model() {
+       m_haveGap=true;
+}
+
+NetworkSmpiModel::~NetworkSmpiModel(){
+  if (gap_lookup) {
+    xbt_dict_free(&gap_lookup);
+  }
+  if (smpi_bw_factor) {
+    xbt_dynar_free(&smpi_bw_factor);
+    smpi_bw_factor = NULL;
+  }
+  if (smpi_lat_factor) {
+    xbt_dynar_free(&smpi_lat_factor);
+    smpi_lat_factor = NULL;
+  }
+}
+
+void NetworkSmpiModel::gapAppend(double size, const NetworkLinkPtr link, NetworkActionPtr action)
+{
+  const char *src = link->getName();
+  xbt_fifo_t fifo;
+  //surf_action_network_CM02_t last_action;
+  //double bw;
+
+  if (sg_sender_gap > 0.0) {
+    if (!gap_lookup) {
+      gap_lookup = xbt_dict_new_homogeneous(NULL);
+    }
+    fifo = (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup, src);
+    action->m_senderGap = 0.0;
+    if (fifo && xbt_fifo_size(fifo) > 0) {
+      /* Compute gap from last send */
+      /*last_action =
+          (surf_action_network_CM02_t)
+          xbt_fifo_get_item_content(xbt_fifo_get_last_item(fifo));*/
+     // bw = net_get_link_bandwidth(link);
+      action->m_senderGap = sg_sender_gap;
+        /*  max(sg_sender_gap,last_action->sender.size / bw);*/
+      action->m_latency += action->m_senderGap;
+    }
+    /* Append action as last send */
+    /*action->sender.link_name = link->lmm_resource.generic_resource.name;
+    fifo =
+        (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup,
+                                          action->sender.link_name);
+    if (!fifo) {
+      fifo = xbt_fifo_new();
+      xbt_dict_set(gap_lookup, action->sender.link_name, fifo, NULL);
+    }
+    action->sender.fifo_item = xbt_fifo_push(fifo, action);*/
+    action->m_senderSize = size;
+  }
+}
+
+void NetworkSmpiModel::gapRemove(ActionPtr lmm_action)
+{
+  xbt_fifo_t fifo;
+  size_t size;
+  NetworkCm02ActionPtr action = static_cast<NetworkCm02ActionPtr>(lmm_action);
+
+  if (sg_sender_gap > 0.0 && action->p_senderLinkName
+      && action->p_senderFifoItem) {
+    fifo =
+        (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup,
+                                          action->p_senderLinkName);
+    xbt_fifo_remove_item(fifo, action->p_senderFifoItem);
+    size = xbt_fifo_size(fifo);
+    if (size == 0) {
+      xbt_fifo_free(fifo);
+      xbt_dict_remove(gap_lookup, action->p_senderLinkName);
+      size = xbt_dict_length(gap_lookup);
+      if (size == 0) {
+        xbt_dict_free(&gap_lookup);
+      }
+    }
+  }
+}
+
+double NetworkSmpiModel::bandwidthFactor(double size)
+{
+  if (!smpi_bw_factor)
+    smpi_bw_factor =
+        parse_factor(sg_cfg_get_string("smpi/bw_factor"));
+
+  unsigned int iter = 0;
+  s_smpi_factor_t fact;
+  double current=1.0;
+  xbt_dynar_foreach(smpi_bw_factor, iter, fact) {
+    if (size <= fact.factor) {
+      XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current);
+      return current;
+    }else
+      current=fact.value;
+  }
+  XBT_DEBUG("%f > %ld return %f", size, fact.factor, current);
+
+  return current;
+}
+
+double NetworkSmpiModel::latencyFactor(double size)
+{
+  if (!smpi_lat_factor)
+    smpi_lat_factor =
+        parse_factor(sg_cfg_get_string("smpi/lat_factor"));
+
+  unsigned int iter = 0;
+  s_smpi_factor_t fact;
+  double current=1.0;
+  xbt_dynar_foreach(smpi_lat_factor, iter, fact) {
+    if (size <= fact.factor) {
+      XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current);
+      return current;
+    }else
+      current=fact.value;
+  }
+  XBT_DEBUG("%f > %ld return %f", size, fact.factor, current);
+
+  return current;
+}
+
+double NetworkSmpiModel::bandwidthConstraint(double rate, double bound, double size)
+{
+  return rate < 0 ? bound : min(bound, rate * bandwidthFactor(size));
+}
+
+/************
+ * Resource *
+ ************/
+
+
+
+/**********
+ * Action *
+ **********/
diff --git a/src/surf/network_smpi.hpp b/src/surf/network_smpi.hpp
new file mode 100644 (file)
index 0000000..a27ef04
--- /dev/null
@@ -0,0 +1,48 @@
+/* Copyright (c) 2013-2014. 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 "network_cm02.hpp"
+
+/***********
+ * Classes *
+ ***********/
+
+class NetworkSmpiModel;
+typedef NetworkSmpiModel *NetworkSmpiModelPtr;
+
+/*********
+ * Tools *
+ *********/
+
+/*********
+ * Model *
+ *********/
+
+class NetworkSmpiModel : public NetworkCm02Model {
+public:
+  NetworkSmpiModel();
+  ~NetworkSmpiModel();
+
+  void gapAppend(double size, const NetworkLinkPtr link, NetworkActionPtr action);
+  void gapRemove(ActionPtr action);
+  double latencyFactor(double size);
+  double bandwidthFactor(double size);
+  double bandwidthConstraint(double rate, double bound, double size);
+  void communicateCallBack() {};
+};
+
+
+/************
+ * Resource *
+ ************/
+
+
+/**********
+ * Action *
+ **********/
+
+
+
diff --git a/src/surf/new_model.c b/src/surf/new_model.c
deleted file mode 100644 (file)
index b4346d9..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-/* Copyright (c) 2004-2013. 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. */
-
-/* ********************************************************************* */
-/* TUTORIAL: New model                                                   */
-/* ********************************************************************* */
-
-#include "xbt/ex.h"
-#include "xbt/dict.h"
-#include "portable.h"
-#include "surf_private.h"
-#include "new_model_private.h"
-#include "surf/surf_resource.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_new_model, surf,
-                                "Logging specific to the SURF new model module");
-
-surf_model_t surf_new_model = NULL;
-lmm_system_t new_model_maxmin_system = NULL;
-static int new_model_selective_update = 0;
-static xbt_swag_t
-    new_model_running_action_set_that_does_not_need_being_checked = NULL;
-
-#define GENERIC_LMM_ACTION(action) action->generic_lmm_action
-#define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action
-
-static void new_model_action_state_set(surf_action_t action, e_surf_action_state_t state);
-
-static surf_action_t new_model_action_execute ()
-{
-  THROW_UNIMPLEMENTED;
-  return NULL;
-}
-
-static surf_action_t new_model_action_fct()
-{
-  surf_action_t action = new_model_action_execute();
-  return action;
-}
-
-static void* new_model_create_resource(const char* id, const char* model,const char* type_id,const char* content_name)
-{
-  THROW_UNIMPLEMENTED;
-  return NULL;
-}
-
-static void new_model_finalize(void)
-{
-  lmm_system_free(new_model_maxmin_system);
-  new_model_maxmin_system = NULL;
-
-  surf_model_exit(surf_new_model);
-  surf_new_model = NULL;
-
-  xbt_swag_free
-      (new_model_running_action_set_that_does_not_need_being_checked);
-  new_model_running_action_set_that_does_not_need_being_checked = NULL;
-}
-
-static void new_model_update_actions_state(double now, double delta)
-{
-  return;
-}
-
-static double new_model_share_resources(double NOW)
-{
-  return -1;
-}
-
-static int new_model_resource_used(void *resource_id)
-{
-  THROW_UNIMPLEMENTED;
-  return 0;
-}
-
-static void new_model_resources_state(void *id, tmgr_trace_event_t event_type,
-                                 double value, double time)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-static int new_model_action_unref(surf_action_t action)
-{
-  THROW_UNIMPLEMENTED;
-  return 0;
-}
-
-static void new_model_action_cancel(surf_action_t action)
-{
-  surf_action_state_set(action, SURF_ACTION_FAILED);
-  return;
-}
-
-static void new_model_action_state_set(surf_action_t action, e_surf_action_state_t state)
-{
-  surf_action_state_set(action, state);
-  return;
-}
-
-static void new_model_action_suspend(surf_action_t action)
-{
-  XBT_IN("(%p)", action);
-  if (((surf_action_lmm_t) action)->suspended != 2) {
-    lmm_update_variable_weight(new_model_maxmin_system,
-                               ((surf_action_lmm_t) action)->variable,
-                               0.0);
-    ((surf_action_lmm_t) action)->suspended = 1;
-  }
-  XBT_OUT();
-}
-
-static void new_model_action_resume(surf_action_t action)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-static int new_model_action_is_suspended(surf_action_t action)
-{
-  return (((surf_action_lmm_t) action)->suspended == 1);
-}
-
-static void new_model_action_set_max_duration(surf_action_t action, double duration)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-static void new_model_action_set_priority(surf_action_t action, double priority)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-static void new_model_define_callbacks()
-{
-}
-
-static void surf_new_model_init_internal(void)
-{
-  s_surf_action_t action;
-
-  XBT_DEBUG("surf_new_model_model_init_internal");
-  surf_new_model = surf_model_init();
-
-  new_model_running_action_set_that_does_not_need_being_checked =
-      xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
-  surf_new_model->name = "New Model";
-  surf_new_model->action_unref = new_model_action_unref;
-  surf_new_model->action_cancel = new_model_action_cancel;
-  surf_new_model->action_state_set = new_model_action_state_set;
-
-  surf_new_model->model_private->finalize = new_model_finalize;
-  surf_new_model->model_private->update_actions_state = new_model_update_actions_state;
-  surf_new_model->model_private->share_resources = new_model_share_resources;
-  surf_new_model->model_private->resource_used = new_model_resource_used;
-  surf_new_model->model_private->update_resource_state = new_model_resources_state;
-
-  surf_new_model->suspend = new_model_action_suspend;
-  surf_new_model->resume = new_model_action_resume;
-  surf_new_model->is_suspended = new_model_action_is_suspended;
-  surf_new_model->set_max_duration = new_model_action_set_max_duration;
-  surf_new_model->set_priority = new_model_action_set_priority;
-
-  surf_new_model->extension.new_model.fct = new_model_action_fct;
-  surf_new_model->extension.new_model.create_resource = new_model_create_resource;
-
-  if (!new_model_maxmin_system) {
-    new_model_maxmin_system = lmm_system_new(new_model_selective_update);
-  }
-
-}
-
-void surf_new_model_init_default(void)
-{
-  surf_new_model_init_internal();
-  new_model_define_callbacks();
-
-  xbt_dynar_push(model_list, &surf_new_model);
-}
diff --git a/src/surf/new_model_private.h b/src/surf/new_model_private.h
deleted file mode 100644 (file)
index 3cdbeeb..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * TUTORIAL: New model
- * new_model_private.h
- *
- *  Created on: 12 October 2012
- *      Author: navarro
- */
-
-#ifndef NEW_MODEL_PRIVATE_H_
-#define NEW_MODEL_PRIVATE_H_
-
-
-
-#endif /* NEW_MODEL_PRIVATE_H_ */
index f59149a..b5a80b8 100644 (file)
@@ -1,4 +1,9 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* Copyright (c) 2011, 2014. 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. */
+
 /*
  * Copyright (c) 2008 INRIA
  *
@@ -18,7 +23,7 @@
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
 
-#include "ns3/abort.h"
+#include <ns3/abort.h>
 #include "ns3/log.h"
 #include "ns3/simulator.h"
 #include "ns3/point-to-point-net-device.h"
index 7edd931..3911f00 100644 (file)
@@ -1,4 +1,9 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* Copyright (c) 2011, 2014. 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. */
+
 /*
  * Copyright (c) 2008 INRIA
  *
index f42f9f9..4c3d591 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -234,7 +234,6 @@ void * ns3_add_link(int src, e_ns3_network_element_type_t type_src,
                LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
        }
 
-
        MyPointToPointHelper pointToPoint;
 
        NetDeviceContainer netA;
index 6105510..db6b193 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -25,9 +25,7 @@ typedef struct ns3_nodes{
   void * data;
 }s_ns3_nodes_t, *ns3_nodes_t;
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+SG_BEGIN_DECL()
 
 XBT_PUBLIC(int)    ns3_finalize(void);
 XBT_PUBLIC(int)    ns3_initialize(const char* TcpProtocol);
@@ -47,8 +45,7 @@ XBT_PUBLIC(void *) ns3_add_link(int src, e_ns3_network_element_type_t type_src,
                 char * bw,char * lat);
 XBT_PUBLIC(void *) ns3_end_platform(void);
 XBT_PUBLIC(void *) ns3_add_cluster(char * bw,char * lat,const char *id);
-#ifdef __cplusplus
-}
-#endif
+
+SG_END_DECL()
 
 #endif
index d985d73..4ad133e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 0429c50..116c74b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index ca26c5e..02d68d7 100644 (file)
@@ -1,4 +1,9 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* Copyright (c) 2011, 2014. 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. */
+
 /*
  * Copyright (c) 2010 Regents of the University of California
  *
index 1adece9..92df83e 100644 (file)
@@ -1,4 +1,9 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* Copyright (c) 2011, 2014. 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. */
+
 /*
  * Copyright (c) 2010 Regents of the University of California
  *
index 63e816e..756cf0a 100644 (file)
@@ -1,4 +1,8 @@
+/* Copyright (c) 2012, 2014. 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/platf_generator.h"
 #include "platf_generator_private.h"
index 12cfdd0..9b04b44 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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 SG_PLATF_GEN_PRIVATE_H
 #define SG_PLATF_GEN_PRIVATE_H
 
diff --git a/src/surf/plugins/energy.cpp b/src/surf/plugins/energy.cpp
new file mode 100644 (file)
index 0000000..993ac0b
--- /dev/null
@@ -0,0 +1,179 @@
+/* Copyright (c) 2010, 2012-2014. 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 "energy.hpp"
+#include "../cpu_cas01.hpp"
+
+/** @addtogroup SURF_plugin_energy
+ *    
+ *  
+ *  BlaBla energy
+ */
+
+XBT_LOG_EXTERNAL_CATEGORY(surf_kernel);
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_energy, surf,
+                                "Logging specific to the SURF energy plugin");
+
+std::map<CpuPtr, CpuEnergyPtr> *surf_energy=NULL;
+
+static void energyCpuCreatedCallback(CpuPtr cpu){
+  (*surf_energy)[cpu] = new CpuEnergy(cpu);
+}
+
+static void energyCpuDestructedCallback(CpuPtr cpu){
+  std::map<CpuPtr, CpuEnergyPtr>::iterator cpuIt = surf_energy->find(cpu);
+  xbt_assert(cpuIt != surf_energy->end(), "The cpu is not in surf_energy.");
+  XBT_INFO("Total energy (Joules) of host %s: %f", cpu->getName(), cpuIt->second->getConsumedEnergy());
+  delete cpuIt->second;
+  surf_energy->erase(cpuIt);
+}
+
+static void energyCpuActionStateChangedCallback(CpuActionPtr action){
+  CpuPtr cpu  = getActionCpu(action);
+  CpuEnergyPtr cpu_energy = (*surf_energy)[cpu];
+
+  if(cpu_energy->last_updated < surf_get_clock()) {
+       double cpu_load = lmm_constraint_get_usage(cpu->getConstraint()) / cpu->m_powerPeak;
+    double start_time = cpu_energy->last_updated;
+    double finish_time = surf_get_clock();
+
+    /*XBT_DEBUG("[cpu_update_energy] action time interval=(%f-%f), current power peak=%f, current pstate=%d",
+                 start_time, finish_time, cpu->m_powerPeak, cpu->m_pstate);*/
+    XBT_DEBUG("[cpu_update_energy] action time interval=(%f-%f), current power peak=%f",
+                 start_time, finish_time, cpu->m_powerPeak);
+    double current_energy = cpu_energy->total_energy;
+    double action_energy = cpu_energy->getCurrentWattsValue(cpu_load)*(finish_time-start_time);
+
+    cpu_energy->total_energy = current_energy + action_energy;
+    cpu_energy->last_updated = finish_time;
+
+    XBT_DEBUG("[cpu_update_energy] old_energy_value=%f, action_energy_value=%f", current_energy, action_energy);
+  }
+}
+
+static void sg_energy_plugin_exit()
+{
+  delete surf_energy;
+  surf_energy = NULL;
+}
+
+/** \ingroup SURF_plugin_energy
+ * \brief Enable energy plugin
+ * \details Enable energy plugin to get joules consumption of each cpu.
+ */
+void sg_energy_plugin_init() {
+  if (surf_energy == NULL) {
+    surf_energy = new std::map<CpuPtr, CpuEnergyPtr>();
+    surf_callback_connect(cpuCreatedCallbacks, energyCpuCreatedCallback);
+    surf_callback_connect(cpuDestructedCallbacks, energyCpuDestructedCallback);
+    surf_callback_connect(cpuActionStateChangedCallbacks, energyCpuActionStateChangedCallback);
+    surf_callback_connect(surfExitCallbacks, sg_energy_plugin_exit);
+  }
+}
+
+/**
+ *
+ */
+CpuEnergy::CpuEnergy(CpuPtr ptr)
+ : cpu(ptr)
+{
+  total_energy = 0;
+  power_range_watts_list = getWattsRangeList();
+  last_updated = surf_get_clock();
+}
+
+CpuEnergy::~CpuEnergy(){
+  unsigned int iter;
+  xbt_dynar_t power_tuple = NULL;
+  xbt_dynar_foreach(power_range_watts_list, iter, power_tuple)
+    xbt_dynar_free(&power_tuple);
+  xbt_dynar_free(&power_range_watts_list);
+}
+
+
+/**
+ * Computes the power consumed by the host according to the current pstate and processor load
+ *
+ */
+double CpuEnergy::getCurrentWattsValue(double cpu_load)
+{
+       xbt_dynar_t power_range_list = power_range_watts_list;
+
+       if (power_range_list == NULL)
+       {
+               XBT_DEBUG("No power range properties specified for host %s", cpu->getName());
+               return 0;
+       }
+       /*xbt_assert(xbt_dynar_length(power_range_list) == xbt_dynar_length(cpu->p_powerPeakList),
+                                               "The number of power ranges in the properties does not match the number of pstates for host %s",
+                                               cpu->getName());*/
+
+    /* retrieve the power values associated with the current pstate */
+    xbt_dynar_t current_power_values = xbt_dynar_get_as(power_range_list, static_cast<CpuCas01Ptr>(cpu)->getPState(), xbt_dynar_t);
+
+    /* min_power corresponds to the idle power (cpu load = 0) */
+    /* max_power is the power consumed at 100% cpu load       */
+    double min_power = xbt_dynar_get_as(current_power_values, 0, double);
+    double max_power = xbt_dynar_get_as(current_power_values, 1, double);
+    double power_slope = max_power - min_power;
+
+    double current_power = min_power + cpu_load * power_slope;
+
+       XBT_DEBUG("[get_current_watts] min_power=%f, max_power=%f, slope=%f", min_power, max_power, power_slope);
+    XBT_DEBUG("[get_current_watts] Current power (watts) = %f, load = %f", current_power, cpu_load);
+
+       return current_power;
+}
+
+double CpuEnergy::getConsumedEnergy()
+{
+  return total_energy;
+}
+
+xbt_dynar_t CpuEnergy::getWattsRangeList()
+{
+       xbt_dynar_t power_range_list;
+       xbt_dynar_t power_tuple;
+       int i = 0, pstate_nb=0;
+       xbt_dynar_t current_power_values;
+       double min_power, max_power;
+
+       if (cpu->getProperties() == NULL)
+               return NULL;
+
+       char* all_power_values_str = (char*)xbt_dict_get_or_null(cpu->getProperties(), "power_per_state");
+
+       if (all_power_values_str == NULL)
+               return NULL;
+
+
+       power_range_list = xbt_dynar_new(sizeof(xbt_dynar_t), NULL);
+       xbt_dynar_t all_power_values = xbt_str_split(all_power_values_str, ",");
+
+       pstate_nb = xbt_dynar_length(all_power_values);
+       for (i=0; i< pstate_nb; i++)
+       {
+               /* retrieve the power values associated with the current pstate */
+               current_power_values = xbt_str_split(xbt_dynar_get_as(all_power_values, i, char*), ":");
+               xbt_assert(xbt_dynar_length(current_power_values) > 1,
+                               "Power properties incorrectly defined - could not retrieve min and max power values for host %s",
+                               cpu->getName());
+
+               /* min_power corresponds to the idle power (cpu load = 0) */
+               /* max_power is the power consumed at 100% cpu load       */
+               min_power = atof(xbt_dynar_get_as(current_power_values, 0, char*));
+               max_power = atof(xbt_dynar_get_as(current_power_values, 1, char*));
+
+               power_tuple = xbt_dynar_new(sizeof(double), NULL);
+               xbt_dynar_push_as(power_tuple, double, min_power);
+               xbt_dynar_push_as(power_tuple, double, max_power);
+
+               xbt_dynar_push_as(power_range_list, xbt_dynar_t, power_tuple);
+               xbt_dynar_free(&current_power_values);
+       }
+       xbt_dynar_free(&all_power_values);
+       return power_range_list;
+}
diff --git a/src/surf/plugins/energy.hpp b/src/surf/plugins/energy.hpp
new file mode 100644 (file)
index 0000000..5839da8
--- /dev/null
@@ -0,0 +1,33 @@
+/* Copyright (c) 2014. 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 "../cpu_interface.hpp"
+#include <map>
+
+#ifndef CALLBACK_HPP_
+#define CALLBACK_HPP_
+
+class CpuEnergy;
+typedef CpuEnergy *CpuEnergyPtr;
+
+extern std::map<CpuPtr, CpuEnergyPtr> *surf_energy;
+
+class CpuEnergy {
+public:
+  CpuEnergy(CpuPtr ptr);
+  ~CpuEnergy();
+
+  double getCurrentWattsValue(double cpu_load);
+  double getConsumedEnergy();
+  xbt_dynar_t getWattsRangeList();
+
+  xbt_dynar_t power_range_watts_list;          /*< List of (min_power,max_power) pairs corresponding to each cpu pstate */
+  double total_energy;                                 /*< Total energy consumed by the host */
+  double last_updated;                                 /*< Timestamp of the last energy update event*/
+  CpuPtr cpu;
+};
+
+#endif /* CALLBACK_HPP_ */
index ec259a0..091e6c2 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "surf/random_mgr.h"
 #include "xbt/sysdep.h"
index 7e4d613..504e9e3 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index a8cfd81..6438fc4 100644 (file)
@@ -27,9 +27,9 @@
 
 <!ELEMENT AS ((prop*),(((AS|include|storage_type|storage|link|backbone|cabinet|cluster|peer|trace|trace_connect)*,(ASroute|trace|trace_connect|bypassASroute)*,(trace|trace_connect)*)|((include|storage_type|storage|host|gpu|cabinet|router|link|backbone|trace|trace_connect|host_link)*,(route|trace|trace_connect|bypassRoute)*)))>
 <!ATTLIST AS id CDATA #REQUIRED>
-<!ATTLIST AS routing (Full|Floyd|Dijkstra|DijkstraCache|None|Vivaldi|Cluster) "None">
+<!ATTLIST AS routing (Full|Floyd|Dijkstra|DijkstraCache|None|Vivaldi|Cluster|Cluster_torus) #REQUIRED>
 
-<!ELEMENT storage_type (prop*)>
+<!ELEMENT storage_type ((model_prop|prop)*)>
 <!ATTLIST storage_type id       CDATA #REQUIRED>
 <!ATTLIST storage_type model    CDATA #REQUIRED>
 <!ATTLIST storage_type size     CDATA #REQUIRED>
@@ -79,6 +79,8 @@
 <!ATTLIST cluster bw CDATA #REQUIRED>
 <!ATTLIST cluster lat CDATA #REQUIRED>
 <!ATTLIST cluster sharing_policy (SHARED|FULLDUPLEX|FATPIPE) "FULLDUPLEX">
+<!ATTLIST cluster topology (FLAT|TORUS) "FLAT">
+<!ATTLIST cluster topo_parameters CDATA "">
 <!ATTLIST cluster bb_bw CDATA "">
 <!ATTLIST cluster bb_lat CDATA "">
 <!ATTLIST cluster bb_sharing_policy (SHARED|FATPIPE) "SHARED">
 <!ELEMENT prop EMPTY>
 <!ATTLIST prop id CDATA #REQUIRED> <!-- <!ATTLIST prop key CDATA #REQUIRED> -->
 <!ATTLIST prop value CDATA #REQUIRED>
+
+<!ELEMENT model_prop EMPTY>
+<!ATTLIST model_prop id CDATA #REQUIRED> <!-- <!ATTLIST model_prop key CDATA #REQUIRED> -->
+<!ATTLIST model_prop value CDATA #REQUIRED>
index 42d9ebd..18336c9 100644 (file)
@@ -403,8 +403,8 @@ static void yy_fatal_error (yyconst char msg[]  );
        *yy_cp = '\0'; \
        (yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 568
-#define YY_END_OF_BUFFER 569
+#define YY_NUM_RULES 589
+#define YY_END_OF_BUFFER 590
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -412,7 +412,7 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_accept[3323] =
+static yyconst flex_int16_t yy_accept[3458] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -441,345 +441,359 @@ static yyconst flex_int16_t yy_accept[3323] =
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  569,  567,
-       15,   10,   10,   15,   15,  547,   10,  547,    5,    6,
-        5,    8,    9,    8,  563,  555,  556,  564,  561,  564,
-      562,  566,  555,  556,  566,  567,   22,   10,   22,   22,
-       22,   20,   22,   26,   10,   26,   26,  567,   26,  567,
-
-      567,   26,   33,   10,   33,   33,   33,   31,   33,   37,
-       10,   37,   37,   48,   10,   48,   48,   48,   46,   48,
-       48,   48,  564,  563,   78,   10,   78,   78,   78,   76,
-       78,   78,   78,   78,   78,   82,   10,   82,  101,   10,
-      101,  101,  101,   99,  101,  101,  101,  105,   10,  105,
-      126,   10,  126,  126,  126,  124,  126,  126,  130,   10,
-      130,  130,  567,  130,  567,  130,  130,  567,  567,  130,
-      567,  130,  567,  130,  145,   10,  145,  145,  145,  143,
-      145,  145,  145,  145,  149,   10,  149,  149,  162,   10,
-      162,  162,  162,  160,  162,  162,  162,  166,   10,  166,
-
-      166,  175,   10,  175,  175,  175,  173,  175,  175,  179,
-       10,  179,  188,   10,  188,  188,  188,  186,  188,  188,
-      192,   10,  192,  217,   10,  217,  217,  217,  215,  217,
-      217,  217,  217,  217,  221,   10,  221,  567,  221,  228,
-       10,  228,  228,  228,  226,  228,  232,   10,  232,  243,
-       10,  243,  243,  243,  241,  243,  243,  243,  247,   10,
-      247,  294,   10,  294,  294,  294,  292,  294,  294,  294,
-      294,  294,  294,  294,  294,  298,   10,  298,  298,  317,
-       10,  317,  317,  317,  315,  317,  317,  317,  317,  317,
-      317,  321,   10,  321,  342,   10,  342,  342,  342,  340,
-
-      342,  342,  342,  342,  342,  342,  342,  346,   10,  346,
-      355,   10,  355,  355,  355,  353,  355,  355,  359,   10,
-      359,  370,   10,  370,  370,  370,  368,  370,  370,  370,
-      374,   10,  374,  401,   10,  401,  401,  401,  399,  401,
-      401,  401,  401,  405,   10,  405,  405,  418,   10,  418,
-      418,  418,  416,  418,  418,  422,   10,  422,  567,  422,
-      439,   10,  439,  439,  439,  437,  439,  439,  439,  443,
-       10,  443,  443,  456,   10,  456,  456,  456,  454,  456,
-      456,  460,   10,  460,  469,   10,  469,  469,  469,  467,
-      469,  469,  473,   10,  473,  473,  486,   10,  486,  486,
-
-      486,  484,  486,  486,  486,  490,   10,  490,  490,  507,
-       10,  507,  507,  507,  505,  507,  507,  507,  507,  507,
-      511,   10,  511,  567,  511,  518,   10,  518,  518,  518,
-      516,  518,  522,   10,  522,  529,   10,  529,  529,  529,
-      527,  529,  533,   10,  533,  533,  542,   10,  542,  542,
-      542,  540,  542,  542,  546,   10,  546,   10,    0,    2,
-        2,    0,    4,    7,  558,  557,    0,    0,    0,    0,
-        0,    0,    0,   21,   23,   23,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  590,  588,   15,   10,   10,   15,   15,  568,
+       10,  568,    5,    6,    5,    8,    9,    8,  584,  576,
+      577,  585,  582,  585,  583,  587,  576,  577,  587,  588,
+       22,   10,   22,   22,   22,   20,   22,   26,   10,   26,
+
+       26,  588,   26,  588,  588,   26,   33,   10,   33,   33,
+       33,   31,   33,   37,   10,   37,   37,   48,   10,   48,
+       48,   48,   46,   48,   48,   48,  585,  584,   78,   10,
+       78,   78,   78,   76,   78,   78,   78,   78,   78,   82,
+       10,   82,  101,   10,  101,  101,  101,   99,  101,  101,
+      101,  105,   10,  105,  128,   10,  128,  128,  128,  126,
+      128,  128,  132,   10,  132,  132,  588,  132,  588,  132,
+      132,  588,  588,  132,  588,  132,  588,  132,  147,   10,
+      147,  147,  147,  145,  147,  147,  147,  147,  151,   10,
+      151,  588,  151,  164,   10,  164,  164,  164,  162,  164,
+
+      164,  164,  168,   10,  168,  168,  177,   10,  177,  177,
+      177,  175,  177,  177,  181,   10,  181,  190,   10,  190,
+      190,  190,  188,  190,  190,  194,   10,  194,  219,   10,
+      219,  219,  219,  217,  219,  219,  219,  219,  219,  223,
+       10,  223,  588,  223,  230,   10,  230,  230,  230,  228,
+      230,  234,   10,  234,  245,   10,  245,  245,  245,  243,
+      245,  245,  245,  249,   10,  249,  302,   10,  302,  302,
+      302,  300,  302,  302,  302,  302,  302,  302,  302,  302,
+      302,  306,   10,  306,  306,  325,   10,  325,  325,  325,
+      323,  325,  325,  325,  325,  325,  325,  329,   10,  329,
+
+      350,   10,  350,  350,  350,  348,  350,  350,  350,  350,
+      350,  350,  350,  354,   10,  354,  363,   10,  363,  363,
+      363,  361,  363,  363,  367,   10,  367,  378,   10,  378,
+      378,  378,  376,  378,  378,  378,  382,   10,  382,  409,
+       10,  409,  409,  409,  407,  409,  409,  409,  409,  413,
+       10,  413,  413,  426,   10,  426,  426,  426,  424,  426,
+      426,  430,   10,  430,  588,  430,  447,   10,  447,  447,
+      447,  445,  447,  447,  447,  451,   10,  451,  451,  464,
+       10,  464,  464,  464,  462,  464,  464,  468,   10,  468,
+      477,   10,  477,  477,  477,  475,  477,  477,  481,   10,
+
+      481,  481,  494,   10,  494,  494,  494,  492,  494,  494,
+      494,  498,   10,  498,  498,  515,   10,  515,  515,  515,
+      513,  515,  515,  515,  515,  515,  519,   10,  519,  588,
+      519,  526,   10,  526,  526,  526,  524,  526,  530,   10,
+      530,  537,   10,  537,  537,  537,  535,  537,  541,   10,
+      541,  541,  550,   10,  550,  550,  550,  548,  550,  550,
+      554,   10,  554,  563,   10,  563,  563,  563,  561,  563,
+      563,  567,   10,  567,   10,    0,    2,    2,    0,    4,
+        7,  579,  578,    0,    0,    0,    0,    0,    0,    0,
+       21,   23,   23,    0,    0,    0,    0,    0,    0,    0,
 
-       32,   34,   34,    0,   47,   49,   49,   49,   49,    0,
-        0,    0,   77,   79,   79,   79,   79,   79,   79,   79,
-       79,   79,    0,  100,  102,  102,  102,  102,    0,  125,
-      127,  127,  127,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  144,  146,  146,  146,  146,  146,    0,  161,
-      163,  163,  163,  163,    0,  174,  176,  176,  176,    0,
-      187,  189,  189,  189,    0,  216,  218,  218,  218,  218,
-      218,  218,  218,    0,    0,  227,  229,  229,    0,  242,
-      244,  244,  244,  244,    0,  293,  295,  295,  295,  295,
-
-      295,  295,  295,  295,  295,  295,  295,  295,  295,  295,
-      295,  295,    0,  316,  318,  318,  318,  318,  318,  318,
-      318,  318,    0,  341,  343,  343,  343,  343,  343,  343,
-      343,  343,    0,  354,  356,  356,  356,    0,  369,  371,
-      371,  371,  371,    0,  400,  402,  402,  402,  402,  402,
-      402,    0,  417,  419,  419,  419,  419,    0,    0,  438,
-      440,  440,  440,  440,  440,    0,  455,  457,  457,  457,
-        0,  468,  470,  470,  470,    0,  485,  487,  487,  487,
-      487,    0,  506,  508,  508,  508,  508,  508,  508,    0,
-        0,  517,  519,  519,    0,  528,  530,  530,    0,  541,
-
-      543,  543,  543,    0,    0,    0,    0,    0,    3,    0,
-        0,    0,    0,    0,    0,    0,  565,    0,   23,    0,
-        0,  107,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   32,   34,   34,
+        0,   47,   49,   49,   49,   49,    0,    0,    0,   77,
+       79,   79,   79,   79,   79,   79,   79,   79,   79,    0,
+      100,  102,  102,  102,  102,    0,  127,  129,  129,  129,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  106,    0,    0,    0,    0,    0,    0,
-       34,    0,    0,   49,    0,    0,   49,    0,    0,    0,
-      560,   79,    0,    0,   79,   79,   79,   79,   79,   79,
-        0,    0,  102,  102,  102,    0,    0,    0,    0,  127,
-        0,    0,  107,    0,    0,    0,    0,    0,    0,    0,
-        0,  106,    0,    0,    0,    0,  146,    0,    0,  146,
-
-      146,    0,    0,  163,    0,    0,  163,    0,    0,  176,
-      176,    0,    0,  189,  189,    0,    0,  218,  218,  218,
-        0,    0,  218,  218,  218,    0,    0,    0,    0,  229,
-        0,    0,  244,    0,    0,    0,    0,    0,    0,  295,
-      295,    0,    0,  295,    0,    0,  295,  295,  295,  295,
-      295,  295,  295,  295,  295,  295,    0,    0,    0,    0,
-        0,    0,  318,  318,  318,  318,  318,    0,    0,  343,
-      343,  343,    0,    0,  343,  343,  343,    0,    0,  356,
-        0,    0,    0,    0,  371,    0,    0,  371,    0,    0,
-      402,    0,    0,  402,  402,  402,    0,    0,  419,  419,
-
-      419,    0,    0,    0,  440,  440,  440,  440,    0,    0,
-      457,    0,    0,    0,    0,  470,  470,    0,    0,  487,
-      487,  487,    0,    0,  508,  508,  508,  508,  508,    0,
-        0,    0,  519,    0,    0,    0,    0,    0,    0,    0,
-        0,  543,    0,    0,    0,   14,    1,    0,    0,  553,
-        0,    0,    0,  550,  549,    0,    0,   23,    0,    0,
-       25,    0,  107,    0,    0,    0,    0,    0,    0,    0,
-      222,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  106,    0,    0,    0,    0,
-        0,    0,   34,    0,    0,   36,    0,   49,    0,   41,
-
-       40,   49,    0,    0,    0,   51,    0,   79,    0,   55,
-       54,    0,    0,   79,    0,    0,   79,   79,   79,    0,
-        0,   81,    0,  102,  102,  102,    0,    0,  104,    0,
-        0,  109,  108,  127,    0,    0,  129,    0,    0,    0,
-        0,  223,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  146,    0,  134,  133,  146,  146,    0,    0,  148,
-        0,  163,    0,  153,  152,  163,    0,    0,  165,    0,
-      176,  176,    0,    0,  178,    0,  189,  189,    0,    0,
-      191,    0,  218,  218,  218,    0,  196,  195,  218,  218,
-      218,    0,    0,  220,    0,    0,    0,  229,    0,    0,
-
-      231,    0,  244,    0,  236,  235,    0,  238,  237,    0,
-        0,  246,    0,  295,  295,  295,  295,    0,  263,  262,
-      295,    0,  251,  250,    0,    0,  295,  295,  295,  295,
-      295,  295,  295,  295,  295,    0,    0,  297,    0,    0,
-      312,  311,    0,  302,  301,    0,    0,  318,  318,  318,
-      318,    0,    0,  320,    0,  343,  343,  343,  343,    0,
-      325,  324,    0,    0,  343,  343,    0,    0,  345,    0,
-      356,    0,  350,  349,    0,    0,  358,    0,  371,    0,
-      363,  362,  371,    0,    0,  373,    0,  402,    0,  378,
-      377,  402,  402,  402,    0,    0,  404,    0,    0,    0,
-
-        0,    0,  419,    0,    0,  421,    0,    0,    0,    0,
-      440,  440,    0,    0,  440,    0,    0,  442,    0,  457,
-        0,  447,  446,    0,    0,  459,    0,    0,    0,    0,
-        0,    0,    0,  472,    0,    0,    0,  487,  487,    0,
-        0,    0,    0,  489,    0,  508,  508,  508,  508,  508,
-        0,    0,  510,    0,    0,  519,    0,    0,  521,    0,
-        0,  526,  525,    0,    0,  532,    0,    0,  537,  536,
-      543,    0,    0,  545,    0,    0,    0,  554,  548,    0,
-        0,    0,   23,    0,    0,    0,    0,    0,    0,    0,
-        0,  222,  193,    0,  375,    0,    0,  323,    0,    0,
-
-      534,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      322,    0,    0,    0,    0,    0,    0,    0,   49,    0,
-        0,   79,    0,   59,   58,    0,    0,    0,   57,   56,
-       79,    0,    0,   79,    0,  102,    0,    0,  102,    0,
-      127,    0,  128,    0,    0,    0,  223,  194,  376,  535,
-        0,    0,    0,    0,    0,    0,  146,  146,    0,    0,
-        0,  163,  163,    0,    0,    0,  176,    0,    0,    0,
-      189,    0,  218,  218,    0,    0,  218,  218,  218,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  295,  295,
-      295,  295,    0,    0,    0,  265,  264,  295,  295,  295,
-
-      295,  295,  295,  295,  295,  295,    0,    0,  314,  313,
-      318,  318,  318,  318,    0,  343,  343,  343,  343,    0,
-      333,  332,  343,  343,    0,  356,    0,  371,  371,    0,
-      402,  402,  402,  402,    0,    0,  411,  410,    0,  409,
-      408,  419,    0,  375,    0,  428,  427,  440,  440,    0,
-      426,  425,  440,    0,  457,    0,    0,  466,  465,    0,
-      464,  463,    0,    0,  479,  478,  487,  487,    0,  477,
-      476,    0,  508,    0,    0,  508,  508,  508,    0,    0,
-      519,    0,    0,  543,    0,    0,    0,    0,   12,    0,
-      551,  552,    0,   23,    0,    0,    0,    0,    0,    0,
-
-        0,    0,  193,    0,    0,  375,    0,  167,    0,  323,
-        0,    0,  534,    0,  406,    0,   39,    0,    0,    0,
-        0,    0,  322,    0,   38,    0,   30,   29,    0,    0,
-       43,   42,   49,    0,    0,   79,    0,   61,   60,   79,
-        0,   65,   64,   79,    0,  102,    0,    0,    0,    0,
-        0,    0,  127,    0,    0,    0,  194,    0,  376,  535,
-      407,    0,    0,    0,  407,  406,  146,    0,    0,    0,
-      138,  137,    0,  163,  163,    0,    0,  172,  171,  176,
-        0,    0,  185,  184,  189,    0,  218,  218,    0,  200,
-      199,    0,    0,  218,    0,    0,  218,    0,  168,    0,
-
-        0,  225,  224,    0,  230,    0,  240,  239,    0,  295,
-        0,    0,  295,  295,    0,  261,  260,  295,  295,    0,
-        0,  295,  295,  295,  295,  295,  295,    0,    0,    0,
-      318,  318,  318,    0,  343,    0,    0,  343,  343,    0,
-        0,  343,    0,  356,    0,  371,  371,    0,  402,  402,
-      402,    0,    0,  402,    0,  419,    0,    0,  440,  440,
-      440,    0,  457,    0,    0,  487,  487,    0,  508,    0,
-      494,  493,  508,  508,  508,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,   11,    0,   23,
-        0,    0,    0,    0,    0,    0,    0,  524,    0,    0,
-
-        0,  167,    0,    0,    0,   53,  406,  347,    0,   39,
-        0,  523,   52,    0,    0,    0,    0,   38,    0,    0,
-       49,    0,    0,   79,   79,   79,    0,  102,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,   96,   95,    0,
-      127,    0,    0,    0,    0,  407,  348,    0,    0,    0,
-      146,    0,  136,  135,    0,  163,    0,    0,    0,  176,
-        0,    0,    0,    0,  218,  218,    0,  198,  197,    0,
-        0,    0,    0,    0,  218,    0,  219,  168,    0,    0,
-      295,    0,  273,  272,    0,    0,  295,  295,  295,    0,
-      259,  258,    0,    0,  295,  295,  295,  295,    0,    0,
-
-        0,    0,  310,  309,    0,    0,  318,    0,    0,    0,
-      343,    0,  329,  328,    0,    0,  343,    0,  327,  326,
-      343,    0,  344,  356,    0,  371,  371,    0,  402,  402,
-      402,    0,    0,    0,  402,    0,  403,  419,    0,    0,
-        0,    0,    0,    0,  440,    0,  457,    0,    0,    0,
-        0,    0,    0,    0,  508,  508,  508,  508,    0,    0,
-        0,  515,  514,    0,    0,    0,  539,  538,    0,  544,
-        0,    0,    0,    0,    0,    0,    0,  423,    0,    0,
-        0,    0,  300,  249,  524,    0,   28,    0,    0,    0,
-      492,   53,  347,  150,    0,  523,   52,  299,  248,   27,
-
-      491,    0,    0,   49,    0,    0,   50,   79,    0,    0,
-       79,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,  424,    0,    0,
-        0,    0,  348,  151,    0,    0,  146,    0,    0,    0,
-      163,    0,  155,  154,    0,  176,    0,  177,    0,  183,
-      182,    0,  218,  218,    0,  214,  213,    0,    0,  218,
-        0,    0,  295,    0,  275,  274,  295,  295,  295,    0,
-      253,  252,    0,    0,  295,  295,  295,    0,  255,  254,
-        0,    0,  304,  303,    0,    0,    0,  306,  305,    0,
-      343,    0,  331,  330,  343,  343,  356,    0,  371,    0,
-
-        0,    0,  402,    0,    0,  402,  402,    0,    0,  402,
-      419,    0,  420,    0,    0,  432,  431,    0,  430,  429,
-      440,    0,  457,    0,    0,    0,  483,  482,    0,  481,
-      480,    0,  508,  508,  508,  508,    0,    0,    0,    0,
-        0,    0,    0,   17,    0,   19,   18,    0,  423,  512,
-      360,    0,    0,  300,  249,    0,   28,  444,  180,   16,
-      492,  150,    0,    0,  299,  248,   27,  491,    0,    0,
-       49,  559,   79,    0,   67,   66,   79,    0,   80,    0,
-       98,   97,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  424,  361,    0,    0,
-
-        0,  151,    0,    0,  140,  139,  146,    0,    0,  157,
-      156,  163,    0,  176,    0,  218,  218,    0,    0,    0,
-        0,  218,  181,    0,  295,  295,  295,  295,    0,  257,
-      256,  295,  295,  295,    0,    0,  308,  307,    0,  343,
-      343,  343,  356,    0,  357,  371,    0,  367,  366,    0,
-      402,    0,  384,  383,  402,  402,    0,    0,    0,    0,
-      402,  419,  445,  440,    0,  457,    0,    0,    0,    0,
-        0,  508,  508,  508,    0,  513,    0,    0,  531,    0,
-        0,    0,   17,    0,  512,  360,    0,    0,  233,  444,
-      180,   16,    0,    0,    0,    0,   35,   49,    0,    0,
-
-       79,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  146,
+      148,  148,  148,  148,  148,    0,    0,  163,  165,  165,
+      165,  165,    0,  176,  178,  178,  178,    0,  189,  191,
+      191,  191,    0,  218,  220,  220,  220,  220,  220,  220,
+
+      220,    0,    0,  229,  231,  231,    0,  244,  246,  246,
+      246,  246,    0,  301,  303,  303,  303,  303,  303,  303,
+      303,  303,  303,  303,  303,  303,  303,  303,  303,  303,
+      303,    0,  324,  326,  326,  326,  326,  326,  326,  326,
+      326,    0,  349,  351,  351,  351,  351,  351,  351,  351,
+      351,    0,  362,  364,  364,  364,    0,  377,  379,  379,
+      379,  379,    0,  408,  410,  410,  410,  410,  410,  410,
+        0,  425,  427,  427,  427,  427,    0,    0,  446,  448,
+      448,  448,  448,  448,    0,  463,  465,  465,  465,    0,
+      476,  478,  478,  478,    0,  493,  495,  495,  495,  495,
+
+        0,  514,  516,  516,  516,  516,  516,  516,    0,    0,
+      525,  527,  527,    0,  536,  538,  538,    0,  549,  551,
+      551,  551,    0,  562,  564,  564,  564,    0,    0,    0,
+        0,    0,    3,    0,    0,    0,    0,    0,    0,    0,
+      586,    0,   23,    0,    0,  107,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  361,    0,    0,  234,    0,  146,    0,  163,
-        0,  164,    0,    0,    0,  218,  218,    0,  206,    0,
-      205,  218,  181,    0,  295,  295,  295,  295,  295,    0,
-        0,  295,  295,    0,  296,    0,  319,  343,  343,  343,
-      356,    0,    0,    0,    0,    0,  402,  402,  402,    0,
-      388,    0,  387,  402,  419,  445,  440,    0,  441,    0,
-        0,    0,    0,    0,    0,  496,  495,    0,    0,  508,
-      508,    0,  509,  513,    0,    0,    0,    0,    0,   24,
-
-        0,    0,  233,    0,    0,    0,   49,    0,    0,    0,
-       79,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  106,    0,    0,
+        0,    0,    0,    0,   34,    0,    0,   49,    0,    0,
+       49,    0,    0,    0,  581,   79,    0,    0,   79,   79,
+       79,   79,   79,   79,    0,    0,  102,  102,  102,    0,
+
+        0,    0,    0,  129,    0,    0,  107,    0,    0,    0,
+        0,    0,    0,    0,    0,  106,    0,    0,    0,    0,
+      148,    0,    0,  148,  148,    0,    0,    0,  165,    0,
+        0,  165,    0,    0,  178,  178,    0,    0,  191,  191,
+        0,    0,  220,  220,  220,    0,    0,  220,  220,  220,
+        0,    0,    0,    0,  231,    0,    0,  246,    0,    0,
+        0,    0,    0,    0,  303,  303,    0,    0,  303,    0,
+        0,  303,  303,  303,  303,  303,  303,  303,  303,  303,
+      303,  303,    0,    0,    0,    0,    0,    0,  326,  326,
+      326,  326,  326,    0,    0,  351,  351,  351,    0,    0,
+
+      351,  351,  351,    0,    0,  364,    0,    0,    0,    0,
+      379,    0,    0,  379,    0,    0,  410,    0,    0,  410,
+      410,  410,    0,    0,  427,  427,  427,    0,    0,    0,
+      448,  448,  448,  448,    0,    0,  465,    0,    0,    0,
+        0,  478,  478,    0,    0,  495,  495,  495,    0,    0,
+      516,  516,  516,  516,  516,    0,    0,    0,  527,    0,
+        0,    0,    0,    0,    0,    0,    0,  551,    0,    0,
+        0,    0,  564,    0,    0,    0,   14,    1,    0,    0,
+      574,    0,    0,    0,  571,  570,    0,    0,   23,    0,
+        0,   25,    0,  107,    0,    0,    0,    0,    0,    0,
+
+        0,  224,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  106,    0,    0,
+        0,    0,    0,    0,   34,    0,    0,   36,    0,   49,
+        0,   41,   40,   49,    0,    0,    0,   51,    0,   79,
+        0,   55,   54,    0,    0,   79,    0,    0,   79,   79,
+       79,    0,    0,   81,    0,  102,  102,  102,    0,    0,
+      104,    0,    0,  109,  108,  129,    0,    0,  131,    0,
+        0,    0,    0,  225,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  148,    0,  136,  135,  148,  148,    0,
+        0,  150,    0,    0,  165,    0,  155,  154,  165,    0,
+
+        0,  167,    0,  178,  178,    0,    0,  180,    0,  191,
+      191,    0,    0,  193,    0,  220,  220,  220,    0,  198,
+      197,  220,  220,  220,    0,    0,  222,    0,    0,    0,
+      231,    0,    0,  233,    0,  246,    0,  238,  237,    0,
+      240,  239,    0,    0,  248,    0,  303,  303,  303,  303,
+        0,  265,  264,  303,    0,  253,  252,    0,    0,  303,
+      303,  303,  303,  303,  303,  303,  303,  303,  303,    0,
+        0,  305,    0,    0,  320,  319,    0,  310,  309,    0,
+        0,  326,  326,  326,  326,    0,    0,  328,    0,  351,
+      351,  351,  351,    0,  333,  332,    0,    0,  351,  351,
+
+        0,    0,  353,    0,  364,    0,  358,  357,    0,    0,
+      366,    0,  379,    0,  371,  370,  379,    0,    0,  381,
+        0,  410,    0,  386,  385,  410,  410,  410,    0,    0,
+      412,    0,    0,    0,    0,    0,  427,    0,    0,  429,
+        0,    0,    0,    0,  448,  448,    0,    0,  448,    0,
+        0,  450,    0,  465,    0,  455,  454,    0,    0,  467,
+        0,    0,    0,    0,    0,    0,    0,  480,    0,    0,
+        0,  495,  495,    0,    0,    0,    0,  497,    0,  516,
+      516,  516,  516,  516,    0,    0,  518,    0,    0,  527,
+        0,    0,  529,    0,    0,  534,  533,    0,    0,  540,
+
+        0,    0,  545,  544,  551,    0,    0,  553,    0,    0,
+      558,  557,  564,    0,    0,  566,    0,    0,    0,  575,
+      569,    0,    0,    0,   23,    0,    0,    0,    0,    0,
+        0,    0,    0,  224,  195,    0,  383,    0,    0,    0,
+      331,    0,    0,  542,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  330,    0,    0,    0,    0,    0,    0,
+        0,   49,    0,    0,   79,    0,   59,   58,    0,    0,
+        0,   57,   56,   79,    0,    0,   79,    0,  102,    0,
+        0,  102,    0,  129,    0,  130,    0,    0,    0,  225,
+      196,  384,  543,    0,    0,    0,    0,    0,    0,  148,
+
+      148,    0,    0,    0,    0,  165,  165,    0,    0,    0,
+      178,    0,    0,    0,  191,    0,  220,  220,    0,    0,
+      220,  220,  220,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  303,  303,  303,  303,    0,    0,    0,  267,
+      266,  303,  303,  303,  303,  303,  303,  303,  303,  303,
+      303,  303,    0,    0,  322,  321,  326,  326,  326,  326,
+        0,  351,  351,  351,  351,    0,  341,  340,  351,  351,
+        0,  364,    0,  379,  379,    0,  410,  410,  410,  410,
+        0,    0,  419,  418,    0,  417,  416,  427,    0,  383,
+        0,  436,  435,  448,  448,    0,  434,  433,  448,    0,
+
+      465,    0,    0,  474,  473,    0,  472,  471,    0,    0,
+      487,  486,  495,  495,    0,  485,  484,    0,  516,    0,
+        0,  516,  516,  516,    0,    0,  527,    0,    0,  551,
+        0,  564,    0,    0,    0,    0,   12,    0,  572,  573,
+        0,   23,    0,    0,    0,    0,    0,    0,    0,    0,
+      195,    0,    0,  383,    0,    0,  169,    0,  331,    0,
+        0,  542,    0,  414,    0,   39,    0,    0,    0,    0,
+        0,  330,    0,   38,    0,   30,   29,    0,    0,   43,
+       42,   49,    0,    0,   79,    0,   61,   60,   79,    0,
+       65,   64,   79,    0,  102,    0,    0,    0,    0,    0,
+
+        0,  129,    0,    0,    0,  196,    0,  384,  543,  415,
+        0,    0,    0,  415,  414,  148,    0,    0,    0,  140,
+      139,    0,    0,  165,  165,    0,    0,  174,  173,  178,
+        0,    0,  187,  186,  191,    0,  220,  220,    0,  202,
+      201,    0,    0,  220,    0,    0,  220,    0,  170,    0,
+        0,  227,  226,    0,  232,    0,  242,  241,    0,  303,
+        0,    0,  303,  303,    0,  263,  262,  303,  303,    0,
+        0,  303,  303,  303,  303,  303,  303,  303,  303,    0,
+        0,    0,  326,  326,  326,    0,  351,    0,    0,  351,
+      351,    0,    0,  351,    0,  364,    0,  379,  379,    0,
+
+      410,  410,  410,    0,    0,  410,    0,  427,    0,    0,
+      448,  448,  448,    0,  465,    0,    0,  495,  495,    0,
+      516,    0,  502,  501,  516,  516,  516,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  234,    0,  146,    0,
-      163,    0,  170,  169,    0,  190,  218,  218,  208,  207,
-        0,    0,    0,  295,  295,  295,  295,  295,    0,  285,
-      284,  295,    0,    0,  343,  343,    0,    0,  356,    0,
-      365,  364,    0,  372,    0,  380,  379,  402,  402,  402,
-      390,  389,    0,    0,  419,  440,    0,    0,    0,    0,
-      458,    0,    0,    0,  500,  499,    0,    0,    0,    0,
-
-        0,  520,    0,    0,    0,    0,  461,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   79,    0,
-        0,    0,    0,   88,    0,    0,    0,    0,   87,    0,
+        0,    0,   11,    0,   23,    0,    0,    0,    0,    0,
+        0,    0,  532,    0,    0,    0,    0,  169,    0,    0,
+        0,   53,  414,  355,    0,   39,    0,  531,   52,    0,
+        0,    0,    0,   38,    0,    0,   49,    0,    0,   79,
+       79,   79,    0,  102,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   96,   95,    0,  129,    0,    0,    0,
+
+        0,  415,  356,    0,    0,    0,  148,    0,  138,  137,
+        0,    0,  165,    0,    0,    0,  178,    0,    0,    0,
+        0,  220,  220,    0,  200,  199,    0,    0,    0,    0,
+        0,  220,    0,  221,  170,    0,    0,  303,    0,  281,
+      280,    0,    0,  303,  303,  303,    0,  261,  260,    0,
+        0,  303,  303,  303,  303,    0,    0,  303,  303,    0,
+        0,  318,  317,    0,    0,  326,    0,    0,    0,  351,
+        0,  337,  336,    0,    0,  351,    0,  335,  334,  351,
+        0,  352,  364,    0,  379,  379,    0,  410,  410,  410,
+        0,    0,    0,  410,    0,  411,  427,    0,    0,    0,
+
+        0,    0,    0,  448,    0,  465,    0,    0,    0,    0,
+        0,    0,    0,  516,  516,  516,  516,    0,    0,    0,
+      523,  522,    0,    0,    0,  547,  546,    0,  552,    0,
+      560,  559,    0,    0,    0,    0,    0,    0,    0,    0,
+      431,    0,    0,    0,    0,  308,  251,  532,    0,   28,
+        0,    0,    0,    0,  500,   53,  355,  152,    0,  531,
+       52,  307,  250,   27,  499,    0,    0,   49,    0,    0,
+       50,   79,    0,    0,   79,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  462,    0,  146,    0,  163,  218,    0,
-        0,    0,  210,  209,    0,  245,  295,  295,  295,    0,
-        0,  295,  295,    0,  283,  282,  343,    0,    0,    0,
-      339,  338,    0,    0,  402,  402,  402,    0,  392,  391,
+        0,  432,    0,    0,    0,    0,  356,  153,    0,    0,
+
+      148,    0,    0,    0,    0,  165,    0,  157,  156,    0,
+      178,    0,  179,    0,  185,  184,    0,  220,  220,    0,
+      216,  215,    0,    0,  220,    0,    0,  303,    0,  283,
+      282,  303,  303,  303,    0,  255,  254,    0,    0,  303,
+      303,  303,    0,  257,  256,  303,  303,    0,    0,  312,
+      311,    0,    0,    0,  314,  313,    0,  351,    0,  339,
+      338,  351,  351,  364,    0,  379,    0,    0,    0,  410,
+        0,    0,  410,  410,    0,    0,  410,  427,    0,  428,
+        0,    0,  440,  439,    0,  438,  437,  448,    0,  465,
+        0,    0,    0,  491,  490,    0,  489,  488,    0,  516,
+
+      516,  516,  516,    0,    0,    0,    0,    0,    0,    0,
+        0,   17,    0,   19,   18,    0,  431,  520,  368,    0,
+        0,  308,  251,    0,   28,  452,    0,  182,   16,  500,
+      152,    0,    0,  307,  250,   27,  499,    0,    0,   49,
+      580,   79,    0,   67,   66,   79,    0,   80,    0,   98,
+       97,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  432,  369,    0,    0,    0,
+      153,    0,    0,  142,  141,  148,    0,    0,    0,  159,
+      158,  165,    0,  178,    0,  220,  220,    0,    0,    0,
+        0,  220,  183,    0,  303,  303,  303,  303,    0,  259,
+
+      258,  303,  303,  303,  303,    0,    0,    0,    0,  316,
+      315,    0,  351,  351,  351,  364,    0,  365,  379,    0,
+      375,  374,    0,  410,    0,  392,  391,  410,  410,    0,
+        0,    0,    0,  410,  427,  453,  448,    0,  465,    0,
+        0,    0,    0,    0,  516,  516,  516,    0,  521,    0,
+        0,  539,    0,    0,    0,    0,   17,    0,  520,  368,
+        0,    0,  235,  452,    0,  182,   16,    0,    0,    0,
+        0,   35,   49,    0,    0,   79,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  498,  497,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  369,    0,    0,
+
+      236,    0,  148,    0,    0,  165,    0,  166,    0,    0,
+        0,  220,  220,    0,  208,    0,  207,  220,  183,    0,
+      303,  303,  303,  303,  303,    0,    0,  303,  303,  303,
+        0,    0,    0,    0,  304,    0,  327,  351,  351,  351,
+      364,    0,    0,    0,    0,    0,  410,  410,  410,    0,
+      396,    0,  395,  410,  427,  453,  448,    0,  449,    0,
+        0,    0,    0,    0,    0,  504,  503,    0,    0,  516,
+      516,    0,  517,  521,    0,    0,    0,    0,    0,    0,
+       24,    0,    0,  235,  555,    0,    0,    0,   49,    0,
+        0,    0,   79,    0,    0,    0,    0,    0,    0,    0,
 
-        0,    0,  461,  131,    0,    0,    0,   45,   44,    0,
-        0,    0,    0,    0,    0,    0,    0,   79,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  236,    0,
+      148,    0,  556,  165,    0,  172,  171,    0,  192,  220,
+      220,  210,  209,    0,    0,    0,  303,  303,  303,  303,
+      303,    0,  293,  292,  303,    0,    0,  303,    0,    0,
+        0,    0,  351,  351,    0,    0,  364,    0,  373,  372,
+        0,  380,    0,  388,  387,  410,  410,  410,  398,  397,
+        0,    0,  427,  448,    0,    0,    0,    0,  466,    0,
+        0,    0,  508,  507,    0,    0,    0,    0,    0,  528,
+        0,    0,    0,    0,    0,  469,  555,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,   79,    0,
+        0,    0,    0,   88,    0,    0,    0,    0,   87,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      462,  132,    0,    0,    0,    0,    0,    0,    0,  218,
-        0,  212,  211,  295,  295,    0,    0,    0,  289,  288,
-        0,    0,  295,  343,    0,  335,  334,    0,  352,  351,
-      402,    0,    0,  402,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  470,    0,  148,    0,  556,  165,  220,
+        0,    0,    0,  212,  211,    0,  247,  303,  303,  303,
+        0,    0,  303,  303,    0,  291,  290,  303,    0,    0,
+        0,    0,  351,    0,    0,    0,  347,  346,    0,    0,
+      410,  410,  410,    0,  400,  399,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  474,  131,   84,   83,
+        0,    0,  506,  505,    0,    0,    0,    0,    0,  469,
 
+      133,    0,    0,    0,   45,   44,    0,    0,    0,    0,
+        0,    0,    0,    0,   79,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  470,  134,    0,
+        0,    0,    0,    0,    0,    0,  220,    0,  214,  213,
+      303,  303,    0,    0,    0,  297,  296,    0,    0,  303,
+      303,    0,    0,    0,    0,  351,    0,  343,  342,    0,
+      360,  359,  410,    0,    0,  410,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   94,    0,    0,    0,   93,    0,    0,    0,
-        0,    0,  111,  119,    0,    0,    0,    0,  110,  118,
-        0,  475,  132,    0,  142,  141,    0,    0,  159,  158,
-        0,  202,  201,  218,  295,  295,    0,  287,  286,    0,
-      291,  290,  295,  343,  402,    0,  386,  385,  402,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  449,
-        0,    0,  448,    0,  471,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  474,   84,   83,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   63,   62,
-
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  113,
-        0,    0,    0,  112,    0,  475,    0,  147,  218,  295,
-      295,    0,    0,  343,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  565,    0,    0,    0,    0,
+
+      482,  133,   84,   83,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   94,    0,    0,    0,
+       93,    0,    0,    0,    0,    0,  111,  119,    0,    0,
+        0,    0,  110,  118,    0,  483,  134,    0,  144,  143,
+        0,    0,  161,  160,    0,  204,  203,  220,  303,  303,
+        0,  295,  294,    0,  299,  298,  303,  303,    0,    0,
+        0,    0,  351,  410,    0,  394,  393,  410,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  457,    0,
+        0,  456,    0,  479,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  482,   84,   83,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,   63,   62,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  113,    0,
+        0,    0,  112,    0,  483,    0,  149,  220,  303,  303,
+        0,    0,  303,  275,    0,  274,    0,  351,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   75,   71,    0,    0,   74,   70,    0,   92,
-        0,    0,   91,    0,    0,    0,  103,    0,    0,    0,
-        0,    0,    0,  218,  295,  295,    0,    0,    0,  343,
-        0,  382,  381,    0,    0,    0,  415,    0,  414,    0,
-      436,    0,  435,    0,  451,  453,  450,  452,    0,  488,
-
-      502,    0,  501,    0,    0,    0,    0,   12,    0,   12,
-        0,    0,    0,    0,    0,   86,   90,   85,   89,  123,
-        0,  121,  122,    0,  120,  218,  295,  295,    0,    0,
-        0,    0,  343,    0,    0,    0,    0,  413,  412,  434,
-      433,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  115,    0,  114,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   75,   71,    0,    0,
+       74,   70,    0,   92,    0,    0,   91,    0,    0,    0,
+      103,    0,    0,    0,    0,    0,    0,  220,  303,  303,
+        0,    0,    0,    0,    0,  277,  276,  351,    0,  390,
+
+      389,    0,    0,    0,  423,    0,  422,    0,  444,    0,
+      443,    0,  459,  461,  458,  460,    0,  496,  510,    0,
+      509,    0,    0,    0,    0,   12,    0,   12,    0,    0,
+        0,    0,    0,   86,   90,   85,   89,  123,    0,    0,
+      121,  122,    0,    0,  120,  220,  303,  303,    0,    0,
+        0,    0,    0,  279,  278,  351,    0,    0,    0,    0,
+      421,  420,  442,  441,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  115,    0,    0,  114,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       69,    0,   68,    0,    0,    0,    0,  204,  203,    0,
-      281,  280,    0,    0,    0,    0,    0,    0,    0,    0,
 
-        0,    0,  337,  336,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   11,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,   69,    0,   68,    0,    0,
+        0,    0,    0,    0,  206,  205,    0,  289,  288,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  345,
+      344,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       11,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  504,  503,    0,   73,   72,    0,
+        0,    0,    0,  512,  511,    0,   73,   72,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,  117,  116,    0,
-        0,    0,    0,    0,    0,  267,    0,    0,  266,    0,
-        0,  394,    0,    0,  393,    0,    0,    0,    0,    0,
-
-      271,    0,  270,    0,  396,    0,  395,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  277,
-        0,  276,    0,    0,    0,    0,    0,    0,  279,  278,
-      269,  268,  398,  397,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      125,  117,  124,  116,    0,    0,    0,    0,    0,    0,
+      269,    0,    0,  268,    0,    0,  402,    0,    0,  401,
+        0,    0,    0,    0,    0,  273,    0,  272,    0,  404,
+        0,  403,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  285,    0,  284,    0,    0,    0,
+        0,    0,    0,  287,  286,  271,  270,  406,  405,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       13,    0
+        0,    0,    0,    0,    0,   13,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -826,7 +840,7 @@ static yyconst flex_int32_t yy_meta[75] =
         5,    5,    5,    5
     } ;
 
-static yyconst flex_int16_t yy_base[3816] =
+static yyconst flex_int16_t yy_base[3970] =
     {   0,
         0,    0,    0,    3,    6,    9,   12,   29,   16,   19,
        14,   17,   33,   36,   49,   55,   45,   61,   66,   72,
@@ -855,2395 +869,2460 @@ static yyconst flex_int16_t yy_base[3816] =
      2219, 2222, 2225, 2229, 2276, 2279, 2282, 2286, 3217, 3284,
      2333, 2336, 2339, 2343, 2346, 2393, 2396, 2399, 3351, 3421,
      2403, 2406, 3491, 3548, 2453, 2456, 2459, 2463, 2466, 2520,
-     2523, 2526, 3605, 3675, 2530, 2533,    0,    0, 8437,12292,
-    12292,   95,  100,   29,   41,12292,  103,   51,12292,12292,
-     8426,12292,12292, 8414,12292, 8429, 8428,  202,12292,12292,
-    12292,12292, 8422, 8422, 8372,  153,12292,  161, 8398,    0,
-      145,12292, 8363,12292,  165, 3741,   73, 2540,  315,  357,
-
-     8392, 8339,12292,  168, 8379,    0,  152,12292, 8341,12292,
-      261, 8384,   31,12292,  266, 8375,    0,  245,12292, 8314,
-     8314, 8312,  421, 8305,12292,  269, 8331,    0,  340,12292,
-     8296, 8292,  271, 8294,  238,12292,  441,  484,12292,  504,
-     8321,    0,  401,12292, 8276, 8278, 8267,12292,  561,  548,
-    12292,  571, 8304,    0,  481,12292, 8271, 8259,12292,  628,
-     3805, 8255,  163, 2542,  567,  206,   38, 8306,  954, 2533,
-      639,  907,  437,   79,12292,  634, 8287,    0,  546,12292,
-     8243, 8249, 8237, 8241,12292,  638,  313,  368,12292,  697,
-     8276,    0,  549,12292, 8232, 8241, 8214,12292,  704,  426,
-
-      497,12292,  707, 8259,    0,  747,12292, 8229, 8208,12292,
-      767,  753,12292,  773, 8250,    0,  757,12292, 8220, 8194,
-    12292,  831,  818,12292,  838, 8238,    0,  758,12292, 8183,
-     8176, 8181,  251, 8164,12292,  841,  559,  825,  530,12292,
-      906, 8210,    0,  815,12292, 8162,12292,  914,  891,12292,
-      977, 8186,    0,  953,12292, 8142, 8142, 8129,12292,  981,
-      965,12292, 1021, 8171,    0,  966,12292, 8120,  203, 8125,
-     8131,  378,   85,  311,  972,12292, 1040,  564,  814,12292,
-     1044, 8152,    0, 1032,12292, 8098, 8111, 8112,  157, 8109,
-     8087,12292, 1048, 1086,12292, 1106, 8132,    0, 1033,12292,
-
-     8080, 8068, 8075, 8080, 8082, 8055, 8049,12292, 1111, 1099,
-    12292, 1114, 8095,    0, 1100,12292, 8047, 8057,12292, 1156,
-     1160,12292, 1173, 8087,    0, 1157,12292, 8052, 8047, 8046,
-    12292, 1180, 1228,12292, 1183, 8073,    0, 1158,12292, 8043,
-     8038, 8033,   15,12292, 1186,  899,  963,12292, 1241, 8059,
-        0, 1225,12292, 8007,  181,12292, 1248, 1243,  432,  303,
-    12292, 1308, 8053,    0, 1226,12292, 7994, 7989,  299,12292,
-     1311, 1229,  350,12292, 1314, 8038,    0, 1303,12292, 7993,
-     7997,12292, 1319, 1362,12292, 1375, 8018,    0, 1359,12292,
-     7970, 7968,12292, 1382, 1378,  676,12292, 1445, 8006,    0,
-
-     1360,12292, 7949, 7944, 7938,12292, 1448, 1446,  685,12292,
-     1494, 7983,    0, 1370,12292, 7932, 7933, 7938, 7931, 7924,
-    12292, 1513, 1514,  560, 1007,12292, 1517, 7970,    0, 1438,
-    12292, 7936,12292, 1520, 1559,12292, 1579, 7964,    0, 1506,
-    12292, 7926,12292, 1584, 1210, 1236,12292, 1587, 7957,    0,
-     1563,12292, 7923, 7915,12292, 1645, 1632, 1648,  677, 7891,
-    12292, 7951, 7935,12292,12292,12292, 1641,  375, 7885, 7880,
-     7878, 7925, 7877,12292,    0, 7868, 7864, 7888, 7859,  104,
-     1037, 7853, 7853, 7852, 7852,  889, 1646, 1105, 7839, 7840,
-     1393, 1307, 7865, 1510, 7836, 1649, 7830, 1647, 1708, 1709,
-
-    12292,    0, 7831, 7833,12292,    0, 7828, 2098, 7810,  666,
-     7806, 7850,12292,    0, 7806, 2165, 7794, 7815, 7801, 7794,
-     7789, 7789, 7773,12292,    0, 7772, 7762, 7773, 7749,12292,
-        0, 2232, 7747, 7791, 7772,  172, 7742, 7741, 7746, 1719,
-     1319, 7726, 1720, 7754,  707,  724,  814,  841, 1577, 1651,
-     1701,  888,12292,    0, 7729, 2289, 7734, 7711, 7713,12292,
-        0, 7717, 2592, 7713, 7701,12292,    0, 7704, 7700, 7698,
-    12292,    0, 7686, 7682, 7683,12292,    0, 7686,  758, 2598,
-     7662, 7660, 7678, 7661,  897,12292,    0, 7655, 7659,12292,
-        0, 7635, 2654, 2657, 7649,12292,    0, 7654, 7654, 2660,
-
-     7634, 2663, 7628, 7633, 7627, 7608, 7625, 7624, 7601, 7620,
-     7617, 7604, 7603,12292,    0, 2666, 2721, 7569, 7565, 7580,
-     7579, 7570, 7572,12292,    0, 7563, 7563, 7544, 2724, 7537,
-     7533, 7545, 7529,12292,    0, 7528, 2727, 7517,12292,    0,
-     7520, 2730, 7512, 7529,12292,    0, 7511, 2733, 7503, 7520,
-     7514, 7502,12292,    0, 7489, 7505, 7489, 7483, 7490,12292,
-        0, 7468, 7487, 7482, 7471, 7507,12292,    0, 7457, 2788,
-     7448,12292,    0, 7439, 7454, 7446,12292,    0, 7427, 7445,
-     7437, 7437,12292,    0, 7419, 7413, 7418, 7422, 7420, 7400,
-     7397,12292,    0, 7401, 7411,12292,    0, 2791, 7407,12292,
-
-        0, 2794, 7392, 7382, 7425, 7433, 1807, 7370,12292, 1833,
-        0, 7364, 7364, 7408, 7392, 7345,12292, 7357, 7324, 2797,
-     2801, 1981, 7335, 7337, 7319, 7332, 7306, 7312, 7300, 7297,
-     7312, 7299, 7274, 7274, 7287, 7282, 7266, 7265, 7255, 7259,
-     7269, 7243, 7240, 1990, 7244, 7224, 7240, 7237, 7218, 7221,
-     7215, 2855, 2860, 7210, 2864, 2048, 7205, 7236, 2868, 2912,
-    12292, 7194, 2915, 2117, 2921, 7184, 2924, 7187, 7187, 7189,
-     2927, 2983, 7175, 7178, 7178, 2969, 2972, 2978, 2184, 7159,
-     3037, 3040, 2363, 7175, 7148, 7141, 7142, 7144, 7137, 7116,
-     7115, 2423, 7113, 7111, 7085, 7081, 7077, 2996, 2618, 7091,
-
-     7089, 3044, 3047, 7048, 3050, 2685, 7061, 3103, 3106, 7060,
-     7040, 3114, 3117, 7052, 7050, 3129, 3173, 7045, 7018, 7029,
-     3109, 2755, 7027, 7030, 7009, 3179, 3183, 7003, 7002, 7006,
-     3186, 3245, 6992, 3239, 2822, 3248, 3002, 3252, 3257, 6994,
-     1920, 3304, 3068, 6993, 3308, 3137, 3313, 6985, 6966, 6975,
-     6972, 6961, 6947, 6948, 6941, 6954, 3322, 3383, 3331, 3205,
-     3371, 3374, 3389, 3392, 3397, 3450, 3459, 3444, 3468, 6940,
-       37, 6930, 3454, 3403, 3512, 6938, 6922, 3516, 3519, 6922,
-     3522, 3411, 3525, 3571, 6925, 3574, 3473, 6923, 3577, 3580,
-     6917, 3583, 3481, 6909, 6894, 6882, 3628, 3634, 3637, 3640,
-
-     3695, 3643, 3698, 6887, 3701, 3705, 3708, 3732, 3713, 3727,
-     6894, 3735, 3662, 3738, 3765, 3746, 3775, 3779, 3784, 3809,
-     3812, 3816, 3821, 3830, 6885, 6867, 6873, 6877, 6864, 3843,
-     3872, 6868, 6853, 3878, 3881, 3834, 3884, 3892, 3902, 3840,
-     3905, 6847, 3913, 3916, 6885,12292,12292, 1070, 6843,12292,
-     6885, 6880, 6829,12292,12292, 6826, 6818, 6828, 3921, 3924,
-    12292, 3928, 1714, 6791, 6783, 6789, 6794, 6784, 6769, 6781,
-     1779, 6765, 6756, 6756, 6732, 6720, 6716, 6712,  446, 6723,
-     6706, 6697, 6711, 6701, 6677, 1849, 6671, 6655, 6660, 6645,
-     1381, 6659, 3947, 3950, 3953,12292, 3956, 3959, 3965,12292,
-
-    12292, 3977, 6681, 3981, 3984,12292, 3988, 6635, 3991,12292,
-    12292, 4007, 4010, 4019, 4025, 4030, 6649, 4039, 6642, 4043,
-     4046,12292, 4049, 6638, 4052, 6636, 4057, 4070,12292, 4076,
-     4079,12292,12292, 6631, 4089, 4095,12292, 4098, 6623, 6619,
-     6625, 1852, 6604, 6612, 1449, 6601, 6593, 6609, 6607, 6583,
-     6578, 6591, 4101,12292,12292, 6583, 4110, 4117, 4120,12292,
-     4124, 6588, 4129,12292,12292, 6600, 4139, 4143,12292, 4146,
-     4149, 4152, 4158, 4170,12292, 4173, 4177, 4180, 4200, 4203,
-    12292, 4209, 6568, 6574, 4212, 4215,12292,12292, 6559, 6555,
-     6569, 4223, 4230,12292, 4233, 6558, 6552, 4236, 4242, 4245,
-
-    12292, 4254, 4257, 4264,12292,12292, 4276,12292,12292, 4284,
-     4287,12292, 4290, 6547, 6535, 6555, 6539, 4293,12292,12292,
-     4309, 4312,12292,12292, 4322, 4327, 6525, 6538, 6521, 6519,
-     6523, 6517, 6508, 6511, 6501, 4335, 4340,12292, 4343, 4347,
-    12292,12292, 4362,12292,12292, 4370, 4373, 6490, 6498, 6497,
-     6490, 4381, 4384,12292, 4388, 6485, 6477, 6465, 6481, 4391,
-    12292,12292, 4403, 4407, 6465, 6473, 4415, 4421,12292, 4424,
-     6473, 4427,12292,12292, 4443, 4446,12292, 4449, 6449, 4452,
-    12292,12292, 6457, 4468, 4471,12292, 4476, 6446, 4480,12292,
-    12292, 6441, 6444, 6441, 4490, 4495,12292, 4499, 4502, 4505,
-
-     4520, 4526, 6434, 4534, 4538,12292, 4542, 6426, 4545, 4563,
-     6413, 6412, 4549, 4571, 6406, 4579, 4582,12292, 4585, 6407,
-     4588,12292,12292, 4604, 4610,12292, 4613, 4616, 4619, 4634,
-     4637, 4645, 4652,12292, 4656, 4659, 4664, 6371, 6369, 4677,
-     4680, 4688, 4691,12292, 4695, 6354, 4698, 6369, 6367, 6346,
-     4701, 4710,12292, 4720, 6333, 6347, 4723, 4729,12292, 4732,
-     4735,12292,12292, 4743, 4751,12292, 4754, 4758,12292,12292,
-     6346, 4766, 4773,12292, 4776, 1099, 4786,12292,12292, 6379,
-     6378, 6332, 6263, 4795, 6229, 6236, 6245, 6203, 6150, 6131,
-     6085, 2057, 2250, 6049, 2307, 6047, 6032, 2483, 6031, 5953,
-
-     2492, 5912, 5878, 5881, 5739, 5734, 5704, 5620, 5613, 5561,
-     2495, 5575,   13, 4798, 4816, 4801, 4807, 4825,   37,  172,
-     4833,  268, 4838,12292,12292, 4846, 4853, 4864,12292,12292,
-      333, 4872, 4876,  346, 4884,  343, 4890, 4893, 4903, 4908,
-      384, 4810,12292,  409,  449,  460, 2626, 2629, 2693, 2696,
-      497,  507,  551,  576,  631,  632,  667, 4911, 4914, 4917,
-     4935,  693,  715, 4938, 4941, 4944,  757, 4959, 4962, 4965,
-      779, 4973,  797,  835, 4980, 4983, 4992,  844, 5003, 5006,
-      834,  854, 5010, 5014, 5028, 5031, 5035, 5043,  981, 5050,
-      963,  984, 5053, 5056, 5064,12292,12292, 1039, 1046, 5073,
-
-     1050, 1117, 1107, 1145, 1186, 1164, 5076, 5079,12292,12292,
-     5087, 5091, 5095, 5098, 5101, 1205, 5105, 1188, 1200, 5116,
-    12292,12292, 5126, 1250, 5129, 1244, 5132, 1262, 1290, 5135,
-     1331, 1338, 1330, 5138, 5144, 5163,12292,12292, 5171,12292,
-    12292, 1341, 5158, 2763, 5179,12292,12292, 1356, 1382, 5187,
-    12292,12292, 1367, 5195, 1368, 5202, 5205,12292,12292, 5214,
-    12292,12292, 5225, 5228,12292,12292, 1386, 1406, 5237,12292,
-    12292, 5245, 1403, 5248, 5251, 1409, 1435, 1453, 5260, 1442,
-     5266, 5269, 5273, 5279, 5284, 1739, 1484, 5288,12292, 1524,
-    12292,12292, 1502, 1505, 5293, 1525, 1541, 1548, 1567, 1582,
-
-     1585, 1590, 2830, 1613, 1636, 2874, 1646, 2882, 1686, 2887,
-     1695, 1710, 2933, 1717, 3010, 1732, 3266, 1749, 1758, 1775,
-     1777, 1779, 3078, 1766, 3540, 5297,12292,12292, 5312, 5315,
-    12292,12292, 1780, 1798, 5326, 1773, 5331,12292,12292, 1782,
-     5347,12292,12292, 1774, 5340, 1781, 5359, 2516, 2779, 5367,
-     5371, 5380, 1892, 1894, 1908, 1906, 3279, 1914, 3342, 3530,
-     5385, 1921, 1919, 1922, 5388, 5391, 1922, 5394, 5402, 5412,
-    12292,12292, 5420, 1928, 5423, 5426, 5432,12292,12292, 1961,
-     5441, 5446,12292,12292, 5460, 5456, 1979, 1975, 5464,12292,
-    12292, 5478, 5481, 5489, 5492, 5496, 1984, 5510, 3670, 1991,
-
-     5514,12292,12292, 5522,12292, 5525,12292,12292, 5533, 1991,
-     5536, 5541, 5554, 1977, 5557,12292,12292, 1987, 2012, 5565,
-     5568, 5576, 2021, 2048, 2049, 2051, 5583, 5586, 5589, 5594,
-     5607, 5610, 5613, 5616, 2057, 5619, 5631, 5639, 2046, 5642,
-     5646, 2056, 5660, 2056, 5663, 2072, 2054, 5669, 2076, 2057,
-     2076, 5672, 5684, 2094, 5692, 2097, 5695, 2120, 5698, 5701,
-     5704, 5707, 2115, 5726, 5722, 5730, 5733, 5736, 2111, 5741,
-    12292,12292, 2118, 2117, 2117, 5751, 2138, 5756, 5759, 5775,
-     5778, 5781, 5784, 5803, 2178, 2177, 2252,12292, 2128, 5806,
-     5809, 2142, 2168, 2176, 2274, 2173, 2176, 3771, 2187, 2195,
-
-     2181, 4553, 2200, 2221, 2228, 5812, 5815, 5818, 2246, 5824,
-     2250, 5828, 5835, 2238, 2263, 2291, 2285, 5838, 2302, 5841,
-     2305, 2336, 5844, 2299, 5847, 2311, 5850, 5854, 2347, 2335,
-     2382, 2336, 2367, 2377, 2442, 2379, 5865,12292,12292, 5874,
-     5877, 2363, 2356, 2453, 2365, 5880, 5883, 2375, 2454, 2518,
-     5886, 5895,12292,12292, 5904, 5910, 5913, 5917, 5933, 2401,
-     5936, 5941, 5945, 5959, 2375, 2400, 5962,12292,12292, 5970,
-     5974, 5988, 2437, 2442, 2425, 5982,12292, 5996, 2433, 6001,
-     2459, 6007,12292,12292, 6015, 6020, 2474, 2494, 2484, 6029,
-    12292,12292, 6037, 6040, 6048, 2501, 2511, 2504, 6051, 6056,
-
-     6069, 6072,12292,12292, 6080, 6084, 6092, 6098, 6101, 6110,
-     2506, 6117,12292,12292, 6125, 6129, 2516, 6137,12292,12292,
-     2509, 6145,12292, 2540, 6148, 2522, 6151, 6154, 2525, 6157,
-     2550, 6169, 2567, 2569, 2550, 6177,12292, 2552, 6180, 2544,
-     6183, 6186, 6204, 6207, 2558, 6216, 2553, 6222, 6225, 6228,
-     6231, 6246, 6249, 6257, 2556, 2562, 2556, 2569, 6260, 2588,
-     6265,12292,12292, 6279, 6283, 6287,12292,12292, 6298,12292,
-     2652, 2809, 2651, 2613, 6302, 6305, 6313, 6326, 2607, 2630,
-     2645, 2627, 6332, 6337, 6340, 2630, 6343, 2631, 2685, 2678,
-     6346, 6349, 6352, 6355, 2679, 6358, 6361, 6364, 6367, 6370,
-
-     6373, 2681, 6378, 2688, 2704, 6381,12292, 2685, 6385, 6388,
-     2705, 6403, 6406, 6409, 2720, 2721, 2722, 2728, 2741, 2771,
-     2770, 2778, 2784, 2779, 6417, 6424, 6430, 6438, 2774, 2791,
-     2788, 2803, 6442, 6445, 6448, 6451, 2801, 6459, 6462, 6467,
-     2805, 6480,12292,12292, 6488, 2822, 6493,12292, 6496,12292,
-    12292, 6507, 2819, 2840, 6512,12292,12292, 2906, 2956, 2860,
-     2868, 6520, 2882, 6526,12292,12292, 2883, 2886, 2900, 6540,
-    12292,12292, 6534, 6548, 2913, 2913, 2919, 6557,12292,12292,
-     6565, 6569,12292,12292, 6577, 6580, 6588,12292,12292, 6596,
-     2924, 6599,12292,12292, 2920, 2930, 2925, 6607, 2938, 6610,
-
-     6615, 6630, 2946, 6633, 6636, 2953, 2945, 3031, 3038, 2950,
-     2994, 6645,12292, 2993, 6651,12292,12292, 6664,12292,12292,
-     3005, 6659, 2997, 6673, 6678, 6681,12292,12292, 6693,12292,
-    12292, 6701, 6705, 6711, 6715, 6723, 6729, 2993, 6733, 6736,
-     6741, 3079, 3055, 6744, 6748,12292,12292, 6756, 6763, 6766,
-     6769, 3012, 3045, 6775, 6783, 3065, 6786, 6789, 6795, 6798,
-     6801, 6804, 3057, 3065, 6807, 6810, 6816, 6819, 3074, 6822,
-     3076,12292, 6825, 6828,12292,12292, 6836, 6843,12292, 6847,
-    12292,12292, 3120, 3107, 3122, 3134, 3146, 3148, 3138, 3153,
-     3152, 3165, 6855, 6858, 3294, 6841, 6867, 6870, 3126, 3125,
-
-     3136, 6875, 3130, 6878,12292,12292, 3127, 6886, 6889,12292,
-    12292, 3128, 6897, 6905, 6908, 3147, 3157, 3185, 3207, 3188,
-     3207, 3180, 6911, 6917, 3182, 3189, 3188, 3289, 6923,12292,
-    12292, 6936, 3190, 3204, 6939, 6942,12292,12292, 6950, 3205,
-     3213, 3221, 3222, 6954,12292, 6961, 6969,12292,12292, 6964,
-     6979, 6983,12292,12292, 6991, 6997, 3251, 3273, 3273, 3304,
-     7000, 3273, 7003, 3279, 7009, 7018, 7021, 7029, 7032, 7036,
-     7041, 7054, 7059, 7062, 7065, 7072, 7084, 7087,12292, 7091,
-     3398, 3347, 7094, 7097, 7106, 7116, 3274, 3273, 7119, 7122,
-     7125, 7128, 3275, 3317, 3319, 7131,12292, 3309, 7134, 7137,
-
-     3327, 3345, 3341, 3367, 3362, 3381, 3394, 3396, 3414, 3407,
-     3421, 7145, 3400, 3408, 3420, 3403, 3417, 3421, 3429, 3529,
-     3467, 3478, 7154, 3477, 3478, 7157, 3474, 3500, 7160, 3506,
-     7164,12292, 7167, 7170, 7179, 3503, 3523, 3586,12292, 3587,
-    12292, 7185, 7188, 7191, 3531, 3553, 3541, 3533, 3572, 7194,
-     7199, 3567, 7212, 7215,12292, 7218,12292, 3560, 3566, 7221,
-     3568, 7230, 7239, 7249, 7252, 7255, 7263, 7270, 7273, 3643,
-    12292, 3641,12292, 7276, 3593, 7281, 3595, 7284,12292, 7294,
-     7297, 7305, 7308, 7312, 7317,12292,12292, 7332, 7335, 7343,
-     7346, 7350,12292, 7353, 7356, 3699, 3649, 3650, 7364,12292,
-
-     3588, 3605, 7369, 3596, 3608, 3614, 7377, 7383, 3814, 3864,
-     3660, 3695, 3704, 3704, 3721, 3738, 3722, 3733, 3736, 3742,
-     3761, 7391, 3702, 3718, 3717, 3724, 3727, 3725, 3731, 3745,
-     3743, 3761, 3767, 3760, 3771, 3795, 7395, 3787, 3805, 7398,
-     3814, 7401,12292,12292, 7410,12292, 3795, 7413,12292,12292,
-     7417, 7420, 7431, 3797, 3813, 3819, 7435, 3823, 7438,12292,
-    12292, 3840, 7446, 7453, 3827, 7464, 7470, 7473, 7482, 7488,
-    12292,12292, 7496,12292, 7500,12292,12292, 7508, 7511, 7515,
-    12292,12292, 7518, 7522, 7536, 7539, 7542, 3904, 3964, 7550,
-    12292, 7557, 7564, 7572,12292,12292, 7583, 7586, 7594, 7597,
-
-     7606,12292, 3893, 3944, 3955, 3842, 7612, 3868, 3883, 3884,
-     7615, 7626, 3899, 3904, 3980, 3905, 3910, 3996, 3910, 3973,
-     3961, 3975, 3982,12292, 4000, 3988, 3990, 4015,12292, 7618,
-     3995, 4005, 3992, 4007, 4015, 4021, 4008, 4017, 4011, 4026,
-     4034, 4040, 4026, 7637, 4042, 7640, 7643, 7646, 7649, 7653,
-     7658, 7671,12292,12292, 7679,12292, 4058, 4045, 7682, 7685,
-     7689, 7706, 4065, 7709,12292,12292, 4069, 7717, 7720, 7728,
-    12292,12292, 7736, 7739, 7747, 7750, 7754, 7758,12292,12292,
-     7768, 7772, 7780, 7786, 4094, 4098, 4099, 4103, 4121, 4121,
-     7794, 7798, 7806, 4160, 4170, 7817,12292,12292, 4249, 4145,
-
-     7825, 4111, 7828, 7831, 4099, 4101, 7834,12292,12292, 4148,
-     4151, 4153, 4161, 4169, 4157, 4159, 4169, 7846, 4182, 4206,
-     4224, 4219, 4211, 4230, 4245, 4241, 7849, 4196, 4204, 4220,
-     4269, 4275, 4223, 4216, 4231, 4249, 4294, 4296, 4246, 4255,
-     7852, 7855, 7858, 7869, 7877, 7880, 7883, 7891, 7899, 4255,
-     7909,12292,12292, 4265, 4260, 7917, 7920, 7929,12292,12292,
-     7937, 7940, 4249, 4273, 7948,12292,12292, 7956,12292,12292,
-     7964, 7967, 7970, 7978, 7985, 4313, 4317, 7996, 4324, 4335,
-     4289, 4299, 4329, 4297, 4319, 4352, 8004, 8007, 4337, 4352,
-     4351, 4370, 4378, 8010, 8016, 8019, 8029, 8038, 8041, 8044,
-
-     4364, 4376, 4378, 4375, 4380, 4394, 4396, 4395, 8050, 8053,
-     4408, 4409,12292, 4410, 4413, 4413,12292, 4427, 8061, 4406,
-     4392, 4456,12292,12292, 4412, 4412, 4399, 4459,12292,12292,
-     4424, 8064, 8068, 8074,12292,12292, 8082, 8085,12292,12292,
-     8094,12292,12292, 4424, 4428, 4430, 8102,12292,12292, 8110,
-    12292,12292, 8118, 4433, 8121, 8124,12292,12292, 8132, 4459,
-     4474, 4476, 4487, 4480, 4491, 4484, 4499, 4491, 4505,12292,
-     4498, 4508,12292, 8139,12292, 8142, 4517, 4511, 4533, 4521,
-     4581, 8145, 8151, 8164, 8195, 8242, 8172, 8175, 8178, 4538,
-     4564, 4565, 4536, 4553, 4570, 4584, 4555, 8183,12292,12292,
-
-     4590, 4565, 4567, 4594, 4571, 4576, 8206, 4544, 4560,12292,
-     4570, 4563, 4565,12292, 4575, 8215, 8218,12292, 4574, 4582,
-     4594, 8221, 8225, 4590, 8233, 8262, 8253, 8271, 4646, 4618,
-     4655, 4630, 4665, 4635, 4668, 4646, 4681, 4682, 4697, 4698,
-     8279, 4703, 4670, 4707, 4678, 4699, 8288, 4722, 4764, 8308,
-     8355, 4715,12292,12292, 4710, 4736,12292,12292, 4713,12292,
-     4760, 4766,12292, 4772, 4773, 8282,12292, 4779, 4742, 4786,
-     4785, 4746, 4799, 4770, 4771, 4759, 8328, 4806, 4819, 4785,
-     8336,12292,12292, 8344, 4825, 4833,12292, 4837,12292, 4842,
-    12292, 4848,12292, 4860,12292,12292,12292,12292, 8301,12292,
-
-    12292, 4849,12292, 4855, 4863, 4883, 4880, 4875, 4971, 4881,
-     8366, 4883, 4882, 4910, 4901,12292,12292,12292,12292,12292,
-     4925,12292,12292, 4948,12292, 8375, 8378, 8381, 4910, 4900,
-     4913, 4905, 8386, 4956, 4923, 4978, 4927,12292,12292,12292,
-    12292, 4932, 4935, 8389, 4982, 4969, 4989, 8404, 4996, 4981,
-     5006, 5002,12292, 4976,12292, 4978, 8408, 8411, 8419, 8426,
-     8437, 8440, 4988, 5007, 5020, 5003, 5016, 5039, 8448, 8456,
-     5024, 5038, 5062, 5046, 5054, 5090, 5073, 5075, 8451, 5096,
-    12292, 5089,12292, 5092, 5076, 5099, 8466,12292,12292, 8474,
-    12292,12292, 8482, 5129, 5132, 5114, 5120, 5116, 5139, 5146,
-
-     5146, 8490,12292,12292, 5150, 5159, 5163, 5165, 5177, 5174,
-     5207, 5210, 5239,12292, 5215, 5215, 5169, 5177, 5213, 5207,
-     5216, 5213, 5214, 5231, 5240, 5248, 5254, 5276, 5275, 5282,
-     5283, 5280, 5287, 5294,12292,12292, 5306,12292,12292, 5269,
-     5270, 5285, 5309, 5296, 5317, 5315, 5313, 5330, 5320, 5318,
-     5339, 5329, 5326, 5347, 5339, 5337, 5360, 5379, 5395, 5393,
-     5370, 5371, 5373, 5374, 5391, 5383, 5425, 5406, 5400, 5430,
-     5421, 5416, 5450, 5439, 5434, 5463, 5481,12292,12292, 5444,
-     5451, 5448, 5460, 5482, 5456,12292, 5494, 5471,12292, 5500,
-     5477,12292, 5506, 5486,12292, 5512, 5484, 5508, 5504, 5523,
-
-    12292, 5523,12292, 5525,12292, 5526,12292, 5528, 8498, 5536,
-     5558, 5539, 5566, 5532, 5538, 5539, 5550, 8501, 5593,12292,
-     5592,12292, 5598, 5596, 5601, 5615, 5636, 5657,12292,12292,
-    12292,12292,12292,12292, 5611, 5698, 5701, 5731, 5605, 5737,
-     5631, 5637, 5648, 5702, 5752, 5782, 5664, 5835, 5776, 5777,
-     5804, 5839, 5840, 5855, 5619, 5843, 5871, 5898, 5607, 5721,
-     5922, 5930, 5872, 5926, 5947, 5973, 5932, 5949, 5962, 6000,
-     6025, 6037, 5994, 5995, 5976, 6057, 5950, 6049, 6017, 6104,
-     6043, 6071, 6077, 6088, 6142, 6144, 6105, 6183, 6010, 6147,
-     6149, 6178, 6184, 6226, 6221, 6246, 6219, 6237, 5842, 6116,
-
-     6201, 6223, 6259, 6358, 6255, 6373, 5905, 6202, 6299, 6311,
-     6436, 6452, 6252, 6409, 6454, 6455, 6317, 6016, 8509, 8512,
-    12292,12292, 8532, 8541, 8550, 8559, 8568, 8577, 8586, 8595,
-     8604, 8613, 8622, 8631, 8640, 8649, 8658, 8667, 8676, 8685,
-     8694, 8703, 8712, 8721, 8730, 8739, 8748, 8757, 8766, 8775,
-     8784, 8793, 8802, 8811, 8820, 8829, 8838, 8847, 8856, 8865,
-     8874, 8883, 8892, 8901, 8910, 8919, 8928, 8937, 8946, 8955,
-     8964, 8973, 8982, 8991, 9000, 9009, 9018, 9027, 9036, 9045,
-     9054, 9063, 9072, 9079, 9086, 9093, 9100, 9107, 9114, 9121,
-     9128, 9135, 9142, 9149, 9156, 9163, 9170, 9177, 9184, 9191,
-
-     9198, 9205, 9212, 9219, 9226, 9233, 9240, 9247, 9254, 9261,
-     9268, 9277, 9284, 9289, 9296, 9301, 9308, 9313, 9320, 9325,
-     9332, 9337, 9344, 9349, 9356, 9361, 9368, 9373, 9380, 9385,
-     9392, 9397, 9404, 9409, 9416, 9421, 9428, 9433, 9440, 9445,
-     9452, 9457, 9464, 9469, 9476, 9481, 9488, 9493, 9500, 9505,
-     9512, 9517, 9524, 9529, 9536, 9541, 9548, 9553, 9560, 9565,
-     9572, 9577, 9584, 9589, 9596, 9601, 9608, 9613, 9622, 9628,
-     9635, 9643, 9650, 9658, 9665, 9673, 9680, 9688, 9695, 9703,
-     9710, 9718, 9725, 9733, 9740, 9748, 9755, 9763, 9770, 9778,
-     9785, 9793, 9800, 9808, 9815, 9823, 9830, 9838, 9846, 9854,
-
-     9861, 9869, 9876, 9884, 9891, 9899, 9906, 9914, 9922, 9930,
-     9938, 9946, 9953, 9961, 9969, 9977, 9985, 9993,10000,10008,
-    10015,10023,10031,10038,10046,10055,10061,10068,10076,10084,
-    10092,10100,10108,10115,10123,10130,10138,10145,10153,10160,
-    10168,10175,10183,10191,10199,10207,10215,10222,10230,10238,
-    10246,10254,10262,10269,10277,10284,10292,10299,10307,10314,
-    10322,10329,10337,10344,10352,10359,10367,10374,10382,10389,
-    10397,10405,10412,10420,10427,10435,10442,10450,10458,10465,
-    10473,10482,10491,10498,10506,10514,10521,10529,10536,10544,
-    10551,10559,10566,10573,10581,10588,10596,10603,10611,10618,
-
-    10626,10633,10641,10649,10657,10664,10672,10680,10688,10695,
-    10703,10710,10718,10725,10733,10740,10748,10755,10763,10770,
-    10778,10785,10793,10801,10808,10816,10823,10831,10839,10847,
-    10855,10863,10871,10880,10889,10896,10904,10912,10919,10927,
-    10934,10942,10949,10957,10964,10971,10979,10986,10994,11001,
-    11009,11017,11025,11032,11040,11048,11055,11063,11071,11079,
-    11086,11094,11101,11109,11116,11124,11131,11139,11146,11154,
-    11162,11170,11177,11185,11193,11201,11209,11216,11224,11232,
-    11240,11248,11257,11266,11274,11282,11290,11297,11305,11312,
-    11320,11328,11336,11344,11352,11360,11368,11376,11383,11391,
-
-    11399,11406,11414,11421,11429,11437,11445,11452,11459,11467,
-    11474,11482,11489,11496,11504,11511,11519,11526,11534,11542,
-    11550,11557,11565,11573,11581,11590,11599,11607,11615,11622,
-    11629,11637,11645,11652,11660,11667,11675,11682,11690,11697,
-    11705,11712,11720,11728,11735,11742,11750,11757,11765,11772,
-    11779,11786,11794,11801,11809,11817,11825,11833,11841,11849,
-    11857,11866,11875,11883,11891,11898,11906,11914,11921,11929,
-    11936,11944,11952,11960,11967,11975,11982,11990,11998,12005,
-    12012,12020,12028,12036,12043,12050,12058,12066,12074,12082,
-    12090,12098,12106,12114,12123,12132,12140,12147,12154,12162,
-
-    12169,12177,12184,12192,12199,12207,12214,12221,12228,12237,
-    12246,12255,12264,12273,12282
+     2523, 2526, 3605, 3675, 2530, 2533, 3745, 3815, 2587, 2590,
+        0,    0, 9416,12593,12593,   95,  100,   29,   41,12593,
+      103,   51,12593,12593, 9405,12593,12593, 9394,12593, 9405,
+     9405,  202,12593,12593,12593,12593, 9403, 9399, 9354,  153,
+    12593,  161, 9380,    0,  145,12593, 9342,12593,  165, 3881,
+
+       73, 2599,  315,  357, 9382, 9329,12593,  168, 9368,    0,
+      152,12593, 9330,12593,  261, 9374,   31,12593,  266, 9361,
+        0,  245,12593, 9323, 9327, 9321,  421, 9326,12593,  269,
+     9352,    0,  340,12593, 9314, 9314,  271, 9316,  238,12593,
+      441,  484,12593,  504, 9340,    0,  401,12593, 9299, 9301,
+     9287,12593,  561,  548,12593,  571, 9332,    0,  481,12593,
+     9299, 9283,12593,  628, 3945, 9281,  163, 2533,  567,  206,
+       38, 9332,  954, 2607,  639,  907,  437,   79,12593,  634,
+     9319,    0,  546,12593, 9275, 9285, 9269, 9274,12593,  638,
+      313,  559,  368,12593,  697, 9310,    0,  549,12593, 9262,
+
+     9272, 9250,12593,  704,  426,  497,12593,  707, 9298,    0,
+      747,12593, 9268, 9248,12593,  767,  753,12593,  773, 9291,
+        0,  757,12593, 9261, 9236,12593,  831,  818,12593,  838,
+     9284,    0,  758,12593, 9233, 9239, 9245,  251, 9228,12593,
+      841,  466, 9234,  530,12593,  906, 9270,    0,  815,12593,
+     9240,12593,  914,  891,12593,  977, 9268,    0,  816,12593,
+     9220, 9230, 9217,12593,  981,  965,12593, 1021, 9256,    0,
+      881,12593, 9205,  203, 9211, 9217,  378,   85,  639,  972,
+     9205,12593, 1040,  564,  814,12593, 1044, 9247,    0,  953,
+    12593, 9191, 9209, 9211,  157, 8639, 8618,12593, 1048, 1086,
+
+    12593, 1106, 8665,    0,  966,12593, 8614, 8612, 8619, 8629,
+     8631, 8616, 8609,12593, 1111, 1099,12593, 1114, 8656,    0,
+     1032,12593, 8611, 8614,12593, 1156, 1160,12593, 1173, 8645,
+        0, 1033,12593, 8614, 8603, 8604,12593, 1180, 1228,12593,
+     1183, 8632,    0, 1100,12593, 8601, 8593, 8595,   15,12593,
+     1186,  899,  963,12593, 1241, 8622,    0, 1157,12593, 8569,
+      181,12593, 1244, 1243,  432,  303,12593, 1248, 8614,    0,
+     1158,12593, 8563, 8557,  299,12593, 1308, 1229,  350,12593,
+     1311, 8607,    0, 1295,12593, 8560, 8554,12593, 1315, 1362,
+    12593, 1319, 8585,    0, 1303,12593, 8528, 8528,12593, 1375,
+
+     1378,  685,12593, 1378, 8572,    0, 1363,12593, 8517, 8511,
+     8513,12593, 1445, 1438,  744,12593, 1449, 8557,    0, 1365,
+    12593, 8503, 8508, 8503, 8497, 8485,12593, 1454, 1447,  560,
+     1007,12593, 1511, 8527,    0, 1370,12593, 8492,12593, 1517,
+     1559,12593, 1520, 8520,    0, 1495,12593, 8480,12593, 1579,
+     1210, 1433,12593, 1584, 8511,    0, 1496,12593, 8477, 8475,
+    12593, 1587, 1632,12593, 1645, 8503,    0, 1563,12593, 8469,
+     8463,12593, 1648, 1633, 1707,  719, 8437,12593, 8496, 8467,
+    12593,12593,12593, 1700,  375, 8418, 8416, 8410, 8457, 8416,
+    12593,    0, 8408, 8396, 8420, 8382,  104, 1037, 8383, 8380,
+
+     8379, 8383,  889, 1646, 1105, 8371, 8371, 1510, 1577, 8397,
+     1701, 8372, 1709, 8361, 1719, 1720, 1721,12593,    0, 8362,
+     8364,12593,    0, 8359, 2098, 8344,  666, 8341, 8387,12593,
+        0, 8336, 2165, 8321, 8330, 8311, 8320, 8317, 8299, 8280,
+    12593,    0, 8292, 8272, 8284, 8263,12593,    0, 2232, 8261,
+     8306, 8284,  172, 8248, 8246, 8246, 1777, 1639, 8233, 1778,
+     8259,  724,  814,  841,  888, 1770, 1792, 1779, 1046,12593,
+        0, 8234, 2289, 8240, 8216, 8212,  897,12593,    0, 8216,
+     2596, 8208, 8204,12593,    0, 8197, 8194, 8194,12593,    0,
+     8189, 8185, 8186,12593,    0, 8192,  621, 2614, 8168, 8167,
+
+     8184, 8176, 1027,12593,    0, 8169, 8167,12593,    0, 8148,
+     2656, 2666, 8158,12593,    0, 8164, 8153, 2674, 8134, 2680,
+     8130, 8117, 8114, 8103, 8118, 8117, 8097, 8095, 8094, 8087,
+     8071, 8082,12593,    0, 2721, 2724, 8060, 8056, 8072, 8065,
+     8062, 8063,12593,    0, 8059, 8058, 8038, 2727, 8032, 8027,
+     8041, 8025,12593,    0, 8020, 2730, 8015,12593,    0, 8018,
+     2733, 8010, 8023,12593,    0, 8006, 2788, 7997, 8011, 8010,
+     7988,12593,    0, 7979, 7994, 7979, 7973, 7976,12593,    0,
+     7964, 7973, 7951, 7939, 7976,12593,    0, 7931, 2791, 7935,
+    12593,    0, 7912, 7922, 7922,12593,    0, 7902, 7910, 7906,
+
+     7897,12593,    0, 7884, 7869, 7875, 7877, 7875, 7858, 7847,
+    12593,    0, 7851, 7857,12593,    0, 2794, 7854,12593,    0,
+     2797, 7835, 7830,12593,    0, 2800, 7832, 7823, 7863, 7867,
+     1558, 7811,12593, 1833,    0, 7807, 7797, 7840, 7835, 7788,
+    12593, 7796, 7776, 2600, 2855, 1981, 7787, 7788, 7766, 7755,
+     7734, 7737, 7726, 7726, 7741, 7712,  330, 7705, 7710, 7713,
+     7697, 7690, 7682, 7686, 7699, 7684, 7682, 1990, 7693, 7672,
+     7676, 7673, 7661, 7674, 7668, 2858, 2863, 7667, 2866, 2048,
+     7661, 7682, 2869, 2914,12593, 7652, 2917, 2117, 2924, 7633,
+     2927, 7637, 7640, 7635, 2920, 2983, 7621, 7628, 7624, 2969,
+
+     2972, 2975, 2184, 7606, 2979, 3037, 2363, 7617, 7603, 7596,
+     7590, 7594, 7588, 7581, 7581, 2423, 7575, 7573, 7566, 7565,
+     7564, 3040, 2550, 7574, 7573, 3044, 3047, 1070, 7550, 3050,
+     2621, 7564, 3103, 3106, 7562, 7548, 3114, 3117, 7559, 7558,
+     3129, 3173, 7548, 7531, 7543, 3109, 2685, 7541, 7540, 7520,
+     3179, 3183, 1340, 7504, 7518, 3186, 3245, 7504, 3239, 2755,
+     3248, 2822, 3252, 3257, 7508, 1920, 3304, 3002, 7510, 3308,
+     3068, 3313, 7491, 7483, 7479, 7477, 7472, 7460, 7451, 7448,
+     7457, 7447, 3322, 3383, 3331, 3137, 3371, 3205, 3374, 3392,
+     3397, 3450, 3459, 3444, 3468, 7451,   37, 7433, 3454, 3403,
+
+     3512, 7445, 7427, 3516, 3519, 7428, 3522, 3411, 3525, 3571,
+     7440, 3574, 3473, 7432, 3577, 3580, 7425, 3583, 3481, 7423,
+     7408, 7405, 3628, 3634, 3637, 3640, 3700, 3643, 3704, 7408,
+     3695, 3723, 3709, 3770, 3713, 3766, 7415, 3774, 3662, 3777,
+     3780, 3792, 3836, 3839, 3843, 3846, 3854, 3849, 3867, 3878,
+     7413, 7384, 7391, 7395, 7375, 3872, 3887, 7385, 7364, 3875,
+     3897, 3906, 3732, 3909, 3920, 3916, 3804, 7363, 3924, 3952,
+     3956, 3967, 7361, 3977, 3983, 7403,12593,12593, 1210, 7350,
+    12593, 7387, 7386, 7334,12593,12593, 7332, 7330, 7333, 3987,
+     4012,12593, 4017, 1714, 7325, 7318, 7325, 7329, 7306, 7289,
+
+     7300, 1781, 7282, 7282, 7271, 7269, 7258, 7237, 7223, 7218,
+      446, 7229, 7212, 7208, 7222, 7215, 7215, 2057, 7197, 7185,
+     7190, 7179,  716, 7183, 4020, 4023, 4027,12593, 4031, 4038,
+     4046,12593,12593, 4056, 7208, 4059, 4065,12593, 4068, 7156,
+     4074,12593,12593, 4087, 4090, 4099, 4105, 4119, 7167, 4108,
+     7165, 4111, 4130,12593, 4133, 7153, 4136, 7151, 4139, 4142,
+    12593, 4145, 4154,12593,12593, 7146, 4164, 4167,12593, 4170,
+     7136, 7139, 7144, 2250, 7124, 7131, 1922, 7104, 7101, 7116,
+     7115, 7094, 7087, 7100, 4173,12593,12593, 7088, 4189, 4194,
+     4197,12593, 4200, 7093, 7090, 4203,12593,12593, 7105, 4219,
+
+     4222,12593, 4225, 4228, 4231, 4234, 4249,12593, 4253, 4256,
+     4262, 4274, 4280,12593, 4283, 7074, 7073, 4287, 4293,12593,
+    12593, 7058, 7054, 7064, 4305, 4308,12593, 4311, 7048, 7046,
+     4314, 4317, 4332,12593, 4336, 4339, 4344,12593,12593, 4357,
+    12593,12593, 4365, 4368,12593, 4371, 7047, 7025, 7046, 7037,
+     4377,12593,12593, 4390, 4393,12593,12593, 4404, 4408, 7024,
+     7040, 7023, 7024, 7028, 7007, 7002, 7004, 6992, 1376, 4416,
+     4422,12593, 4425, 4428,12593,12593, 4437,12593,12593, 4445,
+     4448, 6982, 6989, 6987, 6973, 4456, 4459,12593, 4463, 6958,
+     6954, 6943, 6955, 4466,12593,12593, 4478, 4482, 6939, 6947,
+
+     4496, 4499,12593, 4502, 6947, 4505,12593,12593, 4521, 4524,
+    12593, 4527, 6912, 4530,12593,12593, 6898, 4546, 4549,12593,
+     4554, 6888, 4558,12593,12593, 6888, 6884, 6886, 4568, 4573,
+    12593, 4577, 4580, 4583, 4598, 4604, 6885, 4612, 4616,12593,
+     4620, 6864, 4623, 4641, 6852, 6847, 4627, 4649, 6832, 4657,
+     4660,12593, 4663, 6833, 4666,12593,12593, 4682, 4688,12593,
+     4691, 4694, 4697, 4712, 4715, 4723, 4730,12593, 4734, 4737,
+     4742, 6800, 6800, 4755, 4758, 4766, 4769,12593, 4773, 6794,
+     4776, 6802, 6796, 6776, 4779, 4788,12593, 4798, 6773, 6774,
+     4801, 4807,12593, 4810, 4813,12593,12593, 4821, 4829,12593,
+
+     4832, 4836,12593,12593, 6754, 4844, 4851,12593, 4854, 4864,
+    12593,12593, 6733, 4873, 4876,12593, 4879, 1216, 4882,12593,
+    12593, 6749, 6747, 6707, 6670, 4885, 6588, 6592, 6517, 6486,
+     6486, 6397, 6407, 2307, 2483, 6285, 2492, 6194, 6168, 6087,
+     2495,   12,   36, 2559,  131,  264,  311,  352,  389,  436,
+      488,  488,  549, 2562,  590,  632, 4888, 4906, 4916, 4919,
+     4923,  703,  802, 4931,  782, 4937,12593,12593, 4945, 4952,
+     4963,12593,12593,  797, 4971, 4975,  836, 4983,  830, 4989,
+     4992, 5002, 5007,  835, 5010,12593,  851,  980,  964, 2662,
+     2693, 2763, 2830,  980, 1043, 1099, 1106, 1154, 1178, 1192,
+
+     5013, 5020, 5034, 5042, 1197, 1236, 1249, 5045, 5048, 5051,
+     1286, 5066, 5069, 5072, 1304, 5080, 1315, 1308, 5087, 5090,
+     5099, 1332, 5110, 5113, 1320, 1323, 5117, 5121, 5135, 5138,
+     5142, 5150, 1383, 5157, 1365, 1386, 5160, 5163, 5171,12593,
+    12593, 1389, 1394, 5180, 1382, 1411, 1411, 1430, 1455, 1432,
+     1462, 1464, 5183, 5186,12593,12593, 5194, 5198, 5202, 5205,
+     5208, 1495, 5212, 1495, 1508, 5223,12593,12593, 5233, 1519,
+     5236, 1536, 5239, 1554, 1583, 5242, 1578, 1604, 1594, 5245,
+     5251, 5270,12593,12593, 5278,12593,12593, 1605, 5265, 3010,
+     5286,12593,12593, 1628, 1646, 5294,12593,12593, 1632, 5302,
+
+     1639, 5309, 5312,12593,12593, 5321,12593,12593, 5332, 5335,
+    12593,12593, 1667, 1707, 5344,12593,12593, 5352, 1702, 5355,
+     5358, 1709, 1721, 1756, 5367, 1766, 5373, 5376, 5380, 5386,
+     5391, 5395, 5400, 1951, 1829, 5404,12593, 1831,12593,12593,
+     1790, 1792, 5413, 1788, 1894, 1899, 1907, 1923, 1936, 1935,
+     3076, 1954, 1977, 3266, 1986, 1990, 3279, 1991, 3342, 1978,
+     1976, 3377, 1992, 3530, 2008, 3540, 2026, 2035, 2051, 2052,
+     2055, 3380, 2041, 3670, 5419,12593,12593, 5427, 5433,12593,
+    12593, 2053, 2078, 5446, 2056, 5456,12593,12593, 2067, 5466,
+    12593,12593, 2058, 5474, 2062, 5477, 2851, 3945, 5485, 5489,
+
+     5498, 2076, 2080, 2100, 2104, 3727, 2112, 4268, 4631, 5503,
+     2119, 2108, 2110, 5506, 5509, 2117, 5512, 5517, 5526,12593,
+    12593, 5536, 2143, 2126, 5539, 5542, 5546,12593,12593, 2142,
+     5557, 5561,12593,12593, 5576, 5579, 2147, 2136, 5584,12593,
+    12593, 5594, 5598, 5607, 5612, 5615, 2161, 5626, 5016, 2181,
+     5630,12593,12593, 5638,12593, 5645,12593,12593, 5653, 2188,
+     5657, 5660, 5668, 2173, 5675,12593,12593, 2175, 2191, 5686,
+     5689, 5700, 2184, 2200, 2194, 2201, 5704, 2223, 2232, 5707,
+     5710, 5722, 5713, 5718, 5731, 5736, 2245, 5739, 5742, 5750,
+     2234, 5757, 5761, 2244, 5769, 2237, 5777, 2249, 2232, 5781,
+
+     2254, 2239, 2274, 5784, 5790, 2290, 5802, 2286, 5805, 2302,
+     5808, 5813, 5816, 5834, 2298, 5837, 5840, 5843, 5846, 5849,
+     2293, 5864,12593,12593, 2301, 2302, 2300, 5872, 2316, 5875,
+     5884, 5893, 5898, 5902, 5906, 5920, 5924, 5927, 5942, 2352,
+     2351, 2396,12593, 2338, 5945, 5948, 2359, 2353, 2356, 2450,
+     2354, 2362, 5935, 2374, 2379, 2396, 2409, 5954, 2420, 2410,
+     2411, 5957, 5963, 5967, 2429, 5970, 2440, 5973, 5976, 2424,
+     2450, 2486, 2475, 5979, 2492, 5983, 2498, 2536, 5986, 2532,
+     5989, 2539, 5992, 5995, 2584, 2571, 2649, 2573, 2588, 2576,
+     2668, 2586, 6013,12593,12593, 6021, 6024, 2573, 2566, 2716,
+
+     2574, 6027, 6030, 2579, 2717, 2722, 6035, 6042,12593,12593,
+     6053, 2597, 6056, 6059, 6062, 6077, 2632, 6082, 6086, 6089,
+     6097, 2615, 2625, 6107,12593,12593, 6116, 6119, 6127, 2656,
+     2664, 2660, 6135,12593, 6138, 2687, 6141, 2688, 6145,12593,
+    12593, 6154, 6160, 2693, 2703, 2703, 6168,12593,12593, 6176,
+     6179, 6187, 2706, 2736, 2748, 6190, 6194, 2740, 2735, 6208,
+     6211,12593,12593, 6219, 6223, 6231, 6237, 6240, 6249, 2752,
+     6256,12593,12593, 6264, 6268, 2763, 6276,12593,12593, 2760,
+     6284,12593, 2769, 6287, 2753, 6290, 6293, 2754, 6296, 2779,
+     6308, 2793, 2794, 2794, 6316,12593, 2806, 6319, 2796, 6322,
+
+     6325, 6343, 6346, 2819, 6355, 2814, 6361, 6364, 6367, 6370,
+     6385, 6388, 6396, 2817, 2825, 2821, 2834, 6399, 2846, 6404,
+    12593,12593, 6418, 6422, 6426,12593,12593, 6437,12593, 6441,
+    12593,12593, 6449, 2915, 2894, 2922, 2871, 6456, 6470, 6478,
+     6452, 2865, 2884, 2908, 2885, 6481, 6484, 6487, 2903, 6490,
+     2922, 2924, 2938, 2932, 6497, 6500, 6503, 6506, 2934, 6509,
+     6512, 6515, 6518, 6521, 6524, 2935, 6527, 2943, 2956, 6530,
+    12593, 2941, 6533, 6536, 2960, 6553, 6556, 6559, 2975, 2976,
+     3005, 3020, 3013, 3025, 3022, 3025, 3031, 3030, 6567, 6574,
+     6579, 6587, 3022, 3042, 3019, 3037, 6592, 6595, 6598, 6601,
+
+     3046, 6609, 3056, 6612, 6617, 3056, 6630,12593,12593, 6638,
+     3073, 6643,12593, 6646,12593,12593, 6657, 3067, 3068, 6662,
+    12593,12593, 3157, 3177, 3082, 3091, 6670, 3085, 6676,12593,
+    12593, 3085, 3088, 3118, 6690,12593,12593, 6684, 6698, 3120,
+     3109, 3118, 6707,12593,12593, 3130, 6715, 6718, 6722,12593,
+    12593, 6733, 6737, 6745,12593,12593, 6753, 3131, 6756,12593,
+    12593, 3126, 3135, 3130, 6765, 3144, 6768, 6772, 6786, 3145,
+     6789, 6792, 3156, 3149, 3218, 3239, 3155, 3165, 6800,12593,
+     3171, 6807,12593,12593, 6820,12593,12593, 3188, 6815, 3182,
+     6829, 6834, 6837,12593,12593, 6849,12593,12593, 6857, 6861,
+
+     6867, 6871, 6879, 6885, 3189, 6889, 6892, 6897, 6904, 3255,
+     3321, 6900, 6912,12593,12593, 6923, 6926, 6929, 6932, 3196,
+     3209, 6942, 6945, 3220, 6951, 6954, 3237, 6960, 6963, 6966,
+     6969, 3245, 3252, 6972, 6975, 6978, 6983, 3257, 6986, 3253,
+    12593, 6989, 6992,12593,12593, 7000, 7007,12593, 7011,12593,
+    12593, 3297, 3288, 3303, 3304, 3311, 3314, 3308, 3323, 3335,
+     3363, 7019, 7022, 5419, 5856, 7030, 7033, 3325, 3323, 3343,
+     7038, 3336, 7041,12593,12593, 3335, 7049, 3347, 7052,12593,
+    12593, 3345, 7060, 7068, 7063, 3362, 3384, 3417, 3443, 3423,
+     3446, 3406, 7071, 7074, 3403, 3410, 3409, 3480, 7082,12593,
+
+    12593, 7096, 3411, 3427, 3420, 7099, 7102, 7110, 7117,12593,
+    12593, 7125, 3429, 3436, 3482, 3493, 7129,12593, 7135, 7138,
+    12593,12593, 7148, 7154, 7157,12593,12593, 7167, 7172, 3520,
+     3558, 3543, 3562, 7175, 3540, 7178, 3541, 7185, 7181, 7193,
+     7205, 7212, 7208, 7217, 7227, 7234, 7237, 7240, 7245, 7255,
+     7259,12593, 7262, 7268, 3581, 3578, 7274, 7281, 7289, 7292,
+     3529, 3531, 7295, 7300, 3539, 7303, 7306, 3531, 3559, 3565,
+     7309,12593, 3555, 7312, 7315, 3592, 3607, 3605, 3620, 3609,
+     3620, 3617, 3613, 3632, 3621, 3632, 7323, 3640, 3644, 3743,
+     3642, 3652, 3650, 3663, 3828, 3660, 3680, 7331, 3676, 3672,
+
+     7334, 3670, 3680, 7337, 3707, 3721, 7342,12593, 7345, 7349,
+     7357, 3719, 3721, 3792,12593, 3790,12593, 7363, 7366, 7369,
+     3733, 3756, 3747, 3743, 3795, 7372, 7377, 3794, 7390, 3807,
+     7393, 3856, 3906, 7404,12593, 7409,12593, 3796, 3799, 7412,
+     3800, 7415, 7433, 7418, 7441, 7444, 3830, 3834, 3844, 3899,
+    12593, 3905,12593, 7452, 3855, 7423, 3874, 7455,12593, 7459,
+     7463, 7477, 7480, 7484, 7487,12593,12593, 7499, 7503, 7511,
+     7517, 7520,12593, 7523, 7531, 7535, 3932, 3941, 3945, 7539,
+    12593, 3870, 3890, 7542, 7550, 3898, 3911, 3924, 7554, 7558,
+     4049, 4091, 3921, 3958, 3971, 3975, 3982, 4004, 3987, 4006,
+
+     4012, 4016, 4035, 7566, 3976, 3995, 3991, 3996, 4002, 3995,
+     4004, 4023, 4023, 4035, 4035, 4028, 4031, 4051, 7572, 4041,
+     4067, 7575, 7578, 4077, 7581,12593,12593, 7589,12593, 4078,
+     7597,12593,12593, 7600, 7604, 7618, 4079, 4090, 4102, 7621,
+     4096, 7627,12593,12593, 4121, 7639, 7643, 4112, 4148, 4147,
+     4152, 4150, 4115, 7651, 7657, 7660, 7669, 7675,12593,12593,
+     7683,12593, 7687,12593,12593, 4132, 4157, 4154,12593,12593,
+     7695, 7698, 7706, 7709, 7713, 4452, 4613, 7727,12593, 7730,
+     7733, 7736,12593,12593, 7752, 7755, 7763, 7766, 7774,12593,
+     7777, 4195, 4199, 4242, 4145, 7781, 7784, 4163, 4167, 4189,
+
+     7787, 7798, 4203, 4207, 4310, 4208, 4212, 4322, 4187, 4242,
+     4226, 4229, 4237,12593, 4268, 4256, 4256, 4263,12593, 7806,
+     4256, 4265, 4253, 4267, 4276, 4281, 4282, 4295, 4282, 4302,
+     4311, 4316, 4308, 7809, 4324, 7812, 7815, 7818, 7821, 7825,
+     7830, 7844, 7852,12593,12593, 7860,12593, 4334, 4321, 7863,
+     7866, 7872, 7884, 4336, 7887,12593,12593, 4336, 4368, 4360,
+     4378, 4363, 4355, 7895, 7898, 7906,12593,12593, 7914, 7917,
+     4344, 7925, 4362, 7928,12593,12593, 7936, 7939, 7947, 7950,
+     4379, 4380, 4384, 4386, 4397, 4398, 7958, 7961, 7965, 4521,
+     4540, 7973,12593,12593, 7981, 4424, 4435, 7984, 4400, 7834,
+
+     7987, 4388, 4403, 7990,12593,12593, 4451, 4439, 4443, 4461,
+     4473, 4461, 4475, 4484, 8003, 4475, 4495, 4512, 4498, 4481,
+     4513, 4528, 4516, 8006, 4472, 4475, 4491, 4539, 4548, 4503,
+     4500, 4506, 4538, 4582, 4585, 4535, 4545, 8010, 8013, 8016,
+     8025, 8021, 8034, 8040, 8048, 8052, 4549, 8060,12593,12593,
+     4550, 4549, 8068, 8073, 8082,12593,12593, 8090, 8093, 4538,
+     4546, 4581, 4587, 4597, 4600, 4595, 8101,12593,12593, 8109,
+    12593,12593, 4603, 8117, 8120, 4584, 8128, 4636, 4643, 8136,
+     4675, 4677, 4630, 4639, 4670, 4636, 4647, 4678, 8144, 8147,
+     4674, 4679, 4677, 4683, 8150,12593, 4743, 8153, 8156, 8159,
+
+     8178, 8181, 8184, 8187, 4688, 4702, 4705, 4696, 4707, 4721,
+     4724, 4713, 8190, 8193, 4726, 4735,12593, 4736, 4755, 4755,
+    12593, 4757, 8201, 4735, 4726, 4790,12593,12593, 4754, 4754,
+     4752, 4817,12593,12593, 4776, 8204, 8208, 8214,12593,12593,
+     8222, 8225,12593,12593, 8234,12593,12593, 4772, 4786, 4787,
+     8242,12593,12593, 8250,12593,12593, 8258, 4783, 4845, 4820,
+     4851, 4823, 4806, 8261, 8264,12593,12593, 8272, 4833, 4846,
+     4859, 4871, 4862, 4874, 4865, 4878, 4871, 4885,12593, 4878,
+     4888,12593, 8279,12593, 8282, 4890, 4885, 4902, 4891, 4917,
+     8285, 8291, 8304, 8335, 8382, 8312, 8315, 8318, 4917, 4938,
+
+     4939, 4910, 4927, 4948, 4950, 4920, 8323,12593,12593, 4956,
+     4930, 4935, 4961, 4938, 4950, 8346, 4922, 4923,12593, 4940,
+     4933, 4934,12593, 4945, 8355, 8358,12593, 4947, 4965, 4975,
+     8361, 8365, 8373,12593, 5022,12593, 5020, 4971, 8393, 8402,
+     8411, 8414, 5027, 4995, 5032, 5003, 5050, 5020, 5052, 5024,
+     5058, 5060, 5068, 5070, 8422, 5074, 5045, 5078, 5055, 5084,
+     8429, 5129, 5089, 8449, 8496, 5083,12593,12593, 5067, 5093,
+    12593,12593, 5072,12593, 5116, 5120,12593, 5122, 5123, 8442,
+    12593, 5172, 5085, 5141, 5182, 5107, 5159, 5118, 5140, 5121,
+     8469, 5195, 5236, 8461, 8479,12593,12593, 5166, 8516,12593,
+
+    12593, 8524, 5239, 5281,12593, 5217,12593, 5224,12593, 5251,
+    12593, 5249,12593,12593,12593,12593, 8487,12593,12593, 5238,
+    12593, 5239, 5271, 5311, 5322, 5277, 5331, 5277, 8490, 5279,
+     5273, 5294, 5293,12593,12593,12593,12593,12593, 5258, 5339,
+    12593,12593, 5260, 5403,12593, 8532, 8535, 8542, 5344, 5320,
+     5369, 5344, 8546,12593,12593, 8554, 5391, 5357, 5397, 5380,
+    12593,12593,12593,12593, 5388, 5402, 8560, 5435, 5430, 5443,
+     8563, 5450, 5441, 5455, 5449, 5410,12593, 5433, 5421,12593,
+     5436, 8566, 8572, 8584, 8587, 8595, 8598, 5450, 5464, 5481,
+     5477, 5489, 5502, 8606, 8609, 5485, 5494, 5511, 5494, 5503,
+
+     5525, 5513, 5514, 8617, 5537,12593, 5532,12593, 5534, 5505,
+     5522, 5508, 5525, 8620,12593,12593, 8629,12593,12593, 8637,
+     5567, 5581, 5547, 5556, 5554, 5566, 5572, 5574, 8645,12593,
+    12593, 5585, 5590, 5589, 5598, 5604, 5600, 5637, 5635, 5630,
+    12593, 5646, 5644, 5596, 5611, 5599, 5618, 5658, 5653, 5661,
+     5656, 5656, 5669, 5670, 5667, 5674, 5674, 5688, 5705, 5710,
+     5717, 5724, 5729,12593,12593, 5775,12593,12593, 5690, 5709,
+     5699, 5715, 5734, 5755, 5742, 5768, 5754, 5759, 5777, 5776,
+     5780, 5798, 5787, 5785, 5803, 5792, 5792, 5809, 5844, 5849,
+     5850, 5850, 5852, 5826, 5833, 5835, 5851, 5873, 5874, 5908,
+
+     5891, 5882, 5911, 5906, 5897, 5929, 5915, 5905, 5944, 5981,
+    12593,12593,12593,12593, 5933, 5958, 5970, 5978, 5999, 5976,
+    12593, 6001, 5980,12593, 6012, 5987,12593, 6012, 6003,12593,
+     6062, 6003, 6017, 6010, 6024,12593, 6024,12593, 6026,12593,
+     6041,12593, 6044, 8655, 6046, 6068, 6050, 6068, 6043, 6050,
+     6059, 6062, 8658, 6101,12593, 6103,12593, 6108, 6106, 6118,
+     6117, 6130, 6148,12593,12593,12593,12593,12593,12593, 6107,
+     6139, 6140, 6156, 6167, 6199, 6285, 6317, 6225, 6235, 6261,
+     6264, 6132, 6310, 6145, 6283, 6196, 6255, 6288, 6340, 6164,
+     6198, 6358, 6360, 6286, 6331, 6385, 6398, 6391, 6394, 6373,
+
+     6413, 6185, 6322, 6475, 6526, 6441, 6529, 6114, 6417, 6617,
+     6624, 6552, 6610, 6416, 6544, 6559, 6588, 6618, 6649, 6312,
+     6602, 6678, 6694, 6414, 6661, 6604, 6663, 6531, 6554, 6315,
+     6656, 6675, 6688, 6566, 6636, 6722, 6724, 6664, 6733, 6743,
+     6777, 6730, 6760, 6794, 6836, 6763, 6805, 6808, 6810, 6890,
+     6977, 6442, 6902, 8666, 8669,12593,12593, 8689, 8698, 8707,
+     8716, 8725, 8734, 8743, 8752, 8761, 8770, 8779, 8788, 8797,
+     8806, 8815, 8824, 8833, 8842, 8851, 8860, 8869, 8878, 8887,
+     8896, 8905, 8914, 8923, 8932, 8941, 8950, 8959, 8968, 8977,
+     8986, 8995, 9004, 9013, 9022, 9031, 9040, 9049, 9058, 9067,
+
+     9076, 9085, 9094, 9103, 9112, 9121, 9130, 9139, 9148, 9157,
+     9166, 9175, 9184, 9193, 9202, 9211, 9220, 9229, 9238, 9247,
+     9254, 9261, 9268, 9275, 9282, 9289, 9296, 9303, 9310, 9317,
+     9324, 9331, 9338, 9345, 9352, 9359, 9366, 9373, 9380, 9387,
+     9394, 9401, 9408, 9415, 9422, 9429, 9436, 9443, 9450, 9459,
+     9466, 9471, 9478, 9483, 9490, 9495, 9502, 9507, 9514, 9519,
+     9526, 9531, 9538, 9543, 9550, 9555, 9562, 9567, 9574, 9579,
+     9586, 9591, 9598, 9603, 9610, 9615, 9622, 9627, 9634, 9639,
+     9646, 9651, 9658, 9663, 9670, 9675, 9682, 9687, 9694, 9699,
+     9706, 9711, 9718, 9723, 9730, 9735, 9742, 9747, 9754, 9759,
+
+     9766, 9771, 9778, 9783, 9790, 9795, 9802, 9807, 9816, 9822,
+     9829, 9837, 9844, 9852, 9859, 9867, 9874, 9882, 9889, 9897,
+     9904, 9912, 9919, 9927, 9934, 9942, 9949, 9957, 9964, 9972,
+     9979, 9987, 9994,10002,10009,10017,10024,10032,10040,10048,
+    10055,10063,10070,10078,10085,10093,10100,10108,10116,10124,
+    10132,10140,10147,10155,10163,10171,10179,10187,10194,10202,
+    10209,10217,10225,10232,10240,10247,10255,10264,10270,10277,
+    10285,10293,10301,10309,10317,10324,10332,10339,10347,10354,
+    10362,10369,10377,10384,10392,10400,10408,10416,10424,10431,
+    10439,10447,10455,10463,10471,10478,10486,10493,10501,10508,
+
+    10516,10523,10531,10538,10546,10553,10561,10568,10576,10583,
+    10591,10598,10606,10614,10621,10629,10636,10644,10651,10659,
+    10667,10674,10682,10689,10697,10706,10715,10722,10730,10738,
+    10745,10753,10760,10768,10775,10783,10790,10797,10805,10812,
+    10820,10827,10835,10842,10850,10857,10865,10873,10881,10888,
+    10896,10904,10912,10919,10927,10934,10942,10949,10957,10964,
+    10972,10979,10987,10994,11002,11009,11017,11025,11032,11040,
+    11047,11055,11063,11071,11079,11087,11095,11103,11111,11120,
+    11129,11136,11144,11152,11159,11167,11174,11182,11189,11197,
+    11204,11211,11219,11226,11234,11241,11249,11257,11265,11272,
+
+    11280,11288,11295,11303,11311,11319,11326,11334,11341,11349,
+    11356,11364,11371,11379,11386,11394,11402,11410,11417,11425,
+    11433,11441,11449,11456,11464,11472,11480,11488,11496,11505,
+    11514,11522,11530,11538,11545,11553,11560,11568,11576,11584,
+    11592,11600,11608,11616,11624,11631,11639,11647,11654,11662,
+    11669,11677,11685,11693,11700,11707,11715,11722,11730,11737,
+    11744,11752,11759,11767,11774,11782,11790,11798,11805,11813,
+    11821,11829,11837,11846,11855,11863,11871,11878,11885,11893,
+    11901,11908,11916,11923,11931,11938,11946,11953,11961,11968,
+    11976,11984,11991,11998,12006,12013,12021,12028,12035,12042,
+
+    12050,12057,12065,12073,12081,12089,12097,12105,12113,12121,
+    12130,12139,12147,12155,12162,12170,12178,12185,12193,12200,
+    12208,12216,12224,12231,12239,12246,12254,12262,12269,12276,
+    12284,12292,12300,12307,12314,12322,12330,12338,12346,12354,
+    12362,12370,12378,12386,12395,12404,12412,12419,12426,12434,
+    12441,12449,12456,12464,12471,12479,12486,12493,12500,12508,
+    12515,12522,12529,12538,12547,12556,12565,12574,12583
     } ;
 
-static yyconst flex_int16_t yy_def[3816] =
+static yyconst flex_int16_t yy_def[3970] =
     {   0,
-     3323, 3323, 3324, 3324, 3324, 3324, 3325, 3325, 3326, 3326,
-     3327, 3327, 3328, 3328, 3328, 3328, 3329, 3329, 3323, 3323,
-     3330, 3330, 3331, 3331, 3331, 3331, 3323, 3323, 3331, 3331,
-     3331, 3331, 3323, 3323, 3331, 3331, 3323, 3323, 3331, 3331,
-     3331, 3331, 3332, 3332, 3333, 3333, 3323, 3323, 3333, 3333,
-     3333, 3333, 3334, 3334, 3328, 3328, 3335, 3335, 3336, 3336,
-     3337, 3337, 3338, 3338, 3339, 3339, 3340, 3340, 3340, 3340,
-     3323, 3323, 3340, 3340, 3340, 3340, 3323, 3323, 3340, 3340,
-     3340, 3340, 3323, 3323, 3340, 3340, 3323, 3323, 3340, 3340,
-     3340, 3340, 3323, 3323, 3340, 3340, 3323, 3323, 3340, 3340,
-
-     3340, 3340, 3341, 3341, 3342, 3342, 3323, 3323, 3342, 3342,
-     3342, 3342, 3343, 3343, 3344, 3344, 3323, 3323, 3344, 3344,
-     3344, 3344, 3345, 3345, 3346, 3346, 3347, 3347, 3348, 3348,
-     3349, 3349, 3350, 3350, 3323, 3323, 3350, 3350, 3350, 3350,
-     3351, 3351, 3352, 3352, 3353, 3353, 3354, 3354, 3322,  149,
-     3355, 3355, 3323, 3323, 3355, 3355, 3355, 3355, 3356, 3356,
-     3357, 3357, 3358, 3358, 3359, 3359, 3360, 3360, 3361, 3361,
-     3362, 3362, 3363, 3363, 3364, 3364, 3365, 3365, 3323, 3323,
-     3365, 3365, 3365, 3365, 3366, 3366, 3367, 3367, 3323, 3323,
-     3367, 3367, 3367, 3367, 3368, 3368, 3369, 3369, 3323, 3323,
-
-     3369, 3369, 3369, 3369, 3370, 3370, 3371, 3371, 3372, 3372,
-     3373, 3373, 3323, 3323, 3373, 3373, 3373, 3373, 3374, 3374,
-     3375, 3375, 3323, 3323, 3375, 3375, 3375, 3375, 3376, 3376,
-     3377, 3377, 3323, 3323, 3377, 3377, 3377, 3377, 3378, 3378,
-     3379, 3379, 3380, 3380, 3381, 3381, 3323, 3323, 3381, 3381,
-     3381, 3381, 3382, 3382, 3383, 3383, 3323, 3323, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3384,
-     3322, 3322, 3384, 3322, 3322, 3322,  296,  296,  298,  296,
-
-      299,  299, 3322, 3322, 3322, 3385, 3322, 3322, 3385, 3322,
-     3322,  300,  299, 3322, 3322, 3322, 3386, 3322, 3322, 3386,
-     3386, 3386, 3322, 3322, 3322, 3322, 3322, 3387, 3322, 3322,
-     3387, 3387, 3387, 3387, 3387, 3322, 3322, 3322, 3322, 3322,
-     3322, 3388, 3322, 3322, 3388, 3388, 3388, 3322, 3322, 3322,
-     3322, 3322, 3322, 3389, 3322, 3322, 3389, 3389, 3322, 3322,
-     3322,  361,  299,  299,  300,  365,  364,  364,  364,  364,
-      365,  371,  369,  369, 3322, 3322, 3322, 3390, 3322, 3322,
-     3390, 3390, 3390, 3390, 3322, 3322,  299,  299, 3322, 3322,
-     3322, 3391, 3322, 3322, 3391, 3391, 3391, 3322, 3322,  299,
-
-      299, 3322, 3322, 3322, 3392, 3322, 3322, 3392, 3392, 3322,
-     3322, 3322, 3322, 3322, 3322, 3393, 3322, 3322, 3393, 3393,
-     3322, 3322, 3322, 3322, 3322, 3322, 3394, 3322, 3322, 3394,
-     3394, 3394, 3394, 3394, 3322, 3322,  299,  299,  299, 3322,
-     3322, 3322, 3395, 3322, 3322, 3395, 3322, 3322, 3322, 3322,
-     3322, 3322, 3396, 3322, 3322, 3396, 3396, 3396, 3322, 3322,
-     3322, 3322, 3322, 3322, 3397, 3322, 3322, 3397, 3397, 3397,
-     3397, 3397, 3397, 3397, 3397, 3322, 3322,  299,  299, 3322,
-     3322, 3322, 3398, 3322, 3322, 3398, 3398, 3398, 3398, 3398,
-     3398, 3322, 3322, 3322, 3322, 3322, 3322, 3399, 3322, 3322,
-
-     3399, 3399, 3399, 3399, 3399, 3399, 3399, 3322, 3322, 3322,
-     3322, 3322, 3322, 3400, 3322, 3322, 3400, 3400, 3322, 3322,
-     3322, 3322, 3322, 3322, 3401, 3322, 3322, 3401, 3401, 3401,
-     3322, 3322, 3322, 3322, 3322, 3322, 3402, 3322, 3322, 3402,
-     3402, 3402, 3402, 3322, 3322,  299,  299, 3322, 3322, 3322,
-     3403, 3322, 3322, 3403, 3403, 3322, 3322,  299,  369,  369,
-     3322, 3322, 3322, 3404, 3322, 3322, 3404, 3404, 3404, 3322,
-     3322,  369,  369, 3322, 3322, 3322, 3405, 3322, 3322, 3405,
-     3405, 3322, 3322, 3322, 3322, 3322, 3322, 3406, 3322, 3322,
-     3406, 3406, 3322, 3322,  369,  369, 3322, 3322, 3322, 3407,
-
-     3322, 3322, 3407, 3407, 3407, 3322, 3322,  369,  369, 3322,
-     3322, 3322, 3408, 3322, 3322, 3408, 3408, 3408, 3408, 3408,
-     3322, 3322,  299,  438,  299, 3322, 3322, 3322, 3409, 3322,
-     3322, 3409, 3322, 3322, 3322, 3322, 3322, 3322, 3410, 3322,
-     3322, 3410, 3322, 3322,  299,  299, 3322, 3322, 3322, 3411,
-     3322, 3322, 3411, 3411, 3322, 3322, 3322, 3322, 3412, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3413, 3413, 3414, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3415, 3415, 3416, 3322, 3417, 3417, 3417, 3417, 3322,
-     3418, 3322, 3322, 3419, 3419, 3419, 3419, 3419, 3419, 3419,
-     3419, 3419, 3420, 3322, 3421, 3421, 3421, 3421, 3422, 3322,
-     3423, 3423, 3423, 3424, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3425, 3425, 3425, 3425, 3425, 3426, 3322,
-     3427, 3427, 3427, 3427, 3428, 3322, 3429, 3429, 3429, 3430,
-     3322, 3431, 3431, 3431, 3432, 3322, 3433, 3433, 3433, 3433,
-     3433, 3433, 3433, 3434, 3322, 3322, 3435, 3435, 3436, 3322,
-     3437, 3437, 3437, 3437, 3438, 3322, 3439, 3439, 3439, 3439,
-
-     3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
-     3439, 3439, 3440, 3322, 3441, 3441, 3441, 3441, 3441, 3441,
-     3441, 3441, 3442, 3322, 3443, 3443, 3443, 3443, 3443, 3443,
-     3443, 3443, 3444, 3322, 3445, 3445, 3445, 3446, 3322, 3447,
-     3447, 3447, 3447, 3448, 3322, 3449, 3449, 3449, 3449, 3449,
-     3449, 3450, 3322, 3451, 3451, 3451, 3451, 3452, 3322, 3322,
-     3453, 3453, 3453, 3453, 3453, 3454, 3322, 3455, 3455, 3455,
-     3456, 3322, 3457, 3457, 3457, 3458, 3322, 3459, 3459, 3459,
-     3459, 3460, 3322, 3461, 3461, 3461, 3461, 3461, 3461, 3462,
-     3322, 3322, 3463, 3463, 3464, 3322, 3465, 3465, 3466, 3322,
-
-     3467, 3467, 3467, 3468, 3469, 3322, 3469, 3322, 3322, 3322,
-     3470, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3471, 3472,
-     3472, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3473, 3474, 3474, 3475, 3322, 3322, 3475, 3322, 3476, 3476,
-     3322, 3477, 3322, 3322, 3477, 3477, 3477, 3477, 3477, 3477,
-     3478, 3478, 3479, 3479, 3479, 3480, 3480, 3322, 3322, 3481,
-     3482, 3482, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3483, 3322, 3322, 3483,
-
-     3483, 3484, 3484, 3485, 3322, 3322, 3485, 3486, 3486, 3487,
-     3487, 3488, 3488, 3489, 3489, 3490, 3490, 3491, 3491, 3491,
-     3322, 3322, 3491, 3491, 3491, 3492, 3492, 3322, 3322, 3493,
-     3494, 3494, 3495, 3322, 3322, 3322, 3322, 3496, 3496, 3497,
-     3497, 3322, 3322, 3497, 3322, 3322, 3497, 3497, 3497, 3497,
-     3497, 3497, 3497, 3497, 3497, 3497, 3498, 3498, 3322, 3322,
-     3322, 3322, 3499, 3499, 3499, 3499, 3499, 3500, 3500, 3501,
-     3501, 3501, 3322, 3322, 3501, 3501, 3501, 3502, 3502, 3503,
-     3322, 3322, 3504, 3504, 3505, 3322, 3322, 3505, 3506, 3506,
-     3507, 3322, 3322, 3507, 3507, 3507, 3508, 3508, 3509, 3509,
-
-     3509, 3510, 3510, 3322, 3511, 3511, 3511, 3511, 3512, 3512,
-     3513, 3322, 3322, 3514, 3514, 3515, 3515, 3516, 3516, 3517,
-     3517, 3517, 3518, 3518, 3519, 3519, 3519, 3519, 3519, 3520,
-     3520, 3322, 3521, 3522, 3522, 3322, 3322, 3523, 3523, 3322,
-     3322, 3524, 3525, 3525, 3526, 3322, 3322, 3526, 3322, 3322,
-     3527, 3322, 3322, 3322, 3322, 3322, 3322, 3528, 3322, 3529,
-     3322, 3529, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3530, 3322, 3531, 3322, 3531, 3532, 3322, 3322,
-
-     3322, 3532, 3322, 3322, 3533, 3322, 3533, 3534, 3322, 3322,
-     3322, 3322, 3322, 3534, 3322, 3322, 3534, 3534, 3534, 3322,
-     3535, 3322, 3535, 3536, 3536, 3536, 3322, 3537, 3322, 3537,
-     3322, 3322, 3322, 3538, 3322, 3539, 3322, 3539, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3540, 3322, 3322, 3322, 3540, 3540, 3322, 3541, 3322,
-     3541, 3542, 3322, 3322, 3322, 3542, 3322, 3543, 3322, 3543,
-     3544, 3544, 3322, 3545, 3322, 3545, 3546, 3546, 3322, 3547,
-     3322, 3547, 3548, 3548, 3548, 3322, 3322, 3322, 3548, 3548,
-     3548, 3322, 3549, 3322, 3549, 3322, 3322, 3550, 3322, 3551,
-
-     3322, 3551, 3552, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3553, 3322, 3553, 3554, 3554, 3554, 3554, 3322, 3322, 3322,
-     3554, 3322, 3322, 3322, 3322, 3322, 3554, 3554, 3554, 3554,
-     3554, 3554, 3554, 3554, 3554, 3322, 3555, 3322, 3555, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3556, 3556, 3556,
-     3556, 3322, 3557, 3322, 3557, 3558, 3558, 3558, 3558, 3322,
-     3322, 3322, 3322, 3322, 3558, 3558, 3322, 3559, 3322, 3559,
-     3560, 3322, 3322, 3322, 3322, 3561, 3322, 3561, 3562, 3322,
-     3322, 3322, 3562, 3322, 3563, 3322, 3563, 3564, 3322, 3322,
-     3322, 3564, 3564, 3564, 3322, 3565, 3322, 3565, 3322, 3322,
-
-     3322, 3322, 3566, 3322, 3567, 3322, 3567, 3322, 3322, 3322,
-     3568, 3568, 3322, 3322, 3568, 3322, 3569, 3322, 3569, 3570,
-     3322, 3322, 3322, 3322, 3571, 3322, 3571, 3322, 3322, 3322,
-     3322, 3322, 3572, 3322, 3572, 3322, 3322, 3573, 3573, 3322,
-     3322, 3322, 3574, 3322, 3574, 3575, 3575, 3575, 3575, 3575,
-     3322, 3576, 3322, 3576, 3322, 3577, 3322, 3578, 3322, 3578,
-     3322, 3322, 3322, 3322, 3579, 3322, 3579, 3322, 3322, 3322,
-     3580, 3322, 3581, 3322, 3581, 3582, 3583, 3322, 3322, 3322,
-     3322, 3322, 3584, 3585, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3586, 3322, 3322, 3587, 3322,
-     3588, 3589, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3589, 3322, 3322, 3589, 3590, 3591, 3322, 3322, 3591, 3592,
-     3593, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3594, 3594, 3322, 3322,
-     3595, 3596, 3596, 3597, 3322, 3322, 3598, 3599, 3322, 3322,
-     3600, 3601, 3602, 3602, 3322, 3322, 3602, 3602, 3602, 3603,
-     3322, 3322, 3322, 3322, 3604, 3322, 3322, 3605, 3606, 3606,
-     3606, 3606, 3322, 3322, 3322, 3322, 3322, 3606, 3606, 3606,
-
-     3606, 3606, 3606, 3606, 3606, 3606, 3607, 3322, 3322, 3322,
-     3608, 3608, 3608, 3608, 3609, 3610, 3610, 3610, 3610, 3322,
-     3322, 3322, 3610, 3610, 3611, 3612, 3613, 3614, 3614, 3615,
-     3616, 3616, 3616, 3616, 3617, 3322, 3322, 3322, 3322, 3322,
-     3322, 3618, 3619, 3322, 3322, 3322, 3322, 3620, 3620, 3322,
-     3322, 3322, 3620, 3621, 3622, 3623, 3322, 3322, 3322, 3322,
-     3322, 3322, 3624, 3322, 3322, 3322, 3625, 3625, 3322, 3322,
-     3322, 3626, 3627, 3322, 3322, 3627, 3627, 3627, 3628, 3322,
-     3629, 3630, 3631, 3632, 3633, 3634, 3635, 3635, 3322, 3635,
-     3322, 3322, 3322, 3636, 3637, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3638, 3322,
-     3322, 3322, 3639, 3322, 3640, 3641, 3322, 3322, 3322, 3641,
-     3322, 3322, 3322, 3641, 3642, 3643, 3322, 3322, 3322, 3322,
-     3322, 3644, 3645, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3646, 3322, 3322, 3322,
-     3322, 3322, 3647, 3648, 3648, 3649, 3322, 3322, 3322, 3650,
-     3651, 3322, 3322, 3322, 3652, 3653, 3654, 3654, 3322, 3322,
-     3322, 3322, 3322, 3654, 3322, 3322, 3654, 3655, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3656, 3657,
-     3322, 3322, 3657, 3657, 3322, 3322, 3322, 3657, 3657, 3322,
-     3322, 3657, 3657, 3657, 3657, 3657, 3657, 3658, 3322, 3322,
-     3659, 3659, 3659, 3660, 3661, 3322, 3322, 3661, 3661, 3322,
-     3322, 3661, 3662, 3663, 3664, 3665, 3665, 3666, 3667, 3667,
-     3667, 3322, 3322, 3667, 3668, 3669, 3670, 3322, 3671, 3671,
-     3671, 3672, 3673, 3674, 3675, 3676, 3676, 3677, 3678, 3322,
-     3322, 3322, 3678, 3678, 3678, 3679, 3322, 3322, 3322, 3680,
-     3681, 3322, 3322, 3682, 3683, 3684, 3684, 3322, 3322, 3685,
-     3686, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3687,
-     3688, 3322, 3689, 3690, 3690, 3690, 3691, 3692, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3693,
-     3694, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3695, 3322, 3322, 3322, 3696, 3697, 3322, 3322, 3698, 3699,
-     3700, 3322, 3322, 3701, 3702, 3702, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3702, 3322, 3322, 3322, 3322, 3703,
-     3704, 3322, 3322, 3322, 3322, 3322, 3704, 3704, 3704, 3322,
-     3322, 3322, 3322, 3322, 3704, 3704, 3704, 3704, 3322, 3322,
-
-     3705, 3322, 3322, 3322, 3322, 3322, 3706, 3322, 3322, 3707,
-     3708, 3322, 3322, 3322, 3322, 3322, 3708, 3322, 3322, 3322,
-     3708, 3322, 3322, 3709, 3710, 3711, 3711, 3712, 3713, 3713,
-     3713, 3322, 3322, 3322, 3713, 3322, 3322, 3714, 3715, 3322,
-     3322, 3322, 3322, 3322, 3716, 3717, 3718, 3719, 3720, 3322,
-     3322, 3322, 3322, 3721, 3722, 3722, 3722, 3722, 3723, 3322,
-     3322, 3322, 3322, 3724, 3725, 3322, 3322, 3322, 3322, 3322,
-     3726, 3727, 3727, 3322, 3322, 3322, 3728, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3729, 3730, 3322, 3322, 3322, 3731, 3322, 3322,
-     3731, 3732, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3733, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3734, 3735, 3322, 3322,
-     3736, 3322, 3322, 3322, 3737, 3738, 3322, 3322, 3322, 3322,
-     3322, 3739, 3740, 3740, 3322, 3322, 3322, 3322, 3322, 3740,
-     3322, 3741, 3742, 3322, 3322, 3322, 3742, 3742, 3742, 3322,
-     3322, 3322, 3322, 3322, 3742, 3742, 3742, 3322, 3322, 3322,
-     3743, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3744,
-     3745, 3322, 3322, 3322, 3745, 3745, 3746, 3747, 3748, 3322,
-
-     3322, 3749, 3750, 3322, 3322, 3750, 3750, 3322, 3322, 3750,
-     3751, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3752, 3753, 3754, 3755, 3756, 3322, 3322, 3322, 3322, 3322,
-     3322, 3757, 3758, 3758, 3758, 3758, 3759, 3322, 3760, 3761,
-     3762, 3763, 3763, 3322, 3322, 3322, 3322, 3764, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3765,
-     3766, 3322, 3767, 3322, 3322, 3322, 3767, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3768, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3769, 3770, 3322, 3322,
-     3322, 3771, 3772, 3773, 3774, 3775, 3775, 3322, 3322, 3322,
-     3322, 3775, 3322, 3776, 3777, 3777, 3777, 3777, 3322, 3322,
-     3322, 3777, 3777, 3777, 3778, 3322, 3322, 3322, 3779, 3780,
-     3780, 3780, 3781, 3322, 3322, 3782, 3322, 3322, 3322, 3783,
-     3784, 3322, 3322, 3322, 3784, 3784, 3322, 3322, 3322, 3322,
-     3784, 3785, 3322, 3786, 3787, 3788, 3789, 3790, 3791, 3322,
-     3322, 3792, 3792, 3792, 3793, 3322, 3794, 3322, 3322, 3795,
-     3796, 3796, 3322, 3797, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3798, 3322, 3322,
-
-     3799, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3800, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3801, 3802, 3803,
-     3322, 3322, 3322, 3322, 3804, 3805, 3805, 3322, 3322, 3322,
-     3322, 3805, 3322, 3806, 3807, 3807, 3807, 3807, 3807, 3322,
-     3322, 3807, 3807, 3322, 3322, 3322, 3322, 3808, 3808, 3808,
-     3809, 3322, 3322, 3783, 3322, 3322, 3784, 3784, 3784, 3322,
-     3322, 3322, 3322, 3784, 3785, 3322, 3786, 3322, 3322, 3322,
-     3322, 3789, 3790, 3791, 3322, 3322, 3322, 3322, 3322, 3792,
-     3792, 3322, 3322, 3322, 3794, 3795, 3796, 3796, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3798, 3322, 3322, 3322,
-     3799, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3800, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3801, 3802,
-     3803, 3322, 3322, 3322, 3322, 3322, 3805, 3805, 3322, 3322,
-     3322, 3322, 3806, 3807, 3807, 3807, 3807, 3807, 3322, 3322,
-     3322, 3807, 3322, 3322, 3808, 3808, 3322, 3322, 3809, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3784, 3784, 3784,
-     3322, 3322, 3322, 3322, 3785, 3786, 3322, 3322, 3322, 3322,
-     3322, 3790, 3791, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3795, 3796, 3796, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3799, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3800,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3801, 3802, 3803, 3805, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3807, 3807, 3807, 3322,
-     3322, 3807, 3807, 3322, 3322, 3322, 3808, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3784, 3784, 3784, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3790, 3791, 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3796,
-
-     3796, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3799, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3800, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3802, 3322, 3322, 3322, 3322, 3805,
-     3322, 3322, 3322, 3807, 3807, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3807, 3808, 3322, 3322, 3322, 3322, 3322, 3322,
-     3784, 3322, 3322, 3784, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3790, 3791, 3322, 3322,
-     3322, 3322, 3795, 3796, 3796, 3796, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3800, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3802, 3322, 3322, 3322,
-     3322, 3322, 3322, 3805, 3807, 3807, 3322, 3322, 3322, 3322,
-     3322, 3322, 3807, 3808, 3784, 3322, 3322, 3322, 3784, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3791, 3322, 3322, 3322, 3322,
-     3795, 3796, 3796, 3796, 3810, 3811, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3800, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3805, 3807,
-     3807, 3322, 3322, 3808, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3791, 3322, 3322, 3322, 3322, 3795, 3796, 3812, 3813, 3810,
-     3811, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3805, 3807, 3807, 3322, 3322, 3322, 3808,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3795, 3812, 3796, 3814, 3813, 3815,
-     3796, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3805, 3807, 3807, 3322, 3322,
-     3322, 3322, 3808, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3795, 3814, 3322, 3815, 3796, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3795, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3795, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3795, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3795, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3795, 3795, 3322, 3322,
-     3322, 3322, 3322, 3322, 3795, 3795, 3795, 3795, 3795, 3795,
-     3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
-     3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
-     3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
-     3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
-     3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
-     3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
-
-     3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
-     3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
-     3322,    0, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322
+     3458, 3458, 3459, 3459, 3459, 3459, 3460, 3460, 3461, 3461,
+     3462, 3462, 3463, 3463, 3463, 3463, 3464, 3464, 3458, 3458,
+     3465, 3465, 3466, 3466, 3466, 3466, 3458, 3458, 3466, 3466,
+     3466, 3466, 3458, 3458, 3466, 3466, 3458, 3458, 3466, 3466,
+     3466, 3466, 3467, 3467, 3468, 3468, 3458, 3458, 3468, 3468,
+     3468, 3468, 3469, 3469, 3463, 3463, 3470, 3470, 3471, 3471,
+     3472, 3472, 3473, 3473, 3474, 3474, 3475, 3475, 3475, 3475,
+     3458, 3458, 3475, 3475, 3475, 3475, 3458, 3458, 3475, 3475,
+     3475, 3475, 3458, 3458, 3475, 3475, 3458, 3458, 3475, 3475,
+     3475, 3475, 3458, 3458, 3475, 3475, 3458, 3458, 3475, 3475,
+
+     3475, 3475, 3476, 3476, 3477, 3477, 3458, 3458, 3477, 3477,
+     3477, 3477, 3478, 3478, 3479, 3479, 3458, 3458, 3479, 3479,
+     3479, 3479, 3480, 3480, 3481, 3481, 3482, 3482, 3483, 3483,
+     3484, 3484, 3485, 3485, 3458, 3458, 3485, 3485, 3485, 3485,
+     3486, 3486, 3487, 3487, 3488, 3488, 3489, 3489, 3457,  149,
+     3490, 3490, 3458, 3458, 3490, 3490, 3490, 3490, 3491, 3491,
+     3492, 3492, 3493, 3493, 3494, 3494, 3495, 3495, 3496, 3496,
+     3497, 3497, 3498, 3498, 3499, 3499, 3500, 3500, 3458, 3458,
+     3500, 3500, 3500, 3500, 3501, 3501, 3502, 3502, 3458, 3458,
+     3502, 3502, 3502, 3502, 3503, 3503, 3504, 3504, 3458, 3458,
+
+     3504, 3504, 3504, 3504, 3505, 3505, 3506, 3506, 3507, 3507,
+     3508, 3508, 3458, 3458, 3508, 3508, 3508, 3508, 3509, 3509,
+     3510, 3510, 3458, 3458, 3510, 3510, 3510, 3510, 3511, 3511,
+     3512, 3512, 3458, 3458, 3512, 3512, 3512, 3512, 3513, 3513,
+     3514, 3514, 3515, 3515, 3516, 3516, 3458, 3458, 3516, 3516,
+     3516, 3516, 3517, 3517, 3518, 3518, 3519, 3519, 3520, 3520,
+     3458, 3458, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3521, 3457, 3457, 3521, 3457, 3457, 3457,
+
+      300,  300,  302,  300,  303,  303, 3457, 3457, 3457, 3522,
+     3457, 3457, 3522, 3457, 3457,  304,  303, 3457, 3457, 3457,
+     3523, 3457, 3457, 3523, 3523, 3523, 3457, 3457, 3457, 3457,
+     3457, 3524, 3457, 3457, 3524, 3524, 3524, 3524, 3524, 3457,
+     3457, 3457, 3457, 3457, 3457, 3525, 3457, 3457, 3525, 3525,
+     3525, 3457, 3457, 3457, 3457, 3457, 3457, 3526, 3457, 3457,
+     3526, 3526, 3457, 3457, 3457,  365,  303,  303,  304,  369,
+      368,  368,  368,  368,  369,  375,  373,  373, 3457, 3457,
+     3457, 3527, 3457, 3457, 3527, 3527, 3527, 3527, 3457, 3457,
+      303,  303,  303, 3457, 3457, 3457, 3528, 3457, 3457, 3528,
+
+     3528, 3528, 3457, 3457,  303,  303, 3457, 3457, 3457, 3529,
+     3457, 3457, 3529, 3529, 3457, 3457, 3457, 3457, 3457, 3457,
+     3530, 3457, 3457, 3530, 3530, 3457, 3457, 3457, 3457, 3457,
+     3457, 3531, 3457, 3457, 3531, 3531, 3531, 3531, 3531, 3457,
+     3457,  392,  392,  303, 3457, 3457, 3457, 3532, 3457, 3457,
+     3532, 3457, 3457, 3457, 3457, 3457, 3457, 3533, 3457, 3457,
+     3533, 3533, 3533, 3457, 3457, 3457, 3457, 3457, 3457, 3534,
+     3457, 3457, 3534, 3534, 3534, 3534, 3534, 3534, 3534, 3534,
+     3534, 3457, 3457,  303,  303, 3457, 3457, 3457, 3535, 3457,
+     3457, 3535, 3535, 3535, 3535, 3535, 3535, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3536, 3457, 3457, 3536, 3536, 3536, 3536,
+     3536, 3536, 3536, 3457, 3457, 3457, 3457, 3457, 3457, 3537,
+     3457, 3457, 3537, 3537, 3457, 3457, 3457, 3457, 3457, 3457,
+     3538, 3457, 3457, 3538, 3538, 3538, 3457, 3457, 3457, 3457,
+     3457, 3457, 3539, 3457, 3457, 3539, 3539, 3539, 3539, 3457,
+     3457,  303,  303, 3457, 3457, 3457, 3540, 3457, 3457, 3540,
+     3540, 3457, 3457,  303,  373,  373, 3457, 3457, 3457, 3541,
+     3457, 3457, 3541, 3541, 3541, 3457, 3457,  373,  373, 3457,
+     3457, 3457, 3542, 3457, 3457, 3542, 3542, 3457, 3457, 3457,
+     3457, 3457, 3457, 3543, 3457, 3457, 3543, 3543, 3457, 3457,
+
+      373,  373, 3457, 3457, 3457, 3544, 3457, 3457, 3544, 3544,
+     3544, 3457, 3457,  373,  373, 3457, 3457, 3457, 3545, 3457,
+     3457, 3545, 3545, 3545, 3545, 3545, 3457, 3457,  303,  392,
+      303, 3457, 3457, 3457, 3546, 3457, 3457, 3546, 3457, 3457,
+     3457, 3457, 3457, 3457, 3547, 3457, 3457, 3547, 3457, 3457,
+      303,  303, 3457, 3457, 3457, 3548, 3457, 3457, 3548, 3548,
+     3457, 3457, 3457, 3457, 3457, 3457, 3549, 3457, 3457, 3549,
+     3549, 3457, 3457, 3457, 3457, 3550, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3551, 3551, 3552, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3553, 3553,
+     3554, 3457, 3555, 3555, 3555, 3555, 3457, 3556, 3457, 3457,
+     3557, 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3558,
+     3457, 3559, 3559, 3559, 3559, 3560, 3457, 3561, 3561, 3561,
+     3562, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3563, 3563, 3563, 3563, 3563, 3564, 3457, 3457, 3565, 3565,
+     3565, 3565, 3566, 3457, 3567, 3567, 3567, 3568, 3457, 3569,
+     3569, 3569, 3570, 3457, 3571, 3571, 3571, 3571, 3571, 3571,
+
+     3571, 3572, 3457, 3457, 3573, 3573, 3574, 3457, 3575, 3575,
+     3575, 3575, 3576, 3457, 3577, 3577, 3577, 3577, 3577, 3577,
+     3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577,
+     3577, 3578, 3457, 3579, 3579, 3579, 3579, 3579, 3579, 3579,
+     3579, 3580, 3457, 3581, 3581, 3581, 3581, 3581, 3581, 3581,
+     3581, 3582, 3457, 3583, 3583, 3583, 3584, 3457, 3585, 3585,
+     3585, 3585, 3586, 3457, 3587, 3587, 3587, 3587, 3587, 3587,
+     3588, 3457, 3589, 3589, 3589, 3589, 3590, 3457, 3457, 3591,
+     3591, 3591, 3591, 3591, 3592, 3457, 3593, 3593, 3593, 3594,
+     3457, 3595, 3595, 3595, 3596, 3457, 3597, 3597, 3597, 3597,
+
+     3598, 3457, 3599, 3599, 3599, 3599, 3599, 3599, 3600, 3457,
+     3457, 3601, 3601, 3602, 3457, 3603, 3603, 3604, 3457, 3605,
+     3605, 3605, 3606, 3457, 3607, 3607, 3607, 3608, 3609, 3457,
+     3609, 3457, 3457, 3457, 3610, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3611, 3612, 3612, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3613, 3614, 3614, 3615, 3457, 3457,
+     3615, 3457, 3616, 3616, 3457, 3617, 3457, 3457, 3617, 3617,
+     3617, 3617, 3617, 3617, 3618, 3618, 3619, 3619, 3619, 3620,
+
+     3620, 3457, 3457, 3621, 3622, 3622, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3623, 3457, 3457, 3623, 3623, 3624, 3624, 3457, 3625, 3457,
+     3457, 3625, 3626, 3626, 3627, 3627, 3628, 3628, 3629, 3629,
+     3630, 3630, 3631, 3631, 3631, 3457, 3457, 3631, 3631, 3631,
+     3632, 3632, 3457, 3457, 3633, 3634, 3634, 3635, 3457, 3457,
+     3457, 3457, 3636, 3636, 3637, 3637, 3457, 3457, 3637, 3457,
+     3457, 3637, 3637, 3637, 3637, 3637, 3637, 3637, 3637, 3637,
+     3637, 3637, 3638, 3638, 3457, 3457, 3457, 3457, 3639, 3639,
+     3639, 3639, 3639, 3640, 3640, 3641, 3641, 3641, 3457, 3457,
+
+     3641, 3641, 3641, 3642, 3642, 3643, 3457, 3457, 3644, 3644,
+     3645, 3457, 3457, 3645, 3646, 3646, 3647, 3457, 3457, 3647,
+     3647, 3647, 3648, 3648, 3649, 3649, 3649, 3650, 3650, 3457,
+     3651, 3651, 3651, 3651, 3652, 3652, 3653, 3457, 3457, 3654,
+     3654, 3655, 3655, 3656, 3656, 3657, 3657, 3657, 3658, 3658,
+     3659, 3659, 3659, 3659, 3659, 3660, 3660, 3457, 3661, 3662,
+     3662, 3457, 3457, 3663, 3663, 3457, 3457, 3664, 3665, 3665,
+     3457, 3457, 3666, 3667, 3667, 3668, 3457, 3457, 3668, 3457,
+     3457, 3669, 3457, 3457, 3457, 3457, 3457, 3457, 3670, 3457,
+     3671, 3457, 3671, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3672, 3457, 3673, 3457, 3673, 3674,
+     3457, 3457, 3457, 3674, 3457, 3457, 3675, 3457, 3675, 3676,
+     3457, 3457, 3457, 3457, 3457, 3676, 3457, 3457, 3676, 3676,
+     3676, 3457, 3677, 3457, 3677, 3678, 3678, 3678, 3457, 3679,
+     3457, 3679, 3457, 3457, 3457, 3680, 3457, 3681, 3457, 3681,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3682, 3457, 3457, 3457, 3682, 3682, 3457,
+     3683, 3457, 3683, 3457, 3684, 3457, 3457, 3457, 3684, 3457,
+
+     3685, 3457, 3685, 3686, 3686, 3457, 3687, 3457, 3687, 3688,
+     3688, 3457, 3689, 3457, 3689, 3690, 3690, 3690, 3457, 3457,
+     3457, 3690, 3690, 3690, 3457, 3691, 3457, 3691, 3457, 3457,
+     3692, 3457, 3693, 3457, 3693, 3694, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3695, 3457, 3695, 3696, 3696, 3696, 3696,
+     3457, 3457, 3457, 3696, 3457, 3457, 3457, 3457, 3457, 3696,
+     3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3457,
+     3697, 3457, 3697, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3698, 3698, 3698, 3698, 3457, 3699, 3457, 3699, 3700,
+     3700, 3700, 3700, 3457, 3457, 3457, 3457, 3457, 3700, 3700,
+
+     3457, 3701, 3457, 3701, 3702, 3457, 3457, 3457, 3457, 3703,
+     3457, 3703, 3704, 3457, 3457, 3457, 3704, 3457, 3705, 3457,
+     3705, 3706, 3457, 3457, 3457, 3706, 3706, 3706, 3457, 3707,
+     3457, 3707, 3457, 3457, 3457, 3457, 3708, 3457, 3709, 3457,
+     3709, 3457, 3457, 3457, 3710, 3710, 3457, 3457, 3710, 3457,
+     3711, 3457, 3711, 3712, 3457, 3457, 3457, 3457, 3713, 3457,
+     3713, 3457, 3457, 3457, 3457, 3457, 3714, 3457, 3714, 3457,
+     3457, 3715, 3715, 3457, 3457, 3457, 3716, 3457, 3716, 3717,
+     3717, 3717, 3717, 3717, 3457, 3718, 3457, 3718, 3457, 3719,
+     3457, 3720, 3457, 3720, 3457, 3457, 3457, 3457, 3721, 3457,
+
+     3721, 3457, 3457, 3457, 3722, 3457, 3723, 3457, 3723, 3457,
+     3457, 3457, 3724, 3457, 3725, 3457, 3725, 3726, 3727, 3457,
+     3457, 3457, 3457, 3457, 3728, 3729, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3730, 3457,
+     3457, 3731, 3457, 3732, 3733, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3733, 3457, 3457, 3733, 3734, 3735, 3457,
+     3457, 3735, 3736, 3737, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3738,
+
+     3738, 3457, 3457, 3739, 3457, 3740, 3740, 3741, 3457, 3457,
+     3742, 3743, 3457, 3457, 3744, 3745, 3746, 3746, 3457, 3457,
+     3746, 3746, 3746, 3747, 3457, 3457, 3457, 3457, 3748, 3457,
+     3457, 3749, 3750, 3750, 3750, 3750, 3457, 3457, 3457, 3457,
+     3457, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750,
+     3750, 3750, 3751, 3457, 3457, 3457, 3752, 3752, 3752, 3752,
+     3753, 3754, 3754, 3754, 3754, 3457, 3457, 3457, 3754, 3754,
+     3755, 3756, 3757, 3758, 3758, 3759, 3760, 3760, 3760, 3760,
+     3761, 3457, 3457, 3457, 3457, 3457, 3457, 3762, 3763, 3457,
+     3457, 3457, 3457, 3764, 3764, 3457, 3457, 3457, 3764, 3765,
+
+     3766, 3767, 3457, 3457, 3457, 3457, 3457, 3457, 3768, 3457,
+     3457, 3457, 3769, 3769, 3457, 3457, 3457, 3770, 3771, 3457,
+     3457, 3771, 3771, 3771, 3772, 3457, 3773, 3774, 3775, 3776,
+     3777, 3778, 3779, 3780, 3781, 3781, 3457, 3781, 3457, 3457,
+     3457, 3782, 3783, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3784, 3457, 3457,
+     3457, 3785, 3457, 3786, 3787, 3457, 3457, 3457, 3787, 3457,
+     3457, 3457, 3787, 3788, 3789, 3457, 3457, 3457, 3457, 3457,
+
+     3790, 3791, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3792, 3457, 3457, 3457, 3457,
+     3457, 3793, 3457, 3794, 3794, 3795, 3457, 3457, 3457, 3796,
+     3797, 3457, 3457, 3457, 3798, 3799, 3800, 3800, 3457, 3457,
+     3457, 3457, 3457, 3800, 3457, 3457, 3800, 3801, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3802, 3803,
+     3457, 3457, 3803, 3803, 3457, 3457, 3457, 3803, 3803, 3457,
+     3457, 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3804,
+     3457, 3457, 3805, 3805, 3805, 3806, 3807, 3457, 3457, 3807,
+     3807, 3457, 3457, 3807, 3808, 3809, 3810, 3811, 3811, 3812,
+
+     3813, 3813, 3813, 3457, 3457, 3813, 3814, 3815, 3816, 3457,
+     3817, 3817, 3817, 3818, 3819, 3820, 3821, 3822, 3822, 3823,
+     3824, 3457, 3457, 3457, 3824, 3824, 3824, 3825, 3457, 3457,
+     3457, 3826, 3827, 3457, 3457, 3828, 3457, 3457, 3829, 3830,
+     3831, 3831, 3457, 3457, 3832, 3833, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3834, 3835, 3457, 3836, 3837,
+     3837, 3837, 3838, 3839, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3840, 3841, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3842, 3457, 3457, 3457,
+     3843, 3457, 3844, 3457, 3457, 3845, 3846, 3847, 3457, 3457,
+     3848, 3849, 3849, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3849, 3457, 3457, 3457, 3457, 3850, 3851, 3457, 3457,
+     3457, 3457, 3457, 3851, 3851, 3851, 3457, 3457, 3457, 3457,
+     3457, 3851, 3851, 3851, 3851, 3457, 3457, 3851, 3851, 3852,
+     3457, 3457, 3457, 3457, 3457, 3853, 3457, 3457, 3854, 3855,
+     3457, 3457, 3457, 3457, 3457, 3855, 3457, 3457, 3457, 3855,
+     3457, 3457, 3856, 3857, 3858, 3858, 3859, 3860, 3860, 3860,
+     3457, 3457, 3457, 3860, 3457, 3457, 3861, 3862, 3457, 3457,
+
+     3457, 3457, 3457, 3863, 3864, 3865, 3866, 3867, 3457, 3457,
+     3457, 3457, 3868, 3869, 3869, 3869, 3869, 3870, 3457, 3457,
+     3457, 3457, 3871, 3872, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3873, 3874, 3875, 3875, 3457, 3457, 3457, 3876,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3877, 3878, 3457, 3457,
+     3457, 3879, 3457, 3457, 3879, 3880, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3881, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3882, 3883, 3457, 3457, 3457, 3884, 3457, 3457, 3457, 3885,
+     3886, 3457, 3457, 3457, 3457, 3457, 3887, 3888, 3888, 3457,
+     3457, 3457, 3457, 3457, 3888, 3457, 3889, 3890, 3457, 3457,
+     3457, 3890, 3890, 3890, 3457, 3457, 3457, 3457, 3457, 3890,
+     3890, 3890, 3457, 3457, 3457, 3890, 3890, 3891, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3892, 3893, 3457, 3457,
+     3457, 3893, 3893, 3894, 3895, 3896, 3457, 3457, 3897, 3898,
+     3457, 3457, 3898, 3898, 3457, 3457, 3898, 3899, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3900, 3901, 3902,
+     3903, 3904, 3457, 3457, 3457, 3457, 3457, 3457, 3905, 3906,
+
+     3906, 3906, 3906, 3907, 3457, 3908, 3909, 3910, 3911, 3912,
+     3912, 3457, 3457, 3457, 3457, 3913, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3914, 3915,
+     3457, 3916, 3457, 3457, 3457, 3916, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3917, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3918, 3919, 3457, 3457, 3457,
+     3457, 3920, 3921, 3922, 3923, 3924, 3924, 3457, 3457, 3457,
+     3457, 3924, 3457, 3925, 3926, 3926, 3926, 3926, 3457, 3457,
+
+     3457, 3926, 3926, 3926, 3926, 3457, 3457, 3927, 3457, 3457,
+     3457, 3928, 3929, 3929, 3929, 3930, 3457, 3457, 3931, 3457,
+     3457, 3457, 3932, 3933, 3457, 3457, 3457, 3933, 3933, 3457,
+     3457, 3457, 3457, 3933, 3934, 3457, 3935, 3936, 3937, 3938,
+     3939, 3940, 3457, 3457, 3941, 3941, 3941, 3942, 3457, 3943,
+     3457, 3457, 3944, 3945, 3946, 3946, 3457, 3947, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3948, 3457, 3457, 3949, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3950, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3951, 3952, 3457, 3953, 3457, 3457, 3457, 3457,
+     3954, 3955, 3955, 3457, 3457, 3457, 3457, 3955, 3457, 3956,
+     3957, 3957, 3957, 3957, 3957, 3457, 3457, 3957, 3957, 3957,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3958, 3958, 3958,
+     3959, 3457, 3457, 3960, 3457, 3457, 3961, 3961, 3961, 3457,
+     3457, 3457, 3457, 3961, 3962, 3457, 3963, 3457, 3457, 3457,
+     3457, 3938, 3939, 3940, 3457, 3457, 3457, 3457, 3457, 3941,
+     3941, 3457, 3457, 3457, 3943, 3944, 3945, 3946, 3946, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3948, 3457,
+     3457, 3457, 3949, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3950, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3951, 3952, 3457, 3953, 3457, 3457, 3457, 3457, 3457, 3955,
+     3955, 3457, 3457, 3457, 3457, 3956, 3957, 3957, 3957, 3957,
+     3957, 3457, 3457, 3457, 3957, 3457, 3457, 3957, 3457, 3457,
+     3457, 3457, 3958, 3958, 3457, 3457, 3959, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3961, 3961, 3961, 3457, 3457,
+     3457, 3457, 3962, 3963, 3457, 3457, 3457, 3457, 3457, 3939,
+     3940, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3944, 3945, 3946, 3946, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3949, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3950,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3951, 3952, 3457, 3953, 3955,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3957, 3957, 3957,
+     3457, 3457, 3957, 3957, 3457, 3457, 3457, 3957, 3457, 3457,
+     3457, 3457, 3958, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3961, 3961, 3961, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3939, 3940, 3457, 3457,
+     3457, 3457, 3457, 3457, 3944, 3945, 3946, 3946, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3949, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3950, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3952, 3457, 3457, 3457, 3457, 3955, 3457, 3457, 3457,
+     3957, 3957, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3957,
+     3957, 3457, 3457, 3457, 3457, 3958, 3457, 3457, 3457, 3457,
+     3457, 3457, 3961, 3457, 3457, 3961, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3939, 3940,
+     3457, 3457, 3457, 3457, 3457, 3457, 3945, 3946, 3946, 3946,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3950, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3952, 3457, 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957,
+     3457, 3457, 3457, 3457, 3457, 3457, 3957, 3957, 3457, 3457,
+     3457, 3457, 3958, 3961, 3457, 3457, 3457, 3961, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3940, 3457, 3457, 3457, 3457, 3945,
+     3946, 3946, 3946, 3964, 3965, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3950, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957,
+     3457, 3457, 3957, 3457, 3457, 3457, 3457, 3958, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3940, 3457, 3457, 3457, 3457, 3945,
+     3946, 3966, 3967, 3964, 3965, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3958, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3945, 3966, 3946, 3968, 3967, 3969, 3946, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3958, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3945, 3968, 3457, 3969,
+     3946, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3945, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3945,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3945, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3945, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3945,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3945, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3945, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3945, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3945, 3945, 3457, 3457, 3457, 3457, 3457, 3457, 3945,
+     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+
+     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+     3945, 3945, 3945, 3945, 3945, 3457,    0, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457
     } ;
 
-static yyconst flex_int16_t yy_nxt[12367] =
+static yyconst flex_int16_t yy_nxt[12668] =
     {   0,
-     3322,  262,  263,  262,  262,  263,  262,  262,  263,  262,
-      262,  263,  262,  267,  263,  267,  273,  264,  270,  273,
-      264,  270, 3322,  265, 3322,  271,  265, 3322,  271,  268,
-      267,  263,  267,  659,  274,  276,  277,  274,  276,  277,
-      278,  279,  704,  278,  279,  659,  268,  283,  284,  660,
-      280,  276,  277,  280,  281,  662,  278,  276,  277,  693,
-      281,  661,  278,  283,  284, 1725,  280,  263,  263,  263,
-      850,  661,  280,  263,  263,  263,  295,  263,  295,  295,
-      263,  295,  851,  286,  295,  263,  295,  680, 1733,  286,
-      734,  285,  296, 1357,  696,  296,  658,  658,  658, 1358,
-
-      297,  658,  658,  658,  658,  658,  658,  285,  287,  288,
-      263,  288,  287,  287,  287,  287,  287,  287,  287,  289,
-      287,  287,  287,  691,  287,  291,  287,  292,  287,  295,
-      263,  295,  263,  263,  263,  263,  263,  263,  692,  295,
-      263,  295,  295,  263,  295,  297,  697,  806,  298,  662,
-      807,  298,  924,  287,  287,  296,  662,  662,  296,  295,
-      263,  295,  658,  658,  658,  661,  658,  658,  658,  658,
-      658,  658,  661,  661, 3322,  299,  925,  293,  287,  288,
-      263,  288,  287,  287,  287,  287,  287,  287,  287,  289,
-      287,  287,  287, 1734,  287,  291,  287,  292,  287,  295,
-
-      263,  295,  263,  263,  263,  263,  263,  263,  667,  295,
-      263,  295,  295,  263,  295,  299,  673,  734,  300,  819,
-      984,  300,  820,  287,  287,  297,  743,  735,  297,  263,
-      263,  263,  263,  263,  263,  295,  263,  295,  295,  263,
-      295,  295,  263,  295,  985,  301,  856,  293,  301,  662,
-      668,  299,  799,  857,  299,  747,  669,  302,  295,  263,
-      295,  670,  658,  658,  658,  661,  671,  658,  658,  658,
-      658,  658,  658,  800,  302,  303,  304,  263,  304,  303,
-      303,  303,  303,  303,  303,  303,  305,  303,  303,  303,
-      721,  303,  307,  303,  308,  303,  311,  263,  311,  311,
-
-      263,  311,  263,  263,  263,  722,  263,  263,  263,  311,
-      263,  311,  312,  781,  858,  312, 1736,  782,  300,  717,
-      303,  303,  300,  718,  759,  312,  677,  719,  309,  303,
-      304,  263,  304,  303,  303,  303,  303,  303,  303,  303,
-      305,  303,  303,  303,  662,  303,  307,  303,  308,  303,
-      311,  263,  311,  311,  263,  311,  311,  263,  311,  808,
-      661,  866,  276,  277,  864,  698,  312,  278, 3322,  313,
-      697,  865,  313,  809,  303,  303,  743,  323,  699,  759,
-      692, 1740,  309,  314,  315,  263,  315,  314,  314,  314,
-      314,  314,  314,  314,  316,  314,  314,  314, 1744,  314,
-
-      318,  314,  319,  314, 1746,  662,  324,  691,  337,  263,
-      337,  337,  263,  337,  349,  263,  349,  697,  276,  277,
-      700,  661,  692,  278,  338,  710,  803,  338,  314,  314,
-      350,  696,  711,  323,  804,  912,  320,  765,  913,  321,
-      805,  661,  658,  658,  658, 1753,  322,  314,  315,  263,
-      315,  314,  314,  314,  314,  314,  314,  314,  316,  314,
-      314,  314,  324,  314,  318,  314,  319,  314,  349,  263,
-      349,  360,  263,  360,  360,  263,  360, 1754,  360,  263,
-      360,  360,  263,  360,  350,  662,  748,  361,  662,  743,
-      361,  859,  314,  314,  362,  723, 1500,  362, 1755,  697,
-
-      320,  661,  749,  321,  661,  658,  658,  658,  765, 1501,
-      322,  325,  326,  263,  326,  325,  325,  325,  325,  325,
-      325,  325,  327,  325,  325,  325, 1756,  325,  329,  325,
-      330,  325,  263,  263,  263,  263,  263,  263,  360,  263,
-      360,  784,  360,  263,  360,  360,  263,  360,  363, 1761,
-      662,  363,  662,  662,  361, 1762,  325,  325,  361,  729,
-      696,  364,  658,  658,  658,  331,  661,  332,  661,  661,
-      784,  333,  658,  658,  658,  813,  334,  335,  325,  326,
-      263,  326,  325,  325,  325,  325,  325,  325,  325,  327,
-      325,  325,  325,  696,  325,  329,  325,  330,  325,  360,
-
-      263,  360,  263,  263,  263,  263,  263,  263,  891,  360,
-      263,  360,  360,  263,  360,  364,  746, 1763,  365,  785,
-      686,  365,  743,  325,  325,  366,  739,  743,  366,  658,
-      658,  658,  331,  742,  332,  658,  658,  658,  333,  658,
-      658,  658, 1764,  334,  335,  339,  340,  263,  340,  339,
-      339,  339,  339,  339,  339,  339,  341,  339,  339,  339,
-      693,  339,  343,  339,  344,  339,  360,  263,  360,  360,
-      263,  360,  263,  263,  263,  906,  263,  263,  263,  360,
-      263,  360,  367, 1765, 1766,  367,  906,  876,  368,  750,
-      339,  339,  368,  737,  738,  364,  882,  345,  658,  658,
-
-      658,  907,  696,  346,  751,  658,  658,  658,  658,  658,
-      658,  958,  347,  339,  340,  263,  340,  339,  339,  339,
-      339,  339,  339,  339,  341,  339,  339,  339, 1767,  339,
-      343,  339,  344,  339,  360,  263,  360,  263,  263,  263,
-      263,  263,  263,  697,  360,  263,  360,  360,  263,  360,
-      364,  662,  697,  369, 1774,  924,  369,  662,  339,  339,
-      367,  662,  662,  367,  770,  345, 1775,  661,  658,  658,
-      658,  346,  984,  661,  658,  658,  658,  661,  661,  993,
-      347,  351,  352,  263,  352,  351,  351,  351,  351,  351,
-      351,  351,  353,  351,  351,  351,  925,  351,  355,  351,
-
-      356,  351,  360,  263,  360,  360,  263,  360,  263,  263,
-      263, 1780,  263,  263,  263,  360,  263,  360,  370,  662,
-     1019,  370,  662, 1020,  371,  813,  351,  351,  371,  775,
-     1785,  372,  658,  658,  658,  661, 3322,  357,  661,  658,
-      658,  658,  658,  658,  658, 1787,  358,  351,  352,  263,
-      352,  351,  351,  351,  351,  351,  351,  351,  353,  351,
-      351,  351,  984,  351,  355,  351,  356,  351,  360,  263,
-      360,  263,  263,  263,  263,  263,  263,  696,  360,  263,
-      360,  360,  263,  360,  372,  785,  993,  373,  743,  924,
-      373, 1788,  351,  351,  370,  662, 1794,  370,  360,  263,
-
-      360, 1799,  789,  357,  360,  263,  360,  658,  658,  658,
-      852,  661,  358,  994,  374,  658,  658,  658,  734, 1800,
-      374,  375,  376,  263,  376,  375,  375,  375,  375,  375,
-      375,  375,  377,  375,  375,  375,  984,  375,  379,  375,
-      380,  375,  386,  263,  386,  386,  263,  386,  263,  263,
-      263,  933,  263,  263,  263,  934,  752,  662,  387, 1028,
-      994,  387,  743, 1029,  363, 3322,  375,  375,  363,  662,
-      662,  381,  741,  661,  852,  693,  795,  382,  658,  658,
-      658,  383,  658,  658,  658,  661,  661,  384,  375,  376,
-      263,  376,  375,  375,  375,  375,  375,  375,  375,  377,
-
-      375,  375,  375,  680,  375,  379,  375,  380,  375,  386,
-      263,  386,  386,  263,  386,  386,  263,  386,  890,  386,
-      263,  386,  658,  658,  658,  387,  696,  810,  387, 1810,
-     1813,  388, 1814,  375,  375,  388,  662,  662,  381,  811,
-      812,  658,  658,  658,  382,  658,  658,  658,  383,  658,
-      658,  658,  661,  661,  384,  389,  390,  263,  390,  389,
-      389,  389,  389,  389,  389,  389,  391,  389,  389,  389,
-      696,  389,  393,  389,  394,  389,  399,  263,  399,  399,
-      263,  399,  263,  263,  263,  926,  263,  263,  263, 1146,
-      662, 1818,  400, 1476, 1819,  400,  927,  823,  363,  928,
-
-      389,  389,  363,  662,  662,  395,  661,  658,  658,  658,
-      833,  396,  658,  658,  658,  658,  658,  658, 1146,  661,
-      661, 1822,  397,  389,  390,  263,  390,  389,  389,  389,
-      389,  389,  389,  389,  391,  389,  389,  389, 1686,  389,
-      393,  389,  394,  389,  399,  263,  399,  399,  263,  399,
-      399,  263,  399,  938,  399,  263,  399,  658,  658,  658,
-      400,  662,  662,  400,  662, 1823,  401,  939,  389,  389,
-      401,  838, 1824,  395,  658,  658,  658,  661,  661,  396,
-      661,  658,  658,  658,  658,  658,  658,  658,  658,  658,
-      397,  402,  403,  263,  403,  402,  402,  402,  402,  402,
-
-      402,  402,  404,  402,  402,  402, 1825,  402,  406,  402,
-      407,  402,  411,  263,  411,  411,  263,  411,  422,  263,
-      422,  899,  422,  263,  422,  436,  263,  436,  412,  662,
-      662,  412,  662, 1826,  423, 1827,  402,  402,  423,  844,
-      866,  437,  658,  658,  658,  661,  661,  899,  661,  658,
-      658,  658,  408, 1835,  858, 1838, 1839,  409,  402,  403,
-      263,  403,  402,  402,  402,  402,  402,  402,  402,  404,
-      402,  402,  402,  743,  402,  406,  402,  407,  402,  436,
-      263,  436,  263,  263,  263,  263,  263,  263,  859,  436,
-      263,  436,  436,  263,  436,  437,  697, 1842,  438,  696,
-
-     1844,  438,  859,  402,  402,  437,  696,  662,  437,  658,
-      658,  658,  658,  658,  658,  658,  658,  658, 1846,  408,
-      658,  658,  658,  661,  409,  413,  414,  263,  414,  413,
-      413,  413,  413,  413,  413,  413,  415,  413,  413,  413,
-     1847,  413,  417,  413,  418,  413,  436,  263,  436,  436,
-      263,  436,  448,  263,  448,  943,  448,  263,  448,  460,
-      263,  460,  439,  662,  662,  439,  662,  943,  449,  939,
-      413,  413,  449,  871,  662,  461,  658,  658,  658,  661,
-      661,  990,  661,  658,  658,  658,  419, 1849, 1850,  876,
-      661, 1851,  420,  413,  414,  263,  414,  413,  413,  413,
-
-      413,  413,  413,  413,  415,  413,  413,  413, 1856,  413,
-      417,  413,  418,  413,  460,  263,  460,  477,  263,  477,
-      477,  263,  477, 1859,  263,  263,  263,  263,  263,  263,
-      461, 1512, 1860,  478, 1861, 1863,  478,  859,  413,  413,
-      363,  926,  662,  363, 1501,  697,  658,  658,  658,  658,
-      658,  658,  927, 1866,  419,  942, 1867,  882,  661, 1869,
-      420,  424,  425,  263,  425,  424,  424,  424,  424,  424,
-      424,  424,  426,  424,  424,  424, 1873,  424,  428,  424,
-      429,  424,  477,  263,  477,  477,  263,  477,  477,  263,
-      477, 1874,  477,  263,  477,  658,  658,  658,  478, 1512,
-
-     1875,  478, 1877, 1689,  479,  859,  424,  424,  479,  430,
-      662,  431, 1550,  697,  658,  658,  658,  432,  658,  658,
-      658,  658,  658,  658,  433,  890,  661,  434,  424,  425,
-      263,  425,  424,  424,  424,  424,  424,  424,  424,  426,
-      424,  424,  424, 1888,  424,  428,  424,  429,  424,  493,
-      263,  493,  493,  263,  493,  509,  263,  509,  945,  509,
-      263,  509,  891,  662, 1889,  494, 1890,  662,  494,  946,
-      895,  510,  928,  424,  424,  510,  430,  743,  431,  661,
-      658,  658,  658,  661,  432,  658,  658,  658,  658,  658,
-      658,  433, 1892, 1893,  434,  440,  441,  263,  441,  440,
-
-      440,  440,  440,  440,  440,  440,  442,  440,  440,  440,
-     1894,  440,  444,  440,  445,  440,  520,  263,  520,  520,
-      263,  520,  532,  263,  532,  943,  532,  263,  532,  545,
-      263,  545,  521, 1895, 1896,  521,  662, 1897,  533,  995,
-      440,  440,  533,  904, 1898,  546,  658,  658,  658,  658,
-      658,  658,  661,  910,  910,  910,  446,  440,  441,  263,
-      441,  440,  440,  440,  440,  440,  440,  440,  442,  440,
-      440,  440, 1899,  440,  444,  440,  445,  440,  545,  263,
-      545,  263,  263,  263,  263,  263,  263, 1900,  545,  263,
-      545,  545,  263,  545,  546,  945, 1901,  363,  935,  926,
-
-      363,  948,  440,  440,  546,  936,  946,  546,  936,  942,
-      946,  937,  911,  942,  949, 1163, 1163, 1163,  446,  450,
-      451,  263,  451,  450,  450,  450,  450,  450,  450,  450,
-      452,  450,  450,  450, 1903,  450,  454,  450,  455,  450,
-      545,  263,  545,  545,  263,  545,  557,  263,  557,  943,
-      557,  263,  557,  263,  263,  263,  547, 1904, 1146,  547,
-      948,  935,  558,  996,  450,  450,  558,  936,  936,  559,
-      456,  935,  948,  937,  949,  457, 1905, 1906,  936,  936,
-     1492, 1492, 1492, 1885,  989,  989, 1909,  458,  450,  451,
-      263,  451,  450,  450,  450,  450,  450,  450,  450,  452,
-
-      450,  450,  450, 1912,  450,  454,  450,  455,  450,  263,
-      263,  263,  557,  263,  557,  557,  263,  557, 1913,  557,
-      263,  557,  557,  263,  557,  559, 1146, 1914,  558, 1915,
-     1916,  558, 1917,  450,  450,  560, 1921, 1922,  560,  456,
-     1924, 1925, 1148, 1926,  457,  910,  910,  910, 1928, 1150,
-     1186, 1186, 1186, 1547, 1547, 1547,  458,  462,  463,  263,
-      463,  462,  462,  462,  462,  462,  462,  462,  464,  462,
-      462,  462,  465,  462,  466,  462,  467,  462,  465,  465,
-      465,  465,  465,  465,  465,  465,  465,  465,  465,  465,
-      465,  465,  465,  465,  465,  465,  465,  465,  465,  465,
-
-      465,  465,  462,  462,  465,  468,  469,  470,  465,  465,
-      465,  465,  465,  471,  465,  465,  472,  465,  465,  465,
-      473,  465,  474,  475,  465,  465,  465,  465,  465,  465,
-      465,  480,  481,  263,  481,  480,  480,  480,  480,  480,
-      480,  480,  482,  480,  480,  480, 1941,  480,  484,  480,
-      485,  480,  571,  263,  571,  571,  263,  571,  263,  263,
-      263, 1942,  263,  263,  263,  571,  263,  571,  572, 1315,
-     1943,  572, 1944, 1945,  559, 1948,  480,  480,  559, 1316,
-      486,  572, 1163, 1163, 1163, 1949, 1317,  487, 1950, 1951,
-      488, 1186, 1186, 1186,  489, 1956,  490,  491,  480,  481,
-
-      263,  481,  480,  480,  480,  480,  480,  480,  480,  482,
-      480,  480,  480, 1960,  480,  484,  480,  485,  480,  571,
-      263,  571,  571,  263,  571,  571,  263,  571, 1965,  583,
-      263,  583,  583,  263,  583,  572, 1966, 1975,  573, 1979,
-     1981,  573, 1987,  480,  480,  584, 1164,  486,  584, 1199,
-     1199, 1199, 1988, 1200,  487, 1164, 1201,  488, 1492, 1492,
-     1492,  489, 1989,  490,  491,  495,  496,  263,  496,  495,
-      495,  495,  495,  495,  495,  495,  497,  495,  495,  495,
-     1995,  495,  499,  495,  500,  495,  594,  263,  594,  594,
-      263,  594,  263,  263,  263, 1996,  263,  263,  263,  955,
-
-      955,  955,  595, 1997, 1998,  595, 2011, 2017,  559, 2021,
-      495,  495,  559,  501,  502,  503,  956, 2024, 1209, 1209,
-     1209,  504, 1210, 2026,  505, 1211, 2027, 2029,  506, 2030,
-     2031,  507,  495,  496,  263,  496,  495,  495,  495,  495,
-      495,  495,  495,  497,  495,  495,  495, 2035,  495,  499,
-      495,  500,  495,  594,  263,  594,  594,  263,  594,  594,
-      263,  594, 2038,  594,  263,  594,  963,  963,  963,  595,
-     2040, 2047,  595, 2055, 2056,  596, 2057,  495,  495,  596,
-      501,  502,  503,  964, 2058, 1231, 1231, 1231,  504, 1232,
-     2060,  505, 1233, 2074, 2078,  506, 1689, 1146,  507,  511,
-
-      512,  263,  512,  511,  511,  511,  511,  511,  511,  511,
-      513,  511,  511,  511, 2071,  511,  515,  511,  516,  511,
-      607,  263,  607,  607,  263,  607,  263,  263,  263, 2079,
-      263,  263,  263,  978,  978,  978,  608, 2080, 2072,  608,
-     2083, 2084,  559, 2086,  511,  511,  559, 2087, 2088,  517,
-      979, 1703, 1703, 1703, 2089,  518,  511,  512,  263,  512,
-      511,  511,  511,  511,  511,  511,  511,  513,  511,  511,
-      511, 1689,  511,  515,  511,  516,  511,  607,  263,  607,
-      607,  263,  607,  607,  263,  607, 2090,  607,  263,  607,
-      998,  998,  998,  608, 2091, 2081,  608, 1704, 2094,  609,
-
-     2095,  511,  511,  609, 2073, 2098,  517,  999, 1706, 1706,
-     1706, 2082,  518,  522,  523,  263,  523,  522,  522,  522,
-      522,  522,  522,  522,  524,  522,  522,  522, 2099,  522,
-      526,  522,  527,  522,  622,  263,  622,  622,  263,  622,
-      263,  263,  263, 2100,  263,  263,  263,  622,  263,  622,
-      623, 2101, 2102,  623, 1707, 2104,  624, 2105,  522,  522,
-      624, 2108,  528,  623, 1163, 1163, 1163, 2111, 2115,  529,
-     2116, 2119,  530,  522,  523,  263,  523,  522,  522,  522,
-      522,  522,  522,  522,  524,  522,  522,  522, 2120,  522,
-      526,  522,  527,  522,  622,  263,  622,  622,  263,  622,
-
-      622,  263,  622, 2117,  634,  263,  634,  634,  263,  634,
-      623, 2118, 2121,  625, 2124, 2128,  625, 2129,  522,  522,
-      635, 2132,  528,  635, 1186, 1186, 1186, 2134, 1239,  529,
-     2146, 2153,  530,  534,  535,  263,  535,  534,  534,  534,
-      534,  534,  534,  534,  536,  534,  534,  534, 2154,  534,
-      538,  534,  539,  534,  644,  263,  644,  644,  263,  644,
-      263,  263,  263, 2122,  263,  263,  263,  644,  263,  644,
-      645, 2123, 2158,  645, 2130, 2130,  363, 2159,  534,  534,
-      363, 2160,  540,  645, 1710, 1710, 1710, 2161, 1239,  541,
-     2131, 2082,  542, 1713, 1713, 1713, 1723, 1723, 1723,  543,
-
-      534,  535,  263,  535,  534,  534,  534,  534,  534,  534,
-      534,  536,  534,  534,  534, 2163,  534,  538,  534,  539,
-      534,  644,  263,  644,  644,  263,  644,  644,  263,  644,
-     2167,  656,  263,  656,  656,  263,  656,  645, 1929, 2081,
-      646, 2168, 2169,  646, 1930,  534,  534,  657, 1931,  540,
-      657, 3322, 1932,  734,  693, 2131,  541, 2175, 2176,  542,
-     2177,  693, 2191,  744, 2195, 2196,  543,  548,  549,  263,
-      549,  548,  548,  548,  548,  548,  548,  548,  550,  548,
-      548,  548,  748,  548,  552,  548,  553,  548, 2197, 2199,
-      694,  745, 2203, 1005, 1005, 1005,  695, 2207,  749, 1021,
-
-     1021, 1021, 2208,  696, 2209,  696, 2210,  697, 2211,  690,
-     1006, 2214,  548,  548, 2221, 2223, 1022, 2233,  554, 1253,
-     1253, 1253, 2234, 1254, 2235, 2236, 1255, 1547, 1547, 1547,
-     1757, 1757, 1757,  555,  548,  549,  263,  549,  548,  548,
-      548,  548,  548,  548,  548,  550,  548,  548,  548, 2238,
-      548,  552,  548,  553,  548, 1034, 1034, 1034, 1036, 1036,
-     1036, 1042, 1042, 1042, 1045, 1045, 1045, 1059, 1059, 1059,
-     1689, 1146, 1035, 2244, 2250, 1037, 1758, 2241, 1043,  548,
-      548, 1046, 2251, 2252, 1060,  554, 1263, 1263, 1263, 2253,
-     1264, 2256, 2258, 1265, 1759, 1759, 1759, 1760, 1760, 1760,
-
-      555,  561,  562,  263,  562,  561,  561,  561,  561,  561,
-      561,  561,  563,  561,  561,  561, 2243,  561,  565,  561,
-      566,  561, 1061, 1061, 1061, 1073, 1073, 1073, 1081, 1081,
-     1081, 1086, 1086, 1086, 1092, 1092, 1092, 2259, 2260, 1062,
-     1707, 2264, 1074, 2269, 2271, 1082,  561,  561, 1087, 2272,
-     2273, 1093,  567, 2277, 2283,  568, 1286, 1286, 1286, 2284,
-     1287, 2285, 2286, 1288, 1706, 1706, 1706,  569,  561,  562,
-      263,  562,  561,  561,  561,  561,  561,  561,  561,  563,
-      561,  561,  561, 2287,  561,  565,  561,  566,  561, 1112,
-     1112, 1112, 1136, 1136, 1136, 1140, 1140, 1140, 1159, 1159,
-
-     1159, 1933, 1159, 1159, 1159, 2288, 1113, 1934, 2289, 1137,
-     1858, 1935, 1141,  561,  561, 1936, 1161, 2290, 2291,  567,
-     1161, 2292,  568, 1304, 1304, 1304, 2298, 1305, 1689, 2299,
-     1306, 1703, 1703, 1703,  569,  574,  575,  263,  575,  574,
-      574,  574,  574,  574,  574,  574,  576,  574,  574,  574,
-     2300,  574,  578,  574,  579,  574, 1194, 1194, 1194, 2242,
-     1162, 1194, 1194, 1194, 2301,  955,  955,  955, 2307, 1204,
-     1204, 1204, 2312, 2314, 1196, 1706, 1706, 1706, 2316, 1196,
-      574,  574,  956, 1902, 1902, 1902,  580, 1206, 1710, 1710,
-     1710,  581,  574,  575,  263,  575,  574,  574,  574,  574,
-
-      574,  574,  574,  576,  574,  574,  574, 2317,  574,  578,
-      574,  579,  574, 1204, 1204, 1204,  963,  963,  963, 2322,
-     2323, 1197, 1212, 1212, 1212, 1215, 1215, 1215, 1220, 1220,
-     1220, 1206, 2318,  964, 1713, 1713, 1713,  574,  574, 1213,
-     2319, 2325, 1216,  580, 2326, 2327, 1222, 2328,  581,  585,
-      586,  263,  586,  585,  585,  585,  585,  585,  585,  585,
-      587,  585,  585,  585, 2332,  585,  589,  585,  590,  585,
-     1227, 1227, 1227, 1227, 1227, 1227, 2333, 1207, 2334,  978,
-      978,  978, 2320, 2340, 1220, 1220, 1220, 2341, 1229, 2342,
-     2321, 1229, 2343, 2346,  585,  585,  979,  998,  998,  998,
-
-      591, 2351, 1222, 1307, 1307, 1307, 2355, 1308, 2356, 2361,
-     1309, 1907, 1907, 1907,  999,  592,  585,  586,  263,  586,
-      585,  585,  585,  585,  585,  585,  585,  587,  585,  585,
-      585, 1223,  585,  589,  585,  590,  585, 1230, 1235, 1235,
-     1235, 1235, 1235, 1235, 2362, 1258, 1258, 1258, 1258, 1258,
-     1258, 1005, 1005, 1005, 2363, 2364, 1237, 2357, 2366, 1237,
-     2376,  585,  585, 1260, 2359, 2358, 1260,  591, 1006, 1318,
-     1318, 1318, 2360, 1319, 1689, 1908, 1320, 2387, 1238, 1723,
-     1723, 1723,  592,  597,  598,  263,  598,  597,  597,  597,
-      597,  597,  597,  597,  599,  597,  597,  597, 1689,  597,
-
-      601,  597,  602,  597, 1267, 1267, 1267, 1267, 1267, 1267,
-     1021, 1021, 1021, 2388, 1261, 1273, 1273, 1273, 1273, 1273,
-     1273, 2382, 1269, 2389, 2393, 1269, 2394, 1022,  597,  597,
-     1279, 1279, 1279, 1275,  603, 2395, 1275,  604, 1322, 1322,
-     1322, 2381, 1323, 2398, 2402, 1324, 2403, 2404, 1281,  605,
-      597,  598,  263,  598,  597,  597,  597,  597,  597,  597,
-      597,  599,  597,  597,  597, 2405,  597,  601,  597,  602,
-      597, 2406, 2407, 1270, 1279, 1279, 1279, 2408, 2409, 1276,
-     1292, 1292, 1292, 2410, 1292, 1292, 1292, 1299, 1299, 1299,
-     2411, 2424, 1281, 2425, 2426,  597,  597, 2427, 1294, 2428,
-
-     2430,  603, 1294, 2436,  604, 1301, 1340, 1340, 1340, 2437,
-     1341, 2438, 2439, 1342, 2440, 2441,  605,  610,  611,  263,
-      611,  610,  610,  610,  610,  610,  610,  610,  612,  610,
-      610,  610, 2442,  610,  614,  610,  615,  610, 2445, 1282,
-     1034, 1034, 1034, 2446, 2447, 1295, 1299, 1299, 1299, 1036,
-     1036, 1036, 2452, 1310, 1310, 1310, 2453, 1035, 1310, 1310,
-     1310, 2458,  610,  610, 1301, 2459, 1037, 1910, 1910, 1910,
-      616, 1312,  617, 2460, 2461,  618, 1312, 2470, 2471,  619,
-     1757, 1757, 1757,  620,  610,  611,  263,  611,  610,  610,
-      610,  610,  610,  610,  610,  612,  610,  610,  610, 2472,
-
-      610,  614,  610,  615,  610, 1042, 1042, 1042, 1302, 1045,
-     1045, 1045, 2473, 1911, 1325, 1325, 1325, 2413, 2414, 1313,
-     2415, 2475, 1043, 1336, 1336, 1336, 1046, 2477, 2416,  610,
-      610, 1326, 1059, 1059, 1059, 2417, 2501,  616, 2448,  617,
-     2502, 1338,  618, 1759, 1759, 1759,  619, 2504, 2449, 1060,
-      620,  626,  627,  263,  627,  626,  626,  626,  626,  626,
-      626,  626,  628,  626,  626,  626, 1689,  626,  630,  626,
-      631,  626, 1061, 1061, 1061, 1343, 1343, 1343, 2505, 1344,
-     2506, 2507, 1345, 2511, 1336, 1336, 1336, 2512, 2513, 1062,
-     1346, 1346, 1346, 3322, 3322, 3322,  626,  626, 3322, 3322,
-
-     3322, 2514, 1338, 2498, 1360, 1360, 1360, 1347, 1361, 2515,
-     3322, 1362, 1372, 1372, 1372, 3322, 1373, 1689, 2516, 1374,
-      632,  626,  627,  263,  627,  626,  626,  626,  626,  626,
-      626,  626,  628,  626,  626,  626, 2517,  626,  630,  626,
-      631,  626, 1339, 2518, 1348, 1352, 1352, 1352, 2519, 2497,
-     1349, 3322, 3322, 3322, 2520, 1073, 1073, 1073, 2521, 2523,
-     3322, 3322, 3322, 1354, 2524, 2527,  626,  626, 3322, 1352,
-     1352, 1352, 1074, 2528, 1380, 1380, 1380, 3322, 1381, 2525,
-     2529, 1382, 1389, 1389, 1389, 2530, 1390, 1354, 2526, 1391,
-      632,  636,  637,  263,  637,  636,  636,  636,  636,  636,
-
-      636,  636,  638,  636,  636,  636, 1350,  636,  640,  636,
-      641,  636, 1351, 1363, 1363, 1363, 1355, 1367, 1367, 1367,
-     1367, 1367, 1367, 1081, 1081, 1081, 1375, 1375, 1375, 2533,
-     1364, 1760, 1760, 1760, 2534, 1369,  636,  636, 1369, 2535,
-     1082, 1918, 1918, 1918, 1377, 2536, 2538,  642,  636,  637,
-      263,  637,  636,  636,  636,  636,  636,  636,  636,  638,
-      636,  636,  636, 2539,  636,  640,  636,  641,  636, 2541,
-     2547, 1370, 1375, 1375, 1375, 1086, 1086, 1086, 1384, 1384,
-     1384, 1384, 1384, 1384, 1092, 1092, 1092, 1919, 2531, 2548,
-     1377, 2549, 1087,  636,  636, 2550, 1386, 2532, 2554, 1386,
-
-     2555, 1093, 2556, 2557,  642,  647,  648,  263,  648,  647,
-      647,  647,  647,  647,  647,  647,  649,  647,  647,  647,
-     2558,  647,  651,  647,  652,  647, 2562, 2565, 1387, 1395,
-     1395, 1395, 2566, 1378, 2569, 1395, 1395, 1395, 1399, 1399,
-     1399, 1401, 1401, 1401, 1404, 1404, 1404, 1397, 2581, 2582,
-      647,  647, 2585, 1397, 2586, 1400, 2606, 2607, 1402, 2608,
-     2609,  653, 1406, 1421, 1421, 1421, 2610, 1422, 1689, 1689,
-     1423, 1978, 1978, 1978,  654,  647,  648,  263,  648,  647,
-      647,  647,  647,  647,  647,  647,  649,  647,  647,  647,
-     1398,  647,  651,  647,  652,  647, 3322, 3322, 3322, 1404,
-
-     1404, 1404, 1409, 1409, 1409, 2604, 3322, 3322, 3322, 1413,
-     1413, 1413, 2605, 3322, 1416, 1416, 1416, 1406, 1146, 1410,
-      647,  647, 2619, 3322, 2620, 2621, 1414, 2622, 1416, 1416,
-     1416,  653, 1418, 3322, 3322, 3322, 1112, 1112, 1112, 1424,
-     1424, 1424, 2623, 2624,  654,  662, 1418, 1428, 1428, 1428,
-     3322, 2625,  677, 1113, 2626, 1403, 1411, 1426, 2603, 2627,
-     1407,  661,  678, 2628, 1429, 1419, 1424, 1424, 1424, 2629,
-     2631, 1412, 2085, 2085, 2085, 2632, 1430, 1430, 1430, 2633,
-     1432, 1432, 1432, 2634, 1426, 1432, 1432, 1432, 2635,  679,
-      680,  681, 1415, 1431, 2636,  682,  683,  684, 1434, 2637,
-
-      685,  686, 2638, 1434,  687, 2639,  688,  689,  690,  662,
-     1436, 1436, 1436, 3322, 3322, 3322,  734, 1440, 1440, 1440,
-     2640, 1427, 1442, 1442, 1442,  661,  735, 1437, 2641, 2642,
-     3322, 1442, 1442, 1442, 1441, 1136, 1136, 1136, 2613, 2643,
-     1444, 1140, 1140, 1140, 1451, 1451, 1451, 2644, 2614, 1444,
-     2645, 2615, 1137,  679,  736,  691, 1435, 2646, 1141,  737,
-      738,  684, 1453, 1438,  739,  686, 2648, 2649,  740, 2657,
-      741,  742,  690, 1451, 1451, 1451, 2658, 2659, 1439, 1457,
-     1457, 1457, 1457, 1457, 1457, 1461, 1461, 1461, 2616, 1462,
-     2662, 1453, 1463, 1464, 1464, 1464, 2663, 1459, 2617, 2667,
-
-     1459, 2618, 1445, 1464, 1464, 1464, 1468, 1468, 1468, 2702,
-     1469, 1466, 1146, 1470, 1472, 1472, 1472, 1472, 1472, 1472,
-     2704, 1466, 1159, 1159, 1159, 1159, 1159, 1159, 2685, 1159,
-     1159, 1159, 1474, 2705, 2706, 1474, 2710, 1454, 2686, 2711,
-     1161, 2699, 2714, 1161, 2687, 2715, 1460, 1161, 1514, 1514,
-     1514, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
-     1517, 1517, 1517, 1689, 1467, 1515, 1199, 1199, 1199, 1196,
-     1200, 2718, 1196, 1201, 1689, 1196, 1484, 1518, 3322, 3322,
-     3322, 1475, 1204, 1204, 1204, 1204, 1204, 1204, 2688, 1204,
-     1204, 1204, 1209, 1209, 1209, 3322, 1210, 2719, 2689, 1211,
-
-     1206, 2712, 2720, 1206, 2690, 2700, 1516, 1206, 1212, 1212,
-     1212, 1523, 1523, 1523, 2713, 1524, 2701, 2716, 1525, 2721,
-     1526, 1526, 1526, 2722, 2723, 1213, 1215, 1215, 1215, 2724,
-     2717, 1528, 1528, 1528, 2725, 1529, 1521, 1527, 1530, 1519,
-     1532, 1532, 1532, 1216, 1220, 1220, 1220, 1220, 1220, 1220,
-     1220, 1220, 1220, 1537, 1537, 1537, 2726, 1533, 1227, 1227,
-     1227, 2728, 1222, 2729, 2730, 1222, 2731, 2732, 1222, 2733,
-     1538, 1227, 1227, 1227, 2734, 2735, 1229, 1227, 1227, 1227,
-     1231, 1231, 1231, 2736, 1232, 2737, 2738, 1233, 2739, 1229,
-     1235, 1235, 1235, 2740, 2742, 1229, 1235, 1235, 1235, 1542,
-
-     1542, 1542, 1253, 1253, 1253, 2754, 1254, 2755, 1237, 1255,
-     1535, 1559, 1559, 1559, 1237, 2763, 2764, 1543, 1258, 1258,
-     1258, 1258, 1258, 1258, 1540, 1258, 1258, 1258, 1560, 2781,
-     1263, 1263, 1263, 2782, 1264, 2783, 1260, 1265, 2784, 1260,
-     1267, 1267, 1267, 1260, 1267, 1267, 1267, 1267, 1267, 1267,
-     1565, 1565, 1565, 3322, 3322, 3322, 2785, 2786, 1269, 1273,
-     1273, 1273, 1269, 2797, 1689, 1269, 2799, 1566, 2800, 2801,
-     3322, 1273, 1273, 1273, 1273, 1273, 1273, 1275, 1569, 1569,
-     1569, 3322, 3322, 3322, 2789, 2802, 1561, 2803, 2804, 1275,
-     2805, 2806, 1275, 2807, 2791, 1570, 2808, 2790, 3322, 2794,
-
-     1567, 1279, 1279, 1279, 1279, 1279, 1279, 2792, 1564, 1571,
-     1279, 1279, 1279, 1575, 1575, 1575, 1286, 1286, 1286, 1281,
-     1287, 2811, 1281, 1288, 1292, 1292, 1292, 2812, 1281, 2813,
-     1576, 1292, 1292, 1292, 1292, 1292, 1292, 1583, 1583, 1583,
-     2814, 1568, 1294, 1299, 1299, 1299, 1299, 1299, 1299, 1294,
-     2815, 2816, 1294, 2817, 1584, 1299, 1299, 1299, 1586, 1586,
-     1586, 1301, 2818, 2820, 1301, 1304, 1304, 1304, 1146, 1305,
-     2821, 2822, 1306, 1301, 2823, 1587, 1572, 1307, 1307, 1307,
-     2824, 1308, 2825, 2826, 1309, 1310, 1310, 1310, 1310, 1310,
-     1310, 1310, 1310, 1310, 1318, 1318, 1318, 2827, 1319, 1580,
-
-     2828, 1320, 2829, 1312, 2830, 2831, 1312, 2832, 2844, 1312,
-     1593, 1593, 1593, 1322, 1322, 1322, 2793, 1323, 2845, 2846,
-     1324, 2853, 1585, 1325, 1325, 1325, 2854, 1594, 1595, 1595,
-     1595, 2868, 1596, 2869, 2870, 1597, 1336, 1336, 1336, 2871,
-     1326, 1336, 1336, 1336, 1336, 1336, 1336, 2860, 1340, 1340,
-     1340, 2862, 1341, 2872, 1338, 1342, 1588, 2861, 2864, 1338,
-     2873, 2863, 1338, 1343, 1343, 1343, 2877, 1344, 2865, 2866,
-     1345, 1346, 1346, 1346, 1608, 1608, 1608, 2878, 1609, 2867,
-     2879, 1610, 1352, 1352, 1352, 1352, 1352, 1352, 1347, 1352,
-     1352, 1352, 1360, 1360, 1360, 2880, 1361, 1146, 2890, 1362,
-
-     1354, 2891, 2892, 1354, 1363, 1363, 1363, 1354, 1620, 1620,
-     1620, 1607, 1621, 2893, 2894, 1622, 1367, 1367, 1367, 2895,
-     2896, 1364, 1367, 1367, 1367, 1367, 1367, 1367, 1372, 1372,
-     1372, 2881, 1373, 2897, 1369, 1374, 2901, 1615, 2902, 2903,
-     1369, 2904, 2905, 1369, 1375, 1375, 1375, 1375, 1375, 1375,
-     1375, 1375, 1375, 1380, 1380, 1380, 2906, 1381, 2908, 2909,
-     1382, 2910, 1377, 2911, 2912, 1377, 2913, 2914, 1377, 1384,
-     1384, 1384, 1384, 1384, 1384, 2915, 1625, 1384, 1384, 1384,
-     2919, 1389, 1389, 1389, 2920, 1390, 2921, 1386, 1391, 2924,
-     1386, 1395, 1395, 1395, 2929, 1386, 1395, 1395, 1395, 2930,
-
-     1395, 1395, 1395, 1399, 1399, 1399, 1636, 1636, 1636, 1397,
-     1637, 2931, 2932, 1638, 1397, 2933, 2934, 1627, 1397, 2935,
-     1400, 1401, 1401, 1401, 2936, 2937, 1630, 1639, 1639, 1639,
-     2938, 1640, 2939, 2940, 1641, 1404, 1404, 1404, 1402, 1404,
-     1404, 1404, 2942, 1404, 1404, 1404, 1409, 1409, 1409, 2943,
-     1413, 1413, 1413, 1406, 1902, 1902, 1902, 1406, 2944, 2945,
-     1635, 1406, 2952, 1410, 1645, 1645, 1645, 1414, 1646, 2953,
-     2954, 1647, 1650, 1650, 1650, 2955, 1651, 2956, 2957, 1652,
-     1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1421,
-     1421, 1421, 2958, 1422, 2959, 2960, 1423, 2961, 1418, 2962,
-
-     1146, 1418, 2963, 2964, 1418, 1424, 1424, 1424, 2965, 2968,
-     1643, 1424, 1424, 1424, 1424, 1424, 1424, 1428, 1428, 1428,
-     1657, 1657, 1657, 1426, 1658, 2969, 2970, 1659, 2971, 1426,
-     2972, 2973, 1426, 2974, 1429, 1430, 1430, 1430, 1660, 1660,
-     1660, 2975, 1661, 2946, 2976, 1662, 1432, 1432, 1432, 2980,
-     1654, 2987, 1431, 1432, 1432, 1432, 2988, 1432, 1432, 1432,
-     1436, 1436, 1436, 2989, 1434, 1664, 1664, 1664, 2990, 1665,
-     2991, 1434, 1666, 2992, 1656, 1434, 2993, 1437, 1440, 1440,
-     1440, 1669, 1669, 1669, 2994, 1670, 2995, 2996, 1671, 1442,
-     1442, 1442, 1442, 1442, 1442, 1441, 1442, 1442, 1442, 1674,
-
-     1674, 1674, 1451, 1451, 1451, 2997, 2998, 1444, 3001, 3002,
-     1444, 1451, 1451, 1451, 1444, 3003, 1675, 3004, 1146, 1663,
-     1453, 1451, 1451, 1451, 1457, 1457, 1457, 3007, 3012, 1453,
-     1457, 1457, 1457, 1457, 1457, 1457, 1461, 1461, 1461, 1453,
-     1462, 3008, 1459, 1463, 1464, 1464, 1464, 3013, 1459, 3014,
-     3015, 1459, 1464, 1464, 1464, 1464, 1464, 1464, 1672, 1468,
-     1468, 1468, 1466, 1469, 3005, 3016, 1470, 1472, 1472, 1472,
-     1466, 3017, 3007, 1466, 1472, 1472, 1472, 1472, 1472, 1472,
-     3018, 3019, 1679, 3010, 3020, 1474, 1682, 1688, 1688, 1688,
-     3021, 3022, 1474, 3023, 3024, 1474, 1159, 1159, 1159, 1514,
-
-     1514, 1514, 1194, 1194, 1194, 1689, 1690, 3025, 1517, 1517,
-     1517, 1542, 1542, 1542, 1161, 1683, 1515, 1726, 1726, 1726,
-     1196, 1727, 3026, 3027, 1728, 1518, 1730, 1730, 1730, 1543,
-     1731, 3028, 3029, 1732, 1204, 1204, 1204, 3033, 1685, 1523,
-     1523, 1523, 3038, 1524, 3030, 3031, 1525, 1526, 1526, 1526,
-     3039, 3034, 1206, 3040, 1737, 1737, 1737, 3032, 1738, 3036,
-     1729, 1739, 1695, 3035, 1527, 1528, 1528, 1528, 3041, 1529,
-     3042, 3037, 1530, 1532, 1532, 1532, 3043, 1741, 1741, 1741,
-     3046, 1742, 1146, 1735, 1743, 1220, 1220, 1220, 3007, 3046,
-     1533, 1537, 1537, 1537, 1747, 1747, 1747, 3049, 1748, 1689,
-
-     1690, 1749, 3008, 1222, 1750, 1750, 1750, 3050, 1538, 1227,
-     1227, 1227, 1768, 1768, 1768, 1559, 1559, 1559, 1770, 1770,
-     1770, 1751, 1771, 3044, 3051, 1772, 3052, 1229, 3065, 1769,
-     3053, 3063, 1560, 3068, 3066, 1745, 1258, 1258, 1258, 1267,
-     1267, 1267, 1565, 1565, 1565, 1777, 1777, 1777, 3054, 1778,
-     3064, 3073, 1779, 3067, 1260, 3076, 3055, 1269, 1752, 1566,
-     1273, 1273, 1273, 1569, 1569, 1569, 1782, 1782, 1782, 3077,
-     1783, 3056, 3078, 1784, 1279, 1279, 1279, 3071, 1275, 3007,
-     1570, 1575, 1575, 1575, 1789, 1789, 1789, 3046, 1790, 3080,
-     3010, 1791, 1281, 1792, 1792, 1792, 3072, 3046, 1576, 3074,
-
-     1773, 3081, 3082, 1776, 1795, 1795, 1795, 1292, 1292, 1292,
-     1793, 1583, 1583, 1583, 3083, 1801, 1801, 1801, 3075, 1802,
-     1781, 1796, 1803, 3084, 3085, 1294, 3086, 3096, 1584, 1804,
-     1804, 1804, 1586, 1586, 1586, 1786, 1806, 1806, 1806, 3097,
-     1807, 3098, 3099, 1808, 1310, 1310, 1310, 1805, 3100, 1587,
-     1797, 1811, 1811, 1811, 1593, 1593, 1593, 1815, 1815, 1815,
-     3101, 1816, 1312, 3105, 1817, 1595, 1595, 1595, 1812, 1596,
-     3106, 1594, 1597, 1798, 1820, 1820, 1820, 1336, 1336, 1336,
-     1608, 1608, 1608, 3107, 1609, 3108, 3109, 1610, 1829, 1829,
-     1829, 1821, 3322, 3322, 3322, 1338, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 1352, 1352, 1352, 1830, 1836, 1836, 1836, 3322,
-     1809, 3110, 3111, 3322, 3112, 3114, 3322, 1620, 1620, 1620,
-     1354, 1621, 3115, 1837, 1622, 3116, 3117, 1840, 1840, 1840,
-     1367, 1367, 1367, 1375, 1375, 1375, 1384, 1384, 1384, 1852,
-     1852, 1852, 1828, 1832, 1841, 1395, 1395, 1395, 1369, 3118,
-     3123, 1377, 3124, 3125, 1386, 3119, 1853, 1834, 3121, 1404,
-     1404, 1404, 1831, 1397, 1636, 1636, 1636, 3120, 1637, 1833,
-     3122, 1638, 1639, 1639, 1639, 3126, 1640, 1406, 3127, 1641,
-     1645, 1645, 1645, 3128, 1646, 1854, 3129, 1647, 1650, 1650,
-     1650, 3130, 1651, 1848, 1843, 1652, 1416, 1416, 1416, 1845,
-
-     3131, 3132, 1855, 1424, 1424, 1424, 1657, 1657, 1657, 3133,
-     1658, 3134, 3135, 1659, 1418, 1660, 1660, 1660, 3136, 1661,
-     3138, 1426, 1662, 3139, 3140, 1857, 1432, 1432, 1432, 1664,
-     1664, 1664, 3141, 1665, 3142, 3143, 1666, 3144, 1669, 1669,
-     1669, 3145, 1670, 3146, 1434, 1671, 1442, 1442, 1442, 1674,
-     1674, 1674, 1870, 1870, 1870, 3147, 1871, 1862, 1146, 1872,
-     1864, 1451, 1451, 1451, 1444, 3148, 1675, 1878, 1878, 1878,
-     1457, 1457, 1457, 1865, 1464, 1464, 1464, 3149, 3150, 1453,
-     1882, 1882, 1882, 3137, 1879, 1472, 1472, 1472, 1459, 1688,
-     1688, 1688, 1466, 1868, 1159, 1159, 1159, 1883, 1726, 1726,
-
-     1726, 3151, 1727, 1474, 3152, 1728, 3153, 1689, 3154, 3155,
-     1876, 3156, 1161, 1194, 1194, 1194, 1730, 1730, 1730, 3157,
-     1731, 3159, 3160, 1732, 3161, 1146, 1881, 1204, 1204, 1204,
-     3162, 1196, 1737, 1737, 1737, 3163, 1738, 1880, 3164, 1739,
-     1886, 1220, 1220, 1220, 3158, 1206, 1891, 1884, 1741, 1741,
-     1741, 3165, 1742, 3166, 3167, 1743, 3168, 1887, 3169, 1222,
-     1747, 1747, 1747, 3170, 1748, 3171, 3172, 1749, 1750, 1750,
-     1750, 3173, 1937, 1937, 1937, 3174, 1938, 3175, 1923, 1939,
-     1920, 1227, 1227, 1227, 3176, 1751, 1946, 1946, 1946, 1946,
-     1946, 1946, 1907, 1907, 1907, 1768, 1768, 1768, 1146, 1229,
-
-     3178, 3179, 1927, 1952, 1952, 1952, 3180, 1953, 3181, 3182,
-     1954, 3183, 1769, 1770, 1770, 1770, 3184, 1771, 3177, 3185,
-     1772, 1258, 1258, 1258, 1957, 1957, 1957, 1267, 1267, 1267,
-     3186, 3187, 1940, 1777, 1777, 1777, 3188, 1778, 3189, 1260,
-     1779, 1958, 1273, 1273, 1273, 1269, 3190, 1782, 1782, 1782,
-     1947, 1783, 3191, 1908, 1784, 3192, 1947, 1279, 1279, 1279,
-     1275, 1962, 1962, 1962, 3193, 1789, 1789, 1789, 1955, 1790,
-     3194, 3195, 1791, 3197, 1959, 1281, 3198, 3199, 1963, 1792,
-     1792, 1792, 1967, 1967, 1967, 3200, 1968, 3201, 3202, 1969,
-     1970, 1970, 1970, 1795, 1795, 1795, 1793, 1972, 1972, 1972,
-
-     1146, 1973, 3203, 3204, 1974, 3205, 3196, 1971, 1961, 3206,
-     1796, 1976, 1976, 1976, 3207, 1801, 1801, 1801, 3208, 1802,
-     3210, 1964, 1803, 1804, 1804, 1804, 1806, 1806, 1806, 1977,
-     1807, 1146, 3211, 1808, 1310, 1310, 1310, 1811, 1811, 1811,
-     3212, 1805, 1982, 1982, 1982, 3209, 1983, 3213, 3214, 1984,
-     3215, 3216, 1312, 3217, 1812, 1985, 1985, 1985, 1815, 1815,
-     1815, 3219, 1816, 3220, 3221, 1817, 1820, 1820, 1820, 1990,
-     1990, 1990, 1986, 1991, 3222, 3223, 1992, 1993, 1993, 1993,
-     1980, 3224, 3225, 1821, 1999, 1999, 1999, 1336, 1336, 1336,
-     1829, 1829, 1829, 3226, 1994, 2002, 2002, 2002, 3229, 2003,
-
-     3230, 2000, 2004, 3231, 3232, 1338, 3233, 1830, 2005, 2005,
-     2005, 3322, 3322, 3322, 2008, 2008, 2008, 1352, 1352, 1352,
-     1836, 1836, 1836, 3234, 1146, 2006, 1146, 1724, 3322, 1722,
-     1146, 2009, 2012, 2012, 2012, 1354, 2013, 1837, 1146, 2014,
-     2015, 2015, 2015, 1840, 1840, 1840, 3243, 2018, 2018, 2018,
-     1146, 2019, 3244, 2001, 2020, 1146, 1146, 2016, 3261, 3245,
-     1841, 2022, 2022, 2022, 1375, 1375, 1375, 1146, 3241, 2007,
-     1384, 1384, 1384, 1852, 1852, 1852, 1146, 2010, 3237, 2023,
-     1721, 1720, 1377, 1146, 3257, 2032, 2032, 2032, 1386, 2033,
-     1853, 3235, 2034, 2036, 2036, 2036, 1404, 1404, 1404, 2041,
-
-     2041, 2041, 2043, 2043, 2043, 3322, 3322, 3322, 1416, 1416,
-     1416, 2037, 3236, 3246, 1406, 2025, 2042, 1146, 2028, 2044,
-     1146, 1146, 3322, 1432, 1432, 1432, 1418, 1424, 1424, 1424,
-     3249, 2050, 2050, 2050, 2052, 2052, 2052, 1442, 1442, 1442,
-     1146, 1434, 1870, 1870, 1870, 1426, 1871, 2039, 2051, 1872,
-     1146, 2053, 1451, 1451, 1451, 1444, 1146, 1878, 1878, 1878,
-     2061, 2061, 2061, 3247, 2062, 3238, 1719, 2063, 3239, 2045,
-     1453, 1146, 3262, 2048, 1879, 2046, 1457, 1457, 1457, 1464,
-     1464, 1464, 1882, 1882, 1882, 2066, 2066, 2066, 2049, 2067,
-     1718, 1717, 2068, 3248, 1459, 1146, 1146, 1466, 3240, 1883,
-
-     3242, 1146, 2054, 2059, 2069, 2069, 2069, 2075, 2075, 2075,
-     1159, 1159, 1159, 2092, 2092, 2092, 1907, 1907, 1907, 2093,
-     2093, 2093, 2070, 1146, 2076, 1910, 1910, 1910, 1161, 2096,
-     2096, 2096, 3251, 3252, 2065, 2064, 2097, 2097, 2097, 1918,
-     1918, 1918, 1194, 1194, 1194, 2106, 2106, 2106, 2109, 2109,
-     2109, 1220, 1220, 1220, 1146, 2113, 2113, 2113, 1146, 1146,
-     1196, 1146, 1146, 2107, 3253, 2110, 1937, 1937, 1937, 1222,
-     1938, 2077, 2114, 1939, 1146, 1227, 1227, 1227, 2126, 2126,
-     2126, 1946, 1946, 1946, 2133, 2133, 2133, 2135, 2135, 2135,
-     1146, 1146, 2103, 1229, 3255, 2127, 1952, 1952, 1952, 3254,
-
-     1953, 3250, 3301, 1954, 2136, 1258, 1258, 1258, 3258, 3256,
-     2112, 2139, 2139, 2139, 1957, 1957, 1957, 1146, 2142, 2142,
-     2142, 2125, 2143, 1260, 1146, 2144, 3265, 3259, 2140, 1716,
-     1715, 1958, 3263, 2137, 1267, 1267, 1267, 2147, 2147, 2147,
-     3264, 1146, 1962, 1962, 1962, 1146, 2149, 2149, 2149, 1146,
-     2150, 1146, 1269, 2151, 3260, 2148, 3309, 2141, 2138, 1963,
-     1279, 1279, 1279, 1967, 1967, 1967, 1146, 1968, 1146, 1146,
-     1969, 1970, 1970, 1970, 1714, 2155, 2155, 2155, 1281, 2156,
-     3266, 1146, 2157, 1976, 1976, 1976, 3277, 2145, 1971, 1972,
-     1972, 1972, 1146, 1973, 3269, 1146, 1974, 1978, 1978, 1978,
-
-     3267, 1977, 1310, 1310, 1310, 1712, 3279, 2152, 1982, 1982,
-     1982, 3270, 1983, 1146, 1146, 1984, 1985, 1985, 1985, 1146,
-     1312, 2164, 2164, 2164, 3319, 2165, 3268, 3271, 2166, 1146,
-     1990, 1990, 1990, 1986, 1991, 1146, 1146, 1992, 1993, 1993,
-     1993, 2170, 2170, 2170, 1146, 2171, 3275, 3276, 2172, 2173,
-     2173, 2173, 1999, 1999, 1999, 1994, 1146, 2178, 2178, 2178,
-     2162, 2179, 1146, 3291, 2180, 3272, 2174, 3278, 1146, 2000,
-     1336, 1336, 1336, 2002, 2002, 2002, 1146, 2003, 3281, 3273,
-     2004, 2005, 2005, 2005, 1711, 2182, 2182, 2182, 1338, 2183,
-     1146, 3274, 2184, 2185, 2185, 2185, 1146, 1709, 2006, 2008,
-
-     2008, 2008, 2187, 2187, 2187, 3280, 2188, 1146, 3283, 2189,
-     2186, 1352, 1352, 1352, 1708, 3289, 2009, 1705, 2012, 2012,
-     2012, 2181, 2013, 1146, 1146, 2014, 2015, 2015, 2015, 1354,
-     2192, 2192, 2192, 3285, 2193, 1146, 3284, 2194, 2018, 2018,
-     2018, 1702, 2019, 2016, 3286, 2020, 2022, 2022, 2022, 1375,
-     1375, 1375, 2200, 2200, 2200, 1384, 1384, 1384, 2204, 2204,
-     2204, 1146, 2190, 1146, 2023, 3282, 1146, 1377, 1146, 2201,
-     2032, 2032, 2032, 1386, 2033, 2205, 3302, 2034, 2036, 2036,
-     2036, 2212, 2212, 2212, 2041, 2041, 2041, 2215, 2215, 2215,
-     3287, 2216, 3288, 3290, 2217, 3295, 2037, 1146, 1701, 2213,
-
-     3292, 2042, 1146, 1146, 2206, 2043, 2043, 2043, 2218, 2218,
-     2218, 1700, 2219, 2198, 3293, 2220, 2202, 1416, 1416, 1416,
-     1146, 1146, 2044, 1424, 1424, 1424, 1432, 1432, 1432, 2050,
-     2050, 2050, 2226, 2226, 2226, 1418, 2227, 3296, 1146, 2228,
-     1146, 1426, 1146, 3294, 1434, 1146, 2051, 2052, 2052, 2052,
-     2229, 2229, 2229, 3310, 2230, 3303, 1146, 2231, 1442, 1442,
-     1442, 1451, 1451, 1451, 2053, 1146, 2061, 2061, 2061, 1699,
-     2062, 1146, 2224, 2063, 1146, 3299, 1444, 3304, 1146, 1453,
-     1457, 1457, 1457, 2222, 1464, 1464, 1464, 3297, 2066, 2066,
-     2066, 2225, 2067, 3300, 1698, 2068, 1697, 1696, 1459, 2069,
-
-     2069, 2069, 1466, 2075, 2075, 2075, 2245, 2245, 2245, 3311,
-     2246, 3307, 3298, 2247, 1159, 1159, 1159, 2070, 1146, 3315,
-     2076, 3312, 3319, 2232, 3305, 1694, 2237, 2249, 2249, 2249,
-     1146, 2239, 1161, 2254, 2254, 2254, 1146, 2240, 2255, 2255,
-     2255, 2085, 2085, 2085, 2257, 2257, 2257, 2261, 2261, 2261,
-     2092, 2092, 2092, 2093, 2093, 2093, 2262, 2262, 2262, 2096,
-     2096, 2096, 2097, 2097, 2097, 2265, 2265, 2265, 2266, 2266,
-     2266, 2267, 2267, 2267, 2268, 2268, 2268, 1146, 2248, 1194,
-     1194, 1194, 2106, 2106, 2106, 1693, 2109, 2109, 2109, 2274,
-     2274, 2274, 1146, 2275, 1692, 1691, 2276, 1196, 1684, 1681,
-
-     2107, 1680, 2263, 2110, 2278, 2278, 2278, 2113, 2113, 2113,
-     2280, 2280, 2280, 1678, 2281, 1677, 1676, 2282, 1227, 1227,
-     1227, 1673, 2279, 3306, 2114, 2126, 2126, 2126, 1146, 3308,
-     2270, 2294, 2294, 2294, 1668, 2295, 1229, 1667, 2296, 2297,
-     2297, 2297, 2127, 2133, 2133, 2133, 2302, 2302, 2302, 2135,
-     2135, 2135, 2304, 2304, 2304, 1146, 2305, 1655, 1653, 2306,
-     1258, 1258, 1258, 2139, 2139, 2139, 2136, 2293, 2309, 2309,
-     2309, 1146, 2310, 1146, 1146, 2311, 3316, 1649, 1260, 1648,
-     2140, 2142, 2142, 2142, 1644, 2143, 1642, 3313, 2144, 1267,
-     1267, 1267, 2303, 1634, 2147, 2147, 2147, 2149, 2149, 2149,
-
-     1633, 2150, 1632, 3314, 2151, 3317, 3318, 1269, 1279, 1279,
-     1279, 2308, 2148, 2155, 2155, 2155, 1631, 2156, 1629, 1628,
-     2157, 1310, 1310, 1310, 1626, 1624, 1281, 2164, 2164, 2164,
-     1623, 2165, 1619, 1618, 2166, 2173, 2173, 2173, 1617, 1312,
-     2313, 2170, 2170, 2170, 1616, 2171, 1614, 1613, 2172, 2329,
-     2329, 2329, 2174, 2330, 1612, 1611, 2331, 1606, 2178, 2178,
-     2178, 2315, 2179, 1605, 1604, 2180, 1336, 1336, 1336, 1603,
-     2182, 2182, 2182, 1602, 2183, 1601, 2324, 2184, 2185, 2185,
-     2185, 2336, 2336, 2336, 1338, 2337, 1600, 1599, 2338, 2187,
-     2187, 2187, 1598, 2188, 1592, 2186, 2189, 1352, 1352, 1352,
-
-     2192, 2192, 2192, 1591, 2193, 1590, 1589, 2194, 2344, 2344,
-     2344, 2200, 2200, 2200, 1582, 1354, 2347, 2347, 2347, 1581,
-     2348, 1579, 1578, 2349, 1577, 1574, 2345, 1573, 2201, 1563,
-     2335, 1384, 1384, 1384, 2204, 2204, 2204, 2352, 2352, 2352,
-     1562, 2353, 1558, 1557, 2354, 1556, 2212, 2212, 2212, 1386,
-     1555, 2205, 2215, 2215, 2215, 1554, 2216, 1553, 1552, 2217,
-     1416, 1416, 1416, 2339, 2213, 2218, 2218, 2218, 1551, 2219,
-     1549, 1548, 2220, 1546, 1424, 1424, 1424, 1545, 1418, 1432,
-     1432, 1432, 2226, 2226, 2226, 1544, 2227, 1541, 1539, 2228,
-     1536, 2350, 1426, 1534, 2229, 2229, 2229, 1434, 2230, 1531,
-
-     1522, 2231, 1442, 1442, 1442, 1520, 2370, 2370, 2370, 1513,
-     1511, 2365, 3322, 3322, 3322, 2368, 3322, 3322, 3322, 1510,
-     1444, 1509, 2369, 2371, 3322, 3322, 3322, 1508, 1507, 3322,
-     1451, 1451, 1451, 3322, 1457, 1457, 1457, 2378, 2378, 2378,
-     2367, 3322, 2380, 2380, 2380, 2383, 2383, 2383, 1453, 2245,
-     2245, 2245, 1459, 2246, 1506, 2379, 2247, 1159, 1159, 1159,
-     1146, 1505, 1504, 2372, 2249, 2249, 2249, 2385, 2385, 2385,
-     2386, 2386, 2386, 1503, 1502, 1161, 2254, 2254, 2254, 1499,
-     2373, 1498, 1497, 2374, 2255, 2255, 2255, 2257, 2257, 2257,
-     2390, 2390, 2390, 1496, 2377, 2375, 2391, 2391, 2391, 2392,
-
-     2392, 2392, 2261, 2261, 2261, 2262, 2262, 2262, 2265, 2265,
-     2265, 2266, 2266, 2266, 1495, 1494, 2384, 2267, 2267, 2267,
-     2268, 2268, 2268, 2396, 2396, 2396, 2399, 2399, 2399, 2274,
-     2274, 2274, 1493, 2275, 1491, 1490, 2276, 3322, 3322, 3322,
-     1489, 2397, 1488, 2400, 2278, 2278, 2278, 1487, 2280, 2280,
-     2280, 1486, 2281, 1485, 3322, 2282, 1227, 1227, 1227, 2294,
-     2294, 2294, 2279, 2295, 2418, 2419, 2296, 2420, 2297, 2297,
-     2297, 2423, 2423, 2423, 1229, 2421, 2302, 2302, 2302, 2304,
-     2304, 2304, 2422, 2305, 1483, 1482, 2306, 1258, 1258, 1258,
-     2309, 2309, 2309, 1481, 2310, 1480, 1479, 2311, 2431, 2431,
-
-     2431, 1478, 1477, 2401, 1146, 1260, 2433, 2433, 2433, 1279,
-     1279, 1279, 2443, 2443, 2443, 1471, 2432, 2412, 1310, 1310,
-     1310, 1456, 1455, 2434, 2329, 2329, 2329, 1281, 2330, 1450,
-     1449, 2331, 1448, 2429, 1447, 1446, 1312, 2450, 2450, 2450,
-     2454, 2454, 2454, 2336, 2336, 2336, 1420, 2337, 1408, 1394,
-     2338, 2456, 2456, 2456, 2451, 2344, 2344, 2344, 2455, 1393,
-     2435, 1392, 2462, 2462, 2462, 1384, 1384, 1384, 1388, 2457,
-     2347, 2347, 2347, 2345, 2348, 1383, 1379, 2349, 2444, 2463,
-     2465, 2465, 2465, 1386, 2352, 2352, 2352, 1371, 2353, 1366,
-     1365, 2354, 3322, 3322, 3322, 1359, 1356, 2466, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 2476, 2476, 2476, 1335, 1334, 3322,
-     2478, 2478, 2478, 1333, 1332, 3322, 2464, 1331, 3322, 2480,
-     2480, 2480, 1424, 1424, 1424, 1330, 2467, 1329, 2479, 1328,
-     1432, 1432, 1432, 1442, 1442, 1442, 2481, 2370, 2370, 2370,
-     1426, 1327, 2485, 2485, 2485, 1321, 2486, 2468, 1434, 2487,
-     1314, 1444, 2474, 1303, 2371, 2488, 2488, 2488, 1298, 2469,
-     3322, 3322, 3322, 3322, 3322, 3322, 2492, 2492, 2492, 1297,
-     2484, 1296, 2489, 2494, 2494, 2494, 1291, 3322, 1290, 1289,
-     3322, 1285, 2482, 1284, 2493, 1457, 1457, 1457, 2378, 2378,
-     2378, 2483, 2380, 2380, 2380, 2383, 2383, 2383, 2499, 2499,
-
-     2499, 1283, 1278, 1459, 1277, 1272, 2379, 2385, 2385, 2385,
-     1146, 2490, 1271, 1266, 2491, 1262, 2500, 2386, 2386, 2386,
-     2503, 2503, 2503, 2390, 2390, 2390, 2391, 2391, 2391, 2392,
-     2392, 2392, 2396, 2396, 2396, 2399, 2399, 2399, 2508, 2508,
-     2508, 1257, 2509, 1256, 1252, 2510, 1227, 1227, 1227, 1251,
-     2397, 2495, 2400, 1250, 2496, 2423, 2423, 2423, 2537, 2537,
-     2537, 1258, 1258, 1258, 1229, 2431, 2431, 2431, 2433, 2433,
-     2433, 2542, 2542, 2542, 1249, 2543, 1248, 1247, 2544, 1260,
-     2545, 2545, 2545, 2432, 1246, 2434, 2551, 2551, 2551, 2443,
-     2443, 2443, 1310, 1310, 1310, 2450, 2450, 2450, 2546, 1245,
-
-     2559, 2559, 2559, 2552, 2560, 1244, 2522, 2561, 1243, 1242,
-     1312, 1241, 2451, 2563, 2563, 2563, 2454, 2454, 2454, 2456,
-     2456, 2456, 2567, 2567, 2567, 1240, 1234, 2540, 1226, 1225,
-     2564, 2462, 2462, 2462, 2455, 1224, 1219, 2457, 1218, 2568,
-     2570, 2570, 2570, 1217, 2571, 1214, 1208, 2572, 2463, 2553,
-     2573, 2573, 2573, 2465, 2465, 2465, 2575, 2575, 2575, 1203,
-     2576, 1202, 1198, 2577, 3322, 3322, 3322, 1193, 2574, 1192,
-     2466, 3322, 3322, 3322, 3322, 3322, 3322, 2583, 2583, 2583,
-     1191, 3322, 2476, 2476, 2476, 2478, 2478, 2478, 3322, 1190,
-     1189, 3322, 1188, 1187, 2584, 2480, 2480, 2480, 2587, 2587,
-
-     2587, 1185, 2588, 2479, 1184, 2589, 2590, 2590, 2590, 1432,
-     1432, 1432, 2481, 1442, 1442, 1442, 2578, 1183, 2485, 2485,
-     2485, 1182, 2486, 1181, 2591, 2487, 1180, 1434, 1179, 2579,
-     1178, 1444, 2580, 2488, 2488, 2488, 2594, 2594, 2594, 1177,
-     2595, 1176, 1175, 2596, 2597, 2597, 2597, 2599, 2599, 2599,
-     2489, 2492, 2492, 2492, 2494, 2494, 2494, 2601, 2601, 2601,
-     1174, 2598, 1173, 1172, 2600, 2499, 2499, 2499, 1171, 2493,
-     2503, 2503, 2503, 1170, 1169, 2602, 2592, 2593, 2611, 2611,
-     2611, 1168, 1167, 2500, 2508, 2508, 2508, 1166, 2509, 1165,
-     1158, 2510, 1227, 1227, 1227, 2612, 2537, 2537, 2537, 1258,
-
-     1258, 1258, 2542, 2542, 2542, 1157, 2543, 1156, 1155, 2544,
-     1229, 2545, 2545, 2545, 2650, 2650, 2650, 1260, 2551, 2551,
-     2551, 2652, 2652, 2652, 1154, 2653, 1153, 1152, 2654, 2546,
-     1149, 2651, 2655, 2655, 2655, 2552, 2660, 2660, 2660, 2559,
-     2559, 2559, 1147, 2560, 1146, 1144, 2561, 2563, 2563, 2563,
-     2656, 1142, 2630, 2661, 2664, 2664, 2664, 1139, 2665, 1135,
-     1133, 2666, 1132, 1131, 2564, 2668, 2668, 2668, 1129, 1128,
-     2647, 2567, 2567, 2567, 2670, 2670, 2670, 1127, 2671, 1126,
-     1125, 2672, 2669, 2673, 2673, 2673, 1124, 1122, 2568, 2570,
-     2570, 2570, 1121, 2571, 1120, 1119, 2572, 2573, 2573, 2573,
-
-     2674, 2575, 2575, 2575, 1117, 2576, 1116, 1115, 2577, 3322,
-     3322, 3322, 3322, 3322, 3322, 2574, 3322, 3322, 3322, 2583,
-     2583, 2583, 1111, 2678, 2678, 2678, 3322, 2679, 1110, 3322,
-     2680, 1108, 1107, 3322, 1106, 1105, 2584, 2681, 2681, 2681,
-     2683, 2683, 2683, 2587, 2587, 2587, 1104, 2588, 1103, 1101,
-     2589, 2590, 2590, 2590, 2682, 1100, 1099, 2684, 1432, 1432,
-     1432, 1098, 1096, 2676, 2675, 1442, 1442, 1442, 1095, 2591,
-     1094, 2677, 1091, 2594, 2594, 2594, 1434, 2595, 1090, 1088,
-     2596, 1085, 1084, 1444, 2597, 2597, 2597, 2693, 2693, 2693,
-     1080, 2694, 1079, 1077, 2695, 2599, 2599, 2599, 2696, 2696,
-
-     2696, 2598, 2697, 1076, 1075, 2698, 1072, 2601, 2601, 2601,
-     1071, 1070, 2600, 2703, 2703, 2703, 2611, 2611, 2611, 1227,
-     1227, 1227, 1069, 1067, 2691, 2602, 2692, 2707, 2707, 2707,
-     1066, 2708, 1065, 2612, 2709, 1064, 1063, 1229, 2741, 2741,
-     2741, 2743, 2743, 2743, 1258, 1258, 1258, 2746, 2746, 2746,
-     2748, 2748, 2748, 1058, 2650, 2650, 2650, 1056, 2744, 2751,
-     2751, 2751, 1260, 2752, 2747, 1055, 2753, 2749, 1054, 1053,
-     2727, 2651, 2652, 2652, 2652, 1052, 2653, 1051, 1050, 2654,
-     2655, 2655, 2655, 2756, 2756, 2756, 2660, 2660, 2660, 1049,
-     2758, 2758, 2758, 1048, 2759, 1047, 2750, 2760, 2656, 1044,
-
-     2757, 1041, 1040, 2661, 1039, 1033, 2745, 2761, 2761, 2761,
-     2664, 2664, 2664, 1032, 2665, 1030, 1027, 2666, 2668, 2668,
-     2668, 2765, 2765, 2765, 2762, 2766, 1025, 1024, 2767, 2670,
-     2670, 2670, 1023, 2671, 1018, 2669, 2672, 2673, 2673, 2673,
-     2768, 2768, 2768, 1017, 2769, 1015, 1014, 2770, 3322, 3322,
-     3322, 2772, 2772, 2772, 2674, 3322, 3322, 3322, 1013, 2678,
-     2678, 2678, 1011, 2679, 1010, 3322, 2680, 1009, 2773, 2681,
-     2681, 2681, 3322, 2775, 2775, 2775, 1007, 2776, 1004, 1003,
-     2777, 2683, 2683, 2683, 1001, 1000, 2682, 2778, 2778, 2778,
-      997, 2779,  992,  991, 2780, 1432, 1432, 1432, 2684, 1442,
-
-     1442, 1442,  988,  987, 2774,  986, 2771, 2693, 2693, 2693,
-      983, 2694,  982, 1434, 2695,  980,  977, 1444, 2696, 2696,
-     2696,  975, 2697,  974,  973, 2698, 2795, 2795, 2795, 2703,
-     2703, 2703, 2798, 2798, 2798, 2707, 2707, 2707,  972, 2708,
-      970,  969, 2709, 2796, 1689,  968, 2787, 2809, 2809, 2809,
-     1227, 1227, 1227, 2741, 2741, 2741, 2833, 2833, 2833, 2743,
-     2743, 2743,  967,  966, 2810,  965, 2788,  962, 1229,  961,
-     2834, 2834, 2834,  960, 2835,  957, 2744, 2836, 1258, 1258,
-     1258, 2746, 2746, 2746, 2838, 2838, 2838,  954, 2839,  953,
-      951, 2840, 2748, 2748, 2748,  950, 1260,  947, 2747, 2819,
-
-     2841, 2841, 2841,  944, 2842,  941,  940, 2843,  932, 2749,
-     2751, 2751, 2751,  931, 2752,  930,  929, 2753, 2756, 2756,
-     2756, 2847, 2847, 2847,  923, 2848,  922,  921, 2849, 2837,
-     2758, 2758, 2758,  919, 2759, 2757,  918, 2760, 2761, 2761,
-     2761, 2850, 2850, 2850,  917, 2851,  916,  915, 2852, 2765,
-     2765, 2765,  914, 2766,  909, 2762, 2767, 2768, 2768, 2768,
-      906, 2769,  908,  903, 2770, 3322, 3322, 3322, 2772, 2772,
-     2772, 2856, 2856, 2856,  902, 2857,  900,  898, 2858, 3322,
-     3322, 3322, 3322,  896,  894, 2773, 2775, 2775, 2775,  892,
-     2776,  889,  888, 2777,  887,  886, 3322, 2778, 2778, 2778,
-
-      885, 2779,  883,  881, 2780, 2874, 2874, 2874, 1442, 1442,
-     1442, 2882, 2882, 2882,  880,  879, 2855, 2795, 2795, 2795,
-     2884, 2884, 2884, 2875, 2885,  877, 1444, 2886, 2883, 1689,
-     2887, 2887, 2887,  875, 2796, 1689,  874,  872, 1689, 2798,
-     2798, 2798, 2888, 2888, 2888, 2889, 2889, 2889,  870,  869,
-     2859, 2809, 2809, 2809, 2898, 2898, 2898,  867, 2899,  863,
-      862, 2900, 1227, 1227, 1227, 2916, 2916, 2916, 2810, 2833,
-     2833, 2833,  860,  855, 2876, 2834, 2834, 2834,  853, 2835,
-     1229,  849, 2836, 2917, 2917, 2917, 2838, 2838, 2838,  848,
-     2839,  847,  845, 2840,  843, 2841, 2841, 2841,  842, 2842,
-
-      841, 2918, 2843, 2847, 2847, 2847,  839, 2848,  837,  836,
-     2849, 2850, 2850, 2850,  834, 2851,  832,  831, 2852, 2922,
-     2922, 2922, 2925, 2925, 2925, 2856, 2856, 2856, 2907, 2857,
-      830,  829, 2858, 2927, 2927, 2927, 2923,  828,  827, 2926,
-     2874, 2874, 2874, 1442, 1442, 1442, 2882, 2882, 2882,  826,
-     2928,  824, 2947, 2947, 2947,  822, 2948,  821, 2875, 2949,
-      818, 1444,  817, 2883, 1689, 2884, 2884, 2884,  816, 2885,
-     1689,  814, 2886, 2887, 2887, 2887, 2888, 2888, 2888, 2889,
-     2889, 2889,  802, 1689, 2898, 2898, 2898,  801, 2899,  798,
-      796, 2900,  794,  793, 2941, 1687, 1687, 1687, 1687, 1687,
-
-     1687, 1687, 1687, 1687,  792,  790, 1687, 2966, 2966, 2966,
-      788, 1687, 1687, 1687, 1689, 1687, 2916, 2916, 2916, 2917,
-     2917, 2917, 2922, 2922, 2922, 2967, 2977, 2977, 2977,  786,
-     2978,  783,  780, 2979, 2925, 2925, 2925, 2918,  779, 2923,
-     1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687,
-     1687, 2926,  778, 1687, 2927, 2927, 2927,  776, 1687, 1687,
-     1687, 1689, 1687, 2981, 2981, 2981,  774, 2982,  773,  771,
-     2983, 2928, 2984, 2984, 2984,  769, 2985,  768,  766, 2986,
-     2999, 2999, 2999, 2966, 2966, 2966,  764, 1687, 1687, 2947,
-     2947, 2947,  763, 2948,  762,  760, 2949,  758, 3000,  757,
-
-      756, 2967, 2999, 2999, 2999,  755,  753, 1689, 1687, 1687,
-     1687, 1687, 1687, 3011, 1687, 1687, 1687, 3322,  700, 1687,
-     3000,  733,  732,  730, 1687, 1687, 1687, 1689, 1687, 2977,
-     2977, 2977,  728, 2978,  727,  726, 2979, 2981, 2981, 2981,
-      724, 2982,  720,  716, 2983, 2984, 2984, 2984,  715, 2985,
-      713,  712, 2986, 1687, 1687, 1687, 1687, 1687, 1687, 1687,
-     1687, 1687, 1687, 3011,  709,  708, 1687, 3048, 3048, 3048,
-      707, 1687, 1687, 1687, 1689, 1687, 3057, 3057, 3057, 3059,
-     3059, 3059, 3061, 3061, 3061, 1689, 1690, 3069, 3069, 3069,
-     3079, 3079, 3079, 3058,  705,  704, 3060,  703,  701, 3062,
-
-     1687, 1687,  696, 3322, 3070, 3048, 3048, 3048, 1146, 3057,
-     3057, 3057, 3087, 3087, 3087,  676, 3088,  674,  672, 3089,
-     3059, 3059, 3059, 1689,  666,  665, 3058, 3090, 3090, 3090,
-      666, 3091,  665,  664, 3092,  663, 3322, 3060, 3061, 3061,
-     3061, 3093, 3093, 3093, 3322, 3094, 3322, 3322, 3095, 3069,
-     3069, 3069, 3079, 3079, 3079, 3062, 1886, 3102, 3102, 3102,
-     3322, 3103, 3322, 3322, 3104, 3322, 3070, 3087, 3087, 3087,
-     1146, 3088, 3322, 3322, 3089, 3090, 3090, 3090, 3322, 3091,
-     3322, 3322, 3092, 3093, 3093, 3093, 3322, 3094, 3322, 3113,
-     3095, 3102, 3102, 3102, 3322, 3103, 3322, 3322, 3104, 3218,
-
-     3218, 3218, 3218, 3218, 3218, 3322, 3227, 3322, 3322, 3228,
-     3320, 3320, 3320, 3320, 3320, 3320, 3322, 1146, 3322, 3322,
-     1146, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3321, 3322,
-     3322, 3321,  260,  260,  260,  260,  260,  260,  260,  260,
-      260,  261,  261,  261,  261,  261,  261,  261,  261,  261,
-      266,  266,  266,  266,  266,  266,  266,  266,  266,  269,
-      269,  269,  269,  269,  269,  269,  269,  269,  272,  272,
-      272,  272,  272,  272,  272,  272,  272,  275,  275,  275,
-      275,  275,  275,  275,  275,  275,  282,  282,  282,  282,
-      282,  282,  282,  282,  282,  290,  290,  290,  290,  290,
-
-      290,  290,  290,  290,  294,  294,  294,  294,  294,  294,
-      294,  294,  294,  306,  306,  306,  306,  306,  306,  306,
-      306,  306,  310,  310,  310,  310,  310,  310,  310,  310,
-      310,  317,  317,  317,  317,  317,  317,  317,  317,  317,
-      328,  328,  328,  328,  328,  328,  328,  328,  328,  336,
-      336,  336,  336,  336,  336,  336,  336,  336,  342,  342,
-      342,  342,  342,  342,  342,  342,  342,  348,  348,  348,
-      348,  348,  348,  348,  348,  348,  354,  354,  354,  354,
-      354,  354,  354,  354,  354,  359,  359,  359,  359,  359,
-      359,  359,  359,  359,  378,  378,  378,  378,  378,  378,
-
-      378,  378,  378,  385,  385,  385,  385,  385,  385,  385,
-      385,  385,  392,  392,  392,  392,  392,  392,  392,  392,
-      392,  398,  398,  398,  398,  398,  398,  398,  398,  398,
-      405,  405,  405,  405,  405,  405,  405,  405,  405,  410,
-      410,  410,  410,  410,  410,  410,  410,  410,  416,  416,
-      416,  416,  416,  416,  416,  416,  416,  421,  421,  421,
-      421,  421,  421,  421,  421,  421,  427,  427,  427,  427,
-      427,  427,  427,  427,  427,  435,  435,  435,  435,  435,
-      435,  435,  435,  435,  443,  443,  443,  443,  443,  443,
-      443,  443,  443,  447,  447,  447,  447,  447,  447,  447,
-
-      447,  447,  453,  453,  453,  453,  453,  453,  453,  453,
-      453,  459,  459,  459,  459,  459,  459,  459,  459,  459,
-      476,  476,  476,  476,  476,  476,  476,  476,  476,  483,
-      483,  483,  483,  483,  483,  483,  483,  483,  492,  492,
-      492,  492,  492,  492,  492,  492,  492,  498,  498,  498,
-      498,  498,  498,  498,  498,  498,  508,  508,  508,  508,
-      508,  508,  508,  508,  508,  514,  514,  514,  514,  514,
-      514,  514,  514,  514,  519,  519,  519,  519,  519,  519,
-      519,  519,  519,  525,  525,  525,  525,  525,  525,  525,
-      525,  525,  531,  531,  531,  531,  531,  531,  531,  531,
-
-      531,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      544,  544,  544,  544,  544,  544,  544,  544,  544,  551,
-      551,  551,  551,  551,  551,  551,  551,  551,  556,  556,
-      556,  556,  556,  556,  556,  556,  556,  564,  564,  564,
-      564,  564,  564,  564,  564,  564,  570,  570,  570,  570,
-      570,  570,  570,  570,  570,  577,  577,  577,  577,  577,
-      577,  577,  577,  577,  582,  582,  582,  582,  582,  582,
-      582,  582,  582,  588,  588,  588,  588,  588,  588,  588,
-      588,  588,  593,  593,  593,  593,  593,  593,  593,  593,
-      593,  600,  600,  600,  600,  600,  600,  600,  600,  600,
-
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  613,
-      613,  613,  613,  613,  613,  613,  613,  613,  621,  621,
-      621,  621,  621,  621,  621,  621,  621,  629,  629,  629,
-      629,  629,  629,  629,  629,  629,  633,  633,  633,  633,
-      633,  633,  633,  633,  633,  639,  639,  639,  639,  639,
-      639,  639,  639,  639,  643,  643,  643,  643,  643,  643,
-      643,  643,  643,  650,  650,  650,  650,  650,  650,  650,
-      650,  650,  655,  655,  655,  655,  655,  655,  655,  655,
-      655,  675,  675,  675, 3322, 3322, 3322,  675,  702,  702,
-      702, 3322, 3322, 3322,  702,  706,  706,  706, 3322, 3322,
-
-     3322,  706,  714,  714,  714, 3322, 3322, 3322,  714,  725,
-      725,  725, 3322, 3322, 3322,  725,  731,  731,  731, 3322,
-     3322, 3322,  731,  754,  754,  754, 3322, 3322, 3322,  754,
-      761,  761,  761, 3322, 3322, 3322,  761,  767,  767,  767,
-     3322, 3322, 3322,  767,  772,  772,  772, 3322, 3322, 3322,
-      772,  777,  777,  777, 3322, 3322, 3322,  777,  787,  787,
-      787, 3322, 3322, 3322,  787,  791,  791,  791, 3322, 3322,
-     3322,  791,  797,  797,  797, 3322, 3322, 3322,  797,  815,
-      815,  815, 3322, 3322, 3322,  815,  825,  825,  825, 3322,
-     3322, 3322,  825,  835,  835,  835, 3322, 3322, 3322,  835,
-
-      840,  840,  840, 3322, 3322, 3322,  840,  846,  846,  846,
-     3322, 3322, 3322,  846,  854,  854,  854, 3322, 3322, 3322,
-      854,  861,  861,  861, 3322, 3322, 3322,  861,  868,  868,
-      868, 3322, 3322, 3322,  868,  873,  873,  873, 3322, 3322,
-     3322,  873,  878,  878,  878, 3322, 3322, 3322,  878,  884,
-      884,  884, 3322, 3322, 3322,  884,  893,  893,  893, 3322,
-     3322, 3322,  893,  897,  897,  897, 3322, 3322, 3322,  897,
-      901,  901,  901, 3322, 3322, 3322,  901,  905,  905,  905,
-      905,  905,  905,  905, 3322,  905,  675,  675,  675, 3322,
-     3322, 3322,  675,  920, 3322, 3322, 3322,  920,  702,  702,
-
-      702, 3322, 3322, 3322,  702,  952, 3322, 3322, 3322,  952,
-      706,  706,  706, 3322, 3322, 3322,  706,  959, 3322, 3322,
-     3322,  959,  714,  714,  714, 3322, 3322, 3322,  714,  971,
-     3322, 3322, 3322,  971,  725,  725,  725, 3322, 3322, 3322,
-      725,  976, 3322, 3322, 3322,  976,  731,  731,  731, 3322,
-     3322, 3322,  731,  981, 3322, 3322, 3322,  981,  754,  754,
-      754, 3322, 3322, 3322,  754, 1002, 3322, 3322, 3322, 1002,
-      761,  761,  761, 3322, 3322, 3322,  761, 1008, 3322, 3322,
-     3322, 1008,  767,  767,  767, 3322, 3322, 3322,  767, 1012,
-     3322, 3322, 3322, 1012,  772,  772,  772, 3322, 3322, 3322,
-
-      772, 1016, 3322, 3322, 3322, 1016,  777,  777,  777, 3322,
-     3322, 3322,  777, 1026, 3322, 3322, 3322, 1026,  787,  787,
-      787, 3322, 3322, 3322,  787, 1031, 3322, 3322, 3322, 1031,
-      791,  791,  791, 3322, 3322, 3322,  791, 1038, 3322, 3322,
-     3322, 1038,  797,  797,  797, 3322, 3322, 3322,  797, 1057,
-     3322, 3322, 3322, 1057,  815,  815,  815, 3322, 3322, 3322,
-      815, 1068, 3322, 3322, 3322, 1068,  825,  825,  825, 3322,
-     3322, 3322,  825, 1078, 3322, 3322, 3322, 1078,  835,  835,
-      835, 3322, 3322, 3322,  835, 1083, 3322, 3322, 3322, 1083,
-      840,  840,  840, 3322, 3322, 3322,  840, 1089, 3322, 3322,
-
-     3322, 1089,  846,  846,  846, 3322, 3322, 3322,  846, 1097,
-     3322, 3322, 3322, 1097,  854,  854,  854, 3322, 3322, 3322,
-      854, 1102, 3322, 3322, 3322, 1102,  861,  861,  861, 3322,
-     3322, 3322,  861, 1109, 3322, 3322, 3322, 1109,  868,  868,
-      868, 3322, 3322, 3322,  868, 1114, 3322, 3322, 3322, 1114,
-      873,  873,  873, 3322, 3322, 3322,  873, 1118, 3322, 3322,
-     3322, 1118,  878,  878,  878, 3322, 3322, 3322,  878, 1123,
-     3322, 3322, 3322, 1123,  884,  884,  884, 3322, 3322, 3322,
-      884, 1130, 3322, 3322, 3322, 1130,  893,  893,  893, 3322,
-     3322, 3322,  893, 1134, 3322, 3322, 3322, 1134,  897,  897,
-
-      897, 3322, 3322, 3322,  897, 1138, 3322, 3322, 3322, 1138,
-      901,  901,  901, 3322, 3322, 3322,  901, 1143, 3322, 3322,
-     3322, 1143, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
-     1145, 1151, 3322, 3322, 3322, 3322, 1151,  675,  675,  675,
-     3322, 3322, 3322,  675, 1160, 1160, 1160, 1160, 3322, 3322,
-     1160, 1160,  702,  702,  702, 3322, 3322, 3322,  702, 1195,
-     1195, 1195, 1195, 3322, 3322, 1195, 1195,  706,  706,  706,
-     3322, 3322, 3322,  706, 1205, 1205, 1205, 1205, 3322, 3322,
-     1205, 1205,  714,  714,  714, 3322, 3322, 3322,  714, 1221,
-     1221, 1221, 1221, 3322, 3322, 1221, 1221,  725,  725,  725,
-
-     3322, 3322, 3322,  725, 1228, 1228, 1228, 1228, 3322, 3322,
-     1228, 1228,  731,  731,  731, 3322, 3322, 3322,  731, 1236,
-     1236, 1236, 1236, 3322, 3322, 1236, 1236,  754,  754,  754,
-     3322, 3322, 3322,  754, 1259, 1259, 1259, 1259, 3322, 3322,
-     1259, 1259,  761,  761,  761, 3322, 3322, 3322,  761, 1268,
-     1268, 1268, 1268, 3322, 3322, 1268, 1268,  767,  767,  767,
-     3322, 3322, 3322,  767, 1274, 1274, 1274, 1274, 3322, 3322,
-     1274, 1274,  772,  772,  772, 3322, 3322, 3322,  772, 1280,
-     1280, 1280, 1280, 3322, 3322, 1280, 1280,  777,  777,  777,
-     3322, 3322, 3322,  777, 1293, 1293, 1293, 1293, 3322, 3322,
-
-     1293, 1293,  787,  787,  787, 3322, 3322, 3322,  787, 1300,
-     1300, 1300, 1300, 3322, 3322, 1300, 1300,  791,  791,  791,
-     3322, 3322, 3322,  791, 1311, 1311, 1311, 1311, 3322, 3322,
-     1311, 1311,  797,  797,  797, 3322, 3322, 3322,  797, 1337,
-     1337, 1337, 1337, 3322, 3322, 1337, 1337,  815,  815,  815,
-      815, 3322,  815, 3322,  815, 1353, 1353, 1353, 1353, 3322,
-     3322, 1353, 1353,  825,  825,  825, 3322, 3322, 3322,  825,
-     1368, 1368, 1368, 1368, 3322, 3322, 1368, 1368,  835,  835,
-      835, 3322, 3322, 3322,  835, 1376, 1376, 1376, 1376, 3322,
-     3322, 1376, 1376,  840,  840,  840, 3322, 3322, 3322,  840,
-
-     1385, 1385, 1385, 1385, 3322, 3322, 1385, 1385,  846,  846,
-      846, 3322, 3322, 3322,  846, 1396, 1396, 1396, 1396, 3322,
-     3322, 1396, 1396,  854,  854,  854,  854, 3322,  854, 3322,
-      854, 1405, 1405, 1405, 1405, 3322, 3322, 1405, 1405,  861,
-      861,  861,  861, 3322,  861, 3322,  861, 1417, 1417, 1417,
-     1417, 3322, 3322, 1417, 1417,  868,  868,  868, 3322, 3322,
-     3322,  868, 1425, 1425, 1425, 1425, 3322, 3322, 1425, 1425,
-      873,  873,  873,  873, 3322,  873, 3322,  873, 1433, 1433,
-     1433, 1433, 3322, 3322, 1433, 1433,  878,  878,  878,  878,
-     3322,  878, 3322,  878, 1443, 1443, 1443, 1443, 3322, 3322,
-
-     1443, 1443,  884,  884,  884, 3322, 3322, 3322,  884, 1452,
-     1452, 1452, 1452, 3322, 3322, 1452, 1452,  893,  893,  893,
-     3322, 3322, 3322,  893, 1458, 1458, 1458, 1458, 3322, 3322,
-     1458, 1458, 1465, 1465, 1465, 1465, 3322, 3322, 1465, 1465,
-      901,  901,  901, 3322, 3322, 3322,  901, 1473, 1473, 1473,
-     1473, 3322, 3322, 1473, 1473, 1145, 1145, 1145, 1145, 1145,
-     1145, 1145, 1145, 1145, 1151, 3322, 1151, 3322, 3322, 1151,
-      675,  675,  675, 3322, 3322, 3322,  675, 1160, 1160, 1160,
-     1160, 3322, 3322, 1160, 1160,  702,  702,  702,  702, 3322,
-      702, 3322,  702, 1195, 1195, 1195, 1195, 3322, 3322, 1195,
-
-     1195,  706,  706,  706,  706, 3322,  706, 3322,  706, 1205,
-     1205, 1205, 1205, 3322, 3322, 1205, 1205,  714,  714,  714,
-     3322, 3322, 3322,  714, 1221, 1221, 1221, 1221, 3322, 3322,
-     1221, 1221,  725,  725,  725, 3322, 3322, 3322,  725, 1228,
-     1228, 1228, 1228, 3322, 3322, 1228, 1228,  731,  731,  731,
-     3322, 3322, 3322,  731, 1236, 1236, 1236, 1236, 3322, 3322,
-     1236, 1236,  754,  754,  754, 3322, 3322, 3322,  754, 1259,
-     1259, 1259, 1259, 3322, 3322, 1259, 1259,  761,  761,  761,
-     3322, 3322, 3322,  761, 1268, 1268, 1268, 1268, 3322, 3322,
-     1268, 1268,  767,  767,  767,  767, 3322,  767, 3322,  767,
-
-     1274, 1274, 1274, 1274, 3322, 3322, 1274, 1274,  772,  772,
-      772,  772, 3322,  772, 3322,  772, 1280, 1280, 1280, 1280,
-     3322, 3322, 1280, 1280,  777,  777,  777, 3322, 3322, 3322,
-      777, 1293, 1293, 1293, 1293, 3322, 3322, 1293, 1293,  787,
-      787,  787,  787, 3322,  787, 3322,  787, 1300, 1300, 1300,
-     1300, 3322, 3322, 1300, 1300,  791,  791,  791,  791, 3322,
-      791, 3322,  791, 1311, 1311, 1311, 1311, 3322, 3322, 1311,
-     1311,  797,  797,  797, 3322, 3322, 3322,  797, 1337, 1337,
-     1337, 1337, 3322, 3322, 1337, 1337,  815,  815,  815, 3322,
-     3322, 3322,  815, 1353, 1353, 1353, 1353, 3322, 3322, 1353,
-
-     1353,  825,  825,  825, 3322, 3322, 3322,  825, 1368, 1368,
-     1368, 1368, 3322, 3322, 1368, 1368,  835,  835,  835, 3322,
-     3322, 3322,  835, 1376, 1376, 1376, 1376, 3322, 3322, 1376,
-     1376,  840,  840,  840, 3322, 3322, 3322,  840, 1385, 1385,
-     1385, 1385, 3322, 3322, 1385, 1385,  846,  846,  846, 3322,
-     3322, 3322,  846, 1396, 1396, 1396, 1396, 3322, 3322, 1396,
-     1396,  854,  854,  854, 3322, 3322, 3322,  854, 1405, 1405,
-     1405, 1405, 3322, 3322, 1405, 1405,  861,  861,  861, 3322,
-     3322, 3322,  861, 1417, 1417, 1417, 1417, 3322, 3322, 1417,
-     1417,  868,  868,  868, 3322, 3322, 3322,  868, 1425, 1425,
-
-     1425, 1425, 3322, 3322, 1425, 1425, 1433, 1433, 1433, 1433,
-     3322, 3322, 1433, 1433,  878,  878,  878, 3322, 3322, 3322,
-      878, 1443, 1443, 1443, 1443, 3322, 3322, 1443, 1443,  884,
-      884,  884, 3322, 3322, 3322,  884, 1452, 1452, 1452, 1452,
-     3322, 3322, 1452, 1452,  893,  893,  893, 3322, 3322, 3322,
-      893, 1458, 1458, 1458, 1458, 3322, 3322, 1458, 1458, 1465,
-     1465, 1465, 1465, 3322, 3322, 1465, 1465,  901,  901,  901,
-     3322, 3322, 3322,  901, 1473, 1473, 1473, 1473, 3322, 3322,
-     1473, 1473, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
-     1145, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687,
-
-      675,  675,  675, 3322, 3322, 3322,  675, 1160, 1160, 1160,
-     1160, 3322, 3322, 1160, 1160, 1195, 1195, 1195, 1195, 3322,
-     3322, 1195, 1195,  706,  706,  706, 3322, 3322, 3322,  706,
-     1205, 1205, 1205, 1205, 3322, 3322, 1205, 1205,  714,  714,
-      714, 3322, 3322, 3322,  714, 1221, 1221, 1221, 1221, 3322,
-     3322, 1221, 1221,  725,  725,  725, 3322, 3322, 3322,  725,
-     1228, 1228, 1228, 1228, 3322, 3322, 1228, 1228,  731,  731,
-      731, 3322, 3322, 3322,  731,  754,  754,  754, 3322, 3322,
-     3322,  754, 1259, 1259, 1259, 1259, 3322, 3322, 1259, 1259,
-      761,  761,  761, 3322, 3322, 3322,  761, 1268, 1268, 1268,
-
-     1268, 3322, 3322, 1268, 1268,  767,  767,  767, 3322, 3322,
-     3322,  767, 1274, 1274, 1274, 1274, 3322, 3322, 1274, 1274,
-      772,  772,  772, 3322, 3322, 3322,  772, 1280, 1280, 1280,
-     1280, 3322, 3322, 1280, 1280,  777,  777,  777, 3322, 3322,
-     3322,  777, 1293, 1293, 1293, 1293, 3322, 3322, 1293, 1293,
-     1300, 1300, 1300, 1300, 3322, 3322, 1300, 1300, 1311, 1311,
-     1311, 1311, 3322, 3322, 1311, 1311,  797,  797,  797, 3322,
-     3322, 3322,  797, 1337, 1337, 1337, 1337, 3322, 3322, 1337,
-     1337,  815,  815,  815,  815, 3322,  815, 3322,  815, 1353,
-     1353, 1353, 1353, 3322, 3322, 1353, 1353,  825,  825,  825,
-
-     3322, 3322, 3322,  825, 1368, 1368, 1368, 1368, 3322, 3322,
-     1368, 1368,  835,  835,  835, 3322, 3322, 3322,  835, 1376,
-     1376, 1376, 1376, 3322, 3322, 1376, 1376,  840,  840,  840,
-     3322, 3322, 3322,  840, 1385, 1385, 1385, 1385, 3322, 3322,
-     1385, 1385,  846,  846,  846, 3322, 3322, 3322,  846, 1396,
-     1396, 1396, 1396, 3322, 3322, 1396, 1396,  854,  854,  854,
-     3322, 3322, 3322,  854, 1405, 1405, 1405, 1405, 3322, 3322,
-     1405, 1405,  861,  861,  861, 3322, 3322, 3322,  861, 1417,
-     1417, 1417, 1417, 3322, 3322, 1417, 1417,  868,  868,  868,
-     3322, 3322, 3322,  868, 1425, 1425, 1425, 1425, 3322, 3322,
-
-     1425, 1425, 1433, 1433, 1433, 1433, 3322, 3322, 1433, 1433,
-      878,  878,  878, 3322, 3322, 3322,  878, 1443, 1443, 1443,
-     1443, 3322, 3322, 1443, 1443,  884,  884,  884, 3322, 3322,
-     3322,  884, 1452, 1452, 1452, 1452, 3322, 3322, 1452, 1452,
-      893,  893,  893,  893, 3322,  893, 3322,  893, 1458, 1458,
-     1458, 1458, 3322, 3322, 1458, 1458, 1465, 1465, 1465, 1465,
-     3322, 3322, 1465, 1465,  901,  901,  901,  901, 3322,  901,
-     3322,  901, 1473, 1473, 1473, 1473, 3322, 3322, 1473, 1473,
-     1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1687,
-     1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687,  675,  675,
-
-      675, 3322, 3322, 3322,  675, 1160, 1160, 1160, 1160, 3322,
-     3322, 1160, 1160, 1195, 1195, 1195, 1195, 3322, 3322, 1195,
-     1195,  706,  706,  706, 3322, 3322, 3322,  706, 1205, 1205,
-     1205, 1205, 3322, 3322, 1205, 1205,  714,  714,  714, 3322,
-     3322, 3322,  714, 1221, 1221, 1221, 1221, 3322, 3322, 1221,
-     1221,  725,  725,  725, 3322, 3322, 3322,  725, 1228, 1228,
-     1228, 1228, 3322, 3322, 1228, 1228,  731,  731,  731, 3322,
-     3322, 3322,  731,  754,  754,  754, 3322, 3322, 3322,  754,
-     1259, 1259, 1259, 1259, 3322, 3322, 1259, 1259,  761,  761,
-      761, 3322, 3322, 3322,  761, 1268, 1268, 1268, 1268, 3322,
-
-     3322, 1268, 1268,  767,  767,  767, 3322, 3322, 3322,  767,
-     1274, 1274, 1274, 1274, 3322, 3322, 1274, 1274,  772,  772,
-      772,  772, 3322,  772, 3322,  772, 1280, 1280, 1280, 1280,
-     3322, 3322, 1280, 1280,  777,  777,  777, 3322, 3322, 3322,
-      777, 1293, 1293, 1293, 1293, 3322, 3322, 1293, 1293, 1311,
-     1311, 1311, 1311, 3322, 3322, 1311, 1311,  797,  797,  797,
-     3322, 3322, 3322,  797, 1337, 1337, 1337, 1337, 3322, 3322,
-     1337, 1337,  815,  815,  815,  815, 3322,  815, 3322,  815,
-     1353, 1353, 1353, 1353, 3322, 3322, 1353, 1353,  825,  825,
-      825, 3322, 3322, 3322,  825, 1368, 1368, 1368, 1368, 3322,
-
-     3322, 1368, 1368,  835,  835,  835, 3322, 3322, 3322,  835,
-     1376, 1376, 1376, 1376, 3322, 3322, 1376, 1376,  840,  840,
-      840, 3322, 3322, 3322,  840, 1385, 1385, 1385, 1385, 3322,
-     3322, 1385, 1385,  846,  846,  846, 3322, 3322, 3322,  846,
-     1396, 1396, 1396, 1396, 3322, 3322, 1396, 1396,  854,  854,
-      854, 3322, 3322, 3322,  854, 1405, 1405, 1405, 1405, 3322,
-     3322, 1405, 1405,  861,  861,  861,  861, 3322,  861, 3322,
-      861, 1417, 1417, 1417, 1417, 3322, 3322, 1417, 1417,  868,
-      868,  868, 3322, 3322, 3322,  868, 1425, 1425, 1425, 1425,
-     3322, 3322, 1425, 1425, 1433, 1433, 1433, 1433, 3322, 3322,
-
-     1433, 1433,  878,  878,  878,  878, 3322,  878, 3322,  878,
-     1443, 1443, 1443, 1443, 3322, 3322, 1443, 1443,  884,  884,
-      884, 3322, 3322, 3322,  884, 1452, 1452, 1452, 1452, 3322,
-     3322, 1452, 1452, 1458, 1458, 1458, 1458, 3322, 3322, 1458,
-     1458, 1465, 1465, 1465, 1465, 3322, 3322, 1465, 1465, 1473,
-     1473, 1473, 1473, 3322, 3322, 1473, 1473, 1145, 1145, 1145,
-     1145, 1145, 1145, 1145, 1145, 1145, 1687, 1687, 1687, 1687,
-     1687, 1687, 1687, 1687, 1687,  675,  675,  675,  675, 3322,
-      675, 3322,  675, 1160, 1160, 1160, 1160, 3322, 3322, 1160,
-     1160, 1195, 1195, 1195, 1195, 3322, 3322, 1195, 1195,  706,
-
-      706,  706, 3322, 3322, 3322,  706, 1205, 1205, 1205, 1205,
-     3322, 3322, 1205, 1205,  714,  714,  714, 3322, 3322, 3322,
-      714, 1221, 1221, 1221, 1221, 3322, 3322, 1221, 1221,  725,
-      725,  725,  725, 3322,  725, 3322,  725, 1228, 1228, 1228,
-     1228, 3322, 3322, 1228, 1228,  731,  731,  731,  731, 3322,
-      731, 3322,  731,  754,  754,  754,  754, 3322,  754, 3322,
-      754, 1259, 1259, 1259, 1259, 3322, 3322, 1259, 1259,  761,
-      761,  761,  761, 3322,  761, 3322,  761, 1268, 1268, 1268,
-     1268, 3322, 3322, 1268, 1268,  767,  767,  767, 3322, 3322,
-     3322,  767, 1274, 1274, 1274, 1274, 3322, 3322, 1274, 1274,
-
-     1280, 1280, 1280, 1280, 3322, 3322, 1280, 1280,  777,  777,
-      777, 3322, 3322, 3322,  777, 1311, 1311, 1311, 1311, 3322,
-     3322, 1311, 1311,  797,  797,  797, 3322, 3322, 3322,  797,
-     1337, 1337, 1337, 1337, 3322, 3322, 1337, 1337,  815,  815,
-      815,  815, 3322,  815, 3322,  815, 1353, 1353, 1353, 1353,
-     3322, 3322, 1353, 1353,  825,  825,  825, 3322, 3322, 3322,
-      825,  835,  835,  835, 3322, 3322, 3322,  835, 1376, 1376,
-     1376, 1376, 3322, 3322, 1376, 1376,  840,  840,  840, 3322,
-     3322, 3322,  840, 1385, 1385, 1385, 1385, 3322, 3322, 1385,
-     1385,  846,  846,  846, 3322, 3322, 3322,  846,  854,  854,
-
-      854, 3322, 3322, 3322,  854, 1405, 1405, 1405, 1405, 3322,
-     3322, 1405, 1405,  861,  861,  861, 3322, 3322, 3322,  861,
-     1417, 1417, 1417, 1417, 3322, 3322, 1417, 1417,  868,  868,
-      868, 3322, 3322, 3322,  868, 1425, 1425, 1425, 1425, 3322,
-     3322, 1425, 1425, 1433, 1433, 1433, 1433, 3322, 3322, 1433,
-     1433, 1443, 1443, 1443, 1443, 3322, 3322, 1443, 1443,  884,
-      884,  884, 3322, 3322, 3322,  884, 1452, 1452, 1452, 1452,
-     3322, 3322, 1452, 1452, 1458, 1458, 1458, 1458, 3322, 3322,
-     1458, 1458, 1465, 1465, 1465, 1465, 3322, 3322, 1465, 1465,
-     1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1687,
-
-     1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1160, 1160,
-     1160, 1160, 3322, 3322, 1160, 1160, 1195, 1195, 1195, 1195,
-     3322, 3322, 1195, 1195,  706,  706,  706, 3322, 3322, 3322,
-      706,  714,  714,  714, 3322, 3322, 3322,  714, 1221, 1221,
-     1221, 1221, 3322, 3322, 1221, 1221, 1228, 1228, 1228, 1228,
-     3322, 3322, 1228, 1228,  754,  754,  754, 3322, 3322, 3322,
-      754, 1259, 1259, 1259, 1259, 3322, 3322, 1259, 1259,  761,
-      761,  761, 3322, 3322, 3322,  761, 1268, 1268, 1268, 1268,
-     3322, 3322, 1268, 1268,  767,  767,  767, 3322, 3322, 3322,
-      767, 1280, 1280, 1280, 1280, 3322, 3322, 1280, 1280,  777,
-
-      777,  777, 3322, 3322, 3322,  777, 1311, 1311, 1311, 1311,
-     3322, 3322, 1311, 1311,  797,  797,  797, 3322, 3322, 3322,
-      797, 1337, 1337, 1337, 1337, 3322, 3322, 1337, 1337, 1353,
-     1353, 1353, 1353, 3322, 3322, 1353, 1353,  825,  825,  825,
-     3322, 3322, 3322,  825,  835,  835,  835, 3322, 3322, 3322,
-      835, 1376, 1376, 1376, 1376, 3322, 3322, 1376, 1376,  840,
-      840,  840, 3322, 3322, 3322,  840, 1385, 1385, 1385, 1385,
-     3322, 3322, 1385, 1385,  846,  846,  846, 3322, 3322, 3322,
-      846,  854,  854,  854, 3322, 3322, 3322,  854,  861,  861,
-      861, 3322, 3322, 3322,  861, 1417, 1417, 1417, 1417, 3322,
-
-     3322, 1417, 1417,  868,  868,  868, 3322, 3322, 3322,  868,
-     1425, 1425, 1425, 1425, 3322, 3322, 1425, 1425, 1433, 1433,
-     1433, 1433, 3322, 3322, 1433, 1433, 1443, 1443, 1443, 1443,
-     3322, 3322, 1443, 1443,  884,  884,  884,  884, 3322,  884,
-     3322,  884, 1452, 1452, 1452, 1452, 3322, 3322, 1452, 1452,
-     1458, 1458, 1458, 1458, 3322, 3322, 1458, 1458, 1465, 1465,
-     1465, 1465, 3322, 3322, 1465, 1465, 1145, 1145, 1145, 1145,
-     1145, 1145, 1145, 1145, 1145, 1687, 1687, 1687, 1687, 1687,
-     1687, 1687, 1687, 1687, 1160, 1160, 1160, 1160, 3322, 3322,
-     1160, 1160, 1195, 1195, 1195, 1195, 3322, 3322, 1195, 1195,
-
-      706,  706,  706, 3322, 3322, 3322,  706,  714,  714,  714,
-      714, 3322,  714, 3322,  714, 1228, 1228, 1228, 1228, 3322,
-     3322, 1228, 1228,  754,  754,  754, 3322, 3322, 3322,  754,
-     1259, 1259, 1259, 1259, 3322, 3322, 1259, 1259,  761,  761,
-      761, 3322, 3322, 3322,  761, 1268, 1268, 1268, 1268, 3322,
-     3322, 1268, 1268,  767,  767,  767,  767, 3322,  767, 3322,
-      767, 1280, 1280, 1280, 1280, 3322, 3322, 1280, 1280,  777,
-      777,  777, 3322, 3322, 3322,  777, 1311, 1311, 1311, 1311,
-     3322, 3322, 1311, 1311,  797,  797,  797, 3322, 3322, 3322,
-      797, 1337, 1337, 1337, 1337, 3322, 3322, 1337, 1337, 1353,
-
-     1353, 1353, 1353, 3322, 3322, 1353, 1353,  825,  825,  825,
-     3322, 3322, 3322,  825,  835,  835,  835, 3322, 3322, 3322,
-      835,  840,  840,  840,  840, 3322,  840, 3322,  840, 1385,
-     1385, 1385, 1385, 3322, 3322, 1385, 1385,  846,  846,  846,
-      846, 3322,  846, 3322,  846,  854,  854,  854, 3322, 3322,
-     3322,  854,  861,  861,  861, 3322, 3322, 3322,  861, 1417,
-     1417, 1417, 1417, 3322, 3322, 1417, 1417,  868,  868,  868,
-      868, 3322,  868, 3322,  868, 1425, 1425, 1425, 1425, 3322,
-     3322, 1425, 1425, 1433, 1433, 1433, 1433, 3322, 3322, 1433,
-     1433, 1443, 1443, 1443, 1443, 3322, 3322, 1443, 1443,  884,
-
-      884,  884,  884, 3322,  884, 3322,  884, 1452, 1452, 1452,
-     1452, 3322, 3322, 1452, 1452, 1458, 1458, 1458, 1458, 3322,
-     3322, 1458, 1458, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
-     1145, 1145, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687,
-     1687, 1160, 1160, 1160, 1160, 3322, 3322, 1160, 1160,  706,
-      706,  706, 3322, 3322, 3322,  706,  714,  714,  714, 3322,
-     3322, 3322,  714, 1228, 1228, 1228, 1228, 3322, 3322, 1228,
-     1228,  754,  754,  754, 3322, 3322, 3322,  754, 1259, 1259,
-     1259, 1259, 3322, 3322, 1259, 1259,  761,  761,  761, 3322,
-     3322, 3322,  761, 1280, 1280, 1280, 1280, 3322, 3322, 1280,
-
-     1280,  777,  777,  777, 3322, 3322, 3322,  777, 1311, 1311,
-     1311, 1311, 3322, 3322, 1311, 1311,  797,  797,  797, 3322,
-     3322, 3322,  797,  825,  825,  825, 3322, 3322, 3322,  825,
-      835,  835,  835, 3322, 3322, 3322,  835, 2950, 2950, 2950,
-     2950, 2950, 2950, 2950, 2950, 2950, 2951, 2951, 2951, 2951,
-     2951, 2951, 2951, 2951, 2951, 3006, 3006, 3006, 3006, 3006,
-     3006, 3006, 3006, 3006, 3009, 3009, 3009, 3009, 3009, 3009,
-     3009, 3009, 3009, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
-     3045, 3045, 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
-     3047,  259, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322
+     3457,  266,  267,  266,  266,  267,  266,  266,  267,  266,
+      266,  267,  266,  271,  267,  271,  277,  268,  274,  277,
+      268,  274, 3457,  269, 3457,  275,  269, 3457,  275,  272,
+      271,  267,  271,  676,  278,  280,  281,  278,  280,  281,
+      282,  283,  721,  282,  283,  676,  272,  287,  288,  677,
+      284,  280,  281,  284,  285,  679,  282,  280,  281,  710,
+      285,  678,  282,  287,  288, 1760,  284,  267,  267,  267,
+      869,  678,  284,  267,  267,  267,  299,  267,  299,  299,
+      267,  299,  870,  290,  299,  267,  299,  697, 1761,  290,
+      751,  289,  300, 1391,  713,  300,  675,  675,  675, 1392,
+
+      301,  675,  675,  675,  675,  675,  675,  289,  291,  292,
+      267,  292,  291,  291,  291,  291,  291,  291,  291,  293,
+      291,  291,  291,  708,  291,  295,  291,  296,  291,  299,
+      267,  299,  267,  267,  267,  267,  267,  267,  709,  299,
+      267,  299,  299,  267,  299,  301,  714,  824,  302,  679,
+      825,  302,  948,  291,  291,  300,  679,  679,  300,  299,
+      267,  299,  675,  675,  675,  678,  675,  675,  675,  675,
+      675,  675,  678,  678, 3457,  303,  949,  297,  291,  292,
+      267,  292,  291,  291,  291,  291,  291,  291,  291,  293,
+      291,  291,  291, 1763,  291,  295,  291,  296,  291,  299,
+
+      267,  299,  267,  267,  267,  267,  267,  267,  684,  299,
+      267,  299,  299,  267,  299,  303,  690,  751,  304,  838,
+     1008,  304,  839,  291,  291,  301,  760,  752,  301,  267,
+      267,  267,  267,  267,  267,  299,  267,  299,  299,  267,
+      299,  299,  267,  299, 1009,  305,  875,  297,  305,  679,
+      685,  303,  817,  876,  303,  764,  686,  306,  299,  267,
+      299,  687,  675,  675,  675,  678,  688,  675,  675,  675,
+      675,  675,  675,  818,  306,  307,  308,  267,  308,  307,
+      307,  307,  307,  307,  307,  307,  309,  307,  307,  307,
+      738,  307,  311,  307,  312,  307,  315,  267,  315,  315,
+
+      267,  315,  267,  267,  267,  739,  267,  267,  267,  315,
+      267,  315,  316,  799,  877,  316, 1764,  800,  304,  734,
+      307,  307,  304,  735,  776,  316,  694,  736,  313,  307,
+      308,  267,  308,  307,  307,  307,  307,  307,  307,  307,
+      309,  307,  307,  307,  679,  307,  311,  307,  312,  307,
+      315,  267,  315,  315,  267,  315,  315,  267,  315, 1765,
+      678,  885,  280,  281,  883,  715,  316,  282, 3457,  317,
+      714,  884,  317,  777,  307,  307,  760,  327,  716,  776,
+      709, 1206,  313,  318,  319,  267,  319,  318,  318,  318,
+      318,  318,  318,  318,  320,  318,  318,  318, 1207,  318,
+
+      322,  318,  323,  318, 1766,  679,  328,  708,  341,  267,
+      341,  341,  267,  341,  353,  267,  353,  714,  280,  281,
+      717,  678,  709,  282,  342,  727,  821,  342,  318,  318,
+      354,  713,  728,  327,  822,  936,  324,  783,  937,  325,
+      823,  678,  675,  675,  675, 1767,  326,  318,  319,  267,
+      319,  318,  318,  318,  318,  318,  318,  318,  320,  318,
+      318,  318,  328,  318,  322,  318,  323,  318,  353,  267,
+      353,  364,  267,  364,  364,  267,  364,  802,  364,  267,
+      364,  364,  267,  364,  354,  679,  765,  365,  679,  760,
+      365,  878,  318,  318,  366,  740, 1543,  366, 1768,  714,
+
+      324,  678,  766,  325,  678,  675,  675,  675,  783, 1544,
+      326,  329,  330,  267,  330,  329,  329,  329,  329,  329,
+      329,  329,  331,  329,  329,  329,  803,  329,  333,  329,
+      334,  329,  267,  267,  267,  267,  267,  267,  364,  267,
+      364,  802,  364,  267,  364,  364,  267,  364,  367, 1769,
+      679,  367,  679,  679,  365, 1770,  329,  329,  365,  746,
+      713,  368,  675,  675,  675,  335,  678,  336,  678,  678,
+     3457,  337,  675,  675,  675,  832,  338,  339,  329,  330,
+      267,  330,  329,  329,  329,  329,  329,  329,  329,  331,
+      329,  329,  329,  713,  329,  333,  329,  334,  329,  364,
+
+      267,  364,  267,  267,  267,  267,  267,  267,  910,  364,
+      267,  364,  364,  267,  364,  368,  763, 1771,  369,  777,
+      703,  369,  760,  329,  329,  370,  756,  760,  370,  675,
+      675,  675,  335,  759,  336,  675,  675,  675,  337,  675,
+      675,  675, 1773,  338,  339,  343,  344,  267,  344,  343,
+      343,  343,  343,  343,  343,  343,  345,  343,  343,  343,
+      710,  343,  347,  343,  348,  343,  364,  267,  364,  364,
+      267,  364,  267,  267,  267,  930,  267,  267,  267,  364,
+      267,  364,  371, 1044, 1774,  371, 1045,  826,  372,  767,
+      343,  343,  372,  754,  755,  368,  895,  349,  675,  675,
+
+      675,  827,  713,  350,  768,  675,  675,  675,  675,  675,
+      675,  982,  351,  343,  344,  267,  344,  343,  343,  343,
+      343,  343,  343,  343,  345,  343,  343,  343,  930,  343,
+      347,  343,  348,  343,  364,  267,  364,  267,  267,  267,
+      267,  267,  267,  931,  364,  267,  364,  364,  267,  364,
+      368,  679,  714,  373, 1782,  901,  373,  679,  343,  343,
+      371,  679,  679,  371,  788,  349, 1555,  678,  675,  675,
+      675,  350,  948,  678,  675,  675,  675,  678,  678, 1544,
+      351,  355,  356,  267,  356,  355,  355,  355,  355,  355,
+      355,  355,  357,  355,  355,  355, 1017,  355,  359,  355,
+
+      360,  355,  364,  267,  364,  364,  267,  364,  267,  267,
+      267,  714,  267,  267,  267,  364,  267,  364,  374,  679,
+      679,  374,  679, 1783,  375,  832,  355,  355,  375,  793,
+     1785,  376,  675,  675,  675,  678,  678,  361,  678,  675,
+      675,  675,  675,  675,  675, 1789,  362,  355,  356,  267,
+      356,  355,  355,  355,  355,  355,  355,  355,  357,  355,
+      355,  355, 1008,  355,  359,  355,  360,  355,  364,  267,
+      364,  267,  267,  267,  267,  267,  267,  713,  364,  267,
+      364,  364,  267,  364,  376,  679,  949,  377, 1793, 1008,
+      377, 1795,  355,  355,  374,  679, 1802,  374,  364,  267,
+
+      364,  678,  807,  361,  364,  267,  364,  675,  675,  675,
+      871,  678,  362, 1017,  378,  675,  675,  675,  751, 1803,
+      378,  379,  380,  267,  380,  379,  379,  379,  379,  379,
+      379,  379,  381,  379,  379,  379,  948,  379,  383,  379,
+      384,  379,  390,  267,  390,  390,  267,  390,  267,  267,
+      267,  957,  267,  267,  267,  958,  769,  679,  391, 1028,
+     1018,  391,  760,  958,  392, 3457,  379,  379,  392,  679,
+      679,  385,  758,  678,  871,  710,  813,  386,  675,  675,
+      675,  387,  675,  675,  675,  678,  678,  388,  379,  380,
+      267,  380,  379,  379,  379,  379,  379,  379,  379,  381,
+
+      379,  379,  379,  697,  379,  383,  379,  384,  379,  390,
+      267,  390,  390,  267,  390,  390,  267,  390,  909,  390,
+      267,  390,  675,  675,  675,  391,  713,  828,  391, 1804,
+     1805,  393, 1810,  379,  379,  393,  679,  679,  385,  829,
+      830,  675,  675,  675,  386,  675,  675,  675,  387,  675,
+      675,  675,  678,  678,  388,  394,  395,  267,  395,  394,
+      394,  394,  394,  394,  394,  394,  396,  394,  394,  394,
+      713,  394,  398,  394,  399,  394,  404,  267,  404,  404,
+      267,  404,  267,  267,  267,  950,  267,  267,  267, 1053,
+      679, 1811,  405, 1054, 1008,  405,  951,  842,  367,  952,
+
+      394,  394,  367,  679,  679,  400,  678,  675,  675,  675,
+      852,  401,  675,  675,  675,  675,  675,  675, 1018,  678,
+      678, 1294,  402,  394,  395,  267,  395,  394,  394,  394,
+      394,  394,  394,  394,  396,  394,  394,  394, 1207,  394,
+      398,  394,  399,  394,  404,  267,  404,  404,  267,  404,
+      404,  267,  404,  962,  404,  267,  404,  675,  675,  675,
+      405,  679,  679,  405,  679, 1812,  406,  963,  394,  394,
+      406,  857, 1813,  400,  675,  675,  675,  678,  678,  401,
+      678,  675,  675,  675,  675,  675,  675,  675,  675,  675,
+      402,  407,  408,  267,  408,  407,  407,  407,  407,  407,
+
+      407,  407,  409,  407,  407,  407, 1814,  407,  411,  407,
+      412,  407,  416,  267,  416,  416,  267,  416,  427,  267,
+      427,  918,  427,  267,  427,  441,  267,  441,  417, 1177,
+     1815,  417,  679, 1518,  428, 1177,  407,  407,  428,  863,
+      885,  442,  675,  675,  675,  675,  675,  675,  678,  675,
+      675,  675,  413, 1816,  877, 1734, 1823,  414,  407,  408,
+      267,  408,  407,  407,  407,  407,  407,  407,  407,  409,
+      407,  407,  407,  760,  407,  411,  407,  412,  407,  441,
+      267,  441,  267,  267,  267,  267,  267,  267,  878,  441,
+      267,  441,  441,  267,  441,  442,  714, 1824,  443,  679,
+
+     1825,  443,  878,  407,  407,  442,  713,  679,  442,  675,
+      675,  675,  675,  675,  675,  678,  675,  675,  675,  413,
+      675,  675,  675,  678,  414,  418,  419,  267,  419,  418,
+      418,  418,  418,  418,  418,  418,  420,  418,  418,  418,
+     1830,  418,  422,  418,  423,  418,  441,  267,  441,  441,
+      267,  441,  453,  267,  453, 1835,  453,  267,  453,  465,
+      267,  465,  444, 1837, 1838,  444,  679,  679,  454,  679,
+      418,  418,  454,  890,  679,  466,  675,  675,  675,  675,
+      675,  675,  678,  678, 1844,  678,  424, 1849, 1850,  895,
+      678, 1206,  425,  418,  419,  267,  419,  418,  418,  418,
+
+      418,  418,  418,  418,  420,  418,  418,  418, 1329,  418,
+      422,  418,  423,  418,  465,  267,  465,  483,  267,  483,
+      483,  267,  483, 1651,  267,  267,  267,  267,  267,  267,
+      466, 1860, 1863,  484, 1864, 1652,  484,  878,  418,  418,
+      367, 1868, 1869,  367,  918,  714,  675,  675,  675,  901,
+      675,  675,  675, 1872,  424,  675,  675,  675,  909, 1873,
+      425,  429,  430,  267,  430,  429,  429,  429,  429,  429,
+      429,  429,  431,  429,  429,  429, 1874,  429,  433,  429,
+      434,  429,  483,  267,  483,  483,  267,  483,  483,  267,
+      483, 1875,  483,  267,  483,  910,  713,  878,  484,  679,
+
+      679,  484, 1876, 1877,  485,  714,  429,  429,  485,  435,
+      760,  436,  675,  675,  675,  678,  678,  437,  675,  675,
+      675,  675,  675,  675,  438, 1878, 1879,  439,  429,  430,
+      267,  430,  429,  429,  429,  429,  429,  429,  429,  431,
+      429,  429,  429, 1887,  429,  433,  429,  434,  429,  499,
+      267,  499,  499,  267,  499,  515,  267,  515,  950,  515,
+      267,  515, 1890,  679, 1891,  500, 1894,  679,  500,  951,
+      914,  516,  966,  429,  429,  516,  435, 1177,  436,  678,
+      675,  675,  675,  678,  437,  675,  675,  675,  675,  675,
+      675,  438, 1896, 1179,  439,  445,  446,  267,  446,  445,
+
+      445,  445,  445,  445,  445,  445,  447,  445,  445,  445,
+     1898,  445,  449,  445,  450,  445,  526,  267,  526,  526,
+      267,  526,  538,  267,  538,  967,  538,  267,  538,  551,
+      267,  551,  527, 1899, 1901,  527,  679,  679,  539,  963,
+      445,  445,  539,  923,  928,  552,  675,  675,  675,  675,
+      675,  675,  678,  678, 1902, 1903,  451,  445,  446,  267,
+      446,  445,  445,  445,  445,  445,  445,  445,  447,  445,
+      445,  445, 1908,  445,  449,  445,  450,  445,  551,  267,
+      551,  267,  267,  267,  267,  267,  267,  967,  551,  267,
+      551,  551,  267,  551,  552, 1911, 1912,  367,  959, 1913,
+
+      367, 1014,  445,  445,  552,  960, 1915,  552,  675,  675,
+      675,  961,  934,  934,  934, 1194, 1194, 1194,  451,  455,
+      456,  267,  456,  455,  455,  455,  455,  455,  455,  455,
+      457,  455,  455,  455, 1918,  455,  459,  455,  460,  455,
+      551,  267,  551,  551,  267,  551,  563,  267,  563,  969,
+      563,  267,  563,  267,  267,  267,  553, 1919, 1921,  553,
+      970,  972,  564,  952,  455,  455,  564,  969,  960,  565,
+      461,  935,  972,  959,  973,  462, 1925, 1926,  970,  960,
+      960,  966, 1534, 1534, 1534,  961,  973,  463,  455,  456,
+      267,  456,  455,  455,  455,  455,  455,  455,  455,  457,
+
+      455,  455,  455, 1927,  455,  459,  455,  460,  455,  267,
+      267,  267,  563,  267,  563,  563,  267,  563,  967,  563,
+      267,  563,  563,  267,  563,  565, 1929,  967,  564,  959,
+      972,  564, 1019,  455,  455,  566,  960,  960,  566,  461,
+      950, 1020, 1013, 1013,  462,  934,  934,  934, 1737, 1181,
+     1943,  970, 1944, 1945,  966, 1947,  463,  467,  468,  267,
+      468,  467,  467,  467,  467,  467,  467,  467,  469,  467,
+      467,  467,  470,  467,  471,  467,  472,  467,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+
+      470,  470,  467,  467,  470,  473,  474,  475,  470,  470,
+      470,  470,  470,  476,  470,  470,  477,  470,  470,  470,
+      478,  470,  479,  480,  481,  470,  470,  470,  470,  470,
+      470,  486,  487,  267,  487,  486,  486,  486,  486,  486,
+      486,  486,  488,  486,  486,  486, 1948,  486,  490,  486,
+      491,  486,  577,  267,  577,  577,  267,  577,  267,  267,
+      267, 1949,  267,  267,  267,  577,  267,  577,  578, 1348,
+     1177,  578, 1555, 1950,  565, 1951,  486,  486,  565, 1349,
+      492,  578, 1194, 1194, 1194, 1593, 1350,  493, 1952, 1953,
+      494, 1218, 1218, 1218,  495, 1940,  496,  497,  486,  487,
+
+      267,  487,  486,  486,  486,  486,  486,  486,  486,  488,
+      486,  486,  486, 1954,  486,  490,  486,  491,  486,  577,
+      267,  577,  577,  267,  577,  577,  267,  577, 1955,  589,
+      267,  589,  589,  267,  589,  578, 1956, 1957,  579, 1959,
+     1960,  579, 1961,  486,  486,  590, 1195,  492,  590, 1231,
+     1231, 1231, 1962, 1232,  493, 1195, 1233,  494, 1218, 1218,
+     1218,  495, 1965,  496,  497,  501,  502,  267,  502,  501,
+      501,  501,  501,  501,  501,  501,  503,  501,  501,  501,
+     1968,  501,  505,  501,  506,  501,  600,  267,  600,  600,
+      267,  600,  267,  267,  267, 1969,  267,  267,  267,  979,
+
+      979,  979,  601, 1970, 1971,  601, 1972, 1973,  565, 1977,
+      501,  501,  565,  507,  508,  509,  980, 1978, 1241, 1241,
+     1241,  510, 1242, 1980,  511, 1243, 1981, 1982,  512, 1984,
+     1997,  513,  501,  502,  267,  502,  501,  501,  501,  501,
+      501,  501,  501,  503,  501,  501,  501, 1998,  501,  505,
+      501,  506,  501,  600,  267,  600,  600,  267,  600,  600,
+      267,  600, 1999,  600,  267,  600,  987,  987,  987,  601,
+     2000, 2001,  601, 2004, 2005,  602, 2006,  501,  501,  602,
+      507,  508,  509,  988, 2007, 1263, 1263, 1263,  510, 1264,
+     2012,  511, 1265, 2013, 2017,  512, 2022, 2023,  513,  517,
+
+      518,  267,  518,  517,  517,  517,  517,  517,  517,  517,
+      519,  517,  517,  517, 2032,  517,  521,  517,  522,  517,
+      613,  267,  613,  613,  267,  613,  267,  267,  267, 2036,
+      267,  267,  267, 1002, 1002, 1002,  614, 2038, 2044,  614,
+     2045, 2046,  565, 2052,  517,  517,  565, 2053, 2054,  523,
+     1003, 1590, 1590, 1590, 2055,  524,  517,  518,  267,  518,
+      517,  517,  517,  517,  517,  517,  517,  519,  517,  517,
+      517, 2058,  517,  521,  517,  522,  517,  613,  267,  613,
+      613,  267,  613,  613,  267,  613, 2059,  613,  267,  613,
+     1022, 1022, 1022,  614, 2070, 2076,  614, 2080, 2083,  615,
+
+     2085,  517,  517,  615, 2086, 2088,  523, 1023, 1534, 1534,
+     1534, 2089,  524,  528,  529,  267,  529,  528,  528,  528,
+      528,  528,  528,  528,  530,  528,  528,  528, 2090,  528,
+      532,  528,  533,  528,  628,  267,  628,  628,  267,  628,
+      267,  267,  267, 2094,  267,  267,  267,  628,  267,  628,
+      629, 2097, 2099,  629, 2106, 2114,  630, 2115,  528,  528,
+      630, 2116,  534,  629, 1194, 1194, 1194, 2117, 2119,  535,
+     1737, 1177,  536,  528,  529,  267,  529,  528,  528,  528,
+      528,  528,  528,  528,  530,  528,  528,  528, 2134,  528,
+      532,  528,  533,  528,  628,  267,  628,  628,  267,  628,
+
+      628,  267,  628, 2137,  640,  267,  640,  640,  267,  640,
+      629, 2141, 2135,  631, 2142, 1737,  631, 2143,  528,  528,
+      641, 2146,  534,  641, 1218, 1218, 1218, 2147, 1271,  535,
+     2149, 2150,  536,  540,  541,  267,  541,  540,  540,  540,
+      540,  540,  540,  540,  542,  540,  540,  540, 2136,  540,
+      544,  540,  545,  540,  650,  267,  650,  650,  267,  650,
+      267,  267,  267, 2151,  267,  267,  267,  650,  267,  650,
+      651, 2144, 2152,  651, 2153, 2154,  367, 2155,  540,  540,
+      367, 2158,  546,  651, 1751, 1751, 1751, 2145, 1271,  547,
+     2159, 2162,  548, 1754, 1754, 1754, 1759, 1759, 1759,  549,
+
+      540,  541,  267,  541,  540,  540,  540,  540,  540,  540,
+      540,  542,  540,  540,  540, 2163,  540,  544,  540,  545,
+      540,  650,  267,  650,  650,  267,  650,  650,  267,  650,
+     1752,  662,  267,  662,  662,  267,  662,  651, 2164, 1755,
+      652, 2165, 2166,  652,  751,  540,  540,  663, 2168,  546,
+      663, 1285, 1285, 1285,  761, 1286,  547, 2169, 1287,  548,
+     1762, 1762, 1762, 1772, 1772, 1772,  549,  554,  555,  267,
+      555,  554,  554,  554,  554,  554,  554,  554,  556,  554,
+      554,  554,  762,  554,  558,  554,  559,  554,  673,  267,
+      673,  673,  267,  673, 2172, 2175,  713, 1030, 1030, 1030,
+
+      707, 1190, 1190, 1190,  674, 2179, 2180,  674, 2183, 2184,
+     3457, 2185,  554,  554, 1031, 1046, 1046, 1046,  560, 1192,
+      710, 2188, 1296, 1296, 1296, 2192, 1297, 2193,  710, 1298,
+     2196, 2198, 1047,  561,  554,  555,  267,  555,  554,  554,
+      554,  554,  554,  554,  554,  556,  554,  554,  554,  711,
+      554,  558,  554,  559,  554,  712,  765, 1059, 1059, 1059,
+     2203, 2211,  713, 1590, 1590, 1590,  714, 1061, 1061, 1061,
+     2181, 2218,  766, 2219, 1060, 1067, 1067, 1067, 2182,  554,
+      554, 1070, 1070, 1070, 1062,  560, 1319, 1319, 1319, 2186,
+     1320, 2223, 1068, 1321, 1806, 1806, 1806, 2187, 1071, 2224,
+
+      561,  567,  568,  267,  568,  567,  567,  567,  567,  567,
+      567,  567,  569,  567,  567,  567, 2225,  567,  571,  567,
+      572,  567, 1085, 1085, 1085, 1087, 1087, 1087, 1099, 1099,
+     1099, 1107, 1107, 1107, 1112, 1112, 1112, 2194, 2194, 1086,
+     1807, 2226, 1088, 2144, 2228, 1100,  567,  567, 1108, 2232,
+     2233, 1113,  573, 2195, 2145,  574, 1337, 1337, 1337, 2195,
+     1338, 2234, 2240, 1339, 1808, 1808, 1808,  575,  567,  568,
+      267,  568,  567,  567,  567,  567,  567,  567,  567,  569,
+      567,  567,  567, 2241,  567,  571,  567,  572,  567, 1118,
+     1118, 1118, 1138, 1138, 1138, 1162, 1162, 1162, 1166, 1166,
+
+     1166, 1171, 1171, 1171, 2242, 2246, 1119, 2247, 2258, 1139,
+     1755, 2262, 1163,  567,  567, 1167, 2263, 2264, 1172,  573,
+     2266, 2270,  574, 1340, 1340, 1340, 2274, 1341, 2275, 2276,
+     1342, 1809, 1809, 1809,  575,  580,  581,  267,  581,  580,
+      580,  580,  580,  580,  580,  580,  582,  580,  580,  580,
+     2277,  580,  584,  580,  585,  580, 1190, 1190, 1190, 1226,
+     1226, 1226, 2278, 2281, 1226, 1226, 1226,  979,  979,  979,
+     1236, 1236, 1236, 1985, 1192, 2288, 2290, 1228, 2300, 1986,
+      580,  580, 1228, 1987,  980, 2301,  586, 1988, 1238, 2302,
+     2303,  587,  580,  581,  267,  581,  580,  580,  580,  580,
+
+      580,  580,  580,  582,  580,  580,  580, 2305,  580,  584,
+      580,  585,  580, 1737, 1193, 1236, 1236, 1236,  987,  987,
+      987, 1252, 1252, 1252, 1229, 1244, 1244, 1244, 1247, 1247,
+     1247, 2312, 2318, 1238, 1177,  988, 2319,  580,  580, 1254,
+     2309, 1737, 1245,  586, 2310, 1248, 2320, 2321,  587,  591,
+      592,  267,  592,  591,  591,  591,  591,  591,  591,  591,
+      593,  591,  591,  591, 2324,  591,  595,  591,  596,  591,
+     1259, 1259, 1259, 1259, 1259, 1259, 1002, 1002, 1002, 1239,
+     1267, 1267, 1267, 2326, 1252, 1252, 1252, 2311, 1261, 2327,
+     2328, 1261, 2329, 1003,  591,  591, 2333, 2338, 1269, 2340,
+
+      597, 2341, 1254, 1351, 1351, 1351, 2342, 1352, 2346, 2352,
+     1353, 1754, 1754, 1754, 2353,  598,  591,  592,  267,  592,
+      591,  591,  591,  591,  591,  591,  591,  593,  591,  591,
+      591, 1255,  591,  595,  591,  596,  591, 1262, 1267, 1267,
+     1267, 1022, 1022, 1022, 2354, 1290, 1290, 1290, 1290, 1290,
+     1290, 1030, 1030, 1030, 2355, 2356, 1269, 1910, 1023, 2357,
+     2358,  591,  591, 1292, 2359, 2360, 1292,  597, 1031, 1355,
+     1355, 1355, 2361, 1356, 2367, 1270, 1357, 1751, 1751, 1751,
+     2368, 2369,  598,  603,  604,  267,  604,  603,  603,  603,
+      603,  603,  603,  603,  605,  603,  603,  603, 2370,  603,
+
+      607,  603,  608,  603, 1300, 1300, 1300, 1300, 1300, 1300,
+     1046, 1046, 1046, 2376, 1293, 1306, 1306, 1306, 1306, 1306,
+     1306, 2378, 1302, 2382, 2384, 1302, 2386, 1047,  603,  603,
+     1312, 1312, 1312, 1308,  609, 2387, 1308,  610, 1374, 1374,
+     1374, 2392, 1375, 2393, 2395, 1376, 2396, 2397, 1314,  611,
+      603,  604,  267,  604,  603,  603,  603,  603,  603,  603,
+      603,  605,  603,  603,  603, 2398,  603,  607,  603,  608,
+      603, 2402, 2403, 1303, 1312, 1312, 1312, 2404, 2405, 1309,
+     1325, 1325, 1325, 2388, 1325, 1325, 1325, 1332, 1332, 1332,
+     2413, 2389, 1314, 2414, 2415,  603,  603, 2416, 1327, 2419,
+
+     2424,  609, 1327, 2390,  610, 1334, 1377, 1377, 1377, 2428,
+     1378, 2391, 2429, 1379, 2434, 2435,  611,  616,  617,  267,
+      617,  616,  616,  616,  616,  616,  616,  616,  618,  616,
+      616,  616, 2436,  616,  620,  616,  621,  616, 2437, 1315,
+     1059, 1059, 1059, 2439, 2430, 1328, 1332, 1332, 1332, 1061,
+     1061, 1061, 2431, 1343, 1343, 1343, 2449, 1060, 1343, 1343,
+     1343, 2461,  616,  616, 1334, 2432, 1062, 1754, 1754, 1754,
+      622, 1345,  623, 2433, 1737,  624, 1345, 2462, 2463,  625,
+     1958, 1958, 1958,  626,  616,  617,  267,  617,  616,  616,
+      616,  616,  616,  616,  616,  618,  616,  616,  616, 2465,
+
+      616,  620,  616,  621,  616, 1067, 1067, 1067, 1335, 1070,
+     1070, 1070, 2468, 2469, 1358, 1358, 1358, 2455, 2470, 1346,
+     2473, 2477, 1068, 1370, 1370, 1370, 1071, 2478, 2479,  616,
+      616, 1359, 1085, 1085, 1085, 2480, 2481,  622, 2482,  623,
+     1737, 1372,  624, 1759, 1759, 1759,  625, 2483, 2484, 1086,
+      626,  632,  633,  267,  633,  632,  632,  632,  632,  632,
+      632,  632,  634,  632,  632,  632, 2485,  632,  636,  632,
+      637,  632, 1087, 1087, 1087, 1380, 1380, 1380, 1762, 1762,
+     1762, 1772, 1772, 1772, 1370, 1370, 1370, 2456, 2486, 1088,
+     2499, 2500, 1381, 3457, 3457, 3457,  632,  632, 3457, 3457,
+
+     3457, 2501, 1372, 2502, 1394, 1394, 1394, 2503, 1395, 2505,
+     3457, 1396, 1406, 1406, 1406, 3457, 1407, 2506, 2512, 1408,
+      638,  632,  633,  267,  633,  632,  632,  632,  632,  632,
+      632,  632,  634,  632,  632,  632, 2513,  632,  636,  632,
+      637,  632, 1373, 2514, 1382, 1386, 1386, 1386, 2515, 2516,
+     1383, 3457, 3457, 3457, 2517, 1099, 1099, 1099, 2518, 2521,
+     3457, 3457, 3457, 1388, 2522, 2523,  632,  632, 3457, 1386,
+     1386, 1386, 1100, 2528, 1414, 1414, 1414, 3457, 1415, 2529,
+     2530, 1416, 1423, 1423, 1423, 2538, 1424, 1388, 2539, 1425,
+      638,  642,  643,  267,  643,  642,  642,  642,  642,  642,
+
+      642,  642,  644,  642,  642,  642, 1384,  642,  646,  642,
+      647,  642, 1385, 1397, 1397, 1397, 1389, 1401, 1401, 1401,
+     1401, 1401, 1401, 1107, 1107, 1107, 1409, 1409, 1409, 2524,
+     1398, 1963, 1963, 1963, 2540, 1403,  642,  642, 1403, 2525,
+     1108, 1966, 1966, 1966, 1411, 2541, 2550,  648,  642,  643,
+      267,  643,  642,  642,  642,  642,  642,  642,  642,  644,
+      642,  642,  642, 2551,  642,  646,  642,  647,  642, 2552,
+     2553, 1404, 1409, 1409, 1409, 1112, 1112, 1112, 1418, 1418,
+     1418, 1418, 1418, 1418, 1118, 1118, 1118, 1967, 2555, 2557,
+     1411, 2582, 1113,  642,  642, 1964, 1420, 1737, 2583, 1420,
+
+     1737, 1119, 2585, 2586,  648,  653,  654,  267,  654,  653,
+      653,  653,  653,  653,  653,  653,  655,  653,  653,  653,
+     2587,  653,  657,  653,  658,  653, 2588, 2589, 1421, 1429,
+     1429, 1429, 2578, 1412, 2579, 1429, 1429, 1429, 1433, 1433,
+     1433, 1435, 1435, 1435, 1438, 1438, 1438, 1431, 2593, 2594,
+      653,  653, 2595, 1431, 2596, 1434, 2597, 2598, 1436, 2599,
+     2600,  659, 1440, 1455, 1455, 1455, 2601, 1456, 2602, 2603,
+     1457, 1974, 1974, 1974,  660,  653,  654,  267,  654,  653,
+      653,  653,  653,  653,  653,  653,  655,  653,  653,  653,
+     1432,  653,  657,  653,  658,  653, 1443, 1443, 1443, 2605,
+
+     2606, 3457, 3457, 3457, 2609, 1438, 1438, 1438, 2610, 2611,
+     1447, 1447, 1447, 1444, 1450, 1450, 1450, 1975, 3457, 2612,
+      653,  653, 2615, 1440, 3457, 3457, 3457, 1448, 1806, 1806,
+     1806,  659, 1452, 1495, 1495, 1495, 2616, 1496, 2617, 2618,
+     1497, 3457, 2620, 2621,  660,  664,  665,  267,  665,  664,
+      664,  664,  664,  664,  664,  664,  666,  664,  664,  664,
+     1437,  664,  668,  664,  669,  664, 1441, 1450, 1450, 1450,
+     2623, 3457, 3457, 3457, 1445, 1138, 1138, 1138, 1458, 1458,
+     1458, 1458, 1458, 1458, 2624, 1452, 2630, 2631, 3457, 1446,
+      664,  664, 1139, 1462, 1462, 1462, 1460, 2632, 2633, 1460,
+
+     2637,  670, 2607, 2638, 1453, 1502, 1502, 1502, 2639, 1503,
+     1463, 2608, 1504, 2640,  671,  664,  665,  267,  665,  664,
+      664,  664,  664,  664,  664,  664,  666,  664,  664,  664,
+     1449,  664,  668,  664,  669,  664, 1461, 1464, 1464, 1464,
+     1466, 1466, 1466, 2641, 1466, 1466, 1466, 1470, 1470, 1470,
+     1474, 1474, 1474, 2645, 1465, 3457, 3457, 3457, 1468, 2648,
+      664,  664, 1468, 2653, 1471, 2654, 2657, 1475, 1476, 1476,
+     1476,  670, 3457, 1485, 1485, 1485, 1491, 1491, 1491, 1476,
+     1476, 1476, 2649, 2666,  671,  679, 1478, 2613, 1485, 1485,
+     1485, 1487,  694, 2667, 1493, 2650, 2614, 1478, 1491, 1491,
+
+     1491,  678,  695, 2668, 2669, 1472, 1487, 1162, 1162, 1162,
+     1498, 1498, 1498, 2670, 2673, 1469, 1493, 1166, 1166, 1166,
+     1473, 1498, 1498, 1498, 1163, 1506, 1506, 1506, 1500,  696,
+      697,  698, 2651, 2674, 1167,  699,  700,  701, 2695, 1500,
+      702,  703, 2696, 1508,  704, 2652,  705,  706,  707,  679,
+     1479, 1177, 1488, 1506, 1506, 1506,  751, 1171, 1171, 1171,
+     1737, 2698, 1494, 2699, 1737,  678,  752, 1989, 1510, 1510,
+     1510, 1508, 1511, 1990, 1172, 1512, 2700, 1991, 1514, 1514,
+     1514, 1992, 1501, 2709, 1514, 1514, 1514, 2710, 1190, 1190,
+     1190, 2692, 2711,  696,  753,  708, 1516, 2693, 2712,  754,
+
+      755,  701, 1516, 2713,  756,  703, 1192, 2694,  757, 2714,
+      758,  759,  707, 1190, 1190, 1190, 2715, 1509, 1190, 1190,
+     1190, 1557, 1557, 1557, 1226, 1226, 1226, 2716, 1226, 1226,
+     1226, 1192, 1226, 1226, 1226, 2717, 1192, 2718, 1558, 1560,
+     1560, 1560, 1228, 2719, 2721, 1517, 1228, 1231, 1231, 1231,
+     1228, 1232, 2722, 2723, 1233, 2724, 1561, 3457, 3457, 3457,
+     1236, 1236, 1236, 2725, 2726, 1526, 1236, 1236, 1236, 1236,
+     1236, 1236, 2727, 2703, 3457, 1241, 1241, 1241, 1238, 1242,
+     2728, 1559, 1243, 2704, 1238, 2729, 2705, 1238, 1244, 1244,
+     1244, 1566, 1566, 1566, 2730, 1567, 2731, 2732, 1568, 2733,
+
+     1569, 1569, 1569, 2734, 2735, 1245, 1247, 1247, 1247, 1575,
+     1575, 1575, 1252, 1252, 1252, 2706, 1564, 1570, 1562, 2736,
+     1571, 1571, 1571, 1248, 1572, 2707, 1576, 1573, 2708, 2739,
+     1254, 1252, 1252, 1252, 1252, 1252, 1252, 1580, 1580, 1580,
+     1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1254,
+     2740, 2748, 1254, 2749, 1581, 1263, 1263, 1263, 1261, 1264,
+     2750, 1261, 1265, 2753, 1261, 1267, 1267, 1267, 1267, 1267,
+     1267, 1585, 1585, 1585, 1285, 1285, 1285, 2754, 1286, 2758,
+     2759, 1287, 2760, 1269, 2761, 2762, 1269, 2763, 2771, 1586,
+     1602, 1602, 1602, 1583, 1578, 1290, 1290, 1290, 1290, 1290,
+
+     1290, 1290, 1290, 1290, 1296, 1296, 1296, 1603, 1297, 2772,
+     2773, 1298, 2799, 1292, 1177, 2801, 1292, 2802, 1737, 1292,
+     1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1609,
+     1609, 1609, 3457, 3457, 3457, 1306, 1306, 1306, 1302, 2803,
+     2807, 1302, 2808, 2796, 1302, 2811, 1610, 2812, 2815, 3457,
+     1306, 1306, 1306, 1308, 1306, 1306, 1306, 1613, 1613, 1613,
+     2797, 1737, 1604, 3457, 3457, 3457, 2816, 2817, 1308, 1808,
+     1808, 1808, 1308, 2818, 1614, 1312, 1312, 1312, 2819, 1611,
+     3457, 1312, 1312, 1312, 1312, 1312, 1312, 1608, 1619, 1619,
+     1619, 1615, 2820, 1314, 1319, 1319, 1319, 2821, 1320, 1314,
+
+     2822, 1321, 1314, 2798, 2823, 1620, 1325, 1325, 1325, 1325,
+     1325, 1325, 1325, 1325, 1325, 1627, 1627, 1627, 1332, 1332,
+     1332, 1612, 2825, 2826, 1327, 2827, 2828, 1327, 2829, 2830,
+     1327, 2809, 1628, 1332, 1332, 1332, 1334, 1332, 1332, 1332,
+     1630, 1630, 1630, 2813, 2810, 1337, 1337, 1337, 2831, 1338,
+     1616, 1334, 1339, 2832, 2833, 1334, 2814, 1631, 1340, 1340,
+     1340, 2834, 1341, 2835, 2836, 1342, 1343, 1343, 1343, 1343,
+     1343, 1343, 1343, 1343, 1343, 2837, 2839, 1624, 1351, 1351,
+     1351, 2851, 1352, 2852, 1345, 1353, 2860, 1345, 2861, 2862,
+     1345, 1637, 1637, 1637, 1355, 1355, 1355, 2863, 1356, 2864,
+
+     2865, 1357, 2866, 2873, 1629, 1358, 1358, 1358, 1638, 1639,
+     1639, 1639, 2876, 1640, 2883, 2884, 1641, 1370, 1370, 1370,
+     2885, 2886, 1359, 1370, 1370, 1370, 1370, 1370, 1370, 1374,
+     1374, 1374, 2887, 1375, 2888, 1372, 1376, 1632, 1377, 1377,
+     1377, 1372, 1378, 1177, 1372, 1379, 1380, 1380, 1380, 1654,
+     1654, 1654, 2901, 1655, 1737, 2903, 1656, 1386, 1386, 1386,
+     1386, 1386, 1386, 1381, 1386, 1386, 1386, 1394, 1394, 1394,
+     2904, 1395, 2905, 2906, 1396, 1388, 2781, 2907, 1388, 1397,
+     1397, 1397, 1388, 1666, 1666, 1666, 2782, 1667, 2908, 2898,
+     1668, 2897, 2783, 1653, 2909, 2910, 1398, 1401, 1401, 1401,
+
+     1401, 1401, 1401, 1401, 1401, 1401, 1406, 1406, 1406, 2911,
+     1407, 2912, 1661, 1408, 2915, 1403, 2916, 2917, 1403, 2918,
+     2919, 1403, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409,
+     1409, 1414, 1414, 1414, 2920, 1415, 2921, 2922, 1416, 2924,
+     1411, 2925, 2926, 1411, 2927, 2891, 1411, 1418, 1418, 1418,
+     1418, 1418, 1418, 2928, 1671, 1418, 1418, 1418, 2892, 1423,
+     1423, 1423, 2929, 1424, 2893, 1420, 1425, 2930, 1420, 1429,
+     1429, 1429, 2931, 1420, 1429, 1429, 1429, 2894, 1429, 1429,
+     1429, 1433, 1433, 1433, 1682, 1682, 1682, 1431, 1683, 2932,
+     2933, 1684, 1431, 2934, 2935, 1673, 1431, 2936, 1434, 1435,
+
+     1435, 1435, 2948, 2949, 1676, 1685, 1685, 1685, 2950, 1686,
+     2957, 2958, 1687, 1438, 1438, 1438, 1436, 1438, 1438, 1438,
+     2959, 1438, 1438, 1438, 1443, 1443, 1443, 2960, 1447, 1447,
+     1447, 1440, 1809, 1809, 1809, 1440, 2961, 2784, 1681, 1440,
+     2962, 1444, 1691, 1691, 1691, 1448, 1692, 2785, 2963, 1693,
+     1696, 1696, 1696, 2786, 1697, 2964, 2968, 1698, 1450, 1450,
+     1450, 1450, 1450, 1450, 1450, 1450, 1450, 1455, 1455, 1455,
+     2969, 1456, 2977, 2978, 1457, 2979, 1452, 2971, 2980, 1452,
+     2970, 2981, 1452, 1458, 1458, 1458, 2982, 2972, 1689, 1458,
+     1458, 1458, 1458, 1458, 1458, 1462, 1462, 1462, 1703, 1703,
+
+     1703, 1460, 1704, 2986, 2987, 1705, 2988, 1460, 2989, 2973,
+     1460, 2975, 1463, 1464, 1464, 1464, 1706, 1706, 1706, 2974,
+     1707, 2976, 2999, 1708, 1466, 1466, 1466, 3000, 1700, 3001,
+     1465, 1466, 1466, 1466, 3002, 1466, 1466, 1466, 1470, 1470,
+     1470, 3003, 1468, 1710, 1710, 1710, 3004, 1711, 3005, 1468,
+     1712, 3006, 1702, 1468, 3010, 1471, 1474, 1474, 1474, 1715,
+     1715, 1715, 1177, 1716, 3011, 3012, 1717, 1476, 1476, 1476,
+     1476, 1476, 1476, 1475, 1476, 1476, 1476, 1720, 1720, 1720,
+     1485, 1485, 1485, 3013, 3014, 1478, 3015, 3017, 1478, 1485,
+     1485, 1485, 1478, 3018, 1721, 3019, 2990, 1709, 1487, 1485,
+
+     1485, 1485, 1491, 1491, 1491, 3020, 3021, 1487, 1491, 1491,
+     1491, 1491, 1491, 1491, 1495, 1495, 1495, 1487, 1496, 3022,
+     1493, 1497, 1498, 1498, 1498, 3023, 1493, 3024, 3028, 1493,
+     1498, 1498, 1498, 1498, 1498, 1498, 1718, 1502, 1502, 1502,
+     1500, 1503, 3029, 3030, 1504, 1506, 1506, 1506, 1500, 3033,
+     3034, 1500, 1506, 1506, 1506, 1506, 1506, 1506, 3035, 3036,
+     1725, 3037, 3038, 1508, 1728, 1510, 1510, 1510, 3043, 1511,
+     1508, 3044, 1512, 1508, 1514, 1514, 1514, 1514, 1514, 1514,
+     1514, 1514, 1514, 1736, 1736, 1736, 1190, 1190, 1190, 1557,
+     1557, 1557, 1516, 1729, 3045, 1516, 3046, 3047, 1516, 3048,
+
+     3049, 1737, 1738, 3050, 1192, 3051, 1558, 1775, 1775, 1775,
+     3052, 1776, 3053, 3054, 1777, 3056, 1731, 1226, 1226, 1226,
+     1560, 1560, 1560, 3057, 1779, 1779, 1779, 3058, 1780, 3059,
+     1733, 1781, 1236, 1236, 1236, 1228, 1177, 1561, 1566, 1566,
+     1566, 3066, 1567, 3067, 3068, 1568, 1569, 1569, 1569, 3069,
+     1238, 3070, 1743, 1786, 1786, 1786, 3071, 1787, 3072, 3073,
+     1788, 3074, 3075, 1570, 1571, 1571, 1571, 3076, 1572, 3077,
+     3078, 1573, 1575, 1575, 1575, 1778, 1790, 1790, 1790, 3060,
+     1791, 1784, 3079, 1792, 1252, 1252, 1252, 3082, 3083, 1576,
+     1580, 1580, 1580, 1796, 1796, 1796, 3084, 1797, 3085, 3086,
+
+     1798, 3087, 1254, 1799, 1799, 1799, 3088, 1581, 1259, 1259,
+     1259, 1585, 1585, 1585, 1817, 1817, 1817, 2035, 2035, 2035,
+     1800, 1602, 1602, 1602, 3089, 3090, 1261, 3096, 3097, 1586,
+     3098, 1818, 3105, 3106, 1794, 1819, 1819, 1819, 1603, 1820,
+     3107, 3108, 1821, 1290, 1290, 1290, 1300, 1300, 1300, 1609,
+     1609, 1609, 1827, 1827, 1827, 3109, 1828, 1801, 3110, 1829,
+     3111, 1292, 3112, 3113, 1302, 3114, 1610, 1306, 1306, 1306,
+     1613, 1613, 1613, 1832, 1832, 1832, 3115, 1833, 3116, 3119,
+     1834, 1312, 1312, 1312, 3120, 1308, 3121, 1614, 1619, 1619,
+     1619, 1839, 1839, 1839, 3122, 1840, 3130, 3125, 1841, 1314,
+
+     1842, 1842, 1842, 1177, 3131, 1620, 3132, 1822, 3128, 3133,
+     1826, 1845, 1845, 1845, 1325, 1325, 1325, 1843, 1627, 1627,
+     1627, 3134, 1851, 1851, 1851, 3135, 1852, 1831, 1846, 1853,
+     3136, 3137, 1327, 3140, 3125, 1628, 1854, 1854, 1854, 1630,
+     1630, 1630, 1836, 1856, 1856, 1856, 3141, 1857, 3126, 3123,
+     1858, 1343, 1343, 1343, 1855, 3144, 1631, 1847, 1861, 1861,
+     1861, 1637, 1637, 1637, 1865, 1865, 1865, 3145, 1866, 1345,
+     3146, 1867, 1639, 1639, 1639, 1862, 1640, 3138, 1638, 1641,
+     1848, 1870, 1870, 1870, 1370, 1370, 1370, 1654, 1654, 1654,
+     3142, 1655, 3147, 3148, 1656, 1881, 1881, 1881, 1871, 3457,
+
+     3457, 3457, 1372, 3457, 3457, 3457, 3457, 3457, 3457, 1386,
+     1386, 1386, 1882, 1888, 1888, 1888, 3457, 1859, 3156, 3139,
+     3457, 3149, 3161, 3457, 1666, 1666, 1666, 1388, 1667, 3143,
+     1889, 1668, 3162, 3150, 1892, 1892, 1892, 1401, 1401, 1401,
+     1409, 1409, 1409, 1418, 1418, 1418, 1904, 1904, 1904, 1880,
+     1884, 1893, 1429, 1429, 1429, 1403, 3163, 3164, 1411, 3165,
+     3166, 1420, 3151, 1905, 1886, 3157, 1438, 1438, 1438, 1883,
+     1431, 1682, 1682, 1682, 3152, 1683, 1885, 3158, 1684, 1685,
+     1685, 1685, 3169, 1686, 1440, 3169, 1687, 1691, 1691, 1691,
+     1177, 1692, 1906, 3172, 1693, 1696, 1696, 1696, 3173, 1697,
+
+     1900, 1895, 1698, 1450, 1450, 1450, 1897, 3159, 3174, 1907,
+     1458, 1458, 1458, 1703, 1703, 1703, 3125, 1704, 3175, 3160,
+     1705, 1452, 1706, 1706, 1706, 3176, 1707, 3179, 1460, 1708,
+     3126, 3167, 1909, 1466, 1466, 1466, 1710, 1710, 1710, 3125,
+     1711, 1737, 1738, 1712, 3177, 1715, 1715, 1715, 3190, 1716,
+     3128, 1468, 1717, 1476, 1476, 1476, 1720, 1720, 1720, 1922,
+     1922, 1922, 3178, 1923, 1914, 3188, 1924, 1916, 1485, 1485,
+     1485, 1478, 3193, 1721, 1930, 1930, 1930, 1491, 1491, 1491,
+     1917, 1498, 1498, 1498, 3189, 3198, 1487, 1934, 1934, 1934,
+     3191, 1931, 1506, 1506, 1506, 1493, 1937, 1937, 1937, 1500,
+
+     1920, 1514, 1514, 1514, 1935, 1736, 1736, 1736, 3201, 3192,
+     1508, 3180, 3196, 1938, 1190, 1190, 1190, 1928, 3199, 1516,
+     1775, 1775, 1775, 1737, 1776, 3202, 3181, 1777, 1226, 1226,
+     1226, 3197, 1192, 1933, 1779, 1779, 1779, 3200, 1780, 3203,
+     3169, 1781, 2488, 2489, 1932, 2490, 1228, 1236, 1236, 1236,
+     3205, 3169, 1939, 2491, 1936, 3206, 1941, 1786, 1786, 1786,
+     2492, 1787, 3207, 3208, 1788, 1238, 1946, 1790, 1790, 1790,
+     3209, 1791, 3210, 1942, 1792, 1252, 1252, 1252, 1796, 1796,
+     1796, 3211, 1797, 3212, 3213, 1798, 1799, 1799, 1799, 3223,
+     1993, 1993, 1993, 1254, 1994, 1976, 3224, 1995, 1979, 1259,
+
+     1259, 1259, 3225, 1800, 2002, 2002, 2002, 2002, 2002, 2002,
+     1963, 1963, 1963, 1817, 1817, 1817, 3226, 1261, 2008, 2008,
+     2008, 3227, 2009, 3228, 3232, 2010, 3233, 1819, 1819, 1819,
+     1818, 1820, 3234, 3235, 1821, 3236, 1983, 1290, 1290, 1290,
+     2014, 2014, 2014, 1300, 1300, 1300, 3237, 1827, 1827, 1827,
+     1996, 1828, 3238, 3239, 1829, 1292, 3241, 2015, 1306, 1306,
+     1306, 1302, 1832, 1832, 1832, 3242, 1833, 3243, 2003, 1834,
+     3244, 1964, 3245, 3246, 2003, 3247, 1308, 2019, 2019, 2019,
+     1312, 1312, 1312, 3252, 2011, 1839, 1839, 1839, 3253, 1840,
+     2016, 3254, 1841, 3248, 2020, 1842, 1842, 1842, 1314, 2024,
+
+     2024, 2024, 3255, 2025, 3256, 3249, 2026, 3250, 2027, 2027,
+     2027, 3257, 1843, 1845, 1845, 1845, 2029, 2029, 2029, 3251,
+     2030, 3258, 3259, 2031, 2018, 2028, 3260, 2033, 2033, 2033,
+     1846, 1851, 1851, 1851, 3261, 1852, 3262, 3263, 1853, 1854,
+     1854, 1854, 3264, 3265, 2021, 2034, 1856, 1856, 1856, 1177,
+     1857, 3267, 3268, 1858, 1343, 1343, 1343, 1855, 1861, 1861,
+     1861, 2039, 2039, 2039, 3269, 2040, 3270, 3271, 2041, 2042,
+     2042, 2042, 1345, 3272, 3266, 1862, 1865, 1865, 1865, 3273,
+     1866, 3274, 3275, 1867, 3276, 3277, 2043, 1870, 1870, 1870,
+     2047, 2047, 2047, 3278, 2048, 3279, 3280, 2049, 3281, 3282,
+
+     2037, 2050, 2050, 2050, 1871, 2056, 2056, 2056, 1370, 1370,
+     1370, 1881, 1881, 1881, 2064, 2064, 2064, 3283, 2051, 3457,
+     3457, 3457, 2057, 2061, 2061, 2061, 1372, 2062, 1882, 3284,
+     2063, 2065, 2067, 2067, 2067, 3285, 3457, 1386, 1386, 1386,
+     1888, 1888, 1888, 2071, 2071, 2071, 3286, 2072, 3287, 2068,
+     2073, 2074, 2074, 2074, 3288, 1388, 3290, 1889, 1892, 1892,
+     1892, 3291, 2077, 2077, 2077, 3292, 2078, 3293, 2075, 2079,
+     2081, 2081, 2081, 3294, 2060, 1893, 3295, 2066, 1409, 1409,
+     1409, 3296, 1418, 1418, 1418, 1904, 1904, 1904, 2082, 3297,
+     3298, 2091, 2091, 2091, 1177, 2092, 1411, 2069, 2093, 3299,
+
+     1420, 3300, 1905, 2095, 2095, 2095, 1438, 1438, 1438, 2100,
+     2100, 2100, 3301, 3289, 2102, 2102, 2102, 3457, 3457, 3457,
+     3302, 2096, 3303, 3304, 1440, 3305, 2101, 3306, 3307, 2084,
+     2087, 2103, 3308, 3309, 3457, 1450, 1450, 1450, 1458, 1458,
+     1458, 1466, 1466, 1466, 2109, 2109, 2109, 2111, 2111, 2111,
+     1476, 1476, 1476, 1452, 3311, 3312, 1460, 2098, 3313, 1468,
+     3314, 2110, 3315, 1177, 2112, 1922, 1922, 1922, 1478, 1923,
+     3316, 3317, 1924, 1485, 1485, 1485, 1930, 1930, 1930, 2493,
+     2494, 2104, 2495, 3310, 2107, 2120, 2120, 2120, 3318, 2121,
+     2496, 1487, 2122, 1931, 1491, 1491, 1491, 2497, 3319, 1498,
+
+     1498, 1498, 2105, 1934, 1934, 1934, 2108, 2125, 2125, 2125,
+     3320, 2126, 1493, 3321, 2127, 2113, 3322, 1500, 3323, 3324,
+     1935, 2128, 2128, 2128, 2118, 1937, 1937, 1937, 2130, 2130,
+     2130, 3325, 2131, 3326, 3327, 2132, 2148, 2148, 2148, 2129,
+     3328, 3329, 1938, 1514, 1514, 1514, 2138, 2138, 2138, 1190,
+     1190, 1190, 3330, 2123, 2124, 1958, 1958, 1958, 2156, 2156,
+     2156, 1516, 3332, 2139, 1963, 1963, 1963, 1192, 2157, 2157,
+     2157, 1966, 1966, 1966, 2160, 2160, 2160, 2161, 2161, 2161,
+     1974, 1974, 1974, 3333, 1226, 1226, 1226, 2170, 2170, 2170,
+     2173, 2173, 2173, 1252, 1252, 1252, 2177, 2177, 2177, 3334,
+
+     1177, 2133, 1228, 3335, 3336, 2171, 3331, 2174, 3337, 3338,
+     2140, 1254, 3339, 2178, 1993, 1993, 1993, 3340, 1994, 3341,
+     3342, 1995, 1259, 1259, 1259, 2190, 2190, 2190, 2002, 2002,
+     2002, 2197, 2197, 2197, 2167, 3343, 2199, 2199, 2199, 3345,
+     1261, 3346, 2191, 2008, 2008, 2008, 3347, 2009, 3348, 3349,
+     2010, 3350, 2176, 2200, 1290, 1290, 1290, 2204, 2204, 2204,
+     2014, 2014, 2014, 2207, 2207, 2207, 3351, 2208, 2189, 3352,
+     2209, 3354, 1292, 3355, 2205, 3356, 3357, 2015, 1300, 1300,
+     1300, 1177, 2201, 2212, 2212, 2212, 3358, 2019, 2019, 2019,
+     2214, 2214, 2214, 3359, 2215, 3344, 1302, 2216, 1312, 1312,
+
+     1312, 2213, 3360, 2206, 2020, 3361, 3364, 2202, 2024, 2024,
+     2024, 3365, 2025, 3366, 3367, 2026, 1314, 2027, 2027, 2027,
+     2220, 2220, 2220, 3368, 2221, 3369, 1177, 2222, 2029, 2029,
+     2029, 2210, 2030, 1177, 2028, 2031, 2033, 2033, 2033, 2035,
+     2035, 2035, 1343, 1343, 1343, 2217, 2039, 2039, 2039, 1177,
+     2040, 1177, 1758, 2041, 2034, 2042, 2042, 2042, 1177, 1177,
+     1345, 2229, 2229, 2229, 1177, 2230, 3410, 1177, 2231, 2047,
+     2047, 2047, 2043, 2048, 3372, 1177, 2049, 2050, 2050, 2050,
+     2235, 2235, 2235, 1177, 2236, 3370, 1177, 2237, 2238, 2238,
+     2238, 2056, 2056, 2056, 2051, 2243, 2243, 2243, 3384, 2244,
+
+     2227, 3386, 2245, 3371, 1177, 2239, 3373, 3374, 2057, 1370,
+     1370, 1370, 2061, 2061, 2061, 1177, 2062, 1177, 1177, 2063,
+     2064, 2064, 2064, 3375, 2249, 2249, 2249, 1372, 2250, 3392,
+     3376, 2251, 2252, 2252, 2252, 1757, 3380, 2065, 2067, 2067,
+     2067, 2254, 2254, 2254, 1177, 2255, 3381, 3404, 2256, 2253,
+     1386, 1386, 1386, 1756, 1177, 2068, 3388, 2071, 2071, 2071,
+     2248, 2072, 3377, 3393, 2073, 2074, 2074, 2074, 1388, 2259,
+     2259, 2259, 3382, 2260, 1177, 3383, 2261, 2077, 2077, 2077,
+     1177, 2078, 2075, 1177, 2079, 2081, 2081, 2081, 1409, 1409,
+     1409, 2267, 2267, 2267, 1418, 1418, 1418, 2271, 2271, 2271,
+
+     3378, 2257, 1177, 2082, 1177, 1177, 1411, 1177, 2268, 2091,
+     2091, 2091, 1420, 2092, 2272, 3389, 2093, 2095, 2095, 2095,
+     2279, 2279, 2279, 2100, 2100, 2100, 2282, 2282, 2282, 1177,
+     2283, 1177, 3379, 2284, 1177, 2096, 1177, 3396, 2280, 3387,
+     2101, 1177, 3390, 2273, 2102, 2102, 2102, 2285, 2285, 2285,
+     1177, 2286, 2265, 1753, 2287, 2269, 1450, 1450, 1450, 1177,
+     3422, 2103, 1458, 1458, 1458, 1466, 1466, 1466, 2109, 2109,
+     2109, 2293, 2293, 2293, 1452, 2294, 3385, 1177, 2295, 1177,
+     1460, 3432, 3397, 1468, 3405, 2110, 2111, 2111, 2111, 2296,
+     2296, 2296, 1177, 2297, 3391, 3398, 2298, 1476, 1476, 1476,
+
+     1485, 1485, 1485, 2112, 1177, 2120, 2120, 2120, 3399, 2121,
+     1177, 2291, 2122, 1177, 3394, 1478, 3395, 1177, 1487, 1491,
+     1491, 1491, 2289, 1498, 1498, 1498, 3402, 2125, 2125, 2125,
+     2292, 2126, 1177, 1177, 2127, 1177, 1177, 1493, 2128, 2128,
+     2128, 1500, 2130, 2130, 2130, 3400, 2131, 3454, 3401, 2132,
+     1514, 1514, 1514, 2317, 2317, 2317, 2129, 2138, 2138, 2138,
+     1177, 1177, 2299, 1750, 1749, 2304, 3403, 3426, 1516, 3411,
+     2306, 2313, 2313, 2313, 2139, 2314, 2307, 3416, 2315, 1190,
+     1190, 1190, 2322, 2322, 2322, 2323, 2323, 2323, 2148, 2148,
+     2148, 2325, 2325, 2325, 1177, 3408, 2308, 1192, 2330, 2330,
+
+     2330, 2156, 2156, 2156, 2157, 2157, 2157, 2331, 2331, 2331,
+     2160, 2160, 2160, 2161, 2161, 2161, 2334, 2334, 2334, 2335,
+     2335, 2335, 2336, 2336, 2336, 2337, 2337, 2337, 1226, 1226,
+     1226, 2170, 2170, 2170, 2173, 2173, 2173, 2343, 2343, 2343,
+     3406, 2344, 3430, 2316, 2345, 1177, 1228, 1748, 1177, 2171,
+     1177, 2174, 1747, 2332, 2347, 2347, 2347, 2177, 2177, 2177,
+     2349, 2349, 2349, 1177, 2350, 3431, 1746, 2351, 1259, 1259,
+     1259, 1177, 2348, 1177, 2178, 2190, 2190, 2190, 1177, 2339,
+     2363, 2363, 2363, 3409, 2364, 1177, 1261, 2365, 2366, 2366,
+     2366, 3407, 2191, 2197, 2197, 2197, 2371, 2371, 2371, 2199,
+
+     2199, 2199, 2373, 2373, 2373, 3417, 2374, 1177, 3414, 2375,
+     1290, 1290, 1290, 2204, 2204, 2204, 2200, 2362, 2379, 2379,
+     2379, 1177, 2380, 1177, 3418, 2381, 3436, 3412, 1292, 1177,
+     2205, 2207, 2207, 2207, 3413, 2208, 1177, 1177, 2209, 1300,
+     1300, 1300, 2372, 1177, 2212, 2212, 2212, 2214, 2214, 2214,
+     3423, 2215, 1745, 3419, 2216, 1177, 1744, 1302, 1312, 1312,
+     1312, 2377, 2213, 2220, 2220, 2220, 3415, 2221, 1177, 3428,
+     2222, 1343, 1343, 1343, 3420, 1177, 1314, 2229, 2229, 2229,
+     1177, 2230, 1177, 1177, 2231, 2238, 2238, 2238, 3424, 1345,
+     2383, 2235, 2235, 2235, 1177, 2236, 3437, 1177, 2237, 2399,
+
+     2399, 2399, 2239, 2400, 3425, 3421, 2401, 1177, 2243, 2243,
+     2243, 2385, 2244, 1177, 3427, 2245, 2406, 2406, 2406, 1370,
+     1370, 1370, 3433, 2249, 2249, 2249, 2394, 2250, 3429, 3440,
+     2251, 3434, 1742, 2407, 2252, 2252, 2252, 1372, 2409, 2409,
+     2409, 1177, 2410, 1177, 3435, 2411, 2254, 2254, 2254, 1177,
+     2255, 2253, 1177, 2256, 1386, 1386, 1386, 2259, 2259, 2259,
+     1741, 2260, 1177, 1740, 2261, 1739, 2417, 2417, 2417, 2267,
+     2267, 2267, 1388, 2420, 2420, 2420, 3438, 2421, 3439, 1177,
+     2422, 3444, 1177, 2408, 2418, 1732, 2268, 1418, 1418, 1418,
+     2271, 2271, 2271, 2425, 2425, 2425, 1177, 2426, 3441, 3442,
+
+     2427, 2279, 2279, 2279, 3446, 1420, 1730, 2272, 2282, 2282,
+     2282, 3445, 2283, 1177, 3448, 2284, 1450, 1450, 1450, 2280,
+     2412, 2285, 2285, 2285, 1177, 2286, 1727, 1177, 2287, 1177,
+     1458, 1458, 1458, 3443, 1452, 1466, 1466, 1466, 2293, 2293,
+     2293, 1726, 2294, 1724, 1723, 2295, 3447, 2423, 1460, 1722,
+     2296, 2296, 2296, 1468, 2297, 1177, 3449, 2298, 1476, 1476,
+     1476, 1719, 2443, 2443, 2443, 1714, 1713, 2438, 3457, 3457,
+     3457, 2441, 3457, 3457, 3457, 3450, 1478, 3451, 2442, 2444,
+     3457, 3457, 3457, 1701, 1699, 3457, 1485, 1485, 1485, 3457,
+     1491, 1491, 1491, 2451, 2451, 2451, 2440, 3457, 1514, 1514,
+
+     1514, 2457, 2457, 2457, 1487, 2454, 2454, 2454, 1493, 1177,
+     3454, 2452, 1695, 2313, 2313, 2313, 1516, 2314, 1694, 2445,
+     2315, 1177, 1690, 1177, 1190, 1190, 1190, 2317, 2317, 2317,
+     2459, 2459, 2459, 2460, 2460, 2460, 2446, 1688, 1680, 2447,
+     1679, 3452, 1192, 2322, 2322, 2322, 2323, 2323, 2323, 1678,
+     2450, 2448, 2325, 2325, 2325, 2464, 2464, 2464, 1677, 1675,
+     2453, 2466, 2466, 2466, 2467, 2467, 2467, 2330, 2330, 2330,
+     2331, 2331, 2331, 2334, 2334, 2334, 2335, 2335, 2335, 2336,
+     2336, 2336, 1674, 2458, 2337, 2337, 2337, 2471, 2471, 2471,
+     2474, 2474, 2474, 2343, 2343, 2343, 1177, 2344, 1672, 1670,
+
+     2345, 3457, 3457, 3457, 1669, 2472, 1665, 2475, 2347, 2347,
+     2347, 1664, 2349, 2349, 2349, 1663, 2350, 1662, 3457, 2351,
+     1259, 1259, 1259, 2363, 2363, 2363, 2348, 2364, 3453, 1660,
+     2365, 2366, 2366, 2366, 2498, 2498, 2498, 1659, 1261, 2371,
+     2371, 2371, 2373, 2373, 2373, 1658, 2374, 1657, 1650, 2375,
+     1290, 1290, 1290, 2379, 2379, 2379, 1649, 2380, 1648, 1647,
+     2381, 2507, 2507, 2507, 1312, 1312, 1312, 2476, 1292, 2509,
+     2509, 2509, 2519, 2519, 2519, 1343, 1343, 1343, 1646, 2508,
+     1645, 2487, 1314, 2399, 2399, 2399, 2510, 2400, 1644, 1643,
+     2401, 1642, 1636, 1345, 1635, 1634, 2504, 2526, 2526, 2526,
+
+     2406, 2406, 2406, 2531, 2531, 2531, 1633, 2532, 1626, 1625,
+     2533, 2534, 2534, 2534, 2527, 2511, 1623, 2407, 2409, 2409,
+     2409, 1622, 2410, 1621, 1618, 2411, 2536, 2536, 2536, 2535,
+     2417, 2417, 2417, 1617, 1607, 2520, 2542, 2542, 2542, 2420,
+     2420, 2420, 1606, 2421, 2537, 1605, 2422, 1601, 2418, 1418,
+     1418, 1418, 1600, 2543, 1599, 2545, 2545, 2545, 2425, 2425,
+     2425, 1598, 2426, 1597, 1596, 2427, 1595, 1420, 3457, 3457,
+     3457, 1594, 2546, 3457, 3457, 3457, 3457, 3457, 3457, 2556,
+     2556, 2556, 2560, 2560, 2560, 3457, 2558, 2558, 2558, 1592,
+     3457, 1591, 1589, 3457, 1458, 1458, 1458, 1588, 1587, 2561,
+
+     2544, 2547, 1584, 1582, 2559, 1579, 1466, 1466, 1466, 2443,
+     2443, 2443, 1460, 1476, 1476, 1476, 1577, 1574, 2565, 2565,
+     2565, 1565, 2566, 2548, 1468, 2567, 2444, 2554, 2568, 2568,
+     2568, 1478, 1563, 1556, 2549, 3457, 3457, 3457, 3457, 3457,
+     3457, 2572, 2572, 2572, 1554, 2569, 2574, 2574, 2574, 1553,
+     2564, 1552, 3457, 1551, 2562, 3457, 1491, 1491, 1491, 2573,
+     2451, 2451, 2451, 1514, 1514, 1514, 1550, 2563, 1549, 2454,
+     2454, 2454, 1548, 1547, 1493, 2457, 2457, 2457, 2452, 1546,
+     1545, 1516, 2580, 2580, 2580, 1542, 2570, 1177, 1541, 2571,
+     2459, 2459, 2459, 2460, 2460, 2460, 2584, 2584, 2584, 1540,
+
+     2581, 2464, 2464, 2464, 2466, 2466, 2466, 2467, 2467, 2467,
+     2471, 2471, 2471, 2474, 2474, 2474, 2590, 2590, 2590, 1539,
+     2591, 1538, 2575, 2592, 1259, 1259, 1259, 2576, 2472, 1537,
+     2475, 2577, 2498, 2498, 2498, 2619, 2619, 2619, 1290, 1290,
+     1290, 1536, 1261, 2507, 2507, 2507, 2509, 2509, 2509, 1535,
+     2625, 2625, 2625, 1533, 2626, 1532, 1292, 2627, 2628, 2628,
+     2628, 2508, 1531, 2510, 2634, 2634, 2634, 2519, 2519, 2519,
+     1343, 1343, 1343, 2526, 2526, 2526, 2629, 1530, 2642, 2642,
+     2642, 2635, 2643, 1529, 2604, 2644, 1528, 1527, 1345, 1525,
+     2527, 2646, 2646, 2646, 2531, 2531, 2531, 1524, 2532, 1523,
+
+     1522, 2533, 1521, 1520, 2622, 2534, 2534, 2534, 2647, 1519,
+     2536, 2536, 2536, 2655, 2655, 2655, 2542, 2542, 2542, 2661,
+     2661, 2661, 1177, 2535, 2556, 2556, 2556, 2636, 2537, 1513,
+     2656, 1505, 1490, 2543, 2658, 2658, 2658, 2662, 2659, 1489,
+     1484, 2660, 2545, 2545, 2545, 2663, 2663, 2663, 1483, 2664,
+     1482, 1481, 2665, 2671, 2671, 2671, 2558, 2558, 2558, 2546,
+     2560, 2560, 2560, 1480, 2675, 2675, 2675, 1454, 2676, 1442,
+     2672, 2677, 1428, 1427, 2559, 1426, 1422, 2561, 2678, 2678,
+     2678, 1466, 1466, 1466, 1417, 1476, 1476, 1476, 2565, 2565,
+     2565, 1413, 2566, 1405, 1400, 2567, 2679, 1399, 1393, 1468,
+
+     2568, 2568, 2568, 1478, 2682, 2682, 2682, 1390, 2683, 1369,
+     1368, 2684, 2685, 2685, 2685, 1367, 1366, 2569, 2687, 2687,
+     2687, 2572, 2572, 2572, 2574, 2574, 2574, 1365, 1364, 2686,
+     1363, 1362, 2689, 2689, 2689, 2688, 1514, 1514, 1514, 2573,
+     2580, 2580, 2580, 2584, 2584, 2584, 1361, 1360, 2680, 2681,
+     2690, 2697, 2697, 2697, 1516, 2701, 2701, 2701, 2581, 2590,
+     2590, 2590, 1354, 2591, 1347, 1336, 2592, 1259, 1259, 1259,
+     1331, 1330, 2702, 2619, 2619, 2619, 1290, 1290, 1290, 2738,
+     2738, 2738, 2625, 2625, 2625, 1261, 2626, 1324, 1323, 2627,
+     2628, 2628, 2628, 1322, 1292, 1318, 1317, 2691, 2741, 2741,
+
+     2741, 2634, 2634, 2634, 1316, 2743, 2743, 2743, 2629, 2744,
+     1311, 1310, 2745, 1305, 1304, 2742, 1299, 1295, 2635, 2746,
+     2746, 2746, 2751, 2751, 2751, 1289, 1288, 2720, 2642, 2642,
+     2642, 1284, 2643, 1283, 1282, 2644, 1281, 2747, 1280, 2752,
+     2646, 2646, 2646, 1279, 2755, 2755, 2755, 2737, 2756, 1278,
+     1277, 2757, 2764, 2764, 2764, 1276, 1275, 2647, 2655, 2655,
+     2655, 2766, 2766, 2766, 1274, 2767, 1273, 1272, 2768, 2765,
+     2769, 2769, 2769, 1266, 1258, 2656, 2658, 2658, 2658, 1257,
+     2659, 1256, 1251, 2660, 2661, 2661, 2661, 2770, 2663, 2663,
+     2663, 1250, 2664, 1249, 1246, 2665, 2671, 2671, 2671, 2774,
+
+     2774, 2774, 2662, 2775, 1240, 1235, 2776, 2777, 2777, 2777,
+     2779, 2779, 2779, 2672, 2675, 2675, 2675, 1234, 2676, 1230,
+     1225, 2677, 1224, 1223, 2778, 1222, 1221, 2780, 2678, 2678,
+     2678, 1466, 1466, 1466, 1476, 1476, 1476, 2682, 2682, 2682,
+     1220, 2683, 1219, 1217, 2684, 1216, 2679, 1215, 1214, 1468,
+     1213, 1212, 1478, 2685, 2685, 2685, 2789, 2789, 2789, 1211,
+     2790, 1210, 1209, 2791, 2687, 2687, 2687, 2792, 2792, 2792,
+     2686, 2793, 1208, 1205, 2794, 2689, 2689, 2689, 1514, 1514,
+     1514, 2688, 2800, 2800, 2800, 2697, 2697, 2697, 2701, 2701,
+     2701, 1204, 1203, 2690, 1202, 2788, 1516, 2787, 1201, 2804,
+
+     2804, 2804, 1200, 2805, 1199, 2702, 2806, 1259, 1259, 1259,
+     2838, 2838, 2838, 2840, 2840, 2840, 1290, 1290, 1290, 2738,
+     2738, 2738, 2843, 2843, 2843, 1261, 2845, 2845, 2845, 1198,
+     2841, 2741, 2741, 2741, 1292, 2800, 2800, 2800, 1197, 2844,
+     2795, 1196, 1189, 2846, 1188, 2848, 2848, 2848, 2742, 2849,
+     1187, 1186, 2850, 2743, 2743, 2743, 1185, 2744, 2824, 1184,
+     2745, 2746, 2746, 2746, 2853, 2853, 2853, 2751, 2751, 2751,
+     1183, 1180, 2847, 2855, 2855, 2855, 1178, 2856, 2842, 2747,
+     2857, 2854, 1177, 1175, 2752, 2858, 2858, 2858, 2755, 2755,
+     2755, 1173, 2756, 1170, 1168, 2757, 2764, 2764, 2764, 2867,
+
+     2867, 2867, 2859, 2868, 1165, 1161, 2869, 2766, 2766, 2766,
+     1159, 2767, 1158, 2765, 2768, 2769, 2769, 2769, 2870, 2870,
+     2870, 1157, 2871, 1155, 1154, 2872, 2874, 2874, 2874, 2774,
+     2774, 2774, 2770, 2775, 1153, 1152, 2776, 2777, 2777, 2777,
+     2877, 2877, 2877, 2875, 2878, 1151, 1150, 2879, 2779, 2779,
+     2779, 2880, 2880, 2880, 2778, 2881, 1148, 1147, 2882, 1466,
+     1466, 1466, 1476, 1476, 1476, 2780, 2789, 2789, 2789, 1146,
+     2790, 1145, 1143, 2791, 2792, 2792, 2792, 1468, 2793, 1142,
+     1478, 2794, 2895, 2895, 2895, 2899, 2899, 2899, 2902, 2902,
+     2902, 2804, 2804, 2804, 1141, 2805, 1137, 1136, 2806, 1134,
+
+     2896, 1133, 2900, 1737, 2913, 2913, 2913, 1259, 1259, 1259,
+     2889, 2838, 2838, 2838, 2937, 2937, 2937, 2840, 2840, 2840,
+     1132, 2914, 1290, 1290, 1290, 1261, 2938, 2938, 2938, 2890,
+     2939, 1131, 1130, 2940, 2841, 2843, 2843, 2843, 1129, 1127,
+     1292, 2942, 2942, 2942, 1126, 2943, 1125, 1124, 2944, 2845,
+     2845, 2845, 2844, 2945, 2945, 2945, 2923, 2946, 1122, 1121,
+     2947, 2848, 2848, 2848, 1120, 2849, 2846, 1117, 2850, 2853,
+     2853, 2853, 1116, 2941, 2951, 2951, 2951, 1114, 2952, 1111,
+     1110, 2953, 1106, 2855, 2855, 2855, 2854, 2856, 1105, 1103,
+     2857, 2858, 2858, 2858, 2954, 2954, 2954, 1102, 2955, 1101,
+
+     1098, 2956, 2867, 2867, 2867, 1097, 2868, 1096, 2859, 2869,
+     2870, 2870, 2870, 1095, 2871, 1093, 1092, 2872, 2874, 2874,
+     2874, 2965, 2965, 2965, 1091, 2966, 1090, 1089, 2967, 2877,
+     2877, 2877, 1084, 2878, 1082, 2875, 2879, 2880, 2880, 2880,
+     1081, 2881, 1080, 1079, 2882, 2983, 2983, 2983, 1476, 1476,
+     1476, 2895, 2895, 2895, 2991, 2991, 2991, 2899, 2899, 2899,
+     2993, 2993, 2993, 2984, 2994, 1078, 1478, 2995, 1077, 2896,
+     1076, 2992, 1737, 1075, 2900, 1737, 1074, 1073, 1737, 2996,
+     2996, 2996, 2902, 2902, 2902, 2997, 2997, 2997, 2998, 2998,
+     2998, 2913, 2913, 2913, 3007, 3007, 3007, 1072, 3008, 1069,
+
+     1066, 3009, 1259, 1259, 1259, 3025, 3025, 3025, 2914, 2937,
+     2937, 2937, 1065, 1064, 2985, 2938, 2938, 2938, 1058, 2939,
+     1261, 1057, 2940, 3026, 3026, 3026, 2942, 2942, 2942, 1055,
+     2943, 1052, 1050, 2944, 1049, 2945, 2945, 2945, 1048, 2946,
+     1043, 3027, 2947, 2951, 2951, 2951, 1042, 2952, 1040, 1039,
+     2953, 2954, 2954, 2954, 1038, 2955, 1036, 1035, 2956, 3031,
+     3031, 3031, 3039, 3039, 3039, 2965, 2965, 2965, 3016, 2966,
+     1034, 1032, 2967, 3041, 3041, 3041, 3032, 1029, 1027, 3040,
+     2983, 2983, 2983, 1476, 1476, 1476, 2991, 2991, 2991, 1025,
+     3042, 1024, 3061, 3061, 3061, 1021, 3062, 1016, 2984, 3063,
+
+     1015, 1478, 1012, 2992, 1737, 2993, 2993, 2993, 1011, 2994,
+     1737, 1010, 2995, 2996, 2996, 2996, 2997, 2997, 2997, 2998,
+     2998, 2998, 1007, 1737, 3007, 3007, 3007, 1006, 3008, 1004,
+     1001, 3009,  999,  998, 3055, 1735, 1735, 1735, 1735, 1735,
+     1735, 1735, 1735, 1735,  997,  996, 1735, 3080, 3080, 3080,
+      994, 1735, 1735, 1735, 1737, 1735, 3025, 3025, 3025, 3026,
+     3026, 3026, 3031, 3031, 3031, 3081, 3091, 3091, 3091,  993,
+     3092,  992,  991, 3093, 3094, 3094, 3094, 3027,  990, 3032,
+     1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735,
+     1735, 3095,  989, 1735, 3039, 3039, 3039,  986, 1735, 1735,
+
+     1735, 1737, 1735, 3099, 3099, 3099,  985, 3100,  984,  981,
+     3101, 3040, 3041, 3041, 3041, 3102, 3102, 3102,  978, 3103,
+      977,  975, 3104, 3117, 3117, 3117,  974, 1735, 1735, 3042,
+     3061, 3061, 3061,  971, 3062,  968,  965, 3063,  964,  956,
+      955, 3118,  954, 3080, 3080, 3080,  953,  947, 1737, 1735,
+     1735, 1735, 1735, 1735, 3129, 1735, 1735, 1735,  946,  945,
+     1735, 3081, 3094, 3094, 3094, 1735, 1735, 1735, 1737, 1735,
+     3091, 3091, 3091,  943, 3092,  942,  941, 3093,  940, 3095,
+     3153, 3153, 3153,  939, 3154,  938,  933, 3155, 3117, 3117,
+     3117, 3171, 3171, 3171, 1735, 1735, 1735, 1735, 1735, 1735,
+
+     1735, 1735, 1735, 1735, 3129,  930, 3118, 1735,  932, 1737,
+     1738,  927, 1735, 1735, 1735, 1737, 1735, 3099, 3099, 3099,
+      926, 3100,  924,  922, 3101, 3102, 3102, 3102,  921, 3103,
+      919,  917, 3104, 3182, 3182, 3182, 3184, 3184, 3184,  915,
+      913, 1735, 1735, 3186, 3186, 3186,  911, 3153, 3153, 3153,
+     3183, 3154,  908, 3185, 3155, 3194, 3194, 3194,  907,  906,
+     3187, 3204, 3204, 3204, 3171, 3171, 3171, 3182, 3182, 3182,
+      905,  904, 3195, 3214, 3214, 3214,  902, 3215,  900, 1177,
+     3216,  899, 1737,  898, 3183, 3184, 3184, 3184, 3217, 3217,
+     3217,  896, 3218,  894,  893, 3219, 3186, 3186, 3186, 3220,
+
+     3220, 3220, 3185, 3221,  891,  889, 3222, 3194, 3194, 3194,
+     3229, 3229, 3229, 3187, 3230, 1941,  888, 3231, 3204, 3204,
+     3204, 3214, 3214, 3214, 3195, 3215,  886,  882, 3216,  881,
+     3217, 3217, 3217,  879, 3218,  874, 1177, 3219, 3220, 3220,
+     3220,  872, 3221,  868,  867, 3222, 3229, 3229, 3229,  866,
+     3230,  864,  862, 3231,  861, 3240, 3353, 3353, 3353, 3353,
+     3353, 3353,  860, 3362,  858,  856, 3363, 3455, 3455, 3455,
+     3455, 3455, 3455,  855, 1177,  853,  851, 1177,  850,  849,
+      848,  847,  846,  845,  843, 3456,  841,  840, 3456,  264,
+      264,  264,  264,  264,  264,  264,  264,  264,  265,  265,
+
+      265,  265,  265,  265,  265,  265,  265,  270,  270,  270,
+      270,  270,  270,  270,  270,  270,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  276,  276,  276,  276,  276,
+      276,  276,  276,  276,  279,  279,  279,  279,  279,  279,
+      279,  279,  279,  286,  286,  286,  286,  286,  286,  286,
+      286,  286,  294,  294,  294,  294,  294,  294,  294,  294,
+      294,  298,  298,  298,  298,  298,  298,  298,  298,  298,
+      310,  310,  310,  310,  310,  310,  310,  310,  310,  314,
+      314,  314,  314,  314,  314,  314,  314,  314,  321,  321,
+      321,  321,  321,  321,  321,  321,  321,  332,  332,  332,
+
+      332,  332,  332,  332,  332,  332,  340,  340,  340,  340,
+      340,  340,  340,  340,  340,  346,  346,  346,  346,  346,
+      346,  346,  346,  346,  352,  352,  352,  352,  352,  352,
+      352,  352,  352,  358,  358,  358,  358,  358,  358,  358,
+      358,  358,  363,  363,  363,  363,  363,  363,  363,  363,
+      363,  382,  382,  382,  382,  382,  382,  382,  382,  382,
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  397,
+      397,  397,  397,  397,  397,  397,  397,  397,  403,  403,
+      403,  403,  403,  403,  403,  403,  403,  410,  410,  410,
+      410,  410,  410,  410,  410,  410,  415,  415,  415,  415,
+
+      415,  415,  415,  415,  415,  421,  421,  421,  421,  421,
+      421,  421,  421,  421,  426,  426,  426,  426,  426,  426,
+      426,  426,  426,  432,  432,  432,  432,  432,  432,  432,
+      432,  432,  440,  440,  440,  440,  440,  440,  440,  440,
+      440,  448,  448,  448,  448,  448,  448,  448,  448,  448,
+      452,  452,  452,  452,  452,  452,  452,  452,  452,  458,
+      458,  458,  458,  458,  458,  458,  458,  458,  464,  464,
+      464,  464,  464,  464,  464,  464,  464,  482,  482,  482,
+      482,  482,  482,  482,  482,  482,  489,  489,  489,  489,
+      489,  489,  489,  489,  489,  498,  498,  498,  498,  498,
+
+      498,  498,  498,  498,  504,  504,  504,  504,  504,  504,
+      504,  504,  504,  514,  514,  514,  514,  514,  514,  514,
+      514,  514,  520,  520,  520,  520,  520,  520,  520,  520,
+      520,  525,  525,  525,  525,  525,  525,  525,  525,  525,
+      531,  531,  531,  531,  531,  531,  531,  531,  531,  537,
+      537,  537,  537,  537,  537,  537,  537,  537,  543,  543,
+      543,  543,  543,  543,  543,  543,  543,  550,  550,  550,
+      550,  550,  550,  550,  550,  550,  557,  557,  557,  557,
+      557,  557,  557,  557,  557,  562,  562,  562,  562,  562,
+      562,  562,  562,  562,  570,  570,  570,  570,  570,  570,
+
+      570,  570,  570,  576,  576,  576,  576,  576,  576,  576,
+      576,  576,  583,  583,  583,  583,  583,  583,  583,  583,
+      583,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      594,  594,  594,  594,  594,  594,  594,  594,  594,  599,
+      599,  599,  599,  599,  599,  599,  599,  599,  606,  606,
+      606,  606,  606,  606,  606,  606,  606,  612,  612,  612,
+      612,  612,  612,  612,  612,  612,  619,  619,  619,  619,
+      619,  619,  619,  619,  619,  627,  627,  627,  627,  627,
+      627,  627,  627,  627,  635,  635,  635,  635,  635,  635,
+      635,  635,  635,  639,  639,  639,  639,  639,  639,  639,
+
+      639,  639,  645,  645,  645,  645,  645,  645,  645,  645,
+      645,  649,  649,  649,  649,  649,  649,  649,  649,  649,
+      656,  656,  656,  656,  656,  656,  656,  656,  656,  661,
+      661,  661,  661,  661,  661,  661,  661,  661,  667,  667,
+      667,  667,  667,  667,  667,  667,  667,  672,  672,  672,
+      672,  672,  672,  672,  672,  672,  692,  692,  692,  837,
+      836,  835,  692,  719,  719,  719,  833,  831,  820,  719,
+      723,  723,  723,  819,  816,  814,  723,  731,  731,  731,
+      812,  811,  810,  731,  742,  742,  742,  808,  806,  804,
+      742,  748,  748,  748,  803,  801,  798,  748,  771,  771,
+
+      771,  797,  796,  794,  771,  779,  779,  779,  792,  791,
+      789,  779,  785,  785,  785,  787,  786,  784,  785,  790,
+      790,  790,  782,  781,  780,  790,  795,  795,  795,  778,
+      775,  774,  795,  805,  805,  805,  773,  772,  770,  805,
+      809,  809,  809, 3457,  717,  750,  809,  815,  815,  815,
+      749,  747,  745,  815,  834,  834,  834,  744,  743,  741,
+      834,  844,  844,  844,  737,  733,  732,  844,  854,  854,
+      854,  730,  729,  726,  854,  859,  859,  859,  725,  724,
+      722,  859,  865,  865,  865,  721,  720,  718,  865,  873,
+      873,  873,  713, 3457,  693,  873,  880,  880,  880,  691,
+
+      689,  683,  880,  887,  887,  887,  682,  683,  682,  887,
+      892,  892,  892,  681,  680, 3457,  892,  897,  897,  897,
+     3457, 3457, 3457,  897,  903,  903,  903, 3457, 3457, 3457,
+      903,  912,  912,  912, 3457, 3457, 3457,  912,  916,  916,
+      916, 3457, 3457, 3457,  916,  920,  920,  920, 3457, 3457,
+     3457,  920,  925,  925,  925, 3457, 3457, 3457,  925,  929,
+      929,  929,  929,  929,  929,  929, 3457,  929,  692,  692,
+      692, 3457, 3457, 3457,  692,  944, 3457, 3457, 3457,  944,
+      719,  719,  719, 3457, 3457, 3457,  719,  976, 3457, 3457,
+     3457,  976,  723,  723,  723, 3457, 3457, 3457,  723,  983,
+
+     3457, 3457, 3457,  983,  731,  731,  731, 3457, 3457, 3457,
+      731,  995, 3457, 3457, 3457,  995,  742,  742,  742, 3457,
+     3457, 3457,  742, 1000, 3457, 3457, 3457, 1000,  748,  748,
+      748, 3457, 3457, 3457,  748, 1005, 3457, 3457, 3457, 1005,
+      771,  771,  771, 3457, 3457, 3457,  771, 1026, 3457, 3457,
+     3457, 1026,  779,  779,  779, 3457, 3457, 3457,  779, 1033,
+     3457, 3457, 3457, 1033,  785,  785,  785, 3457, 3457, 3457,
+      785, 1037, 3457, 3457, 3457, 1037,  790,  790,  790, 3457,
+     3457, 3457,  790, 1041, 3457, 3457, 3457, 1041,  795,  795,
+      795, 3457, 3457, 3457,  795, 1051, 3457, 3457, 3457, 1051,
+
+      805,  805,  805, 3457, 3457, 3457,  805, 1056, 3457, 3457,
+     3457, 1056,  809,  809,  809, 3457, 3457, 3457,  809, 1063,
+     3457, 3457, 3457, 1063,  815,  815,  815, 3457, 3457, 3457,
+      815, 1083, 3457, 3457, 3457, 1083,  834,  834,  834, 3457,
+     3457, 3457,  834, 1094, 3457, 3457, 3457, 1094,  844,  844,
+      844, 3457, 3457, 3457,  844, 1104, 3457, 3457, 3457, 1104,
+      854,  854,  854, 3457, 3457, 3457,  854, 1109, 3457, 3457,
+     3457, 1109,  859,  859,  859, 3457, 3457, 3457,  859, 1115,
+     3457, 3457, 3457, 1115,  865,  865,  865, 3457, 3457, 3457,
+      865, 1123, 3457, 3457, 3457, 1123,  873,  873,  873, 3457,
+
+     3457, 3457,  873, 1128, 3457, 3457, 3457, 1128,  880,  880,
+      880, 3457, 3457, 3457,  880, 1135, 3457, 3457, 3457, 1135,
+      887,  887,  887, 3457, 3457, 3457,  887, 1140, 3457, 3457,
+     3457, 1140,  892,  892,  892, 3457, 3457, 3457,  892, 1144,
+     3457, 3457, 3457, 1144,  897,  897,  897, 3457, 3457, 3457,
+      897, 1149, 3457, 3457, 3457, 1149,  903,  903,  903, 3457,
+     3457, 3457,  903, 1156, 3457, 3457, 3457, 1156,  912,  912,
+      912, 3457, 3457, 3457,  912, 1160, 3457, 3457, 3457, 1160,
+      916,  916,  916, 3457, 3457, 3457,  916, 1164, 3457, 3457,
+     3457, 1164,  920,  920,  920, 3457, 3457, 3457,  920, 1169,
+
+     3457, 3457, 3457, 1169,  925,  925,  925, 3457, 3457, 3457,
+      925, 1174, 3457, 3457, 3457, 1174, 1176, 1176, 1176, 1176,
+     1176, 1176, 1176, 1176, 1176, 1182, 3457, 3457, 3457, 3457,
+     1182,  692,  692,  692, 3457, 3457, 3457,  692, 1191, 1191,
+     1191, 1191, 3457, 3457, 1191, 1191,  719,  719,  719, 3457,
+     3457, 3457,  719, 1227, 1227, 1227, 1227, 3457, 3457, 1227,
+     1227,  723,  723,  723, 3457, 3457, 3457,  723, 1237, 1237,
+     1237, 1237, 3457, 3457, 1237, 1237,  731,  731,  731, 3457,
+     3457, 3457,  731, 1253, 1253, 1253, 1253, 3457, 3457, 1253,
+     1253,  742,  742,  742, 3457, 3457, 3457,  742, 1260, 1260,
+
+     1260, 1260, 3457, 3457, 1260, 1260,  748,  748,  748, 3457,
+     3457, 3457,  748, 1268, 1268, 1268, 1268, 3457, 3457, 1268,
+     1268,  771,  771,  771, 3457, 3457, 3457,  771, 1291, 1291,
+     1291, 1291, 3457, 3457, 1291, 1291,  779,  779,  779, 3457,
+     3457, 3457,  779, 1301, 1301, 1301, 1301, 3457, 3457, 1301,
+     1301,  785,  785,  785, 3457, 3457, 3457,  785, 1307, 1307,
+     1307, 1307, 3457, 3457, 1307, 1307,  790,  790,  790, 3457,
+     3457, 3457,  790, 1313, 1313, 1313, 1313, 3457, 3457, 1313,
+     1313,  795,  795,  795, 3457, 3457, 3457,  795, 1326, 1326,
+     1326, 1326, 3457, 3457, 1326, 1326,  805,  805,  805, 3457,
+
+     3457, 3457,  805, 1333, 1333, 1333, 1333, 3457, 3457, 1333,
+     1333,  809,  809,  809, 3457, 3457, 3457,  809, 1344, 1344,
+     1344, 1344, 3457, 3457, 1344, 1344,  815,  815,  815, 3457,
+     3457, 3457,  815, 1371, 1371, 1371, 1371, 3457, 3457, 1371,
+     1371,  834,  834,  834,  834, 3457,  834, 3457,  834, 1387,
+     1387, 1387, 1387, 3457, 3457, 1387, 1387,  844,  844,  844,
+     3457, 3457, 3457,  844, 1402, 1402, 1402, 1402, 3457, 3457,
+     1402, 1402,  854,  854,  854, 3457, 3457, 3457,  854, 1410,
+     1410, 1410, 1410, 3457, 3457, 1410, 1410,  859,  859,  859,
+     3457, 3457, 3457,  859, 1419, 1419, 1419, 1419, 3457, 3457,
+
+     1419, 1419,  865,  865,  865, 3457, 3457, 3457,  865, 1430,
+     1430, 1430, 1430, 3457, 3457, 1430, 1430,  873,  873,  873,
+      873, 3457,  873, 3457,  873, 1439, 1439, 1439, 1439, 3457,
+     3457, 1439, 1439,  880,  880,  880,  880, 3457,  880, 3457,
+      880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451,  887,
+      887,  887, 3457, 3457, 3457,  887, 1459, 1459, 1459, 1459,
+     3457, 3457, 1459, 1459,  892,  892,  892,  892, 3457,  892,
+     3457,  892, 1467, 1467, 1467, 1467, 3457, 3457, 1467, 1467,
+      897,  897,  897,  897, 3457,  897, 3457,  897, 1477, 1477,
+     1477, 1477, 3457, 3457, 1477, 1477,  903,  903,  903, 3457,
+
+     3457, 3457,  903, 1486, 1486, 1486, 1486, 3457, 3457, 1486,
+     1486,  912,  912,  912, 3457, 3457, 3457,  912, 1492, 1492,
+     1492, 1492, 3457, 3457, 1492, 1492, 1499, 1499, 1499, 1499,
+     3457, 3457, 1499, 1499,  920,  920,  920, 3457, 3457, 3457,
+      920, 1507, 1507, 1507, 1507, 3457, 3457, 1507, 1507,  925,
+      925,  925, 3457, 3457, 3457,  925, 1515, 1515, 1515, 1515,
+     3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, 1176, 1176,
+     1176, 1176, 1176, 1182, 3457, 1182, 3457, 3457, 1182,  692,
+      692,  692, 3457, 3457, 3457,  692, 1191, 1191, 1191, 1191,
+     3457, 3457, 1191, 1191,  719,  719,  719,  719, 3457,  719,
+
+     3457,  719, 1227, 1227, 1227, 1227, 3457, 3457, 1227, 1227,
+      723,  723,  723,  723, 3457,  723, 3457,  723, 1237, 1237,
+     1237, 1237, 3457, 3457, 1237, 1237,  731,  731,  731, 3457,
+     3457, 3457,  731, 1253, 1253, 1253, 1253, 3457, 3457, 1253,
+     1253,  742,  742,  742, 3457, 3457, 3457,  742, 1260, 1260,
+     1260, 1260, 3457, 3457, 1260, 1260,  748,  748,  748, 3457,
+     3457, 3457,  748, 1268, 1268, 1268, 1268, 3457, 3457, 1268,
+     1268,  771,  771,  771, 3457, 3457, 3457,  771, 1291, 1291,
+     1291, 1291, 3457, 3457, 1291, 1291,  779,  779,  779, 3457,
+     3457, 3457,  779, 1301, 1301, 1301, 1301, 3457, 3457, 1301,
+
+     1301,  785,  785,  785,  785, 3457,  785, 3457,  785, 1307,
+     1307, 1307, 1307, 3457, 3457, 1307, 1307,  790,  790,  790,
+      790, 3457,  790, 3457,  790, 1313, 1313, 1313, 1313, 3457,
+     3457, 1313, 1313,  795,  795,  795, 3457, 3457, 3457,  795,
+     1326, 1326, 1326, 1326, 3457, 3457, 1326, 1326,  805,  805,
+      805,  805, 3457,  805, 3457,  805, 1333, 1333, 1333, 1333,
+     3457, 3457, 1333, 1333,  809,  809,  809,  809, 3457,  809,
+     3457,  809, 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,
+      815,  815,  815, 3457, 3457, 3457,  815, 1371, 1371, 1371,
+     1371, 3457, 3457, 1371, 1371,  834,  834,  834, 3457, 3457,
+
+     3457,  834, 1387, 1387, 1387, 1387, 3457, 3457, 1387, 1387,
+      844,  844,  844, 3457, 3457, 3457,  844, 1402, 1402, 1402,
+     1402, 3457, 3457, 1402, 1402,  854,  854,  854, 3457, 3457,
+     3457,  854, 1410, 1410, 1410, 1410, 3457, 3457, 1410, 1410,
+      859,  859,  859, 3457, 3457, 3457,  859, 1419, 1419, 1419,
+     1419, 3457, 3457, 1419, 1419,  865,  865,  865, 3457, 3457,
+     3457,  865, 1430, 1430, 1430, 1430, 3457, 3457, 1430, 1430,
+      873,  873,  873, 3457, 3457, 3457,  873, 1439, 1439, 1439,
+     1439, 3457, 3457, 1439, 1439,  880,  880,  880, 3457, 3457,
+     3457,  880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451,
+
+      887,  887,  887, 3457, 3457, 3457,  887, 1459, 1459, 1459,
+     1459, 3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, 3457,
+     3457, 1467, 1467,  897,  897,  897, 3457, 3457, 3457,  897,
+     1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477,  903,  903,
+      903, 3457, 3457, 3457,  903, 1486, 1486, 1486, 1486, 3457,
+     3457, 1486, 1486,  912,  912,  912, 3457, 3457, 3457,  912,
+     1492, 1492, 1492, 1492, 3457, 3457, 1492, 1492, 1499, 1499,
+     1499, 1499, 3457, 3457, 1499, 1499,  920,  920,  920, 3457,
+     3457, 3457,  920, 1507, 1507, 1507, 1507, 3457, 3457, 1507,
+     1507,  925,  925,  925, 3457, 3457, 3457,  925, 1515, 1515,
+
+     1515, 1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176,
+     1176, 1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735,
+     1735, 1735, 1735, 1735,  692,  692,  692, 3457, 3457, 3457,
+      692, 1191, 1191, 1191, 1191, 3457, 3457, 1191, 1191, 1227,
+     1227, 1227, 1227, 3457, 3457, 1227, 1227,  723,  723,  723,
+     3457, 3457, 3457,  723, 1237, 1237, 1237, 1237, 3457, 3457,
+     1237, 1237,  731,  731,  731, 3457, 3457, 3457,  731, 1253,
+     1253, 1253, 1253, 3457, 3457, 1253, 1253,  742,  742,  742,
+     3457, 3457, 3457,  742, 1260, 1260, 1260, 1260, 3457, 3457,
+     1260, 1260,  748,  748,  748, 3457, 3457, 3457,  748,  771,
+
+      771,  771, 3457, 3457, 3457,  771, 1291, 1291, 1291, 1291,
+     3457, 3457, 1291, 1291,  779,  779,  779, 3457, 3457, 3457,
+      779, 1301, 1301, 1301, 1301, 3457, 3457, 1301, 1301,  785,
+      785,  785, 3457, 3457, 3457,  785, 1307, 1307, 1307, 1307,
+     3457, 3457, 1307, 1307,  790,  790,  790, 3457, 3457, 3457,
+      790, 1313, 1313, 1313, 1313, 3457, 3457, 1313, 1313,  795,
+      795,  795, 3457, 3457, 3457,  795, 1326, 1326, 1326, 1326,
+     3457, 3457, 1326, 1326, 1333, 1333, 1333, 1333, 3457, 3457,
+     1333, 1333, 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,
+      815,  815,  815, 3457, 3457, 3457,  815, 1371, 1371, 1371,
+
+     1371, 3457, 3457, 1371, 1371,  834,  834,  834,  834, 3457,
+      834, 3457,  834, 1387, 1387, 1387, 1387, 3457, 3457, 1387,
+     1387,  844,  844,  844, 3457, 3457, 3457,  844, 1402, 1402,
+     1402, 1402, 3457, 3457, 1402, 1402,  854,  854,  854, 3457,
+     3457, 3457,  854, 1410, 1410, 1410, 1410, 3457, 3457, 1410,
+     1410,  859,  859,  859, 3457, 3457, 3457,  859, 1419, 1419,
+     1419, 1419, 3457, 3457, 1419, 1419,  865,  865,  865, 3457,
+     3457, 3457,  865, 1430, 1430, 1430, 1430, 3457, 3457, 1430,
+     1430,  873,  873,  873, 3457, 3457, 3457,  873, 1439, 1439,
+     1439, 1439, 3457, 3457, 1439, 1439,  880,  880,  880, 3457,
+
+     3457, 3457,  880, 1451, 1451, 1451, 1451, 3457, 3457, 1451,
+     1451,  887,  887,  887, 3457, 3457, 3457,  887, 1459, 1459,
+     1459, 1459, 3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467,
+     3457, 3457, 1467, 1467,  897,  897,  897, 3457, 3457, 3457,
+      897, 1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477,  903,
+      903,  903, 3457, 3457, 3457,  903, 1486, 1486, 1486, 1486,
+     3457, 3457, 1486, 1486,  912,  912,  912,  912, 3457,  912,
+     3457,  912, 1492, 1492, 1492, 1492, 3457, 3457, 1492, 1492,
+     1499, 1499, 1499, 1499, 3457, 3457, 1499, 1499,  920,  920,
+      920,  920, 3457,  920, 3457,  920, 1507, 1507, 1507, 1507,
+
+     3457, 3457, 1507, 1507,  925,  925,  925,  925, 3457,  925,
+     3457,  925, 1515, 1515, 1515, 1515, 3457, 3457, 1515, 1515,
+     1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1735,
+     1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735,  692,  692,
+      692, 3457, 3457, 3457,  692, 1191, 1191, 1191, 1191, 3457,
+     3457, 1191, 1191, 1227, 1227, 1227, 1227, 3457, 3457, 1227,
+     1227,  723,  723,  723, 3457, 3457, 3457,  723, 1237, 1237,
+     1237, 1237, 3457, 3457, 1237, 1237,  731,  731,  731, 3457,
+     3457, 3457,  731, 1253, 1253, 1253, 1253, 3457, 3457, 1253,
+     1253,  742,  742,  742, 3457, 3457, 3457,  742, 1260, 1260,
+
+     1260, 1260, 3457, 3457, 1260, 1260,  748,  748,  748, 3457,
+     3457, 3457,  748,  771,  771,  771, 3457, 3457, 3457,  771,
+     1291, 1291, 1291, 1291, 3457, 3457, 1291, 1291,  779,  779,
+      779, 3457, 3457, 3457,  779, 1301, 1301, 1301, 1301, 3457,
+     3457, 1301, 1301,  785,  785,  785, 3457, 3457, 3457,  785,
+     1307, 1307, 1307, 1307, 3457, 3457, 1307, 1307,  790,  790,
+      790,  790, 3457,  790, 3457,  790, 1313, 1313, 1313, 1313,
+     3457, 3457, 1313, 1313,  795,  795,  795, 3457, 3457, 3457,
+      795, 1326, 1326, 1326, 1326, 3457, 3457, 1326, 1326, 1344,
+     1344, 1344, 1344, 3457, 3457, 1344, 1344,  815,  815,  815,
+
+     3457, 3457, 3457,  815, 1371, 1371, 1371, 1371, 3457, 3457,
+     1371, 1371,  834,  834,  834,  834, 3457,  834, 3457,  834,
+     1387, 1387, 1387, 1387, 3457, 3457, 1387, 1387,  844,  844,
+      844, 3457, 3457, 3457,  844, 1402, 1402, 1402, 1402, 3457,
+     3457, 1402, 1402,  854,  854,  854, 3457, 3457, 3457,  854,
+     1410, 1410, 1410, 1410, 3457, 3457, 1410, 1410,  859,  859,
+      859, 3457, 3457, 3457,  859, 1419, 1419, 1419, 1419, 3457,
+     3457, 1419, 1419,  865,  865,  865, 3457, 3457, 3457,  865,
+     1430, 1430, 1430, 1430, 3457, 3457, 1430, 1430,  873,  873,
+      873, 3457, 3457, 3457,  873, 1439, 1439, 1439, 1439, 3457,
+
+     3457, 1439, 1439,  880,  880,  880,  880, 3457,  880, 3457,
+      880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451,  887,
+      887,  887, 3457, 3457, 3457,  887, 1459, 1459, 1459, 1459,
+     3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, 3457, 3457,
+     1467, 1467,  897,  897,  897,  897, 3457,  897, 3457,  897,
+     1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477,  903,  903,
+      903, 3457, 3457, 3457,  903, 1486, 1486, 1486, 1486, 3457,
+     3457, 1486, 1486, 1492, 1492, 1492, 1492, 3457, 3457, 1492,
+     1492, 1499, 1499, 1499, 1499, 3457, 3457, 1499, 1499, 1507,
+     1507, 1507, 1507, 3457, 3457, 1507, 1507, 1515, 1515, 1515,
+
+     1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, 1176,
+     1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735, 1735,
+     1735, 1735, 1735,  692,  692,  692,  692, 3457,  692, 3457,
+      692, 1191, 1191, 1191, 1191, 3457, 3457, 1191, 1191, 1227,
+     1227, 1227, 1227, 3457, 3457, 1227, 1227,  723,  723,  723,
+     3457, 3457, 3457,  723, 1237, 1237, 1237, 1237, 3457, 3457,
+     1237, 1237,  731,  731,  731, 3457, 3457, 3457,  731, 1253,
+     1253, 1253, 1253, 3457, 3457, 1253, 1253,  742,  742,  742,
+      742, 3457,  742, 3457,  742, 1260, 1260, 1260, 1260, 3457,
+     3457, 1260, 1260,  748,  748,  748,  748, 3457,  748, 3457,
+
+      748,  771,  771,  771,  771, 3457,  771, 3457,  771, 1291,
+     1291, 1291, 1291, 3457, 3457, 1291, 1291,  779,  779,  779,
+      779, 3457,  779, 3457,  779, 1301, 1301, 1301, 1301, 3457,
+     3457, 1301, 1301,  785,  785,  785, 3457, 3457, 3457,  785,
+     1307, 1307, 1307, 1307, 3457, 3457, 1307, 1307, 1313, 1313,
+     1313, 1313, 3457, 3457, 1313, 1313,  795,  795,  795, 3457,
+     3457, 3457,  795, 1344, 1344, 1344, 1344, 3457, 3457, 1344,
+     1344,  815,  815,  815, 3457, 3457, 3457,  815, 1371, 1371,
+     1371, 1371, 3457, 3457, 1371, 1371,  834,  834,  834,  834,
+     3457,  834, 3457,  834, 1387, 1387, 1387, 1387, 3457, 3457,
+
+     1387, 1387,  844,  844,  844, 3457, 3457, 3457,  844,  854,
+      854,  854, 3457, 3457, 3457,  854, 1410, 1410, 1410, 1410,
+     3457, 3457, 1410, 1410,  859,  859,  859, 3457, 3457, 3457,
+      859, 1419, 1419, 1419, 1419, 3457, 3457, 1419, 1419,  865,
+      865,  865, 3457, 3457, 3457,  865,  873,  873,  873, 3457,
+     3457, 3457,  873, 1439, 1439, 1439, 1439, 3457, 3457, 1439,
+     1439,  880,  880,  880, 3457, 3457, 3457,  880, 1451, 1451,
+     1451, 1451, 3457, 3457, 1451, 1451,  887,  887,  887, 3457,
+     3457, 3457,  887, 1459, 1459, 1459, 1459, 3457, 3457, 1459,
+     1459, 1467, 1467, 1467, 1467, 3457, 3457, 1467, 1467, 1477,
+
+     1477, 1477, 1477, 3457, 3457, 1477, 1477,  903,  903,  903,
+     3457, 3457, 3457,  903, 1486, 1486, 1486, 1486, 3457, 3457,
+     1486, 1486, 1492, 1492, 1492, 1492, 3457, 3457, 1492, 1492,
+     1499, 1499, 1499, 1499, 3457, 3457, 1499, 1499, 1515, 1515,
+     1515, 1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176,
+     1176, 1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735,
+     1735, 1735, 1735, 1735, 1191, 1191, 1191, 1191, 3457, 3457,
+     1191, 1191, 1227, 1227, 1227, 1227, 3457, 3457, 1227, 1227,
+      723,  723,  723, 3457, 3457, 3457,  723,  731,  731,  731,
+     3457, 3457, 3457,  731, 1253, 1253, 1253, 1253, 3457, 3457,
+
+     1253, 1253, 1260, 1260, 1260, 1260, 3457, 3457, 1260, 1260,
+      771,  771,  771, 3457, 3457, 3457,  771, 1291, 1291, 1291,
+     1291, 3457, 3457, 1291, 1291,  779,  779,  779, 3457, 3457,
+     3457,  779, 1301, 1301, 1301, 1301, 3457, 3457, 1301, 1301,
+      785,  785,  785, 3457, 3457, 3457,  785, 1313, 1313, 1313,
+     1313, 3457, 3457, 1313, 1313,  795,  795,  795, 3457, 3457,
+     3457,  795, 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,
+      815,  815,  815, 3457, 3457, 3457,  815, 1371, 1371, 1371,
+     1371, 3457, 3457, 1371, 1371, 1387, 1387, 1387, 1387, 3457,
+     3457, 1387, 1387,  844,  844,  844, 3457, 3457, 3457,  844,
+
+      854,  854,  854, 3457, 3457, 3457,  854, 1410, 1410, 1410,
+     1410, 3457, 3457, 1410, 1410,  859,  859,  859, 3457, 3457,
+     3457,  859, 1419, 1419, 1419, 1419, 3457, 3457, 1419, 1419,
+      865,  865,  865, 3457, 3457, 3457,  865,  873,  873,  873,
+     3457, 3457, 3457,  873,  880,  880,  880, 3457, 3457, 3457,
+      880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451,  887,
+      887,  887, 3457, 3457, 3457,  887, 1459, 1459, 1459, 1459,
+     3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, 3457, 3457,
+     1467, 1467, 1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477,
+      903,  903,  903,  903, 3457,  903, 3457,  903, 1486, 1486,
+
+     1486, 1486, 3457, 3457, 1486, 1486, 1492, 1492, 1492, 1492,
+     3457, 3457, 1492, 1492, 1499, 1499, 1499, 1499, 3457, 3457,
+     1499, 1499, 1515, 1515, 1515, 1515, 3457, 3457, 1515, 1515,
+     1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1735,
+     1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1191, 1191,
+     1191, 1191, 3457, 3457, 1191, 1191, 1227, 1227, 1227, 1227,
+     3457, 3457, 1227, 1227,  723,  723,  723, 3457, 3457, 3457,
+      723,  731,  731,  731,  731, 3457,  731, 3457,  731, 1260,
+     1260, 1260, 1260, 3457, 3457, 1260, 1260,  771,  771,  771,
+     3457, 3457, 3457,  771, 1291, 1291, 1291, 1291, 3457, 3457,
+
+     1291, 1291,  779,  779,  779, 3457, 3457, 3457,  779, 1301,
+     1301, 1301, 1301, 3457, 3457, 1301, 1301,  785,  785,  785,
+      785, 3457,  785, 3457,  785, 1313, 1313, 1313, 1313, 3457,
+     3457, 1313, 1313,  795,  795,  795, 3457, 3457, 3457,  795,
+     1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,  815,  815,
+      815, 3457, 3457, 3457,  815, 1371, 1371, 1371, 1371, 3457,
+     3457, 1371, 1371, 1387, 1387, 1387, 1387, 3457, 3457, 1387,
+     1387,  844,  844,  844, 3457, 3457, 3457,  844,  854,  854,
+      854, 3457, 3457, 3457,  854,  859,  859,  859,  859, 3457,
+      859, 3457,  859, 1419, 1419, 1419, 1419, 3457, 3457, 1419,
+
+     1419,  865,  865,  865,  865, 3457,  865, 3457,  865,  873,
+      873,  873, 3457, 3457, 3457,  873,  880,  880,  880, 3457,
+     3457, 3457,  880, 1451, 1451, 1451, 1451, 3457, 3457, 1451,
+     1451,  887,  887,  887,  887, 3457,  887, 3457,  887, 1459,
+     1459, 1459, 1459, 3457, 3457, 1459, 1459, 1467, 1467, 1467,
+     1467, 3457, 3457, 1467, 1467, 1477, 1477, 1477, 1477, 3457,
+     3457, 1477, 1477,  903,  903,  903,  903, 3457,  903, 3457,
+      903, 1486, 1486, 1486, 1486, 3457, 3457, 1486, 1486, 1492,
+     1492, 1492, 1492, 3457, 3457, 1492, 1492, 1515, 1515, 1515,
+     1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, 1176,
+
+     1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735, 1735,
+     1735, 1735, 1735, 1191, 1191, 1191, 1191, 3457, 3457, 1191,
+     1191,  723,  723,  723, 3457, 3457, 3457,  723,  731,  731,
+      731, 3457, 3457, 3457,  731, 1260, 1260, 1260, 1260, 3457,
+     3457, 1260, 1260,  771,  771,  771, 3457, 3457, 3457,  771,
+     1291, 1291, 1291, 1291, 3457, 3457, 1291, 1291,  779,  779,
+      779, 3457, 3457, 3457,  779, 1313, 1313, 1313, 1313, 3457,
+     3457, 1313, 1313,  795,  795,  795, 3457, 3457, 3457,  795,
+     1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,  815,  815,
+      815, 3457, 3457, 3457,  815,  844,  844,  844, 3457, 3457,
+
+     3457,  844,  854,  854,  854, 3457, 3457, 3457,  854, 1419,
+     1419, 1419, 1419, 3457, 3457, 1419, 1419,  865,  865,  865,
+     3457, 3457, 3457,  865,  873,  873,  873, 3457, 3457, 3457,
+      873,  880,  880,  880, 3457, 3457, 3457,  880, 3064, 3064,
+     3064, 3064, 3064, 3064, 3064, 3064, 3064, 3065, 3065, 3065,
+     3065, 3065, 3065, 3065, 3065, 3065, 3124, 3124, 3124, 3124,
+     3124, 3124, 3124, 3124, 3124, 3127, 3127, 3127, 3127, 3127,
+     3127, 3127, 3127, 3127, 3168, 3168, 3168, 3168, 3168, 3168,
+     3168, 3168, 3168, 3170, 3170, 3170, 3170, 3170, 3170, 3170,
+     3170, 3170,  263, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457
     } ;
 
-static yyconst flex_int16_t yy_chk[12367] =
+static yyconst flex_int16_t yy_chk[12668] =
     {   0,
         0,    3,    3,    3,    4,    4,    4,    5,    5,    5,
         6,    6,    6,    7,    7,    7,   11,    3,    9,   12,
         4,   10,    0,    5,    0,    9,    6,    0,   10,    7,
-        8,    8,    8,  264,   11,   13,   13,   12,   14,   14,
-       13,   13,  313,   14,   14,  265,    8,   17,   17,  264,
-       13,   15,   15,   14,   15,  268,   15,   16,   16,  367,
-       16,  265,   16,   18,   18, 1513,   15,   19,   19,   19,
-      543,  268,   16,   20,   20,   20,   23,   23,   23,   24,
-       24,   24,  543,   19,   25,   25,   25,  367, 1519,   20,
-      374,   17,   23, 1071,  313,   24,  262,  262,  262, 1071,
-
-       25,  263,  263,  263,  267,  267,  267,   18,   21,   21,
+        8,    8,    8,  268,   11,   13,   13,   12,   14,   14,
+       13,   13,  317,   14,   14,  269,    8,   17,   17,  268,
+       13,   15,   15,   14,   15,  272,   15,   16,   16,  371,
+       16,  269,   16,   18,   18, 1542,   15,   19,   19,   19,
+      549,  272,   16,   20,   20,   20,   23,   23,   23,   24,
+       24,   24,  549,   19,   25,   25,   25,  371, 1543,   20,
+      378,   17,   23, 1097,  317,   24,  266,  266,  266, 1097,
+
+       25,  267,  267,  267,  271,  271,  271,   18,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,  297,   21,   21,   21,   21,   21,   26,
-       26,   26,   27,   27,   27,   28,   28,   28,  297,   29,
-       29,   29,   30,   30,   30,   26,  374,  473,   27,  291,
-      473,   28,  680,   21,   21,   29,  307,  286,   30,   31,
-       31,   31,  288,  288,  288,  291,  295,  295,  295,  304,
-      304,  304,  307,  286,  363,   31,  680,   21,   22,   22,
+       21,   21,   21,  301,   21,   21,   21,   21,   21,   26,
+       26,   26,   27,   27,   27,   28,   28,   28,  301,   29,
+       29,   29,   30,   30,   30,   26,  378,  478,   27,  295,
+      478,   28,  697,   21,   21,   29,  311,  290,   30,   31,
+       31,   31,  292,  292,  292,  295,  299,  299,  299,  308,
+      308,  308,  311,  290,  367,   31,  697,   21,   22,   22,
        22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
-       22,   22,   22, 1520,   22,   22,   22,   22,   22,   32,
+       22,   22,   22, 1545,   22,   22,   22,   22,   22,   32,
 
-       32,   32,   33,   33,   33,   34,   34,   34,  278,   35,
-       35,   35,   36,   36,   36,   32,  286,  366,   33,  489,
-      736,   34,  489,   22,   22,   35,  363,  366,   36,   37,
+       32,   32,   33,   33,   33,   34,   34,   34,  282,   35,
+       35,   35,   36,   36,   36,   32,  290,  370,   33,  495,
+      753,   34,  495,   22,   22,   35,  367,  370,   36,   37,
        37,   37,   38,   38,   38,   39,   39,   39,   40,   40,
-       40,   41,   41,   41,  736,   37,  555,   22,   38,  318,
-      278,   39,  469,  555,   40,  366,  278,   41,   42,   42,
-       42,  278,  311,  311,  311,  318,  278,  315,  315,  315,
-      326,  326,  326,  469,   42,   43,   43,   43,   43,   43,
+       40,   41,   41,   41,  753,   37,  561,   22,   38,  322,
+      282,   39,  474,  561,   40,  370,  282,   41,   42,   42,
+       42,  282,  315,  315,  315,  322,  282,  319,  319,  319,
+      330,  330,  330,  474,   42,   43,   43,   43,   43,   43,
        43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-      335,   43,   43,   43,   43,   43,   45,   45,   45,   46,
+      339,   43,   43,   43,   43,   43,   45,   45,   45,   46,
 
-       46,   46,   47,   47,   47,  335,   48,   48,   48,   49,
-       49,   49,   45,  433,  560,   46, 1522,  433,   47,  333,
-       43,   43,   48,  333,  387,   49,  299,  333,   43,   44,
+       46,   46,   47,   47,   47,  339,   48,   48,   48,   49,
+       49,   49,   45,  438,  566,   46, 1546,  438,   47,  337,
+       43,   43,   48,  337,  391,   49,  303,  337,   43,   44,
        44,   44,   44,   44,   44,   44,   44,   44,   44,   44,
-       44,   44,   44,   44,  329,   44,   44,   44,   44,   44,
-       50,   50,   50,   51,   51,   51,   52,   52,   52,  474,
-      329,  573,   55,   55,  569,  299,   50,   55,  300,   51,
-      560,  569,   52,  474,   44,   44,  387,   55,  299,  388,
-      299, 1531,   44,   53,   53,   53,   53,   53,   53,   53,
-       53,   53,   53,   53,   53,   53,   53,   53, 1534,   53,
-
-       53,   53,   53,   53, 1536,  343,   55,  300,   59,   59,
-       59,   60,   60,   60,   63,   63,   63,  573,   56,   56,
-      300,  343,  300,   56,   59,  323,  472,   60,   53,   53,
-       63,  388,  323,   56,  472,  668,   53,  400,  668,   53,
-      472,  323,  337,  337,  337, 1541,   53,   54,   54,   54,
+       44,   44,   44,   44,  333,   44,   44,   44,   44,   44,
+       50,   50,   50,   51,   51,   51,   52,   52,   52, 1547,
+      333,  579,   55,   55,  575,  303,   50,   55,  304,   51,
+      566,  575,   52,  391,   44,   44,  391,   55,  303,  393,
+      303,  957,   44,   53,   53,   53,   53,   53,   53,   53,
+       53,   53,   53,   53,   53,   53,   53,   53,  957,   53,
+
+       53,   53,   53,   53, 1548,  347,   55,  304,   59,   59,
+       59,   60,   60,   60,   63,   63,   63,  579,   56,   56,
+      304,  347,  304,   56,   59,  327,  477,   60,   53,   53,
+       63,  393,  327,   56,  477,  685,   53,  405,  685,   53,
+      477,  327,  341,  341,  341, 1549,   53,   54,   54,   54,
        54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
        54,   54,   56,   54,   54,   54,   54,   54,   64,   64,
-       64,   67,   67,   67,   68,   68,   68, 1544,   69,   69,
-       69,   70,   70,   70,   64,  355,  373,   67,  338,  400,
-       68,  559,   54,   54,   69,  338, 1179,   70, 1545,  559,
+       64,   67,   67,   67,   68,   68,   68,  442,   69,   69,
+       69,   70,   70,   70,   64,  359,  377,   67,  342,  405,
+       68,  565,   54,   54,   69,  342, 1211,   70, 1550,  565,
 
-       54,  355,  373,   54,  338,  340,  340,  340,  401, 1179,
+       54,  359,  377,   54,  342,  344,  344,  344,  406, 1211,
        54,   57,   57,   57,   57,   57,   57,   57,   57,   57,
-       57,   57,   57,   57,   57,   57, 1546,   57,   57,   57,
+       57,   57,   57,   57,   57,   57,  442,   57,   57,   57,
        57,   57,   71,   71,   71,   72,   72,   72,   73,   73,
-       73,  439,   74,   74,   74,   75,   75,   75,   71, 1551,
-      379,   72,  350,  393,   73, 1552,   57,   57,   74,  350,
-      401,   75,  349,  349,  349,   57,  379,   57,  350,  393,
-      437,   57,  352,  352,  352,  478,   57,   57,   58,   58,
+       73,  444,   74,   74,   74,   75,   75,   75,   71, 1551,
+      383,   72,  354,  398,   73, 1552,   57,   57,   74,  354,
+      406,   75,  353,  353,  353,   57,  383,   57,  354,  398,
+      392,   57,  356,  356,  356,  484,   57,   57,   58,   58,
        58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
-       58,   58,   58,  439,   58,   58,   58,   58,   58,   76,
+       58,   58,   58,  444,   58,   58,   58,   58,   58,   76,
 
-       76,   76,   77,   77,   77,   78,   78,   78,  624,   79,
-       79,   79,   80,   80,   80,   76,  365, 1553,   77,  437,
-      624,   78,  437,   58,   58,   79,  365,  478,   80,  360,
-      360,  360,   58,  365,   58,  376,  376,  376,   58,  386,
-      386,  386, 1554,   58,   58,   61,   61,   61,   61,   61,
+       76,   76,   77,   77,   77,   78,   78,   78,  630,   79,
+       79,   79,   80,   80,   80,   76,  369, 1553,   77,  392,
+      630,   78,  392,   58,   58,   79,  369,  484,   80,  364,
+      364,  364,   58,  369,   58,  380,  380,  380,   58,  390,
+      390,  390, 1555,   58,   58,   61,   61,   61,   61,   61,
        61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
-      371,   61,   61,   61,   61,   61,   81,   81,   81,   82,
-       82,   82,   83,   83,   83,  710,   84,   84,   84,   85,
-       85,   85,   81, 1555, 1556,   82,  659,  596,   83,  371,
-       61,   61,   84,  371,  371,   85,  609,   61,  390,  390,
-
-      390,  659,  371,   61,  371,  399,  399,  399,  403,  403,
-      403,  710,   61,   62,   62,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   62,   62,   62,   62, 1557,   62,
+      375,   61,   61,   61,   61,   61,   81,   81,   81,   82,
+       82,   82,   83,   83,   83,  727,   84,   84,   84,   85,
+       85,   85,   81,  797, 1556,   82,  797,  479,   83,  375,
+       61,   61,   84,  375,  375,   85,  602,   61,  395,  395,
+
+      395,  479,  375,   61,  375,  404,  404,  404,  408,  408,
+      408,  727,   61,   62,   62,   62,   62,   62,   62,   62,
+       62,   62,   62,   62,   62,   62,   62,   62,  676,   62,
        62,   62,   62,   62,   86,   86,   86,   87,   87,   87,
-       88,   88,   88,  596,   89,   89,   89,   90,   90,   90,
-       86,  406,  609,   87, 1562,  745,   88,  412,   62,   62,
-       89,  417,  428,   90,  412,   62, 1563,  406,  411,  411,
-      411,   62,  746,  412,  414,  414,  414,  417,  428,  745,
+       88,   88,   88,  676,   89,   89,   89,   90,   90,   90,
+       86,  411,  602,   87, 1562,  615,   88,  417,   62,   62,
+       89,  422,  433,   90,  417,   62, 1223,  411,  416,  416,
+      416,   62,  762,  417,  419,  419,  419,  422,  433, 1223,
        62,   65,   65,   65,   65,   65,   65,   65,   65,   65,
-       65,   65,   65,   65,   65,   65,  746,   65,   65,   65,
+       65,   65,   65,   65,   65,   65,  762,   65,   65,   65,
 
        65,   65,   91,   91,   91,   92,   92,   92,   93,   93,
-       93, 1567,   94,   94,   94,   95,   95,   95,   91,  444,
-      779,   92,  423,  779,   93,  479,   65,   65,   94,  423,
-     1571,   95,  422,  422,  422,  444,  438,   65,  423,  425,
-      425,  425,  436,  436,  436, 1573,   65,   66,   66,   66,
+       93,  615,   94,   94,   94,   95,   95,   95,   91,  449,
+      459,   92,  428, 1563,   93,  485,   65,   65,   94,  428,
+     1565,   95,  427,  427,  427,  449,  459,   65,  428,  430,
+      430,  430,  441,  441,  441, 1574,   65,   66,   66,   66,
        66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
-       66,   66,  747,   66,   66,   66,   66,   66,   96,   96,
-       96,   97,   97,   97,   98,   98,   98,  479,   99,   99,
-       99,  100,  100,  100,   96,  438,  747,   97,  438,  748,
-       98, 1574,   66,   66,   99,  449, 1578,  100,  101,  101,
+       66,   66,  763,   66,   66,   66,   66,   66,   96,   96,
+       96,   97,   97,   97,   98,   98,   98,  485,   99,   99,
+       99,  100,  100,  100,   96,  471,  763,   97, 1577,  764,
+       98, 1579,   66,   66,   99,  454, 1584,  100,  101,  101,
 
-      101, 1581,  449,   66,  102,  102,  102,  441,  441,  441,
-      546,  449,   66,  748,  101,  448,  448,  448,  372, 1582,
+      101,  471,  454,   66,  102,  102,  102,  446,  446,  446,
+      552,  454,   66,  764,  101,  453,  453,  453,  376, 1587,
       102,  103,  103,  103,  103,  103,  103,  103,  103,  103,
-      103,  103,  103,  103,  103,  103,  752,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  765,  103,  103,  103,
       103,  103,  105,  105,  105,  106,  106,  106,  107,  107,
-      107,  686,  108,  108,  108,  686,  372,  454,  105,  785,
-      752,  106,  546,  785,  107,  369,  103,  103,  108,  461,
-      466,  103,  372,  454,  547,  369,  461,  103,  451,  451,
-      451,  103,  460,  460,  460,  461,  466,  103,  104,  104,
+      107,  703,  108,  108,  108,  703,  376,  490,  105,  777,
+      765,  106,  552,  777,  107,  373,  103,  103,  108,  466,
+      505,  103,  376,  490,  553,  373,  466,  103,  456,  456,
+      456,  103,  465,  465,  465,  466,  505,  103,  104,  104,
       104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
 
-      104,  104,  104,  369,  104,  104,  104,  104,  104,  109,
-      109,  109,  110,  110,  110,  111,  111,  111,  625,  112,
-      112,  112,  463,  463,  463,  109,  547,  475,  110, 1589,
-     1591,  111, 1592,  104,  104,  112,  484,  499,  104,  475,
-      475,  477,  477,  477,  104,  481,  481,  481,  104,  493,
-      493,  493,  484,  499,  104,  113,  113,  113,  113,  113,
+      104,  104,  104,  373,  104,  104,  104,  104,  104,  109,
+      109,  109,  110,  110,  110,  111,  111,  111,  631,  112,
+      112,  112,  468,  468,  468,  109,  553,  480,  110, 1588,
+     1589,  111, 1594,  104,  104,  112,  521,  532,  104,  480,
+      480,  483,  483,  483,  104,  487,  487,  487,  104,  499,
+      499,  499,  521,  532,  104,  113,  113,  113,  113,  113,
       113,  113,  113,  113,  113,  113,  113,  113,  113,  113,
-      625,  113,  113,  113,  113,  113,  115,  115,  115,  116,
-      116,  116,  117,  117,  117,  681,  118,  118,  118, 1148,
-      494, 1598,  115, 1148, 1599,  116,  681,  494,  117,  681,
-
-      113,  113,  118,  510,  515,  113,  494,  496,  496,  496,
-      510,  113,  509,  509,  509,  512,  512,  512, 1476,  510,
-      515, 1601,  113,  114,  114,  114,  114,  114,  114,  114,
-      114,  114,  114,  114,  114,  114,  114,  114, 1476,  114,
+      631,  113,  113,  113,  113,  113,  115,  115,  115,  116,
+      116,  116,  117,  117,  117,  698,  118,  118,  118,  803,
+      500, 1595,  115,  803,  769,  116,  698,  500,  117,  698,
+
+      113,  113,  118,  516,  544,  113,  500,  502,  502,  502,
+      516,  113,  515,  515,  515,  518,  518,  518,  769,  516,
+      544, 1028,  113,  114,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114,  114,  114,  114, 1028,  114,
       114,  114,  114,  114,  119,  119,  119,  120,  120,  120,
-      121,  121,  121,  688,  122,  122,  122,  520,  520,  520,
-      119,  526,  538,  120,  521, 1602,  121,  688,  114,  114,
-      122,  521, 1603,  114,  523,  523,  523,  526,  538,  114,
-      521,  532,  532,  532,  535,  535,  535,  545,  545,  545,
+      121,  121,  121,  705,  122,  122,  122,  526,  526,  526,
+      119,  558,  571,  120,  527, 1596,  121,  705,  114,  114,
+      122,  527, 1597,  114,  529,  529,  529,  558,  571,  114,
+      527,  538,  538,  538,  541,  541,  541,  551,  551,  551,
       114,  123,  123,  123,  123,  123,  123,  123,  123,  123,
 
-      123,  123,  123,  123,  123,  123, 1604,  123,  123,  123,
+      123,  123,  123,  123,  123,  123, 1598,  123,  123,  123,
       123,  123,  125,  125,  125,  126,  126,  126,  129,  129,
-      129,  645,  130,  130,  130,  133,  133,  133,  125,  552,
-      565,  126,  533, 1605,  129, 1606,  123,  123,  130,  533,
-      572,  133,  549,  549,  549,  552,  565,  646,  533,  557,
-      557,  557,  123, 1616,  558, 1618, 1619,  123,  124,  124,
+      129,  651,  130,  130,  130,  133,  133,  133,  125, 1179,
+     1599,  126,  539, 1179,  129, 1518,  123,  123,  130,  539,
+      578,  133,  555,  555,  555,  563,  563,  563,  539,  568,
+      568,  568,  123, 1600,  564, 1518, 1605,  123,  124,  124,
       124,  124,  124,  124,  124,  124,  124,  124,  124,  124,
-      124,  124,  124,  645,  124,  124,  124,  124,  124,  134,
-      134,  134,  135,  135,  135,  136,  136,  136,  572,  137,
-      137,  137,  138,  138,  138,  134,  572, 1624,  135,  646,
+      124,  124,  124,  651,  124,  124,  124,  124,  124,  134,
+      134,  134,  135,  135,  135,  136,  136,  136,  578,  137,
+      137,  137,  138,  138,  138,  134,  578, 1606,  135,  584,
 
-     1626,  136,  558,  124,  124,  137,  558,  578,  138,  562,
-      562,  562,  571,  571,  571,  575,  575,  575, 1628,  124,
-      583,  583,  583,  578,  124,  127,  127,  127,  127,  127,
+     1607,  136,  564,  124,  124,  137,  564,  595,  138,  577,
+      577,  577,  581,  581,  581,  584,  589,  589,  589,  124,
+      592,  592,  592,  595,  124,  127,  127,  127,  127,  127,
       127,  127,  127,  127,  127,  127,  127,  127,  127,  127,
-     1629,  127,  127,  127,  127,  127,  139,  139,  139,  140,
-      140,  140,  143,  143,  143,  692,  144,  144,  144,  147,
-      147,  147,  139,  589,  601,  140,  584,  741,  143,  692,
-      127,  127,  144,  584,  614,  147,  586,  586,  586,  589,
-      601,  741,  584,  594,  594,  594,  127, 1631, 1632,  595,
-      614, 1633,  127,  128,  128,  128,  128,  128,  128,  128,
-
-      128,  128,  128,  128,  128,  128,  128,  128, 1642,  128,
+     1611,  127,  127,  127,  127,  127,  139,  139,  139,  140,
+      140,  140,  143,  143,  143, 1615,  144,  144,  144,  147,
+      147,  147,  139, 1617, 1618,  140,  590,  607,  143,  620,
+      127,  127,  144,  590,  636,  147,  600,  600,  600,  604,
+      604,  604,  590,  607, 1622,  620,  127, 1625, 1626,  601,
+      636, 1053,  127,  128,  128,  128,  128,  128,  128,  128,
+
+      128,  128,  128,  128,  128,  128,  128,  128, 1053,  128,
       128,  128,  128,  128,  148,  148,  148,  151,  151,  151,
-      152,  152,  152, 1648,  153,  153,  153,  154,  154,  154,
-      148, 1191, 1649,  151, 1653, 1655,  152,  595,  128,  128,
-      153,  691,  630,  154, 1191,  595,  598,  598,  598,  607,
-      607,  607,  691, 1667,  128,  691, 1668,  608,  630, 1673,
+      152,  152,  152, 1369,  153,  153,  153,  154,  154,  154,
+      148, 1633, 1635,  151, 1636, 1369,  152,  601,  128,  128,
+      153, 1642, 1643,  154,  652,  601,  613,  613,  613,  614,
+      617,  617,  617, 1645,  128,  628,  628,  628,  629, 1646,
       128,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  131,  131,  131,  131, 1676,  131,  131,  131,
+      131,  131,  131,  131,  131,  131, 1647,  131,  131,  131,
       131,  131,  155,  155,  155,  156,  156,  156,  157,  157,
-      157, 1677,  158,  158,  158,  611,  611,  611,  155, 1245,
+      157, 1648,  158,  158,  158,  629,  652,  614,  155,  646,
 
-     1678,  156, 1680, 1687,  157,  608,  131,  131,  158,  131,
-      640,  131, 1245,  608,  622,  622,  622,  131,  627,  627,
-      627,  634,  634,  634,  131,  623,  640,  131,  132,  132,
+      657,  156, 1649, 1650,  157,  614,  131,  131,  158,  131,
+      629,  131,  633,  633,  633,  646,  657,  131,  640,  640,
+      640,  643,  643,  643,  131, 1651, 1652,  131,  132,  132,
       132,  132,  132,  132,  132,  132,  132,  132,  132,  132,
-      132,  132,  132, 1690,  132,  132,  132,  132,  132,  161,
-      161,  161,  162,  162,  162,  165,  165,  165,  694,  166,
-      166,  166,  623,  635, 1693,  161, 1694,  651,  162,  694,
-      635,  165,  694,  132,  132,  166,  132,  623,  132,  635,
-      637,  637,  637,  651,  132,  644,  644,  644,  648,  648,
-      648,  132, 1696, 1697,  132,  141,  141,  141,  141,  141,
+      132,  132,  132, 1662,  132,  132,  132,  132,  132,  161,
+      161,  161,  162,  162,  162,  165,  165,  165,  708,  166,
+      166,  166, 1664,  641, 1665,  161, 1670,  668,  162,  708,
+      641,  165,  708,  132,  132,  166,  132,  931,  132,  641,
+      650,  650,  650,  668,  132,  654,  654,  654,  662,  662,
+      662,  132, 1672,  931,  132,  141,  141,  141,  141,  141,
 
       141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-     1698,  141,  141,  141,  141,  141,  169,  169,  169,  170,
-      170,  170,  173,  173,  173,  749,  174,  174,  174,  177,
-      177,  177,  169, 1699, 1700,  170,  657, 1701,  173,  749,
-      141,  141,  174,  657, 1702,  177,  656,  656,  656,  658,
-      658,  658,  657,  667,  667,  667,  141,  142,  142,  142,
+     1674,  141,  141,  141,  141,  141,  169,  169,  169,  170,
+      170,  170,  173,  173,  173,  709,  174,  174,  174,  177,
+      177,  177,  169, 1675, 1677,  170,  663,  674,  173,  709,
+      141,  141,  174,  663,  674,  177,  665,  665,  665,  673,
+      673,  673,  663,  674, 1678, 1679,  141,  142,  142,  142,
       142,  142,  142,  142,  142,  142,  142,  142,  142,  142,
-      142,  142, 1704,  142,  142,  142,  142,  142,  178,  178,
-      178,  179,  179,  179,  180,  180,  180, 1705,  181,  181,
-      181,  182,  182,  182,  178,  698, 1707,  179,  687,  750,
+      142,  142, 1688,  142,  142,  142,  142,  142,  178,  178,
+      178,  179,  179,  179,  180,  180,  180,  758,  181,  181,
+      181,  182,  182,  182,  178, 1694, 1695,  179,  704, 1699,
 
-      180,  696,  142,  142,  181,  687,  698,  182,  696,  698,
-      750,  687,  667,  750,  696, 1163, 1163, 1163,  142,  145,
+      180,  758,  142,  142,  181,  704, 1701,  182,  675,  675,
+      675,  704,  684,  684,  684, 1194, 1194, 1194,  142,  145,
       145,  145,  145,  145,  145,  145,  145,  145,  145,  145,
-      145,  145,  145,  145, 1709,  145,  145,  145,  145,  145,
-      183,  183,  183,  184,  184,  184,  187,  187,  187,  751,
-      188,  188,  188,  189,  189,  189,  183, 1711, 1686,  184,
-      699,  700,  187,  751,  145,  145,  188,  699,  700,  189,
-      145,  740,  743,  699,  700,  145, 1712, 1714,  740,  743,
-     1171, 1171, 1171, 1686,  740,  743, 1716,  145,  146,  146,
+      145,  145,  145,  145, 1713,  145,  145,  145,  145,  145,
+      183,  183,  183,  184,  184,  184,  187,  187,  187,  711,
+      188,  188,  188,  189,  189,  189,  183, 1714, 1719,  184,
+      711,  713,  187,  711,  145,  145,  188,  715,  713,  189,
+      145,  684,  716,  717,  713,  145, 1722, 1723,  715,  716,
+      717,  715, 1202, 1202, 1202,  716,  717,  145,  146,  146,
       146,  146,  146,  146,  146,  146,  146,  146,  146,  146,
 
-      146,  146,  146, 1718,  146,  146,  146,  146,  146,  190,
-      190,  190,  191,  191,  191,  192,  192,  192, 1719,  193,
-      193,  193,  194,  194,  194,  190,  907, 1720,  191, 1721,
-     1722,  192, 1724,  146,  146,  193, 1733, 1734,  194,  146,
-     1736, 1740,  907, 1744,  146,  910,  910,  910, 1746,  910,
-     1186, 1186, 1186, 1242, 1242, 1242,  146,  149,  149,  149,
+      146,  146,  146, 1724,  146,  146,  146,  146,  146,  190,
+      190,  190,  191,  191,  191,  192,  192,  192,  766,  193,
+      193,  193,  194,  194,  194,  190, 1726,  768,  191,  757,
+      760,  192,  766,  146,  146,  193,  757,  760,  194,  146,
+      767,  768,  757,  760,  146,  934,  934,  934, 1735,  934,
+     1738,  767, 1741, 1742,  767, 1744,  146,  149,  149,  149,
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
@@ -3253,1157 +3332,1190 @@ static yyconst flex_int16_t yy_chk[12367] =
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
       149,  159,  159,  159,  159,  159,  159,  159,  159,  159,
-      159,  159,  159,  159,  159,  159, 1753,  159,  159,  159,
+      159,  159,  159,  159,  159,  159, 1745,  159,  159,  159,
       159,  159,  197,  197,  197,  198,  198,  198,  199,  199,
-      199, 1754,  200,  200,  200,  201,  201,  201,  197, 1041,
-     1755,  198, 1756, 1758,  199, 1762,  159,  159,  200, 1041,
-      159,  201,  922,  922,  922, 1763, 1041,  159, 1764, 1767,
-      159,  944,  944,  944,  159, 1774,  159,  159,  160,  160,
+      199, 1746,  200,  200,  200,  201,  201,  201,  197, 1066,
+     1734,  198, 1277, 1747,  199, 1748,  159,  159,  200, 1066,
+      159,  201,  946,  946,  946, 1277, 1066,  159, 1749, 1750,
+      159,  968,  968,  968,  159, 1734,  159,  159,  160,  160,
 
       160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
-      160,  160,  160, 1780,  160,  160,  160,  160,  160,  202,
-      202,  202,  203,  203,  203,  204,  204,  204, 1787,  207,
-      207,  207,  208,  208,  208,  202, 1788, 1797,  203, 1800,
-     1810,  204, 1814,  160,  160,  207,  922,  160,  208,  956,
-      956,  956, 1818,  956,  160,  944,  956,  160, 1492, 1492,
-     1492,  160, 1819,  160,  160,  163,  163,  163,  163,  163,
+      160,  160,  160, 1752,  160,  160,  160,  160,  160,  202,
+      202,  202,  203,  203,  203,  204,  204,  204, 1753,  207,
+      207,  207,  208,  208,  208,  202, 1755, 1756,  203, 1758,
+     1760,  204, 1761,  160,  160,  207,  946,  160,  208,  980,
+      980,  980, 1763,  980,  160,  968,  980,  160, 1218, 1218,
+     1218,  160, 1765,  160,  160,  163,  163,  163,  163,  163,
       163,  163,  163,  163,  163,  163,  163,  163,  163,  163,
-     1823,  163,  163,  163,  163,  163,  211,  211,  211,  212,
-      212,  212,  213,  213,  213, 1824,  214,  214,  214,  708,
-
-      708,  708,  211, 1825, 1826,  212, 1835, 1839,  213, 1842,
-      163,  163,  214,  163,  163,  163,  708, 1844,  964,  964,
-      964,  163,  964, 1846,  163,  964, 1847, 1849,  163, 1850,
-     1851,  163,  164,  164,  164,  164,  164,  164,  164,  164,
-      164,  164,  164,  164,  164,  164,  164, 1854,  164,  164,
+     1767,  163,  163,  163,  163,  163,  211,  211,  211,  212,
+      212,  212,  213,  213,  213, 1768,  214,  214,  214,  725,
+
+      725,  725,  211, 1769, 1770,  212, 1771, 1773,  213, 1782,
+      163,  163,  214,  163,  163,  163,  725, 1783,  988,  988,
+      988,  163,  988, 1785,  163,  988, 1789, 1793,  163, 1795,
+     1802,  163,  164,  164,  164,  164,  164,  164,  164,  164,
+      164,  164,  164,  164,  164,  164,  164, 1803,  164,  164,
       164,  164,  164,  215,  215,  215,  216,  216,  216,  217,
-      217,  217, 1856,  218,  218,  218,  716,  716,  716,  215,
-     1858, 1863,  216, 1869, 1873,  217, 1874,  164,  164,  218,
-      164,  164,  164,  716, 1875,  979,  979,  979,  164,  979,
-     1877,  164,  979, 1889, 1892,  164, 1886, 1885,  164,  167,
+      217,  217, 1804,  218,  218,  218,  733,  733,  733,  215,
+     1805, 1807,  216, 1811, 1812,  217, 1813,  164,  164,  218,
+      164,  164,  164,  733, 1816, 1003, 1003, 1003,  164, 1003,
+     1823,  164, 1003, 1824, 1830,  164, 1837, 1838,  164,  167,
 
       167,  167,  167,  167,  167,  167,  167,  167,  167,  167,
-      167,  167,  167,  167, 1885,  167,  167,  167,  167,  167,
-      221,  221,  221,  222,  222,  222,  223,  223,  223, 1893,
-      224,  224,  224,  732,  732,  732,  221, 1894, 1886,  222,
-     1896, 1897,  223, 1899,  167,  167,  224, 1900, 1901,  167,
-      732, 1493, 1493, 1493, 1903,  167,  168,  168,  168,  168,
+      167,  167,  167,  167, 1847,  167,  167,  167,  167,  167,
+      221,  221,  221,  222,  222,  222,  223,  223,  223, 1850,
+      224,  224,  224,  749,  749,  749,  221, 1860, 1864,  222,
+     1868, 1869,  223, 1873,  167,  167,  224, 1874, 1875,  167,
+      749, 1274, 1274, 1274, 1876,  167,  168,  168,  168,  168,
       168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
-      168, 1887,  168,  168,  168,  168,  168,  225,  225,  225,
-      226,  226,  226,  227,  227,  227, 1904,  228,  228,  228,
-      756,  756,  756,  225, 1905, 1895,  226, 1493, 1909,  227,
+      168, 1878,  168,  168,  168,  168,  168,  225,  225,  225,
+      226,  226,  226,  227,  227,  227, 1879,  228,  228,  228,
+      773,  773,  773,  225, 1887, 1891,  226, 1894, 1896,  227,
 
-     1911,  168,  168,  228, 1887, 1914,  168,  756, 1495, 1495,
-     1495, 1895,  168,  171,  171,  171,  171,  171,  171,  171,
-      171,  171,  171,  171,  171,  171,  171,  171, 1915,  171,
+     1898,  168,  168,  228, 1899, 1901,  168,  773, 1534, 1534,
+     1534, 1902,  168,  171,  171,  171,  171,  171,  171,  171,
+      171,  171,  171,  171,  171,  171,  171,  171, 1903,  171,
       171,  171,  171,  171,  231,  231,  231,  232,  232,  232,
-      233,  233,  233, 1916,  234,  234,  234,  235,  235,  235,
-      231, 1917, 1919,  232, 1495, 1921,  233, 1922,  171,  171,
-      234, 1924,  171,  235,  983,  983,  983, 1926, 1929,  171,
-     1930, 1932,  171,  172,  172,  172,  172,  172,  172,  172,
-      172,  172,  172,  172,  172,  172,  172,  172, 1933,  172,
+      233,  233,  233, 1906,  234,  234,  234,  235,  235,  235,
+      231, 1908, 1910,  232, 1915, 1921,  233, 1925,  171,  171,
+      234, 1926,  171,  235, 1007, 1007, 1007, 1927, 1929,  171,
+     1941, 1940,  171,  172,  172,  172,  172,  172,  172,  172,
+      172,  172,  172,  172,  172,  172,  172,  172, 1940,  172,
       172,  172,  172,  172,  236,  236,  236,  237,  237,  237,
 
-      238,  238,  238, 1931,  241,  241,  241,  242,  242,  242,
-      236, 1931, 1934,  237, 1936, 1942,  238, 1943,  172,  172,
-      241, 1945,  172,  242,  992,  992,  992, 1948,  983,  172,
-     1960, 1965,  172,  175,  175,  175,  175,  175,  175,  175,
-      175,  175,  175,  175,  175,  175,  175,  175, 1966,  175,
+      238,  238,  238, 1944,  241,  241,  241,  242,  242,  242,
+      236, 1947, 1941,  237, 1948, 1942,  238, 1949,  172,  172,
+      241, 1951,  172,  242, 1016, 1016, 1016, 1952, 1007,  172,
+     1954, 1955,  172,  175,  175,  175,  175,  175,  175,  175,
+      175,  175,  175,  175,  175,  175,  175,  175, 1942,  175,
       175,  175,  175,  175,  245,  245,  245,  246,  246,  246,
-      247,  247,  247, 1935,  248,  248,  248,  249,  249,  249,
-      245, 1935, 1973,  246, 1944, 1949,  247, 1974,  175,  175,
-      248, 1975,  175,  249, 1498, 1498, 1498, 1979,  992,  175,
-     1944, 1949,  175, 1501, 1501, 1501, 1511, 1511, 1511,  175,
+      247,  247,  247, 1956,  248,  248,  248,  249,  249,  249,
+      245, 1950, 1957,  246, 1959, 1960,  247, 1961,  175,  175,
+      248, 1965,  175,  249, 1535, 1535, 1535, 1950, 1016,  175,
+     1967, 1970,  175, 1537, 1537, 1537, 1541, 1541, 1541,  175,
 
       176,  176,  176,  176,  176,  176,  176,  176,  176,  176,
-      176,  176,  176,  176,  176, 1981,  176,  176,  176,  176,
+      176,  176,  176,  176,  176, 1971,  176,  176,  176,  176,
       176,  250,  250,  250,  251,  251,  251,  252,  252,  252,
-     1987,  255,  255,  255,  256,  256,  256,  250, 1748, 1950,
-      251, 1988, 1989,  252, 1748,  176,  176,  255, 1748,  176,
-      256,  298, 1748,  364,  370, 1950,  176, 1996, 1997,  176,
-     1998,  298, 2011,  364, 2017, 2021,  176,  185,  185,  185,
+     1535,  255,  255,  255,  256,  256,  256,  250, 1972, 1537,
+      251, 1973, 1975,  252,  368,  176,  176,  255, 1977,  176,
+      256, 1023, 1023, 1023,  368, 1023,  176, 1978, 1023,  176,
+     1544, 1544, 1544, 1554, 1554, 1554,  176,  185,  185,  185,
       185,  185,  185,  185,  185,  185,  185,  185,  185,  185,
-      185,  185,  370,  185,  185,  185,  185,  185, 2024, 2026,
-      298,  364, 2029,  763,  763,  763,  298, 2031,  370,  780,
-
-      780,  780, 2033,  298, 2034,  364, 2035,  298, 2038,  364,
-      763, 2040,  185,  185, 2045, 2047,  780, 2055,  185,  999,
-      999,  999, 2056,  999, 2057, 2058,  999, 1547, 1547, 1547,
-     1548, 1548, 1548,  185,  186,  186,  186,  186,  186,  186,
-      186,  186,  186,  186,  186,  186,  186,  186,  186, 2060,
-      186,  186,  186,  186,  186,  793,  793,  793,  794,  794,
-      794,  800,  800,  800,  802,  802,  802,  816,  816,  816,
-     2073, 2071,  793, 2074, 2079,  794, 1548, 2071,  800,  186,
-      186,  802, 2080, 2081,  816,  186, 1006, 1006, 1006, 2082,
-     1006, 2086, 2088, 1006, 1549, 1549, 1549, 1550, 1550, 1550,
+      185,  185,  368,  185,  185,  185,  185,  185,  259,  259,
+      259,  260,  260,  260, 1980, 1982,  368,  781,  781,  781,
+
+      368,  944,  944,  944,  259, 1985, 1986,  260, 1988, 1989,
+      302, 1990,  185,  185,  781,  798,  798,  798,  185,  944,
+      302, 1992, 1031, 1031, 1031, 1998, 1031, 1999,  374, 1031,
+     2001, 2004,  798,  185,  186,  186,  186,  186,  186,  186,
+      186,  186,  186,  186,  186,  186,  186,  186,  186,  302,
+      186,  186,  186,  186,  186,  302,  374,  811,  811,  811,
+     2012, 2017,  302, 1590, 1590, 1590,  302,  812,  812,  812,
+     1987, 2022,  374, 2023,  811,  818,  818,  818, 1987,  186,
+      186,  820,  820,  820,  812,  186, 1047, 1047, 1047, 1991,
+     1047, 2030,  818, 1047, 1591, 1591, 1591, 1991,  820, 2031,
 
       186,  195,  195,  195,  195,  195,  195,  195,  195,  195,
-      195,  195,  195,  195,  195,  195, 2073,  195,  195,  195,
-      195,  195,  817,  817,  817,  829,  829,  829,  837,  837,
-      837,  842,  842,  842,  848,  848,  848, 2089, 2090,  817,
-     1549, 2095,  829, 2102, 2104,  837,  195,  195,  842, 2105,
-     2108,  848,  195, 2111, 2115,  195, 1022, 1022, 1022, 2116,
-     1022, 2117, 2118, 1022, 1644, 1644, 1644,  195,  196,  196,
+      195,  195,  195,  195,  195,  195, 2032,  195,  195,  195,
+      195,  195,  835,  835,  835,  836,  836,  836,  848,  848,
+      848,  856,  856,  856,  861,  861,  861, 2000, 2005,  835,
+     1591, 2036,  836, 2006, 2038,  848,  195,  195,  856, 2044,
+     2045,  861,  195, 2000, 2005,  195, 1060, 1060, 1060, 2006,
+     1060, 2046, 2053, 1060, 1592, 1592, 1592,  195,  196,  196,
       196,  196,  196,  196,  196,  196,  196,  196,  196,  196,
-      196,  196,  196, 2119,  196,  196,  196,  196,  196,  870,
-      870,  870,  898,  898,  898,  902,  902,  902,  920,  920,
+      196,  196,  196, 2054,  196,  196,  196,  196,  196,  867,
+      867,  867,  889,  889,  889,  917,  917,  917,  921,  921,
 
-      920, 1749,  921,  921,  921, 2120,  870, 1749, 2121,  898,
-     1644, 1749,  902,  196,  196, 1749,  920, 2122, 2123,  196,
-      921, 2124,  196, 1035, 1035, 1035, 2129, 1035, 2072, 2130,
-     1035, 1703, 1703, 1703,  196,  205,  205,  205,  205,  205,
+      921,  926,  926,  926, 2055, 2058,  867, 2059, 2070,  889,
+     1592, 2076,  917,  196,  196,  921, 2080, 2083,  926,  196,
+     2085, 2088,  196, 1062, 1062, 1062, 2090, 1062, 2092, 2093,
+     1062, 1593, 1593, 1593,  196,  205,  205,  205,  205,  205,
       205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
-     2131,  205,  205,  205,  205,  205,  952,  952,  952, 2072,
-      921,  953,  953,  953, 2132,  955,  955,  955, 2137,  959,
-      959,  959, 2141, 2146,  952, 1706, 1706, 1706, 2153,  953,
-      205,  205,  955, 1708, 1708, 1708,  205,  959, 1710, 1710,
-     1710,  205,  206,  206,  206,  206,  206,  206,  206,  206,
-
-      206,  206,  206,  206,  206,  206,  206, 2154,  206,  206,
-      206,  206,  206,  960,  960,  960,  963,  963,  963, 2160,
-     2161,  953,  965,  965,  965,  967,  967,  967,  971,  971,
-      971,  960, 2158,  963, 1713, 1713, 1713,  206,  206,  965,
-     2158, 2163,  967,  206, 2167, 2168,  971, 2169,  206,  209,
+     2094,  205,  205,  205,  205,  205,  945,  945,  945,  976,
+      976,  976, 2097, 2099,  977,  977,  977,  979,  979,  979,
+      983,  983,  983, 1797,  945, 2104, 2106,  976, 2114, 1797,
+      205,  205,  977, 1797,  979, 2115,  205, 1797,  983, 2116,
+     2117,  205,  206,  206,  206,  206,  206,  206,  206,  206,
+
+      206,  206,  206,  206,  206,  206,  206, 2119,  206,  206,
+      206,  206,  206, 2135,  945,  984,  984,  984,  987,  987,
+      987,  995,  995,  995,  977,  989,  989,  989,  991,  991,
+      991, 2137, 2142,  984, 2134,  987, 2143,  206,  206,  995,
+     2134, 2136,  989,  206, 2135,  991, 2144, 2145,  206,  209,
       209,  209,  209,  209,  209,  209,  209,  209,  209,  209,
-      209,  209,  209,  209, 2175,  209,  209,  209,  209,  209,
-      976,  976,  976,  977,  977,  977, 2176,  960, 2177,  978,
-      978,  978, 2159, 2191,  972,  972,  972, 2195,  976, 2196,
-     2159,  977, 2197, 2199,  209,  209,  978,  998,  998,  998,
+      209,  209,  209,  209, 2149,  209,  209,  209,  209,  209,
+     1000, 1000, 1000, 1001, 1001, 1001, 1002, 1002, 1002,  984,
+     1005, 1005, 1005, 2151,  996,  996,  996, 2136, 1000, 2152,
+     2153, 1001, 2154, 1002,  209,  209, 2159, 2166, 1005, 2168,
 
-      209, 2203,  972, 1037, 1037, 1037, 2206, 1037, 2207, 2210,
-     1037, 1715, 1715, 1715,  998,  209,  210,  210,  210,  210,
+      209, 2169,  996, 1068, 1068, 1068, 2172, 1068, 2175, 2179,
+     1068, 1690, 1690, 1690, 2180,  209,  210,  210,  210,  210,
       210,  210,  210,  210,  210,  210,  210,  210,  210,  210,
-      210,  972,  210,  210,  210,  210,  210,  977,  981,  981,
-      981,  982,  982,  982, 2211, 1002, 1002, 1002, 1003, 1003,
-     1003, 1005, 1005, 1005, 2214, 2221,  981, 2208, 2223,  982,
-     2238,  210,  210, 1002, 2209, 2208, 1003,  210, 1005, 1043,
-     1043, 1043, 2209, 1043, 2243, 1715, 1043, 2252,  982, 1723,
-     1723, 1723,  210,  219,  219,  219,  219,  219,  219,  219,
-      219,  219,  219,  219,  219,  219,  219,  219, 2242,  219,
-
-      219,  219,  219,  219, 1008, 1008, 1008, 1009, 1009, 1009,
-     1021, 1021, 1021, 2253, 1003, 1012, 1012, 1012, 1013, 1013,
-     1013, 2243, 1008, 2256, 2263, 1009, 2264, 1021,  219,  219,
-     1016, 1016, 1016, 1012,  219, 2269, 1013,  219, 1046, 1046,
-     1046, 2242, 1046, 2271, 2283, 1046, 2284, 2285, 1016,  219,
+      210,  996,  210,  210,  210,  210,  210, 1001, 1006, 1006,
+     1006, 1022, 1022, 1022, 2181, 1026, 1026, 1026, 1027, 1027,
+     1027, 1030, 1030, 1030, 2182, 2183, 1006, 1690, 1022, 2184,
+     2185,  210,  210, 1026, 2186, 2187, 1027,  210, 1030, 1071,
+     1071, 1071, 2188, 1071, 2193, 1006, 1071, 1751, 1751, 1751,
+     2194, 2195,  210,  219,  219,  219,  219,  219,  219,  219,
+      219,  219,  219,  219,  219,  219,  219,  219, 2196,  219,
+
+      219,  219,  219,  219, 1033, 1033, 1033, 1034, 1034, 1034,
+     1046, 1046, 1046, 2201, 1027, 1037, 1037, 1037, 1038, 1038,
+     1038, 2203, 1033, 2206, 2211, 1034, 2218, 1046,  219,  219,
+     1041, 1041, 1041, 1037,  219, 2219, 1038,  219, 1086, 1086,
+     1086, 2225, 1086, 2226, 2228, 1086, 2232, 2233, 1041,  219,
       220,  220,  220,  220,  220,  220,  220,  220,  220,  220,
-      220,  220,  220,  220,  220, 2286,  220,  220,  220,  220,
-      220, 2287, 2288, 1009, 1017, 1017, 1017, 2289, 2290, 1013,
-     1026, 1026, 1026, 2291, 1027, 1027, 1027, 1031, 1031, 1031,
-     2292, 2299, 1017, 2300, 2301,  220,  220, 2303, 1026, 2307,
+      220,  220,  220,  220,  220, 2234,  220,  220,  220,  220,
+      220, 2240, 2241, 1034, 1042, 1042, 1042, 2242, 2246, 1038,
+     1051, 1051, 1051, 2223, 1052, 1052, 1052, 1056, 1056, 1056,
+     2258, 2223, 1042, 2262, 2263,  220,  220, 2264, 1051, 2266,
 
-     2312,  220, 1027, 2316,  220, 1031, 1060, 1060, 1060, 2317,
-     1060, 2318, 2319, 1060, 2320, 2321,  220,  229,  229,  229,
+     2270,  220, 1052, 2224,  220, 1056, 1088, 1088, 1088, 2273,
+     1088, 2224, 2274, 1088, 2277, 2278,  220,  229,  229,  229,
       229,  229,  229,  229,  229,  229,  229,  229,  229,  229,
-      229,  229, 2322,  229,  229,  229,  229,  229, 2325, 1017,
-     1034, 1034, 1034, 2326, 2327, 1027, 1032, 1032, 1032, 1036,
-     1036, 1036, 2333, 1038, 1038, 1038, 2334, 1034, 1039, 1039,
-     1039, 2340,  229,  229, 1032, 2341, 1036, 1717, 1717, 1717,
-      229, 1038,  229, 2342, 2343,  229, 1039, 2357, 2358,  229,
+      229,  229, 2281,  229,  229,  229,  229,  229, 2288, 1042,
+     1059, 1059, 1059, 2290, 2275, 1052, 1057, 1057, 1057, 1061,
+     1061, 1061, 2275, 1063, 1063, 1063, 2305, 1059, 1064, 1064,
+     1064, 2320,  229,  229, 1057, 2276, 1061, 1754, 1754, 1754,
+      229, 1063,  229, 2276, 2310,  229, 1064, 2321, 2324,  229,
      1757, 1757, 1757,  229,  230,  230,  230,  230,  230,  230,
-      230,  230,  230,  230,  230,  230,  230,  230,  230, 2359,
+      230,  230,  230,  230,  230,  230,  230,  230,  230, 2327,
 
-      230,  230,  230,  230,  230, 1042, 1042, 1042, 1032, 1045,
-     1045, 1045, 2360, 1717, 1047, 1047, 1047, 2295, 2295, 1039,
-     2295, 2362, 1042, 1057, 1057, 1057, 1045, 2364, 2295,  230,
-      230, 1047, 1059, 1059, 1059, 2295, 2387,  230, 2328,  230,
-     2388, 1057,  230, 1759, 1759, 1759,  230, 2393, 2328, 1059,
+      230,  230,  230,  230,  230, 1067, 1067, 1067, 1057, 1070,
+     1070, 1070, 2332, 2333, 1072, 1072, 1072, 2310, 2338, 1064,
+     2340, 2352, 1067, 1083, 1083, 1083, 1070, 2353, 2354,  230,
+      230, 1072, 1085, 1085, 1085, 2355, 2356,  230, 2357,  230,
+     2311, 1083,  230, 1759, 1759, 1759,  230, 2358, 2359, 1085,
       230,  239,  239,  239,  239,  239,  239,  239,  239,  239,
-      239,  239,  239,  239,  239,  239, 2382,  239,  239,  239,
-      239,  239, 1061, 1061, 1061, 1062, 1062, 1062, 2394, 1062,
-     2395, 2398, 1062, 2401, 1058, 1058, 1058, 2402, 2403, 1061,
-     1063, 1063, 1063, 1064, 1064, 1064,  239,  239, 1065, 1065,
+      239,  239,  239,  239,  239,  239, 2360,  239,  239,  239,
+      239,  239, 1087, 1087, 1087, 1089, 1089, 1089, 1762, 1762,
+     1762, 1772, 1772, 1772, 1084, 1084, 1084, 2311, 2361, 1087,
+     2368, 2369, 1089, 1090, 1090, 1090,  239,  239, 1091, 1091,
 
-     1065, 2404, 1058, 2382, 1074, 1074, 1074, 1063, 1074, 2405,
-     1064, 1074, 1082, 1082, 1082, 1065, 1082, 2381, 2406, 1082,
+     1091, 2370, 1084, 2372, 1100, 1100, 1100, 2376, 1100, 2378,
+     1090, 1100, 1108, 1108, 1108, 1091, 1108, 2382, 2386, 1108,
       239,  240,  240,  240,  240,  240,  240,  240,  240,  240,
-      240,  240,  240,  240,  240,  240, 2407,  240,  240,  240,
-      240,  240, 1058, 2408, 1064, 1068, 1068, 1068, 2409, 2381,
-     1065, 1066, 1066, 1066, 2410, 1073, 1073, 1073, 2411, 2413,
-     1067, 1067, 1067, 1068, 2414, 2416,  240,  240, 1066, 1069,
-     1069, 1069, 1073, 2417, 1087, 1087, 1087, 1067, 1087, 2415,
-     2418, 1087, 1093, 1093, 1093, 2419, 1093, 1069, 2415, 1093,
+      240,  240,  240,  240,  240,  240, 2387,  240,  240,  240,
+      240,  240, 1084, 2388, 1090, 1094, 1094, 1094, 2389, 2390,
+     1091, 1092, 1092, 1092, 2391, 1099, 1099, 1099, 2392, 2395,
+     1093, 1093, 1093, 1094, 2396, 2397,  240,  240, 1092, 1095,
+     1095, 1095, 1099, 2403, 1113, 1113, 1113, 1093, 1113, 2404,
+     2405, 1113, 1119, 1119, 1119, 2413, 1119, 1095, 2414, 1119,
       240,  243,  243,  243,  243,  243,  243,  243,  243,  243,
 
-      243,  243,  243,  243,  243,  243, 1066,  243,  243,  243,
-      243,  243, 1067, 1075, 1075, 1075, 1069, 1078, 1078, 1078,
-     1079, 1079, 1079, 1081, 1081, 1081, 1083, 1083, 1083, 2421,
-     1075, 1760, 1760, 1760, 2422, 1078,  243,  243, 1079, 2424,
-     1081, 1725, 1725, 1725, 1083, 2425, 2427,  243,  244,  244,
+      243,  243,  243,  243,  243,  243, 1092,  243,  243,  243,
+      243,  243, 1093, 1101, 1101, 1101, 1095, 1104, 1104, 1104,
+     1105, 1105, 1105, 1107, 1107, 1107, 1109, 1109, 1109, 2398,
+     1101, 1764, 1764, 1764, 2415, 1104,  243,  243, 1105, 2398,
+     1107, 1766, 1766, 1766, 1109, 2416, 2430,  243,  244,  244,
       244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
-      244,  244,  244, 2428,  244,  244,  244,  244,  244, 2430,
-     2436, 1079, 1084, 1084, 1084, 1086, 1086, 1086, 1089, 1089,
-     1089, 1090, 1090, 1090, 1092, 1092, 1092, 1725, 2420, 2437,
-     1084, 2438, 1086,  244,  244, 2440, 1089, 2420, 2445, 1090,
+      244,  244,  244, 2431,  244,  244,  244,  244,  244, 2432,
+     2433, 1105, 1110, 1110, 1110, 1112, 1112, 1112, 1115, 1115,
+     1115, 1116, 1116, 1116, 1118, 1118, 1118, 1766, 2435, 2437,
+     1110, 2461, 1112,  244,  244, 1764, 1115, 2456, 2462, 1116,
 
-     2446, 1092, 2447, 2448,  244,  253,  253,  253,  253,  253,
+     2455, 1118, 2465, 2468,  244,  253,  253,  253,  253,  253,
       253,  253,  253,  253,  253,  253,  253,  253,  253,  253,
-     2449,  253,  253,  253,  253,  253, 2452, 2458, 1090, 1097,
-     1097, 1097, 2459, 1084, 2461, 1098, 1098, 1098, 1099, 1099,
-     1099, 1100, 1100, 1100, 1102, 1102, 1102, 1097, 2470, 2472,
-      253,  253, 2475, 1098, 2477, 1099, 2501, 2502, 1100, 2504,
-     2505,  253, 1102, 1113, 1113, 1113, 2506, 1113, 2497, 2498,
-     1113, 1799, 1799, 1799,  253,  254,  254,  254,  254,  254,
+     2469,  253,  253,  253,  253,  253, 2470, 2473, 1116, 1123,
+     1123, 1123, 2455, 1110, 2456, 1124, 1124, 1124, 1125, 1125,
+     1125, 1126, 1126, 1126, 1128, 1128, 1128, 1123, 2476, 2477,
+      253,  253, 2478, 1124, 2479, 1125, 2480, 2481, 1126, 2482,
+     2483,  253, 1128, 1139, 1139, 1139, 2484, 1139, 2485, 2486,
+     1139, 1774, 1774, 1774,  253,  254,  254,  254,  254,  254,
       254,  254,  254,  254,  254,  254,  254,  254,  254,  254,
-     1098,  254,  254,  254,  254,  254, 1101, 1101, 1101, 1103,
-
-     1103, 1103, 1105, 1105, 1105, 2497, 1106, 1106, 1106, 1107,
-     1107, 1107, 2498, 1101, 1109, 1109, 1109, 1103, 2496, 1105,
-      254,  254, 2511, 1106, 2512, 2513, 1107, 2514, 1110, 1110,
-     1110,  254, 1109, 1108, 1108, 1108, 1112, 1112, 1112, 1114,
-     1114, 1114, 2515, 2516,  254,  296, 1110, 1116, 1116, 1116,
-     1108, 2517,  296, 1112, 2518, 1101, 1106, 1114, 2496, 2519,
-     1103,  296,  296, 2520, 1116, 1110, 1115, 1115, 1115, 2521,
-     2523, 1106, 1898, 1898, 1898, 2524, 1117, 1117, 1117, 2525,
-     1118, 1118, 1118, 2526, 1115, 1119, 1119, 1119, 2527,  296,
-      296,  296, 1108, 1117, 2528,  296,  296,  296, 1118, 2529,
-
-      296,  296, 2530, 1119,  296, 2531,  296,  296,  296,  361,
-     1120, 1120, 1120, 1121, 1121, 1121,  361, 1122, 1122, 1122,
-     2532, 1115, 1123, 1123, 1123,  361,  361, 1120, 2533, 2534,
-     1121, 1124, 1124, 1124, 1122, 1136, 1136, 1136, 2509, 2535,
-     1123, 1140, 1140, 1140, 1130, 1130, 1130, 2536, 2509, 1124,
-     2538, 2509, 1136,  361,  361,  361, 1119, 2539, 1140,  361,
-      361,  361, 1130, 1121,  361,  361, 2541, 2547,  361, 2554,
-      361,  361,  361, 1131, 1131, 1131, 2555, 2556, 1121, 1134,
-     1134, 1134, 1135, 1135, 1135, 1137, 1137, 1137, 2510, 1137,
-     2558, 1131, 1137, 1138, 1138, 1138, 2562, 1134, 2510, 2565,
-
-     1135, 2510, 1124, 1139, 1139, 1139, 1141, 1141, 1141, 2606,
-     1141, 1138, 2603, 1141, 1143, 1143, 1143, 1144, 1144, 1144,
-     2608, 1139, 1159, 1159, 1159, 1160, 1160, 1160, 2588, 1162,
-     1162, 1162, 1143, 2609, 2610, 1144, 2613, 1131, 2588, 2614,
-     1159, 2603, 2616, 1160, 2588, 2617, 1135, 1162, 1193, 1193,
-     1193, 1194, 1194, 1194, 1195, 1195, 1195, 1197, 1197, 1197,
-     1198, 1198, 1198, 2604, 1139, 1193, 1199, 1199, 1199, 1194,
-     1199, 2619, 1195, 1199, 2605, 1197, 1162, 1198, 1202, 1202,
-     1202, 1144, 1204, 1204, 1204, 1205, 1205, 1205, 2589, 1207,
-     1207, 1207, 1209, 1209, 1209, 1202, 1209, 2620, 2589, 1209,
-
-     1204, 2615, 2621, 1205, 2589, 2604, 1197, 1207, 1212, 1212,
-     1212, 1213, 1213, 1213, 2615, 1213, 2605, 2618, 1213, 2622,
-     1214, 1214, 1214, 2623, 2625, 1212, 1215, 1215, 1215, 2626,
-     2618, 1216, 1216, 1216, 2627, 1216, 1207, 1214, 1216, 1202,
-     1218, 1218, 1218, 1215, 1220, 1220, 1220, 1221, 1221, 1221,
-     1223, 1223, 1223, 1225, 1225, 1225, 2628, 1218, 1227, 1227,
-     1227, 2631, 1220, 2632, 2633, 1221, 2634, 2635, 1223, 2636,
-     1225, 1228, 1228, 1228, 2637, 2638, 1227, 1230, 1230, 1230,
-     1231, 1231, 1231, 2639, 1231, 2640, 2641, 1231, 2642, 1228,
-     1235, 1235, 1235, 2643, 2645, 1230, 1236, 1236, 1236, 1238,
-
-     1238, 1238, 1253, 1253, 1253, 2657, 1253, 2658, 1235, 1253,
-     1223, 1257, 1257, 1257, 1236, 2663, 2667, 1238, 1258, 1258,
-     1258, 1259, 1259, 1259, 1230, 1261, 1261, 1261, 1257, 2685,
-     1263, 1263, 1263, 2686, 1263, 2687, 1258, 1263, 2688, 1259,
-     1267, 1267, 1267, 1261, 1268, 1268, 1268, 1270, 1270, 1270,
-     1271, 1271, 1271, 1272, 1272, 1272, 2689, 2690, 1267, 1273,
-     1273, 1273, 1268, 2702, 2700, 1270, 2705, 1271, 2706, 2710,
-     1272, 1274, 1274, 1274, 1276, 1276, 1276, 1273, 1277, 1277,
-     1277, 1278, 1278, 1278, 2694, 2711, 1261, 2712, 2713, 1274,
-     2714, 2715, 1276, 2716, 2695, 1277, 2717, 2694, 1278, 2700,
-
-     1272, 1279, 1279, 1279, 1280, 1280, 1280, 2695, 1270, 1278,
-     1282, 1282, 1282, 1285, 1285, 1285, 1286, 1286, 1286, 1279,
-     1286, 2719, 1280, 1286, 1292, 1292, 1292, 2720, 1282, 2721,
-     1285, 1293, 1293, 1293, 1295, 1295, 1295, 1298, 1298, 1298,
-     2722, 1276, 1292, 1299, 1299, 1299, 1300, 1300, 1300, 1293,
-     2723, 2724, 1295, 2725, 1298, 1302, 1302, 1302, 1303, 1303,
-     1303, 1299, 2726, 2728, 1300, 1304, 1304, 1304, 2699, 1304,
-     2729, 2730, 1304, 1302, 2731, 1303, 1282, 1307, 1307, 1307,
-     2732, 1307, 2733, 2734, 1307, 1310, 1310, 1310, 1311, 1311,
-     1311, 1313, 1313, 1313, 1318, 1318, 1318, 2735, 1318, 1295,
-
-     2736, 1318, 2737, 1310, 2738, 2739, 1311, 2740, 2750, 1313,
-     1321, 1321, 1321, 1322, 1322, 1322, 2699, 1322, 2754, 2755,
-     1322, 2763, 1302, 1325, 1325, 1325, 2764, 1321, 1326, 1326,
-     1326, 2781, 1326, 2782, 2783, 1326, 1336, 1336, 1336, 2784,
-     1325, 1337, 1337, 1337, 1339, 1339, 1339, 2776, 1340, 1340,
-     1340, 2777, 1340, 2785, 1336, 1340, 1313, 2776, 2779, 1337,
-     2786, 2777, 1339, 1343, 1343, 1343, 2789, 1343, 2779, 2780,
-     1343, 1346, 1346, 1346, 1347, 1347, 1347, 2790, 1347, 2780,
-     2791, 1347, 1352, 1352, 1352, 1353, 1353, 1353, 1346, 1355,
-     1355, 1355, 1360, 1360, 1360, 2792, 1360, 2793, 2801, 1360,
-
-     1352, 2802, 2803, 1353, 1363, 1363, 1363, 1355, 1364, 1364,
-     1364, 1339, 1364, 2804, 2805, 1364, 1367, 1367, 1367, 2806,
-     2807, 1363, 1368, 1368, 1368, 1370, 1370, 1370, 1372, 1372,
-     1372, 2793, 1372, 2808, 1367, 1372, 2811, 1355, 2812, 2814,
-     1368, 2815, 2816, 1370, 1375, 1375, 1375, 1376, 1376, 1376,
-     1378, 1378, 1378, 1380, 1380, 1380, 2818, 1380, 2820, 2821,
-     1380, 2822, 1375, 2825, 2826, 1376, 2827, 2828, 1378, 1384,
-     1384, 1384, 1385, 1385, 1385, 2831, 1370, 1387, 1387, 1387,
-     2844, 1389, 1389, 1389, 2845, 1389, 2846, 1384, 1389, 2854,
-     1385, 1395, 1395, 1395, 2860, 1387, 1396, 1396, 1396, 2861,
-
-     1398, 1398, 1398, 1399, 1399, 1399, 1400, 1400, 1400, 1395,
-     1400, 2862, 2863, 1400, 1396, 2864, 2865, 1378, 1398, 2866,
-     1399, 1401, 1401, 1401, 2867, 2868, 1387, 1402, 1402, 1402,
-     2869, 1402, 2871, 2872, 1402, 1404, 1404, 1404, 1401, 1405,
-     1405, 1405, 2877, 1407, 1407, 1407, 1409, 1409, 1409, 2878,
-     1413, 1413, 1413, 1404, 1902, 1902, 1902, 1405, 2879, 2880,
-     1398, 1407, 2890, 1409, 1410, 1410, 1410, 1413, 1410, 2891,
-     2892, 1410, 1414, 1414, 1414, 2893, 1414, 2894, 2895, 1414,
-     1416, 1416, 1416, 1417, 1417, 1417, 1419, 1419, 1419, 1421,
-     1421, 1421, 2896, 1421, 2897, 2901, 1421, 2902, 1416, 2903,
-
-     2881, 1417, 2904, 2905, 1419, 1424, 1424, 1424, 2906, 2908,
-     1407, 1425, 1425, 1425, 1427, 1427, 1427, 1428, 1428, 1428,
-     1429, 1429, 1429, 1424, 1429, 2909, 2911, 1429, 2912, 1425,
-     2913, 2915, 1427, 2919, 1428, 1430, 1430, 1430, 1431, 1431,
-     1431, 2920, 1431, 2881, 2921, 1431, 1432, 1432, 1432, 2924,
-     1419, 2929, 1430, 1433, 1433, 1433, 2930, 1435, 1435, 1435,
-     1436, 1436, 1436, 2931, 1432, 1437, 1437, 1437, 2932, 1437,
-     2933, 1433, 1437, 2934, 1427, 1435, 2935, 1436, 1440, 1440,
-     1440, 1441, 1441, 1441, 2936, 1441, 2937, 2938, 1441, 1442,
-     1442, 1442, 1443, 1443, 1443, 1440, 1445, 1445, 1445, 1447,
-
-     1447, 1447, 1451, 1451, 1451, 2939, 2940, 1442, 2942, 2943,
-     1443, 1452, 1452, 1452, 1445, 2944, 1447, 2945, 2946, 1435,
-     1451, 1454, 1454, 1454, 1457, 1457, 1457, 2948, 2952, 1452,
-     1458, 1458, 1458, 1460, 1460, 1460, 1461, 1461, 1461, 1454,
-     1461, 2948, 1457, 1461, 1464, 1464, 1464, 2955, 1458, 2956,
-     2959, 1460, 1465, 1465, 1465, 1467, 1467, 1467, 1445, 1468,
-     1468, 1468, 1464, 1468, 2946, 2961, 1468, 1472, 1472, 1472,
-     1465, 2962, 2949, 1467, 1473, 1473, 1473, 1475, 1475, 1475,
-     2964, 2965, 1454, 2949, 2968, 1472, 1460, 1477, 1477, 1477,
-     2969, 2970, 1473, 2971, 2972, 1475, 1484, 1484, 1484, 1514,
-
-     1514, 1514, 1516, 1516, 1516, 1477, 1477, 2973, 1517, 1517,
-     1517, 1542, 1542, 1542, 1484, 1467, 1514, 1515, 1515, 1515,
-     1516, 1515, 2974, 2975, 1515, 1517, 1518, 1518, 1518, 1542,
-     1518, 2976, 2978, 1518, 1521, 1521, 1521, 2980, 1475, 1523,
-     1523, 1523, 2988, 1523, 2978, 2979, 1523, 1526, 1526, 1526,
-     2990, 2985, 1521, 2992, 1527, 1527, 1527, 2979, 1527, 2986,
-     1516, 1527, 1484, 2985, 1526, 1528, 1528, 1528, 2994, 1528,
-     3002, 2986, 1528, 1532, 1532, 1532, 3004, 1533, 1533, 1533,
-     3008, 1533, 3005, 1521, 1533, 1535, 1535, 1535, 3006, 3010,
-     1532, 1537, 1537, 1537, 1538, 1538, 1538, 3012, 1538, 3007,
-
-     3007, 1538, 3006, 1535, 1539, 1539, 1539, 3013, 1537, 1540,
-     1540, 1540, 1558, 1558, 1558, 1559, 1559, 1559, 1560, 1560,
-     1560, 1539, 1560, 3005, 3014, 1560, 3015, 1540, 3030, 1558,
-     3021, 3029, 1559, 3032, 3031, 1535, 1561, 1561, 1561, 1564,
-     1564, 1564, 1565, 1565, 1565, 1566, 1566, 1566, 3021, 1566,
-     3029, 3035, 1566, 3031, 1561, 3037, 3024, 1564, 1540, 1565,
-     1568, 1568, 1568, 1569, 1569, 1569, 1570, 1570, 1570, 3042,
-     1570, 3024, 3043, 1570, 1572, 1572, 1572, 3034, 1568, 3009,
-     1569, 1575, 1575, 1575, 1576, 1576, 1576, 3045, 1576, 3046,
-     3009, 1576, 1572, 1577, 1577, 1577, 3034, 3047, 1575, 3036,
-
-     1561, 3049, 3050, 1564, 1579, 1579, 1579, 1580, 1580, 1580,
-     1577, 1583, 1583, 1583, 3051, 1584, 1584, 1584, 3036, 1584,
-     1568, 1579, 1584, 3052, 3054, 1580, 3056, 3063, 1583, 1585,
-     1585, 1585, 1586, 1586, 1586, 1572, 1587, 1587, 1587, 3064,
-     1587, 3065, 3066, 1587, 1588, 1588, 1588, 1585, 3067, 1586,
-     1579, 1590, 1590, 1590, 1593, 1593, 1593, 1594, 1594, 1594,
-     3068, 1594, 1588, 3071, 1594, 1595, 1595, 1595, 1590, 1595,
-     3072, 1593, 1595, 1580, 1600, 1600, 1600, 1607, 1607, 1607,
-     1608, 1608, 1608, 3073, 1608, 3074, 3075, 1608, 1611, 1611,
-     1611, 1600, 1612, 1612, 1612, 1607, 1613, 1613, 1613, 1614,
-
-     1614, 1614, 1615, 1615, 1615, 1611, 1617, 1617, 1617, 1612,
-     1588, 3076, 3077, 1613, 3078, 3080, 1614, 1620, 1620, 1620,
-     1615, 1620, 3082, 1617, 1620, 3084, 3085, 1623, 1623, 1623,
-     1625, 1625, 1625, 1627, 1627, 1627, 1630, 1630, 1630, 1634,
-     1634, 1634, 1607, 1613, 1623, 1635, 1635, 1635, 1625, 3086,
-     3096, 1627, 3097, 3098, 1630, 3094, 1634, 1615, 3095, 1643,
-     1643, 1643, 1612, 1635, 1636, 1636, 1636, 3094, 1636, 1614,
-     3095, 1636, 1639, 1639, 1639, 3099, 1639, 1643, 3100, 1639,
-     1645, 1645, 1645, 3101, 1645, 1634, 3105, 1645, 1650, 1650,
-     1650, 3106, 1650, 1630, 1625, 1650, 1654, 1654, 1654, 1627,
-
-     3107, 3108, 1635, 1656, 1656, 1656, 1657, 1657, 1657, 3109,
-     1657, 3110, 3111, 1657, 1654, 1660, 1660, 1660, 3112, 1660,
-     3115, 1656, 1660, 3116, 3117, 1643, 1663, 1663, 1663, 1664,
-     1664, 1664, 3118, 1664, 3119, 3120, 1664, 3121, 1669, 1669,
-     1669, 3122, 1669, 3123, 1663, 1669, 1672, 1672, 1672, 1674,
-     1674, 1674, 1675, 1675, 1675, 3124, 1675, 1654, 3113, 1675,
-     1656, 1679, 1679, 1679, 1672, 3125, 1674, 1681, 1681, 1681,
-     1682, 1682, 1682, 1663, 1683, 1683, 1683, 3126, 3127, 1679,
-     1684, 1684, 1684, 3113, 1681, 1685, 1685, 1685, 1682, 1688,
-     1688, 1688, 1683, 1672, 1695, 1695, 1695, 1684, 1726, 1726,
-
-     1726, 3128, 1726, 1685, 3129, 1726, 3130, 1688, 3131, 3132,
-     1679, 3133, 1695, 1729, 1729, 1729, 1730, 1730, 1730, 3134,
-     1730, 3140, 3141, 1730, 3142, 3137, 1683, 1735, 1735, 1735,
-     3143, 1729, 1737, 1737, 1737, 3144, 1737, 1682, 3145, 1737,
-     1688, 1745, 1745, 1745, 3137, 1735, 1695, 1685, 1741, 1741,
-     1741, 3146, 1741, 3147, 3148, 1741, 3149, 1688, 3150, 1745,
-     1747, 1747, 1747, 3151, 1747, 3152, 3153, 1747, 1750, 1750,
-     1750, 3154, 1751, 1751, 1751, 3155, 1751, 3156, 1735, 1751,
-     1729, 1752, 1752, 1752, 3157, 1750, 1761, 1761, 1761, 1765,
-     1765, 1765, 1766, 1766, 1766, 1768, 1768, 1768, 3158, 1752,
-
-     3159, 3160, 1745, 1769, 1769, 1769, 3161, 1769, 3162, 3163,
-     1769, 3164, 1768, 1770, 1770, 1770, 3165, 1770, 3158, 3166,
-     1770, 1773, 1773, 1773, 1775, 1775, 1775, 1776, 1776, 1776,
-     3167, 3168, 1752, 1777, 1777, 1777, 3169, 1777, 3170, 1773,
-     1777, 1775, 1781, 1781, 1781, 1776, 3171, 1782, 1782, 1782,
-     1761, 1782, 3172, 1765, 1782, 3173, 1766, 1786, 1786, 1786,
-     1781, 1785, 1785, 1785, 3174, 1789, 1789, 1789, 1773, 1789,
-     3175, 3176, 1789, 3180, 1776, 1786, 3181, 3182, 1785, 1792,
-     1792, 1792, 1793, 1793, 1793, 3183, 1793, 3184, 3185, 1793,
-     1794, 1794, 1794, 1795, 1795, 1795, 1792, 1796, 1796, 1796,
-
-     3177, 1796, 3187, 3188, 1796, 3190, 3177, 1794, 1781, 3191,
-     1795, 1798, 1798, 1798, 3193, 1801, 1801, 1801, 3194, 1801,
-     3197, 1786, 1801, 1804, 1804, 1804, 1806, 1806, 1806, 1798,
-     1806, 3196, 3198, 1806, 1809, 1809, 1809, 1811, 1811, 1811,
-     3199, 1804, 1812, 1812, 1812, 3196, 1812, 3200, 3202, 1812,
-     3204, 3206, 1809, 3208, 1811, 1813, 1813, 1813, 1815, 1815,
-     1815, 3210, 1815, 3211, 3212, 1815, 1820, 1820, 1820, 1821,
-     1821, 1821, 1813, 1821, 3213, 3214, 1821, 1822, 1822, 1822,
-     1809, 3215, 3216, 1820, 1827, 1827, 1827, 1828, 1828, 1828,
-     1829, 1829, 1829, 3217, 1822, 1830, 1830, 1830, 3219, 1830,
-
-     3221, 1827, 1830, 3223, 3224, 1828, 3225, 1829, 1831, 1831,
-     1831, 1832, 1832, 1832, 1833, 1833, 1833, 1834, 1834, 1834,
-     1836, 1836, 1836, 3226, 3239, 1831, 3259, 1512, 1832, 1510,
-     3235, 1833, 1837, 1837, 1837, 1834, 1837, 1836, 3255, 1837,
-     1838, 1838, 1838, 1840, 1840, 1840, 3241, 1841, 1841, 1841,
-     3241, 1841, 3242, 1828, 1841, 3227, 3242, 1838, 3259, 3243,
-     1840, 1843, 1843, 1843, 1845, 1845, 1845, 3243, 3239, 1832,
-     1848, 1848, 1848, 1852, 1852, 1852, 3228, 1834, 3235, 1843,
-     1509, 1508, 1845, 3247, 3255, 1853, 1853, 1853, 1848, 1853,
-     1852, 3227, 1853, 1855, 1855, 1855, 1857, 1857, 1857, 1859,
-
-     1859, 1859, 1860, 1860, 1860, 1861, 1861, 1861, 1862, 1862,
-     1862, 1855, 3228, 3244, 1857, 1845, 1859, 3236, 1848, 1860,
-     3237, 3244, 1861, 1865, 1865, 1865, 1862, 1864, 1864, 1864,
-     3247, 1866, 1866, 1866, 1867, 1867, 1867, 1868, 1868, 1868,
-     3260, 1865, 1870, 1870, 1870, 1864, 1870, 1857, 1866, 1870,
-     3238, 1867, 1876, 1876, 1876, 1868, 3240, 1878, 1878, 1878,
-     1879, 1879, 1879, 3245, 1879, 3236, 1507, 1879, 3237, 1861,
-     1876, 3245, 3260, 1864, 1878, 1862, 1880, 1880, 1880, 1881,
-     1881, 1881, 1882, 1882, 1882, 1883, 1883, 1883, 1865, 1883,
-     1506, 1505, 1883, 3246, 1880, 3249, 3250, 1881, 3238, 1882,
-
-     3240, 3246, 1868, 1876, 1884, 1884, 1884, 1890, 1890, 1890,
-     1891, 1891, 1891, 1906, 1906, 1906, 1907, 1907, 1907, 1908,
-     1908, 1908, 1884, 3251, 1890, 1910, 1910, 1910, 1891, 1912,
-     1912, 1912, 3249, 3250, 1881, 1880, 1913, 1913, 1913, 1918,
-     1918, 1918, 1920, 1920, 1920, 1923, 1923, 1923, 1925, 1925,
-     1925, 1927, 1927, 1927, 3248, 1928, 1928, 1928, 3252, 3253,
-     1920, 3299, 3256, 1923, 3251, 1925, 1937, 1937, 1937, 1927,
-     1937, 1891, 1928, 1937, 3254, 1940, 1940, 1940, 1941, 1941,
-     1941, 1946, 1946, 1946, 1947, 1947, 1947, 1951, 1951, 1951,
-     3257, 3263, 1920, 1940, 3253, 1941, 1952, 1952, 1952, 3252,
-
-     1952, 3248, 3299, 1952, 1951, 1955, 1955, 1955, 3256, 3254,
-     1927, 1956, 1956, 1956, 1957, 1957, 1957, 3258, 1958, 1958,
-     1958, 1940, 1958, 1955, 3307, 1958, 3263, 3257, 1956, 1504,
-     1503, 1957, 3261, 1951, 1959, 1959, 1959, 1961, 1961, 1961,
-     3262, 3261, 1962, 1962, 1962, 3264, 1963, 1963, 1963, 3262,
-     1963, 3267, 1959, 1963, 3258, 1961, 3307, 1956, 1955, 1962,
-     1964, 1964, 1964, 1967, 1967, 1967, 3265, 1967, 3268, 3277,
-     1967, 1970, 1970, 1970, 1502, 1971, 1971, 1971, 1964, 1971,
-     3264, 3269, 1971, 1976, 1976, 1976, 3275, 1959, 1970, 1972,
-     1972, 1972, 3266, 1972, 3267, 3275, 1972, 1978, 1978, 1978,
-
-     3265, 1976, 1980, 1980, 1980, 1500, 3277, 1964, 1982, 1982,
-     1982, 3268, 1982, 3273, 3274, 1982, 1985, 1985, 1985, 3270,
-     1980, 1986, 1986, 1986, 3318, 1986, 3266, 3269, 1986, 3289,
-     1990, 1990, 1990, 1985, 1990, 3318, 3279, 1990, 1993, 1993,
-     1993, 1994, 1994, 1994, 3271, 1994, 3273, 3274, 1994, 1995,
-     1995, 1995, 1999, 1999, 1999, 1993, 3272, 2000, 2000, 2000,
-     1980, 2000, 3281, 3289, 2000, 3270, 1995, 3276, 3278, 1999,
-     2001, 2001, 2001, 2002, 2002, 2002, 3276, 2002, 3279, 3271,
-     2002, 2005, 2005, 2005, 1499, 2006, 2006, 2006, 2001, 2006,
-     3282, 3272, 2006, 2007, 2007, 2007, 3283, 1497, 2005, 2008,
-
-     2008, 2008, 2009, 2009, 2009, 3278, 2009, 3284, 3281, 2009,
-     2007, 2010, 2010, 2010, 1496, 3287, 2008, 1494, 2012, 2012,
-     2012, 2001, 2012, 3280, 3287, 2012, 2015, 2015, 2015, 2010,
-     2016, 2016, 2016, 3283, 2016, 3300, 3282, 2016, 2018, 2018,
-     2018, 1491, 2018, 2015, 3284, 2018, 2022, 2022, 2022, 2025,
-     2025, 2025, 2027, 2027, 2027, 2028, 2028, 2028, 2030, 2030,
-     2030, 3285, 2010, 3286, 2022, 3280, 3290, 2025, 3291, 2027,
-     2032, 2032, 2032, 2028, 2032, 2030, 3300, 2032, 2036, 2036,
-     2036, 2039, 2039, 2039, 2041, 2041, 2041, 2042, 2042, 2042,
-     3285, 2042, 3286, 3288, 2042, 3293, 2036, 3292, 1490, 2039,
-
-     3290, 2041, 3288, 3293, 2030, 2043, 2043, 2043, 2044, 2044,
-     2044, 1489, 2044, 2025, 3291, 2044, 2028, 2046, 2046, 2046,
-     3301, 3308, 2043, 2048, 2048, 2048, 2049, 2049, 2049, 2050,
-     2050, 2050, 2051, 2051, 2051, 2046, 2051, 3294, 3297, 2051,
-     3295, 2048, 3302, 3292, 2049, 3294, 2050, 2052, 2052, 2052,
-     2053, 2053, 2053, 3308, 2053, 3301, 3298, 2053, 2054, 2054,
-     2054, 2059, 2059, 2059, 2052, 3296, 2061, 2061, 2061, 1488,
-     2061, 3313, 2048, 2061, 3305, 3297, 2054, 3302, 3303, 2059,
-     2064, 2064, 2064, 2046, 2065, 2065, 2065, 3295, 2066, 2066,
-     2066, 2049, 2066, 3298, 1487, 2066, 1486, 1485, 2064, 2069,
-
-     2069, 2069, 2065, 2075, 2075, 2075, 2076, 2076, 2076, 3309,
-     2076, 3305, 3296, 2076, 2077, 2077, 2077, 2069, 3309, 3313,
-     2075, 3310, 3317, 2054, 3303, 1483, 2059, 2078, 2078, 2078,
-     3310, 2064, 2077, 2083, 2083, 2083, 3317, 2065, 2084, 2084,
-     2084, 2085, 2085, 2085, 2087, 2087, 2087, 2091, 2091, 2091,
-     2092, 2092, 2092, 2093, 2093, 2093, 2094, 2094, 2094, 2096,
-     2096, 2096, 2097, 2097, 2097, 2098, 2098, 2098, 2099, 2099,
-     2099, 2100, 2100, 2100, 2101, 2101, 2101, 3304, 2077, 2103,
-     2103, 2103, 2106, 2106, 2106, 1482, 2109, 2109, 2109, 2110,
-     2110, 2110, 3306, 2110, 1481, 1480, 2110, 2103, 1471, 1456,
-
-     2106, 1455, 2094, 2109, 2112, 2112, 2112, 2113, 2113, 2113,
-     2114, 2114, 2114, 1450, 2114, 1449, 1448, 2114, 2125, 2125,
-     2125, 1446, 2112, 3304, 2113, 2126, 2126, 2126, 3314, 3306,
-     2103, 2127, 2127, 2127, 1439, 2127, 2125, 1438, 2127, 2128,
-     2128, 2128, 2126, 2133, 2133, 2133, 2134, 2134, 2134, 2135,
-     2135, 2135, 2136, 2136, 2136, 3311, 2136, 1420, 1415, 2136,
-     2138, 2138, 2138, 2139, 2139, 2139, 2135, 2125, 2140, 2140,
-     2140, 3312, 2140, 3315, 3316, 2140, 3314, 1412, 2138, 1411,
-     2139, 2142, 2142, 2142, 1408, 2142, 1403, 3311, 2142, 2145,
-     2145, 2145, 2134, 1394, 2147, 2147, 2147, 2149, 2149, 2149,
-
-     1393, 2149, 1392, 3312, 2149, 3315, 3316, 2145, 2152, 2152,
-     2152, 2138, 2147, 2155, 2155, 2155, 1388, 2155, 1383, 1379,
-     2155, 2162, 2162, 2162, 1371, 1366, 2152, 2164, 2164, 2164,
-     1365, 2164, 1359, 1358, 2164, 2173, 2173, 2173, 1357, 2162,
-     2145, 2170, 2170, 2170, 1356, 2170, 1351, 1350, 2170, 2174,
-     2174, 2174, 2173, 2174, 1349, 1348, 2174, 1335, 2178, 2178,
-     2178, 2152, 2178, 1334, 1333, 2178, 2181, 2181, 2181, 1332,
-     2182, 2182, 2182, 1331, 2182, 1330, 2162, 2182, 2185, 2185,
-     2185, 2186, 2186, 2186, 2181, 2186, 1329, 1328, 2186, 2187,
-     2187, 2187, 1327, 2187, 1317, 2185, 2187, 2190, 2190, 2190,
-
-     2192, 2192, 2192, 1316, 2192, 1315, 1314, 2192, 2198, 2198,
-     2198, 2200, 2200, 2200, 1297, 2190, 2201, 2201, 2201, 1296,
-     2201, 1291, 1290, 2201, 1289, 1284, 2198, 1283, 2200, 1266,
-     2181, 2202, 2202, 2202, 2204, 2204, 2204, 2205, 2205, 2205,
-     1262, 2205, 1256, 1252, 2205, 1251, 2212, 2212, 2212, 2202,
-     1250, 2204, 2215, 2215, 2215, 1249, 2215, 1248, 1247, 2215,
-     2222, 2222, 2222, 2190, 2212, 2218, 2218, 2218, 1246, 2218,
-     1244, 1243, 2218, 1241, 2224, 2224, 2224, 1240, 2222, 2225,
-     2225, 2225, 2226, 2226, 2226, 1239, 2226, 1234, 1226, 2226,
-     1224, 2202, 2224, 1219, 2229, 2229, 2229, 2225, 2229, 1217,
-
-     1208, 2229, 2232, 2232, 2232, 1203, 2233, 2233, 2233, 1192,
-     1190, 2222, 2234, 2234, 2234, 2225, 2235, 2235, 2235, 1189,
-     2232, 1188, 2232, 2233, 2236, 2236, 2236, 1187, 1185, 2234,
-     2237, 2237, 2237, 2235, 2239, 2239, 2239, 2240, 2240, 2240,
-     2224, 2236, 2241, 2241, 2241, 2244, 2244, 2244, 2237, 2245,
-     2245, 2245, 2239, 2245, 1184, 2240, 2245, 2248, 2248, 2248,
-     2241, 1183, 1182, 2234, 2249, 2249, 2249, 2250, 2250, 2250,
-     2251, 2251, 2251, 1181, 1180, 2248, 2254, 2254, 2254, 1178,
-     2235, 1177, 1176, 2236, 2255, 2255, 2255, 2257, 2257, 2257,
-     2258, 2258, 2258, 1175, 2239, 2237, 2259, 2259, 2259, 2260,
-
-     2260, 2260, 2261, 2261, 2261, 2262, 2262, 2262, 2265, 2265,
-     2265, 2266, 2266, 2266, 1174, 1173, 2248, 2267, 2267, 2267,
-     2268, 2268, 2268, 2270, 2270, 2270, 2273, 2273, 2273, 2274,
-     2274, 2274, 1172, 2274, 1170, 1169, 2274, 2277, 2277, 2277,
-     1168, 2270, 1167, 2273, 2278, 2278, 2278, 1166, 2280, 2280,
-     2280, 1165, 2280, 1164, 2277, 2280, 2293, 2293, 2293, 2294,
-     2294, 2294, 2278, 2294, 2296, 2296, 2294, 2296, 2297, 2297,
-     2297, 2298, 2298, 2298, 2293, 2296, 2302, 2302, 2302, 2304,
-     2304, 2304, 2296, 2304, 1158, 1157, 2304, 2308, 2308, 2308,
-     2309, 2309, 2309, 1156, 2309, 1153, 1152, 2309, 2313, 2313,
-
-     2313, 1151, 1149, 2277, 1145, 2308, 2314, 2314, 2314, 2315,
-     2315, 2315, 2323, 2323, 2323, 1142, 2313, 2293, 2324, 2324,
-     2324, 1133, 1132, 2314, 2329, 2329, 2329, 2315, 2329, 1129,
-     1128, 2329, 1127, 2308, 1126, 1125, 2324, 2332, 2332, 2332,
-     2335, 2335, 2335, 2336, 2336, 2336, 1111, 2336, 1104, 1096,
-     2336, 2339, 2339, 2339, 2332, 2344, 2344, 2344, 2335, 1095,
-     2315, 1094, 2346, 2346, 2346, 2350, 2350, 2350, 1091, 2339,
-     2347, 2347, 2347, 2344, 2347, 1088, 1085, 2347, 2324, 2346,
-     2351, 2351, 2351, 2350, 2352, 2352, 2352, 1080, 2352, 1077,
-     1076, 2352, 2355, 2355, 2355, 1072, 1070, 2351, 2356, 2356,
-
-     2356, 2361, 2361, 2361, 2363, 2363, 2363, 1056, 1055, 2355,
-     2365, 2365, 2365, 1054, 1053, 2356, 2350, 1052, 2361, 2366,
-     2366, 2366, 2367, 2367, 2367, 1051, 2351, 1050, 2365, 1049,
-     2368, 2368, 2368, 2369, 2369, 2369, 2366, 2370, 2370, 2370,
-     2367, 1048, 2371, 2371, 2371, 1044, 2371, 2355, 2368, 2371,
-     1040, 2369, 2361, 1033, 2370, 2372, 2372, 2372, 1030, 2356,
-     2373, 2373, 2373, 2374, 2374, 2374, 2375, 2375, 2375, 1029,
-     2369, 1028, 2372, 2376, 2376, 2376, 1025, 2373, 1024, 1023,
-     2374, 1020, 2367, 1019, 2375, 2377, 2377, 2377, 2378, 2378,
-     2378, 2368, 2380, 2380, 2380, 2383, 2383, 2383, 2384, 2384,
-
-     2384, 1018, 1015, 2377, 1014, 1011, 2378, 2385, 2385, 2385,
-     2380, 2373, 1010, 1007, 2374, 1004, 2384, 2386, 2386, 2386,
-     2389, 2389, 2389, 2390, 2390, 2390, 2391, 2391, 2391, 2392,
-     2392, 2392, 2396, 2396, 2396, 2399, 2399, 2399, 2400, 2400,
-     2400, 1001, 2400, 1000,  997, 2400, 2412, 2412, 2412,  996,
-     2396, 2377, 2399,  995, 2380, 2423, 2423, 2423, 2426, 2426,
-     2426, 2429, 2429, 2429, 2412, 2431, 2431, 2431, 2433, 2433,
-     2433, 2434, 2434, 2434,  994, 2434,  993,  991, 2434, 2429,
-     2435, 2435, 2435, 2431,  990, 2433, 2442, 2442, 2442, 2443,
-     2443, 2443, 2444, 2444, 2444, 2450, 2450, 2450, 2435,  989,
-
-     2451, 2451, 2451, 2442, 2451,  988, 2412, 2451,  987,  986,
-     2444,  985, 2450, 2453, 2453, 2453, 2454, 2454, 2454, 2456,
-     2456, 2456, 2460, 2460, 2460,  984,  980, 2429,  975,  974,
-     2453, 2462, 2462, 2462, 2454,  973,  970, 2456,  969, 2460,
-     2463, 2463, 2463,  968, 2463,  966,  962, 2463, 2462, 2444,
-     2464, 2464, 2464, 2465, 2465, 2465, 2466, 2466, 2466,  958,
-     2466,  957,  954, 2466, 2467, 2467, 2467,  951, 2464,  950,
-     2465, 2468, 2468, 2468, 2469, 2469, 2469, 2474, 2474, 2474,
-      949, 2467, 2476, 2476, 2476, 2478, 2478, 2478, 2468,  948,
-      947, 2469,  946,  945, 2474, 2480, 2480, 2480, 2481, 2481,
-
-     2481,  943, 2481, 2478,  942, 2481, 2482, 2482, 2482, 2483,
-     2483, 2483, 2480, 2484, 2484, 2484, 2467,  941, 2485, 2485,
-     2485,  940, 2485,  939, 2482, 2485,  938, 2483,  937, 2468,
-      936, 2484, 2469, 2488, 2488, 2488, 2489, 2489, 2489,  935,
-     2489,  934,  933, 2489, 2490, 2490, 2490, 2491, 2491, 2491,
-     2488, 2492, 2492, 2492, 2494, 2494, 2494, 2495, 2495, 2495,
-      932, 2490,  931,  930, 2491, 2499, 2499, 2499,  929, 2492,
-     2503, 2503, 2503,  928,  927, 2495, 2483, 2484, 2507, 2507,
-     2507,  926,  925, 2499, 2508, 2508, 2508,  924, 2508,  923,
-      919, 2508, 2522, 2522, 2522, 2507, 2537, 2537, 2537, 2540,
-
-     2540, 2540, 2542, 2542, 2542,  918, 2542,  916,  915, 2542,
-     2522, 2545, 2545, 2545, 2548, 2548, 2548, 2540, 2551, 2551,
-     2551, 2552, 2552, 2552,  914, 2552,  913,  912, 2552, 2545,
-      908, 2548, 2553, 2553, 2553, 2551, 2557, 2557, 2557, 2559,
-     2559, 2559,  906, 2559,  905,  904, 2559, 2563, 2563, 2563,
-     2553,  903, 2522, 2557, 2564, 2564, 2564,  899, 2564,  895,
-      894, 2564,  891,  890, 2563, 2566, 2566, 2566,  889,  888,
-     2540, 2567, 2567, 2567, 2568, 2568, 2568,  887, 2568,  886,
-      885, 2568, 2566, 2569, 2569, 2569,  882,  881, 2567, 2570,
-     2570, 2570,  880, 2570,  879,  876, 2570, 2573, 2573, 2573,
-
-     2569, 2575, 2575, 2575,  875, 2575,  874,  871, 2575, 2578,
-     2578, 2578, 2579, 2579, 2579, 2573, 2580, 2580, 2580, 2583,
-     2583, 2583,  869, 2584, 2584, 2584, 2578, 2584,  866, 2579,
-     2584,  865,  864, 2580,  863,  862, 2583, 2585, 2585, 2585,
-     2586, 2586, 2586, 2587, 2587, 2587,  859, 2587,  858,  857,
-     2587, 2590, 2590, 2590, 2585,  856,  855, 2586, 2592, 2592,
-     2592,  852,  851, 2579, 2578, 2593, 2593, 2593,  850, 2590,
-      849, 2580,  847, 2594, 2594, 2594, 2592, 2594,  844,  843,
-     2594,  841,  838, 2593, 2597, 2597, 2597, 2598, 2598, 2598,
-      836, 2598,  833,  832, 2598, 2599, 2599, 2599, 2600, 2600,
-
-     2600, 2597, 2600,  831,  830, 2600,  828, 2601, 2601, 2601,
-      827,  826, 2599, 2607, 2607, 2607, 2611, 2611, 2611, 2630,
-     2630, 2630,  823,  822, 2592, 2601, 2593, 2612, 2612, 2612,
-      821, 2612,  820, 2611, 2612,  819,  818, 2630, 2644, 2644,
-     2644, 2646, 2646, 2646, 2647, 2647, 2647, 2648, 2648, 2648,
-     2649, 2649, 2649,  813, 2650, 2650, 2650,  812, 2646, 2651,
-     2651, 2651, 2647, 2651, 2648,  811, 2651, 2649,  810,  809,
-     2630, 2650, 2652, 2652, 2652,  808, 2652,  807,  806, 2652,
-     2655, 2655, 2655, 2659, 2659, 2659, 2660, 2660, 2660,  805,
-     2661, 2661, 2661,  804, 2661,  803, 2649, 2661, 2655,  801,
-
-     2659,  799,  798, 2660,  795,  792, 2647, 2662, 2662, 2662,
-     2664, 2664, 2664,  789, 2664,  788,  784, 2664, 2668, 2668,
-     2668, 2669, 2669, 2669, 2662, 2669,  783,  782, 2669, 2670,
-     2670, 2670,  781, 2670,  778, 2668, 2670, 2673, 2673, 2673,
-     2674, 2674, 2674,  775, 2674,  774,  773, 2674, 2675, 2675,
-     2675, 2676, 2676, 2676, 2673, 2677, 2677, 2677,  770, 2678,
-     2678, 2678,  769, 2678,  768, 2675, 2678,  765, 2676, 2681,
-     2681, 2681, 2677, 2682, 2682, 2682,  764, 2682,  762,  759,
-     2682, 2683, 2683, 2683,  758,  757, 2681, 2684, 2684, 2684,
-      755, 2684,  744,  742, 2684, 2691, 2691, 2691, 2683, 2692,
-
-     2692, 2692,  739,  738, 2677,  737, 2675, 2693, 2693, 2693,
-      735, 2693,  734, 2691, 2693,  733,  729, 2692, 2696, 2696,
-     2696,  728, 2696,  727,  726, 2696, 2701, 2701, 2701, 2703,
-     2703, 2703, 2704, 2704, 2704, 2707, 2707, 2707,  723, 2707,
-      722,  721, 2707, 2701, 2701,  720, 2691, 2718, 2718, 2718,
-     2727, 2727, 2727, 2741, 2741, 2741, 2742, 2742, 2742, 2743,
-     2743, 2743,  719,  718, 2718,  717, 2692,  715, 2727,  712,
-     2744, 2744, 2744,  711, 2744,  709, 2743, 2744, 2745, 2745,
-     2745, 2746, 2746, 2746, 2747, 2747, 2747,  707, 2747,  704,
-      703, 2747, 2748, 2748, 2748,  697, 2745,  695, 2746, 2727,
-
-     2749, 2749, 2749,  693, 2749,  690,  689, 2749,  685, 2748,
-     2751, 2751, 2751,  684, 2751,  683,  682, 2751, 2756, 2756,
-     2756, 2757, 2757, 2757,  679, 2757,  678,  677, 2757, 2745,
-     2758, 2758, 2758,  676, 2758, 2756,  673, 2758, 2761, 2761,
-     2761, 2762, 2762, 2762,  672, 2762,  671,  670, 2762, 2765,
-     2765, 2765,  669, 2765,  663, 2761, 2765, 2768, 2768, 2768,
-      662, 2768,  660,  654, 2768, 2771, 2771, 2771, 2772, 2772,
-     2772, 2773, 2773, 2773,  653, 2773,  649,  642, 2773, 2774,
-     2774, 2774, 2771,  638,  632, 2772, 2775, 2775, 2775,  628,
-     2775,  620,  619, 2775,  618,  617, 2774, 2778, 2778, 2778,
-
-      616, 2778,  612,  605, 2778, 2787, 2787, 2787, 2788, 2788,
-     2788, 2794, 2794, 2794,  604,  603, 2771, 2795, 2795, 2795,
-     2796, 2796, 2796, 2787, 2796,  599, 2788, 2796, 2794, 2794,
-     2797, 2797, 2797,  592, 2795, 2795,  591,  587, 2796, 2798,
-     2798, 2798, 2799, 2799, 2799, 2800, 2800, 2800,  581,  580,
-     2774, 2809, 2809, 2809, 2810, 2810, 2810,  576, 2810,  568,
-      567, 2810, 2819, 2819, 2819, 2832, 2832, 2832, 2809, 2833,
-     2833, 2833,  563,  554, 2788, 2834, 2834, 2834,  550, 2834,
-     2819,  542, 2834, 2837, 2837, 2837, 2838, 2838, 2838,  541,
-     2838,  540,  536, 2838,  530, 2841, 2841, 2841,  529, 2841,
-
-      528, 2837, 2841, 2847, 2847, 2847,  524, 2847,  518,  517,
-     2847, 2850, 2850, 2850,  513, 2850,  507,  506, 2850, 2853,
-     2853, 2853, 2855, 2855, 2855, 2856, 2856, 2856, 2819, 2856,
-      505,  504, 2856, 2859, 2859, 2859, 2853,  503,  502, 2855,
-     2874, 2874, 2874, 2876, 2876, 2876, 2882, 2882, 2882,  501,
-     2859,  497, 2883, 2883, 2883,  491, 2883,  490, 2874, 2883,
-      488, 2876,  487, 2882, 2882, 2884, 2884, 2884,  486, 2884,
-     2883,  482, 2884, 2887, 2887, 2887, 2888, 2888, 2888, 2889,
-     2889, 2889,  471, 2884, 2898, 2898, 2898,  470, 2898,  468,
-      464, 2898,  458,  457, 2876, 2885, 2885, 2885, 2885, 2885,
-
-     2885, 2885, 2885, 2885,  456,  452, 2885, 2907, 2907, 2907,
-      446, 2885, 2885, 2885, 2885, 2885, 2916, 2916, 2916, 2917,
-     2917, 2917, 2922, 2922, 2922, 2907, 2923, 2923, 2923,  442,
-     2923,  434,  432, 2923, 2925, 2925, 2925, 2917,  431, 2922,
-     2885, 2885, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
-     2886, 2925,  430, 2886, 2927, 2927, 2927,  426, 2886, 2886,
-     2886, 2886, 2886, 2926, 2926, 2926,  420, 2926,  419,  415,
-     2926, 2927, 2928, 2928, 2928,  409, 2928,  408,  404, 2928,
-     2941, 2941, 2941, 2966, 2966, 2966,  397, 2886, 2886, 2947,
-     2947, 2947,  396, 2947,  395,  391, 2947,  384, 2941,  383,
-
-      382, 2966, 2999, 2999, 2999,  381,  377, 2947, 2950, 2950,
-     2950, 2950, 2950, 2950, 2950, 2950, 2950,  368,  362, 2950,
-     2999,  358,  357,  353, 2950, 2950, 2950, 2950, 2950, 2977,
-     2977, 2977,  347, 2977,  346,  345, 2977, 2981, 2981, 2981,
-      341, 2981,  334,  332, 2981, 2984, 2984, 2984,  331, 2984,
-      327,  324, 2984, 2950, 2950, 2951, 2951, 2951, 2951, 2951,
-     2951, 2951, 2951, 2951,  322,  321, 2951, 3011, 3011, 3011,
-      320, 2951, 2951, 2951, 2951, 2951, 3026, 3026, 3026, 3027,
-     3027, 3027, 3028, 3028, 3028, 3011, 3011, 3033, 3033, 3033,
-     3044, 3044, 3044, 3026,  316,  312, 3027,  309,  305, 3028,
-
-     2951, 2951,  302,  301, 3033, 3048, 3048, 3048, 3044, 3057,
-     3057, 3057, 3058, 3058, 3058,  293, 3058,  289,  285, 3058,
-     3059, 3059, 3059, 3048,  284,  283, 3057, 3060, 3060, 3060,
-      277, 3060,  276,  274, 3060,  271,  259, 3059, 3061, 3061,
-     3061, 3062, 3062, 3062,    0, 3062,    0,    0, 3062, 3069,
-     3069, 3069, 3079, 3079, 3079, 3061, 3048, 3070, 3070, 3070,
-        0, 3070,    0,    0, 3070,    0, 3069, 3087, 3087, 3087,
-     3079, 3087,    0,    0, 3087, 3090, 3090, 3090,    0, 3090,
-        0,    0, 3090, 3093, 3093, 3093,    0, 3093,    0, 3079,
-     3093, 3102, 3102, 3102,    0, 3102,    0,    0, 3102, 3209,
-
-     3209, 3209, 3218, 3218, 3218,    0, 3218,    0,    0, 3218,
-     3319, 3319, 3319, 3320, 3320, 3320,    0, 3209,    0,    0,
-     3218,    0,    0,    0,    0,    0,    0,    0, 3319,    0,
-        0, 3320, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323,
-     3323, 3324, 3324, 3324, 3324, 3324, 3324, 3324, 3324, 3324,
-     3325, 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3326,
-     3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3327, 3327,
-     3327, 3327, 3327, 3327, 3327, 3327, 3327, 3328, 3328, 3328,
-     3328, 3328, 3328, 3328, 3328, 3328, 3329, 3329, 3329, 3329,
-     3329, 3329, 3329, 3329, 3329, 3330, 3330, 3330, 3330, 3330,
-
-     3330, 3330, 3330, 3330, 3331, 3331, 3331, 3331, 3331, 3331,
-     3331, 3331, 3331, 3332, 3332, 3332, 3332, 3332, 3332, 3332,
-     3332, 3332, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334,
-     3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3336,
-     3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3337, 3337,
-     3337, 3337, 3337, 3337, 3337, 3337, 3337, 3338, 3338, 3338,
-     3338, 3338, 3338, 3338, 3338, 3338, 3339, 3339, 3339, 3339,
-     3339, 3339, 3339, 3339, 3339, 3340, 3340, 3340, 3340, 3340,
-     3340, 3340, 3340, 3340, 3341, 3341, 3341, 3341, 3341, 3341,
-
-     3341, 3341, 3341, 3342, 3342, 3342, 3342, 3342, 3342, 3342,
-     3342, 3342, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343,
-     3343, 3344, 3344, 3344, 3344, 3344, 3344, 3344, 3344, 3344,
-     3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3346,
-     3346, 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3347, 3347,
-     3347, 3347, 3347, 3347, 3347, 3347, 3347, 3348, 3348, 3348,
-     3348, 3348, 3348, 3348, 3348, 3348, 3349, 3349, 3349, 3349,
-     3349, 3349, 3349, 3349, 3349, 3350, 3350, 3350, 3350, 3350,
-     3350, 3350, 3350, 3350, 3351, 3351, 3351, 3351, 3351, 3351,
-     3351, 3351, 3351, 3352, 3352, 3352, 3352, 3352, 3352, 3352,
-
-     3352, 3352, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
-     3353, 3354, 3354, 3354, 3354, 3354, 3354, 3354, 3354, 3354,
-     3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3356,
-     3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3357, 3357,
-     3357, 3357, 3357, 3357, 3357, 3357, 3357, 3358, 3358, 3358,
-     3358, 3358, 3358, 3358, 3358, 3358, 3359, 3359, 3359, 3359,
-     3359, 3359, 3359, 3359, 3359, 3360, 3360, 3360, 3360, 3360,
-     3360, 3360, 3360, 3360, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3362, 3362, 3362, 3362, 3362, 3362, 3362,
-     3362, 3362, 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363,
-
-     3363, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
-     3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3366,
-     3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3367, 3367,
-     3367, 3367, 3367, 3367, 3367, 3367, 3367, 3368, 3368, 3368,
-     3368, 3368, 3368, 3368, 3368, 3368, 3369, 3369, 3369, 3369,
-     3369, 3369, 3369, 3369, 3369, 3370, 3370, 3370, 3370, 3370,
-     3370, 3370, 3370, 3370, 3371, 3371, 3371, 3371, 3371, 3371,
-     3371, 3371, 3371, 3372, 3372, 3372, 3372, 3372, 3372, 3372,
-     3372, 3372, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373,
-     3373, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374,
-
-     3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3376,
-     3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3377, 3377,
-     3377, 3377, 3377, 3377, 3377, 3377, 3377, 3378, 3378, 3378,
-     3378, 3378, 3378, 3378, 3378, 3378, 3379, 3379, 3379, 3379,
-     3379, 3379, 3379, 3379, 3379, 3380, 3380, 3380, 3380, 3380,
-     3380, 3380, 3380, 3380, 3381, 3381, 3381, 3381, 3381, 3381,
-     3381, 3381, 3381, 3382, 3382, 3382, 3382, 3382, 3382, 3382,
-     3382, 3382, 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3383,
-     3383, 3384, 3384, 3384,    0,    0,    0, 3384, 3385, 3385,
-     3385,    0,    0,    0, 3385, 3386, 3386, 3386,    0,    0,
-
-        0, 3386, 3387, 3387, 3387,    0,    0,    0, 3387, 3388,
-     3388, 3388,    0,    0,    0, 3388, 3389, 3389, 3389,    0,
-        0,    0, 3389, 3390, 3390, 3390,    0,    0,    0, 3390,
-     3391, 3391, 3391,    0,    0,    0, 3391, 3392, 3392, 3392,
-        0,    0,    0, 3392, 3393, 3393, 3393,    0,    0,    0,
-     3393, 3394, 3394, 3394,    0,    0,    0, 3394, 3395, 3395,
-     3395,    0,    0,    0, 3395, 3396, 3396, 3396,    0,    0,
-        0, 3396, 3397, 3397, 3397,    0,    0,    0, 3397, 3398,
-     3398, 3398,    0,    0,    0, 3398, 3399, 3399, 3399,    0,
-        0,    0, 3399, 3400, 3400, 3400,    0,    0,    0, 3400,
-
-     3401, 3401, 3401,    0,    0,    0, 3401, 3402, 3402, 3402,
-        0,    0,    0, 3402, 3403, 3403, 3403,    0,    0,    0,
-     3403, 3404, 3404, 3404,    0,    0,    0, 3404, 3405, 3405,
-     3405,    0,    0,    0, 3405, 3406, 3406, 3406,    0,    0,
-        0, 3406, 3407, 3407, 3407,    0,    0,    0, 3407, 3408,
-     3408, 3408,    0,    0,    0, 3408, 3409, 3409, 3409,    0,
-        0,    0, 3409, 3410, 3410, 3410,    0,    0,    0, 3410,
-     3411, 3411, 3411,    0,    0,    0, 3411, 3412, 3412, 3412,
-     3412, 3412, 3412, 3412,    0, 3412, 3413, 3413, 3413,    0,
-        0,    0, 3413, 3414,    0,    0,    0, 3414, 3415, 3415,
-
-     3415,    0,    0,    0, 3415, 3416,    0,    0,    0, 3416,
-     3417, 3417, 3417,    0,    0,    0, 3417, 3418,    0,    0,
-        0, 3418, 3419, 3419, 3419,    0,    0,    0, 3419, 3420,
-        0,    0,    0, 3420, 3421, 3421, 3421,    0,    0,    0,
-     3421, 3422,    0,    0,    0, 3422, 3423, 3423, 3423,    0,
-        0,    0, 3423, 3424,    0,    0,    0, 3424, 3425, 3425,
-     3425,    0,    0,    0, 3425, 3426,    0,    0,    0, 3426,
-     3427, 3427, 3427,    0,    0,    0, 3427, 3428,    0,    0,
-        0, 3428, 3429, 3429, 3429,    0,    0,    0, 3429, 3430,
-        0,    0,    0, 3430, 3431, 3431, 3431,    0,    0,    0,
-
-     3431, 3432,    0,    0,    0, 3432, 3433, 3433, 3433,    0,
-        0,    0, 3433, 3434,    0,    0,    0, 3434, 3435, 3435,
-     3435,    0,    0,    0, 3435, 3436,    0,    0,    0, 3436,
-     3437, 3437, 3437,    0,    0,    0, 3437, 3438,    0,    0,
-        0, 3438, 3439, 3439, 3439,    0,    0,    0, 3439, 3440,
-        0,    0,    0, 3440, 3441, 3441, 3441,    0,    0,    0,
-     3441, 3442,    0,    0,    0, 3442, 3443, 3443, 3443,    0,
-        0,    0, 3443, 3444,    0,    0,    0, 3444, 3445, 3445,
-     3445,    0,    0,    0, 3445, 3446,    0,    0,    0, 3446,
-     3447, 3447, 3447,    0,    0,    0, 3447, 3448,    0,    0,
-
-        0, 3448, 3449, 3449, 3449,    0,    0,    0, 3449, 3450,
-        0,    0,    0, 3450, 3451, 3451, 3451,    0,    0,    0,
-     3451, 3452,    0,    0,    0, 3452, 3453, 3453, 3453,    0,
-        0,    0, 3453, 3454,    0,    0,    0, 3454, 3455, 3455,
-     3455,    0,    0,    0, 3455, 3456,    0,    0,    0, 3456,
-     3457, 3457, 3457,    0,    0,    0, 3457, 3458,    0,    0,
-        0, 3458, 3459, 3459, 3459,    0,    0,    0, 3459, 3460,
-        0,    0,    0, 3460, 3461, 3461, 3461,    0,    0,    0,
-     3461, 3462,    0,    0,    0, 3462, 3463, 3463, 3463,    0,
-        0,    0, 3463, 3464,    0,    0,    0, 3464, 3465, 3465,
-
-     3465,    0,    0,    0, 3465, 3466,    0,    0,    0, 3466,
-     3467, 3467, 3467,    0,    0,    0, 3467, 3468,    0,    0,
-        0, 3468, 3469, 3469, 3469, 3469, 3469, 3469, 3469, 3469,
-     3469, 3470,    0,    0,    0,    0, 3470, 3471, 3471, 3471,
-        0,    0,    0, 3471, 3472, 3472, 3472, 3472,    0,    0,
-     3472, 3472, 3473, 3473, 3473,    0,    0,    0, 3473, 3474,
-     3474, 3474, 3474,    0,    0, 3474, 3474, 3475, 3475, 3475,
-        0,    0,    0, 3475, 3476, 3476, 3476, 3476,    0,    0,
-     3476, 3476, 3477, 3477, 3477,    0,    0,    0, 3477, 3478,
-     3478, 3478, 3478,    0,    0, 3478, 3478, 3479, 3479, 3479,
-
-        0,    0,    0, 3479, 3480, 3480, 3480, 3480,    0,    0,
-     3480, 3480, 3481, 3481, 3481,    0,    0,    0, 3481, 3482,
-     3482, 3482, 3482,    0,    0, 3482, 3482, 3483, 3483, 3483,
-        0,    0,    0, 3483, 3484, 3484, 3484, 3484,    0,    0,
-     3484, 3484, 3485, 3485, 3485,    0,    0,    0, 3485, 3486,
-     3486, 3486, 3486,    0,    0, 3486, 3486, 3487, 3487, 3487,
-        0,    0,    0, 3487, 3488, 3488, 3488, 3488,    0,    0,
-     3488, 3488, 3489, 3489, 3489,    0,    0,    0, 3489, 3490,
-     3490, 3490, 3490,    0,    0, 3490, 3490, 3491, 3491, 3491,
-        0,    0,    0, 3491, 3492, 3492, 3492, 3492,    0,    0,
-
-     3492, 3492, 3493, 3493, 3493,    0,    0,    0, 3493, 3494,
-     3494, 3494, 3494,    0,    0, 3494, 3494, 3495, 3495, 3495,
-        0,    0,    0, 3495, 3496, 3496, 3496, 3496,    0,    0,
-     3496, 3496, 3497, 3497, 3497,    0,    0,    0, 3497, 3498,
-     3498, 3498, 3498,    0,    0, 3498, 3498, 3499, 3499, 3499,
-     3499,    0, 3499,    0, 3499, 3500, 3500, 3500, 3500,    0,
-        0, 3500, 3500, 3501, 3501, 3501,    0,    0,    0, 3501,
-     3502, 3502, 3502, 3502,    0,    0, 3502, 3502, 3503, 3503,
-     3503,    0,    0,    0, 3503, 3504, 3504, 3504, 3504,    0,
-        0, 3504, 3504, 3505, 3505, 3505,    0,    0,    0, 3505,
-
-     3506, 3506, 3506, 3506,    0,    0, 3506, 3506, 3507, 3507,
-     3507,    0,    0,    0, 3507, 3508, 3508, 3508, 3508,    0,
-        0, 3508, 3508, 3509, 3509, 3509, 3509,    0, 3509,    0,
-     3509, 3510, 3510, 3510, 3510,    0,    0, 3510, 3510, 3511,
-     3511, 3511, 3511,    0, 3511,    0, 3511, 3512, 3512, 3512,
-     3512,    0,    0, 3512, 3512, 3513, 3513, 3513,    0,    0,
-        0, 3513, 3514, 3514, 3514, 3514,    0,    0, 3514, 3514,
-     3515, 3515, 3515, 3515,    0, 3515,    0, 3515, 3516, 3516,
-     3516, 3516,    0,    0, 3516, 3516, 3517, 3517, 3517, 3517,
-        0, 3517,    0, 3517, 3518, 3518, 3518, 3518,    0,    0,
-
-     3518, 3518, 3519, 3519, 3519,    0,    0,    0, 3519, 3520,
-     3520, 3520, 3520,    0,    0, 3520, 3520, 3521, 3521, 3521,
-        0,    0,    0, 3521, 3522, 3522, 3522, 3522,    0,    0,
-     3522, 3522, 3523, 3523, 3523, 3523,    0,    0, 3523, 3523,
-     3524, 3524, 3524,    0,    0,    0, 3524, 3525, 3525, 3525,
-     3525,    0,    0, 3525, 3525, 3526, 3526, 3526, 3526, 3526,
-     3526, 3526, 3526, 3526, 3527,    0, 3527,    0,    0, 3527,
-     3528, 3528, 3528,    0,    0,    0, 3528, 3529, 3529, 3529,
-     3529,    0,    0, 3529, 3529, 3530, 3530, 3530, 3530,    0,
-     3530,    0, 3530, 3531, 3531, 3531, 3531,    0,    0, 3531,
-
-     3531, 3532, 3532, 3532, 3532,    0, 3532,    0, 3532, 3533,
-     3533, 3533, 3533,    0,    0, 3533, 3533, 3534, 3534, 3534,
-        0,    0,    0, 3534, 3535, 3535, 3535, 3535,    0,    0,
-     3535, 3535, 3536, 3536, 3536,    0,    0,    0, 3536, 3537,
-     3537, 3537, 3537,    0,    0, 3537, 3537, 3538, 3538, 3538,
-        0,    0,    0, 3538, 3539, 3539, 3539, 3539,    0,    0,
-     3539, 3539, 3540, 3540, 3540,    0,    0,    0, 3540, 3541,
-     3541, 3541, 3541,    0,    0, 3541, 3541, 3542, 3542, 3542,
-        0,    0,    0, 3542, 3543, 3543, 3543, 3543,    0,    0,
-     3543, 3543, 3544, 3544, 3544, 3544,    0, 3544,    0, 3544,
-
-     3545, 3545, 3545, 3545,    0,    0, 3545, 3545, 3546, 3546,
-     3546, 3546,    0, 3546,    0, 3546, 3547, 3547, 3547, 3547,
-        0,    0, 3547, 3547, 3548, 3548, 3548,    0,    0,    0,
-     3548, 3549, 3549, 3549, 3549,    0,    0, 3549, 3549, 3550,
-     3550, 3550, 3550,    0, 3550,    0, 3550, 3551, 3551, 3551,
-     3551,    0,    0, 3551, 3551, 3552, 3552, 3552, 3552,    0,
-     3552,    0, 3552, 3553, 3553, 3553, 3553,    0,    0, 3553,
-     3553, 3554, 3554, 3554,    0,    0,    0, 3554, 3555, 3555,
-     3555, 3555,    0,    0, 3555, 3555, 3556, 3556, 3556,    0,
-        0,    0, 3556, 3557, 3557, 3557, 3557,    0,    0, 3557,
-
-     3557, 3558, 3558, 3558,    0,    0,    0, 3558, 3559, 3559,
-     3559, 3559,    0,    0, 3559, 3559, 3560, 3560, 3560,    0,
-        0,    0, 3560, 3561, 3561, 3561, 3561,    0,    0, 3561,
-     3561, 3562, 3562, 3562,    0,    0,    0, 3562, 3563, 3563,
-     3563, 3563,    0,    0, 3563, 3563, 3564, 3564, 3564,    0,
-        0,    0, 3564, 3565, 3565, 3565, 3565,    0,    0, 3565,
-     3565, 3566, 3566, 3566,    0,    0,    0, 3566, 3567, 3567,
-     3567, 3567,    0,    0, 3567, 3567, 3568, 3568, 3568,    0,
-        0,    0, 3568, 3569, 3569, 3569, 3569,    0,    0, 3569,
-     3569, 3570, 3570, 3570,    0,    0,    0, 3570, 3571, 3571,
-
-     3571, 3571,    0,    0, 3571, 3571, 3572, 3572, 3572, 3572,
-        0,    0, 3572, 3572, 3573, 3573, 3573,    0,    0,    0,
-     3573, 3574, 3574, 3574, 3574,    0,    0, 3574, 3574, 3575,
-     3575, 3575,    0,    0,    0, 3575, 3576, 3576, 3576, 3576,
-        0,    0, 3576, 3576, 3577, 3577, 3577,    0,    0,    0,
-     3577, 3578, 3578, 3578, 3578,    0,    0, 3578, 3578, 3579,
-     3579, 3579, 3579,    0,    0, 3579, 3579, 3580, 3580, 3580,
-        0,    0,    0, 3580, 3581, 3581, 3581, 3581,    0,    0,
-     3581, 3581, 3582, 3582, 3582, 3582, 3582, 3582, 3582, 3582,
-     3582, 3583, 3583, 3583, 3583, 3583, 3583, 3583, 3583, 3583,
-
-     3584, 3584, 3584,    0,    0,    0, 3584, 3585, 3585, 3585,
-     3585,    0,    0, 3585, 3585, 3586, 3586, 3586, 3586,    0,
-        0, 3586, 3586, 3587, 3587, 3587,    0,    0,    0, 3587,
-     3588, 3588, 3588, 3588,    0,    0, 3588, 3588, 3589, 3589,
-     3589,    0,    0,    0, 3589, 3590, 3590, 3590, 3590,    0,
-        0, 3590, 3590, 3591, 3591, 3591,    0,    0,    0, 3591,
-     3592, 3592, 3592, 3592,    0,    0, 3592, 3592, 3593, 3593,
-     3593,    0,    0,    0, 3593, 3594, 3594, 3594,    0,    0,
-        0, 3594, 3595, 3595, 3595, 3595,    0,    0, 3595, 3595,
-     3596, 3596, 3596,    0,    0,    0, 3596, 3597, 3597, 3597,
-
-     3597,    0,    0, 3597, 3597, 3598, 3598, 3598,    0,    0,
-        0, 3598, 3599, 3599, 3599, 3599,    0,    0, 3599, 3599,
-     3600, 3600, 3600,    0,    0,    0, 3600, 3601, 3601, 3601,
-     3601,    0,    0, 3601, 3601, 3602, 3602, 3602,    0,    0,
-        0, 3602, 3603, 3603, 3603, 3603,    0,    0, 3603, 3603,
-     3604, 3604, 3604, 3604,    0,    0, 3604, 3604, 3605, 3605,
-     3605, 3605,    0,    0, 3605, 3605, 3606, 3606, 3606,    0,
-        0,    0, 3606, 3607, 3607, 3607, 3607,    0,    0, 3607,
-     3607, 3608, 3608, 3608, 3608,    0, 3608,    0, 3608, 3609,
-     3609, 3609, 3609,    0,    0, 3609, 3609, 3610, 3610, 3610,
-
-        0,    0,    0, 3610, 3611, 3611, 3611, 3611,    0,    0,
-     3611, 3611, 3612, 3612, 3612,    0,    0,    0, 3612, 3613,
-     3613, 3613, 3613,    0,    0, 3613, 3613, 3614, 3614, 3614,
-        0,    0,    0, 3614, 3615, 3615, 3615, 3615,    0,    0,
-     3615, 3615, 3616, 3616, 3616,    0,    0,    0, 3616, 3617,
-     3617, 3617, 3617,    0,    0, 3617, 3617, 3618, 3618, 3618,
-        0,    0,    0, 3618, 3619, 3619, 3619, 3619,    0,    0,
-     3619, 3619, 3620, 3620, 3620,    0,    0,    0, 3620, 3621,
-     3621, 3621, 3621,    0,    0, 3621, 3621, 3622, 3622, 3622,
-        0,    0,    0, 3622, 3623, 3623, 3623, 3623,    0,    0,
-
-     3623, 3623, 3624, 3624, 3624, 3624,    0,    0, 3624, 3624,
-     3625, 3625, 3625,    0,    0,    0, 3625, 3626, 3626, 3626,
-     3626,    0,    0, 3626, 3626, 3627, 3627, 3627,    0,    0,
-        0, 3627, 3628, 3628, 3628, 3628,    0,    0, 3628, 3628,
-     3629, 3629, 3629, 3629,    0, 3629,    0, 3629, 3630, 3630,
-     3630, 3630,    0,    0, 3630, 3630, 3631, 3631, 3631, 3631,
-        0,    0, 3631, 3631, 3632, 3632, 3632, 3632,    0, 3632,
-        0, 3632, 3633, 3633, 3633, 3633,    0,    0, 3633, 3633,
-     3634, 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3635,
-     3635, 3635, 3635, 3635, 3635, 3635, 3635, 3635, 3636, 3636,
-
-     3636,    0,    0,    0, 3636, 3637, 3637, 3637, 3637,    0,
-        0, 3637, 3637, 3638, 3638, 3638, 3638,    0,    0, 3638,
-     3638, 3639, 3639, 3639,    0,    0,    0, 3639, 3640, 3640,
-     3640, 3640,    0,    0, 3640, 3640, 3641, 3641, 3641,    0,
-        0,    0, 3641, 3642, 3642, 3642, 3642,    0,    0, 3642,
-     3642, 3643, 3643, 3643,    0,    0,    0, 3643, 3644, 3644,
-     3644, 3644,    0,    0, 3644, 3644, 3645, 3645, 3645,    0,
-        0,    0, 3645, 3646, 3646, 3646,    0,    0,    0, 3646,
-     3647, 3647, 3647, 3647,    0,    0, 3647, 3647, 3648, 3648,
-     3648,    0,    0,    0, 3648, 3649, 3649, 3649, 3649,    0,
-
-        0, 3649, 3649, 3650, 3650, 3650,    0,    0,    0, 3650,
-     3651, 3651, 3651, 3651,    0,    0, 3651, 3651, 3652, 3652,
-     3652, 3652,    0, 3652,    0, 3652, 3653, 3653, 3653, 3653,
-        0,    0, 3653, 3653, 3654, 3654, 3654,    0,    0,    0,
-     3654, 3655, 3655, 3655, 3655,    0,    0, 3655, 3655, 3656,
-     3656, 3656, 3656,    0,    0, 3656, 3656, 3657, 3657, 3657,
-        0,    0,    0, 3657, 3658, 3658, 3658, 3658,    0,    0,
-     3658, 3658, 3659, 3659, 3659, 3659,    0, 3659,    0, 3659,
-     3660, 3660, 3660, 3660,    0,    0, 3660, 3660, 3661, 3661,
-     3661,    0,    0,    0, 3661, 3662, 3662, 3662, 3662,    0,
-
-        0, 3662, 3662, 3663, 3663, 3663,    0,    0,    0, 3663,
-     3664, 3664, 3664, 3664,    0,    0, 3664, 3664, 3665, 3665,
-     3665,    0,    0,    0, 3665, 3666, 3666, 3666, 3666,    0,
-        0, 3666, 3666, 3667, 3667, 3667,    0,    0,    0, 3667,
-     3668, 3668, 3668, 3668,    0,    0, 3668, 3668, 3669, 3669,
-     3669,    0,    0,    0, 3669, 3670, 3670, 3670, 3670,    0,
-        0, 3670, 3670, 3671, 3671, 3671, 3671,    0, 3671,    0,
-     3671, 3672, 3672, 3672, 3672,    0,    0, 3672, 3672, 3673,
-     3673, 3673,    0,    0,    0, 3673, 3674, 3674, 3674, 3674,
-        0,    0, 3674, 3674, 3675, 3675, 3675, 3675,    0,    0,
-
-     3675, 3675, 3676, 3676, 3676, 3676,    0, 3676,    0, 3676,
-     3677, 3677, 3677, 3677,    0,    0, 3677, 3677, 3678, 3678,
-     3678,    0,    0,    0, 3678, 3679, 3679, 3679, 3679,    0,
-        0, 3679, 3679, 3680, 3680, 3680, 3680,    0,    0, 3680,
-     3680, 3681, 3681, 3681, 3681,    0,    0, 3681, 3681, 3682,
-     3682, 3682, 3682,    0,    0, 3682, 3682, 3683, 3683, 3683,
-     3683, 3683, 3683, 3683, 3683, 3683, 3684, 3684, 3684, 3684,
-     3684, 3684, 3684, 3684, 3684, 3685, 3685, 3685, 3685,    0,
-     3685,    0, 3685, 3686, 3686, 3686, 3686,    0,    0, 3686,
-     3686, 3687, 3687, 3687, 3687,    0,    0, 3687, 3687, 3688,
-
-     3688, 3688,    0,    0,    0, 3688, 3689, 3689, 3689, 3689,
-        0,    0, 3689, 3689, 3690, 3690, 3690,    0,    0,    0,
-     3690, 3691, 3691, 3691, 3691,    0,    0, 3691, 3691, 3692,
-     3692, 3692, 3692,    0, 3692,    0, 3692, 3693, 3693, 3693,
-     3693,    0,    0, 3693, 3693, 3694, 3694, 3694, 3694,    0,
-     3694,    0, 3694, 3695, 3695, 3695, 3695,    0, 3695,    0,
-     3695, 3696, 3696, 3696, 3696,    0,    0, 3696, 3696, 3697,
-     3697, 3697, 3697,    0, 3697,    0, 3697, 3698, 3698, 3698,
-     3698,    0,    0, 3698, 3698, 3699, 3699, 3699,    0,    0,
-        0, 3699, 3700, 3700, 3700, 3700,    0,    0, 3700, 3700,
-
-     3701, 3701, 3701, 3701,    0,    0, 3701, 3701, 3702, 3702,
-     3702,    0,    0,    0, 3702, 3703, 3703, 3703, 3703,    0,
-        0, 3703, 3703, 3704, 3704, 3704,    0,    0,    0, 3704,
-     3705, 3705, 3705, 3705,    0,    0, 3705, 3705, 3706, 3706,
-     3706, 3706,    0, 3706,    0, 3706, 3707, 3707, 3707, 3707,
-        0,    0, 3707, 3707, 3708, 3708, 3708,    0,    0,    0,
-     3708, 3709, 3709, 3709,    0,    0,    0, 3709, 3710, 3710,
-     3710, 3710,    0,    0, 3710, 3710, 3711, 3711, 3711,    0,
-        0,    0, 3711, 3712, 3712, 3712, 3712,    0,    0, 3712,
-     3712, 3713, 3713, 3713,    0,    0,    0, 3713, 3714, 3714,
-
-     3714,    0,    0,    0, 3714, 3715, 3715, 3715, 3715,    0,
-        0, 3715, 3715, 3716, 3716, 3716,    0,    0,    0, 3716,
-     3717, 3717, 3717, 3717,    0,    0, 3717, 3717, 3718, 3718,
-     3718,    0,    0,    0, 3718, 3719, 3719, 3719, 3719,    0,
-        0, 3719, 3719, 3720, 3720, 3720, 3720,    0,    0, 3720,
-     3720, 3721, 3721, 3721, 3721,    0,    0, 3721, 3721, 3722,
-     3722, 3722,    0,    0,    0, 3722, 3723, 3723, 3723, 3723,
-        0,    0, 3723, 3723, 3724, 3724, 3724, 3724,    0,    0,
-     3724, 3724, 3725, 3725, 3725, 3725,    0,    0, 3725, 3725,
-     3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3727,
-
-     3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3728, 3728,
-     3728, 3728,    0,    0, 3728, 3728, 3729, 3729, 3729, 3729,
-        0,    0, 3729, 3729, 3730, 3730, 3730,    0,    0,    0,
-     3730, 3731, 3731, 3731,    0,    0,    0, 3731, 3732, 3732,
-     3732, 3732,    0,    0, 3732, 3732, 3733, 3733, 3733, 3733,
-        0,    0, 3733, 3733, 3734, 3734, 3734,    0,    0,    0,
-     3734, 3735, 3735, 3735, 3735,    0,    0, 3735, 3735, 3736,
-     3736, 3736,    0,    0,    0, 3736, 3737, 3737, 3737, 3737,
-        0,    0, 3737, 3737, 3738, 3738, 3738,    0,    0,    0,
-     3738, 3739, 3739, 3739, 3739,    0,    0, 3739, 3739, 3740,
-
-     3740, 3740,    0,    0,    0, 3740, 3741, 3741, 3741, 3741,
-        0,    0, 3741, 3741, 3742, 3742, 3742,    0,    0,    0,
-     3742, 3743, 3743, 3743, 3743,    0,    0, 3743, 3743, 3744,
-     3744, 3744, 3744,    0,    0, 3744, 3744, 3745, 3745, 3745,
-        0,    0,    0, 3745, 3746, 3746, 3746,    0,    0,    0,
-     3746, 3747, 3747, 3747, 3747,    0,    0, 3747, 3747, 3748,
-     3748, 3748,    0,    0,    0, 3748, 3749, 3749, 3749, 3749,
-        0,    0, 3749, 3749, 3750, 3750, 3750,    0,    0,    0,
-     3750, 3751, 3751, 3751,    0,    0,    0, 3751, 3752, 3752,
-     3752,    0,    0,    0, 3752, 3753, 3753, 3753, 3753,    0,
-
-        0, 3753, 3753, 3754, 3754, 3754,    0,    0,    0, 3754,
-     3755, 3755, 3755, 3755,    0,    0, 3755, 3755, 3756, 3756,
-     3756, 3756,    0,    0, 3756, 3756, 3757, 3757, 3757, 3757,
-        0,    0, 3757, 3757, 3758, 3758, 3758, 3758,    0, 3758,
-        0, 3758, 3759, 3759, 3759, 3759,    0,    0, 3759, 3759,
-     3760, 3760, 3760, 3760,    0,    0, 3760, 3760, 3761, 3761,
-     3761, 3761,    0,    0, 3761, 3761, 3762, 3762, 3762, 3762,
-     3762, 3762, 3762, 3762, 3762, 3763, 3763, 3763, 3763, 3763,
-     3763, 3763, 3763, 3763, 3764, 3764, 3764, 3764,    0,    0,
-     3764, 3764, 3765, 3765, 3765, 3765,    0,    0, 3765, 3765,
-
-     3766, 3766, 3766,    0,    0,    0, 3766, 3767, 3767, 3767,
-     3767,    0, 3767,    0, 3767, 3768, 3768, 3768, 3768,    0,
-        0, 3768, 3768, 3769, 3769, 3769,    0,    0,    0, 3769,
-     3770, 3770, 3770, 3770,    0,    0, 3770, 3770, 3771, 3771,
-     3771,    0,    0,    0, 3771, 3772, 3772, 3772, 3772,    0,
-        0, 3772, 3772, 3773, 3773, 3773, 3773,    0, 3773,    0,
-     3773, 3774, 3774, 3774, 3774,    0,    0, 3774, 3774, 3775,
-     3775, 3775,    0,    0,    0, 3775, 3776, 3776, 3776, 3776,
-        0,    0, 3776, 3776, 3777, 3777, 3777,    0,    0,    0,
-     3777, 3778, 3778, 3778, 3778,    0,    0, 3778, 3778, 3779,
-
-     3779, 3779, 3779,    0,    0, 3779, 3779, 3780, 3780, 3780,
-        0,    0,    0, 3780, 3781, 3781, 3781,    0,    0,    0,
-     3781, 3782, 3782, 3782, 3782,    0, 3782,    0, 3782, 3783,
-     3783, 3783, 3783,    0,    0, 3783, 3783, 3784, 3784, 3784,
-     3784,    0, 3784,    0, 3784, 3785, 3785, 3785,    0,    0,
-        0, 3785, 3786, 3786, 3786,    0,    0,    0, 3786, 3787,
-     3787, 3787, 3787,    0,    0, 3787, 3787, 3788, 3788, 3788,
-     3788,    0, 3788,    0, 3788, 3789, 3789, 3789, 3789,    0,
-        0, 3789, 3789, 3790, 3790, 3790, 3790,    0,    0, 3790,
-     3790, 3791, 3791, 3791, 3791,    0,    0, 3791, 3791, 3792,
-
-     3792, 3792, 3792,    0, 3792,    0, 3792, 3793, 3793, 3793,
-     3793,    0,    0, 3793, 3793, 3794, 3794, 3794, 3794,    0,
-        0, 3794, 3794, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
-     3795, 3795, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
-     3796, 3797, 3797, 3797, 3797,    0,    0, 3797, 3797, 3798,
-     3798, 3798,    0,    0,    0, 3798, 3799, 3799, 3799,    0,
-        0,    0, 3799, 3800, 3800, 3800, 3800,    0,    0, 3800,
-     3800, 3801, 3801, 3801,    0,    0,    0, 3801, 3802, 3802,
-     3802, 3802,    0,    0, 3802, 3802, 3803, 3803, 3803,    0,
-        0,    0, 3803, 3804, 3804, 3804, 3804,    0,    0, 3804,
-
-     3804, 3805, 3805, 3805,    0,    0,    0, 3805, 3806, 3806,
-     3806, 3806,    0,    0, 3806, 3806, 3807, 3807, 3807,    0,
-        0,    0, 3807, 3808, 3808, 3808,    0,    0,    0, 3808,
-     3809, 3809, 3809,    0,    0,    0, 3809, 3810, 3810, 3810,
-     3810, 3810, 3810, 3810, 3810, 3810, 3811, 3811, 3811, 3811,
-     3811, 3811, 3811, 3811, 3811, 3812, 3812, 3812, 3812, 3812,
-     3812, 3812, 3812, 3812, 3813, 3813, 3813, 3813, 3813, 3813,
-     3813, 3813, 3813, 3814, 3814, 3814, 3814, 3814, 3814, 3814,
-     3814, 3814, 3815, 3815, 3815, 3815, 3815, 3815, 3815, 3815,
-     3815, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-     3322, 3322, 3322, 3322, 3322, 3322
+     1124,  254,  254,  254,  254,  254, 1131, 1131, 1131, 2488,
+
+     2489, 1127, 1127, 1127, 2491, 1129, 1129, 1129, 2492, 2493,
+     1133, 1133, 1133, 1131, 1135, 1135, 1135, 1774, 1127, 2494,
+      254,  254, 2496, 1129, 1132, 1132, 1132, 1133, 1806, 1806,
+     1806,  254, 1135, 1163, 1163, 1163, 2497, 1163, 2499, 2500,
+     1163, 1132, 2502, 2503,  254,  257,  257,  257,  257,  257,
+      257,  257,  257,  257,  257,  257,  257,  257,  257,  257,
+     1127,  257,  257,  257,  257,  257, 1129, 1136, 1136, 1136,
+     2505, 1134, 1134, 1134, 1132, 1138, 1138, 1138, 1140, 1140,
+     1140, 1141, 1141, 1141, 2506, 1136, 2512, 2513, 1134, 1132,
+      257,  257, 1138, 1142, 1142, 1142, 1140, 2514, 2516, 1141,
+
+     2521,  257, 2490, 2522, 1136, 1167, 1167, 1167, 2523, 1167,
+     1142, 2490, 1167, 2524,  257,  258,  258,  258,  258,  258,
+      258,  258,  258,  258,  258,  258,  258,  258,  258,  258,
+     1134,  258,  258,  258,  258,  258, 1141, 1143, 1143, 1143,
+     1144, 1144, 1144, 2525, 1145, 1145, 1145, 1146, 1146, 1146,
+     1148, 1148, 1148, 2528, 1143, 1147, 1147, 1147, 1144, 2530,
+      258,  258, 1145, 2538, 1146, 2539, 2541, 1148, 1149, 1149,
+     1149,  258, 1147, 1156, 1156, 1156, 1160, 1160, 1160, 1150,
+     1150, 1150, 2532, 2547,  258,  300, 1149, 2495, 1157, 1157,
+     1157, 1156,  300, 2548, 1160, 2532, 2495, 1150, 1161, 1161,
+
+     1161,  300,  300, 2549, 2550, 1147, 1157, 1162, 1162, 1162,
+     1164, 1164, 1164, 2552, 2555, 1145, 1161, 1166, 1166, 1166,
+     1147, 1165, 1165, 1165, 1162, 1169, 1169, 1169, 1164,  300,
+      300,  300, 2533, 2557, 1166,  300,  300,  300, 2582, 1165,
+      300,  300, 2583, 1169,  300, 2533,  300,  300,  300,  365,
+     1150, 2577, 1157, 1170, 1170, 1170,  365, 1171, 1171, 1171,
+     2578, 2586, 1161, 2587, 2579,  365,  365, 1798, 1172, 1172,
+     1172, 1170, 1172, 1798, 1171, 1172, 2588, 1798, 1174, 1174,
+     1174, 1798, 1165, 2593, 1175, 1175, 1175, 2594, 1190, 1190,
+     1190, 2577, 2595,  365,  365,  365, 1174, 2578, 2596,  365,
+
+      365,  365, 1175, 2597,  365,  365, 1190, 2579,  365, 2598,
+      365,  365,  365, 1191, 1191, 1191, 2599, 1170, 1193, 1193,
+     1193, 1225, 1225, 1225, 1226, 1226, 1226, 2600, 1227, 1227,
+     1227, 1191, 1229, 1229, 1229, 2601, 1193, 2602, 1225, 1230,
+     1230, 1230, 1226, 2603, 2605, 1175, 1227, 1231, 1231, 1231,
+     1229, 1231, 2606, 2607, 1231, 2608, 1230, 1234, 1234, 1234,
+     1236, 1236, 1236, 2609, 2610, 1193, 1237, 1237, 1237, 1239,
+     1239, 1239, 2611, 2591, 1234, 1241, 1241, 1241, 1236, 1241,
+     2612, 1229, 1241, 2591, 1237, 2613, 2591, 1239, 1244, 1244,
+     1244, 1245, 1245, 1245, 2614, 1245, 2615, 2616, 1245, 2617,
+
+     1246, 1246, 1246, 2618, 2620, 1244, 1247, 1247, 1247, 1250,
+     1250, 1250, 1252, 1252, 1252, 2592, 1239, 1246, 1234, 2621,
+     1248, 1248, 1248, 1247, 1248, 2592, 1250, 1248, 2592, 2624,
+     1252, 1253, 1253, 1253, 1255, 1255, 1255, 1257, 1257, 1257,
+     1259, 1259, 1259, 1260, 1260, 1260, 1262, 1262, 1262, 1253,
+     2630, 2637, 1255, 2638, 1257, 1263, 1263, 1263, 1259, 1263,
+     2639, 1260, 1263, 2641, 1262, 1267, 1267, 1267, 1268, 1268,
+     1268, 1270, 1270, 1270, 1285, 1285, 1285, 2645, 1285, 2648,
+     2649, 1285, 2650, 1267, 2651, 2652, 1268, 2653, 2666, 1270,
+     1289, 1289, 1289, 1262, 1255, 1290, 1290, 1290, 1291, 1291,
+
+     1291, 1293, 1293, 1293, 1296, 1296, 1296, 1289, 1296, 2667,
+     2668, 1296, 2695, 1290, 2692, 2698, 1291, 2699, 2693, 1293,
+     1300, 1300, 1300, 1301, 1301, 1301, 1303, 1303, 1303, 1304,
+     1304, 1304, 1305, 1305, 1305, 1306, 1306, 1306, 1300, 2700,
+     2703, 1301, 2704, 2692, 1303, 2706, 1304, 2707, 2709, 1305,
+     1307, 1307, 1307, 1306, 1309, 1309, 1309, 1310, 1310, 1310,
+     2693, 2694, 1293, 1311, 1311, 1311, 2710, 2711, 1307, 1808,
+     1808, 1808, 1309, 2712, 1310, 1312, 1312, 1312, 2713, 1305,
+     1311, 1313, 1313, 1313, 1315, 1315, 1315, 1303, 1318, 1318,
+     1318, 1311, 2715, 1312, 1319, 1319, 1319, 2716, 1319, 1313,
+
+     2717, 1319, 1315, 2694, 2718, 1318, 1325, 1325, 1325, 1326,
+     1326, 1326, 1328, 1328, 1328, 1331, 1331, 1331, 1332, 1332,
+     1332, 1309, 2721, 2722, 1325, 2723, 2724, 1326, 2725, 2726,
+     1328, 2705, 1331, 1333, 1333, 1333, 1332, 1335, 1335, 1335,
+     1336, 1336, 1336, 2708, 2705, 1337, 1337, 1337, 2727, 1337,
+     1315, 1333, 1337, 2728, 2729, 1335, 2708, 1336, 1340, 1340,
+     1340, 2730, 1340, 2731, 2732, 1340, 1343, 1343, 1343, 1344,
+     1344, 1344, 1346, 1346, 1346, 2733, 2735, 1328, 1351, 1351,
+     1351, 2748, 1351, 2749, 1343, 1351, 2754, 1344, 2758, 2759,
+     1346, 1354, 1354, 1354, 1355, 1355, 1355, 2760, 1355, 2761,
+
+     2762, 1355, 2763, 2771, 1335, 1358, 1358, 1358, 1354, 1359,
+     1359, 1359, 2773, 1359, 2781, 2782, 1359, 1370, 1370, 1370,
+     2783, 2784, 1358, 1371, 1371, 1371, 1373, 1373, 1373, 1374,
+     1374, 1374, 2785, 1374, 2786, 1370, 1374, 1346, 1377, 1377,
+     1377, 1371, 1377, 2796, 1373, 1377, 1380, 1380, 1380, 1381,
+     1381, 1381, 2799, 1381, 2797, 2802, 1381, 1386, 1386, 1386,
+     1387, 1387, 1387, 1380, 1389, 1389, 1389, 1394, 1394, 1394,
+     2803, 1394, 2807, 2808, 1394, 1386, 2676, 2809, 1387, 1397,
+     1397, 1397, 1389, 1398, 1398, 1398, 2676, 1398, 2810, 2797,
+     1398, 2796, 2676, 1373, 2811, 2812, 1397, 1401, 1401, 1401,
+
+     1402, 1402, 1402, 1404, 1404, 1404, 1406, 1406, 1406, 2813,
+     1406, 2814, 1389, 1406, 2816, 1401, 2817, 2818, 1402, 2819,
+     2820, 1404, 1409, 1409, 1409, 1410, 1410, 1410, 1412, 1412,
+     1412, 1414, 1414, 1414, 2821, 1414, 2822, 2823, 1414, 2825,
+     1409, 2826, 2827, 1410, 2828, 2790, 1412, 1418, 1418, 1418,
+     1419, 1419, 1419, 2829, 1404, 1421, 1421, 1421, 2790, 1423,
+     1423, 1423, 2830, 1423, 2791, 1418, 1423, 2831, 1419, 1429,
+     1429, 1429, 2832, 1421, 1430, 1430, 1430, 2791, 1432, 1432,
+     1432, 1433, 1433, 1433, 1434, 1434, 1434, 1429, 1434, 2833,
+     2834, 1434, 1430, 2835, 2836, 1412, 1432, 2837, 1433, 1435,
+
+     1435, 1435, 2847, 2851, 1421, 1436, 1436, 1436, 2852, 1436,
+     2860, 2861, 1436, 1438, 1438, 1438, 1435, 1439, 1439, 1439,
+     2862, 1441, 1441, 1441, 1443, 1443, 1443, 2863, 1447, 1447,
+     1447, 1438, 1809, 1809, 1809, 1439, 2864, 2677, 1432, 1441,
+     2865, 1443, 1444, 1444, 1444, 1447, 1444, 2677, 2866, 1444,
+     1448, 1448, 1448, 2677, 1448, 2873, 2876, 1448, 1450, 1450,
+     1450, 1451, 1451, 1451, 1453, 1453, 1453, 1455, 1455, 1455,
+     2878, 1455, 2883, 2884, 1455, 2885, 1450, 2879, 2886, 1451,
+     2878, 2887, 1453, 1458, 1458, 1458, 2888, 2879, 1441, 1459,
+     1459, 1459, 1461, 1461, 1461, 1462, 1462, 1462, 1463, 1463,
+
+     1463, 1458, 1463, 2891, 2892, 1463, 2893, 1459, 2894, 2881,
+     1461, 2882, 1462, 1464, 1464, 1464, 1465, 1465, 1465, 2881,
+     1465, 2882, 2905, 1465, 1466, 1466, 1466, 2906, 1453, 2907,
+     1464, 1467, 1467, 1467, 2908, 1469, 1469, 1469, 1470, 1470,
+     1470, 2909, 1466, 1471, 1471, 1471, 2910, 1471, 2911, 1467,
+     1471, 2912, 1461, 1469, 2915, 1470, 1474, 1474, 1474, 1475,
+     1475, 1475, 2897, 1475, 2916, 2918, 1475, 1476, 1476, 1476,
+     1477, 1477, 1477, 1474, 1479, 1479, 1479, 1481, 1481, 1481,
+     1485, 1485, 1485, 2919, 2920, 1476, 2922, 2924, 1477, 1486,
+     1486, 1486, 1479, 2925, 1481, 2926, 2897, 1469, 1485, 1488,
+
+     1488, 1488, 1491, 1491, 1491, 2929, 2930, 1486, 1492, 1492,
+     1492, 1494, 1494, 1494, 1495, 1495, 1495, 1488, 1495, 2931,
+     1491, 1495, 1498, 1498, 1498, 2932, 1492, 2935, 2948, 1494,
+     1499, 1499, 1499, 1501, 1501, 1501, 1479, 1502, 1502, 1502,
+     1498, 1502, 2949, 2950, 1502, 1506, 1506, 1506, 1499, 2958,
+     2959, 1501, 1507, 1507, 1507, 1509, 1509, 1509, 2960, 2961,
+     1488, 2962, 2963, 1506, 1494, 1510, 1510, 1510, 2969, 1510,
+     1507, 2970, 1510, 1509, 1514, 1514, 1514, 1515, 1515, 1515,
+     1517, 1517, 1517, 1519, 1519, 1519, 1526, 1526, 1526, 1557,
+     1557, 1557, 1514, 1501, 2971, 1515, 2972, 2973, 1517, 2974,
+
+     2975, 1519, 1519, 2976, 1526, 2977, 1557, 1558, 1558, 1558,
+     2978, 1558, 2980, 2981, 1558, 2986, 1509, 1559, 1559, 1559,
+     1560, 1560, 1560, 2987, 1561, 1561, 1561, 2988, 1561, 2989,
+     1517, 1561, 1564, 1564, 1564, 1559, 2990, 1560, 1566, 1566,
+     1566, 2999, 1566, 3000, 3001, 1566, 1569, 1569, 1569, 3002,
+     1564, 3003, 1526, 1570, 1570, 1570, 3004, 1570, 3005, 3006,
+     1570, 3010, 3011, 1569, 1571, 1571, 1571, 3012, 1571, 3013,
+     3014, 1571, 1575, 1575, 1575, 1559, 1576, 1576, 1576, 2990,
+     1576, 1564, 3015, 1576, 1578, 1578, 1578, 3017, 3018, 1575,
+     1580, 1580, 1580, 1581, 1581, 1581, 3020, 1581, 3021, 3022,
+
+     1581, 3024, 1578, 1582, 1582, 1582, 3028, 1580, 1583, 1583,
+     1583, 1585, 1585, 1585, 1601, 1601, 1601, 1849, 1849, 1849,
+     1582, 1602, 1602, 1602, 3029, 3030, 1583, 3035, 3037, 1585,
+     3038, 1601, 3043, 3044, 1578, 1603, 1603, 1603, 1602, 1603,
+     3045, 3046, 1603, 1604, 1604, 1604, 1608, 1608, 1608, 1609,
+     1609, 1609, 1610, 1610, 1610, 3047, 1610, 1583, 3048, 1610,
+     3049, 1604, 3050, 3051, 1608, 3052, 1609, 1612, 1612, 1612,
+     1613, 1613, 1613, 1614, 1614, 1614, 3053, 1614, 3054, 3056,
+     1614, 1616, 1616, 1616, 3057, 1612, 3058, 1613, 1619, 1619,
+     1619, 1620, 1620, 1620, 3059, 1620, 3066, 3063, 1620, 1616,
+
+     1621, 1621, 1621, 3060, 3069, 1619, 3070, 1604, 3063, 3073,
+     1608, 1623, 1623, 1623, 1624, 1624, 1624, 1621, 1627, 1627,
+     1627, 3075, 1628, 1628, 1628, 3076, 1628, 1612, 1623, 1628,
+     3078, 3079, 1624, 3083, 3062, 1627, 1629, 1629, 1629, 1630,
+     1630, 1630, 1616, 1631, 1631, 1631, 3084, 1631, 3062, 3060,
+     1631, 1632, 1632, 1632, 1629, 3086, 1630, 1623, 1634, 1634,
+     1634, 1637, 1637, 1637, 1638, 1638, 1638, 3087, 1638, 1632,
+     3088, 1638, 1639, 1639, 1639, 1634, 1639, 3082, 1637, 1639,
+     1624, 1644, 1644, 1644, 1653, 1653, 1653, 1654, 1654, 1654,
+     3085, 1654, 3089, 3090, 1654, 1657, 1657, 1657, 1644, 1658,
+
+     1658, 1658, 1653, 1659, 1659, 1659, 1660, 1660, 1660, 1661,
+     1661, 1661, 1657, 1663, 1663, 1663, 1658, 1632, 3098, 3082,
+     1659, 3092, 3106, 1660, 1666, 1666, 1666, 1661, 1666, 3085,
+     1663, 1666, 3108, 3092, 1669, 1669, 1669, 1671, 1671, 1671,
+     1673, 1673, 1673, 1676, 1676, 1676, 1680, 1680, 1680, 1653,
+     1659, 1669, 1681, 1681, 1681, 1671, 3110, 3112, 1673, 3120,
+     3122, 1676, 3093, 1680, 1661, 3103, 1689, 1689, 1689, 1658,
+     1681, 1682, 1682, 1682, 3093, 1682, 1660, 3103, 1682, 1685,
+     1685, 1685, 3126, 1685, 1689, 3128, 1685, 1691, 1691, 1691,
+     3123, 1691, 1680, 3130, 1691, 1696, 1696, 1696, 3131, 1696,
+
+     1676, 1671, 1696, 1700, 1700, 1700, 1673, 3104, 3132, 1681,
+     1702, 1702, 1702, 1703, 1703, 1703, 3124, 1703, 3133, 3104,
+     1703, 1700, 1706, 1706, 1706, 3139, 1706, 3143, 1702, 1706,
+     3124, 3123, 1689, 1709, 1709, 1709, 1710, 1710, 1710, 3127,
+     1710, 3125, 3125, 1710, 3140, 1715, 1715, 1715, 3150, 1715,
+     3127, 1709, 1715, 1718, 1718, 1718, 1720, 1720, 1720, 1721,
+     1721, 1721, 3140, 1721, 1700, 3149, 1721, 1702, 1725, 1725,
+     1725, 1718, 3152, 1720, 1727, 1727, 1727, 1728, 1728, 1728,
+     1709, 1729, 1729, 1729, 3149, 3158, 1725, 1730, 1730, 1730,
+     3151, 1727, 1731, 1731, 1731, 1728, 1732, 1732, 1732, 1729,
+
+     1718, 1733, 1733, 1733, 1730, 1736, 1736, 1736, 3160, 3151,
+     1731, 3144, 3157, 1732, 1743, 1743, 1743, 1725, 3159, 1733,
+     1775, 1775, 1775, 1736, 1775, 3165, 3144, 1775, 1778, 1778,
+     1778, 3157, 1743, 1729, 1779, 1779, 1779, 3159, 1779, 3166,
+     3168, 1779, 2364, 2364, 1728, 2364, 1778, 1784, 1784, 1784,
+     3169, 3170, 1733, 2364, 1731, 3172, 1736, 1786, 1786, 1786,
+     2364, 1786, 3173, 3174, 1786, 1784, 1743, 1790, 1790, 1790,
+     3175, 1790, 3176, 1736, 1790, 1794, 1794, 1794, 1796, 1796,
+     1796, 3178, 1796, 3179, 3181, 1796, 1799, 1799, 1799, 3188,
+     1800, 1800, 1800, 1794, 1800, 1778, 3189, 1800, 1784, 1801,
+
+     1801, 1801, 3190, 1799, 1810, 1810, 1810, 1814, 1814, 1814,
+     1815, 1815, 1815, 1817, 1817, 1817, 3191, 1801, 1818, 1818,
+     1818, 3192, 1818, 3193, 3196, 1818, 3197, 1819, 1819, 1819,
+     1817, 1819, 3198, 3199, 1819, 3200, 1794, 1822, 1822, 1822,
+     1825, 1825, 1825, 1826, 1826, 1826, 3201, 1827, 1827, 1827,
+     1801, 1827, 3202, 3203, 1827, 1822, 3205, 1825, 1831, 1831,
+     1831, 1826, 1832, 1832, 1832, 3207, 1832, 3209, 1810, 1832,
+     3210, 1814, 3211, 3212, 1815, 3213, 1831, 1835, 1835, 1835,
+     1836, 1836, 1836, 3223, 1822, 1839, 1839, 1839, 3224, 1839,
+     1826, 3225, 1839, 3221, 1835, 1842, 1842, 1842, 1836, 1843,
+
+     1843, 1843, 3226, 1843, 3227, 3221, 1843, 3222, 1844, 1844,
+     1844, 3228, 1842, 1845, 1845, 1845, 1846, 1846, 1846, 3222,
+     1846, 3232, 3233, 1846, 1831, 1844, 3234, 1848, 1848, 1848,
+     1845, 1851, 1851, 1851, 3235, 1851, 3236, 3237, 1851, 1854,
+     1854, 1854, 3238, 3239, 1836, 1848, 1856, 1856, 1856, 3240,
+     1856, 3242, 3243, 1856, 1859, 1859, 1859, 1854, 1861, 1861,
+     1861, 1862, 1862, 1862, 3244, 1862, 3245, 3246, 1862, 1863,
+     1863, 1863, 1859, 3247, 3240, 1861, 1865, 1865, 1865, 3248,
+     1865, 3249, 3250, 1865, 3251, 3252, 1863, 1870, 1870, 1870,
+     1871, 1871, 1871, 3253, 1871, 3254, 3255, 1871, 3256, 3257,
+
+     1859, 1872, 1872, 1872, 1870, 1877, 1877, 1877, 1880, 1880,
+     1880, 1881, 1881, 1881, 1883, 1883, 1883, 3258, 1872, 1884,
+     1884, 1884, 1877, 1882, 1882, 1882, 1880, 1882, 1881, 3259,
+     1882, 1883, 1885, 1885, 1885, 3260, 1884, 1886, 1886, 1886,
+     1888, 1888, 1888, 1889, 1889, 1889, 3261, 1889, 3262, 1885,
+     1889, 1890, 1890, 1890, 3263, 1886, 3269, 1888, 1892, 1892,
+     1892, 3270, 1893, 1893, 1893, 3271, 1893, 3272, 1890, 1893,
+     1895, 1895, 1895, 3273, 1880, 1892, 3274, 1884, 1897, 1897,
+     1897, 3275, 1900, 1900, 1900, 1904, 1904, 1904, 1895, 3276,
+     3277, 1905, 1905, 1905, 3266, 1905, 1897, 1886, 1905, 3278,
+
+     1900, 3279, 1904, 1907, 1907, 1907, 1909, 1909, 1909, 1911,
+     1911, 1911, 3280, 3266, 1912, 1912, 1912, 1913, 1913, 1913,
+     3281, 1907, 3282, 3283, 1909, 3284, 1911, 3285, 3286, 1897,
+     1900, 1912, 3287, 3288, 1913, 1914, 1914, 1914, 1916, 1916,
+     1916, 1917, 1917, 1917, 1918, 1918, 1918, 1919, 1919, 1919,
+     1920, 1920, 1920, 1914, 3290, 3291, 1916, 1909, 3292, 1917,
+     3293, 1918, 3294, 3289, 1919, 1922, 1922, 1922, 1920, 1922,
+     3295, 3296, 1922, 1928, 1928, 1928, 1930, 1930, 1930, 2365,
+     2365, 1913, 2365, 3289, 1916, 1931, 1931, 1931, 3297, 1931,
+     2365, 1928, 1931, 1930, 1932, 1932, 1932, 2365, 3298, 1933,
+
+     1933, 1933, 1914, 1934, 1934, 1934, 1917, 1935, 1935, 1935,
+     3299, 1935, 1932, 3300, 1935, 1920, 3301, 1933, 3302, 3303,
+     1934, 1936, 1936, 1936, 1928, 1937, 1937, 1937, 1938, 1938,
+     1938, 3304, 1938, 3305, 3306, 1938, 1953, 1953, 1953, 1936,
+     3307, 3308, 1937, 1939, 1939, 1939, 1945, 1945, 1945, 1946,
+     1946, 1946, 3309, 1932, 1933, 1958, 1958, 1958, 1962, 1962,
+     1962, 1939, 3315, 1945, 1963, 1963, 1963, 1946, 1964, 1964,
+     1964, 1966, 1966, 1966, 1968, 1968, 1968, 1969, 1969, 1969,
+     1974, 1974, 1974, 3316, 1976, 1976, 1976, 1979, 1979, 1979,
+     1981, 1981, 1981, 1983, 1983, 1983, 1984, 1984, 1984, 3317,
+
+     3310, 1939, 1976, 3318, 3319, 1979, 3310, 1981, 3320, 3322,
+     1946, 1983, 3323, 1984, 1993, 1993, 1993, 3325, 1993, 3326,
+     3328, 1993, 1996, 1996, 1996, 1997, 1997, 1997, 2002, 2002,
+     2002, 2003, 2003, 2003, 1976, 3329, 2007, 2007, 2007, 3332,
+     1996, 3333, 1997, 2008, 2008, 2008, 3334, 2008, 3335, 3337,
+     2008, 3339, 1983, 2007, 2011, 2011, 2011, 2013, 2013, 2013,
+     2014, 2014, 2014, 2015, 2015, 2015, 3341, 2015, 1996, 3343,
+     2015, 3345, 2011, 3346, 2013, 3347, 3348, 2014, 2016, 2016,
+     2016, 3331, 2007, 2018, 2018, 2018, 3349, 2019, 2019, 2019,
+     2020, 2020, 2020, 3350, 2020, 3331, 2016, 2020, 2021, 2021,
+
+     2021, 2018, 3351, 2013, 2019, 3352, 3354, 2011, 2024, 2024,
+     2024, 3356, 2024, 3358, 3359, 2024, 2021, 2027, 2027, 2027,
+     2028, 2028, 2028, 3360, 2028, 3361, 3370, 2028, 2029, 2029,
+     2029, 2016, 2029, 3408, 2027, 2029, 2033, 2033, 2033, 2035,
+     2035, 2035, 2037, 2037, 2037, 2021, 2039, 2039, 2039, 3362,
+     2039, 3382, 1540, 2039, 2033, 2042, 2042, 2042, 3371, 3372,
+     2037, 2043, 2043, 2043, 3384, 2043, 3408, 3363, 2043, 2047,
+     2047, 2047, 2042, 2047, 3370, 3373, 2047, 2050, 2050, 2050,
+     2051, 2051, 2051, 3390, 2051, 3362, 3374, 2051, 2052, 2052,
+     2052, 2056, 2056, 2056, 2050, 2057, 2057, 2057, 3382, 2057,
+
+     2037, 3384, 2057, 3363, 3402, 2052, 3371, 3372, 2056, 2060,
+     2060, 2060, 2061, 2061, 2061, 3386, 2061, 3391, 3375, 2061,
+     2064, 2064, 2064, 3373, 2065, 2065, 2065, 2060, 2065, 3390,
+     3374, 2065, 2066, 2066, 2066, 1539, 3378, 2064, 2067, 2067,
+     2067, 2068, 2068, 2068, 3378, 2068, 3379, 3402, 2068, 2066,
+     2069, 2069, 2069, 1538, 3379, 2067, 3386, 2071, 2071, 2071,
+     2060, 2071, 3375, 3391, 2071, 2074, 2074, 2074, 2069, 2075,
+     2075, 2075, 3380, 2075, 3387, 3381, 2075, 2077, 2077, 2077,
+     3380, 2077, 2074, 3381, 2077, 2081, 2081, 2081, 2084, 2084,
+     2084, 2086, 2086, 2086, 2087, 2087, 2087, 2089, 2089, 2089,
+
+     3376, 2069, 3385, 2081, 3376, 3394, 2084, 3388, 2086, 2091,
+     2091, 2091, 2087, 2091, 2089, 3387, 2091, 2095, 2095, 2095,
+     2098, 2098, 2098, 2100, 2100, 2100, 2101, 2101, 2101, 3383,
+     2101, 3420, 3377, 2101, 3430, 2095, 3377, 3394, 2098, 3385,
+     2100, 3403, 3388, 2089, 2102, 2102, 2102, 2103, 2103, 2103,
+     3395, 2103, 2084, 1536, 2103, 2087, 2105, 2105, 2105, 3389,
+     3420, 2102, 2107, 2107, 2107, 2108, 2108, 2108, 2109, 2109,
+     2109, 2110, 2110, 2110, 2105, 2110, 3383, 3392, 2110, 3393,
+     2107, 3430, 3395, 2108, 3403, 2109, 2111, 2111, 2111, 2112,
+     2112, 2112, 3400, 2112, 3389, 3396, 2112, 2113, 2113, 2113,
+
+     2118, 2118, 2118, 2111, 3396, 2120, 2120, 2120, 3397, 2120,
+     3398, 2107, 2120, 3399, 3392, 2113, 3393, 3397, 2118, 2123,
+     2123, 2123, 2105, 2124, 2124, 2124, 3400, 2125, 2125, 2125,
+     2108, 2125, 3401, 3424, 2125, 3414, 3409, 2123, 2128, 2128,
+     2128, 2124, 2130, 2130, 2130, 3398, 2130, 3452, 3399, 2130,
+     2133, 2133, 2133, 2141, 2141, 2141, 2128, 2138, 2138, 2138,
+     3406, 3452, 2113, 1533, 1532, 2118, 3401, 3424, 2133, 3409,
+     2123, 2139, 2139, 2139, 2138, 2139, 2124, 3414, 2139, 2140,
+     2140, 2140, 2146, 2146, 2146, 2147, 2147, 2147, 2148, 2148,
+     2148, 2150, 2150, 2150, 3404, 3406, 2133, 2140, 2155, 2155,
+
+     2155, 2156, 2156, 2156, 2157, 2157, 2157, 2158, 2158, 2158,
+     2160, 2160, 2160, 2161, 2161, 2161, 2162, 2162, 2162, 2163,
+     2163, 2163, 2164, 2164, 2164, 2165, 2165, 2165, 2167, 2167,
+     2167, 2170, 2170, 2170, 2173, 2173, 2173, 2174, 2174, 2174,
+     3404, 2174, 3428, 2140, 2174, 3405, 2167, 1531, 3407, 2170,
+     3428, 2173, 1530, 2158, 2176, 2176, 2176, 2177, 2177, 2177,
+     2178, 2178, 2178, 3415, 2178, 3429, 1529, 2178, 2189, 2189,
+     2189, 3412, 2176, 3429, 2177, 2190, 2190, 2190, 3416, 2167,
+     2191, 2191, 2191, 3407, 2191, 3434, 2189, 2191, 2192, 2192,
+     2192, 3405, 2190, 2197, 2197, 2197, 2198, 2198, 2198, 2199,
+
+     2199, 2199, 2200, 2200, 2200, 3415, 2200, 3417, 3412, 2200,
+     2202, 2202, 2202, 2204, 2204, 2204, 2199, 2189, 2205, 2205,
+     2205, 3421, 2205, 3426, 3416, 2205, 3434, 3410, 2202, 3413,
+     2204, 2207, 2207, 2207, 3411, 2207, 3410, 3418, 2207, 2210,
+     2210, 2210, 2198, 3411, 2212, 2212, 2212, 2214, 2214, 2214,
+     3421, 2214, 1528, 3417, 2214, 3435, 1527, 2210, 2217, 2217,
+     2217, 2202, 2212, 2220, 2220, 2220, 3413, 2220, 3419, 3426,
+     2220, 2227, 2227, 2227, 3418, 3431, 2217, 2229, 2229, 2229,
+     3425, 2229, 3427, 3438, 2229, 2238, 2238, 2238, 3422, 2227,
+     2210, 2235, 2235, 2235, 3432, 2235, 3435, 3422, 2235, 2239,
+
+     2239, 2239, 2238, 2239, 3423, 3419, 2239, 3433, 2243, 2243,
+     2243, 2217, 2243, 3423, 3425, 2243, 2247, 2247, 2247, 2248,
+     2248, 2248, 3431, 2249, 2249, 2249, 2227, 2249, 3427, 3438,
+     2249, 3432, 1525, 2247, 2252, 2252, 2252, 2248, 2253, 2253,
+     2253, 3436, 2253, 3437, 3433, 2253, 2254, 2254, 2254, 3442,
+     2254, 2252, 3439, 2254, 2257, 2257, 2257, 2259, 2259, 2259,
+     1524, 2259, 3440, 1523, 2259, 1522, 2265, 2265, 2265, 2267,
+     2267, 2267, 2257, 2268, 2268, 2268, 3436, 2268, 3437, 3443,
+     2268, 3442, 3446, 2248, 2265, 1513, 2267, 2269, 2269, 2269,
+     2271, 2271, 2271, 2272, 2272, 2272, 3441, 2272, 3439, 3440,
+
+     2272, 2279, 2279, 2279, 3444, 2269, 1505, 2271, 2282, 2282,
+     2282, 3443, 2282, 3444, 3446, 2282, 2289, 2289, 2289, 2279,
+     2257, 2285, 2285, 2285, 3447, 2285, 1490, 3448, 2285, 3449,
+     2291, 2291, 2291, 3441, 2289, 2292, 2292, 2292, 2293, 2293,
+     2293, 1489, 2293, 1484, 1483, 2293, 3445, 2269, 2291, 1482,
+     2296, 2296, 2296, 2292, 2296, 3445, 3447, 2296, 2299, 2299,
+     2299, 1480, 2300, 2300, 2300, 1473, 1472, 2289, 2301, 2301,
+     2301, 2292, 2302, 2302, 2302, 3448, 2299, 3449, 2299, 2300,
+     2303, 2303, 2303, 1454, 1449, 2301, 2304, 2304, 2304, 2302,
+     2306, 2306, 2306, 2307, 2307, 2307, 2291, 2303, 2308, 2308,
+
+     2308, 2312, 2312, 2312, 2304, 2309, 2309, 2309, 2306, 3450,
+     3453, 2307, 1446, 2313, 2313, 2313, 2308, 2313, 1445, 2301,
+     2313, 3453, 1442, 2309, 2316, 2316, 2316, 2317, 2317, 2317,
+     2318, 2318, 2318, 2319, 2319, 2319, 2302, 1437, 1428, 2303,
+     1427, 3450, 2316, 2322, 2322, 2322, 2323, 2323, 2323, 1426,
+     2306, 2304, 2325, 2325, 2325, 2326, 2326, 2326, 1422, 1417,
+     2308, 2328, 2328, 2328, 2329, 2329, 2329, 2330, 2330, 2330,
+     2331, 2331, 2331, 2334, 2334, 2334, 2335, 2335, 2335, 2336,
+     2336, 2336, 1413, 2316, 2337, 2337, 2337, 2339, 2339, 2339,
+     2342, 2342, 2342, 2343, 2343, 2343, 3451, 2343, 1405, 1400,
+
+     2343, 2346, 2346, 2346, 1399, 2339, 1393, 2342, 2347, 2347,
+     2347, 1392, 2349, 2349, 2349, 1391, 2349, 1390, 2346, 2349,
+     2362, 2362, 2362, 2363, 2363, 2363, 2347, 2363, 3451, 1385,
+     2363, 2366, 2366, 2366, 2367, 2367, 2367, 1384, 2362, 2371,
+     2371, 2371, 2373, 2373, 2373, 1383, 2373, 1382, 1368, 2373,
+     2377, 2377, 2377, 2379, 2379, 2379, 1367, 2379, 1366, 1365,
+     2379, 2383, 2383, 2383, 2385, 2385, 2385, 2346, 2377, 2384,
+     2384, 2384, 2393, 2393, 2393, 2394, 2394, 2394, 1364, 2383,
+     1363, 2362, 2385, 2399, 2399, 2399, 2384, 2399, 1362, 1361,
+     2399, 1360, 1350, 2394, 1349, 1348, 2377, 2402, 2402, 2402,
+
+     2406, 2406, 2406, 2407, 2407, 2407, 1347, 2407, 1330, 1329,
+     2407, 2408, 2408, 2408, 2402, 2385, 1324, 2406, 2409, 2409,
+     2409, 1323, 2409, 1322, 1317, 2409, 2412, 2412, 2412, 2408,
+     2417, 2417, 2417, 1316, 1299, 2394, 2419, 2419, 2419, 2420,
+     2420, 2420, 1295, 2420, 2412, 1294, 2420, 1288, 2417, 2423,
+     2423, 2423, 1284, 2419, 1283, 2424, 2424, 2424, 2425, 2425,
+     2425, 1282, 2425, 1281, 1280, 2425, 1279, 2423, 2428, 2428,
+     2428, 1278, 2424, 2429, 2429, 2429, 2434, 2434, 2434, 2436,
+     2436, 2436, 2439, 2439, 2439, 2428, 2438, 2438, 2438, 1276,
+     2429, 1275, 1273, 2434, 2440, 2440, 2440, 1272, 1271, 2439,
+
+     2423, 2424, 1266, 1258, 2438, 1256, 2441, 2441, 2441, 2443,
+     2443, 2443, 2440, 2442, 2442, 2442, 1251, 1249, 2444, 2444,
+     2444, 1240, 2444, 2428, 2441, 2444, 2443, 2434, 2445, 2445,
+     2445, 2442, 1235, 1224, 2429, 2446, 2446, 2446, 2447, 2447,
+     2447, 2448, 2448, 2448, 1222, 2445, 2449, 2449, 2449, 1221,
+     2442, 1220, 2446, 1219, 2440, 2447, 2450, 2450, 2450, 2448,
+     2451, 2451, 2451, 2453, 2453, 2453, 1217, 2441, 1216, 2454,
+     2454, 2454, 1215, 1214, 2450, 2457, 2457, 2457, 2451, 1213,
+     1212, 2453, 2458, 2458, 2458, 1210, 2446, 2454, 1209, 2447,
+     2459, 2459, 2459, 2460, 2460, 2460, 2463, 2463, 2463, 1208,
+
+     2458, 2464, 2464, 2464, 2466, 2466, 2466, 2467, 2467, 2467,
+     2471, 2471, 2471, 2474, 2474, 2474, 2475, 2475, 2475, 1207,
+     2475, 1206, 2450, 2475, 2487, 2487, 2487, 2453, 2471, 1205,
+     2474, 2454, 2498, 2498, 2498, 2501, 2501, 2501, 2504, 2504,
+     2504, 1204, 2487, 2507, 2507, 2507, 2509, 2509, 2509, 1203,
+     2510, 2510, 2510, 1201, 2510, 1200, 2504, 2510, 2511, 2511,
+     2511, 2507, 1199, 2509, 2518, 2518, 2518, 2519, 2519, 2519,
+     2520, 2520, 2520, 2526, 2526, 2526, 2511, 1198, 2527, 2527,
+     2527, 2518, 2527, 1197, 2487, 2527, 1196, 1195, 2520, 1189,
+     2526, 2529, 2529, 2529, 2531, 2531, 2531, 1188, 2531, 1187,
+
+     1184, 2531, 1183, 1182, 2504, 2534, 2534, 2534, 2529, 1180,
+     2536, 2536, 2536, 2540, 2540, 2540, 2542, 2542, 2542, 2544,
+     2544, 2544, 1176, 2534, 2556, 2556, 2556, 2520, 2536, 1173,
+     2540, 1168, 1159, 2542, 2543, 2543, 2543, 2544, 2543, 1158,
+     1155, 2543, 2545, 2545, 2545, 2546, 2546, 2546, 1154, 2546,
+     1153, 1152, 2546, 2554, 2554, 2554, 2558, 2558, 2558, 2545,
+     2560, 2560, 2560, 1151, 2561, 2561, 2561, 1137, 2561, 1130,
+     2554, 2561, 1122, 1121, 2558, 1120, 1117, 2560, 2562, 2562,
+     2562, 2563, 2563, 2563, 1114, 2564, 2564, 2564, 2565, 2565,
+     2565, 1111, 2565, 1106, 1103, 2565, 2562, 1102, 1098, 2563,
+
+     2568, 2568, 2568, 2564, 2569, 2569, 2569, 1096, 2569, 1082,
+     1081, 2569, 2570, 2570, 2570, 1080, 1079, 2568, 2571, 2571,
+     2571, 2572, 2572, 2572, 2574, 2574, 2574, 1078, 1077, 2570,
+     1076, 1075, 2575, 2575, 2575, 2571, 2576, 2576, 2576, 2572,
+     2580, 2580, 2580, 2584, 2584, 2584, 1074, 1073, 2563, 2564,
+     2575, 2585, 2585, 2585, 2576, 2589, 2589, 2589, 2580, 2590,
+     2590, 2590, 1069, 2590, 1065, 1058, 2590, 2604, 2604, 2604,
+     1055, 1054, 2589, 2619, 2619, 2619, 2622, 2622, 2622, 2623,
+     2623, 2623, 2625, 2625, 2625, 2604, 2625, 1050, 1049, 2625,
+     2628, 2628, 2628, 1048, 2622, 1045, 1044, 2576, 2631, 2631,
+
+     2631, 2634, 2634, 2634, 1043, 2635, 2635, 2635, 2628, 2635,
+     1040, 1039, 2635, 1036, 1035, 2631, 1032, 1029, 2634, 2636,
+     2636, 2636, 2640, 2640, 2640, 1025, 1024, 2604, 2642, 2642,
+     2642, 1021, 2642, 1020, 1019, 2642, 1018, 2636, 1017, 2640,
+     2646, 2646, 2646, 1015, 2647, 2647, 2647, 2622, 2647, 1014,
+     1013, 2647, 2654, 2654, 2654, 1012, 1011, 2646, 2655, 2655,
+     2655, 2656, 2656, 2656, 1010, 2656, 1009, 1008, 2656, 2654,
+     2657, 2657, 2657, 1004,  999, 2655, 2658, 2658, 2658,  998,
+     2658,  997,  994, 2658, 2661, 2661, 2661, 2657, 2663, 2663,
+     2663,  993, 2663,  992,  990, 2663, 2671, 2671, 2671, 2672,
+
+     2672, 2672, 2661, 2672,  986,  982, 2672, 2673, 2673, 2673,
+     2674, 2674, 2674, 2671, 2675, 2675, 2675,  981, 2675,  978,
+      975, 2675,  974,  973, 2673,  972,  971, 2674, 2678, 2678,
+     2678, 2680, 2680, 2680, 2681, 2681, 2681, 2682, 2682, 2682,
+      970, 2682,  969,  967, 2682,  966, 2678,  965,  964, 2680,
+      963,  962, 2681, 2685, 2685, 2685, 2686, 2686, 2686,  961,
+     2686,  960,  959, 2686, 2687, 2687, 2687, 2688, 2688, 2688,
+     2685, 2688,  958,  956, 2688, 2689, 2689, 2689, 2691, 2691,
+     2691, 2687, 2696, 2696, 2696, 2697, 2697, 2697, 2701, 2701,
+     2701,  955,  954, 2689,  953, 2681, 2691, 2680,  952, 2702,
+
+     2702, 2702,  951, 2702,  950, 2701, 2702, 2720, 2720, 2720,
+     2734, 2734, 2734, 2736, 2736, 2736, 2737, 2737, 2737, 2738,
+     2738, 2738, 2739, 2739, 2739, 2720, 2740, 2740, 2740,  949,
+     2736, 2741, 2741, 2741, 2737, 2800, 2800, 2800,  948, 2739,
+     2691,  947,  943, 2740,  942, 2742, 2742, 2742, 2741, 2742,
+      940,  939, 2742, 2743, 2743, 2743,  938, 2743, 2720,  937,
+     2743, 2746, 2746, 2746, 2750, 2750, 2750, 2751, 2751, 2751,
+      936,  932, 2740, 2752, 2752, 2752,  930, 2752, 2737, 2746,
+     2752, 2750,  929,  928, 2751, 2753, 2753, 2753, 2755, 2755,
+     2755,  927, 2755,  923,  922, 2755, 2764, 2764, 2764, 2765,
+
+     2765, 2765, 2753, 2765,  918,  914, 2765, 2766, 2766, 2766,
+      913, 2766,  910, 2764, 2766, 2769, 2769, 2769, 2770, 2770,
+     2770,  909, 2770,  908,  907, 2770, 2772, 2772, 2772, 2774,
+     2774, 2774, 2769, 2774,  906,  905, 2774, 2777, 2777, 2777,
+     2778, 2778, 2778, 2772, 2778,  904,  901, 2778, 2779, 2779,
+     2779, 2780, 2780, 2780, 2777, 2780,  900,  899, 2780, 2787,
+     2787, 2787, 2788, 2788, 2788, 2779, 2789, 2789, 2789,  898,
+     2789,  895,  894, 2789, 2792, 2792, 2792, 2787, 2792,  893,
+     2788, 2792, 2795, 2795, 2795, 2798, 2798, 2798, 2801, 2801,
+     2801, 2804, 2804, 2804,  890, 2804,  888,  885, 2804,  884,
+
+     2795,  883, 2798, 2798, 2815, 2815, 2815, 2824, 2824, 2824,
+     2787, 2838, 2838, 2838, 2839, 2839, 2839, 2840, 2840, 2840,
+      882, 2815, 2842, 2842, 2842, 2824, 2841, 2841, 2841, 2788,
+     2841,  881,  878, 2841, 2840, 2843, 2843, 2843,  877,  876,
+     2842, 2844, 2844, 2844,  875, 2844,  874,  871, 2844, 2845,
+     2845, 2845, 2843, 2846, 2846, 2846, 2824, 2846,  870,  869,
+     2846, 2848, 2848, 2848,  868, 2848, 2845,  866, 2848, 2853,
+     2853, 2853,  863, 2842, 2854, 2854, 2854,  862, 2854,  860,
+      857, 2854,  855, 2855, 2855, 2855, 2853, 2855,  852,  851,
+     2855, 2858, 2858, 2858, 2859, 2859, 2859,  850, 2859,  849,
+
+      847, 2859, 2867, 2867, 2867,  846, 2867,  845, 2858, 2867,
+     2870, 2870, 2870,  842, 2870,  841,  840, 2870, 2874, 2874,
+     2874, 2875, 2875, 2875,  839, 2875,  838,  837, 2875, 2877,
+     2877, 2877,  832, 2877,  831, 2874, 2877, 2880, 2880, 2880,
+      830, 2880,  829,  828, 2880, 2889, 2889, 2889, 2890, 2890,
+     2890, 2895, 2895, 2895, 2898, 2898, 2898, 2899, 2899, 2899,
+     2900, 2900, 2900, 2889, 2900,  827, 2890, 2900,  826, 2895,
+      825, 2898, 2898,  824, 2899, 2899,  823,  822, 2900, 2901,
+     2901, 2901, 2902, 2902, 2902, 2903, 2903, 2903, 2904, 2904,
+     2904, 2913, 2913, 2913, 2914, 2914, 2914,  821, 2914,  819,
+
+      817, 2914, 2923, 2923, 2923, 2936, 2936, 2936, 2913, 2937,
+     2937, 2937,  816,  813, 2890, 2938, 2938, 2938,  810, 2938,
+     2923,  807, 2938, 2941, 2941, 2941, 2942, 2942, 2942,  806,
+     2942,  802,  801, 2942,  800, 2945, 2945, 2945,  799, 2945,
+      796, 2941, 2945, 2951, 2951, 2951,  793, 2951,  792,  791,
+     2951, 2954, 2954, 2954,  788, 2954,  787,  786, 2954, 2957,
+     2957, 2957, 2964, 2964, 2964, 2965, 2965, 2965, 2923, 2965,
+      783,  782, 2965, 2968, 2968, 2968, 2957,  780,  776, 2964,
+     2983, 2983, 2983, 2985, 2985, 2985, 2991, 2991, 2991,  775,
+     2968,  774, 2992, 2992, 2992,  772, 2992,  761, 2983, 2992,
+
+      759, 2985,  756, 2991, 2991, 2993, 2993, 2993,  755, 2993,
+     2992,  754, 2993, 2996, 2996, 2996, 2997, 2997, 2997, 2998,
+     2998, 2998,  752, 2993, 3007, 3007, 3007,  751, 3007,  750,
+      746, 3007,  745,  744, 2985, 2994, 2994, 2994, 2994, 2994,
+     2994, 2994, 2994, 2994,  743,  740, 2994, 3016, 3016, 3016,
+      739, 2994, 2994, 2994, 2994, 2994, 3025, 3025, 3025, 3026,
+     3026, 3026, 3031, 3031, 3031, 3016, 3032, 3032, 3032,  738,
+     3032,  737,  736, 3032, 3033, 3033, 3033, 3026,  735, 3031,
+     2994, 2994, 2995, 2995, 2995, 2995, 2995, 2995, 2995, 2995,
+     2995, 3033,  734, 2995, 3039, 3039, 3039,  732, 2995, 2995,
+
+     2995, 2995, 2995, 3040, 3040, 3040,  729, 3040,  728,  726,
+     3040, 3039, 3041, 3041, 3041, 3042, 3042, 3042,  724, 3042,
+      721,  720, 3042, 3055, 3055, 3055,  714, 2995, 2995, 3041,
+     3061, 3061, 3061,  712, 3061,  710,  707, 3061,  706,  702,
+      701, 3055,  700, 3080, 3080, 3080,  699,  696, 3061, 3064,
+     3064, 3064, 3064, 3064, 3064, 3064, 3064, 3064,  695,  694,
+     3064, 3080, 3094, 3094, 3094, 3064, 3064, 3064, 3064, 3064,
+     3091, 3091, 3091,  693, 3091,  690,  689, 3091,  688, 3094,
+     3095, 3095, 3095,  687, 3095,  686,  680, 3095, 3117, 3117,
+     3117, 3129, 3129, 3129, 3064, 3064, 3065, 3065, 3065, 3065,
+
+     3065, 3065, 3065, 3065, 3065,  679, 3117, 3065,  677, 3129,
+     3129,  671, 3065, 3065, 3065, 3065, 3065, 3099, 3099, 3099,
+      670, 3099,  666,  660, 3099, 3102, 3102, 3102,  659, 3102,
+      655,  648, 3102, 3146, 3146, 3146, 3147, 3147, 3147,  644,
+      638, 3065, 3065, 3148, 3148, 3148,  634, 3153, 3153, 3153,
+     3146, 3153,  626, 3147, 3153, 3156, 3156, 3156,  625,  624,
+     3148, 3167, 3167, 3167, 3171, 3171, 3171, 3182, 3182, 3182,
+      623,  622, 3156, 3183, 3183, 3183,  618, 3183,  611, 3167,
+     3183,  610, 3171,  609, 3182, 3184, 3184, 3184, 3185, 3185,
+     3185,  605, 3185,  598,  597, 3185, 3186, 3186, 3186, 3187,
+
+     3187, 3187, 3184, 3187,  593,  587, 3187, 3194, 3194, 3194,
+     3195, 3195, 3195, 3186, 3195, 3171,  586, 3195, 3204, 3204,
+     3204, 3214, 3214, 3214, 3194, 3214,  582,  574, 3214,  573,
+     3217, 3217, 3217,  569, 3217,  560, 3204, 3217, 3220, 3220,
+     3220,  556, 3220,  548,  547, 3220, 3229, 3229, 3229,  546,
+     3229,  542,  536, 3229,  535, 3204, 3344, 3344, 3344, 3353,
+     3353, 3353,  534, 3353,  530,  524, 3353, 3454, 3454, 3454,
+     3455, 3455, 3455,  523, 3344,  519,  513, 3353,  512,  511,
+      510,  509,  508,  507,  503, 3454,  497,  496, 3455, 3458,
+     3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3459, 3459,
+
+     3459, 3459, 3459, 3459, 3459, 3459, 3459, 3460, 3460, 3460,
+     3460, 3460, 3460, 3460, 3460, 3460, 3461, 3461, 3461, 3461,
+     3461, 3461, 3461, 3461, 3461, 3462, 3462, 3462, 3462, 3462,
+     3462, 3462, 3462, 3462, 3463, 3463, 3463, 3463, 3463, 3463,
+     3463, 3463, 3463, 3464, 3464, 3464, 3464, 3464, 3464, 3464,
+     3464, 3464, 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465,
+     3465, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466,
+     3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3469, 3469,
+     3469, 3469, 3469, 3469, 3469, 3469, 3469, 3470, 3470, 3470,
+
+     3470, 3470, 3470, 3470, 3470, 3470, 3471, 3471, 3471, 3471,
+     3471, 3471, 3471, 3471, 3471, 3472, 3472, 3472, 3472, 3472,
+     3472, 3472, 3472, 3472, 3473, 3473, 3473, 3473, 3473, 3473,
+     3473, 3473, 3473, 3474, 3474, 3474, 3474, 3474, 3474, 3474,
+     3474, 3474, 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475,
+     3475, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476,
+     3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3478,
+     3478, 3478, 3478, 3478, 3478, 3478, 3478, 3478, 3479, 3479,
+     3479, 3479, 3479, 3479, 3479, 3479, 3479, 3480, 3480, 3480,
+     3480, 3480, 3480, 3480, 3480, 3480, 3481, 3481, 3481, 3481,
+
+     3481, 3481, 3481, 3481, 3481, 3482, 3482, 3482, 3482, 3482,
+     3482, 3482, 3482, 3482, 3483, 3483, 3483, 3483, 3483, 3483,
+     3483, 3483, 3483, 3484, 3484, 3484, 3484, 3484, 3484, 3484,
+     3484, 3484, 3485, 3485, 3485, 3485, 3485, 3485, 3485, 3485,
+     3485, 3486, 3486, 3486, 3486, 3486, 3486, 3486, 3486, 3486,
+     3487, 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3488,
+     3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3489, 3489,
+     3489, 3489, 3489, 3489, 3489, 3489, 3489, 3490, 3490, 3490,
+     3490, 3490, 3490, 3490, 3490, 3490, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3492, 3492, 3492, 3492, 3492,
+
+     3492, 3492, 3492, 3492, 3493, 3493, 3493, 3493, 3493, 3493,
+     3493, 3493, 3493, 3494, 3494, 3494, 3494, 3494, 3494, 3494,
+     3494, 3494, 3495, 3495, 3495, 3495, 3495, 3495, 3495, 3495,
+     3495, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496,
+     3497, 3497, 3497, 3497, 3497, 3497, 3497, 3497, 3497, 3498,
+     3498, 3498, 3498, 3498, 3498, 3498, 3498, 3498, 3499, 3499,
+     3499, 3499, 3499, 3499, 3499, 3499, 3499, 3500, 3500, 3500,
+     3500, 3500, 3500, 3500, 3500, 3500, 3501, 3501, 3501, 3501,
+     3501, 3501, 3501, 3501, 3501, 3502, 3502, 3502, 3502, 3502,
+     3502, 3502, 3502, 3502, 3503, 3503, 3503, 3503, 3503, 3503,
+
+     3503, 3503, 3503, 3504, 3504, 3504, 3504, 3504, 3504, 3504,
+     3504, 3504, 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505,
+     3505, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506,
+     3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3508,
+     3508, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3509, 3509,
+     3509, 3509, 3509, 3509, 3509, 3509, 3509, 3510, 3510, 3510,
+     3510, 3510, 3510, 3510, 3510, 3510, 3511, 3511, 3511, 3511,
+     3511, 3511, 3511, 3511, 3511, 3512, 3512, 3512, 3512, 3512,
+     3512, 3512, 3512, 3512, 3513, 3513, 3513, 3513, 3513, 3513,
+     3513, 3513, 3513, 3514, 3514, 3514, 3514, 3514, 3514, 3514,
+
+     3514, 3514, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
+     3515, 3516, 3516, 3516, 3516, 3516, 3516, 3516, 3516, 3516,
+     3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3518,
+     3518, 3518, 3518, 3518, 3518, 3518, 3518, 3518, 3519, 3519,
+     3519, 3519, 3519, 3519, 3519, 3519, 3519, 3520, 3520, 3520,
+     3520, 3520, 3520, 3520, 3520, 3520, 3521, 3521, 3521,  494,
+      493,  492, 3521, 3522, 3522, 3522,  488,  481,  476, 3522,
+     3523, 3523, 3523,  475,  473,  469, 3523, 3524, 3524, 3524,
+      463,  462,  461, 3524, 3525, 3525, 3525,  457,  451,  447,
+     3525, 3526, 3526, 3526,  443,  439,  437, 3526, 3527, 3527,
+
+     3527,  436,  435,  431, 3527, 3528, 3528, 3528,  425,  424,
+      420, 3528, 3529, 3529, 3529,  414,  413,  409, 3529, 3530,
+     3530, 3530,  402,  401,  400, 3530, 3531, 3531, 3531,  396,
+      388,  387, 3531, 3532, 3532, 3532,  386,  385,  381, 3532,
+     3533, 3533, 3533,  372,  366,  362, 3533, 3534, 3534, 3534,
+      361,  357,  351, 3534, 3535, 3535, 3535,  350,  349,  345,
+     3535, 3536, 3536, 3536,  338,  336,  335, 3536, 3537, 3537,
+     3537,  331,  328,  326, 3537, 3538, 3538, 3538,  325,  324,
+      320, 3538, 3539, 3539, 3539,  316,  313,  309, 3539, 3540,
+     3540, 3540,  306,  305,  297, 3540, 3541, 3541, 3541,  293,
+
+      289,  288, 3541, 3542, 3542, 3542,  287,  281,  280, 3542,
+     3543, 3543, 3543,  278,  275,  263, 3543, 3544, 3544, 3544,
+        0,    0,    0, 3544, 3545, 3545, 3545,    0,    0,    0,
+     3545, 3546, 3546, 3546,    0,    0,    0, 3546, 3547, 3547,
+     3547,    0,    0,    0, 3547, 3548, 3548, 3548,    0,    0,
+        0, 3548, 3549, 3549, 3549,    0,    0,    0, 3549, 3550,
+     3550, 3550, 3550, 3550, 3550, 3550,    0, 3550, 3551, 3551,
+     3551,    0,    0,    0, 3551, 3552,    0,    0,    0, 3552,
+     3553, 3553, 3553,    0,    0,    0, 3553, 3554,    0,    0,
+        0, 3554, 3555, 3555, 3555,    0,    0,    0, 3555, 3556,
+
+        0,    0,    0, 3556, 3557, 3557, 3557,    0,    0,    0,
+     3557, 3558,    0,    0,    0, 3558, 3559, 3559, 3559,    0,
+        0,    0, 3559, 3560,    0,    0,    0, 3560, 3561, 3561,
+     3561,    0,    0,    0, 3561, 3562,    0,    0,    0, 3562,
+     3563, 3563, 3563,    0,    0,    0, 3563, 3564,    0,    0,
+        0, 3564, 3565, 3565, 3565,    0,    0,    0, 3565, 3566,
+        0,    0,    0, 3566, 3567, 3567, 3567,    0,    0,    0,
+     3567, 3568,    0,    0,    0, 3568, 3569, 3569, 3569,    0,
+        0,    0, 3569, 3570,    0,    0,    0, 3570, 3571, 3571,
+     3571,    0,    0,    0, 3571, 3572,    0,    0,    0, 3572,
+
+     3573, 3573, 3573,    0,    0,    0, 3573, 3574,    0,    0,
+        0, 3574, 3575, 3575, 3575,    0,    0,    0, 3575, 3576,
+        0,    0,    0, 3576, 3577, 3577, 3577,    0,    0,    0,
+     3577, 3578,    0,    0,    0, 3578, 3579, 3579, 3579,    0,
+        0,    0, 3579, 3580,    0,    0,    0, 3580, 3581, 3581,
+     3581,    0,    0,    0, 3581, 3582,    0,    0,    0, 3582,
+     3583, 3583, 3583,    0,    0,    0, 3583, 3584,    0,    0,
+        0, 3584, 3585, 3585, 3585,    0,    0,    0, 3585, 3586,
+        0,    0,    0, 3586, 3587, 3587, 3587,    0,    0,    0,
+     3587, 3588,    0,    0,    0, 3588, 3589, 3589, 3589,    0,
+
+        0,    0, 3589, 3590,    0,    0,    0, 3590, 3591, 3591,
+     3591,    0,    0,    0, 3591, 3592,    0,    0,    0, 3592,
+     3593, 3593, 3593,    0,    0,    0, 3593, 3594,    0,    0,
+        0, 3594, 3595, 3595, 3595,    0,    0,    0, 3595, 3596,
+        0,    0,    0, 3596, 3597, 3597, 3597,    0,    0,    0,
+     3597, 3598,    0,    0,    0, 3598, 3599, 3599, 3599,    0,
+        0,    0, 3599, 3600,    0,    0,    0, 3600, 3601, 3601,
+     3601,    0,    0,    0, 3601, 3602,    0,    0,    0, 3602,
+     3603, 3603, 3603,    0,    0,    0, 3603, 3604,    0,    0,
+        0, 3604, 3605, 3605, 3605,    0,    0,    0, 3605, 3606,
+
+        0,    0,    0, 3606, 3607, 3607, 3607,    0,    0,    0,
+     3607, 3608,    0,    0,    0, 3608, 3609, 3609, 3609, 3609,
+     3609, 3609, 3609, 3609, 3609, 3610,    0,    0,    0,    0,
+     3610, 3611, 3611, 3611,    0,    0,    0, 3611, 3612, 3612,
+     3612, 3612,    0,    0, 3612, 3612, 3613, 3613, 3613,    0,
+        0,    0, 3613, 3614, 3614, 3614, 3614,    0,    0, 3614,
+     3614, 3615, 3615, 3615,    0,    0,    0, 3615, 3616, 3616,
+     3616, 3616,    0,    0, 3616, 3616, 3617, 3617, 3617,    0,
+        0,    0, 3617, 3618, 3618, 3618, 3618,    0,    0, 3618,
+     3618, 3619, 3619, 3619,    0,    0,    0, 3619, 3620, 3620,
+
+     3620, 3620,    0,    0, 3620, 3620, 3621, 3621, 3621,    0,
+        0,    0, 3621, 3622, 3622, 3622, 3622,    0,    0, 3622,
+     3622, 3623, 3623, 3623,    0,    0,    0, 3623, 3624, 3624,
+     3624, 3624,    0,    0, 3624, 3624, 3625, 3625, 3625,    0,
+        0,    0, 3625, 3626, 3626, 3626, 3626,    0,    0, 3626,
+     3626, 3627, 3627, 3627,    0,    0,    0, 3627, 3628, 3628,
+     3628, 3628,    0,    0, 3628, 3628, 3629, 3629, 3629,    0,
+        0,    0, 3629, 3630, 3630, 3630, 3630,    0,    0, 3630,
+     3630, 3631, 3631, 3631,    0,    0,    0, 3631, 3632, 3632,
+     3632, 3632,    0,    0, 3632, 3632, 3633, 3633, 3633,    0,
+
+        0,    0, 3633, 3634, 3634, 3634, 3634,    0,    0, 3634,
+     3634, 3635, 3635, 3635,    0,    0,    0, 3635, 3636, 3636,
+     3636, 3636,    0,    0, 3636, 3636, 3637, 3637, 3637,    0,
+        0,    0, 3637, 3638, 3638, 3638, 3638,    0,    0, 3638,
+     3638, 3639, 3639, 3639, 3639,    0, 3639,    0, 3639, 3640,
+     3640, 3640, 3640,    0,    0, 3640, 3640, 3641, 3641, 3641,
+        0,    0,    0, 3641, 3642, 3642, 3642, 3642,    0,    0,
+     3642, 3642, 3643, 3643, 3643,    0,    0,    0, 3643, 3644,
+     3644, 3644, 3644,    0,    0, 3644, 3644, 3645, 3645, 3645,
+        0,    0,    0, 3645, 3646, 3646, 3646, 3646,    0,    0,
+
+     3646, 3646, 3647, 3647, 3647,    0,    0,    0, 3647, 3648,
+     3648, 3648, 3648,    0,    0, 3648, 3648, 3649, 3649, 3649,
+     3649,    0, 3649,    0, 3649, 3650, 3650, 3650, 3650,    0,
+        0, 3650, 3650, 3651, 3651, 3651, 3651,    0, 3651,    0,
+     3651, 3652, 3652, 3652, 3652,    0,    0, 3652, 3652, 3653,
+     3653, 3653,    0,    0,    0, 3653, 3654, 3654, 3654, 3654,
+        0,    0, 3654, 3654, 3655, 3655, 3655, 3655,    0, 3655,
+        0, 3655, 3656, 3656, 3656, 3656,    0,    0, 3656, 3656,
+     3657, 3657, 3657, 3657,    0, 3657,    0, 3657, 3658, 3658,
+     3658, 3658,    0,    0, 3658, 3658, 3659, 3659, 3659,    0,
+
+        0,    0, 3659, 3660, 3660, 3660, 3660,    0,    0, 3660,
+     3660, 3661, 3661, 3661,    0,    0,    0, 3661, 3662, 3662,
+     3662, 3662,    0,    0, 3662, 3662, 3663, 3663, 3663, 3663,
+        0,    0, 3663, 3663, 3664, 3664, 3664,    0,    0,    0,
+     3664, 3665, 3665, 3665, 3665,    0,    0, 3665, 3665, 3666,
+     3666, 3666,    0,    0,    0, 3666, 3667, 3667, 3667, 3667,
+        0,    0, 3667, 3667, 3668, 3668, 3668, 3668, 3668, 3668,
+     3668, 3668, 3668, 3669,    0, 3669,    0,    0, 3669, 3670,
+     3670, 3670,    0,    0,    0, 3670, 3671, 3671, 3671, 3671,
+        0,    0, 3671, 3671, 3672, 3672, 3672, 3672,    0, 3672,
+
+        0, 3672, 3673, 3673, 3673, 3673,    0,    0, 3673, 3673,
+     3674, 3674, 3674, 3674,    0, 3674,    0, 3674, 3675, 3675,
+     3675, 3675,    0,    0, 3675, 3675, 3676, 3676, 3676,    0,
+        0,    0, 3676, 3677, 3677, 3677, 3677,    0,    0, 3677,
+     3677, 3678, 3678, 3678,    0,    0,    0, 3678, 3679, 3679,
+     3679, 3679,    0,    0, 3679, 3679, 3680, 3680, 3680,    0,
+        0,    0, 3680, 3681, 3681, 3681, 3681,    0,    0, 3681,
+     3681, 3682, 3682, 3682,    0,    0,    0, 3682, 3683, 3683,
+     3683, 3683,    0,    0, 3683, 3683, 3684, 3684, 3684,    0,
+        0,    0, 3684, 3685, 3685, 3685, 3685,    0,    0, 3685,
+
+     3685, 3686, 3686, 3686, 3686,    0, 3686,    0, 3686, 3687,
+     3687, 3687, 3687,    0,    0, 3687, 3687, 3688, 3688, 3688,
+     3688,    0, 3688,    0, 3688, 3689, 3689, 3689, 3689,    0,
+        0, 3689, 3689, 3690, 3690, 3690,    0,    0,    0, 3690,
+     3691, 3691, 3691, 3691,    0,    0, 3691, 3691, 3692, 3692,
+     3692, 3692,    0, 3692,    0, 3692, 3693, 3693, 3693, 3693,
+        0,    0, 3693, 3693, 3694, 3694, 3694, 3694,    0, 3694,
+        0, 3694, 3695, 3695, 3695, 3695,    0,    0, 3695, 3695,
+     3696, 3696, 3696,    0,    0,    0, 3696, 3697, 3697, 3697,
+     3697,    0,    0, 3697, 3697, 3698, 3698, 3698,    0,    0,
+
+        0, 3698, 3699, 3699, 3699, 3699,    0,    0, 3699, 3699,
+     3700, 3700, 3700,    0,    0,    0, 3700, 3701, 3701, 3701,
+     3701,    0,    0, 3701, 3701, 3702, 3702, 3702,    0,    0,
+        0, 3702, 3703, 3703, 3703, 3703,    0,    0, 3703, 3703,
+     3704, 3704, 3704,    0,    0,    0, 3704, 3705, 3705, 3705,
+     3705,    0,    0, 3705, 3705, 3706, 3706, 3706,    0,    0,
+        0, 3706, 3707, 3707, 3707, 3707,    0,    0, 3707, 3707,
+     3708, 3708, 3708,    0,    0,    0, 3708, 3709, 3709, 3709,
+     3709,    0,    0, 3709, 3709, 3710, 3710, 3710,    0,    0,
+        0, 3710, 3711, 3711, 3711, 3711,    0,    0, 3711, 3711,
+
+     3712, 3712, 3712,    0,    0,    0, 3712, 3713, 3713, 3713,
+     3713,    0,    0, 3713, 3713, 3714, 3714, 3714, 3714,    0,
+        0, 3714, 3714, 3715, 3715, 3715,    0,    0,    0, 3715,
+     3716, 3716, 3716, 3716,    0,    0, 3716, 3716, 3717, 3717,
+     3717,    0,    0,    0, 3717, 3718, 3718, 3718, 3718,    0,
+        0, 3718, 3718, 3719, 3719, 3719,    0,    0,    0, 3719,
+     3720, 3720, 3720, 3720,    0,    0, 3720, 3720, 3721, 3721,
+     3721, 3721,    0,    0, 3721, 3721, 3722, 3722, 3722,    0,
+        0,    0, 3722, 3723, 3723, 3723, 3723,    0,    0, 3723,
+     3723, 3724, 3724, 3724,    0,    0,    0, 3724, 3725, 3725,
+
+     3725, 3725,    0,    0, 3725, 3725, 3726, 3726, 3726, 3726,
+     3726, 3726, 3726, 3726, 3726, 3727, 3727, 3727, 3727, 3727,
+     3727, 3727, 3727, 3727, 3728, 3728, 3728,    0,    0,    0,
+     3728, 3729, 3729, 3729, 3729,    0,    0, 3729, 3729, 3730,
+     3730, 3730, 3730,    0,    0, 3730, 3730, 3731, 3731, 3731,
+        0,    0,    0, 3731, 3732, 3732, 3732, 3732,    0,    0,
+     3732, 3732, 3733, 3733, 3733,    0,    0,    0, 3733, 3734,
+     3734, 3734, 3734,    0,    0, 3734, 3734, 3735, 3735, 3735,
+        0,    0,    0, 3735, 3736, 3736, 3736, 3736,    0,    0,
+     3736, 3736, 3737, 3737, 3737,    0,    0,    0, 3737, 3738,
+
+     3738, 3738,    0,    0,    0, 3738, 3739, 3739, 3739, 3739,
+        0,    0, 3739, 3739, 3740, 3740, 3740,    0,    0,    0,
+     3740, 3741, 3741, 3741, 3741,    0,    0, 3741, 3741, 3742,
+     3742, 3742,    0,    0,    0, 3742, 3743, 3743, 3743, 3743,
+        0,    0, 3743, 3743, 3744, 3744, 3744,    0,    0,    0,
+     3744, 3745, 3745, 3745, 3745,    0,    0, 3745, 3745, 3746,
+     3746, 3746,    0,    0,    0, 3746, 3747, 3747, 3747, 3747,
+        0,    0, 3747, 3747, 3748, 3748, 3748, 3748,    0,    0,
+     3748, 3748, 3749, 3749, 3749, 3749,    0,    0, 3749, 3749,
+     3750, 3750, 3750,    0,    0,    0, 3750, 3751, 3751, 3751,
+
+     3751,    0,    0, 3751, 3751, 3752, 3752, 3752, 3752,    0,
+     3752,    0, 3752, 3753, 3753, 3753, 3753,    0,    0, 3753,
+     3753, 3754, 3754, 3754,    0,    0,    0, 3754, 3755, 3755,
+     3755, 3755,    0,    0, 3755, 3755, 3756, 3756, 3756,    0,
+        0,    0, 3756, 3757, 3757, 3757, 3757,    0,    0, 3757,
+     3757, 3758, 3758, 3758,    0,    0,    0, 3758, 3759, 3759,
+     3759, 3759,    0,    0, 3759, 3759, 3760, 3760, 3760,    0,
+        0,    0, 3760, 3761, 3761, 3761, 3761,    0,    0, 3761,
+     3761, 3762, 3762, 3762,    0,    0,    0, 3762, 3763, 3763,
+     3763, 3763,    0,    0, 3763, 3763, 3764, 3764, 3764,    0,
+
+        0,    0, 3764, 3765, 3765, 3765, 3765,    0,    0, 3765,
+     3765, 3766, 3766, 3766,    0,    0,    0, 3766, 3767, 3767,
+     3767, 3767,    0,    0, 3767, 3767, 3768, 3768, 3768, 3768,
+        0,    0, 3768, 3768, 3769, 3769, 3769,    0,    0,    0,
+     3769, 3770, 3770, 3770, 3770,    0,    0, 3770, 3770, 3771,
+     3771, 3771,    0,    0,    0, 3771, 3772, 3772, 3772, 3772,
+        0,    0, 3772, 3772, 3773, 3773, 3773, 3773,    0, 3773,
+        0, 3773, 3774, 3774, 3774, 3774,    0,    0, 3774, 3774,
+     3775, 3775, 3775, 3775,    0,    0, 3775, 3775, 3776, 3776,
+     3776, 3776,    0, 3776,    0, 3776, 3777, 3777, 3777, 3777,
+
+        0,    0, 3777, 3777, 3778, 3778, 3778, 3778,    0, 3778,
+        0, 3778, 3779, 3779, 3779, 3779,    0,    0, 3779, 3779,
+     3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3781,
+     3781, 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3782, 3782,
+     3782,    0,    0,    0, 3782, 3783, 3783, 3783, 3783,    0,
+        0, 3783, 3783, 3784, 3784, 3784, 3784,    0,    0, 3784,
+     3784, 3785, 3785, 3785,    0,    0,    0, 3785, 3786, 3786,
+     3786, 3786,    0,    0, 3786, 3786, 3787, 3787, 3787,    0,
+        0,    0, 3787, 3788, 3788, 3788, 3788,    0,    0, 3788,
+     3788, 3789, 3789, 3789,    0,    0,    0, 3789, 3790, 3790,
+
+     3790, 3790,    0,    0, 3790, 3790, 3791, 3791, 3791,    0,
+        0,    0, 3791, 3792, 3792, 3792,    0,    0,    0, 3792,
+     3793, 3793, 3793, 3793,    0,    0, 3793, 3793, 3794, 3794,
+     3794,    0,    0,    0, 3794, 3795, 3795, 3795, 3795,    0,
+        0, 3795, 3795, 3796, 3796, 3796,    0,    0,    0, 3796,
+     3797, 3797, 3797, 3797,    0,    0, 3797, 3797, 3798, 3798,
+     3798, 3798,    0, 3798,    0, 3798, 3799, 3799, 3799, 3799,
+        0,    0, 3799, 3799, 3800, 3800, 3800,    0,    0,    0,
+     3800, 3801, 3801, 3801, 3801,    0,    0, 3801, 3801, 3802,
+     3802, 3802, 3802,    0,    0, 3802, 3802, 3803, 3803, 3803,
+
+        0,    0,    0, 3803, 3804, 3804, 3804, 3804,    0,    0,
+     3804, 3804, 3805, 3805, 3805, 3805,    0, 3805,    0, 3805,
+     3806, 3806, 3806, 3806,    0,    0, 3806, 3806, 3807, 3807,
+     3807,    0,    0,    0, 3807, 3808, 3808, 3808, 3808,    0,
+        0, 3808, 3808, 3809, 3809, 3809,    0,    0,    0, 3809,
+     3810, 3810, 3810, 3810,    0,    0, 3810, 3810, 3811, 3811,
+     3811,    0,    0,    0, 3811, 3812, 3812, 3812, 3812,    0,
+        0, 3812, 3812, 3813, 3813, 3813,    0,    0,    0, 3813,
+     3814, 3814, 3814, 3814,    0,    0, 3814, 3814, 3815, 3815,
+     3815,    0,    0,    0, 3815, 3816, 3816, 3816, 3816,    0,
+
+        0, 3816, 3816, 3817, 3817, 3817, 3817,    0, 3817,    0,
+     3817, 3818, 3818, 3818, 3818,    0,    0, 3818, 3818, 3819,
+     3819, 3819,    0,    0,    0, 3819, 3820, 3820, 3820, 3820,
+        0,    0, 3820, 3820, 3821, 3821, 3821, 3821,    0,    0,
+     3821, 3821, 3822, 3822, 3822, 3822,    0, 3822,    0, 3822,
+     3823, 3823, 3823, 3823,    0,    0, 3823, 3823, 3824, 3824,
+     3824,    0,    0,    0, 3824, 3825, 3825, 3825, 3825,    0,
+        0, 3825, 3825, 3826, 3826, 3826, 3826,    0,    0, 3826,
+     3826, 3827, 3827, 3827, 3827,    0,    0, 3827, 3827, 3828,
+     3828, 3828, 3828,    0,    0, 3828, 3828, 3829, 3829, 3829,
+
+     3829,    0,    0, 3829, 3829, 3830, 3830, 3830, 3830, 3830,
+     3830, 3830, 3830, 3830, 3831, 3831, 3831, 3831, 3831, 3831,
+     3831, 3831, 3831, 3832, 3832, 3832, 3832,    0, 3832,    0,
+     3832, 3833, 3833, 3833, 3833,    0,    0, 3833, 3833, 3834,
+     3834, 3834, 3834,    0,    0, 3834, 3834, 3835, 3835, 3835,
+        0,    0,    0, 3835, 3836, 3836, 3836, 3836,    0,    0,
+     3836, 3836, 3837, 3837, 3837,    0,    0,    0, 3837, 3838,
+     3838, 3838, 3838,    0,    0, 3838, 3838, 3839, 3839, 3839,
+     3839,    0, 3839,    0, 3839, 3840, 3840, 3840, 3840,    0,
+        0, 3840, 3840, 3841, 3841, 3841, 3841,    0, 3841,    0,
+
+     3841, 3842, 3842, 3842, 3842,    0, 3842,    0, 3842, 3843,
+     3843, 3843, 3843,    0,    0, 3843, 3843, 3844, 3844, 3844,
+     3844,    0, 3844,    0, 3844, 3845, 3845, 3845, 3845,    0,
+        0, 3845, 3845, 3846, 3846, 3846,    0,    0,    0, 3846,
+     3847, 3847, 3847, 3847,    0,    0, 3847, 3847, 3848, 3848,
+     3848, 3848,    0,    0, 3848, 3848, 3849, 3849, 3849,    0,
+        0,    0, 3849, 3850, 3850, 3850, 3850,    0,    0, 3850,
+     3850, 3851, 3851, 3851,    0,    0,    0, 3851, 3852, 3852,
+     3852, 3852,    0,    0, 3852, 3852, 3853, 3853, 3853, 3853,
+        0, 3853,    0, 3853, 3854, 3854, 3854, 3854,    0,    0,
+
+     3854, 3854, 3855, 3855, 3855,    0,    0,    0, 3855, 3856,
+     3856, 3856,    0,    0,    0, 3856, 3857, 3857, 3857, 3857,
+        0,    0, 3857, 3857, 3858, 3858, 3858,    0,    0,    0,
+     3858, 3859, 3859, 3859, 3859,    0,    0, 3859, 3859, 3860,
+     3860, 3860,    0,    0,    0, 3860, 3861, 3861, 3861,    0,
+        0,    0, 3861, 3862, 3862, 3862, 3862,    0,    0, 3862,
+     3862, 3863, 3863, 3863,    0,    0,    0, 3863, 3864, 3864,
+     3864, 3864,    0,    0, 3864, 3864, 3865, 3865, 3865,    0,
+        0,    0, 3865, 3866, 3866, 3866, 3866,    0,    0, 3866,
+     3866, 3867, 3867, 3867, 3867,    0,    0, 3867, 3867, 3868,
+
+     3868, 3868, 3868,    0,    0, 3868, 3868, 3869, 3869, 3869,
+        0,    0,    0, 3869, 3870, 3870, 3870, 3870,    0,    0,
+     3870, 3870, 3871, 3871, 3871, 3871,    0,    0, 3871, 3871,
+     3872, 3872, 3872, 3872,    0,    0, 3872, 3872, 3873, 3873,
+     3873, 3873,    0,    0, 3873, 3873, 3874, 3874, 3874, 3874,
+     3874, 3874, 3874, 3874, 3874, 3875, 3875, 3875, 3875, 3875,
+     3875, 3875, 3875, 3875, 3876, 3876, 3876, 3876,    0,    0,
+     3876, 3876, 3877, 3877, 3877, 3877,    0,    0, 3877, 3877,
+     3878, 3878, 3878,    0,    0,    0, 3878, 3879, 3879, 3879,
+        0,    0,    0, 3879, 3880, 3880, 3880, 3880,    0,    0,
+
+     3880, 3880, 3881, 3881, 3881, 3881,    0,    0, 3881, 3881,
+     3882, 3882, 3882,    0,    0,    0, 3882, 3883, 3883, 3883,
+     3883,    0,    0, 3883, 3883, 3884, 3884, 3884,    0,    0,
+        0, 3884, 3885, 3885, 3885, 3885,    0,    0, 3885, 3885,
+     3886, 3886, 3886,    0,    0,    0, 3886, 3887, 3887, 3887,
+     3887,    0,    0, 3887, 3887, 3888, 3888, 3888,    0,    0,
+        0, 3888, 3889, 3889, 3889, 3889,    0,    0, 3889, 3889,
+     3890, 3890, 3890,    0,    0,    0, 3890, 3891, 3891, 3891,
+     3891,    0,    0, 3891, 3891, 3892, 3892, 3892, 3892,    0,
+        0, 3892, 3892, 3893, 3893, 3893,    0,    0,    0, 3893,
+
+     3894, 3894, 3894,    0,    0,    0, 3894, 3895, 3895, 3895,
+     3895,    0,    0, 3895, 3895, 3896, 3896, 3896,    0,    0,
+        0, 3896, 3897, 3897, 3897, 3897,    0,    0, 3897, 3897,
+     3898, 3898, 3898,    0,    0,    0, 3898, 3899, 3899, 3899,
+        0,    0,    0, 3899, 3900, 3900, 3900,    0,    0,    0,
+     3900, 3901, 3901, 3901, 3901,    0,    0, 3901, 3901, 3902,
+     3902, 3902,    0,    0,    0, 3902, 3903, 3903, 3903, 3903,
+        0,    0, 3903, 3903, 3904, 3904, 3904, 3904,    0,    0,
+     3904, 3904, 3905, 3905, 3905, 3905,    0,    0, 3905, 3905,
+     3906, 3906, 3906, 3906,    0, 3906,    0, 3906, 3907, 3907,
+
+     3907, 3907,    0,    0, 3907, 3907, 3908, 3908, 3908, 3908,
+        0,    0, 3908, 3908, 3909, 3909, 3909, 3909,    0,    0,
+     3909, 3909, 3910, 3910, 3910, 3910,    0,    0, 3910, 3910,
+     3911, 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3912,
+     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3913, 3913,
+     3913, 3913,    0,    0, 3913, 3913, 3914, 3914, 3914, 3914,
+        0,    0, 3914, 3914, 3915, 3915, 3915,    0,    0,    0,
+     3915, 3916, 3916, 3916, 3916,    0, 3916,    0, 3916, 3917,
+     3917, 3917, 3917,    0,    0, 3917, 3917, 3918, 3918, 3918,
+        0,    0,    0, 3918, 3919, 3919, 3919, 3919,    0,    0,
+
+     3919, 3919, 3920, 3920, 3920,    0,    0,    0, 3920, 3921,
+     3921, 3921, 3921,    0,    0, 3921, 3921, 3922, 3922, 3922,
+     3922,    0, 3922,    0, 3922, 3923, 3923, 3923, 3923,    0,
+        0, 3923, 3923, 3924, 3924, 3924,    0,    0,    0, 3924,
+     3925, 3925, 3925, 3925,    0,    0, 3925, 3925, 3926, 3926,
+     3926,    0,    0,    0, 3926, 3927, 3927, 3927, 3927,    0,
+        0, 3927, 3927, 3928, 3928, 3928, 3928,    0,    0, 3928,
+     3928, 3929, 3929, 3929,    0,    0,    0, 3929, 3930, 3930,
+     3930,    0,    0,    0, 3930, 3931, 3931, 3931, 3931,    0,
+     3931,    0, 3931, 3932, 3932, 3932, 3932,    0,    0, 3932,
+
+     3932, 3933, 3933, 3933, 3933,    0, 3933,    0, 3933, 3934,
+     3934, 3934,    0,    0,    0, 3934, 3935, 3935, 3935,    0,
+        0,    0, 3935, 3936, 3936, 3936, 3936,    0,    0, 3936,
+     3936, 3937, 3937, 3937, 3937,    0, 3937,    0, 3937, 3938,
+     3938, 3938, 3938,    0,    0, 3938, 3938, 3939, 3939, 3939,
+     3939,    0,    0, 3939, 3939, 3940, 3940, 3940, 3940,    0,
+        0, 3940, 3940, 3941, 3941, 3941, 3941,    0, 3941,    0,
+     3941, 3942, 3942, 3942, 3942,    0,    0, 3942, 3942, 3943,
+     3943, 3943, 3943,    0,    0, 3943, 3943, 3944, 3944, 3944,
+     3944,    0,    0, 3944, 3944, 3945, 3945, 3945, 3945, 3945,
+
+     3945, 3945, 3945, 3945, 3946, 3946, 3946, 3946, 3946, 3946,
+     3946, 3946, 3946, 3947, 3947, 3947, 3947,    0,    0, 3947,
+     3947, 3948, 3948, 3948,    0,    0,    0, 3948, 3949, 3949,
+     3949,    0,    0,    0, 3949, 3950, 3950, 3950, 3950,    0,
+        0, 3950, 3950, 3951, 3951, 3951,    0,    0,    0, 3951,
+     3952, 3952, 3952, 3952,    0,    0, 3952, 3952, 3953, 3953,
+     3953,    0,    0,    0, 3953, 3954, 3954, 3954, 3954,    0,
+        0, 3954, 3954, 3955, 3955, 3955,    0,    0,    0, 3955,
+     3956, 3956, 3956, 3956,    0,    0, 3956, 3956, 3957, 3957,
+     3957,    0,    0,    0, 3957, 3958, 3958, 3958,    0,    0,
+
+        0, 3958, 3959, 3959, 3959,    0,    0,    0, 3959, 3960,
+     3960, 3960, 3960,    0,    0, 3960, 3960, 3961, 3961, 3961,
+        0,    0,    0, 3961, 3962, 3962, 3962,    0,    0,    0,
+     3962, 3963, 3963, 3963,    0,    0,    0, 3963, 3964, 3964,
+     3964, 3964, 3964, 3964, 3964, 3964, 3964, 3965, 3965, 3965,
+     3965, 3965, 3965, 3965, 3965, 3965, 3966, 3966, 3966, 3966,
+     3966, 3966, 3966, 3966, 3966, 3967, 3967, 3967, 3967, 3967,
+     3967, 3967, 3967, 3967, 3968, 3968, 3968, 3968, 3968, 3968,
+     3968, 3968, 3968, 3969, 3969, 3969, 3969, 3969, 3969, 3969,
+     3969, 3969, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+     3457, 3457, 3457, 3457, 3457, 3457, 3457
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[569] =
+static yyconst flex_int32_t yy_rule_can_match_eol[590] =
     {   0,
 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 
     0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 
@@ -4411,29 +4523,30 @@ static yyconst flex_int32_t yy_rule_can_match_eol[569] =
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 
     1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 
     0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 
     1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
-    1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 
-    1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
+    1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
+    0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
+    1, 1, 1, 0, 0, 0, 0, 1, 1, 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, 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, 0, 0, 0, 0, 1, 1, 0, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
-    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 
+    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 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, 0, 
-    0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 
-    1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
-    0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 
-    0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 
+    1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 
+    1, 1, 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, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 
-    1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 
-    0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 
-    0, 0, 0, 1, 0, 0, 0, 1, 0,     };
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
+    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 
+    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
+    1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
+    1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 
+    0, 0, 0, 0, 1, 0, 0, 0, 1, 0,     };
 
 static yy_state_type yy_last_accepting_state;
 static char *yy_last_accepting_cpos;
@@ -4567,6 +4680,9 @@ short int surfxml_link_latency___file_isset;
 AT_surfxml_peer_availability___file AX_surfxml_peer_availability___file;
 #define A_surfxml_peer_availability___file (surfxml_bufferstack + AX_surfxml_peer_availability___file)
 short int surfxml_peer_availability___file_isset;
+AT_surfxml_model___prop_value AX_surfxml_model___prop_value;
+#define A_surfxml_model___prop_value (surfxml_bufferstack + AX_surfxml_model___prop_value)
+short int surfxml_model___prop_value_isset;
 AT_surfxml_link___ctn_direction AX_surfxml_link___ctn_direction;
 #define A_surfxml_link___ctn_direction AX_surfxml_link___ctn_direction
 short int surfxml_link___ctn_direction_isset;
@@ -4606,6 +4722,9 @@ short int surfxml_bypassASroute_dst_isset;
 AT_surfxml_host___link_id AX_surfxml_host___link_id;
 #define A_surfxml_host___link_id (surfxml_bufferstack + AX_surfxml_host___link_id)
 short int surfxml_host___link_id_isset;
+AT_surfxml_model___prop_id AX_surfxml_model___prop_id;
+#define A_surfxml_model___prop_id (surfxml_bufferstack + AX_surfxml_model___prop_id)
+short int surfxml_model___prop_id_isset;
 AT_surfxml_ASroute_src AX_surfxml_ASroute_src;
 #define A_surfxml_ASroute_src (surfxml_bufferstack + AX_surfxml_ASroute_src)
 short int surfxml_ASroute_src_isset;
@@ -4723,6 +4842,9 @@ short int surfxml_random_max_isset;
 AT_surfxml_link_id AX_surfxml_link_id;
 #define A_surfxml_link_id (surfxml_bufferstack + AX_surfxml_link_id)
 short int surfxml_link_id_isset;
+AT_surfxml_cluster_topology AX_surfxml_cluster_topology;
+#define A_surfxml_cluster_topology AX_surfxml_cluster_topology
+short int surfxml_cluster_topology_isset;
 AT_surfxml_process_host AX_surfxml_process_host;
 #define A_surfxml_process_host (surfxml_bufferstack + AX_surfxml_process_host)
 short int surfxml_process_host_isset;
@@ -4780,6 +4902,9 @@ short int surfxml_trace___connect_trace_isset;
 AT_surfxml_cluster_power AX_surfxml_cluster_power;
 #define A_surfxml_cluster_power (surfxml_bufferstack + AX_surfxml_cluster_power)
 short int surfxml_cluster_power_isset;
+AT_surfxml_cluster_topo___parameters AX_surfxml_cluster_topo___parameters;
+#define A_surfxml_cluster_topo___parameters (surfxml_bufferstack + AX_surfxml_cluster_topo___parameters)
+short int surfxml_cluster_topo___parameters_isset;
 AT_surfxml_process_function AX_surfxml_process_function;
 #define A_surfxml_process_function (surfxml_bufferstack + AX_surfxml_process_function)
 short int surfxml_process_function_isset;
@@ -5153,7 +5278,9 @@ const char* *surfxml_statenames=NULL;
 #define E_surfxml_config 125
 #define AL_surfxml_prop 126
 #define E_surfxml_prop 127
-#define IMPOSSIBLE 128
+#define AL_surfxml_model___prop 128
+#define E_surfxml_model___prop 129
+#define IMPOSSIBLE 130
 
 #ifndef YY_NO_UNISTD_H
 /* Special case for "unistd.h", since it is non-ANSI. We include it way
@@ -5510,6 +5637,8 @@ YY_DECL
   surfxml_statenames[E_surfxml_config] = "config";
   surfxml_statenames[AL_surfxml_prop] = NULL;
   surfxml_statenames[E_surfxml_prop] = "prop";
+  surfxml_statenames[AL_surfxml_model___prop] = NULL;
+  surfxml_statenames[E_surfxml_model___prop] = "model_prop";
   }
 
  /* COMMENTS and PIs: handled uniformly for efficiency. */
@@ -5565,13 +5694,13 @@ yy_match:
                        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 >= 3323 )
+                               if ( yy_current_state >= 3458 )
                                        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] != 12292 );
+               while ( yy_base[yy_current_state] != 12593 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -6310,7 +6439,7 @@ YY_RULE_SETUP
 {
   AX_surfxml_AS_id = 0;
   surfxml_AS_id_isset = 0;
-  AX_surfxml_AS_routing = A_surfxml_AS_routing_None;
+  AX_surfxml_AS_routing = AU_surfxml_AS_routing;
   surfxml_AS_routing_isset = 0;
   ENTER(AL_surfxml_AS); pushbuffer(0);
   }
@@ -6376,16 +6505,25 @@ YY_RULE_SETUP
 A_surfxml_AS_routing = A_surfxml_AS_routing_Cluster;
        YY_BREAK
 case 124:
+/* rule 124 can match eol */
+case 125:
+/* rule 125 can match eol */
+YY_RULE_SETUP
+A_surfxml_AS_routing = A_surfxml_AS_routing_Cluster___torus;
+       YY_BREAK
+case 126:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_AS_id) FAIL("Required attribute `id' not set for `AS' element.");
+  if (!AX_surfxml_AS_routing) FAIL("Required attribute `routing' not set for `AS' element.");
   LEAVE; STag_surfxml_AS();surfxml_pcdata_ix = 0; ENTER(S_surfxml_AS);
  }
        YY_BREAK
-case 125:
+case 127:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_AS_id) FAIL("Required attribute `id' not set for `AS' element.");
+  if (!AX_surfxml_AS_routing) FAIL("Required attribute `routing' not set for `AS' element.");
   LEAVE; STag_surfxml_AS(); surfxml_pcdata_ix = 0; ETag_surfxml_AS(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS_1: case S_surfxml_AS_5: case S_surfxml_AS: case S_surfxml_AS_6: case S_surfxml_AS_3: SET(S_surfxml_AS_6); break;
@@ -6394,11 +6532,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 126:
+case 128:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of AS element.", surf_parse_text[0]);
        YY_BREAK
-case 127:
+case 129:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `AS' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6406,8 +6544,8 @@ case YY_STATE_EOF(AL_surfxml_AS):
 FAIL("EOF in attribute list of `AS' element.");
        YY_BREAK
 
-case 128:
-/* rule 128 can match eol */
+case 130:
+/* rule 130 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6420,12 +6558,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 129:
-/* rule 129 can match eol */
+case 131:
+/* rule 131 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</AS>' expected.",surf_parse_text);
        YY_BREAK
-case 130:
+case 132:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</AS>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6444,13 +6582,13 @@ case YY_STATE_EOF(S_surfxml_AS_4):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</AS>' expected.");
        YY_BREAK
 
-case 131:
-/* rule 131 can match eol */
+case 133:
+/* rule 133 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <storage_type> is not allowed here.");
        YY_BREAK
-case 132:
-/* rule 132 can match eol */
+case 134:
+/* rule 134 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_storage___type_id = 0;
@@ -6467,57 +6605,57 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 133:
-/* rule 133 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage___type>");} surfxml_storage___type_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_id);
-       YY_BREAK
-case 134:
-/* rule 134 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage___type>");}  surfxml_storage___type_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_id);
-       YY_BREAK
 case 135:
 /* rule 135 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in <surfxml_storage___type>");} surfxml_storage___type_model_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_model);
+if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage___type>");} surfxml_storage___type_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_id);
        YY_BREAK
 case 136:
 /* rule 136 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in <surfxml_storage___type>");}  surfxml_storage___type_model_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_model);
+if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage___type>");}  surfxml_storage___type_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_id);
        YY_BREAK
 case 137:
 /* rule 137 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in <surfxml_storage___type>");} surfxml_storage___type_size_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_size);
+if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in <surfxml_storage___type>");} surfxml_storage___type_model_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_model);
        YY_BREAK
 case 138:
 /* rule 138 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in <surfxml_storage___type>");}  surfxml_storage___type_size_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_size);
+if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in <surfxml_storage___type>");}  surfxml_storage___type_model_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_model);
        YY_BREAK
 case 139:
 /* rule 139 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage___type>");} surfxml_storage___type_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content);
+if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in <surfxml_storage___type>");} surfxml_storage___type_size_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_size);
        YY_BREAK
 case 140:
 /* rule 140 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage___type>");}  surfxml_storage___type_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content);
+if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in <surfxml_storage___type>");}  surfxml_storage___type_size_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_size);
        YY_BREAK
 case 141:
 /* rule 141 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage___type_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage___type>");} surfxml_storage___type_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content___type);
+if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage___type>");} surfxml_storage___type_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content);
        YY_BREAK
 case 142:
 /* rule 142 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage___type_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage___type>");}  surfxml_storage___type_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content___type);
+if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage___type>");}  surfxml_storage___type_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content);
        YY_BREAK
 case 143:
+/* rule 143 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage___type_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage___type>");} surfxml_storage___type_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content___type);
+       YY_BREAK
+case 144:
+/* rule 144 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage___type_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage___type>");}  surfxml_storage___type_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content___type);
+       YY_BREAK
+case 145:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_storage___type_id) FAIL("Required attribute `id' not set for `storage_type' element.");
@@ -6526,7 +6664,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_storage___type();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage___type);
  }
        YY_BREAK
-case 144:
+case 146:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_storage___type_id) FAIL("Required attribute `id' not set for `storage_type' element.");
@@ -6539,11 +6677,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 145:
+case 147:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of storage_type element.", surf_parse_text[0]);
        YY_BREAK
-case 146:
+case 148:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `storage_type' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6551,8 +6689,8 @@ case YY_STATE_EOF(AL_surfxml_storage___type):
 FAIL("EOF in attribute list of `storage_type' element.");
        YY_BREAK
 
-case 147:
-/* rule 147 can match eol */
+case 149:
+/* rule 149 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6564,12 +6702,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 148:
-/* rule 148 can match eol */
+case 150:
+/* rule 150 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</storage_type>' expected.",surf_parse_text);
        YY_BREAK
-case 149:
+case 151:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</storage_type>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6579,13 +6717,13 @@ case YY_STATE_EOF(S_surfxml_storage___type_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</storage_type>' expected.");
        YY_BREAK
 
-case 150:
-/* rule 150 can match eol */
+case 152:
+/* rule 152 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <storage> is not allowed here.");
        YY_BREAK
-case 151:
-/* rule 151 can match eol */
+case 153:
+/* rule 153 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_storage_id = 0;
@@ -6600,47 +6738,47 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 152:
-/* rule 152 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");} surfxml_storage_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_id);
-       YY_BREAK
-case 153:
-/* rule 153 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");}  surfxml_storage_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_id);
-       YY_BREAK
 case 154:
 /* rule 154 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");} surfxml_storage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_typeId);
+if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");} surfxml_storage_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_id);
        YY_BREAK
 case 155:
 /* rule 155 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");}  surfxml_storage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_typeId);
+if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");}  surfxml_storage_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_id);
        YY_BREAK
 case 156:
 /* rule 156 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");} surfxml_storage_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content);
+if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");} surfxml_storage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_typeId);
        YY_BREAK
 case 157:
 /* rule 157 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");}  surfxml_storage_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content);
+if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");}  surfxml_storage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_typeId);
        YY_BREAK
 case 158:
 /* rule 158 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");} surfxml_storage_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content___type);
+if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");} surfxml_storage_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content);
        YY_BREAK
 case 159:
 /* rule 159 can match eol */
 YY_RULE_SETUP
-if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");}  surfxml_storage_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content___type);
+if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");}  surfxml_storage_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content);
        YY_BREAK
 case 160:
+/* rule 160 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");} surfxml_storage_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content___type);
+       YY_BREAK
+case 161:
+/* rule 161 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");}  surfxml_storage_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content___type);
+       YY_BREAK
+case 162:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element.");
@@ -6648,7 +6786,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_storage();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage);
  }
        YY_BREAK
-case 161:
+case 163:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element.");
@@ -6660,11 +6798,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 162:
+case 164:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of storage element.", surf_parse_text[0]);
        YY_BREAK
-case 163:
+case 165:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `storage' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6672,8 +6810,8 @@ case YY_STATE_EOF(AL_surfxml_storage):
 FAIL("EOF in attribute list of `storage' element.");
        YY_BREAK
 
-case 164:
-/* rule 164 can match eol */
+case 166:
+/* rule 166 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6685,12 +6823,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 165:
-/* rule 165 can match eol */
+case 167:
+/* rule 167 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</storage>' expected.",surf_parse_text);
        YY_BREAK
-case 166:
+case 168:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</storage>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6700,13 +6838,13 @@ case YY_STATE_EOF(S_surfxml_storage_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</storage>' expected.");
        YY_BREAK
 
-case 167:
-/* rule 167 can match eol */
+case 169:
+/* rule 169 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <mount> is not allowed here.");
        YY_BREAK
-case 168:
-/* rule 168 can match eol */
+case 170:
+/* rule 170 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_mount_storageId = 0;
@@ -6717,27 +6855,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 169:
-/* rule 169 can match eol */
+case 171:
+/* rule 171 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in <surfxml_mount>");} surfxml_mount_storageId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_storageId);
        YY_BREAK
-case 170:
-/* rule 170 can match eol */
+case 172:
+/* rule 172 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in <surfxml_mount>");}  surfxml_mount_storageId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_storageId);
        YY_BREAK
-case 171:
-/* rule 171 can match eol */
+case 173:
+/* rule 173 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mount>");} surfxml_mount_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_name);
        YY_BREAK
-case 172:
-/* rule 172 can match eol */
+case 174:
+/* rule 174 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mount>");}  surfxml_mount_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_name);
        YY_BREAK
-case 173:
+case 175:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_mount_storageId) FAIL("Required attribute `storageId' not set for `mount' element.");
@@ -6745,7 +6883,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_mount();surfxml_pcdata_ix = 0; ENTER(E_surfxml_mount);
  }
        YY_BREAK
-case 174:
+case 176:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_mount_storageId) FAIL("Required attribute `storageId' not set for `mount' element.");
@@ -6756,11 +6894,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 175:
+case 177:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of mount element.", surf_parse_text[0]);
        YY_BREAK
-case 176:
+case 178:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `mount' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6768,8 +6906,8 @@ case YY_STATE_EOF(AL_surfxml_mount):
 FAIL("EOF in attribute list of `mount' element.");
        YY_BREAK
 
-case 177:
-/* rule 177 can match eol */
+case 179:
+/* rule 179 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6780,12 +6918,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 178:
-/* rule 178 can match eol */
+case 180:
+/* rule 180 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</mount>' expected.",surf_parse_text);
        YY_BREAK
-case 179:
+case 181:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</mount>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6793,13 +6931,13 @@ case YY_STATE_EOF(E_surfxml_mount):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</mount>' expected.");
        YY_BREAK
 
-case 180:
-/* rule 180 can match eol */
+case 182:
+/* rule 182 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <mstorage> is not allowed here.");
        YY_BREAK
-case 181:
-/* rule 181 can match eol */
+case 183:
+/* rule 183 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_mstorage_typeId = 0;
@@ -6810,27 +6948,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 182:
-/* rule 182 can match eol */
+case 184:
+/* rule 184 can match eol */
 YY_RULE_SETUP
 if (surfxml_mstorage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_mstorage>");} surfxml_mstorage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mstorage_typeId);
        YY_BREAK
-case 183:
-/* rule 183 can match eol */
+case 185:
+/* rule 185 can match eol */
 YY_RULE_SETUP
 if (surfxml_mstorage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_mstorage>");}  surfxml_mstorage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mstorage_typeId);
        YY_BREAK
-case 184:
-/* rule 184 can match eol */
+case 186:
+/* rule 186 can match eol */
 YY_RULE_SETUP
 if (surfxml_mstorage_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mstorage>");} surfxml_mstorage_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mstorage_name);
        YY_BREAK
-case 185:
-/* rule 185 can match eol */
+case 187:
+/* rule 187 can match eol */
 YY_RULE_SETUP
 if (surfxml_mstorage_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mstorage>");}  surfxml_mstorage_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mstorage_name);
        YY_BREAK
-case 186:
+case 188:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_mstorage_typeId) FAIL("Required attribute `typeId' not set for `mstorage' element.");
@@ -6838,7 +6976,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_mstorage();surfxml_pcdata_ix = 0; ENTER(E_surfxml_mstorage);
  }
        YY_BREAK
-case 187:
+case 189:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_mstorage_typeId) FAIL("Required attribute `typeId' not set for `mstorage' element.");
@@ -6849,11 +6987,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 188:
+case 190:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of mstorage element.", surf_parse_text[0]);
        YY_BREAK
-case 189:
+case 191:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `mstorage' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6861,8 +6999,8 @@ case YY_STATE_EOF(AL_surfxml_mstorage):
 FAIL("EOF in attribute list of `mstorage' element.");
        YY_BREAK
 
-case 190:
-/* rule 190 can match eol */
+case 192:
+/* rule 192 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6873,12 +7011,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 191:
-/* rule 191 can match eol */
+case 193:
+/* rule 193 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</mstorage>' expected.",surf_parse_text);
        YY_BREAK
-case 192:
+case 194:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</mstorage>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6886,13 +7024,13 @@ case YY_STATE_EOF(E_surfxml_mstorage):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</mstorage>' expected.");
        YY_BREAK
 
-case 193:
-/* rule 193 can match eol */
+case 195:
+/* rule 195 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <host> is not allowed here.");
        YY_BREAK
-case 194:
-/* rule 194 can match eol */
+case 196:
+/* rule 196 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_host_id = 0;
@@ -6917,101 +7055,101 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 195:
-/* rule 195 can match eol */
-YY_RULE_SETUP
-if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");} surfxml_host_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id);
-       YY_BREAK
-case 196:
-/* rule 196 can match eol */
-YY_RULE_SETUP
-if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");}  surfxml_host_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id);
-       YY_BREAK
 case 197:
 /* rule 197 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_host>");} surfxml_host_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_power);
+if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");} surfxml_host_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id);
        YY_BREAK
 case 198:
 /* rule 198 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_host>");}  surfxml_host_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_power);
+if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");}  surfxml_host_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id);
        YY_BREAK
 case 199:
 /* rule 199 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");} surfxml_host_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core);
+if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_host>");} surfxml_host_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_power);
        YY_BREAK
 case 200:
 /* rule 200 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");}  surfxml_host_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core);
+if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_host>");}  surfxml_host_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_power);
        YY_BREAK
 case 201:
 /* rule 201 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in <surfxml_host>");} surfxml_host_availability_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability);
+if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");} surfxml_host_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core);
        YY_BREAK
 case 202:
 /* rule 202 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in <surfxml_host>");}  surfxml_host_availability_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability);
+if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");}  surfxml_host_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core);
        YY_BREAK
 case 203:
 /* rule 203 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");} surfxml_host_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability___file);
+if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in <surfxml_host>");} surfxml_host_availability_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability);
        YY_BREAK
 case 204:
 /* rule 204 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");}  surfxml_host_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability___file);
+if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in <surfxml_host>");}  surfxml_host_availability_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability);
        YY_BREAK
 case 205:
 /* rule 205 can match eol */
+YY_RULE_SETUP
+if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");} surfxml_host_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability___file);
+       YY_BREAK
 case 206:
 /* rule 206 can match eol */
 YY_RULE_SETUP
-A_surfxml_host_state = A_surfxml_host_state_ON;
+if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");}  surfxml_host_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability___file);
        YY_BREAK
 case 207:
 /* rule 207 can match eol */
 case 208:
 /* rule 208 can match eol */
 YY_RULE_SETUP
-A_surfxml_host_state = A_surfxml_host_state_OFF;
+A_surfxml_host_state = A_surfxml_host_state_ON;
        YY_BREAK
 case 209:
 /* rule 209 can match eol */
-YY_RULE_SETUP
-if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");} surfxml_host_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state___file);
-       YY_BREAK
 case 210:
 /* rule 210 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");}  surfxml_host_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state___file);
+A_surfxml_host_state = A_surfxml_host_state_OFF;
        YY_BREAK
 case 211:
 /* rule 211 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");} surfxml_host_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates);
+if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");} surfxml_host_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state___file);
        YY_BREAK
 case 212:
 /* rule 212 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");}  surfxml_host_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_coordinates);
+if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");}  surfxml_host_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state___file);
        YY_BREAK
 case 213:
 /* rule 213 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");} surfxml_host_pstate_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_pstate);
+if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");} surfxml_host_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates);
        YY_BREAK
 case 214:
 /* rule 214 can match eol */
 YY_RULE_SETUP
-if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");}  surfxml_host_pstate_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_pstate);
+if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");}  surfxml_host_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_coordinates);
        YY_BREAK
 case 215:
+/* rule 215 can match eol */
+YY_RULE_SETUP
+if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");} surfxml_host_pstate_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_pstate);
+       YY_BREAK
+case 216:
+/* rule 216 can match eol */
+YY_RULE_SETUP
+if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");}  surfxml_host_pstate_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_pstate);
+       YY_BREAK
+case 217:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
@@ -7019,7 +7157,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host);
  }
        YY_BREAK
-case 216:
+case 218:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
@@ -7030,11 +7168,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 217:
+case 219:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of host element.", surf_parse_text[0]);
        YY_BREAK
-case 218:
+case 220:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `host' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7042,8 +7180,8 @@ case YY_STATE_EOF(AL_surfxml_host):
 FAIL("EOF in attribute list of `host' element.");
        YY_BREAK
 
-case 219:
-/* rule 219 can match eol */
+case 221:
+/* rule 221 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7054,12 +7192,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 220:
-/* rule 220 can match eol */
+case 222:
+/* rule 222 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</host>' expected.",surf_parse_text);
        YY_BREAK
-case 221:
+case 223:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</host>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7069,13 +7207,13 @@ case YY_STATE_EOF(S_surfxml_host_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</host>' expected.");
        YY_BREAK
 
-case 222:
-/* rule 222 can match eol */
+case 224:
+/* rule 224 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <gpu> is not allowed here.");
        YY_BREAK
-case 223:
-/* rule 223 can match eol */
+case 225:
+/* rule 225 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_gpu_name = 0;
@@ -7084,24 +7222,24 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 224:
-/* rule 224 can match eol */
+case 226:
+/* rule 226 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);
        YY_BREAK
-case 225:
-/* rule 225 can match eol */
+case 227:
+/* rule 227 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);
        YY_BREAK
-case 226:
+case 228:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_gpu_name) FAIL("Required attribute `name' not set for `gpu' element.");
   LEAVE; STag_surfxml_gpu();surfxml_pcdata_ix = 0; ENTER(E_surfxml_gpu);
  }
        YY_BREAK
-case 227:
+case 229:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_gpu_name) FAIL("Required attribute `name' not set for `gpu' element.");
@@ -7111,11 +7249,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 228:
+case 230:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of gpu element.", surf_parse_text[0]);
        YY_BREAK
-case 229:
+case 231:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `gpu' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7123,8 +7261,8 @@ case YY_STATE_EOF(AL_surfxml_gpu):
 FAIL("EOF in attribute list of `gpu' element.");
        YY_BREAK
 
-case 230:
-/* rule 230 can match eol */
+case 232:
+/* rule 232 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7135,12 +7273,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 231:
-/* rule 231 can match eol */
+case 233:
+/* rule 233 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</gpu>' expected.",surf_parse_text);
        YY_BREAK
-case 232:
+case 234:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</gpu>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7148,13 +7286,13 @@ case YY_STATE_EOF(E_surfxml_gpu):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</gpu>' expected.");
        YY_BREAK
 
-case 233:
-/* rule 233 can match eol */
+case 235:
+/* rule 235 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <host_link> is not allowed here.");
        YY_BREAK
-case 234:
-/* rule 234 can match eol */
+case 236:
+/* rule 236 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_host___link_id = 0;
@@ -7167,37 +7305,37 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 235:
-/* rule 235 can match eol */
+case 237:
+/* rule 237 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host___link>");} surfxml_host___link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_id);
        YY_BREAK
-case 236:
-/* rule 236 can match eol */
+case 238:
+/* rule 238 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host___link>");}  surfxml_host___link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_id);
        YY_BREAK
-case 237:
-/* rule 237 can match eol */
+case 239:
+/* rule 239 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in <surfxml_host___link>");} surfxml_host___link_up_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_up);
        YY_BREAK
-case 238:
-/* rule 238 can match eol */
+case 240:
+/* rule 240 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in <surfxml_host___link>");}  surfxml_host___link_up_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_up);
        YY_BREAK
-case 239:
-/* rule 239 can match eol */
+case 241:
+/* rule 241 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in <surfxml_host___link>");} surfxml_host___link_down_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_down);
        YY_BREAK
-case 240:
-/* rule 240 can match eol */
+case 242:
+/* rule 242 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in <surfxml_host___link>");}  surfxml_host___link_down_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_down);
        YY_BREAK
-case 241:
+case 243:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host___link_id) FAIL("Required attribute `id' not set for `host_link' element.");
@@ -7206,7 +7344,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host___link();surfxml_pcdata_ix = 0; ENTER(E_surfxml_host___link);
  }
        YY_BREAK
-case 242:
+case 244:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host___link_id) FAIL("Required attribute `id' not set for `host_link' element.");
@@ -7218,11 +7356,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 243:
+case 245:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of host_link element.", surf_parse_text[0]);
        YY_BREAK
-case 244:
+case 246:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `host_link' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7230,8 +7368,8 @@ case YY_STATE_EOF(AL_surfxml_host___link):
 FAIL("EOF in attribute list of `host_link' element.");
        YY_BREAK
 
-case 245:
-/* rule 245 can match eol */
+case 247:
+/* rule 247 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7242,12 +7380,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 246:
-/* rule 246 can match eol */
+case 248:
+/* rule 248 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</host_link>' expected.",surf_parse_text);
        YY_BREAK
-case 247:
+case 249:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</host_link>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7255,13 +7393,13 @@ case YY_STATE_EOF(E_surfxml_host___link):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</host_link>' expected.");
        YY_BREAK
 
-case 248:
-/* rule 248 can match eol */
+case 250:
+/* rule 250 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <cluster> is not allowed here.");
        YY_BREAK
-case 249:
-/* rule 249 can match eol */
+case 251:
+/* rule 251 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_cluster_id = 0;
@@ -7282,6 +7420,10 @@ YY_RULE_SETUP
   surfxml_cluster_lat_isset = 0;
   AX_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX;
   surfxml_cluster_sharing___policy_isset = 0;
+  AX_surfxml_cluster_topology = A_surfxml_cluster_topology_FLAT;
+  surfxml_cluster_topology_isset = 0;
+  AX_surfxml_cluster_topo___parameters = 0;
+  surfxml_cluster_topo___parameters_isset = 0;
   AX_surfxml_cluster_bb___bw = 0;
   surfxml_cluster_bb___bw_isset = 0;
   AX_surfxml_cluster_bb___lat = 0;
@@ -7304,202 +7446,226 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 250:
-/* rule 250 can match eol */
-YY_RULE_SETUP
-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);
-       YY_BREAK
-case 251:
-/* rule 251 can match eol */
-YY_RULE_SETUP
-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);
-       YY_BREAK
 case 252:
 /* rule 252 can match eol */
 YY_RULE_SETUP
-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);
+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);
        YY_BREAK
 case 253:
 /* rule 253 can match eol */
 YY_RULE_SETUP
-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);
+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);
        YY_BREAK
 case 254:
 /* rule 254 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(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix);
+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);
        YY_BREAK
 case 255:
 /* rule 255 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);
+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);
        YY_BREAK
 case 256:
 /* rule 256 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);
+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);
        YY_BREAK
 case 257:
 /* rule 257 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);
+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);
        YY_BREAK
 case 258:
 /* rule 258 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);
+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);
        YY_BREAK
 case 259:
 /* rule 259 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);
+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);
        YY_BREAK
 case 260:
 /* rule 260 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);
+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);
        YY_BREAK
 case 261:
 /* rule 261 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(VALUE2); BUFFERSET(AX_surfxml_cluster_core);
+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);
        YY_BREAK
 case 262:
 /* rule 262 can match eol */
 YY_RULE_SETUP
-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);
+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);
        YY_BREAK
 case 263:
 /* rule 263 can match eol */
 YY_RULE_SETUP
-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);
+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);
        YY_BREAK
 case 264:
 /* rule 264 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(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
+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);
        YY_BREAK
 case 265:
 /* rule 265 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);
+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);
        YY_BREAK
 case 266:
 /* rule 266 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(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
+       YY_BREAK
 case 267:
 /* rule 267 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED;
+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);
        YY_BREAK
 case 268:
 /* rule 268 can match eol */
 case 269:
 /* rule 269 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX;
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED;
        YY_BREAK
 case 270:
 /* rule 270 can match eol */
 case 271:
 /* rule 271 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE;
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX;
        YY_BREAK
 case 272:
 /* rule 272 can match eol */
-YY_RULE_SETUP
-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);
-       YY_BREAK
 case 273:
 /* rule 273 can match eol */
 YY_RULE_SETUP
-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);
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE;
        YY_BREAK
 case 274:
 /* rule 274 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(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat);
-       YY_BREAK
 case 275:
 /* rule 275 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);
+A_surfxml_cluster_topology = A_surfxml_cluster_topology_FLAT;
        YY_BREAK
 case 276:
 /* rule 276 can match eol */
 case 277:
 /* rule 277 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED;
+A_surfxml_cluster_topology = A_surfxml_cluster_topology_TORUS;
        YY_BREAK
 case 278:
 /* rule 278 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_topo___parameters);
+       YY_BREAK
 case 279:
 /* rule 279 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE;
+if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");}  surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_topo___parameters);
        YY_BREAK
 case 280:
 /* rule 280 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);
+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);
        YY_BREAK
 case 281:
 /* rule 281 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);
+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);
        YY_BREAK
 case 282:
 /* rule 282 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);
+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);
        YY_BREAK
 case 283:
 /* rule 283 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);
+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);
        YY_BREAK
 case 284:
 /* rule 284 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);
-       YY_BREAK
 case 285:
 /* rule 285 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);
+A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED;
        YY_BREAK
 case 286:
 /* rule 286 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link);
-       YY_BREAK
 case 287:
 /* rule 287 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");}  surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link);
+A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE;
        YY_BREAK
 case 288:
 /* rule 288 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw);
+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);
        YY_BREAK
 case 289:
 /* rule 289 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");}  surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw);
+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);
        YY_BREAK
 case 290:
 /* rule 290 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat);
+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);
        YY_BREAK
 case 291:
 /* rule 291 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");}  surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___lat);
+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);
        YY_BREAK
 case 292:
+/* rule 292 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);
+       YY_BREAK
+case 293:
+/* rule 293 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);
+       YY_BREAK
+case 294:
+/* rule 294 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link);
+       YY_BREAK
+case 295:
+/* rule 295 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");}  surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link);
+       YY_BREAK
+case 296:
+/* rule 296 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw);
+       YY_BREAK
+case 297:
+/* rule 297 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");}  surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw);
+       YY_BREAK
+case 298:
+/* rule 298 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat);
+       YY_BREAK
+case 299:
+/* rule 299 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");}  surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___lat);
+       YY_BREAK
+case 300:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element.");
@@ -7512,7 +7678,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(S_surfxml_cluster);
  }
        YY_BREAK
-case 293:
+case 301:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element.");
@@ -7530,11 +7696,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 294:
+case 302:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of cluster element.", surf_parse_text[0]);
        YY_BREAK
-case 295:
+case 303:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `cluster' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7542,8 +7708,8 @@ case YY_STATE_EOF(AL_surfxml_cluster):
 FAIL("EOF in attribute list of `cluster' element.");
        YY_BREAK
 
-case 296:
-/* rule 296 can match eol */
+case 304:
+/* rule 304 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7556,12 +7722,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 297:
-/* rule 297 can match eol */
+case 305:
+/* rule 305 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</cluster>' expected.",surf_parse_text);
        YY_BREAK
-case 298:
+case 306:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</cluster>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7571,13 +7737,13 @@ case YY_STATE_EOF(E_surfxml_cluster):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</cluster>' expected.");
        YY_BREAK
 
-case 299:
-/* rule 299 can match eol */
+case 307:
+/* rule 307 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <cabinet> is not allowed here.");
        YY_BREAK
-case 300:
-/* rule 300 can match eol */
+case 308:
+/* rule 308 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_cabinet_id = 0;
@@ -7598,77 +7764,77 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 301:
-/* rule 301 can match eol */
+case 309:
+/* rule 309 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");} surfxml_cabinet_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_id);
        YY_BREAK
-case 302:
-/* rule 302 can match eol */
+case 310:
+/* rule 310 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");}  surfxml_cabinet_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_id);
        YY_BREAK
-case 303:
-/* rule 303 can match eol */
+case 311:
+/* rule 311 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_prefix);
        YY_BREAK
-case 304:
-/* rule 304 can match eol */
+case 312:
+/* rule 312 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");}  surfxml_cabinet_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_prefix);
        YY_BREAK
-case 305:
-/* rule 305 can match eol */
+case 313:
+/* rule 313 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_suffix);
        YY_BREAK
-case 306:
-/* rule 306 can match eol */
+case 314:
+/* rule 314 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");}  surfxml_cabinet_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_suffix);
        YY_BREAK
-case 307:
-/* rule 307 can match eol */
+case 315:
+/* rule 315 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_radical);
        YY_BREAK
-case 308:
-/* rule 308 can match eol */
+case 316:
+/* rule 316 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");}  surfxml_cabinet_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_radical);
        YY_BREAK
-case 309:
-/* rule 309 can match eol */
+case 317:
+/* rule 317 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cabinet>");} surfxml_cabinet_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_power);
        YY_BREAK
-case 310:
-/* rule 310 can match eol */
+case 318:
+/* rule 318 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cabinet>");}  surfxml_cabinet_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_power);
        YY_BREAK
-case 311:
-/* rule 311 can match eol */
+case 319:
+/* rule 319 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_bw);
        YY_BREAK
-case 312:
-/* rule 312 can match eol */
+case 320:
+/* rule 320 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");}  surfxml_cabinet_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_bw);
        YY_BREAK
-case 313:
-/* rule 313 can match eol */
+case 321:
+/* rule 321 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_lat);
        YY_BREAK
-case 314:
-/* rule 314 can match eol */
+case 322:
+/* rule 322 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");}  surfxml_cabinet_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_lat);
        YY_BREAK
-case 315:
+case 323:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cabinet_id) FAIL("Required attribute `id' not set for `cabinet' element.");
@@ -7681,7 +7847,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_cabinet();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cabinet);
  }
        YY_BREAK
-case 316:
+case 324:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cabinet_id) FAIL("Required attribute `id' not set for `cabinet' element.");
@@ -7700,11 +7866,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 317:
+case 325:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of cabinet element.", surf_parse_text[0]);
        YY_BREAK
-case 318:
+case 326:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `cabinet' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7712,8 +7878,8 @@ case YY_STATE_EOF(AL_surfxml_cabinet):
 FAIL("EOF in attribute list of `cabinet' element.");
        YY_BREAK
 
-case 319:
-/* rule 319 can match eol */
+case 327:
+/* rule 327 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7727,12 +7893,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 320:
-/* rule 320 can match eol */
+case 328:
+/* rule 328 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</cabinet>' expected.",surf_parse_text);
        YY_BREAK
-case 321:
+case 329:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</cabinet>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7740,13 +7906,13 @@ case YY_STATE_EOF(E_surfxml_cabinet):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</cabinet>' expected.");
        YY_BREAK
 
-case 322:
-/* rule 322 can match eol */
+case 330:
+/* rule 330 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <peer> is not allowed here.");
        YY_BREAK
-case 323:
-/* rule 323 can match eol */
+case 331:
+/* rule 331 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_peer_id = 0;
@@ -7769,87 +7935,87 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 324:
-/* rule 324 can match eol */
+case 332:
+/* rule 332 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");} surfxml_peer_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id);
        YY_BREAK
-case 325:
-/* rule 325 can match eol */
+case 333:
+/* rule 333 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");}  surfxml_peer_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id);
        YY_BREAK
-case 326:
-/* rule 326 can match eol */
+case 334:
+/* rule 334 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_peer>");} surfxml_peer_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_power);
        YY_BREAK
-case 327:
-/* rule 327 can match eol */
+case 335:
+/* rule 335 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_peer>");}  surfxml_peer_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_power);
        YY_BREAK
-case 328:
-/* rule 328 can match eol */
+case 336:
+/* rule 336 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___in);
        YY_BREAK
-case 329:
-/* rule 329 can match eol */
+case 337:
+/* rule 337 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");}  surfxml_peer_bw___in_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___in);
        YY_BREAK
-case 330:
-/* rule 330 can match eol */
+case 338:
+/* rule 338 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___out);
        YY_BREAK
-case 331:
-/* rule 331 can match eol */
+case 339:
+/* rule 339 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");}  surfxml_peer_bw___out_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___out);
        YY_BREAK
-case 332:
-/* rule 332 can match eol */
+case 340:
+/* rule 340 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");} surfxml_peer_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat);
        YY_BREAK
-case 333:
-/* rule 333 can match eol */
+case 341:
+/* rule 341 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");}  surfxml_peer_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat);
        YY_BREAK
-case 334:
-/* rule 334 can match eol */
+case 342:
+/* rule 342 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates);
        YY_BREAK
-case 335:
-/* rule 335 can match eol */
+case 343:
+/* rule 343 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");}  surfxml_peer_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates);
        YY_BREAK
-case 336:
-/* rule 336 can match eol */
+case 344:
+/* rule 344 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability___file);
        YY_BREAK
-case 337:
-/* rule 337 can match eol */
+case 345:
+/* rule 345 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");}  surfxml_peer_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability___file);
        YY_BREAK
-case 338:
-/* rule 338 can match eol */
+case 346:
+/* rule 346 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");} surfxml_peer_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state___file);
        YY_BREAK
-case 339:
-/* rule 339 can match eol */
+case 347:
+/* rule 347 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");}  surfxml_peer_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_state___file);
        YY_BREAK
-case 340:
+case 348:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element.");
@@ -7860,7 +8026,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_peer();surfxml_pcdata_ix = 0; ENTER(E_surfxml_peer);
  }
        YY_BREAK
-case 341:
+case 349:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element.");
@@ -7876,11 +8042,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 342:
+case 350:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of peer element.", surf_parse_text[0]);
        YY_BREAK
-case 343:
+case 351:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `peer' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7888,8 +8054,8 @@ case YY_STATE_EOF(AL_surfxml_peer):
 FAIL("EOF in attribute list of `peer' element.");
        YY_BREAK
 
-case 344:
-/* rule 344 can match eol */
+case 352:
+/* rule 352 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7902,12 +8068,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 345:
-/* rule 345 can match eol */
+case 353:
+/* rule 353 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</peer>' expected.",surf_parse_text);
        YY_BREAK
-case 346:
+case 354:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</peer>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7915,13 +8081,13 @@ case YY_STATE_EOF(E_surfxml_peer):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</peer>' expected.");
        YY_BREAK
 
-case 347:
-/* rule 347 can match eol */
+case 355:
+/* rule 355 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <router> is not allowed here.");
        YY_BREAK
-case 348:
-/* rule 348 can match eol */
+case 356:
+/* rule 356 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_router_id = 0;
@@ -7932,34 +8098,34 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 349:
-/* rule 349 can match eol */
+case 357:
+/* rule 357 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_router>");} surfxml_router_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_id);
        YY_BREAK
-case 350:
-/* rule 350 can match eol */
+case 358:
+/* rule 358 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_router>");}  surfxml_router_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_id);
        YY_BREAK
-case 351:
-/* rule 351 can match eol */
+case 359:
+/* rule 359 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_router>");} surfxml_router_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_coordinates);
        YY_BREAK
-case 352:
-/* rule 352 can match eol */
+case 360:
+/* rule 360 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_router>");}  surfxml_router_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_coordinates);
        YY_BREAK
-case 353:
+case 361:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element.");
   LEAVE; STag_surfxml_router();surfxml_pcdata_ix = 0; ENTER(E_surfxml_router);
  }
        YY_BREAK
-case 354:
+case 362:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element.");
@@ -7969,11 +8135,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 355:
+case 363:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of router element.", surf_parse_text[0]);
        YY_BREAK
-case 356:
+case 364:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `router' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7981,8 +8147,8 @@ case YY_STATE_EOF(AL_surfxml_router):
 FAIL("EOF in attribute list of `router' element.");
        YY_BREAK
 
-case 357:
-/* rule 357 can match eol */
+case 365:
+/* rule 365 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7993,12 +8159,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 358:
-/* rule 358 can match eol */
+case 366:
+/* rule 366 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</router>' expected.",surf_parse_text);
        YY_BREAK
-case 359:
+case 367:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</router>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8006,13 +8172,13 @@ case YY_STATE_EOF(E_surfxml_router):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</router>' expected.");
        YY_BREAK
 
-case 360:
-/* rule 360 can match eol */
+case 368:
+/* rule 368 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <backbone> is not allowed here.");
        YY_BREAK
-case 361:
-/* rule 361 can match eol */
+case 369:
+/* rule 369 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_backbone_id = 0;
@@ -8025,37 +8191,37 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 362:
-/* rule 362 can match eol */
+case 370:
+/* rule 370 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_backbone>");} surfxml_backbone_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_id);
        YY_BREAK
-case 363:
-/* rule 363 can match eol */
+case 371:
+/* rule 371 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_backbone>");}  surfxml_backbone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_id);
        YY_BREAK
-case 364:
-/* rule 364 can match eol */
+case 372:
+/* rule 372 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_backbone>");} surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_bandwidth);
        YY_BREAK
-case 365:
-/* rule 365 can match eol */
+case 373:
+/* rule 373 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_backbone>");}  surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_bandwidth);
        YY_BREAK
-case 366:
-/* rule 366 can match eol */
+case 374:
+/* rule 374 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_backbone>");} surfxml_backbone_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_latency);
        YY_BREAK
-case 367:
-/* rule 367 can match eol */
+case 375:
+/* rule 375 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_backbone>");}  surfxml_backbone_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_latency);
        YY_BREAK
-case 368:
+case 376:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_backbone_id) FAIL("Required attribute `id' not set for `backbone' element.");
@@ -8064,7 +8230,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_backbone();surfxml_pcdata_ix = 0; ENTER(E_surfxml_backbone);
  }
        YY_BREAK
-case 369:
+case 377:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_backbone_id) FAIL("Required attribute `id' not set for `backbone' element.");
@@ -8077,11 +8243,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 370:
+case 378:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of backbone element.", surf_parse_text[0]);
        YY_BREAK
-case 371:
+case 379:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `backbone' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8089,8 +8255,8 @@ case YY_STATE_EOF(AL_surfxml_backbone):
 FAIL("EOF in attribute list of `backbone' element.");
        YY_BREAK
 
-case 372:
-/* rule 372 can match eol */
+case 380:
+/* rule 380 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8102,12 +8268,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 373:
-/* rule 373 can match eol */
+case 381:
+/* rule 381 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</backbone>' expected.",surf_parse_text);
        YY_BREAK
-case 374:
+case 382:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</backbone>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8115,13 +8281,13 @@ case YY_STATE_EOF(E_surfxml_backbone):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</backbone>' expected.");
        YY_BREAK
 
-case 375:
-/* rule 375 can match eol */
+case 383:
+/* rule 383 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <link> is not allowed here.");
        YY_BREAK
-case 376:
-/* rule 376 can match eol */
+case 384:
+/* rule 384 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_link_id = 0;
@@ -8144,102 +8310,102 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 377:
-/* rule 377 can match eol */
+case 385:
+/* rule 385 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");} surfxml_link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id);
        YY_BREAK
-case 378:
-/* rule 378 can match eol */
+case 386:
+/* rule 386 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");}  surfxml_link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id);
        YY_BREAK
-case 379:
-/* rule 379 can match eol */
+case 387:
+/* rule 387 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth);
        YY_BREAK
-case 380:
-/* rule 380 can match eol */
+case 388:
+/* rule 388 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");}  surfxml_link_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth);
        YY_BREAK
-case 381:
-/* rule 381 can match eol */
+case 389:
+/* rule 389 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth___file);
        YY_BREAK
-case 382:
-/* rule 382 can match eol */
+case 390:
+/* rule 390 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");}  surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth___file);
        YY_BREAK
-case 383:
-/* rule 383 can match eol */
+case 391:
+/* rule 391 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");} surfxml_link_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency);
        YY_BREAK
-case 384:
-/* rule 384 can match eol */
+case 392:
+/* rule 392 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");}  surfxml_link_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency);
        YY_BREAK
-case 385:
-/* rule 385 can match eol */
+case 393:
+/* rule 393 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");} surfxml_link_latency___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency___file);
        YY_BREAK
-case 386:
-/* rule 386 can match eol */
+case 394:
+/* rule 394 can match eol */
 YY_RULE_SETUP
 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);
        YY_BREAK
-case 387:
-/* rule 387 can match eol */
-case 388:
-/* rule 388 can match eol */
+case 395:
+/* rule 395 can match eol */
+case 396:
+/* rule 396 can match eol */
 YY_RULE_SETUP
 A_surfxml_link_state = A_surfxml_link_state_ON;
        YY_BREAK
-case 389:
-/* rule 389 can match eol */
-case 390:
-/* rule 390 can match eol */
+case 397:
+/* rule 397 can match eol */
+case 398:
+/* rule 398 can match eol */
 YY_RULE_SETUP
 A_surfxml_link_state = A_surfxml_link_state_OFF;
        YY_BREAK
-case 391:
-/* rule 391 can match eol */
+case 399:
+/* rule 399 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");} surfxml_link_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state___file);
        YY_BREAK
-case 392:
-/* rule 392 can match eol */
+case 400:
+/* rule 400 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");}  surfxml_link_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state___file);
        YY_BREAK
-case 393:
-/* rule 393 can match eol */
-case 394:
-/* rule 394 can match eol */
+case 401:
+/* rule 401 can match eol */
+case 402:
+/* rule 402 can match eol */
 YY_RULE_SETUP
 A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED;
        YY_BREAK
-case 395:
-/* rule 395 can match eol */
-case 396:
-/* rule 396 can match eol */
+case 403:
+/* rule 403 can match eol */
+case 404:
+/* rule 404 can match eol */
 YY_RULE_SETUP
 A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE;
        YY_BREAK
-case 397:
-/* rule 397 can match eol */
-case 398:
-/* rule 398 can match eol */
+case 405:
+/* rule 405 can match eol */
+case 406:
+/* rule 406 can match eol */
 YY_RULE_SETUP
 A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX;
        YY_BREAK
-case 399:
+case 407:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element.");
@@ -8247,7 +8413,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link);
  }
        YY_BREAK
-case 400:
+case 408:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element.");
@@ -8259,11 +8425,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 401:
+case 409:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of link element.", surf_parse_text[0]);
        YY_BREAK
-case 402:
+case 410:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `link' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8271,8 +8437,8 @@ case YY_STATE_EOF(AL_surfxml_link):
 FAIL("EOF in attribute list of `link' element.");
        YY_BREAK
 
-case 403:
-/* rule 403 can match eol */
+case 411:
+/* rule 411 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8284,12 +8450,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 404:
-/* rule 404 can match eol */
+case 412:
+/* rule 412 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</link>' expected.",surf_parse_text);
        YY_BREAK
-case 405:
+case 413:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</link>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8299,13 +8465,13 @@ case YY_STATE_EOF(S_surfxml_link):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</link>' expected.");
        YY_BREAK
 
-case 406:
-/* rule 406 can match eol */
+case 414:
+/* rule 414 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <route> is not allowed here.");
        YY_BREAK
-case 407:
-/* rule 407 can match eol */
+case 415:
+/* rule 415 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_route_src = 0;
@@ -8318,41 +8484,41 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 408:
-/* rule 408 can match eol */
+case 416:
+/* rule 416 can match eol */
 YY_RULE_SETUP
 if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");} surfxml_route_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src);
        YY_BREAK
-case 409:
-/* rule 409 can match eol */
+case 417:
+/* rule 417 can match eol */
 YY_RULE_SETUP
 if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");}  surfxml_route_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src);
        YY_BREAK
-case 410:
-/* rule 410 can match eol */
+case 418:
+/* rule 418 can match eol */
 YY_RULE_SETUP
 if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");} surfxml_route_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst);
        YY_BREAK
-case 411:
-/* rule 411 can match eol */
+case 419:
+/* rule 419 can match eol */
 YY_RULE_SETUP
 if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");}  surfxml_route_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst);
        YY_BREAK
-case 412:
-/* rule 412 can match eol */
-case 413:
-/* rule 413 can match eol */
+case 420:
+/* rule 420 can match eol */
+case 421:
+/* rule 421 can match eol */
 YY_RULE_SETUP
 A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES;
        YY_BREAK
-case 414:
-/* rule 414 can match eol */
-case 415:
-/* rule 415 can match eol */
+case 422:
+/* rule 422 can match eol */
+case 423:
+/* rule 423 can match eol */
 YY_RULE_SETUP
 A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO;
        YY_BREAK
-case 416:
+case 424:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
@@ -8360,7 +8526,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route);
  }
        YY_BREAK
-case 417:
+case 425:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
@@ -8371,11 +8537,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 418:
+case 426:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of route element.", surf_parse_text[0]);
        YY_BREAK
-case 419:
+case 427:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `route' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8383,8 +8549,8 @@ case YY_STATE_EOF(AL_surfxml_route):
 FAIL("EOF in attribute list of `route' element.");
        YY_BREAK
 
-case 420:
-/* rule 420 can match eol */
+case 428:
+/* rule 428 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8395,12 +8561,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 421:
-/* rule 421 can match eol */
+case 429:
+/* rule 429 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</route>' expected.",surf_parse_text);
        YY_BREAK
-case 422:
+case 430:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</route>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8410,13 +8576,13 @@ case YY_STATE_EOF(E_surfxml_route):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</route>' expected.");
        YY_BREAK
 
-case 423:
-/* rule 423 can match eol */
+case 431:
+/* rule 431 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <ASroute> is not allowed here.");
        YY_BREAK
-case 424:
-/* rule 424 can match eol */
+case 432:
+/* rule 432 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_ASroute_src = 0;
@@ -8433,61 +8599,61 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 425:
-/* rule 425 can match eol */
+case 433:
+/* rule 433 can match eol */
 YY_RULE_SETUP
 if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_ASroute>");} surfxml_ASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_src);
        YY_BREAK
-case 426:
-/* rule 426 can match eol */
+case 434:
+/* rule 434 can match eol */
 YY_RULE_SETUP
 if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_ASroute>");}  surfxml_ASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_src);
        YY_BREAK
-case 427:
-/* rule 427 can match eol */
+case 435:
+/* rule 435 can match eol */
 YY_RULE_SETUP
 if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_ASroute>");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_dst);
        YY_BREAK
-case 428:
-/* rule 428 can match eol */
+case 436:
+/* rule 436 can match eol */
 YY_RULE_SETUP
 if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_ASroute>");}  surfxml_ASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_dst);
        YY_BREAK
-case 429:
-/* rule 429 can match eol */
+case 437:
+/* rule 437 can match eol */
 YY_RULE_SETUP
 if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_ASroute>");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___src);
        YY_BREAK
-case 430:
-/* rule 430 can match eol */
+case 438:
+/* rule 438 can match eol */
 YY_RULE_SETUP
 if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_ASroute>");}  surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___src);
        YY_BREAK
-case 431:
-/* rule 431 can match eol */
+case 439:
+/* rule 439 can match eol */
 YY_RULE_SETUP
 if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_ASroute>");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___dst);
        YY_BREAK
-case 432:
-/* rule 432 can match eol */
+case 440:
+/* rule 440 can match eol */
 YY_RULE_SETUP
 if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_ASroute>");}  surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___dst);
        YY_BREAK
-case 433:
-/* rule 433 can match eol */
-case 434:
-/* rule 434 can match eol */
+case 441:
+/* rule 441 can match eol */
+case 442:
+/* rule 442 can match eol */
 YY_RULE_SETUP
 A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES;
        YY_BREAK
-case 435:
-/* rule 435 can match eol */
-case 436:
-/* rule 436 can match eol */
+case 443:
+/* rule 443 can match eol */
+case 444:
+/* rule 444 can match eol */
 YY_RULE_SETUP
 A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_NO;
        YY_BREAK
-case 437:
+case 445:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element.");
@@ -8497,7 +8663,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_ASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_ASroute);
  }
        YY_BREAK
-case 438:
+case 446:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element.");
@@ -8510,11 +8676,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 439:
+case 447:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of ASroute element.", surf_parse_text[0]);
        YY_BREAK
-case 440:
+case 448:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `ASroute' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8522,8 +8688,8 @@ case YY_STATE_EOF(AL_surfxml_ASroute):
 FAIL("EOF in attribute list of `ASroute' element.");
        YY_BREAK
 
-case 441:
-/* rule 441 can match eol */
+case 449:
+/* rule 449 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8534,12 +8700,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 442:
-/* rule 442 can match eol */
+case 450:
+/* rule 450 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</ASroute>' expected.",surf_parse_text);
        YY_BREAK
-case 443:
+case 451:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</ASroute>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8549,13 +8715,13 @@ case YY_STATE_EOF(S_surfxml_ASroute_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</ASroute>' expected.");
        YY_BREAK
 
-case 444:
-/* rule 444 can match eol */
+case 452:
+/* rule 452 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <link_ctn> is not allowed here.");
        YY_BREAK
-case 445:
-/* rule 445 can match eol */
+case 453:
+/* rule 453 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_link___ctn_id = 0;
@@ -8566,45 +8732,45 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 446:
-/* rule 446 can match eol */
+case 454:
+/* rule 454 can match eol */
 YY_RULE_SETUP
 if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link___ctn>");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link___ctn_id);
        YY_BREAK
-case 447:
-/* rule 447 can match eol */
+case 455:
+/* rule 455 can match eol */
 YY_RULE_SETUP
 if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link___ctn>");}  surfxml_link___ctn_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link___ctn_id);
        YY_BREAK
-case 448:
-/* rule 448 can match eol */
-case 449:
-/* rule 449 can match eol */
+case 456:
+/* rule 456 can match eol */
+case 457:
+/* rule 457 can match eol */
 YY_RULE_SETUP
 A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP;
        YY_BREAK
-case 450:
-/* rule 450 can match eol */
-case 451:
-/* rule 451 can match eol */
+case 458:
+/* rule 458 can match eol */
+case 459:
+/* rule 459 can match eol */
 YY_RULE_SETUP
 A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN;
        YY_BREAK
-case 452:
-/* rule 452 can match eol */
-case 453:
-/* rule 453 can match eol */
+case 460:
+/* rule 460 can match eol */
+case 461:
+/* rule 461 can match eol */
 YY_RULE_SETUP
 A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE;
        YY_BREAK
-case 454:
+case 462:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element.");
   LEAVE; STag_surfxml_link___ctn();surfxml_pcdata_ix = 0; ENTER(E_surfxml_link___ctn);
  }
        YY_BREAK
-case 455:
+case 463:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element.");
@@ -8617,11 +8783,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 456:
+case 464:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of link_ctn element.", surf_parse_text[0]);
        YY_BREAK
-case 457:
+case 465:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `link_ctn' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8629,8 +8795,8 @@ case YY_STATE_EOF(AL_surfxml_link___ctn):
 FAIL("EOF in attribute list of `link_ctn' element.");
        YY_BREAK
 
-case 458:
-/* rule 458 can match eol */
+case 466:
+/* rule 466 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8644,12 +8810,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 459:
-/* rule 459 can match eol */
+case 467:
+/* rule 467 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</link_ctn>' expected.",surf_parse_text);
        YY_BREAK
-case 460:
+case 468:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</link_ctn>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8657,13 +8823,13 @@ case YY_STATE_EOF(E_surfxml_link___ctn):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</link_ctn>' expected.");
        YY_BREAK
 
-case 461:
-/* rule 461 can match eol */
+case 469:
+/* rule 469 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <bypassRoute> is not allowed here.");
        YY_BREAK
-case 462:
-/* rule 462 can match eol */
+case 470:
+/* rule 470 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_bypassRoute_src = 0;
@@ -8674,27 +8840,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 463:
-/* rule 463 can match eol */
+case 471:
+/* rule 471 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassRoute>");} surfxml_bypassRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_src);
        YY_BREAK
-case 464:
-/* rule 464 can match eol */
+case 472:
+/* rule 472 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassRoute>");}  surfxml_bypassRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_src);
        YY_BREAK
-case 465:
-/* rule 465 can match eol */
+case 473:
+/* rule 473 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassRoute>");} surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_dst);
        YY_BREAK
-case 466:
-/* rule 466 can match eol */
+case 474:
+/* rule 474 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassRoute>");}  surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_dst);
        YY_BREAK
-case 467:
+case 475:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element.");
@@ -8702,7 +8868,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassRoute);
  }
        YY_BREAK
-case 468:
+case 476:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element.");
@@ -8713,11 +8879,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 469:
+case 477:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of bypassRoute element.", surf_parse_text[0]);
        YY_BREAK
-case 470:
+case 478:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `bypassRoute' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8725,8 +8891,8 @@ case YY_STATE_EOF(AL_surfxml_bypassRoute):
 FAIL("EOF in attribute list of `bypassRoute' element.");
        YY_BREAK
 
-case 471:
-/* rule 471 can match eol */
+case 479:
+/* rule 479 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8737,12 +8903,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 472:
-/* rule 472 can match eol */
+case 480:
+/* rule 480 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</bypassRoute>' expected.",surf_parse_text);
        YY_BREAK
-case 473:
+case 481:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</bypassRoute>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8752,13 +8918,13 @@ case YY_STATE_EOF(E_surfxml_bypassRoute):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</bypassRoute>' expected.");
        YY_BREAK
 
-case 474:
-/* rule 474 can match eol */
+case 482:
+/* rule 482 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <bypassASroute> is not allowed here.");
        YY_BREAK
-case 475:
-/* rule 475 can match eol */
+case 483:
+/* rule 483 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_bypassASroute_src = 0;
@@ -8773,47 +8939,47 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 476:
-/* rule 476 can match eol */
+case 484:
+/* rule 484 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_src);
        YY_BREAK
-case 477:
-/* rule 477 can match eol */
+case 485:
+/* rule 485 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");}  surfxml_bypassASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_src);
        YY_BREAK
-case 478:
-/* rule 478 can match eol */
+case 486:
+/* rule 486 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_dst);
        YY_BREAK
-case 479:
-/* rule 479 can match eol */
+case 487:
+/* rule 487 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");}  surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_dst);
        YY_BREAK
-case 480:
-/* rule 480 can match eol */
+case 488:
+/* rule 488 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
        YY_BREAK
-case 481:
-/* rule 481 can match eol */
+case 489:
+/* rule 489 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");}  surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
        YY_BREAK
-case 482:
-/* rule 482 can match eol */
+case 490:
+/* rule 490 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
        YY_BREAK
-case 483:
-/* rule 483 can match eol */
+case 491:
+/* rule 491 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");}  surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
        YY_BREAK
-case 484:
+case 492:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassASroute_src) FAIL("Required attribute `src' not set for `bypassASroute' element.");
@@ -8823,7 +8989,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassASroute);
  }
        YY_BREAK
-case 485:
+case 493:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassASroute_src) FAIL("Required attribute `src' not set for `bypassASroute' element.");
@@ -8836,11 +9002,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 486:
+case 494:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of bypassASroute element.", surf_parse_text[0]);
        YY_BREAK
-case 487:
+case 495:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `bypassASroute' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8848,8 +9014,8 @@ case YY_STATE_EOF(AL_surfxml_bypassASroute):
 FAIL("EOF in attribute list of `bypassASroute' element.");
        YY_BREAK
 
-case 488:
-/* rule 488 can match eol */
+case 496:
+/* rule 496 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8860,12 +9026,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 489:
-/* rule 489 can match eol */
+case 497:
+/* rule 497 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</bypassASroute>' expected.",surf_parse_text);
        YY_BREAK
-case 490:
+case 498:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</bypassASroute>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8875,13 +9041,13 @@ case YY_STATE_EOF(S_surfxml_bypassASroute):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</bypassASroute>' expected.");
        YY_BREAK
 
-case 491:
-/* rule 491 can match eol */
+case 499:
+/* rule 499 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <process> is not allowed here.");
        YY_BREAK
-case 492:
-/* rule 492 can match eol */
+case 500:
+/* rule 500 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_process_host = 0;
@@ -8898,61 +9064,61 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 493:
-/* rule 493 can match eol */
+case 501:
+/* rule 501 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");} surfxml_process_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host);
        YY_BREAK
-case 494:
-/* rule 494 can match eol */
+case 502:
+/* rule 502 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");}  surfxml_process_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host);
        YY_BREAK
-case 495:
-/* rule 495 can match eol */
+case 503:
+/* rule 503 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");} surfxml_process_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function);
        YY_BREAK
-case 496:
-/* rule 496 can match eol */
+case 504:
+/* rule 504 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");}  surfxml_process_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function);
        YY_BREAK
-case 497:
-/* rule 497 can match eol */
+case 505:
+/* rule 505 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");} surfxml_process_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start___time);
        YY_BREAK
-case 498:
-/* rule 498 can match eol */
+case 506:
+/* rule 506 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");}  surfxml_process_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start___time);
        YY_BREAK
-case 499:
-/* rule 499 can match eol */
+case 507:
+/* rule 507 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");} surfxml_process_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill___time);
        YY_BREAK
-case 500:
-/* rule 500 can match eol */
+case 508:
+/* rule 508 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");}  surfxml_process_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill___time);
        YY_BREAK
-case 501:
-/* rule 501 can match eol */
-case 502:
-/* rule 502 can match eol */
+case 509:
+/* rule 509 can match eol */
+case 510:
+/* rule 510 can match eol */
 YY_RULE_SETUP
 A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE;
        YY_BREAK
-case 503:
-/* rule 503 can match eol */
-case 504:
-/* rule 504 can match eol */
+case 511:
+/* rule 511 can match eol */
+case 512:
+/* rule 512 can match eol */
 YY_RULE_SETUP
 A_surfxml_process_on___failure = A_surfxml_process_on___failure_RESTART;
        YY_BREAK
-case 505:
+case 513:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element.");
@@ -8960,7 +9126,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process);
  }
        YY_BREAK
-case 506:
+case 514:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element.");
@@ -8971,11 +9137,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 507:
+case 515:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of process element.", surf_parse_text[0]);
        YY_BREAK
-case 508:
+case 516:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `process' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8983,8 +9149,8 @@ case YY_STATE_EOF(AL_surfxml_process):
 FAIL("EOF in attribute list of `process' element.");
        YY_BREAK
 
-case 509:
-/* rule 509 can match eol */
+case 517:
+/* rule 517 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8995,12 +9161,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 510:
-/* rule 510 can match eol */
+case 518:
+/* rule 518 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</process>' expected.",surf_parse_text);
        YY_BREAK
-case 511:
+case 519:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</process>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9010,13 +9176,13 @@ case YY_STATE_EOF(S_surfxml_process_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</process>' expected.");
        YY_BREAK
 
-case 512:
-/* rule 512 can match eol */
+case 520:
+/* rule 520 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <argument> is not allowed here.");
        YY_BREAK
-case 513:
-/* rule 513 can match eol */
+case 521:
+/* rule 521 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_argument_value = 0;
@@ -9025,24 +9191,24 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 514:
-/* rule 514 can match eol */
+case 522:
+/* rule 522 can match eol */
 YY_RULE_SETUP
 if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_argument>");} surfxml_argument_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value);
        YY_BREAK
-case 515:
-/* rule 515 can match eol */
+case 523:
+/* rule 523 can match eol */
 YY_RULE_SETUP
 if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_argument>");}  surfxml_argument_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value);
        YY_BREAK
-case 516:
+case 524:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
   LEAVE; STag_surfxml_argument();surfxml_pcdata_ix = 0; ENTER(E_surfxml_argument);
  }
        YY_BREAK
-case 517:
+case 525:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
@@ -9052,11 +9218,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 518:
+case 526:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of argument element.", surf_parse_text[0]);
        YY_BREAK
-case 519:
+case 527:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `argument' element start tag.",surf_parse_text);
        YY_BREAK
@@ -9064,8 +9230,8 @@ case YY_STATE_EOF(AL_surfxml_argument):
 FAIL("EOF in attribute list of `argument' element.");
        YY_BREAK
 
-case 520:
-/* rule 520 can match eol */
+case 528:
+/* rule 528 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9076,12 +9242,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 521:
-/* rule 521 can match eol */
+case 529:
+/* rule 529 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</argument>' expected.",surf_parse_text);
        YY_BREAK
-case 522:
+case 530:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</argument>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9089,13 +9255,13 @@ case YY_STATE_EOF(E_surfxml_argument):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</argument>' expected.");
        YY_BREAK
 
-case 523:
-/* rule 523 can match eol */
+case 531:
+/* rule 531 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <config> is not allowed here.");
        YY_BREAK
-case 524:
-/* rule 524 can match eol */
+case 532:
+/* rule 532 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_config_id = 0;
@@ -9104,23 +9270,23 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 525:
-/* rule 525 can match eol */
+case 533:
+/* rule 533 can match eol */
 YY_RULE_SETUP
 if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_config>");} surfxml_config_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_config_id);
        YY_BREAK
-case 526:
-/* rule 526 can match eol */
+case 534:
+/* rule 534 can match eol */
 YY_RULE_SETUP
 if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_config>");}  surfxml_config_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_config_id);
        YY_BREAK
-case 527:
+case 535:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_config();surfxml_pcdata_ix = 0; ENTER(S_surfxml_config);
  }
        YY_BREAK
-case 528:
+case 536:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_config(); surfxml_pcdata_ix = 0; ETag_surfxml_config(); popbuffer(); /* attribute */
@@ -9129,11 +9295,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 529:
+case 537:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of config element.", surf_parse_text[0]);
        YY_BREAK
-case 530:
+case 538:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `config' element start tag.",surf_parse_text);
        YY_BREAK
@@ -9141,8 +9307,8 @@ case YY_STATE_EOF(AL_surfxml_config):
 FAIL("EOF in attribute list of `config' element.");
        YY_BREAK
 
-case 531:
-/* rule 531 can match eol */
+case 539:
+/* rule 539 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9153,12 +9319,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 532:
-/* rule 532 can match eol */
+case 540:
+/* rule 540 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</config>' expected.",surf_parse_text);
        YY_BREAK
-case 533:
+case 541:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</config>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9170,13 +9336,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</config>' expected.");
 
 /* <!-- <!ATTLIST prop key CDATA #REQUIRED> -->
   * <!-- <!ATTLIST prop key CDATA #REQUIRED> -->  */
-case 534:
-/* rule 534 can match eol */
+case 542:
+/* rule 542 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <prop> is not allowed here.");
        YY_BREAK
-case 535:
-/* rule 535 can match eol */
+case 543:
+/* rule 543 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_prop_id = 0;
@@ -9187,27 +9353,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 536:
-/* rule 536 can match eol */
+case 544:
+/* rule 544 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_prop>");} surfxml_prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_id);
        YY_BREAK
-case 537:
-/* rule 537 can match eol */
+case 545:
+/* rule 545 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_prop>");}  surfxml_prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_id);
        YY_BREAK
-case 538:
-/* rule 538 can match eol */
+case 546:
+/* rule 546 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_prop>");} surfxml_prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_value);
        YY_BREAK
-case 539:
-/* rule 539 can match eol */
+case 547:
+/* rule 547 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_prop>");}  surfxml_prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_value);
        YY_BREAK
-case 540:
+case 548:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
@@ -9215,7 +9381,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop);
  }
        YY_BREAK
-case 541:
+case 549:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
@@ -9233,11 +9399,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 542:
+case 550:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of prop element.", surf_parse_text[0]);
        YY_BREAK
-case 543:
+case 551:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `prop' element start tag.",surf_parse_text);
        YY_BREAK
@@ -9245,8 +9411,8 @@ case YY_STATE_EOF(AL_surfxml_prop):
 FAIL("EOF in attribute list of `prop' element.");
        YY_BREAK
 
-case 544:
-/* rule 544 can match eol */
+case 552:
+/* rule 552 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9264,12 +9430,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 545:
-/* rule 545 can match eol */
+case 553:
+/* rule 553 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</prop>' expected.",surf_parse_text);
        YY_BREAK
-case 546:
+case 554:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</prop>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9277,9 +9443,104 @@ case YY_STATE_EOF(E_surfxml_prop):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</prop>' expected.");
        YY_BREAK
 
+/* <!-- <!ATTLIST model_prop key CDATA #REQUIRED> -->
+  * <!-- <!ATTLIST model_prop key CDATA #REQUIRED> -->  */
+case 555:
+/* rule 555 can match eol */
+YY_RULE_SETUP
+FAIL("Starting tag <model_prop> is not allowed here.");
+       YY_BREAK
+case 556:
+/* rule 556 can match eol */
+YY_RULE_SETUP
+{
+  AX_surfxml_model___prop_id = 0;
+  surfxml_model___prop_id_isset = 0;
+  AX_surfxml_model___prop_value = 0;
+  surfxml_model___prop_value_isset = 0;
+  ENTER(AL_surfxml_model___prop); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 557:
+/* rule 557 can match eol */
+YY_RULE_SETUP
+if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_model___prop>");} surfxml_model___prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_id);
+       YY_BREAK
+case 558:
+/* rule 558 can match eol */
+YY_RULE_SETUP
+if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_model___prop>");}  surfxml_model___prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_id);
+       YY_BREAK
+case 559:
+/* rule 559 can match eol */
+YY_RULE_SETUP
+if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_model___prop>");} surfxml_model___prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_value);
+       YY_BREAK
+case 560:
+/* rule 560 can match eol */
+YY_RULE_SETUP
+if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_model___prop>");}  surfxml_model___prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_value);
+       YY_BREAK
+case 561:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element.");
+  if (!AX_surfxml_model___prop_value) FAIL("Required attribute `value' not set for `model_prop' element.");
+  LEAVE; STag_surfxml_model___prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_model___prop);
+ }
+       YY_BREAK
+case 562:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element.");
+  if (!AX_surfxml_model___prop_value) FAIL("Required attribute `value' not set for `model_prop' element.");
+  LEAVE; STag_surfxml_model___prop(); surfxml_pcdata_ix = 0; ETag_surfxml_model___prop(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_storage___type_1: case S_surfxml_storage___type: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break;
+  }
+ }
+       YY_BREAK
+case 563:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of model_prop element.", surf_parse_text[0]);
+       YY_BREAK
+case 564:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `model_prop' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_model___prop):
+FAIL("EOF in attribute list of `model_prop' element.");
+       YY_BREAK
+
+case 565:
+/* rule 565 can match eol */
+YY_RULE_SETUP
+{
+  LEAVE;
+  ETag_surfxml_model___prop();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_storage___type_1: case S_surfxml_storage___type: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break;
+  }
+ }
+       YY_BREAK
+case 566:
+/* rule 566 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected end-tag `%s': `</model_prop>' expected.",surf_parse_text);
+       YY_BREAK
+case 567:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</model_prop>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(E_surfxml_model___prop):
+if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</model_prop>' expected.");
+       YY_BREAK
+
 /* EPILOG: after the root element. */
 
-case 547:
+case 568:
 YY_RULE_SETUP
 {SET(PROLOG); yyless(0); CLEANUP; return -1;}
        YY_BREAK
@@ -9290,58 +9551,58 @@ SUCCEED;
 /* CHARACTER DATA. */
 
 /* Non-defined standard entities... */
-case 548:
+case 569:
 YY_RULE_SETUP
 BUFFERPUTC('&');
        YY_BREAK
-case 549:
+case 570:
 YY_RULE_SETUP
 BUFFERPUTC('<');
        YY_BREAK
-case 550:
+case 571:
 YY_RULE_SETUP
 BUFFERPUTC('>');
        YY_BREAK
-case 551:
+case 572:
 YY_RULE_SETUP
 BUFFERPUTC('\'');
        YY_BREAK
-case 552:
+case 573:
 YY_RULE_SETUP
 BUFFERPUTC('"');
        YY_BREAK
 /* Character entities. */
-case 553:
+case 574:
 YY_RULE_SETUP
 BUFFERPUTC((unsigned char)atoi(surf_parse_text+2));
        YY_BREAK
-case 554:
+case 575:
 YY_RULE_SETUP
 BUFFERPUTC((unsigned char)strtol(surf_parse_text+3,NULL,16));
        YY_BREAK
 
-case 555:
-/* rule 555 can match eol */
-case 556:
-/* rule 556 can match eol */
-case 557:
-/* rule 557 can match eol */
-case 558:
-/* rule 558 can match eol */
+case 576:
+/* rule 576 can match eol */
+case 577:
+/* rule 577 can match eol */
+case 578:
+/* rule 578 can match eol */
+case 579:
+/* rule 579 can match eol */
 YY_RULE_SETUP
 BUFFERPUTC('\n');
        YY_BREAK
 
-case 559:
+case 580:
 YY_RULE_SETUP
 ENTER(CDATA);
        YY_BREAK
-case 560:
+case 581:
 YY_RULE_SETUP
 FAIL("Unexpected `]""]>' in character data.");
        YY_BREAK
 
-case 561:
+case 582:
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
@@ -9349,7 +9610,7 @@ case YY_STATE_EOF(VALUE1):
 FAIL("EOF in literal (\"'\" expected).");
        YY_BREAK
 
-case 562:
+case 583:
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
@@ -9357,22 +9618,22 @@ case YY_STATE_EOF(VALUE2):
 FAIL("EOF in literal (`\"' expected).");
        YY_BREAK
 
-case 563:
-/* rule 563 can match eol */
+case 584:
+/* rule 584 can match eol */
 YY_RULE_SETUP
 BUFFERPUTC(surf_parse_text[0]);
        YY_BREAK
-case 564:
+case 585:
 YY_RULE_SETUP
 FAIL("Spurious `%c' in character data.",surf_parse_text[0]);
        YY_BREAK
 
-case 565:
+case 586:
 YY_RULE_SETUP
 LEAVE;
        YY_BREAK
 /* "]""]"              BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */
-case 566:
+case 587:
 YY_RULE_SETUP
 BUFFERPUTC(surf_parse_text[0]);
        YY_BREAK
@@ -9384,13 +9645,13 @@ FAIL("EOF in CDATA section.");
 /* Ideally, this should be replaced by code in flexml.pl that
     generates just the states not covered by other rules. */
 
-case 567:
-/* rule 567 can match eol */
+case 588:
+/* rule 588 can match eol */
 YY_RULE_SETUP
 FAIL("Syntax error on character `%c'.", surf_parse_text[0]);
        YY_BREAK
 
-case 568:
+case 589:
 YY_RULE_SETUP
 ECHO;
        YY_BREAK
@@ -9708,7 +9969,7 @@ static int yy_get_next_buffer (void)
                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 >= 3323 )
+                       if ( yy_current_state >= 3458 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -9736,11 +9997,11 @@ static int yy_get_next_buffer (void)
        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 >= 3323 )
+               if ( yy_current_state >= 3458 )
                        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 == 3322);
+       yy_is_jam = (yy_current_state == 3457);
 
        return yy_is_jam ? 0 : yy_current_state;
 }
diff --git a/src/surf/storage.c b/src/surf/storage.c
deleted file mode 100644 (file)
index 5369136..0000000
+++ /dev/null
@@ -1,724 +0,0 @@
-/* Copyright (c) 2004-2013. 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 "portable.h"
-#include "surf_private.h"
-#include "storage_private.h"
-#include "surf/surf_resource.h"
-#include <inttypes.h>
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_storage, surf,
-                                "Logging specific to the SURF storage module");
-
-xbt_lib_t storage_lib;
-int ROUTING_STORAGE_LEVEL;      //Routing for storagelevel
-int ROUTING_STORAGE_HOST_LEVEL;
-int SURF_STORAGE_LEVEL;
-xbt_lib_t storage_type_lib;
-int ROUTING_STORAGE_TYPE_LEVEL; //Routing for storage_type level
-
-xbt_dynar_t mount_list = NULL;  /* temporary store of current mount storage */
-
-surf_model_t surf_storage_model = NULL;
-lmm_system_t storage_maxmin_system = NULL;
-static int storage_selective_update = 0;
-static xbt_swag_t
-    storage_running_action_set_that_does_not_need_being_checked = NULL;
-
-static xbt_dynar_t storage_list;
-
-#define GENERIC_LMM_ACTION(action) action->generic_lmm_action
-#define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action
-
-static xbt_dict_t parse_storage_content(char *filename, sg_storage_size_t *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, sg_storage_size_t size, e_surf_action_storage_type_t type);
-
-static surf_action_t storage_action_ls(void *storage, const char* path)
-{
-  surf_action_t action = storage_action_execute(storage,0, LS);
-  action->ls_dict = NULL;
-  xbt_dict_t ls_dict = xbt_dict_new_homogeneous(xbt_free);
-
-  char* key;
-  sg_storage_size_t size = 0;
-  xbt_dict_cursor_t cursor = NULL;
-
-  xbt_dynar_t dyn = NULL;
-  char* file = NULL;
-
-  // for each file in the storage content
-  xbt_dict_foreach(((storage_t)storage)->content,cursor,key,size){
-    // Search if file start with the prefix 'path'
-    if(xbt_str_start_with(key,path)){
-      file = &key[strlen(path)];
-
-      // Split file with '/'
-      dyn = xbt_str_split(file,"/");
-      file = xbt_dynar_get_as(dyn,0,char*);
-
-      // file
-      if(xbt_dynar_length(dyn) == 1){
-        sg_storage_size_t *psize = xbt_new(sg_storage_size_t,1);
-        *psize=size;
-        xbt_dict_set(ls_dict,file,psize,NULL);
-      }
-      // Directory
-      else
-      {
-        // if directory does not exist yet in the dictionary
-        if(!xbt_dict_get_or_null(ls_dict,file))
-          xbt_dict_set(ls_dict,file,NULL,NULL);
-      }
-      xbt_dynar_free(&dyn);
-    }
-  }
-
-  action->ls_dict = ls_dict;
-  return action;
-}
-
-static surf_action_t storage_action_open(void *storage, const char* mount,
-                                         const char* path)
-{
-  XBT_DEBUG("\tOpen file '%s'",path);
-  xbt_dict_t content_dict = ((storage_t)storage)->content;
-  sg_storage_size_t size, *psize;
-  psize = (sg_storage_size_t*) xbt_dict_get_or_null(content_dict, path);
-  if (psize)
-    size = *psize;
-  else {
-  // if file does not exist create an empty file
-    psize = xbt_new(sg_storage_size_t,1);
-    size = 0;
-    *psize = size;
-    xbt_dict_set(content_dict,path,psize,NULL);
-    XBT_DEBUG("File '%s' was not found, file created.",path);
-  }
-  surf_file_t file = xbt_new0(s_surf_file_t,1);
-  file->name = xbt_strdup(path);
-  file->size = size;
-  file->mount = xbt_strdup(mount);
-
-  surf_action_t action = storage_action_execute(storage,0, OPEN);
-  action->file = (void *)file;
-  return action;
-}
-
-static surf_action_t storage_action_close(void *storage, surf_file_t fd)
-{
-  char *filename = fd->name;
-  XBT_DEBUG("\tClose file '%s' size '%" PRIu64 "'", filename, fd->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) == fd) {
-      xbt_dynar_cursor_rm(((storage_t)storage)->write_actions, &i);
-      storage_action_unref((surf_action_t) write_action);
-    }
-  }
-  free(fd->name);
-  free(fd->mount);
-  xbt_free(fd);
-  surf_action_t action = storage_action_execute(storage,0, CLOSE);
-  return action;
-}
-
-static surf_action_t storage_action_read(void *storage, surf_file_t fd, sg_storage_size_t size)
-{
-  if(size > fd->size)
-    size = fd->size;
-  surf_action_t action = storage_action_execute(storage,size,READ);
-  return action;
-}
-
-static surf_action_t storage_action_write(void *storage, surf_file_t fd, sg_storage_size_t size)
-{
-  char *filename = fd->name;
-  XBT_DEBUG("\tWrite file '%s' size '%" PRIu64 "/%" PRIu64 "'",
-            filename, size, fd->size);
-
-  surf_action_t action = storage_action_execute(storage,size,WRITE);
-  action->file = fd;
-
-  // If the storage is full
-  if(((storage_t)storage)->used_size==((storage_t)storage)->size) {
-    storage_action_state_set((surf_action_t) action, SURF_ACTION_FAILED);
-  }
-  return action;
-}
-
-static surf_action_t storage_action_execute (void *storage, sg_storage_size_t size, e_surf_action_storage_type_t type)
-{
-  surf_action_storage_t action = NULL;
-  storage_t STORAGE = storage;
-
-  XBT_IN("(%s,%" PRIu64, surf_resource_name(STORAGE), size);
-  action =
-      surf_action_new(sizeof(s_surf_action_storage_t), size, surf_storage_model,
-          STORAGE->state_current != SURF_RESOURCE_ON);
-
-  // Save the storage on action
-  action->storage = storage;
-  GENERIC_LMM_ACTION(action).suspended = 0;     /* Should be useless because of the
-                                                   calloc but it seems to help valgrind... */
-
-  GENERIC_LMM_ACTION(action).variable =
-      lmm_variable_new(storage_maxmin_system, action, 1.0, -1.0 , 3);
-
-  // Must be less than the max bandwidth for all actions
-  lmm_expand(storage_maxmin_system, STORAGE->constraint,
-             GENERIC_LMM_ACTION(action).variable, 1.0);
-
-  switch(type) {
-  case OPEN:
-  case CLOSE:
-  case STAT:
-  case LS:
-    break;
-  case READ:
-    lmm_expand(storage_maxmin_system, STORAGE->constraint_read,
-               GENERIC_LMM_ACTION(action).variable, 1.0);
-    break;
-  case WRITE:
-    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;
-  XBT_OUT();
-  return (surf_action_t) action;
-}
-
-static xbt_dict_t storage_get_properties(const void *storage)
-{
-  return surf_resource_properties(surf_storage_resource_priv(storage));
-}
-
-static xbt_dict_t storage_get_content(void *storage)
-{
-  /* For the moment this action has no cost, but in the future we could take in account access latency of the disk */
-  /*surf_action_t action = storage_action_execute(storage,0, LS);*/
-
-  void *storage_resource = surf_storage_resource_priv(storage);
-  xbt_dict_t content_dict = xbt_dict_new_homogeneous(NULL);
-  xbt_dict_cursor_t cursor = NULL;
-  char *file;
-  sg_storage_size_t *psize;
-
-  xbt_dict_foreach(((storage_t)storage_resource)->content, cursor, file, psize){
-    xbt_dict_set(content_dict,file,psize,NULL);
-  }
-  return content_dict;
-}
-
-static sg_storage_size_t storage_get_size(void *storage){
-  void *storage_resource = surf_storage_resource_priv(storage);
-  return ((storage_t)storage_resource)->size;
-}
-
-static void* storage_create_resource(const char* id, const char* model,
-    const char* type_id, const char* content_name, const char* content_type, xbt_dict_t properties){
-  storage_t storage = NULL;
-
-  xbt_assert(!surf_storage_resource_priv(surf_storage_resource_by_name(id)),
-              "Storage '%s' declared several times in the platform file",
-              id);
-  storage = (storage_t) surf_resource_new(sizeof(s_storage_t),
-          surf_storage_model, id, properties, NULL);
-
-  storage->state_current = SURF_RESOURCE_ON;
-  storage->used_size = 0;
-  storage->size = 0;
-  storage->write_actions = xbt_dynar_new(sizeof(char *),NULL);
-
-  storage_type_t storage_type = xbt_lib_get_or_null(storage_type_lib, type_id,ROUTING_STORAGE_TYPE_LEVEL);
-  double Bread =
-      surf_parse_get_bandwidth(xbt_dict_get(storage_type->properties,"Bread"));
-  double Bwrite =
-      surf_parse_get_bandwidth(xbt_dict_get(storage_type->properties,"Bwrite"));
-  double Bconnection =
-      surf_parse_get_bandwidth(xbt_dict_get(storage_type->properties,
-                                            "Bconnection"));
-  XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%lu'",Bconnection,Bread,Bwrite,(unsigned long)storage_type->size);
-  storage->constraint       = lmm_constraint_new(storage_maxmin_system, storage, Bconnection);
-  storage->constraint_read  = lmm_constraint_new(storage_maxmin_system, storage, Bread);
-  storage->constraint_write = lmm_constraint_new(storage_maxmin_system, storage, Bwrite);
-  storage->content = parse_storage_content((char*)content_name,&(storage->used_size));
-  storage->content_type = xbt_strdup(content_type);
-  storage->size = storage_type->size;
-  storage->type_id = xbt_strdup(type_id);
-
-  xbt_lib_set(storage_lib, id, SURF_STORAGE_LEVEL, storage);
-
-  XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s' \n\t\tmodel '%s' \n\t\tproperties '%p'\n\t\tBread '%f'\n",
-      id,
-      model,
-      type_id,
-      storage_type->properties,
-      Bread);
-
-  if (!storage_list)
-    storage_list = xbt_dynar_new(sizeof(char *),NULL);
-  xbt_dynar_push(storage_list,&storage);
-
-  return storage;
-}
-
-static void storage_finalize(void)
-{
-  lmm_system_free(storage_maxmin_system);
-  storage_maxmin_system = NULL;
-
-  surf_model_exit(surf_storage_model);
-  surf_storage_model = NULL;
-
-  xbt_dynar_free(&storage_list);
-
-  xbt_swag_free
-      (storage_running_action_set_that_does_not_need_being_checked);
-  storage_running_action_set_that_does_not_need_being_checked = NULL;
-}
-
-static void storage_update_actions_state(double now, double delta)
-{
-  surf_action_storage_t action = NULL;
-  surf_action_storage_t next_action = NULL;
-  xbt_swag_t running_actions = surf_storage_model->states.running_action_set;
-
-
-  xbt_swag_foreach_safe(action, next_action, running_actions) {
-    if(action->type == WRITE)
-    {
-      // Update the disk usage
-      // Update the file size
-      // Update the storage content (with file size)
-      double rate = lmm_variable_getvalue(GENERIC_LMM_ACTION(action).variable);
-      /* Hack to avoid rounding differences between x86 and x86_64
-       * (note that the next sizes are of type sg_storage_size_t). */
-      long incr = delta * rate + MAXMIN_PRECISION;
-      ((storage_t)(action->storage))->used_size += incr; // disk usage
-      ((surf_action_t)action)->file->size += incr; // file size
-
-      sg_storage_size_t *psize = xbt_new(sg_storage_size_t,1);
-      *psize = ((surf_action_t)action)->file->size;
-
-      xbt_dict_t content_dict = ((storage_t)(action->storage))->content;
-      xbt_dict_set(content_dict,((surf_action_t)action)->file->name,psize,NULL);
-    }
-
-    double_update(&(GENERIC_ACTION(action).remains),
-                  lmm_variable_getvalue(GENERIC_LMM_ACTION(action).variable) * delta);
-
-    if (GENERIC_LMM_ACTION(action).generic_action.max_duration != NO_MAX_DURATION)
-      double_update(&(GENERIC_ACTION(action).max_duration), delta);
-
-    if(GENERIC_ACTION(action).remains > 0 &&
-        lmm_get_variable_weight(GENERIC_LMM_ACTION(action).variable) > 0 &&
-        ((storage_t)action->storage)->used_size == ((storage_t)action->storage)->size)
-    {
-      GENERIC_ACTION(action).finish = surf_get_clock();
-      storage_action_state_set((surf_action_t) action, SURF_ACTION_FAILED);
-    } else if ((GENERIC_ACTION(action).remains <= 0) &&
-        (lmm_get_variable_weight(GENERIC_LMM_ACTION(action).variable) > 0))
-    {
-      GENERIC_ACTION(action).finish = surf_get_clock();
-      storage_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
-    } else if ((GENERIC_ACTION(action).max_duration != NO_MAX_DURATION) &&
-               (GENERIC_ACTION(action).max_duration <= 0))
-    {
-      GENERIC_ACTION(action).finish = surf_get_clock();
-      storage_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
-    }
-  }
-
-  return;
-}
-
-static double storage_share_resources(double NOW)
-{
-  XBT_DEBUG("storage_share_resources %f",NOW);
-  s_surf_action_storage_t action;
-  unsigned int i,j;
-  storage_t storage;
-  surf_action_storage_t write_action;
-
-  double min_completion = generic_maxmin_share_resources(surf_storage_model->states.running_action_set,
-      xbt_swag_offset(action, generic_lmm_action.variable),
-      storage_maxmin_system, lmm_solve);
-
-  double rate;
-  // Foreach disk
-  xbt_dynar_foreach(storage_list,i,storage)
-  {
-    rate = 0;
-    // Foreach write action on disk
-    xbt_dynar_foreach(storage->write_actions,j,write_action)
-    {
-      rate += lmm_variable_getvalue(write_action->generic_lmm_action.variable);
-    }
-    if(rate > 0)
-      min_completion = MIN(min_completion, (storage->size-storage->used_size)/rate);
-  }
-
-  return min_completion;
-}
-
-static int storage_resource_used(void *resource_id)
-{
-  THROW_UNIMPLEMENTED;
-  return 0;
-}
-
-static void storage_resources_state(void *id, tmgr_trace_event_t event_type,
-                                 double value, double time)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-static int storage_action_unref(surf_action_t action)
-{
-  action->refcount--;
-  if (!action->refcount) {
-    xbt_swag_remove(action, action->state_set);
-    if (((surf_action_lmm_t) action)->variable)
-      lmm_variable_free(storage_maxmin_system,
-                        ((surf_action_lmm_t) action)->variable);
-#ifdef HAVE_TRACING
-    xbt_free(action->category);
-#endif
-    surf_action_free(&action);
-    return 1;
-  }
-  return 0;
-}
-
-static void storage_action_cancel(surf_action_t action)
-{
-  surf_action_state_set(action, SURF_ACTION_FAILED);
-  return;
-}
-
-static void storage_action_state_set(surf_action_t action, e_surf_action_state_t state)
-{
-  surf_action_state_set(action, state);
-  return;
-}
-
-static void storage_action_suspend(surf_action_t action)
-{
-  XBT_IN("(%p)", action);
-  if (((surf_action_lmm_t) action)->suspended != 2) {
-    lmm_update_variable_weight(storage_maxmin_system,
-                               ((surf_action_lmm_t) action)->variable,
-                               0.0);
-    ((surf_action_lmm_t) action)->suspended = 1;
-  }
-  XBT_OUT();
-}
-
-static void storage_action_resume(surf_action_t action)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-static int storage_action_is_suspended(surf_action_t action)
-{
-  return (((surf_action_lmm_t) action)->suspended == 1);
-}
-
-static void storage_action_set_max_duration(surf_action_t action, double duration)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-static void storage_action_set_priority(surf_action_t action, double priority)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-static void parse_storage_init(sg_platf_storage_cbarg_t storage)
-{
-  void* stype = xbt_lib_get_or_null(storage_type_lib,
-                                    storage->type_id,
-                                    ROUTING_STORAGE_TYPE_LEVEL);
-  if(!stype) xbt_die("No storage type '%s'",storage->type_id);
-
-  // if storage content is not specified use the content of storage_type if exist
-  if(!strcmp(storage->content,"") && strcmp(((storage_type_t) stype)->content,"")){
-    storage->content = ((storage_type_t) stype)->content;
-    storage->content_type = ((storage_type_t) stype)->content_type;
-    XBT_DEBUG("For disk '%s' content is empty, inherit the content (of type %s) from storage type '%s' ",
-        storage->id,((storage_type_t) stype)->content_type,
-        ((storage_type_t) stype)->type_id);
-  }
-
-  XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s' "
-      "\n\t\tmodel '%s' \n\t\tcontent '%s'\n\t\tcontent_type '%s' "
-      "\n\t\tproperties '%p'\n",
-      storage->id,
-      ((storage_type_t) stype)->model,
-      ((storage_type_t) stype)->type_id,
-      storage->content,
-      storage->content_type,
-      ((storage_type_t) stype)->properties);
-
-  storage_create_resource(storage->id,
-     ((storage_type_t) stype)->model,
-     ((storage_type_t) stype)->type_id,
-     storage->content,
-     storage->content_type,
-     storage->properties);
-}
-
-static void parse_mstorage_init(sg_platf_mstorage_cbarg_t mstorage)
-{
-  XBT_DEBUG("parse_mstorage_init");
-}
-
-static void parse_storage_type_init(sg_platf_storage_type_cbarg_t storagetype_)
-{
-  XBT_DEBUG("parse_storage_type_init");
-}
-
-static void parse_mount_init(sg_platf_mount_cbarg_t mount)
-{
-  XBT_DEBUG("parse_mount_init");
-}
-
-static void storage_define_callbacks()
-{
-  sg_platf_storage_add_cb(parse_storage_init);
-  sg_platf_storage_type_add_cb(parse_storage_type_init);
-  sg_platf_mstorage_add_cb(parse_mstorage_init);
-  sg_platf_mount_add_cb(parse_mount_init);
-}
-
-static void surf_storage_model_init_internal(void)
-{
-  s_surf_action_t action;
-
-  XBT_DEBUG("surf_storage_model_init_internal");
-  surf_storage_model = surf_model_init();
-
-  storage_running_action_set_that_does_not_need_being_checked =
-      xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
-  surf_storage_model->name = "Storage";
-  surf_storage_model->action_unref = storage_action_unref;
-  surf_storage_model->action_cancel = storage_action_cancel;
-  surf_storage_model->action_state_set = storage_action_state_set;
-
-  surf_storage_model->model_private->finalize = storage_finalize;
-  surf_storage_model->model_private->update_actions_state = storage_update_actions_state;
-  surf_storage_model->model_private->share_resources = storage_share_resources;
-  surf_storage_model->model_private->resource_used = storage_resource_used;
-  surf_storage_model->model_private->update_resource_state = storage_resources_state;
-
-  surf_storage_model->suspend = storage_action_suspend;
-  surf_storage_model->resume = storage_action_resume;
-  surf_storage_model->is_suspended = storage_action_is_suspended;
-  surf_storage_model->set_max_duration = storage_action_set_max_duration;
-  surf_storage_model->set_priority = storage_action_set_priority;
-
-  surf_storage_model->extension.storage.open = storage_action_open;
-  surf_storage_model->extension.storage.close = storage_action_close;
-  surf_storage_model->extension.storage.read = storage_action_read;
-  surf_storage_model->extension.storage.write = storage_action_write;
-  surf_storage_model->extension.storage.ls = storage_action_ls;
-  surf_storage_model->extension.storage.get_properties = storage_get_properties;
-  surf_storage_model->extension.storage.get_content = storage_get_content;
-  surf_storage_model->extension.storage.get_size = storage_get_size;
-  if (!storage_maxmin_system) {
-    storage_maxmin_system = lmm_system_new(storage_selective_update);
-  }
-}
-
-void surf_storage_model_init_default(void)
-{
-  surf_storage_model_init_internal();
-  storage_define_callbacks();
-
-  xbt_dynar_push(model_list, &surf_storage_model);
-}
-
-static void storage_parse_storage(sg_platf_storage_cbarg_t storage)
-{
-  xbt_assert(!xbt_lib_get_or_null(storage_lib, storage->id,ROUTING_STORAGE_LEVEL),
-               "Reading a storage, processing unit \"%s\" already exists", storage->id);
-
-  // Verification of an existing type_id
-#ifndef NDEBUG
-  void* storage_type = xbt_lib_get_or_null(storage_type_lib, storage->type_id,ROUTING_STORAGE_TYPE_LEVEL);
-#endif
-  xbt_assert(storage_type,"Reading a storage, type id \"%s\" does not exists", storage->type_id);
-
-  XBT_DEBUG("ROUTING Create a storage name '%s' with type_id '%s' and content '%s'",
-      storage->id,
-      storage->type_id,
-      storage->content);
-
-  xbt_lib_set(storage_lib,
-      storage->id,
-      ROUTING_STORAGE_LEVEL,
-      (void *) xbt_strdup(storage->type_id));
-}
-
-static xbt_dict_t parse_storage_content(char *filename, sg_storage_size_t *used_size)
-{
-  *used_size = 0;
-  if ((!filename) || (strcmp(filename, "") == 0))
-    return NULL;
-
-  xbt_dict_t parse_content = xbt_dict_new_homogeneous(xbt_free);
-  FILE *file = NULL;
-
-  file = surf_fopen(filename, "r");
-  xbt_assert(file != NULL, "Cannot open file '%s' (path=%s)", filename,
-              xbt_str_join(surf_path, ":"));
-
-  char *line = NULL;
-  size_t len = 0;
-  ssize_t read;
-  char path[1024];
-  sg_storage_size_t size;
-
-  while ((read = xbt_getline(&line, &len, file)) != -1) {
-    if (read){
-    if (sscanf(line,"%s %" SCNu64, path, &size) == 2) {
-        *used_size += size;
-        sg_storage_size_t *psize = xbt_new(sg_storage_size_t, 1);
-        *psize = size;
-        xbt_dict_set(parse_content,path,psize,NULL);
-      } else {
-        xbt_die("Be sure of passing a good format for content file.\n");
-      }
-    }
-  }
-  free(line);
-  fclose(file);
-  return parse_content;
-}
-
-static void storage_parse_storage_type(sg_platf_storage_type_cbarg_t storage_type)
-{
-  xbt_assert(!xbt_lib_get_or_null(storage_type_lib, storage_type->id,ROUTING_STORAGE_TYPE_LEVEL),
-               "Reading a storage type, processing unit \"%s\" already exists", storage_type->id);
-
-  storage_type_t stype = xbt_new0(s_storage_type_t, 1);
-  stype->model = xbt_strdup(storage_type->model);
-  stype->properties = storage_type->properties;
-  stype->content = xbt_strdup(storage_type->content);
-  stype->content_type = xbt_strdup(storage_type->content_type);
-  stype->type_id = xbt_strdup(storage_type->id);
-  stype->size = storage_type->size;
-
-  XBT_DEBUG("ROUTING Create a storage type id '%s' with model '%s', "
-      "content '%s', and content_type '%s'",
-      stype->type_id,
-      stype->model,
-      storage_type->content,
-      storage_type->content_type);
-
-  xbt_lib_set(storage_type_lib,
-      stype->type_id,
-      ROUTING_STORAGE_TYPE_LEVEL,
-      (void *) stype);
-}
-static void storage_parse_mstorage(sg_platf_mstorage_cbarg_t mstorage)
-{
-  THROW_UNIMPLEMENTED;
-//  mount_t mnt = xbt_new0(s_mount_t, 1);
-//  mnt->id = xbt_strdup(mstorage->type_id);
-//  mnt->name = xbt_strdup(mstorage->name);
-//
-//  if(!mount_list){
-//    XBT_DEBUG("Creata a Mount list for %s",A_surfxml_host_id);
-//    mount_list = xbt_dynar_new(sizeof(char *), NULL);
-//  }
-//  xbt_dynar_push(mount_list,(void *) mnt);
-//  free(mnt->id);
-//  free(mnt->name);
-//  xbt_free(mnt);
-//  XBT_DEBUG("ROUTING Mount a storage name '%s' with type_id '%s'",mstorage->name, mstorage->id);
-}
-
-static void mount_free(void *p)
-{
-  mount_t mnt = p;
-  xbt_free(mnt->name);
-}
-
-static void storage_parse_mount(sg_platf_mount_cbarg_t mount)
-{
-  // Verification of an existing storage
-#ifndef NDEBUG
-  void* storage = xbt_lib_get_or_null(storage_lib, mount->storageId,ROUTING_STORAGE_LEVEL);
-#endif
-  xbt_assert(storage,"Disk id \"%s\" does not exists", mount->storageId);
-
-  XBT_DEBUG("ROUTING Mount '%s' on '%s'",mount->storageId, mount->name);
-
-  s_mount_t mnt;
-  mnt.storage =
-    surf_storage_resource_priv(surf_storage_resource_by_name(mount->storageId));
-  mnt.name = xbt_strdup(mount->name);
-
-  if(!mount_list){
-    XBT_DEBUG("Create a Mount list for %s",A_surfxml_host_id);
-    mount_list = xbt_dynar_new(sizeof(s_mount_t), mount_free);
-  }
-  xbt_dynar_push(mount_list,&mnt);
-}
-
-static XBT_INLINE void routing_storage_type_free(void *r)
-{
-  storage_type_t stype = r;
-  free(stype->model);
-  free(stype->type_id);
-  free(stype->content);
-  free(stype->content_type);
-  xbt_dict_free(&(stype->properties));
-  free(stype);
-}
-
-static XBT_INLINE void surf_storage_resource_free(void *r)
-{
-  // specific to storage
-  storage_t storage = r;
-  xbt_dict_free(&storage->content);
-  xbt_dynar_free(&storage->write_actions);
-  free(storage->type_id);
-  free(storage->content_type);
-  // generic resource
-  surf_resource_free(r);
-}
-
-static XBT_INLINE void routing_storage_host_free(void *r)
-{
-  xbt_dynar_t dyn = r;
-  xbt_dynar_free(&dyn);
-}
-
-void storage_register_callbacks() {
-
-  ROUTING_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,xbt_free);
-  ROUTING_STORAGE_HOST_LEVEL = xbt_lib_add_level(storage_lib,routing_storage_host_free);
-  ROUTING_STORAGE_TYPE_LEVEL = xbt_lib_add_level(storage_type_lib,routing_storage_type_free);
-  SURF_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,surf_storage_resource_free);
-
-  sg_platf_storage_add_cb(storage_parse_storage);
-  sg_platf_mstorage_add_cb(storage_parse_mstorage);
-  sg_platf_storage_type_add_cb(storage_parse_storage_type);
-  sg_platf_mount_add_cb(storage_parse_mount);
-}
-
diff --git a/src/surf/storage_interface.cpp b/src/surf/storage_interface.cpp
new file mode 100644 (file)
index 0000000..4ddc3c9
--- /dev/null
@@ -0,0 +1,182 @@
+/* Copyright (c) 2013-2014. 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 "storage_interface.hpp"
+#include "surf_private.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_storage, surf,
+                                "Logging specific to the SURF storage module");
+
+xbt_lib_t storage_lib;
+int ROUTING_STORAGE_LEVEL;      //Routing for storagelevel
+int ROUTING_STORAGE_HOST_LEVEL;
+int SURF_STORAGE_LEVEL;
+xbt_lib_t storage_type_lib;
+int ROUTING_STORAGE_TYPE_LEVEL; //Routing for storage_type level
+
+xbt_dynar_t mount_list = NULL;
+StorageModelPtr surf_storage_model = NULL;
+
+/*************
+ * Callbacks *
+ *************/
+
+surf_callback(void, StoragePtr) storageCreatedCallbacks;
+surf_callback(void, StoragePtr) storageDestructedCallbacks;
+surf_callback(void, StoragePtr) storageStateChangedCallbacks;
+surf_callback(void, StorageActionPtr) storageActionStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+
+StorageModel::StorageModel() : Model("Storage") {
+  p_storageList = NULL;
+}
+
+StorageModel::~StorageModel(){
+  lmm_system_free(p_maxminSystem);
+
+  surf_storage_model = NULL;
+
+  xbt_dynar_free(&p_storageList);
+}
+
+/************
+ * Resource *
+ ************/
+
+Storage::Storage(ModelPtr model, const char *name, xbt_dict_t props,
+                        const char* type_id, char *content_name, char *content_type, sg_size_t size)
+ : Resource(model, name, props)
+ , p_contentType(content_type)
+ , m_size(size), m_usedSize(0)
+ , p_typeId(xbt_strdup(type_id))
+ , p_writeActions(xbt_dynar_new(sizeof(ActionPtr),NULL))
+{
+  surf_callback_emit(storageCreatedCallbacks, this);
+  p_content = parseContent(content_name);
+  setState(SURF_RESOURCE_ON);
+}
+
+Storage::Storage(ModelPtr model, const char *name, xbt_dict_t props,
+                        lmm_system_t maxminSystem, double bread, double bwrite, double bconnection,
+                    const char* type_id, char *content_name, char *content_type, sg_size_t size)
+ :  Resource(model, name, props, lmm_constraint_new(maxminSystem, this, bconnection))
+ , p_contentType(content_type)
+ , m_size(size), m_usedSize(0)
+ , p_typeId(xbt_strdup(type_id))
+ , p_writeActions(xbt_dynar_new(sizeof(ActionPtr),NULL)) {
+  surf_callback_emit(storageCreatedCallbacks, this);
+  p_content = parseContent(content_name);
+  setState(SURF_RESOURCE_ON);
+  XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%llu'", bconnection, bread, bwrite, size);
+  p_constraintRead  = lmm_constraint_new(maxminSystem, this, bread);
+  p_constraintWrite = lmm_constraint_new(maxminSystem, this, bwrite);
+}
+
+Storage::~Storage(){
+  surf_callback_emit(storageDestructedCallbacks, this);
+  xbt_dict_free(&p_content);
+  xbt_dynar_free(&p_writeActions);
+  free(p_typeId);
+  free(p_contentType);
+}
+
+xbt_dict_t Storage::parseContent(char *filename)
+{
+  m_usedSize = 0;
+  if ((!filename) || (strcmp(filename, "") == 0))
+    return NULL;
+
+  xbt_dict_t parse_content = xbt_dict_new_homogeneous(xbt_free);
+  FILE *file = NULL;
+
+  file = surf_fopen(filename, "r");
+  xbt_assert(file != NULL, "Cannot open file '%s' (path=%s)", filename,
+              xbt_str_join(surf_path, ":"));
+
+  char *line = NULL;
+  size_t len = 0;
+  ssize_t read;
+  char path[1024];
+  sg_size_t size;
+
+
+  while ((read = xbt_getline(&line, &len, file)) != -1) {
+    if (read){
+    if(sscanf(line,"%s %llu", path, &size) == 2) {
+        m_usedSize += size;
+        sg_size_t *psize = xbt_new(sg_size_t, 1);
+        *psize = size;
+        xbt_dict_set(parse_content,path,psize,NULL);
+      } else {
+        xbt_die("Be sure of passing a good format for content file.\n");
+      }
+    }
+  }
+  free(line);
+  fclose(file);
+  return parse_content;
+}
+
+bool Storage::isUsed()
+{
+  THROW_UNIMPLEMENTED;
+  return false;
+}
+
+void Storage::updateState(tmgr_trace_event_t /*event_type*/, double /*value*/, double /*date*/)
+{
+  THROW_UNIMPLEMENTED;
+}
+
+void Storage::setState(e_surf_resource_state_t state)
+{
+  Resource::setState(state);
+  surf_callback_emit(storageStateChangedCallbacks, this);
+}
+
+xbt_dict_t Storage::getContent()
+{
+  /* For the moment this action has no cost, but in the future we could take in account access latency of the disk */
+  /*surf_action_t action = storage_action_execute(storage,0, LS);*/
+
+  xbt_dict_t content_dict = xbt_dict_new_homogeneous(NULL);
+  xbt_dict_cursor_t cursor = NULL;
+  char *file;
+  sg_size_t *psize;
+
+  xbt_dict_foreach(p_content, cursor, file, psize){
+    xbt_dict_set(content_dict,file,psize,NULL);
+  }
+  return content_dict;
+}
+
+sg_size_t Storage::getSize(){
+  return m_size;
+}
+
+/**********
+ * Action *
+ **********/
+StorageAction::StorageAction(ModelPtr model, double cost, bool failed,
+                                    StoragePtr storage, e_surf_action_storage_type_t type)
+: Action(model, cost, failed)
+, m_type(type), p_storage(storage), p_file(NULL), p_lsDict(NULL)
+{
+};
+
+StorageAction::StorageAction(ModelPtr model, double cost, bool failed, lmm_variable_t var,
+                                    StoragePtr storage, e_surf_action_storage_type_t type)
+  : Action(model, cost, failed, var)
+  , m_type(type), p_storage(storage), p_file(NULL), p_lsDict(NULL) {
+}
+
+void StorageAction::setState(e_surf_action_state_t state){
+  Action::setState(state);
+  surf_callback_emit(storageActionStateChangedCallbacks, this);
+}
diff --git a/src/surf/storage_interface.hpp b/src/surf/storage_interface.hpp
new file mode 100644 (file)
index 0000000..23c82b4
--- /dev/null
@@ -0,0 +1,327 @@
+/* Copyright (c) 2004-2014. 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 "surf_interface.hpp"
+
+#ifndef STORAGE_INTERFACE_HPP_
+#define STORAGE_INTERFACE_HPP_
+
+extern xbt_dynar_t mount_list;
+
+/***********
+ * Classes *
+ ***********/
+
+class StorageModel;
+typedef StorageModel *StorageModelPtr;
+
+class Storage;
+typedef Storage *StoragePtr;
+
+class Storage;
+typedef Storage *StoragePtr;
+
+class StorageAction;
+typedef StorageAction *StorageActionPtr;
+
+class StorageAction;
+typedef StorageAction *StorageActionPtr;
+
+/*************
+ * Callbacks *
+ *************/
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after Storage creation *
+ * @details Callback functions have the following signature: `void(StoragePtr)`
+ */
+extern surf_callback(void, StoragePtr) storageCreatedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after Storage destruction *
+ * @details Callback functions have the following signature: `void(StoragePtr)`
+ */
+extern surf_callback(void, StoragePtr) storageDestructedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after Storage State changed *
+ * @details Callback functions have the following signature: `void(StorageActionPtr)`
+ */
+extern surf_callback(void, StoragePtr) storageStateChangedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after StorageAction State changed *
+ * @details Callback functions have the following signature: `void(StorageActionPtr)`
+ */
+extern surf_callback(void, StorageActionPtr) storageActionStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+/** @ingroup SURF_storage_interface
+ * @brief SURF storage model interface class
+ * @details A model is an object which handle the interactions between its Resources and its Actions
+ */
+class StorageModel : public Model {
+public:
+  /**
+   * @brief The storage model constructor
+   */
+  StorageModel();
+
+  /**
+   * @brief The Storange model destructor
+   */
+  ~StorageModel();
+
+  /**
+   * @brief Create a Storage
+   * 
+   * @param id [description]
+   * @param type_id [description]
+   * @param content_name [description]
+   * @param content_type [description]
+   * @param properties [description]
+   * @return The created Storage
+   */
+  virtual StoragePtr createResource(const char* id, const char* type_id,
+                  const char* content_name, const char* content_type, xbt_dict_t properties)=0;
+
+  xbt_dynar_t p_storageList;
+};
+
+/************
+ * Resource *
+ ************/
+/** @ingroup SURF_storage_interface
+ * @brief SURF storage interface class
+ * @details A Storage represent a storage unit (e.g.: hard drive, usb key)
+ */
+class Storage : public Resource {
+public:
+  /**
+   * @brief Storage constructor
+   * 
+   * @param model StorageModel associated to this Storage
+   * @param name The name of the Storage
+   * @param props Dictionary of properties associated to this Storage
+   * @param type_id [description]
+   * @param content_name [description]
+   * @param content_type [description]
+   * @param size [description]
+   */
+  Storage(ModelPtr model, const char *name, xbt_dict_t props,
+          const char* type_id, char *content_name, char *content_type,
+          sg_size_t size);
+
+  /**
+   * @brief Storage constructor
+   * 
+   * @param model StorageModel associated to this Storage
+   * @param name The name of the Storage
+   * @param props Dictionary of properties associated to this Storage
+   * @param maxminSystem [description]
+   * @param bread [description]
+   * @param bwrite [description]
+   * @param bconnection [description]
+   * @param type_id [description]
+   * @param content_name [description]
+   * @param content_type [description]
+   * @param size [description]
+   */
+  Storage(ModelPtr model, const char *name, xbt_dict_t props,
+          lmm_system_t maxminSystem, double bread, double bwrite,
+          double bconnection,
+          const char* type_id, char *content_name, char *content_type,
+          sg_size_t size);
+
+  /**
+   * @brief Storage destructor
+   */
+  ~Storage();
+
+  /**
+   * @brief Check if the Storage is used
+   * 
+   * @return true if the current Storage is used, false otherwise
+   */
+  bool isUsed();
+
+  /**
+   * @brief Update the state of the current Storage
+   * 
+   * @param event_type [description]
+   * @param value [description]
+   * @param date [description]
+   */
+  void updateState(tmgr_trace_event_t event_type, double value, double date);
+
+  void setState(e_surf_resource_state_t state);
+
+  xbt_dict_t p_content;
+  char* p_contentType;
+  sg_size_t m_size;
+  sg_size_t m_usedSize;
+  char * p_typeId;
+
+  /**
+   * @brief Open a file
+   * 
+   * @param mount The mount point
+   * @param path The path to the file
+   * 
+   * @return The StorageAction corresponding to the opening
+   */
+  virtual StorageActionPtr open(const char* mount, const char* path)=0;
+
+  /**
+   * @brief Close a file
+   * 
+   * @param fd The file descriptor to close
+   * @return The StorageAction corresponding to the closing
+   */
+  virtual StorageActionPtr close(surf_file_t fd)=0;
+
+  /**
+   * @brief List directory contents of a path
+   * @details [long description]
+   * 
+   * @param path The path to the directory
+   * @return The StorageAction corresponding to the ls action
+   */
+  virtual StorageActionPtr ls(const char *path)=0;
+
+  /**
+   * @brief Read a file
+   * 
+   * @param fd The file descriptor to read
+   * @param size The size in bytes to read
+   * @return The StorageAction corresponding to the reading
+   */
+  virtual StorageActionPtr read(surf_file_t fd, sg_size_t size)=0;
+
+  /**
+   * @brief Write a file
+   * 
+   * @param fd The file descriptor to write
+   * @param size The size in bytes to write
+   * @return The StorageAction corresponding to the writing
+   */
+  virtual StorageActionPtr write(surf_file_t fd, sg_size_t size)=0;
+
+  /**
+   * @brief Rename a path
+   * 
+   * @param src The old path
+   * @param dest The new path
+   */
+  virtual void rename(const char *src, const char *dest)=0;
+
+  /**
+   * @brief Get the content of the current Storage
+   * 
+   * @return A xbt_dict_t with path as keys and size in bytes as values
+   */
+  virtual xbt_dict_t getContent();
+
+  /**
+   * @brief Get the size in bytes of the current Storage
+   * 
+   * @return The size in bytes of the current Storage
+   */
+  virtual sg_size_t getSize();
+
+  xbt_dict_t parseContent(char *filename);
+
+  xbt_dynar_t p_writeActions;
+
+  lmm_constraint_t p_constraintWrite;    /* Constraint for maximum write bandwidth*/
+  lmm_constraint_t p_constraintRead;     /* Constraint for maximum write bandwidth*/
+};
+
+/**********
+ * Action *
+ **********/
+
+/** @ingroup SURF_storage_interface
+ * @brief The possible type of action for the storage component
+ */
+typedef enum {
+  READ=0, /**< Read a file */
+  WRITE,  /**< Write in a file */
+  STAT,   /**< Stat a file */
+  OPEN,   /**< Open a file */
+  CLOSE,  /**< Close a file */
+  LS      /**< List directory contents */
+} e_surf_action_storage_type_t;
+
+/** @ingroup SURF_storage_interface
+ * @brief SURF storage action interface class
+ */
+class StorageAction : public Action {
+public:
+  /**
+   * @brief StorageAction constructor
+   */
+  StorageAction() : m_type(READ) {};//FIXME:REMOVE
+
+  /**
+   * @brief StorageAction constructor
+   * 
+   * @param model The StorageModel associated to this StorageAction
+   * @param cost The cost of this  NetworkAction in [TODO]
+   * @param failed [description]
+   * @param storage The Storage associated to this StorageAction
+   * @param type [description]
+   */
+  StorageAction(ModelPtr model, double cost, bool failed,
+                           StoragePtr storage, e_surf_action_storage_type_t type);
+
+    /**
+   * @brief StorageAction constructor
+   * 
+   * @param model The StorageModel associated to this StorageAction
+   * @param cost The cost of this  StorageAction in [TODO]
+   * @param failed [description]
+   * @param var The lmm variable associated to this StorageAction if it is part of a LMM component
+   * @param storage The Storage associated to this StorageAction
+   * @param type [description]
+   */
+  StorageAction(ModelPtr model, double cost, bool failed, lmm_variable_t var,
+                           StoragePtr storage, e_surf_action_storage_type_t type);
+
+  void setState(e_surf_action_state_t state);
+
+  e_surf_action_storage_type_t m_type;
+  StoragePtr p_storage;
+  surf_file_t p_file;
+  xbt_dict_t p_lsDict;
+};
+
+typedef struct s_storage_type {
+  char *model;
+  char *content;
+  char *content_type;
+  char *type_id;
+  xbt_dict_t properties;
+  xbt_dict_t model_properties;
+  sg_size_t size;
+} s_storage_type_t, *storage_type_t;
+
+typedef struct s_mount {
+  void *storage;
+  char *name;
+} s_mount_t, *mount_t;
+
+typedef struct surf_file {
+  char *name;
+  char *mount;
+  sg_size_t size;
+  sg_size_t current_position;
+} s_surf_file_t;
+
+
+#endif /* STORAGE_INTERFACE_HPP_ */
diff --git a/src/surf/storage_n11.cpp b/src/surf/storage_n11.cpp
new file mode 100644 (file)
index 0000000..4e07fe5
--- /dev/null
@@ -0,0 +1,606 @@
+/* Copyright (c) 2013-2014. 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 "storage_n11.hpp"
+#include "surf_private.h"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_storage);
+
+static int storage_selective_update = 0;
+static xbt_swag_t storage_running_action_set_that_does_not_need_being_checked = NULL;
+
+/*************
+ * CallBacks *
+ *************/
+
+static XBT_INLINE void routing_storage_type_free(void *r)
+{
+  storage_type_t stype = (storage_type_t) r;
+  free(stype->model);
+  free(stype->type_id);
+  free(stype->content);
+  free(stype->content_type);
+  xbt_dict_free(&(stype->properties));
+  xbt_dict_free(&(stype->model_properties));
+  free(stype);
+}
+
+static XBT_INLINE void surf_storage_resource_free(void *r)
+{
+  // specific to storage
+  StoragePtr storage = static_cast<StoragePtr>(r);
+  // generic resource
+  delete storage;
+}
+
+static XBT_INLINE void routing_storage_host_free(void *r)
+{
+  xbt_dynar_t dyn = (xbt_dynar_t) r;
+  xbt_dynar_free(&dyn);
+}
+
+static void parse_storage_init(sg_platf_storage_cbarg_t storage)
+{
+  void* stype = xbt_lib_get_or_null(storage_type_lib,
+                                    storage->type_id,
+                                    ROUTING_STORAGE_TYPE_LEVEL);
+  if(!stype) xbt_die("No storage type '%s'",storage->type_id);
+
+  // if storage content is not specified use the content of storage_type if exist
+  if(!strcmp(storage->content,"") && strcmp(((storage_type_t) stype)->content,"")){
+    storage->content = ((storage_type_t) stype)->content;
+    storage->content_type = ((storage_type_t) stype)->content_type;
+    XBT_DEBUG("For disk '%s' content is empty, inherit the content (of type %s) from storage type '%s' ",
+        storage->id,((storage_type_t) stype)->content_type,
+        ((storage_type_t) stype)->type_id);
+  }
+
+  XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s' "
+      "\n\t\tmodel '%s' \n\t\tcontent '%s'\n\t\tcontent_type '%s' "
+      "\n\t\tproperties '%p''\n",
+      storage->id,
+      ((storage_type_t) stype)->model,
+      ((storage_type_t) stype)->type_id,
+      storage->content,
+      storage->content_type,
+      storage->properties);
+
+  surf_storage_model->createResource(storage->id,
+                                     ((storage_type_t) stype)->type_id,
+                                     storage->content,
+                                     storage->content_type,
+                                     storage->properties);
+}
+
+static void parse_mstorage_init(sg_platf_mstorage_cbarg_t /*mstorage*/)
+{
+  XBT_DEBUG("parse_mstorage_init");
+}
+
+static void parse_storage_type_init(sg_platf_storage_type_cbarg_t /*storagetype_*/)
+{
+  XBT_DEBUG("parse_storage_type_init");
+}
+
+static void parse_mount_init(sg_platf_mount_cbarg_t /*mount*/)
+{
+  XBT_DEBUG("parse_mount_init");
+}
+
+static void storage_parse_storage(sg_platf_storage_cbarg_t storage)
+{
+  xbt_assert(!xbt_lib_get_or_null(storage_lib, storage->id,ROUTING_STORAGE_LEVEL),
+               "Reading a storage, processing unit \"%s\" already exists", storage->id);
+
+  // Verification of an existing type_id
+#ifndef NDEBUG
+  void* storage_type = xbt_lib_get_or_null(storage_type_lib, storage->type_id,ROUTING_STORAGE_TYPE_LEVEL);
+#endif
+  xbt_assert(storage_type,"Reading a storage, type id \"%s\" does not exists", storage->type_id);
+
+  XBT_DEBUG("ROUTING Create a storage name '%s' with type_id '%s' and content '%s'",
+      storage->id,
+      storage->type_id,
+      storage->content);
+
+  xbt_lib_set(storage_lib,
+      storage->id,
+      ROUTING_STORAGE_LEVEL,
+      (void *) xbt_strdup(storage->type_id));
+}
+
+static void storage_parse_storage_type(sg_platf_storage_type_cbarg_t storage_type)
+{
+  xbt_assert(!xbt_lib_get_or_null(storage_type_lib, storage_type->id,ROUTING_STORAGE_TYPE_LEVEL),
+               "Reading a storage type, processing unit \"%s\" already exists", storage_type->id);
+
+  storage_type_t stype = xbt_new0(s_storage_type_t, 1);
+  stype->model = xbt_strdup(storage_type->model);
+  stype->properties = storage_type->properties;
+  stype->content = xbt_strdup(storage_type->content);
+  stype->content_type = xbt_strdup(storage_type->content_type);
+  stype->type_id = xbt_strdup(storage_type->id);
+  stype->size = storage_type->size;
+  stype->model_properties = storage_type->model_properties;
+
+  XBT_DEBUG("ROUTING Create a storage type id '%s' with model '%s', "
+      "content '%s', and content_type '%s'",
+      stype->type_id,
+      stype->model,
+      storage_type->content,
+      storage_type->content_type);
+
+  xbt_lib_set(storage_type_lib,
+      stype->type_id,
+      ROUTING_STORAGE_TYPE_LEVEL,
+      (void *) stype);
+}
+
+static void storage_parse_mstorage(sg_platf_mstorage_cbarg_t /*mstorage*/)
+{
+  THROW_UNIMPLEMENTED;
+//  mount_t mnt = xbt_new0(s_mount_t, 1);
+//  mnt->id = xbt_strdup(mstorage->type_id);
+//  mnt->name = xbt_strdup(mstorage->name);
+//
+//  if(!mount_list){
+//    XBT_DEBUG("Creata a Mount list for %s",A_surfxml_host_id);
+//    mount_list = xbt_dynar_new(sizeof(char *), NULL);
+//  }
+//  xbt_dynar_push(mount_list,(void *) mnt);
+//  free(mnt->id);
+//  free(mnt->name);
+//  xbt_free(mnt);
+//  XBT_DEBUG("ROUTING Mount a storage name '%s' with type_id '%s'",mstorage->name, mstorage->id);
+}
+
+static void mount_free(void *p)
+{
+  mount_t mnt = (mount_t) p;
+  xbt_free(mnt->name);
+}
+
+static void storage_parse_mount(sg_platf_mount_cbarg_t mount)
+{
+  // Verification of an existing storage
+#ifndef NDEBUG
+  void* storage = xbt_lib_get_or_null(storage_lib, mount->storageId, ROUTING_STORAGE_LEVEL);
+#endif
+  xbt_assert(storage,"Disk id \"%s\" does not exists", mount->storageId);
+
+  XBT_DEBUG("ROUTING Mount '%s' on '%s'",mount->storageId, mount->name);
+
+  s_mount_t mnt;
+  mnt.storage = surf_storage_resource_priv(surf_storage_resource_by_name(mount->storageId));
+  mnt.name = xbt_strdup(mount->name);
+
+  if(!mount_list){
+    XBT_DEBUG("Create a Mount list for %s",A_surfxml_host_id);
+    mount_list = xbt_dynar_new(sizeof(s_mount_t), mount_free);
+  }
+  xbt_dynar_push(mount_list, &mnt);
+}
+
+static void storage_define_callbacks()
+{
+  sg_platf_storage_add_cb(parse_storage_init);
+  sg_platf_storage_type_add_cb(parse_storage_type_init);
+  sg_platf_mstorage_add_cb(parse_mstorage_init);
+  sg_platf_mount_add_cb(parse_mount_init);
+}
+
+void storage_register_callbacks() {
+
+  ROUTING_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,xbt_free);
+  ROUTING_STORAGE_HOST_LEVEL = xbt_lib_add_level(storage_lib, routing_storage_host_free);
+  ROUTING_STORAGE_TYPE_LEVEL = xbt_lib_add_level(storage_type_lib, routing_storage_type_free);
+  SURF_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, surf_storage_resource_free);
+
+  sg_platf_storage_add_cb(storage_parse_storage);
+  sg_platf_mstorage_add_cb(storage_parse_mstorage);
+  sg_platf_storage_type_add_cb(storage_parse_storage_type);
+  sg_platf_mount_add_cb(storage_parse_mount);
+}
+
+/*********
+ * Model *
+ *********/
+
+void surf_storage_model_init_default(void)
+{
+  surf_storage_model = new StorageN11Model();
+  storage_define_callbacks();
+  xbt_dynar_push(model_list, &surf_storage_model);
+}
+
+StorageN11Model::StorageN11Model() : StorageModel() {
+  ActionPtr action = NULL;
+
+  XBT_DEBUG("surf_storage_model_init_internal");
+
+  storage_running_action_set_that_does_not_need_being_checked =
+      xbt_swag_new(xbt_swag_offset(*action, p_stateHookup));
+  if (!p_maxminSystem) {
+    p_maxminSystem = lmm_system_new(storage_selective_update);
+  }
+}
+
+StorageN11Model::~StorageN11Model(){
+  xbt_swag_free(storage_running_action_set_that_does_not_need_being_checked);
+  storage_running_action_set_that_does_not_need_being_checked = NULL;
+}
+
+StoragePtr StorageN11Model::createResource(const char* id, const char* type_id,
+               const char* content_name, const char* content_type, xbt_dict_t properties)
+{
+
+  xbt_assert(!surf_storage_resource_priv(surf_storage_resource_by_name(id)),
+              "Storage '%s' declared several times in the platform file",
+              id);
+
+  storage_type_t storage_type = (storage_type_t) xbt_lib_get_or_null(storage_type_lib, type_id,ROUTING_STORAGE_TYPE_LEVEL);
+
+  double Bread  = surf_parse_get_bandwidth((char*)xbt_dict_get(storage_type->model_properties, "Bread"));
+  double Bwrite = surf_parse_get_bandwidth((char*)xbt_dict_get(storage_type->model_properties, "Bwrite"));
+  double Bconnection   = surf_parse_get_bandwidth((char*)xbt_dict_get(storage_type->model_properties, "Bconnection"));
+
+  StoragePtr storage = new StorageN11(this, id, properties, p_maxminSystem,
+                 Bread, Bwrite, Bconnection,
+                 type_id, (char *)content_name, xbt_strdup(content_type), storage_type->size);
+
+  xbt_lib_set(storage_lib, id, SURF_STORAGE_LEVEL, static_cast<ResourcePtr>(storage));
+
+  XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s'\n\t\tproperties '%p'\n\t\tBread '%f'\n",
+      id,
+      type_id,
+      properties,
+      Bread);
+
+  if(!p_storageList)
+       p_storageList = xbt_dynar_new(sizeof(char *),NULL);
+  xbt_dynar_push(p_storageList, &storage);
+
+  return storage;
+}
+
+double StorageN11Model::shareResources(double now)
+{
+  XBT_DEBUG("storage_share_resources %f", now);
+  unsigned int i, j;
+  StoragePtr storage;
+  void *_write_action;
+  StorageActionPtr write_action;
+
+  double min_completion = shareResourcesMaxMin(getRunningActionSet(),
+      p_maxminSystem, lmm_solve);
+
+  double rate;
+  // Foreach disk
+  xbt_dynar_foreach(p_storageList,i,storage)
+  {
+    rate = 0;
+    // Foreach write action on disk
+    xbt_dynar_foreach(storage->p_writeActions, j, _write_action)
+    {
+      write_action = static_cast<StorageActionPtr>(_write_action);
+      rate += lmm_variable_getvalue(write_action->getVariable());
+    }
+    if(rate > 0)
+      min_completion = MIN(min_completion, (storage->m_size-storage->m_usedSize)/rate);
+  }
+
+  return min_completion;
+}
+
+void StorageN11Model::updateActionsState(double /*now*/, double delta)
+{
+  StorageActionPtr action = NULL;
+
+  ActionListPtr actionSet = getRunningActionSet();
+  for(ActionList::iterator it(actionSet->begin()), itNext=it, itend(actionSet->end())
+     ; it != itend ; it=itNext) {
+    ++itNext;
+    action = static_cast<StorageActionPtr>(&*it);
+    if(action->m_type == WRITE)
+    {
+      // Update the disk usage
+     // Update the file size
+     // For each action of type write
+      double rate = lmm_variable_getvalue(action->getVariable());
+      /* Hack to avoid rounding differences between x86 and x86_64
+       * (note that the next sizes are of type sg_size_t). */
+      long incr = delta * rate + MAXMIN_PRECISION;
+      action->p_storage->m_usedSize += incr; // disk usage
+      action->p_file->size += incr; // file size
+
+      sg_size_t *psize = xbt_new(sg_size_t,1);
+      *psize = action->p_file->size;
+      xbt_dict_t content_dict = action->p_storage->p_content;
+      xbt_dict_set(content_dict, action->p_file->name, psize, NULL);
+    }
+
+    action->updateRemains(lmm_variable_getvalue(action->getVariable()) * delta);
+
+    if (action->getMaxDuration() != NO_MAX_DURATION)
+      action->updateMaxDuration(delta);
+
+    if(action->getRemainsNoUpdate() > 0 &&
+        lmm_get_variable_weight(action->getVariable()) > 0 &&
+        action->p_storage->m_usedSize == action->p_storage->m_size)
+    {
+      action->finish();
+      action->setState(SURF_ACTION_FAILED);
+    } else if ((action->getRemainsNoUpdate() <= 0) &&
+        (lmm_get_variable_weight(action->getVariable()) > 0))
+    {
+      action->finish();
+      action->setState(SURF_ACTION_DONE);
+    } else if ((action->getMaxDuration() != NO_MAX_DURATION) &&
+               (action->getMaxDuration() <= 0))
+    {
+      action->finish();
+      action->setState(SURF_ACTION_DONE);
+    }
+  }
+  return;
+}
+
+/************
+ * Resource *
+ ************/
+
+StorageN11::StorageN11(StorageModelPtr model, const char* name, xbt_dict_t properties,
+            lmm_system_t maxminSystem, double bread, double bwrite, double bconnection,
+            const char* type_id, char *content_name, char *content_type, sg_size_t size)
+ : Storage(model, name, properties,
+          maxminSystem, bread, bwrite, bconnection, type_id, content_name, content_type, size) {
+  XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%llu'", bconnection, bread, bwrite, size);
+}
+
+StorageActionPtr StorageN11::ls(const char* path)
+{
+  StorageActionPtr action = new StorageN11Action(getModel(), 0, getState() != SURF_RESOURCE_ON, this, LS);
+
+  action->p_lsDict = NULL;
+  xbt_dict_t ls_dict = xbt_dict_new_homogeneous(xbt_free);
+
+  char* key;
+  sg_size_t size = 0;
+  xbt_dict_cursor_t cursor = NULL;
+
+  xbt_dynar_t dyn = NULL;
+  char* file = NULL;
+
+  // for each file in the storage content
+  xbt_dict_foreach(p_content,cursor,key,size){
+    // Search if file start with the prefix 'path'
+    if(xbt_str_start_with(key,path)){
+      file = &key[strlen(path)];
+
+      // Split file with '/'
+      dyn = xbt_str_split(file,"/");
+      file = xbt_dynar_get_as(dyn,0,char*);
+
+      // file
+      if(xbt_dynar_length(dyn) == 1){
+        sg_size_t *psize = xbt_new(sg_size_t, 1);
+        *psize=size;
+        xbt_dict_set(ls_dict, file, psize, NULL);
+      }
+      // Directory
+      else
+      {
+        // if directory does not exist yet in the dictionary
+        if(!xbt_dict_get_or_null(ls_dict,file))
+          xbt_dict_set(ls_dict,file,NULL,NULL);
+      }
+      xbt_dynar_free(&dyn);
+    }
+  }
+
+  action->p_lsDict = ls_dict;
+  return action;
+}
+
+StorageActionPtr StorageN11::open(const char* mount, const char* path)
+{
+  XBT_DEBUG("\tOpen file '%s'",path);
+  sg_size_t size, *psize;
+  psize = (sg_size_t*) xbt_dict_get_or_null(p_content, path);
+  // if file does not exist create an empty file
+  if(psize)
+    size = *psize;
+  else {
+       psize = xbt_new(sg_size_t,1);
+    size = 0;
+    *psize = size;
+    xbt_dict_set(p_content, path, psize, NULL);
+    XBT_DEBUG("File '%s' was not found, file created.",path);
+  }
+  surf_file_t file = xbt_new0(s_surf_file_t,1);
+  file->name = xbt_strdup(path);
+  file->size = size;
+  file->mount = xbt_strdup(mount);
+  file->current_position = 0;
+
+  StorageActionPtr action = new StorageN11Action(getModel(), 0, getState() != SURF_RESOURCE_ON, this, OPEN);
+  action->p_file = file;
+  return action;
+}
+
+StorageActionPtr StorageN11::close(surf_file_t fd)
+{
+  char *filename = fd->name;
+  XBT_DEBUG("\tClose file '%s' size '%llu'", filename, fd->size);
+  // unref write actions from storage
+  void *_write_action;
+  StorageActionPtr write_action;
+  unsigned int i;
+  xbt_dynar_foreach(p_writeActions, i, _write_action) {
+       write_action = static_cast<StorageActionPtr>(static_cast<ActionPtr>(_write_action));
+    if ((write_action->p_file) == fd) {
+      xbt_dynar_cursor_rm(p_writeActions, &i);
+      write_action->unref();
+    }
+  }
+  free(fd->name);
+  free(fd->mount);
+  xbt_free(fd);
+  StorageActionPtr action = new StorageN11Action(getModel(), 0, getState() != SURF_RESOURCE_ON, this, CLOSE);
+  return action;
+}
+
+StorageActionPtr StorageN11::read(surf_file_t fd, sg_size_t size)
+{
+  if(size > fd->size){
+    size = fd->size;
+    fd->current_position = fd->size;
+  }
+  else
+       fd->current_position += size;
+
+  StorageActionPtr action = new StorageN11Action(getModel(), size, getState() != SURF_RESOURCE_ON, this, READ);
+  return action;
+}
+
+StorageActionPtr StorageN11::write(surf_file_t fd, sg_size_t size)
+{
+  char *filename = fd->name;
+  XBT_DEBUG("\tWrite file '%s' size '%llu/%llu'",filename,size,fd->size);
+
+  StorageActionPtr action = new StorageN11Action(getModel(), size, getState() != SURF_RESOURCE_ON, this, WRITE);
+  action->p_file = fd;
+  fd->current_position += size;
+  // If the storage is full
+  if(m_usedSize==m_size) {
+    action->setState(SURF_ACTION_FAILED);
+  }
+  return action;
+}
+
+void StorageN11::rename(const char *src, const char *dest)
+{
+  sg_size_t *psize, *new_psize;
+  psize = (sg_size_t*) xbt_dict_get_or_null(p_content,src);
+  new_psize = xbt_new(sg_size_t, 1);
+  *new_psize = *psize;
+  if (psize){// src file exists
+    xbt_dict_remove(p_content, src);
+    xbt_dict_set(p_content, dest, new_psize,NULL);
+    XBT_DEBUG("Change file name from %s to %s, size '%llu'",src, dest, *psize);
+  }
+  else
+    XBT_DEBUG("File %s doesn't exist",src);
+}
+
+xbt_dict_t StorageN11::getContent()
+{
+  /* For the moment this action has no cost, but in the future we could take in account access latency of the disk */
+  /*surf_action_t action = storage_action_execute(storage,0, LS);*/
+
+  xbt_dict_t content_dict = xbt_dict_new_homogeneous(NULL);
+  xbt_dict_cursor_t cursor = NULL;
+  char *file;
+  sg_size_t *psize;
+
+  xbt_dict_foreach(p_content, cursor, file, psize){
+    xbt_dict_set(content_dict,file,psize,NULL);
+  }
+  return content_dict;
+}
+
+sg_size_t StorageN11::getSize(){
+  return m_size;
+}
+
+/**********
+ * Action *
+ **********/
+
+StorageN11Action::StorageN11Action(ModelPtr model, double cost, bool failed, StoragePtr storage, e_surf_action_storage_type_t type)
+  : StorageAction(model, cost, failed,
+                     lmm_variable_new(model->getMaxminSystem(), this, 1.0, -1.0 , 3),
+                     storage, type) {
+  XBT_IN("(%s,%g", storage->getName(), cost);
+
+  // Must be less than the max bandwidth for all actions
+  lmm_expand(model->getMaxminSystem(), storage->getConstraint(), getVariable(), 1.0);
+  switch(type) {
+  case OPEN:
+  case CLOSE:
+  case STAT:
+  case LS:
+    break;
+  case READ:
+    lmm_expand(model->getMaxminSystem(), storage->p_constraintRead,
+                  getVariable(), 1.0);
+    break;
+  case WRITE:
+    lmm_expand(model->getMaxminSystem(), storage->p_constraintWrite,
+                  getVariable(), 1.0);
+    ActionPtr action = this;
+    xbt_dynar_push(storage->p_writeActions, &action);
+    ref();
+    break;
+  }
+  XBT_OUT();
+}
+
+int StorageN11Action::unref()
+{
+  m_refcount--;
+  if (!m_refcount) {
+       if (actionHook::is_linked())
+         p_stateSet->erase(p_stateSet->iterator_to(*this));
+    if (getVariable())
+      lmm_variable_free(getModel()->getMaxminSystem(), getVariable());
+#ifdef HAVE_TRACING
+    xbt_free(getCategory());
+#endif
+    delete this;
+    return 1;
+  }
+  return 0;
+}
+
+void StorageN11Action::cancel()
+{
+  setState(SURF_ACTION_FAILED);
+  return;
+}
+
+void StorageN11Action::suspend()
+{
+  XBT_IN("(%p)", this);
+  if (m_suspended != 2) {
+    lmm_update_variable_weight(getModel()->getMaxminSystem(),
+                               getVariable(),
+                               0.0);
+    m_suspended = 1;
+  }
+  XBT_OUT();
+}
+
+void StorageN11Action::resume()
+{
+  THROW_UNIMPLEMENTED;
+}
+
+bool StorageN11Action::isSuspended()
+{
+  return m_suspended == 1;
+}
+
+void StorageN11Action::setMaxDuration(double /*duration*/)
+{
+  THROW_UNIMPLEMENTED;
+}
+
+void StorageN11Action::setPriority(double /*priority*/)
+{
+  THROW_UNIMPLEMENTED;
+}
+
diff --git a/src/surf/storage_n11.hpp b/src/surf/storage_n11.hpp
new file mode 100644 (file)
index 0000000..5582e96
--- /dev/null
@@ -0,0 +1,88 @@
+/* Copyright (c) 2013-2014. 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 "storage_interface.hpp"
+
+#ifndef STORAGE_N11_HPP_
+#define STORAGE_N11_HPP_
+
+/***********
+ * Classes *
+ ***********/
+
+class StorageN11Model;
+typedef StorageN11Model *StorageN11ModelPtr;
+
+class StorageN11;
+typedef StorageN11 *StorageN11Ptr;
+
+class StorageN11;
+typedef StorageN11 *StorageN11Ptr;
+
+class StorageN11Action;
+typedef StorageN11Action *StorageN11ActionPtr;
+
+class StorageN11Action;
+typedef StorageN11Action *StorageN11ActionPtr;
+
+
+/*********
+ * Model *
+ *********/
+
+class StorageN11Model : public StorageModel {
+public:
+  StorageN11Model();
+  ~StorageN11Model();
+  StoragePtr createResource(const char* id, const char* type_id,
+                  const char* content_name, const char* content_type, xbt_dict_t properties);
+  double shareResources(double now);
+  void updateActionsState(double now, double delta);
+};
+
+/************
+ * Resource *
+ ************/
+
+class StorageN11 : public Storage {
+public:
+  StorageN11(StorageModelPtr model, const char* name, xbt_dict_t properties,
+                    lmm_system_t maxminSystem, double bread, double bwrite, double bconnection,
+                    const char* type_id, char *content_name, char *content_type, sg_size_t size);
+
+  StorageActionPtr open(const char* mount, const char* path);
+  StorageActionPtr close(surf_file_t fd);
+  StorageActionPtr ls(const char *path);
+  xbt_dict_t getContent();
+  sg_size_t getSize();
+  StorageActionPtr read(surf_file_t fd, sg_size_t size);//FIXME:why we have a useless param ptr ??
+  StorageActionPtr write(surf_file_t fd, sg_size_t size);//FIXME:why we have a useless param ptr ??
+  void rename(const char *src, const char *dest);
+
+  lmm_constraint_t p_constraintWrite;    /* Constraint for maximum write bandwidth*/
+  lmm_constraint_t p_constraintRead;     /* Constraint for maximum write bandwidth*/
+};
+
+/**********
+ * Action *
+ **********/
+
+class StorageN11Action : public StorageAction {
+public:
+       StorageN11Action() {}; //FIXME:REMOVE
+  StorageN11Action(ModelPtr model, double cost, bool failed, StoragePtr storage, e_surf_action_storage_type_t type);
+  void suspend();
+  int unref();
+  void cancel();
+  //FIXME:??void recycle();
+  void resume();
+  bool isSuspended();
+  void setMaxDuration(double duration);
+  void setPriority(double priority);
+
+};
+
+#endif /* STORAGE_N11_HPP_ */
diff --git a/src/surf/storage_private.h b/src/surf/storage_private.h
deleted file mode 100644 (file)
index ee023b4..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Copyright (c) 2009, 2012-2013. 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 STORAGE_PRIVATE_H_
-#define STORAGE_PRIVATE_H_
-
-typedef struct s_storage_type {
-  char *model;
-  char *content;
-  char *content_type;
-  char *type_id;
-  xbt_dict_t properties;
-  sg_storage_size_t size;
-} s_storage_type_t, *storage_type_t;
-
-typedef struct s_mount {
-  void *storage;
-  char *name;
-} s_mount_t, *mount_t;
-
-typedef struct surf_file {
-  char *name;
-  char *mount;
-  sg_storage_size_t size;
-} s_surf_file_t;
-
-typedef struct surf_storage {
-  s_surf_resource_t generic_resource;   /*< Structure with generic data. Needed at begin to interact with SURF */
-  e_surf_resource_state_t state_current;        /*< STORAGE current state (ON or OFF) */
-  lmm_constraint_t constraint;          /* Constraint for maximum bandwidth from connection */
-  lmm_constraint_t constraint_write;    /* Constraint for maximum write bandwidth*/
-  lmm_constraint_t constraint_read;     /* Constraint for maximum write bandwidth*/
-  xbt_dict_t content;
-  char* content_type;
-  sg_storage_size_t size;
-  sg_storage_size_t used_size;
-  char *type_id;
-  xbt_dynar_t write_actions;
-  xbt_dict_t properties;
-} s_storage_t, *storage_t;
-
-typedef enum {
-  READ=0, WRITE, STAT, OPEN, CLOSE, LS
-} e_surf_action_storage_type_t;
-
-typedef struct surf_action_storage {
-  s_surf_action_lmm_t generic_lmm_action;
-  e_surf_action_storage_type_t type;
-  void *storage;
-} s_surf_action_storage_t, *surf_action_storage_t;
-
-#endif /* STORAGE_PRIVATE_H_ */
diff --git a/src/surf/surf.c b/src/surf/surf.c
deleted file mode 100644 (file)
index 807bfaf..0000000
+++ /dev/null
@@ -1,685 +0,0 @@
-/* Copyright (c) 2004-2013. 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 "surf_private.h"
-#include "xbt/module.h"
-#include "mc/mc.h"
-#include "simix/smx_host_private.h"
-#include "surf/surf_resource.h"
-#include "xbt/xbt_os_thread.h"
-#include "simgrid/sg_config.h"
-
-#include <ctype.h>
-
-XBT_LOG_NEW_CATEGORY(surf, "All SURF categories");
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_kernel, surf,
-                                "Logging specific to SURF (kernel)");
-
-/* Additional declarations for Windows portability. */
-
-#ifndef MAX_DRIVE
-#define MAX_DRIVE 26
-#endif
-
-#ifdef _XBT_WIN32
-#include <windows.h>
-static const char *disk_drives_letter_table[MAX_DRIVE] = {
-  "A:\\",
-  "B:\\",
-  "C:\\",
-  "D:\\",
-  "E:\\",
-  "F:\\",
-  "G:\\",
-  "H:\\",
-  "I:\\",
-  "J:\\",
-  "K:\\",
-  "L:\\",
-  "M:\\",
-  "N:\\",
-  "O:\\",
-  "P:\\",
-  "Q:\\",
-  "R:\\",
-  "S:\\",
-  "T:\\",
-  "U:\\",
-  "V:\\",
-  "W:\\",
-  "X:\\",
-  "Y:\\",
-  "Z:\\"
-};
-#endif                          /* #ifdef _XBT_WIN32 */
-
-/*
- * Returns the initial path. On Windows the initial path is
- * the current directory for the current process in the other
- * case the function returns "./" that represents the current
- * directory on Unix/Linux platforms.
- */
-
-const char *__surf_get_initial_path(void)
-{
-
-#ifdef _XBT_WIN32
-  unsigned i;
-  char current_directory[MAX_PATH + 1] = { 0 };
-  unsigned int len = GetCurrentDirectory(MAX_PATH + 1, current_directory);
-  char root[4] = { 0 };
-
-  if (!len)
-    return NULL;
-
-  strncpy(root, current_directory, 3);
-
-  for (i = 0; i < MAX_DRIVE; i++) {
-    if (toupper(root[0]) == disk_drives_letter_table[i][0])
-      return disk_drives_letter_table[i];
-  }
-
-  return NULL;
-#else
-  return "./";
-#endif
-}
-
-/* The __surf_is_absolute_file_path() returns 1 if
- * file_path is a absolute file path, in the other
- * case the function returns 0.
- */
-int __surf_is_absolute_file_path(const char *file_path)
-{
-#ifdef _XBT_WIN32
-  WIN32_FIND_DATA wfd = { 0 };
-  HANDLE hFile = FindFirstFile(file_path, &wfd);
-
-  if (INVALID_HANDLE_VALUE == hFile)
-    return 0;
-
-  FindClose(hFile);
-  return 1;
-#else
-  return (file_path[0] == '/');
-#endif
-}
-
-double NOW = 0;
-
-xbt_dynar_t model_list = NULL;
-tmgr_history_t history = NULL;
-lmm_system_t maxmin_system = NULL;
-xbt_dynar_t surf_path = NULL;
-xbt_dynar_t host_that_restart = NULL;
-xbt_dict_t watched_hosts_lib;
-
-/* Don't forget to update the option description in smx_config when you change this */
-s_surf_model_description_t surf_network_model_description[] = {
-  {"LV08",
-   "Realistic network analytic model (slow-start modeled by multiplying latency by 10.4, bandwidth by .92; bottleneck sharing uses a payload of S=8775 for evaluating RTT). ",
-   surf_network_model_init_LegrandVelho},
-  {"Constant",
-   "Simplistic network model where all communication take a constant time (one second). This model provides the lowest realism, but is (marginally) faster.",
-   surf_network_model_init_Constant},
-  {"SMPI",
-   "Realistic network model specifically tailored for HPC settings (accurate modeling of slow start with correction factors on three intervals: < 1KiB, < 64 KiB, >= 64 KiB)",
-   surf_network_model_init_SMPI},
-  {"CM02",
-   "Legacy network analytic model (Very similar to LV08, but without corrective factors. The timings of small messages are thus poorly modeled).",
-   surf_network_model_init_CM02},
-#ifdef HAVE_GTNETS
-  {"GTNets",
-   "Network pseudo-model using the GTNets simulator instead of an analytic model",
-   surf_network_model_init_GTNETS},
-#endif
-#ifdef HAVE_NS3
-  {"NS3",
-   "Network pseudo-model using the NS3 tcp model instead of an analytic model",
-  surf_network_model_init_NS3},
-#endif
-  {"Reno",
-   "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
-   surf_network_model_init_Reno},
-  {"Reno2",
-   "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
-   surf_network_model_init_Reno2},
-  {"Vegas",
-   "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
-   surf_network_model_init_Vegas},
-  {NULL, NULL, NULL}      /* this array must be NULL terminated */
-};
-
-s_surf_model_description_t surf_cpu_model_description[] = {
-  {"Cas01",
-   "Simplistic CPU model (time=size/power).",
-   surf_cpu_model_init_Cas01},
-  {NULL, NULL,  NULL}      /* this array must be NULL terminated */
-};
-
-s_surf_model_description_t surf_workstation_model_description[] = {
-  {"default",
-   "Default workstation model. Currently, CPU:Cas01 and network:LV08 (with cross traffic enabled)",
-   surf_workstation_model_init_current_default},
-  {"compound",
-   "Workstation model that is automatically chosen if you change the network and CPU models",
-   surf_workstation_model_init_compound},
-  {"ptask_L07", "Workstation model somehow similar to Cas01+CM02 but allowing parallel tasks",
-   surf_workstation_model_init_ptask_L07},
-  {NULL, NULL, NULL}      /* this array must be NULL terminated */
-};
-
-s_surf_model_description_t surf_optimization_mode_description[] = {
-  {"Lazy",
-   "Lazy action management (partial invalidation in lmm + heap in action remaining).",
-   NULL},
-  {"TI",
-   "Trace integration. Highly optimized mode when using availability traces (only available for the Cas01 CPU model for now).",
-    NULL},
-  {"Full",
-   "Full update of remaining and variables. Slow but may be useful when debugging.",
-   NULL},
-  {NULL, NULL, NULL}      /* this array must be NULL terminated */
-};
-
-s_surf_model_description_t surf_storage_model_description[] = {
-  {"default",
-   "Simplistic storage model.",
-   surf_storage_model_init_default},
-  {NULL, NULL,  NULL}      /* this array must be NULL terminated */
-};
-
-/* ********************************************************************* */
-/* TUTORIAL: New model                                                   */
-s_surf_model_description_t surf_new_model_description[] = {
-  {"default",
-   "Tutorial model.",
-   surf_new_model_init_default},
-  {NULL, NULL,  NULL}      /* this array must be NULL terminated */
-};
-/* ********************************************************************* */
-
-#ifdef CONTEXT_THREADS
-static xbt_parmap_t surf_parmap = NULL; /* parallel map on models */
-#endif
-
-static double *surf_mins = NULL; /* return value of share_resources for each model */
-static int surf_min_index;       /* current index in surf_mins */
-static double min;               /* duration determined by surf_solve */
-
-static void surf_share_resources(surf_model_t model);
-static void surf_update_actions_state(surf_model_t model);
-
-/** Displays the long description of all registered models, and quit */
-void model_help(const char *category, s_surf_model_description_t * table)
-{
-  int i;
-  printf("Long description of the %s models accepted by this simulator:\n",
-         category);
-  for (i = 0; table[i].name; i++)
-    printf("  %s: %s\n", table[i].name, table[i].description);
-}
-
-int find_model_description(s_surf_model_description_t * table,
-                           const char *name)
-{
-  int i;
-  char *name_list = NULL;
-
-  for (i = 0; table[i].name; i++)
-    if (!strcmp(name, table[i].name)) {
-      return i;
-    }
-  if (!table[0].name)
-    xbt_die("No model is valid! This is a bug.");
-  name_list = xbt_strdup(table[0].name);
-  for (i = 1; table[i].name; i++) {
-    name_list =
-        xbt_realloc(name_list,
-                    strlen(name_list) + strlen(table[i].name) + 3);
-    strcat(name_list, ", ");
-    strcat(name_list, table[i].name);
-  }
-  xbt_die("Model '%s' is invalid! Valid models are: %s.", name, name_list);
-  return -1;
-}
-
-double generic_maxmin_share_resources(xbt_swag_t running_actions,
-                                      size_t offset,
-                                      lmm_system_t sys,
-                                      void (*solve) (lmm_system_t))
-{
-  surf_action_t action = NULL;
-  double min = -1;
-  double value = -1;
-#define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + (offset))))
-
-  solve(sys);
-
-  xbt_swag_foreach(action, running_actions) {
-    value = lmm_variable_getvalue(VARIABLE(action));
-    if ((value > 0) || (action->max_duration >= 0))
-      break;
-  }
-
-  if (!action)
-    return -1.0;
-
-  if (value > 0) {
-    if (action->remains > 0)
-      min = action->remains / value;
-    else
-      min = 0.0;
-    if ((action->max_duration >= 0) && (action->max_duration < min))
-      min = action->max_duration;
-  } else
-    min = action->max_duration;
-
-
-  for (action = xbt_swag_getNext(action, running_actions->offset);
-       action;
-       action = xbt_swag_getNext(action, running_actions->offset)) {
-    value = lmm_variable_getvalue(VARIABLE(action));
-    if (value > 0) {
-      if (action->remains > 0)
-        value = action->remains / value;
-      else
-        value = 0.0;
-      if (value < min) {
-        min = value;
-        XBT_DEBUG("Updating min (value) with %p: %f", action, min);
-      }
-    }
-    if ((action->max_duration >= 0) && (action->max_duration < min)) {
-      min = action->max_duration;
-      XBT_DEBUG("Updating min (duration) with %p: %f", action, min);
-    }
-  }
-  XBT_DEBUG("min value : %f", min);
-
-#undef VARIABLE
-  return min;
-}
-
-double generic_share_resources_lazy(double now, surf_model_t model)
-{
-  surf_action_lmm_t action = NULL;
-  double min = -1;
-  double value;
-
-  XBT_DEBUG
-      ("Before share resources, the size of modified actions set is %d",
-       xbt_swag_size(model->model_private->modified_set));
-
-  lmm_solve(model->model_private->maxmin_system);
-
-  XBT_DEBUG
-      ("After share resources, The size of modified actions set is %d",
-       xbt_swag_size(model->model_private->modified_set));
-
-  while((action = xbt_swag_extract(model->model_private->modified_set))) {
-    int max_dur_flag = 0;
-
-    if (action->generic_action.state_set !=
-        model->states.running_action_set)
-      continue;
-
-    /* bogus priority, skip it */
-    if (action->generic_action.priority <= 0)
-      continue;
-
-    generic_update_action_remaining_lazy(action,now);
-
-    min = -1;
-    value = lmm_variable_getvalue(action->variable);
-    if (value > 0) {
-      if (action->generic_action.remains > 0) {
-        value = action->generic_action.remains / value;
-        min = now + value;
-      } else {
-        value = 0.0;
-        min = now;
-      }
-    }
-
-    if ((action->generic_action.max_duration != NO_MAX_DURATION)
-        && (min == -1
-            || action->generic_action.start +
-            action->generic_action.max_duration < min)) {
-      min = action->generic_action.start +
-          action->generic_action.max_duration;
-      max_dur_flag = 1;
-    }
-
-    XBT_DEBUG("Action(%p) Start %f Finish %f Max_duration %f", action,
-        action->generic_action.start, now + value,
-        action->generic_action.max_duration);
-
-    if (min != -1) {
-      surf_action_lmm_heap_remove(model->model_private->action_heap,action);
-      surf_action_lmm_heap_insert(model->model_private->action_heap,action, min, max_dur_flag ? MAX_DURATION : NORMAL);
-      XBT_DEBUG("Insert at heap action(%p) min %f now %f", action, min,
-                now);
-    } else DIE_IMPOSSIBLE;
-  }
-
-  //hereafter must have already the min value for this resource model
-  if (xbt_heap_size(model->model_private->action_heap) > 0)
-    min = xbt_heap_maxkey(model->model_private->action_heap) - now;
-  else
-    min = -1;
-
-  XBT_DEBUG("The minimum with the HEAP %f", min);
-
-  return min;
-}
-static XBT_INLINE void routing_asr_host_free(void *p)
-{
-  sg_routing_edge_t elm = p;
-  free(elm->name);
-  xbt_free(elm);
-}
-
-static XBT_INLINE void routing_asr_prop_free(void *p)
-{
-  xbt_dict_t elm = p;
-  xbt_dict_free(&elm);
-}
-
-void sg_version(int *ver_major,int *ver_minor,int *ver_patch) {
-  *ver_major = SIMGRID_VERSION_MAJOR;
-  *ver_minor = SIMGRID_VERSION_MINOR;
-  *ver_patch = SIMGRID_VERSION_PATCH;
-}
-
-void surf_init(int *argc, char **argv)
-{
-  XBT_DEBUG("Create all Libs");
-  host_lib = xbt_lib_new();
-  link_lib = xbt_lib_new();
-  as_router_lib = xbt_lib_new();
-  storage_lib = xbt_lib_new();
-  storage_type_lib = xbt_lib_new();
-  watched_hosts_lib = xbt_dict_new_homogeneous(NULL);
-
-  XBT_DEBUG("Add routing levels");
-  ROUTING_HOST_LEVEL = xbt_lib_add_level(host_lib,routing_asr_host_free);
-  ROUTING_ASR_LEVEL  = xbt_lib_add_level(as_router_lib,routing_asr_host_free);
-  ROUTING_PROP_ASR_LEVEL = xbt_lib_add_level(as_router_lib,routing_asr_prop_free);
-
-  XBT_DEBUG("Add SURF levels");
-  SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
-  SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
-  SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_resource_free);
-
-  xbt_init(argc, argv);
-  if (!model_list)
-    model_list = xbt_dynar_new(sizeof(surf_model_private_t), NULL);
-  if (!history)
-    history = tmgr_history_new();
-
-#ifdef HAVE_TRACING
-  TRACE_add_start_function(TRACE_surf_alloc);
-  TRACE_add_end_function(TRACE_surf_release);
-#endif
-
-  sg_config_init(argc, argv);
-
-  surf_action_init();
-  if (MC_is_active())
-    MC_memory_init();
-}
-
-#ifdef _XBT_WIN32
-# define FILE_DELIM "\\"
-#else
-# define FILE_DELIM "/"         /* FIXME: move to better location */
-#endif
-
-FILE *surf_fopen(const char *name, const char *mode)
-{
-  unsigned int cpt;
-  char *path_elm = NULL;
-  char *buff;
-  FILE *file = NULL;
-
-  xbt_assert(name);
-
-  if (__surf_is_absolute_file_path(name))       /* don't mess with absolute file names */
-    return fopen(name, mode);
-
-  /* search relative files in the path */
-  xbt_dynar_foreach(surf_path, cpt, path_elm) {
-    buff = bprintf("%s" FILE_DELIM "%s", path_elm, name);
-    file = fopen(buff, mode);
-    free(buff);
-
-    if (file)
-      return file;
-  }
-  return NULL;
-}
-
-void surf_exit(void)
-{
-  unsigned int iter;
-  surf_model_t model = NULL;
-
-#ifdef HAVE_TRACING
-  TRACE_end();                  /* Just in case it was not called by the upper
-                                 * layer (or there is no upper layer) */
-#endif
-
-  sg_config_finalize();
-
-  xbt_dynar_foreach(model_list, iter, model)
-      model->model_private->finalize();
-  xbt_dynar_free(&model_list);
-  routing_exit();
-
-  if (maxmin_system) {
-    lmm_system_free(maxmin_system);
-    maxmin_system = NULL;
-  }
-  if (history) {
-    tmgr_history_free(history);
-    history = NULL;
-  }
-  surf_action_exit();
-
-#ifdef CONTEXT_THREADS
-  xbt_parmap_destroy(surf_parmap);
-  xbt_free(surf_mins);
-  surf_mins = NULL;
-#endif
-  xbt_dynar_free(&host_that_restart);
-  xbt_dynar_free(&surf_path);
-
-  xbt_lib_free(&host_lib);
-  xbt_lib_free(&link_lib);
-  xbt_lib_free(&as_router_lib);
-  xbt_lib_free(&storage_lib);
-  xbt_lib_free(&storage_type_lib);
-
-  xbt_dict_free(&watched_hosts_lib);
-
-  tmgr_finalize();
-  surf_parse_lex_destroy();
-  surf_parse_free_callbacks();
-
-  NOW = 0;                      /* Just in case the user plans to restart the simulation afterward */
-}
-
-void surf_presolve(void)
-{
-  double next_event_date = -1.0;
-  tmgr_trace_event_t event = NULL;
-  double value = -1.0;
-  surf_resource_t resource = NULL;
-  surf_model_t model = NULL;
-  unsigned int iter;
-
-  XBT_DEBUG
-      ("First Run! Let's \"purge\" events and put models in the right state");
-  while ((next_event_date = tmgr_history_next_date(history)) != -1.0) {
-    if (next_event_date > NOW)
-      break;
-    while ((event =
-            tmgr_history_get_next_event_leq(history, next_event_date,
-                                            &value,
-                                            (void **) &resource))) {
-      if (value >= 0){
-        resource->model->model_private->update_resource_state(resource,
-                                                              event, value,
-                                                              NOW);
-      }
-    }
-  }
-  xbt_dynar_foreach(model_list, iter, model)
-      model->model_private->update_actions_state(NOW, 0.0);
-}
-
-double surf_solve(double max_date)
-{
-  min = -1.0; /* duration */
-  double next_event_date = -1.0;
-  double model_next_action_end = -1.0;
-  double value = -1.0;
-  surf_resource_t resource = NULL;
-  surf_model_t model = NULL;
-  tmgr_trace_event_t event = NULL;
-  unsigned int iter;
-
-  if(!host_that_restart)
-    host_that_restart = xbt_dynar_new(sizeof(char*), NULL);
-
-  if (max_date != -1.0 && max_date != NOW) {
-    min = max_date - NOW;
-  }
-
-  XBT_DEBUG("Looking for next action end for all models except NS3");
-
-  if (surf_mins == NULL) {
-    surf_mins = xbt_new(double, xbt_dynar_length(model_list));
-  }
-  surf_min_index = 0;
-
-  /* sequential version */
-  xbt_dynar_foreach(model_list, iter, model) {
-    surf_share_resources(model);
-  }
-
-  unsigned i;
-  for (i = 0; i < xbt_dynar_length(model_list); i++) {
-    if ((min < 0.0 || surf_mins[i] < min)
-        && surf_mins[i] >= 0.0) {
-      min = surf_mins[i];
-    }
-  }
-
-  XBT_DEBUG("Min for resources (remember that NS3 don't update that value) : %f", min);
-
-  XBT_DEBUG("Looking for next trace event");
-
-  do {
-    XBT_DEBUG("Next TRACE event : %f", next_event_date);
-
-    next_event_date = tmgr_history_next_date(history);
-
-    if(surf_network_model->name && !strcmp(surf_network_model->name,"network NS3")){
-      if(next_event_date!=-1.0 && min!=-1.0) {
-        min = MIN(next_event_date - NOW, min);
-      } else{
-        min = MAX(next_event_date - NOW, min);
-      }
-
-      XBT_DEBUG("Run for network at most %f", min);
-      // run until min or next flow
-      model_next_action_end = surf_network_model->model_private->share_resources(min);
-
-      XBT_DEBUG("Min for network : %f", model_next_action_end);
-      if(model_next_action_end>=0.0)
-        min = model_next_action_end;
-    }
-
-    if (next_event_date < 0.0) {
-      XBT_DEBUG("no next TRACE event. Stop searching for it");
-      break;
-    }
-
-    if ((min == -1.0) || (next_event_date > NOW + min)) break;
-
-    XBT_DEBUG("Updating models (min = %g, NOW = %g, next_event_date = %g)",min, NOW, next_event_date);
-    while ((event =
-            tmgr_history_get_next_event_leq(history, next_event_date,
-                                            &value,
-                                            (void **) &resource))) {
-      if (resource->model->model_private->resource_used(resource) ||
-          xbt_dict_get_or_null(watched_hosts_lib,resource->name)
-          ) {
-        min = next_event_date - NOW;
-        XBT_DEBUG
-            ("This event will modify model state. Next event set to %f",
-             min);
-      }
-      /* update state of model_obj according to new value. Does not touch lmm.
-         It will be modified if needed when updating actions */
-      XBT_DEBUG("Calling update_resource_state for resource %s with min %f",
-             resource->name, min);
-
-      resource->model->model_private->update_resource_state(resource,
-                                                            event, value,
-                                                            next_event_date);
-    }
-  } while (1);
-
-  /* FIXME: Moved this test to here to avoid stopping simulation if there are actions running on cpus and all cpus are with availability = 0.
-   * This may cause an infinite loop if one cpu has a trace with periodicity = 0 and the other a trace with periodicity > 0.
-   * The options are: all traces with same periodicity(0 or >0) or we need to change the way how the events are managed */
-  if (min == -1.0) {
-  XBT_DEBUG("No next event at all. Bail out now.");
-    return -1.0;
-  }
-
-  XBT_DEBUG("Duration set to %f", min);
-
-  NOW = NOW + min;
-
-  /* sequential version */
-  xbt_dynar_foreach(model_list, iter, model) {
-    surf_update_actions_state(model);
-  }
-
-#ifdef HAVE_TRACING
-  TRACE_paje_dump_buffer (0);
-#endif
-
-  return min;
-}
-
-XBT_INLINE double surf_get_clock(void)
-{
-  return NOW;
-}
-
-static void surf_share_resources(surf_model_t model)
-{
-  double next_action_end = -1.0;
-  int i = __sync_fetch_and_add(&surf_min_index, 1);
-  if (strcmp(model->name,"network NS3")) {
-    XBT_DEBUG("Running for Resource [%s]", model->name);
-    next_action_end = model->model_private->share_resources(NOW);
-    XBT_DEBUG("Resource [%s] : next action end = %f",
-        model->name, next_action_end);
-  }
-  surf_mins[i] = next_action_end;
-}
-
-static void surf_update_actions_state(surf_model_t model)
-{
-  model->model_private->update_actions_state(NOW, min);
-}
-
diff --git a/src/surf/surf_action.c b/src/surf/surf_action.c
deleted file mode 100644 (file)
index 86e752d..0000000
+++ /dev/null
@@ -1,597 +0,0 @@
-/* Copyright (c) 2009-2013. 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 "surf_private.h"
-#include "network_private.h"
-#include "maxmin_private.h"
-#include "surf/datatypes.h"
-#include "cpu_cas01_private.h"
-#include "xbt/mallocator.h"
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_kernel);
-
-/*
- * Generic action
- */
-
-const char *surf_action_state_names[6] = {
-  "SURF_ACTION_READY",
-  "SURF_ACTION_RUNNING",
-  "SURF_ACTION_FAILED",
-  "SURF_ACTION_DONE",
-  "SURF_ACTION_TO_FREE",
-  "SURF_ACTION_NOT_IN_THE_SYSTEM"
-};
-
-/* Surf actions mallocator */
-static xbt_mallocator_t action_mallocator = NULL;
-static int action_mallocator_allocated_size = 0;
-static void* surf_action_mallocator_new_f(void);
-#define surf_action_mallocator_free_f xbt_free_f
-static void surf_action_mallocator_reset_f(void* action);
-
-/**
- * \brief Initializes the action module of Surf.
- */
-void surf_action_init(void) {
-
-  /* the action mallocator will always provide actions of the following size,
-   * so this size should be set to the maximum size of the surf action structures
-   */
-  action_mallocator_allocated_size = sizeof(s_surf_action_network_CM02_t);
-  action_mallocator = xbt_mallocator_new(65536, surf_action_mallocator_new_f,
-      surf_action_mallocator_free_f, surf_action_mallocator_reset_f);
-}
-
-/**
- * \brief Uninitializes the action module of Surf.
- */
-void surf_action_exit(void) {
-
-  xbt_mallocator_free(action_mallocator);
-}
-
-static void* surf_action_mallocator_new_f(void) {
-  return xbt_malloc(action_mallocator_allocated_size);
-}
-
-static void surf_action_mallocator_reset_f(void* action) {
-  memset(action, 0, action_mallocator_allocated_size);
-}
-
-void *surf_action_new(size_t size, double cost, surf_model_t model,
-                      int failed)
-{
-  xbt_assert(size <= action_mallocator_allocated_size,
-      "Cannot create a surf action of size %zu: the mallocator only provides actions of size %d",
-      size, action_mallocator_allocated_size);
-
-  surf_action_t action = xbt_mallocator_get(action_mallocator);
-  action->refcount = 1;
-  action->cost = cost;
-  action->remains = cost;
-  action->priority = 1.0;
-  action->max_duration = NO_MAX_DURATION;
-  action->start = surf_get_clock();
-  action->finish = -1.0;
-  action->model_type = model;
-#ifdef HAVE_TRACING
-  action->category = NULL;
-#endif
-
-  if (failed)
-    action->state_set = model->states.failed_action_set;
-  else
-    action->state_set = model->states.running_action_set;
-
-  xbt_swag_insert(action, action->state_set);
-
-  return action;
-}
-
-e_surf_action_state_t surf_action_state_get(surf_action_t action)
-{
-  surf_action_state_t action_state = &(action->model_type->states);
-
-  if (action->state_set == action_state->ready_action_set)
-    return SURF_ACTION_READY;
-  if (action->state_set == action_state->running_action_set)
-    return SURF_ACTION_RUNNING;
-  if (action->state_set == action_state->failed_action_set)
-    return SURF_ACTION_FAILED;
-  if (action->state_set == action_state->done_action_set)
-    return SURF_ACTION_DONE;
-  return SURF_ACTION_NOT_IN_THE_SYSTEM;
-}
-
-double surf_action_get_start_time(surf_action_t action)
-{
-  return action->start;
-}
-
-double surf_action_get_finish_time(surf_action_t action)
-{
-  /* keep the function behavior, some models (cpu_ti) change the finish time before the action end */
-  return action->remains == 0 ? action->finish : -1;
-}
-
-XBT_INLINE void surf_action_free(surf_action_t * action)
-{
-  xbt_mallocator_release(action_mallocator, *action);
-  *action = NULL;
-}
-
-void surf_action_state_set(surf_action_t action,
-                           e_surf_action_state_t state)
-{
-  surf_action_state_t action_state = &(action->model_type->states);
-  XBT_IN("(%p,%s)", action, surf_action_state_names[state]);
-  xbt_swag_remove(action, action->state_set);
-
-  if (state == SURF_ACTION_READY)
-    action->state_set = action_state->ready_action_set;
-  else if (state == SURF_ACTION_RUNNING)
-    action->state_set = action_state->running_action_set;
-  else if (state == SURF_ACTION_FAILED)
-    action->state_set = action_state->failed_action_set;
-  else if (state == SURF_ACTION_DONE)
-    action->state_set = action_state->done_action_set;
-  else
-    action->state_set = NULL;
-
-  if (action->state_set)
-    xbt_swag_insert(action, action->state_set);
-  XBT_OUT();
-}
-
-void surf_action_data_set(surf_action_t action, void *data)
-{
-  action->data = data;
-}
-
-XBT_INLINE void surf_action_ref(surf_action_t action)
-{
-  action->refcount++;
-}
-
-/*
- * Maxmin action
- */
-
-/* added to manage the communication action's heap */
-void surf_action_lmm_update_index_heap(void *action, int i) {
-  surf_action_lmm_t a = action;
-  a->index_heap = i;
-}
-/* insert action on heap using a given key and a hat (heap_action_type)
- * a hat can be of three types for communications:
- *
- * NORMAL = this is a normal heap entry stating the date to finish transmitting
- * LATENCY = this is a heap entry to warn us when the latency is payed
- * MAX_DURATION =this is a heap entry to warn us when the max_duration limit is reached
- */
-void surf_action_lmm_heap_insert(xbt_heap_t heap, surf_action_lmm_t action, double key,
-    enum heap_action_type hat)
-{
-  action->hat = hat;
-  xbt_heap_push(heap, action, key);
-}
-
-void surf_action_lmm_heap_remove(xbt_heap_t heap, surf_action_lmm_t action)
-{
-  action->hat = NOTSET;
-  if (action->index_heap >= 0) {
-    xbt_heap_remove(heap, action->index_heap);
-  }
-}
-
-void surf_action_cancel(surf_action_t action)
-{
-  surf_model_t model = action->model_type;
-  surf_action_state_set(action, SURF_ACTION_FAILED);
-  if (model->model_private->update_mechanism == UM_LAZY) {
-    xbt_swag_remove(action, model->model_private->modified_set);
-    surf_action_lmm_heap_remove(model->model_private->action_heap,(surf_action_lmm_t)action);
-  }
-  return;
-}
-
-int surf_action_unref(surf_action_t action)
-{
-  surf_model_t model = action->model_type;
-  action->refcount--;
-  if (!action->refcount) {
-    xbt_swag_remove(action, action->state_set);
-    if (((surf_action_lmm_t) action)->variable)
-      lmm_variable_free(model->model_private->maxmin_system,
-                        ((surf_action_lmm_t) action)->variable);
-    if (model->model_private->update_mechanism == UM_LAZY) {
-      /* remove from heap */
-      surf_action_lmm_heap_remove(model->model_private->action_heap,(surf_action_lmm_t)action);
-      xbt_swag_remove(action, model->model_private->modified_set);
-    }
-#ifdef HAVE_TRACING
-    xbt_free(action->category);
-#endif
-    surf_action_free(&action);
-    return 1;
-  }
-  return 0;
-}
-
-void surf_action_suspend(surf_action_t action)
-{
-  surf_model_t model = action->model_type;
-  XBT_IN("(%p)", action);
-  if (((surf_action_lmm_t) action)->suspended != 2) {
-    lmm_update_variable_weight(model->model_private->maxmin_system,
-                               ((surf_action_lmm_t) action)->variable,
-                               0.0);
-    ((surf_action_lmm_t) action)->suspended = 1;
-    if (model->model_private->update_mechanism == UM_LAZY)
-      surf_action_lmm_heap_remove(model->model_private->action_heap,(surf_action_lmm_t)action);
-  }
-  XBT_OUT();
-}
-
-void surf_action_resume(surf_action_t action)
-{
-  surf_model_t model = action->model_type;
-  XBT_IN("(%p)", action);
-  if (((surf_action_lmm_t) action)->suspended != 2) {
-    lmm_update_variable_weight(model->model_private->maxmin_system,
-                               ((surf_action_lmm_t) action)->variable,
-                               action->priority);
-    ((surf_action_lmm_t) action)->suspended = 0;
-    if (model->model_private->update_mechanism == UM_LAZY)
-      surf_action_lmm_heap_remove(model->model_private->action_heap,(surf_action_lmm_t)action);
-  }
-  XBT_OUT();
-}
-
-int surf_action_is_suspended(surf_action_t action)
-{
-  return (((surf_action_lmm_t) action)->suspended == 1);
-}
-
-void surf_action_set_max_duration(surf_action_t action, double duration)
-{
-  surf_model_t model = action->model_type;
-  XBT_IN("(%p,%g)", action, duration);
-  action->max_duration = duration;
-  if (model->model_private->update_mechanism == UM_LAZY)      // remove action from the heap
-    surf_action_lmm_heap_remove(model->model_private->action_heap,(surf_action_lmm_t)action);
-  XBT_OUT();
-}
-
-void surf_action_set_priority(surf_action_t action, double priority)
-{
-  surf_model_t model = action->model_type;
-  XBT_IN("(%p,%g)", action, priority);
-  action->priority = priority;
-  lmm_update_variable_weight(model->model_private->maxmin_system,
-                             ((surf_action_lmm_t) action)->variable,
-                             priority);
-
-  if (model->model_private->update_mechanism == UM_LAZY)
-    surf_action_lmm_heap_remove(model->model_private->action_heap,(surf_action_lmm_t)action);
-  XBT_OUT();
-}
-
-#ifdef HAVE_TRACING
-void surf_action_set_category(surf_action_t action,
-                                    const char *category)
-{
-  XBT_IN("(%p,%s)", action, category);
-  action->category = xbt_strdup(category);
-  XBT_OUT();
-}
-#endif
-
-void generic_update_action_remaining_lazy( surf_action_lmm_t action, double now)
-{
-  double delta = 0.0;
-  surf_model_t model = action->generic_action.model_type;
-
-  if(model == surf_network_model)
-  {
-    if (action->suspended != 0)
-      return;
-  }
-  else
-  {
-    xbt_assert(action->generic_action.state_set == model->states.running_action_set,
-        "You're updating an action that is not running.");
-
-      /* bogus priority, skip it */
-    xbt_assert(action->generic_action.priority > 0,
-        "You're updating an action that seems suspended.");
-  }
-
-  delta = now - action->last_update;
-
-  if (action->generic_action.remains > 0) {
-    XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", action, action->generic_action.remains, action->last_update);
-    double_update(&(action->generic_action.remains),
-        action->last_value * delta);
-
-#ifdef HAVE_TRACING
-    if (model == surf_cpu_model && TRACE_is_enabled()) {
-      surf_resource_t cpu =
-          lmm_constraint_id(lmm_get_cnst_from_var
-              (model->model_private->maxmin_system,
-                  action->variable, 0));
-      TRACE_surf_host_set_utilization(cpu->name,
-          action->generic_action.category,
-          action->last_value,
-          action->last_update,
-          now - action->last_update);
-    }
-#endif
-    XBT_DEBUG("Updating action(%p): remains is now %f", action,
-        action->generic_action.remains);
-  }
-
-  if(model == surf_network_model)
-  {
-    if (((surf_action_t)action)->max_duration != NO_MAX_DURATION)
-      double_update(&(((surf_action_t)action)->max_duration), delta);
-
-    if ((((surf_action_t)action)->remains <= 0) &&
-        (lmm_get_variable_weight(action->variable) > 0)) {
-      ((surf_action_t)action)->finish = surf_get_clock();
-      model->action_state_set((surf_action_t) action,
-          SURF_ACTION_DONE);
-
-      surf_action_lmm_heap_remove(model->model_private->action_heap,(surf_action_lmm_t)action);
-    } else if (((((surf_action_t)action)->max_duration != NO_MAX_DURATION)
-        && (((surf_action_t)action)->max_duration <= 0))) {
-      ((surf_action_t)action)->finish = surf_get_clock();
-      model->action_state_set((surf_action_t) action,
-          SURF_ACTION_DONE);
-      surf_action_lmm_heap_remove(model->model_private->action_heap,(surf_action_lmm_t)action);
-    }
-  }
-
-  action->last_update = now;
-  action->last_value = lmm_variable_getvalue(action->variable);
-}
-
-double surf_action_get_remains(surf_action_t action)
-{
-  XBT_IN("(%p)", action);
-  surf_model_t model = action->model_type;
-  /* update remains before return it */
-  if (model->model_private->update_mechanism == UM_LAZY)      /* update remains before return it */
-    generic_update_action_remaining_lazy((surf_action_lmm_t)action, surf_get_clock());
-  XBT_OUT();
-  return action->remains;
-}
-
-/**
- * Update the CPU total energy for a finished action
- *
- */
-void update_resource_energy(surf_model_t model, surf_action_lmm_t action)
-{
-    if(model == surf_cpu_model){
-        cpu_Cas01_t cpu_model = (cpu_Cas01_t)lmm_constraint_id(lmm_get_cnst_from_var
-                                                                                 (model->model_private->maxmin_system,
-                                                                                                 action->variable, 0));
-
-        if( cpu_model->energy->last_updated < surf_get_clock()) {
-               double load = lmm_constraint_get_usage(cpu_model->constraint) / cpu_model->power_peak;
-               cpu_update_energy(cpu_model, load);
-        }
-    }
-}
-
-
-
-
-void generic_update_actions_state_lazy(double now, double delta, surf_model_t model)
-{
-  surf_action_lmm_t action;
-  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("Something happened to action %p", action);
-#ifdef HAVE_TRACING
-    if (TRACE_is_enabled()) {
-      if(model == surf_cpu_model){
-      surf_resource_t cpu =
-          lmm_constraint_id(lmm_get_cnst_from_var
-                            (model->model_private->maxmin_system,
-                             action->variable, 0));
-      TRACE_surf_host_set_utilization(cpu->name,
-                                      ((surf_action_t)action)->category,
-                                      lmm_variable_getvalue(action->variable),
-                                      action->last_update,
-                                      now - action->last_update);
-      }
-      else{
-        int n = lmm_get_number_of_cnst_from_var(model->model_private->maxmin_system, action->variable);
-        unsigned int i;
-        for (i = 0; i < n; i++){
-          lmm_constraint_t constraint = lmm_get_cnst_from_var(model->model_private->maxmin_system,
-                                                              action->variable,
-                                                              i);
-          link_CM02_t link = lmm_constraint_id(constraint);
-          TRACE_surf_link_set_utilization(link->lmm_resource.generic_resource.name,
-                                          ((surf_action_t)action)->category,
-                                          (lmm_variable_getvalue(action->variable)*
-                                              lmm_get_cnst_weight_from_var(model->model_private->maxmin_system,
-                                                  action->variable,
-                                                  i)),
-                                          action->last_update,
-                                          now - action->last_update);
-        }
-      }
-    }
-#endif
-
-    if(model == surf_cpu_model){
-      action->generic_action.finish = surf_get_clock();
-
-      update_resource_energy(model, 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);
-      surf_action_lmm_heap_remove(model->model_private->action_heap,action); //FIXME: strange call since action was already popped
-    }
-    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);
-        action->last_update = surf_get_clock();
-
-        // if I am wearing a max_duration or normal hat
-      } else if (action->hat == MAX_DURATION ||
-          action->hat == NORMAL) {
-        // no need to communicate anymore
-        // assume that flows that reached max_duration have remaining of 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);
-        surf_action_lmm_heap_remove(model->model_private->action_heap,action);
-
-        if (model->gap_remove && model == surf_network_model)
-          model->gap_remove(action);
-      }
-    }
-  }
-#ifdef HAVE_TRACING
-  if (TRACE_is_enabled() && model == surf_cpu_model) {
-    //defining the last timestamp that we can safely dump to trace file
-    //without losing the event ascending order (considering all CPU's)
-    double smaller = -1;
-    xbt_swag_t running_actions = model->states.running_action_set;
-    xbt_swag_foreach(action, running_actions) {
-        if (smaller < 0) {
-          smaller = action->last_update;
-          continue;
-        }
-        if (action->last_update < smaller) {
-          smaller = action->last_update;
-        }
-    }
-    if (smaller > 0) {
-      TRACE_last_timestamp_to_dump = smaller;
-    }
-  }
-#endif
-  return;
-}
-
-void generic_update_actions_state_full(double now, double delta, surf_model_t model)
-{
-  surf_action_lmm_t action = NULL;
-  surf_action_lmm_t next_action = NULL;
-  xbt_swag_t running_actions = model->states.running_action_set;
-
-  xbt_swag_foreach_safe(action, next_action, running_actions) {
-
-    if(model == surf_network_model)
-    {
-      double deltap = 0.0;
-      deltap = delta;
-      if (((surf_action_network_CM02_t)action)->latency > 0) {
-        if (((surf_action_network_CM02_t)action)->latency > deltap) {
-          double_update(&(((surf_action_network_CM02_t)action)->latency), deltap);
-          deltap = 0.0;
-        } else {
-          double_update(&(deltap), ((surf_action_network_CM02_t)action)->latency);
-          ((surf_action_network_CM02_t)action)->latency = 0.0;
-        }
-        if ((((surf_action_network_CM02_t)action)->latency == 0.0) && !(action->suspended))
-          lmm_update_variable_weight(model->model_private->maxmin_system, action->variable,
-              ((surf_action_network_CM02_t)action)->weight);
-      }
-  #ifdef HAVE_TRACING
-      if (TRACE_is_enabled()) {
-        int n = lmm_get_number_of_cnst_from_var(model->model_private->maxmin_system, action->variable);
-        unsigned int i;
-        for (i = 0; i < n; i++){
-          lmm_constraint_t constraint = lmm_get_cnst_from_var(model->model_private->maxmin_system,
-                                                              action->variable,
-                                                              i);
-          link_CM02_t link = lmm_constraint_id(constraint);
-          TRACE_surf_link_set_utilization(link->lmm_resource.generic_resource.name,
-                                          ((surf_action_t)action)->category,
-                                          (lmm_variable_getvalue(action->variable)*
-                                          lmm_get_cnst_weight_from_var(model->model_private->maxmin_system,
-                                              action->variable,
-                                              i)),
-                                          now - delta,
-                                          delta);
-        }
-      }
-  #endif
-      if (!lmm_get_number_of_cnst_from_var
-          (model->model_private->maxmin_system, action->variable)) {
-        /* There is actually no link used, hence an infinite bandwidth.
-         * This happens often when using models like vivaldi.
-         * In such case, just make sure that the action completes immediately.
-         */
-        double_update(&(action->generic_action.remains),
-                      action->generic_action.remains);
-      }
-    }
-    else
-    {
-#ifdef HAVE_TRACING
-      if (TRACE_is_enabled()) {
-        surf_resource_t x =
-            lmm_constraint_id(lmm_get_cnst_from_var
-                              (model->model_private->maxmin_system,
-                               action->variable, 0));
-
-        TRACE_surf_host_set_utilization(x->name,
-                                        ((surf_action_t)action)->category,
-                                        lmm_variable_getvalue(action->variable),
-                                        now - delta,
-                                        delta);
-        TRACE_last_timestamp_to_dump = now - delta;
-      }
-#endif
-    }
-
-    double_update(&(action->generic_action.remains),
-                  lmm_variable_getvalue(action->variable) * delta);
-
-
-    if (action->generic_action.max_duration != NO_MAX_DURATION)
-      double_update(&(action->generic_action.max_duration), delta);
-
-
-    if ((action->generic_action.remains <= 0) &&
-        (lmm_get_variable_weight(action->variable) > 0)) {
-      action->generic_action.finish = surf_get_clock();
-      surf_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
-
-      if (model->gap_remove && model == surf_network_model)
-        model->gap_remove(action);
-    } else if ((action->generic_action.max_duration != NO_MAX_DURATION) &&
-               (action->generic_action.max_duration <= 0)) {
-      action->generic_action.finish = surf_get_clock();
-      surf_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
-
-      if (model->gap_remove && model == surf_network_model)
-        model->gap_remove(action);
-    }
-
-    update_resource_energy(model, action);
-  }
-
-  return;
-}
diff --git a/src/surf/surf_c_bindings.cpp b/src/surf/surf_c_bindings.cpp
new file mode 100644 (file)
index 0000000..1bcc47f
--- /dev/null
@@ -0,0 +1,556 @@
+/* Copyright (c) 2013-2014. 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 "surf_interface.hpp"
+#include "workstation_interface.hpp"
+#include "vm_workstation_interface.hpp"
+#include "network_interface.hpp"
+#include "surf_routing_cluster.hpp"
+#include "instr/instr_private.h"
+#include "plugins/energy.hpp"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_kernel);
+
+/*********
+ * TOOLS *
+ *********/
+
+static CpuPtr get_casted_cpu(surf_resource_t resource){
+  return static_cast<CpuPtr>(surf_cpu_resource_priv(resource));
+}
+
+static WorkstationPtr get_casted_workstation(surf_resource_t resource){
+  return static_cast<WorkstationPtr>(surf_workstation_resource_priv(resource));
+}
+
+static WorkstationVMPtr get_casted_vm_workstation(surf_resource_t resource){
+  return static_cast<WorkstationVMPtr>(surf_workstation_resource_priv(resource));
+}
+
+char *surf_routing_edge_name(sg_routing_edge_t edge){
+  return edge->getName();
+}
+
+#ifdef CONTEXT_THREADS
+//FIXME:keeporremove static xbt_parmap_t surf_parmap = NULL; /* parallel map on models */
+#endif
+
+extern double NOW;
+extern double *surf_mins; /* return value of share_resources for each model */
+extern int surf_min_index;       /* current index in surf_mins */
+extern double surf_min;               /* duration determined by surf_solve */
+
+void surf_presolve(void)
+{
+  double next_event_date = -1.0;
+  tmgr_trace_event_t event = NULL;
+  double value = -1.0;
+  ResourcePtr resource = NULL;
+  ModelPtr model = NULL;
+  unsigned int iter;
+
+  XBT_DEBUG
+      ("First Run! Let's \"purge\" events and put models in the right state");
+  while ((next_event_date = tmgr_history_next_date(history)) != -1.0) {
+    if (next_event_date > NOW)
+      break;
+    while ((event =
+            tmgr_history_get_next_event_leq(history, next_event_date,
+                                            &value,
+                                            (void **) &resource))) {
+      if (value >= 0){
+        resource->updateState(event, value, NOW);
+      }
+    }
+  }
+  xbt_dynar_foreach(model_list, iter, model)
+      model->updateActionsState(NOW, 0.0);
+}
+
+static void surf_share_resources(surf_model_t model)
+{
+  double next_action_end = -1.0;
+  int i = __sync_fetch_and_add(&surf_min_index, 1);
+  if (strcmp(model->getName(), "network NS3")) {
+    XBT_DEBUG("Running for Resource [%s]", model->getName());
+    next_action_end = model->shareResources(NOW);
+    XBT_DEBUG("Resource [%s] : next action end = %f",
+        model->getName(), next_action_end);
+  }
+  surf_mins[i] = next_action_end;
+}
+
+static void surf_update_actions_state(surf_model_t model)
+{
+  model->updateActionsState(NOW, surf_min);
+}
+
+double surf_solve(double max_date)
+{
+  surf_min = -1.0; /* duration */
+  double next_event_date = -1.0;
+  double model_next_action_end = -1.0;
+  double value = -1.0;
+  ResourcePtr resource = NULL;
+  ModelPtr model = NULL;
+  tmgr_trace_event_t event = NULL;
+  unsigned int iter;
+
+  if(!host_that_restart)
+    host_that_restart = xbt_dynar_new(sizeof(char*), NULL);
+
+  if (max_date != -1.0 && max_date != NOW) {
+    surf_min = max_date - NOW;
+  }
+
+  XBT_DEBUG("Looking for next action end for all models except NS3");
+
+  if (surf_mins == NULL) {
+    surf_mins = xbt_new(double, xbt_dynar_length(model_list_invoke));
+  }
+  surf_min_index = 0;
+
+  /* sequential version */
+  xbt_dynar_foreach(model_list_invoke, iter, model) {
+    surf_share_resources(static_cast<ModelPtr>(model));
+  }
+
+  unsigned i;
+  for (i = 0; i < xbt_dynar_length(model_list_invoke); i++) {
+    if ((surf_min < 0.0 || surf_mins[i] < surf_min)
+        && surf_mins[i] >= 0.0) {
+      surf_min = surf_mins[i];
+    }
+  }
+
+  XBT_DEBUG("Min for resources (remember that NS3 don't update that value) : %f", surf_min);
+
+  XBT_DEBUG("Looking for next trace event");
+
+  do {
+    XBT_DEBUG("Next TRACE event : %f", next_event_date);
+
+    next_event_date = tmgr_history_next_date(history);
+
+    if(!strcmp(surf_network_model->getName(), "network NS3")){
+      if(next_event_date!=-1.0 && surf_min!=-1.0) {
+        surf_min = MIN(next_event_date - NOW, surf_min);
+      } else{
+        surf_min = MAX(next_event_date - NOW, surf_min);
+      }
+
+      XBT_DEBUG("Run for network at most %f", surf_min);
+      // run until min or next flow
+      model_next_action_end = surf_network_model->shareResources(surf_min);
+
+      XBT_DEBUG("Min for network : %f", model_next_action_end);
+      if(model_next_action_end>=0.0)
+        surf_min = model_next_action_end;
+    }
+
+    if (next_event_date < 0.0) {
+      XBT_DEBUG("no next TRACE event. Stop searching for it");
+      break;
+    }
+
+    if ((surf_min == -1.0) || (next_event_date > NOW + surf_min)) break;
+
+    XBT_DEBUG("Updating models (min = %g, NOW = %g, next_event_date = %g)", surf_min, NOW, next_event_date);
+    while ((event =
+            tmgr_history_get_next_event_leq(history, next_event_date,
+                                            &value,
+                                            (void **) &resource))) {
+      if (resource->isUsed() || xbt_dict_get_or_null(watched_hosts_lib, resource->getName())) {
+        surf_min = next_event_date - NOW;
+        XBT_DEBUG
+            ("This event will modify model state. Next event set to %f",
+             surf_min);
+      }
+      /* update state of model_obj according to new value. Does not touch lmm.
+         It will be modified if needed when updating actions */
+      XBT_DEBUG("Calling update_resource_state for resource %s with min %f",
+             resource->getName(), surf_min);
+      resource->updateState(event, value, next_event_date);
+    }
+  } while (1);
+
+  /* FIXME: Moved this test to here to avoid stopping simulation if there are actions running on cpus and all cpus are with availability = 0.
+   * This may cause an infinite loop if one cpu has a trace with periodicity = 0 and the other a trace with periodicity > 0.
+   * The options are: all traces with same periodicity(0 or >0) or we need to change the way how the events are managed */
+  if (surf_min == -1.0) {
+  XBT_DEBUG("No next event at all. Bail out now.");
+    return -1.0;
+  }
+
+  XBT_DEBUG("Duration set to %f", surf_min);
+
+  NOW = NOW + surf_min;
+  /* FIXME: model_list or model_list_invoke? revisit here later */
+  /* sequential version */
+  xbt_dynar_foreach(model_list, iter, model) {
+    surf_update_actions_state(model);
+  }
+
+#ifdef HAVE_TRACING
+  TRACE_paje_dump_buffer (0);
+#endif
+
+  return surf_min;
+}
+
+void routing_get_route_and_latency(sg_routing_edge_t src, sg_routing_edge_t dst,
+                              xbt_dynar_t * route, double *latency){
+  routing_platf->getRouteAndLatency(src, dst, route, latency);
+}
+
+/*********
+ * MODEL *
+ *********/
+
+surf_model_t surf_resource_model(const void *host, int level) {
+  /* If level is SURF_WKS_LEVEL, ws is a workstation_CLM03 object. It has
+   * surf_resource at the generic_resource field. */
+  ResourcePtr ws = static_cast<ResourcePtr>(xbt_lib_get_level((xbt_dictelm_t) host, level));
+  return ws->getModel();
+}
+
+void *surf_as_cluster_get_backbone(AS_t as){
+  return static_cast<AsClusterPtr>(as)->p_backbone;
+}
+
+void surf_as_cluster_set_backbone(AS_t as, void* backbone){
+  static_cast<AsClusterPtr>(as)->p_backbone = static_cast<NetworkLinkPtr>(backbone);
+}
+
+const char *surf_model_name(surf_model_t model){
+  return model->getName();
+}
+
+surf_action_t surf_model_extract_done_action_set(surf_model_t model){
+  if (model->getDoneActionSet()->empty())
+       return NULL;
+  surf_action_t res = &model->getDoneActionSet()->front();
+  model->getDoneActionSet()->pop_front();
+  return res;
+}
+
+surf_action_t surf_model_extract_failed_action_set(surf_model_t model){
+  if (model->getFailedActionSet()->empty())
+       return NULL;
+  surf_action_t res = &model->getFailedActionSet()->front();
+  model->getFailedActionSet()->pop_front();
+  return res;
+}
+
+surf_action_t surf_model_extract_ready_action_set(surf_model_t model){
+  if (model->getReadyActionSet()->empty())
+       return NULL;
+  surf_action_t res = &model->getReadyActionSet()->front();
+  model->getReadyActionSet()->pop_front();
+  return res;
+}
+
+surf_action_t surf_model_extract_running_action_set(surf_model_t model){
+  if (model->getRunningActionSet()->empty())
+       return NULL;
+  surf_action_t res = &model->getRunningActionSet()->front();
+  model->getRunningActionSet()->pop_front();
+  return res;
+}
+
+int surf_model_running_action_set_size(surf_model_t model){
+  return model->getRunningActionSet()->size();
+}
+
+surf_action_t surf_workstation_model_execute_parallel_task(surf_workstation_model_t model,
+                                                   int workstation_nb,
+                                            void **workstation_list,
+                                            double *computation_amount,
+                                            double *communication_amount,
+                                            double rate){
+  return static_cast<ActionPtr>(model->executeParallelTask(workstation_nb, workstation_list, computation_amount, communication_amount, rate));
+}
+
+surf_action_t surf_workstation_model_communicate(surf_workstation_model_t model, surf_resource_t src, surf_resource_t dst, double size, double rate){
+  return model->communicate(get_casted_workstation(src), get_casted_workstation(dst), size, rate);
+}
+
+xbt_dynar_t surf_workstation_model_get_route(surf_workstation_model_t model,
+                                                    surf_resource_t src, surf_resource_t dst){
+  return model->getRoute(get_casted_workstation(src), get_casted_workstation(dst));
+}
+
+void surf_vm_workstation_model_create(const char *name, surf_resource_t ind_phys_host){
+  surf_vm_workstation_model->createResource(name, ind_phys_host);
+}
+
+surf_action_t surf_network_model_communicate(surf_network_model_t model, sg_routing_edge_t src, sg_routing_edge_t dst, double size, double rate){
+  return model->communicate(src, dst, size, rate);
+}
+
+const char *surf_resource_name(surf_cpp_resource_t resource){
+  return resource->getName();
+}
+
+xbt_dict_t surf_resource_get_properties(surf_cpp_resource_t resource){
+  return resource->getProperties();
+}
+
+e_surf_resource_state_t surf_resource_get_state(surf_cpp_resource_t resource){
+  return resource->getState();
+}
+
+void surf_resource_set_state(surf_cpp_resource_t resource, e_surf_resource_state_t state){
+  resource->setState(state);
+}
+
+surf_action_t surf_workstation_sleep(surf_resource_t resource, double duration){
+  return get_casted_workstation(resource)->sleep(duration);
+}
+
+double surf_workstation_get_speed(surf_resource_t resource, double load){
+  return get_casted_workstation(resource)->getSpeed(load);
+}
+
+double surf_workstation_get_available_speed(surf_resource_t resource){
+  return get_casted_workstation(resource)->getAvailableSpeed();
+}
+
+int surf_workstation_get_core(surf_resource_t resource){
+  return get_casted_workstation(resource)->getCore();
+}
+
+surf_action_t surf_workstation_execute(surf_resource_t resource, double size){
+  return get_casted_workstation(resource)->execute(size);
+}
+
+double surf_workstation_get_current_power_peak(surf_resource_t resource){
+  return get_casted_workstation(resource)->getCurrentPowerPeak();
+}
+
+double surf_workstation_get_power_peak_at(surf_resource_t resource, int pstate_index){
+  return get_casted_workstation(resource)->getPowerPeakAt(pstate_index);
+}
+
+int surf_workstation_get_nb_pstates(surf_resource_t resource){
+  return get_casted_workstation(resource)->getNbPstates();
+}
+
+void surf_workstation_set_power_peak_at(surf_resource_t resource, int pstate_index){
+  return get_casted_workstation(resource)->setPowerPeakAt(pstate_index);
+}
+
+double surf_workstation_get_consumed_energy(surf_resource_t resource){
+  xbt_assert(surf_energy!=NULL, "The Energy plugin is not active.");
+  std::map<CpuPtr, CpuEnergyPtr>::iterator cpuIt = surf_energy->find(get_casted_workstation(resource)->p_cpu);
+  return cpuIt->second->getConsumedEnergy();
+}
+
+xbt_dict_t surf_workstation_get_storage_list(surf_resource_t workstation){
+  return get_casted_workstation(workstation)->getStorageList();
+}
+
+surf_action_t surf_workstation_open(surf_resource_t workstation, const char* mount, const char* path){
+  return get_casted_workstation(workstation)->open(mount, path);
+}
+
+surf_action_t surf_workstation_close(surf_resource_t workstation, surf_file_t fd){
+  return get_casted_workstation(workstation)->close(fd);
+}
+
+int surf_workstation_unlink(surf_resource_t workstation, surf_file_t fd){
+  return get_casted_workstation(workstation)->unlink(fd);
+}
+
+surf_action_t surf_workstation_ls(surf_resource_t workstation, const char* mount, const char *path){
+  return get_casted_workstation(workstation)->ls(mount, path);
+}
+
+size_t surf_workstation_get_size(surf_resource_t workstation, surf_file_t fd){
+  return get_casted_workstation(workstation)->getSize(fd);
+}
+
+surf_action_t surf_workstation_read(surf_resource_t resource, surf_file_t fd, sg_size_t size){
+  return get_casted_workstation(resource)->read(fd, size);
+}
+
+surf_action_t surf_workstation_write(surf_resource_t resource, surf_file_t fd, sg_size_t size){
+  return get_casted_workstation(resource)->write(fd, size);
+}
+
+xbt_dynar_t surf_workstation_get_info(surf_resource_t resource, surf_file_t fd){
+  return get_casted_workstation(resource)->getInfo(fd);
+}
+
+sg_size_t surf_workstation_get_free_size(surf_resource_t resource, const char* name){
+  return get_casted_workstation(resource)->getFreeSize(name);
+}
+
+sg_size_t surf_workstation_get_used_size(surf_resource_t resource, const char* name){
+  return get_casted_workstation(resource)->getUsedSize(name);
+}
+
+size_t surf_workstation_file_tell(surf_resource_t workstation, surf_file_t fd){
+  return get_casted_workstation(workstation)->fileTell(fd);
+}
+
+int surf_workstation_file_seek(surf_resource_t workstation, surf_file_t fd, sg_size_t offset, int origin){
+  return get_casted_workstation(workstation)->fileSeek(fd, offset, origin);
+}
+
+xbt_dynar_t surf_workstation_get_vms(surf_resource_t resource){
+  return get_casted_workstation(resource)->getVms();
+}
+
+void surf_workstation_get_params(surf_resource_t resource, ws_params_t params){
+  get_casted_workstation(resource)->getParams(params);
+}
+
+void surf_workstation_set_params(surf_resource_t resource, ws_params_t params){
+  get_casted_workstation(resource)->setParams(params);
+}
+
+void surf_vm_workstation_destroy(surf_resource_t resource){
+  delete get_casted_vm_workstation(resource);
+}
+
+void surf_vm_workstation_suspend(surf_resource_t resource){
+  get_casted_vm_workstation(resource)->suspend();
+}
+
+void surf_vm_workstation_resume(surf_resource_t resource){
+  get_casted_vm_workstation(resource)->resume();
+}
+
+void surf_vm_workstation_save(surf_resource_t resource){
+  get_casted_vm_workstation(resource)->save();
+}
+
+void surf_vm_workstation_restore(surf_resource_t resource){
+  get_casted_vm_workstation(resource)->restore();
+}
+
+void surf_vm_workstation_migrate(surf_resource_t resource, surf_resource_t ind_vm_ws_dest){
+  get_casted_vm_workstation(resource)->migrate(ind_vm_ws_dest);
+}
+
+surf_resource_t surf_vm_workstation_get_pm(surf_resource_t resource){
+  return get_casted_vm_workstation(resource)->getPm();
+}
+
+void surf_vm_workstation_set_bound(surf_resource_t resource, double bound){
+  return get_casted_vm_workstation(resource)->setBound(bound);
+}
+
+void surf_vm_workstation_set_affinity(surf_resource_t resource, surf_resource_t cpu, unsigned long mask){
+  return get_casted_vm_workstation(resource)->setAffinity(get_casted_cpu(cpu), mask);
+}
+
+int surf_network_link_is_shared(surf_cpp_resource_t link){
+  return static_cast<NetworkLinkPtr>(link)->isShared();
+}
+
+double surf_network_link_get_bandwidth(surf_cpp_resource_t link){
+  return static_cast<NetworkLinkPtr>(link)->getBandwidth();
+}
+
+double surf_network_link_get_latency(surf_cpp_resource_t link){
+  return static_cast<NetworkLinkPtr>(link)->getLatency();
+}
+
+xbt_dict_t surf_storage_get_content(surf_resource_t resource){
+  return static_cast<StoragePtr>(surf_storage_resource_priv(resource))->getContent();
+}
+
+sg_size_t surf_storage_get_size(surf_resource_t resource){
+  return static_cast<StoragePtr>(surf_storage_resource_priv(resource))->getSize();
+}
+
+void surf_storage_rename(surf_resource_t resource, const char* src, const char* dest){
+  static_cast<StoragePtr>(surf_storage_resource_priv(resource))->rename(src, dest);
+}
+
+surf_action_t surf_cpu_execute(surf_resource_t cpu, double size){
+  return get_casted_cpu(cpu)->execute(size);
+}
+
+surf_action_t surf_cpu_sleep(surf_resource_t cpu, double duration){
+  return get_casted_cpu(cpu)->sleep(duration);
+}
+
+double surf_action_get_start_time(surf_action_t action){
+  return action->getStartTime();
+}
+
+double surf_action_get_finish_time(surf_action_t action){
+  return action->getFinishTime();
+}
+
+double surf_action_get_remains(surf_action_t action){
+  return action->getRemains();
+}
+
+void surf_action_unref(surf_action_t action){
+  action->unref();
+}
+
+void surf_action_suspend(surf_action_t action){
+  action->suspend();
+}
+
+void surf_action_resume(surf_action_t action){
+  action->resume();
+}
+
+void surf_action_cancel(surf_action_t action){
+  action->cancel();
+}
+
+void surf_action_set_priority(surf_action_t action, double priority){
+  action->setPriority(priority);
+}
+
+void surf_action_set_category(surf_action_t action, const char *category){
+  action->setCategory(category);
+}
+
+void *surf_action_get_data(surf_action_t action){
+  return action->getData();
+}
+
+void surf_action_set_data(surf_action_t action, void *data){
+  action->setData(data);
+}
+
+e_surf_action_state_t surf_action_get_state(surf_action_t action){
+  return action->getState();
+}
+
+double surf_action_get_cost(surf_action_t action){
+  return action->getCost();
+}
+
+void surf_cpu_action_set_affinity(surf_action_t action, surf_resource_t cpu, unsigned long mask) {
+  static_cast<CpuActionPtr>(action)->setAffinity(get_casted_cpu(cpu), mask);
+}
+
+void surf_cpu_action_set_bound(surf_action_t action, double bound) {
+  static_cast<CpuActionPtr>(action)->setBound(bound);
+}
+
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+double surf_network_action_get_latency_limited(surf_action_t action) {
+  return static_cast<NetworkActionPtr>(action)->getLatencyLimited();
+}
+#endif
+
+surf_file_t surf_storage_action_get_file(surf_action_t action){
+  return static_cast<StorageActionPtr>(action)->p_file;
+}
+
+xbt_dict_t surf_storage_action_get_ls_dict(surf_action_t action){
+  return static_cast<StorageActionPtr>(action)->p_lsDict;
+}
diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp
new file mode 100644 (file)
index 0000000..4b1889a
--- /dev/null
@@ -0,0 +1,1080 @@
+/* Copyright (c) 2004-2014. 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 "surf_private.h"
+#include "surf_interface.hpp"
+#include "network_interface.hpp"
+#include "cpu_interface.hpp"
+#include "workstation_interface.hpp"
+#include "vm_workstation_interface.hpp"
+#include "simix/smx_host_private.h"
+#include "surf_routing.hpp"
+#include "simgrid/sg_config.h"
+#include "mc/mc.h"
+
+XBT_LOG_NEW_CATEGORY(surf, "All SURF categories");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_kernel, surf,
+                                "Logging specific to SURF (kernel)");
+
+/*********
+ * Utils *
+ *********/
+
+/* This function is a pimple that we ought to fix. But it won't be easy.
+ *
+ * The surf_solve() function does properly return the set of actions that changed.
+ * Instead, each model change a global data, and then the caller of surf_solve must
+ * pick into these sets of action_failed and action_done.
+ *
+ * This was not clean but ok as long as we didn't had to restart the processes when the resource comes back up.
+ * We worked by putting sentinel actions on every resources we are interested in,
+ * so that surf informs us if/when the corresponding resource fails.
+ *
+ * But this does not work to get Simix informed of when a resource comes back up, and this is where this pimple comes.
+ * We have a set of resources that are currently down and for which simix needs to know when it comes back up.
+ * And the current function is called *at every simulation step* to sweep over that set, searching for a resource
+ * that was turned back up in the meanwhile. This is UGLY and slow.
+ *
+ * The proper solution would be to not rely on globals for the action_failed and action_done swags.
+ * They must be passed as parameter by the caller (the handling of these actions in simix may let you
+ * think that these two sets can be merged, but their handling in SimDag induce the contrary unless this
+ * simdag code can check by itself whether the action is done of failed -- seems very doable, but yet more
+ * cleanup to do).
+ *
+ * Once surf_solve() is passed the set of actions that changed, you want to add a new set of resources back up
+ * as parameter to this function. You also want to add a boolean field "restart_watched" to each resource, and
+ * make sure that whenever a resource with this field enabled comes back up, it's added to that set so that Simix
+ * sees it and react accordingly. This would kill that need for surf to call simix.
+ *
+ */
+
+/*static void remove_watched_host(void *key)
+{
+  xbt_dict_remove(watched_hosts_lib, *(char**)key);
+}*/
+
+/*void surf_watched_hosts(void)
+{
+  char *key;
+  void *host;
+  xbt_dict_cursor_t cursor;
+  xbt_dynar_t hosts = xbt_dynar_new(sizeof(char*), NULL);
+
+  XBT_DEBUG("Check for host SURF_RESOURCE_ON on watched_hosts_lib");
+  xbt_dict_foreach(watched_hosts_lib, cursor, key, host)
+  {
+    if(SIMIX_host_get_state((smx_host_t)host) == SURF_RESOURCE_ON){
+      XBT_INFO("Restart processes on host: %s", SIMIX_host_get_name((smx_host_t)host));
+      SIMIX_host_autorestart((smx_host_t)host);
+      xbt_dynar_push_as(hosts, char*, key);
+    }
+    else
+      XBT_DEBUG("See SURF_RESOURCE_OFF on host: %s",key);
+  }
+  xbt_dynar_map(hosts, remove_watched_host);
+  xbt_dynar_free(&hosts);
+}*/
+
+/* model_list_invoke contains only surf_workstation and surf_vm_workstation.
+ * The callback functions of cpu_model and network_model will be called from
+ * those of these workstation models. */
+xbt_dynar_t model_list = NULL; /* for destroying all models correctly */
+xbt_dynar_t model_list_invoke = NULL;  /* for invoking callbacks */
+
+tmgr_history_t history = NULL;
+lmm_system_t maxmin_system = NULL;
+xbt_dynar_t surf_path = NULL;
+xbt_dynar_t host_that_restart = NULL;
+xbt_dict_t watched_hosts_lib;
+
+surf_callback(void, void) surfExitCallbacks;
+
+s_surf_model_description_t surf_plugin_description[] = {
+                 {"Energy",
+                  "Cpu energy consumption.",
+                  sg_energy_plugin_init},
+                 {NULL, NULL,  NULL}      /* this array must be NULL terminated */
+};
+
+/* Don't forget to update the option description in smx_config when you change this */
+s_surf_model_description_t surf_network_model_description[] = {
+  {"LV08",
+   "Realistic network analytic model (slow-start modeled by multiplying latency by 10.4, bandwidth by .92; bottleneck sharing uses a payload of S=8775 for evaluating RTT). ",
+   surf_network_model_init_LegrandVelho},
+  {"Constant",
+   "Simplistic network model where all communication take a constant time (one second). This model provides the lowest realism, but is (marginally) faster.",
+   surf_network_model_init_Constant},
+  {"SMPI",
+   "Realistic network model specifically tailored for HPC settings (accurate modeling of slow start with correction factors on three intervals: < 1KiB, < 64 KiB, >= 64 KiB)",
+   surf_network_model_init_SMPI},
+  {"CM02",
+   "Legacy network analytic model (Very similar to LV08, but without corrective factors. The timings of small messages are thus poorly modeled).",
+   surf_network_model_init_CM02},
+#ifdef HAVE_GTNETS
+  {"GTNets",
+   "Network pseudo-model using the GTNets simulator instead of an analytic model",
+   surf_network_model_init_GTNETS},
+#endif
+#ifdef HAVE_NS3
+  {"NS3",
+   "Network pseudo-model using the NS3 tcp model instead of an analytic model",
+  surf_network_model_init_NS3},
+#endif
+  {"Reno",
+   "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
+   surf_network_model_init_Reno},
+  {"Reno2",
+   "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
+   surf_network_model_init_Reno2},
+  {"Vegas",
+   "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
+   surf_network_model_init_Vegas},
+  {NULL, NULL, NULL}      /* this array must be NULL terminated */
+};
+
+s_surf_model_description_t surf_cpu_model_description[] = {
+  {"Cas01",
+   "Simplistic CPU model (time=size/power).",
+   surf_cpu_model_init_Cas01},
+  {NULL, NULL,  NULL}      /* this array must be NULL terminated */
+};
+
+s_surf_model_description_t surf_workstation_model_description[] = {
+  {"default",
+   "Default workstation model. Currently, CPU:Cas01 and network:LV08 (with cross traffic enabled)",
+   surf_workstation_model_init_current_default},
+  {"compound",
+   "Workstation model that is automatically chosen if you change the network and CPU models",
+   surf_workstation_model_init_compound},
+  {"ptask_L07", "Workstation model somehow similar to Cas01+CM02 but allowing parallel tasks",
+   surf_workstation_model_init_ptask_L07},
+  {NULL, NULL, NULL}      /* this array must be NULL terminated */
+};
+
+s_surf_model_description_t surf_vm_workstation_model_description[] = {
+  {"default",
+   "Default vm workstation model.",
+   surf_vm_workstation_model_init_current_default},
+  {NULL, NULL, NULL}      /* this array must be NULL terminated */
+};
+
+s_surf_model_description_t surf_optimization_mode_description[] = {
+  {"Lazy",
+   "Lazy action management (partial invalidation in lmm + heap in action remaining).",
+   NULL},
+  {"TI",
+   "Trace integration. Highly optimized mode when using availability traces (only available for the Cas01 CPU model for now).",
+    NULL},
+  {"Full",
+   "Full update of remaining and variables. Slow but may be useful when debugging.",
+   NULL},
+  {NULL, NULL, NULL}      /* this array must be NULL terminated */
+};
+
+s_surf_model_description_t surf_storage_model_description[] = {
+  {"default",
+   "Simplistic storage model.",
+   surf_storage_model_init_default},
+  {NULL, NULL,  NULL}      /* this array must be NULL terminated */
+};
+
+#ifdef CONTEXT_THREADS
+static xbt_parmap_t surf_parmap = NULL; /* parallel map on models */
+#endif
+
+double NOW = 0;
+double *surf_mins = NULL; /* return value of share_resources for each model */
+int surf_min_index;       /* current index in surf_mins */
+double surf_min;               /* duration determined by surf_solve */
+
+double surf_get_clock(void)
+{
+  return NOW;
+}
+
+#ifdef _XBT_WIN32
+# define FILE_DELIM "\\"
+#else
+# define FILE_DELIM "/"         /* FIXME: move to better location */
+#endif
+
+FILE *surf_fopen(const char *name, const char *mode)
+{
+  unsigned int cpt;
+  char *path_elm = NULL;
+  char *buff;
+  FILE *file = NULL;
+
+  xbt_assert(name);
+
+  if (__surf_is_absolute_file_path(name))       /* don't mess with absolute file names */
+    return fopen(name, mode);
+
+  /* search relative files in the path */
+  xbt_dynar_foreach(surf_path, cpt, path_elm) {
+    buff = bprintf("%s" FILE_DELIM "%s", path_elm, name);
+    file = fopen(buff, mode);
+    free(buff);
+
+    if (file)
+      return file;
+  }
+  return NULL;
+}
+
+
+#ifndef MAX_DRIVE
+#define MAX_DRIVE 26
+#endif
+
+#ifdef _XBT_WIN32
+#include <windows.h>
+static const char *disk_drives_letter_table[MAX_DRIVE] = {
+  "A:\\",
+  "B:\\",
+  "C:\\",
+  "D:\\",
+  "E:\\",
+  "F:\\",
+  "G:\\",
+  "H:\\",
+  "I:\\",
+  "J:\\",
+  "K:\\",
+  "L:\\",
+  "M:\\",
+  "N:\\",
+  "O:\\",
+  "P:\\",
+  "Q:\\",
+  "R:\\",
+  "S:\\",
+  "T:\\",
+  "U:\\",
+  "V:\\",
+  "W:\\",
+  "X:\\",
+  "Y:\\",
+  "Z:\\"
+};
+#endif  
+
+/*
+ * Returns the initial path. On Windows the initial path is
+ * the current directory for the current process in the other
+ * case the function returns "./" that represents the current
+ * directory on Unix/Linux platforms.
+ */
+
+const char *__surf_get_initial_path(void)
+{
+
+#ifdef _XBT_WIN32
+  unsigned i;
+  char current_directory[MAX_PATH + 1] = { 0 };
+  unsigned int len = GetCurrentDirectory(MAX_PATH + 1, current_directory);
+  char root[4] = { 0 };
+
+  if (!len)
+    return NULL;
+
+  strncpy(root, current_directory, 3);
+
+  for (i = 0; i < MAX_DRIVE; i++) {
+    if (toupper(root[0]) == disk_drives_letter_table[i][0])
+      return disk_drives_letter_table[i];
+  }
+
+  return NULL;
+#else
+  return "./";
+#endif
+}
+
+/* The __surf_is_absolute_file_path() returns 1 if
+ * file_path is a absolute file path, in the other
+ * case the function returns 0.
+ */
+int __surf_is_absolute_file_path(const char *file_path)
+{
+#ifdef _XBT_WIN32
+  WIN32_FIND_DATA wfd = { 0 };
+  HANDLE hFile = FindFirstFile(file_path, &wfd);
+
+  if (INVALID_HANDLE_VALUE == hFile)
+    return 0;
+
+  FindClose(hFile);
+  return 1;
+#else
+  return (file_path[0] == '/');
+#endif
+}
+
+/** Displays the long description of all registered models, and quit */
+void model_help(const char *category, s_surf_model_description_t * table)
+{
+  int i;
+  printf("Long description of the %s models accepted by this simulator:\n",
+         category);
+  for (i = 0; table[i].name; i++)
+    printf("  %s: %s\n", table[i].name, table[i].description);
+}
+
+int find_model_description(s_surf_model_description_t * table,
+                           const char *name)
+{
+  int i;
+  char *name_list = NULL;
+
+  for (i = 0; table[i].name; i++)
+    if (!strcmp(name, table[i].name)) {
+      return i;
+    }
+  name_list = strdup(table[0].name);
+  for (i = 1; table[i].name; i++) {
+    name_list = (char *) xbt_realloc(name_list, strlen(name_list) + strlen(table[i].name) + 3);
+    strcat(name_list, ", ");
+    strcat(name_list, table[i].name);
+  }
+  xbt_die("Model '%s' is invalid! Valid models are: %s.", name, name_list);
+  return -1;
+}
+
+static XBT_INLINE void routing_asr_host_free(void *p)
+{
+  delete ((RoutingEdgePtr) p);
+}
+
+static XBT_INLINE void routing_asr_prop_free(void *p)
+{
+  xbt_dict_t elm = (xbt_dict_t) p;
+  xbt_dict_free(&elm);
+}
+
+static XBT_INLINE void surf_cpu_free(void *r)
+{
+  delete static_cast<CpuPtr>(r);
+}
+
+static XBT_INLINE void surf_link_free(void *r)
+{
+  delete static_cast<NetworkLinkPtr>(r);
+}
+
+static XBT_INLINE void surf_workstation_free(void *r)
+{
+  delete static_cast<WorkstationPtr>(r);
+}
+
+
+void sg_version(int *ver_major,int *ver_minor,int *ver_patch) {
+  *ver_major = SIMGRID_VERSION_MAJOR;
+  *ver_minor = SIMGRID_VERSION_MINOR;
+  *ver_patch = SIMGRID_VERSION_PATCH;
+}
+
+void surf_init(int *argc, char **argv)
+{
+  XBT_DEBUG("Create all Libs");
+  host_lib = xbt_lib_new();
+  link_lib = xbt_lib_new();
+  as_router_lib = xbt_lib_new();
+  storage_lib = xbt_lib_new();
+  storage_type_lib = xbt_lib_new();
+  watched_hosts_lib = xbt_dict_new_homogeneous(NULL);
+
+  XBT_DEBUG("Add routing levels");
+  ROUTING_HOST_LEVEL = xbt_lib_add_level(host_lib,routing_asr_host_free);
+  ROUTING_ASR_LEVEL  = xbt_lib_add_level(as_router_lib,routing_asr_host_free);
+  ROUTING_PROP_ASR_LEVEL = xbt_lib_add_level(as_router_lib,routing_asr_prop_free);
+
+  XBT_DEBUG("Add SURF levels");
+  SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_cpu_free);
+  SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_workstation_free);
+  SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_link_free);
+
+  xbt_init(argc, argv);
+  if (!model_list)
+    model_list = xbt_dynar_new(sizeof(ModelPtr), NULL);
+  if (!model_list_invoke)
+    model_list_invoke = xbt_dynar_new(sizeof(ModelPtr), NULL);
+  if (!history)
+    history = tmgr_history_new();
+
+#ifdef HAVE_TRACING
+  TRACE_add_start_function(TRACE_surf_alloc);
+  TRACE_add_end_function(TRACE_surf_release);
+#endif
+
+  sg_config_init(argc, argv);
+
+  if (MC_is_active())
+    MC_memory_init();
+}
+
+void surf_exit(void)
+{
+  unsigned int iter;
+  ModelPtr model = NULL;
+
+#ifdef HAVE_TRACING
+  TRACE_end();                  /* Just in case it was not called by the upper
+                                 * layer (or there is no upper layer) */
+#endif
+
+  sg_config_finalize();
+
+  xbt_dynar_free(&host_that_restart);
+  xbt_dynar_free(&surf_path);
+
+  xbt_lib_free(&host_lib);
+  xbt_lib_free(&link_lib);
+  xbt_lib_free(&as_router_lib);
+  xbt_lib_free(&storage_lib);
+  xbt_lib_free(&storage_type_lib);
+
+  xbt_dict_free(&watched_hosts_lib);
+
+  xbt_dynar_foreach(model_list, iter, model)
+    delete model;
+  xbt_dynar_free(&model_list);
+  xbt_dynar_free(&model_list_invoke);
+  routing_exit();
+
+  surf_callback_emit(surfExitCallbacks);
+
+  if (maxmin_system) {
+    lmm_system_free(maxmin_system);
+    maxmin_system = NULL;
+  }
+  if (history) {
+    tmgr_history_free(history);
+    history = NULL;
+  }
+
+#ifdef CONTEXT_THREADS
+  xbt_parmap_destroy(surf_parmap);
+#endif
+
+  xbt_free(surf_mins);
+  surf_mins = NULL;
+
+  tmgr_finalize();
+  surf_parse_lex_destroy();
+  surf_parse_free_callbacks();
+
+  NOW = 0;                      /* Just in case the user plans to restart the simulation afterward */
+}
+
+/*********
+ * Model *
+ *********/
+
+Model::Model(const char *name)
+  : p_maxminSystem(NULL)
+  , p_name(name)
+{
+  p_readyActionSet = new ActionList();
+  p_runningActionSet = new ActionList();
+  p_failedActionSet = new ActionList();
+  p_doneActionSet = new ActionList();
+
+  p_modifiedSet = NULL;
+  p_actionHeap = NULL;
+  p_updateMechanism = UM_UNDEFINED;
+  m_selectiveUpdate = 0;
+}
+
+Model::~Model(){
+  delete p_readyActionSet;
+  delete p_runningActionSet;
+  delete p_failedActionSet;
+  delete p_doneActionSet;
+}
+
+double Model::shareResources(double now)
+{
+  //FIXME: set the good function once and for all
+  if (p_updateMechanism == UM_LAZY)
+       return shareResourcesLazy(now);
+  else if (p_updateMechanism == UM_FULL)
+       return shareResourcesFull(now);
+  else
+       xbt_die("Invalid cpu update mechanism!");
+}
+
+double Model::shareResourcesLazy(double now)
+{
+  ActionPtr action = NULL;
+  double min = -1;
+  double value;
+
+  XBT_DEBUG
+      ("Before share resources, the size of modified actions set is %zd",
+       p_modifiedSet->size());
+
+  lmm_solve(p_maxminSystem);
+
+  XBT_DEBUG
+      ("After share resources, The size of modified actions set is %zd",
+       p_modifiedSet->size());
+
+  while(!p_modifiedSet->empty()) {
+       action = &(p_modifiedSet->front());
+       p_modifiedSet->pop_front();
+    int max_dur_flag = 0;
+
+    if (action->getStateSet() != p_runningActionSet)
+      continue;
+
+    /* bogus priority, skip it */
+    if (action->getPriority() <= 0)
+      continue;
+
+    action->updateRemainingLazy(now);
+
+    min = -1;
+    value = lmm_variable_getvalue(action->getVariable());
+    if (value > 0) {
+      if (action->getRemains() > 0) {
+        value = action->getRemainsNoUpdate() / value;
+        min = now + value;
+      } else {
+        value = 0.0;
+        min = now;
+      }
+    }
+
+    if ((action->getMaxDuration() != NO_MAX_DURATION)
+        && (min == -1
+            || action->getStartTime() +
+            action->getMaxDuration() < min)) {
+      min = action->getStartTime() +
+          action->getMaxDuration();
+      max_dur_flag = 1;
+    }
+
+    XBT_DEBUG("Action(%p) Start %f Finish %f Max_duration %f", action,
+        action->getStartTime(), now + value,
+        action->getMaxDuration());
+
+    if (min != -1) {
+      action->heapRemove(p_actionHeap);
+      action->heapInsert(p_actionHeap, min, max_dur_flag ? MAX_DURATION : NORMAL);
+      XBT_DEBUG("Insert at heap action(%p) min %f now %f", action, min,
+                now);
+    } else DIE_IMPOSSIBLE;
+  }
+
+  //hereafter must have already the min value for this resource model
+  if (xbt_heap_size(p_actionHeap) > 0)
+    min = xbt_heap_maxkey(p_actionHeap) - now;
+  else
+    min = -1;
+
+  XBT_DEBUG("The minimum with the HEAP %f", min);
+
+  return min;
+}
+
+double Model::shareResourcesFull(double /*now*/) {
+  THROW_UNIMPLEMENTED;
+}
+
+double Model::shareResourcesMaxMin(ActionListPtr running_actions,
+                          lmm_system_t sys,
+                          void (*solve) (lmm_system_t))
+{
+  ActionPtr action = NULL;
+  double min = -1;
+  double value = -1;
+
+  solve(sys);
+
+  ActionList::iterator it(running_actions->begin()), itend(running_actions->end());
+  for(; it != itend ; ++it) {
+         action = &*it;
+    value = lmm_variable_getvalue(action->getVariable());
+    if ((value > 0) || (action->getMaxDuration() >= 0))
+      break;
+  }
+
+  if (!action)
+    return -1.0;
+
+  if (value > 0) {
+    if (action->getRemains() > 0)
+      min = action->getRemainsNoUpdate() / value;
+    else
+      min = 0.0;
+    if ((action->getMaxDuration() >= 0) && (action->getMaxDuration() < min))
+      min = action->getMaxDuration();
+  } else
+    min = action->getMaxDuration();
+
+
+  for (++it; it != itend; ++it) {
+       action = &*it;
+    value = lmm_variable_getvalue(action->getVariable());
+    if (value > 0) {
+      if (action->getRemains() > 0)
+        value = action->getRemainsNoUpdate() / value;
+      else
+        value = 0.0;
+      if (value < min) {
+        min = value;
+        XBT_DEBUG("Updating min (value) with %p: %f", action, min);
+      }
+    }
+    if ((action->getMaxDuration() >= 0) && (action->getMaxDuration() < min)) {
+      min = action->getMaxDuration();
+      XBT_DEBUG("Updating min (duration) with %p: %f", action, min);
+    }
+  }
+  XBT_DEBUG("min value : %f", min);
+
+  return min;
+}
+
+void Model::updateActionsState(double now, double delta)
+{
+  if (p_updateMechanism == UM_FULL)
+       updateActionsStateFull(now, delta);
+  else if (p_updateMechanism == UM_LAZY)
+       updateActionsStateLazy(now, delta);
+  else
+       xbt_die("Invalid cpu update mechanism!");
+}
+
+void Model::updateActionsStateLazy(double /*now*/, double /*delta*/)
+{
+}
+
+void Model::updateActionsStateFull(double /*now*/, double /*delta*/)
+{
+}
+
+/************
+ * Resource *
+ ************/
+
+Resource::Resource()
+: p_name(NULL), p_properties(NULL), p_model(NULL)
+{}
+
+Resource::Resource(ModelPtr model, const char *name, xbt_dict_t props)
+  : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
+  , m_running(true), m_stateCurrent(SURF_RESOURCE_ON)
+{}
+
+Resource::Resource(ModelPtr model, const char *name, xbt_dict_t props, lmm_constraint_t constraint)
+  : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
+  , m_running(true), m_stateCurrent(SURF_RESOURCE_ON), p_constraint(constraint)
+{}
+
+Resource::Resource(ModelPtr model, const char *name, xbt_dict_t props, e_surf_resource_state_t stateInit)
+  : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
+  , m_running(true), m_stateCurrent(stateInit)
+{}
+
+Resource::~Resource() {
+  xbt_free((void*)p_name);
+  xbt_dict_free(&p_properties);
+}
+
+e_surf_resource_state_t Resource::getState()
+{
+  return m_stateCurrent;
+}
+
+void Resource::setState(e_surf_resource_state_t state)
+{
+  m_stateCurrent = state;
+}
+
+bool Resource::isOn()
+{
+  return m_running;
+}
+
+void Resource::turnOn()
+{
+  if (!m_running) {
+    m_running = true;
+  }
+}
+
+void Resource::turnOff()
+{
+  if (m_running) {
+    m_running = false;
+  }
+}
+
+ModelPtr Resource::getModel() {
+  return p_model;
+}
+
+const char *Resource::getName() {
+  return p_name;
+}
+
+xbt_dict_t Resource::getProperties() {
+  if (p_properties==NULL)
+       p_properties = xbt_dict_new();
+  return p_properties;
+}
+
+lmm_constraint_t Resource::getConstraint() {
+  return p_constraint;
+}
+
+/**********
+ * Action *
+ **********/
+
+const char *surf_action_state_names[6] = {
+  "SURF_ACTION_READY",
+  "SURF_ACTION_RUNNING",
+  "SURF_ACTION_FAILED",
+  "SURF_ACTION_DONE",
+  "SURF_ACTION_TO_FREE",
+  "SURF_ACTION_NOT_IN_THE_SYSTEM"
+};
+
+Action::Action()
+: m_refcount(1)
+{}
+
+Action::Action(ModelPtr model, double cost, bool failed)
+ : m_priority(1.0)
+ , m_refcount(1)
+ , m_remains(cost)
+ , m_maxDuration(NO_MAX_DURATION)
+ , m_finish(-1.0)
+ , m_failed(failed)
+ , m_start(surf_get_clock())
+ , m_cost(cost)
+ , p_model(model)
+ , p_data(NULL)
+ , p_variable(NULL)
+ , m_lastValue(0)
+ , m_lastUpdate(0)
+ , m_suspended(false)
+{
+  #ifdef HAVE_TRACING
+    p_category = NULL;
+  #endif
+  p_stateHookup.prev = 0;
+  p_stateHookup.next = 0;
+  if (failed)
+    p_stateSet = getModel()->getFailedActionSet();
+  else
+    p_stateSet = getModel()->getRunningActionSet();
+
+  p_stateSet->push_back(*this);
+}
+
+Action::Action(ModelPtr model, double cost, bool failed, lmm_variable_t var)
+ : m_priority(1.0)
+ , m_refcount(1)
+ , m_remains(cost)
+ , m_maxDuration(NO_MAX_DURATION)
+ , m_finish(-1.0)
+ , m_failed(failed)
+ , m_start(surf_get_clock())
+ , m_cost(cost)
+ , p_model(model)
+ , p_data(NULL)
+ , p_variable(var)
+ , m_lastValue(0)
+ , m_lastUpdate(0)
+ , m_suspended(false)
+{
+  #ifdef HAVE_TRACING
+    p_category = NULL;
+  #endif
+  p_stateHookup.prev = 0;
+  p_stateHookup.next = 0;
+  if (failed)
+    p_stateSet = getModel()->getFailedActionSet();
+  else
+    p_stateSet = getModel()->getRunningActionSet();
+
+  p_stateSet->push_back(*this);
+}
+
+Action::~Action() {
+#ifdef HAVE_TRACING
+  xbt_free(p_category);
+#endif
+}
+
+void Action::finish() {
+    m_finish = surf_get_clock();
+}
+
+e_surf_action_state_t Action::getState()
+{
+  if (p_stateSet ==  getModel()->getReadyActionSet())
+    return SURF_ACTION_READY;
+  if (p_stateSet ==  getModel()->getRunningActionSet())
+    return SURF_ACTION_RUNNING;
+  if (p_stateSet ==  getModel()->getFailedActionSet())
+    return SURF_ACTION_FAILED;
+  if (p_stateSet ==  getModel()->getDoneActionSet())
+    return SURF_ACTION_DONE;
+  return SURF_ACTION_NOT_IN_THE_SYSTEM;
+}
+
+void Action::setState(e_surf_action_state_t state)
+{
+  //surf_action_state_t action_state = &(action->model_type->states);
+  XBT_IN("(%p,%s)", this, surf_action_state_names[state]);
+  p_stateSet->erase(p_stateSet->iterator_to(*this));
+  if (state == SURF_ACTION_READY)
+    p_stateSet = getModel()->getReadyActionSet();
+  else if (state == SURF_ACTION_RUNNING)
+    p_stateSet = getModel()->getRunningActionSet();
+  else if (state == SURF_ACTION_FAILED)
+    p_stateSet = getModel()->getFailedActionSet();
+  else if (state == SURF_ACTION_DONE)
+    p_stateSet = getModel()->getDoneActionSet();
+  else
+    p_stateSet = NULL;
+
+  if (p_stateSet)
+       p_stateSet->push_back(*this);
+  XBT_OUT();
+}
+
+double Action::getBound()
+{
+  return (p_variable) ? lmm_variable_getbound(p_variable) : 0;
+}
+
+void Action::setBound(double bound)
+{
+  XBT_IN("(%p,%g)", this, bound);
+  if (p_variable)
+    lmm_update_variable_bound(getModel()->getMaxminSystem(), getVariable(), bound);
+
+  if (getModel()->getUpdateMechanism() == UM_LAZY)
+       heapRemove(getModel()->getActionHeap());
+  XBT_OUT();
+}
+
+double Action::getStartTime()
+{
+  return m_start;
+}
+
+double Action::getFinishTime()
+{
+  /* keep the function behavior, some models (cpu_ti) change the finish time before the action end */
+  return m_remains == 0 ? m_finish : -1;
+}
+
+void Action::setData(void* data)
+{
+  p_data = data;
+}
+
+#ifdef HAVE_TRACING
+void Action::setCategory(const char *category)
+{
+  XBT_IN("(%p,%s)", this, category);
+  p_category = xbt_strdup(category);
+  XBT_OUT();
+}
+#endif
+
+void Action::ref(){
+  m_refcount++;
+}
+
+void Action::setMaxDuration(double duration)
+{
+  XBT_IN("(%p,%g)", this, duration);
+  m_maxDuration = duration;
+  if (getModel()->getUpdateMechanism() == UM_LAZY)      // remove action from the heap
+    heapRemove(getModel()->getActionHeap());
+  XBT_OUT();
+}
+
+void Action::gapRemove() {}
+
+void Action::setPriority(double priority)
+{
+  XBT_IN("(%p,%g)", this, priority);
+  m_priority = priority;
+  lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), priority);
+
+  if (getModel()->getUpdateMechanism() == UM_LAZY)
+       heapRemove(getModel()->getActionHeap());
+  XBT_OUT();
+}
+
+void Action::cancel(){
+  setState(SURF_ACTION_FAILED);
+  if (getModel()->getUpdateMechanism() == UM_LAZY) {
+       if (actionLmmHook::is_linked())
+         getModel()->getModifiedSet()->erase(getModel()->getModifiedSet()->iterator_to(*this));
+    heapRemove(getModel()->getActionHeap());
+  }
+}
+
+int Action::unref(){
+  m_refcount--;
+  if (!m_refcount) {
+       if (actionHook::is_linked())
+         p_stateSet->erase(p_stateSet->iterator_to(*this));
+       if (getVariable())
+         lmm_variable_free(getModel()->getMaxminSystem(), getVariable());
+       if (getModel()->getUpdateMechanism() == UM_LAZY) {
+         /* remove from heap */
+         heapRemove(getModel()->getActionHeap());
+      if (actionLmmHook::is_linked())
+           getModel()->getModifiedSet()->erase(getModel()->getModifiedSet()->iterator_to(*this));
+    }
+       delete this;
+       return 1;
+  }
+  return 0;
+}
+
+void Action::suspend()
+{
+  XBT_IN("(%p)", this);
+  if (m_suspended != 2) {
+    lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), 0.0);
+    m_suspended = 1;
+    if (getModel()->getUpdateMechanism() == UM_LAZY)
+      heapRemove(getModel()->getActionHeap());
+  }
+  XBT_OUT();
+}
+
+void Action::resume()
+{
+  XBT_IN("(%p)", this);
+  if (m_suspended != 2) {
+    lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), m_priority);
+    m_suspended = 0;
+    if (getModel()->getUpdateMechanism() == UM_LAZY)
+      heapRemove(getModel()->getActionHeap());
+  }
+  XBT_OUT();
+}
+
+bool Action::isSuspended()
+{
+  return m_suspended == 1;
+}
+/* insert action on heap using a given key and a hat (heap_action_type)
+ * a hat can be of three types for communications:
+ *
+ * NORMAL = this is a normal heap entry stating the date to finish transmitting
+ * LATENCY = this is a heap entry to warn us when the latency is payed
+ * MAX_DURATION =this is a heap entry to warn us when the max_duration limit is reached
+ */
+void Action::heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat)
+{
+  m_hat = hat;
+  xbt_heap_push(heap, this, key);
+}
+
+void Action::heapRemove(xbt_heap_t heap)
+{
+  m_hat = NOTSET;
+  if (m_indexHeap >= 0) {
+    xbt_heap_remove(heap, m_indexHeap);
+  }
+}
+
+/* added to manage the communication action's heap */
+void surf_action_lmm_update_index_heap(void *action, int i) {
+  ((ActionPtr)action)->updateIndexHeap(i);
+}
+
+void Action::updateIndexHeap(int i) {
+  m_indexHeap = i;
+}
+
+double Action::getRemains()
+{
+  XBT_IN("(%p)", this);
+  /* update remains before return it */
+  if (getModel()->getUpdateMechanism() == UM_LAZY)      /* update remains before return it */
+    updateRemainingLazy(surf_get_clock());
+  XBT_OUT();
+  return m_remains;
+}
+
+double Action::getRemainsNoUpdate()
+{
+  return m_remains;
+}
+
+//FIXME split code in the right places
+void Action::updateRemainingLazy(double now)
+{
+  double delta = 0.0;
+
+  if(getModel() == static_cast<ModelPtr>(surf_network_model))
+  {
+    if (m_suspended != 0)
+      return;
+  }
+  else
+  {
+    xbt_assert(p_stateSet == getModel()->getRunningActionSet(),
+        "You're updating an action that is not running.");
+
+      /* bogus priority, skip it */
+    xbt_assert(m_priority > 0,
+        "You're updating an action that seems suspended.");
+  }
+
+  delta = now - m_lastUpdate;
+
+  if (m_remains > 0) {
+    XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", this, m_remains, m_lastUpdate);
+    double_update(&m_remains, m_lastValue * delta);
+
+#ifdef HAVE_TRACING
+    if (getModel() == static_cast<ModelPtr>(surf_cpu_model_pm) && TRACE_is_enabled()) {
+      ResourcePtr cpu = static_cast<ResourcePtr>(lmm_constraint_id(lmm_get_cnst_from_var(getModel()->getMaxminSystem(), getVariable(), 0)));
+      TRACE_surf_host_set_utilization(cpu->getName(), getCategory(), m_lastValue, m_lastUpdate, now - m_lastUpdate);
+    }
+#endif
+    XBT_DEBUG("Updating action(%p): remains is now %f", this, m_remains);
+  }
+
+  if(getModel() == static_cast<ModelPtr>(surf_network_model))
+  {
+    if (m_maxDuration != NO_MAX_DURATION)
+      double_update(&m_maxDuration, delta);
+
+    //FIXME: duplicated code
+    if ((m_remains <= 0) &&
+        (lmm_get_variable_weight(getVariable()) > 0)) {
+      finish();
+      setState(SURF_ACTION_DONE);
+      heapRemove(getModel()->getActionHeap());
+    } else if (((m_maxDuration != NO_MAX_DURATION)
+        && (m_maxDuration <= 0))) {
+      finish();
+      setState(SURF_ACTION_DONE);
+      heapRemove(getModel()->getActionHeap());
+    }
+  }
+
+  m_lastUpdate = now;
+  m_lastValue = lmm_variable_getvalue(getVariable());
+}
+
diff --git a/src/surf/surf_interface.hpp b/src/surf/surf_interface.hpp
new file mode 100644 (file)
index 0000000..7dac341
--- /dev/null
@@ -0,0 +1,714 @@
+/* Copyright (c) 2004-2014. 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 SURF_MODEL_H_
+#define SURF_MODEL_H_
+
+#include <xbt.h>
+#include <string>
+#include <vector>
+#include <memory>
+#include <boost/function.hpp>
+#include <boost/intrusive/list.hpp>
+#include "surf/trace_mgr.h"
+#include "xbt/lib.h"
+#include "surf/surf_routing.h"
+#include "simgrid/platf_interface.h"
+#include "surf/surf.h"
+#include "surf/surf_private.h"
+#include "internal_config.h"
+
+#ifdef LIBSIGC
+#include <sigc++/sigc++.h>
+#define surf_callback(arg1, ...)  sigc::signal<arg1,__VA_ARGS__>
+#define surf_callback_connect(callback, fun_ptr) callback.connect(sigc::ptr_fun(fun_ptr))
+#define surf_callback_emit(callback, ...) callback.emit(__VA_ARGS__)
+#else
+#include <boost/signals2.hpp>
+#define surf_callback(arg1, ...)  boost::signals2::signal<arg1(__VA_ARGS__)>
+#define surf_callback_connect(callback, fun_ptr) callback.connect(fun_ptr)
+#define surf_callback_emit(callback, ...) callback(__VA_ARGS__)
+#endif
+
+extern tmgr_history_t history;
+#define NO_MAX_DURATION -1.0
+
+using namespace std;
+
+/*********
+ * Utils *
+ *********/
+
+/* user-visible parameters */
+extern double sg_tcp_gamma;
+extern double sg_sender_gap;
+extern double sg_latency_factor;
+extern double sg_bandwidth_factor;
+extern double sg_weight_S_parameter;
+extern int sg_network_crosstraffic;
+#ifdef HAVE_GTNETS
+extern double sg_gtnets_jitter;
+extern int sg_gtnets_jitter_seed;
+#endif
+extern xbt_dynar_t surf_path;
+
+extern "C" {
+XBT_PUBLIC(double) surf_get_clock(void);
+}
+
+extern double sg_sender_gap;
+XBT_PUBLIC(int)  SURF_CPU_LEVEL;    //Surf cpu level
+
+extern surf_callback(void, void) surfExitCallbacks;
+
+int __surf_is_absolute_file_path(const char *file_path);
+
+/***********
+ * Classes *
+ ***********/
+//class Model;
+typedef Model* ModelPtr;
+
+//class Resource;
+typedef Resource* ResourcePtr;
+                       
+//class Action;
+typedef Action* ActionPtr;
+
+typedef boost::intrusive::list<Action> ActionList;
+typedef ActionList* ActionListPtr;
+typedef boost::intrusive::list_base_hook<> actionHook;
+
+struct lmmTag;
+typedef boost::intrusive::list<Action, boost::intrusive::base_hook<boost::intrusive::list_base_hook<boost::intrusive::tag<lmmTag> > > > ActionLmmList;
+typedef ActionLmmList* ActionLmmListPtr;
+typedef boost::intrusive::list_base_hook<boost::intrusive::tag<lmmTag> > actionLmmHook;
+
+
+enum heap_action_type{
+  LATENCY = 100,
+  MAX_DURATION,
+  NORMAL,
+  NOTSET
+};
+
+/*********
+ * Trace *
+ *********/
+/* For the trace and trace:connect tag (store their content till the end of the parsing) */
+XBT_PUBLIC_DATA(xbt_dict_t) traces_set_list;
+XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_host_avail;
+XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_power;
+XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_link_avail; 
+XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_bandwidth; 
+XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_latency;
+
+/*********
+ * Model *
+ *********/
+XBT_PUBLIC_DATA(xbt_dynar_t) model_list;
+
+/** @ingroup SURF_interface
+ * @brief SURF model interface class
+ * @details A model is an object which handle the interactions between its Resources and its Actions
+ */
+class Model {
+public:
+  /** 
+   * @brief Model constructor
+   * 
+   * @param name the name of the model
+   */
+  Model(const char *name);
+
+  /** 
+   * @brief Model destructor
+   */
+  virtual ~Model();
+
+  /**
+   * @brief Get the name of the current Model
+   * 
+   * @return The name of the current Model
+   */
+  const char *getName() {return p_name;}
+
+  /**
+   * @brief Get the set of [actions](@ref Action) in *ready* state 
+   * 
+   * @return The set of [actions](@ref Action) in *ready* state 
+   */
+  virtual ActionListPtr getReadyActionSet() {return p_readyActionSet;}
+
+  /**
+   * @brief Get the set of [actions](@ref Action) in *running* state
+   * 
+   * @return The set of [actions](@ref Action) in *running* state
+   */
+  virtual ActionListPtr getRunningActionSet() {return p_runningActionSet;}
+
+  /**
+   * @brief Get the set of [actions](@ref Action) in *failed* state
+   * 
+   * @return The set of [actions](@ref Action) in *failed* state
+   */
+  virtual ActionListPtr getFailedActionSet() {return p_failedActionSet;}
+
+  /**
+   * @brief Get the set of [actions](@ref Action) in *done* state
+   * 
+   * @return The set of [actions](@ref Action) in *done* state
+   */
+  virtual ActionListPtr getDoneActionSet() {return p_doneActionSet;}
+
+  /**
+   * @brief Get the set of modified [actions](@ref Action)
+   * 
+   * @return The set of modified [actions](@ref Action)
+   */
+  virtual ActionLmmListPtr getModifiedSet() {return p_modifiedSet;}
+
+  /**
+   * @brief Get the maxmin system of the current Model
+   *
+   * @return The maxmin system of the current Model
+   */
+  lmm_system_t getMaxminSystem() {return p_maxminSystem;}
+
+  /**
+   * @brief Get the update mechanism of the current Model
+   * @see e_UM_t
+   * 
+   * @return [description]
+   */
+  e_UM_t getUpdateMechanism() {return p_updateMechanism;}
+
+  /**
+   * @brief Get Action heap
+   * @details [TODO]
+   * 
+   * @return The Action heap
+   */
+  xbt_heap_t getActionHeap() {return p_actionHeap;}
+
+  /** 
+   * @brief share the resources
+   * @details Share the resources between the actions 
+   * 
+   * @param now [TODO]
+   * @return the date of the next action will finish
+   */
+  virtual double shareResources(double now);
+  virtual double shareResourcesLazy(double now);
+  virtual double shareResourcesFull(double now);
+  double shareResourcesMaxMin(ActionListPtr running_actions,
+                                      lmm_system_t sys,
+                                      void (*solve) (lmm_system_t));
+
+  /**
+   * @brief Update state of actions
+   * @details [TODO]
+   * 
+   * @param now [TODO]
+   * @param delta [TODO]
+   */
+  virtual void updateActionsState(double now, double delta);
+  virtual void updateActionsStateLazy(double now, double delta);
+  virtual void updateActionsStateFull(double now, double delta);
+
+protected:
+  ActionLmmListPtr p_modifiedSet;
+  lmm_system_t p_maxminSystem;
+  e_UM_t p_updateMechanism;
+  int m_selectiveUpdate;
+  xbt_heap_t p_actionHeap;
+
+private:
+  const char *p_name;
+
+  ActionListPtr p_readyActionSet; /**< Actions in state SURF_ACTION_READY */
+  ActionListPtr p_runningActionSet; /**< Actions in state SURF_ACTION_RUNNING */
+  ActionListPtr p_failedActionSet; /**< Actions in state SURF_ACTION_FAILED */
+  ActionListPtr p_doneActionSet; /**< Actions in state SURF_ACTION_DONE */
+};
+
+/************
+ * Resource *
+ ************/
+
+/** @ingroup SURF_interface
+ * @brief Resource which have a metric handled by a maxmin system
+ */
+typedef struct {
+  double scale;             /**< The scale of the metric */
+  double peak;              /**< The peak of the metric */
+  tmgr_trace_event_t event; /**< The associated trace event associated to the metric */
+} s_surf_metric_t;
+
+/** @ingroup SURF_interface
+ * @brief SURF resource interface class
+ * @details A resource represent an element of a component (e.g.: a link for the network)
+ */
+class Resource {
+public:
+  /** 
+   * @brief Resource constructor
+   */
+  Resource();
+
+  /** 
+   * @brief Resource constructor
+   * 
+   * @param model Model associated to this Resource
+   * @param name The name of the Resource
+   * @param props Dictionary of properties associated to this Resource
+   */
+  Resource(ModelPtr model, const char *name, xbt_dict_t props);
+
+  /** 
+   * @brief Resource constructor
+   * 
+   * @param model Model associated to this Resource
+   * @param name The name of the Resource
+   * @param props Dictionary of properties associated to this Resource
+   * @param constraint The lmm constraint associated to this Resource if it is part of a LMM component
+   */
+  Resource(ModelPtr model, const char *name, xbt_dict_t props, lmm_constraint_t constraint);
+
+  /** 
+   * @brief Resource constructor
+   * 
+   * @param model Model associated to this Resource
+   * @param name The name of the Resource
+   * @param props Dictionary of properties associated to this Resource
+   * @param stateInit the initial state of the Resource
+   */
+  Resource(ModelPtr model, const char *name, xbt_dict_t props, e_surf_resource_state_t stateInit);
+
+  /**
+   * @brief Resource destructor
+   */
+  virtual ~Resource(); 
+
+  /**
+   * @brief Get the Model of the current Resource
+   * 
+   * @return The Model of the current Resource
+   */
+  ModelPtr getModel();
+
+  /**
+   * @brief Get the name of the current Resource
+   * 
+   * @return The name of the current Resource
+   */
+  const char *getName();
+
+  /**
+   * @brief Get the properties of the current Resource
+   * 
+   * @return The properties of the current Resource
+   */
+  virtual xbt_dict_t getProperties();
+
+  /**
+   * @brief Update the state of the current Resource
+   * @details [TODO]
+   * 
+   * @param event_type [TODO]
+   * @param value [TODO]
+   * @param date [TODO]
+   */
+  virtual void updateState(tmgr_trace_event_t event_type, double value, double date)=0;
+
+  /**
+   * @brief Check if the current Resource is used
+   * @return true if the current Resource is used, false otherwise
+   */
+  virtual bool isUsed()=0;
+
+  /**
+   * @brief Check if the current Resource is active
+   *
+   * @return true if the current Resource is active, false otherwise
+   */
+  bool isOn();
+
+  /**
+   * @brief Turn on the current Resource
+   */
+  void turnOn();
+
+  /**
+   * @brief Turn off the current Resource
+   */
+  void turnOff();
+
+  /**
+   * @brief Get the [state](\ref e_surf_resource_state_t) of the current Resource
+   *
+   * @return The state of the currenrt Resource
+   */
+  virtual e_surf_resource_state_t getState();
+
+  /**
+   * @brief Set the [state](\ref e_surf_resource_state_t) of the current Resource
+   * 
+   * @param state The new state of the current Resource
+   */
+  virtual void setState(e_surf_resource_state_t state);
+
+private:
+  const char *p_name;
+  xbt_dict_t p_properties;
+  ModelPtr p_model;
+  void *p_resource;
+  bool m_running;
+  e_surf_resource_state_t m_stateCurrent;
+
+  /* LMM */
+public:
+  /**
+   * @brief Get the lmm constraint associated to this Resource if it is part of a LMM component
+   * 
+   * @return The lmm constraint associated to this Resource
+   */
+  lmm_constraint_t getConstraint();
+private:
+  lmm_constraint_t p_constraint;
+};
+
+/**********
+ * Action *
+ **********/
+void surf_action_lmm_update_index_heap(void *action, int i);
+
+/** @ingroup SURF_interface
+ * @brief SURF action interface class
+ * @details An action is an event generated by a resource (e.g.: a communication for the network)
+ */
+class Action : public actionHook, public actionLmmHook {
+public:
+  /**
+   * @brief Action constructor
+   */
+  Action();
+
+  /**
+   * @brief Action constructor
+   * 
+   * @param model The Model associated to this Action
+   * @param cost The cost of the Action
+   * @param failed If the action is impossible (e.g.: execute something on a switched off workstation)
+   */
+  Action(ModelPtr model, double cost, bool failed);
+
+  /**
+   * @brief Action constructor
+   * 
+   * @param model The Model associated to this Action
+   * @param cost The cost of the Action
+   * @param failed If the action is impossible (e.g.: execute something on a switched off workstation)
+   * @param var The lmm variable associated to this Action if it is part of a LMM component
+   */
+  Action(ModelPtr model, double cost, bool failed, lmm_variable_t var);
+
+  /**
+   * @brief Action destructor
+   */
+  virtual ~Action();
+  
+  /**
+   * @brief Finish the action
+   */
+  void finish();
+
+  /**
+   * @brief Get the [state](\ref e_surf_action_state_t) of the current Action
+   * 
+   * @return The state of the current Action
+   */
+  e_surf_action_state_t getState(); /**< get the state*/
+
+  /**
+   * @brief Set the [state](\ref e_surf_action_state_t) of the current Action
+   * 
+   * @param state The new state of the current Action
+   */
+  virtual void setState(e_surf_action_state_t state);
+
+  /**
+   * @brief Get the bound of the current Action
+   * 
+   * @return The bound of the current Action
+   */
+  double getBound();
+
+  /**
+   * @brief Set the bound of the current Action
+   *
+   * @param bound The new bound of the current Action
+   */
+  void setBound(double bound);
+
+  /**
+   * @brief Get the start time of the current action
+   * 
+   * @return The start time of the current action
+   */
+  double getStartTime();
+
+  /**
+   * @brief Get the finish time of the current action
+   * 
+   * @return The finish time of the current action
+   */
+  double getFinishTime();
+
+  /**
+   * @brief Get the data associated to the current action
+   * 
+   * @return The data associated to the current action
+   */
+  void *getData() {return p_data;}
+
+  /**
+   * @brief Set the data associated to the current action
+   * 
+   * @param data The new data associated to the current action
+   */
+  void setData(void* data);
+
+  /**
+   * @brief Get the maximum duration of the current action
+   * 
+   * @return The maximum duration of the current action
+   */
+  double getMaxDuration() {return m_maxDuration;}
+
+  /**
+   * @brief Get the category associated to the current action
+   * 
+   * @return The category associated to the current action
+   */
+  char *getCategory() {return p_category;}
+
+  /**
+   * @brief Get the cost of the current action
+   * 
+   * @return The cost of the current action
+   */
+  double getCost() {return m_cost;}
+
+  /**
+   * @brief Set the cost of the current action
+   * 
+   * @param cost The new cost of the current action
+   */
+  void setCost(double cost) {m_cost = cost;}
+
+  /**
+   * @brief Update the maximum duration of the current action
+   * 
+   * @param delta [TODO]
+   */
+  void updateMaxDuration(double delta) {double_update(&m_maxDuration, delta);}
+
+  /**
+   * @brief Update the remaining time of the current action
+   * 
+   * @param delta [TODO]
+   */
+  void updateRemains(double delta) {double_update(&m_remains, delta);}
+
+  /**
+   * @brief Set the remaining time of the current action
+   * 
+   * @param value The new remaining time of the current action
+   */
+  void setRemains(double value) {m_remains = value;}
+
+  /**
+   * @brief Set the finish time of the current action
+   * 
+   * @param value The new Finush time of the current action
+   */
+  void setFinishTime(double value) {m_finish = value;}
+
+  /**
+   * @brief Add a reference to the current action
+   */
+  void ref();
+
+  /**
+   * @brief Remove a reference to the current action
+   * @details If the Action has no more reference, we destroy it
+   * 
+   * @return true if the action was destroyed and false if someone still has references on it
+   */
+  virtual int unref();
+
+  /**
+   * @brief Cancel the current Action if running
+   */
+  virtual void cancel();
+
+  /**
+   * @brief Recycle an Action
+   */
+  virtual void recycle(){};
+
+  /**
+   * @brief Suspend the current Action
+   */
+  virtual void suspend();
+
+  /**
+   * @brief Resume the current Action
+   */
+  virtual void resume();
+
+  /**
+   * @brief Check if the current action is running
+   * 
+   * @return true if the current Action is suspended, false otherwise
+   */
+  virtual bool isSuspended();
+
+  /**
+   * @brief Set the maximum duration of the current Action
+   * 
+   * @param duration The new maximum duration of the current Action
+   */
+  virtual void setMaxDuration(double duration);
+
+  /**
+   * @brief Set the priority of the current Action
+   * 
+   * @param priority The new priority of the current Action
+   */
+  virtual void setPriority(double priority);
+
+#ifdef HAVE_TRACING
+  /**
+   * @brief Set the category of the current Action
+   * 
+   * @param category The new category of the current Action
+   */
+  void setCategory(const char *category);
+#endif
+
+  /**
+   * @brief Get the remaining time of the current action after updating the resource
+   * 
+   * @return The remaining time
+   */
+  virtual double getRemains();
+
+  /**
+   * @brief Get the remaining time of the current action without updating the resource
+   * 
+   * @return The remaining time
+   */
+  double getRemainsNoUpdate();
+
+  /**
+   * @brief Get the priority of the current Action
+   * 
+   * @return The priority of the current Action
+   */
+  double getPriority() {return m_priority;};
+
+  /**
+   * @brief Get the state set in which the action is
+   * @details [TODO]
+   * 
+   * @return The state set in which the action is
+   */
+  ActionListPtr getStateSet() {return p_stateSet;};
+
+  s_xbt_swag_hookup_t p_stateHookup;
+
+protected:
+  ActionListPtr p_stateSet;
+  double m_priority; /**< priority (1.0 by default) */
+  int    m_refcount;
+  double m_remains; /**< How much of that cost remains to be done in the currently running task */
+  double m_maxDuration; /*< max_duration (may fluctuate until the task is completed) */
+  double m_finish; /**< finish time : this is modified during the run and fluctuates until the task is completed */
+
+  ModelPtr getModel() {return p_model;}
+
+private:
+  int resourceUsed(void *resource_id);
+
+  /**
+   * @brief Share the resources to the actions
+   * @details [TODO]
+   * 
+   * @param now [TODO]
+   * @return in how much time the next action may terminatedescription]
+   */
+  double shareResources(double now);
+
+  /**
+   * @brief Update the current action state
+   * @details [TODO]
+   * 
+   * @param now [TODO]
+   * @param delta [TODO]
+   */
+  void updateActionsState(double now, double delta);
+
+  /**
+   * @brief Update the [TODO]
+   * @details [TODO]
+   * 
+   * @param id [TODO]
+   * @param event_type [TODO]
+   * @param value [TODO]
+   * @param time [TODO]
+   */
+  void updateResourceState(void *id, tmgr_trace_event_t event_type,
+                                 double value, double time);
+
+  ActionLmmListPtr p_modifiedSet;
+  xbt_heap_t p_actionHeap;
+  int m_selectiveUpdate;
+  bool m_failed;
+  double m_start; /**< start time  */
+  char *p_category;               /**< tracing category for categorized resource utilization monitoring */
+
+  #ifdef HAVE_LATENCY_BOUND_TRACKING
+  int m_latencyLimited;               /**< Set to 1 if is limited by latency, 0 otherwise */
+  #endif
+  double    m_cost;
+  ModelPtr p_model;
+  void *p_data; /**< for your convenience */
+
+  /* LMM */
+public:
+  virtual void updateRemainingLazy(double now);
+  void heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat);
+  void heapRemove(xbt_heap_t heap);
+  void updateIndexHeap(int i);
+  lmm_variable_t getVariable() {return p_variable;}
+  double getLastUpdate() {return m_lastUpdate;}
+  void refreshLastUpdate() {m_lastUpdate = surf_get_clock();}
+  enum heap_action_type getHat() {return m_hat;}
+  bool is_linked() {return actionLmmHook::is_linked();}
+  void gapRemove();
+
+protected:
+  lmm_variable_t p_variable;
+  double m_lastValue;
+  double m_lastUpdate;
+  int m_suspended;
+  int m_indexHeap;
+  enum heap_action_type m_hat;
+};
+
+#endif /* SURF_MODEL_H_ */
diff --git a/src/surf/surf_model.c b/src/surf/surf_model.c
deleted file mode 100644 (file)
index 3cb98f1..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-
-/* Copyright (c) 2009-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 "surf_private.h"
-#include "xbt/dict.h"
-
-static void void_die_impossible_paction(surf_action_t action)
-{
-  DIE_IMPOSSIBLE;
-}
-
-static int int_die_impossible_paction(surf_action_t action)
-{
-  DIE_IMPOSSIBLE;
-  return -1;
-}
-
-/** @brief initialize common datastructures to all models */
-surf_model_t surf_model_init(void)
-{
-  s_surf_action_t action;
-  surf_model_t model = xbt_new0(s_surf_model_t, 1);
-
-  model->model_private = xbt_new0(s_surf_model_private_t, 1);
-
-  model->states.ready_action_set =
-      xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  model->states.running_action_set =
-      xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  model->states.failed_action_set =
-      xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  model->states.done_action_set =
-      xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
-  model->action_unref = int_die_impossible_paction;
-  model->action_cancel = void_die_impossible_paction;
-  model->action_recycle = void_die_impossible_paction;
-
-  model->action_state_get = surf_action_state_get;
-  model->action_state_set = surf_action_state_set;
-  model->action_get_start_time = surf_action_get_start_time;
-  model->action_get_finish_time = surf_action_get_finish_time;
-  model->action_data_set = surf_action_data_set;
-
-  model->model_private->modified_set = NULL;
-  model->model_private->action_heap = NULL;
-  model->model_private->update_mechanism = UM_UNDEFINED;
-  model->model_private->selective_update = 0;
-
-  return model;
-}
-
-/** @brief finalize common datastructures to all models */
-void surf_model_exit(surf_model_t model)
-{
-  xbt_swag_free(model->states.ready_action_set);
-  xbt_swag_free(model->states.running_action_set);
-  xbt_swag_free(model->states.failed_action_set);
-  xbt_swag_free(model->states.done_action_set);
-  free(model->model_private);
-  free(model);
-}
index 10066b0..a983231 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. 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 _SURF_SURF_PRIVATE_H
 #define _SURF_SURF_PRIVATE_H
 
 
 #define NO_MAX_DURATION -1.0
 
+SG_BEGIN_DECL()
+
 extern xbt_dict_t watched_hosts_lib;
 
 extern const char *surf_action_state_names[6];
 
+/** @ingroup SURF_interface
+ * @brief Possible update mechanisms
+ */
 typedef enum {
-  UM_FULL,
-  UM_LAZY,
-  UM_UNDEFINED
+  UM_FULL,      /**< [TODO] */
+  UM_LAZY,      /**< [TODO] */
+  UM_UNDEFINED  /**< Mechanism not defined */
 } e_UM_t;
 
-typedef struct surf_model_private {
-  int (*resource_used) (void *resource_id);
-  /* Share the resources to the actions and return in how much time
-     the next action may terminate */
-  double (*share_resources) (double now);
-  /* Update the actions' state */
-  void (*update_actions_state) (double now, double delta);
-  void (*update_resource_state) (void *id, tmgr_trace_event_t event_type,
-                                 double value, double time);
-  void (*finalize) (void);
-
-  lmm_system_t maxmin_system;
-  e_UM_t update_mechanism;
-  xbt_swag_t modified_set;
-  xbt_heap_t action_heap;
-  int selective_update;
-
-} s_surf_model_private_t;
-
-double generic_maxmin_share_resources(xbt_swag_t running_actions,
-                                      size_t offset,
-                                      lmm_system_t sys,
-                                      void (*solve) (lmm_system_t));
-double generic_share_resources_lazy(double now, surf_model_t model);
-
 /* Generic functions common to all models */
-void surf_action_init(void);
-void surf_action_exit(void);
-e_surf_action_state_t surf_action_state_get(surf_action_t action);      /* cannot declare inline since we use a pointer to it */
-double surf_action_get_start_time(surf_action_t action);        /* cannot declare inline since we use a pointer to it */
-double surf_action_get_finish_time(surf_action_t action);       /* cannot declare inline since we use a pointer to it */
-void surf_action_free(surf_action_t * action);
-void surf_action_state_set(surf_action_t action,
-                           e_surf_action_state_t state);
-void surf_action_data_set(surf_action_t action, void *data);    /* cannot declare inline since we use a pointer to it */
-
-void surf_action_lmm_update_index_heap(void *action, int i); /* callback for heap management shared by cpu and net models */
-void surf_action_lmm_heap_insert(xbt_heap_t heap, surf_action_lmm_t action,
-    double key, enum heap_action_type hat);
-void surf_action_lmm_heap_remove(xbt_heap_t heap,surf_action_lmm_t action);
-
-void surf_action_cancel(surf_action_t action);
-int surf_action_unref(surf_action_t action);
-void surf_action_suspend(surf_action_t action);
-void surf_action_resume(surf_action_t action);
-int surf_action_is_suspended(surf_action_t action);
-void surf_action_set_max_duration(surf_action_t action, double duration);
-void surf_action_set_priority(surf_action_t action, double priority);
-#ifdef HAVE_TRACING
-void surf_action_set_category(surf_action_t action,
-                                    const char *category);
-#endif
-double surf_action_get_remains(surf_action_t action);
-void update_resource_energy(surf_model_t model, surf_action_lmm_t action);
-void generic_update_action_remaining_lazy( surf_action_lmm_t action, double now);
-void generic_update_actions_state_lazy(double now, double delta, surf_model_t model);
-void generic_update_actions_state_full(double now, double delta, surf_model_t model);
 
 FILE *surf_fopen(const char *name, const char *mode);
 
 extern tmgr_history_t history;
 
-//void surf_config_init(int *argc, char **argv);
-//void surf_config_finalize(void);
-//void surf_config(const char *name, va_list pa);
-
-void net_action_recycle(surf_action_t action);
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-int net_get_link_latency_limited(surf_action_t action);
-#endif
-
 /* The __surf_is_absolute_file_path() returns 1 if
  * file_path is a absolute file path, in the other
  * case the function returns 0.
  */
 int __surf_is_absolute_file_path(const char *file_path);
 
-typedef struct s_routing_edge {
-  AS_t rc_component;
-  e_surf_network_element_type_t rc_type;
-  int id;
-  char *name;
-} s_routing_edge_t;
-
-/*
- * Link of lenght 1, alongside with its source and destination. This is mainly usefull in the bindings to gtnets and ns3
- */
-typedef struct s_onelink {
-  sg_routing_edge_t src;
-  sg_routing_edge_t dst;
-  void *link_ptr;
-} s_onelink_t, *onelink_t;
-
 /**
  * Routing logic
  */
@@ -138,47 +63,10 @@ typedef enum {
   SURF_ROUTING_RECURSIVE   /**< Recursive case: also return gateway informations */
 } e_surf_routing_hierarchy_t;
 
-typedef struct s_as {
-  xbt_dynar_t index_network_elm;
-  xbt_dict_t bypassRoutes;    /* store bypass routes */
-  routing_model_description_t model_desc;
-  e_surf_routing_hierarchy_t hierarchy;
-  char *name;
-  struct s_as *routing_father;
-  xbt_dict_t routing_sons;
-  sg_routing_edge_t net_elem;
-  xbt_dynar_t link_up_down_list;
-
-  void (*get_route_and_latency) (AS_t as, sg_routing_edge_t src, sg_routing_edge_t dst, sg_platf_route_cbarg_t into, double *latency);
-
-  xbt_dynar_t(*get_onelink_routes) (AS_t as);
-  void (*get_graph) (xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges, AS_t rc);
-  sg_platf_route_cbarg_t(*get_bypass_route) (AS_t as, sg_routing_edge_t src, sg_routing_edge_t dst, double *lat);
-  void (*finalize) (AS_t as);
-
-
-  /* The parser calls the following functions to inform the routing models
-   * that a new element is added to the AS currently built.
-   *
-   * Of course, only the routing model of this AS is informed, not every ones */
-  int (*parse_PU) (AS_t as, sg_routing_edge_t elm); /* A host or a router, whatever */
-  int (*parse_AS) (AS_t as, sg_routing_edge_t elm);
-  void (*parse_route) (AS_t as, sg_platf_route_cbarg_t route);
-  void (*parse_ASroute) (AS_t as, sg_platf_route_cbarg_t route);
-  void (*parse_bypassroute) (AS_t as, sg_platf_route_cbarg_t e_route);
-
-} s_as_t;
-
-struct s_routing_platf {
-  AS_t root;
-  void *loopback;
-  xbt_dynar_t last_route;
-  xbt_dynar_t(*get_onelink_routes) (void);
-};
-
 XBT_PUBLIC(void) routing_model_create(void *loopback);
 XBT_PUBLIC(void) routing_exit(void);
 XBT_PUBLIC(void) storage_register_callbacks(void);
+
 /* ***************************************** */
 /* TUTORIAL: New TAG                         */
 XBT_PUBLIC(void) gpu_register_callbacks(void);
@@ -196,8 +84,8 @@ XBT_PUBLIC(void) generic_get_graph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict
 /**
  * Resource protected methods
  */
-XBT_PUBLIC(void) surfxml_bufferstack_push(int new);
-XBT_PUBLIC(void) surfxml_bufferstack_pop(int new);
+XBT_PUBLIC(void) surfxml_bufferstack_push(int _new);
+XBT_PUBLIC(void) surfxml_bufferstack_pop(int _new);
 
 XBT_PUBLIC_DATA(int) surfxml_bufferstack_size;
 
@@ -206,5 +94,6 @@ XBT_PUBLIC_DATA(int) surfxml_bufferstack_size;
 void TRACE_surf_host_set_power(double date, const char *resource, double power);
 void TRACE_surf_link_set_bandwidth(double date, const char *resource, double bandwidth);
 
+SG_END_DECL()
 
 #endif                          /* _SURF_SURF_PRIVATE_H */
similarity index 66%
rename from src/surf/surf_routing.c
rename to src/surf/surf_routing.cpp
index ec7334f..3828ad2 100644 (file)
@@ -1,14 +1,18 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2011, 2013-2014. 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 "surf_routing.hpp"
+#include "surf_routing_private.hpp"
+#include "surf_routing_cluster.hpp"
+#include "surf_routing_cluster_torus.hpp"
+
+
 #include "simgrid/platf_interface.h"    // platform creation API internal interface
 #include "simgrid/sg_config.h"
 
-#include "surf_routing_private.h"
-#include "surf/surf_routing.h"
 #include "surf/surfxml_parse_values.h"
 
 /**
@@ -46,19 +50,21 @@ int ROUTING_PROP_ASR_LEVEL;     //Where the properties are stored
 
 static xbt_dict_t random_value = NULL;
 
+
 /** @brief Retrieve a routing edge from its name
  *
  * Routing edges are either CPU/workstation and routers, whatever
  */
-sg_routing_edge_t sg_routing_edge_by_name_or_null(const char *name) {
-    sg_routing_edge_t net_elm = xbt_lib_get_or_null(host_lib, name, ROUTING_HOST_LEVEL);
-    if(!net_elm) net_elm = xbt_lib_get_or_null(as_router_lib, name, ROUTING_ASR_LEVEL);
+RoutingEdgePtr sg_routing_edge_by_name_or_null(const char *name) {
+  RoutingEdgePtr net_elm = (RoutingEdgePtr) xbt_lib_get_or_null(host_lib, name, ROUTING_HOST_LEVEL);
+  if (!net_elm)
+       net_elm = (RoutingEdgePtr) xbt_lib_get_or_null(as_router_lib, name, ROUTING_ASR_LEVEL);
   return net_elm;
 }
 
 /* Global vars */
-routing_platf_t routing_platf = NULL;
-AS_t current_routing = NULL;
+RoutingPlatfPtr routing_platf = NULL;
+AsPtr current_routing = NULL;
 
 /* global parse functions */
 extern xbt_dynar_t mount_list;
@@ -66,7 +72,7 @@ extern xbt_dynar_t mount_list;
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route, surf, "Routing part of surf");
 
 static void routing_parse_peer(sg_platf_peer_cbarg_t peer);     /* peer bypass */
-static void routing_parse_Srandom(void);        /* random bypass */
+// static void routing_parse_Srandom(void);        /* random bypass */
 
 static void routing_parse_postparse(void);
 
@@ -78,7 +84,9 @@ typedef enum {
   SURF_MODEL_DIJKSTRACACHE,
   SURF_MODEL_NONE,
   SURF_MODEL_VIVALDI,
-  SURF_MODEL_CLUSTER
+  SURF_MODEL_CLUSTER,
+  SURF_MODEL_TORUS_CLUSTER,
+
 } e_routing_types;
 
 struct s_model_type routing_models[] = {
@@ -100,6 +108,8 @@ struct s_model_type routing_models[] = {
    model_vivaldi_create, NULL},
   {"Cluster", "Cluster routing",
    model_cluster_create, NULL},
+   {"Torus_Cluster", "Torus Cluster routing",
+    model_torus_cluster_create, NULL},
   {NULL, NULL, NULL, NULL}
 };
 
@@ -108,32 +118,29 @@ struct s_model_type routing_models[] = {
  */
 static void parse_S_host_link(sg_platf_host_link_cbarg_t host)
 {
-  sg_routing_edge_t info = NULL;
-  info = xbt_lib_get_or_null(host_lib, host->id, ROUTING_HOST_LEVEL);
-  xbt_assert(info, "Host '%s' not found!",host->id);
-  xbt_assert(current_routing->model_desc == &routing_models[SURF_MODEL_CLUSTER] ||
-      current_routing->model_desc == &routing_models[SURF_MODEL_VIVALDI],
+  RoutingEdgePtr info = static_cast<RoutingEdgePtr>(xbt_lib_get_or_null(host_lib, host->id, ROUTING_HOST_LEVEL));
+  xbt_assert(info, "Host '%s' not found!", host->id);
+  xbt_assert(current_routing->p_modelDesc == &routing_models[SURF_MODEL_CLUSTER] ||
+      current_routing->p_modelDesc == &routing_models[SURF_MODEL_VIVALDI],
       "You have to be in model Cluster to use tag host_link!");
 
   s_surf_parsing_link_up_down_t link_up_down;
   link_up_down.link_up = xbt_lib_get_or_null(link_lib, host->link_up, SURF_LINK_LEVEL);
   link_up_down.link_down = xbt_lib_get_or_null(link_lib, host->link_down, SURF_LINK_LEVEL);
-  link_up_down.limiter_link = NULL;
-  link_up_down.loopback_link = NULL;
 
   xbt_assert(link_up_down.link_up, "Link '%s' not found!",host->link_up);
   xbt_assert(link_up_down.link_down, "Link '%s' not found!",host->link_down);
 
-  if(!current_routing->link_up_down_list)
-    current_routing->link_up_down_list = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
+  if(!current_routing->p_linkUpDownList)
+    current_routing->p_linkUpDownList = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
 
   // If dynar is is greater than edge id and if the host_link is already defined
-  if(xbt_dynar_length(current_routing->link_up_down_list) > info->id &&
-      xbt_dynar_get_as(current_routing->link_up_down_list,info->id,void*))
+  if((int)xbt_dynar_length(current_routing->p_linkUpDownList) > info->getId() &&
+      xbt_dynar_get_as(current_routing->p_linkUpDownList, info->getId(), void*))
     xbt_die("Host_link for '%s' is already defined!",host->id);
 
-  XBT_DEBUG("Push Host_link for host '%s' to position %d",info->name,info->id);
-  xbt_dynar_set_as(current_routing->link_up_down_list,info->id,s_surf_parsing_link_up_down_t,link_up_down);
+  XBT_DEBUG("Push Host_link for host '%s' to position %d", info->getName(), info->getId());
+  xbt_dynar_set_as(current_routing->p_linkUpDownList, info->getId(), s_surf_parsing_link_up_down_t, link_up_down);
 }
 
 /**
@@ -141,19 +148,18 @@ static void parse_S_host_link(sg_platf_host_link_cbarg_t host)
  */
 static void parse_S_host(sg_platf_host_cbarg_t host)
 {
-  sg_routing_edge_t info = NULL;
-  if (current_routing->hierarchy == SURF_ROUTING_NULL)
-    current_routing->hierarchy = SURF_ROUTING_BASE;
+  if (current_routing->p_hierarchy == SURF_ROUTING_NULL)
+    current_routing->p_hierarchy = SURF_ROUTING_BASE;
   xbt_assert(!xbt_lib_get_or_null(host_lib, host->id, ROUTING_HOST_LEVEL),
              "Reading a host, processing unit \"%s\" already exists", host->id);
 
-  info = xbt_new0(s_routing_edge_t, 1);
-  info->rc_component = current_routing;
-  info->rc_type = SURF_NETWORK_ELEMENT_HOST;
-  info->name = xbt_strdup(host->id);
-  info->id = current_routing->parse_PU(current_routing, (void *) info);
+  RoutingEdgePtr info = new RoutingEdgeImpl(xbt_strdup(host->id),
+                                                   -1,
+                                                   SURF_NETWORK_ELEMENT_HOST,
+                                                   current_routing);
+  info->setId(current_routing->parsePU(info));
   xbt_lib_set(host_lib, host->id, ROUTING_HOST_LEVEL, (void *) info);
-  XBT_DEBUG("Having set name '%s' id '%d'",host->id,info->id);
+  XBT_DEBUG("Having set name '%s' id '%d'", host->id, info->getId());
 
   if(mount_list){
     xbt_lib_set(storage_lib, host->id, ROUTING_STORAGE_HOST_LEVEL, (void *) mount_list);
@@ -185,20 +191,19 @@ static void parse_S_host(sg_platf_host_cbarg_t host)
  */
 static void parse_S_router(sg_platf_router_cbarg_t router)
 {
-  sg_routing_edge_t info = NULL;
-  if (current_routing->hierarchy == SURF_ROUTING_NULL)
-    current_routing->hierarchy = SURF_ROUTING_BASE;
+  if (current_routing->p_hierarchy == SURF_ROUTING_NULL)
+    current_routing->p_hierarchy = SURF_ROUTING_BASE;
   xbt_assert(!xbt_lib_get_or_null(as_router_lib, router->id, ROUTING_ASR_LEVEL),
              "Reading a router, processing unit \"%s\" already exists",
              router->id);
 
-  info = xbt_new0(s_routing_edge_t, 1);
-  info->rc_component = current_routing;
-  info->rc_type = SURF_NETWORK_ELEMENT_ROUTER;
-  info->name = xbt_strdup(router->id);
-  info->id = current_routing->parse_PU(current_routing, (void *) info);
+  RoutingEdgePtr info = new RoutingEdgeImpl(xbt_strdup(router->id),
+                                            -1,
+                                            SURF_NETWORK_ELEMENT_ROUTER,
+                                            current_routing);
+  info->setId(current_routing->parsePU(info));
   xbt_lib_set(as_router_lib, router->id, ROUTING_ASR_LEVEL, (void *) info);
-  XBT_DEBUG("Having set name '%s' id '%d'",router->id,info->id);
+  XBT_DEBUG("Having set name '%s' id '%d'", router->id, info->getId());
 
   if (router->coord && strcmp(router->coord, "")) {
     unsigned int cursor;
@@ -225,11 +230,11 @@ static void parse_S_router(sg_platf_router_cbarg_t router)
  */
 static void parse_E_route(sg_platf_route_cbarg_t route)
 {
-  xbt_assert(current_routing->parse_route,
+  /*FIXME:REMOVE:xbt_assert(current_routing->parse_route,
              "no defined method \"set_route\" in \"%s\"",
-             current_routing->name);
+             current_routing->name);*/
 
-  current_routing->parse_route(current_routing, route);
+  current_routing->parseRoute(route);
 }
 
 /**
@@ -237,10 +242,10 @@ static void parse_E_route(sg_platf_route_cbarg_t route)
  */
 static void parse_E_ASroute(sg_platf_route_cbarg_t ASroute)
 {
-  xbt_assert(current_routing->parse_ASroute,
+  /*FIXME:REMOVE:xbt_assert(current_routing->parse_ASroute,
              "no defined method \"set_ASroute\" in \"%s\"",
-             current_routing->name);
-  current_routing->parse_ASroute(current_routing, ASroute);
+             current_routing->name);*/
+  current_routing->parseASroute(ASroute);
 }
 
 /**
@@ -248,11 +253,11 @@ static void parse_E_ASroute(sg_platf_route_cbarg_t ASroute)
  */
 static void parse_E_bypassRoute(sg_platf_route_cbarg_t route)
 {
-  xbt_assert(current_routing->parse_bypassroute,
+  /*FIXME:REMOVE:xbt_assert(current_routing->parse_bypassroute,
              "Bypassing mechanism not implemented by routing '%s'",
-             current_routing->name);
+             current_routing->name);*/
 
-  current_routing->parse_bypassroute(current_routing, route);
+  current_routing->parseBypassroute(route);
 }
 
 /**
@@ -260,10 +265,10 @@ static void parse_E_bypassRoute(sg_platf_route_cbarg_t route)
  */
 static void parse_E_bypassASroute(sg_platf_route_cbarg_t ASroute)
 {
-  xbt_assert(current_routing->parse_bypassroute,
+  /*FIXME:REMOVE:xbt_assert(current_routing->parse_bypassroute,
              "Bypassing mechanism not implemented by routing '%s'",
-             current_routing->name);
-  current_routing->parse_bypassroute(current_routing, ASroute);
+             current_routing->name);*/
+  current_routing->parseBypassroute(ASroute);
 }
 
 static void routing_parse_trace(sg_platf_trace_cbarg_t trace)
@@ -336,7 +341,6 @@ static void routing_parse_trace_connect(sg_platf_trace_connect_cbarg_t trace_con
 void routing_AS_begin(sg_platf_AS_cbarg_t AS)
 {
   XBT_DEBUG("routing_AS_begin");
-  AS_t new_as;
   routing_model_description_t model = NULL;
 
   xbt_assert(!xbt_lib_get_or_null
@@ -349,62 +353,61 @@ void routing_AS_begin(sg_platf_AS_cbarg_t AS)
 
   /* search the routing model */
   switch(AS->routing){
-    case A_surfxml_AS_routing_Cluster:       model = &routing_models[SURF_MODEL_CLUSTER];break;
-    case A_surfxml_AS_routing_Dijkstra:      model = &routing_models[SURF_MODEL_DIJKSTRA];break;
-    case A_surfxml_AS_routing_DijkstraCache: model = &routing_models[SURF_MODEL_DIJKSTRACACHE];break;
-    case A_surfxml_AS_routing_Floyd:         model = &routing_models[SURF_MODEL_FLOYD];break;
-    case A_surfxml_AS_routing_Full:          model = &routing_models[SURF_MODEL_FULL];break;
-    case A_surfxml_AS_routing_None:          model = &routing_models[SURF_MODEL_NONE];break;
-    case A_surfxml_AS_routing_Vivaldi:       model = &routing_models[SURF_MODEL_VIVALDI];break;
+    case A_surfxml_AS_routing_Cluster:         model = &routing_models[SURF_MODEL_CLUSTER];break;
+    case A_surfxml_AS_routing_Cluster___torus: model = &routing_models[SURF_MODEL_TORUS_CLUSTER];break;
+    case A_surfxml_AS_routing_Dijkstra:        model = &routing_models[SURF_MODEL_DIJKSTRA];break;
+    case A_surfxml_AS_routing_DijkstraCache:   model = &routing_models[SURF_MODEL_DIJKSTRACACHE];break;
+    case A_surfxml_AS_routing_Floyd:           model = &routing_models[SURF_MODEL_FLOYD];break;
+    case A_surfxml_AS_routing_Full:            model = &routing_models[SURF_MODEL_FULL];break;
+    case A_surfxml_AS_routing_None:            model = &routing_models[SURF_MODEL_NONE];break;
+    case A_surfxml_AS_routing_Vivaldi:         model = &routing_models[SURF_MODEL_VIVALDI];break;
     default: xbt_die("Not a valid model!!!");
     break;
   }
 
   /* make a new routing component */
-  new_as = (AS_t) model->create();
-  new_as->model_desc = model;
-  new_as->hierarchy = SURF_ROUTING_NULL;
-  new_as->name = xbt_strdup(AS->id);
+  AsPtr new_as = model->create();
 
-  sg_routing_edge_t info = NULL;
-  info = xbt_new0(s_routing_edge_t, 1);
+  new_as->p_modelDesc = model;
+  new_as->p_hierarchy = SURF_ROUTING_NULL;
+  new_as->p_name = xbt_strdup(AS->id);
 
-  if (current_routing == NULL && routing_platf->root == NULL) {
+  RoutingEdgePtr info = new RoutingEdgeImpl(xbt_strdup(new_as->p_name),
+                                            -1,
+                                            SURF_NETWORK_ELEMENT_AS,
+                                            current_routing);
+  if (current_routing == NULL && routing_platf->p_root == NULL) {
 
     /* it is the first one */
-    new_as->routing_father = NULL;
-    routing_platf->root = new_as;
-    info->id = -1;
-  } else if (current_routing != NULL && routing_platf->root != NULL) {
+    new_as->p_routingFather = NULL;
+    routing_platf->p_root = new_as;
+    info->setId(-1);
+  } else if (current_routing != NULL && routing_platf->p_root != NULL) {
 
     xbt_assert(!xbt_dict_get_or_null
-               (current_routing->routing_sons, AS->id),
+               (current_routing->p_routingSons, AS->id),
                "The AS \"%s\" already exists", AS->id);
     /* it is a part of the tree */
-    new_as->routing_father = current_routing;
+    new_as->p_routingFather = current_routing;
     /* set the father behavior */
-    if (current_routing->hierarchy == SURF_ROUTING_NULL)
-      current_routing->hierarchy = SURF_ROUTING_RECURSIVE;
+    if (current_routing->p_hierarchy == SURF_ROUTING_NULL)
+      current_routing->p_hierarchy = SURF_ROUTING_RECURSIVE;
     /* add to the sons dictionary */
-    xbt_dict_set(current_routing->routing_sons, AS->id,
+    xbt_dict_set(current_routing->p_routingSons, AS->id,
                  (void *) new_as, NULL);
     /* add to the father element list */
-    info->id = current_routing->parse_AS(current_routing, (void *) info);
+    info->setId(current_routing->parseAS(info));
   } else {
     THROWF(arg_error, 0, "All defined components must be belong to a AS");
   }
 
-  info->rc_component = new_as->routing_father;
-  info->rc_type = SURF_NETWORK_ELEMENT_AS;
-  info->name = new_as->name;
-
-  xbt_lib_set(as_router_lib, info->name, ROUTING_ASR_LEVEL,
+  xbt_lib_set(as_router_lib, info->getName(), ROUTING_ASR_LEVEL,
               (void *) info);
-  XBT_DEBUG("Having set name '%s' id '%d'",new_as->name,info->id);
+  XBT_DEBUG("Having set name '%s' id '%d'", new_as->p_name, info->getId());
 
   /* set the new current component of the tree */
   current_routing = new_as;
-  current_routing->net_elem = info;
+  current_routing->p_netElem = info;
 
 }
 
@@ -419,15 +422,15 @@ void routing_AS_begin(sg_platf_AS_cbarg_t AS)
  * even if you add stuff to a closed AS
  *
  */
-void routing_AS_end(sg_platf_AS_cbarg_t AS)
+void routing_AS_end(sg_platf_AS_cbarg_t /*AS*/)
 {
 
   if (current_routing == NULL) {
     THROWF(arg_error, 0, "Close an AS, but none was under construction");
   } else {
-    if (current_routing->model_desc->end)
-      current_routing->model_desc->end(current_routing);
-    current_routing = current_routing->routing_father;
+    if (current_routing->p_modelDesc->end)
+      current_routing->p_modelDesc->end(current_routing);
+    current_routing = current_routing->p_routingFather;
   }
 }
 
@@ -436,10 +439,10 @@ void routing_AS_end(sg_platf_AS_cbarg_t AS)
 /**
  * \brief Get the AS father and the first elements of the chain
  *
- * \param src the source host name 
+ * \param src the source host name
  * \param dst the destination host name
- * 
- * Get the common father of the to processing units, and the first different 
+ *
+ * Get the common father of the to processing units, and the first different
  * father in the chain
  */
 static void elements_father(sg_routing_edge_t src, sg_routing_edge_t dst,
@@ -449,36 +452,36 @@ static void elements_father(sg_routing_edge_t src, sg_routing_edge_t dst,
 {
   xbt_assert(src && dst, "bad parameters for \"elements_father\" method");
 #define ELEMENTS_FATHER_MAXDEPTH 16     /* increase if it is not enough */
-  AS_t src_as, dst_as;
-  AS_t path_src[ELEMENTS_FATHER_MAXDEPTH];
-  AS_t path_dst[ELEMENTS_FATHER_MAXDEPTH];
+  AsPtr src_as, dst_as;
+  AsPtr path_src[ELEMENTS_FATHER_MAXDEPTH];
+  AsPtr path_dst[ELEMENTS_FATHER_MAXDEPTH];
   int index_src = 0;
   int index_dst = 0;
-  AS_t current;
-  AS_t current_src;
-  AS_t current_dst;
-  AS_t father;
+  AsPtr current;
+  AsPtr current_src;
+  AsPtr current_dst;
+  AsPtr father;
 
   /* (1) find the as where the src and dst are located */
   sg_routing_edge_t src_data = src;
   sg_routing_edge_t dst_data = dst;
-  src_as = src_data->rc_component;
-  dst_as = dst_data->rc_component;
+  src_as = src_data->getRcComponent();
+  dst_as = dst_data->getRcComponent();
 #ifndef NDEBUG
-  char* src_name = src_data->name;
-  char* dst_name = dst_data->name;
+  char* src_name = src_data->getName();
+  char* dst_name = dst_data->getName();
 #endif
 
   xbt_assert(src_as && dst_as,
              "Ask for route \"from\"(%s) or \"to\"(%s) no found", src_name, dst_name);
 
   /* (2) find the path to the root routing component */
-  for (current = src_as; current != NULL; current = current->routing_father) {
+  for (current = src_as; current != NULL; current = current->p_routingFather) {
     if (index_src >= ELEMENTS_FATHER_MAXDEPTH)
       xbt_die("ELEMENTS_FATHER_MAXDEPTH should be increased for path_src");
     path_src[index_src++] = current;
   }
-  for (current = dst_as; current != NULL; current = current->routing_father) {
+  for (current = dst_as; current != NULL; current = current->p_routingFather) {
     if (index_dst >= ELEMENTS_FATHER_MAXDEPTH)
       xbt_die("ELEMENTS_FATHER_MAXDEPTH should be increased for path_dst");
     path_dst[index_dst++] = current;
@@ -509,33 +512,34 @@ static void elements_father(sg_routing_edge_t src, sg_routing_edge_t dst,
 /**
  * \brief Recursive function for get_route_latency
  *
- * \param src the source host name 
+ * \param src the source host name
  * \param dst the destination host name
  * \param *route the route where the links are stored. It is either NULL or a ready to use dynar
  * \param *latency the latency, if needed
- * 
+ *
  * This function is called by "get_route" and "get_latency". It allows to walk
  * recursively through the ASes tree.
  */
-static void _get_route_and_latency(sg_routing_edge_t src, sg_routing_edge_t dst,
+static void _get_route_and_latency(RoutingEdgePtr src, RoutingEdgePtr dst,
                                    xbt_dynar_t * links, double *latency)
 {
   s_sg_platf_route_cbarg_t route;
   memset(&route,0,sizeof(route));
 
   xbt_assert(src && dst, "bad parameters for \"_get_route_latency\" method");
-  XBT_DEBUG("Solve route/latency  \"%s\" to \"%s\"", src->name, dst->name);
+  XBT_DEBUG("Solve route/latency  \"%s\" to \"%s\"", src->getName(), dst->getName());
 
   /* Find how src and dst are interconnected */
-  AS_t common_father, src_father, dst_father;
+  AsPtr common_father, src_father, dst_father;
   elements_father(src, dst, &common_father, &src_father, &dst_father);
   XBT_DEBUG("elements_father: common father '%s' src_father '%s' dst_father '%s'",
-      common_father->name,src_father->name,dst_father->name);
+      common_father->p_name, src_father->p_name, dst_father->p_name);
 
   /* Check whether a direct bypass is defined */
   sg_platf_route_cbarg_t e_route_bypass = NULL;
-  if (common_father->get_bypass_route)
-    e_route_bypass = common_father->get_bypass_route(common_father, src, dst, latency);
+  //FIXME:REMOVE:if (common_father->get_bypass_route)
+
+  e_route_bypass = common_father->getBypassRoute(src, dst, latency);
 
   /* Common ancestor is kind enough to declare a bypass route from src to dst -- use it and bail out */
   if (e_route_bypass) {
@@ -547,7 +551,7 @@ static void _get_route_and_latency(sg_routing_edge_t src, sg_routing_edge_t dst,
   /* If src and dst are in the same AS, life is good */
   if (src_father == dst_father) {       /* SURF_ROUTING_BASE */
     route.link_list = *links;
-    common_father->get_route_and_latency(common_father, src, dst, &route,latency);
+    common_father->getRouteAndLatency(src, dst, &route, latency);
     // if vivaldi latency+=vivaldi(src,dst)
     return;
   }
@@ -556,15 +560,14 @@ static void _get_route_and_latency(sg_routing_edge_t src, sg_routing_edge_t dst,
 
   route.link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
   // Find the net_card corresponding to father
-  sg_routing_edge_t src_father_net_elm = src_father->net_elem;
-  sg_routing_edge_t dst_father_net_elm = dst_father->net_elem;
+  RoutingEdgePtr src_father_net_elm = src_father->p_netElem;
+  RoutingEdgePtr dst_father_net_elm = dst_father->p_netElem;
 
-  common_father->get_route_and_latency(common_father,
-                                       src_father_net_elm, dst_father_net_elm,
-                                       &route, latency);
+  common_father->getRouteAndLatency(src_father_net_elm, dst_father_net_elm,
+                                    &route, latency);
 
   xbt_assert((route.gw_src != NULL) && (route.gw_dst != NULL),
-      "bad gateways for route from \"%s\" to \"%s\"", src->name, dst->name);
+      "bad gateways for route from \"%s\" to \"%s\"", src->getName(), dst->getName());
 
   sg_routing_edge_t src_gateway_net_elm = route.gw_src;
   sg_routing_edge_t dst_gateway_net_elm = route.gw_dst;
@@ -581,6 +584,15 @@ static void _get_route_and_latency(sg_routing_edge_t src, sg_routing_edge_t dst,
   // if vivaldi latency+=vivaldi(src_gateway,dst_gateway)
 }
 
+AS_t surf_platf_get_root(routing_platf_t platf){
+  return platf->p_root;
+}
+
+e_surf_network_element_type_t surf_routing_edge_get_rc_type(sg_routing_edge_t edge){
+  return edge->getRcType();
+}
+
+
 /**
  * \brief Find a route between hosts
  *
@@ -595,28 +607,31 @@ static void _get_route_and_latency(sg_routing_edge_t src, sg_routing_edge_t dst,
  * walk through the routing components tree and find a route between hosts
  * by calling the differents "get_route" functions in each routing component.
  */
-void routing_get_route_and_latency(sg_routing_edge_t src,
-                                   sg_routing_edge_t dst,
-                                   xbt_dynar_t * route, double *latency)
+void RoutingPlatf::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst,
+                                   xbt_dynar_t* route, double *latency)
 {
-  XBT_DEBUG("routing_get_route_and_latency from %s to %s",src->name,dst->name);
+  XBT_DEBUG("routing_get_route_and_latency from %s to %s", src->getName(), dst->getName());
   if (!*route) {
-    xbt_dynar_reset(routing_platf->last_route);
-    *route = routing_platf->last_route;
+    xbt_dynar_reset(routing_platf->p_lastRoute);
+    *route = routing_platf->p_lastRoute;
   }
 
   _get_route_and_latency(src, dst, route, latency);
 
   xbt_assert(!latency || *latency >= 0.0,
-             "negative latency on route between \"%s\" and \"%s\"", src->name, dst->name);
+             "negative latency on route between \"%s\" and \"%s\"", src->getName(), dst->getName());
+}
+
+xbt_dynar_t RoutingPlatf::getOneLinkRoutes(){
+  return recursiveGetOneLinkRoutes(p_root);
 }
 
-static xbt_dynar_t recursive_get_onelink_routes(AS_t rc)
+xbt_dynar_t RoutingPlatf::recursiveGetOneLinkRoutes(AsPtr rc)
 {
-  xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
+  xbt_dynar_t ret = xbt_dynar_new(sizeof(OnelinkPtr), xbt_free);
 
   //adding my one link routes
-  xbt_dynar_t onelink_mine = rc->get_onelink_routes(rc);
+  xbt_dynar_t onelink_mine = rc->getOneLinkRoutes();
   if (onelink_mine)
     xbt_dynar_merge(&ret,&onelink_mine);
 
@@ -624,41 +639,35 @@ static xbt_dynar_t recursive_get_onelink_routes(AS_t rc)
   char *key;
   xbt_dict_cursor_t cursor = NULL;
   AS_t rc_child;
-  xbt_dict_foreach(rc->routing_sons, cursor, key, rc_child) {
-    xbt_dynar_t onelink_child = recursive_get_onelink_routes(rc_child);
+  xbt_dict_foreach(rc->p_routingSons, cursor, key, rc_child) {
+    xbt_dynar_t onelink_child = recursiveGetOneLinkRoutes(rc_child);
     if (onelink_child)
       xbt_dynar_merge(&ret,&onelink_child);
   }
   return ret;
 }
 
-static xbt_dynar_t get_onelink_routes(void)
-{
-  return recursive_get_onelink_routes(routing_platf->root);
-}
-
 e_surf_network_element_type_t routing_get_network_element_type(const char *name)
 {
-  sg_routing_edge_t rc = sg_routing_edge_by_name_or_null(name);
+  RoutingEdgePtr rc = sg_routing_edge_by_name_or_null(name);
   if (rc)
-    return rc->rc_type;
+    return rc->getRcType();
 
   return SURF_NETWORK_ELEMENT_NULL;
 }
 
 /**
  * \brief Generic method: create the global routing schema
- * 
+ *
  * Make a global routing structure and set all the parsing functions.
  */
 void routing_model_create( void *loopback)
 {
   /* config the uniq global routing */
-  routing_platf = xbt_new0(s_routing_platf_t, 1);
-  routing_platf->root = NULL;
-  routing_platf->get_onelink_routes = get_onelink_routes;
-  routing_platf->loopback = loopback;
-  routing_platf->last_route = xbt_dynar_new(sizeof(sg_routing_link_t),NULL);
+  routing_platf = new RoutingPlatf();
+  routing_platf->p_root = NULL;
+  routing_platf->p_loopback = loopback;
+  routing_platf->p_lastRoute = xbt_dynar_new(sizeof(sg_routing_link_t),NULL);
   /* no current routing at moment */
   current_routing = NULL;
 }
@@ -711,11 +720,11 @@ void routing_model_create( void *loopback)
 /* ************************* GENERIC PARSE FUNCTIONS ************************ */
 
 void routing_cluster_add_backbone(void* bb) {
-  xbt_assert(current_routing->model_desc == &routing_models[SURF_MODEL_CLUSTER],
+  xbt_assert(current_routing->p_modelDesc == &routing_models[SURF_MODEL_CLUSTER],
         "You have to be in model Cluster to use tag backbone!");
-  xbt_assert(!((as_cluster_t)current_routing)->backbone,"The backbone link is already defined!");
-  ((as_cluster_t)current_routing)->backbone = bb;
-  XBT_DEBUG("Add a backbone to AS '%s'",current_routing->name);
+  xbt_assert(!surf_as_cluster_get_backbone(current_routing), "The backbone link is already defined!");
+  surf_as_cluster_set_backbone(current_routing, bb);
+  XBT_DEBUG("Add a backbone to AS '%s'", current_routing->p_name);
 }
 
 static void routing_parse_cabinet(sg_platf_cabinet_cbarg_t cabinet)
@@ -794,6 +803,7 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster)
 {
   char *host_id, *groups, *link_id = NULL;
   xbt_dict_t patterns = NULL;
+  int rankId=0;
 
   s_sg_platf_host_cbarg_t host;
   s_sg_platf_link_cbarg_t link;
@@ -811,13 +821,37 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster)
     xbt_dict_set(patterns, "suffix", xbt_strdup(cluster->suffix), NULL);
   }
 
-  XBT_DEBUG("<AS id=\"%s\"\trouting=\"Cluster\">", cluster->id);
+  /* parse the topology attribute. If we are not in a flat cluster,
+   * switch to the right mode and initialize the routing with
+   * the parameters in topo_parameters attribute
+   */
   s_sg_platf_AS_cbarg_t AS = SG_PLATF_AS_INITIALIZER;
   AS.id = cluster->id;
-  AS.routing = A_surfxml_AS_routing_Cluster;
-  sg_platf_new_AS_begin(&AS);
 
-  current_routing->link_up_down_list
+  if(cluster->topology == SURF_CLUSTER_TORUS){
+    XBT_DEBUG("<AS id=\"%s\"\trouting=\"Torus_Cluster\">", cluster->id);
+    AS.routing = A_surfxml_AS_routing_Cluster___torus;
+    sg_platf_new_AS_begin(&AS);
+    ((AsClusterTorusPtr)current_routing)->parse_specific_arguments(cluster);
+  }else{
+    XBT_DEBUG("<AS id=\"%s\"\trouting=\"Cluster\">", cluster->id);
+    AS.routing = A_surfxml_AS_routing_Cluster;
+    sg_platf_new_AS_begin(&AS);
+  }
+
+  if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){
+      ((AsClusterPtr)current_routing)->p_nb_links_per_node++;
+      ((AsClusterPtr)current_routing)->p_has_loopback=1;
+  }
+
+  if(cluster->limiter_link!=0){
+      ((AsClusterPtr)current_routing)->p_nb_links_per_node++;
+      ((AsClusterPtr)current_routing)->p_has_limiter=1;
+  }
+
+
+
+  current_routing->p_linkUpDownList
             = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
 
   //Make all hosts
@@ -882,73 +916,71 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster)
       XBT_DEBUG("<link\tid=\"%s\"\tbw=\"%f\"\tlat=\"%f\"/>", link_id,
                 cluster->bw, cluster->lat);
 
-      memset(&link, 0, sizeof(link));
-      link.id = link_id;
-      link.bandwidth = cluster->bw;
-      link.latency = cluster->lat;
-      link.state = SURF_RESOURCE_ON;
-      link.policy = cluster->sharing_policy;
-      sg_platf_new_link(&link);
 
-      s_surf_parsing_link_up_down_t info;
+      s_surf_parsing_link_up_down_t info_lim, info_loop;
+      // All links are saved in a matrix;
+      // every row describes a single node; every node
+      // may have multiple links.
+      // the first column may store a link from x to x if p_has_loopback is set
+      // the second column may store a limiter link if p_has_limiter is set
+      // other columns are to store one or more link for the node
 
-      if (link.policy == SURF_LINK_FULLDUPLEX) {
-        char *tmp_link = bprintf("%s_UP", link_id);
-        info.link_up =
-            xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
-        free(tmp_link);
-        tmp_link = bprintf("%s_DOWN", link_id);
-        info.link_down =
-            xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
-        free(tmp_link);
-      } else {
-        info.link_up = xbt_lib_get_or_null(link_lib, link_id, SURF_LINK_LEVEL);
-        info.link_down = info.link_up;
-      }
-      
-      if(cluster->limiter_link!=0){      
-        char *tmp_link = bprintf("%s_limiter", link_id);
-        XBT_DEBUG("<limiter\tid=\"%s\"\tbw=\"%f\"/>", tmp_link,
+      //add a loopback link
+      if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){
+        char *tmp_link = bprintf("%s_loopback", link_id);
+        XBT_DEBUG("<loopback\tid=\"%s\"\tbw=\"%f\"/>", tmp_link,
                 cluster->limiter_link);
 
-        
+
         memset(&link, 0, sizeof(link));
         link.id = tmp_link;
-        link.bandwidth = cluster->limiter_link;
-        link.latency = 0;
+        link.bandwidth = cluster->loopback_bw;
+        link.latency = cluster->loopback_lat;
         link.state = SURF_RESOURCE_ON;
-        link.policy = SURF_LINK_SHARED;
+        link.policy = SURF_LINK_FATPIPE;
         sg_platf_new_link(&link);
-         info.limiter_link =
+        info_loop.link_up =
             xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+        info_loop.link_down = info_loop.link_up;
         free(tmp_link);
-      }else{
-        info.limiter_link =NULL;
+        xbt_dynar_set(current_routing->p_linkUpDownList, rankId*((AsClusterPtr)current_routing)->p_nb_links_per_node, &info_loop);
       }
-      
-      if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){      
-        char *tmp_link = bprintf("%s_loopback", link_id);
-        XBT_DEBUG("<loopback\tid=\"%s\"\tbw=\"%f\"/>", tmp_link,
+
+      //add a limiter link (shared link to account for maximal bandwidth of the node)
+      if(cluster->limiter_link!=0){
+        char *tmp_link = bprintf("%s_limiter", link_id);
+        XBT_DEBUG("<limiter\tid=\"%s\"\tbw=\"%f\"/>", tmp_link,
                 cluster->limiter_link);
 
-        
+
         memset(&link, 0, sizeof(link));
         link.id = tmp_link;
-        link.bandwidth = cluster->loopback_bw;
-        link.latency = cluster->loopback_lat;
+        link.bandwidth = cluster->limiter_link;
+        link.latency = 0;
         link.state = SURF_RESOURCE_ON;
-        link.policy = SURF_LINK_FATPIPE;
+        link.policy = SURF_LINK_SHARED;
         sg_platf_new_link(&link);
-         info.loopback_link =
+        info_lim.link_up =
             xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+        info_lim.link_down = info_lim.link_up;
         free(tmp_link);
-      }else{
-        info.loopback_link =NULL;
+        xbt_dynar_set(current_routing->p_linkUpDownList,
+            rankId*((AsClusterPtr)current_routing)->p_nb_links_per_node + ((AsClusterPtr)current_routing)->p_has_loopback ,
+            &info_lim);
+
       }
-      
-      xbt_dynar_push(current_routing->link_up_down_list,&info);
+
+
+      //call the cluster function that adds the others links
+
+      ((AsClusterPtr)current_routing)->create_links_for_node(cluster, i, rankId, rankId*
+          ((AsClusterPtr)current_routing)->p_nb_links_per_node
+          + ((AsClusterPtr)current_routing)->p_has_loopback
+          + ((AsClusterPtr)current_routing)->p_has_limiter );
+
       xbt_free(link_id);
       xbt_free(host_id);
+      rankId++;
     }
 
     xbt_dynar_free(&radical_ends);
@@ -969,7 +1001,7 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster)
         bprintf("%s%s_router%s", cluster->prefix, cluster->id,
                 cluster->suffix);
   sg_platf_new_router(&router);
-  ((as_cluster_t)current_routing)->router = xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL);
+  ((AsClusterPtr)current_routing)->p_router = (RoutingEdgePtr) xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL);
   free(newid);
 
   //Make the backbone
@@ -1019,8 +1051,7 @@ static void routing_parse_peer(sg_platf_peer_cbarg_t peer)
   AS.routing = A_surfxml_AS_routing_Cluster;
   sg_platf_new_AS_begin(&AS);
 
-  current_routing->link_up_down_list
-            = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
+  current_routing->p_linkUpDownList = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
 
   XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\"/>", host_id, peer->power);
   s_sg_platf_host_cbarg_t host;
@@ -1073,7 +1104,7 @@ static void routing_parse_peer(sg_platf_peer_cbarg_t peer)
   router.id = router_id;
   router.coord = peer->coord;
   sg_platf_new_router(&router);
-  ((as_cluster_t)current_routing)->router = xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL);
+  static_cast<AsClusterPtr>(current_routing)->p_router = static_cast<RoutingEdgePtr>(xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL));
 
   XBT_DEBUG("</AS>");
   sg_platf_new_AS_end();
@@ -1087,125 +1118,125 @@ static void routing_parse_peer(sg_platf_peer_cbarg_t peer)
   free(link_down);
 }
 
-static void routing_parse_Srandom(void)
-{
-  double mean, std, min, max, seed;
-  char *random_id = A_surfxml_random_id;
-  char *random_radical = A_surfxml_random_radical;
-  char *rd_name = NULL;
-  char *rd_value;
-  mean = surf_parse_get_double(A_surfxml_random_mean);
-  std = surf_parse_get_double(A_surfxml_random_std___deviation);
-  min = surf_parse_get_double(A_surfxml_random_min);
-  max = surf_parse_get_double(A_surfxml_random_max);
-  seed = surf_parse_get_double(A_surfxml_random_seed);
-
-  double res = 0;
-  int i = 0;
-  random_data_t random = xbt_new0(s_random_data_t, 1);
-  char *tmpbuf;
-
-  xbt_dynar_t radical_elements;
-  unsigned int iter;
-  char *groups;
-  int start, end;
-  xbt_dynar_t radical_ends;
-
-  switch (A_surfxml_random_generator) {
-  case AU_surfxml_random_generator:
-  case A_surfxml_random_generator_NONE:
-    random->generator = NONE;
-    break;
-  case A_surfxml_random_generator_DRAND48:
-    random->generator = DRAND48;
-    break;
-  case A_surfxml_random_generator_RAND:
-    random->generator = RAND;
-    break;
-  case A_surfxml_random_generator_RNGSTREAM:
-    random->generator = RNGSTREAM;
-    break;
-  default:
-    surf_parse_error("Invalid random generator");
-    break;
-  }
-  random->seed = seed;
-  random->min = min;
-  random->max = max;
-
-  /* Check user stupidities */
-  if (max < min)
-    THROWF(arg_error, 0, "random->max < random->min (%f < %f)", max, min);
-  if (mean < min)
-    THROWF(arg_error, 0, "random->mean < random->min (%f < %f)", mean, min);
-  if (mean > max)
-    THROWF(arg_error, 0, "random->mean > random->max (%f > %f)", mean, max);
-
-  /* normalize the mean and standard deviation before storing */
-  random->mean = (mean - min) / (max - min);
-  random->std = std / (max - min);
-
-  if (random->mean * (1 - random->mean) < random->std * random->std)
-    THROWF(arg_error, 0, "Invalid mean and standard deviation (%f and %f)",
-           random->mean, random->std);
-
-  XBT_DEBUG
-      ("id = '%s' min = '%f' max = '%f' mean = '%f' std_deviatinon = '%f' generator = '%d' seed = '%ld' radical = '%s'",
-       random_id, random->min, random->max, random->mean, random->std,
-       (int)random->generator, random->seed, random_radical);
-
-  if (!random_value)
-    random_value = xbt_dict_new_homogeneous(free);
-
-  if (!strcmp(random_radical, "")) {
-    res = random_generate(random);
-    rd_value = bprintf("%f", res);
-    xbt_dict_set(random_value, random_id, rd_value, NULL);
-  } else {
-    radical_elements = xbt_str_split(random_radical, ",");
-    xbt_dynar_foreach(radical_elements, iter, groups) {
-      radical_ends = xbt_str_split(groups, "-");
-      switch (xbt_dynar_length(radical_ends)) {
-      case 1:
-        xbt_assert(!xbt_dict_get_or_null(random_value, random_id),
-                   "Custom Random '%s' already exists !", random_id);
-        res = random_generate(random);
-        tmpbuf =
-            bprintf("%s%d", random_id,
-                    atoi(xbt_dynar_getfirst_as(radical_ends, char *)));
-        xbt_dict_set(random_value, tmpbuf, bprintf("%f", res), NULL);
-        xbt_free(tmpbuf);
-        break;
-
-      case 2:
-        start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *));
-        end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *));
-        for (i = start; i <= end; i++) {
-          xbt_assert(!xbt_dict_get_or_null(random_value, random_id),
-                     "Custom Random '%s' already exists !", bprintf("%s%d",
-                                                                    random_id,
-                                                                    i));
-          res = random_generate(random);
-          tmpbuf = bprintf("%s%d", random_id, i);
-          xbt_dict_set(random_value, tmpbuf, bprintf("%f", res), NULL);
-          xbt_free(tmpbuf);
-        }
-        break;
-      default:
-        XBT_CRITICAL("Malformed radical");
-        break;
-      }
-      res = random_generate(random);
-      rd_name = bprintf("%s_router", random_id);
-      rd_value = bprintf("%f", res);
-      xbt_dict_set(random_value, rd_name, rd_value, NULL);
-
-      xbt_dynar_free(&radical_ends);
-    }
-    free(rd_name);
-    xbt_dynar_free(&radical_elements);
-  }
-}
+// static void routing_parse_Srandom(void)
+// {
+//   double mean, std, min, max, seed;
+//   char *random_id = A_surfxml_random_id;
+//   char *random_radical = A_surfxml_random_radical;
+//   char *rd_name = NULL;
+//   char *rd_value;
+//   mean = surf_parse_get_double(A_surfxml_random_mean);
+//   std = surf_parse_get_double(A_surfxml_random_std___deviation);
+//   min = surf_parse_get_double(A_surfxml_random_min);
+//   max = surf_parse_get_double(A_surfxml_random_max);
+//   seed = surf_parse_get_double(A_surfxml_random_seed);
+
+//   double res = 0;
+//   int i = 0;
+//   random_data_t random = xbt_new0(s_random_data_t, 1);
+//   char *tmpbuf;
+
+//   xbt_dynar_t radical_elements;
+//   unsigned int iter;
+//   char *groups;
+//   int start, end;
+//   xbt_dynar_t radical_ends;
+
+//   switch (A_surfxml_random_generator) {
+//   case AU_surfxml_random_generator:
+//   case A_surfxml_random_generator_NONE:
+//     random->generator = NONE;
+//     break;
+//   case A_surfxml_random_generator_DRAND48:
+//     random->generator = DRAND48;
+//     break;
+//   case A_surfxml_random_generator_RAND:
+//     random->generator = RAND;
+//     break;
+//   case A_surfxml_random_generator_RNGSTREAM:
+//     random->generator = RNGSTREAM;
+//     break;
+//   default:
+//     surf_parse_error("Invalid random generator");
+//     break;
+//   }
+//   random->seed = seed;
+//   random->min = min;
+//   random->max = max;
+
+//   /* Check user stupidities */
+//   if (max < min)
+//     THROWF(arg_error, 0, "random->max < random->min (%f < %f)", max, min);
+//   if (mean < min)
+//     THROWF(arg_error, 0, "random->mean < random->min (%f < %f)", mean, min);
+//   if (mean > max)
+//     THROWF(arg_error, 0, "random->mean > random->max (%f > %f)", mean, max);
+
+//   /* normalize the mean and standard deviation before storing */
+//   random->mean = (mean - min) / (max - min);
+//   random->std = std / (max - min);
+
+//   if (random->mean * (1 - random->mean) < random->std * random->std)
+//     THROWF(arg_error, 0, "Invalid mean and standard deviation (%f and %f)",
+//            random->mean, random->std);
+
+//   XBT_DEBUG
+//       ("id = '%s' min = '%f' max = '%f' mean = '%f' std_deviatinon = '%f' generator = '%d' seed = '%ld' radical = '%s'",
+//        random_id, random->min, random->max, random->mean, random->std,
+//        (int)random->generator, random->seed, random_radical);
+
+//   if (!random_value)
+//     random_value = xbt_dict_new_homogeneous(free);
+
+//   if (!strcmp(random_radical, "")) {
+//     res = random_generate(random);
+//     rd_value = bprintf("%f", res);
+//     xbt_dict_set(random_value, random_id, rd_value, NULL);
+//   } else {
+//     radical_elements = xbt_str_split(random_radical, ",");
+//     xbt_dynar_foreach(radical_elements, iter, groups) {
+//       radical_ends = xbt_str_split(groups, "-");
+//       switch (xbt_dynar_length(radical_ends)) {
+//       case 1:
+//         xbt_assert(!xbt_dict_get_or_null(random_value, random_id),
+//                    "Custom Random '%s' already exists !", random_id);
+//         res = random_generate(random);
+//         tmpbuf =
+//             bprintf("%s%d", random_id,
+//                     atoi(xbt_dynar_getfirst_as(radical_ends, char *)));
+//         xbt_dict_set(random_value, tmpbuf, bprintf("%f", res), NULL);
+//         xbt_free(tmpbuf);
+//         break;
+
+//       case 2:
+//         start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *));
+//         end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *));
+//         for (i = start; i <= end; i++) {
+//           xbt_assert(!xbt_dict_get_or_null(random_value, random_id),
+//                      "Custom Random '%s' already exists !", bprintf("%s%d",
+//                                                                     random_id,
+//                                                                     i));
+//           res = random_generate(random);
+//           tmpbuf = bprintf("%s%d", random_id, i);
+//           xbt_dict_set(random_value, tmpbuf, bprintf("%f", res), NULL);
+//           xbt_free(tmpbuf);
+//         }
+//         break;
+//       default:
+//         XBT_CRITICAL("Malformed radical");
+//         break;
+//       }
+//       res = random_generate(random);
+//       rd_name = bprintf("%s_router", random_id);
+//       rd_value = bprintf("%f", res);
+//       xbt_dict_set(random_value, rd_name, rd_value, NULL);
+
+//       xbt_dynar_free(&radical_ends);
+//     }
+//     free(rd_name);
+//     xbt_dynar_free(&radical_elements);
+//   }
+// }
 
 void routing_register_callbacks()
 {
@@ -1243,56 +1274,63 @@ void routing_register_callbacks()
  * This fuction is call by "finalize". It allow to finalize the
  * AS or routing components. It delete all the structures.
  */
-static void finalize_rec(AS_t as) {
+static void finalize_rec(AsPtr as) {
   xbt_dict_cursor_t cursor = NULL;
   char *key;
   AS_t elem;
 
-  xbt_dict_foreach(as->routing_sons, cursor, key, elem) {
+  xbt_dict_foreach(as->p_routingSons, cursor, key, elem) {
     finalize_rec(elem);
   }
 
-  as->finalize(as);
+  delete as;;
 }
 
 /** \brief Frees all memory allocated by the routing module */
 void routing_exit(void) {
-  if (!routing_platf)
-    return;
-  xbt_dynar_free(&routing_platf->last_route);
-  finalize_rec(routing_platf->root);
-  xbt_free(routing_platf);
+  delete routing_platf;
+}
+
+RoutingPlatf::~RoutingPlatf()
+{
+       xbt_dynar_free(&p_lastRoute);
+       finalize_rec(p_root);
 }
 
 AS_t surf_AS_get_routing_root() {
-  return routing_platf->root;  
+  return routing_platf->p_root;
 }
 
-const char *surf_AS_get_name(AS_t as) {
-  return as->name;
+const char *surf_AS_get_name(AsPtr as) {
+  return as->p_name;
 }
 
-xbt_dict_t surf_AS_get_routing_sons(AS_t as) {
-  return as->routing_sons;
+xbt_dict_t surf_AS_get_routing_sons(AsPtr as) {
+  return as->p_routingSons;
 }
 
-const char *surf_AS_get_model(AS_t as) {
-  return as->model_desc->name;
+const char *surf_AS_get_model(AsPtr as) {
+  return as->p_modelDesc->name;
 }
 
-xbt_dynar_t surf_AS_get_hosts(AS_t as) {
-  xbt_dynar_t elms = as->index_network_elm;
+xbt_dynar_t surf_AS_get_hosts(AsPtr as) {
+  xbt_dynar_t elms = as->p_indexNetworkElm;
   sg_routing_edge_t relm;
   xbt_dictelm_t delm;
   int index;
   int count = xbt_dynar_length(elms);
   xbt_dynar_t res =  xbt_dynar_new(sizeof(xbt_dictelm_t), NULL);
   for (index = 0; index < count; index++) {
-     relm = xbt_dynar_get_as(elms, index, sg_routing_edge_t);
-     delm = xbt_lib_get_elm_or_null(host_lib, relm->name);
+     relm = xbt_dynar_get_as(elms, index, RoutingEdgePtr);
+     delm = xbt_lib_get_elm_or_null(host_lib, relm->getName());
      if (delm!=NULL) {
        xbt_dynar_push(res, &delm);
      }
   }
   return res;
 }
+
+void surf_AS_get_graph(AS_t as, xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges) {
+  as->getGraph(graph, nodes, edges);
+}
+
diff --git a/src/surf/surf_routing.hpp b/src/surf/surf_routing.hpp
new file mode 100644 (file)
index 0000000..3650cf8
--- /dev/null
@@ -0,0 +1,168 @@
+/* Copyright (c) 2013-2014. 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 "surf_interface.hpp"
+#include <float.h>
+
+#ifndef NETWORK_ROUTING_HPP_
+#define NETWORK_ROUTING_HPP_
+
+void routing_model_create( void *loopback);
+
+/* ************************************************************************** */
+/* ************************* GRAPH EXPORTING FUNCTIONS ********************** */
+xbt_node_t new_xbt_graph_node (xbt_graph_t graph, const char *name, xbt_dict_t nodes);
+xbt_edge_t new_xbt_graph_edge (xbt_graph_t graph, xbt_node_t s, xbt_node_t d, xbt_dict_t edges);
+
+/***********
+ * Classes *
+ ***********/
+
+/* Note: As and RoutingEdge are declard as struct instead of class, to keep
+   compatibility with C files where they are mentioned. */
+struct As;
+typedef As *AsPtr;
+
+class RoutingModelDescription;
+typedef RoutingModelDescription *RoutingModelDescriptionPtr;
+
+struct RoutingEdge;
+typedef RoutingEdge *RoutingEdgePtr;
+
+class Onelink;
+typedef Onelink *OnelinkPtr;
+
+class RoutingPlatf;
+typedef RoutingPlatf *RoutingPlatfPtr;
+
+/** @ingroup SURF_routing_interface
+ * @brief The Autonomous System (AS) routing interface
+ * @details [TODO]
+ */
+struct As {
+public:
+  xbt_dynar_t p_indexNetworkElm;
+  xbt_dict_t p_bypassRoutes;    /* store bypass routes */
+  routing_model_description_t p_modelDesc;
+  e_surf_routing_hierarchy_t p_hierarchy;
+  char *p_name;
+  AsPtr p_routingFather;
+  xbt_dict_t p_routingSons;
+  RoutingEdgePtr p_netElem;
+  xbt_dynar_t p_linkUpDownList;
+
+  /**
+   * @brief The As constructor
+   */
+  As(){};
+
+  /**
+   * @brief The As destructor
+   */
+  virtual ~As(){
+       xbt_free(p_name);
+  };
+
+  /**
+   * @brief Get the route and latency between two RoutingEdgs
+   * @details [long description]
+   * 
+   * @param src [description]
+   * @param dst [description]
+   * @param into [description]
+   * @param latency [description]
+   */
+  virtual void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t into, double *latency)=0;
+  virtual xbt_dynar_t getOneLinkRoutes()=0;
+  virtual void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges)=0;
+  virtual sg_platf_route_cbarg_t getBypassRoute(RoutingEdgePtr src, RoutingEdgePtr dst, double *lat)=0;
+
+  /* The parser calls the following functions to inform the routing models
+   * that a new element is added to the AS currently built.
+   *
+   * Of course, only the routing model of this AS is informed, not every ones */
+  virtual int parsePU(RoutingEdgePtr elm)=0; /* A host or a router, whatever */
+  virtual int parseAS( RoutingEdgePtr elm)=0;
+  virtual void parseRoute(sg_platf_route_cbarg_t route)=0;
+  virtual void parseASroute(sg_platf_route_cbarg_t route)=0;
+  virtual void parseBypassroute(sg_platf_route_cbarg_t e_route)=0;
+};
+
+/** @ingroup SURF_routing_interface
+ * @brief A routing edge
+ * @details [long description]
+ */
+struct RoutingEdge {
+public:
+  virtual ~RoutingEdge(){};
+  virtual int getId()=0;
+  virtual int *getIdPtr()=0;
+  virtual void setId(int id)=0;
+  virtual char *getName()=0;
+  virtual AsPtr getRcComponent()=0;
+  virtual e_surf_network_element_type_t getRcType()=0;
+};
+
+struct RoutingEdgeImpl : public RoutingEdge {
+public:
+  RoutingEdgeImpl(char *name, int id, e_surf_network_element_type_t rcType, AsPtr rcComponent)
+  : p_rcComponent(rcComponent), p_rcType(rcType), m_id(id), p_name(name) {}
+  ~RoutingEdgeImpl() { xbt_free(p_name);};
+
+  int getId() {return m_id;}
+  int *getIdPtr() {return &m_id;}
+  void setId(int id) {m_id = id;}
+  char *getName() {return p_name;}
+  AsPtr getRcComponent() {return p_rcComponent;}
+  e_surf_network_element_type_t getRcType() {return p_rcType;}
+private:
+  AsPtr p_rcComponent;
+  e_surf_network_element_type_t p_rcType;
+  int m_id;
+  char *p_name;
+};
+
+struct RoutingEdgeWrapper : public RoutingEdge {
+public:
+  RoutingEdgeWrapper(RoutingEdge *re) : p_re(re){}
+  ~RoutingEdgeWrapper(){}
+  int getId() {return p_re->getId();}
+  int *getIdPtr() {return p_re->getIdPtr();}
+  void setId(int id) {p_re->setId(id);}
+  char *getName() {return p_re->getName();}
+  AsPtr getRcComponent() {return p_re->getRcComponent();}
+  e_surf_network_element_type_t getRcType() {return p_re->getRcType();}
+private:
+  RoutingEdge *p_re;
+};
+
+/** @ingroup SURF_routing_interface
+ * @brief Link of lenght 1, alongside with its source and destination. This is mainly usefull in the bindings to gtnets and ns3
+ */
+class Onelink {
+public:
+  Onelink(void *link, RoutingEdgePtr src, RoutingEdgePtr dst)
+    : p_src(src), p_dst(dst), p_link(link) {};
+  RoutingEdgePtr p_src;
+  RoutingEdgePtr p_dst;
+  void *p_link;
+};
+
+/** @ingroup SURF_routing_interface
+ * @brief The class representing a whole routing platform
+ */
+class RoutingPlatf {
+public:
+  ~RoutingPlatf();
+  AsPtr p_root;
+  void *p_loopback;
+  xbt_dynar_t p_lastRoute;
+  xbt_dynar_t getOneLinkRoutes(void);
+  xbt_dynar_t recursiveGetOneLinkRoutes(AsPtr rc);
+  void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, xbt_dynar_t * links, double *latency);
+};
+
+#endif /* NETWORK_ROUTING_HPP_ */
diff --git a/src/surf/surf_routing_cluster.c b/src/surf/surf_routing_cluster.c
deleted file mode 100644 (file)
index 4e17552..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-/* Copyright (c) 2009-2013. 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 "surf_routing_private.h"
-#include "xbt/graph.h"
-
-/* Global vars */
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_cluster, surf, "Routing part of surf");
-
-/* This routing is specifically setup to represent clusters, aka homogeneous sets of machines
- * Note that a router is created, easing the interconnexion with the rest of the world.
- */
-
-/* Business methods */
-static void cluster_get_route_and_latency(AS_t as,
-                                          sg_routing_edge_t src,
-                                          sg_routing_edge_t dst,
-                                          sg_platf_route_cbarg_t route,
-                                          double *lat)
-{
-
-  s_surf_parsing_link_up_down_t info;
-  XBT_VERB("cluster_get_route_and_latency from '%s'[%d] to '%s'[%d]",
-            src->name, src->id, dst->name, dst->id);
-
-  if (src->rc_type != SURF_NETWORK_ELEMENT_ROUTER) {    // No specific link for router
-    info =
-        xbt_dynar_get_as(as->link_up_down_list, src->id,
-                         s_surf_parsing_link_up_down_t);
-                         
-    if((src->id == dst->id) && info.loopback_link  ){
-      xbt_dynar_push_as(route->link_list, void *, info.loopback_link);
-      if (lat)
-        *lat +=
-            surf_network_model->extension.network.get_link_latency(info.
-                                                                   loopback_link);
-      return;
-    }
-                         
-                         
-    if (info.limiter_link)          // limiter for sender
-      xbt_dynar_push_as(route->link_list, void *, info.limiter_link);
-    
-    if (info.link_up) {         // link up
-      xbt_dynar_push_as(route->link_list, void *, info.link_up);
-      if (lat)
-        *lat +=
-            surf_network_model->extension.network.get_link_latency(info.
-                                                                   link_up);
-    }
-  }
-
-  if (((as_cluster_t) as)->backbone) {
-    xbt_dynar_push_as(route->link_list, void *, ((as_cluster_t) as)->backbone);
-    if (lat)
-      *lat +=
-          surf_network_model->extension.network.
-          get_link_latency(((as_cluster_t) as)->backbone);
-  }
-
-  if (dst->rc_type != SURF_NETWORK_ELEMENT_ROUTER) {    // No specific link for router
-    info =
-        xbt_dynar_get_as(as->link_up_down_list, dst->id,
-                         s_surf_parsing_link_up_down_t);
-    if (info.link_down) {       // link down
-      xbt_dynar_push_as(route->link_list, void *, info.link_down);
-      if (lat)
-        *lat +=
-            surf_network_model->extension.network.get_link_latency(info.
-                                                                   link_down);
-    }
-    
-    if (info.limiter_link)          // limiter for receiver
-      xbt_dynar_push_as(route->link_list, void *, info.limiter_link);
-    
-  }
-}
-
-static void cluster_get_graph(xbt_graph_t graph, xbt_dict_t nodes,
-                              xbt_dict_t edges, AS_t rc)
-{
-  int isrc;
-  int table_size = xbt_dynar_length(rc->index_network_elm);
-
-  sg_routing_edge_t src;
-  xbt_node_t current, previous, backboneNode = NULL, routerNode;
-  s_surf_parsing_link_up_down_t info;
-
-  xbt_assert(((as_cluster_t) rc)->router,"Malformed cluster");
-
-  /* create the router */
-  char *link_name =
-    ((sg_routing_edge_t) ((as_cluster_t) rc)->router)->name;
-  routerNode = new_xbt_graph_node(graph, link_name, nodes);
-
-  if(((as_cluster_t) rc)->backbone) {
-    char *link_nameR =
-      ((surf_resource_t) ((as_cluster_t) rc)->backbone)->name;
-    backboneNode = new_xbt_graph_node(graph, link_nameR, nodes);
-
-    new_xbt_graph_edge(graph, routerNode, backboneNode, edges);
-  }
-
-  for (isrc = 0; isrc < table_size; isrc++) {
-    src = xbt_dynar_get_as(rc->index_network_elm, isrc, sg_routing_edge_t);
-
-    if (src->rc_type != SURF_NETWORK_ELEMENT_ROUTER) {
-      previous = new_xbt_graph_node(graph, src->name, nodes);
-
-      info = xbt_dynar_get_as(rc->link_up_down_list, src->id,
-                              s_surf_parsing_link_up_down_t);
-
-      if (info.link_up) {     // link up
-
-        char *link_name = ((surf_resource_t) info.link_up)->name;
-        current = new_xbt_graph_node(graph, link_name, nodes);
-        new_xbt_graph_edge(graph, previous, current, edges);
-
-        if (((as_cluster_t) rc)->backbone) {
-          new_xbt_graph_edge(graph, current, backboneNode, edges);
-        } else {
-          new_xbt_graph_edge(graph, current, routerNode, edges);
-        }
-
-      }
-
-      if (info.link_down) {    // link down
-        char *link_name = ((surf_resource_t) info.link_down)->name;
-        current = new_xbt_graph_node(graph, link_name, nodes);
-        new_xbt_graph_edge(graph, previous, current, edges);
-
-        if (((as_cluster_t) rc)->backbone) {
-          new_xbt_graph_edge(graph, current, backboneNode, edges);
-        } else {
-          new_xbt_graph_edge(graph, current, routerNode, edges);
-        }
-      }
-    }
-
-  }
-}
-
-static void model_cluster_finalize(AS_t as)
-{
-  model_none_finalize(as);
-}
-
-static int cluster_parse_PU(AS_t rc, sg_routing_edge_t elm) {
-  XBT_DEBUG("Load process unit \"%s\"", elm->name);
-  xbt_dynar_push_as(rc->index_network_elm,sg_routing_edge_t,elm);
-  return xbt_dynar_length(rc->index_network_elm)-1;
-}
-
-static int cluster_parse_AS(AS_t rc, sg_routing_edge_t elm) {
-  XBT_DEBUG("Load Autonomous system \"%s\"", elm->name);
-  xbt_dynar_push_as(rc->index_network_elm,sg_routing_edge_t,elm);
-  return xbt_dynar_length(rc->index_network_elm)-1;
-}
-
-/* Creation routing model functions */
-AS_t model_cluster_create(void)
-{
-  AS_t result = model_none_create_sized(sizeof(s_as_cluster_t));
-  result->get_route_and_latency = cluster_get_route_and_latency;
-  result->finalize = model_cluster_finalize;
-  result->get_graph = cluster_get_graph;
-  result->parse_AS = cluster_parse_AS;
-  result->parse_PU = cluster_parse_PU;
-
-  return (AS_t) result;
-}
diff --git a/src/surf/surf_routing_cluster.cpp b/src/surf/surf_routing_cluster.cpp
new file mode 100644 (file)
index 0000000..25cf788
--- /dev/null
@@ -0,0 +1,183 @@
+/* Copyright (c) 2009-2011, 2013-2014. 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 "surf_routing_cluster.hpp"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_cluster, surf, "Routing part of surf");
+
+/* This routing is specifically setup to represent clusters, aka homogeneous sets of machines
+ * Note that a router is created, easing the interconnexion with the rest of the world.
+ */
+
+AS_t model_cluster_create(void)
+{
+  return new AsCluster();
+}
+
+/* Creation routing model functions */
+AsCluster::AsCluster() : AsNone()
+{
+  p_backbone = 0;
+  p_loopback = 0;
+  p_router = 0;
+  p_has_limiter = 0;
+  p_has_loopback = 0;
+  p_nb_links_per_node = 1;
+}
+
+/* Business methods */
+void AsCluster::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t route, double *lat)
+{
+  s_surf_parsing_link_up_down_t info;
+  XBT_VERB("cluster_get_route_and_latency from '%s'[%d] to '%s'[%d]",
+            src->getName(), src->getId(), dst->getName(), dst->getId());
+
+  if (src->getRcType() != SURF_NETWORK_ELEMENT_ROUTER) {    // No specific link for router
+
+    if((src->getId() == dst->getId()) && p_has_loopback  ){
+      info = xbt_dynar_get_as(p_linkUpDownList, src->getId() * p_nb_links_per_node, s_surf_parsing_link_up_down_t);
+      xbt_dynar_push_as(route->link_list, void *, info.link_up);
+      if (lat)
+        *lat += static_cast<NetworkLinkPtr>(info.link_up)->getLatency();
+      return;
+    }
+
+
+    if (p_has_limiter){          // limiter for sender
+      info = xbt_dynar_get_as(p_linkUpDownList, src->getId() * p_nb_links_per_node + p_has_loopback, s_surf_parsing_link_up_down_t);
+      xbt_dynar_push_as(route->link_list, void *, info.link_up);
+    }
+
+    info = xbt_dynar_get_as(p_linkUpDownList, src->getId() * p_nb_links_per_node + p_has_loopback + p_has_limiter, s_surf_parsing_link_up_down_t);
+    if (info.link_up) {         // link up
+      xbt_dynar_push_as(route->link_list, void *, info.link_up);
+      if (lat)
+        *lat += static_cast<NetworkLinkPtr>(info.link_up)->getLatency();
+    }
+
+  }
+
+  if (p_backbone) {
+    xbt_dynar_push_as(route->link_list, void *, static_cast<ResourcePtr>(p_backbone));
+    if (lat)
+      *lat += p_backbone->getLatency();
+  }
+
+  if (dst->getRcType() != SURF_NETWORK_ELEMENT_ROUTER) {    // No specific link for router
+    info = xbt_dynar_get_as(p_linkUpDownList, dst->getId() * p_nb_links_per_node + p_has_loopback + p_has_limiter, s_surf_parsing_link_up_down_t);
+
+    if (info.link_down) {       // link down
+      xbt_dynar_push_as(route->link_list, void *, info.link_down);
+      if (lat)
+        *lat += static_cast<NetworkLinkPtr>(info.link_down)->getLatency();
+    }
+    if (p_has_limiter){          // limiter for receiver
+        info = xbt_dynar_get_as(p_linkUpDownList, dst->getId() * p_nb_links_per_node + p_has_loopback, s_surf_parsing_link_up_down_t);
+        xbt_dynar_push_as(route->link_list, void *, info.link_up);
+    }
+  }
+}
+
+void AsCluster::getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges)
+{
+  int isrc;
+  int table_size = xbt_dynar_length(p_indexNetworkElm);
+
+  RoutingEdgePtr src;
+  xbt_node_t current, previous, backboneNode = NULL, routerNode;
+  s_surf_parsing_link_up_down_t info;
+
+  xbt_assert(p_router,"Malformed cluster");
+
+  /* create the router */
+  char *link_name = p_router->getName();
+  routerNode = new_xbt_graph_node(graph, link_name, nodes);
+
+  if(p_backbone) {
+    const char *link_nameR = p_backbone->getName();
+    backboneNode = new_xbt_graph_node(graph, link_nameR, nodes);
+
+    new_xbt_graph_edge(graph, routerNode, backboneNode, edges);
+  }
+
+  for (isrc = 0; isrc < table_size; isrc++) {
+    src = xbt_dynar_get_as(p_indexNetworkElm, isrc, RoutingEdgePtr);
+
+    if (src->getRcType() != SURF_NETWORK_ELEMENT_ROUTER) {
+      previous = new_xbt_graph_node(graph, src->getName(), nodes);
+
+      info = xbt_dynar_get_as(p_linkUpDownList, src->getId(), s_surf_parsing_link_up_down_t);
+
+      if (info.link_up) {     // link up
+
+        const char *link_name = static_cast<ResourcePtr>(info.link_up)->getName();
+        current = new_xbt_graph_node(graph, link_name, nodes);
+        new_xbt_graph_edge(graph, previous, current, edges);
+
+        if (p_backbone) {
+          new_xbt_graph_edge(graph, current, backboneNode, edges);
+        } else {
+          new_xbt_graph_edge(graph, current, routerNode, edges);
+        }
+
+      }
+
+      if (info.link_down) {    // link down
+        const char *link_name = static_cast<ResourcePtr>(info.link_down)->getName();
+        current = new_xbt_graph_node(graph, link_name, nodes);
+        new_xbt_graph_edge(graph, previous, current, edges);
+
+        if (p_backbone) {
+          new_xbt_graph_edge(graph, current, backboneNode, edges);
+        } else {
+          new_xbt_graph_edge(graph, current, routerNode, edges);
+        }
+      }
+    }
+
+  }
+}
+
+void AsCluster::create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id, int , int position){
+  s_sg_platf_link_cbarg_t link;
+  s_surf_parsing_link_up_down_t info;
+  char* link_id = bprintf("%s_link_%d", cluster->id, id);
+
+  memset(&link, 0, sizeof(link));
+  link.id = link_id;
+  link.bandwidth = cluster->bw;
+  link.latency = cluster->lat;
+  link.state = SURF_RESOURCE_ON;
+  link.policy = cluster->sharing_policy;
+  sg_platf_new_link(&link);
+
+  if (link.policy == SURF_LINK_FULLDUPLEX) {
+    char *tmp_link = bprintf("%s_UP", link_id);
+    info.link_up = xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+    xbt_free(tmp_link);
+    tmp_link = bprintf("%s_DOWN", link_id);
+    info.link_down = xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+    xbt_free(tmp_link);
+  } else {
+    info.link_up = xbt_lib_get_or_null(link_lib, link_id, SURF_LINK_LEVEL);
+    info.link_down = info.link_up;
+  }
+  xbt_dynar_set(p_linkUpDownList, position, &info);
+  xbt_free(link_id);
+}
+
+int AsCluster::parsePU(RoutingEdgePtr elm) {
+  XBT_DEBUG("Load process unit \"%s\"", elm->getName());
+  xbt_dynar_push_as(p_indexNetworkElm, RoutingEdgePtr, elm);
+  return xbt_dynar_length(p_indexNetworkElm)-1;
+}
+
+int AsCluster::parseAS(RoutingEdgePtr elm) {
+  XBT_DEBUG("Load Autonomous system \"%s\"", elm->getName());
+  xbt_dynar_push_as(p_indexNetworkElm, RoutingEdgePtr, elm);
+  return xbt_dynar_length(p_indexNetworkElm)-1;
+}
+
diff --git a/src/surf/surf_routing_cluster.hpp b/src/surf/surf_routing_cluster.hpp
new file mode 100644 (file)
index 0000000..294fe2b
--- /dev/null
@@ -0,0 +1,52 @@
+/* Copyright (c) 2013-2014. 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 "surf_routing_none.hpp"
+#include "network_interface.hpp"
+
+#ifndef SURF_ROUTING_CLUSTER_HPP_
+#define SURF_ROUTING_CLUSTER_HPP_
+
+/***********
+ * Classes *
+ ***********/
+class AsCluster;
+typedef AsCluster *AsClusterPtr;
+
+
+/* ************************************************** */
+/* **************  Cluster ROUTING   **************** */
+
+class AsCluster: public AsNone {
+public:
+  AsCluster();
+
+  virtual void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t into, double *latency);
+  //xbt_dynar_t getOneLinkRoutes();
+  //void parseRoute(sg_platf_route_cbarg_t route);
+  //void parseASroute(sg_platf_route_cbarg_t route);
+
+  void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges);
+  //sg_platf_route_cbarg_t getBypassRoute(RoutingEdgePtr src, RoutingEdgePtr dst, double *lat);
+
+  /* The parser calls the following functions to inform the routing models
+   * that a new element is added to the AS currently built.
+   *
+   * Of course, only the routing model of this AS is informed, not every ones */
+  int parsePU(RoutingEdgePtr elm); /* A host or a router, whatever */
+  int parseAS(RoutingEdgePtr elm);
+  virtual void create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id, int rank, int position);
+  NetworkLinkPtr p_backbone;
+  void *p_loopback;
+  RoutingEdgePtr p_router;
+  int p_has_limiter;
+  int p_has_loopback;
+  int p_nb_links_per_node;
+
+};
+
+
+#endif /* SURF_ROUTING_CLUSTER_HPP_ */
diff --git a/src/surf/surf_routing_cluster_torus.cpp b/src/surf/surf_routing_cluster_torus.cpp
new file mode 100644 (file)
index 0000000..45b8a93
--- /dev/null
@@ -0,0 +1,235 @@
+/* Copyright (c) 2014. 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 "surf_routing_cluster_torus.hpp"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_cluster_torus, surf_route_cluster, "Torus Routing part of surf");
+
+
+inline unsigned int* rankId_to_coords(int rankId, xbt_dynar_t dimensions) {
+
+    unsigned int i = 0, cur_dim_size = 1, dim_size_product = 1;
+    unsigned int* coords = (unsigned int*)malloc(xbt_dynar_length(dimensions)*sizeof(unsigned int));
+    for (i = 0; i < xbt_dynar_length(dimensions); i++) {
+        cur_dim_size = xbt_dynar_get_as(dimensions, i, int);
+        coords[i] = (rankId / dim_size_product) % cur_dim_size;
+        dim_size_product *= cur_dim_size;
+    }
+
+    return coords;
+}
+
+
+AS_t model_torus_cluster_create(void)
+{
+  return new AsClusterTorus();
+}
+
+/* Creation routing model functions */
+AsClusterTorus::AsClusterTorus() : AsCluster()
+{
+  p_dimensions = NULL;
+}
+
+/* Creation routing model functions */
+AsClusterTorus::~AsClusterTorus()
+{
+  if(p_dimensions) xbt_dynar_free(&p_dimensions);
+}
+
+
+void AsClusterTorus::create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id, int rank, int position){
+  s_sg_platf_link_cbarg_t link;
+  char* link_id;
+  unsigned int j = 0;
+  /**
+   * Create all links that exist in the torus.
+   * Each rank creates #dimensions-1 links
+   */
+  int neighbour_rank_id = 0; // The other node the link connects
+  int current_dimension = 0, // which dimension are we currently in?
+      // we need to iterate over all dimensions
+      // and create all links there
+      dim_product       = 1; // Needed to calculate the next neighbour_id
+  for (j = 0; j < xbt_dynar_length(p_dimensions); j++) {
+
+      memset(&link, 0, sizeof(link));
+      current_dimension = xbt_dynar_get_as(p_dimensions, j, int);
+      neighbour_rank_id = ( ((int) rank / dim_product) % current_dimension == current_dimension-1) ? rank - (current_dimension-1)*dim_product : rank + dim_product;
+      //name of neighbour is not right for non contiguous cluster radicals (as id != rank in this case)
+      link_id           = bprintf("%s_link_from_%i_to_%i", cluster->id, id, neighbour_rank_id);
+      link.id           = link_id;
+      link.bandwidth    = cluster->bw;
+      link.latency      = cluster->lat;
+      link.state        = SURF_RESOURCE_ON;
+      link.policy       = cluster->sharing_policy;
+      sg_platf_new_link(&link);
+      s_surf_parsing_link_up_down_t info;
+      if (link.policy == SURF_LINK_FULLDUPLEX) {
+          char *tmp_link = bprintf("%s_UP", link_id);
+          info.link_up =
+              xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+          free(tmp_link);
+          tmp_link = bprintf("%s_DOWN", link_id);
+          info.link_down =
+              xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+          free(tmp_link);
+      } else {
+          info.link_up = xbt_lib_get_or_null(link_lib, link_id, SURF_LINK_LEVEL);
+          info.link_down = info.link_up;
+      }
+      /**
+       * Add the link to its appropriate position;
+       * note that position rankId*(xbt_dynar_length(dimensions)+has_loopack?+has_limiter?)
+       * holds the link "rankId->rankId"
+       */
+      xbt_dynar_set(p_linkUpDownList, position
+          + j,
+          &info);
+      dim_product   *= current_dimension;
+      xbt_free(link_id);
+  }
+  rank++;
+}
+
+void AsClusterTorus::parse_specific_arguments(sg_platf_cluster_cbarg_t cluster){
+
+  unsigned int iter;
+  char *groups;
+  xbt_dynar_t dimensions = xbt_str_split(cluster->topo_parameters, ",");
+
+    if (!xbt_dynar_is_empty(dimensions)) {
+      p_dimensions= xbt_dynar_new(sizeof(int), NULL);
+      /**
+       * We are in a torus cluster
+       * Parse attribute dimensions="dim1,dim2,dim3,...,dimN"
+       * and safe it in a dynarray.
+       * Additionally, we need to know how many ranks we have in total
+       */
+      xbt_dynar_foreach(dimensions, iter, groups) {
+          int tmp = surf_parse_get_int(xbt_dynar_get_as(dimensions, iter, char *));
+          xbt_dynar_set_as(p_dimensions, iter, int, tmp);
+      }
+
+      p_nb_links_per_node = xbt_dynar_length(p_dimensions);
+
+    }
+    xbt_dynar_free(&dimensions);
+}
+
+void AsClusterTorus::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t route, double *lat){
+
+  XBT_VERB("torus_get_route_and_latency from '%s'[%d] to '%s'[%d]",
+               src->getName(), src->getId(),
+               dst->getName(), dst->getId());
+
+     if (dst->getRcType() == SURF_NETWORK_ELEMENT_ROUTER || src->getRcType() == SURF_NETWORK_ELEMENT_ROUTER) return;
+
+     if((src->getId() == dst->getId()) && p_has_loopback  ){
+       s_surf_parsing_link_up_down_t info = xbt_dynar_get_as(p_linkUpDownList, src->getId() * p_nb_links_per_node, s_surf_parsing_link_up_down_t);
+       xbt_dynar_push_as(route->link_list, void *, info.link_up);
+
+       if (lat)
+         *lat += static_cast<NetworkLinkPtr>(info.link_up)->getLatency();
+       return;
+     }
+
+
+     /**
+      * Dimension based routing routes through each dimension consecutively
+      * TODO Change to dynamic assignment
+      */
+     unsigned int j, cur_dim, dim_product   = 1;
+     int current_node    = src->getId();
+     int unsigned next_node       = 0;
+     /**
+      * Arrays that hold the coordinates of the current node and
+      * the target; comparing the values at the i-th position of
+      * both arrays, we can easily assess whether we need to route
+      * into this dimension or not.
+      */
+     unsigned int* myCoords, *targetCoords;
+     myCoords     = rankId_to_coords(src->getId(), p_dimensions);
+     targetCoords = rankId_to_coords(dst->getId(), p_dimensions);
+     /**
+      * linkOffset describes the offset where the link
+      * we want to use is stored
+      * (+1 is added because each node has a link from itself to itself,
+      * which can only be the case if src->m_id == dst->m_id -- see above
+      * for this special case)
+      */
+     int nodeOffset = (xbt_dynar_length(p_dimensions)+1)*src->getId();
+
+     int linkOffset = nodeOffset;
+     bool use_lnk_up          = false; // Is this link of the form "cur -> next" or "next -> cur"?
+                                       // false means: next -> cur
+     while (current_node != dst->getId()) {
+       dim_product = 1; // First, we will route in x-dimension
+       for (j = 0; j < xbt_dynar_length(p_dimensions); j++) {
+           cur_dim = xbt_dynar_get_as(p_dimensions, j, int);
+
+           // current_node/dim_product = position in current dimension
+           if ((current_node/dim_product) % cur_dim != (dst->getId()/dim_product) % cur_dim) {
+
+               if (( targetCoords[j] > myCoords[j] && targetCoords[j] <= myCoords[j]+cur_dim/2) // Is the target node on the right, without the wrap-around?
+                   || ( myCoords[j] > cur_dim/2 && (myCoords[j]+cur_dim/2)%cur_dim >= targetCoords[j] )) { // Or do we need to use the wrap around to reach it?
+                 if ((current_node / dim_product) % cur_dim == cur_dim-1)
+                     next_node = (current_node+dim_product-dim_product*cur_dim);
+                 else
+                     next_node = (current_node+dim_product);
+
+                 // HERE: We use *CURRENT* node for calculation (as opposed to next_node)
+                 nodeOffset = current_node*(p_nb_links_per_node);
+                 linkOffset = nodeOffset+p_has_loopback+p_has_limiter+j;
+                 use_lnk_up = true;
+                 assert(linkOffset >= 0);
+               }
+               else { // Route to the left
+                 if ((current_node / dim_product) % cur_dim == 0)
+                     next_node = (current_node-dim_product+dim_product*cur_dim);
+                 else
+                     next_node = (current_node-dim_product);
+
+                 // HERE: We use *next* node for calculation (as opposed to current_node!)
+                 nodeOffset = next_node*(p_nb_links_per_node);
+                 linkOffset = nodeOffset+j+p_has_loopback+p_has_limiter;
+                 use_lnk_up = false;
+
+                 assert(linkOffset >= 0);
+               }
+               XBT_DEBUG("torus_get_route_and_latency - current_node: %i, next_node: %u, linkOffset is %i",
+               current_node, next_node, linkOffset);
+
+               break;
+           }
+
+           dim_product *= cur_dim;
+       }
+
+       s_surf_parsing_link_up_down_t info;
+
+       if (p_has_limiter){          // limiter for sender
+             info = xbt_dynar_get_as(p_linkUpDownList, nodeOffset + p_has_loopback, s_surf_parsing_link_up_down_t);
+             xbt_dynar_push_as(route->link_list, void *, info.link_up);
+       }
+
+       info = xbt_dynar_get_as(p_linkUpDownList,linkOffset, s_surf_parsing_link_up_down_t);
+
+       if (use_lnk_up == false)
+           xbt_dynar_push_as(route->link_list,void*,info.link_down);
+       else
+           xbt_dynar_push_as(route->link_list,void*,info.link_up);
+
+       current_node = next_node;
+       next_node = 0;
+     }
+     free(myCoords);
+     free(targetCoords);
+
+
+
+  return;
+}
diff --git a/src/surf/surf_routing_cluster_torus.hpp b/src/surf/surf_routing_cluster_torus.hpp
new file mode 100644 (file)
index 0000000..86e9a20
--- /dev/null
@@ -0,0 +1,33 @@
+/* Copyright (c) 2014. 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 "surf_routing_none.hpp"
+#include "network_interface.hpp"
+#include "surf_routing_cluster.hpp"
+
+
+#ifndef SURF_ROUTING_CLUSTER_TORUS_HPP_
+#define SURF_ROUTING_CLUSTER_TORUS_HPP_
+
+class AsClusterTorus;
+typedef AsClusterTorus *AsClusterTorusPtr;
+
+
+class AsClusterTorus: public AsCluster {
+public:
+   AsClusterTorus();
+   virtual ~AsClusterTorus();
+   virtual void create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id, int rank, int position);
+   virtual void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t into, double *latency);
+   void parse_specific_arguments(sg_platf_cluster_cbarg_t cluster);
+
+
+   xbt_dynar_t p_dimensions;
+
+};
+
+
+#endif
similarity index 56%
rename from src/surf/surf_routing_dijkstra.c
rename to src/surf/surf_routing_dijkstra.cpp
index 8d204bc..48a3ae2 100644 (file)
@@ -1,39 +1,17 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. 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 "surf_routing_private.h"
+#include "surf_routing_dijkstra.hpp"
+#include "network_interface.hpp"
 
 /* Global vars */
 extern routing_platf_t routing_platf;
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_dijkstra, surf, "Routing part of surf -- dijkstra routing logic");
 
-typedef struct {
-  s_as_t generic_routing;
-  xbt_graph_t route_graph;      /* xbt_graph */
-  xbt_dict_t graph_node_map;    /* map */
-  xbt_dict_t route_cache;       /* use in cache mode */
-  int cached;
-} s_as_dijkstra_t, *as_dijkstra_t;
-
-
-typedef struct graph_node_data {
-  int id;
-  int graph_id;                 /* used for caching internal graph id's */
-} s_graph_node_data_t, *graph_node_data_t;
-
-typedef struct graph_node_map_element {
-  xbt_node_t node;
-} s_graph_node_map_element_t, *graph_node_map_element_t;
-
-typedef struct route_cache_element {
-  int *pred_arr;
-  int size;
-} s_route_cache_element_t, *route_cache_element_t;
-
 /* Free functions */
 
 static void route_cache_elem_free(void *e)
@@ -60,10 +38,46 @@ static void graph_edge_data_free(void *e) // FIXME: useless code duplication
   }
 }
 
+AS_t model_dijkstra_create(void){
+  return new AsDijkstra(0);
+}
+
+AS_t model_dijkstracache_create(void){
+  return new AsDijkstra(1);
+}
+
+void model_dijkstra_both_end(AS_t as)
+{
+  AsDijkstraPtr THIS_AS = static_cast<AsDijkstraPtr>(as);
+  xbt_node_t node = NULL;
+  unsigned int cursor2;
+  xbt_dynar_t nodes = NULL;
+
+  /* Create the topology graph */
+  if(!THIS_AS->p_routeGraph)
+    THIS_AS->p_routeGraph = xbt_graph_new_graph(1, NULL);
+  if(!THIS_AS->p_graphNodeMap)
+    THIS_AS->p_graphNodeMap = xbt_dict_new_homogeneous(&graph_node_map_elem_free);
+
+  if (THIS_AS->m_cached && !THIS_AS->p_routeCache)
+    THIS_AS->p_routeCache = xbt_dict_new_homogeneous(&route_cache_elem_free);
+
+  /* Add the loopback if needed */
+  if (routing_platf->p_loopback && as->p_hierarchy == SURF_ROUTING_BASE)
+    THIS_AS->addLoopback();
+
+  /* initialize graph indexes in nodes after graph has been built */
+  nodes = xbt_graph_get_nodes(THIS_AS->p_routeGraph);
+
+  xbt_dynar_foreach(nodes, cursor2, node) {
+    graph_node_data_t data = (graph_node_data_t) xbt_graph_node_get_data(node);
+    data->graph_id = cursor2;
+  }
+}
+
 /* Utility functions */
 
-static xbt_node_t route_graph_new_node(as_dijkstra_t as,
-    int id, int graph_id)
+xbt_node_t AsDijkstra::routeGraphNewNode(int id, int graph_id)
 {
   xbt_node_t node = NULL;
   graph_node_data_t data = NULL;
@@ -72,21 +86,20 @@ static xbt_node_t route_graph_new_node(as_dijkstra_t as,
   data = xbt_new0(struct graph_node_data, 1);
   data->id = id;
   data->graph_id = graph_id;
-  node = xbt_graph_new_node(as->route_graph, data);
+  node = xbt_graph_new_node(p_routeGraph, data);
 
   elm = xbt_new0(struct graph_node_map_element, 1);
   elm->node = node;
-  xbt_dict_set_ext(as->graph_node_map, (char *) (&id), sizeof(int),
+  xbt_dict_set_ext(p_graphNodeMap, (char *) (&id), sizeof(int),
       (xbt_set_elm_t) elm, NULL);
 
   return node;
 }
 
-static graph_node_map_element_t
-graph_node_map_search(as_dijkstra_t as, int id)
+graph_node_map_element_t AsDijkstra::nodeMapSearch(int id)
 {
   graph_node_map_element_t elm = (graph_node_map_element_t)
-          xbt_dict_get_or_null_ext(as->graph_node_map,
+          xbt_dict_get_or_null_ext(p_graphNodeMap,
               (char *) (&id),
               sizeof(int));
   return elm;
@@ -94,19 +107,18 @@ graph_node_map_search(as_dijkstra_t as, int id)
 
 /* Parsing */
 
-static void route_new_dijkstra(as_dijkstra_t as, int src_id,
-    int dst_id, sg_platf_route_cbarg_t e_route)
+void AsDijkstra::newRoute(int src_id, int dst_id, sg_platf_route_cbarg_t e_route)
 {
   XBT_DEBUG("Load Route from \"%d\" to \"%d\"", src_id, dst_id);
   xbt_node_t src = NULL;
   xbt_node_t dst = NULL;
 
   graph_node_map_element_t src_elm = (graph_node_map_element_t)
-          xbt_dict_get_or_null_ext(as->graph_node_map,
+          xbt_dict_get_or_null_ext(p_graphNodeMap,
               (char *) (&src_id),
               sizeof(int));
   graph_node_map_element_t dst_elm = (graph_node_map_element_t)
-          xbt_dict_get_or_null_ext(as->graph_node_map,
+          xbt_dict_get_or_null_ext(p_graphNodeMap,
               (char *) (&dst_id),
               sizeof(int));
 
@@ -119,23 +131,23 @@ static void route_new_dijkstra(as_dijkstra_t as, int src_id,
 
   /* add nodes if they don't exist in the graph */
   if (src_id == dst_id && src == NULL && dst == NULL) {
-    src = route_graph_new_node(as, src_id, -1);
+    src = this->routeGraphNewNode(src_id, -1);
     dst = src;
   } else {
     if (src == NULL) {
-      src = route_graph_new_node(as, src_id, -1);
+      src = this->routeGraphNewNode(src_id, -1);
     }
     if (dst == NULL) {
-      dst = route_graph_new_node(as, dst_id, -1);
+      dst = this->routeGraphNewNode(dst_id, -1);
     }
   }
 
   /* add link as edge to graph */
-  xbt_graph_new_edge(as->route_graph, src, dst, e_route);
+  xbt_graph_new_edge(p_routeGraph, src, dst, e_route);
 }
 
-static void add_loopback_dijkstra(as_dijkstra_t as) {
-  xbt_dynar_t nodes = xbt_graph_get_nodes(as->route_graph);
+void AsDijkstra::addLoopback() {
+  xbt_dynar_t nodes = xbt_graph_get_nodes(p_routeGraph);
 
   xbt_node_t node = NULL;
   unsigned int cursor2;
@@ -156,42 +168,37 @@ static void add_loopback_dijkstra(as_dijkstra_t as) {
     if (!found) {
       sg_platf_route_cbarg_t e_route = xbt_new0(s_sg_platf_route_cbarg_t, 1);
       e_route->link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
-      xbt_dynar_push(e_route->link_list, &routing_platf->loopback);
-      xbt_graph_new_edge(as->route_graph, node, node, e_route);
+      xbt_dynar_push(e_route->link_list, &routing_platf->p_loopback);
+      xbt_graph_new_edge(p_routeGraph, node, node, e_route);
     }
   }
 }
 
-static void dijkstra_get_route_and_latency(AS_t as_generic,
-    sg_routing_edge_t src, sg_routing_edge_t dst, sg_platf_route_cbarg_t route, double *lat);
-
-static xbt_dynar_t dijkstra_get_onelink_routes(AS_t as)
+xbt_dynar_t AsDijkstra::getOnelinkRoutes()
 {
-  xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
+  xbt_dynar_t ret = xbt_dynar_new(sizeof(OnelinkPtr), xbt_free);
   sg_platf_route_cbarg_t route = xbt_new0(s_sg_platf_route_cbarg_t,1);
   route->link_list = xbt_dynar_new(sizeof(sg_routing_link_t),NULL);
 
   int src,dst;
-  sg_routing_edge_t src_elm, dst_elm;
-  size_t table_size = xbt_dynar_length(as->index_network_elm);
+  RoutingEdgePtr src_elm, dst_elm;
+  int table_size = (int)xbt_dynar_length(p_indexNetworkElm);
   for(src=0; src < table_size; src++) {
     for(dst=0; dst< table_size; dst++) {
       xbt_dynar_reset(route->link_list);
-      src_elm = xbt_dynar_get_as(as->index_network_elm,src,sg_routing_edge_t);
-      dst_elm = xbt_dynar_get_as(as->index_network_elm,dst,sg_routing_edge_t);
-      dijkstra_get_route_and_latency(as, src_elm, dst_elm,route, NULL);
+      src_elm = xbt_dynar_get_as(p_indexNetworkElm, src, RoutingEdgePtr);
+      dst_elm = xbt_dynar_get_as(p_indexNetworkElm, dst, RoutingEdgePtr);
+      this->getRouteAndLatency(src_elm, dst_elm,route, NULL);
 
       if (xbt_dynar_length(route->link_list) == 1) {
         void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0);
-        onelink_t onelink = xbt_new0(s_onelink_t, 1);
-        onelink->link_ptr = link;
-        if (as->hierarchy == SURF_ROUTING_BASE) {
-          onelink->src = src_elm;
-          onelink->dst = dst_elm;
-        } else if (as->hierarchy == SURF_ROUTING_RECURSIVE) {
-          onelink->src = route->gw_src;
-          onelink->dst = route->gw_dst;
-        }
+        OnelinkPtr onelink;
+        if (p_hierarchy == SURF_ROUTING_BASE)
+          onelink = new Onelink(link, src_elm, dst_elm);
+        else if (p_hierarchy == SURF_ROUTING_RECURSIVE)
+          onelink = new Onelink(link, route->gw_src, route->gw_dst);
+        else
+          onelink = new Onelink(link, NULL, NULL);
         xbt_dynar_push(ret, &onelink);
       }
     }
@@ -199,20 +206,17 @@ static xbt_dynar_t dijkstra_get_onelink_routes(AS_t as)
   return ret;
 }
 
-static void dijkstra_get_route_and_latency(AS_t asg,
-    sg_routing_edge_t src, sg_routing_edge_t dst,
-    sg_platf_route_cbarg_t route, double *lat)
+void AsDijkstra::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t route, double *lat)
 {
 
   /* set utils vars */
-  as_dijkstra_t as = (as_dijkstra_t) asg;
 
-  generic_src_dst_check(asg, src, dst);
-  int *src_id = &(src->id);
-  int *dst_id = &(dst->id);
+  srcDstCheck(src, dst);
+  int *src_id = src->getIdPtr();
+  int *dst_id = dst->getIdPtr();
 
   if (!src_id || !dst_id)
-    THROWF(arg_error,0,"No route from '%s' to '%s'",src->name,dst->name);
+    THROWF(arg_error,0,"No route from '%s' to '%s'",src->getName(),dst->getName());
 
   int *pred_arr = NULL;
   int src_node_id = 0;
@@ -225,13 +229,11 @@ static void dijkstra_get_route_and_latency(AS_t asg,
   void *link;
   xbt_dynar_t links = NULL;
   route_cache_element_t elm = NULL;
-  xbt_dynar_t nodes = xbt_graph_get_nodes(as->route_graph);
+  xbt_dynar_t nodes = xbt_graph_get_nodes(p_routeGraph);
 
   /* Use the graph_node id mapping set to quickly find the nodes */
-  graph_node_map_element_t src_elm =
-      graph_node_map_search(as, *src_id);
-  graph_node_map_element_t dst_elm =
-      graph_node_map_search(as, *dst_id);
+  graph_node_map_element_t src_elm = nodeMapSearch(*src_id);
+  graph_node_map_element_t dst_elm = nodeMapSearch(*dst_id);
 
   src_node_id = ((graph_node_data_t)
       xbt_graph_node_get_data(src_elm->node))->graph_id;
@@ -243,11 +245,10 @@ static void dijkstra_get_route_and_latency(AS_t asg,
 
     xbt_node_t node_s_v = xbt_dynar_get_as(nodes, src_node_id, xbt_node_t);
     xbt_node_t node_e_v = xbt_dynar_get_as(nodes, dst_node_id, xbt_node_t);
-    xbt_edge_t edge =
-        xbt_graph_get_edge(as->route_graph, node_s_v, node_e_v);
+    xbt_edge_t edge = xbt_graph_get_edge(p_routeGraph, node_s_v, node_e_v);
 
     if (edge == NULL)
-      THROWF(arg_error,0,"No route from '%s' to '%s'",src->name,dst->name);
+      THROWF(arg_error, 0, "No route from '%s' to '%s'", src->getName(), dst->getName());
 
     e_route = (sg_platf_route_cbarg_t) xbt_graph_edge_get_data(edge);
 
@@ -255,15 +256,15 @@ static void dijkstra_get_route_and_latency(AS_t asg,
     xbt_dynar_foreach(links, cpt, link) {
       xbt_dynar_unshift(route->link_list, &link);
       if (lat)
-        *lat += surf_network_model->extension.network.get_link_latency(link);
+        *lat += static_cast<NetworkLinkPtr>(link)->getLatency();
     }
 
   }
 
-  if (as->cached) {
+  if (m_cached) {
     /*check if there is a cached predecessor list avail */
     elm = (route_cache_element_t)
-            xbt_dict_get_or_null_ext(as->route_cache, (char *) (&src_id),
+            xbt_dict_get_or_null_ext(p_routeCache, (char *) (&src_id),
                 sizeof(int));
   }
 
@@ -298,7 +299,7 @@ static void dijkstra_get_route_and_latency(AS_t asg,
 
     /* apply dijkstra using the indexes from the graph's node array */
     while (xbt_heap_size(pqueue) > 0) {
-      int *v_id = xbt_heap_pop(pqueue);
+      int *v_id = (int *) xbt_heap_pop(pqueue);
       xbt_node_t v_node = xbt_dynar_get_as(nodes, *v_id, xbt_node_t);
       xbt_dynar_t out_edges = xbt_graph_node_get_outedges(v_node);
       xbt_edge_t edge = NULL;
@@ -306,7 +307,7 @@ static void dijkstra_get_route_and_latency(AS_t asg,
 
       xbt_dynar_foreach(out_edges, cursor, edge) {
         xbt_node_t u_node = xbt_graph_edge_get_target(edge);
-        graph_node_data_t data = xbt_graph_node_get_data(u_node);
+        graph_node_data_t data = (graph_node_data_t) xbt_graph_node_get_data(u_node);
         int u_id = data->graph_id;
         sg_platf_route_cbarg_t tmp_e_route = (sg_platf_route_cbarg_t) xbt_graph_edge_get_data(edge);
         int cost_v_u = (tmp_e_route->link_list)->used;    /* count of links, old model assume 1 */
@@ -329,18 +330,18 @@ static void dijkstra_get_route_and_latency(AS_t asg,
   }
 
   /* compose route path with links */
-  sg_routing_edge_t gw_src = NULL, gw_dst, prev_gw_src, first_gw = NULL;
-  sg_routing_edge_t gw_dst_net_elm = NULL, prev_gw_src_net_elm = NULL;
+  RoutingEdgePtr gw_src = NULL, gw_dst, prev_gw_src, first_gw = NULL;
+  RoutingEdgePtr gw_dst_net_elm = NULL, prev_gw_src_net_elm = NULL;
 
   for (v = dst_node_id; v != src_node_id; v = pred_arr[v]) {
     xbt_node_t node_pred_v =
         xbt_dynar_get_as(nodes, pred_arr[v], xbt_node_t);
     xbt_node_t node_v = xbt_dynar_get_as(nodes, v, xbt_node_t);
     xbt_edge_t edge =
-        xbt_graph_get_edge(as->route_graph, node_pred_v, node_v);
+        xbt_graph_get_edge(p_routeGraph, node_pred_v, node_v);
 
     if (edge == NULL)
-      THROWF(arg_error,0,"No route from '%s' to '%s'",src->name,dst->name);
+      THROWF(arg_error, 0, "No route from '%s' to '%s'", src->getName(), dst->getName());
 
     prev_gw_src = gw_src;
 
@@ -351,18 +352,19 @@ static void dijkstra_get_route_and_latency(AS_t asg,
     if (v == dst_node_id)
       first_gw = gw_dst;
 
-    if (asg->hierarchy == SURF_ROUTING_RECURSIVE && v != dst_node_id
-        && strcmp(gw_dst->name, prev_gw_src->name)) {
+    if (p_hierarchy == SURF_ROUTING_RECURSIVE && v != dst_node_id
+        && strcmp(gw_dst->getName(), prev_gw_src->getName())) {
       xbt_dynar_t e_route_as_to_as=NULL;
-      routing_get_route_and_latency(gw_dst_net_elm, prev_gw_src_net_elm, &e_route_as_to_as, NULL);
+
+      routing_platf->getRouteAndLatency(gw_dst_net_elm, prev_gw_src_net_elm, &e_route_as_to_as, NULL);
       if (edge == NULL)
-        THROWF(arg_error,0,"No route from '%s' to '%s'",src->name,dst->name);
+        THROWF(arg_error,0,"No route from '%s' to '%s'", src->getName(), dst->getName());
       links = e_route_as_to_as;
       int pos = 0;
       xbt_dynar_foreach(links, cpt, link) {
         xbt_dynar_insert_at(route->link_list, pos, &link);
         if (lat)
-          *lat += surf_network_model->extension.network.get_link_latency(link);
+          *lat += static_cast<NetworkLinkPtr>(link)->getLatency();
         pos++;
       }
     }
@@ -371,102 +373,96 @@ static void dijkstra_get_route_and_latency(AS_t asg,
     xbt_dynar_foreach(links, cpt, link) {
       xbt_dynar_unshift(route->link_list, &link);
       if (lat)
-        *lat += surf_network_model->extension.network.get_link_latency(link);
+        *lat += static_cast<NetworkLinkPtr>(link)->getLatency();
     }
     size++;
   }
 
-  if (asg->hierarchy == SURF_ROUTING_RECURSIVE) {
+  if (p_hierarchy == SURF_ROUTING_RECURSIVE) {
     route->gw_src = gw_src;
     route->gw_dst = first_gw;
   }
 
-  if (as->cached && elm == NULL) {
+  if (m_cached && elm == NULL) {
     /* add to predecessor list of the current src-host to cache */
     elm = xbt_new0(struct route_cache_element, 1);
     elm->pred_arr = pred_arr;
     elm->size = size;
-    xbt_dict_set_ext(as->route_cache, (char *) (&src_id), sizeof(int),
+    xbt_dict_set_ext(p_routeCache, (char *) (&src_id), sizeof(int),
         (xbt_set_elm_t) elm, NULL);
   }
 
-  if (!as->cached)
+  if (!m_cached)
     xbt_free(pred_arr);
 }
 
-static void dijkstra_finalize(AS_t asg)
+AsDijkstra::~AsDijkstra()
 {
-  as_dijkstra_t as = (as_dijkstra_t) asg;
-
-  xbt_graph_free_graph(as->route_graph, &xbt_free,
+  xbt_graph_free_graph(p_routeGraph, &xbt_free,
       &graph_edge_data_free, &xbt_free);
-  xbt_dict_free(&as->graph_node_map);
-  if (as->cached)
-    xbt_dict_free(&as->route_cache);
-
-  model_generic_finalize(asg);
+  xbt_dict_free(&p_graphNodeMap);
+  if (m_cached)
+    xbt_dict_free(&p_routeCache);
 }
 
 /* Creation routing model functions */
 
-AS_t model_dijkstra_both_create(int cached)
-{
-  as_dijkstra_t new_component = (as_dijkstra_t)
-          model_generic_create_sized(sizeof(s_as_dijkstra_t));
+AsDijkstra::AsDijkstra() : AsGeneric(), m_cached(0) {
+  p_routeGraph = NULL;
+  p_graphNodeMap = NULL;
+  p_routeCache = NULL;
+}
 
-  new_component->generic_routing.parse_route = model_dijkstra_both_parse_route;
+AsDijkstra::AsDijkstra(int cached) : AsGeneric(), m_cached(cached)
+{
+  p_routeGraph = NULL;
+  p_graphNodeMap = NULL;
+  p_routeCache = NULL;
+  /*new_component->generic_routing.parse_route = model_dijkstra_both_parse_route;
   new_component->generic_routing.parse_ASroute = model_dijkstra_both_parse_route;
   new_component->generic_routing.get_route_and_latency = dijkstra_get_route_and_latency;
   new_component->generic_routing.get_onelink_routes =
       dijkstra_get_onelink_routes;
   new_component->generic_routing.get_graph = generic_get_graph;
   new_component->generic_routing.finalize = dijkstra_finalize;
-  new_component->cached = cached;
-
-  return (AS_t)new_component;
+  new_component->cached = cached;*/
 }
 
-AS_t model_dijkstra_create(void)
+void AsDijkstra::end()
 {
-  return model_dijkstra_both_create(0);
-}
-
-AS_t model_dijkstracache_create(void)
-{
-  return model_dijkstra_both_create(1);
-}
-
-void model_dijkstra_both_end(AS_t as)
-{
-  as_dijkstra_t THIS_AS = (as_dijkstra_t) as;
-
   xbt_node_t node = NULL;
   unsigned int cursor2;
   xbt_dynar_t nodes = NULL;
 
   /* Create the topology graph */
-  if(!THIS_AS->route_graph)
-    THIS_AS->route_graph = xbt_graph_new_graph(1, NULL);
-  if(!THIS_AS->graph_node_map)
-    THIS_AS->graph_node_map = xbt_dict_new_homogeneous(&graph_node_map_elem_free);
+  if(!p_routeGraph)
+       p_routeGraph = xbt_graph_new_graph(1, NULL);
+  if(!p_graphNodeMap)
+    p_graphNodeMap = xbt_dict_new_homogeneous(&graph_node_map_elem_free);
 
-  if (THIS_AS->cached && !THIS_AS->route_cache)
-    THIS_AS->route_cache = xbt_dict_new_homogeneous(&route_cache_elem_free);
+  if (m_cached && !p_routeCache)
+    p_routeCache = xbt_dict_new_homogeneous(&route_cache_elem_free);
 
   /* Add the loopback if needed */
-  if (routing_platf->loopback && as->hierarchy == SURF_ROUTING_BASE)
-    add_loopback_dijkstra(THIS_AS);
+  if (routing_platf->p_loopback && p_hierarchy == SURF_ROUTING_BASE)
+    addLoopback();
 
   /* initialize graph indexes in nodes after graph has been built */
-  nodes = xbt_graph_get_nodes(THIS_AS->route_graph);
+  nodes = xbt_graph_get_nodes(p_routeGraph);
 
   xbt_dynar_foreach(nodes, cursor2, node) {
-    graph_node_data_t data = xbt_graph_node_get_data(node);
+    graph_node_data_t data = (graph_node_data_t) xbt_graph_node_get_data(node);
     data->graph_id = cursor2;
   }
 
 }
-void model_dijkstra_both_parse_route (AS_t asg, sg_platf_route_cbarg_t route)
+
+void AsDijkstra::parseASroute(sg_platf_route_cbarg_t route)
+{
+  parseRoute(route);
+}
+
+void AsDijkstra::parseRoute(sg_platf_route_cbarg_t route)
 {
   char *src = (char*)(route->src);
   char *dst = (char*)(route->dst);
@@ -476,16 +472,15 @@ void model_dijkstra_both_parse_route (AS_t asg, sg_platf_route_cbarg_t route)
     XBT_DEBUG("Load Route from \"%s\" to \"%s\"", src, dst);
   else{
     XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src,
-        route->gw_src->name, dst, route->gw_dst->name);
+        route->gw_src->getName(), dst, route->gw_dst->getName());
     as_route = 1;
-    if(route->gw_dst->rc_type == SURF_NETWORK_ELEMENT_NULL)
-      xbt_die("The gw_dst '%s' does not exist!",route->gw_dst->name);
-    if(route->gw_src->rc_type == SURF_NETWORK_ELEMENT_NULL)
-      xbt_die("The gw_src '%s' does not exist!",route->gw_src->name);
+    if(route->gw_dst->getRcType() == SURF_NETWORK_ELEMENT_NULL)
+      xbt_die("The gw_dst '%s' does not exist!",route->gw_dst->getName());
+    if(route->gw_src->getRcType() == SURF_NETWORK_ELEMENT_NULL)
+      xbt_die("The gw_src '%s' does not exist!",route->gw_src->getName());
   }
 
-  as_dijkstra_t as = (as_dijkstra_t) asg;
-  sg_routing_edge_t src_net_elm, dst_net_elm;
+  RoutingEdgePtr src_net_elm, dst_net_elm;
 
   src_net_elm = sg_routing_edge_by_name_or_null(src);
   dst_net_elm = sg_routing_edge_by_name_or_null(dst);
@@ -494,16 +489,16 @@ void model_dijkstra_both_parse_route (AS_t asg, sg_platf_route_cbarg_t route)
   xbt_assert(dst_net_elm, "Network elements %s not found", dst);
 
   /* Create the topology graph */
-  if(!as->route_graph)
-    as->route_graph = xbt_graph_new_graph(1, NULL);
-  if(!as->graph_node_map)
-    as->graph_node_map = xbt_dict_new_homogeneous(&graph_node_map_elem_free);
+  if(!p_routeGraph)
+    p_routeGraph = xbt_graph_new_graph(1, NULL);
+  if(!p_graphNodeMap)
+    p_graphNodeMap = xbt_dict_new_homogeneous(&graph_node_map_elem_free);
 
-  if (as->cached && !as->route_cache)
-    as->route_cache = xbt_dict_new_homogeneous(&route_cache_elem_free);
+  if (m_cached && !p_routeCache)
+    p_routeCache = xbt_dict_new_homogeneous(&route_cache_elem_free);
 
-  sg_platf_route_cbarg_t e_route = generic_new_extended_route(asg->hierarchy, route, 1);
-  route_new_dijkstra(as, src_net_elm->id, dst_net_elm->id, e_route);
+  sg_platf_route_cbarg_t e_route = newExtendedRoute(p_hierarchy, route, 1);
+  newRoute(src_net_elm->getId(), dst_net_elm->getId(), e_route);
 
   // Symmetrical YES
   if ( (route->symmetrical == TRUE && as_route == 0)
@@ -514,25 +509,25 @@ void model_dijkstra_both_parse_route (AS_t asg, sg_platf_route_cbarg_t route)
       XBT_DEBUG("Load Route from \"%s\" to \"%s\"", dst, src);
     else
       XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", dst,
-          route->gw_dst->name, src, route->gw_src->name);
+          route->gw_dst->getName(), src, route->gw_src->getName());
 
-    xbt_dynar_t nodes = xbt_graph_get_nodes(as->route_graph);
-    xbt_node_t node_s_v = xbt_dynar_get_as(nodes, src_net_elm->id, xbt_node_t);
-    xbt_node_t node_e_v = xbt_dynar_get_as(nodes, dst_net_elm->id, xbt_node_t);
+    xbt_dynar_t nodes = xbt_graph_get_nodes(p_routeGraph);
+    xbt_node_t node_s_v = xbt_dynar_get_as(nodes, src_net_elm->getId(), xbt_node_t);
+    xbt_node_t node_e_v = xbt_dynar_get_as(nodes, dst_net_elm->getId(), xbt_node_t);
     xbt_edge_t edge =
-        xbt_graph_get_edge(as->route_graph, node_e_v, node_s_v);
+        xbt_graph_get_edge(p_routeGraph, node_e_v, node_s_v);
 
     if (edge)
       THROWF(arg_error,0,"(AS)Route from '%s' to '%s' already exists",src,dst);
 
     if (route->gw_dst && route->gw_src) {
-      sg_routing_edge_t gw_tmp;
+      RoutingEdgePtr gw_tmp;
       gw_tmp = route->gw_src;
       route->gw_src = route->gw_dst;
       route->gw_dst = gw_tmp;
     }
-    sg_platf_route_cbarg_t link_route_back = generic_new_extended_route(asg->hierarchy, route, 0);
-    route_new_dijkstra(as, dst_net_elm->id, src_net_elm->id, link_route_back);
+    sg_platf_route_cbarg_t link_route_back = newExtendedRoute(p_hierarchy, route, 0);
+    newRoute(dst_net_elm->getId(), src_net_elm->getId(), link_route_back);
   }
   xbt_dynar_free(&route->link_list);
 }
diff --git a/src/surf/surf_routing_dijkstra.hpp b/src/surf/surf_routing_dijkstra.hpp
new file mode 100644 (file)
index 0000000..7299cb7
--- /dev/null
@@ -0,0 +1,54 @@
+/* Copyright (c) 2013-2014. 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 "surf_routing_generic.hpp"
+
+#ifndef SURF_ROUTING_DIJKSTRA_HPP_
+#define SURF_ROUTING_DIJKSTRA_HPP_
+
+typedef struct graph_node_data {
+  int id;
+  int graph_id;                 /* used for caching internal graph id's */
+} s_graph_node_data_t, *graph_node_data_t;
+
+typedef struct graph_node_map_element {
+  xbt_node_t node;
+} s_graph_node_map_element_t, *graph_node_map_element_t;
+
+typedef struct route_cache_element {
+  int *pred_arr;
+  int size;
+} s_route_cache_element_t, *route_cache_element_t;
+
+/***********
+ * Classes *
+ ***********/
+class AsDijkstra;
+typedef AsDijkstra *AsDijkstraPtr;
+
+class AsDijkstra : public AsGeneric {
+public:
+  AsDijkstra();
+  AsDijkstra(int cached);
+  ~AsDijkstra();
+       xbt_node_t routeGraphNewNode(int id, int graph_id);
+       graph_node_map_element_t nodeMapSearch(int id);
+       void newRoute(int src_id, int dst_id, sg_platf_route_cbarg_t e_route);
+       void addLoopback();
+       void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t route, double *lat);
+       xbt_dynar_t getOnelinkRoutes();
+       void getRouteAndLatency(sg_platf_route_cbarg_t route, double *lat);
+       void parseASroute(sg_platf_route_cbarg_t route);
+       void parseRoute(sg_platf_route_cbarg_t route);
+       void end();
+
+  xbt_graph_t p_routeGraph;      /* xbt_graph */
+  xbt_dict_t p_graphNodeMap;    /* map */
+  xbt_dict_t p_routeCache;       /* use in cache mode */
+  int m_cached;
+};
+
+#endif /* SURF_ROUTING_DIJKSTRA_HPP_ */
similarity index 53%
rename from src/surf/surf_routing_floyd.c
rename to src/surf/surf_routing_floyd.cpp
index 0c1d32a..f116c4e 100644 (file)
@@ -1,61 +1,76 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. 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 "surf_routing_private.h"
-
-/* Global vars */
-extern routing_platf_t routing_platf;
+#include "surf_routing_floyd.hpp"
+#include "network_interface.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_floyd, surf, "Routing part of surf");
 
-#define TO_FLOYD_COST(i,j) (as->cost_table)[(i)+(j)*table_size]
-#define TO_FLOYD_PRED(i,j) (as->predecessor_table)[(i)+(j)*table_size]
-#define TO_FLOYD_LINK(i,j) (as->link_table)[(i)+(j)*table_size]
+#define TO_FLOYD_COST(i,j) (p_costTable)[(i)+(j)*table_size]
+#define TO_FLOYD_PRED(i,j) (p_predecessorTable)[(i)+(j)*table_size]
+#define TO_FLOYD_LINK(i,j) (p_linkTable)[(i)+(j)*table_size]
 
-/* Routing model structure */
+AS_t model_floyd_create(void)
+{
+  return new AsFloyd();
+}
 
-typedef struct {
-  s_as_t generic_routing;
-  /* vars for calculate the floyd algorithm. */
-  int *predecessor_table;
-  double *cost_table;
-  sg_platf_route_cbarg_t *link_table;
-} s_as_floyd_t, *as_floyd_t;
+void model_floyd_end(AS_t current_routing)
+{
+  static_cast<AsFloydPtr>(current_routing)->end();
+}
+
+AsFloyd::AsFloyd(): AsGeneric() {
+  p_predecessorTable = NULL;
+  p_costTable = NULL;
+  p_linkTable = NULL;
+}
 
-static void floyd_get_route_and_latency(AS_t asg, sg_routing_edge_t src, sg_routing_edge_t dst,
-    sg_platf_route_cbarg_t res, double *lat);
+AsFloyd::~AsFloyd(){
+  int i, j;
+  int table_size;
+  table_size = (int)xbt_dynar_length(p_indexNetworkElm);
+    /* Delete link_table */
+    for (i = 0; i < table_size; i++)
+      for (j = 0; j < table_size; j++)
+        generic_free_route(TO_FLOYD_LINK(i, j));
+    xbt_free(p_linkTable);
+    /* Delete bypass dict */
+    xbt_dict_free(&p_bypassRoutes);
+    /* Delete predecessor and cost table */
+    xbt_free(p_predecessorTable);
+    xbt_free(p_costTable);
+}
 
 /* Business methods */
-static xbt_dynar_t floyd_get_onelink_routes(AS_t asg)
+xbt_dynar_t AsFloyd::getOneLinkRoutes()
 {
-  xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
+  xbt_dynar_t ret = xbt_dynar_new(sizeof(OnelinkPtr), xbt_free);
   sg_platf_route_cbarg_t route =   xbt_new0(s_sg_platf_route_cbarg_t, 1);
   route->link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
 
   int src,dst;
   sg_routing_edge_t src_elm, dst_elm;
-  int table_size = xbt_dynar_length(asg->index_network_elm);
+  int table_size = xbt_dynar_length(p_indexNetworkElm);
   for(src=0; src < table_size; src++) {
     for(dst=0; dst< table_size; dst++) {
       xbt_dynar_reset(route->link_list);
-      src_elm = xbt_dynar_get_as(asg->index_network_elm,src,sg_routing_edge_t);
-      dst_elm = xbt_dynar_get_as(asg->index_network_elm,dst,sg_routing_edge_t);
-      floyd_get_route_and_latency(asg, src_elm, dst_elm, route, NULL);
+      src_elm = xbt_dynar_get_as(p_indexNetworkElm, src, RoutingEdgePtr);
+      dst_elm = xbt_dynar_get_as(p_indexNetworkElm, dst, RoutingEdgePtr);
+      this->getRouteAndLatency(src_elm, dst_elm, route, NULL);
 
       if (xbt_dynar_length(route->link_list) == 1) {
         void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0);
-        onelink_t onelink = xbt_new0(s_onelink_t, 1);
-        onelink->link_ptr = link;
-        if (asg->hierarchy == SURF_ROUTING_BASE) {
-          onelink->src = src_elm;
-          onelink->dst = dst_elm;
-        } else if (asg->hierarchy == SURF_ROUTING_RECURSIVE) {
-          onelink->src = route->gw_src;
-          onelink->dst = route->gw_dst;
-        }
+        OnelinkPtr onelink;
+        if (p_hierarchy == SURF_ROUTING_BASE)
+          onelink = new Onelink(link, src_elm, dst_elm);
+        else if (p_hierarchy == SURF_ROUTING_RECURSIVE)
+          onelink = new Onelink(link, route->gw_src, route->gw_dst);
+        else
+          onelink = new Onelink(link, NULL, NULL);
         xbt_dynar_push(ret, &onelink);
       }
     }
@@ -64,29 +79,27 @@ static xbt_dynar_t floyd_get_onelink_routes(AS_t asg)
   return ret;
 }
 
-static void floyd_get_route_and_latency(AS_t asg, sg_routing_edge_t src, sg_routing_edge_t dst,
-    sg_platf_route_cbarg_t res, double *lat)
+void AsFloyd::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t res, double *lat)
 {
 
   /* set utils vars */
-  as_floyd_t as = (as_floyd_t)asg;
-  size_t table_size = xbt_dynar_length(asg->index_network_elm);
+  size_t table_size = xbt_dynar_length(p_indexNetworkElm);
 
-  generic_src_dst_check(asg, src, dst);
+  this->srcDstCheck(src, dst);
 
   /* create a result route */
   xbt_dynar_t route_stack = xbt_dynar_new(sizeof(sg_platf_route_cbarg_t), NULL);
   int pred;
-  int cur = dst->id;
+  int cur = dst->getId();
   do {
-    pred = TO_FLOYD_PRED(src->id, cur);
+    pred = TO_FLOYD_PRED(src->getId(), cur);
     if (pred == -1)
-      THROWF(arg_error, 0, "No route from '%s' to '%s'", src->name, dst->name);
+      THROWF(arg_error, 0, "No route from '%s' to '%s'", src->getName(), dst->getName());
     xbt_dynar_push_as(route_stack, sg_platf_route_cbarg_t, TO_FLOYD_LINK(pred, cur));
     cur = pred;
-  } while (cur != src->id);
+  } while (cur != src->getId());
 
-  if (asg->hierarchy == SURF_ROUTING_RECURSIVE) {
+  if (p_hierarchy == SURF_ROUTING_RECURSIVE) {
     res->gw_src = xbt_dynar_getlast_as(route_stack, sg_platf_route_cbarg_t)->gw_src;
     res->gw_dst = xbt_dynar_getfirst_as(route_stack, sg_platf_route_cbarg_t)->gw_dst;
   }
@@ -95,11 +108,11 @@ static void floyd_get_route_and_latency(AS_t asg, sg_routing_edge_t src, sg_rout
   while (!xbt_dynar_is_empty(route_stack)) {
     sg_platf_route_cbarg_t e_route = xbt_dynar_pop_as(route_stack, sg_platf_route_cbarg_t);
     xbt_dynar_t links;
-    sg_routing_link_t link;
+    void *link;
     unsigned int cpt;
 
-    if (asg->hierarchy == SURF_ROUTING_RECURSIVE && prev_dst_gw != NULL
-        && strcmp(prev_dst_gw->name, e_route->gw_src->name)) {
+    if (p_hierarchy == SURF_ROUTING_RECURSIVE && prev_dst_gw != NULL
+        && strcmp(prev_dst_gw->getName(), e_route->gw_src->getName())) {
       routing_get_route_and_latency(prev_dst_gw, e_route->gw_src,
                                     &res->link_list, lat);
     }
@@ -108,7 +121,7 @@ static void floyd_get_route_and_latency(AS_t asg, sg_routing_edge_t src, sg_rout
     xbt_dynar_foreach(links, cpt, link) {
       xbt_dynar_push_as(res->link_list, sg_routing_link_t, link);
       if (lat)
-        *lat += surf_network_model->extension.network.get_link_latency(link);
+        *lat += static_cast<NetworkLinkPtr>(link)->getLatency();
     }
 
     prev_dst_gw = e_route->gw_dst;
@@ -116,119 +129,24 @@ static void floyd_get_route_and_latency(AS_t asg, sg_routing_edge_t src, sg_rout
   xbt_dynar_free(&route_stack);
 }
 
-static void floyd_finalize(AS_t rc)
-{
-  as_floyd_t as = (as_floyd_t) rc;
-  int i, j;
-  size_t table_size;
-  if (as) {
-    table_size = xbt_dynar_length(as->generic_routing.index_network_elm);
-    /* Delete link_table */
-    for (i = 0; i < table_size; i++)
-      for (j = 0; j < table_size; j++)
-        generic_free_route(TO_FLOYD_LINK(i, j));
-    xbt_free(as->link_table);
-    /* Delete bypass dict */
-    xbt_dict_free(&as->generic_routing.bypassRoutes);
-    /* Delete predecessor and cost table */
-    xbt_free(as->predecessor_table);
-    xbt_free(as->cost_table);
-
-    model_generic_finalize(rc);
-  }
-}
-
-AS_t model_floyd_create(void)
-{
-  as_floyd_t new_component = (as_floyd_t)model_generic_create_sized(sizeof(s_as_floyd_t));
-  new_component->generic_routing.parse_route = model_floyd_parse_route;
-  new_component->generic_routing.parse_ASroute = model_floyd_parse_route;
-  new_component->generic_routing.get_route_and_latency = floyd_get_route_and_latency;
-  new_component->generic_routing.get_onelink_routes =
-      floyd_get_onelink_routes;
-  new_component->generic_routing.get_graph = generic_get_graph;
-  new_component->generic_routing.finalize = floyd_finalize;
-  return (AS_t)new_component;
-}
-
-void model_floyd_end(AS_t current_routing)
-{
-
-  as_floyd_t as =
-      ((as_floyd_t) current_routing);
-
-  unsigned int i, j, a, b, c;
-
-  /* set the size of table routing */
-  size_t table_size = xbt_dynar_length(as->generic_routing.index_network_elm);
-
-  if(!as->link_table)
-  {
-    /* Create Cost, Predecessor and Link tables */
-    as->cost_table = xbt_new0(double, table_size * table_size);       /* link cost from host to host */
-    as->predecessor_table = xbt_new0(int, table_size * table_size);  /* predecessor host numbers */
-    as->link_table = xbt_new0(sg_platf_route_cbarg_t, table_size * table_size);    /* actual link between src and dst */
-
-    /* Initialize costs and predecessors */
-    for (i = 0; i < table_size; i++)
-      for (j = 0; j < table_size; j++) {
-        TO_FLOYD_COST(i, j) = DBL_MAX;
-        TO_FLOYD_PRED(i, j) = -1;
-        TO_FLOYD_LINK(i, j) = NULL;       /* fixed, missing in the previous version */
-      }
-  }
-
-  /* Add the loopback if needed */
-  if (routing_platf->loopback && current_routing->hierarchy == SURF_ROUTING_BASE) {
-    for (i = 0; i < table_size; i++) {
-      sg_platf_route_cbarg_t e_route = TO_FLOYD_LINK(i, i);
-      if (!e_route) {
-        e_route = xbt_new0(s_sg_platf_route_cbarg_t, 1);
-        e_route->gw_src = NULL;
-        e_route->gw_dst = NULL;
-        e_route->link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
-        xbt_dynar_push(e_route->link_list, &routing_platf->loopback);
-        TO_FLOYD_LINK(i, i) = e_route;
-        TO_FLOYD_PRED(i, i) = i;
-        TO_FLOYD_COST(i, i) = 1;
-      }
-    }
-  }
-  /* Calculate path costs */
-  for (c = 0; c < table_size; c++) {
-    for (a = 0; a < table_size; a++) {
-      for (b = 0; b < table_size; b++) {
-        if (TO_FLOYD_COST(a, c) < DBL_MAX && TO_FLOYD_COST(c, b) < DBL_MAX) {
-          if (TO_FLOYD_COST(a, b) == DBL_MAX ||
-              (TO_FLOYD_COST(a, c) + TO_FLOYD_COST(c, b) <
-                  TO_FLOYD_COST(a, b))) {
-            TO_FLOYD_COST(a, b) =
-                TO_FLOYD_COST(a, c) + TO_FLOYD_COST(c, b);
-            TO_FLOYD_PRED(a, b) = TO_FLOYD_PRED(c, b);
-          }
-        }
-      }
-    }
-  }
-}
-
 static int floyd_pointer_resource_cmp(const void *a, const void *b) {
   return a != b;
 }
 
-//FIXME: kill dupplicates in next function with full routing
+void AsFloyd::parseASroute(sg_platf_route_cbarg_t route){
+  parseRoute(route);
+}
 
-void model_floyd_parse_route(AS_t rc, sg_platf_route_cbarg_t route)
+void AsFloyd::parseRoute(sg_platf_route_cbarg_t route)
 {
   char *src = (char*)(route->src);
   char *dst = (char*)(route->dst);
 
   int as_route = 0;
-  as_floyd_t as = (as_floyd_t) rc;
 
   /* set the size of table routing */
-  size_t table_size = xbt_dynar_length(rc->index_network_elm);
-  sg_routing_edge_t src_net_elm, dst_net_elm;
+  int table_size = (int)xbt_dynar_length(p_indexNetworkElm);
+  RoutingEdgePtr src_net_elm, dst_net_elm;
 
   src_net_elm = sg_routing_edge_by_name_or_null(src);
   dst_net_elm = sg_routing_edge_by_name_or_null(dst);
@@ -236,13 +154,13 @@ void model_floyd_parse_route(AS_t rc, sg_platf_route_cbarg_t route)
   xbt_assert(src_net_elm, "Network elements %s not found", src);
   xbt_assert(dst_net_elm, "Network elements %s not found", dst);
 
-  if(!as->link_table)
+  if(!p_linkTable)
   {
     int i,j;
     /* Create Cost, Predecessor and Link tables */
-    as->cost_table = xbt_new0(double, table_size * table_size);       /* link cost from host to host */
-    as->predecessor_table = xbt_new0(int, table_size * table_size);  /* predecessor host numbers */
-    as->link_table = xbt_new0(sg_platf_route_cbarg_t, table_size * table_size);    /* actual link between src and dst */
+    p_costTable = xbt_new0(double, table_size * table_size);       /* link cost from host to host */
+    p_predecessorTable = xbt_new0(int, table_size * table_size);  /* predecessor host numbers */
+    p_linkTable = xbt_new0(sg_platf_route_cbarg_t, table_size * table_size);    /* actual link between src and dst */
 
     /* Initialize costs and predecessors */
     for (i = 0; i < table_size; i++)
@@ -257,14 +175,14 @@ void model_floyd_parse_route(AS_t rc, sg_platf_route_cbarg_t route)
   else{
     as_route = 1;
     XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src,
-        route->gw_src->name, dst, route->gw_dst->name);
-    if(route->gw_dst->rc_type == SURF_NETWORK_ELEMENT_NULL)
-      xbt_die("The dst_gateway '%s' does not exist!",route->gw_dst->name);
-    if(route->gw_src->rc_type == SURF_NETWORK_ELEMENT_NULL)
-      xbt_die("The src_gateway '%s' does not exist!",route->gw_src->name);
+        route->gw_src->getName(), dst, route->gw_dst->getName());
+    if(route->gw_dst->getRcType() == SURF_NETWORK_ELEMENT_NULL)
+      xbt_die("The dst_gateway '%s' does not exist!",route->gw_dst->getName());
+    if(route->gw_src->getRcType() == SURF_NETWORK_ELEMENT_NULL)
+      xbt_die("The src_gateway '%s' does not exist!",route->gw_src->getName());
   }
 
-  if(TO_FLOYD_LINK(src_net_elm->id, dst_net_elm->id))
+  if(TO_FLOYD_LINK(src_net_elm->getId(), dst_net_elm->getId()))
   {
 
     char * link_name;
@@ -277,44 +195,44 @@ void model_floyd_parse_route(AS_t rc, sg_platf_route_cbarg_t route)
       xbt_dynar_push(link_route_to_test,&link);
     }
     xbt_assert(!xbt_dynar_compare(
-        (void*)TO_FLOYD_LINK(src_net_elm->id, dst_net_elm->id)->link_list,
-        (void*)link_route_to_test,
+        TO_FLOYD_LINK(src_net_elm->getId(), dst_net_elm->getId())->link_list,
+        link_route_to_test,
         (int_f_cpvoid_cpvoid_t) floyd_pointer_resource_cmp),
         "The route between \"%s\" and \"%s\" already exists", src,dst);
   }
   else
   {
-    TO_FLOYD_LINK(src_net_elm->id, dst_net_elm->id) =
-        generic_new_extended_route(rc->hierarchy, route, 1);
-    TO_FLOYD_PRED(src_net_elm->id, dst_net_elm->id) = src_net_elm->id;
-    TO_FLOYD_COST(src_net_elm->id, dst_net_elm->id) =
-        ((TO_FLOYD_LINK(src_net_elm->id, dst_net_elm->id))->link_list)->used;   /* count of links, old model assume 1 */
+    TO_FLOYD_LINK(src_net_elm->getId(), dst_net_elm->getId()) =
+        newExtendedRoute(p_hierarchy, route, 1);
+    TO_FLOYD_PRED(src_net_elm->getId(), dst_net_elm->getId()) = src_net_elm->getId();
+    TO_FLOYD_COST(src_net_elm->getId(), dst_net_elm->getId()) =
+        ((TO_FLOYD_LINK(src_net_elm->getId(), dst_net_elm->getId()))->link_list)->used;   /* count of links, old model assume 1 */
   }
 
   if ( (route->symmetrical == TRUE && as_route == 0)
       || (route->symmetrical == TRUE && as_route == 1)
   )
   {
-    if(TO_FLOYD_LINK(dst_net_elm->id, src_net_elm->id))
+    if(TO_FLOYD_LINK(dst_net_elm->getId(), src_net_elm->getId()))
     {
       if(!route->gw_dst && !route->gw_src)
         XBT_DEBUG("See Route from \"%s\" to \"%s\"", dst, src);
       else
         XBT_DEBUG("See ASroute from \"%s(%s)\" to \"%s(%s)\"", dst,
-            route->gw_src->name, src, route->gw_dst->name);
+            route->gw_src->getName(), src, route->gw_dst->getName());
       char * link_name;
       unsigned int i;
       xbt_dynar_t link_route_to_test = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
       for(i=xbt_dynar_length(route->link_list) ;i>0 ;i--)
       {
-        link_name = xbt_dynar_get_as(route->link_list,i-1,void *);
+        link_name = xbt_dynar_get_as(route->link_list,i-1,char *);
         void *link = xbt_lib_get_or_null(link_lib, link_name, SURF_LINK_LEVEL);
         xbt_assert(link,"Link : '%s' doesn't exists.",link_name);
         xbt_dynar_push(link_route_to_test,&link);
       }
       xbt_assert(!xbt_dynar_compare(
-          (void*)TO_FLOYD_LINK(dst_net_elm->id, src_net_elm->id)->link_list,
-          (void*)link_route_to_test,
+          TO_FLOYD_LINK(dst_net_elm->getId(), src_net_elm->getId())->link_list,
+          link_route_to_test,
           (int_f_cpvoid_cpvoid_t) floyd_pointer_resource_cmp),
           "The route between \"%s\" and \"%s\" already exists", src,dst);
     }
@@ -332,14 +250,69 @@ void model_floyd_parse_route(AS_t rc, sg_platf_route_cbarg_t route)
         XBT_DEBUG("Load Route from \"%s\" to \"%s\"", dst, src);
       else
         XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", dst,
-            route->gw_src->name, src, route->gw_dst->name);
+            route->gw_src->getName(), src, route->gw_dst->getName());
 
-      TO_FLOYD_LINK(dst_net_elm->id, src_net_elm->id) =
-          generic_new_extended_route(rc->hierarchy, route, 0);
-      TO_FLOYD_PRED(dst_net_elm->id, src_net_elm->id) = dst_net_elm->id;
-      TO_FLOYD_COST(dst_net_elm->id, src_net_elm->id) =
-          ((TO_FLOYD_LINK(dst_net_elm->id, src_net_elm->id))->link_list)->used;   /* count of links, old model assume 1 */
+      TO_FLOYD_LINK(dst_net_elm->getId(), src_net_elm->getId()) =
+                newExtendedRoute(p_hierarchy, route, 0);
+      TO_FLOYD_PRED(dst_net_elm->getId(), src_net_elm->getId()) = dst_net_elm->getId();
+      TO_FLOYD_COST(dst_net_elm->getId(), src_net_elm->getId()) =
+          ((TO_FLOYD_LINK(dst_net_elm->getId(), src_net_elm->getId()))->link_list)->used;   /* count of links, old model assume 1 */
     }
   }
   xbt_dynar_free(&route->link_list);
 }
+
+void AsFloyd::end(){
+  unsigned int i, j, a, b, c;
+
+  /* set the size of table routing */
+  size_t table_size = xbt_dynar_length(p_indexNetworkElm);
+
+  if(!p_linkTable) {
+    /* Create Cost, Predecessor and Link tables */
+    p_costTable = xbt_new0(double, table_size * table_size);       /* link cost from host to host */
+    p_predecessorTable = xbt_new0(int, table_size * table_size);  /* predecessor host numbers */
+    p_linkTable = xbt_new0(sg_platf_route_cbarg_t, table_size * table_size);    /* actual link between src and dst */
+
+    /* Initialize costs and predecessors */
+    for (i = 0; i < table_size; i++)
+      for (j = 0; j < table_size; j++) {
+        TO_FLOYD_COST(i, j) = DBL_MAX;
+        TO_FLOYD_PRED(i, j) = -1;
+        TO_FLOYD_LINK(i, j) = NULL;       /* fixed, missing in the previous version */
+      }
+  }
+
+  /* Add the loopback if needed */
+  if (routing_platf->p_loopback && p_hierarchy == SURF_ROUTING_BASE) {
+    for (i = 0; i < table_size; i++) {
+      sg_platf_route_cbarg_t e_route = TO_FLOYD_LINK(i, i);
+      if (!e_route) {
+        e_route = xbt_new0(s_sg_platf_route_cbarg_t, 1);
+        e_route->gw_src = NULL;
+        e_route->gw_dst = NULL;
+        e_route->link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
+        xbt_dynar_push(e_route->link_list, &routing_platf->p_loopback);
+        TO_FLOYD_LINK(i, i) = e_route;
+        TO_FLOYD_PRED(i, i) = i;
+        TO_FLOYD_COST(i, i) = 1;
+      }
+    }
+  }
+  /* Calculate path costs */
+  for (c = 0; c < table_size; c++) {
+    for (a = 0; a < table_size; a++) {
+      for (b = 0; b < table_size; b++) {
+        if (TO_FLOYD_COST(a, c) < DBL_MAX && TO_FLOYD_COST(c, b) < DBL_MAX) {
+          if (TO_FLOYD_COST(a, b) == DBL_MAX ||
+              (TO_FLOYD_COST(a, c) + TO_FLOYD_COST(c, b) <
+                  TO_FLOYD_COST(a, b))) {
+            TO_FLOYD_COST(a, b) =
+                TO_FLOYD_COST(a, c) + TO_FLOYD_COST(c, b);
+            TO_FLOYD_PRED(a, b) = TO_FLOYD_PRED(c, b);
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/src/surf/surf_routing_floyd.hpp b/src/surf/surf_routing_floyd.hpp
new file mode 100644 (file)
index 0000000..57fca5e
--- /dev/null
@@ -0,0 +1,51 @@
+/* Copyright (c) 2013-2014. 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 "surf_routing_generic.hpp"
+
+#ifndef SURF_ROUTING_FLOYD_HPP_
+#define SURF_ROUTING_FLOYD_HPP_
+
+
+/***********
+ * Classes *
+ ***********/
+class AsFloyd;
+typedef AsFloyd *AsFloydPtr;
+
+class AsFloyd: public AsGeneric {
+public:
+  AsFloyd();
+  ~AsFloyd();
+
+  void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t into, double *latency);
+  xbt_dynar_t getOneLinkRoutes();
+  void parseASroute(sg_platf_route_cbarg_t route);
+  void parseRoute(sg_platf_route_cbarg_t route);
+  void end();
+  //void parseASroute(sg_platf_route_cbarg_t route);
+
+  //void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges);
+  //sg_platf_route_cbarg_t getBypassRoute(RoutingEdgePtr src, RoutingEdgePtr dst, double *lat);
+
+  /* The parser calls the following functions to inform the routing models
+   * that a new element is added to the AS currently built.
+   *
+   * Of course, only the routing model of this AS is informed, not every ones */
+  //int parsePU(RoutingEdgePtr elm); /* A host or a router, whatever */
+  //int parseAS(RoutingEdgePtr elm);
+
+  //virtual void parseBypassroute(sg_platf_route_cbarg_t e_route)=0;
+
+  /* vars for calculate the floyd algorith. */
+  int *p_predecessorTable;
+  double *p_costTable;
+  sg_platf_route_cbarg_t *p_linkTable;
+};
+
+
+
+#endif /* SURF_ROUTING_FLOYD_HPP_ */
similarity index 56%
rename from src/surf/surf_routing_full.c
rename to src/surf/surf_routing_full.cpp
index 89e305f..4c0aeb0 100644 (file)
@@ -1,52 +1,96 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. 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 "surf_routing_private.h"
+#include "surf_routing_full.hpp"
+#include "network_interface.hpp"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_full, surf, "Routing part of surf");
 
 /* Global vars */
 extern routing_platf_t routing_platf;
 extern int surf_parse_lineno;
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_full, surf, "Routing part of surf");
+#define TO_ROUTE_FULL(i,j) p_routingTable[(i)+(j)*table_size]
+
+AS_t model_full_create(void)
+{
+  return new AsFull();
+}
+
+void model_full_end(AS_t _routing)
+{
+  int i;
+  sg_platf_route_cbarg_t e_route;
+
+  /* set utils vars */
+  AsFullPtr routing = ((AsFullPtr) _routing);
+  int table_size = (int)xbt_dynar_length(routing->p_indexNetworkElm);
 
-#define TO_ROUTE_FULL(i,j) routing->routing_table[(i)+(j)*table_size]
+  /* Create table if necessary */
+  if (!routing->p_routingTable)
+    routing->p_routingTable = xbt_new0(sg_platf_route_cbarg_t, table_size * table_size);
+
+  /* Add the loopback if needed */
+  if (routing_platf->p_loopback && routing->p_hierarchy == SURF_ROUTING_BASE) {
+    for (i = 0; i < table_size; i++) {
+      e_route = routing->TO_ROUTE_FULL(i, i);
+      if (!e_route) {
+        e_route = xbt_new0(s_sg_platf_route_cbarg_t, 1);
+        e_route->gw_src = NULL;
+        e_route->gw_dst = NULL;
+        e_route->link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
+        xbt_dynar_push(e_route->link_list, &routing_platf->p_loopback);
+        routing->TO_ROUTE_FULL(i, i) = e_route;
+      }
+    }
+  }
+}
 
-/* Routing model structure */
+AsFull::AsFull(){
+  p_routingTable = 0;
+}
 
-typedef struct s_routing_component_full {
-  s_as_t generic_routing;
-  sg_platf_route_cbarg_t *routing_table;
-} s_routing_component_full_t, *routing_component_full_t;
+AsFull::~AsFull(){
+  int table_size = (int)xbt_dynar_length(p_indexNetworkElm);
+  int i, j;
+  /* Delete routing table */
+  for (i = 0; i < table_size; i++)
+    for (j = 0; j < table_size; j++) {
+      if (TO_ROUTE_FULL(i,j)){
+        xbt_dynar_free(&TO_ROUTE_FULL(i,j)->link_list);
+        xbt_free(TO_ROUTE_FULL(i,j));
+      }
+    }
+  xbt_free(p_routingTable);
+}
 
-/* Business methods */
-static xbt_dynar_t full_get_onelink_routes(AS_t rc)
+xbt_dynar_t AsFull::getOneLinkRoutes()
 {
-  xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
-  routing_component_full_t routing = (routing_component_full_t) rc;
+  xbt_dynar_t ret = xbt_dynar_new(sizeof(OnelinkPtr), xbt_free);
 
-  int src,dst;
-  int table_size = xbt_dynar_length(rc->index_network_elm);
+  int src, dst;
+  int table_size = xbt_dynar_length(p_indexNetworkElm);
 
   for(src=0; src < table_size; src++) {
     for(dst=0; dst< table_size; dst++) {
-      sg_platf_route_cbarg_t route = TO_ROUTE_FULL(src, dst);
+      sg_platf_route_cbarg_t route = TO_ROUTE_FULL(src,dst);
       if (route) {
         if (xbt_dynar_length(route->link_list) == 1) {
           void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0);
-          onelink_t onelink = xbt_new0(s_onelink_t, 1);
-          onelink->link_ptr = link;
-          if (rc->hierarchy == SURF_ROUTING_BASE) {
-            onelink->src = xbt_dynar_get_as(rc->index_network_elm,src,sg_routing_edge_t);
-            onelink->src->id = src;
-            onelink->dst = xbt_dynar_get_as(rc->index_network_elm,dst,sg_routing_edge_t);
-            onelink->dst->id = dst;
-          } else if (rc->hierarchy == SURF_ROUTING_RECURSIVE) {
-            onelink->src = route->gw_src;
-            onelink->dst = route->gw_dst;
-          }
+          OnelinkPtr onelink;
+          if (p_hierarchy == SURF_ROUTING_BASE) {
+               RoutingEdgePtr tmp_src = xbt_dynar_get_as(p_indexNetworkElm, src, sg_routing_edge_t);
+            tmp_src->setId(src);
+               RoutingEdgePtr tmp_dst = xbt_dynar_get_as(p_indexNetworkElm, dst, sg_routing_edge_t);
+               tmp_dst->setId(dst);
+            onelink = new Onelink(link, tmp_src, tmp_dst);
+          } else if (p_hierarchy == SURF_ROUTING_RECURSIVE)
+            onelink = new Onelink(link, route->gw_src, route->gw_dst);
+          else
+            onelink = new Onelink(link, NULL, NULL);
           xbt_dynar_push(ret, &onelink);
           XBT_DEBUG("Push route from '%d' to '%d'",
               src,
@@ -58,25 +102,22 @@ static xbt_dynar_t full_get_onelink_routes(AS_t rc)
   return ret;
 }
 
-static void full_get_route_and_latency(AS_t rc,
-    sg_routing_edge_t src, sg_routing_edge_t dst,
-    sg_platf_route_cbarg_t res, double *lat)
+void AsFull::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t res, double *lat)
 {
   XBT_DEBUG("full_get_route_and_latency from %s[%d] to %s[%d]",
-      src->name,
-      src->id,
-      dst->name,
-      dst->id  );
+      src->getName(),
+      src->getId(),
+      dst->getName(),
+      dst->getId());
 
   /* set utils vars */
-  routing_component_full_t routing = (routing_component_full_t) rc;
-  size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm);
+  size_t table_size = xbt_dynar_length(p_indexNetworkElm);
 
   sg_platf_route_cbarg_t e_route = NULL;
   void *link;
   unsigned int cpt = 0;
 
-  e_route = TO_ROUTE_FULL(src->id, dst->id);
+  e_route = TO_ROUTE_FULL(src->getId(), dst->getId());
 
   if (e_route) {
     res->gw_src = e_route->gw_src;
@@ -84,73 +125,13 @@ static void full_get_route_and_latency(AS_t rc,
     xbt_dynar_foreach(e_route->link_list, cpt, link) {
       xbt_dynar_push(res->link_list, &link);
       if (lat)
-        *lat += surf_network_model->extension.network.get_link_latency(link);
+        *lat += static_cast<NetworkLinkPtr>(link)->getLatency();
     }
   }
 }
 
-static void full_finalize(AS_t rc)
-{
-  routing_component_full_t routing = (routing_component_full_t) rc;
-  size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm);
-  int i, j;
-  if (routing) {
-    /* Delete routing table */
-    for (i = 0; i < table_size; i++)
-      for (j = 0; j < table_size; j++)
-        generic_free_route(TO_ROUTE_FULL(i, j));
-    xbt_free(routing->routing_table);
-    model_generic_finalize(rc);
-  }
-}
-
-/* Creation routing model functions */
-
-AS_t model_full_create(void)
-{
-  routing_component_full_t new_component = (routing_component_full_t)
-          model_generic_create_sized(sizeof(s_routing_component_full_t));
-
-  new_component->generic_routing.parse_route = model_full_set_route;
-  new_component->generic_routing.parse_ASroute = model_full_set_route;
-  new_component->generic_routing.get_route_and_latency =
-      full_get_route_and_latency;
-  new_component->generic_routing.get_graph = generic_get_graph;
-
-  new_component->generic_routing.get_onelink_routes = full_get_onelink_routes;
-  new_component->generic_routing.finalize = full_finalize;
-
-  return (AS_t) new_component;
-}
-
-void model_full_end(AS_t current_routing)
-{
-  unsigned int i;
-  sg_platf_route_cbarg_t e_route;
-
-  /* set utils vars */
-  routing_component_full_t routing =
-      ((routing_component_full_t) current_routing);
-  size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm);
-
-  /* Create table if necessary */
-  if (!routing->routing_table)
-    routing->routing_table = xbt_new0(sg_platf_route_cbarg_t, table_size * table_size);
-
-  /* Add the loopback if needed */
-  if (routing_platf->loopback && current_routing->hierarchy == SURF_ROUTING_BASE) {
-    for (i = 0; i < table_size; i++) {
-      e_route = TO_ROUTE_FULL(i, i);
-      if (!e_route) {
-        e_route = xbt_new0(s_sg_platf_route_cbarg_t, 1);
-        e_route->gw_src = NULL;
-        e_route->gw_dst = NULL;
-        e_route->link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
-        xbt_dynar_push(e_route->link_list, &routing_platf->loopback);
-        TO_ROUTE_FULL(i, i) = e_route;
-      }
-    }
-  }
+void AsFull::parseASroute(sg_platf_route_cbarg_t route){
+  parseRoute(route);
 }
 
 static int full_pointer_resource_cmp(const void *a, const void *b)
@@ -158,29 +139,28 @@ static int full_pointer_resource_cmp(const void *a, const void *b)
   return a != b;
 }
 
-void model_full_set_route(AS_t rc, sg_platf_route_cbarg_t route)
+void AsFull::parseRoute(sg_platf_route_cbarg_t route)
 {
   int as_route = 0;
   char *src = (char*)(route->src);
   char *dst = (char*)(route->dst);
-  sg_routing_edge_t src_net_elm, dst_net_elm;
+  RoutingEdgePtr src_net_elm, dst_net_elm;
   src_net_elm = sg_routing_edge_by_name_or_null(src);
   dst_net_elm = sg_routing_edge_by_name_or_null(dst);
 
   xbt_assert(src_net_elm, "Network elements %s not found", src);
   xbt_assert(dst_net_elm, "Network elements %s not found", dst);
 
-  routing_component_full_t routing = (routing_component_full_t) rc;
-  size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm);
+  size_t table_size = xbt_dynar_length(p_indexNetworkElm);
 
   xbt_assert(!xbt_dynar_is_empty(route->link_list),
       "Invalid count of links, must be greater than zero (%s,%s)",
       src, dst);
 
-  if (!routing->routing_table)
-    routing->routing_table = xbt_new0(sg_platf_route_cbarg_t, table_size * table_size);
+  if (!p_routingTable)
+    p_routingTable = xbt_new0(sg_platf_route_cbarg_t, table_size * table_size);
 
-  if (TO_ROUTE_FULL(src_net_elm->id, dst_net_elm->id)) {
+  if (TO_ROUTE_FULL(src_net_elm->getId(), dst_net_elm->getId())) {
     char *link_name;
     unsigned int i;
     xbt_dynar_t link_route_to_test =
@@ -190,7 +170,7 @@ void model_full_set_route(AS_t rc, sg_platf_route_cbarg_t route)
       xbt_assert(link, "Link : '%s' doesn't exists.", link_name);
       xbt_dynar_push(link_route_to_test, &link);
     }
-    if (xbt_dynar_compare(TO_ROUTE_FULL(src_net_elm->id, dst_net_elm->id)->link_list,
+    if (xbt_dynar_compare(TO_ROUTE_FULL(src_net_elm->getId(), dst_net_elm->getId())->link_list,
         link_route_to_test, full_pointer_resource_cmp)) {
       surf_parse_error("A route between \"%s\" and \"%s\" already exists "
           "with a different content. "
@@ -233,15 +213,14 @@ void model_full_set_route(AS_t rc, sg_platf_route_cbarg_t route)
       //                         route->dst_gateway, subas->name);
       as_route = 1;
       XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"",
-          src, route->gw_src->name, dst, route->gw_dst->name);
-      if (route->gw_dst->rc_type == SURF_NETWORK_ELEMENT_NULL)
-        xbt_die("The dst_gateway '%s' does not exist!", route->gw_dst->name);
-      if (route->gw_src->rc_type == SURF_NETWORK_ELEMENT_NULL)
-        xbt_die("The src_gateway '%s' does not exist!", route->gw_src->name);
+          src, route->gw_src->getName(), dst, route->gw_dst->getName());
+      if (route->gw_dst->getRcType() == SURF_NETWORK_ELEMENT_NULL)
+        xbt_die("The dst_gateway '%s' does not exist!", route->gw_dst->getName());
+      if (route->gw_src->getRcType() == SURF_NETWORK_ELEMENT_NULL)
+        xbt_die("The src_gateway '%s' does not exist!", route->gw_src->getName());
     }
-    TO_ROUTE_FULL(src_net_elm->id, dst_net_elm->id) =
-        generic_new_extended_route(rc->hierarchy, route, 1);
-    xbt_dynar_shrink(TO_ROUTE_FULL(src_net_elm->id, dst_net_elm->id)->link_list, 0);
+    TO_ROUTE_FULL(src_net_elm->getId(), dst_net_elm->getId()) = newExtendedRoute(p_hierarchy, route, 1);
+    xbt_dynar_shrink(TO_ROUTE_FULL(src_net_elm->getId(), dst_net_elm->getId())->link_list, 0);
   }
 
   if ( (route->symmetrical == TRUE && as_route == 0)
@@ -253,18 +232,18 @@ void model_full_set_route(AS_t rc, sg_platf_route_cbarg_t route)
       route->gw_src = route->gw_dst;
       route->gw_dst = gw_tmp;
     }
-    if (TO_ROUTE_FULL(dst_net_elm->id, src_net_elm->id)) {
+    if (TO_ROUTE_FULL(dst_net_elm->getId(), src_net_elm->getId())) {
       char *link_name;
       unsigned int i;
       xbt_dynar_t link_route_to_test =
           xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
       for (i = xbt_dynar_length(route->link_list); i > 0; i--) {
-        link_name = xbt_dynar_get_as(route->link_list, i - 1, void *);
+        link_name = xbt_dynar_get_as(route->link_list, i - 1, char *);
         void *link = xbt_lib_get_or_null(link_lib, link_name, SURF_LINK_LEVEL);
         xbt_assert(link, "Link : '%s' doesn't exists.", link_name);
         xbt_dynar_push(link_route_to_test, &link);
       }
-      xbt_assert(!xbt_dynar_compare(TO_ROUTE_FULL(dst_net_elm->id, src_net_elm->id)->link_list,
+      xbt_assert(!xbt_dynar_compare(TO_ROUTE_FULL(dst_net_elm->getId(), src_net_elm->getId())->link_list,
           link_route_to_test,
           full_pointer_resource_cmp),
           "The route between \"%s\" and \"%s\" already exists", src,
@@ -274,11 +253,14 @@ void model_full_set_route(AS_t rc, sg_platf_route_cbarg_t route)
         XBT_DEBUG("Load Route from \"%s\" to \"%s\"", dst, src);
       else
         XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"",
-            dst, route->gw_src->name, src, route->gw_dst->name);
-      TO_ROUTE_FULL(dst_net_elm->id, src_net_elm->id) =
-          generic_new_extended_route(rc->hierarchy, route, 0);
-      xbt_dynar_shrink(TO_ROUTE_FULL(dst_net_elm->id, src_net_elm->id)->link_list, 0);
+            dst, route->gw_src->getName(), src, route->gw_dst->getName());
+      TO_ROUTE_FULL(dst_net_elm->getId(), src_net_elm->getId()) = newExtendedRoute(p_hierarchy, route, 0);
+      xbt_dynar_shrink(TO_ROUTE_FULL(dst_net_elm->getId(), src_net_elm->getId())->link_list, 0);
     }
   }
   xbt_dynar_free(&route->link_list);
 }
+
+
+
+
diff --git a/src/surf/surf_routing_full.hpp b/src/surf/surf_routing_full.hpp
new file mode 100644 (file)
index 0000000..de3d0de
--- /dev/null
@@ -0,0 +1,44 @@
+/* Copyright (c) 2013-2014. 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 "surf_routing_generic.hpp"
+
+#ifndef SURF_ROUTING_FULL_HPP_
+#define SURF_ROUTING_FULL_HPP_
+
+/***********
+ * Classes *
+ ***********/
+class AsFull;
+typedef AsFull *AsFullPtr;
+
+class AsFull: public AsGeneric {
+public:
+  sg_platf_route_cbarg_t *p_routingTable;
+
+  AsFull();
+  ~AsFull();
+
+  void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t into, double *latency);
+  xbt_dynar_t getOneLinkRoutes();
+  void parseRoute(sg_platf_route_cbarg_t route);
+  void parseASroute(sg_platf_route_cbarg_t route);
+
+  //void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges);
+  //sg_platf_route_cbarg_t getBypassRoute(RoutingEdgePtr src, RoutingEdgePtr dst, double *lat);
+
+  /* The parser calls the following functions to inform the routing models
+   * that a new element is added to the AS currently built.
+   *
+   * Of course, only the routing model of this AS is informed, not every ones */
+  //virtual int parsePU(RoutingEdgePtr elm)=0; /* A host or a router, whatever */
+  //virtual int parseAS( RoutingEdgePtr elm)=0;
+
+  //virtual void parseBypassroute(sg_platf_route_cbarg_t e_route)=0;
+};
+
+
+#endif /* SURF_ROUTING_FULL_HPP_ */
similarity index 57%
rename from src/surf/surf_routing_generic.c
rename to src/surf/surf_routing_generic.cpp
index 9c0d4f9..908e46e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -6,52 +6,57 @@
 
 #include "simgrid/platf_interface.h"    // platform creation API internal interface
 
-#include "surf_routing_private.h"
-#include "surf/surf_routing.h"
-#include "surf/surfxml_parse_values.h"
+#include "surf_routing_generic.hpp"
+#include "network_interface.hpp"
 #include "xbt/graph.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_routing_generic, surf_route, "Generic implementation of the surf routing");
 
 static int no_bypassroute_declared = 1;
 
-AS_t model_generic_create_sized(size_t childsize) {
-  AS_t new_component = model_none_create_sized(childsize);
-
-  new_component->parse_PU = generic_parse_PU;
-  new_component->parse_AS = generic_parse_AS;
-  new_component->parse_route = NULL;
-  new_component->parse_ASroute = NULL;
-  new_component->parse_bypassroute = generic_parse_bypassroute;
-  new_component->get_route_and_latency = NULL;
-  new_component->get_onelink_routes = NULL;
-  new_component->get_bypass_route =
-      generic_get_bypassroute;
-  new_component->finalize = model_generic_finalize;
-  new_component->bypassRoutes = xbt_dict_new_homogeneous((void (*)(void *)) generic_free_route);
-
-  return new_component;
+void generic_free_route(sg_platf_route_cbarg_t route)
+{
+  if (route) {
+    xbt_dynar_free(&route->link_list);
+    xbt_free(route);
+  }
 }
-void model_generic_finalize(AS_t as) {
-  xbt_dict_free(&as->bypassRoutes);
-  model_none_finalize(as);
+
+void AsGeneric::parseRoute(sg_platf_route_cbarg_t /*route*/){
+  THROW_IMPOSSIBLE;
+}
+
+void AsGeneric::parseASroute(sg_platf_route_cbarg_t /*route*/){
+  THROW_IMPOSSIBLE;
 }
 
-int generic_parse_PU(AS_t as, sg_routing_edge_t elm)
+void AsGeneric::getRouteAndLatency(RoutingEdgePtr /*src*/, RoutingEdgePtr /*dst*/, sg_platf_route_cbarg_t /*into*/, double */*latency*/){
+  THROW_IMPOSSIBLE;
+}
+
+AsGeneric::AsGeneric() {
+  p_bypassRoutes = xbt_dict_new_homogeneous((void (*)(void *)) generic_free_route);
+}
+
+AsGeneric::~AsGeneric() {
+  xbt_dict_free(&p_bypassRoutes);
+}
+
+int AsGeneric::parsePU(RoutingEdgePtr elm)
 {
-  XBT_DEBUG("Load process unit \"%s\"", elm->name);
-  xbt_dynar_push_as(as->index_network_elm,sg_routing_edge_t,elm);
-  return xbt_dynar_length(as->index_network_elm)-1;
+  XBT_DEBUG("Load process unit \"%s\"", elm->getName());
+  xbt_dynar_push_as(p_indexNetworkElm, RoutingEdgePtr, elm);
+  return xbt_dynar_length(p_indexNetworkElm)-1;
 }
 
-int generic_parse_AS(AS_t as, sg_routing_edge_t elm)
+int AsGeneric::parseAS(RoutingEdgePtr elm)
 {
-  XBT_DEBUG("Load Autonomous system \"%s\"", elm->name);
-  xbt_dynar_push_as(as->index_network_elm,sg_routing_edge_t,elm);
-  return xbt_dynar_length(as->index_network_elm)-1;
+  XBT_DEBUG("Load Autonomous system \"%s\"", elm->getName());
+  xbt_dynar_push_as(p_indexNetworkElm, RoutingEdgePtr, elm);
+  return xbt_dynar_length(p_indexNetworkElm)-1;
 }
 
-void generic_parse_bypassroute(AS_t rc, sg_platf_route_cbarg_t e_route)
+void AsGeneric::parseBypassroute(sg_platf_route_cbarg_t e_route)
 {
   char *src = (char*)(e_route->src);
   char *dst = (char*)(e_route->dst);
@@ -60,7 +65,7 @@ void generic_parse_bypassroute(AS_t rc, sg_platf_route_cbarg_t e_route)
     XBT_DEBUG("Load bypassASroute from \"%s\" to \"%s\"", src, dst);
   else
     XBT_DEBUG("Load bypassRoute from \"%s\" to \"%s\"", src, dst);
-  xbt_dict_t dict_bypassRoutes = rc->bypassRoutes;
+  xbt_dict_t dict_bypassRoutes = p_bypassRoutes;
   char *route_name;
 
   route_name = bprintf("%s#%s", src, dst);
@@ -69,13 +74,13 @@ void generic_parse_bypassroute(AS_t rc, sg_platf_route_cbarg_t e_route)
       src, dst);
   xbt_assert(!xbt_dict_get_or_null(dict_bypassRoutes, route_name),
       "The bypass route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exists",
-      src, e_route->gw_src->name, dst, e_route->gw_dst->name);
+      src, e_route->gw_src->getName(), dst, e_route->gw_dst->getName());
 
   sg_platf_route_cbarg_t new_e_route = NULL;
   if(e_route->gw_dst)
-    new_e_route =  generic_new_extended_route(SURF_ROUTING_RECURSIVE, e_route, 1);
+    new_e_route =  newExtendedRoute(SURF_ROUTING_RECURSIVE, e_route, 1);
   else
-    new_e_route =  generic_new_extended_route(SURF_ROUTING_BASE, e_route, 1);
+    new_e_route =  newExtendedRoute(SURF_ROUTING_BASE, e_route, 1);
 
   xbt_dynar_free(&(e_route->link_list));
 
@@ -87,7 +92,7 @@ void generic_parse_bypassroute(AS_t rc, sg_platf_route_cbarg_t e_route)
 /* ************************************************************************** */
 /* *********************** GENERIC BUSINESS METHODS ************************* */
 
-xbt_dynar_t generic_get_onelink_routes(AS_t rc) { // FIXME: kill that stub
+xbt_dynar_t AsGeneric::getOneLinkRoutes() { // FIXME: kill that stub
   xbt_die("\"generic_get_onelink_routes\" not implemented yet");
   return NULL;
 }
@@ -102,7 +107,7 @@ static const char *instr_node_name(xbt_node_t node)
 xbt_node_t new_xbt_graph_node(xbt_graph_t graph, const char *name,
                               xbt_dict_t nodes)
 {
-  xbt_node_t ret = xbt_dict_get_or_null(nodes, name);
+  xbt_node_t ret = (xbt_node_t) xbt_dict_get_or_null(nodes, name);
   if (ret)
     return ret;
 
@@ -123,10 +128,10 @@ xbt_edge_t new_xbt_graph_edge(xbt_graph_t graph, xbt_node_t s, xbt_node_t d,
 
 
   snprintf(name, len, "%s%s", sn, dn);
-  ret = xbt_dict_get_or_null(edges, name);
+  ret = (xbt_edge_t) xbt_dict_get_or_null(edges, name);
   if (ret == NULL) {
     snprintf(name, len, "%s%s", dn, sn);
-    ret = xbt_dict_get_or_null(edges, name);
+    ret = (xbt_edge_t) xbt_dict_get_or_null(edges, name);
   }
 
   if (ret == NULL) {
@@ -137,28 +142,27 @@ xbt_edge_t new_xbt_graph_edge(xbt_graph_t graph, xbt_node_t s, xbt_node_t d,
   return ret;
 }
 
-void generic_get_graph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges,
-                       AS_t rc)
+void AsGeneric::getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges)
 {
   int src, dst;
-  int table_size = xbt_dynar_length(rc->index_network_elm);
+  int table_size = xbt_dynar_length(p_indexNetworkElm);
 
 
   for (src = 0; src < table_size; src++) {
-    sg_routing_edge_t my_src =
-        xbt_dynar_get_as(rc->index_network_elm, src, sg_routing_edge_t);
+    RoutingEdgePtr my_src =
+        xbt_dynar_get_as(p_indexNetworkElm, src, RoutingEdgePtr);
     for (dst = 0; dst < table_size; dst++) {
       if (src == dst)
         continue;
-      sg_routing_edge_t my_dst =
-          xbt_dynar_get_as(rc->index_network_elm, dst, sg_routing_edge_t);
+      RoutingEdgePtr my_dst =
+          xbt_dynar_get_as(p_indexNetworkElm, dst, RoutingEdgePtr);
 
       sg_platf_route_cbarg_t route = xbt_new0(s_sg_platf_route_cbarg_t, 1);
       route->link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
 
-      rc->get_route_and_latency(rc, my_src, my_dst, route, NULL);
+      getRouteAndLatency(my_src, my_dst, route, NULL);
 
-      XBT_DEBUG ("get_route_and_latency %s -> %s", my_src->name, my_dst->name);
+      XBT_DEBUG ("get_route_and_latency %s -> %s", my_src->getName(), my_dst->getName());
 
       unsigned int cpt;
       void *link;
@@ -167,15 +171,15 @@ void generic_get_graph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges,
       const char *previous_name, *current_name;
 
       if (route->gw_src) {
-        previous = new_xbt_graph_node(graph, route->gw_src->name, nodes);
-        previous_name = route->gw_src->name;
+        previous = new_xbt_graph_node(graph, route->gw_src->getName(), nodes);
+        previous_name = route->gw_src->getName();
       } else {
-        previous = new_xbt_graph_node(graph, my_src->name, nodes);
-        previous_name = my_src->name;
+        previous = new_xbt_graph_node(graph, my_src->getName(), nodes);
+        previous_name = my_src->getName();
       }
 
       xbt_dynar_foreach(route->link_list, cpt, link) {
-        char *link_name = ((surf_resource_t) link)->name;
+        const char *link_name = ((ResourcePtr) link)->getName();
         current = new_xbt_graph_node(graph, link_name, nodes);
         current_name = link_name;
         new_xbt_graph_edge(graph, previous, current, edges);
@@ -185,11 +189,11 @@ void generic_get_graph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges,
       }
 
       if (route->gw_dst) {
-        current = new_xbt_graph_node(graph, route->gw_dst->name, nodes);
-        current_name = route->gw_dst->name;
+        current = new_xbt_graph_node(graph, route->gw_dst->getName(), nodes);
+        current_name = route->gw_dst->getName();
       } else {
-        current = new_xbt_graph_node(graph, my_dst->name, nodes);
-        current_name = my_dst->name;
+        current = new_xbt_graph_node(graph, my_dst->getName(), nodes);
+        current_name = my_dst->getName();
       }
       new_xbt_graph_edge(graph, previous, current, edges);
       XBT_DEBUG ("  %s -> %s", previous_name, current_name);
@@ -200,67 +204,67 @@ void generic_get_graph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges,
   }
 }
 
-sg_platf_route_cbarg_t generic_get_bypassroute(AS_t rc, sg_routing_edge_t src,
-                                               sg_routing_edge_t dst,
+sg_platf_route_cbarg_t AsGeneric::getBypassRoute(RoutingEdgePtr src,
+                                               RoutingEdgePtr dst,
                                                double *lat)
 {
   // If never set a bypass route return NULL without any further computations
-  XBT_DEBUG("generic_get_bypassroute from %s to %s", src->name, dst->name);
+  XBT_DEBUG("generic_get_bypassroute from %s to %s", src->getName(), dst->getName());
   if (no_bypassroute_declared)
     return NULL;
 
   sg_platf_route_cbarg_t e_route_bypass = NULL;
-  xbt_dict_t dict_bypassRoutes = rc->bypassRoutes;
+  xbt_dict_t dict_bypassRoutes = p_bypassRoutes;
 
-  if(dst->rc_component == rc && src->rc_component == rc ){
-    char *route_name = bprintf("%s#%s", src->name, dst->name);
-    e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name);
+  if(dst->getRcComponent() == this && src->getRcComponent() == this ){
+    char *route_name = bprintf("%s#%s", src->getName(), dst->getName());
+    e_route_bypass = (sg_platf_route_cbarg_t) xbt_dict_get_or_null(dict_bypassRoutes, route_name);
     if(e_route_bypass)
       XBT_DEBUG("Find bypass route with %ld links",xbt_dynar_length(e_route_bypass->link_list));
     free(route_name);
   }
   else{
-    AS_t src_as, dst_as;
+    AsPtr src_as, dst_as;
     int index_src, index_dst;
     xbt_dynar_t path_src = NULL;
     xbt_dynar_t path_dst = NULL;
-    AS_t current = NULL;
-    AS_t *current_src = NULL;
-    AS_t *current_dst = NULL;
+    AsPtr current = NULL;
+    AsPtr *current_src = NULL;
+    AsPtr *current_dst = NULL;
 
     if (src == NULL || dst == NULL)
       xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"",
-          src->name, dst->name, rc->name);
+          src->getName(), dst->getName(), p_name);
 
-    src_as = src->rc_component;
-    dst_as = dst->rc_component;
+    src_as = src->getRcComponent();
+    dst_as = dst->getRcComponent();
 
     /* (2) find the path to the root routing component */
-    path_src = xbt_dynar_new(sizeof(AS_t), NULL);
+    path_src = xbt_dynar_new(sizeof(AsPtr), NULL);
     current = src_as;
     while (current != NULL) {
       xbt_dynar_push(path_src, &current);
-      current = current->routing_father;
+      current = current->p_routingFather;
     }
-    path_dst = xbt_dynar_new(sizeof(AS_t), NULL);
+    path_dst = xbt_dynar_new(sizeof(AsPtr), NULL);
     current = dst_as;
     while (current != NULL) {
       xbt_dynar_push(path_dst, &current);
-      current = current->routing_father;
+      current = current->p_routingFather;
     }
 
     /* (3) find the common father */
     index_src = path_src->used - 1;
     index_dst = path_dst->used - 1;
-    current_src = xbt_dynar_get_ptr(path_src, index_src);
-    current_dst = xbt_dynar_get_ptr(path_dst, index_dst);
+    current_src = (AsPtr *) xbt_dynar_get_ptr(path_src, index_src);
+    current_dst = (AsPtr *) xbt_dynar_get_ptr(path_dst, index_dst);
     while (index_src >= 0 && index_dst >= 0 && *current_src == *current_dst) {
       xbt_dynar_pop_ptr(path_src);
       xbt_dynar_pop_ptr(path_dst);
       index_src--;
       index_dst--;
-      current_src = xbt_dynar_get_ptr(path_src, index_src);
-      current_dst = xbt_dynar_get_ptr(path_dst, index_dst);
+      current_src = (AsPtr *) xbt_dynar_get_ptr(path_src, index_src);
+      current_dst = (AsPtr *) xbt_dynar_get_ptr(path_dst, index_dst);
     }
 
     int max_index_src = path_src->used - 1;
@@ -273,22 +277,22 @@ sg_platf_route_cbarg_t generic_get_bypassroute(AS_t rc, sg_routing_edge_t src,
       for (i = 0; i < max; i++) {
         if (i <= max_index_src && max <= max_index_dst) {
           char *route_name = bprintf("%s#%s",
-              (*(AS_t *)
-                  (xbt_dynar_get_ptr(path_src, i)))->name,
-                  (*(AS_t *)
-                      (xbt_dynar_get_ptr(path_dst, max)))->name);
-          e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name);
+              (*(AsPtr *)
+                  (xbt_dynar_get_ptr(path_src, i)))->p_name,
+                  (*(AsPtr *)
+                      (xbt_dynar_get_ptr(path_dst, max)))->p_name);
+          e_route_bypass = (sg_platf_route_cbarg_t) xbt_dict_get_or_null(dict_bypassRoutes, route_name);
           xbt_free(route_name);
         }
         if (e_route_bypass)
           break;
         if (max <= max_index_src && i <= max_index_dst) {
           char *route_name = bprintf("%s#%s",
-              (*(AS_t *)
-                  (xbt_dynar_get_ptr(path_src, max)))->name,
-                  (*(AS_t *)
-                      (xbt_dynar_get_ptr(path_dst, i)))->name);
-          e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name);
+              (*(AsPtr *)
+                  (xbt_dynar_get_ptr(path_src, max)))->p_name,
+                  (*(AsPtr *)
+                      (xbt_dynar_get_ptr(path_dst, i)))->p_name);
+          e_route_bypass = (sg_platf_route_cbarg_t) xbt_dict_get_or_null(dict_bypassRoutes, route_name);
           xbt_free(route_name);
         }
         if (e_route_bypass)
@@ -300,11 +304,11 @@ sg_platf_route_cbarg_t generic_get_bypassroute(AS_t rc, sg_routing_edge_t src,
 
       if (max <= max_index_src && max <= max_index_dst) {
         char *route_name = bprintf("%s#%s",
-            (*(AS_t *)
-                (xbt_dynar_get_ptr(path_src, max)))->name,
-                (*(AS_t *)
-                    (xbt_dynar_get_ptr(path_dst, max)))->name);
-        e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name);
+            (*(AsPtr *)
+                (xbt_dynar_get_ptr(path_src, max)))->p_name,
+                (*(AsPtr *)
+                    (xbt_dynar_get_ptr(path_dst, max)))->p_name);
+        e_route_bypass = (sg_platf_route_cbarg_t) xbt_dict_get_or_null(dict_bypassRoutes, route_name);
         xbt_free(route_name);
       }
       if (e_route_bypass)
@@ -317,7 +321,7 @@ sg_platf_route_cbarg_t generic_get_bypassroute(AS_t rc, sg_routing_edge_t src,
 
   sg_platf_route_cbarg_t new_e_route = NULL;
   if (e_route_bypass) {
-    void *link;
+    NetworkLinkPtr link;
     unsigned int cpt = 0;
     new_e_route = xbt_new0(s_sg_platf_route_cbarg_t, 1);
     new_e_route->gw_src = e_route_bypass->gw_src;
@@ -327,7 +331,7 @@ sg_platf_route_cbarg_t generic_get_bypassroute(AS_t rc, sg_routing_edge_t src,
     xbt_dynar_foreach(e_route_bypass->link_list, cpt, link) {
       xbt_dynar_push(new_e_route->link_list, &link);
       if (lat)
-        *lat += surf_network_model->extension.network.get_link_latency(link);
+        *lat += link->getLatency();
     }
   }
 
@@ -337,9 +341,8 @@ sg_platf_route_cbarg_t generic_get_bypassroute(AS_t rc, sg_routing_edge_t src,
 /* ************************************************************************** */
 /* ************************* GENERIC AUX FUNCTIONS ************************** */
 /* change a route containing link names into a route containing link entities */
-sg_platf_route_cbarg_t
-generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy,
-    sg_platf_route_cbarg_t routearg, int change_order) {
+sg_platf_route_cbarg_t AsGeneric::newExtendedRoute(e_surf_routing_hierarchy_t hierarchy,
+      sg_platf_route_cbarg_t routearg, int change_order) {
 
   sg_platf_route_cbarg_t result;
   char *link_name;
@@ -377,24 +380,17 @@ generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy,
   return result;
 }
 
-void generic_free_route(sg_platf_route_cbarg_t route)
-{
-  if (route) {
-    xbt_dynar_free(&route->link_list);
-    xbt_free(route);
-  }
-}
 
-static AS_t generic_as_exist(AS_t find_from,
-    AS_t to_find)
+
+AsPtr AsGeneric::asExist(AsPtr to_find)
 {
   //return to_find; // FIXME: BYPASSERROR OF FOREACH WITH BREAK
   xbt_dict_cursor_t cursor = NULL;
   char *key;
   int found = 0;
-  AS_t elem;
-  xbt_dict_foreach(find_from->routing_sons, cursor, key, elem) {
-    if (to_find == elem || generic_as_exist(elem, to_find)) {
+  AsGenericPtr elem;
+  xbt_dict_foreach(p_routingSons, cursor, key, elem) {
+    if (to_find == elem || elem->asExist(to_find)) {
       found = 1;
       break;
     }
@@ -404,24 +400,23 @@ static AS_t generic_as_exist(AS_t find_from,
   return NULL;
 }
 
-AS_t
-generic_autonomous_system_exist(AS_t rc, char *element)
+AsPtr AsGeneric::autonomousSystemExist(char *element)
 {
   //return rc; // FIXME: BYPASSERROR OF FOREACH WITH BREAK
-  AS_t element_as, result, elem;
+  AsPtr element_as, result, elem;
   xbt_dict_cursor_t cursor = NULL;
   char *key;
-  element_as = ((sg_routing_edge_t)
+  element_as = ((RoutingEdgePtr)
       xbt_lib_get_or_null(as_router_lib, element,
-          ROUTING_ASR_LEVEL))->rc_component;
-  result = ((AS_t) - 1);
-  if (element_as != rc)
-    result = generic_as_exist(rc, element_as);
+          ROUTING_ASR_LEVEL))->getRcComponent();
+  result = ((AsPtr) - 1);
+  if (element_as != this)
+    result = asExist(element_as);
 
   int found = 0;
   if (result) {
-    xbt_dict_foreach(element_as->routing_sons, cursor, key, elem) {
-      found = !strcmp(elem->name, element);
+    xbt_dict_foreach(element_as->p_routingSons, cursor, key, elem) {
+      found = !strcmp(elem->p_name, element);
       if (found)
         break;
     }
@@ -431,47 +426,45 @@ generic_autonomous_system_exist(AS_t rc, char *element)
   return NULL;
 }
 
-AS_t
-generic_processing_units_exist(AS_t rc, char *element)
+AsPtr AsGeneric::processingUnitsExist(char *element)
 {
-  AS_t element_as;
-  element_as = ((sg_routing_edge_t)
+  AsPtr element_as;
+  element_as = ((RoutingEdgePtr)
       xbt_lib_get_or_null(host_lib,
-          element, ROUTING_HOST_LEVEL))->rc_component;
-  if (element_as == rc)
+          element, ROUTING_HOST_LEVEL))->getRcComponent();
+  if (element_as == this)
     return element_as;
-  return generic_as_exist(rc, element_as);
+  return asExist(element_as);
 }
 
-void generic_src_dst_check(AS_t rc, sg_routing_edge_t src,
-    sg_routing_edge_t dst)
+void AsGeneric::srcDstCheck(RoutingEdgePtr src, RoutingEdgePtr dst)
 {
 
-  sg_routing_edge_t src_data = src;
-  sg_routing_edge_t dst_data = dst;
+  RoutingEdgePtr src_data = src;
+  RoutingEdgePtr dst_data = dst;
 
   if (src_data == NULL || dst_data == NULL)
     xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"",
-        src->name,
-        dst->name,
-        rc->name);
+        src->getName(),
+        dst->getName(),
+        p_name);
 
-  AS_t src_as =
-      (src_data)->rc_component;
-  AS_t dst_as =
-      (dst_data)->rc_component;
+  AsPtr src_as =
+      (src_data)->getRcComponent();
+  AsPtr dst_as =
+      (dst_data)->getRcComponent();
 
   if (src_as != dst_as)
     xbt_die("The src(%s in %s) and dst(%s in %s) are in differents AS",
-        src->name, src_as->name,
-        dst->name, dst_as->name);
+        src->getName(), src_as->p_name,
+        dst->getName(), dst_as->p_name);
 
-  if (rc != dst_as)
+  if (this != dst_as)
     xbt_die
     ("The routing component of src'%s' and dst'%s' is not the same as the network elements belong (%s?=%s?=%s)",
-        src->name,
-        dst->name,
-        src_as->name,
-        dst_as->name,
-        rc->name);
+        src->getName(),
+        dst->getName(),
+        src_as->p_name,
+        dst_as->p_name,
+        p_name);
 }
diff --git a/src/surf/surf_routing_generic.hpp b/src/surf/surf_routing_generic.hpp
new file mode 100644 (file)
index 0000000..53928b1
--- /dev/null
@@ -0,0 +1,44 @@
+/* Copyright (c) 2013-2014. 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 "surf_routing_none.hpp"
+
+#ifndef SURF_ROUTING_GENERIC_HPP_
+#define SURF_ROUTING_GENERIC_HPP_
+
+class AsGeneric;
+typedef AsGeneric *AsGenericPtr;
+
+void generic_free_route(sg_platf_route_cbarg_t route);
+
+class AsGeneric : public AsNone {
+public:
+  AsGeneric();
+  ~AsGeneric();
+
+  virtual void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t into, double *latency);
+  virtual xbt_dynar_t getOneLinkRoutes();
+  virtual void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges);
+  virtual sg_platf_route_cbarg_t getBypassRoute(RoutingEdgePtr src, RoutingEdgePtr dst, double *lat);
+
+  /* The parser calls the following functions to inform the routing models
+   * that a new element is added to the AS currently built.
+   *
+   * Of course, only the routing model of this AS is informed, not every ones */
+  virtual int parsePU(RoutingEdgePtr elm); /* A host or a router, whatever */
+  virtual int parseAS( RoutingEdgePtr elm);
+  virtual void parseRoute(sg_platf_route_cbarg_t route);
+  virtual void parseASroute(sg_platf_route_cbarg_t route);
+  virtual void parseBypassroute(sg_platf_route_cbarg_t e_route);
+
+  virtual sg_platf_route_cbarg_t newExtendedRoute(e_surf_routing_hierarchy_t hierarchy, sg_platf_route_cbarg_t routearg, int change_order);
+  virtual AsPtr asExist(AsPtr to_find);
+  virtual AsPtr autonomousSystemExist(char *element);
+  virtual AsPtr processingUnitsExist(char *element);
+  virtual void srcDstCheck(RoutingEdgePtr src, RoutingEdgePtr dst);
+};
+
+#endif /* SURF_ROUTING_GENERIC_HPP_ */
diff --git a/src/surf/surf_routing_none.c b/src/surf/surf_routing_none.c
deleted file mode 100644 (file)
index 1887c32..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Copyright (c) 2009-2013. 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 "surf_routing_private.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_none, surf, "Routing part of surf");
-
-static xbt_dynar_t none_get_onelink_routes(AS_t rc) {
-  return NULL;
-}
-
-static void none_get_route_and_latency(AS_t rc, sg_routing_edge_t src, sg_routing_edge_t dst,
-    sg_platf_route_cbarg_t res,double *lat)
-{
-  *lat = 0.0;
-}
-
-static void none_get_graph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges, AS_t rc)
-{
-       XBT_INFO("No routing no graph");
-}
-
-static sg_platf_route_cbarg_t none_get_bypass_route(AS_t rc,
-    sg_routing_edge_t src,
-    sg_routing_edge_t dst, double *lat) {
-  return NULL;
-}
-
-static int none_parse_PU(AS_t rc, sg_routing_edge_t elm) {
-  XBT_DEBUG("Load process unit \"%s\"", elm->name);
-  xbt_dynar_push_as(rc->index_network_elm,sg_routing_edge_t,elm);
-  /* don't care about PUs */
-  return -1;
-}
-
-static int none_parse_AS(AS_t rc, sg_routing_edge_t elm) {
-  XBT_DEBUG("Load Autonomous system \"%s\"", elm->name);
-  xbt_dynar_push_as(rc->index_network_elm,sg_routing_edge_t,elm);
-  /* even don't care about sub-ASes -- I'm as nihilist as an old punk*/
-  return -1;
-}
-
-/* Creation routing model functions */
-AS_t model_none_create() {
-  return model_none_create_sized(sizeof(s_as_t));
-}
-AS_t model_none_create_sized(size_t childsize) {
-  AS_t new_component = xbt_malloc0(childsize);
-  new_component->parse_PU = none_parse_PU;
-  new_component->parse_AS = none_parse_AS;
-  new_component->parse_route = NULL;
-  new_component->parse_ASroute = NULL;
-  new_component->parse_bypassroute = NULL;
-  new_component->get_route_and_latency = none_get_route_and_latency;
-  new_component->get_onelink_routes = none_get_onelink_routes;
-  new_component->get_bypass_route = none_get_bypass_route;
-  new_component->finalize = model_none_finalize;
-  new_component->get_graph = none_get_graph;
-  new_component->routing_sons = xbt_dict_new_homogeneous(NULL);
-  new_component->index_network_elm = xbt_dynar_new(sizeof(char*),NULL);
-
-  return new_component;
-}
-
-void model_none_finalize(AS_t as) {
-  xbt_dict_free(&as->routing_sons);
-  xbt_dynar_free(&as->index_network_elm);
-  xbt_dynar_free(&as->link_up_down_list);
-  xbt_free(as);
-}
-
diff --git a/src/surf/surf_routing_none.cpp b/src/surf/surf_routing_none.cpp
new file mode 100644 (file)
index 0000000..1ea0e4a
--- /dev/null
@@ -0,0 +1,72 @@
+/* Copyright (c) 2009-2011, 2013-2014. 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 "surf_routing_none.hpp"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_none, surf, "Routing part of surf");
+
+AS_t model_none_create(void)
+{
+  return new AsNone();
+}
+
+xbt_dynar_t AsNone::getOneLinkRoutes() {
+  return NULL;
+}
+
+void AsNone::getRouteAndLatency(RoutingEdgePtr /*src*/, RoutingEdgePtr /*dst*/,
+                                sg_platf_route_cbarg_t /*res*/, double *lat)
+{
+  *lat = 0.0;
+}
+
+void AsNone::getGraph(xbt_graph_t /*graph*/, xbt_dict_t /*nodes*/, xbt_dict_t /*edges*/)
+{
+       XBT_INFO("No routing no graph");
+}
+
+sg_platf_route_cbarg_t AsNone::getBypassRoute(RoutingEdgePtr /*src*/, RoutingEdgePtr /*dst*/, double */*lat*/) {
+  return NULL;
+}
+
+int AsNone::parsePU(RoutingEdgePtr elm) {
+  XBT_DEBUG("Load process unit \"%s\"", elm->getName());
+  xbt_dynar_push_as(p_indexNetworkElm, RoutingEdgePtr, elm);
+  /* don't care about PUs */
+  return -1;
+}
+
+int AsNone::parseAS(RoutingEdgePtr elm) {
+  XBT_DEBUG("Load Autonomous system \"%s\"", elm->getName());
+  xbt_dynar_push_as(p_indexNetworkElm, RoutingEdgePtr, elm);
+  /* even don't care about sub-ASes -- I'm as nihilist as an old punk*/
+  return -1;
+}
+
+void AsNone::parseRoute(sg_platf_route_cbarg_t /*route*/){
+  THROW_IMPOSSIBLE;
+}
+
+void AsNone::parseASroute(sg_platf_route_cbarg_t /*route*/){
+  THROW_IMPOSSIBLE;
+}
+void AsNone::parseBypassroute(sg_platf_route_cbarg_t /*e_route*/){
+  THROW_IMPOSSIBLE;
+}
+
+/* Creation routing model functions */
+AsNone::AsNone() {
+  p_routingSons = xbt_dict_new_homogeneous(NULL);
+  p_indexNetworkElm = xbt_dynar_new(sizeof(char*),NULL);
+  p_linkUpDownList = NULL;
+}
+
+AsNone::~AsNone() {
+  xbt_dict_free(&p_routingSons);
+  xbt_dynar_free(&p_indexNetworkElm);
+  xbt_dynar_free(&p_linkUpDownList);
+}
+
diff --git a/src/surf/surf_routing_none.hpp b/src/surf/surf_routing_none.hpp
new file mode 100644 (file)
index 0000000..042161e
--- /dev/null
@@ -0,0 +1,34 @@
+/* Copyright (c) 2013-2014. 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 "surf_routing.hpp"
+
+#ifndef SURF_ROUTING_NONE_HPP_
+#define SURF_ROUTING_NONE_HPP_
+
+class AsNone : public As {
+public:
+  AsNone();
+  ~AsNone();
+
+  void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t into, double *latency);
+  xbt_dynar_t getOneLinkRoutes();
+  void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges);
+  sg_platf_route_cbarg_t getBypassRoute(RoutingEdgePtr src, RoutingEdgePtr dst, double *lat);
+
+  /* The parser calls the following functions to inform the routing models
+   * that a new element is added to the AS currently built.
+   *
+   * Of course, only the routing model of this AS is informed, not every ones */
+  int parsePU(RoutingEdgePtr elm); /* A host or a router, whatever */
+  int parseAS( RoutingEdgePtr elm);
+  void parseRoute(sg_platf_route_cbarg_t route);
+  void parseASroute(sg_platf_route_cbarg_t route);
+  void parseBypassroute(sg_platf_route_cbarg_t e_route);
+};
+
+
+#endif /* SURF_ROUTING_NONE_HPP_ */
similarity index 94%
rename from src/surf/surf_routing_private.h
rename to src/surf/surf_routing_private.hpp
index 6c2e754..fa365c1 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -10,7 +10,7 @@
 #include <float.h>
 #include "internal_config.h"
 
-#include "surf_private.h"
+#include "surf_interface.hpp"
 #include "xbt/dynar.h"
 #include "xbt/str.h"
 #include "xbt/config.h"
@@ -65,14 +65,10 @@ void model_floyd_parse_route(AS_t rc, sg_platf_route_cbarg_t route);
 
 /* ************************************************** */
 /* **************  Cluster ROUTING   **************** */
-typedef struct {
-  s_as_t generic_routing;
-  void *backbone;
-  void *loopback;
-  sg_routing_edge_t router;
-} s_as_cluster_t, *as_cluster_t;
-
-AS_t model_cluster_create(void);      /* create structures for cluster routing model */
+
+AsPtr model_cluster_create(void);      /* create structures for cluster routing model */
+AsPtr model_torus_cluster_create(void);      /* create structures for cluster routing model */
+
 
 /* ************************************************** */
 /* **************  Vivaldi ROUTING   **************** */
diff --git a/src/surf/surf_routing_vivaldi.c b/src/surf/surf_routing_vivaldi.c
deleted file mode 100644 (file)
index 2a925fc..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/* Copyright (c) 2009-2013. 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 "surf_routing_private.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_vivaldi, surf, "Routing part of surf");
-
-static XBT_INLINE double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst) {
-  double src_coord, dst_coord;
-
-  src_coord = xbt_dynar_get_as(src, index, double);
-  dst_coord = xbt_dynar_get_as(dst, index, double);
-
-  return (src_coord-dst_coord)*(src_coord-dst_coord);
-}
-
-static void vivaldi_get_route_and_latency(
-    AS_t rc, sg_routing_edge_t src_p, sg_routing_edge_t dst_p,
-    sg_platf_route_cbarg_t route, double *lat)
-{
-  s_surf_parsing_link_up_down_t info;
-
-  XBT_DEBUG("vivaldi_get_route_and_latency from '%s'[%d] '%s'[%d]",src_p->name,src_p->id,dst_p->name,dst_p->id);
-  char *src = (char*)src_p->name;
-  char *dst = (char*)dst_p->name;
-
-  if(src_p->rc_type == SURF_NETWORK_ELEMENT_AS) {
-    char *rp_src = ROUTER_PEER(src);
-    char *rp_dst = ROUTER_PEER(dst);
-    route->gw_src = xbt_lib_get_or_null(as_router_lib, rp_src,
-                                        ROUTING_ASR_LEVEL);
-    route->gw_dst = xbt_lib_get_or_null(as_router_lib, rp_dst,
-                                        ROUTING_ASR_LEVEL);
-    xbt_free(rp_src);
-    xbt_free(rp_dst);
-  }
-
-  double euclidean_dist;
-  xbt_dynar_t src_ctn, dst_ctn;
-  char *tmp_src_name, *tmp_dst_name;
-
-  if(src_p->rc_type == SURF_NETWORK_ELEMENT_HOST){
-    tmp_src_name = HOST_PEER(src);
-
-    if(rc->link_up_down_list){
-      info = xbt_dynar_get_as(rc->link_up_down_list,src_p->id,s_surf_parsing_link_up_down_t);
-      if(info.link_up) { // link up
-        xbt_dynar_push_as(route->link_list,void*,info.link_up);
-        if (lat)
-          *lat += surf_network_model->extension.network.get_link_latency(info.link_up);
-      }
-    }
-    src_ctn = xbt_lib_get_or_null(host_lib, tmp_src_name, COORD_HOST_LEVEL);
-    if(!src_ctn ) src_ctn = xbt_lib_get_or_null(host_lib, src, COORD_HOST_LEVEL);
-  }
-  else if(src_p->rc_type == SURF_NETWORK_ELEMENT_ROUTER || src_p->rc_type == SURF_NETWORK_ELEMENT_AS){
-    tmp_src_name = ROUTER_PEER(src);
-    src_ctn = xbt_lib_get_or_null(as_router_lib, tmp_src_name, COORD_ASR_LEVEL);
-  }
-  else{
-    THROW_IMPOSSIBLE;
-  }
-
-  if(dst_p->rc_type == SURF_NETWORK_ELEMENT_HOST){
-    tmp_dst_name = HOST_PEER(dst);
-
-    if(rc->link_up_down_list){
-      info = xbt_dynar_get_as(rc->link_up_down_list,dst_p->id,s_surf_parsing_link_up_down_t);
-      if(info.link_down) { // link down
-        xbt_dynar_push_as(route->link_list,void*,info.link_down);
-        if (lat)
-          *lat += surf_network_model->extension.network.get_link_latency(info.link_down);
-      }
-    }
-    dst_ctn = xbt_lib_get_or_null(host_lib, tmp_dst_name, COORD_HOST_LEVEL);
-    if(!dst_ctn ) dst_ctn = xbt_lib_get_or_null(host_lib, dst, COORD_HOST_LEVEL);
-  }
-  else if(dst_p->rc_type == SURF_NETWORK_ELEMENT_ROUTER || dst_p->rc_type == SURF_NETWORK_ELEMENT_AS){
-    tmp_dst_name = ROUTER_PEER(dst);
-    dst_ctn = xbt_lib_get_or_null(as_router_lib, tmp_dst_name, COORD_ASR_LEVEL);
-  }
-  else{
-    THROW_IMPOSSIBLE;
-  }
-
-  xbt_assert(src_ctn,"No coordinate found for element '%s'",tmp_src_name);
-  xbt_assert(dst_ctn,"No coordinate found for element '%s'",tmp_dst_name);
-  free(tmp_src_name);
-  free(tmp_dst_name);
-
-  euclidean_dist = sqrt (euclidean_dist_comp(0,src_ctn,dst_ctn)+euclidean_dist_comp(1,src_ctn,dst_ctn))
-                      + fabs(xbt_dynar_get_as(src_ctn, 2, double))+fabs(xbt_dynar_get_as(dst_ctn, 2, double));
-
-  if (lat){
-    XBT_DEBUG("Updating latency %f += %f",*lat,euclidean_dist);
-    *lat += euclidean_dist / 1000.0; //From .ms to .s
-  }
-}
-
-static int vivaldi_parse_PU(AS_t rc, sg_routing_edge_t elm) {
-  XBT_DEBUG("Load process unit \"%s\"", elm->name);
-  xbt_dynar_push_as(rc->index_network_elm,sg_routing_edge_t,elm);
-  return xbt_dynar_length(rc->index_network_elm)-1;
-}
-
-/* Creation routing model functions */
-AS_t model_vivaldi_create(void)
-{
-  AS_t new_component = model_generic_create_sized(sizeof *new_component);
-  
-  new_component->get_route_and_latency = vivaldi_get_route_and_latency;
-  new_component->parse_PU = vivaldi_parse_PU;
-  new_component->get_graph = generic_get_graph;
-  return new_component;
-}
diff --git a/src/surf/surf_routing_vivaldi.cpp b/src/surf/surf_routing_vivaldi.cpp
new file mode 100644 (file)
index 0000000..efabf71
--- /dev/null
@@ -0,0 +1,108 @@
+/* Copyright (c) 2013-2014. 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 "surf_routing_vivaldi.hpp"
+#include "network_interface.hpp"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_vivaldi, surf, "Routing part of surf");
+
+static XBT_INLINE double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst) {
+  double src_coord, dst_coord;
+
+  src_coord = xbt_dynar_get_as(src, index, double);
+  dst_coord = xbt_dynar_get_as(dst, index, double);
+
+  return (src_coord-dst_coord)*(src_coord-dst_coord);
+}
+
+AS_t model_vivaldi_create(void)
+{
+  return new AsVivaldi();
+}
+
+void AsVivaldi::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t route, double *lat)
+{
+  s_surf_parsing_link_up_down_t info;
+
+  XBT_DEBUG("vivaldi_get_route_and_latency from '%s'[%d] '%s'[%d]",
+                 src->getName(), src->getId(), dst->getName(), dst->getId());
+
+  if(src->getRcType() == SURF_NETWORK_ELEMENT_AS) {
+    char *src_name = ROUTER_PEER(src->getName());
+    char *dst_name = ROUTER_PEER(dst->getName());
+    route->gw_src = (sg_routing_edge_t) xbt_lib_get_or_null(as_router_lib, src_name, ROUTING_ASR_LEVEL);
+    route->gw_dst = (sg_routing_edge_t) xbt_lib_get_or_null(as_router_lib, dst_name, ROUTING_ASR_LEVEL);
+    xbt_free(src_name);
+    xbt_free(dst_name);
+  }
+
+  double euclidean_dist;
+  xbt_dynar_t src_ctn, dst_ctn;
+  char *tmp_src_name, *tmp_dst_name;
+
+  if(src->getRcType() == SURF_NETWORK_ELEMENT_HOST){
+    tmp_src_name = HOST_PEER(src->getName());
+
+    if(p_linkUpDownList){
+      info = xbt_dynar_get_as(p_linkUpDownList, src->getId(), s_surf_parsing_link_up_down_t);
+      if(info.link_up) { // link up
+        xbt_dynar_push_as(route->link_list, void*, info.link_up);
+        if (lat)
+          *lat += static_cast<NetworkLinkPtr>(info.link_up)->getLatency();
+      }
+    }
+    src_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, tmp_src_name, COORD_HOST_LEVEL);
+    if(!src_ctn ) src_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, src->getName(), COORD_HOST_LEVEL);
+  }
+  else if(src->getRcType() == SURF_NETWORK_ELEMENT_ROUTER || src->getRcType() == SURF_NETWORK_ELEMENT_AS){
+    tmp_src_name = ROUTER_PEER(src->getName());
+    src_ctn = (xbt_dynar_t) xbt_lib_get_or_null(as_router_lib, tmp_src_name, COORD_ASR_LEVEL);
+  }
+  else{
+    THROW_IMPOSSIBLE;
+  }
+
+  if(dst->getRcType() == SURF_NETWORK_ELEMENT_HOST){
+    tmp_dst_name = HOST_PEER(dst->getName());
+
+    if(p_linkUpDownList){
+      info = xbt_dynar_get_as(p_linkUpDownList, dst->getId(), s_surf_parsing_link_up_down_t);
+      if(info.link_down) { // link down
+        xbt_dynar_push_as(route->link_list,void*,info.link_down);
+        if (lat)
+          *lat += static_cast<NetworkLinkPtr>(info.link_down)->getLatency();
+      }
+    }
+    dst_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, tmp_dst_name, COORD_HOST_LEVEL);
+    if(!dst_ctn ) dst_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, dst->getName(), COORD_HOST_LEVEL);
+  }
+  else if(dst->getRcType() == SURF_NETWORK_ELEMENT_ROUTER || dst->getRcType() == SURF_NETWORK_ELEMENT_AS){
+    tmp_dst_name = ROUTER_PEER(dst->getName());
+    dst_ctn = (xbt_dynar_t) xbt_lib_get_or_null(as_router_lib, tmp_dst_name, COORD_ASR_LEVEL);
+  }
+  else{
+    THROW_IMPOSSIBLE;
+  }
+
+  xbt_assert(src_ctn,"No coordinate found for element '%s'",tmp_src_name);
+  xbt_assert(dst_ctn,"No coordinate found for element '%s'",tmp_dst_name);
+  free(tmp_src_name);
+  free(tmp_dst_name);
+
+  euclidean_dist = sqrt (euclidean_dist_comp(0,src_ctn,dst_ctn)+euclidean_dist_comp(1,src_ctn,dst_ctn))
+                      + fabs(xbt_dynar_get_as(src_ctn, 2, double))+fabs(xbt_dynar_get_as(dst_ctn, 2, double));
+
+  if (lat){
+    XBT_DEBUG("Updating latency %f += %f",*lat,euclidean_dist);
+    *lat += euclidean_dist / 1000.0; //From .ms to .s
+  }
+}
+
+int AsVivaldi::parsePU(RoutingEdgePtr elm) {
+  XBT_DEBUG("Load process unit \"%s\"", elm->getName());
+  xbt_dynar_push_as(p_indexNetworkElm, sg_routing_edge_t, elm);
+  return xbt_dynar_length(p_indexNetworkElm)-1;
+}
diff --git a/src/surf/surf_routing_vivaldi.hpp b/src/surf/surf_routing_vivaldi.hpp
new file mode 100644 (file)
index 0000000..ee0ab65
--- /dev/null
@@ -0,0 +1,47 @@
+/* Copyright (c) 2013-2014. 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 "surf_routing_generic.hpp"
+
+#ifndef SURF_ROUTING_VIVALDI_HPP_
+#define SURF_ROUTING_VIVALDI_HPP_
+
+/* ************************************************** */
+/* **************  Vivaldi ROUTING   **************** */
+AS_t model_vivaldi_create(void);      /* create structures for vivaldi routing model */
+#define HOST_PEER(peername) bprintf("peer_%s", peername)
+#define ROUTER_PEER(peername) bprintf("router_%s", peername)
+#define LINK_PEER(peername) bprintf("link_%s", peername)
+
+/***********
+ * Classes *
+ ***********/
+class AsVivaldi;
+typedef AsVivaldi *AsVivaldiPtr;
+
+class AsVivaldi: public AsGeneric {
+public:
+  sg_platf_route_cbarg_t *p_routingTable;
+
+  AsVivaldi() : AsGeneric() {};
+  ~AsVivaldi() {};
+
+  void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t into, double *latency);
+  //void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges);
+  //sg_platf_route_cbarg_t getBypassRoute(RoutingEdgePtr src, RoutingEdgePtr dst, double *lat);
+
+  /* The parser calls the following functions to inform the routing models
+   * that a new element is added to the AS currently built.
+   *
+   * Of course, only the routing model of this AS is informed, not every ones */
+  int parsePU(RoutingEdgePtr elm); /* A host or a router, whatever */
+  //virtual int parseAS( RoutingEdgePtr elm)=0;
+
+  //virtual void parseBypassroute(sg_platf_route_cbarg_t e_route)=0;
+};
+
+
+#endif /* SURF_ROUTING_VIVALDI_HPP_ */
index cae8e45..6c757e5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -14,6 +14,7 @@
 #include "xbt/dict.h"
 #include "surf/surfxml_parse.h"
 #include "surf/surf_private.h"
+#include "surf/random_mgr.h"
 #include "simgrid/sg_config.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_parse, surf,
@@ -202,6 +203,7 @@ double surf_parse_get_power(const char *string)
 
 /* The default current property receiver. Setup in the corresponding opening callbacks. */
 xbt_dict_t current_property_set = NULL;
+xbt_dict_t current_model_property_set = NULL;
 xbt_dict_t as_current_property_set = NULL;
 int AS_TAG = 0;
 char* as_name_tab[1024];
@@ -245,6 +247,7 @@ void STag_surfxml_storage___type(void)
   AS_TAG = 0;
   XBT_DEBUG("STag_surfxml_storage___type");
   xbt_assert(current_property_set == NULL, "Someone forgot to reset the property set to NULL in its closing tag (or XML malformed)");
+  xbt_assert(current_model_property_set == NULL, "Someone forgot to reset the model property set to NULL in its closing tag (or XML malformed)");
 }
 void ETag_surfxml_storage___type(void)
 {
@@ -256,9 +259,11 @@ void ETag_surfxml_storage___type(void)
   storage_type.id = A_surfxml_storage___type_id;
   storage_type.model = A_surfxml_storage___type_model;
   storage_type.properties = current_property_set;
+  storage_type.model_properties = current_model_property_set;
   storage_type.size = surf_parse_get_size(A_surfxml_storage___type_size);
   sg_platf_new_storage_type(&storage_type);
   current_property_set = NULL;
+  current_model_property_set = NULL;
 }
 void STag_surfxml_mstorage(void)
 {
@@ -519,6 +524,20 @@ void ETag_surfxml_cluster(void){
     cluster.loopback_bw = surf_parse_get_bandwidth(A_surfxml_cluster_loopback___bw);
   if(strcmp(A_surfxml_cluster_loopback___lat,""))
     cluster.loopback_lat = surf_parse_get_time(A_surfxml_cluster_loopback___lat);
+
+  switch(AX_surfxml_cluster_topology){
+  case A_surfxml_cluster_topology_FLAT:
+    cluster.topology= SURF_CLUSTER_FLAT ;
+    break;
+  case A_surfxml_cluster_topology_TORUS:
+    cluster.topology= SURF_CLUSTER_TORUS ;
+    break;
+  default:
+    surf_parse_error("Invalid cluster topology for cluster %s",
+                     cluster.id);
+    break;
+  }
+  cluster.topo_parameters = A_surfxml_cluster_topo___parameters;
   cluster.router_id = A_surfxml_cluster_router___id;
 
   switch (AX_surfxml_cluster_sharing___policy) {
@@ -930,6 +949,13 @@ void STag_surfxml_argument(void){
   argv[(argc) - 1] = xbt_strdup(A_surfxml_argument_value);
 }
 
+void STag_surfxml_model___prop(void){
+  if (!current_model_property_set)
+    current_model_property_set = xbt_dict_new_homogeneous(xbt_free_f);
+
+  xbt_dict_set(current_model_property_set, A_surfxml_model___prop_id, xbt_strdup(A_surfxml_model___prop_value), NULL);
+}
+
 /* ***************************************** */
 /* TUTORIAL: New TAG                         */
 void STag_surfxml_gpu(void)
@@ -960,6 +986,7 @@ void ETag_surfxml_peer(void){}
 void STag_surfxml_backbone(void){}
 void ETag_surfxml_link___ctn(void){}
 void ETag_surfxml_argument(void){}
+void ETag_surfxml_model___prop(void){}
 
 /* Open and Close parse file */
 
index 04d93a7..198b745 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2012. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index db28597..8f44eaa 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2005, 2007, 2009-2013. The SimGrid Team.
+/* Copyright (c) 2004-2005, 2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 1911def..820b245 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004, 2007, 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2004, 2007, 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
diff --git a/src/surf/vm_workstation_hl13.cpp b/src/surf/vm_workstation_hl13.cpp
new file mode 100644 (file)
index 0000000..baad9ae
--- /dev/null
@@ -0,0 +1,478 @@
+/* Copyright (c) 2013-2014. 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 "vm_workstation_hl13.hpp"
+#include "cpu_cas01.hpp"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_vm_workstation);
+
+void surf_vm_workstation_model_init_current_default(void){
+  if (surf_cpu_model_vm) {
+    surf_vm_workstation_model = new WorkstationVMHL13Model();
+    ModelPtr model = static_cast<ModelPtr>(surf_vm_workstation_model);
+
+    xbt_dynar_push(model_list, &model);
+    xbt_dynar_push(model_list_invoke, &model);
+  }
+}
+
+/*********
+ * Model *
+ *********/
+
+WorkstationVMHL13Model::WorkstationVMHL13Model() : WorkstationVMModel() {
+  p_cpuModel = surf_cpu_model_vm;
+}
+
+void WorkstationVMHL13Model::updateActionsState(double /*now*/, double /*delta*/){
+  return;
+}
+
+xbt_dynar_t WorkstationVMHL13Model::getRoute(WorkstationPtr src, WorkstationPtr dst){
+  XBT_DEBUG("ws_get_route");
+  return surf_network_model->getRoute(src->p_netElm, dst->p_netElm);
+}
+
+ActionPtr WorkstationVMHL13Model::communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate){
+  return surf_network_model->communicate(src->p_netElm, dst->p_netElm, size, rate);
+}
+
+/* ind means ''indirect'' that this is a reference on the whole dict_elm
+ * structure (i.e not on the surf_resource_private infos) */
+
+void WorkstationVMHL13Model::createResource(const char *name, void *ind_phys_workstation)
+{
+  WorkstationVMHL13Ptr ws = new WorkstationVMHL13(this, name, NULL, static_cast<surf_resource_t>(ind_phys_workstation));
+
+  xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, static_cast<ResourcePtr>(ws));
+
+  /* TODO:
+   * - check how network requests are scheduled between distinct processes competing for the same card.
+   */
+}
+
+static inline double get_solved_value(CpuActionPtr cpu_action)
+{
+  return cpu_action->getVariable()->value;
+}
+
+/* In the real world, processes on the guest operating system will be somewhat
+ * degraded due to virtualization overhead. The total CPU share that these
+ * processes get is smaller than that of the VM process gets on a host
+ * operating system. */
+// const double virt_overhead = 0.95;
+const double virt_overhead = 1;
+
+double WorkstationVMHL13Model::shareResources(double now)
+{
+  /* TODO: udpate action's cost with the total cost of processes on the VM. */
+
+
+  /* 0. Make sure that we already calculated the resource share at the physical
+   * machine layer. */
+  {
+       ModelPtr ws_model = static_cast<ModelPtr>(surf_workstation_model);
+       ModelPtr vm_ws_model = static_cast<ModelPtr>(surf_vm_workstation_model);
+    unsigned int index_of_pm_ws_model = xbt_dynar_search(model_list_invoke, &ws_model);
+    unsigned int index_of_vm_ws_model = xbt_dynar_search(model_list_invoke, &vm_ws_model);
+    xbt_assert((index_of_pm_ws_model < index_of_vm_ws_model), "Cannot assume surf_workstation_model comes before");
+
+    /* Another option is that we call sub_ws->share_resource() here. The
+     * share_resource() function has no side-effect. We can call it here to
+     * ensure that. */
+  }
+
+
+  /* 1. Now we know how many resource should be assigned to each virtual
+   * machine. We update constraints of the virtual machine layer.
+   *
+   *
+   * If we have two virtual machine (VM1 and VM2) on a physical machine (PM1).
+   *     X1 + X2 = C       (Equation 1)
+   * where
+   *    the resource share of VM1: X1
+   *    the resource share of VM2: X2
+   *    the capacity of PM1: C
+   *
+   * Then, if we have two process (P1 and P2) on VM1.
+   *     X1_1 + X1_2 = X1  (Equation 2)
+   * where
+   *    the resource share of P1: X1_1
+   *    the resource share of P2: X1_2
+   *    the capacity of VM1: X1
+   *
+   * Equation 1 was solved in the physical machine layer.
+   * Equation 2 is solved in the virtual machine layer (here).
+   * X1 must be passed to the virtual machine laye as a constraint value.
+   *
+   **/
+
+  /* iterate for all virtual machines */
+  for (WorkstationVMModel::vm_list_t::iterator iter =
+         WorkstationVMModel::ws_vms.begin();
+       iter !=  WorkstationVMModel::ws_vms.end(); ++iter) {
+
+    WorkstationVMPtr ws_vm = &*iter;
+    CpuPtr cpu = static_cast<CpuPtr>(ws_vm->p_cpu);
+    xbt_assert(cpu, "cpu-less workstation");
+
+    double solved_value = get_solved_value(static_cast<CpuActionPtr>(ws_vm->p_action));
+    XBT_DEBUG("assign %f to vm %s @ pm %s", solved_value,
+        ws_vm->getName(), ws_vm->p_subWs->getName());
+
+    // TODO: check lmm_update_constraint_bound() works fine instead of the below manual substitution.
+    // cpu_cas01->constraint->bound = solved_value;
+    xbt_assert(cpu->getModel() == static_cast<ModelPtr>(surf_cpu_model_vm));
+    lmm_system_t vcpu_system = cpu->getModel()->getMaxminSystem();
+    lmm_update_constraint_bound(vcpu_system, cpu->getConstraint(), virt_overhead * solved_value);
+  }
+
+
+  /* 2. Calculate resource share at the virtual machine layer. */
+  adjustWeightOfDummyCpuActions();
+
+  double min_by_cpu = p_cpuModel->shareResources(now);
+  double min_by_net = (strcmp(surf_network_model->getName(), "network NS3")) ? surf_network_model->shareResources(now) : -1;
+  double min_by_sto = -1;
+  if (p_cpuModel == surf_cpu_model_pm)
+       min_by_sto = surf_storage_model->shareResources(now);
+
+  XBT_DEBUG("model %p, %s min_by_cpu %f, %s min_by_net %f, %s min_by_sto %f",
+      this, surf_cpu_model_pm->getName(), min_by_cpu,
+            surf_network_model->getName(), min_by_net,
+            surf_storage_model->getName(), min_by_sto);
+
+  double ret = max(max(min_by_cpu, min_by_net), min_by_sto);
+  if (min_by_cpu >= 0.0 && min_by_cpu < ret)
+       ret = min_by_cpu;
+  if (min_by_net >= 0.0 && min_by_net < ret)
+       ret = min_by_net;
+  if (min_by_sto >= 0.0 && min_by_sto < ret)
+       ret = min_by_sto;
+
+  /* FIXME: 3. do we have to re-initialize our cpu_action object? */
+#if 0
+  /* iterate for all virtual machines */
+  for (WorkstationVMModel::vm_list_t::iterator iter =
+         WorkstationVMModel::ws_vms.begin();
+       iter !=  WorkstationVMModel::ws_vms.end(); ++iter) {
+
+    {
+#if 0
+      WorkstationVM2013Ptr ws_vm2013 = static_cast<WorkstationVM2013Ptr>(&*iter);
+      XBT_INFO("cost %f remains %f start %f finish %f", ws_vm2013->cpu_action->cost,
+          ws_vm2013->cpu_action->remains,
+          ws_vm2013->cpu_action->start,
+          ws_vm2013->cpu_action->finish
+          );
+#endif
+#if 0
+      void *ind_sub_host = xbt_lib_get_elm_or_null(host_lib, ws_vm2013->sub_ws->generic_resource.getName);
+      surf_cpu_model_pm->action_unref(ws_vm2013->cpu_action);
+      /* FIXME: this means busy loop? */
+      // ws_vm2013->cpu_action = surf_cpu_model_pm->extension.cpu.execute(ind_sub_host, GUESTOS_NOISE);
+      ws_vm2013->cpu_action = surf_cpu_model_pm->extension.cpu.execute(ind_sub_host, 0);
+#endif
+
+    }
+  }
+#endif
+
+
+  return ret;
+}
+
+ActionPtr WorkstationVMHL13Model::executeParallelTask(int workstation_nb,
+                                        void **workstation_list,
+                                        double *computation_amount,
+                                        double *communication_amount,
+                                        double rate){
+#define cost_or_zero(array,pos) ((array)?(array)[pos]:0.0)
+  if ((workstation_nb == 1)
+      && (cost_or_zero(communication_amount, 0) == 0.0))
+    return ((WorkstationCLM03Ptr)workstation_list[0])->execute(computation_amount[0]);
+  else if ((workstation_nb == 1)
+           && (cost_or_zero(computation_amount, 0) == 0.0))
+    return communicate((WorkstationCLM03Ptr)workstation_list[0], (WorkstationCLM03Ptr)workstation_list[0],communication_amount[0], rate);
+  else if ((workstation_nb == 2)
+             && (cost_or_zero(computation_amount, 0) == 0.0)
+             && (cost_or_zero(computation_amount, 1) == 0.0)) {
+    int i,nb = 0;
+    double value = 0.0;
+
+    for (i = 0; i < workstation_nb * workstation_nb; i++) {
+      if (cost_or_zero(communication_amount, i) > 0.0) {
+        nb++;
+        value = cost_or_zero(communication_amount, i);
+      }
+    }
+    if (nb == 1)
+      return communicate((WorkstationCLM03Ptr)workstation_list[0], (WorkstationCLM03Ptr)workstation_list[1],value, rate);
+  }
+#undef cost_or_zero
+
+  THROW_UNIMPLEMENTED;          /* This model does not implement parallel tasks */
+  return NULL;
+}
+
+/************
+ * Resource *
+ ************/
+
+WorkstationVMHL13::WorkstationVMHL13(WorkstationVMModelPtr model, const char* name, xbt_dict_t props,
+                                                  surf_resource_t ind_phys_workstation)
+ : WorkstationVM(model, name, props, NULL, NULL)
+{
+  WorkstationPtr sub_ws = static_cast<WorkstationPtr>(surf_workstation_resource_priv(ind_phys_workstation));
+
+  /* Currently, we assume a VM has no storage. */
+  p_storage = NULL;
+
+  /* Currently, a VM uses the network resource of its physical host. In
+   * host_lib, this network resource object is refered from two different keys.
+   * When deregistering the reference that points the network resource object
+   * from the VM name, we have to make sure that the system does not call the
+   * free callback for the network resource object. The network resource object
+   * is still used by the physical machine. */
+  p_netElm = static_cast<RoutingEdgePtr>(xbt_lib_get_or_null(host_lib, sub_ws->getName(), ROUTING_HOST_LEVEL));
+  xbt_lib_set(host_lib, name, ROUTING_HOST_LEVEL, p_netElm);
+
+  p_subWs = sub_ws;
+  p_currentState = SURF_VM_STATE_CREATED;
+
+  // //// CPU  RELATED STUFF ////
+  // Roughly, create a vcpu resource by using the values of the sub_cpu one.
+  CpuCas01Ptr sub_cpu = static_cast<CpuCas01Ptr>(surf_cpu_resource_priv(ind_phys_workstation));
+
+  /* We can assume one core and cas01 cpu for the first step.
+   * Do xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, cpu) if you get the resource. */
+
+  p_cpu = static_cast<CpuCas01ModelPtr>(surf_cpu_model_vm)->createResource(name, // name
+      sub_cpu->getPowerPeakList(),        // host->power_peak,
+      sub_cpu->getPState(),
+      1,                          // host->power_scale,
+      NULL,                       // host->power_trace,
+      1,                          // host->core_amount,
+      SURF_RESOURCE_ON,           // host->initial_state,
+      NULL,                       // host->state_trace,
+      NULL);                       // host->properties,
+
+  /* We create cpu_action corresponding to a VM process on the host operating system. */
+  /* FIXME: TODO: we have to peridocally input GUESTOS_NOISE to the system? how ? */
+  // vm_ws->cpu_action = surf_cpu_model_pm->extension.cpu.execute(ind_phys_workstation, GUESTOS_NOISE);
+  p_action = static_cast<CpuActionPtr>(sub_cpu->execute(0));
+
+  /* The SURF_WKS_LEVEL at host_lib saves workstation_CLM03 objects. Please
+   * note workstation_VM2013 objects, inheriting the workstation_CLM03
+   * structure, are also saved there.
+   *
+   * If you want to get a workstation_VM2013 object from host_lib, see
+   * ws->generic_resouce.model->type first. If it is
+   * SURF_MODEL_TYPE_VM_WORKSTATION, you can cast ws to vm_ws. */
+  XBT_INFO("Create VM(%s)@PM(%s) with %ld mounted disks", name, sub_ws->getName(), xbt_dynar_length(p_storage));
+}
+
+/*
+ * A physical host does not disapper in the current SimGrid code, but a VM may
+ * disapper during a simulation.
+ */
+WorkstationVMHL13::~WorkstationVMHL13()
+{
+  /* ind_phys_workstation equals to smx_host_t */
+  surf_resource_t ind_vm_workstation = xbt_lib_get_elm_or_null(host_lib, getName());
+
+  /* Before clearing the entries in host_lib, we have to pick up resources. */
+  CpuCas01Ptr cpu = static_cast<CpuCas01Ptr>(surf_cpu_resource_priv(ind_vm_workstation));
+
+  /* We deregister objects from host_lib, without invoking the freeing callback
+   * of each level.
+   *
+   * Do not call xbt_lib_remove() here. It deletes all levels of the key,
+   * including MSG_HOST_LEVEL and others. We should unregister only what we know.
+   */
+  xbt_lib_unset(host_lib, getName(), SURF_CPU_LEVEL, 0);
+  xbt_lib_unset(host_lib, getName(), ROUTING_HOST_LEVEL, 0);
+  xbt_lib_unset(host_lib, getName(), SURF_WKS_LEVEL, 0);
+
+  /* TODO: comment out when VM stroage is implemented. */
+  // xbt_lib_unset(host_lib, name, SURF_STORAGE_LEVEL, 0);
+
+
+  /* Free the cpu_action of the VM. */
+  int ret = p_action->unref();
+  xbt_assert(ret == 1, "Bug: some resource still remains");
+
+  /* Free the cpu resource of the VM. If using power_trace, we will have to */
+  delete cpu;
+
+  /* Free the network resource of the VM. */
+  // Nothing has to be done, because net_elmts is just a pointer on the physical one
+
+  /* Free the storage resource of the VM. */
+  // Not relevant yet
+
+  /* Free the workstation resource of the VM. */
+}
+
+void WorkstationVMHL13::updateState(tmgr_trace_event_t /*event_type*/, double /*value*/, double /*date*/) {
+  THROW_IMPOSSIBLE;             /* This model does not implement parallel tasks */
+}
+
+bool WorkstationVMHL13::isUsed() {
+  THROW_IMPOSSIBLE;             /* This model does not implement parallel tasks */
+  return -1;
+}
+
+e_surf_resource_state_t WorkstationVMHL13::getState()
+{
+  return (e_surf_resource_state_t) p_currentState;
+}
+
+void WorkstationVMHL13::setState(e_surf_resource_state_t state)
+{
+  p_currentState = (e_surf_vm_state_t) state;
+}
+
+void WorkstationVMHL13::suspend()
+{
+  p_action->suspend();
+  p_currentState = SURF_VM_STATE_SUSPENDED;
+}
+
+void WorkstationVMHL13::resume()
+{
+  p_action->resume();
+  p_currentState = SURF_VM_STATE_RUNNING;
+}
+
+void WorkstationVMHL13::save()
+{
+  p_currentState = SURF_VM_STATE_SAVING;
+
+  /* FIXME: do something here */
+  p_action->suspend();
+  p_currentState = SURF_VM_STATE_SAVED;
+}
+
+void WorkstationVMHL13::restore()
+{
+  p_currentState = SURF_VM_STATE_RESTORING;
+
+  /* FIXME: do something here */
+  p_action->resume();
+  p_currentState = SURF_VM_STATE_RUNNING;
+}
+
+/*
+ * Update the physical host of the given VM
+ */
+void WorkstationVMHL13::migrate(surf_resource_t ind_dst_pm)
+{
+   /* ind_phys_workstation equals to smx_host_t */
+   WorkstationPtr ws_dst = static_cast<WorkstationPtr>(surf_workstation_resource_priv(ind_dst_pm));
+   const char *vm_name = getName();
+   const char *pm_name_src = p_subWs->getName();
+   const char *pm_name_dst = ws_dst->getName();
+
+   xbt_assert(ws_dst);
+
+   /* do something */
+
+   /* update net_elm with that of the destination physical host */
+   RoutingEdgePtr old_net_elm = p_netElm;
+   RoutingEdgePtr new_net_elm = static_cast<RoutingEdgePtr>(xbt_lib_get_or_null(host_lib, pm_name_dst, ROUTING_HOST_LEVEL));
+   xbt_assert(new_net_elm);
+
+   /* Unregister the current net_elm from host_lib. Do not call the free callback. */
+   xbt_lib_unset(host_lib, vm_name, ROUTING_HOST_LEVEL, 0);
+
+   /* Then, resister the new one. */
+   p_netElm = new_net_elm;
+   xbt_lib_set(host_lib, vm_name, ROUTING_HOST_LEVEL, p_netElm);
+
+   p_subWs = ws_dst;
+
+   /* Update vcpu's action for the new pm */
+   {
+#if 0
+     XBT_INFO("cpu_action->remains %g", p_action->remains);
+     XBT_INFO("cost %f remains %f start %f finish %f", p_action->cost,
+         p_action->remains,
+         p_action->start,
+         p_action->finish
+         );
+     XBT_INFO("cpu_action state %d", surf_action_get_state(p_action));
+#endif
+
+     /* create a cpu action bound to the pm model at the destination. */
+     CpuActionPtr new_cpu_action = static_cast<CpuActionPtr>(
+                                           static_cast<CpuPtr>(surf_cpu_resource_priv(ind_dst_pm))->execute(0));
+
+     e_surf_action_state_t state = p_action->getState();
+     if (state != SURF_ACTION_DONE)
+       XBT_CRITICAL("FIXME: may need a proper handling, %d", state);
+     if (p_action->getRemainsNoUpdate() > 0)
+       XBT_CRITICAL("FIXME: need copy the state(?), %f", p_action->getRemainsNoUpdate());
+
+     /* keep the bound value of the cpu action of the VM. */
+     double old_bound = p_action->getBound();
+     if (old_bound != 0) {
+       XBT_INFO("migrate VM(%s): set bound (%f) at %s", vm_name, old_bound, pm_name_dst);
+       new_cpu_action->setBound(old_bound);
+     }
+
+     int ret = p_action->unref();
+     xbt_assert(ret == 1, "Bug: some resource still remains");
+
+     p_action = new_cpu_action;
+   }
+
+   XBT_DEBUG("migrate VM(%s): change net_elm (%p to %p)", vm_name, old_net_elm, new_net_elm);
+   XBT_DEBUG("migrate VM(%s): change PM (%s to %s)", vm_name, pm_name_src, pm_name_dst);
+}
+
+void WorkstationVMHL13::setBound(double bound){
+ p_action->setBound(bound);
+}
+
+void WorkstationVMHL13::setAffinity(CpuPtr cpu, unsigned long mask){
+ p_action->setAffinity(cpu, mask);
+}
+
+/*
+ * A surf level object will be useless in the upper layer. Returing the
+ * dict_elm of the host.
+ **/
+surf_resource_t WorkstationVMHL13::getPm()
+{
+  return xbt_lib_get_elm_or_null(host_lib, p_subWs->getName());
+}
+
+/* Adding a task to a VM updates the VCPU task on its physical machine. */
+ActionPtr WorkstationVMHL13::execute(double size)
+{
+  double old_cost = p_action->getCost();
+  double new_cost = old_cost + size;
+
+  XBT_DEBUG("VM(%s)@PM(%s): update dummy action's cost (%f -> %f)",
+      getName(), p_subWs->getName(),
+      old_cost, new_cost);
+
+  p_action->setCost(new_cost);
+
+  return p_cpu->execute(size);
+}
+
+ActionPtr WorkstationVMHL13::sleep(double duration) {
+  return p_cpu->sleep(duration);
+}
+
+/**********
+ * Action *
+ **********/
+
+//FIME:: handle action cancel
+
diff --git a/src/surf/vm_workstation_hl13.hpp b/src/surf/vm_workstation_hl13.hpp
new file mode 100644 (file)
index 0000000..cf3d23f
--- /dev/null
@@ -0,0 +1,89 @@
+/* Copyright (c) 2013-2014. 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 "vm_workstation_interface.hpp"
+#include "workstation_clm03.hpp"
+
+#ifndef VM_WORKSTATION_HPP_
+#define VM_WORKSTATION_HPP_
+
+#define GUESTOS_NOISE 100 // This value corresponds to the cost of the global action associated to the VM
+                          // It corresponds to the cost of a VM running no tasks.
+
+void surf_vm_workstation_model_init(void);
+
+/***********
+ * Classes *
+ ***********/
+
+class WorkstationVMHL13Model;
+typedef WorkstationVMHL13Model *WorkstationVMHL13ModelPtr;
+
+class WorkstationVMHL13;
+typedef WorkstationVMHL13 *WorkstationVMHL13Ptr;
+
+/*********
+ * Tools *
+ *********/
+
+/*********
+ * Model *
+ *********/
+class WorkstationVMHL13Model : public WorkstationVMModel {
+public:
+  WorkstationVMHL13Model();
+  ~WorkstationVMHL13Model(){};
+  void createResource(const char *name, void *ind_phys_workstation);
+  double shareResources(double now);
+  void adjustWeightOfDummyCpuActions() {};
+  xbt_dynar_t getRoute(WorkstationPtr src, WorkstationPtr dst);
+  ActionPtr communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate);
+  ActionPtr executeParallelTask(int workstation_nb,
+                                          void **workstation_list,
+                                          double *computation_amount,
+                                          double *communication_amount,
+                                          double rate);
+  void updateActionsState(double /*now*/, double /*delta*/);
+};
+
+/************
+ * Resource *
+ ************/
+
+class WorkstationVMHL13 : public WorkstationVM {
+public:
+  WorkstationVMHL13(WorkstationVMModelPtr model, const char* name, xbt_dict_t props, surf_resource_t ind_phys_workstation);
+  ~WorkstationVMHL13();
+
+  void suspend();
+  void resume();
+
+  void save();
+  void restore();
+
+  void migrate(surf_resource_t ind_dst_pm);
+
+  e_surf_resource_state_t getState();
+  void setState(e_surf_resource_state_t state);
+
+  surf_resource_t getPm(); // will be vm_ws_get_pm()
+
+  void setBound(double bound);
+  void setAffinity(CpuPtr cpu, unsigned long mask);
+
+  //FIXME: remove
+  void updateState(tmgr_trace_event_t event_type, double value, double date);
+  bool isUsed();
+
+  ActionPtr execute(double size);
+  ActionPtr sleep(double duration);
+};
+
+/**********
+ * Action *
+ **********/
+
+#endif /* VM_WORKSTATION_HPP_ */
diff --git a/src/surf/vm_workstation_interface.cpp b/src/surf/vm_workstation_interface.cpp
new file mode 100644 (file)
index 0000000..688ad12
--- /dev/null
@@ -0,0 +1,75 @@
+/* Copyright (c) 2013-2014. 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 "vm_workstation_interface.hpp"
+#include "cpu_cas01.hpp"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_vm_workstation, surf,
+                                "Logging specific to the SURF VM workstation module");
+
+WorkstationVMModelPtr surf_vm_workstation_model = NULL;
+
+/*************
+ * Callbacks *
+ *************/
+
+surf_callback(void, WorkstationVMPtr) workstationVMCreatedCallbacks;
+surf_callback(void, WorkstationVMPtr) workstationVMDestructedCallbacks;
+surf_callback(void, WorkstationVMPtr) workstationVMStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+
+WorkstationVMModel::WorkstationVMModel() : WorkstationModel("Virtual Workstation") {
+  p_cpuModel = surf_cpu_model_vm;
+}
+
+WorkstationVMModel::vm_list_t WorkstationVMModel::ws_vms;
+
+/************
+ * Resource *
+ ************/
+
+WorkstationVM::WorkstationVM(ModelPtr model, const char *name, xbt_dict_t props,
+                       RoutingEdgePtr netElm, CpuPtr cpu)
+: Workstation(model, name, props, NULL, netElm, cpu)
+{
+  WorkstationVMModel::ws_vms.push_back(*this);
+  surf_callback_emit(workstationVMCreatedCallbacks, this);
+}
+
+/*
+ * A physical host does not disapper in the current SimGrid code, but a VM may
+ * disapper during a simulation.
+ */
+WorkstationVM::~WorkstationVM()
+{
+  surf_callback_emit(workstationVMDestructedCallbacks, this);
+  WorkstationVMModel::ws_vms.erase(WorkstationVMModel::
+                                   vm_list_t::s_iterator_to(*this));
+}
+
+void WorkstationVM::setState(e_surf_resource_state_t state){
+  Resource::setState(state);
+  surf_callback_emit(workstationVMStateChangedCallbacks, this);
+}
+
+/*
+ * A surf level object will be useless in the upper layer. Returing the
+ * dict_elm of the host.
+ **/
+surf_resource_t WorkstationVM::getPm()
+{
+  return xbt_lib_get_elm_or_null(host_lib, p_subWs->getName());
+}
+
+/**********
+ * Action *
+ **********/
+
+//FIME:: handle action cancel
+
diff --git a/src/surf/vm_workstation_interface.hpp b/src/surf/vm_workstation_interface.hpp
new file mode 100644 (file)
index 0000000..66a3e9d
--- /dev/null
@@ -0,0 +1,164 @@
+/* Copyright (c) 2004-2014. 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 "workstation_interface.hpp"
+
+#ifndef VM_WORKSTATION_INTERFACE_HPP_
+#define VM_WORKSTATION_INTERFACE_HPP_
+
+#define GUESTOS_NOISE 100 // This value corresponds to the cost of the global action associated to the VM
+                          // It corresponds to the cost of a VM running no tasks.
+
+void surf_vm_workstation_model_init(void);
+
+/***********
+ * Classes *
+ ***********/
+
+class WorkstationVMModel;
+typedef WorkstationVMModel *WorkstationVMModelPtr;
+
+class WorkstationVM;
+typedef WorkstationVM *WorkstationVMPtr;
+
+class WorkstationVMLmm;
+typedef WorkstationVMLmm *WorkstationVMLmmPtr;
+
+/*************
+ * Callbacks *
+ *************/
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after WorkstationVM creation *
+ * @details Callback functions have the following signature: `void(WorkstationVMPtr)`
+ */
+extern surf_callback(void, WorkstationVMPtr) workstationVMCreatedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after WorkstationVM destruction *
+ * @details Callback functions have the following signature: `void(WorkstationVMPtr)`
+ */
+extern surf_callback(void, WorkstationVMPtr) workstationVMDestructedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after WorkstationVM State changed *
+ * @details Callback functions have the following signature: `void(WorkstationVMActionPtr)`
+ */
+extern surf_callback(void, WorkstationVMPtr) workstationVMStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+/** @ingroup SURF_vm_workstation_interface
+ * @brief SURF workstation VM model interface class
+ * @details A model is an object which handle the interactions between its Resources and its Actions
+ */
+class WorkstationVMModel : public WorkstationModel {
+public:
+  /**
+   * @brief WorkstationVMModel consrtuctor
+   */
+  WorkstationVMModel();
+
+    /**
+   * @brief WorkstationVMModel consrtuctor
+   */
+  ~WorkstationVMModel(){};
+
+  /**
+   * @brief Create a new WorkstationVM
+   * 
+   * @param name The name of the new WorkstationVM
+   * @param ind_phys_workstation The workstation hosting the VM
+   * 
+   */
+  virtual void createResource(const char *name, void *ind_phys_workstation)=0;
+
+  void adjustWeightOfDummyCpuActions() {};
+
+  typedef boost::intrusive::list<WorkstationVM,
+                                 boost::intrusive::constant_time_size<false> >
+          vm_list_t;
+  static vm_list_t ws_vms;
+};
+
+/************
+ * Resource *
+ ************/
+
+/** @ingroup SURF_vm_workstation_interface
+ * @brief SURF workstation VM interface class
+ * @details A workstation VM represent an virtual machine
+ */
+class WorkstationVM : public Workstation,
+                      public boost::intrusive::list_base_hook<> {
+public:
+  /**
+   * @brief WorkstationVM consrtructor
+   * 
+   * @param model WorkstationModel associated to this Workstation
+   * @param name The name of the Workstation
+   * @param props Dictionary of properties associated to this Workstation
+   * @param netElm The RoutingEdge associated to this Workstation
+   * @param cpu The Cpu associated to this Workstation
+   */
+  WorkstationVM(ModelPtr model, const char *name, xbt_dict_t props,
+                       RoutingEdgePtr netElm, CpuPtr cpu);
+
+  /**
+   * @brief WdorkstationVM destructor
+   */
+  ~WorkstationVM();
+
+  void setState(e_surf_resource_state_t state);
+
+  /**
+   * @brief Suspend the VM
+   */
+  virtual void suspend()=0;
+
+  /**
+   * @brief Resume the VM
+   */
+  virtual void resume()=0;
+
+  /**
+   * @brief Save the VM (Not yet implemented)
+   */
+  virtual void save()=0;
+
+  /**
+   * @brief Restore the VM (Not yet implemented)
+   */
+  virtual void restore()=0;
+
+  /**
+   * @brief Migrate the VM to the destination host
+   * 
+   * @param ind_vm_ws_dest The destination host
+   */
+  virtual void migrate(surf_resource_t ind_vm_ws_dest)=0;
+
+  /**
+   * @brief Get the physical machine hosting the VM
+   * @return The physical machine hosting the VM
+   */
+  virtual surf_resource_t getPm()=0;
+
+  virtual void setBound(double bound)=0;
+  virtual void setAffinity(CpuPtr cpu, unsigned long mask)=0;
+
+  /* The workstation object of the lower layer */
+  CpuActionPtr p_action;
+  WorkstationPtr p_subWs;  // Pointer to the ''host'' OS
+  e_surf_vm_state_t p_currentState;
+};
+
+/**********
+ * Action *
+ **********/
+
+#endif /* VM_WORKSTATION_INTERFACE_HPP_ */
diff --git a/src/surf/workstation.c b/src/surf/workstation.c
deleted file mode 100644 (file)
index f50cf05..0000000
+++ /dev/null
@@ -1,578 +0,0 @@
-/* Copyright (c) 2004-2013. 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 "portable.h"
-#include "surf_private.h"
-#include "storage_private.h"
-#include "surf/surf_resource.h"
-#include "simgrid/sg_config.h"
-
-typedef struct workstation_CLM03 {
-  s_surf_resource_t generic_resource;   /* Must remain first to add this to a trace */
-  void *net_elm;
-  xbt_dynar_t storage;
-} s_workstation_CLM03_t, *workstation_CLM03_t;
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_workstation, surf,
-                                "Logging specific to the SURF workstation module");
-
-surf_model_t surf_workstation_model = NULL;
-
-static void workstation_new(sg_platf_host_cbarg_t host)
-{
-  workstation_CLM03_t workstation = xbt_new0(s_workstation_CLM03_t, 1);
-
-  workstation->generic_resource.model = surf_workstation_model;
-  workstation->generic_resource.name = xbt_strdup(host->id);
-  workstation->storage = xbt_lib_get_or_null(storage_lib,host->id,ROUTING_STORAGE_HOST_LEVEL);
-  workstation->net_elm = xbt_lib_get_or_null(host_lib,host->id,ROUTING_HOST_LEVEL);
-  XBT_DEBUG("Create workstation %s with %ld mounted disks",host->id,xbt_dynar_length(workstation->storage));
-  xbt_lib_set(host_lib, host->id, SURF_WKS_LEVEL, workstation);
-}
-
-static int ws_resource_used(void *resource_id)
-{
-  THROW_IMPOSSIBLE;             /* This model does not implement parallel tasks */
-  return -1;
-}
-
-static void ws_parallel_action_cancel(surf_action_t action)
-{
-  THROW_UNIMPLEMENTED;          /* This model does not implement parallel tasks */
-}
-
-static int ws_parallel_action_free(surf_action_t action)
-{
-  THROW_UNIMPLEMENTED;          /* This model does not implement parallel tasks */
-  return -1;
-}
-
-static int ws_action_unref(surf_action_t action)
-{
-  if (action->model_type == surf_network_model)
-    return surf_network_model->action_unref(action);
-  else if (action->model_type == surf_cpu_model)
-    return surf_cpu_model->action_unref(action);
-  else if (action->model_type == surf_workstation_model)
-    return ws_parallel_action_free(action);
-  else
-    DIE_IMPOSSIBLE;
-  return 0;
-}
-
-static void ws_action_cancel(surf_action_t action)
-{
-  if (action->model_type == surf_network_model)
-    surf_network_model->action_cancel(action);
-  else if (action->model_type == surf_cpu_model)
-    surf_cpu_model->action_cancel(action);
-  else if (action->model_type == surf_workstation_model)
-    ws_parallel_action_cancel(action);
-  else
-    DIE_IMPOSSIBLE;
-  return;
-}
-
-static void ws_action_state_set(surf_action_t action,
-                                e_surf_action_state_t state)
-{
-  if (action->model_type == surf_network_model)
-    surf_network_model->action_state_set(action, state);
-  else if (action->model_type == surf_cpu_model)
-    surf_cpu_model->action_state_set(action, state);
-  else if (action->model_type == surf_workstation_model)
-    surf_action_state_set(action, state);
-  else
-    DIE_IMPOSSIBLE;
-  return;
-}
-
-static double ws_share_resources(double now)
-{
-  return -1.0;
-}
-
-static void ws_update_actions_state(double now, double delta)
-{
-  return;
-}
-
-static void ws_update_resource_state(void *id,
-                                     tmgr_trace_event_t event_type,
-                                     double value, double date)
-{
-  THROW_IMPOSSIBLE;             /* This model does not implement parallel tasks */
-}
-
-static surf_action_t ws_execute(void *workstation, double size)
-{
-  surf_resource_t cpu = ((surf_resource_t) surf_cpu_resource_priv(workstation));
-  return cpu->model->extension.cpu.execute(workstation, size);
-}
-
-static surf_action_t ws_action_sleep(void *workstation, double duration)
-{
-  return surf_cpu_model->extension.cpu.
-      sleep(workstation, duration);
-}
-
-static void ws_action_suspend(surf_action_t action)
-{
-  if (action->model_type == surf_network_model)
-    surf_network_model->suspend(action);
-  else if (action->model_type == surf_cpu_model)
-    surf_cpu_model->suspend(action);
-  else
-    DIE_IMPOSSIBLE;
-}
-
-static void ws_action_resume(surf_action_t action)
-{
-  if (action->model_type == surf_network_model)
-    surf_network_model->resume(action);
-  else if (action->model_type == surf_cpu_model)
-    surf_cpu_model->resume(action);
-  else
-    DIE_IMPOSSIBLE;
-}
-
-static int ws_action_is_suspended(surf_action_t action)
-{
-  if (action->model_type == surf_network_model)
-    return surf_network_model->is_suspended(action);
-  if (action->model_type == surf_cpu_model)
-    return surf_cpu_model->is_suspended(action);
-  DIE_IMPOSSIBLE;
-  return -1;
-}
-
-static void ws_action_set_max_duration(surf_action_t action,
-                                       double duration)
-{
-  if (action->model_type == surf_network_model)
-    surf_network_model->set_max_duration(action, duration);
-  else if (action->model_type == surf_cpu_model)
-    surf_cpu_model->set_max_duration(action, duration);
-  else
-    DIE_IMPOSSIBLE;
-}
-
-static void ws_action_set_priority(surf_action_t action, double priority)
-{
-  if (action->model_type == surf_network_model)
-    surf_network_model->set_priority(action, priority);
-  else if (action->model_type == surf_cpu_model)
-    surf_cpu_model->set_priority(action, priority);
-  else
-    DIE_IMPOSSIBLE;
-}
-
-#ifdef HAVE_TRACING
-static void ws_action_set_category(surf_action_t action, const char *category)
-{
-  if (action->model_type == surf_network_model)
-    surf_network_model->set_category(action, category);
-  else if (action->model_type == surf_cpu_model)
-    surf_cpu_model->set_category(action, category);
-  else
-    DIE_IMPOSSIBLE;
-}
-#endif
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-static int ws_get_latency_limited(surf_action_t action)
-{
-  if (action->model_type == surf_network_model)
-    return surf_network_model->get_latency_limited(action);
-  else
-    return 0;
-}
-#endif
-
-static double ws_action_get_remains(surf_action_t action)
-{
-  if (action->model_type == surf_network_model)
-    return surf_network_model->get_remains(action);
-  if (action->model_type == surf_cpu_model)
-    return surf_cpu_model->get_remains(action);
-  DIE_IMPOSSIBLE;
-  return -1.0;
-}
-
-static surf_action_t ws_communicate(void *workstation_src,
-                                    void *workstation_dst, double size,
-                                    double rate)
-{
-  workstation_CLM03_t src = surf_workstation_resource_priv(workstation_src);
-  workstation_CLM03_t dst = surf_workstation_resource_priv(workstation_dst);
-  return surf_network_model->extension.network.
-      communicate(src->net_elm,
-                  dst->net_elm, size, rate);
-}
-
-static e_surf_resource_state_t ws_get_state(void *workstation)
-{
-  return surf_cpu_model->extension.cpu.
-      get_state(workstation);
-}
-
-static double ws_get_speed(void *workstation, double load)
-{
-  return surf_cpu_model->extension.cpu.
-      get_speed(workstation, load);
-}
-
-static int ws_get_core(void *workstation)
-{
-  return surf_cpu_model->extension.cpu.
-      get_core(workstation);
-}
-
-
-
-static double ws_get_available_speed(void *workstation)
-{
-  return surf_cpu_model->extension.cpu.
-      get_available_speed(workstation);
-}
-
-static double ws_get_current_power_peak(void *workstation)
-{
-  return surf_cpu_model->extension.cpu.
-      get_current_power_peak(workstation);
-}
-
-static double ws_get_power_peak_at(void *workstation, int pstate_index)
-{
-  return surf_cpu_model->extension.cpu.
-      get_power_peak_at(workstation, pstate_index);
-}
-
-static int ws_get_nb_pstates(void *workstation)
-{
-  return surf_cpu_model->extension.cpu.
-      get_nb_pstates(workstation);
-}
-
-static void ws_set_power_peak_at(void *workstation, int pstate_index)
-{
-  surf_cpu_model->extension.cpu.
-      set_power_peak_at(workstation, pstate_index);
-}
-
-static double ws_get_consumed_energy(void *workstation)
-{
-  return surf_cpu_model->extension.cpu.
-      get_consumed_energy(workstation);
-}
-
-
-static surf_action_t ws_execute_parallel_task(int workstation_nb,
-                                              void **workstation_list,
-                                              double *computation_amount,
-                                              double *communication_amount,
-                                              double rate)
-{
-#define cost_or_zero(array,pos) ((array)?(array)[pos]:0.0)
-  if ((workstation_nb == 1)
-      && (cost_or_zero(communication_amount, 0) == 0.0))
-    return ws_execute(workstation_list[0], computation_amount[0]);
-  else if ((workstation_nb == 1)
-           && (cost_or_zero(computation_amount, 0) == 0.0))
-    return ws_communicate(workstation_list[0], workstation_list[0],communication_amount[0], rate);
-  else if ((workstation_nb == 2)
-             && (cost_or_zero(computation_amount, 0) == 0.0)
-             && (cost_or_zero(computation_amount, 1) == 0.0)) {
-    int i,nb = 0;
-    double value = 0.0;
-
-    for (i = 0; i < workstation_nb * workstation_nb; i++) {
-      if (cost_or_zero(communication_amount, i) > 0.0) {
-        nb++;
-        value = cost_or_zero(communication_amount, i);
-      }
-    }
-    if (nb == 1)
-      return ws_communicate(workstation_list[0], workstation_list[1],value, rate);
-  }
-#undef cost_or_zero
-
-  THROW_UNIMPLEMENTED;          /* This model does not implement parallel tasks */
-  return NULL;
-}
-
-
-/* returns an array of network_link_CM02_t */
-static xbt_dynar_t ws_get_route(void *workstation_src, void *workstation_dst)
-{
-  XBT_DEBUG("ws_get_route");
-  workstation_CLM03_t src = surf_workstation_resource_priv(workstation_src);
-  workstation_CLM03_t dst = surf_workstation_resource_priv(workstation_dst);
-  return surf_network_model->extension.
-      network.get_route(src->net_elm,
-                  dst->net_elm);
-}
-
-static double ws_get_link_bandwidth(const void *link)
-{
-  return surf_network_model->extension.network.get_link_bandwidth(link);
-}
-
-static double ws_get_link_latency(const void *link)
-{
-  return surf_network_model->extension.network.get_link_latency(link);
-}
-
-static int ws_link_shared(const void *link)
-{
-  return surf_network_model->extension.network.link_shared(link);
-}
-
-static void ws_finalize(void)
-{
-  surf_model_exit(surf_workstation_model);
-  surf_workstation_model = NULL;
-}
-
-static xbt_dict_t ws_get_properties(const void *ws)
-{
-  return surf_resource_properties(surf_cpu_resource_priv(ws));
-}
-
-static storage_t find_storage_on_mount_list(void *workstation,const char* mount)
-{
-  storage_t st = NULL;
-  s_mount_t mnt;
-  unsigned int cursor;
-  workstation_CLM03_t ws = (workstation_CLM03_t) surf_workstation_resource_priv(workstation);
-  xbt_dynar_t storage_list = ws->storage;
-
-  XBT_DEBUG("Search for storage name '%s' on '%s'",mount,ws->generic_resource.name);
-  xbt_dynar_foreach(storage_list,cursor,mnt)
-  {
-    XBT_DEBUG("See '%s'",mnt.name);
-    if(!strcmp(mount,mnt.name)){
-      st = mnt.storage;
-      break;
-    }
-  }
-  if(!st) xbt_die("Can't find mount '%s' for '%s'",mount,ws->generic_resource.name);
-  return st;
-}
-
-static xbt_dict_t ws_get_storage_list(void *workstation)
-{
-  s_mount_t mnt;
-  unsigned int i;
-  xbt_dict_t storage_list = xbt_dict_new_homogeneous(NULL);
-  char *storage_name = NULL;
-
-  workstation_CLM03_t ws = (workstation_CLM03_t) surf_workstation_resource_priv(workstation);
-  xbt_dynar_t storages = ws->storage;
-
-  xbt_dynar_foreach(storages,i,mnt){
-    storage_name = ((storage_t)mnt.storage)->generic_resource.name;
-    xbt_dict_set(storage_list,mnt.name,storage_name,NULL);
-  }
-  return storage_list;
-}
-
-static surf_action_t ws_action_open(void *workstation, const char* mount,
-                                    const char* path)
-{
-  storage_t st = find_storage_on_mount_list(workstation, mount);
-  XBT_DEBUG("OPEN on disk '%s'",st->generic_resource.name);
-  surf_model_t model = st->generic_resource.model;
-  return model->extension.storage.open(st, mount, path);
-}
-
-static surf_action_t ws_action_close(void *workstation, surf_file_t fd)
-{
-  storage_t st = find_storage_on_mount_list(workstation, fd->mount);
-  XBT_DEBUG("CLOSE on disk '%s'",st->generic_resource.name);
-  surf_model_t model = st->generic_resource.model;
-  return model->extension.storage.close(st, fd);
-}
-
-static surf_action_t ws_action_read(void *workstation, surf_file_t fd, sg_storage_size_t size)
-{
-  storage_t st = find_storage_on_mount_list(workstation, fd->mount);
-  XBT_DEBUG("READ on disk '%s'",st->generic_resource.name);
-  surf_model_t model = st->generic_resource.model;
-  return model->extension.storage.read(st, fd, size);
-}
-
-static surf_action_t ws_action_write(void *workstation, surf_file_t fd, sg_storage_size_t size)
-{
-  storage_t st = find_storage_on_mount_list(workstation, fd->mount);
-  XBT_DEBUG("WRITE on disk '%s'",st->generic_resource.name);
-  surf_model_t model = st->generic_resource.model;
-  return model->extension.storage.write(st, fd, size);
-}
-
-static int ws_file_unlink(void *workstation, surf_file_t fd)
-{
-  if (!fd){
-    XBT_WARN("No such file descriptor. Impossible to unlink");
-    return 0;
-  } else {
-//    XBT_INFO("%s %zu", fd->storage, fd->size);
-    storage_t st = find_storage_on_mount_list(workstation, fd->mount);
-    xbt_dict_t content_dict = (st)->content;
-    /* Check if the file is on this storage */
-    if (!xbt_dict_get_or_null(content_dict, fd->name)){
-      XBT_WARN("File %s is not on disk %s. Impossible to unlink", fd->name,
-          st->generic_resource.name);
-      return 0;
-    } else {
-      XBT_DEBUG("UNLINK on disk '%s'",st->generic_resource.name);
-      st->used_size -= fd->size;
-
-      // Remove the file from storage
-      xbt_dict_remove(content_dict,fd->name);
-
-      free(fd->name);
-      free(fd->mount);
-      xbt_free(fd);
-      return 1;
-    }
-  }
-}
-
-static surf_action_t ws_action_ls(void *workstation, const char* mount,
-                                  const char *path)
-{
-  XBT_DEBUG("LS on mount '%s' and file '%s'",mount, path);
-  storage_t st = find_storage_on_mount_list(workstation, mount);
-  surf_model_t model = st->generic_resource.model;
-  return model->extension.storage.ls(st, path);
-}
-
-static sg_storage_size_t ws_file_get_size(void *workstation, surf_file_t fd)
-{
-  return fd->size;
-}
-
-static xbt_dynar_t ws_file_get_info(void *workstation, surf_file_t fd)
-{
-  storage_t st = find_storage_on_mount_list(workstation, fd->mount);
-  sg_storage_size_t *psize = xbt_new(sg_storage_size_t, 1);
-  *psize = fd->size;
-  xbt_dynar_t info = xbt_dynar_new(sizeof(void*), NULL);
-  xbt_dynar_push_as(info, sg_storage_size_t *, psize);
-  xbt_dynar_push_as(info, void *, fd->mount);
-  xbt_dynar_push_as(info, void *, st->generic_resource.name);
-  xbt_dynar_push_as(info, void *, st->type_id);
-  xbt_dynar_push_as(info, void *, st->content_type);
-
-  return info;
-}
-
-static sg_storage_size_t ws_storage_get_free_size(void *workstation,const char* name)
-{
-  storage_t st = find_storage_on_mount_list(workstation, name);
-  return st->size - st->used_size;
-}
-
-static sg_storage_size_t ws_storage_get_used_size(void *workstation,const char* name)
-{
-  storage_t st = find_storage_on_mount_list(workstation, name);
-  return st->used_size;
-}
-
-static void surf_workstation_model_init_internal(void)
-{
-  surf_workstation_model = surf_model_init();
-
-  surf_workstation_model->name = "Workstation";
-  surf_workstation_model->action_unref = ws_action_unref;
-  surf_workstation_model->action_cancel = ws_action_cancel;
-  surf_workstation_model->action_state_set = ws_action_state_set;
-
-  surf_workstation_model->model_private->resource_used = ws_resource_used;
-  surf_workstation_model->model_private->share_resources =
-      ws_share_resources;
-  surf_workstation_model->model_private->update_actions_state =
-      ws_update_actions_state;
-  surf_workstation_model->model_private->update_resource_state =
-      ws_update_resource_state;
-  surf_workstation_model->model_private->finalize = ws_finalize;
-
-  surf_workstation_model->suspend = ws_action_suspend;
-  surf_workstation_model->resume = ws_action_resume;
-  surf_workstation_model->is_suspended = ws_action_is_suspended;
-  surf_workstation_model->set_max_duration = ws_action_set_max_duration;
-  surf_workstation_model->set_priority = ws_action_set_priority;
-#ifdef HAVE_TRACING
-  surf_workstation_model->set_category = ws_action_set_category;
-#endif
-  surf_workstation_model->get_remains = ws_action_get_remains;
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-  surf_workstation_model->get_latency_limited = ws_get_latency_limited;
-#endif
-
-  surf_workstation_model->extension.workstation.execute = ws_execute;
-  surf_workstation_model->extension.workstation.sleep = ws_action_sleep;
-  surf_workstation_model->extension.workstation.get_state = ws_get_state;
-  surf_workstation_model->extension.workstation.get_core = ws_get_core;
-  surf_workstation_model->extension.workstation.get_speed = ws_get_speed;
-  surf_workstation_model->extension.workstation.get_available_speed =
-      ws_get_available_speed;
-  surf_workstation_model->extension.workstation.get_current_power_peak = ws_get_current_power_peak;
-  surf_workstation_model->extension.workstation.get_power_peak_at = ws_get_power_peak_at;
-  surf_workstation_model->extension.workstation.get_nb_pstates = ws_get_nb_pstates;
-  surf_workstation_model->extension.workstation.set_power_peak_at = ws_set_power_peak_at;
-  surf_workstation_model->extension.workstation.get_consumed_energy = ws_get_consumed_energy;
-
-  surf_workstation_model->extension.workstation.communicate =
-      ws_communicate;
-  surf_workstation_model->extension.workstation.get_route = ws_get_route;
-  surf_workstation_model->extension.workstation.execute_parallel_task =
-      ws_execute_parallel_task;
-  surf_workstation_model->extension.workstation.get_link_bandwidth =
-      ws_get_link_bandwidth;
-  surf_workstation_model->extension.workstation.get_link_latency =
-      ws_get_link_latency;
-  surf_workstation_model->extension.workstation.link_shared =
-      ws_link_shared;
-  surf_workstation_model->extension.workstation.get_properties =
-      ws_get_properties;
-
-  surf_workstation_model->extension.workstation.open = ws_action_open;
-  surf_workstation_model->extension.workstation.close = ws_action_close;
-  surf_workstation_model->extension.workstation.read = ws_action_read;
-  surf_workstation_model->extension.workstation.write = ws_action_write;
-  surf_workstation_model->extension.workstation.unlink = ws_file_unlink;
-  surf_workstation_model->extension.workstation.ls = ws_action_ls;
-  surf_workstation_model->extension.workstation.get_size = ws_file_get_size;
-  surf_workstation_model->extension.workstation.get_info = ws_file_get_info;
-  surf_workstation_model->extension.workstation.get_free_size = ws_storage_get_free_size;
-  surf_workstation_model->extension.workstation.get_used_size = ws_storage_get_used_size;
-  surf_workstation_model->extension.workstation.get_storage_list = ws_get_storage_list;
-}
-
-void surf_workstation_model_init_current_default(void)
-{
-  surf_workstation_model_init_internal();
-  xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/crosstraffic", "yes");
-  surf_cpu_model_init_Cas01();
-  surf_network_model_init_LegrandVelho();
-
-  xbt_dynar_push(model_list, &surf_workstation_model);
-  sg_platf_host_add_cb(workstation_new);
-}
-
-void surf_workstation_model_init_compound()
-{
-
-  xbt_assert(surf_cpu_model, "No CPU model defined yet!");
-  xbt_assert(surf_network_model, "No network model defined yet!");
-  surf_workstation_model_init_internal();
-  xbt_dynar_push(model_list, &surf_workstation_model);
-  sg_platf_host_add_cb(workstation_new);
-}
diff --git a/src/surf/workstation_clm03.cpp b/src/surf/workstation_clm03.cpp
new file mode 100644 (file)
index 0000000..1848fd5
--- /dev/null
@@ -0,0 +1,184 @@
+/* Copyright (c) 2013-2014. 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 "workstation_clm03.hpp"
+#include "vm_workstation_interface.hpp"
+#include "cpu_cas01.hpp"
+#include "simgrid/sg_config.h"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_workstation);
+
+/*************
+ * CallBacks *
+ *************/
+
+static void workstation_new(sg_platf_host_cbarg_t host){
+  reinterpret_cast<WorkstationCLM03ModelPtr>(surf_workstation_model)->createResource(host->id);
+}
+
+/*********
+ * Model *
+ *********/
+
+void surf_workstation_model_init_current_default(void)
+{
+  surf_workstation_model = new WorkstationCLM03Model();
+  xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/crosstraffic", "yes");
+  surf_cpu_model_init_Cas01();
+  surf_network_model_init_LegrandVelho();
+  surf_workstation_model->p_cpuModel = surf_cpu_model_pm;
+
+  ModelPtr model = static_cast<ModelPtr>(surf_workstation_model);
+  xbt_dynar_push(model_list, &model);
+  xbt_dynar_push(model_list_invoke, &model);
+  sg_platf_host_add_cb(workstation_new);
+}
+
+void surf_workstation_model_init_compound()
+{
+
+  xbt_assert(surf_cpu_model_pm, "No CPU model defined yet!");
+  xbt_assert(surf_network_model, "No network model defined yet!");
+  surf_workstation_model = new WorkstationCLM03Model();
+
+  ModelPtr model = static_cast<ModelPtr>(surf_workstation_model);
+  xbt_dynar_push(model_list, &model);
+  xbt_dynar_push(model_list_invoke, &model);
+  sg_platf_host_add_cb(workstation_new);
+}
+
+WorkstationCLM03Model::WorkstationCLM03Model(const char *name)
+ : WorkstationModel(name)
+{}
+
+
+WorkstationCLM03Model::WorkstationCLM03Model()
+ : WorkstationModel("Workstation")
+{
+}
+
+WorkstationCLM03Model::~WorkstationCLM03Model()
+{}
+
+void WorkstationCLM03Model::parseInit(sg_platf_host_cbarg_t host){
+  createResource(host->id);
+}
+
+WorkstationPtr WorkstationCLM03Model::createResource(const char *name){
+
+  WorkstationPtr workstation = new WorkstationCLM03(surf_workstation_model, name, NULL,
+                 (xbt_dynar_t)xbt_lib_get_or_null(storage_lib, name, ROUTING_STORAGE_HOST_LEVEL),
+                 (RoutingEdgePtr)xbt_lib_get_or_null(host_lib, name, ROUTING_HOST_LEVEL),
+                 static_cast<CpuPtr>(xbt_lib_get_or_null(host_lib, name, SURF_CPU_LEVEL)));
+  XBT_DEBUG("Create workstation %s with %ld mounted disks", name, xbt_dynar_length(workstation->p_storage));
+  xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, static_cast<ResourcePtr>(workstation));
+  return workstation;
+}
+
+double WorkstationCLM03Model::shareResources(double now){
+  adjustWeightOfDummyCpuActions();
+
+  double min_by_cpu = p_cpuModel->shareResources(now);
+  double min_by_net = (strcmp(surf_network_model->getName(), "network NS3")) ? surf_network_model->shareResources(now) : -1;
+  double min_by_sto = -1;
+  if (p_cpuModel == surf_cpu_model_pm)
+       min_by_sto = surf_storage_model->shareResources(now);
+
+  XBT_DEBUG("model %p, %s min_by_cpu %f, %s min_by_net %f, %s min_by_sto %f",
+      this, surf_cpu_model_pm->getName(), min_by_cpu,
+            surf_network_model->getName(), min_by_net,
+            surf_storage_model->getName(), min_by_sto);
+
+  double res = max(max(min_by_cpu, min_by_net), min_by_sto);
+  if (min_by_cpu >= 0.0 && min_by_cpu < res)
+       res = min_by_cpu;
+  if (min_by_net >= 0.0 && min_by_net < res)
+       res = min_by_net;
+  if (min_by_sto >= 0.0 && min_by_sto < res)
+       res = min_by_sto;
+  return res;
+}
+
+void WorkstationCLM03Model::updateActionsState(double /*now*/, double /*delta*/){
+  return;
+}
+
+ActionPtr WorkstationCLM03Model::executeParallelTask(int workstation_nb,
+                                        void **workstation_list,
+                                        double *computation_amount,
+                                        double *communication_amount,
+                                        double rate){
+#define cost_or_zero(array,pos) ((array)?(array)[pos]:0.0)
+  if ((workstation_nb == 1)
+      && (cost_or_zero(communication_amount, 0) == 0.0))
+    return ((WorkstationCLM03Ptr)workstation_list[0])->execute(computation_amount[0]);
+  else if ((workstation_nb == 1)
+           && (cost_or_zero(computation_amount, 0) == 0.0))
+    return communicate((WorkstationCLM03Ptr)workstation_list[0], (WorkstationCLM03Ptr)workstation_list[0],communication_amount[0], rate);
+  else if ((workstation_nb == 2)
+             && (cost_or_zero(computation_amount, 0) == 0.0)
+             && (cost_or_zero(computation_amount, 1) == 0.0)) {
+    int i,nb = 0;
+    double value = 0.0;
+
+    for (i = 0; i < workstation_nb * workstation_nb; i++) {
+      if (cost_or_zero(communication_amount, i) > 0.0) {
+        nb++;
+        value = cost_or_zero(communication_amount, i);
+      }
+    }
+    if (nb == 1)
+      return communicate((WorkstationCLM03Ptr)workstation_list[0], (WorkstationCLM03Ptr)workstation_list[1],value, rate);
+  }
+#undef cost_or_zero
+
+  THROW_UNIMPLEMENTED;          /* This model does not implement parallel tasks */
+  return NULL;
+}
+
+/* returns an array of network_link_CM02_t */
+xbt_dynar_t WorkstationCLM03Model::getRoute(WorkstationPtr src, WorkstationPtr dst)
+{
+  XBT_DEBUG("ws_get_route");
+  return surf_network_model->getRoute(src->p_netElm, dst->p_netElm);
+}
+
+ActionPtr WorkstationCLM03Model::communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate){
+  return surf_network_model->communicate(src->p_netElm, dst->p_netElm, size, rate);
+}
+
+
+
+/************
+ * Resource *
+ ************/
+WorkstationCLM03::WorkstationCLM03(WorkstationModelPtr model, const char* name, xbt_dict_t properties, xbt_dynar_t storage, RoutingEdgePtr netElm, CpuPtr cpu)
+  : Workstation(model, name, properties, storage, netElm, cpu) {}
+
+bool WorkstationCLM03::isUsed(){
+  THROW_IMPOSSIBLE;             /* This model does not implement parallel tasks */
+  return -1;
+}
+
+void WorkstationCLM03::updateState(tmgr_trace_event_t /*event_type*/, double /*value*/, double /*date*/){
+  THROW_IMPOSSIBLE;             /* This model does not implement parallel tasks */
+}
+
+ActionPtr WorkstationCLM03::execute(double size) {
+  return p_cpu->execute(size);
+}
+
+ActionPtr WorkstationCLM03::sleep(double duration) {
+  return p_cpu->sleep(duration);
+}
+
+e_surf_resource_state_t WorkstationCLM03::getState() {
+  return p_cpu->getState();
+}
+
+/**********
+ * Action *
+ **********/
diff --git a/src/surf/workstation_clm03.hpp b/src/surf/workstation_clm03.hpp
new file mode 100644 (file)
index 0000000..0028c52
--- /dev/null
@@ -0,0 +1,87 @@
+/* Copyright (c) 2013-2014. 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 "workstation_interface.hpp"
+#include "storage_interface.hpp"
+#include "cpu_interface.hpp"
+#include "network_interface.hpp"
+
+#ifndef SURF_WORKSTATION_CLM03_HPP_
+#define SURF_WORKSTATION_CLM03_HPP_
+
+/***********
+ * Classes *
+ ***********/
+
+class WorkstationCLM03Model;
+typedef WorkstationCLM03Model *WorkstationCLM03ModelPtr;
+
+class WorkstationCLM03;
+typedef WorkstationCLM03 *WorkstationCLM03Ptr;
+
+class WorkstationCLM03Action;
+typedef WorkstationCLM03Action *WorkstationCLM03ActionPtr;
+
+/*********
+ * Model *
+ *********/
+
+class WorkstationCLM03Model : public WorkstationModel {
+public:
+  WorkstationCLM03Model(const char *name);
+  WorkstationCLM03Model();
+  ~WorkstationCLM03Model();
+  void parseInit(sg_platf_host_cbarg_t host);
+  WorkstationPtr createResource(const char *name);
+  double shareResources(double now);
+
+  void updateActionsState(double now, double delta);
+
+  ActionPtr executeParallelTask(int workstation_nb,
+                                        void **workstation_list,
+                                        double *computation_amount,
+                                        double *communication_amount,
+                                        double rate);
+ xbt_dynar_t getRoute(WorkstationPtr src, WorkstationPtr dst);
+ ActionPtr communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate);
+};
+
+/************
+ * Resource *
+ ************/
+
+class WorkstationCLM03 : public Workstation {
+public:
+  WorkstationCLM03(WorkstationModelPtr model, const char* name, xbt_dict_t properties, xbt_dynar_t storage, RoutingEdgePtr netElm, CpuPtr cpu);
+
+  void updateState(tmgr_trace_event_t event_type, double value, double date);
+
+  virtual ActionPtr execute(double size);
+  virtual ActionPtr sleep(double duration);
+  e_surf_resource_state_t getState();
+
+  bool isUsed();
+
+  xbt_dynar_t getVms();
+
+  /* common with vm */
+  void getParams(ws_params_t params);
+  void setParams(ws_params_t params);
+};
+
+
+/**********
+ * Action *
+ **********/
+
+class WorkstationCLM03Action : public WorkstationAction {
+public:
+  WorkstationCLM03Action(ModelPtr model, double cost, bool failed)
+  : WorkstationAction(model, cost, failed) {}
+};
+
+
+#endif /* SURF_WORKSTATION_CLM03_HPP_ */
diff --git a/src/surf/workstation_interface.cpp b/src/surf/workstation_interface.cpp
new file mode 100644 (file)
index 0000000..1b41b0c
--- /dev/null
@@ -0,0 +1,333 @@
+/* Copyright (c) 2013-2014. 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 "workstation_interface.hpp"
+#include "vm_workstation_interface.hpp"
+#include "cpu_cas01.hpp"
+#include "simgrid/sg_config.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_workstation, surf,
+                                "Logging specific to the SURF workstation module");
+
+WorkstationModelPtr surf_workstation_model = NULL;
+
+/*************
+ * Callbacks *
+ *************/
+
+surf_callback(void, WorkstationPtr) workstationCreatedCallbacks;
+surf_callback(void, WorkstationPtr) workstationDestructedCallbacks;
+surf_callback(void, WorkstationPtr) workstationStateChangedCallbacks;
+surf_callback(void, WorkstationActionPtr) workstationActionStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+WorkstationModel::WorkstationModel(const char *name)
+ : Model(name)
+{
+  p_cpuModel = surf_cpu_model_pm;
+}
+
+WorkstationModel::WorkstationModel()
+: Model("Workstation") {
+  p_cpuModel = surf_cpu_model_pm;
+}
+
+WorkstationModel::~WorkstationModel() {
+}
+
+/* Each VM has a dummy CPU action on the PM layer. This CPU action works as the
+ * constraint (capacity) of the VM in the PM layer. If the VM does not have any
+ * active task, the dummy CPU action must be deactivated, so that the VM does
+ * not get any CPU share in the PM layer. */
+void WorkstationModel::adjustWeightOfDummyCpuActions()
+{
+  /* iterate for all virtual machines */
+  for (WorkstationVMModel::vm_list_t::iterator iter =
+         WorkstationVMModel::ws_vms.begin();
+       iter !=  WorkstationVMModel::ws_vms.end(); ++iter) {
+
+    WorkstationVMPtr ws_vm = &*iter;
+    CpuCas01Ptr cpu_cas01 = static_cast<CpuCas01Ptr>(ws_vm->p_cpu);
+    xbt_assert(cpu_cas01, "cpu-less workstation");
+
+    int is_active = lmm_constraint_used(cpu_cas01->getModel()->getMaxminSystem(), cpu_cas01->getConstraint());
+    // int is_active_old = constraint_is_active(cpu_cas01);
+
+    // {
+    //   xbt_assert(is_active == is_active_old, "%d %d", is_active, is_active_old);
+    // }
+
+    if (is_active) {
+      /* some tasks exist on this VM */
+      XBT_DEBUG("set the weight of the dummy CPU action on PM to 1");
+
+      /* FIXME: we shoud use lmm_update_variable_weight() ? */
+      /* FIXME: If we assgign 1.05 and 0.05, the system makes apparently wrong values. */
+      ws_vm->p_action->setPriority(1);
+
+    } else {
+      /* no task exits on this VM */
+      XBT_DEBUG("set the weight of the dummy CPU action on PM to 0");
+
+      ws_vm->p_action->setPriority(0);
+    }
+  }
+}
+
+/************
+ * Resource *
+ ************/
+Workstation::Workstation()
+{
+  surf_callback_emit(workstationCreatedCallbacks, this);
+}
+
+Workstation::Workstation(ModelPtr model, const char *name, xbt_dict_t props,
+                                xbt_dynar_t storage, RoutingEdgePtr netElm, CpuPtr cpu)
+ : Resource(model, name, props)
+ , p_storage(storage), p_netElm(netElm), p_cpu(cpu)
+{
+  p_params.ramsize = 0;
+  surf_callback_emit(workstationCreatedCallbacks, this);
+}
+
+Workstation::Workstation(ModelPtr model, const char *name, xbt_dict_t props, lmm_constraint_t constraint,
+                                        xbt_dynar_t storage, RoutingEdgePtr netElm, CpuPtr cpu)
+ : Resource(model, name, props, constraint)
+ , p_storage(storage), p_netElm(netElm), p_cpu(cpu)
+{
+  p_params.ramsize = 0;
+  surf_callback_emit(workstationCreatedCallbacks, this);
+}
+
+Workstation::~Workstation(){
+  surf_callback_emit(workstationDestructedCallbacks, this);
+}
+
+void Workstation::setState(e_surf_resource_state_t state){
+  Resource::setState(state);
+  surf_callback_emit(workstationStateChangedCallbacks, this);
+}
+
+int Workstation::getCore(){
+  return p_cpu->getCore();
+}
+
+double Workstation::getSpeed(double load){
+  return p_cpu->getSpeed(load);
+}
+
+double Workstation::getAvailableSpeed(){
+  return p_cpu->getAvailableSpeed();
+}
+
+double Workstation::getCurrentPowerPeak()
+{
+  return p_cpu->getCurrentPowerPeak();
+}
+
+double Workstation::getPowerPeakAt(int pstate_index)
+{
+  return p_cpu->getPowerPeakAt(pstate_index);
+}
+
+int Workstation::getNbPstates()
+{
+  return p_cpu->getNbPstates();
+}
+
+void Workstation::setPowerPeakAt(int pstate_index)
+{
+       p_cpu->setPowerPeakAt(pstate_index);
+}
+
+xbt_dict_t Workstation::getProperties()
+{
+  return p_cpu->getProperties();
+}
+
+StoragePtr Workstation::findStorageOnMountList(const char* mount)
+{
+  StoragePtr st = NULL;
+  s_mount_t mnt;
+  unsigned int cursor;
+
+  XBT_DEBUG("Search for storage name '%s' on '%s'", mount, getName());
+  xbt_dynar_foreach(p_storage,cursor,mnt)
+  {
+    XBT_DEBUG("See '%s'",mnt.name);
+    if(!strcmp(mount,mnt.name)){
+      st = static_cast<StoragePtr>(mnt.storage);
+      break;
+    }
+  }
+  if(!st) xbt_die("Can't find mount '%s' for '%s'", mount, getName());
+  return st;
+}
+
+xbt_dict_t Workstation::getStorageList()
+{
+  s_mount_t mnt;
+  unsigned int i;
+  xbt_dict_t storage_list = xbt_dict_new_homogeneous(NULL);
+  char *storage_name = NULL;
+
+  xbt_dynar_foreach(p_storage,i,mnt){
+    storage_name = (char *)static_cast<StoragePtr>(mnt.storage)->getName();
+    xbt_dict_set(storage_list,mnt.name,storage_name,NULL);
+  }
+  return storage_list;
+}
+
+ActionPtr Workstation::open(const char* mount, const char* path) {
+  StoragePtr st = findStorageOnMountList(mount);
+  XBT_DEBUG("OPEN on disk '%s'", st->getName());
+  return st->open(mount, path);
+}
+
+ActionPtr Workstation::close(surf_file_t fd) {
+  StoragePtr st = findStorageOnMountList(fd->mount);
+  XBT_DEBUG("CLOSE on disk '%s'",st->getName());
+  return st->close(fd);
+}
+
+ActionPtr Workstation::read(surf_file_t fd, sg_size_t size) {
+  StoragePtr st = findStorageOnMountList(fd->mount);
+  XBT_DEBUG("READ on disk '%s'",st->getName());
+  return st->read(fd, size);
+}
+
+ActionPtr Workstation::write(surf_file_t fd, sg_size_t size) {
+  StoragePtr st = findStorageOnMountList(fd->mount);
+  XBT_DEBUG("WRITE on disk '%s'",st->getName());
+  return st->write(fd, size);
+}
+
+int Workstation::unlink(surf_file_t fd) {
+  if (!fd){
+    XBT_WARN("No such file descriptor. Impossible to unlink");
+    return 0;
+  } else {
+//    XBT_INFO("%s %zu", fd->storage, fd->size);
+    StoragePtr st = findStorageOnMountList(fd->mount);
+    /* Check if the file is on this storage */
+    if (!xbt_dict_get_or_null(st->p_content, fd->name)){
+      XBT_WARN("File %s is not on disk %s. Impossible to unlink", fd->name,
+          st->getName());
+      return 0;
+    } else {
+      XBT_DEBUG("UNLINK on disk '%s'",st->getName());
+      st->m_usedSize -= fd->size;
+
+      // Remove the file from storage
+      xbt_dict_remove(st->p_content, fd->name);
+
+      free(fd->name);
+      free(fd->mount);
+      xbt_free(fd);
+      return 1;
+    }
+  }
+}
+
+ActionPtr Workstation::ls(const char* mount, const char *path){
+  XBT_DEBUG("LS on mount '%s' and file '%s'", mount, path);
+  StoragePtr st = findStorageOnMountList(mount);
+  return st->ls(path);
+}
+
+sg_size_t Workstation::getSize(surf_file_t fd){
+  return fd->size;
+}
+
+xbt_dynar_t Workstation::getInfo( surf_file_t fd)
+{
+  StoragePtr st = findStorageOnMountList(fd->mount);
+  sg_size_t *psize = xbt_new(sg_size_t, 1);
+  *psize = fd->size;
+  xbt_dynar_t info = xbt_dynar_new(sizeof(void*), NULL);
+  xbt_dynar_push_as(info, sg_size_t *, psize);
+  xbt_dynar_push_as(info, void *, fd->mount);
+  xbt_dynar_push_as(info, void *, (void *)st->getName());
+  xbt_dynar_push_as(info, void *, st->p_typeId);
+  xbt_dynar_push_as(info, void *, st->p_contentType);
+
+  return info;
+}
+
+sg_size_t Workstation::fileTell(surf_file_t fd){
+  return fd->current_position;
+}
+
+int Workstation::fileSeek(surf_file_t fd, sg_size_t offset, int origin){
+
+  switch (origin) {
+  case SEEK_SET:
+    fd->current_position = 0;
+       return MSG_OK;
+  case SEEK_CUR:
+       if(offset > fd->size)
+         offset = fd->size;
+       fd->current_position = offset;
+       return MSG_OK;
+  case SEEK_END:
+       fd->current_position = fd->size;
+       return MSG_OK;
+  default:
+       return MSG_TASK_CANCELED;
+  }
+}
+
+sg_size_t Workstation::getFreeSize(const char* name)
+{
+  StoragePtr st = findStorageOnMountList(name);
+  return st->m_size - st->m_usedSize;
+}
+
+sg_size_t Workstation::getUsedSize(const char* name)
+{
+  StoragePtr st = findStorageOnMountList(name);
+  return st->m_usedSize;
+}
+
+xbt_dynar_t Workstation::getVms()
+{
+  xbt_dynar_t dyn = xbt_dynar_new(sizeof(smx_host_t), NULL);
+
+  /* iterate for all virtual machines */
+  for (WorkstationVMModel::vm_list_t::iterator iter =
+         WorkstationVMModel::ws_vms.begin();
+       iter !=  WorkstationVMModel::ws_vms.end(); ++iter) {
+
+    WorkstationVMPtr ws_vm = &*iter;
+    if (this == ws_vm-> p_subWs)
+      xbt_dynar_push(dyn, &ws_vm->p_subWs);
+  }
+
+  return dyn;
+}
+
+void Workstation::getParams(ws_params_t params)
+{
+  *params = p_params;
+}
+
+void Workstation::setParams(ws_params_t params)
+{
+  /* may check something here. */
+  p_params = *params;
+}
+
+/**********
+ * Action *
+ **********/
+
+void WorkstationAction::setState(e_surf_action_state_t state){
+  Action::setState(state);
+  surf_callback_emit(workstationActionStateChangedCallbacks, this);
+}
diff --git a/src/surf/workstation_interface.hpp b/src/surf/workstation_interface.hpp
new file mode 100644 (file)
index 0000000..d0546b5
--- /dev/null
@@ -0,0 +1,441 @@
+/* Copyright (c) 2004-2014. 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 "surf_interface.hpp"
+#include "storage_interface.hpp"
+#include "cpu_interface.hpp"
+#include "network_interface.hpp"
+
+#ifndef SURF_WORKSTATION_INTERFACE_HPP_
+#define SURF_WORKSTATION_INTERFACE_HPP_
+
+/***********
+ * Classes *
+ ***********/
+
+class WorkstationModel;
+typedef WorkstationModel *WorkstationModelPtr;
+
+class Workstation;
+typedef Workstation *WorkstationPtr;
+
+class WorkstationAction;
+typedef WorkstationAction *WorkstationActionPtr;
+
+/*************
+ * Callbacks *
+ *************/
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after Workstation creation *
+ * @details Callback functions have the following signature: `void(WorkstationPtr)`
+ */
+extern surf_callback(void, WorkstationPtr) workstationCreatedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after Workstation destruction *
+ * @details Callback functions have the following signature: `void(WorkstationPtr)`
+ */
+extern surf_callback(void, WorkstationPtr) workstationDestructedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after Workstation State changed *
+ * @details Callback functions have the following signature: `void(WorkstationActionPtr)`
+ */
+extern surf_callback(void, WorkstationPtr) workstationStateChangedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after WorkstationAction State changed *
+ * @details Callback functions have the following signature: `void(WorkstationActionPtr)`
+ */
+extern surf_callback(void, WorkstationActionPtr) workstationActionStateChangedCallbacks;
+
+/*********
+ * Tools *
+ *********/
+extern WorkstationModelPtr surf_workstation_model;
+
+/*********
+ * Model *
+ *********/
+/** @ingroup SURF_workstation_interface
+ * @brief SURF Workstation model interface class
+ * @details A model is an object which handle the interactions between its Resources and its Actions
+ */
+class WorkstationModel : public Model {
+public:
+    /** 
+   * @brief WorkstationModel constructor
+   * 
+   * @param name the name of the model
+   */
+  WorkstationModel(const char *name);
+
+  /**
+   * @brief WorkstationModel constructor
+   */
+  WorkstationModel();
+
+  /**
+   * @brief WorkstationModel destructor
+   */
+  ~WorkstationModel();
+
+  /**
+   * @brief [brief description]
+   * @details [long description]
+   */
+  virtual void adjustWeightOfDummyCpuActions();
+  
+  /**
+   * @brief [brief description]
+   * @details [long description]
+   * 
+   * @param workstation_nb [description]
+   * @param workstation_list [description]
+   * @param computation_amount [description]
+   * @param communication_amount [description]
+   * @param rate [description]
+   * @return [description]
+   */
+  virtual ActionPtr executeParallelTask(int workstation_nb,
+                                        void **workstation_list,
+                                        double *computation_amount,
+                                        double *communication_amount,
+                                        double rate)=0;
+
+ /**
+  * @brief [brief description]
+  * @details [long description]
+  * 
+  * @param src [description]
+  * @param dst [description]
+  * 
+  * @return [description]
+  */
+ virtual xbt_dynar_t getRoute(WorkstationPtr src, WorkstationPtr dst)=0;
+
+ /**
+  * @brief [brief description]
+  * @details [long description]
+  * 
+  * @param src [description]
+  * @param dst [description]
+  * @param size [description]
+  * @param rate [description]
+  * @return [description]
+  */
+ virtual ActionPtr communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate)=0;
+
+ CpuModelPtr p_cpuModel;
+};
+
+/************
+ * Resource *
+ ************/
+/** @ingroup SURF_workstation_interface
+ * @brief SURF Workstation interface class
+ * @details A workstation VM represent an virtual machine with a aggregation of a Cpu, a NetworkLink and a Storage
+ */
+class Workstation : public Resource {
+public:
+  /**
+   * @brief Workstation consrtuctor
+   */
+  Workstation();
+
+  /**
+   * @brief Workstation constructor
+   * 
+   * @param model WorkstationModel associated to this Workstation
+   * @param name The name of the Workstation
+   * @param props Dictionary of properties associated to this Workstation
+   * @param storage The Storage associated to this Workstation
+   * @param netElm The RoutingEdge associated to this Workstation
+   * @param cpu The Cpu associated to this Workstation
+   */
+  Workstation(ModelPtr model, const char *name, xbt_dict_t props,
+                     xbt_dynar_t storage, RoutingEdgePtr netElm, CpuPtr cpu);
+
+  /**
+   * @brief Workstation constructor
+   * 
+   * @param model WorkstationModel associated to this Workstation
+   * @param name The name of the Workstation
+   * @param props Dictionary of properties associated to this Workstation
+   * @param constraint The lmm constraint associated to this Workstation if it is part of a LMM component
+   * @param storage The Storage associated to this Workstation
+   * @param netElm The RoutingEdge associated to this Workstation
+   * @param cpu The Cpu associated to this Workstation
+   */
+  Workstation(ModelPtr model, const char *name, xbt_dict_t props, lmm_constraint_t constraint,
+                     xbt_dynar_t storage, RoutingEdgePtr netElm, CpuPtr cpu);
+
+  /**
+   * @brief Workstation destructor
+   */
+  ~ Workstation();
+
+  void setState(e_surf_resource_state_t state);
+
+  /**
+   * @brief Get the properties of the currenrt Workstation
+   *
+   * @return The properties of the current Workstation
+   */
+  xbt_dict_t getProperties();
+
+  /**
+   * @brief Execute some quantity of computation
+   * 
+   * @param size The value of the processing amount (in flop) needed to process
+   * @return The CpuAction corresponding to the processing
+   * @see Cpu
+   */
+  virtual ActionPtr execute(double size)=0;
+
+  /**
+   * @brief Make a process sleep for duration seconds
+   * 
+   * @param duration The number of seconds to sleep
+   * @return The CpuAction corresponding to the sleeping
+   * @see Cpu
+   */
+  virtual ActionPtr sleep(double duration)=0;
+
+  /**
+   * @brief Get the number of cores of the associated Cpu
+   * 
+   * @return The number of cores of the associated Cpu
+   * @see Cpu
+   */
+  virtual int getCore();
+
+  /**
+   * @brief Get the speed of the associated Cpu
+   * 
+   * @param load [TODO]
+   * @return The speed of the associated Cpu
+   * @see Cpu
+   */
+  virtual double getSpeed(double load);
+
+  /**
+   * @brief Get the available speed of the associated Cpu
+   * @details [TODO]
+   * 
+   * @return The available speed of the associated Cpu
+   * @see Cpu
+   */
+  virtual double getAvailableSpeed();
+
+  /**
+   * @brief Get the associated Cpu power peak
+   * 
+   * @return The associated Cpu power peak
+   * @see Cpu
+   */
+  virtual double getCurrentPowerPeak();
+
+  virtual double getPowerPeakAt(int pstate_index);
+  virtual int getNbPstates();
+  virtual void setPowerPeakAt(int pstate_index);
+
+  /**
+   * @brief Return the storage of corresponding mount point
+   * 
+   * @param storage The mount point
+   * @return The corresponding Storage
+   */
+  virtual StoragePtr findStorageOnMountList(const char* storage);
+
+  /**
+   * @brief Get the xbt_dict_t of mount_point: Storage
+   * 
+   * @return The xbt_dict_t of mount_point: Storage
+   */
+  virtual xbt_dict_t getStorageList();
+
+  /**
+   * @brief Open a file
+   * 
+   * @param mount The mount point
+   * @param path The path to the file
+   * 
+   * @return The StorageAction corresponding to the opening
+   */
+  virtual ActionPtr open(const char* mount, const char* path);
+
+  /**
+   * @brief Close a file
+   * 
+   * @param fd The file descriptor to close
+   * @return The StorageAction corresponding to the closing
+   */
+  virtual ActionPtr close(surf_file_t fd);
+
+  /**
+   * @brief Unlink a file
+   * @details [long description]
+   * 
+   * @param fd [description]
+   * @return [description]
+   */
+  virtual int unlink(surf_file_t fd);
+
+  /**
+   * @brief List directory contents of a path
+   * @details [long description]
+   * 
+   * @param mount [description]
+   * @param path The path to the directory
+   * @return The StorageAction corresponding to the ls action
+   */
+  virtual ActionPtr ls(const char* mount, const char *path);
+
+  /**
+   * @brief Get the size in bytes of the file
+   * 
+   * @param fd The file descriptor to read
+   * @return The size in bytes of the file
+   */
+  virtual sg_size_t getSize(surf_file_t fd);
+
+  /**
+   * @brief Read a file
+   * 
+   * @param fd The file descriptor to read
+   * @param size The size in bytes to read
+   * @return The StorageAction corresponding to the reading
+   */
+  virtual ActionPtr read(surf_file_t fd, sg_size_t size);
+
+  /**
+   * @brief Write a file
+   * 
+   * @param fd The file descriptor to write
+   * @param size The size in bytes to write
+   * @return The StorageAction corresponding to the writing
+   */
+  virtual ActionPtr write(surf_file_t fd, sg_size_t size);
+
+  /**
+   * @brief Get the informations of a file descriptor
+   * @details The returned xbt_dynar_t contains:
+   *  - the size of the file,
+   *  - the mount point,
+   *  - the storage name,
+   *  - the storage typeId,
+   *  - the storage content type
+   * 
+   * @param fd The file descriptor
+   * @return An xbt_dynar_t with the file informations
+   */
+  virtual xbt_dynar_t getInfo(surf_file_t fd);
+
+  /**
+   * @brief Get the current position of the file descriptor
+   *  
+   * @param fd The file descriptor
+   * @return The current position of the file descriptor
+   */
+  virtual sg_size_t fileTell(surf_file_t fd);
+
+  /**
+   * @brief Get the available space of the storage at the mount point 
+   * 
+   * @param name The mount point
+   * @return The amount of availble space in bytes
+   */
+  virtual sg_size_t getFreeSize(const char* name);
+
+  /**
+   * @brief Get the used space of the storage at the mount point
+   * 
+   * @param name The mount point
+   * @return The amount of used space in bytes
+   */
+  virtual sg_size_t getUsedSize(const char* name);
+
+  /**
+   * @brief Set the position indictator assiociated with the file descriptor to a new position
+   * @details [long description]
+   * 
+   * @param fd The file descriptor
+   * @param offset The offset from the origin
+   * @param origin Position used as a reference for the offset
+   *  - SEEK_SET: beginning of the file
+   *  - SEEK_CUR: current position indicator
+   *  - SEEK_END: end of the file
+   * @return MSG_OK if successful, otherwise MSG_TASK_CANCELED
+   */
+  virtual int fileSeek(surf_file_t fd, sg_size_t offset, int origin);
+
+  xbt_dynar_t p_storage;
+  RoutingEdgePtr p_netElm;
+  CpuPtr p_cpu;
+  NetworkLinkPtr p_network;
+
+  /**
+   * @brief Get the list of virtual machines on the current Workstation
+   * 
+   * @return The list of VMs
+   */
+  xbt_dynar_t getVms();
+
+  /* common with vm */
+  /**
+   * @brief [brief description]
+   * @details [long description]
+   * 
+   * @param params [description]
+   */
+  void getParams(ws_params_t params);
+
+  /**
+   * @brief [brief description]
+   * @details [long description]
+   * 
+   * @param params [description]
+   */
+  void setParams(ws_params_t params);
+  s_ws_params_t p_params;
+};
+
+/**********
+ * Action *
+ **********/
+/** @ingroup SURF_workstation_interface
+ * @brief SURF workstation action interface class
+ */
+class WorkstationAction : public Action {
+public:
+  /**
+   * @brief WorkstationAction constructor
+   * 
+   * @param model The WorkstationModel associated to this WorkstationAction
+   * @param cost The cost of this WorkstationAction in [TODO]
+   * @param failed [description]
+   */
+  WorkstationAction(ModelPtr model, double cost, bool failed)
+  : Action(model, cost, failed) {}
+
+  /**
+   * @brief WorkstationAction constructor
+   * 
+   * @param model The WorkstationModel associated to this WorkstationAction
+   * @param cost The cost of this WorkstationAction in [TODO]
+   * @param failed [description]
+   * @param var The lmm variable associated to this StorageAction if it is part of a LMM component
+   */
+  WorkstationAction(ModelPtr model, double cost, bool failed, lmm_variable_t var)
+  : Action(model, cost, failed, var) {}
+
+  void setState(e_surf_action_state_t state);
+};
+
+
+#endif /* SURF_WORKSTATION_INTERFACE_HPP_ */
diff --git a/src/surf/workstation_ptask_L07.c b/src/surf/workstation_ptask_L07.c
deleted file mode 100644 (file)
index e6d026b..0000000
+++ /dev/null
@@ -1,966 +0,0 @@
-/* Copyright (c) 2007-2013. 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/str.h"
-#include "xbt/dict.h"
-#include "surf_private.h"
-#include "surf/surf_resource.h"
-//#include "surf/surf_resource_lmm.h"
-
-typedef enum {
-  SURF_WORKSTATION_RESOURCE_CPU,
-  SURF_WORKSTATION_RESOURCE_LINK
-} e_surf_workstation_model_type_t;
-
-/**************************************/
-/********* cpu object *****************/
-/**************************************/
-typedef struct cpu_L07 {
-  s_surf_resource_t generic_resource;   /* Do not move this field: must match surf_resource_t */
-  e_surf_workstation_model_type_t type; /* Do not move this field: must match link_L07_t */
-  lmm_constraint_t constraint;  /* Do not move this field: must match link_L07_t */
-  double power_scale;
-  double power_current;
-  tmgr_trace_event_t power_event;
-  tmgr_trace_event_t state_event;
-  e_surf_resource_state_t state_current;
-  sg_routing_edge_t info;
-} s_cpu_L07_t, *cpu_L07_t;
-
-/**************************************/
-/*********** network object ***********/
-/**************************************/
-
-typedef struct link_L07 {
-  s_surf_resource_t generic_resource;   /* Do not move this field: must match surf_resource_t */
-  e_surf_workstation_model_type_t type; /* Do not move this field: must match cpu_L07_t */
-  lmm_constraint_t constraint;  /* Do not move this field: must match cpu_L07_t */
-  double lat_current;
-  tmgr_trace_event_t lat_event;
-  double bw_current;
-  tmgr_trace_event_t bw_event;
-  e_surf_resource_state_t state_current;
-  tmgr_trace_event_t state_event;
-} s_link_L07_t, *link_L07_t;
-
-/**************************************/
-/*************** actions **************/
-/**************************************/
-typedef struct surf_action_workstation_L07 {
-  s_surf_action_t generic_action;
-  lmm_variable_t variable;
-  int workstation_nb;
-  cpu_L07_t *workstation_list;
-  double *computation_amount;
-  double *communication_amount;
-  double latency;
-  double rate;
-  int suspended;
-} s_surf_action_workstation_L07_t, *surf_action_workstation_L07_t;
-
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_workstation);
-
-static int ptask_host_count = 0;
-static xbt_dict_t ptask_parallel_task_link_set = NULL;
-lmm_system_t ptask_maxmin_system = NULL;
-
-static surf_action_t die_impossible_communicate (sg_routing_edge_t src,
-                                                 sg_routing_edge_t dst,
-                                                 double size, double rate)
-{
-  DIE_IMPOSSIBLE;
-  return NULL;
-}
-
-static xbt_dynar_t die_impossible_get_route(void *src, void *dst)
-{
-  DIE_IMPOSSIBLE;
-  return NULL;
-}
-
-static void ptask_update_action_bound(surf_action_workstation_L07_t action)
-{
-  int workstation_nb = action->workstation_nb;
-  double lat_current = 0.0;
-  double lat_bound = -1.0;
-  int i, j;
-
-  for (i = 0; i < workstation_nb; i++) {
-    for (j = 0; j < workstation_nb; j++) {
-      xbt_dynar_t route=NULL;
-
-      if (action->communication_amount[i * workstation_nb + j] > 0) {
-        double lat = 0.0;
-        routing_get_route_and_latency(((cpu_L07_t)surf_workstation_resource_priv(action->workstation_list[i]))->info,
-            ((cpu_L07_t)surf_workstation_resource_priv(action->workstation_list[j]))->info,
-            &route, &lat);
-        lat_current =
-            MAX(lat_current,
-                lat * action->communication_amount[i * workstation_nb + j]);
-      }
-    }
-  }
-  lat_bound = sg_tcp_gamma / (2.0 * lat_current);
-  XBT_DEBUG("action (%p) : lat_bound = %g", action, lat_bound);
-  if ((action->latency == 0.0) && (action->suspended == 0)) {
-    if (action->rate < 0)
-      lmm_update_variable_bound(ptask_maxmin_system, action->variable,
-                                lat_bound);
-    else
-      lmm_update_variable_bound(ptask_maxmin_system, action->variable,
-                                min(action->rate, lat_bound));
-  }
-}
-
-/**************************************/
-/******* Resource Public     **********/
-/**************************************/
-
-static int ptask_action_unref(surf_action_t action)
-{
-  action->refcount--;
-
-  if (!action->refcount) {
-    xbt_swag_remove(action, action->state_set);
-    if (((surf_action_workstation_L07_t) action)->variable)
-      lmm_variable_free(ptask_maxmin_system,
-                        ((surf_action_workstation_L07_t)
-                         action)->variable);
-    free(((surf_action_workstation_L07_t) action)->workstation_list);
-    free(((surf_action_workstation_L07_t) action)->communication_amount);
-    free(((surf_action_workstation_L07_t) action)->computation_amount);
-#ifdef HAVE_TRACING
-    xbt_free(action->category);
-#endif
-    surf_action_free(&action);
-    return 1;
-  }
-  return 0;
-}
-
-static void ptask_action_cancel(surf_action_t action)
-{
-  surf_action_state_set(action, SURF_ACTION_FAILED);
-  return;
-}
-
-/* action_change_state is inherited from the surf module */
-/* action_set_data is inherited from the surf module */
-
-static void ptask_action_suspend(surf_action_t action)
-{
-  XBT_IN("(%p))", action);
-  if (((surf_action_workstation_L07_t) action)->suspended != 2) {
-    ((surf_action_workstation_L07_t) action)->suspended = 1;
-    lmm_update_variable_weight(ptask_maxmin_system,
-                               ((surf_action_workstation_L07_t)
-                                action)->variable, 0.0);
-  }
-  XBT_OUT();
-}
-
-static void ptask_action_resume(surf_action_t action)
-{
-  surf_action_workstation_L07_t act =
-      (surf_action_workstation_L07_t) action;
-
-  XBT_IN("(%p)", act);
-  if (act->suspended != 2) {
-    lmm_update_variable_weight(ptask_maxmin_system, act->variable, 1.0);
-    act->suspended = 0;
-  }
-  XBT_OUT();
-}
-
-static int ptask_action_is_suspended(surf_action_t action)
-{
-  return (((surf_action_workstation_L07_t) action)->suspended == 1);
-}
-
-static void ptask_action_set_max_duration(surf_action_t action,
-                                          double duration)
-{                               /* FIXME: should inherit */
-  XBT_IN("(%p,%g)", action, duration);
-  action->max_duration = duration;
-  XBT_OUT();
-}
-
-
-static void ptask_action_set_priority(surf_action_t action,
-                                      double priority)
-{                               /* FIXME: should inherit */
-  XBT_IN("(%p,%g)", action, priority);
-  action->priority = priority;
-  XBT_OUT();
-}
-
-static double ptask_action_get_remains(surf_action_t action)
-{
-  XBT_IN("(%p)", action);
-  XBT_OUT();
-  return action->remains;
-}
-
-/**************************************/
-/******* Resource Private    **********/
-/**************************************/
-
-static int ptask_resource_used(void *resource_id)
-{
-  /* We can freely cast as a link_L07_t because it has
-     the same prefix as cpu_L07_t */
-  return lmm_constraint_used(ptask_maxmin_system,
-                             ((link_L07_t) resource_id)->constraint);
-
-}
-
-static double ptask_share_resources(double now)
-{
-  s_surf_action_workstation_L07_t s_action;
-  surf_action_workstation_L07_t action = NULL;
-
-  xbt_swag_t running_actions =
-      surf_workstation_model->states.running_action_set;
-  double min = generic_maxmin_share_resources(running_actions,
-                                              xbt_swag_offset(s_action,
-                                                              variable),
-                                              ptask_maxmin_system,
-                                              bottleneck_solve);
-
-  xbt_swag_foreach(action, running_actions) {
-    if (action->latency > 0) {
-      if (min < 0) {
-        min = action->latency;
-        XBT_DEBUG("Updating min (value) with %p (start %f): %f", action,
-               action->generic_action.start, min);
-      } else if (action->latency < min) {
-        min = action->latency;
-        XBT_DEBUG("Updating min (latency) with %p (start %f): %f", action,
-               action->generic_action.start, min);
-      }
-    }
-  }
-
-  XBT_DEBUG("min value : %f", min);
-
-  return min;
-}
-
-static void ptask_update_actions_state(double now, double delta)
-{
-  double deltap = 0.0;
-  surf_action_workstation_L07_t action = NULL;
-  surf_action_workstation_L07_t next_action = NULL;
-  xbt_swag_t running_actions =
-      surf_workstation_model->states.running_action_set;
-
-  xbt_swag_foreach_safe(action, next_action, running_actions) {
-    deltap = delta;
-    if (action->latency > 0) {
-      if (action->latency > deltap) {
-        double_update(&(action->latency), deltap);
-        deltap = 0.0;
-      } else {
-        double_update(&(deltap), action->latency);
-        action->latency = 0.0;
-      }
-      if ((action->latency == 0.0) && (action->suspended == 0)) {
-        ptask_update_action_bound(action);
-        lmm_update_variable_weight(ptask_maxmin_system, action->variable,
-                                   1.0);
-      }
-    }
-    XBT_DEBUG("Action (%p) : remains (%g) updated by %g.",
-           action, action->generic_action.remains,
-           lmm_variable_getvalue(action->variable) * delta);
-    double_update(&(action->generic_action.remains),
-                  lmm_variable_getvalue(action->variable) * delta);
-
-    if (action->generic_action.max_duration != NO_MAX_DURATION)
-      double_update(&(action->generic_action.max_duration), delta);
-
-    XBT_DEBUG("Action (%p) : remains (%g).",
-           action, action->generic_action.remains);
-    if ((action->generic_action.remains <= 0) &&
-        (lmm_get_variable_weight(action->variable) > 0)) {
-      action->generic_action.finish = surf_get_clock();
-      surf_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
-    } else if ((action->generic_action.max_duration != NO_MAX_DURATION) &&
-               (action->generic_action.max_duration <= 0)) {
-      action->generic_action.finish = surf_get_clock();
-      surf_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
-    } else {
-      /* Need to check that none of the model has failed */
-      lmm_constraint_t cnst = NULL;
-      int i = 0;
-      void *constraint_id = NULL;
-
-      while ((cnst =
-              lmm_get_cnst_from_var(ptask_maxmin_system, action->variable,
-                                    i++))) {
-        constraint_id = lmm_constraint_id(cnst);
-
-/*   if(((link_L07_t)constraint_id)->type== */
-/*      SURF_WORKSTATION_RESOURCE_LINK) { */
-/*     XBT_DEBUG("Checking for link %s (%p)", */
-/*      ((link_L07_t)constraint_id)->name, */
-/*      ((link_L07_t)constraint_id)); */
-/*   } */
-/*   if(((cpu_L07_t)constraint_id)->type== */
-/*      SURF_WORKSTATION_RESOURCE_CPU) { */
-/*     XBT_DEBUG("Checking for cpu %s (%p) : %s", */
-/*      ((cpu_L07_t)constraint_id)->name, */
-/*      ((cpu_L07_t)constraint_id), */
-/*      ((cpu_L07_t)constraint_id)->state_current==SURF_CPU_OFF?"Off":"On"); */
-/*   } */
-
-        if (((((link_L07_t) constraint_id)->type ==
-              SURF_WORKSTATION_RESOURCE_LINK) &&
-             (((link_L07_t) constraint_id)->state_current ==
-              SURF_RESOURCE_OFF)) ||
-            ((((cpu_L07_t) constraint_id)->type ==
-              SURF_WORKSTATION_RESOURCE_CPU) &&
-             (((cpu_L07_t) constraint_id)->state_current ==
-              SURF_RESOURCE_OFF))) {
-          XBT_DEBUG("Action (%p) Failed!!", action);
-          action->generic_action.finish = surf_get_clock();
-          surf_action_state_set((surf_action_t) action,
-                                SURF_ACTION_FAILED);
-          break;
-        }
-      }
-    }
-  }
-  return;
-}
-
-static void ptask_update_resource_state(void *id,
-                                        tmgr_trace_event_t event_type,
-                                        double value, double date)
-{
-  cpu_L07_t cpu = id;
-  link_L07_t nw_link = id;
-
-  if (nw_link->type == SURF_WORKSTATION_RESOURCE_LINK) {
-    XBT_DEBUG("Updating link %s (%p) with value=%f for date=%g",
-      surf_resource_name(nw_link), nw_link, value, date);
-    if (event_type == nw_link->bw_event) {
-      nw_link->bw_current = value;
-      lmm_update_constraint_bound(ptask_maxmin_system, nw_link->constraint,
-                                  nw_link->bw_current);
-      if (tmgr_trace_event_free(event_type))
-        nw_link->bw_event = NULL;
-    } else if (event_type == nw_link->lat_event) {
-      lmm_variable_t var = NULL;
-      surf_action_workstation_L07_t action = NULL;
-      lmm_element_t elem = NULL;
-
-      nw_link->lat_current = value;
-      while ((var = lmm_get_var_from_cnst
-              (ptask_maxmin_system, nw_link->constraint, &elem))) {
-
-
-        action = lmm_variable_id(var);
-        ptask_update_action_bound(action);
-      }
-      if (tmgr_trace_event_free(event_type))
-        nw_link->lat_event = NULL;
-
-    } else if (event_type == nw_link->state_event) {
-      if (value > 0)
-        nw_link->state_current = SURF_RESOURCE_ON;
-      else
-        nw_link->state_current = SURF_RESOURCE_OFF;
-      if (tmgr_trace_event_free(event_type))
-        nw_link->state_event = NULL;
-    } else {
-      XBT_CRITICAL("Unknown event ! \n");
-      xbt_abort();
-    }
-    return;
-  } else if (cpu->type == SURF_WORKSTATION_RESOURCE_CPU) {
-    XBT_DEBUG("Updating cpu %s (%p) with value %g", surf_resource_name(cpu),
-           cpu, value);
-    if (event_type == cpu->power_event) {
-      cpu->power_current = value;
-      lmm_update_constraint_bound(ptask_maxmin_system, cpu->constraint,
-                                  cpu->power_current * cpu->power_scale);
-      if (tmgr_trace_event_free(event_type))
-        cpu->power_event = NULL;
-    } else if (event_type == cpu->state_event) {
-      if (value > 0)
-        cpu->state_current = SURF_RESOURCE_ON;
-      else
-        cpu->state_current = SURF_RESOURCE_OFF;
-      if (tmgr_trace_event_free(event_type))
-        cpu->state_event = NULL;
-    } else {
-      XBT_CRITICAL("Unknown event ! \n");
-      xbt_abort();
-    }
-    return;
-  } else {
-    DIE_IMPOSSIBLE;
-  }
-  return;
-}
-
-static void ptask_finalize(void)
-{
-  xbt_dict_free(&ptask_parallel_task_link_set);
-
-  surf_model_exit(surf_workstation_model);
-  surf_workstation_model = NULL;
-  surf_model_exit(surf_network_model);
-  surf_network_model = NULL;
-
-  ptask_host_count = 0;
-
-  if (ptask_maxmin_system) {
-    lmm_system_free(ptask_maxmin_system);
-    ptask_maxmin_system = NULL;
-  }
-}
-
-/**************************************/
-/******* Resource Private    **********/
-/**************************************/
-
-static e_surf_resource_state_t ptask_resource_get_state(void *cpu)
-{
-  return ((cpu_L07_t)surf_workstation_resource_priv(cpu))->state_current;
-}
-
-static double ptask_get_speed(void *cpu, double load)
-{
-  return load * ((cpu_L07_t)surf_workstation_resource_priv(cpu))->power_scale;
-}
-
-static double ptask_get_available_speed(void *cpu)
-{
-  return ((cpu_L07_t)surf_workstation_resource_priv(cpu))->power_current;
-}
-
-static double ws_get_current_power_peak(void *cpu)
-{
-  return ((cpu_L07_t)surf_workstation_resource_priv(cpu))->power_current;
-}
-
-static double ws_get_power_peak_at(void *cpu, int pstate_index)
-{
-       XBT_DEBUG("[ws_get_power_peak_at] Not implemented for workstation_ptask_L07");
-       return 0.0;
-}
-
-static int ws_get_nb_pstates(void *workstation)
-{
-       XBT_DEBUG("[ws_get_nb_pstates] Not implemented for workstation_ptask_L07");
-       return 0.0;
-}
-
-static void ws_set_power_peak_at(void *cpu, int pstate_index)
-{
-       XBT_DEBUG("[ws_set_power_peak_at] Not implemented for workstation_ptask_L07");
-}
-
-static double ws_get_consumed_energy(void *cpu)
-{
-       XBT_DEBUG("[ws_get_consumed_energy] Not implemented for workstation_ptask_L07");
-       return 0.0;
-}
-
-static surf_action_t ptask_execute_parallel_task(int workstation_nb,
-                                                 void **workstation_list,
-                                                 double
-                                                 *computation_amount, double
-                                                 *communication_amount,
-                                                 double rate)
-{
-  surf_action_workstation_L07_t action = NULL;
-  int i, j;
-  unsigned int cpt;
-  int nb_link = 0;
-  int nb_host = 0;
-  double latency = 0.0;
-
-  if (ptask_parallel_task_link_set == NULL)
-    ptask_parallel_task_link_set = xbt_dict_new_homogeneous(NULL);
-
-  xbt_dict_reset(ptask_parallel_task_link_set);
-
-  /* Compute the number of affected resources... */
-  for (i = 0; i < workstation_nb; i++) {
-    for (j = 0; j < workstation_nb; j++) {
-      xbt_dynar_t route=NULL;
-
-      if (communication_amount[i * workstation_nb + j] > 0) {
-        double lat=0.0;
-        unsigned int cpt;
-        link_L07_t link;
-
-        routing_get_route_and_latency(
-            ((cpu_L07_t)surf_workstation_resource_priv(workstation_list[i]))->info,
-            ((cpu_L07_t)surf_workstation_resource_priv(workstation_list[j]))->info,
-            &route,&lat);
-        latency = MAX(latency, lat);
-
-        xbt_dynar_foreach(route, cpt, link) {
-           xbt_dict_set(ptask_parallel_task_link_set,link->generic_resource.name,link,NULL);
-        }
-      }
-    }
-  }
-
-  nb_link = xbt_dict_length(ptask_parallel_task_link_set);
-  xbt_dict_reset(ptask_parallel_task_link_set);
-
-  for (i = 0; i < workstation_nb; i++)
-    if (computation_amount[i] > 0)
-      nb_host++;
-
-  action =
-      surf_action_new(sizeof(s_surf_action_workstation_L07_t), 1,
-                      surf_workstation_model, 0);
-  XBT_DEBUG("Creating a parallel task (%p) with %d cpus and %d links.",
-         action, workstation_nb, nb_link);
-  action->suspended = 0;        /* Should be useless because of the
-                                   calloc but it seems to help valgrind... */
-  action->workstation_nb = workstation_nb;
-  action->workstation_list = (cpu_L07_t *) workstation_list;
-  action->computation_amount = computation_amount;
-  action->communication_amount = communication_amount;
-  action->latency = latency;
-  action->rate = rate;
-
-  action->variable =
-      lmm_variable_new(ptask_maxmin_system, action, 1.0,
-                       (action->rate > 0) ? action->rate : -1.0,
-                       workstation_nb + nb_link);
-
-  if (action->latency > 0)
-    lmm_update_variable_weight(ptask_maxmin_system, action->variable, 0.0);
-
-  for (i = 0; i < workstation_nb; i++)
-    lmm_expand(ptask_maxmin_system,
-               ((cpu_L07_t)surf_workstation_resource_priv(workstation_list[i]))->constraint,
-               action->variable, computation_amount[i]);
-
-  for (i = 0; i < workstation_nb; i++) {
-    for (j = 0; j < workstation_nb; j++) {
-      link_L07_t link;
-      xbt_dynar_t route=NULL;
-      if (communication_amount[i * workstation_nb + j] == 0.0)
-        continue;
-
-      routing_get_route_and_latency(
-          ((cpu_L07_t)surf_workstation_resource_priv(workstation_list[i]))->info,
-          ((cpu_L07_t)surf_workstation_resource_priv(workstation_list[j]))->info,
-          &route,NULL);
-
-      xbt_dynar_foreach(route, cpt, link) {
-        lmm_expand_add(ptask_maxmin_system, link->constraint,
-                       action->variable,
-                       communication_amount[i * workstation_nb + j]);
-      }
-    }
-  }
-
-  if (nb_link + nb_host == 0) {
-    action->generic_action.cost = 1.0;
-    action->generic_action.remains = 0.0;
-  }
-
-  return (surf_action_t) action;
-}
-
-static surf_action_t ptask_execute(void *cpu, double size)
-{
-  void **workstation_list = xbt_new0(void *, 1);
-  double *computation_amount = xbt_new0(double, 1);
-  double *communication_amount = xbt_new0(double, 1);
-
-  workstation_list[0] = cpu;
-  communication_amount[0] = 0.0;
-  computation_amount[0] = size;
-
-  return ptask_execute_parallel_task(1, workstation_list,
-                                     computation_amount,
-                                     communication_amount, -1);
-}
-
-static surf_action_t ptask_communicate(void *src, void *dst, double size,
-                                       double rate)
-{
-  void **workstation_list = xbt_new0(void *, 2);
-  double *computation_amount = xbt_new0(double, 2);
-  double *communication_amount = xbt_new0(double, 4);
-  surf_action_t res = NULL;
-
-  workstation_list[0] = src;
-  workstation_list[1] = dst;
-  communication_amount[1] = size;
-
-  res = ptask_execute_parallel_task(2, workstation_list,
-                                    computation_amount,
-                                    communication_amount, rate);
-
-  return res;
-}
-
-static surf_action_t ptask_action_sleep(void *cpu, double duration)
-{
-  surf_action_workstation_L07_t action = NULL;
-
-  XBT_IN("(%s,%g)", surf_resource_name(cpu), duration);
-
-  action = (surf_action_workstation_L07_t) ptask_execute(cpu, 1.0);
-  action->generic_action.max_duration = duration;
-  action->suspended = 2;
-  lmm_update_variable_weight(ptask_maxmin_system, action->variable, 0.0);
-
-  XBT_OUT();
-  return (surf_action_t) action;
-}
-
-static xbt_dynar_t ptask_get_route(void *src, void *dst) // FIXME: kill that callback kind?
-{
-  xbt_dynar_t route=NULL;
-  routing_get_route_and_latency(
-      ((cpu_L07_t)surf_workstation_resource_priv(src))->info, ((cpu_L07_t)surf_workstation_resource_priv(dst))->info,
-      &route,NULL);
-  return route;
-}
-
-static double ptask_get_link_bandwidth(const void *link)
-{
-  return ((link_L07_t) link)->bw_current;
-}
-
-static double ptask_get_link_latency(const void *link)
-{
-  return ((link_L07_t) link)->lat_current;
-}
-
-static int ptask_link_shared(const void *link)
-{
-  return lmm_constraint_is_shared(((link_L07_t) link)->constraint);
-}
-
-/**************************************/
-/*** Resource Creation & Destruction **/
-/**************************************/
-
-static void* ptask_cpu_create_resource(const char *name, double power_scale,
-                               double power_initial,
-                               tmgr_trace_t power_trace,
-                               e_surf_resource_state_t state_initial,
-                               tmgr_trace_t state_trace,
-                               xbt_dict_t cpu_properties)
-{
-  cpu_L07_t cpu = NULL;
-  xbt_assert(!surf_workstation_resource_priv(surf_workstation_resource_by_name(name)),
-              "Host '%s' declared several times in the platform file.",
-              name);
-
-  cpu = (cpu_L07_t) surf_resource_new(sizeof(s_cpu_L07_t),
-          surf_workstation_model, name,cpu_properties, NULL);
-
-  cpu->type = SURF_WORKSTATION_RESOURCE_CPU;
-  cpu->info = xbt_lib_get_or_null(host_lib, name, ROUTING_HOST_LEVEL);
-  if(!(cpu->info)) xbt_die("Don't find ROUTING_HOST_LEVEL for '%s'",name);
-
-  cpu->power_scale = power_scale;
-  xbt_assert(cpu->power_scale > 0, "Power has to be >0");
-
-  cpu->power_current = power_initial;
-  if (power_trace)
-    cpu->power_event =
-        tmgr_history_add_trace(history, power_trace, 0.0, 0, cpu);
-
-  cpu->state_current = state_initial;
-  if (state_trace)
-    cpu->state_event =
-        tmgr_history_add_trace(history, state_trace, 0.0, 0, cpu);
-
-  cpu->constraint =
-      lmm_constraint_new(ptask_maxmin_system, cpu,
-                         cpu->power_current * cpu->power_scale);
-
-  xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, cpu);
-
-  return xbt_lib_get_elm_or_null(host_lib, name);
-}
-
-static void ptask_parse_cpu_init(sg_platf_host_cbarg_t host)
-{
-  double power_peak = xbt_dynar_get_as(host->power_peak, host->pstate, double);
- //cpu->power_peak = power_peak;
-  xbt_dynar_free(&(host->power_peak));  /* kill memory leak */
-  ptask_cpu_create_resource(
-      host->id,
-      power_peak,
-      host->power_scale,
-      host->power_trace,
-      host->initial_state,
-      host->state_trace,
-      host->properties);
-}
-
-static void* ptask_link_create_resource(const char *name,
-                                 double bw_initial,
-                                 tmgr_trace_t bw_trace,
-                                 double lat_initial,
-                                 tmgr_trace_t lat_trace,
-                                 e_surf_resource_state_t
-                                 state_initial,
-                                 tmgr_trace_t state_trace,
-                                 e_surf_link_sharing_policy_t
-                                 policy, xbt_dict_t properties)
-{
-  link_L07_t nw_link = xbt_new0(s_link_L07_t, 1);
-  xbt_assert(!xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL),
-              "Link '%s' declared several times in the platform file.",
-              name);
-
-  nw_link->generic_resource.model = surf_workstation_model;
-  nw_link->generic_resource.properties = properties;
-  nw_link->generic_resource.name = xbt_strdup(name);
-  nw_link->type = SURF_WORKSTATION_RESOURCE_LINK;
-  nw_link->bw_current = bw_initial;
-  if (bw_trace)
-    nw_link->bw_event =
-        tmgr_history_add_trace(history, bw_trace, 0.0, 0, nw_link);
-  nw_link->state_current = state_initial;
-  nw_link->lat_current = lat_initial;
-  if (lat_trace)
-    nw_link->lat_event =
-        tmgr_history_add_trace(history, lat_trace, 0.0, 0, nw_link);
-  if (state_trace)
-    nw_link->state_event =
-        tmgr_history_add_trace(history, state_trace, 0.0, 0, nw_link);
-
-  nw_link->constraint =
-      lmm_constraint_new(ptask_maxmin_system, nw_link,
-                         nw_link->bw_current);
-
-  if (policy == SURF_LINK_FATPIPE)
-    lmm_constraint_shared(nw_link->constraint);
-
-  xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, nw_link);
-  return nw_link;
-}
-
-static void ptask_parse_link_init(sg_platf_link_cbarg_t link)
-{
-  if (link->policy == SURF_LINK_FULLDUPLEX) {
-    char *link_id;
-    link_id = bprintf("%s_UP", link->id);
-    ptask_link_create_resource(link_id,
-                               link->bandwidth,
-                               link->bandwidth_trace,
-                               link->latency,
-                               link->latency_trace,
-                               link->state,
-                               link->state_trace,
-                               link->policy,
-                               link->properties);
-    xbt_free(link_id);
-    link_id = bprintf("%s_DOWN", link->id);
-    ptask_link_create_resource(link_id,
-                               link->bandwidth,
-                               link->bandwidth_trace,
-                               link->latency,
-                               link->latency_trace,
-                               link->state,
-                               link->state_trace,
-                               link->policy,
-                               NULL); /* FIXME: We need to deep copy the
-                                       * properties or we won't be able to free
-                                       * it */
-    xbt_free(link_id);
-  } else {
-    ptask_link_create_resource(link->id,
-                               link->bandwidth,
-                               link->bandwidth_trace,
-                               link->latency,
-                               link->latency_trace,
-                               link->state,
-                               link->state_trace,
-                               link->policy,
-                               link->properties);
-  }
-
-  current_property_set = NULL;
-}
-
-static void ptask_add_traces(void)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *trace_name, *elm;
-
-  if (!trace_connect_list_host_avail)
-    return;
-
-  /* Connect traces relative to cpu */
-  xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
-    tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
-    cpu_L07_t host = surf_workstation_resource_priv(surf_workstation_resource_by_name(elm));
-
-    xbt_assert(host, "Host %s undefined", elm);
-    xbt_assert(trace, "Trace %s undefined", trace_name);
-
-    host->state_event =
-        tmgr_history_add_trace(history, trace, 0.0, 0, host);
-  }
-
-  xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) {
-    tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
-    cpu_L07_t host = surf_workstation_resource_priv(surf_workstation_resource_by_name(elm));
-
-    xbt_assert(host, "Host %s undefined", elm);
-    xbt_assert(trace, "Trace %s undefined", trace_name);
-
-    host->power_event =
-        tmgr_history_add_trace(history, trace, 0.0, 0, host);
-  }
-
-  /* Connect traces relative to network */
-  xbt_dict_foreach(trace_connect_list_link_avail, cursor, trace_name, elm) {
-    tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
-    link_L07_t link =
-        xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL);
-
-    xbt_assert(link, "Link %s undefined", elm);
-    xbt_assert(trace, "Trace %s undefined", trace_name);
-
-    link->state_event =
-        tmgr_history_add_trace(history, trace, 0.0, 0, link);
-  }
-
-  xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) {
-    tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
-    link_L07_t link =
-        xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL);
-
-    xbt_assert(link, "Link %s undefined", elm);
-    xbt_assert(trace, "Trace %s undefined", trace_name);
-
-    link->bw_event = tmgr_history_add_trace(history, trace, 0.0, 0, link);
-  }
-
-  xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) {
-    tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
-    link_L07_t link =
-        xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL);
-
-    xbt_assert(link, "Link %s undefined", elm);
-    xbt_assert(trace, "Trace %s undefined", trace_name);
-
-    link->lat_event = tmgr_history_add_trace(history, trace, 0.0, 0, link);
-  }
-}
-
-static void ptask_define_callbacks()
-{
-  sg_platf_host_add_cb(ptask_parse_cpu_init);
-  sg_platf_link_add_cb(ptask_parse_link_init);
-  sg_platf_postparse_add_cb(ptask_add_traces);
-}
-
-/**************************************/
-/********* Module  creation ***********/
-/**************************************/
-
-static void ptask_model_init_internal(void)
-{
-  surf_workstation_model = surf_model_init();
-
-  surf_workstation_model->action_unref = ptask_action_unref;
-  surf_workstation_model->action_cancel = ptask_action_cancel;
-  surf_workstation_model->action_state_set = surf_action_state_set;
-  surf_workstation_model->suspend = ptask_action_suspend;
-  surf_workstation_model->resume = ptask_action_resume;
-  surf_workstation_model->is_suspended = ptask_action_is_suspended;
-  surf_workstation_model->set_max_duration = ptask_action_set_max_duration;
-  surf_workstation_model->set_priority = ptask_action_set_priority;
-  surf_workstation_model->get_remains = ptask_action_get_remains;
-  surf_workstation_model->name = "Workstation ptask_L07";
-
-  surf_workstation_model->model_private->resource_used =
-      ptask_resource_used;
-  surf_workstation_model->model_private->share_resources =
-      ptask_share_resources;
-  surf_workstation_model->model_private->update_actions_state =
-      ptask_update_actions_state;
-  surf_workstation_model->model_private->update_resource_state =
-      ptask_update_resource_state;
-  surf_workstation_model->model_private->finalize = ptask_finalize;
-
-
-  surf_workstation_model->extension.workstation.execute = ptask_execute;
-  surf_workstation_model->extension.workstation.sleep = ptask_action_sleep;
-  surf_workstation_model->extension.workstation.get_state =
-      ptask_resource_get_state;
-  surf_workstation_model->extension.workstation.get_speed =
-      ptask_get_speed;
-  surf_workstation_model->extension.workstation.get_available_speed =
-      ptask_get_available_speed;
-  surf_workstation_model->extension.workstation.get_current_power_peak = ws_get_current_power_peak;
-  surf_workstation_model->extension.workstation.get_power_peak_at = ws_get_power_peak_at;
-  surf_workstation_model->extension.workstation.get_nb_pstates = ws_get_nb_pstates;
-  surf_workstation_model->extension.workstation.set_power_peak_at = ws_set_power_peak_at;
-  surf_workstation_model->extension.workstation.get_consumed_energy = ws_get_consumed_energy;
-
-  surf_workstation_model->extension.workstation.communicate =
-      ptask_communicate;
-  surf_workstation_model->extension.workstation.get_route =
-      ptask_get_route;
-  surf_workstation_model->extension.workstation.execute_parallel_task =
-      ptask_execute_parallel_task;
-  surf_workstation_model->extension.workstation.get_link_bandwidth =
-      ptask_get_link_bandwidth;
-  surf_workstation_model->extension.workstation.get_link_latency =
-      ptask_get_link_latency;
-  surf_workstation_model->extension.workstation.link_shared =
-      ptask_link_shared;
-  surf_workstation_model->extension.workstation.get_properties =
-      surf_resource_properties;
-  surf_workstation_model->extension.workstation.add_traces =
-      ptask_add_traces;
-
-  if (!ptask_maxmin_system)
-    ptask_maxmin_system = lmm_system_new(1);
-
-  routing_model_create(ptask_link_create_resource("__loopback__",
-                                                  498000000, NULL,
-                                                  0.000015, NULL,
-                                                  SURF_RESOURCE_ON, NULL,
-                                                  SURF_LINK_FATPIPE, NULL));
-
-  surf_network_model = surf_model_init();
-
-  surf_network_model->extension.network.communicate = die_impossible_communicate;
-  surf_network_model->extension.network.get_route = die_impossible_get_route;
-  surf_network_model->extension.network.get_link_bandwidth = ptask_get_link_bandwidth;
-  surf_network_model->extension.network.get_link_latency = ptask_get_link_latency;
-  surf_network_model->extension.network.link_shared = ptask_link_shared;
-  surf_network_model->extension.network.add_traces = NULL;
-}
-
-/**************************************/
-/*************** Generic **************/
-/**************************************/
-void surf_workstation_model_init_ptask_L07(void)
-{
-  XBT_INFO("surf_workstation_model_init_ptask_L07");
-  xbt_assert(!surf_cpu_model, "CPU model type already defined");
-  xbt_assert(!surf_network_model, "network model type already defined");
-  ptask_define_callbacks();
-  ptask_model_init_internal();
-  xbt_dynar_push(model_list, &surf_workstation_model);
-}
diff --git a/src/surf/workstation_ptask_L07.cpp b/src/surf/workstation_ptask_L07.cpp
new file mode 100644 (file)
index 0000000..f44c1a1
--- /dev/null
@@ -0,0 +1,824 @@
+/* Copyright (c) 2007-2010, 2013-2014. 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 "workstation_ptask_L07.hpp"
+#include "cpu_interface.hpp"
+#include "surf_routing.hpp"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_workstation);
+
+static int ptask_host_count = 0;
+static xbt_dict_t ptask_parallel_task_link_set = NULL;
+lmm_system_t ptask_maxmin_system = NULL;
+
+WorkstationL07Model::WorkstationL07Model() : WorkstationModel("Workstation ptask_L07") {
+  if (!ptask_maxmin_system)
+       ptask_maxmin_system = lmm_system_new(1);
+  surf_workstation_model = NULL;
+  surf_network_model = new NetworkL07Model();
+  surf_cpu_model_pm = new CpuL07Model();
+  routing_model_create(static_cast<ResourcePtr>(surf_network_model->createResource("__loopback__",
+                                                         498000000, NULL,
+                                                         0.000015, NULL,
+                                                         SURF_RESOURCE_ON, NULL,
+                                                         SURF_LINK_FATPIPE, NULL)));
+  p_cpuModel = surf_cpu_model_pm;
+}
+
+WorkstationL07Model::~WorkstationL07Model() {
+  xbt_dict_free(&ptask_parallel_task_link_set);
+
+  delete surf_cpu_model_pm;
+  delete surf_network_model;
+  ptask_host_count = 0;
+
+  if (ptask_maxmin_system) {
+    lmm_system_free(ptask_maxmin_system);
+    ptask_maxmin_system = NULL;
+  }
+}
+
+double WorkstationL07Model::shareResources(double /*now*/)
+{
+  WorkstationL07ActionPtr action;
+
+  ActionListPtr running_actions = getRunningActionSet();
+  double min = this->shareResourcesMaxMin(running_actions,
+                                              ptask_maxmin_system,
+                                              bottleneck_solve);
+
+  for(ActionList::iterator it(running_actions->begin()), itend(running_actions->end())
+        ; it != itend ; ++it) {
+       action = static_cast<WorkstationL07ActionPtr>(&*it);
+    if (action->m_latency > 0) {
+      if (min < 0) {
+        min = action->m_latency;
+        XBT_DEBUG("Updating min (value) with %p (start %f): %f", action,
+               action->getStartTime(), min);
+      } else if (action->m_latency < min) {
+        min = action->m_latency;
+        XBT_DEBUG("Updating min (latency) with %p (start %f): %f", action,
+               action->getStartTime(), min);
+      }
+    }
+  }
+
+  XBT_DEBUG("min value : %f", min);
+
+  return min;
+}
+
+void WorkstationL07Model::updateActionsState(double /*now*/, double delta)
+{
+  double deltap = 0.0;
+  WorkstationL07ActionPtr action;
+
+  ActionListPtr actionSet = getRunningActionSet();
+
+  for(ActionList::iterator it(actionSet->begin()), itNext = it, itend(actionSet->end())
+        ; it != itend ; it=itNext) {
+       ++itNext;
+    action = static_cast<WorkstationL07ActionPtr>(&*it);
+    deltap = delta;
+    if (action->m_latency > 0) {
+      if (action->m_latency > deltap) {
+        double_update(&(action->m_latency), deltap);
+        deltap = 0.0;
+      } else {
+        double_update(&(deltap), action->m_latency);
+        action->m_latency = 0.0;
+      }
+      if ((action->m_latency == 0.0) && (action->isSuspended() == 0)) {
+        action->updateBound();
+        lmm_update_variable_weight(ptask_maxmin_system, action->getVariable(), 1.0);
+      }
+    }
+    XBT_DEBUG("Action (%p) : remains (%g) updated by %g.",
+           action, action->getRemains(), lmm_variable_getvalue(action->getVariable()) * delta);
+    action->updateRemains(lmm_variable_getvalue(action->getVariable()) * delta);
+
+    if (action->getMaxDuration() != NO_MAX_DURATION)
+      action->updateMaxDuration(delta);
+
+    XBT_DEBUG("Action (%p) : remains (%g).",
+           action, action->getRemains());
+    if ((action->getRemains() <= 0) &&
+        (lmm_get_variable_weight(action->getVariable()) > 0)) {
+      action->finish();
+      action->setState(SURF_ACTION_DONE);
+    } else if ((action->getMaxDuration() != NO_MAX_DURATION) &&
+               (action->getMaxDuration() <= 0)) {
+      action->finish();
+     action->setState(SURF_ACTION_DONE);
+    } else {
+      /* Need to check that none of the model has failed */
+      lmm_constraint_t cnst = NULL;
+      int i = 0;
+      void *constraint_id = NULL;
+
+      while ((cnst = lmm_get_cnst_from_var(ptask_maxmin_system, action->getVariable(),
+                                    i++))) {
+        constraint_id = lmm_constraint_id(cnst);
+
+        if (static_cast<WorkstationPtr>(constraint_id)->getState() == SURF_RESOURCE_OFF) {
+          XBT_DEBUG("Action (%p) Failed!!", action);
+          action->finish();
+          action->setState(SURF_ACTION_FAILED);
+          break;
+        }
+      }
+    }
+  }
+  return;
+}
+
+ActionPtr WorkstationL07Model::executeParallelTask(int workstation_nb,
+                                                   void **workstation_list,
+                                                 double
+                                                 *computation_amount, double
+                                                 *communication_amount,
+                                                 double rate)
+{
+  WorkstationL07ActionPtr action;
+  int i, j;
+  unsigned int cpt;
+  int nb_link = 0;
+  int nb_host = 0;
+  double latency = 0.0;
+
+  if (ptask_parallel_task_link_set == NULL)
+    ptask_parallel_task_link_set = xbt_dict_new_homogeneous(NULL);
+
+  xbt_dict_reset(ptask_parallel_task_link_set);
+
+  /* Compute the number of affected resources... */
+  for (i = 0; i < workstation_nb; i++) {
+    for (j = 0; j < workstation_nb; j++) {
+      xbt_dynar_t route=NULL;
+
+      if (communication_amount[i * workstation_nb + j] > 0) {
+        double lat=0.0;
+        unsigned int cpt;
+        void *_link;
+        LinkL07Ptr link;
+
+        routing_platf->getRouteAndLatency(static_cast<WorkstationL07Ptr>(workstation_list[i])->p_netElm,
+                                                 static_cast<WorkstationL07Ptr>(workstation_list[j])->p_netElm,
+                                                 &route,
+                                                 &lat);
+        latency = MAX(latency, lat);
+
+        xbt_dynar_foreach(route, cpt, _link) {
+           link = static_cast<LinkL07Ptr>(_link);
+           xbt_dict_set(ptask_parallel_task_link_set, link->getName(), link, NULL);
+        }
+      }
+    }
+  }
+
+  nb_link = xbt_dict_length(ptask_parallel_task_link_set);
+  xbt_dict_reset(ptask_parallel_task_link_set);
+
+  for (i = 0; i < workstation_nb; i++)
+    if (computation_amount[i] > 0)
+      nb_host++;
+
+  action = new WorkstationL07Action(this, 1, 0);
+  XBT_DEBUG("Creating a parallel task (%p) with %d cpus and %d links.",
+         action, workstation_nb, nb_link);
+  action->m_suspended = 0;        /* Should be useless because of the
+                                   calloc but it seems to help valgrind... */
+  action->m_workstationNb = workstation_nb;
+  action->p_workstationList = (WorkstationPtr *) workstation_list;
+  action->p_computationAmount = computation_amount;
+  action->p_communicationAmount = communication_amount;
+  action->m_latency = latency;
+  action->m_rate = rate;
+
+  action->p_variable = lmm_variable_new(ptask_maxmin_system, action, 1.0,
+                       (action->m_rate > 0) ? action->m_rate : -1.0,
+                       workstation_nb + nb_link);
+
+  if (action->m_latency > 0)
+    lmm_update_variable_weight(ptask_maxmin_system, action->getVariable(), 0.0);
+
+  for (i = 0; i < workstation_nb; i++)
+    lmm_expand(ptask_maxmin_system,
+              static_cast<CpuPtr>(static_cast<WorkstationL07Ptr>(workstation_list[i])->p_cpu)->getConstraint(),
+               action->getVariable(), computation_amount[i]);
+
+  for (i = 0; i < workstation_nb; i++) {
+    for (j = 0; j < workstation_nb; j++) {
+      void *_link;
+      LinkL07Ptr link;
+
+      xbt_dynar_t route=NULL;
+      if (communication_amount[i * workstation_nb + j] == 0.0)
+        continue;
+
+      routing_platf->getRouteAndLatency(static_cast<WorkstationL07Ptr>(workstation_list[i])->p_netElm,
+                                        static_cast<WorkstationL07Ptr>(workstation_list[j])->p_netElm,
+                                           &route, NULL);
+
+      xbt_dynar_foreach(route, cpt, _link) {
+        link = static_cast<LinkL07Ptr>(_link);
+        lmm_expand_add(ptask_maxmin_system, link->getConstraint(),
+                       action->getVariable(),
+                       communication_amount[i * workstation_nb + j]);
+      }
+    }
+  }
+
+  if (nb_link + nb_host == 0) {
+    action->setCost(1.0);
+    action->setRemains(0.0);
+  }
+
+  return static_cast<ActionPtr>(action);
+}
+
+ResourcePtr WorkstationL07Model::createResource(const char *name, double /*power_scale*/,
+                                                double /*power_initial*/,
+                                                tmgr_trace_t /*power_trace*/,
+                                                e_surf_resource_state_t /*state_initial*/,
+                                                tmgr_trace_t /*state_trace*/,
+                                                xbt_dict_t /*cpu_properties*/)
+{
+  WorkstationL07Ptr wk = NULL;
+  xbt_assert(!surf_workstation_resource_priv(surf_workstation_resource_by_name(name)),
+              "Host '%s' declared several times in the platform file.",
+              name);
+
+  wk = new WorkstationL07(this, name, NULL,
+                                 static_cast<RoutingEdgePtr>(xbt_lib_get_or_null(host_lib, name, ROUTING_HOST_LEVEL)),
+                                 static_cast<CpuPtr>(xbt_lib_get_or_null(host_lib, name, SURF_CPU_LEVEL)));
+
+  xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, static_cast<ResourcePtr>(wk));
+
+  return wk;//FIXME:xbt_lib_get_elm_or_null(host_lib, name);
+}
+
+ActionPtr WorkstationL07Model::communicate(WorkstationPtr src, WorkstationPtr dst,
+                                       double size, double rate)
+{
+  void **workstation_list = xbt_new0(void *, 2);
+  double *computation_amount = xbt_new0(double, 2);
+  double *communication_amount = xbt_new0(double, 4);
+  ActionPtr res = NULL;
+
+  workstation_list[0] = static_cast<ResourcePtr>(src);
+  workstation_list[1] = static_cast<ResourcePtr>(dst);
+  communication_amount[1] = size;
+
+  res = executeParallelTask(2, workstation_list,
+                                    computation_amount,
+                                    communication_amount, rate);
+
+  return res;
+}
+
+xbt_dynar_t WorkstationL07Model::getRoute(WorkstationPtr src, WorkstationPtr dst)
+{
+  xbt_dynar_t route=NULL;
+  routing_platf->getRouteAndLatency(src->p_netElm, dst->p_netElm, &route, NULL);
+  return route;
+}
+
+ResourcePtr CpuL07Model::createResource(const char *name, double power_scale,
+                               double power_initial,
+                               tmgr_trace_t power_trace,
+                               e_surf_resource_state_t state_initial,
+                               tmgr_trace_t state_trace,
+                               xbt_dict_t cpu_properties)
+{
+  xbt_assert(!surf_workstation_resource_priv(surf_workstation_resource_by_name(name)),
+              "Host '%s' declared several times in the platform file.",
+              name);
+
+  CpuL07Ptr cpu = new CpuL07(this, name, cpu_properties,
+                                    power_scale, power_initial, power_trace,state_initial, state_trace);
+
+  xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, static_cast<ResourcePtr>(cpu));
+
+  return cpu;//FIXME:xbt_lib_get_elm_or_null(host_lib, name);
+}
+
+NetworkLinkPtr NetworkL07Model::createResource(const char *name,
+                                 double bw_initial,
+                                 tmgr_trace_t bw_trace,
+                                 double lat_initial,
+                                 tmgr_trace_t lat_trace,
+                                 e_surf_resource_state_t
+                                 state_initial,
+                                 tmgr_trace_t state_trace,
+                                 e_surf_link_sharing_policy_t policy,
+                                 xbt_dict_t properties)
+{
+  xbt_assert(!xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL),
+                     "Link '%s' declared several times in the platform file.",
+                     name);
+
+  LinkL07Ptr nw_link = new LinkL07(this, name, properties,
+                                      bw_initial, bw_trace,
+                                      lat_initial, lat_trace,
+                                      state_initial, state_trace,
+                                      policy);
+
+  xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, static_cast<ResourcePtr>(nw_link));
+  return nw_link;
+}
+
+void WorkstationL07Model::addTraces()
+{
+  xbt_dict_cursor_t cursor = NULL;
+  char *trace_name, *elm;
+
+  if (!trace_connect_list_host_avail)
+    return;
+
+  /* Connect traces relative to cpu */
+  xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
+    tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+    CpuL07Ptr host = static_cast<CpuL07Ptr>(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)));
+
+    xbt_assert(host, "Host %s undefined", elm);
+    xbt_assert(trace, "Trace %s undefined", trace_name);
+
+    host->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(host));
+  }
+
+  xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) {
+    tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+    CpuL07Ptr host = static_cast<CpuL07Ptr>(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)));
+
+    xbt_assert(host, "Host %s undefined", elm);
+    xbt_assert(trace, "Trace %s undefined", trace_name);
+
+    host->p_power.event = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(host));
+  }
+
+  /* Connect traces relative to network */
+  xbt_dict_foreach(trace_connect_list_link_avail, cursor, trace_name, elm) {
+    tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+    LinkL07Ptr link = static_cast<LinkL07Ptr>(xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL));
+
+    xbt_assert(link, "Link %s undefined", elm);
+    xbt_assert(trace, "Trace %s undefined", trace_name);
+
+    link->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(link));
+  }
+
+  xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) {
+    tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+    LinkL07Ptr link = static_cast<LinkL07Ptr>(xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL));
+
+    xbt_assert(link, "Link %s undefined", elm);
+    xbt_assert(trace, "Trace %s undefined", trace_name);
+
+    link->p_bwEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(link));
+  }
+
+  xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) {
+    tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+    LinkL07Ptr link = static_cast<LinkL07Ptr>(xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL));
+
+    xbt_assert(link, "Link %s undefined", elm);
+    xbt_assert(trace, "Trace %s undefined", trace_name);
+
+    link->p_latEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(link));
+  }
+}
+
+/************
+ * Resource *
+ ************/
+
+WorkstationL07::WorkstationL07(WorkstationModelPtr model, const char* name, xbt_dict_t props, RoutingEdgePtr netElm, CpuPtr cpu)
+  : Workstation(model, name, props, NULL, netElm, cpu)
+{
+}
+
+double WorkstationL07::getPowerPeakAt(int /*pstate_index*/)
+{
+       XBT_DEBUG("[ws_get_power_peak_at] Not implemented for workstation_ptask_L07");
+       return 0.0;
+}
+
+int WorkstationL07::getNbPstates()
+{
+       XBT_DEBUG("[ws_get_nb_pstates] Not implemented for workstation_ptask_L07");
+       return 0.0;
+}
+
+void WorkstationL07::setPowerPeakAt(int /*pstate_index*/)
+{
+       XBT_DEBUG("[ws_set_power_peak_at] Not implemented for workstation_ptask_L07");
+}
+
+double WorkstationL07::getConsumedEnergy()
+{
+       XBT_DEBUG("[ws_get_consumed_energy] Not implemented for workstation_ptask_L07");
+       return 0.0;
+}
+
+CpuL07::CpuL07(CpuL07ModelPtr model, const char* name, xbt_dict_t props,
+                  double power_scale,
+                      double power_initial, tmgr_trace_t power_trace,
+                      e_surf_resource_state_t state_initial, tmgr_trace_t state_trace)
+ : Cpu(model, name, props, lmm_constraint_new(ptask_maxmin_system, this, power_initial * power_scale),
+          1, 0, 0)
+{
+  p_power.scale = power_scale;
+  xbt_assert(p_power.scale > 0, "Power has to be >0");
+
+  m_powerCurrent = power_initial;
+  if (power_trace)
+    p_power.event = tmgr_history_add_trace(history, power_trace, 0.0, 0,
+                                           static_cast<ResourcePtr>(this));
+  else
+    p_power.event = NULL;
+
+  setState(state_initial);
+  if (state_trace)
+       p_stateEvent = tmgr_history_add_trace(history, state_trace, 0.0, 0, static_cast<ResourcePtr>(this));
+}
+
+LinkL07::LinkL07(NetworkL07ModelPtr model, const char* name, xbt_dict_t props,
+                        double bw_initial,
+                        tmgr_trace_t bw_trace,
+                        double lat_initial,
+                        tmgr_trace_t lat_trace,
+                        e_surf_resource_state_t state_initial,
+                        tmgr_trace_t state_trace,
+                        e_surf_link_sharing_policy_t policy)
+ : NetworkLink(model, name, props, lmm_constraint_new(ptask_maxmin_system, this, bw_initial), history, state_trace)
+{
+  m_bwCurrent = bw_initial;
+  if (bw_trace)
+    p_bwEvent = tmgr_history_add_trace(history, bw_trace, 0.0, 0, static_cast<ResourcePtr>(this));
+
+  setState(state_initial);
+  m_latCurrent = lat_initial;
+
+  if (lat_trace)
+       p_latEvent = tmgr_history_add_trace(history, lat_trace, 0.0, 0, static_cast<ResourcePtr>(this));
+
+  if (policy == SURF_LINK_FATPIPE)
+       lmm_constraint_shared(getConstraint());
+}
+
+bool CpuL07::isUsed(){
+  return lmm_constraint_used(ptask_maxmin_system, getConstraint());
+}
+
+bool LinkL07::isUsed(){
+  return lmm_constraint_used(ptask_maxmin_system, getConstraint());
+}
+
+void CpuL07::updateState(tmgr_trace_event_t event_type, double value, double /*date*/){
+  XBT_DEBUG("Updating cpu %s (%p) with value %g", getName(), this, value);
+  if (event_type == p_power.event) {
+       m_powerCurrent = value;
+    lmm_update_constraint_bound(ptask_maxmin_system, getConstraint(), m_powerCurrent * p_power.scale);
+    if (tmgr_trace_event_free(event_type))
+      p_power.event = NULL;
+  } else if (event_type == p_stateEvent) {
+    if (value > 0)
+      setState(SURF_RESOURCE_ON);
+    else
+      setState(SURF_RESOURCE_OFF);
+    if (tmgr_trace_event_free(event_type))
+      p_stateEvent = NULL;
+  } else {
+    XBT_CRITICAL("Unknown event ! \n");
+    xbt_abort();
+  }
+  return;
+}
+
+void LinkL07::updateState(tmgr_trace_event_t event_type, double value, double date){
+  XBT_DEBUG("Updating link %s (%p) with value=%f for date=%g", getName(), this, value, date);
+  if (event_type == p_bwEvent) {
+    m_bwCurrent = value;
+    lmm_update_constraint_bound(ptask_maxmin_system, getConstraint(), m_bwCurrent);
+    if (tmgr_trace_event_free(event_type))
+      p_bwEvent = NULL;
+  } else if (event_type == p_latEvent) {
+    lmm_variable_t var = NULL;
+    WorkstationL07ActionPtr action;
+    lmm_element_t elem = NULL;
+
+    m_latCurrent = value;
+    while ((var = lmm_get_var_from_cnst(ptask_maxmin_system, getConstraint(), &elem))) {
+      action = (WorkstationL07ActionPtr) lmm_variable_id(var);
+      action->updateBound();
+    }
+    if (tmgr_trace_event_free(event_type))
+      p_latEvent = NULL;
+  } else if (event_type == p_stateEvent) {
+    if (value > 0)
+      setState(SURF_RESOURCE_ON);
+    else
+      setState(SURF_RESOURCE_OFF);
+    if (tmgr_trace_event_free(event_type))
+      p_stateEvent = NULL;
+  } else {
+    XBT_CRITICAL("Unknown event ! \n");
+    xbt_abort();
+  }
+  return;
+}
+
+e_surf_resource_state_t WorkstationL07::getState()
+{
+  return p_cpu->getState();
+}
+
+double CpuL07::getSpeed(double load)
+{
+  return load * p_power.scale;
+}
+
+double CpuL07::getAvailableSpeed()
+{
+  return m_powerCurrent;
+}
+
+ActionPtr WorkstationL07::execute(double size)
+{
+  void **workstation_list = xbt_new0(void *, 1);
+  double *computation_amount = xbt_new0(double, 1);
+  double *communication_amount = xbt_new0(double, 1);
+
+  workstation_list[0] = static_cast<ResourcePtr>(this);
+  communication_amount[0] = 0.0;
+  computation_amount[0] = size;
+
+  return static_cast<WorkstationL07ModelPtr>(getModel())->executeParallelTask(1, workstation_list,
+                                             computation_amount,
+                                     communication_amount, -1);
+}
+
+ActionPtr WorkstationL07::sleep(double duration)
+{
+  WorkstationL07ActionPtr action = NULL;
+
+  XBT_IN("(%s,%g)", getName(), duration);
+
+  action = static_cast<WorkstationL07ActionPtr>(execute(1.0));
+  action->m_maxDuration = duration;
+  action->m_suspended = 2;
+  lmm_update_variable_weight(ptask_maxmin_system, action->getVariable(), 0.0);
+
+  XBT_OUT();
+  return action;
+}
+
+double LinkL07::getBandwidth()
+{
+  return m_bwCurrent;
+}
+
+double LinkL07::getLatency()
+{
+  return m_latCurrent;
+}
+
+bool LinkL07::isShared()
+{
+  return lmm_constraint_is_shared(getConstraint());
+}
+
+/**********
+ * Action *
+ **********/
+
+WorkstationL07Action::~WorkstationL07Action(){
+  free(p_workstationList);
+  free(p_communicationAmount);
+  free(p_computationAmount);
+}
+
+void WorkstationL07Action::updateBound()
+{
+  double lat_current = 0.0;
+  double lat_bound = -1.0;
+  int i, j;
+
+  for (i = 0; i < m_workstationNb; i++) {
+    for (j = 0; j < m_workstationNb; j++) {
+      xbt_dynar_t route=NULL;
+
+      if (p_communicationAmount[i * m_workstationNb + j] > 0) {
+        double lat = 0.0;
+        routing_platf->getRouteAndLatency(static_cast<WorkstationL07Ptr>(((void**)p_workstationList)[i])->p_netElm,
+                                          static_cast<WorkstationL07Ptr>(((void**)p_workstationList)[j])->p_netElm,
+                                                         &route, &lat);
+
+        lat_current = MAX(lat_current, lat * p_communicationAmount[i * m_workstationNb + j]);
+      }
+    }
+  }
+  lat_bound = sg_tcp_gamma / (2.0 * lat_current);
+  XBT_DEBUG("action (%p) : lat_bound = %g", this, lat_bound);
+  if ((m_latency == 0.0) && (m_suspended == 0)) {
+    if (m_rate < 0)
+      lmm_update_variable_bound(ptask_maxmin_system, getVariable(), lat_bound);
+    else
+      lmm_update_variable_bound(ptask_maxmin_system, getVariable(), min(m_rate, lat_bound));
+  }
+}
+
+int WorkstationL07Action::unref()
+{
+  m_refcount--;
+  if (!m_refcount) {
+    if (actionHook::is_linked())
+         p_stateSet->erase(p_stateSet->iterator_to(*this));
+    if (getVariable())
+      lmm_variable_free(ptask_maxmin_system, getVariable());
+    delete this;
+    return 1;
+  }
+  return 0;
+}
+
+void WorkstationL07Action::cancel()
+{
+  setState(SURF_ACTION_FAILED);
+  return;
+}
+
+void WorkstationL07Action::suspend()
+{
+  XBT_IN("(%p))", this);
+  if (m_suspended != 2) {
+    m_suspended = 1;
+    lmm_update_variable_weight(ptask_maxmin_system, getVariable(), 0.0);
+  }
+  XBT_OUT();
+}
+
+void WorkstationL07Action::resume()
+{
+  XBT_IN("(%p)", this);
+  if (m_suspended != 2) {
+    lmm_update_variable_weight(ptask_maxmin_system, getVariable(), 1.0);
+    m_suspended = 0;
+  }
+  XBT_OUT();
+}
+
+bool WorkstationL07Action::isSuspended()
+{
+  return m_suspended == 1;
+}
+
+void WorkstationL07Action::setMaxDuration(double duration)
+{                               /* FIXME: should inherit */
+  XBT_IN("(%p,%g)", this, duration);
+  m_maxDuration = duration;
+  XBT_OUT();
+}
+
+void WorkstationL07Action::setPriority(double priority)
+{                               /* FIXME: should inherit */
+  XBT_IN("(%p,%g)", this, priority);
+  m_priority = priority;
+  XBT_OUT();
+}
+
+double WorkstationL07Action::getRemains()
+{
+  XBT_IN("(%p)", this);
+  XBT_OUT();
+  return m_remains;
+}
+
+/*FIXME:remove static void ptask_finalize(void)
+{
+  xbt_dict_free(&ptask_parallel_task_link_set);
+
+  delete surf_workstation_model;
+  surf_workstation_model = NULL;
+  delete surf_network_model;
+  surf_network_model = NULL;
+
+  ptask_host_count = 0;
+
+  if (ptask_maxmin_system) {
+    lmm_system_free(ptask_maxmin_system);
+    ptask_maxmin_system = NULL;
+  }
+  }*/
+
+/**************************************/
+/******* Resource Private    **********/
+/**************************************/
+
+/**************************************/
+/*** Resource Creation & Destruction **/
+/**************************************/
+
+static void ptask_parse_workstation_init(sg_platf_host_cbarg_t host)
+{
+  double power_peak = xbt_dynar_get_as(host->power_peak, host->pstate, double);
+  //cpu->power_peak = power_peak;
+  xbt_dynar_free(&(host->power_peak));  /* kill memory leak */
+  static_cast<WorkstationL07ModelPtr>(surf_workstation_model)->createResource(
+      host->id,
+      power_peak,
+      host->power_scale,
+      host->power_trace,
+      host->initial_state,
+      host->state_trace,
+      host->properties);
+}
+
+static void ptask_parse_cpu_init(sg_platf_host_cbarg_t host)
+{
+  double power_peak = xbt_dynar_get_as(host->power_peak, host->pstate, double);
+  static_cast<CpuL07ModelPtr>(surf_cpu_model_pm)->createResource(
+      host->id,
+      power_peak,
+      host->power_scale,
+      host->power_trace,
+      host->initial_state,
+      host->state_trace,
+      host->properties);
+}
+
+
+
+static void ptask_parse_link_init(sg_platf_link_cbarg_t link)
+{
+  if (link->policy == SURF_LINK_FULLDUPLEX) {
+    char *link_id;
+    link_id = bprintf("%s_UP", link->id);
+    static_cast<NetworkL07ModelPtr>(surf_network_model)->createResource(link_id,
+                               link->bandwidth,
+                               link->bandwidth_trace,
+                               link->latency,
+                               link->latency_trace,
+                               link->state,
+                               link->state_trace,
+                               link->policy,
+                               link->properties);
+    xbt_free(link_id);
+    link_id = bprintf("%s_DOWN", link->id);
+    static_cast<NetworkL07ModelPtr>(surf_network_model)->createResource(link_id,
+                               link->bandwidth,
+                               link->bandwidth_trace,
+                               link->latency,
+                               link->latency_trace,
+                               link->state,
+                               link->state_trace,
+                               link->policy,
+                               NULL); /* FIXME: We need to deep copy the
+                                       * properties or we won't be able to free
+                                       * it */
+    xbt_free(link_id);
+  } else {
+         static_cast<NetworkL07ModelPtr>(surf_network_model)->createResource(link->id,
+                               link->bandwidth,
+                               link->bandwidth_trace,
+                               link->latency,
+                               link->latency_trace,
+                               link->state,
+                               link->state_trace,
+                               link->policy,
+                               link->properties);
+  }
+
+  current_property_set = NULL;
+}
+
+static void ptask_add_traces(){
+  static_cast<WorkstationL07ModelPtr>(surf_workstation_model)->addTraces();
+}
+
+static void ptask_define_callbacks()
+{
+  sg_platf_host_add_cb(ptask_parse_cpu_init);
+  sg_platf_host_add_cb(ptask_parse_workstation_init);
+  sg_platf_link_add_cb(ptask_parse_link_init);
+  sg_platf_postparse_add_cb(ptask_add_traces);
+}
+
+/**************************************/
+/*************** Generic **************/
+/**************************************/
+void surf_workstation_model_init_ptask_L07(void)
+{
+  XBT_INFO("surf_workstation_model_init_ptask_L07");
+  xbt_assert(!surf_cpu_model_pm, "CPU model type already defined");
+  xbt_assert(!surf_network_model, "network model type already defined");
+  ptask_define_callbacks();
+  surf_workstation_model = new WorkstationL07Model();
+  ModelPtr model = static_cast<ModelPtr>(surf_workstation_model);
+  xbt_dynar_push(model_list, &model);
+  xbt_dynar_push(model_list_invoke, &model);
+}
diff --git a/src/surf/workstation_ptask_L07.hpp b/src/surf/workstation_ptask_L07.hpp
new file mode 100644 (file)
index 0000000..360a851
--- /dev/null
@@ -0,0 +1,210 @@
+/* Copyright (c) 2013-2014. 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 "workstation_interface.hpp"
+
+#ifndef WORKSTATION_L07_HPP_
+#define WORKSTATION_L07_HPP_
+
+/***********
+ * Classes *
+ ***********/
+
+class WorkstationL07Model;
+typedef WorkstationL07Model *WorkstationL07ModelPtr;
+
+class CpuL07Model;
+typedef CpuL07Model *CpuL07ModelPtr;
+
+class NetworkL07Model;
+typedef NetworkL07Model *NetworkL07ModelPtr;
+
+class WorkstationL07;
+typedef WorkstationL07 *WorkstationL07Ptr;
+
+class CpuL07;
+typedef CpuL07 *CpuL07Ptr;
+
+class LinkL07;
+typedef LinkL07 *LinkL07Ptr;
+
+class WorkstationL07Action;
+typedef WorkstationL07Action *WorkstationL07ActionPtr;
+
+/*********
+ * Tools *
+ *********/
+
+/*********
+ * Model *
+ *********/
+class WorkstationL07Model : public WorkstationModel {
+public:
+  WorkstationL07Model();
+  ~WorkstationL07Model();
+
+  double shareResources(double now);
+  void updateActionsState(double now, double delta);
+  ResourcePtr createResource(const char *name, double power_scale,
+                                 double power_initial,
+                                 tmgr_trace_t power_trace,
+                                 e_surf_resource_state_t state_initial,
+                                 tmgr_trace_t state_trace,
+                                 xbt_dict_t cpu_properties);
+  ActionPtr executeParallelTask(int workstation_nb,
+                                        void **workstation_list,
+                                        double *computation_amount,
+                                        double *communication_amount,
+                                        double rate);
+  xbt_dynar_t getRoute(WorkstationPtr src, WorkstationPtr dst);
+  ActionPtr communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate);
+  void addTraces();
+  NetworkModelPtr p_networkModel;
+};
+
+class CpuL07Model : public CpuModel {
+public:
+  CpuL07Model() : CpuModel("cpuL07") {};
+  ~CpuL07Model() {surf_cpu_model_pm = NULL;};
+  ResourcePtr createResource(const char *name, double power_scale,
+                                 double power_initial,
+                                 tmgr_trace_t power_trace,
+                                 e_surf_resource_state_t state_initial,
+                                 tmgr_trace_t state_trace,
+                                 xbt_dict_t cpu_properties);
+  void addTraces() {DIE_IMPOSSIBLE;};
+
+  WorkstationL07ModelPtr p_workstationModel;
+};
+
+class NetworkL07Model : public NetworkModel {
+public:
+  NetworkL07Model() : NetworkModel() {};
+  ~NetworkL07Model() {surf_network_model = NULL;};
+  NetworkLinkPtr createResource(const char *name,
+                                                  double bw_initial,
+                                                  tmgr_trace_t bw_trace,
+                                                  double lat_initial,
+                                                  tmgr_trace_t lat_trace,
+                                                  e_surf_resource_state_t
+                                                  state_initial,
+                                                  tmgr_trace_t state_trace,
+                                                  e_surf_link_sharing_policy_t
+                                                  policy, xbt_dict_t properties);
+
+  ActionPtr communicate(RoutingEdgePtr /*src*/, RoutingEdgePtr /*dst*/, double /*size*/, double /*rate*/) {DIE_IMPOSSIBLE;};
+  void addTraces() {DIE_IMPOSSIBLE;};
+  WorkstationL07ModelPtr p_workstationModel;
+};
+
+/************
+ * Resource *
+ ************/
+
+class WorkstationL07 : public Workstation {
+public:
+  WorkstationL07(WorkstationModelPtr model, const char* name, xbt_dict_t props, RoutingEdgePtr netElm, CpuPtr cpu);
+  //bool isUsed();
+  bool isUsed() {DIE_IMPOSSIBLE;};
+  void updateState(tmgr_trace_event_t /*event_type*/, double /*value*/, double /*date*/) {DIE_IMPOSSIBLE;};
+  ActionPtr execute(double size);
+  ActionPtr sleep(double duration);
+  e_surf_resource_state_t getState();
+  double getPowerPeakAt(int pstate_index);
+  int getNbPstates();
+  void setPowerPeakAt(int pstate_index);
+  double getConsumedEnergy();
+};
+
+class CpuL07 : public Cpu {
+public:
+  s_surf_metric_t p_power;
+  tmgr_trace_event_t p_stateEvent;
+
+public:
+  CpuL07(CpuL07ModelPtr model, const char* name, xbt_dict_t properties,
+                double power_scale,
+                double power_initial, tmgr_trace_t power_trace,
+                e_surf_resource_state_t state_initial, tmgr_trace_t state_trace);
+  bool isUsed();
+  //bool isUsed() {DIE_IMPOSSIBLE;};
+  void updateState(tmgr_trace_event_t event_type, double value, double date);
+  double getSpeed(double load);
+  double getAvailableSpeed();
+  CpuActionPtr execute(double /*size*/) {DIE_IMPOSSIBLE;};
+  CpuActionPtr sleep(double /*duration*/) {DIE_IMPOSSIBLE;};
+
+  double getCurrentPowerPeak() {THROW_UNIMPLEMENTED;};
+  double getPowerPeakAt(int /*pstate_index*/) {THROW_UNIMPLEMENTED;};
+  int getNbPstates() {THROW_UNIMPLEMENTED;};
+  void setPowerPeakAt(int /*pstate_index*/) {THROW_UNIMPLEMENTED;};
+  double getConsumedEnergy() {THROW_UNIMPLEMENTED;};
+
+  double m_powerCurrent;
+};
+
+class LinkL07 : public NetworkLink {
+public:
+  LinkL07(NetworkL07ModelPtr model, const char* name, xbt_dict_t props,
+                 double bw_initial,
+          tmgr_trace_t bw_trace,
+          double lat_initial,
+          tmgr_trace_t lat_trace,
+          e_surf_resource_state_t
+          state_initial,
+          tmgr_trace_t state_trace,
+          e_surf_link_sharing_policy_t policy);
+  ~LinkL07(){
+  };
+  bool isUsed();
+  void updateState(tmgr_trace_event_t event_type, double value, double date);
+  double getBandwidth();
+  double getLatency();
+  bool isShared();
+
+  double m_latCurrent;
+  tmgr_trace_event_t p_latEvent;
+  double m_bwCurrent;
+  tmgr_trace_event_t p_bwEvent;
+};
+
+/**********
+ * Action *
+ **********/
+class WorkstationL07Action : public WorkstationAction {
+  friend ActionPtr WorkstationL07::execute(double size);
+  friend ActionPtr WorkstationL07::sleep(double duration);
+  friend ActionPtr WorkstationL07Model::executeParallelTask(int workstation_nb,
+                                                     void **workstation_list,
+                                                   double
+                                                   *computation_amount, double
+                                                   *communication_amount,
+                                                   double rate);
+public:
+  WorkstationL07Action(ModelPtr model, double cost, bool failed)
+  : WorkstationAction(model, cost, failed) {};
+ ~WorkstationL07Action();
+
+  void updateBound();
+
+  int unref();
+  void cancel();
+  void suspend();
+  void resume();
+  bool isSuspended();
+  void setMaxDuration(double duration);
+  void setPriority(double priority);
+  double getRemains();
+
+  int m_workstationNb;
+  WorkstationPtr *p_workstationList;
+  double *p_computationAmount;
+  double *p_communicationAmount;
+  double m_latency;
+  double m_rate;
+};
+
+#endif /* WORKSTATION_L07_HPP_ */
index 36a84ee..93ab3bf 100644 (file)
@@ -4,7 +4,7 @@
 
 /* config.h - simgrid config selection for windows platforms. */
 
-/* Copyright (c) 2006-2008, 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2006-2008, 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 01aa668..e4dbbb5 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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. */
+
 /***********************************************************************\
  *
  * File:           RngStream.c for multiple streams of Random Numbers
@@ -539,15 +545,3 @@ int RngStream_RandInt (RngStream g, int i, int j)
 {
    return i + (int) ((j - i + 1.0) * RngStream_RandU01 (g));
 }
-
-/* Undefine this terms, or supernovae build will fail. */
-#undef norm
-#undef m1
-#undef m2
-#undef a12
-#undef a13n
-#undef a21
-#undef a23n
-#undef two17
-#undef two53
-#undef fact
index e3abf53..5c63609 100644 (file)
@@ -1,6 +1,6 @@
 /* automaton - representation of büchi automaton */
 
-/* Copyright (c) 2011-2013. The SimGrid Team.
+/* Copyright (c) 2011-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8477155..9a91800 100644 (file)
@@ -521,7 +521,11 @@ int xbt_automaton_parser__flex_debug = 0;
 #define YY_RESTORE_YY_MORE_OFFSET
 char *xbt_automaton_parser_text;
 #line 1 "parserPromela.lex"
-#line 4 "parserPromela.lex"
+/* Copyright (c) 2012, 2014. 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. */
+#line 10 "parserPromela.lex"
 
 
 #include <stdio.h>
@@ -529,7 +533,7 @@ char *xbt_automaton_parser_text;
   
   extern YYSTYPE yylval;
  
-#line 533 "automaton_lexer.yy.c"
+#line 537 "automaton_lexer.yy.c"
 
 #define INITIAL 0
 
@@ -716,10 +720,10 @@ YY_DECL
        register char *yy_cp, *yy_bp;
        register int yy_act;
     
-#line 28 "parserPromela.lex"
+#line 34 "parserPromela.lex"
 
 
-#line 723 "automaton_lexer.yy.c"
+#line 727 "automaton_lexer.yy.c"
 
        if ( !(yy_init) )
                {
@@ -804,118 +808,118 @@ do_action:      /* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 30 "parserPromela.lex"
+#line 36 "parserPromela.lex"
 { return (NEVER); }
        YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 31 "parserPromela.lex"
+#line 37 "parserPromela.lex"
 { return (IF); }
        YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 32 "parserPromela.lex"
+#line 38 "parserPromela.lex"
 { return (FI); }
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 33 "parserPromela.lex"
+#line 39 "parserPromela.lex"
 { return (IMPLIES); }
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 34 "parserPromela.lex"
+#line 40 "parserPromela.lex"
 { return (GOTO); }
        YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 35 "parserPromela.lex"
+#line 41 "parserPromela.lex"
 { return (AND); }
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 36 "parserPromela.lex"
+#line 42 "parserPromela.lex"
 { return (OR); }
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 37 "parserPromela.lex"
+#line 43 "parserPromela.lex"
 { return (NOT); }
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 38 "parserPromela.lex"
+#line 44 "parserPromela.lex"
 { return (LEFT_PAR); }
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 39 "parserPromela.lex"
+#line 45 "parserPromela.lex"
 { return (RIGHT_PAR); }
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 40 "parserPromela.lex"
+#line 46 "parserPromela.lex"
 { return (CASE); }
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 41 "parserPromela.lex"
+#line 47 "parserPromela.lex"
 { return (COLON); }
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 42 "parserPromela.lex"
+#line 48 "parserPromela.lex"
 { return (SEMI_COLON); }
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 43 "parserPromela.lex"
+#line 49 "parserPromela.lex"
 { return (CASE_TRUE); }
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 44 "parserPromela.lex"
+#line 50 "parserPromela.lex"
 { return (LEFT_BRACE); }
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 45 "parserPromela.lex"
+#line 51 "parserPromela.lex"
 { return (RIGHT_BRACE); }
        YY_BREAK
 case 17:
 /* rule 17 can match eol */
 YY_RULE_SETUP
-#line 48 "parserPromela.lex"
+#line 54 "parserPromela.lex"
 { }
        YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 50 "parserPromela.lex"
+#line 56 "parserPromela.lex"
 { }
        YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 53 "parserPromela.lex"
+#line 59 "parserPromela.lex"
 { sscanf(xbt_automaton_parser_text,"%lf",&yylval.real); 
                             return (LITT_REEL); }
        YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 56 "parserPromela.lex"
+#line 62 "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 59 "parserPromela.lex"
+#line 65 "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 63 "parserPromela.lex"
+#line 69 "parserPromela.lex"
 { yylval.string=(char *)malloc(strlen(xbt_automaton_parser_text)+1);
                             sscanf(xbt_automaton_parser_text,"%s",yylval.string);
                                              return (ID); }
@@ -923,20 +927,20 @@ YY_RULE_SETUP
 case 23:
 /* rule 23 can match eol */
 YY_RULE_SETUP
-#line 67 "parserPromela.lex"
+#line 73 "parserPromela.lex"
 { }
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 69 "parserPromela.lex"
+#line 75 "parserPromela.lex"
 { }
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 71 "parserPromela.lex"
+#line 77 "parserPromela.lex"
 ECHO;
        YY_BREAK
-#line 940 "automaton_lexer.yy.c"
+#line 944 "automaton_lexer.yy.c"
 case YY_STATE_EOF(INITIAL):
        yyterminate();
 
@@ -1934,7 +1938,7 @@ void xbt_automaton_parser_free (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 71 "parserPromela.lex"
+#line 77 "parserPromela.lex"
 
 
 
index 1fbf4e5..7e73dd7 100644 (file)
@@ -1,12 +1,14 @@
 /* methods for implementation of automaton from promela description */
 
-/* Copyright (c) 2011-2013. The SimGrid Team.
+/* Copyright (c) 2011-2014. 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/automaton.h"
+#include <errno.h>
+#include <string.h>             /* strerror */
 
 static xbt_automaton_t parsed_automaton;
 char* state_id_src;
@@ -92,8 +94,11 @@ static xbt_automaton_exp_label_t new_label(int type, ...){
 
 #include "parserPromela.tab.cacc"
 
-void xbt_automaton_load(xbt_automaton_t a, const char *file){
+void xbt_automaton_load(xbt_automaton_t a, const char *file)
+{
   parsed_automaton = a;
   yyin = fopen(file, "r");
+  if (yyin == NULL)
+    xbt_die("Failed to open automaton file `%s': %s", file, strerror(errno));
   yyparse();
 }
index 7b64a62..2be47f2 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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. */
+
 %option noyywrap
 
 %{
index 56cc4b6..898e1e4 100644 (file)
@@ -1,19 +1,19 @@
-/* A Bison parser, made by GNU Bison 2.7.12-4996.  */
+/* A Bison parser, made by GNU Bison 3.0.2.  */
 
 /* Bison implementation for Yacc-like parsers in C
-   
-      Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
-   
+
+   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
+
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
@@ -26,7 +26,7 @@
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-   
+
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
@@ -44,7 +44,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.7.12-4996"
+#define YYBISON_VERSION "3.0.2"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
 #define yyparse         xbt_automaton_parser_parse
 #define yylex           xbt_automaton_parser_lex
 #define yyerror         xbt_automaton_parser_error
-#define yylval          xbt_automaton_parser_lval
-#define yychar          xbt_automaton_parser_char
 #define yydebug         xbt_automaton_parser_debug
 #define yynerrs         xbt_automaton_parser_nerrs
 
+#define yylval          xbt_automaton_parser_lval
+#define yychar          xbt_automaton_parser_char
+
 /* Copy the first part of user declarations.  */
-/* Line 371 of yacc.c  */
-#line 1 "parserPromela.yacc"
+#line 7 "parserPromela.yacc" /* yacc.c:339  */
 
 
 #include "automaton_lexer.yy.c"
 void yyerror(const char *s);
 
 
-/* Line 371 of yacc.c  */
-#line 84 "parserPromela.tab.cacc"
+#line 83 "parserPromela.tab.cacc" /* yacc.c:339  */
 
-# ifndef YY_NULL
+# ifndef YY_NULLPTR
 #  if defined __cplusplus && 201103L <= __cplusplus
-#   define YY_NULL nullptr
+#   define YY_NULLPTR nullptr
 #  else
-#   define YY_NULL 0
+#   define YY_NULLPTR 0
 #  endif
 # endif
 
@@ -102,7 +101,7 @@ void yyerror(const char *s);
    by #include "parserPromela.tab.hacc".  */
 #ifndef YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
 # define YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
-/* Enabling traces.  */
+/* Debug traces.  */
 #ifndef YYDEBUG
 # define YYDEBUG 0
 #endif
@@ -110,78 +109,62 @@ void yyerror(const char *s);
 extern int xbt_automaton_parser_debug;
 #endif
 
-/* Tokens.  */
+/* Token type.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     NEVER = 258,
-     IF = 259,
-     FI = 260,
-     IMPLIES = 261,
-     GOTO = 262,
-     AND = 263,
-     OR = 264,
-     NOT = 265,
-     LEFT_PAR = 266,
-     RIGHT_PAR = 267,
-     CASE = 268,
-     COLON = 269,
-     SEMI_COLON = 270,
-     CASE_TRUE = 271,
-     LEFT_BRACE = 272,
-     RIGHT_BRACE = 273,
-     LITT_ENT = 274,
-     LITT_CHAINE = 275,
-     LITT_REEL = 276,
-     ID = 277
-   };
+  enum yytokentype
+  {
+    NEVER = 258,
+    IF = 259,
+    FI = 260,
+    IMPLIES = 261,
+    GOTO = 262,
+    AND = 263,
+    OR = 264,
+    NOT = 265,
+    LEFT_PAR = 266,
+    RIGHT_PAR = 267,
+    CASE = 268,
+    COLON = 269,
+    SEMI_COLON = 270,
+    CASE_TRUE = 271,
+    LEFT_BRACE = 272,
+    RIGHT_BRACE = 273,
+    LITT_ENT = 274,
+    LITT_CHAINE = 275,
+    LITT_REEL = 276,
+    ID = 277
+  };
 #endif
 
-
+/* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
+typedef union YYSTYPE YYSTYPE;
+union YYSTYPE
 {
-/* Line 387 of yacc.c  */
-#line 10 "parserPromela.yacc"
+#line 16 "parserPromela.yacc" /* yacc.c:355  */
 
   double real;
   int integer;
   char* string;
   xbt_automaton_exp_label_t label;
 
-
-/* Line 387 of yacc.c  */
-#line 157 "parserPromela.tab.cacc"
-} YYSTYPE;
+#line 153 "parserPromela.tab.cacc" /* yacc.c:355  */
+};
 # define YYSTYPE_IS_TRIVIAL 1
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 #endif
 
+
 extern YYSTYPE xbt_automaton_parser_lval;
 
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int xbt_automaton_parser_parse (void *YYPARSE_PARAM);
-#else
-int xbt_automaton_parser_parse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
 int xbt_automaton_parser_parse (void);
-#else
-int xbt_automaton_parser_parse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
 
 #endif /* !YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED  */
 
 /* Copy the second part of user declarations.  */
 
-/* Line 390 of yacc.c  */
-#line 185 "parserPromela.tab.cacc"
+#line 168 "parserPromela.tab.cacc" /* yacc.c:358  */
 
 #ifdef short
 # undef short
@@ -195,11 +178,8 @@ typedef unsigned char yytype_uint8;
 
 #ifdef YYTYPE_INT8
 typedef YYTYPE_INT8 yytype_int8;
-#elif (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-typedef signed char yytype_int8;
 #else
-typedef short int yytype_int8;
+typedef signed char yytype_int8;
 #endif
 
 #ifdef YYTYPE_UINT16
@@ -219,8 +199,7 @@ typedef short int yytype_int16;
 #  define YYSIZE_T __SIZE_TYPE__
 # elif defined size_t
 #  define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+# elif ! defined YYSIZE_T
 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
 #  define YYSIZE_T size_t
 # else
@@ -242,11 +221,30 @@ typedef short int yytype_int16;
 # endif
 #endif
 
-#ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later.  */
-# if (! defined __GNUC__ || __GNUC__ < 2 \
-      || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
-#  define __attribute__(Spec) /* empty */
+#ifndef YY_ATTRIBUTE
+# if (defined __GNUC__                                               \
+      && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)))  \
+     || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
+#  define YY_ATTRIBUTE(Spec) __attribute__(Spec)
+# else
+#  define YY_ATTRIBUTE(Spec) /* empty */
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_PURE
+# define YY_ATTRIBUTE_PURE   YY_ATTRIBUTE ((__pure__))
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
+#endif
+
+#if !defined _Noreturn \
+     && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
+# if defined _MSC_VER && 1200 <= _MSC_VER
+#  define _Noreturn __declspec (noreturn)
+# else
+#  define _Noreturn YY_ATTRIBUTE ((__noreturn__))
 # endif
 #endif
 
@@ -257,25 +255,26 @@ typedef short int yytype_int16;
 # define YYUSE(E) /* empty */
 #endif
 
-
-/* Identity function, used to suppress warnings about constant conditions.  */
-#ifndef lint
-# define YYID(N) (N)
-#else
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static int
-YYID (int yyi)
+#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+/* Suppress an incorrect diagnostic about yylval being uninitialized.  */
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
+    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+    _Pragma ("GCC diagnostic pop")
 #else
-static int
-YYID (yyi)
-    int yyi;
+# define YY_INITIAL_VALUE(Value) Value
 #endif
-{
-  return yyi;
-}
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
 #endif
 
+
 #if ! defined yyoverflow || YYERROR_VERBOSE
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
@@ -293,8 +292,7 @@ YYID (yyi)
 #    define alloca _alloca
 #   else
 #    define YYSTACK_ALLOC alloca
-#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
       /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
 #     ifndef EXIT_SUCCESS
@@ -306,8 +304,8 @@ YYID (yyi)
 # endif
 
 # ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning.  */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+   /* Pacify GCC's 'empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
 #  ifndef YYSTACK_ALLOC_MAXIMUM
     /* The OS might guarantee only one guard page at the bottom of the stack,
        and a page size can be as small as 4096 bytes.  So we cannot safely
@@ -323,7 +321,7 @@ YYID (yyi)
 #  endif
 #  if (defined __cplusplus && ! defined EXIT_SUCCESS \
        && ! ((defined YYMALLOC || defined malloc) \
-            && (defined YYFREE || defined free)))
+             && (defined YYFREE || defined free)))
 #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
 #   ifndef EXIT_SUCCESS
 #    define EXIT_SUCCESS 0
@@ -331,15 +329,13 @@ YYID (yyi)
 #  endif
 #  ifndef YYMALLOC
 #   define YYMALLOC malloc
-#   if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+#   if ! defined malloc && ! defined EXIT_SUCCESS
 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
 #  ifndef YYFREE
 #   define YYFREE free
-#   if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+#   if ! defined free && ! defined EXIT_SUCCESS
 void free (void *); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
@@ -349,7 +345,7 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */
 
 #if (! defined yyoverflow \
      && (! defined __cplusplus \
-        || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+         || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
@@ -374,16 +370,16 @@ union yyalloc
    elements in the stack, and YYPTR gives the new location of the
    stack.  Advance YYPTR to a properly aligned location for the next
    stack.  */
-# define YYSTACK_RELOCATE(Stack_alloc, Stack)                          \
-    do                                                                 \
-      {                                                                        \
-       YYSIZE_T yynewbytes;                                            \
-       YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
-       Stack = &yyptr->Stack_alloc;                                    \
-       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-       yyptr += yynewbytes / sizeof (*yyptr);                          \
-      }                                                                        \
-    while (YYID (0))
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
+    do                                                                  \
+      {                                                                 \
+        YYSIZE_T yynewbytes;                                            \
+        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
+        Stack = &yyptr->Stack_alloc;                                    \
+        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+        yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                 \
+    while (0)
 
 #endif
 
@@ -402,7 +398,7 @@ union yyalloc
           for (yyi = 0; yyi < (Count); yyi++)   \
             (Dst)[yyi] = (Src)[yyi];            \
         }                                       \
-      while (YYID (0))
+      while (0)
 #  endif
 # endif
 #endif /* !YYCOPY_NEEDED */
@@ -418,17 +414,19 @@ union yyalloc
 #define YYNNTS  6
 /* YYNRULES -- Number of rules.  */
 #define YYNRULES  13
-/* YYNRULES -- Number of states.  */
+/* YYNSTATES -- Number of states.  */
 #define YYNSTATES  32
 
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
+   by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
 #define YYMAXUTOK   277
 
-#define YYTRANSLATE(YYX)                                               \
+#define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+   as returned by yylex, without out-of-bounds checking.  */
 static const yytype_uint8 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -462,29 +460,11 @@ static const yytype_uint8 yytranslate[] =
 };
 
 #if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-   YYRHS.  */
-static const yytype_uint8 yyprhs[] =
-{
-       0,     0,     3,     8,     9,    10,    19,    20,    27,    31,
-      35,    39,    42,    44
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
-static const yytype_int8 yyrhs[] =
-{
-      24,     0,    -1,     3,    17,    25,    18,    -1,    -1,    -1,
-      22,    14,    26,     4,    27,     5,    15,    25,    -1,    -1,
-      13,    28,     6,     7,    22,    27,    -1,    11,    28,    12,
-      -1,    28,     9,    28,    -1,    28,     8,    28,    -1,    10,
-      28,    -1,    16,    -1,    22,    -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint8 yyrline[] =
 {
-       0,    47,    47,    50,    51,    51,    54,    55,    58,    59,
-      60,    61,    62,    63
+       0,    53,    53,    56,    57,    57,    60,    61,    64,    65,
+      66,    67,    68,    69
 };
 #endif
 
@@ -497,13 +477,13 @@ static const char *const yytname[] =
   "AND", "OR", "NOT", "LEFT_PAR", "RIGHT_PAR", "CASE", "COLON",
   "SEMI_COLON", "CASE_TRUE", "LEFT_BRACE", "RIGHT_BRACE", "LITT_ENT",
   "LITT_CHAINE", "LITT_REEL", "ID", "$accept", "automaton", "stateseq",
-  "$@1", "option", "exp", YY_NULL
+  "$@1", "option", "exp", YY_NULLPTR
 };
 #endif
 
 # ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-   token YYLEX-NUM.  */
+/* YYTOKNUM[NUM] -- (External) token number corresponding to the
+   (internal) symbol number NUM (which must be that of a token).  */
 static const yytype_uint16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
@@ -512,23 +492,29 @@ static const yytype_uint16 yytoknum[] =
 };
 # endif
 
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const yytype_uint8 yyr1[] =
-{
-       0,    23,    24,    25,    26,    25,    27,    27,    28,    28,
-      28,    28,    28,    28
-};
+#define YYPACT_NINF -16
 
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const yytype_uint8 yyr2[] =
+#define yypact_value_is_default(Yystate) \
+  (!!((Yystate) == (-16)))
+
+#define YYTABLE_NINF -1
+
+#define yytable_value_is_error(Yytable_value) \
+  0
+
+  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+     STATE-NUM.  */
+static const yytype_int8 yypact[] =
 {
-       0,     2,     4,     0,     0,     8,     0,     6,     3,     3,
-       3,     2,     1,     1
+       0,   -15,    10,   -13,   -16,     2,     1,   -16,   -16,    16,
+       8,   -10,    17,   -10,   -10,   -16,   -16,     9,    11,   -16,
+      -1,    18,   -10,   -10,   -13,   -16,     5,   -16,   -16,   -16,
+       8,   -16
 };
 
-/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
-   Performed when YYTABLE doesn't specify something else to do.  Zero
-   means the default is an error.  */
+  /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+     Performed when YYTABLE does not specify something else to do.  Zero
+     means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
        0,     0,     0,     3,     1,     0,     0,     4,     2,     0,
@@ -537,33 +523,21 @@ static const yytype_uint8 yydefact[] =
        6,     7
 };
 
-/* YYDEFGOTO[NTERM-NUM].  */
-static const yytype_int8 yydefgoto[] =
-{
-      -1,     2,     6,     9,    12,    17
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-   STATE-NUM.  */
-#define YYPACT_NINF -16
-static const yytype_int8 yypact[] =
+  /* YYPGOTO[NTERM-NUM].  */
+static const yytype_int8 yypgoto[] =
 {
-       0,   -15,    10,   -13,   -16,     2,     1,   -16,   -16,    16,
-       8,   -10,    17,   -10,   -10,   -16,   -16,     9,    11,   -16,
-      -1,    18,   -10,   -10,   -13,   -16,     5,   -16,   -16,   -16,
-       8,   -16
+     -16,   -16,     4,   -16,    -7,    -9
 };
 
-/* YYPGOTO[NTERM-NUM].  */
-static const yytype_int8 yypgoto[] =
+  /* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int8 yydefgoto[] =
 {
-     -16,   -16,     4,   -16,    -7,    -9
+      -1,     2,     6,     9,    12,    17
 };
 
-/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
-   positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -1
+  /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
+     positive, shift that token.  If negative, reduce the rule whose
+     number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_uint8 yytable[] =
 {
       13,    14,     3,     1,    19,    20,    15,    22,    23,     5,
@@ -571,12 +545,6 @@ static const yytype_uint8 yytable[] =
       10,    11,    18,    31,     0,    26,    24,    30,    29
 };
 
-#define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-16)))
-
-#define yytable_value_is_error(Yytable_value) \
-  YYID (0)
-
 static const yytype_int8 yycheck[] =
 {
       10,    11,    17,     3,    13,    14,    16,     8,     9,    22,
@@ -584,8 +552,8 @@ static const yytype_int8 yycheck[] =
        4,    13,     5,    30,    -1,     7,    15,    22,    24
 };
 
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-   symbol of state STATE-NUM.  */
+  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+     symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
        0,     3,    24,    17,     0,    22,    25,    14,    18,    26,
@@ -594,30 +562,30 @@ static const yytype_uint8 yystos[] =
       22,    27
 };
 
-#define yyerrok                (yyerrstatus = 0)
-#define yyclearin      (yychar = YYEMPTY)
-#define YYEMPTY                (-2)
-#define YYEOF          0
-
-#define YYACCEPT       goto yyacceptlab
-#define YYABORT                goto yyabortlab
-#define YYERROR                goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror.  This remains here temporarily
-   to ease the transition to the new meaning of YYERROR, for GCC.
-   Once GCC version 2 has supplanted version 1, this can go.  However,
-   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
-   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
-   discussed.  */
-
-#define YYFAIL         goto yyerrlab
-#if defined YYFAIL
-  /* This is here to suppress warnings from the GCC cpp's
-     -Wunused-macros.  Normally we don't worry about that warning, but
-     some users do, and we want to make it easy for users to remove
-     YYFAIL uses, which will produce warnings from Bison 2.5.  */
-#endif
+  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint8 yyr1[] =
+{
+       0,    23,    24,    25,    26,    25,    27,    27,    28,    28,
+      28,    28,    28,    28
+};
+
+  /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     4,     0,     0,     8,     0,     6,     3,     3,
+       3,     2,     1,     1
+};
+
+
+#define yyerrok         (yyerrstatus = 0)
+#define yyclearin       (yychar = YYEMPTY)
+#define YYEMPTY         (-2)
+#define YYEOF           0
+
+#define YYACCEPT        goto yyacceptlab
+#define YYABORT         goto yyabortlab
+#define YYERROR         goto yyerrorlab
+
 
 #define YYRECOVERING()  (!!yyerrstatus)
 
@@ -634,27 +602,15 @@ do                                                              \
   else                                                          \
     {                                                           \
       yyerror (YY_("syntax error: cannot back up")); \
-      YYERROR;                                                 \
-    }                                                          \
-while (YYID (0))
+      YYERROR;                                                  \
+    }                                                           \
+while (0)
 
 /* Error token number */
-#define YYTERROR       1
-#define YYERRCODE      256
-
-
-/* This macro is provided for backward compatibility. */
-#ifndef YY_LOCATION_PRINT
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif
+#define YYTERROR        1
+#define YYERRCODE       256
 
 
-/* YYLEX -- calling `yylex' with the right arguments.  */
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (YYLEX_PARAM)
-#else
-# define YYLEX yylex ()
-#endif
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
@@ -664,40 +620,36 @@ while (YYID (0))
 #  define YYFPRINTF fprintf
 # endif
 
-# define YYDPRINTF(Args)                       \
-do {                                           \
-  if (yydebug)                                 \
-    YYFPRINTF Args;                            \
-} while (YYID (0))
+# define YYDPRINTF(Args)                        \
+do {                                            \
+  if (yydebug)                                  \
+    YYFPRINTF Args;                             \
+} while (0)
 
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                   \
-do {                                                                     \
-  if (yydebug)                                                           \
-    {                                                                    \
-      YYFPRINTF (stderr, "%s ", Title);                                          \
-      yy_symbol_print (stderr,                                           \
-                 Type, Value); \
-      YYFPRINTF (stderr, "\n");                                                  \
-    }                                                                    \
-} while (YYID (0))
+/* This macro is provided for backward compatibility. */
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
 
 
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
+do {                                                                      \
+  if (yydebug)                                                            \
+    {                                                                     \
+      YYFPRINTF (stderr, "%s ", Title);                                   \
+      yy_symbol_print (stderr,                                            \
+                  Type, Value); \
+      YYFPRINTF (stderr, "\n");                                           \
+    }                                                                     \
+} while (0)
+
+
+/*----------------------------------------.
+| Print this symbol's value on YYOUTPUT.  |
+`----------------------------------------*/
 
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static void
 yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_value_print (yyoutput, yytype, yyvaluep)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE const * const yyvaluep;
-#endif
 {
   FILE *yyo = yyoutput;
   YYUSE (yyo);
@@ -706,8 +658,6 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep)
 # ifdef YYPRINT
   if (yytype < YYNTOKENS)
     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
-  YYUSE (yyoutput);
 # endif
   YYUSE (yytype);
 }
@@ -717,22 +667,11 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep)
 | Print this symbol on YYOUTPUT.  |
 `--------------------------------*/
 
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static void
 yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_print (yyoutput, yytype, yyvaluep)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE const * const yyvaluep;
-#endif
 {
-  if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-  else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+  YYFPRINTF (yyoutput, "%s %s (",
+             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
 
   yy_symbol_value_print (yyoutput, yytype, yyvaluep);
   YYFPRINTF (yyoutput, ")");
@@ -743,16 +682,8 @@ yy_symbol_print (yyoutput, yytype, yyvaluep)
 | TOP (included).                                                   |
 `------------------------------------------------------------------*/
 
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static void
 yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
-#else
-static void
-yy_stack_print (yybottom, yytop)
-    yytype_int16 *yybottom;
-    yytype_int16 *yytop;
-#endif
 {
   YYFPRINTF (stderr, "Stack now");
   for (; yybottom <= yytop; yybottom++)
@@ -763,49 +694,42 @@ yy_stack_print (yybottom, yytop)
   YYFPRINTF (stderr, "\n");
 }
 
-# define YY_STACK_PRINT(Bottom, Top)                           \
-do {                                                           \
-  if (yydebug)                                                 \
-    yy_stack_print ((Bottom), (Top));                          \
-} while (YYID (0))
+# define YY_STACK_PRINT(Bottom, Top)                            \
+do {                                                            \
+  if (yydebug)                                                  \
+    yy_stack_print ((Bottom), (Top));                           \
+} while (0)
 
 
 /*------------------------------------------------.
 | Report that the YYRULE is going to be reduced.  |
 `------------------------------------------------*/
 
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
-#else
 static void
-yy_reduce_print (yyvsp, yyrule)
-    YYSTYPE *yyvsp;
-    int yyrule;
-#endif
+yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule)
 {
+  unsigned long int yylno = yyrline[yyrule];
   int yynrhs = yyr2[yyrule];
   int yyi;
-  unsigned long int yylno = yyrline[yyrule];
   YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
-            yyrule - 1, yylno);
+             yyrule - 1, yylno);
   /* The symbols being reduced.  */
   for (yyi = 0; yyi < yynrhs; yyi++)
     {
       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
-      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
-                      &(yyvsp[(yyi + 1) - (yynrhs)])
-                                      );
+      yy_symbol_print (stderr,
+                       yystos[yyssp[yyi + 1 - yynrhs]],
+                       &(yyvsp[(yyi + 1) - (yynrhs)])
+                                              );
       YYFPRINTF (stderr, "\n");
     }
 }
 
-# define YY_REDUCE_PRINT(Rule)         \
-do {                                   \
-  if (yydebug)                         \
-    yy_reduce_print (yyvsp, Rule); \
-} while (YYID (0))
+# define YY_REDUCE_PRINT(Rule)          \
+do {                                    \
+  if (yydebug)                          \
+    yy_reduce_print (yyssp, yyvsp, Rule); \
+} while (0)
 
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
@@ -819,7 +743,7 @@ int yydebug;
 
 
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
-#ifndef        YYINITDEPTH
+#ifndef YYINITDEPTH
 # define YYINITDEPTH 200
 #endif
 
@@ -842,15 +766,8 @@ int yydebug;
 #   define yystrlen strlen
 #  else
 /* Return the length of YYSTR.  */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static YYSIZE_T
 yystrlen (const char *yystr)
-#else
-static YYSIZE_T
-yystrlen (yystr)
-    const char *yystr;
-#endif
 {
   YYSIZE_T yylen;
   for (yylen = 0; yystr[yylen]; yylen++)
@@ -866,16 +783,8 @@ yystrlen (yystr)
 #  else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static char *
 yystpcpy (char *yydest, const char *yysrc)
-#else
-static char *
-yystpcpy (yydest, yysrc)
-    char *yydest;
-    const char *yysrc;
-#endif
 {
   char *yyd = yydest;
   const char *yys = yysrc;
@@ -905,27 +814,27 @@ yytnamerr (char *yyres, const char *yystr)
       char const *yyp = yystr;
 
       for (;;)
-       switch (*++yyp)
-         {
-         case '\'':
-         case ',':
-           goto do_not_strip_quotes;
-
-         case '\\':
-           if (*++yyp != '\\')
-             goto do_not_strip_quotes;
-           /* Fall through.  */
-         default:
-           if (yyres)
-             yyres[yyn] = *yyp;
-           yyn++;
-           break;
-
-         case '"':
-           if (yyres)
-             yyres[yyn] = '\0';
-           return yyn;
-         }
+        switch (*++yyp)
+          {
+          case '\'':
+          case ',':
+            goto do_not_strip_quotes;
+
+          case '\\':
+            if (*++yyp != '\\')
+              goto do_not_strip_quotes;
+            /* Fall through.  */
+          default:
+            if (yyres)
+              yyres[yyn] = *yyp;
+            yyn++;
+            break;
+
+          case '"':
+            if (yyres)
+              yyres[yyn] = '\0';
+            return yyn;
+          }
     do_not_strip_quotes: ;
     }
 
@@ -948,11 +857,11 @@ static int
 yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                 yytype_int16 *yyssp, int yytoken)
 {
-  YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]);
+  YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
   YYSIZE_T yysize = yysize0;
   enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
   /* Internationalized format string. */
-  const char *yyformat = YY_NULL;
+  const char *yyformat = YY_NULLPTR;
   /* Arguments of yyformat. */
   char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
   /* Number of reported tokens (one for the "unexpected", one per
@@ -960,10 +869,6 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
   int yycount = 0;
 
   /* There are many possibilities here to consider:
-     - Assume YYFAIL is not used.  It's too flawed to consider.  See
-       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
-       for details.  YYERROR is fine as it does not invoke this
-       function.
      - If this state is a consistent state with a default action, then
        the only way this function was invoked is if the default action
        is an error action.  In that case, don't check for expected
@@ -1013,7 +918,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                   }
                 yyarg[yycount++] = yytname[yyx];
                 {
-                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
+                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
                   if (! (yysize <= yysize1
                          && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
                     return 2;
@@ -1080,26 +985,17 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static void
 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yydestruct (yymsg, yytype, yyvaluep)
-    const char *yymsg;
-    int yytype;
-    YYSTYPE *yyvaluep;
-#endif
 {
   YYUSE (yyvaluep);
-
   if (!yymsg)
     yymsg = "Deleting";
   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   YYUSE (yytype);
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 }
 
 
@@ -1108,18 +1004,8 @@ yydestruct (yymsg, yytype, yyvaluep)
 /* The lookahead symbol.  */
 int yychar;
 
-
-#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define YY_IGNORE_MAYBE_UNINITIALIZED_END
-#endif
-#ifndef YY_INITIAL_VALUE
-# define YY_INITIAL_VALUE(Value) /* Nothing. */
-#endif
-
 /* The semantic value of the lookahead symbol.  */
-YYSTYPE yylval YY_INITIAL_VALUE(yyval_default);
-
+YYSTYPE yylval;
 /* Number of syntax errors so far.  */
 int yynerrs;
 
@@ -1128,35 +1014,16 @@ int yynerrs;
 | yyparse.  |
 `----------*/
 
-#ifdef YYPARSE_PARAM
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void *YYPARSE_PARAM)
-#else
-int
-yyparse (YYPARSE_PARAM)
-    void *YYPARSE_PARAM;
-#endif
-#else /* ! YYPARSE_PARAM */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 int
 yyparse (void)
-#else
-int
-yyparse ()
-
-#endif
-#endif
 {
     int yystate;
     /* Number of tokens to shift before error messages enabled.  */
     int yyerrstatus;
 
     /* The stacks and their tools:
-       `yyss': related to states.
-       `yyvs': related to semantic values.
+       'yyss': related to states.
+       'yyvs': related to semantic values.
 
        Refer to the stacks through separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
@@ -1224,23 +1091,23 @@ yyparse ()
 
 #ifdef yyoverflow
       {
-       /* Give user a chance to reallocate the stack.  Use copies of
-          these so that the &'s don't force the real ones into
-          memory.  */
-       YYSTYPE *yyvs1 = yyvs;
-       yytype_int16 *yyss1 = yyss;
-
-       /* Each stack pointer address is followed by the size of the
-          data in use in that stack, in bytes.  This used to be a
-          conditional around just the two extra args, but that might
-          be undefined if yyoverflow is a macro.  */
-       yyoverflow (YY_("memory exhausted"),
-                   &yyss1, yysize * sizeof (*yyssp),
-                   &yyvs1, yysize * sizeof (*yyvsp),
-                   &yystacksize);
-
-       yyss = yyss1;
-       yyvs = yyvs1;
+        /* Give user a chance to reallocate the stack.  Use copies of
+           these so that the &'s don't force the real ones into
+           memory.  */
+        YYSTYPE *yyvs1 = yyvs;
+        yytype_int16 *yyss1 = yyss;
+
+        /* Each stack pointer address is followed by the size of the
+           data in use in that stack, in bytes.  This used to be a
+           conditional around just the two extra args, but that might
+           be undefined if yyoverflow is a macro.  */
+        yyoverflow (YY_("memory exhausted"),
+                    &yyss1, yysize * sizeof (*yyssp),
+                    &yyvs1, yysize * sizeof (*yyvsp),
+                    &yystacksize);
+
+        yyss = yyss1;
+        yyvs = yyvs1;
       }
 #else /* no yyoverflow */
 # ifndef YYSTACK_RELOCATE
@@ -1248,22 +1115,22 @@ yyparse ()
 # else
       /* Extend the stack our own way.  */
       if (YYMAXDEPTH <= yystacksize)
-       goto yyexhaustedlab;
+        goto yyexhaustedlab;
       yystacksize *= 2;
       if (YYMAXDEPTH < yystacksize)
-       yystacksize = YYMAXDEPTH;
+        yystacksize = YYMAXDEPTH;
 
       {
-       yytype_int16 *yyss1 = yyss;
-       union yyalloc *yyptr =
-         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-       if (! yyptr)
-         goto yyexhaustedlab;
-       YYSTACK_RELOCATE (yyss_alloc, yyss);
-       YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+        yytype_int16 *yyss1 = yyss;
+        union yyalloc *yyptr =
+          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+        if (! yyptr)
+          goto yyexhaustedlab;
+        YYSTACK_RELOCATE (yyss_alloc, yyss);
+        YYSTACK_RELOCATE (yyvs_alloc, yyvs);
 #  undef YYSTACK_RELOCATE
-       if (yyss1 != yyssa)
-         YYSTACK_FREE (yyss1);
+        if (yyss1 != yyssa)
+          YYSTACK_FREE (yyss1);
       }
 # endif
 #endif /* no yyoverflow */
@@ -1272,10 +1139,10 @@ yyparse ()
       yyvsp = yyvs + yysize - 1;
 
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-                 (unsigned long int) yystacksize));
+                  (unsigned long int) yystacksize));
 
       if (yyss + yystacksize - 1 <= yyssp)
-       YYABORT;
+        YYABORT;
     }
 
   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
@@ -1304,7 +1171,7 @@ yybackup:
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
-      yychar = YYLEX;
+      yychar = yylex ();
     }
 
   if (yychar <= YYEOF)
@@ -1369,7 +1236,7 @@ yyreduce:
   yylen = yyr2[yyn];
 
   /* If YYLEN is nonzero, implement the default value of the action:
-     `$$ = $1'.
+     '$$ = $1'.
 
      Otherwise, the following line sets YYVAL to garbage.
      This behavior is undocumented and Bison
@@ -1383,56 +1250,55 @@ yyreduce:
   switch (yyn)
     {
         case 4:
-/* Line 1787 of yacc.c  */
-#line 51 "parserPromela.yacc"
-    { new_state((yyvsp[(1) - (2)].string), 1);}
+#line 57 "parserPromela.yacc" /* yacc.c:1646  */
+    { new_state((yyvsp[-1].string), 1);}
+#line 1256 "parserPromela.tab.cacc" /* yacc.c:1646  */
     break;
 
   case 7:
-/* Line 1787 of yacc.c  */
-#line 55 "parserPromela.yacc"
-    { new_transition((yyvsp[(5) - (6)].string), (yyvsp[(2) - (6)].label));}
+#line 61 "parserPromela.yacc" /* yacc.c:1646  */
+    { new_transition((yyvsp[-1].string), (yyvsp[-4].label));}
+#line 1262 "parserPromela.tab.cacc" /* yacc.c:1646  */
     break;
 
   case 8:
-/* Line 1787 of yacc.c  */
-#line 58 "parserPromela.yacc"
-    { (yyval.label) = (yyvsp[(2) - (3)].label); }
+#line 64 "parserPromela.yacc" /* yacc.c:1646  */
+    { (yyval.label) = (yyvsp[-1].label); }
+#line 1268 "parserPromela.tab.cacc" /* yacc.c:1646  */
     break;
 
   case 9:
-/* Line 1787 of yacc.c  */
-#line 59 "parserPromela.yacc"
-    { (yyval.label) = new_label(0, (yyvsp[(1) - (3)].label), (yyvsp[(3) - (3)].label)); }
+#line 65 "parserPromela.yacc" /* yacc.c:1646  */
+    { (yyval.label) = new_label(0, (yyvsp[-2].label), (yyvsp[0].label)); }
+#line 1274 "parserPromela.tab.cacc" /* yacc.c:1646  */
     break;
 
   case 10:
-/* Line 1787 of yacc.c  */
-#line 60 "parserPromela.yacc"
-    { (yyval.label) = new_label(1, (yyvsp[(1) - (3)].label), (yyvsp[(3) - (3)].label)); }
+#line 66 "parserPromela.yacc" /* yacc.c:1646  */
+    { (yyval.label) = new_label(1, (yyvsp[-2].label), (yyvsp[0].label)); }
+#line 1280 "parserPromela.tab.cacc" /* yacc.c:1646  */
     break;
 
   case 11:
-/* Line 1787 of yacc.c  */
-#line 61 "parserPromela.yacc"
-    { (yyval.label) = new_label(2, (yyvsp[(2) - (2)].label)); }
+#line 67 "parserPromela.yacc" /* yacc.c:1646  */
+    { (yyval.label) = new_label(2, (yyvsp[0].label)); }
+#line 1286 "parserPromela.tab.cacc" /* yacc.c:1646  */
     break;
 
   case 12:
-/* Line 1787 of yacc.c  */
-#line 62 "parserPromela.yacc"
+#line 68 "parserPromela.yacc" /* yacc.c:1646  */
     { (yyval.label) = new_label(4); }
+#line 1292 "parserPromela.tab.cacc" /* yacc.c:1646  */
     break;
 
   case 13:
-/* Line 1787 of yacc.c  */
-#line 63 "parserPromela.yacc"
-    { (yyval.label) = new_label(3, (yyvsp[(1) - (1)].string)); }
+#line 69 "parserPromela.yacc" /* yacc.c:1646  */
+    { (yyval.label) = new_label(3, (yyvsp[0].string)); }
+#line 1298 "parserPromela.tab.cacc" /* yacc.c:1646  */
     break;
 
 
-/* Line 1787 of yacc.c  */
-#line 1436 "parserPromela.tab.cacc"
+#line 1302 "parserPromela.tab.cacc" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -1454,7 +1320,7 @@ yyreduce:
 
   *++yyvsp = yyval;
 
-  /* Now `shift' the result of the reduction.  Determine what state
+  /* Now 'shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
      number reduced by.  */
 
@@ -1469,9 +1335,9 @@ yyreduce:
   goto yynewstate;
 
 
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
+/*--------------------------------------.
+| yyerrlab -- here on detecting error |
+`--------------------------------------*/
 yyerrlab:
   /* Make sure we have latest lookahead translation.  See comments at
      user semantic actions for why this is necessary.  */
@@ -1522,20 +1388,20 @@ yyerrlab:
   if (yyerrstatus == 3)
     {
       /* If just tried and failed to reuse lookahead token after an
-        error, discard it.  */
+         error, discard it.  */
 
       if (yychar <= YYEOF)
-       {
-         /* Return failure if at end of input.  */
-         if (yychar == YYEOF)
-           YYABORT;
-       }
+        {
+          /* Return failure if at end of input.  */
+          if (yychar == YYEOF)
+            YYABORT;
+        }
       else
-       {
-         yydestruct ("Error: discarding",
-                     yytoken, &yylval);
-         yychar = YYEMPTY;
-       }
+        {
+          yydestruct ("Error: discarding",
+                      yytoken, &yylval);
+          yychar = YYEMPTY;
+        }
     }
 
   /* Else will try to reuse lookahead token after shifting the error
@@ -1554,7 +1420,7 @@ yyerrorlab:
   if (/*CONSTCOND*/ 0)
      goto yyerrorlab;
 
-  /* Do not reclaim the symbols of the rule which action triggered
+  /* Do not reclaim the symbols of the rule whose action triggered
      this YYERROR.  */
   YYPOPSTACK (yylen);
   yylen = 0;
@@ -1567,29 +1433,29 @@ yyerrorlab:
 | yyerrlab1 -- common code for both syntax error and YYERROR.  |
 `-------------------------------------------------------------*/
 yyerrlab1:
-  yyerrstatus = 3;     /* Each real token shifted decrements this.  */
+  yyerrstatus = 3;      /* Each real token shifted decrements this.  */
 
   for (;;)
     {
       yyn = yypact[yystate];
       if (!yypact_value_is_default (yyn))
-       {
-         yyn += YYTERROR;
-         if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-           {
-             yyn = yytable[yyn];
-             if (0 < yyn)
-               break;
-           }
-       }
+        {
+          yyn += YYTERROR;
+          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+            {
+              yyn = yytable[yyn];
+              if (0 < yyn)
+                break;
+            }
+        }
 
       /* Pop the current state because it cannot handle the error token.  */
       if (yyssp == yyss)
-       YYABORT;
+        YYABORT;
 
 
       yydestruct ("Error: popping",
-                 yystos[yystate], yyvsp);
+                  yystos[yystate], yyvsp);
       YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
@@ -1640,14 +1506,14 @@ yyreturn:
       yydestruct ("Cleanup: discarding lookahead",
                   yytoken, &yylval);
     }
-  /* Do not reclaim the symbols of the rule which action triggered
+  /* Do not reclaim the symbols of the rule whose action triggered
      this YYABORT or YYACCEPT.  */
   YYPOPSTACK (yylen);
   YY_STACK_PRINT (yyss, yyssp);
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
-                 yystos[*yyssp], yyvsp);
+                  yystos[*yyssp], yyvsp);
       YYPOPSTACK (1);
     }
 #ifndef yyoverflow
@@ -1658,13 +1524,9 @@ yyreturn:
   if (yymsg != yymsgbuf)
     YYSTACK_FREE (yymsg);
 #endif
-  /* Make sure YYID is used.  */
-  return YYID (yyresult);
+  return yyresult;
 }
-
-
-/* Line 2050 of yacc.c  */
-#line 66 "parserPromela.yacc"
+#line 72 "parserPromela.yacc" /* yacc.c:1906  */
 
 
 
index 483349a..587506e 100644 (file)
@@ -1,19 +1,19 @@
-/* A Bison parser, made by GNU Bison 2.7.12-4996.  */
+/* A Bison parser, made by GNU Bison 3.0.2.  */
 
 /* Bison interface for Yacc-like parsers in C
-   
-      Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
-   
+
+   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
+
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-   
+
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
 #ifndef YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
 # define YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
-/* Enabling traces.  */
+/* Debug traces.  */
 #ifndef YYDEBUG
 # define YYDEBUG 0
 #endif
 extern int xbt_automaton_parser_debug;
 #endif
 
-/* Tokens.  */
+/* Token type.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     NEVER = 258,
-     IF = 259,
-     FI = 260,
-     IMPLIES = 261,
-     GOTO = 262,
-     AND = 263,
-     OR = 264,
-     NOT = 265,
-     LEFT_PAR = 266,
-     RIGHT_PAR = 267,
-     CASE = 268,
-     COLON = 269,
-     SEMI_COLON = 270,
-     CASE_TRUE = 271,
-     LEFT_BRACE = 272,
-     RIGHT_BRACE = 273,
-     LITT_ENT = 274,
-     LITT_CHAINE = 275,
-     LITT_REEL = 276,
-     ID = 277
-   };
+  enum yytokentype
+  {
+    NEVER = 258,
+    IF = 259,
+    FI = 260,
+    IMPLIES = 261,
+    GOTO = 262,
+    AND = 263,
+    OR = 264,
+    NOT = 265,
+    LEFT_PAR = 266,
+    RIGHT_PAR = 267,
+    CASE = 268,
+    COLON = 269,
+    SEMI_COLON = 270,
+    CASE_TRUE = 271,
+    LEFT_BRACE = 272,
+    RIGHT_BRACE = 273,
+    LITT_ENT = 274,
+    LITT_CHAINE = 275,
+    LITT_REEL = 276,
+    ID = 277
+  };
 #endif
 
-
+/* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
+typedef union YYSTYPE YYSTYPE;
+union YYSTYPE
 {
-/* Line 2053 of yacc.c  */
-#line 10 "parserPromela.yacc"
+#line 16 "parserPromela.yacc" /* yacc.c:1909  */
 
   double real;
   int integer;
   char* string;
   xbt_automaton_exp_label_t label;
 
-
-/* Line 2053 of yacc.c  */
-#line 87 "parserPromela.tab.hacc"
-} YYSTYPE;
+#line 84 "parserPromela.tab.hacc" /* yacc.c:1909  */
+};
 # define YYSTYPE_IS_TRIVIAL 1
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 #endif
 
+
 extern YYSTYPE xbt_automaton_parser_lval;
 
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int xbt_automaton_parser_parse (void *YYPARSE_PARAM);
-#else
-int xbt_automaton_parser_parse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
 int xbt_automaton_parser_parse (void);
-#else
-int xbt_automaton_parser_parse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
 
 #endif /* !YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED  */
index c74d2ce..57468b6 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 "automaton_lexer.yy.c"
index 3b86fe7..20970ec 100644 (file)
@@ -1,6 +1,6 @@
 /* backtrace_dummy -- stubs of this module for non-supported archs          */
 
-/* Copyright (c) 2008-2012. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index b7cb1de..b32ec96 100644 (file)
@@ -1,7 +1,7 @@
 /* backtrace_linux - backtrace displaying on linux platform                 */
 /* This file is included by ex.c on need (have execinfo.h, popen & addrline)*/
 
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index c21dacc..0953a8d 100644 (file)
@@ -1,7 +1,7 @@
 /* backtrace_windows - backtrace displaying on windows platform             */
 /* This file is included by ex.c on need (windows x86)                      */
 
-/* Copyright (c) 2008-2012. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 7873dd4..0eb3145 100644 (file)
@@ -2,7 +2,7 @@
 
 /* This is useful to build named structs, like option or property sets.     */
 
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index dd06384..0a603bf 100644 (file)
@@ -1,6 +1,6 @@
 /* cunit - A little C Unit facility                                         */
 
-/* Copyright (c) 2005-2012. The SimGrid Team.
+/* Copyright (c) 2005-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3984e43..0d8985f 100644 (file)
@@ -1,6 +1,6 @@
 /* dict - a generic dictionary, variation over hash table                   */
 
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index c39e65d..68c5440 100644 (file)
@@ -1,6 +1,6 @@
 /* dict_cursor - iterators over dictionnaries                               */
 
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3ac7b11..286ffe7 100644 (file)
@@ -1,6 +1,6 @@
 /* dict - a generic dictionary, variation over hash table                   */
 
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3051278..a8ef163 100644 (file)
@@ -1,6 +1,6 @@
 /* dict_multi - dictionnaries of dictionnaries of ... of data               */
 
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index f5ccfd9..34eb4d0 100644 (file)
@@ -1,7 +1,7 @@
 /* dict_elm - elements of generic dictionnaries                             */
 /* This file is not to be loaded from anywhere but dict.c                   */
 
-/* Copyright (c) 2004-2011, 2013. The SimGrid Team.
+/* Copyright (c) 2004-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d9e20b9..7b02657 100644 (file)
@@ -1,6 +1,6 @@
 /* a generic DYNamic ARray implementation.                                  */
 
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -638,11 +638,7 @@ XBT_INLINE void xbt_dynar_cursor_rm(xbt_dynar_t dynar,
 XBT_INLINE void xbt_dynar_sort(xbt_dynar_t dynar,
                                int_f_cpvoid_cpvoid_t compar_fn)
 {
-#ifdef HAVE_MERGESORT
-  mergesort(dynar->data, dynar->used, dynar->elmsize, compar_fn);
-#else
   qsort(dynar->data, dynar->used, dynar->elmsize, compar_fn);
-#endif
 }
 
 /** @brief Sorts a dynar according to their color assuming elements can have only three colors.
@@ -691,10 +687,13 @@ XBT_PUBLIC(void) xbt_dynar_three_way_partition(xbt_dynar_t const dynar,
 }
 
 /** @brief Transform a dynar into a NULL terminated array. 
- *  The dynar won't be usable afterwards.
- * \param dynar the dynar to transform
+ *
+ *  \param dynar the dynar to transform
+ *  \return pointer to the first element of the array
+ *
+ *  Note: The dynar won't be usable afterwards.
  */
-XBT_INLINE void * xbt_dynar_to_array (xbt_dynar_t dynar)
+XBT_INLINE void *xbt_dynar_to_array(xbt_dynar_t dynar)
 {
   void *res;
   xbt_dynar_shrink(dynar, 1);
@@ -704,8 +703,17 @@ XBT_INLINE void * xbt_dynar_to_array (xbt_dynar_t dynar)
   return res;
 }
 
-/*
- * Return 0 if d1 and d2 are equal and 1 if not equal
+/** @brief Compare two dynars
+ *
+ *  \param d1 first dynar to compare
+ *  \param d2 second dynar to compare
+ *  \param compar function to use to compare elements
+ *  \return 0 if d1 and d2 are equal and 1 if not equal
+ *
+ *  d1 and d2 should be dynars of pointers. The compar function takes two
+ *  elements and returns 0 when they are considered equal, and a value different
+ *  of zero when they are considered different. Finally, d2 is destroyed
+ *  afterwards.
  */
 int xbt_dynar_compare(xbt_dynar_t d1, xbt_dynar_t d2,
           int(*compar)(const void *, const void *))
index 9433046..4b0d7bd 100644 (file)
@@ -1,6 +1,8 @@
 /* ex - Exception Handling                                                  */
 
-/*  Copyright (c) 2005-2013. The SimGrid Team.                              */
+/* Copyright (c) 2005-2014. The SimGrid Team.
+ * All rights reserved.                                                     */
+
 /*  Copyright (c) 2002-2004 Ralf S. Engelschall <rse@engelschall.com>       */
 /*  Copyright (c) 2002-2004 The OSSP Project <http://www.ossp.org/>         */
 /*  Copyright (c) 2002-2004 Cable & Wireless <http://www.cw.com/>           */
@@ -223,6 +225,9 @@ const char *xbt_ex_catname(xbt_errcat_t cat)
     return "tracing error";
   case io_error:
     return "io error";
+  case vm_error:
+    return "vm error";
+
   }
   return "INVALID ERROR";
 }
index 11ebf27..3abaede 100644 (file)
@@ -2,7 +2,7 @@
 /* This file is to loaded in any location defining exception handlers       */
 /* (such as context.c), to exchange them.        */
 
-/* Copyright (c) 2006-2007, 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2006-2007, 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index adaa88d..b13b9e1 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 64067af..47bdc4d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004, 2009-2010. The SimGrid Team.
+/* Copyright (c) 2004, 2009-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 6e5fdb1..52bed43 100644 (file)
@@ -1,6 +1,6 @@
 /* a generic graph library.                                                 */
 
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 9028ed6..819a11f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006, 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2006, 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 0f5a9e4..7c6579d 100644 (file)
@@ -474,8 +474,8 @@ static yyconst flex_int16_t yy_accept[564] =
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   13,    0,    0,   14,
-        0,   15,    0
+        0,    0,    0,    0,    0,    0,   15,    0,    0,   13,
+        0,   14,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -1135,42 +1135,42 @@ const char graphxml_flexml_version[] = "1.9.6";
 int graphxml_pcdata_ix;
 extern char *graphxml_bufferstack;
 #define graphxml_pcdata (graphxml_bufferstack + graphxml_pcdata_ix)
-AT_graphxml_node_name AX_graphxml_node_name;
-#define A_graphxml_node_name (graphxml_bufferstack + AX_graphxml_node_name)
-short int graphxml_node_name_isset;
 AT_graphxml_edge_source AX_graphxml_edge_source;
 #define A_graphxml_edge_source (graphxml_bufferstack + AX_graphxml_edge_source)
 short int graphxml_edge_source_isset;
-AT_graphxml_node_position___y AX_graphxml_node_position___y;
-#define A_graphxml_node_position___y (graphxml_bufferstack + AX_graphxml_node_position___y)
-short int graphxml_node_position___y_isset;
-AT_graphxml_node_position___x AX_graphxml_node_position___x;
-#define A_graphxml_node_position___x (graphxml_bufferstack + AX_graphxml_node_position___x)
-short int graphxml_node_position___x_isset;
-AT_graphxml_edge_data AX_graphxml_edge_data;
-#define A_graphxml_edge_data (graphxml_bufferstack + AX_graphxml_edge_data)
-short int graphxml_edge_data_isset;
 AT_graphxml_edge_target AX_graphxml_edge_target;
 #define A_graphxml_edge_target (graphxml_bufferstack + AX_graphxml_edge_target)
 short int graphxml_edge_target_isset;
-AT_graphxml_graph_isDirected AX_graphxml_graph_isDirected;
-#define A_graphxml_graph_isDirected AX_graphxml_graph_isDirected
-short int graphxml_graph_isDirected_isset;
-AT_graphxml_node_label AX_graphxml_node_label;
-#define A_graphxml_node_label (graphxml_bufferstack + AX_graphxml_node_label)
-short int graphxml_node_label_isset;
+AT_graphxml_edge_name AX_graphxml_edge_name;
+#define A_graphxml_edge_name (graphxml_bufferstack + AX_graphxml_edge_name)
+short int graphxml_edge_name_isset;
+AT_graphxml_node_position___y AX_graphxml_node_position___y;
+#define A_graphxml_node_position___y (graphxml_bufferstack + AX_graphxml_node_position___y)
+short int graphxml_node_position___y_isset;
 AT_graphxml_node_data AX_graphxml_node_data;
 #define A_graphxml_node_data (graphxml_bufferstack + AX_graphxml_node_data)
 short int graphxml_node_data_isset;
-AT_graphxml_edge_label AX_graphxml_edge_label;
-#define A_graphxml_edge_label (graphxml_bufferstack + AX_graphxml_edge_label)
-short int graphxml_edge_label_isset;
 AT_graphxml_edge_length AX_graphxml_edge_length;
 #define A_graphxml_edge_length (graphxml_bufferstack + AX_graphxml_edge_length)
 short int graphxml_edge_length_isset;
-AT_graphxml_edge_name AX_graphxml_edge_name;
-#define A_graphxml_edge_name (graphxml_bufferstack + AX_graphxml_edge_name)
-short int graphxml_edge_name_isset;
+AT_graphxml_node_label AX_graphxml_node_label;
+#define A_graphxml_node_label (graphxml_bufferstack + AX_graphxml_node_label)
+short int graphxml_node_label_isset;
+AT_graphxml_edge_label AX_graphxml_edge_label;
+#define A_graphxml_edge_label (graphxml_bufferstack + AX_graphxml_edge_label)
+short int graphxml_edge_label_isset;
+AT_graphxml_graph_isDirected AX_graphxml_graph_isDirected;
+#define A_graphxml_graph_isDirected AX_graphxml_graph_isDirected
+short int graphxml_graph_isDirected_isset;
+AT_graphxml_node_position___x AX_graphxml_node_position___x;
+#define A_graphxml_node_position___x (graphxml_bufferstack + AX_graphxml_node_position___x)
+short int graphxml_node_position___x_isset;
+AT_graphxml_edge_data AX_graphxml_edge_data;
+#define A_graphxml_edge_data (graphxml_bufferstack + AX_graphxml_edge_data)
+short int graphxml_edge_data_isset;
+AT_graphxml_node_name AX_graphxml_node_name;
+#define A_graphxml_node_name (graphxml_bufferstack + AX_graphxml_node_name)
+short int graphxml_node_name_isset;
 
 /* XML state. */
 #ifdef FLEX_DEBUG
@@ -1744,17 +1744,17 @@ FAIL("Bad declaration %s.",xbt_graph_parse_text);
 case 13:
 /* rule 13 can match eol */
 YY_RULE_SETUP
-SET(ROOT_graphxml_edge);
+SET(ROOT_graphxml_node);
        YY_BREAK
 case 14:
 /* rule 14 can match eol */
 YY_RULE_SETUP
-SET(ROOT_graphxml_node);
+SET(ROOT_graphxml_graph);
        YY_BREAK
 case 15:
 /* rule 15 can match eol */
 YY_RULE_SETUP
-SET(ROOT_graphxml_graph);
+SET(ROOT_graphxml_edge);
        YY_BREAK
 case 16:
 /* rule 16 can match eol */
@@ -1851,11 +1851,11 @@ case 30:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</graph>' expected.",xbt_graph_parse_text[0]);
        YY_BREAK
-case YY_STATE_EOF(S_graphxml_graph_1):
-case YY_STATE_EOF(E_graphxml_graph):
 case YY_STATE_EOF(S_graphxml_graph_3):
-case YY_STATE_EOF(S_graphxml_graph_5):
+case YY_STATE_EOF(E_graphxml_graph):
+case YY_STATE_EOF(S_graphxml_graph_1):
 case YY_STATE_EOF(S_graphxml_graph):
+case YY_STATE_EOF(S_graphxml_graph_5):
 FAIL("Premature EOF: `</graph>' expected.");
        YY_BREAK
 
@@ -1951,7 +1951,7 @@ YY_RULE_SETUP
   if (!AX_graphxml_node_name) FAIL("Required attribute `name' not set for `node' element.");
   LEAVE; STag_graphxml_node(); graphxml_pcdata_ix = 0; ETag_graphxml_node(); popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_graphxml_graph_2: case S_graphxml_graph_3: case S_graphxml_graph: SET(S_graphxml_graph_3); break;
+   case S_graphxml_graph_3: case S_graphxml_graph_2: case S_graphxml_graph: SET(S_graphxml_graph_3); break;
    case ROOT_graphxml_node: SET(EPILOG); break;
   }
  }
@@ -1976,7 +1976,7 @@ YY_RULE_SETUP
   ETag_graphxml_node();
   popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_graphxml_graph_2: case S_graphxml_graph_3: case S_graphxml_graph: SET(S_graphxml_graph_3); break;
+   case S_graphxml_graph_3: case S_graphxml_graph_2: case S_graphxml_graph: SET(S_graphxml_graph_3); break;
    case ROOT_graphxml_node: SET(EPILOG); break;
   }
  }
@@ -2101,7 +2101,7 @@ YY_RULE_SETUP
   if (!AX_graphxml_edge_target) FAIL("Required attribute `target' not set for `edge' element.");
   LEAVE; STag_graphxml_edge(); graphxml_pcdata_ix = 0; ETag_graphxml_edge(); popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_graphxml_graph_1: case S_graphxml_graph_3: case S_graphxml_graph_5: case S_graphxml_graph_4: case S_graphxml_graph: SET(S_graphxml_graph_5); break;
+   case S_graphxml_graph_3: case S_graphxml_graph_1: case S_graphxml_graph: case S_graphxml_graph_4: case S_graphxml_graph_5: SET(S_graphxml_graph_5); break;
    case ROOT_graphxml_edge: SET(EPILOG); break;
   }
  }
@@ -2126,7 +2126,7 @@ YY_RULE_SETUP
   ETag_graphxml_edge();
   popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_graphxml_graph_1: case S_graphxml_graph_3: case S_graphxml_graph_5: case S_graphxml_graph_4: case S_graphxml_graph: SET(S_graphxml_graph_5); break;
+   case S_graphxml_graph_3: case S_graphxml_graph_1: case S_graphxml_graph: case S_graphxml_graph_4: case S_graphxml_graph_5: SET(S_graphxml_graph_5); break;
    case ROOT_graphxml_edge: SET(EPILOG); break;
   }
  }
index 679e9b1..d143e32 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2011. The SimGrid Team.
+/* Copyright (c) 2006-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index ac3cafe..292b5f7 100644 (file)
@@ -1,6 +1,6 @@
 /* a generic and efficient heap                                             */
 
-/* Copyright (c) 2004-2005, 2007-2013. The SimGrid Team.
+/* Copyright (c) 2004-2005, 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 6ff1e78..0186ee1 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2005, 2007, 2009-2012. The SimGrid Team.
+/* Copyright (c) 2004-2005, 2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index cc6f9e6..8c594cf 100644 (file)
@@ -1,6 +1,6 @@
 /* lib - a generic library, variation over dictionary                    */
 
-/* Copyright (c) 2011, 2013. The SimGrid Team.
+/* Copyright (c) 2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -70,6 +70,37 @@ void xbt_lib_set(xbt_lib_t lib, const char *key, int level, void *obj)
   elts[level] = obj;
 }
 
+/* for vm */
+void xbt_lib_unset(xbt_lib_t lib, const char *key, int level, int invoke_callback)
+{
+  void **elts = xbt_dict_get_or_null(lib->dict, key);
+  if (!elts) {
+     XBT_WARN("no key %s", key);
+     return;
+  }
+
+  void *obj = elts[level];
+
+  if (!obj) {
+     XBT_WARN("no key %s at level %d", key, level);
+  } else {
+     XBT_DEBUG("Remove %p of key %s at level %d", obj, key, level);
+     if (invoke_callback)
+       lib->free_f[level](obj);
+     elts[level] = NULL;
+  }
+
+  /* check if there still remains any elements of this key */
+  int i;
+  for (i = 0; i < lib->levels; i++) {
+     if (elts[i] != NULL)
+       return;
+  }
+
+  /* there is no element at any level, so delete the key */
+  xbt_dict_remove(lib->dict, key);
+}
+
 void *xbt_lib_get_or_null(xbt_lib_t lib, const char *key, int level)
 {
   void **elts = xbt_dict_get_or_null(lib->dict, key);
@@ -85,3 +116,7 @@ void *xbt_lib_get_level(xbt_dictelm_t elm, int level){
   void **elts = elm->content;
   return elts ? elts[level] : NULL;
 }
+
+void xbt_lib_remove(xbt_lib_t lib, const char *key){
+  xbt_dict_remove(lib->dict, key);
+}
index dbea34a..24d7ec4 100644 (file)
@@ -1,12 +1,11 @@
 /* log - a generic logging facility in the spirit of log4j                  */
 
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. 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 <stdarg.h>
 #include <ctype.h>
 #include <stdio.h>              /* snprintf */
@@ -546,7 +545,7 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(xbt);
   XBT_LOG_CONNECT(graphxml_parse);
   XBT_LOG_CONNECT(log);
-#if HAVE_MMAP
+#if HAVE_MMALLOC
   XBT_LOG_CONNECT(mm_diff);
 #endif
   XBT_LOG_CONNECT(module);
@@ -667,6 +666,7 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(simix_process);
   XBT_LOG_CONNECT(simix_smurf);
   XBT_LOG_CONNECT(simix_synchro);
+  XBT_LOG_CONNECT(simix_vm);
 
   /* smpi */
   /* SMPI categories are connected in smpi_global.c */
@@ -677,13 +677,14 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(random);
   XBT_LOG_CONNECT(surf_config);
   XBT_LOG_CONNECT(surf_cpu);
+  XBT_LOG_CONNECT(surf_cpu_cas);
   XBT_LOG_CONNECT(surf_cpu_ti);
+  XBT_LOG_CONNECT(surf_energy);
   XBT_LOG_CONNECT(surf_kernel);
   XBT_LOG_CONNECT(surf_lagrange);
   XBT_LOG_CONNECT(surf_lagrange_dichotomy);
   XBT_LOG_CONNECT(surf_maxmin);
   XBT_LOG_CONNECT(surf_network);
-  XBT_LOG_CONNECT(surf_new_model);
 #ifdef HAVE_GTNETS
   XBT_LOG_CONNECT(surf_network_gtnets);
   XBT_LOG_CONNECT(surf_network_gtnets_interface);
@@ -699,6 +700,7 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(surf_route);
   XBT_LOG_CONNECT(surf_routing_generic);
   XBT_LOG_CONNECT(surf_route_cluster);
+  XBT_LOG_CONNECT(surf_route_cluster_torus);
   XBT_LOG_CONNECT(surf_route_dijkstra);
   XBT_LOG_CONNECT(surf_route_floyd);
   XBT_LOG_CONNECT(surf_route_full);
@@ -706,6 +708,7 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(surf_route_vivaldi);
   XBT_LOG_CONNECT(surf_storage);
   XBT_LOG_CONNECT(surf_trace);
+  XBT_LOG_CONNECT(surf_vm_workstation);
   XBT_LOG_CONNECT(surf_workstation);
 
 #endif /* simgrid_EXPORTS */
index 56692e6..7afcafd 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2011. The SimGrid Team.
+/* Copyright (c) 2007-2011, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8528834..9ac395b 100644 (file)
@@ -1,6 +1,6 @@
 /* mallocator - recycle objects to avoid malloc() / free()                  */
 
-/* Copyright (c) 2006-2012. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 266c026..603e231 100644 (file)
@@ -1,6 +1,6 @@
 /* mallocator - recycle objects to avoid malloc() / free()                  */
 
-/* Copyright (c) 2006-2012. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 6cfd06c..322d818 100644 (file)
@@ -4,7 +4,7 @@
    Written May 1989 by Mike Haertel.
    Heavily modified Mar 1992 by Fred Fish.  (fnf@cygnus.com) */
 
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -34,7 +34,7 @@ void mfree(struct mdesc *mdp, void *ptr)
   block = BLOCK(ptr);
 
   if ((char *) ptr < (char *) mdp->heapbase || block > mdp->heapsize) {
-    fprintf(stderr,"Ouch, this pointer is not mine. I refuse to free it. I refuse it to death!!\n");
+    fprintf(stderr,"Ouch, this pointer is not mine, I refuse to free it. Give me valid pointers, or give me death!!\n");
     abort();
   }
 
index d5d5610..074dec3 100644 (file)
@@ -6,7 +6,7 @@
 
 /* Copyright 1996, 2000 Free Software Foundation  */
 
-/* Copyright (c) 2010, 2012. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index ec4c90c..c681d8b 100644 (file)
@@ -1,6 +1,6 @@
 /* mm_diff - Memory snapshooting and comparison                             */
 
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -781,6 +781,9 @@ static int compare_heap_area_with_type(struct s_mm_diff *state, void *real_area1
   void *addr_pointed1, *addr_pointed2;;
 
   switch(type->type){
+  case DW_TAG_unspecified_type:
+    return 1;
+
   case DW_TAG_base_type:
     if(type->name!=NULL && strcmp(type->name, "char") == 0){ /* String, hence random (arbitrary ?) size */
       if(real_area1 == real_area2)
@@ -809,10 +812,16 @@ static int compare_heap_area_with_type(struct s_mm_diff *state, void *real_area1
   case DW_TAG_array_type:
     subtype = xbt_dict_get_or_null(info->types, type->dw_type_id);
     switch(subtype->type){
+    case DW_TAG_unspecified_type:
+      return 1;
+
     case DW_TAG_base_type:
     case DW_TAG_enumeration_type:
     case DW_TAG_pointer_type:
+    case DW_TAG_reference_type:
+    case DW_TAG_rvalue_reference_type:
     case DW_TAG_structure_type:
+    case DW_TAG_class_type:
     case DW_TAG_union_type:
       if(subtype->byte_size == 0){ /*declaration of the type, need the complete description */
           subtype = xbt_dict_get_or_null(other_info->types_by_name, subtype->name);
@@ -845,6 +854,8 @@ static int compare_heap_area_with_type(struct s_mm_diff *state, void *real_area1
         return res;
     }
     break;
+  case DW_TAG_reference_type:
+  case DW_TAG_rvalue_reference_type:
   case DW_TAG_pointer_type:
     if(type->dw_type_id && ((dw_type_t)xbt_dict_get_or_null(info->types, type->dw_type_id))->type == DW_TAG_subroutine_type){
       addr_pointed1 = *((void **)(area1)); 
@@ -874,6 +885,7 @@ static int compare_heap_area_with_type(struct s_mm_diff *state, void *real_area1
     }
     break;
   case DW_TAG_structure_type:
+  case DW_TAG_class_type:
     if(type->byte_size == 0){ /*declaration of the structure, need the complete description */
       dw_type_t full_type = xbt_dict_get_or_null(info->types_by_name, type->name);
       if(full_type){
@@ -928,6 +940,7 @@ static char* get_offset_type(char* type_id, int offset, mc_object_info_t info, m
   }
   switch(type->type){
   case DW_TAG_structure_type :
+  case DW_TAG_class_type:
     if(type->byte_size == 0){ /*declaration of the structure, need the complete description */
       if(*switch_type == 0){
         dw_type_t full_type = xbt_dict_get_or_null(info->types_by_name, type->name);
index 2a1a586..7984ad0 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 01c0bce..7cfde64 100644 (file)
    not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+/* Copyright (c) 2012-2014. 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 <fcntl.h>              /* After sys/types.h, at least for dpx/2.  */
 #include <sys/stat.h>
@@ -339,9 +345,9 @@ void *mmalloc_preinit(void)
 
 void mmalloc_postexit(void)
 {
-  /* Do not detach the default mdp or ldl won't be able to free the memory it allocated since we're in memory */
-  //  mmalloc_detach(__mmalloc_default_mdp);
-  xbt_mheap_destroy_no_free(__mmalloc_default_mdp);
+  /* Do not destroy the default mdp or ldl won't be able to free the memory it
+   * allocated since we're in memory */
+  // xbt_mheap_destroy_no_free(__mmalloc_default_mdp);
 }
 
 size_t mmalloc_get_bytes_used(xbt_mheap_t heap){
index fd71075..2fb4338 100644 (file)
@@ -4,7 +4,7 @@
    Written May 1989 by Mike Haertel.
    Heavily modified Mar 1992 by Fred Fish for mmap'd version. */
 
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 197341d..5ad7cd3 100644 (file)
@@ -3,7 +3,7 @@
 
    Contributed by Fred Fish at Cygnus Support.   fnf@cygnus.com */
 
-/* Copyright (c) 2010-2012. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index aad689e..370f84b 100644 (file)
@@ -4,7 +4,7 @@
    Written May 1989 by Mike Haertel.
    Heavily modified Mar 1992 by Fred Fish. (fnf@cygnus.com) */
 
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3569c14..03bc80b 100644 (file)
@@ -2,7 +2,7 @@
    Copyright 1990, 1991 Free Software Foundation
    Written May 1989 by Mike Haertel. */
 
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 3e56435..cdb6e91 100644 (file)
@@ -1,8 +1,9 @@
-/* Copyright (c) 2004-2005, 2007, 2009-2013. The SimGrid Team.
+/* Copyright (c) 2004-2005, 2007, 2009-2014. 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 "internal_config.h"
 #include <unistd.h>
 
index 27e767a..7f2030e 100644 (file)
@@ -1,6 +1,6 @@
 /* set - data container consisting in dict+dynar                            */
 
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 33328fd..2b0ec89 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2010-2012, 2014. 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 <stddef.h>
 #include <stdio.h>
 #include <string.h>
index 6e12ee4..128db63 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2010, 2014. 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/dict.h"
 #include "xbt/dynar.h"
 #include "xbt/setset.h"
index 641f294..c1a4983 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2005-2010, 2012-2014. 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. */
 
 /*
  * snprintf.c - a portable implementation of snprintf
index 47dc3ba..308074f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -14,7 +14,6 @@
 #include "xbt/log.h"
 #include "xbt/swag.h"
 
-
 /** Creates a new swag.
  * \param offset where the hookup is located in the structure
  * \see xbt_swag_offset
index b6d5caf..560b06c 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2010-2012, 2014. 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. */
+
 /*\r
  *      win32-ucontext: Unix ucontext_t operations on Windows platforms\r
  *      Copyright(C) 2007 Panagiotis E. Hadjidoukas\r
index f66389d..124c51f 100644 (file)
@@ -1,6 +1,6 @@
 /* file_appender - a dumb log appender which simply prints to a file        */
 
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 9dc2426..3667667 100644 (file)
@@ -1,6 +1,6 @@
 /* layout_simple - a dumb log layout                                        */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 80439e0..174e343 100644 (file)
@@ -1,6 +1,6 @@
 /* layout_simple - a dumb log layout                                        */
 
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 141e329..26e8dd1 100644 (file)
@@ -1,14 +1,14 @@
 /* module handling                                                          */
 
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. 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 "internal_config.h"        /* MMALLOC_WANT_OVERRIDE_LEGACY */
+#include "simgrid_config.h"     /* _XBT_WIN32 */
+#include "internal_config.h"    /* MMALLOC_WANT_OVERRIDE_LEGACY */
 
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
index 574e2b9..333d5cd 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt_matrix_t management functions                                        */
 
-/* Copyright (c) 2006-2012. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index c6b858e..ff9d996 100644 (file)
@@ -2,7 +2,7 @@
 /* Used in RL to get win/lin portability, and in SG when CONTEXT_THREAD     */
 /* in SG, when using CONTEXT_UCONTEXT, xbt_os_thread_stub is used instead   */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 6b06a6b..2f45c1c 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt_os_time.c -- portable interface to time-related functions            */
 
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8af65f8..d833958 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt_peer_t management functions                                          */
 
-/* Copyright (c) 2006-2012. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index ee98e0d..68be624 100644 (file)
@@ -1,7 +1,7 @@
 /* A (synchronized) message queue.                                          */
 /* Popping an empty queue is blocking, as well as pushing a full one        */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index c2c5bd2..ffd8002 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -31,6 +31,8 @@ xbt_dict_t action_queues;
 static char *action_line = NULL;
 static size_t action_len = 0;
 
+int is_replay_active = 0 ;
+
 static char **action_get_action(char *name);
 
 static char *str_tolower (const char *str)
@@ -42,6 +44,9 @@ static char *str_tolower (const char *str)
   return ret;
 }
 
+int _xbt_replay_is_active(void){
+  return is_replay_active;
+}
 
 xbt_replay_reader_t xbt_replay_reader_new(const char *filename)
 {
@@ -127,6 +132,7 @@ void xbt_replay_action_unregister(const char *action_name)
 
 void _xbt_replay_action_init(void)
 {
+  is_replay_active = 1;
   action_funs = xbt_dict_new_homogeneous(NULL);
   action_queues = xbt_dict_new_homogeneous(NULL);
 }
index bd85f59..149fb39 100644 (file)
@@ -9,7 +9,7 @@
 /* In RL, java is useless, and threads are always part of the picture,      */
 /*  ucontext never */
 
-/* Copyright (c) 2007-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d9e3d59..4907e6f 100644 (file)
@@ -3,7 +3,7 @@
 
 /* This is the simulation implementation, using simix.                      */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d03cd89..f9eae05 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 /* Later adapted to fit into SimGrid. Distributed under LGPL v2.1, Feb 1999.*/
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 01a4052..eedfa87 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt_str.c - various helping functions to deal with strings               */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index f066ef7..e52a575 100644 (file)
@@ -1,6 +1,6 @@
 /* strbuff -- string buffers                                                */
 
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index e8ff9d7..a046cfa 100644 (file)
@@ -1,6 +1,6 @@
 /* virtu - virtualization layer for XBT to choose between GRAS and MSG implementation */
 
-/* Copyright (c) 2007-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 1f88a67..079e050 100644 (file)
@@ -1,6 +1,6 @@
 /* xbt_modinter - How to init/exit the XBT modules                          */
 
-/* Copyright (c) 2004-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2004-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 0f8270c..bc9deb5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index e5b8ac7..6d8c14c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8f2c3fc..55b0bcc 100644 (file)
@@ -2,18 +2,18 @@ cmake_minimum_required(VERSION 2.6)
 
 set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
 
-add_executable(storage storage.c)
+add_executable(storage_basic storage_basic.c)
 
 ### Add definitions for compile
 if(NOT WIN32)
-  target_link_libraries(storage simgrid m pthread )
+  target_link_libraries(storage_basic simgrid m pthread )
 else()
-  target_link_libraries(storage simgrid)
+  target_link_libraries(storage_basic simgrid)
 endif()
 
 set(tesh_files
   ${tesh_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/storage.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/storage_basic.tesh
   PARENT_SCOPE
   )
 set(xml_files
@@ -24,7 +24,7 @@ set(xml_files
   )
 set(teshsuite_src
   ${teshsuite_src}
-  ${CMAKE_CURRENT_SOURCE_DIR}/storage.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/storage_basic.c
   PARENT_SCOPE
   )
 set(bin_files
index caec3da..18382b2 100644 (file)
@@ -4,33 +4,35 @@
 <platform version="3">
        <AS id="AS0" routing="Full">
                <!-- STORAGE TYPES -->
-               <storage_type id="crucial" model="SSD" size="500">
-                       <prop id="Bwrite" value="30000000" /> <!-- 30Mo/s -->
-                       <prop id="Bread" value="100000000" /> <!-- 100Mo/s -->
-                       <prop id="Bconnection" value="150000000" /> <!-- 150Mo/s -->
+               <storage_type id="crucial" model="SSD" size="500GiB">
+                       <model_prop id="Bwrite" value="30000000" /> <!-- 30Mo/s -->
+                       <model_prop id="Bread" value="100000000" /> <!-- 100Mo/s -->
+                       <model_prop id="Bconnection" value="150000000" /> <!-- 150Mo/s -->
                </storage_type>
 
-               <storage_type id="single_HDD" model="linear_no_lat" size="500GiB" content_type="txt_unix">
-                       <prop id="Bwrite" value="30MBps" />
-                       <prop id="Bread" value="100MBps" />
-                       <prop id="Bconnection" value="150MBps" />
+               <storage_type id="single_HDD" model="linear_no_lat" size="750GiB" content_type="txt_unix">
+                       <model_prop id="Bwrite" value="30MBps" />
+                       <model_prop id="Bread" value="100MBps" />
+                       <model_prop id="Bconnection" value="150MBps" />
                </storage_type>
 
                <storage_type id="single_SSD" model="linear_no_lat"
-                       content="content/storage_content.txt" size="500GiB">
-                       <prop id="Bwrite" value="30MBps" />
-                       <prop id="Bread" value="100MBps" />
-                       <prop id="Bconnection" value="150MBps" />
+                       content="content/storage_content.txt" size="300GiB">
+                       <model_prop id="Bwrite" value="30MBps" />
+                       <model_prop id="Bread" value="100MBps" />
+                       <model_prop id="Bconnection" value="150MBps" />
                </storage_type>
 
                <!-- DISKS -->
-               <storage id="cdisk" typeId="single_HDD" content="msg/storage/storage_content_c.txt">
-                  <prop id="filename" value="prop.xml"/>
-                  <prop id="date" value="31-08-12"/>
-           <prop id="author" value="pnavarro"/>
+               <storage id="cdisk" typeId="single_HDD" content="msg/storage/storage_content_c.txt" />
+
+               <storage id="sdisk1" typeId="single_SSD" content="msg/storage/storage_content_s1.txt">
+                       <prop id="usage" value="File system"/>
+               </storage>
+                       
+               <storage id="sdisk2" typeId="single_HDD" content="msg/storage/storage_content_s2.txt" >
+                       <prop id="usage" value="Cache"/>
                </storage>
-               <storage id="sdisk1" typeId="single_SSD" content="msg/storage/storage_content_s1.txt" />
-               <storage id="sdisk2" typeId="single_HDD" content="msg/storage/storage_content_s2.txt" />
 
                <!-- HOSTS -->
                <host id="client" power="1000000000">
diff --git a/teshsuite/msg/storage/storage.tesh b/teshsuite/msg/storage/storage.tesh
deleted file mode 100644 (file)
index 11c12a9..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-$ msg/storage/storage --cfg=path:${srcdir:=.} ${srcdir:=.}/msg/storage/platform.xml ${srcdir:=.}/msg/storage/deployment.xml 0 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [  0.000000] (1:server@server) *** Storage info of: server ***
-> [  0.000000] (1:server@server) *** Dump a storage element ***
-> [  0.000000] (1:server@server) Print the content of the storage element: sdisk1
-> [  0.000000] (1:server@server) ./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml size: 21339320000 bytes
-> [  0.000000] (1:server@server) ./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx size: 113700000 bytes
-> [  0.000000] (1:server@server) ./doc/simgrid/examples/cxx/autoDestination/Master.cxx size: 18910000 bytes
-> [  0.000000] (1:server@server) ./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx size: 710000000 bytes
-> [  0.000000] (1:server@server) *** Dump a storage element ***
-> [  0.000000] (1:server@server) Print the content of the storage element: sdisk2
-> [  0.000000] (1:server@server) ./doc/simgrid/examples/cxx/basic/Slave.cxx size: 69300000 bytes
-> [  0.000000] (1:server@server) ./doc/simgrid/examples/cxx/basic/Main.cxx size: 14800000 bytes
-> [  0.000000] (1:server@server) Server waiting for transfers
-> [  0.000710] (2:client@client) client has read 71000 on ./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx
-> [  0.000710] (2:client@client) client sends 71000 to server
-> [  0.014595] (2:client@client) client has read 1262000 on ./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml
-> [  0.014595] (2:client@client) client sends 1262000 to server
-> [  0.896175] (2:client@client) client has read 87000000 on ./doc/simgrid/examples/cxx/autoDestination/Slave.cxx
-> [  0.896175] (2:client@client) client sends 87000000 to server
-> [  4.550878] (2:client@client) *** GET/SET DATA for storage element: cdisk ***
-> [  4.550878] (2:client@client) Get data: '(null)'
-> [  4.550878] (2:client@client) Set and get data: 'Some data'
-> [  4.550878] (2:client@client) *** Storage info of: client ***
-> [  4.550878] (1:server@server) *** Storage info of: server ***
-> [  4.550878] (2:client@client) *** Dump a storage element ***
-> [  4.550878] (2:client@client) Print the content of the storage element: cdisk
-> [  4.550878] (2:client@client) ./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx size: 71000 bytes
-> [  4.550878] (2:client@client) ./doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx size: 6500000 bytes
-> [  4.550878] (2:client@client) ./doc/simgrid/examples/cxx/autoDestination/Main.cxx size: 1480000 bytes
-> [  4.550878] (2:client@client) ./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml size: 1262000 bytes
-> [  4.550878] (2:client@client) ./doc/simgrid/examples/cxx/autoDestination/Slave.cxx size: 87000000 bytes
-> [  4.550878] (1:server@server) *** Dump a storage element ***
-> [  4.550878] (1:server@server) Print the content of the storage element: sdisk1
-> [  4.550878] (1:server@server) ./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml size: 21339320000 bytes
-> [  4.550878] (1:server@server) ./scratch/toto.xml size: 71000 bytes
-> [  4.550878] (1:server@server) ./scratch/tata.cxx size: 87000000 bytes
-> [  4.550878] (1:server@server) ./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx size: 113700000 bytes
-> [  4.550878] (1:server@server) ./scratch/titi.cxx size: 1262000 bytes
-> [  4.550878] (1:server@server) ./doc/simgrid/examples/cxx/autoDestination/Master.cxx size: 18910000 bytes
-> [  4.550878] (1:server@server) ./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx size: 710000000 bytes
-> [  4.550878] (1:server@server) *** Dump a storage element ***
-> [  4.550878] (1:server@server) Print the content of the storage element: sdisk2
-> [  4.550878] (1:server@server) ./doc/simgrid/examples/cxx/basic/Slave.cxx size: 69300000 bytes
-> [  4.550878] (1:server@server) ./doc/simgrid/examples/cxx/basic/Main.cxx size: 14800000 bytes
-> [  4.550878] (0:@) Simulated time: 4.55088
similarity index 68%
rename from teshsuite/msg/storage/storage.c
rename to teshsuite/msg/storage/storage_basic.c
index a9d1ebc..c386966 100644 (file)
@@ -1,15 +1,19 @@
+/* Copyright (c) 2013-2014. 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 "xbt/log.h"
-#include "inttypes.h"
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(storage,"Messages specific for this simulation");
 
 void storage_info(msg_host_t host);
 void display_storage_properties(msg_storage_t storage);
 int hsm_put(const char *remote_host, const char *src, const char *dest);
-sg_storage_size_t write_local_file(char *dest, sg_storage_size_t file_size);
-sg_storage_size_t read_local_file(const char *src);
-void display_storage_info(msg_host_t host);
+sg_size_t write_local_file(char *dest, sg_size_t file_size);
+sg_size_t read_local_file(const char *src);
 void dump_storage_by_name(char *name);
 void display_storage_content(msg_storage_t storage);
 void get_set_storage_data(const char *storage_name);
@@ -19,7 +23,7 @@ int server(int argc, char *argv[]);
 void storage_info(msg_host_t host)
 {
   const char* host_name = MSG_host_get_name(host);
-  XBT_INFO("*** Storage info on %s ***:", host_name);
+  XBT_INFO("*** Storage info on %s ***", host_name);
 
   xbt_dict_cursor_t cursor = NULL;
   char* mount_name;
@@ -30,16 +34,17 @@ void storage_info(msg_host_t host)
 
   xbt_dict_foreach(storage_list,cursor,mount_name,storage_name)
   {
-    XBT_INFO("Storage name: %s, mount name: %s", storage_name, mount_name);
+    XBT_INFO("\tStorage name: %s, mount name: %s", storage_name, mount_name);
 
-    sg_storage_size_t free_size = MSG_storage_get_free_size(mount_name);
-    sg_storage_size_t used_size = MSG_storage_get_used_size(mount_name);
+    sg_size_t free_size = MSG_storage_get_free_size(mount_name);
+    sg_size_t used_size = MSG_storage_get_used_size(mount_name);
 
-    XBT_INFO("Free size: %" PRIu64 " bytes", free_size);
-    XBT_INFO("Used size: %" PRIu64 " bytes", used_size);
+    XBT_INFO("\t\tFree size: %llu bytes", free_size);
+    XBT_INFO("\t\tUsed size: %llu bytes", used_size);
 
     storage = MSG_storage_get_by_name(storage_name);
     display_storage_properties(storage);
+    dump_storage_by_name(storage_name);
   }
   xbt_dict_free(&storage_list);
 }
@@ -48,12 +53,12 @@ void display_storage_properties(msg_storage_t storage){
   xbt_dict_cursor_t cursor = NULL;
   char *key, *data;
   xbt_dict_t props = MSG_storage_get_properties(storage);
-  if (props){
-    XBT_INFO("Properties of mounted storage: %s", MSG_storage_get_name(storage));
+  if (xbt_dict_length(props) > 0){
+    XBT_INFO("\tProperties of mounted storage: %s", MSG_storage_get_name(storage));
     xbt_dict_foreach(props, cursor, key, data)
-         XBT_INFO("'%s' -> '%s'", key, data);
+         XBT_INFO("\t\t'%s' -> '%s'", key, data);
   }else{
-       XBT_INFO("No property attached.");
+       XBT_INFO("\tNo property attached.");
   }
 }
 
@@ -61,56 +66,39 @@ void display_storage_properties(msg_storage_t storage){
 int hsm_put(const char *remote_host, const char *src, const char *dest){
 
   // Read local src file, and return the size that was actually read
-  sg_storage_size_t read_size = read_local_file(src);
+  sg_size_t read_size = read_local_file(src);
 
   // Send file
-  XBT_INFO("%s sends %" PRIu64 " to %s",MSG_host_get_name(MSG_host_self()),read_size,remote_host);
+  XBT_INFO("%s sends %llu to %s",MSG_host_get_name(MSG_host_self()),read_size,remote_host);
   msg_task_t to_execute = MSG_task_create((const char*)"hsm_put", 0, (double) read_size, (void*)dest);
   MSG_task_send(to_execute, remote_host);
-
+  MSG_process_sleep(.4);
   return 1;
 }
 
-sg_storage_size_t write_local_file(char *dest, sg_storage_size_t file_size)
+sg_size_t write_local_file(char *dest, sg_size_t file_size)
 {
-  sg_storage_size_t write;
+  sg_size_t written;
   msg_file_t file = MSG_file_open("/sd1",dest, NULL);
-  write = MSG_file_write(file, file_size);
+  written = MSG_file_write(file, file_size);
+  XBT_INFO("%llu bytes on %llu bytes have been written by %s on /sd1",written, file_size, MSG_host_get_name(MSG_host_self()));
   MSG_file_close(file);
-  return write;
+  return written;
 }
 
-sg_storage_size_t read_local_file(const char *src)
+sg_size_t read_local_file(const char *src)
 {
-  sg_storage_size_t read, file_size;
+  sg_size_t read, file_size;
   msg_file_t file = MSG_file_open("/sd1",src, NULL);
   file_size = MSG_file_get_size(file);
 
   read = MSG_file_read(file, file_size);
-  XBT_INFO("%s has read %" PRIu64 " on %s",MSG_host_get_name(MSG_host_self()),read,src);
+  XBT_INFO("%s has read %llu on %s",MSG_host_get_name(MSG_host_self()),read,src);
   MSG_file_close(file);
 
   return read;
 }
 
-void display_storage_info(msg_host_t host)
-{
-  const char* host_name = MSG_host_get_name(host);
-  XBT_INFO("*** Storage info of: %s ***", host_name);
-
-  xbt_dict_cursor_t cursor = NULL;
-  char* mount_name;
-  char* storage_name;
-
-  xbt_dict_t storage_list = MSG_host_get_storage_list(host);
-
-  xbt_dict_foreach(storage_list,cursor,mount_name,storage_name)
-  {
-    dump_storage_by_name(storage_name);
-  }
-  xbt_dict_free(&storage_list);
-}
-
 void dump_storage_by_name(char *name){
   XBT_INFO("*** Dump a storage element ***");
   msg_storage_t storage = MSG_storage_get_by_name(name);
@@ -127,13 +115,13 @@ void display_storage_content(msg_storage_t storage){
   XBT_INFO("Print the content of the storage element: %s",MSG_storage_get_name(storage));
   xbt_dict_cursor_t cursor = NULL;
   char *file;
-  sg_storage_size_t *psize;
+  sg_size_t *psize;
   xbt_dict_t content = MSG_storage_get_content(storage);
   if (content){
     xbt_dict_foreach(content, cursor, file, psize)
-    XBT_INFO("%s size: %" PRIu64 " bytes", file, *psize);
+    XBT_INFO("\t%s size: %llu bytes", file, *psize);
   } else {
-    XBT_INFO("No content.");
+    XBT_INFO("\tNo content.");
   }
   xbt_dict_free(&content);
 }
@@ -146,20 +134,19 @@ void get_set_storage_data(const char *storage_name){
 
   MSG_storage_set_data(storage,strdup("Some data"));
   data = MSG_storage_get_data(storage);
-  XBT_INFO("Set and get data: '%s'", data);
+  XBT_INFO("\tSet and get data: '%s'", data);
 }
 
 int client(int argc, char *argv[])
 {
-  hsm_put("server","./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx","./scratch/toto.xml");
-  hsm_put("server","./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml","./scratch/titi.cxx");
+  hsm_put("server","./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx","./scratch/toto.cxx");
+  hsm_put("server","./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml","./scratch/titi.xml");
   hsm_put("server","./doc/simgrid/examples/cxx/autoDestination/Slave.cxx","./scratch/tata.cxx");
 
   msg_task_t finalize = MSG_task_create("finalize", 0, 0, NULL);
   MSG_task_send(finalize, "server");
 
   get_set_storage_data("cdisk");
-  display_storage_info(MSG_host_self());
 
   return 1;
 }
@@ -169,9 +156,9 @@ int server(int argc, char *argv[])
   msg_task_t to_execute = NULL;
   _XBT_GNUC_UNUSED int res;
 
-  display_storage_info(MSG_host_self());
+  storage_info(MSG_host_self());
 
-  XBT_INFO("Server waiting for transfers");
+  XBT_INFO("Server waiting for transfers ...");
   while(1){
     res = MSG_task_receive(&(to_execute), MSG_host_get_name(MSG_host_self()));
     xbt_assert(res == MSG_OK, "MSG_task_get failed");
@@ -186,7 +173,7 @@ int server(int argc, char *argv[])
     else if(!strcmp(task_name,"hsm_put")){// Receive file to save
       // Write file on local disk
       char *dest = MSG_task_get_data(to_execute);
-      sg_storage_size_t size_to_write = (sg_storage_size_t)MSG_task_get_data_size(to_execute);
+      sg_size_t size_to_write = (sg_size_t)MSG_task_get_data_size(to_execute);
       write_local_file(dest, size_to_write);
        }
 
@@ -194,7 +181,7 @@ int server(int argc, char *argv[])
     to_execute = NULL;
   }
 
-  display_storage_info(MSG_host_self());
+  storage_info(MSG_host_self());
   return 1;
 }
 
diff --git a/teshsuite/msg/storage/storage_basic.tesh b/teshsuite/msg/storage/storage_basic.tesh
new file mode 100644 (file)
index 0000000..210727f
--- /dev/null
@@ -0,0 +1,61 @@
+$ msg/storage/storage_basic --cfg=path:${srcdir:=.} ${srcdir:=.}/msg/storage/platform.xml ${srcdir:=.}/msg/storage/deployment.xml 0 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (1:server@server) *** Storage info on server ***
+> [  0.000000] (1:server@server)       Storage name: sdisk1, mount name: /sd1
+> [  0.000000] (1:server@server)               Free size: 322122547160 bytes
+> [  0.000000] (1:server@server)               Used size: 40 bytes
+> [  0.000000] (1:server@server)       Properties of mounted storage: sdisk1
+> [  0.000000] (1:server@server)               'usage' -> 'File system'
+> [  0.000000] (1:server@server) *** Dump a storage element ***
+> [  0.000000] (1:server@server) Print the content of the storage element: sdisk1
+> [  0.000000] (1:server@server)       ./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml size: 10 bytes
+> [  0.000000] (1:server@server)       ./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx size: 10 bytes
+> [  0.000000] (1:server@server)       ./doc/simgrid/examples/cxx/autoDestination/Master.cxx size: 10 bytes
+> [  0.000000] (1:server@server)       ./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx size: 10 bytes
+> [  0.000000] (1:server@server)       Storage name: sdisk2, mount name: /sd2
+> [  0.000000] (1:server@server)               Free size: 805306367980 bytes
+> [  0.000000] (1:server@server)               Used size: 20 bytes
+> [  0.000000] (1:server@server)       Properties of mounted storage: sdisk2
+> [  0.000000] (1:server@server)               'usage' -> 'Cache'
+> [  0.000000] (1:server@server) *** Dump a storage element ***
+> [  0.000000] (1:server@server) Print the content of the storage element: sdisk2
+> [  0.000000] (1:server@server)       ./doc/simgrid/examples/cxx/basic/Slave.cxx size: 10 bytes
+> [  0.000000] (1:server@server)       ./doc/simgrid/examples/cxx/basic/Main.cxx size: 10 bytes
+> [  0.000000] (1:server@server) Server waiting for transfers ...
+> [  0.005000] (2:client@client) client has read 500001 on ./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx
+> [  0.005000] (2:client@client) client sends 500001 to server
+> [  0.026647] (1:server@server) 500001 bytes on 500001 bytes have been written by server on /sd1
+> [  0.417980] (2:client@client) client has read 800000 on ./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml
+> [  0.417980] (2:client@client) client sends 800000 to server
+> [  0.452225] (1:server@server) 800000 bytes on 800000 bytes have been written by server on /sd1
+> [  1.283559] (2:client@client) client has read 45800000 on ./doc/simgrid/examples/cxx/autoDestination/Slave.cxx
+> [  1.283559] (2:client@client) client sends 45800000 to server
+> [  3.207494] (1:server@server) 45800000 bytes on 45800000 bytes have been written by server on /sd1
+> [  3.208145] (2:client@client) *** GET/SET DATA for storage element: cdisk ***
+> [  3.208145] (2:client@client) Get data: '(null)'
+> [  3.208145] (2:client@client)       Set and get data: 'Some data'
+> [  3.208145] (1:server@server) *** Storage info on server ***
+> [  3.208145] (1:server@server)       Storage name: sdisk1, mount name: /sd1
+> [  3.208145] (1:server@server)               Free size: 322075447159 bytes
+> [  3.208145] (1:server@server)               Used size: 47100041 bytes
+> [  3.208145] (1:server@server)       Properties of mounted storage: sdisk1
+> [  3.208145] (1:server@server)               'usage' -> 'File system'
+> [  3.208145] (1:server@server) *** Dump a storage element ***
+> [  3.208145] (1:server@server) Print the content of the storage element: sdisk1
+> [  3.208145] (1:server@server)       ./scratch/titi.xml size: 800000 bytes
+> [  3.208145] (1:server@server)       ./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml size: 10 bytes
+> [  3.208145] (1:server@server)       ./scratch/tata.cxx size: 45800000 bytes
+> [  3.208145] (1:server@server)       ./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx size: 10 bytes
+> [  3.208145] (1:server@server)       ./scratch/toto.cxx size: 500001 bytes
+> [  3.208145] (1:server@server)       ./doc/simgrid/examples/cxx/autoDestination/Master.cxx size: 10 bytes
+> [  3.208145] (1:server@server)       ./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx size: 10 bytes
+> [  3.208145] (1:server@server)       Storage name: sdisk2, mount name: /sd2
+> [  3.208145] (1:server@server)               Free size: 805306367980 bytes
+> [  3.208145] (1:server@server)               Used size: 20 bytes
+> [  3.208145] (1:server@server)       Properties of mounted storage: sdisk2
+> [  3.208145] (1:server@server)               'usage' -> 'Cache'
+> [  3.208145] (1:server@server) *** Dump a storage element ***
+> [  3.208145] (1:server@server) Print the content of the storage element: sdisk2
+> [  3.208145] (1:server@server)       ./doc/simgrid/examples/cxx/basic/Slave.cxx size: 10 bytes
+> [  3.208145] (1:server@server)       ./doc/simgrid/examples/cxx/basic/Main.cxx size: 10 bytes
+> [  3.208145] (0:@) Simulated time: 3.20814
+
index fef7c55..1c5713f 100644 (file)
@@ -1,5 +1,5 @@
-./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx 71000         
-./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml 1262000         
-./doc/simgrid/examples/cxx/autoDestination/Main.cxx 1480000       
-./doc/simgrid/examples/cxx/autoDestination/Slave.cxx 87000000     
-./doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx 6500000        
+./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx 500001        
+./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml 800000          
+./doc/simgrid/examples/cxx/autoDestination/Main.cxx 75000000      
+./doc/simgrid/examples/cxx/autoDestination/Slave.cxx 45800000     
+./doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx 400000         
index 55968d0..34cb554 100644 (file)
@@ -1,4 +1,4 @@
-./doc/simgrid/examples/cxx/autoDestination/Master.cxx 18910000            
-./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml 21339320000   
-./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx 113700000        
-./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx 710000000          
+./doc/simgrid/examples/cxx/autoDestination/Master.cxx 10          
+./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml 10   
+./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx 10       
+./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx 10         
index 0721dbf..06ed884 100644 (file)
@@ -1,2 +1,2 @@
-./doc/simgrid/examples/cxx/basic/Main.cxx 14800000
-./doc/simgrid/examples/cxx/basic/Slave.cxx 69300000   
\ No newline at end of file
+./doc/simgrid/examples/cxx/basic/Main.cxx 10
+./doc/simgrid/examples/cxx/basic/Slave.cxx 10   
\ No newline at end of file
index d09b5c5..2974e68 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8a397b6..0bec635 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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 <string.h>
index 579b769..2961efd 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index a3dcd3a..48b7952 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 6e4ac83..44e6d7b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 7f747bc..273e117 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index b6435cf..0005e04 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 1bf80b3..9dfa416 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 66e2d34..bd1de6c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 696ab7b..b82a105 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2012, 2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 5c74d67..e864eb5 100644 (file)
@@ -1,6 +1,6 @@
 /* Latency tests                                                            */
 
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index adc6b77..e7baa31 100644 (file)
@@ -1,6 +1,6 @@
 /* Latency tests                                                            */
 
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index f32dea6..c0efc76 100644 (file)
@@ -1,6 +1,6 @@
 /* Latency tests                                                            */
 
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 1b52f07..51080ce 100644 (file)
@@ -1,6 +1,6 @@
 /* Latency tests                                                            */
 
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 19024ce..70d584c 100644 (file)
@@ -1,6 +1,6 @@
 /* Latency tests                                                            */
 
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 277ac2c..5d31420 100644 (file)
@@ -1,6 +1,6 @@
 /* Latency tests                                                            */
 
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 63c1a67..694a5c3 100644 (file)
@@ -1,6 +1,6 @@
 /* Latency tests                                                            */
 
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index a85311b..fa9e319 100644 (file)
@@ -1,6 +1,6 @@
 /* Computation tests                                                        */
 
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 665f6d1..b1c7480 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 1ad0f28..5b24395 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 14905f2..03285b7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index e93d972..a291e6d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 5b0cfc6..5a484e3 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2008-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index aaffd2e..245cd48 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 5220a03..b0b9a69 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2012. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 46ae1b4..b475902 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -160,8 +160,8 @@ int main(int argc, char **argv)
 
     // 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)
+      if(surf_routing_edge_get_rc_type(xbt_lib_get_or_null(as_router_lib, key,
+          ROUTING_ASR_LEVEL)) == SURF_NETWORK_ELEMENT_ROUTER)
       {
         printf("  <router id=\"%s\"/>\n",key);
       }
@@ -203,7 +203,7 @@ 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);
+          char *link_name = xbt_strdup(surf_resource_name(link));
           printf("<%s id=\"%s\"/>",link_ctn,link_name);
           free(link_name);
         }
@@ -222,7 +222,7 @@ 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);
+            char *link_name = xbt_strdup(surf_resource_name(link));
             printf("<%s id=\"%s\"/>",link_ctn,link_name);
             free(link_name);
           }
@@ -248,7 +248,7 @@ 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);
+              char *link_name = xbt_strdup(surf_resource_name(link));
               printf("<%s id=\"%s\"/>",link_ctn,link_name);
               free(link_name);
             }
@@ -266,7 +266,7 @@ 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);
+            char *link_name = xbt_strdup(surf_resource_name(link));
             printf("<%s id=\"%s\"/>",link_ctn,link_name);
             free(link_name);
           }
index 4ffe91a..873b810 100644 (file)
@@ -1018,3 +1018,618 @@ $ ${bindir:=.}/flatifier$EXEEXT ${srcdir:=.}/examples/platforms/bypassASroute.xm
 >   </route>
 > </AS>
 > </platform>
+
+
+$ ${bindir:=.}/flatifier$EXEEXT ${srcdir:=.}/examples/platforms/torus_cluster.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n"
+> [  0.000000] [0:@] surf_workstation_model_init_ptask_L07
+> <?xml version='1.0'?>
+> <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+> <platform version="3">
+> <AS id="AS0" routing="Full">
+>   <host id="bob0.hamburger.edu" power="1000000000"/>
+>   <host id="bob1.hamburger.edu" power="1000000000"/>
+>   <host id="bob10.hamburger.edu" power="1000000000"/>
+>   <host id="bob11.hamburger.edu" power="1000000000"/>
+>   <host id="bob2.hamburger.edu" power="1000000000"/>
+>   <host id="bob3.hamburger.edu" power="1000000000"/>
+>   <host id="bob4.hamburger.edu" power="1000000000"/>
+>   <host id="bob5.hamburger.edu" power="1000000000"/>
+>   <host id="bob6.hamburger.edu" power="1000000000"/>
+>   <host id="bob7.hamburger.edu" power="1000000000"/>
+>   <host id="bob8.hamburger.edu" power="1000000000"/>
+>   <host id="bob9.hamburger.edu" power="1000000000"/>
+>   <router id="bobbob_cluster_router.hamburger.edu"/>
+>   <link id="__loopback__" bandwidth="498000000" latency="0.000015000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_0_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_10_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_11_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_1_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_2_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_3_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_4_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_5_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_6_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_7_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_8_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_9_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_from_0_to_1_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_0_to_1_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_0_to_3_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_0_to_3_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_0_to_6_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_0_to_6_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_10_to_11_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_10_to_11_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_10_to_4_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_10_to_4_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_10_to_7_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_10_to_7_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_11_to_5_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_11_to_5_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_11_to_8_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_11_to_8_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_11_to_9_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_11_to_9_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_1_to_2_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_1_to_2_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_1_to_4_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_1_to_4_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_1_to_7_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_1_to_7_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_2_to_0_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_2_to_0_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_2_to_5_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_2_to_5_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_2_to_8_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_2_to_8_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_3_to_0_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_3_to_0_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_3_to_4_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_3_to_4_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_3_to_9_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_3_to_9_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_4_to_10_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_4_to_10_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_4_to_1_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_4_to_1_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_4_to_5_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_4_to_5_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_5_to_11_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_5_to_11_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_5_to_2_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_5_to_2_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_5_to_3_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_5_to_3_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_6_to_0_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_6_to_0_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_6_to_7_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_6_to_7_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_6_to_9_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_6_to_9_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_7_to_10_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_7_to_10_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_7_to_1_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_7_to_1_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_7_to_8_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_7_to_8_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_8_to_11_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_8_to_11_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_8_to_2_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_8_to_2_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_8_to_6_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_8_to_6_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_9_to_10_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_9_to_10_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_9_to_3_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_9_to_3_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_9_to_6_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_from_9_to_6_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <route src="bob1.hamburger.edu" dst="bob1.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_1_loopback"/>
+>   </route>
+>   <route src="bob1.hamburger.edu" dst="bob3.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_1_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_3_UP"/>
+>   </route>
+>   <route src="bob1.hamburger.edu" dst="bob5.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_2_UP"/><link_ctn id="bob_cluster_link_from_2_to_5_UP"/>
+>   </route>
+>   <route src="bob1.hamburger.edu" dst="bob7.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_7_UP"/>
+>   </route>
+>   <route src="bob1.hamburger.edu" dst="bob9.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_1_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_3_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_UP"/>
+>   </route>
+>   <route src="bob1.hamburger.edu" dst="bob11.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_2_UP"/><link_ctn id="bob_cluster_link_from_2_to_5_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_UP"/>
+>   </route>
+>   <route src="bob1.hamburger.edu" dst="bob0.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_1_DOWN"/>
+>   </route>
+>   <route src="bob1.hamburger.edu" dst="bob2.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_2_UP"/>
+>   </route>
+>   <route src="bob1.hamburger.edu" dst="bob4.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_4_UP"/>
+>   </route>
+>   <route src="bob1.hamburger.edu" dst="bob6.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_1_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_UP"/>
+>   </route>
+>   <route src="bob1.hamburger.edu" dst="bob8.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_2_UP"/><link_ctn id="bob_cluster_link_from_2_to_8_UP"/>
+>   </route>
+>   <route src="bob1.hamburger.edu" dst="bob10.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_4_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_UP"/>
+>   </route>
+>   <route src="bob1.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bob1.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_3_to_4_UP"/><link_ctn id="bob_cluster_link_from_1_to_4_DOWN"/>
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bob3.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_3_loopback"/>
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bob5.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_5_to_3_DOWN"/>
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bob7.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_3_to_4_UP"/><link_ctn id="bob_cluster_link_from_1_to_4_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_UP"/>
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bob9.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_3_to_9_UP"/>
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bob11.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_5_to_3_DOWN"/><link_ctn id="bob_cluster_link_from_5_to_11_UP"/>
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bob0.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_3_DOWN"/>
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bob2.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_5_to_3_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_5_DOWN"/>
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bob4.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_3_to_4_UP"/>
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bob6.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_3_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_UP"/>
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bob8.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_5_to_3_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_5_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_UP"/>
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bob10.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_3_to_4_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_UP"/>
+>   </route>
+>   <route src="bob3.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bob1.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_4_to_5_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_4_DOWN"/>
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bob3.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_5_to_3_UP"/>
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bob5.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_5_loopback"/>
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bob7.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_4_to_5_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_4_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_UP"/>
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bob9.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_5_to_3_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_UP"/>
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bob11.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_5_to_11_UP"/>
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bob0.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_5_to_3_UP"/><link_ctn id="bob_cluster_link_from_0_to_3_DOWN"/>
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bob2.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_5_DOWN"/>
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bob4.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_4_to_5_DOWN"/>
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bob6.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_5_to_3_UP"/><link_ctn id="bob_cluster_link_from_0_to_3_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_UP"/>
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bob8.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_5_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_UP"/>
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bob10.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_4_to_5_DOWN"/><link_ctn id="bob_cluster_link_from_4_to_10_UP"/>
+>   </route>
+>   <route src="bob5.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bob1.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_7_DOWN"/>
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bob3.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_6_to_7_DOWN"/><link_ctn id="bob_cluster_link_from_6_to_9_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_DOWN"/>
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bob5.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_7_to_8_UP"/><link_ctn id="bob_cluster_link_from_8_to_11_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_DOWN"/>
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bob7.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_7_loopback"/>
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bob9.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_6_to_7_DOWN"/><link_ctn id="bob_cluster_link_from_6_to_9_UP"/>
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bob11.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_7_to_8_UP"/><link_ctn id="bob_cluster_link_from_8_to_11_UP"/>
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bob0.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_6_to_7_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_DOWN"/>
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bob2.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_7_to_8_UP"/><link_ctn id="bob_cluster_link_from_2_to_8_DOWN"/>
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bob4.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_7_to_10_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_DOWN"/>
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bob6.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_6_to_7_DOWN"/>
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bob8.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_7_to_8_UP"/>
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bob10.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_7_to_10_UP"/>
+>   </route>
+>   <route src="bob7.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bob1.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_9_to_10_UP"/><link_ctn id="bob_cluster_link_from_7_to_10_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_DOWN"/>
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bob3.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_3_to_9_DOWN"/>
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bob5.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_11_to_9_DOWN"/><link_ctn id="bob_cluster_link_from_5_to_11_DOWN"/>
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bob7.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_9_to_10_UP"/><link_ctn id="bob_cluster_link_from_7_to_10_DOWN"/>
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bob9.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_9_loopback"/>
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bob11.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_11_to_9_DOWN"/>
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bob0.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_6_to_9_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_DOWN"/>
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bob2.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_11_to_9_DOWN"/><link_ctn id="bob_cluster_link_from_8_to_11_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_DOWN"/>
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bob4.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_9_to_10_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_DOWN"/>
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bob6.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_6_to_9_DOWN"/>
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bob8.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_11_to_9_DOWN"/><link_ctn id="bob_cluster_link_from_8_to_11_DOWN"/>
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bob10.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_9_to_10_UP"/>
+>   </route>
+>   <route src="bob9.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bob1.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_10_to_11_DOWN"/><link_ctn id="bob_cluster_link_from_7_to_10_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_DOWN"/>
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bob3.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_11_to_9_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_DOWN"/>
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bob5.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_5_to_11_DOWN"/>
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bob7.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_10_to_11_DOWN"/><link_ctn id="bob_cluster_link_from_7_to_10_DOWN"/>
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bob9.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_11_to_9_UP"/>
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bob11.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_11_loopback"/>
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bob0.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_11_to_9_UP"/><link_ctn id="bob_cluster_link_from_6_to_9_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_DOWN"/>
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bob2.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_8_to_11_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_DOWN"/>
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bob4.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_10_to_11_DOWN"/><link_ctn id="bob_cluster_link_from_4_to_10_DOWN"/>
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bob6.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_11_to_9_UP"/><link_ctn id="bob_cluster_link_from_6_to_9_DOWN"/>
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bob8.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_8_to_11_DOWN"/>
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bob10.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_10_to_11_DOWN"/>
+>   </route>
+>   <route src="bob11.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bob1.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_1_UP"/>
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bob3.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_3_UP"/>
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bob5.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_0_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_5_UP"/>
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bob7.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_1_UP"/><link_ctn id="bob_cluster_link_from_1_to_7_UP"/>
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bob9.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_3_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_UP"/>
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bob11.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_0_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_5_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_UP"/>
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bob0.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_0_loopback"/>
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bob2.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_0_DOWN"/>
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bob4.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_1_UP"/><link_ctn id="bob_cluster_link_from_1_to_4_UP"/>
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bob6.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_6_UP"/>
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bob8.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_0_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_UP"/>
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bob10.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_1_UP"/><link_ctn id="bob_cluster_link_from_1_to_4_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_UP"/>
+>   </route>
+>   <route src="bob0.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bob1.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_2_DOWN"/>
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bob3.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_0_UP"/><link_ctn id="bob_cluster_link_from_0_to_3_UP"/>
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bob5.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_5_UP"/>
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bob7.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_2_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_UP"/>
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bob9.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_0_UP"/><link_ctn id="bob_cluster_link_from_0_to_3_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_UP"/>
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bob11.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_5_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_UP"/>
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bob0.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_0_UP"/>
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bob2.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_2_loopback"/>
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bob4.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_2_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_4_UP"/>
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bob6.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_0_UP"/><link_ctn id="bob_cluster_link_from_0_to_6_UP"/>
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bob8.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_8_UP"/>
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bob10.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_2_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_4_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_UP"/>
+>   </route>
+>   <route src="bob2.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bob1.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_4_DOWN"/>
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bob3.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_3_to_4_DOWN"/>
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bob5.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_4_to_5_UP"/>
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bob7.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_1_to_4_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_UP"/>
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bob9.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_3_to_4_DOWN"/><link_ctn id="bob_cluster_link_from_3_to_9_UP"/>
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bob11.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_4_to_5_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_UP"/>
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bob0.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_3_to_4_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_3_DOWN"/>
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bob2.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_4_to_5_UP"/><link_ctn id="bob_cluster_link_from_2_to_5_DOWN"/>
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bob4.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_4_loopback"/>
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bob6.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_3_to_4_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_3_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_UP"/>
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bob8.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_4_to_5_UP"/><link_ctn id="bob_cluster_link_from_2_to_5_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_UP"/>
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bob10.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_4_to_10_UP"/>
+>   </route>
+>   <route src="bob4.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bob1.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_6_to_7_UP"/><link_ctn id="bob_cluster_link_from_1_to_7_DOWN"/>
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bob3.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_6_to_9_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_DOWN"/>
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bob5.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_8_to_6_DOWN"/><link_ctn id="bob_cluster_link_from_8_to_11_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_DOWN"/>
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bob7.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_6_to_7_UP"/>
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bob9.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_6_to_9_UP"/>
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bob11.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_8_to_6_DOWN"/><link_ctn id="bob_cluster_link_from_8_to_11_UP"/>
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bob0.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_0_to_6_DOWN"/>
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bob2.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_8_to_6_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_DOWN"/>
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bob4.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_6_to_7_UP"/><link_ctn id="bob_cluster_link_from_7_to_10_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_DOWN"/>
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bob6.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_6_loopback"/>
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bob8.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_8_to_6_DOWN"/>
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bob10.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_6_to_7_UP"/><link_ctn id="bob_cluster_link_from_7_to_10_UP"/>
+>   </route>
+>   <route src="bob6.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bob1.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_7_to_8_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_DOWN"/>
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bob3.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_8_to_6_UP"/><link_ctn id="bob_cluster_link_from_6_to_9_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_DOWN"/>
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bob5.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_8_to_11_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_DOWN"/>
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bob7.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_7_to_8_DOWN"/>
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bob9.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_8_to_6_UP"/><link_ctn id="bob_cluster_link_from_6_to_9_UP"/>
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bob11.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_8_to_11_UP"/>
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bob0.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_8_to_6_UP"/><link_ctn id="bob_cluster_link_from_0_to_6_DOWN"/>
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bob2.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_2_to_8_DOWN"/>
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bob4.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_7_to_8_DOWN"/><link_ctn id="bob_cluster_link_from_7_to_10_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_DOWN"/>
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bob6.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_8_to_6_UP"/>
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bob8.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_8_loopback"/>
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bob10.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_7_to_8_DOWN"/><link_ctn id="bob_cluster_link_from_7_to_10_UP"/>
+>   </route>
+>   <route src="bob8.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bob1.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_7_to_10_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_DOWN"/>
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bob3.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_9_to_10_DOWN"/><link_ctn id="bob_cluster_link_from_3_to_9_DOWN"/>
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bob5.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_10_to_11_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_DOWN"/>
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bob7.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_7_to_10_DOWN"/>
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bob9.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_9_to_10_DOWN"/>
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bob11.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_10_to_11_UP"/>
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bob0.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_9_to_10_DOWN"/><link_ctn id="bob_cluster_link_from_6_to_9_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_DOWN"/>
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bob2.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_10_to_11_UP"/><link_ctn id="bob_cluster_link_from_8_to_11_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_DOWN"/>
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bob4.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_4_to_10_DOWN"/>
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bob6.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_9_to_10_DOWN"/><link_ctn id="bob_cluster_link_from_6_to_9_DOWN"/>
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bob8.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_from_10_to_11_UP"/><link_ctn id="bob_cluster_link_from_8_to_11_DOWN"/>
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bob10.hamburger.edu">
+>   <link_ctn id="bob_cluster_link_10_loopback"/>
+>   </route>
+>   <route src="bob10.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bob1.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bob3.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bob5.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bob7.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bob9.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bob11.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bob0.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bob2.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bob4.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bob6.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bob8.hamburger.edu">
+>   
+>   </route>
+>   <route src="bobbob_cluster_router.hamburger.edu" dst="bob10.hamburger.edu">
+>   
+>   </route>
+> </AS>
+> </platform>
index 10bf464..9ad9de8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index f1af007..bf009d1 100644 (file)
@@ -1,6 +1,6 @@
 /* check_defaults -- simple program displaying its context factory          */
 
-/* Copyright (c) 2013. The SimGrid Team.
+/* Copyright (c) 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d8cc911..33e4cd7 100644 (file)
@@ -5,7 +5,7 @@ p Test output of time independent tracing
 p generate a trace with pingpong, and replay itself, then check that output trace of the second run is the same as in the first (once sorted) 
 ! setenv LD_LIBRARY_PATH=../../lib
 ! output sort
-$ ../../smpi_script/bin/smpirun -trace-ti --cfg=tracing/filename:out_in_ti.txt --cfg=smpi/cpu_threshold:-1 -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 4 ./pingpong -q
+$ ../../smpi_script/bin/smpirun -trace-ti --cfg=tracing/filename:out_in_ti.txt --cfg=smpi/cpu_threshold:-1 -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 4 ./pingpong -q --log=smpi_kernel.thres:warning
 >     *** Ping-pong test (MPI_Send/MPI_Recv) ***
 > == pivot=0 : pingpong [0] <--> [1]
 > == pivot=1 : pingpong [1] <--> [2]
@@ -41,7 +41,7 @@ $ ../../smpi_script/bin/smpirun -trace-ti --cfg=tracing/filename:out_in_ti.txt -
 > [rank 2] -> Fafard
 > [rank 3] -> Ginette
 
-$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.:critical -trace-ti --cfg=tracing/filename:out_ti.txt --cfg=smpi/cpu_threshold:-1  -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 4 ../../examples/smpi/smpi_replay ./out_in_ti.txt
+$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.:critical -trace-ti --cfg=tracing/filename:out_ti.txt --cfg=smpi/cpu_threshold:-1  -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 4 ../../examples/smpi/smpi_replay ./out_in_ti.txt --log=smpi_kernel.thres:warning
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
 > [rank 2] -> Fafard
@@ -57,7 +57,7 @@ $ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.:critical -trace-t
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'out_ti.txt'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'smpi/cpu_threshold' to '-1'
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
-> [Jupiter:1:(0) 0.016798] [smpi_replay/INFO] Simulation time 0.0167975
+> [Jupiter:1:(0) 0.016798] [smpi_replay/INFO] Simulation time 0.016798
 
 ! output sort
 $ find ./out_ti.txt_files -type f -exec cat {} \;
@@ -115,7 +115,7 @@ $ rm out_in_ti.txt
 p Same test, but only using one output file for all processes
 p generate a trace with pingpong, and replay itself, then check that output trace of the second run is the same as in the first (once sorted) 
 ! output sort
-$ ../../smpi_script/bin/smpirun -trace-ti --cfg=tracing/filename:out_in_ti.txt --cfg=tracing/smpi/format/ti_one_file:yes -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 4 ./pingpong -q
+$ ../../smpi_script/bin/smpirun -trace-ti --cfg=tracing/filename:out_in_ti.txt --cfg=tracing/smpi/format/ti_one_file:yes -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 4 ./pingpong -q --log=smpi_kernel.thres:warning
 >     *** Ping-pong test (MPI_Send/MPI_Recv) ***
 > == pivot=0 : pingpong [0] <--> [1]
 > == pivot=1 : pingpong [1] <--> [2]
@@ -151,7 +151,7 @@ $ ../../smpi_script/bin/smpirun -trace-ti --cfg=tracing/filename:out_in_ti.txt -
 > [rank 2] -> Fafard
 > [rank 3] -> Ginette
 
-$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.:critical -trace-ti --cfg=tracing/filename:out_ti.txt --cfg=tracing/smpi/format/ti_one_file:yes   -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 4 ../../examples/smpi/smpi_replay ./out_in_ti.txt
+$ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.:critical -trace-ti --cfg=tracing/filename:out_ti.txt --cfg=tracing/smpi/format/ti_one_file:yes   -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 4 ../../examples/smpi/smpi_replay ./out_in_ti.txt --log=smpi_kernel.thres:warning
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
 > [rank 2] -> Fafard
@@ -167,7 +167,7 @@ $ ../../smpi_script/bin/smpirun -ext smpi_replay --log=replay.:critical -trace-t
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'out_ti.txt'
 > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/smpi/format/ti_one_file' to 'yes'
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
-> [Jupiter:1:(0) 0.016798] [smpi_replay/INFO] Simulation time 0.0167976
+> [Jupiter:1:(0) 0.016798] [smpi_replay/INFO] Simulation time 0.016798
 
 
 
index e0132ce..045154b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index fd076cb..3e23a6b 100644 (file)
@@ -3,7 +3,7 @@
 ! output sort
 
 p Test all to all
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allgather_coll
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allgather_coll --log=smpi_kernel.thres:warning
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
index f55f311..d5ffa8d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8497a1f..a4a9e46 100644 (file)
@@ -3,7 +3,7 @@
 ! output sort
 
 p Test allgatherv
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allgatherv_coll
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allgatherv_coll --log=smpi_kernel.thres:warning
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
index 72f5b61..a8044af 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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 <mpi.h>
 
index 00024b7..e2953f9 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index a1ba6ea..b797b2e 100644 (file)
@@ -3,7 +3,7 @@
 ! output sort
 
 p Test allreduce
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allreduce_coll
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allreduce_coll --log=smpi_kernel.thres:warning
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
index 663e552..ec96371 100644 (file)
@@ -4,7 +4,7 @@
 
 ! timeout 20
 p Test allreduce
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allreduce_coll 300000
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allreduce_coll 300000 --log=smpi_kernel.thres:warning
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
index 34e5912..8857561 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012, 2014. 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. */
+
 /****************************************************************************
 
  MESSAGE PASSING INTERFACE TEST CASE SUITE
index c3af311..9e2a166 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index a8cb7ce..8a9bd73 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 5a4f095..a99b590 100644 (file)
@@ -3,7 +3,7 @@
 ! output sort
 
 p Test all to all
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./alltoall_coll -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./alltoall_coll -q --log=smpi_kernel.thres:warning
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
index 0b4c71b..6a2c169 100644 (file)
@@ -1,4 +1,9 @@
-/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/* Copyright (c) 2013-2014. 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) 2001 by Argonne National Laboratory.
  *      See COPYRIGHT in top-level directory.
index 5a56594..3346488 100644 (file)
@@ -3,7 +3,7 @@
 ! output sort
 
 p Test all to all
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./alltoallv_coll
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./alltoallv_coll --log=smpi_kernel.thres:warning
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
index 1a680de..5c87292 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2009, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 6e5a74a..a58751e 100644 (file)
@@ -3,7 +3,7 @@
 ! output sort
 
 p Test barrier
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./barrier_coll
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./barrier_coll --log=smpi_kernel.thres:warning
 > ... Barrier ....
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
index 0743d23..e0bff2d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2009, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 9fb3059..7b5430e 100644 (file)
@@ -2,7 +2,7 @@
 # (since we want to pass it to the child, it has to be redefined before each command)
 # Go for the first test
 p Test Broadcast with less processes than hosts
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 3 ./bcast -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 3 ./bcast -q --log=smpi_kernel.thres:warning
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
 > [rank 2] -> Fafard
@@ -14,7 +14,7 @@ $ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform $
 # second test
 p Test Broadcast with as much processes than hosts
 ! setenv LD_LIBRARY_PATH=../../lib
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 5 ./bcast -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 5 ./bcast -q --log=smpi_kernel.thres:warning
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
 > [rank 2] -> Fafard
@@ -28,7 +28,7 @@ $ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform $
 # Another test
 p Test Broadcast with more processes than hosts
 ! setenv LD_LIBRARY_PATH=../../lib
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 12 ./bcast -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 12 ./bcast -q --log=smpi_kernel.thres:warning
 > You requested to use 12 processes, but there is only 5 processes in your hostfile...
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
index a78bd5d..c9d898e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2013. The SimGrid Team.
+/* Copyright (c) 2009, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index dc5c70a..641e8d2 100644 (file)
@@ -2,7 +2,7 @@ p Test Broadcast with more processes than hosts
 ! setenv LD_LIBRARY_PATH=../../lib
 ! output sort
 
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./bcast_coll
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./bcast_coll --log=smpi_kernel.thres:warning
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
index e67315e..92bce0f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -9,11 +9,12 @@
 
 int main(int argc, char *argv[])
 {
-  int i;
+  int i, n;
   double d;
   MPI_Init(&argc, &argv);
+  n = argc > 1 ? atoi(argv[1]) : 0;
   d = 2.0;
-  for (i = 0; i < atoi(argv[1]); i++) {
+  for (i = 0; i < n; i++) {
     if (d < 10000) {
       d = d * d;
     } else {
index aec5db3..8e74bb9 100644 (file)
@@ -1,31 +1,29 @@
 p Test compute
-! setenv LD_LIBRARY_PATH=../../lib
-! output sort
 ! timeout 5
-$ ../../smpi_script/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'
+$ ../../smpi_script/bin/smpirun -platform ${srcdir:=.}/../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir:=.}/hostfile -np 3 --log=root.thres:warning ./compute 7 --log=smpi_kernel.thres:warning
+> 7 16.000000
+> 7 16.000000
+> 7 16.000000
+
+p Test compute only once
+! timeout 5
+$ ../../smpi_script/bin/smpirun -platform ${srcdir:=.}/../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir:=.}/hostfile -np 3 --log=root.thres:warning ./compute2 7 --log=smpi_kernel.thres:warning
+> 7 16.000000
 
 p Test compute and bench
-! setenv LD_LIBRARY_PATH=../../lib
 ! output sort
 ! timeout 45
-$ ../../smpi_script/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)
-
+$ ../../smpi_script/bin/smpirun  -platform ${srcdir:=.}/../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir:=.}/hostfile -np 3 --log=root.thres:warning ./compute3 quiet --log=smpi_kernel.thres:warning
+> (0) Run the first computation. It's globally benched, and I want no more than 4 benchmarks (thres<0)
+> (0) Run the first computation. It's globally benched, and I want no more than 4 benchmarks (thres<0)
+> (0) Run the first computation. It's globally benched, and I want no more than 4 benchmarks (thres<0)
+> (0) Run the first computation. It's globally benched, and I want no more than 4 benchmarks (thres<0)
+> (1) [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)
+> (1) [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)
+> (1) [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)
+> (1) [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)
+> (1) [rank:2] 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)
+> (1) [rank:2] 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)
+> (2) [rank:0] Done.
+> (2) [rank:1] Done.
+> (2) [rank:2] Done.
index 1720d84..3102858 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -9,12 +9,14 @@
 
 int main(int argc, char *argv[])
 {
-  int i;
+  int i, n;
   double d;
   MPI_Init(&argc, &argv);
+  n = argc > 1 ? atoi(argv[1]) : 0;
   d = 2.0;
-/*  SMPI_DO_ONCE */  {
-    for (i = 0; i < atoi(argv[1]); i++) {
+  /* Run it only once across the whole set of processes */
+  SMPI_SAMPLE_GLOBAL(1, -1) {
+    for (i = 0; i < n; i++) {
       if (d < 10000) {
         d = d * d;
       } else {
index f0445ba..3117730 100644 (file)
@@ -1,49 +1,75 @@
-/* Copyright (c) 2009-2012. The SimGrid Team.
+/* Copyright (c) 2009-2014. 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 should be instructive to learn about SMPI_SAMPLE_LOCAL and 
+/* This example should be instructive to learn about SMPI_SAMPLE_LOCAL and
    SMPI_SAMPLE_GLOBAL macros for execution sampling */
 
 #include <stdio.h>
 #include <mpi.h>
 
+static double compute(double d0)
+{
+  double d = d0;
+  int j;
+  for (j = 0; j < 100 * 1000 * 1000; j++) { /* 100 kflop */
+    if (d < 100000) {
+      d = d * d;
+    } else {
+      d = 2;
+    }
+  }
+  return d;
+}
+
 int main(int argc, char *argv[])
 {
-  int i,j;
+  int verbose;
+  int i, n;
   double d;
   MPI_Init(&argc, &argv);
+  verbose = argc <= 1;
+  MPI_Comm_size(MPI_COMM_WORLD, &n);
   d = 2.0;
-  for (i=0;i<5;i++) {  
-     SMPI_SAMPLE_GLOBAL(3,-1)  { // I want no more than 3 benchs (thres<0)
-       fprintf(stderr,"[rank:%d] Run the first computation. It's globally benched, and I want no more than 3 benchmarks (thres<0)\n", smpi_process_index());
-    
-       for (j=0;j<100*1000*1000;j++) { // 100 kflop
-          if (d < 100000) {
-             d = d * d;
-          } else {
-             d = 2;
-          }
-       }     
+  for (i = 0; i < 5; i++) {
+    /* I want no more than n + 1 benchs (thres < 0) */
+    SMPI_SAMPLE_GLOBAL(n + 1, -1) {
+      if (verbose)
+        fprintf(stderr, "(%12.6f) [rank:%d]", MPI_Wtime(), smpi_process_index());
+      else
+        fprintf(stderr, "(0)");
+      fprintf(stderr, " Run the first computation. It's globally benched, "
+              "and I want no more than %d benchmarks (thres<0)\n", n + 1);
+      d = compute(2.0);
      }
   }
 
-  for (i=0;i<5;i++) {  
-     SMPI_SAMPLE_LOCAL(0, 0.1) { // I want the standard error to go below 0.1 second. Two tests at least will be run (count is not >0)
-       fprintf(stderr,"[rank:%d] 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)\n", smpi_process_index());
-       for (j=0;j<100*1000*1000;j++) { // 100 kflop
-          if (d < 100000) {
-             d = d * d;
-          } else {
-             d = 2;
-          }
-       }
+  n = 0;
+  for (i = 0; i < 5; i++) {
+    /* I want the standard error to go below 0.1 second.
+     * Two tests at least will be run (count is not > 0) */
+    SMPI_SAMPLE_LOCAL(0, 0.1) {
+      if (verbose || n++ < 2) {
+        if (verbose)
+          fprintf(stderr, "(%12.6f)", MPI_Wtime());
+        else
+          fprintf(stderr, "(1)");
+        fprintf(stderr,
+                " [rank:%d] 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)\n", smpi_process_index());
+      }
+      d = compute(d);
      }
   }
-   
-  fprintf(stderr,"[%d] The result of the computation is: %f\n", smpi_process_index(), d);
+
+  if (verbose)
+    fprintf(stderr, "(%12.6f) [rank:%d] The result of the computation is: %f\n",
+            MPI_Wtime(), smpi_process_index(), d);
+  else
+    fprintf(stderr, "(2) [rank:%d] Done.\n", smpi_process_index());
 
   MPI_Finalize();
   return 0;
index 8043e5b..30d6389 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2013. The SimGrid Team.
+/* Copyright (c) 2011-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d3944e7..feed636 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 2faa727..9498cf1 100644 (file)
@@ -4,7 +4,7 @@
 ! timeout 30
 
 p Test all to all
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./gather_coll
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./gather_coll --log=smpi_kernel.thres:warning
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
index 5601e71..90b9a0b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index c0a66fe..99e1111 100644 (file)
@@ -1,7 +1,7 @@
 p Test hvector
 ! setenv LD_LIBRARY_PATH=../../lib
 ! output sort
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./hvector_test -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./hvector_test -q --log=smpi_kernel.thres:warning
 > [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'
index f3cb04f..f37f234 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 "mpi.h"
 #define SIZE 4
index 6e1d458..c5e6f8d 100644 (file)
@@ -1,7 +1,7 @@
 p Test indexed
 ! setenv LD_LIBRARY_PATH=../../lib
 ! output sort
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./indexed_test -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./indexed_test -q --log=smpi_kernel.thres:warning
 > [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'
index 5d2dac0..4ceed68 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 "mpi.h"
 
index 645ace8..f8b8f8e 100644 (file)
@@ -45,3 +45,22 @@ set(txt_files
   ${CMAKE_CURRENT_SOURCE_DIR}/include/mpitestconf.h
   ${CMAKE_CURRENT_SOURCE_DIR}/include/mpitest.h
   PARENT_SCOPE)
+
+
+#build only once files used in each test (C version compiled here at root, F77 is in f77/util, and F90 in F90/util)
+
+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")
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include/")
+
+#C version
+add_library(mtest_c STATIC util/mtest.c)
+
+
+
index 90e04da..95c7d48 100644 (file)
@@ -13,41 +13,41 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
 
-  add_executable(attr2type attr2type.c ../util/mtest.c)
-  add_executable(attrend2 attrend2.c ../util/mtest.c)
-  add_executable(attrend attrend.c ../util/mtest.c)
-  add_executable(attrerr attrerr.c ../util/mtest.c)
-  add_executable(attrerrcomm attrerrcomm.c ../util/mtest.c)
-  add_executable(attrerrtype attrerrtype.c ../util/mtest.c)
-  add_executable(attric attric.c ../util/mtest.c)
-  add_executable(attrorder attrorder.c ../util/mtest.c)
-  add_executable(attrordercomm attrordercomm.c ../util/mtest.c)
-  add_executable(attrordertype attrordertype.c ../util/mtest.c)
-  add_executable(attrt attrt.c ../util/mtest.c)
-  add_executable(baseattr2 baseattr2.c ../util/mtest.c)
-  add_executable(baseattrcomm baseattrcomm.c ../util/mtest.c)
-  add_executable(fkeyval fkeyval.c ../util/mtest.c)
-  add_executable(fkeyvalcomm fkeyvalcomm.c ../util/mtest.c)
-  add_executable(fkeyvaltype fkeyvaltype.c ../util/mtest.c)
-  add_executable(keyval_double_free keyval_double_free.c ../util/mtest.c)
+#  add_executable(attr2type attr2type.c)
+  add_executable(attrend2 attrend2.c)
+#  add_executable(attrend attrend.c)
+#  add_executable(attrerr attrerr.c)
+#  add_executable(attrerrcomm attrerrcomm.c)
+#  add_executable(attrerrtype attrerrtype.c)
+#  add_executable(attric attric.c)
+#  add_executable(attrorder attrorder.c)
+#  add_executable(attrordercomm attrordercomm.c)
+#  add_executable(attrordertype attrordertype.c)
+#  add_executable(attrt attrt.c)
+#  add_executable(baseattr2 baseattr2.c)
+#  add_executable(baseattrcomm baseattrcomm.c)
+#  add_executable(fkeyval fkeyval.c)
+#  add_executable(fkeyvalcomm fkeyvalcomm.c)
+#  add_executable(fkeyvaltype fkeyvaltype.c)
+#  add_executable(keyval_double_free keyval_double_free.c)
 
-  target_link_libraries(attr2type  simgrid)
-  target_link_libraries(attrend2 simgrid)
-  target_link_libraries(attrend simgrid)
-  target_link_libraries(attrerr simgrid)
-  target_link_libraries(attrerrcomm simgrid)
-  target_link_libraries(attrerrtype simgrid)
-  target_link_libraries(attric simgrid)
-  target_link_libraries(attrorder simgrid)
-  target_link_libraries(attrordercomm simgrid)
-  target_link_libraries(attrordertype simgrid)
-  target_link_libraries(attrt simgrid)
-  target_link_libraries(baseattr2 simgrid)
-  target_link_libraries(baseattrcomm simgrid)
-  target_link_libraries(fkeyval simgrid)
-  target_link_libraries(fkeyvalcomm simgrid)
-  target_link_libraries(fkeyvaltype simgrid)
-  target_link_libraries(keyval_double_free simgrid)
+#  target_link_libraries(attr2type simgrid mtest_c)
+  target_link_libraries(attrend2 simgrid mtest_c)
+#  target_link_libraries(attrend simgrid mtest_c)
+#  target_link_libraries(attrerr simgrid mtest_c)
+#  target_link_libraries(attrerrcomm simgrid mtest_c)
+#  target_link_libraries(attrerrtype simgrid mtest_c)
+#  target_link_libraries(attric simgrid mtest_c)
+#  target_link_libraries(attrorder simgrid mtest_c)
+#  target_link_libraries(attrordercomm simgrid mtest_c)
+#  target_link_libraries(attrordertype simgrid mtest_c)
+#  target_link_libraries(attrt simgrid mtest_c)
+#  target_link_libraries(baseattr2 simgrid mtest_c)
+#  target_link_libraries(baseattrcomm simgrid mtest_c)
+#  target_link_libraries(fkeyval simgrid mtest_c)
+#  target_link_libraries(fkeyvalcomm simgrid mtest_c)
+#  target_link_libraries(fkeyvaltype simgrid mtest_c)
+#  target_link_libraries(keyval_double_free simgrid mtest_c)
 
 endif()
 
index 4d4093b..a7e5d0b 100644 (file)
@@ -12,185 +12,185 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
 
-  add_executable(allgather2 allgather2.c ../util/mtest.c)
-  add_executable(allgather3 allgather3.c ../util/mtest.c)
-  add_executable(allgatherv2 allgatherv2.c ../util/mtest.c)
-  add_executable(allgatherv3 allgatherv3.c ../util/mtest.c)
-  add_executable(allgatherv4 allgatherv4.c ../util/mtest.c)
-  add_executable(allred2 allred2.c ../util/mtest.c)
-  add_executable(allred3 allred3.c ../util/mtest.c)
-  add_executable(allred4 allred4.c ../util/mtest.c)
-  add_executable(allred5 allred5.c ../util/mtest.c)
-  add_executable(allred6 allred6.c ../util/mtest.c)
-#  add_executable(allred allred.c ../util/mtest.c)
-  add_executable(allredmany allredmany.c ../util/mtest.c)
-  add_executable(alltoall1 alltoall1.c ../util/mtest.c)
-  add_executable(alltoallv0 alltoallv0.c ../util/mtest.c)
-  add_executable(alltoallv alltoallv.c ../util/mtest.c)
-  add_executable(alltoallw1 alltoallw1.c ../util/mtest.c)
-  add_executable(alltoallw2 alltoallw2.c ../util/mtest.c)
-  add_executable(alltoallw_zeros alltoallw_zeros.c ../util/mtest.c)
-  add_executable(bcast2 bcast2.c ../util/mtest.c)
-  add_executable(bcast3 bcast3.c ../util/mtest.c)
-  add_executable(bcasttest bcasttest.c ../util/mtest.c)
-  add_executable(bcastzerotype bcastzerotype.c ../util/mtest.c)
-  add_executable(coll10 coll10.c ../util/mtest.c)
-  add_executable(coll11 coll11.c ../util/mtest.c)
-  add_executable(coll12 coll12.c ../util/mtest.c)
-  add_executable(coll13 coll13.c ../util/mtest.c)
-  add_executable(coll2 coll2.c ../util/mtest.c)
-  add_executable(coll3 coll3.c ../util/mtest.c)
-  add_executable(coll4 coll4.c ../util/mtest.c)
-  add_executable(coll5 coll5.c ../util/mtest.c)
-  add_executable(coll6 coll6.c ../util/mtest.c)
-  add_executable(coll7 coll7.c ../util/mtest.c)
-  add_executable(coll8 coll8.c ../util/mtest.c)
-  add_executable(coll9 coll9.c ../util/mtest.c)
-  add_executable(exscan2 exscan2.c ../util/mtest.c)
-  add_executable(exscan exscan.c ../util/mtest.c)
-  add_executable(gather2 gather2.c ../util/mtest.c)
-  add_executable(gather2_save gather2_save.c ../util/mtest.c)
-  add_executable(gather gather.c ../util/mtest.c)
-  add_executable(iallred iallred.c ../util/mtest.c)
-  add_executable(ibarrier ibarrier.c ../util/mtest.c)
-  add_executable(icallgather icallgather.c ../util/mtest.c)
-  add_executable(icallgatherv icallgatherv.c ../util/mtest.c)
-  add_executable(icallreduce icallreduce.c ../util/mtest.c)
-  add_executable(icalltoall icalltoall.c ../util/mtest.c)
-  add_executable(icalltoallv icalltoallv.c ../util/mtest.c)
-  add_executable(icalltoallw icalltoallw.c ../util/mtest.c)
-  add_executable(icbarrier icbarrier.c ../util/mtest.c)
-  add_executable(icbcast icbcast.c ../util/mtest.c)
-  add_executable(icgather icgather.c ../util/mtest.c)
-  add_executable(icgatherv icgatherv.c ../util/mtest.c)
-  add_executable(icreduce icreduce.c ../util/mtest.c)
-  add_executable(icscatter icscatter.c ../util/mtest.c)
-  add_executable(icscatterv icscatterv.c ../util/mtest.c)
-  add_executable(longuser longuser.c ../util/mtest.c)
-  add_executable(nonblocking2 nonblocking2.c ../util/mtest.c)
-  add_executable(nonblocking3 nonblocking3.c ../util/mtest.c)
-  add_executable(nonblocking nonblocking.c ../util/mtest.c)
-  add_executable(opband opband.c ../util/mtest.c)
-  add_executable(opbor opbor.c ../util/mtest.c)
-  add_executable(opbxor opbxor.c ../util/mtest.c)
-  add_executable(op_commutative op_commutative.c ../util/mtest.c)
-  add_executable(opland opland.c ../util/mtest.c)
-  add_executable(oplor oplor.c ../util/mtest.c)
-  add_executable(oplxor oplxor.c ../util/mtest.c)
-  add_executable(opmax opmax.c ../util/mtest.c)
-  add_executable(opmaxloc opmaxloc.c ../util/mtest.c)
-  add_executable(opmin opmin.c ../util/mtest.c)
-  add_executable(opminloc opminloc.c ../util/mtest.c)
-  add_executable(opprod opprod.c ../util/mtest.c)
-  add_executable(opsum opsum.c ../util/mtest.c)
-  add_executable(red3 red3.c ../util/mtest.c)
-  add_executable(red4 red4.c ../util/mtest.c)
-  add_executable(redscat2 redscat2.c ../util/mtest.c)
-  add_executable(redscat3 redscat3.c ../util/mtest.c)
-  add_executable(redscatbkinter redscatbkinter.c ../util/mtest.c)
-  add_executable(redscatblk3 redscatblk3.c ../util/mtest.c)
-  add_executable(red_scat_block2 red_scat_block2.c ../util/mtest.c)
-  add_executable(red_scat_block red_scat_block.c ../util/mtest.c)
-  add_executable(redscat redscat.c ../util/mtest.c)
-  add_executable(redscatinter redscatinter.c ../util/mtest.c)
-  add_executable(reduce_mpich reduce.c ../util/mtest.c)
-  add_executable(reduce_local reduce_local.c ../util/mtest.c)
-  add_executable(scantst scantst.c ../util/mtest.c)
-  add_executable(scatter2 scatter2.c ../util/mtest.c)
-  add_executable(scatter3 scatter3.c ../util/mtest.c)
-  add_executable(scattern scattern.c ../util/mtest.c)
-  add_executable(scatterv scatterv.c ../util/mtest.c)
-  add_executable(uoplong uoplong.c ../util/mtest.c)
+  add_executable(allgather2 allgather2.c)
+  add_executable(allgather3 allgather3.c)
+  add_executable(allgatherv2 allgatherv2.c)
+  add_executable(allgatherv3 allgatherv3.c)
+  add_executable(allgatherv4 allgatherv4.c)
+  add_executable(allred2 allred2.c)
+  add_executable(allred3 allred3.c)
+  add_executable(allred4 allred4.c)
+  add_executable(allred5 allred5.c)
+  add_executable(allred6 allred6.c)
+#  add_executable(allred allred.c)
+  add_executable(allredmany allredmany.c)
+  add_executable(alltoall1 alltoall1.c)
+  add_executable(alltoallv0 alltoallv0.c)
+  add_executable(alltoallv alltoallv.c)
+#  add_executable(alltoallw1 alltoallw1.c)
+#  add_executable(alltoallw2 alltoallw2.c)
+#  add_executable(alltoallw_zeros alltoallw_zeros.c)
+#  add_executable(bcast2 bcast2.c)
+#  add_executable(bcast3 bcast3.c)
+  add_executable(bcasttest bcasttest.c)
+  add_executable(bcastzerotype bcastzerotype.c)
+  add_executable(coll10 coll10.c)
+  add_executable(coll11 coll11.c)
+  add_executable(coll12 coll12.c)
+  add_executable(coll13 coll13.c)
+  add_executable(coll2 coll2.c)
+  add_executable(coll3 coll3.c)
+  add_executable(coll4 coll4.c)
+  add_executable(coll5 coll5.c)
+  add_executable(coll6 coll6.c)
+  add_executable(coll7 coll7.c)
+  add_executable(coll8 coll8.c)
+  add_executable(coll9 coll9.c)
+  add_executable(exscan2 exscan2.c)
+  add_executable(exscan exscan.c)
+  add_executable(gather2 gather2.c)
+#  add_executable(gather2_save gather2_save.c)
+  add_executable(gather gather.c)
+  add_executable(iallred iallred.c)
+  add_executable(ibarrier ibarrier.c)
+#  add_executable(icallgather icallgather.c)
+#  add_executable(icallgatherv icallgatherv.c)
+#  add_executable(icallreduce icallreduce.c)
+#  add_executable(icalltoall icalltoall.c)
+#  add_executable(icalltoallv icalltoallv.c)
+#  add_executable(icalltoallw icalltoallw.c)
+#  add_executable(icbarrier icbarrier.c)
+#  add_executable(icbcast icbcast.c)
+#  add_executable(icgather icgather.c)
+#  add_executable(icgatherv icgatherv.c)
+#  add_executable(icreduce icreduce.c)
+#  add_executable(icscatter icscatter.c)
+#  add_executable(icscatterv icscatterv.c)
+  add_executable(longuser longuser.c)
+  add_executable(nonblocking2 nonblocking2.c)
+  add_executable(nonblocking3 nonblocking3.c)
+  add_executable(nonblocking nonblocking.c)
+#  add_executable(opband opband.c)
+#  add_executable(opbor opbor.c)
+#  add_executable(opbxor opbxor.c)
+  add_executable(op_commutative op_commutative.c)
+#  add_executable(opland opland.c)
+#  add_executable(oplor oplor.c)
+#  add_executable(oplxor oplxor.c)
+#  add_executable(opmax opmax.c)
+#  add_executable(opmaxloc opmaxloc.c)
+#  add_executable(opmin opmin.c)
+#  add_executable(opminloc opminloc.c)
+#  add_executable(opprod opprod.c)
+#  add_executable(opsum opsum.c)
+  add_executable(red3 red3.c)
+  add_executable(red4 red4.c)
+  add_executable(redscat2 redscat2.c)
+  add_executable(redscat3 redscat3.c)
+  add_executable(redscatbkinter redscatbkinter.c)
+  add_executable(redscatblk3 redscatblk3.c)
+  add_executable(red_scat_block2 red_scat_block2.c)
+  add_executable(red_scat_block red_scat_block.c)
+  add_executable(redscat redscat.c)
+#  add_executable(redscatinter redscatinter.c)
+  add_executable(reduce_mpich reduce.c)
+  add_executable(reduce_local reduce_local.c)
+  add_executable(scantst scantst.c)
+  add_executable(scatter2 scatter2.c)
+  add_executable(scatter3 scatter3.c)
+  add_executable(scattern scattern.c)
+#  add_executable(scatterv scatterv.c)
+#  add_executable(uoplong uoplong.c)
 
-  target_link_libraries(allgather2  simgrid)
-  target_link_libraries(allgather3  simgrid)
-  target_link_libraries(allgatherv2  simgrid)
-  target_link_libraries(allgatherv3  simgrid)
-  target_link_libraries(allgatherv4  simgrid)
-  target_link_libraries(allred2  simgrid)
-  target_link_libraries(allred3  simgrid)
-  target_link_libraries(allred4  simgrid)
-  target_link_libraries(allred5  simgrid)
-  target_link_libraries(allred6  simgrid)
-#  target_link_libraries(allred  simgrid)
-  target_link_libraries(allredmany  simgrid)
-  target_link_libraries(alltoall1  simgrid)
-  target_link_libraries(alltoallv0  simgrid)
-  target_link_libraries(alltoallv  simgrid)
-  target_link_libraries(alltoallw1  simgrid)
-  target_link_libraries(alltoallw2  simgrid)
-  target_link_libraries(alltoallw_zeros  simgrid)
-  target_link_libraries(bcast2  simgrid)
-  target_link_libraries(bcast3  simgrid)
-  target_link_libraries(bcasttest  simgrid)
-  target_link_libraries(bcastzerotype  simgrid)
-  target_link_libraries(coll10  simgrid)
-  target_link_libraries(coll11  simgrid)
-  target_link_libraries(coll12  simgrid)
-  target_link_libraries(coll13  simgrid)
-  target_link_libraries(coll2  simgrid)
-  target_link_libraries(coll3  simgrid)
-  target_link_libraries(coll4  simgrid)
-  target_link_libraries(coll5  simgrid)
-  target_link_libraries(coll6  simgrid)
-  target_link_libraries(coll7  simgrid)
-  target_link_libraries(coll8  simgrid)
-  target_link_libraries(coll9  simgrid)
-  target_link_libraries(exscan2  simgrid)
-  target_link_libraries(exscan  simgrid)
-  target_link_libraries(gather2  simgrid)
-  target_link_libraries(gather2_save  simgrid)
-  target_link_libraries(gather  simgrid)
-  target_link_libraries(iallred  simgrid)
-  target_link_libraries(ibarrier  simgrid)
-  target_link_libraries(icallgather  simgrid)
-  target_link_libraries(icallgatherv  simgrid)
-  target_link_libraries(icallreduce  simgrid)
-  target_link_libraries(icalltoall  simgrid)
-  target_link_libraries(icalltoallv  simgrid)
-  target_link_libraries(icalltoallw  simgrid)
-  target_link_libraries(icbarrier  simgrid)
-  target_link_libraries(icbcast  simgrid)
-  target_link_libraries(icgather  simgrid)
-  target_link_libraries(icgatherv  simgrid)
-  target_link_libraries(icreduce  simgrid)
-  target_link_libraries(icscatter  simgrid)
-  target_link_libraries(icscatterv  simgrid)
-  target_link_libraries(longuser  simgrid)
-  target_link_libraries(nonblocking2  simgrid)
-  target_link_libraries(nonblocking3  simgrid)
-  target_link_libraries(nonblocking  simgrid)
-  target_link_libraries(opband  simgrid)
-  target_link_libraries(opbor  simgrid)
-  target_link_libraries(opbxor  simgrid)
-  target_link_libraries(op_commutative  simgrid)
-  target_link_libraries(opland  simgrid)
-  target_link_libraries(oplor  simgrid)
-  target_link_libraries(oplxor  simgrid)
-  target_link_libraries(opmax  simgrid)
-  target_link_libraries(opmaxloc  simgrid)
-  target_link_libraries(opmin  simgrid)
-  target_link_libraries(opminloc  simgrid)
-  target_link_libraries(opprod  simgrid)
-  target_link_libraries(opsum  simgrid)
-  target_link_libraries(red3  simgrid)
-  target_link_libraries(red4  simgrid)
-  target_link_libraries(redscat2  simgrid)
-  target_link_libraries(redscat3  simgrid)
-  target_link_libraries(redscatbkinter  simgrid)
-  target_link_libraries(redscatblk3  simgrid)
-  target_link_libraries(red_scat_block2  simgrid)
-  target_link_libraries(red_scat_block  simgrid)
-  target_link_libraries(redscat  simgrid)
-  target_link_libraries(redscatinter  simgrid)
-  target_link_libraries(reduce_mpich  simgrid)
-  target_link_libraries(reduce_local  simgrid)
-  target_link_libraries(scantst  simgrid)
-  target_link_libraries(scatter2  simgrid)
-  target_link_libraries(scatter3  simgrid)
-  target_link_libraries(scattern  simgrid)
-  target_link_libraries(scatterv  simgrid)
-  target_link_libraries(uoplong  simgrid)
+  target_link_libraries(allgather2  simgrid mtest_c)
+  target_link_libraries(allgather3  simgrid mtest_c)
+  target_link_libraries(allgatherv2  simgrid mtest_c)
+  target_link_libraries(allgatherv3  simgrid mtest_c)
+  target_link_libraries(allgatherv4  simgrid mtest_c)
+  target_link_libraries(allred2  simgrid mtest_c)
+  target_link_libraries(allred3  simgrid mtest_c)
+  target_link_libraries(allred4  simgrid mtest_c)
+  target_link_libraries(allred5  simgrid mtest_c)
+  target_link_libraries(allred6  simgrid mtest_c)
+#  target_link_libraries(allred  simgrid mtest_c)
+  target_link_libraries(allredmany  simgrid mtest_c)
+  target_link_libraries(alltoall1  simgrid mtest_c)
+  target_link_libraries(alltoallv0  simgrid mtest_c)
+  target_link_libraries(alltoallv  simgrid mtest_c)
+#  target_link_libraries(alltoallw1  simgrid mtest_c)
+#  target_link_libraries(alltoallw2  simgrid mtest_c)
+#  target_link_libraries(alltoallw_zeros  simgrid mtest_c)
+#  target_link_libraries(bcast2  simgrid mtest_c)
+#  target_link_libraries(bcast3  simgrid mtest_c)
+  target_link_libraries(bcasttest  simgrid mtest_c)
+  target_link_libraries(bcastzerotype  simgrid mtest_c)
+  target_link_libraries(coll10  simgrid mtest_c)
+  target_link_libraries(coll11  simgrid mtest_c)
+  target_link_libraries(coll12  simgrid mtest_c)
+  target_link_libraries(coll13  simgrid mtest_c)
+  target_link_libraries(coll2  simgrid mtest_c)
+  target_link_libraries(coll3  simgrid mtest_c)
+  target_link_libraries(coll4  simgrid mtest_c)
+  target_link_libraries(coll5  simgrid mtest_c)
+  target_link_libraries(coll6  simgrid mtest_c)
+  target_link_libraries(coll7  simgrid mtest_c)
+  target_link_libraries(coll8  simgrid mtest_c)
+  target_link_libraries(coll9  simgrid mtest_c)
+  target_link_libraries(exscan2  simgrid mtest_c)
+  target_link_libraries(exscan  simgrid mtest_c)
+  target_link_libraries(gather2  simgrid mtest_c)
+#  target_link_libraries(gather2_save  simgrid mtest_c)
+  target_link_libraries(gather  simgrid mtest_c)
+  target_link_libraries(iallred  simgrid mtest_c)
+  target_link_libraries(ibarrier  simgrid mtest_c)
+#  target_link_libraries(icallgather  simgrid mtest_c)
+#  target_link_libraries(icallgatherv  simgrid mtest_c)
+#  target_link_libraries(icallreduce  simgrid mtest_c)
+#  target_link_libraries(icalltoall  simgrid mtest_c)
+#  target_link_libraries(icalltoallv  simgrid mtest_c)
+#  target_link_libraries(icalltoallw  simgrid mtest_c)
+#  target_link_libraries(icbarrier  simgrid mtest_c)
+#  target_link_libraries(icbcast  simgrid mtest_c)
+#  target_link_libraries(icgather  simgrid mtest_c)
+#  target_link_libraries(icgatherv  simgrid mtest_c)
+#  target_link_libraries(icreduce  simgrid mtest_c)
+#  target_link_libraries(icscatter  simgrid mtest_c)
+#  target_link_libraries(icscatterv  simgrid mtest_c)
+  target_link_libraries(longuser  simgrid mtest_c)
+  target_link_libraries(nonblocking2  simgrid mtest_c)
+  target_link_libraries(nonblocking3  simgrid mtest_c)
+  target_link_libraries(nonblocking  simgrid mtest_c)
+#  target_link_libraries(opband  simgrid mtest_c)
+#  target_link_libraries(opbor  simgrid mtest_c)
+#  target_link_libraries(opbxor  simgrid mtest_c)
+  target_link_libraries(op_commutative  simgrid mtest_c)
+#  target_link_libraries(opland  simgrid mtest_c)
+#  target_link_libraries(oplor  simgrid mtest_c)
+#  target_link_libraries(oplxor  simgrid mtest_c)
+#  target_link_libraries(opmax  simgrid mtest_c)
+#  target_link_libraries(opmaxloc  simgrid mtest_c)
+#  target_link_libraries(opmin  simgrid mtest_c)
+#  target_link_libraries(opminloc  simgrid mtest_c)
+#  target_link_libraries(opprod  simgrid mtest_c)
+#  target_link_libraries(opsum  simgrid mtest_c)
+  target_link_libraries(red3  simgrid mtest_c)
+  target_link_libraries(red4  simgrid mtest_c)
+  target_link_libraries(redscat2  simgrid mtest_c)
+  target_link_libraries(redscat3  simgrid mtest_c)
+  target_link_libraries(redscatbkinter  simgrid mtest_c)
+  target_link_libraries(redscatblk3  simgrid mtest_c)
+  target_link_libraries(red_scat_block2  simgrid mtest_c)
+  target_link_libraries(red_scat_block  simgrid mtest_c)
+  target_link_libraries(redscat  simgrid mtest_c)
+#  target_link_libraries(redscatinter  simgrid mtest_c)
+  target_link_libraries(reduce_mpich  simgrid mtest_c)
+  target_link_libraries(reduce_local  simgrid mtest_c)
+  target_link_libraries(scantst  simgrid mtest_c)
+  target_link_libraries(scatter2  simgrid mtest_c)
+  target_link_libraries(scatter3  simgrid mtest_c)
+  target_link_libraries(scattern  simgrid mtest_c)
+#  target_link_libraries(scatterv  simgrid mtest_c)
+#  target_link_libraries(uoplong  simgrid mtest_c)
 
 endif()
 
index 29e4d47..60bf0a4 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "mpi.h"
 #include "mpitest.h"
+#include "smpi_cocci.h"
 #include <stdio.h>
 #include <stdlib.h>
 #ifdef HAVE_SYS_TIME_H
 #define MAX_BUF   (32 * 1024 * 1024)
 #define LOOPS 10
 
-__thread char * sbuf, * rbuf;
-__thread int * recvcounts, * displs;
-int errs = 0;
+SMPI_VARINIT_GLOBAL(sbuf, char*);
+SMPI_VARINIT_GLOBAL(rbuf, char*);
+SMPI_VARINIT_GLOBAL(recvcounts, int*);
+SMPI_VARINIT_GLOBAL(displs, int*);
+SMPI_VARINIT_GLOBAL_AND_SET(errs, int, 0);
 
 /* #define dprintf printf */
 #define dprintf(...)
@@ -56,19 +59,19 @@ int main(int argc, char ** argv)
     if (LARGE_BUF * comm_size > MAX_BUF)
         goto fn_exit;
 
-    sbuf = (void *) calloc(MAX_BUF, 1);
-    rbuf = (void *) calloc(MAX_BUF, 1);
+    SMPI_VARGET_GLOBAL(sbuf) = (void *) calloc(MAX_BUF, 1);
+    SMPI_VARGET_GLOBAL(rbuf) = (void *) calloc(MAX_BUF, 1);
 
     srand(time(NULL));
 
-    recvcounts = (void *) malloc(comm_size * sizeof(int));
-    displs = (void *) malloc(comm_size * sizeof(int));
-    if (!recvcounts || !displs || !sbuf || !rbuf) {
+    SMPI_VARGET_GLOBAL(recvcounts) = (void *) malloc(comm_size * sizeof(int));
+    SMPI_VARGET_GLOBAL(displs) = (void *) malloc(comm_size * sizeof(int));
+    if (!SMPI_VARGET_GLOBAL(recvcounts) || !SMPI_VARGET_GLOBAL(displs) || !SMPI_VARGET_GLOBAL(sbuf) || !SMPI_VARGET_GLOBAL(rbuf)) {
         fprintf(stderr, "Unable to allocate memory:\n");
-       if (!sbuf) fprintf(stderr,"\tsbuf of %d bytes\n", MAX_BUF );
-       if (!rbuf) fprintf(stderr,"\trbuf of %d bytes\n", MAX_BUF );
-       if (!recvcounts) fprintf(stderr,"\trecvcounts of %zd bytes\n", comm_size * sizeof(int) );
-       if (!displs) fprintf(stderr,"\tdispls of %zd bytes\n", comm_size * sizeof(int) );
+       if (!SMPI_VARGET_GLOBAL(sbuf)) fprintf(stderr,"\tsbuf of %d bytes\n", MAX_BUF );
+       if (!SMPI_VARGET_GLOBAL(rbuf)) fprintf(stderr,"\trbuf of %d bytes\n", MAX_BUF );
+       if (!SMPI_VARGET_GLOBAL(recvcounts)) fprintf(stderr,"\trecvcounts of %zd bytes\n", comm_size * sizeof(int) );
+       if (!SMPI_VARGET_GLOBAL(displs)) fprintf(stderr,"\tdispls of %zd bytes\n", comm_size * sizeof(int) );
         fflush(stderr);
         MPI_Abort(MPI_COMM_WORLD, -1);
         exit(-1);
@@ -109,13 +112,13 @@ int main(int argc, char ** argv)
     comm_tests(comm);
     MPI_Comm_free(&comm);
 
-    //free(sbuf);
-    //free(rbuf);
-    free(recvcounts);
-    free(displs);
+    //free(SMPI_VARGET_GLOBAL(sbuf));
+    //free(SMPI_VARGET_GLOBAL(rbuf));
+    free(SMPI_VARGET_GLOBAL(recvcounts));
+    free(SMPI_VARGET_GLOBAL(displs));
 
 fn_exit:
-    MTest_Finalize(errs);
+    MTest_Finalize(SMPI_VARGET_GLOBAL(errs));
     MPI_Finalize();
 
     return 0;
@@ -124,7 +127,8 @@ fn_exit:
 void comm_tests(MPI_Comm comm)
 {
     int comm_size, comm_rank;
-    double rtime, max_time;
+    double rtime = rtime;       /* stop warning about unused variable */
+    double max_time;
     long long msg_size;
 
     MPI_Comm_size(comm, &comm_size);
@@ -186,16 +190,16 @@ double run_test(long long msg_size, MPI_Comm comm, test_t test_type,
     MPI_Comm_size(comm, &comm_size);
     MPI_Comm_rank(comm, &comm_rank);
 
-    displs[0] = 0;
+    SMPI_VARGET_GLOBAL(displs)[0] = 0;
     for (i = 0; i < comm_size; i++) {
         if (test_type == REGULAR)
-            recvcounts[i] = msg_size;
+            SMPI_VARGET_GLOBAL(recvcounts)[i] = msg_size;
         else if (test_type == BCAST)
-            recvcounts[i] = (!i) ? msg_size : 0;
+            SMPI_VARGET_GLOBAL(recvcounts)[i] = (!i) ? msg_size : 0;
         else if (test_type == SPIKE)
-            recvcounts[i] = (!i) ? (msg_size / 2) : (msg_size / (2 * (comm_size - 1)));
+            SMPI_VARGET_GLOBAL(recvcounts)[i] = (!i) ? (msg_size / 2) : (msg_size / (2 * (comm_size - 1)));
         else if (test_type == HALF_FULL)
-            recvcounts[i] = (i < (comm_size / 2)) ? (2 * msg_size) : 0;
+            SMPI_VARGET_GLOBAL(recvcounts)[i] = (i < (comm_size / 2)) ? (2 * msg_size) : 0;
         else if (test_type == LINEAR_DECREASE) {
             tmp = 2 * msg_size * (comm_size - 1 - i) / (comm_size - 1);
            if (tmp != (int)tmp) {
@@ -203,7 +207,7 @@ double run_test(long long msg_size, MPI_Comm comm, test_t test_type,
                MPI_Abort( MPI_COMM_WORLD, 1 );
                 exit(1);
            }
-            recvcounts[i] = (int) tmp;
+            SMPI_VARGET_GLOBAL(recvcounts)[i] = (int) tmp;
 
             /* If the maximum message size is too large, don't run */
             if (tmp > MAX_BUF) return 0;
@@ -212,8 +216,8 @@ double run_test(long long msg_size, MPI_Comm comm, test_t test_type,
             for (j = 0; j < i; j++) {
                 if (i - 1 + j >= comm_size) continue;
                 tmp = msg_size * comm_size / (log(comm_size) * i);
-                recvcounts[i - 1 + j] = (int) tmp;
-                displs[i - 1 + j] = 0;
+                SMPI_VARGET_GLOBAL(recvcounts)[i - 1 + j] = (int) tmp;
+                SMPI_VARGET_GLOBAL(displs)[i - 1 + j] = 0;
 
                 /* If the maximum message size is too large, don't run */
                 if (tmp > MAX_BUF) return 0;
@@ -221,7 +225,7 @@ double run_test(long long msg_size, MPI_Comm comm, test_t test_type,
         }
 
         if (i < comm_size - 1)
-            displs[i+1] = displs[i] + recvcounts[i];
+            SMPI_VARGET_GLOBAL(displs)[i+1] = SMPI_VARGET_GLOBAL(displs)[i] + SMPI_VARGET_GLOBAL(recvcounts)[i];
     }
 
     /* Test that:
@@ -232,8 +236,8 @@ double run_test(long long msg_size, MPI_Comm comm, test_t test_type,
     MPI_Barrier(comm);
     start = MPI_Wtime();
     for (i = 0; i < LOOPS; i++) {
-        MPI_Allgatherv(sbuf, recvcounts[comm_rank], MPI_CHAR,
-                       rbuf, recvcounts, displs, MPI_CHAR, comm);
+        MPI_Allgatherv(SMPI_VARGET_GLOBAL(sbuf), SMPI_VARGET_GLOBAL(recvcounts)[comm_rank], MPI_CHAR,
+                       SMPI_VARGET_GLOBAL(rbuf), SMPI_VARGET_GLOBAL(recvcounts), SMPI_VARGET_GLOBAL(displs), MPI_CHAR, comm);
     }
     end = MPI_Wtime();
     MPI_Barrier(comm);
index 030ac6b..715ced5 100644 (file)
@@ -12,53 +12,53 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
 
-  add_executable(cmfree cmfree.c ../util/mtest.c)
-  add_executable(cmsplit2 cmsplit2.c ../util/mtest.c)
-  add_executable(cmsplit cmsplit.c ../util/mtest.c)
-  add_executable(cmsplit_type cmsplit_type.c ../util/mtest.c)
-  add_executable(commcreate1 commcreate1.c ../util/mtest.c)
-  add_executable(comm_create_group comm_create_group.c ../util/mtest.c)
-  add_executable(comm_group_half comm_group_half.c ../util/mtest.c)
-  add_executable(comm_group_rand comm_group_rand.c ../util/mtest.c)
- # add_executable(comm_idup comm_idup.c ../util/mtest.c)
-  add_executable(comm_info comm_info.c ../util/mtest.c)
-  add_executable(commname commname.c ../util/mtest.c)
-  add_executable(ctxalloc ctxalloc.c ../util/mtest.c)
-  add_executable(ctxsplit ctxsplit.c ../util/mtest.c)
-  add_executable(dup dup.c ../util/mtest.c)
-  add_executable(dupic dupic.c ../util/mtest.c)
-  add_executable(dup_with_info dup_with_info.c ../util/mtest.c)
-  add_executable(ic1 ic1.c ../util/mtest.c)
-  add_executable(ic2 ic2.c ../util/mtest.c)
-  add_executable(iccreate iccreate.c ../util/mtest.c)
-  add_executable(icgroup icgroup.c ../util/mtest.c)
-  add_executable(icm icm.c ../util/mtest.c)
-  add_executable(icsplit icsplit.c ../util/mtest.c)
-  add_executable(probe-intercomm probe-intercomm.c ../util/mtest.c)
+  add_executable(cmfree cmfree.c)
+  add_executable(cmsplit2 cmsplit2.c)
+  add_executable(cmsplit cmsplit.c)
+  add_executable(cmsplit_type cmsplit_type.c)
+  add_executable(commcreate1 commcreate1.c)
+  add_executable(comm_create_group comm_create_group.c)
+  add_executable(comm_group_half comm_group_half.c)
+  add_executable(comm_group_rand comm_group_rand.c)
+ # add_executable(comm_idup comm_idup.c)
+  add_executable(comm_info comm_info.c)
+#  add_executable(commname commname.c)
+  add_executable(ctxalloc ctxalloc.c)
+  add_executable(ctxsplit ctxsplit.c)
+  add_executable(dup dup.c)
+#  add_executable(dupic dupic.c)
+  add_executable(dup_with_info dup_with_info.c)
+#  add_executable(ic1 ic1.c)
+#  add_executable(ic2 ic2.c)
+#  add_executable(iccreate iccreate.c)
+#  add_executable(icgroup icgroup.c)
+#  add_executable(icm icm.c)
+#  add_executable(icsplit icsplit.c)
+#  add_executable(probe-intercomm probe-intercomm.c)
 
-  target_link_libraries(cmfree  simgrid)
-  target_link_libraries(cmsplit2  simgrid)
-  target_link_libraries(cmsplit  simgrid)
-  target_link_libraries(cmsplit_type  simgrid)
-  target_link_libraries(commcreate1  simgrid)
-  target_link_libraries(comm_create_group  simgrid)
-  target_link_libraries(comm_group_half  simgrid)
-  target_link_libraries(comm_group_rand  simgrid)
- # target_link_libraries(comm_idup  simgrid)
-  target_link_libraries(comm_info  simgrid)
-  target_link_libraries(commname  simgrid)
-  target_link_libraries(ctxalloc  simgrid)
-  target_link_libraries(ctxsplit  simgrid)
-  target_link_libraries(dup  simgrid)
-  target_link_libraries(dupic  simgrid)
-  target_link_libraries(dup_with_info  simgrid)
-  target_link_libraries(ic1  simgrid)
-  target_link_libraries(ic2  simgrid)
-  target_link_libraries(iccreate  simgrid)
-  target_link_libraries(icgroup  simgrid)
-  target_link_libraries(icm  simgrid)
-  target_link_libraries(icsplit  simgrid)
-  target_link_libraries(probe-intercomm  simgrid)
+  target_link_libraries(cmfree simgrid mtest_c)
+  target_link_libraries(cmsplit2 simgrid mtest_c)
+  target_link_libraries(cmsplit simgrid mtest_c)
+  target_link_libraries(cmsplit_type simgrid mtest_c)
+  target_link_libraries(commcreate1 simgrid mtest_c)
+  target_link_libraries(comm_create_group simgrid mtest_c)
+  target_link_libraries(comm_group_half simgrid mtest_c)
+  target_link_libraries(comm_group_rand simgrid mtest_c)
+ # target_link_libraries(comm_idup simgrid mtest_c)
+  target_link_libraries(comm_info simgrid mtest_c)
+#  target_link_libraries(commname simgrid mtest_c)
+  target_link_libraries(ctxalloc simgrid mtest_c)
+  target_link_libraries(ctxsplit simgrid mtest_c)
+  target_link_libraries(dup simgrid mtest_c)
+#  target_link_libraries(dupic simgrid mtest_c)
+  target_link_libraries(dup_with_info simgrid mtest_c)
+#  target_link_libraries(ic1 simgrid mtest_c)
+#  target_link_libraries(ic2 simgrid mtest_c)
+#  target_link_libraries(iccreate simgrid mtest_c)
+#  target_link_libraries(icgroup simgrid mtest_c)
+#  target_link_libraries(icm simgrid mtest_c)
+#  target_link_libraries(icsplit simgrid mtest_c)
+#  target_link_libraries(probe-intercomm simgrid mtest_c)
 
 endif()
 
index 9a95d09..f8686dc 100644 (file)
@@ -12,117 +12,117 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
 
-  add_executable(blockindexed-misc blockindexed-misc.c ../util/mtest.c)
-  add_executable(blockindexed-zero-count blockindexed-zero-count.c ../util/mtest.c)
-  add_executable(contents contents.c ../util/mtest.c)
-  add_executable(contigstruct contigstruct.c ../util/mtest.c)
-  add_executable(contig-zero-count contig-zero-count.c ../util/mtest.c)
-  add_executable(cxx-types cxx-types.c ../util/mtest.c)
-  add_executable(darray-cyclic darray-cyclic.c ../util/mtest.c)
-  add_executable(darray-pack darray-pack.c ../util/mtest.c)
-  add_executable(gaddress gaddress.c ../util/mtest.c)
-  add_executable(get-elements get-elements.c ../util/mtest.c)
-  add_executable(get-elements-pairtype get-elements-pairtype.c ../util/mtest.c)
-  add_executable(getpartelm getpartelm.c ../util/mtest.c)
-  add_executable(hindexed_block hindexed_block.c ../util/mtest.c)
-  add_executable(hindexed_block_contents hindexed_block_contents.c ../util/mtest.c)
-  add_executable(hindexed-zeros hindexed-zeros.c ../util/mtest.c)
-  add_executable(indexed-misc indexed-misc.c ../util/mtest.c)
-  add_executable(large-count large-count.c ../util/mtest.c)
-  add_executable(lbub lbub.c ../util/mtest.c)
-  add_executable(localpack localpack.c ../util/mtest.c)
-  add_executable(longdouble longdouble.c ../util/mtest.c)
-  add_executable(lots-of-types lots-of-types.c ../util/mtest.c)
-  add_executable(pairtype-pack pairtype-pack.c ../util/mtest.c)
-  add_executable(pairtype-size-extent pairtype-size-extent.c ../util/mtest.c)
-  add_executable(simple-commit simple-commit.c ../util/mtest.c)
-  add_executable(simple-pack simple-pack.c ../util/mtest.c)
-  add_executable(simple-pack-external simple-pack-external.c ../util/mtest.c)
-  add_executable(simple-resized simple-resized.c ../util/mtest.c)
-  add_executable(simple-size-extent simple-size-extent.c ../util/mtest.c)
-  add_executable(sizedtypes sizedtypes.c ../util/mtest.c)
-  add_executable(slice-pack slice-pack.c ../util/mtest.c)
-  add_executable(slice-pack-external slice-pack-external.c ../util/mtest.c)
-  add_executable(struct-derived-zeros struct-derived-zeros.c ../util/mtest.c)
-  add_executable(struct-empty-el struct-empty-el.c ../util/mtest.c)
-  add_executable(struct-ezhov struct-ezhov.c ../util/mtest.c)
-  add_executable(struct-no-real-types struct-no-real-types.c ../util/mtest.c)
-  add_executable(struct-pack struct-pack.c ../util/mtest.c)
-  add_executable(struct-verydeep struct-verydeep.c ../util/mtest.c)
-  add_executable(struct-zero-count struct-zero-count.c ../util/mtest.c)
-  add_executable(subarray subarray.c ../util/mtest.c)
-  add_executable(subarray-pack subarray-pack.c ../util/mtest.c)
-  add_executable(tfree tfree.c ../util/mtest.c)
-  add_executable(tmatchsize tmatchsize.c ../util/mtest.c)
-  add_executable(transpose-pack transpose-pack.c ../util/mtest.c)
-  add_executable(tresized2 tresized2.c ../util/mtest.c)
-  add_executable(tresized tresized.c ../util/mtest.c)
-  add_executable(triangular-pack triangular-pack.c ../util/mtest.c)
-  add_executable(typecommit typecommit.c ../util/mtest.c)
-  add_executable(typefree typefree.c ../util/mtest.c)
-  add_executable(typelb typelb.c ../util/mtest.c)
-  add_executable(typename typename.c ../util/mtest.c)
-  add_executable(unpack unpack.c ../util/mtest.c)
-  add_executable(unusual-noncontigs unusual-noncontigs.c ../util/mtest.c)
-  add_executable(zero-blklen-vector zero-blklen-vector.c ../util/mtest.c)
-  add_executable(zeroblks zeroblks.c ../util/mtest.c)
-  add_executable(zeroparms zeroparms.c ../util/mtest.c)
+#  add_executable(blockindexed-misc blockindexed-misc.c)
+  add_executable(blockindexed-zero-count blockindexed-zero-count.c)
+#  add_executable(contents contents.c)
+#  add_executable(contigstruct contigstruct.c)
+  add_executable(contig-zero-count contig-zero-count.c)
+  add_executable(cxx-types cxx-types.c)
+#  add_executable(darray-cyclic darray-cyclic.c)
+#  add_executable(darray-pack darray-pack.c)
+  add_executable(gaddress gaddress.c)
+#  add_executable(get-elements get-elements.c)
+#  add_executable(get-elements-pairtype get-elements-pairtype.c)
+#  add_executable(getpartelm getpartelm.c)
+  add_executable(hindexed_block hindexed_block.c)
+  add_executable(hindexed_block_contents hindexed_block_contents.c)
+#  add_executable(hindexed-zeros hindexed-zeros.c)
+#  add_executable(indexed-misc indexed-misc.c)
+#  add_executable(large-count large-count.c)
+#  add_executable(lbub lbub.c)
+#  add_executable(localpack localpack.c)
+  add_executable(longdouble longdouble.c)
+#  add_executable(lots-of-types lots-of-types.c)
+#  add_executable(pairtype-pack pairtype-pack.c)
+#  add_executable(pairtype-size-extent pairtype-size-extent.c)
+  add_executable(simple-commit simple-commit.c)
+#  add_executable(simple-pack simple-pack.c)
+#  add_executable(simple-pack-external simple-pack-external.c)
+#  add_executable(simple-resized simple-resized.c)
+  add_executable(simple-size-extent simple-size-extent.c)
+#  add_executable(sizedtypes sizedtypes.c)
+#  add_executable(slice-pack slice-pack.c)
+#  add_executable(slice-pack-external slice-pack-external.c)
+  add_executable(struct-derived-zeros struct-derived-zeros.c)
+#  add_executable(struct-empty-el struct-empty-el.c)
+  add_executable(struct-ezhov struct-ezhov.c)
+#  add_executable(struct-no-real-types struct-no-real-types.c)
+#  add_executable(struct-pack struct-pack.c)
+  add_executable(struct-verydeep struct-verydeep.c)
+  add_executable(struct-zero-count struct-zero-count.c)
+#  add_executable(subarray subarray.c)
+#  add_executable(subarray-pack subarray-pack.c)
+  add_executable(tfree tfree.c)
+#  add_executable(tmatchsize tmatchsize.c)
+#  add_executable(transpose-pack transpose-pack.c)
+#  add_executable(tresized2 tresized2.c)
+#  add_executable(tresized tresized.c)
+#  add_executable(triangular-pack triangular-pack.c)
+  add_executable(typecommit typecommit.c)
+#  add_executable(typefree typefree.c)
+  add_executable(typelb typelb.c)
+#  add_executable(typename typename.c)
+#  add_executable(unpack unpack.c)
+#  add_executable(unusual-noncontigs unusual-noncontigs.c)
+#  add_executable(zero-blklen-vector zero-blklen-vector.c)
+#  add_executable(zeroblks zeroblks.c)
+  add_executable(zeroparms zeroparms.c)
 
-  target_link_libraries(blockindexed-misc  simgrid)
-  target_link_libraries(blockindexed-zero-count  simgrid)
-  target_link_libraries(contents  simgrid)
-  target_link_libraries(contigstruct  simgrid)
-  target_link_libraries(contig-zero-count  simgrid)
-  target_link_libraries(cxx-types  simgrid)
-  target_link_libraries(darray-cyclic  simgrid)
-  target_link_libraries(darray-pack  simgrid)
-  target_link_libraries(gaddress  simgrid)
-  target_link_libraries(get-elements  simgrid)
-  target_link_libraries(get-elements-pairtype  simgrid)
-  target_link_libraries(getpartelm  simgrid)
-  target_link_libraries(hindexed_block  simgrid)
-  target_link_libraries(hindexed_block_contents  simgrid)
-  target_link_libraries(hindexed-zeros  simgrid)
-  target_link_libraries(indexed-misc  simgrid)
-  target_link_libraries(large-count  simgrid)
-  target_link_libraries(lbub  simgrid)
-  target_link_libraries(localpack  simgrid)
-  target_link_libraries(longdouble  simgrid)
-  target_link_libraries(lots-of-types  simgrid)
-  target_link_libraries(pairtype-pack  simgrid)
-  target_link_libraries(pairtype-size-extent  simgrid)
-  target_link_libraries(simple-commit  simgrid)
-  target_link_libraries(simple-pack  simgrid)
-  target_link_libraries(simple-pack-external  simgrid)
-  target_link_libraries(simple-resized  simgrid)
-  target_link_libraries(simple-size-extent  simgrid)
-  target_link_libraries(sizedtypes  simgrid)
-  target_link_libraries(slice-pack  simgrid)
-  target_link_libraries(slice-pack-external  simgrid)
-  target_link_libraries(struct-derived-zeros  simgrid)
-  target_link_libraries(struct-empty-el  simgrid)
-  target_link_libraries(struct-ezhov  simgrid)
-  target_link_libraries(struct-no-real-types  simgrid)
-  target_link_libraries(struct-pack  simgrid)
-  target_link_libraries(struct-verydeep  simgrid)
-  target_link_libraries(struct-zero-count  simgrid)
-  target_link_libraries(subarray  simgrid)
-  target_link_libraries(subarray-pack  simgrid)
-  target_link_libraries(tfree  simgrid)
-  target_link_libraries(tmatchsize  simgrid)
-  target_link_libraries(transpose-pack  simgrid)
-  target_link_libraries(tresized2  simgrid)
-  target_link_libraries(tresized  simgrid)
-  target_link_libraries(triangular-pack  simgrid)
-  target_link_libraries(typecommit  simgrid)
-  target_link_libraries(typefree  simgrid)
-  target_link_libraries(typelb  simgrid)
-  target_link_libraries(typename  simgrid)
-  target_link_libraries(unpack  simgrid)
-  target_link_libraries(unusual-noncontigs  simgrid)
-  target_link_libraries(zero-blklen-vector  simgrid)
-  target_link_libraries(zeroblks  simgrid)
-  target_link_libraries(zeroparms  simgrid)
+#  target_link_libraries(blockindexed-misc simgrid mtest_c)
+  target_link_libraries(blockindexed-zero-count simgrid mtest_c)
+#  target_link_libraries(contents simgrid mtest_c)
+#  target_link_libraries(contigstruct simgrid mtest_c)
+  target_link_libraries(contig-zero-count simgrid mtest_c)
+  target_link_libraries(cxx-types simgrid mtest_c)
+#  target_link_libraries(darray-cyclic simgrid mtest_c)
+#  target_link_libraries(darray-pack simgrid mtest_c)
+  target_link_libraries(gaddress simgrid mtest_c)
+#  target_link_libraries(get-elements simgrid mtest_c)
+#  target_link_libraries(get-elements-pairtype simgrid mtest_c)
+#  target_link_libraries(getpartelm simgrid mtest_c)
+  target_link_libraries(hindexed_block simgrid mtest_c)
+  target_link_libraries(hindexed_block_contents simgrid mtest_c)
+#  target_link_libraries(hindexed-zeros simgrid mtest_c)
+#  target_link_libraries(indexed-misc simgrid mtest_c)
+#  target_link_libraries(large-count simgrid mtest_c)
+#  target_link_libraries(lbub simgrid mtest_c)
+#  target_link_libraries(localpack simgrid mtest_c)
+  target_link_libraries(longdouble simgrid mtest_c)
+#  target_link_libraries(lots-of-types simgrid mtest_c)
+#  target_link_libraries(pairtype-pack simgrid mtest_c)
+#  target_link_libraries(pairtype-size-extent simgrid mtest_c)
+  target_link_libraries(simple-commit simgrid mtest_c)
+#  target_link_libraries(simple-pack simgrid mtest_c)
+#  target_link_libraries(simple-pack-external simgrid mtest_c)
+#  target_link_libraries(simple-resized simgrid mtest_c)
+  target_link_libraries(simple-size-extent simgrid mtest_c)
+#  target_link_libraries(sizedtypes simgrid mtest_c)
+#  target_link_libraries(slice-pack simgrid mtest_c)
+#  target_link_libraries(slice-pack-external simgrid mtest_c)
+  target_link_libraries(struct-derived-zeros simgrid mtest_c)
+#  target_link_libraries(struct-empty-el simgrid mtest_c)
+  target_link_libraries(struct-ezhov simgrid mtest_c)
+#  target_link_libraries(struct-no-real-types simgrid mtest_c)
+#  target_link_libraries(struct-pack simgrid mtest_c)
+  target_link_libraries(struct-verydeep simgrid mtest_c)
+  target_link_libraries(struct-zero-count simgrid mtest_c)
+#  target_link_libraries(subarray simgrid mtest_c)
+#  target_link_libraries(subarray-pack simgrid mtest_c)
+  target_link_libraries(tfree simgrid mtest_c)
+#  target_link_libraries(tmatchsize simgrid mtest_c)
+#  target_link_libraries(transpose-pack simgrid mtest_c)
+#  target_link_libraries(tresized2 simgrid mtest_c)
+#  target_link_libraries(tresized simgrid mtest_c)
+#  target_link_libraries(triangular-pack simgrid mtest_c)
+  target_link_libraries(typecommit simgrid mtest_c)
+#  target_link_libraries(typefree simgrid mtest_c)
+  target_link_libraries(typelb simgrid mtest_c)
+#  target_link_libraries(typename simgrid mtest_c)
+#  target_link_libraries(unpack simgrid mtest_c)
+#  target_link_libraries(unusual-noncontigs simgrid mtest_c)
+#  target_link_libraries(zero-blklen-vector simgrid mtest_c)
+#  target_link_libraries(zeroblks simgrid mtest_c)
+  target_link_libraries(zeroparms simgrid mtest_c)
 
 endif()
 
index fb513c3..2e96a9e 100644 (file)
@@ -93,9 +93,9 @@ int builtin_float_test(void)
 {
     int nints, nadds, ntypes, combiner;
 
-    int err, errs = 0;
+    int /* err, */ errs = 0;
 
-    err = MPI_Type_get_envelope(MPI_FLOAT,
+    /* err = */ MPI_Type_get_envelope(MPI_FLOAT,
                                &nints,
                                &nadds,
                                &ntypes,
@@ -324,17 +324,17 @@ int optimizable_vector_of_basics_test(void)
     MPI_Aint *adds = NULL;
     MPI_Datatype *types;
 
-    int err, errs = 0;
+    int /* err, */ errs = 0;
 
     /* set up type */
-    err = MPI_Type_vector(10,
+    /* err = */ MPI_Type_vector(10,
                          2,
                          2,
                          MPI_INT,
                          &parent_type);
 
     /* decode */
-    err = MPI_Type_get_envelope(parent_type,
+    /* err = */ MPI_Type_get_envelope(parent_type,
                                &nints,
                                &nadds,
                                &ntypes,
@@ -358,7 +358,7 @@ int optimizable_vector_of_basics_test(void)
     if (nadds) adds = malloc(nadds * sizeof(*adds));
     types = malloc(ntypes *sizeof(*types));
 
-    err = MPI_Type_get_contents(parent_type,
+    /* err = */ MPI_Type_get_contents(parent_type,
                                nints,
                                nadds,
                                ntypes,
@@ -407,17 +407,17 @@ int indexed_of_basics_test(void)
     MPI_Aint *adds = NULL;
     MPI_Datatype *types;
 
-    int err, errs = 0;
+    int /* err, */ errs = 0;
 
     /* set up type */
-    err = MPI_Type_indexed(s_count,
+    /* err = */ MPI_Type_indexed(s_count,
                           s_blocklengths,
                           s_displacements,
                           MPI_INT,
                           &parent_type);
 
     /* decode */
-    err = MPI_Type_get_envelope(parent_type,
+    /* err = */ MPI_Type_get_envelope(parent_type,
                                &nints,
                                &nadds,
                                &ntypes,
@@ -441,7 +441,7 @@ int indexed_of_basics_test(void)
     if (nadds) adds = malloc(nadds * sizeof(*adds));
     types = malloc(ntypes *sizeof(*types));
 
-    err = MPI_Type_get_contents(parent_type,
+    /* err = */ MPI_Type_get_contents(parent_type,
                                nints,
                                nadds,
                                ntypes,
index 6c35b3d..ea89c43 100644 (file)
@@ -32,10 +32,10 @@ blockindexed-zero-count 1
 #blockindexed-misc 1
 #needs MPI_Pack, MPI_unpack, MPI_Pack_size
 #indexed-misc 1
-#nees MPI_Type_create_subarray
+#needs MPI_Type_create_subarray
 #subarray-pack 1
 #subarray 2
-#nees MPI_Type_create_darray
+#needs MPI_Type_create_darray
 #darray-pack 1
 #darray-pack 9
 # darray-pack 72
index 46e9d88..b3f9899 100644 (file)
@@ -12,36 +12,36 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F2C)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../include/")
 
-  add_executable(attrmpi1f attrmpi1f.f ../util/mtestf.f)
-  add_executable(baseattr2f baseattr2f.f ../util/mtestf.f)
-  add_executable(baseattrf baseattrf.f ../util/mtestf.f)
-  add_executable(commattr2f commattr2f.f ../util/mtestf.f)
-  add_executable(commattr3f commattr3f.f ../util/mtestf.f)
-  add_executable(commattrf commattrf.f  ../util/mtestf.f)
-  add_executable(typeattr2f typeattr2f.f  ../util/mtestf.f)
-  add_executable(typeattr3f typeattr3f.f  ../util/mtestf.f)
-  add_executable(typeattrf typeattrf.f  ../util/mtestf.f)
+  add_executable(attrmpi1f attrmpi1f.f)
+  add_executable(baseattr2f baseattr2f.f)
+  add_executable(baseattrf baseattrf.f)
+  add_executable(commattr2f commattr2f.f)
+  add_executable(commattr3f commattr3f.f)
+  add_executable(commattrf commattrf.f )
+  add_executable(typeattr2f typeattr2f.f )
+  add_executable(typeattr3f typeattr3f.f )
+  add_executable(typeattrf typeattrf.f )
 
-  target_link_libraries(attrmpi1f  simgrid)
-  target_link_libraries(baseattr2f  simgrid)
-  target_link_libraries(baseattrf  simgrid)
-  target_link_libraries(commattr2f  simgrid)
-  target_link_libraries(commattr3f  simgrid)
-  target_link_libraries(commattrf  simgrid)
-  target_link_libraries(typeattr2f  simgrid)
-  target_link_libraries(typeattr3f  simgrid)
-  target_link_libraries(typeattrf  simgrid)
+  target_link_libraries(attrmpi1f simgrid mtest_f77)
+  target_link_libraries(baseattr2f simgrid mtest_f77)
+  target_link_libraries(baseattrf simgrid mtest_f77)
+  target_link_libraries(commattr2f simgrid mtest_f77)
+  target_link_libraries(commattr3f simgrid mtest_f77)
+  target_link_libraries(commattrf simgrid mtest_f77)
+  target_link_libraries(typeattr2f simgrid mtest_f77)
+  target_link_libraries(typeattr3f simgrid mtest_f77)
+  target_link_libraries(typeattrf simgrid mtest_f77)
 
 endif()
 
 set(tesh_files
   ${tesh_files}
   PARENT_SCOPE
-  )
+)
 set(xml_files
   ${xml_files}
   PARENT_SCOPE
-  )
+)
 set(examples_src
   ${examples_src}
   ${CMAKE_CURRENT_SOURCE_DIR}/attraints.h
@@ -55,13 +55,13 @@ set(examples_src
   ${CMAKE_CURRENT_SOURCE_DIR}/typeattr3f.f
   ${CMAKE_CURRENT_SOURCE_DIR}/typeattrf.f
   PARENT_SCOPE
-  )
+)
 set(bin_files
   ${bin_files}
   PARENT_SCOPE
-  )
+)
 set(txt_files
   ${txt_files}
   ${CMAKE_CURRENT_SOURCE_DIR}/testlist
   PARENT_SCOPE
-  )
+)
index e7264dc..ad84557 100644 (file)
@@ -12,35 +12,35 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F2C)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
 
-  add_executable(allredint8f allredint8f.f ../util/mtestf.f)
-  add_executable(allredopttf allredopttf.f ../util/mtestf.f)
-  add_executable(alltoallvf alltoallvf.f ../util/mtestf.f)
-  add_executable(alltoallwf alltoallwf.f ../util/mtestf.f)
-  add_executable(exscanf exscanf.f ../util/mtestf.f)
-  add_executable(inplacef inplacef.f ../util/mtestf.f)
- # add_executable(nonblockingf nonblockingf.f ../util/mtestf.f)
- # add_executable(nonblocking_inpf nonblocking_inpf.f ../util/mtestf.f)
-  add_executable(red_scat_blockf red_scat_blockf.f ../util/mtestf.f)
-  add_executable(redscatf redscatf.f ../util/mtestf.f)
-  add_executable(reducelocalf reducelocalf.f ../util/mtestf.f)
-  add_executable(split_typef split_typef.f ../util/mtestf.f)
-  add_executable(uallreducef uallreducef.f ../util/mtestf.f)
-  add_executable(vw_inplacef vw_inplacef.f ../util/mtestf.f)
+#  add_executable(allredint8f allredint8f.f)
+#  add_executable(allredopttf allredopttf.f)
+  add_executable(alltoallvf alltoallvf.f)
+#  add_executable(alltoallwf alltoallwf.f)
+  add_executable(exscanf exscanf.f)
+  add_executable(inplacef inplacef.f)
+ # add_executable(nonblockingf nonblockingf.f)
+ # add_executable(nonblocking_inpf nonblocking_inpf.f)
+  add_executable(red_scat_blockf red_scat_blockf.f)
+  add_executable(redscatf redscatf.f)
+  add_executable(reducelocalf reducelocalf.f)
+  add_executable(split_typef split_typef.f)
+  add_executable(uallreducef uallreducef.f)
+  add_executable(vw_inplacef vw_inplacef.f)
 
-  target_link_libraries(allredint8f  simgrid)
-  target_link_libraries(allredopttf  simgrid)
-  target_link_libraries(alltoallvf  simgrid)
-  target_link_libraries(alltoallwf  simgrid)
-  target_link_libraries(exscanf  simgrid)
-  target_link_libraries(inplacef  simgrid)
- # target_link_libraries(nonblockingf  simgrid)
- # target_link_libraries(nonblocking_inpf  simgrid)
-  target_link_libraries(red_scat_blockf  simgrid)
-  target_link_libraries(redscatf  simgrid)
-  target_link_libraries(reducelocalf  simgrid)
-  target_link_libraries(split_typef  simgrid)
-  target_link_libraries(uallreducef  simgrid)
-  target_link_libraries(vw_inplacef  simgrid)
+#  target_link_libraries(allredint8f simgrid mtest_f77)
+#  target_link_libraries(allredopttf simgrid mtest_f77)
+  target_link_libraries(alltoallvf simgrid mtest_f77)
+#  target_link_libraries(alltoallwf simgrid mtest_f77)
+  target_link_libraries(exscanf simgrid mtest_f77)
+  target_link_libraries(inplacef simgrid mtest_f77)
+ # target_link_libraries(nonblockingf simgrid mtest_f77)
+ # target_link_libraries(nonblocking_inpf simgrid mtest_f77)
+  target_link_libraries(red_scat_blockf simgrid mtest_f77)
+  target_link_libraries(redscatf simgrid mtest_f77)
+  target_link_libraries(reducelocalf simgrid mtest_f77)
+  target_link_libraries(split_typef simgrid mtest_f77)
+  target_link_libraries(uallreducef simgrid mtest_f77)
+  target_link_libraries(vw_inplacef simgrid mtest_f77)
 
 endif()
 
index 5e6f64e..27de6b9 100644 (file)
@@ -10,10 +10,12 @@ C
       integer count, datatype
       integer i
       
-!      if (datatype .ne. MPI_INTEGER) then
-!         write(6,*) 'Invalid datatype passed to user_op()'
-!         return
-!      endif
+      if (.false.) then
+         if (datatype .ne. MPI_INTEGER) then
+            write(6,*) 'Invalid datatype passed to user_op()'
+            return
+         endif
+      endif
 
       do i=1, count
          cout(i) = cin(i) + cout(i)
index 60e5e9f..cedc5c1 100644 (file)
@@ -12,11 +12,11 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F2C)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
 
- # add_executable(commerrf commerrf.f ../util/mtestf.f)
-  add_executable(commnamef commnamef.f ../util/mtestf.f)
+ # add_executable(commerrf commerrf.f)
+#  add_executable(commnamef commnamef.f)
 
- # target_link_libraries(commerrf  simgrid)
-  target_link_libraries(commnamef  simgrid)
+ # target_link_libraries(commerrf simgrid mtest_f77)
+#  target_link_libraries(commnamef simgrid mtest_f77)
 
 endif()
 
index 0b7c836..bc07be4 100644 (file)
@@ -14,29 +14,29 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F2C)
 
   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/typeaints.h.in ${CMAKE_CURRENT_SOURCE_DIR}/typeaints.h @ONLY)
 
-  add_executable(allctypesf allctypesf.f ../util/mtestf.f)
-  add_executable(gaddressf gaddressf.f ../util/mtestf.f)
-  add_executable(hindex1f hindex1f.f ../util/mtestf.f)
-  add_executable(hindexed_blockf hindexed_blockf.f ../util/mtestf.f)
-  add_executable(packef packef.f ../util/mtestf.f)
-  add_executable(typecntsf typecntsf.f ../util/mtestf.f)
-  add_executable(typem2f typem2f.f ../util/mtestf.f)
-  add_executable(typename3f typename3f.f ../util/mtestf.f)
-  add_executable(typenamef typenamef.f ../util/mtestf.f)
-  add_executable(typesnamef typesnamef.f ../util/mtestf.f)
-  add_executable(typesubf typesubf.f ../util/mtestf.f)
+#  add_executable(allctypesf allctypesf.f)
+  add_executable(gaddressf gaddressf.f)
+#  add_executable(hindex1f hindex1f.f)
+#  add_executable(hindexed_blockf hindexed_blockf.f)
+#  add_executable(packef packef.f)
+#  add_executable(typecntsf typecntsf.f)
+#  add_executable(typem2f typem2f.f)
+#  add_executable(typename3f typename3f.f)
+#  add_executable(typenamef typenamef.f)
+#  add_executable(typesnamef typesnamef.f)
+#  add_executable(typesubf typesubf.f)
 
-  target_link_libraries(allctypesf  simgrid)
-  target_link_libraries(gaddressf  simgrid)
-  target_link_libraries(hindex1f  simgrid)
-  target_link_libraries(hindexed_blockf  simgrid)
-  target_link_libraries(packef  simgrid)
-  target_link_libraries(typecntsf  simgrid)
-  target_link_libraries(typem2f  simgrid)
-  target_link_libraries(typename3f  simgrid)
-  target_link_libraries(typenamef  simgrid)
-  target_link_libraries(typesnamef  simgrid)
-  target_link_libraries(typesubf  simgrid)
+#  target_link_libraries(allctypesf simgrid mtest_f77)
+  target_link_libraries(gaddressf simgrid mtest_f77)
+#  target_link_libraries(hindex1f simgrid mtest_f77)
+#  target_link_libraries(hindexed_blockf simgrid mtest_f77)
+#  target_link_libraries(packef simgrid mtest_f77)
+#  target_link_libraries(typecntsf simgrid mtest_f77)
+#  target_link_libraries(typem2f simgrid mtest_f77)
+#  target_link_libraries(typename3f simgrid mtest_f77)
+#  target_link_libraries(typenamef simgrid mtest_f77)
+#  target_link_libraries(typesnamef simgrid mtest_f77)
+#  target_link_libraries(typesubf simgrid mtest_f77)
 
 endif()
 
@@ -71,6 +71,5 @@ set(bin_files
 set(txt_files
   ${txt_files}
   ${CMAKE_CURRENT_SOURCE_DIR}/testlist
-  ${CMAKE_CURRENT_SOURCE_DIR}/../util/mtestf.f
   PARENT_SCOPE
   )
index 9a0a418..cf6b636 100644 (file)
@@ -12,15 +12,13 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F2C)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
 
-  add_executable(add1size add1size.h ../util/mtestf.f)
-#  add_executable(allocmemf allocmemf.f ../util/mtestf.f)
-#  add_executable(c2f2cf c2f2cf.f c2f2c.c ../util/mtestf.f)
-#  add_executable(ctypesinf ctypesinf.f ctypesfromc.c ../util/mtestf.f)
+#  add_executable(allocmemf allocmemf.f)
+#  add_executable(c2f2cf c2f2cf.f c2f2c.c)
+#  add_executable(ctypesinf ctypesinf.f ctypesfromc.c)
 
-  target_link_libraries(add1size  simgrid)
-#  target_link_libraries(allocmemf  simgrid)
-#  target_link_libraries(c2f2cf  simgrid)
-#  target_link_libraries(ctypesinf  simgrid)
+#  target_link_libraries(allocmemf simgrid mtest_f77)
+#  target_link_libraries(c2f2cf simgrid mtest_f77)
+#  target_link_libraries(ctypesinf simgrid mtest_f77)
 
 endif()
 
index c307f82..523aa93 100644 (file)
@@ -12,8 +12,8 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F2C)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
 
-  add_executable(baseenvf baseenvf.f ../util/mtestf.f)
-  target_link_libraries(baseenvf  simgrid)
+  add_executable(baseenvf baseenvf.f)
+  target_link_libraries(baseenvf simgrid mtest_f77)
 
 endif()
 
index 7ccf420..5d4714b 100644 (file)
@@ -13,15 +13,15 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F2C)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
 
-  add_executable(allpairf allpairf.f ../util/mtestf.f)
-  add_executable(greqf greqf.f dummyf.f ../util/mtestf.f)
-  #add_executable(mprobef mprobef.f ../util/mtestf.f)
-  add_executable(statusesf statusesf.f ../util/mtestf.f)
+  add_executable(allpairf allpairf.f)
+#  add_executable(greqf greqf.f dummyf.f)
+  #add_executable(mprobef mprobef.f)
+#  add_executable(statusesf statusesf.f)
 
-  target_link_libraries(allpairf  simgrid)
-  target_link_libraries(greqf  simgrid)
-  #target_link_libraries(mprobef  simgrid)
-  target_link_libraries(statusesf  simgrid)
+  target_link_libraries(allpairf simgrid mtest_f77)
+#  target_link_libraries(greqf simgrid mtest_f77)
+  #target_link_libraries(mprobef simgrid mtest_f77)
+#  target_link_libraries(statusesf simgrid mtest_f77)
 
 endif()
 
diff --git a/teshsuite/smpi/mpich3-test/f77/util/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f77/util/CMakeLists.txt
new file mode 100644 (file)
index 0000000..c0e65e2
--- /dev/null
@@ -0,0 +1,23 @@
+cmake_minimum_required(VERSION 2.6)
+
+if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F2C)
+  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")
+    set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff")
+  endif()
+
+  set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
+  include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
+  include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
+
+  #F77 version of the mtest library
+  add_library(mtest_f77 STATIC ../util/mtestf.f)
+endif()
+
+set(txt_files
+  ${txt_files}
+  ${CMAKE_CURRENT_SOURCE_DIR}/../util/mtestf.f
+  PARENT_SCOPE
+  )
index 9bef6e1..f1a137c 100644 (file)
@@ -15,6 +15,8 @@ C       about out-of-order statements
         logical dbgflag
         integer wrank
         common /mtest/ dbgflag, wrank
+        integer myindex
+        common /grr/ myindex
 
         call MPI_Initialized( flag, ierr )
         if (.not. flag) then
@@ -22,6 +24,7 @@ C       about out-of-order statements
         endif
 
         dbgflag = .false.
+        myindex = 0
         call MPI_Comm_rank( MPI_COMM_WORLD, wrank, ierr )
         end
 C
index b2da152..1f8e36b 100644 (file)
@@ -11,34 +11,34 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F90)
   set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
 
-  add_executable(allredint8f90 allredint8f90.f90 ../util/mtestf90.f90)
-  add_executable(allredopttf90 allredopttf90.f90 ../util/mtestf90.f90)
-  add_executable(alltoallvf90 alltoallvf90.f90 ../util/mtestf90.f90)
-  add_executable(alltoallwf90 alltoallwf90.f90 ../util/mtestf90.f90)
-  add_executable(exscanf90 exscanf90.f90 ../util/mtestf90.f90)
-  add_executable(inplacef90 inplacef90.f90 ../util/mtestf90.f90)
- # add_executable(nonblockingf90 nonblockingf90.f90 ../util/mtestf90.f90)
- # add_executable(nonblocking_inpf90 nonblocking_inpf90.f90 ../util/mtestf90.f90)
-  add_executable(red_scat_blockf90 red_scat_blockf90.f90 ../util/mtestf90.f90)
-  add_executable(redscatf90 redscatf90.f90 ../util/mtestf90.f90)
-  add_executable(reducelocalf90 reducelocalf90.f90 ../util/mtestf90.f90)
-  add_executable(split_typef90 split_typef90.f90 ../util/mtestf90.f90)
-  add_executable(uallreducef90 uallreducef90.f90 ../util/mtestf90.f90)
-  add_executable(vw_inplacef90 vw_inplacef90.f90 ../util/mtestf90.f90)
-  target_link_libraries(allredint8f90  simgrid)
-  target_link_libraries(allredopttf90  simgrid)
-  target_link_libraries(alltoallvf90  simgrid)
-  target_link_libraries(alltoallwf90  simgrid)
-  target_link_libraries(exscanf90  simgrid)
-  target_link_libraries(inplacef90  simgrid)
- # target_link_libraries(nonblockingf90  simgrid)
- # target_link_libraries(nonblocking_inpf90  simgrid)
-  target_link_libraries(red_scat_blockf90  simgrid)
-  target_link_libraries(redscatf90  simgrid)
-  target_link_libraries(reducelocalf90  simgrid)
-  target_link_libraries(split_typef90  simgrid)
-  target_link_libraries(uallreducef90  simgrid)
-  target_link_libraries(vw_inplacef90  simgrid)
+#  add_executable(allredint8f90 allredint8f90.f90)
+#  add_executable(allredopttf90 allredopttf90.f90)
+  add_executable(alltoallvf90 alltoallvf90.f90)
+#  add_executable(alltoallwf90 alltoallwf90.f90)
+  add_executable(exscanf90 exscanf90.f90)
+  add_executable(inplacef90 inplacef90.f90)
+ # add_executable(nonblockingf90 nonblockingf90.f90)
+ # add_executable(nonblocking_inpf90 nonblocking_inpf90.f90)
+  add_executable(red_scat_blockf90 red_scat_blockf90.f90)
+  add_executable(redscatf90 redscatf90.f90)
+  add_executable(reducelocalf90 reducelocalf90.f90)
+  add_executable(split_typef90 split_typef90.f90)
+  add_executable(uallreducef90 uallreducef90.f90)
+  add_executable(vw_inplacef90 vw_inplacef90.f90)
+#  target_link_libraries(allredint8f90  simgrid mtest_f90)
+#  target_link_libraries(allredopttf90  simgrid mtest_f90)
+  target_link_libraries(alltoallvf90  simgrid mtest_f90)
+#  target_link_libraries(alltoallwf90  simgrid mtest_f90)
+  target_link_libraries(exscanf90  simgrid mtest_f90)
+  target_link_libraries(inplacef90  simgrid mtest_f90)
+ # target_link_libraries(nonblockingf90  simgrid mtest_f90)
+ # target_link_libraries(nonblocking_inpf90  simgrid mtest_f90)
+  target_link_libraries(red_scat_blockf90  simgrid mtest_f90)
+  target_link_libraries(redscatf90  simgrid mtest_f90)
+  target_link_libraries(reducelocalf90  simgrid mtest_f90)
+  target_link_libraries(split_typef90  simgrid mtest_f90)
+  target_link_libraries(uallreducef90  simgrid mtest_f90)
+  target_link_libraries(vw_inplacef90  simgrid mtest_f90)
 
 endif()
 
@@ -74,7 +74,6 @@ set(bin_files
   )
 set(txt_files
   ${txt_files}
-  ${CMAKE_CURRENT_SOURCE_DIR}/../util/mtestf90.f90
   ${CMAKE_CURRENT_SOURCE_DIR}/testlist
   PARENT_SCOPE
   )
index 1f1ec51..59cb7e4 100644 (file)
       integer count, datatype
       integer i
       
-!      if (datatype .ne. MPI_INTEGER) then
-!         write(6,*) 'Invalid datatype passed to user_op()'
-!         return
-!      endif
+      if (.false.) then
+         if (datatype .ne. MPI_INTEGER) then
+            write(6,*) 'Invalid datatype passed to user_op()'
+            return
+         endif
+      endif
 
       do i=1, count
          cout(i) = cin(i) + cout(i)
index 66339f2..2230ac2 100644 (file)
@@ -30,7 +30,7 @@
 
       program main
       use mpi
-      integer errs, ierr, toterr
+      integer errs, ierr
       integer maxsize
       parameter (maxsize=1024)
       integer recvbuf
index ca51980..3ad68e7 100644 (file)
@@ -11,44 +11,44 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F90)
   set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
 
-  add_executable(allctypesf90 allctypesf90.f90 ../util/mtestf90.f90)
- # add_executable(createf90 createf90.f90 ../util/mtestf90.f90)
-  add_executable(gaddressf90 gaddressf90.f90 ../util/mtestf90.f90)
- # add_executable(get_elem_d get_elem_d.f90 ../util/mtestf90.f90)
- # add_executable(get_elem_u get_elem_u.f90 ../util/mtestf90.f90)
-  add_executable(hindex1f90 hindex1f90.f90 ../util/mtestf90.f90)
-  add_executable(hindexed_blockf90 hindexed_blockf90.f90 ../util/mtestf90.f90)
-  add_executable(indtype indtype.f90 ../util/mtestf90.f90)
-  add_executable(kinds kinds.f90 ../util/mtestf90.f90)
-  add_executable(packef90 packef90.f90 ../util/mtestf90.f90)
- # add_executable(sizeof sizeof.f90 ../util/mtestf90.f90)
- # add_executable(structf structf.f90 ../util/mtestf90.f90)
- # add_executable(trf90 trf90.f90 ../util/mtestf90.f90)
-  add_executable(typecntsf90 typecntsf90.f90 ../util/mtestf90.f90)
-  add_executable(typem2f90 typem2f90.f90 ../util/mtestf90.f90)
-  add_executable(typename3f90 typename3f90.f90 ../util/mtestf90.f90)
-  add_executable(typenamef90 typenamef90.f90 ../util/mtestf90.f90)
-  add_executable(typesnamef90 typesnamef90.f90 ../util/mtestf90.f90)
-  add_executable(typesubf90 typesubf90.f90 ../util/mtestf90.f90)
-  target_link_libraries(allctypesf90  simgrid)
- # target_link_libraries(createf90  simgrid)
-  target_link_libraries(gaddressf90  simgrid)
- # target_link_libraries(get_elem_d  simgrid)
- # target_link_libraries(get_elem_u  simgrid)
-  target_link_libraries(hindex1f90  simgrid)
-  target_link_libraries(hindexed_blockf90  simgrid)
-  target_link_libraries(indtype  simgrid)
-  target_link_libraries(kinds  simgrid)
-  target_link_libraries(packef90  simgrid)
- # target_link_libraries(sizeof  simgrid)
- # target_link_libraries(structf  simgrid)
- # target_link_libraries(trf90  simgrid)
-  target_link_libraries(typecntsf90  simgrid)
-  target_link_libraries(typem2f90  simgrid)
-  target_link_libraries(typename3f90  simgrid)
-  target_link_libraries(typenamef90  simgrid)
-  target_link_libraries(typesnamef90  simgrid)
-  target_link_libraries(typesubf90  simgrid)
+#  add_executable(allctypesf90 allctypesf90.f90)
+ # add_executable(createf90 createf90.f90)
+  add_executable(gaddressf90 gaddressf90.f90)
+ # add_executable(get_elem_d get_elem_d.f90)
+ # add_executable(get_elem_u get_elem_u.f90)
+#  add_executable(hindex1f90 hindex1f90.f90)
+#  add_executable(hindexed_blockf90 hindexed_blockf90.f90)
+  add_executable(indtype indtype.f90)
+  add_executable(kinds kinds.f90)
+#  add_executable(packef90 packef90.f90)
+ # add_executable(sizeof sizeof.f90)
+ # add_executable(structf structf.f90)
+ # add_executable(trf90 trf90.f90)
+#  add_executable(typecntsf90 typecntsf90.f90)
+#  add_executable(typem2f90 typem2f90.f90)
+#  add_executable(typename3f90 typename3f90.f90)
+#  add_executable(typenamef90 typenamef90.f90)
+#  add_executable(typesnamef90 typesnamef90.f90)
+#  add_executable(typesubf90 typesubf90.f90)
+#  target_link_libraries(allctypesf90 simgrid mtest_f90)
+ # target_link_libraries(createf90 simgrid mtest_f90)
+  target_link_libraries(gaddressf90 simgrid mtest_f90)
+ # target_link_libraries(get_elem_d simgrid mtest_f90)
+ # target_link_libraries(get_elem_u simgrid mtest_f90)
+#  target_link_libraries(hindex1f90 simgrid mtest_f90)
+#  target_link_libraries(hindexed_blockf90 simgrid mtest_f90)
+  target_link_libraries(indtype simgrid mtest_f90)
+  target_link_libraries(kinds simgrid mtest_f90)
+#  target_link_libraries(packef90 simgrid mtest_f90)
+ # target_link_libraries(sizeof simgrid mtest_f90)
+ # target_link_libraries(structf simgrid mtest_f90)
+ # target_link_libraries(trf90 simgrid mtest_f90)
+#  target_link_libraries(typecntsf90 simgrid mtest_f90)
+#  target_link_libraries(typem2f90 simgrid mtest_f90)
+#  target_link_libraries(typename3f90 simgrid mtest_f90)
+#  target_link_libraries(typenamef90 simgrid mtest_f90)
+#  target_link_libraries(typesnamef90 simgrid mtest_f90)
+#  target_link_libraries(typesubf90 simgrid mtest_f90)
 
 endif()
 
index 3e4ec84..398f3db 100644 (file)
@@ -11,8 +11,8 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F90)
   set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
 
-  add_executable(baseenvf90 baseenvf90.f90 ../util/mtestf90.f90)
-  target_link_libraries(baseenvf90  simgrid)
+  add_executable(baseenvf90 baseenvf90.f90)
+  target_link_libraries(baseenvf90 simgrid mtest_f90)
 
 endif()
 
index dfed73b..51a0fcb 100644 (file)
@@ -11,14 +11,14 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F90)
   set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
 
-  add_executable(allpairf90 allpairf90.f90 ../util/mtestf90.f90)
-  add_executable(greqf90 greqf90.f90 dummyf90.f90 ../util/mtestf90.f90)
-#  add_executable(mprobef90 mprobef90.f90 ../util/mtestf90.f90)
-  add_executable(statusesf90 statusesf90.f90 ../util/mtestf90.f90)
-  target_link_libraries(allpairf90  simgrid)
-  target_link_libraries(greqf90  simgrid)
-#  target_link_libraries(mprobef90  simgrid)
-  target_link_libraries(statusesf90  simgrid)
+#  add_executable(allpairf90 allpairf90.f90)
+#  add_executable(greqf90 greqf90.f90 dummyf90.f90)
+#  add_executable(mprobef90 mprobef90.f90)
+  add_executable(statusesf90 statusesf90.f90)
+#  target_link_libraries(allpairf90 simgrid mtest_f90)
+#  target_link_libraries(greqf90 simgrid mtest_f90)
+#  target_link_libraries(mprobef90 simgrid mtest_f90)
+  target_link_libraries(statusesf90 simgrid mtest_f90)
 
 endif()
 
diff --git a/teshsuite/smpi/mpich3-test/f90/util/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f90/util/CMakeLists.txt
new file mode 100644 (file)
index 0000000..04968a4
--- /dev/null
@@ -0,0 +1,24 @@
+cmake_minimum_required(VERSION 2.6)
+
+if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_F90)
+  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")
+    set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpif90")
+  endif()
+
+  set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
+  include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
+
+  #F90 version of the mtest library
+  add_library(mtest_f90 STATIC ../util/mtestf90.f90)
+
+endif()
+
+
+set(txt_files
+  ${txt_files}
+  ${CMAKE_CURRENT_SOURCE_DIR}/../util/mtestf90.f90
+  PARENT_SCOPE
+  )
index e67ccca..f4bcdc4 100644 (file)
@@ -12,19 +12,19 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
 
-  add_executable(groupcreate groupcreate.c ../util/mtest.c)
-  add_executable(groupnullincl groupnullincl.c ../util/mtest.c)
-  add_executable(grouptest2 grouptest2.c ../util/mtest.c)
-  add_executable(grouptest grouptest.c ../util/mtest.c)
-  add_executable(gtranks gtranks.c ../util/mtest.c)
-  add_executable(gtranksperf gtranksperf.c ../util/mtest.c)
+  add_executable(groupcreate groupcreate.c)
+#  add_executable(groupnullincl groupnullincl.c)
+  add_executable(grouptest2 grouptest2.c)
+  add_executable(grouptest grouptest.c)
+  add_executable(gtranks gtranks.c)
+#  add_executable(gtranksperf gtranksperf.c)
 
-  target_link_libraries(groupcreate  simgrid)
-  target_link_libraries(groupnullincl  simgrid)
-  target_link_libraries(grouptest2  simgrid)
-  target_link_libraries(grouptest  simgrid)
-  target_link_libraries(gtranks  simgrid)
-  target_link_libraries(gtranksperf  simgrid)
+  target_link_libraries(groupcreate simgrid mtest_c)
+#  target_link_libraries(groupnullincl simgrid mtest_c)
+  target_link_libraries(grouptest2 simgrid mtest_c)
+  target_link_libraries(grouptest simgrid mtest_c)
+  target_link_libraries(gtranks simgrid mtest_c)
+#  target_link_libraries(gtranksperf simgrid mtest_c)
 
 endif()
 
index c84f088..7b035fb 100644 (file)
@@ -12,25 +12,25 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
 
-  add_executable(attrself attrself.c ../util/mtest.c)
-  add_executable(exitst1 exitst1.c ../util/mtest.c)
-  add_executable(exitst2 exitst2.c ../util/mtest.c)
-  add_executable(exitst3 exitst3.c ../util/mtest.c)
-  add_executable(finalized finalized.c ../util/mtest.c)
-  add_executable(initstat initstat.c ../util/mtest.c)
-  add_executable(library_version library_version.c ../util/mtest.c)
-  add_executable(timeout timeout.c ../util/mtest.c)
-  add_executable(version version.c ../util/mtest.c)
+#  add_executable(attrself attrself.c)
+  add_executable(exitst1 exitst1.c)
+  add_executable(exitst2 exitst2.c)
+#  add_executable(exitst3 exitst3.c)
+  add_executable(finalized finalized.c)
+  add_executable(initstat initstat.c)
+  add_executable(library_version library_version.c)
+#  add_executable(timeout timeout.c)
+  add_executable(version version.c)
 
-  target_link_libraries(attrself  simgrid)
-  target_link_libraries(exitst1  simgrid)
-  target_link_libraries(exitst2  simgrid)
-  target_link_libraries(exitst3  simgrid)
-  target_link_libraries(finalized  simgrid)
-  target_link_libraries(initstat  simgrid)
-  target_link_libraries(library_version  simgrid)
-  target_link_libraries(timeout  simgrid)
-  target_link_libraries(version  simgrid)
+#  target_link_libraries(attrself simgrid mtest_c)
+  target_link_libraries(exitst1 simgrid mtest_c)
+  target_link_libraries(exitst2 simgrid mtest_c)
+#  target_link_libraries(exitst3 simgrid mtest_c)
+  target_link_libraries(finalized simgrid mtest_c)
+  target_link_libraries(initstat simgrid mtest_c)
+  target_link_libraries(library_version simgrid mtest_c)
+#  target_link_libraries(timeout simgrid mtest_c)
+  target_link_libraries(version simgrid mtest_c)
 
 endif()
 
index b705367..01f8aaf 100644 (file)
@@ -12,79 +12,79 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite)
   include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
   include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
 
-  add_executable(anyall anyall.c ../util/mtest.c)
-  add_executable(bottom bottom.c ../util/mtest.c)
-  add_executable(bsend1 bsend1.c ../util/mtest.c)
-  add_executable(bsend2 bsend2.c ../util/mtest.c)
-  add_executable(bsend3 bsend3.c ../util/mtest.c)
-  add_executable(bsend4 bsend4.c ../util/mtest.c)
-  add_executable(bsend5 bsend5.c ../util/mtest.c)
-  add_executable(bsendalign bsendalign.c ../util/mtest.c)
-  add_executable(bsendfrag bsendfrag.c ../util/mtest.c)
-  add_executable(bsendpending bsendpending.c ../util/mtest.c)
-  add_executable(cancelrecv cancelrecv.c ../util/mtest.c)
-  add_executable(eagerdt eagerdt.c ../util/mtest.c)
-  add_executable(greq1 greq1.c ../util/mtest.c)
-  add_executable(icsend icsend.c ../util/mtest.c)
-  add_executable(inactivereq inactivereq.c ../util/mtest.c)
-  add_executable(isendself isendself.c ../util/mtest.c)
-  add_executable(isendselfprobe isendselfprobe.c ../util/mtest.c)
-  add_executable(large_message large_message.c ../util/mtest.c)
-  add_executable(mprobe mprobe.c ../util/mtest.c)
-  add_executable(pingping pingping.c ../util/mtest.c)
-  add_executable(probenull probenull.c ../util/mtest.c)
-  add_executable(probe-unexp probe-unexp.c ../util/mtest.c)
-  add_executable(pscancel pscancel.c ../util/mtest.c)
-  add_executable(rcancel rcancel.c ../util/mtest.c)
-  add_executable(rqfreeb rqfreeb.c ../util/mtest.c)
-  add_executable(rqstatus rqstatus.c ../util/mtest.c)
-  add_executable(scancel2 scancel2.c ../util/mtest.c)
-  add_executable(scancel scancel.c ../util/mtest.c)
-  add_executable(sendall sendall.c ../util/mtest.c)
-  add_executable(sendflood sendflood.c ../util/mtest.c)
-  add_executable(sendrecv1 sendrecv1.c ../util/mtest.c)
-  add_executable(sendrecv2 sendrecv2.c ../util/mtest.c)
-  add_executable(sendrecv3 sendrecv3.c ../util/mtest.c)
-  add_executable(sendself sendself.c ../util/mtest.c)
-  add_executable(waitany-null waitany-null.c ../util/mtest.c)
-  add_executable(waittestnull waittestnull.c ../util/mtest.c)
+  add_executable(anyall anyall.c)
+  add_executable(bottom bottom.c)
+#  add_executable(bsend1 bsend1.c)
+#  add_executable(bsend2 bsend2.c)
+#  add_executable(bsend3 bsend3.c)
+#  add_executable(bsend4 bsend4.c)
+#  add_executable(bsend5 bsend5.c)
+#  add_executable(bsendalign bsendalign.c)
+#  add_executable(bsendfrag bsendfrag.c)
+#  add_executable(bsendpending bsendpending.c)
+#  add_executable(cancelrecv cancelrecv.c)
+  add_executable(eagerdt eagerdt.c)
+#  add_executable(greq1 greq1.c)
+#  add_executable(icsend icsend.c)
+  add_executable(inactivereq inactivereq.c)
+  add_executable(isendself isendself.c)
+  add_executable(isendselfprobe isendselfprobe.c)
+#  add_executable(large_message large_message.c)
+  add_executable(mprobe mprobe.c)
+#  add_executable(pingping pingping.c)
+  add_executable(probenull probenull.c)
+  add_executable(probe-unexp probe-unexp.c)
+#  add_executable(pscancel pscancel.c)
+#  add_executable(rcancel rcancel.c)
+#  add_executable(rqfreeb rqfreeb.c)
+#  add_executable(rqstatus rqstatus.c)
+#  add_executable(scancel2 scancel2.c)
+#  add_executable(scancel scancel.c)
+  add_executable(sendall sendall.c)
+  add_executable(sendflood sendflood.c)
+#  add_executable(sendrecv1 sendrecv1.c)
+  add_executable(sendrecv2 sendrecv2.c)
+  add_executable(sendrecv3 sendrecv3.c)
+#  add_executable(sendself sendself.c)
+  add_executable(waitany-null waitany-null.c)
+  add_executable(waittestnull waittestnull.c)
 
-  target_link_libraries(anyall  simgrid)
-  target_link_libraries(bottom  simgrid)
-  target_link_libraries(bsend1  simgrid)
-  target_link_libraries(bsend2  simgrid)
-  target_link_libraries(bsend3  simgrid)
-  target_link_libraries(bsend4  simgrid)
-  target_link_libraries(bsend5  simgrid)
-  target_link_libraries(bsendalign  simgrid)
-  target_link_libraries(bsendfrag  simgrid)
-  target_link_libraries(bsendpending  simgrid)
-  target_link_libraries(cancelrecv  simgrid)
-  target_link_libraries(eagerdt  simgrid)
-  target_link_libraries(greq1  simgrid)
-  target_link_libraries(icsend  simgrid)
-  target_link_libraries(inactivereq  simgrid)
-  target_link_libraries(isendself  simgrid)
-  target_link_libraries(isendselfprobe  simgrid)
-  target_link_libraries(large_message  simgrid)
-  target_link_libraries(mprobe  simgrid)
-  target_link_libraries(pingping  simgrid)
-  target_link_libraries(probenull  simgrid)
-  target_link_libraries(probe-unexp  simgrid)
-  target_link_libraries(pscancel  simgrid)
-  target_link_libraries(rcancel  simgrid)
-  target_link_libraries(rqfreeb  simgrid)
-  target_link_libraries(rqstatus  simgrid)
-  target_link_libraries(scancel2  simgrid)
-  target_link_libraries(scancel  simgrid)
-  target_link_libraries(sendall  simgrid)
-  target_link_libraries(sendflood  simgrid)
-  target_link_libraries(sendrecv1  simgrid)
-  target_link_libraries(sendrecv2  simgrid)
-  target_link_libraries(sendrecv3  simgrid)
-  target_link_libraries(sendself  simgrid)
-  target_link_libraries(waitany-null  simgrid)
-  target_link_libraries(waittestnull  simgrid)
+  target_link_libraries(anyall simgrid mtest_c)
+  target_link_libraries(bottom simgrid mtest_c)
+#  target_link_libraries(bsend1 simgrid mtest_c)
+#  target_link_libraries(bsend2 simgrid mtest_c)
+#  target_link_libraries(bsend3 simgrid mtest_c)
+#  target_link_libraries(bsend4 simgrid mtest_c)
+#  target_link_libraries(bsend5 simgrid mtest_c)
+#  target_link_libraries(bsendalign simgrid mtest_c)
+#  target_link_libraries(bsendfrag simgrid mtest_c)
+#  target_link_libraries(bsendpending simgrid mtest_c)
+#  target_link_libraries(cancelrecv simgrid mtest_c)
+  target_link_libraries(eagerdt simgrid mtest_c)
+#  target_link_libraries(greq1 simgrid mtest_c)
+#  target_link_libraries(icsend simgrid mtest_c)
+  target_link_libraries(inactivereq simgrid mtest_c)
+  target_link_libraries(isendself simgrid mtest_c)
+  target_link_libraries(isendselfprobe simgrid mtest_c)
+#  target_link_libraries(large_message simgrid mtest_c)
+  target_link_libraries(mprobe simgrid mtest_c)
+#  target_link_libraries(pingping simgrid mtest_c)
+  target_link_libraries(probenull simgrid mtest_c)
+  target_link_libraries(probe-unexp simgrid mtest_c)
+#  target_link_libraries(pscancel simgrid mtest_c)
+#  target_link_libraries(rcancel simgrid mtest_c)
+#  target_link_libraries(rqfreeb simgrid mtest_c)
+#  target_link_libraries(rqstatus simgrid mtest_c)
+#  target_link_libraries(scancel2 simgrid mtest_c)
+#  target_link_libraries(scancel simgrid mtest_c)
+  target_link_libraries(sendall simgrid mtest_c)
+  target_link_libraries(sendflood simgrid mtest_c)
+#  target_link_libraries(sendrecv1 simgrid mtest_c)
+  target_link_libraries(sendrecv2 simgrid mtest_c)
+  target_link_libraries(sendrecv3 simgrid mtest_c)
+#  target_link_libraries(sendself simgrid mtest_c)
+  target_link_libraries(waitany-null simgrid mtest_c)
+  target_link_libraries(waittestnull simgrid mtest_c)
 
 endif()
 
index 0fd3032..e922072 100644 (file)
@@ -7,6 +7,7 @@
 #include "mpi.h"
 #include "mpitestconf.h"
 #include "mpitest.h"
+#include "smpi_cocci.h"
 #if defined(HAVE_STDIO_H) || defined(STDC_HEADERS)
 #include <stdio.h>
 #endif
@@ -48,13 +49,13 @@ static void MTestResourceSummary( FILE * );
 /* Here is where we could put the includes and definitions to enable
    memory testing */
 
-static int dbgflag = 0;         /* Flag used for debugging */
-static int wrank = -1;          /* World rank */
-static int verbose = 0;         /* Message level (0 is none) */
-static int returnWithVal = 0;   /* Allow programs to return with a non-zero 
-                                  if there was an error (may cause problems
-                                  with some runtime systems) */
-static int usageOutput = 0;     /* */
+SMPI_VARINIT_GLOBAL_AND_SET(dbgflag, int, 0); /* Flag used for debugging */
+SMPI_VARINIT_GLOBAL_AND_SET(wrank, int, -1);  /* World rank */
+SMPI_VARINIT_GLOBAL_AND_SET(verbose, int, 0); /* Message level (0 is none) */
+SMPI_VARINIT_GLOBAL_AND_SET(returnWithVal, int, 0); /* Allow programs to return
+                                  with a non-zero if there was an error (may
+                                  cause problems with some runtime systems) */
+SMPI_VARINIT_GLOBAL_AND_SET(usageOutput, int, 0); /* */
 
 /* Provide backward portability to MPI 1 */
 #ifndef MPI_VERSION
@@ -98,8 +99,8 @@ void MTest_Init_thread( int *argc, char ***argv, int required, int *provided )
     }
     /* Check for debugging control */
     if (getenv( "MPITEST_DEBUG" )) {
-       dbgflag = 1;
-       MPI_Comm_rank( MPI_COMM_WORLD, &wrank );
+       SMPI_VARGET_GLOBAL(dbgflag) = 1;
+       MPI_Comm_rank( MPI_COMM_WORLD, &SMPI_VARGET_GLOBAL(wrank) );
     }
 
     /* Check for verbose control */
@@ -115,7 +116,7 @@ void MTest_Init_thread( int *argc, char ***argv, int required, int *provided )
        }
        else {
            if (val >= 0) {
-               verbose = val;
+               SMPI_VARGET_GLOBAL(verbose) = val;
            }
            else {
                fprintf( stderr, "Warning: %s not valid for MPITEST_VERBOSE\n", 
@@ -131,13 +132,13 @@ void MTest_Init_thread( int *argc, char ***argv, int required, int *provided )
            strcmp( envval, "YES" ) == 0 ||
            strcmp( envval, "true" ) == 0 ||
            strcmp( envval, "TRUE" ) == 0) {
-           returnWithVal = 1;
+           SMPI_VARGET_GLOBAL(returnWithVal) = 1;
        }
        else if (strcmp( envval, "no" ) == 0 ||
            strcmp( envval, "NO" ) == 0 ||
            strcmp( envval, "false" ) == 0 ||
            strcmp( envval, "FALSE" ) == 0) {
-           returnWithVal = 0;
+           SMPI_VARGET_GLOBAL(returnWithVal) = 0;
        }
        else {
            fprintf( stderr, 
@@ -149,7 +150,7 @@ void MTest_Init_thread( int *argc, char ***argv, int required, int *provided )
     
     /* Print rusage data if set */
     if (getenv( "MPITEST_RUSAGE" )) {
-       usageOutput = 1;
+       SMPI_VARGET_GLOBAL(usageOutput) = 1;
     }
 }
 /* 
@@ -219,7 +220,7 @@ void MTest_Finalize( int errs )
        fflush( stdout );
     }
     
-    if (usageOutput) 
+    if (SMPI_VARGET_GLOBAL(usageOutput))
        MTestResourceSummary( stdout );
 
 
@@ -232,7 +233,7 @@ void MTest_Finalize( int errs )
  */
 int MTestReturnValue( int errors )
 {
-    if (returnWithVal) return errors ? 1 : 0;
+    if (SMPI_VARGET_GLOBAL(returnWithVal)) return errors ? 1 : 0;
     return 0;
 }
 /* ------------------------------------------------------------------------ */
@@ -277,7 +278,7 @@ void MTestSleep( int sec )
  *    Indexed  - Indexed datatype.  Only for a count of 1 instance of the 
  *               datatype
  */
-static int datatype_index = 0;
+SMPI_VARINIT_GLOBAL_AND_SET(datatype_index, int, 0);
 
 /* ------------------------------------------------------------------------ */
 /* Datatype routines for contiguous datatypes                               */
@@ -636,7 +637,7 @@ int MTestGetDatatypes( MTestDatatype *sendtype, MTestDatatype *recvtype,
     recvtype->count      = count;
     /* Use datatype_index to choose a datatype to use.  If at the end of the
        list, return 0 */
-    switch (datatype_index) {
+    switch (SMPI_VARGET_GLOBAL(datatype_index)) {
     case 0:
        sendtype->datatype = MPI_INT;
        sendtype->isBasic  = 1;
@@ -858,7 +859,7 @@ int MTestGetDatatypes( MTestDatatype *sendtype, MTestDatatype *recvtype,
        break;
 #endif
     default:
-       datatype_index = -1;
+       SMPI_VARGET_GLOBAL(datatype_index) = -1;
     }
 
     if (!sendtype->InitBuf) {
@@ -869,29 +870,29 @@ int MTestGetDatatypes( MTestDatatype *sendtype, MTestDatatype *recvtype,
        sendtype->CheckBuf = MTestTypeContigCheckbuf;
        recvtype->CheckBuf = MTestTypeContigCheckbuf;
     }
-    datatype_index++;
+    SMPI_VARGET_GLOBAL(datatype_index)++;
 
-    if (dbgflag && datatype_index > 0) {
+    if (SMPI_VARGET_GLOBAL(dbgflag) && SMPI_VARGET_GLOBAL(datatype_index) > 0) {
        int typesize;
-       fprintf( stderr, "%d: sendtype is %s\n", wrank, MTestGetDatatypeName( sendtype ) );
+       fprintf( stderr, "%d: sendtype is %s\n", SMPI_VARGET_GLOBAL(wrank), MTestGetDatatypeName( sendtype ) );
        merr = MPI_Type_size( sendtype->datatype, &typesize );
        if (merr) MTestPrintError( merr );
-       fprintf( stderr, "%d: sendtype size = %d\n", wrank, typesize );
-       fprintf( stderr, "%d: recvtype is %s\n", wrank, MTestGetDatatypeName( recvtype ) );
+       fprintf( stderr, "%d: sendtype size = %d\n", SMPI_VARGET_GLOBAL(wrank), typesize );
+       fprintf( stderr, "%d: recvtype is %s\n", SMPI_VARGET_GLOBAL(wrank), MTestGetDatatypeName( recvtype ) );
        merr = MPI_Type_size( recvtype->datatype, &typesize );
        if (merr) MTestPrintError( merr );
-       fprintf( stderr, "%d: recvtype size = %d\n", wrank, typesize );
+       fprintf( stderr, "%d: recvtype size = %d\n", SMPI_VARGET_GLOBAL(wrank), typesize );
        fflush( stderr );
        
     }
-    else if (verbose && datatype_index > 0) {
+    else if (SMPI_VARGET_GLOBAL(verbose) && SMPI_VARGET_GLOBAL(datatype_index) > 0) {
        printf( "Get new datatypes: send = %s, recv = %s\n", 
                MTestGetDatatypeName( sendtype ), 
                MTestGetDatatypeName( recvtype ) );
        fflush( stdout );
     }
 
-    return datatype_index;
+    return SMPI_VARGET_GLOBAL(datatype_index);
 }
 
 /* Reset the datatype index (start from the initial data type.
@@ -900,13 +901,13 @@ int MTestGetDatatypes( MTestDatatype *sendtype, MTestDatatype *recvtype,
 */
 void MTestResetDatatypes( void )
 {
-    datatype_index = 0;
+    SMPI_VARGET_GLOBAL(datatype_index) = 0;
 }
 /* Return the index of the current datatype.  This is rarely needed and
    is provided mostly to enable debugging of the MTest package itself */
 int MTestGetDatatypeIndex( void )
 {
-    return datatype_index;
+    return SMPI_VARGET_GLOBAL(datatype_index);
 }
 
 /* Free the storage associated with a datatype */
@@ -953,14 +954,15 @@ int MTestCheckRecv( MPI_Status *status, MTestDatatype *recvtype )
    simplify the use of the routine */
 const char *MTestGetDatatypeName( MTestDatatype *dtype )
 {
-    static char name[4][MPI_MAX_OBJECT_NAME];
-    static int sp=0;
+    typedef char name_type[4][MPI_MAX_OBJECT_NAME];
+    SMPI_VARINIT_STATIC(name, name_type);
+    SMPI_VARINIT_STATIC_AND_SET(sp, int, 0);
     int rlen, merr;
 
-    if (sp >= 4) sp = 0;
-    merr = MPI_Type_get_name( dtype->datatype, name[sp], &rlen );
+    if (SMPI_VARGET_STATIC(sp) >= 4) SMPI_VARGET_STATIC(sp) = 0;
+    merr = MPI_Type_get_name( dtype->datatype, SMPI_VARGET_STATIC(name)[SMPI_VARGET_STATIC(sp)], &rlen );
     if (merr) MTestPrintError( merr );
-    return (const char *)name[sp++];
+    return (const char *)SMPI_VARGET_STATIC(name)[SMPI_VARGET_STATIC(sp)++];
 }
 /* ----------------------------------------------------------------------- */
 
@@ -971,10 +973,10 @@ const char *MTestGetDatatypeName( MTestDatatype *dtype )
  * that return value as well.
  * 
  */
-static __thread int interCommIdx = 0;
-static __thread int intraCommIdx = 0;
-static __thread const char *intraCommName = 0;
-static __thread const char *interCommName = 0;
+SMPI_VARINIT_GLOBAL_AND_SET(interCommIdx, int, 0);
+SMPI_VARINIT_GLOBAL_AND_SET(intraCommIdx, int, 0);
+SMPI_VARINIT_GLOBAL_AND_SET(intraCommName, const char *, 0);
+SMPI_VARINIT_GLOBAL_AND_SET(interCommName, const char *, 0);
 
 /* 
  * Get an intracommunicator with at least min_size members.  If "allowSmaller"
@@ -992,18 +994,18 @@ int MTestGetIntracommGeneral( MPI_Comm *comm, int min_size, int allowSmaller )
        MPI_COMM_NULL is always considered large enough */
     while (!done) {
        isBasic = 0;
-       intraCommName = "";
-       switch (intraCommIdx) {
+       SMPI_VARGET_GLOBAL(intraCommName) = "";
+       switch (SMPI_VARGET_GLOBAL(intraCommIdx)) {
        case 0:
            *comm = MPI_COMM_WORLD;
            isBasic = 1;
-           intraCommName = "MPI_COMM_WORLD";
+           SMPI_VARGET_GLOBAL(intraCommName) = "MPI_COMM_WORLD";
            break;
        case 1:
            /* dup of world */
            merr = MPI_Comm_dup(MPI_COMM_WORLD, comm );
            if (merr) MTestPrintError( merr );
-           intraCommName = "Dup of MPI_COMM_WORLD";
+           SMPI_VARGET_GLOBAL(intraCommName) = "Dup of MPI_COMM_WORLD";
            break;
        case 2:
            /* reverse ranks */
@@ -1013,7 +1015,7 @@ int MTestGetIntracommGeneral( MPI_Comm *comm, int min_size, int allowSmaller )
            if (merr) MTestPrintError( merr );
            merr = MPI_Comm_split( MPI_COMM_WORLD, 0, size-rank, comm );
            if (merr) MTestPrintError( merr );
-           intraCommName = "Rank reverse of MPI_COMM_WORLD";
+           SMPI_VARGET_GLOBAL(intraCommName) = "Rank reverse of MPI_COMM_WORLD";
            break;
        case 3:
            /* subset of world, with reversed ranks */
@@ -1024,12 +1026,12 @@ int MTestGetIntracommGeneral( MPI_Comm *comm, int min_size, int allowSmaller )
            merr = MPI_Comm_split( MPI_COMM_WORLD, ((rank < size/2) ? 1 : MPI_UNDEFINED),
                                   size-rank, comm );
            if (merr) MTestPrintError( merr );
-           intraCommName = "Rank reverse of half of MPI_COMM_WORLD";
+           SMPI_VARGET_GLOBAL(intraCommName) = "Rank reverse of half of MPI_COMM_WORLD";
            break;
        case 4:
            *comm = MPI_COMM_SELF;
            isBasic = 1;
-           intraCommName = "MPI_COMM_SELF";
+           SMPI_VARGET_GLOBAL(intraCommName) = "MPI_COMM_SELF";
            break;
 
            /* These next cases are communicators that include some
@@ -1042,7 +1044,7 @@ int MTestGetIntracommGeneral( MPI_Comm *comm, int min_size, int allowSmaller )
            int newsize;
            merr = MPI_Comm_size( MPI_COMM_WORLD, &size );
            if (merr) MTestPrintError( merr );
-           newsize = size - (intraCommIdx - 4);
+           newsize = size - (SMPI_VARGET_GLOBAL(intraCommIdx) - 4);
            
            if (allowSmaller && newsize >= min_size) {
                merr = MPI_Comm_rank( MPI_COMM_WORLD, &rank );
@@ -1056,13 +1058,13 @@ int MTestGetIntracommGeneral( MPI_Comm *comm, int min_size, int allowSmaller )
                    *comm = MPI_COMM_NULL;
                }
                else {
-                   intraCommName = "Split of WORLD";
+                   SMPI_VARGET_GLOBAL(intraCommName) = "Split of WORLD";
                }
            }
            else {
                /* Act like default */
                *comm = MPI_COMM_NULL;
-               intraCommIdx = -1;
+               SMPI_VARGET_GLOBAL(intraCommIdx) = -1;
            }
        }
        break;
@@ -1070,7 +1072,7 @@ int MTestGetIntracommGeneral( MPI_Comm *comm, int min_size, int allowSmaller )
            /* Other ideas: dup of self, cart comm, graph comm */
        default:
            *comm = MPI_COMM_NULL;
-           intraCommIdx = -1;
+           SMPI_VARGET_GLOBAL(intraCommIdx) = -1;
            break;
        }
 
@@ -1081,7 +1083,7 @@ int MTestGetIntracommGeneral( MPI_Comm *comm, int min_size, int allowSmaller )
                done = 1;
        }
         else {
-            intraCommName = "MPI_COMM_NULL";
+            SMPI_VARGET_GLOBAL(intraCommName) = "MPI_COMM_NULL";
             isBasic = 1;
             done = 1;
         }
@@ -1092,7 +1094,7 @@ done2=done;
         /* Advance the comm index whether we are done or not, otherwise we could
          * spin forever trying to allocate a too-small communicator over and
          * over again. */
-        intraCommIdx++;
+        SMPI_VARGET_GLOBAL(intraCommIdx)++;
 
         if (!done && !isBasic && *comm != MPI_COMM_NULL) {
             /* avoid leaking communicators */
@@ -1101,7 +1103,7 @@ done2=done;
         }
     }
 
-    return intraCommIdx;
+    return SMPI_VARGET_GLOBAL(intraCommIdx);
 }
 
 /* 
@@ -1115,7 +1117,7 @@ int MTestGetIntracomm( MPI_Comm *comm, int min_size )
 /* Return the name of an intra communicator */
 const char *MTestGetIntracommName( void )
 {
-    return intraCommName;
+    return SMPI_VARGET_GLOBAL(intraCommName);
 }
 
 /* 
@@ -1136,9 +1138,9 @@ int MTestGetIntercomm( MPI_Comm *comm, int *isLeftGroup, int min_size )
     while (!done) {
         *comm = MPI_COMM_NULL;
         *isLeftGroup = 0;
-        interCommName = "MPI_COMM_NULL";
+        SMPI_VARGET_GLOBAL(interCommName) = "MPI_COMM_NULL";
 
-       switch (interCommIdx) {
+       switch (SMPI_VARGET_GLOBAL(interCommIdx)) {
        case 0:
            /* Split comm world in half */
            merr = MPI_Comm_rank( MPI_COMM_WORLD, &rank );
@@ -1164,7 +1166,7 @@ int MTestGetIntercomm( MPI_Comm *comm, int *isLeftGroup, int min_size )
                merr = MPI_Intercomm_create( mcomm, 0, MPI_COMM_WORLD, rleader,
                                             12345, comm );
                if (merr) MTestPrintError( merr );
-               interCommName = "Intercomm by splitting MPI_COMM_WORLD";
+               SMPI_VARGET_GLOBAL(interCommName) = "Intercomm by splitting MPI_COMM_WORLD";
            }
            else 
                *comm = MPI_COMM_NULL;
@@ -1194,7 +1196,7 @@ int MTestGetIntercomm( MPI_Comm *comm, int *isLeftGroup, int min_size )
                merr = MPI_Intercomm_create( mcomm, 0, MPI_COMM_WORLD, 
                                             rleader, 12346, comm );
                if (merr) MTestPrintError( merr );
-               interCommName = "Intercomm by splitting MPI_COMM_WORLD into 1, rest";
+               SMPI_VARGET_GLOBAL(interCommName) = "Intercomm by splitting MPI_COMM_WORLD into 1, rest";
            }
            else
                *comm = MPI_COMM_NULL;
@@ -1225,7 +1227,7 @@ int MTestGetIntercomm( MPI_Comm *comm, int *isLeftGroup, int min_size )
                merr = MPI_Intercomm_create( mcomm, 0, MPI_COMM_WORLD, 
                                             rleader, 12347, comm );
                if (merr) MTestPrintError( merr );
-               interCommName = "Intercomm by splitting MPI_COMM_WORLD into 2, rest";
+               SMPI_VARGET_GLOBAL(interCommName) = "Intercomm by splitting MPI_COMM_WORLD into 2, rest";
            }
            else 
                *comm = MPI_COMM_NULL;
@@ -1264,7 +1266,7 @@ int MTestGetIntercomm( MPI_Comm *comm, int *isLeftGroup, int min_size )
                mcomm = *comm;
                merr = MPI_Comm_dup(mcomm, comm);
                if (merr) MTestPrintError( merr );
-               interCommName = "Intercomm by splitting MPI_COMM_WORLD then dup'ing";
+               SMPI_VARGET_GLOBAL(interCommName) = "Intercomm by splitting MPI_COMM_WORLD then dup'ing";
            }
            else 
                *comm = MPI_COMM_NULL;
@@ -1306,7 +1308,7 @@ int MTestGetIntercomm( MPI_Comm *comm, int *isLeftGroup, int min_size )
                /* this split is effectively a dup but tests the split code paths */
                merr = MPI_Comm_split(mcomm, 0, rank, comm);
                if (merr) MTestPrintError( merr );
-               interCommName = "Intercomm by splitting MPI_COMM_WORLD then then splitting again";
+               SMPI_VARGET_GLOBAL(interCommName) = "Intercomm by splitting MPI_COMM_WORLD then then splitting again";
            }
            else
                *comm = MPI_COMM_NULL;
@@ -1343,7 +1345,7 @@ int MTestGetIntercomm( MPI_Comm *comm, int *isLeftGroup, int min_size )
                     merr = MPI_Intercomm_create( mcomm, 0, MPI_COMM_WORLD, rleader, 12345, comm );
                     if (merr) MTestPrintError( merr );
                 }
-                interCommName = "Intercomm by splitting MPI_COMM_WORLD (discarding rank 0 in the left group) then MPI_Intercomm_create'ing";
+                SMPI_VARGET_GLOBAL(interCommName) = "Intercomm by splitting MPI_COMM_WORLD (discarding rank 0 in the left group) then MPI_Intercomm_create'ing";
             }
             else {
                 *comm = MPI_COMM_NULL;
@@ -1396,7 +1398,7 @@ int MTestGetIntercomm( MPI_Comm *comm, int *isLeftGroup, int min_size )
                 merr = MPI_Group_free(&newgroup);
                 if (merr) MTestPrintError( merr );
 
-                interCommName = "Intercomm by splitting MPI_COMM_WORLD then discarding 0 ranks with MPI_Comm_create";
+                SMPI_VARGET_GLOBAL(interCommName) = "Intercomm by splitting MPI_COMM_WORLD then discarding 0 ranks with MPI_Comm_create";
             }
             else {
                 *comm = MPI_COMM_NULL;
@@ -1405,7 +1407,7 @@ int MTestGetIntercomm( MPI_Comm *comm, int *isLeftGroup, int min_size )
 
        default:
            *comm = MPI_COMM_NULL;
-           interCommIdx = -1;
+           SMPI_VARGET_GLOBAL(interCommIdx) = -1;
            break;
        }
 
@@ -1417,7 +1419,7 @@ int MTestGetIntercomm( MPI_Comm *comm, int *isLeftGroup, int min_size )
            if (size + remsize >= min_size) done = 1;
        }
        else {
-           interCommName = "MPI_COMM_NULL";
+           SMPI_VARGET_GLOBAL(interCommName) = "MPI_COMM_NULL";
            done = 1;
         }
 
@@ -1427,7 +1429,7 @@ int MTestGetIntercomm( MPI_Comm *comm, int *isLeftGroup, int min_size )
         /* Advance the comm index whether we are done or not, otherwise we could
          * spin forever trying to allocate a too-small communicator over and
          * over again. */
-        interCommIdx++;
+        SMPI_VARGET_GLOBAL(interCommIdx)++;
 
         if (!done && *comm != MPI_COMM_NULL) {
             /* avoid leaking communicators */
@@ -1446,12 +1448,12 @@ int MTestGetIntercomm( MPI_Comm *comm, int *isLeftGroup, int min_size )
         }
     }
 
-    return interCommIdx;
+    return SMPI_VARGET_GLOBAL(interCommIdx);
 }
 /* Return the name of an intercommunicator */
 const char *MTestGetIntercommName( void )
 {
-    return interCommName;
+    return SMPI_VARGET_GLOBAL(interCommName);
 }
 
 /* Get a communicator of a given minimum size.  Both intra and inter 
@@ -1459,19 +1461,19 @@ const char *MTestGetIntercommName( void )
 int MTestGetComm( MPI_Comm *comm, int min_size )
 {
     int idx=0;
-    static __thread int getinter = 0;
+    SMPI_VARINIT_STATIC_AND_SET(getinter, int, 0);
 
-    if (!getinter) {
+    if (!SMPI_VARGET_STATIC(getinter)) {
        idx = MTestGetIntracomm( comm, min_size );
        if (idx == 0) {
-           getinter = 1;
+           SMPI_VARGET_STATIC(getinter) = 1;
        }
     }
-    if (getinter) {
+    if (SMPI_VARGET_STATIC(getinter)) {
        int isLeft;
        idx = MTestGetIntercomm( comm, &isLeft, min_size );
        if (idx == 0) {
-           getinter = 0;
+           SMPI_VARGET_STATIC(getinter) = 0;
        }
     }
 
@@ -1521,7 +1523,7 @@ void MTestPrintfMsg( int level, const char format[], ... )
 {
     va_list list;
 
-    if (verbose && level >= verbose) {
+    if (SMPI_VARGET_GLOBAL(verbose) && level >= SMPI_VARGET_GLOBAL(verbose)) {
        va_start(list,format);
        vprintf( format, list );
        va_end(list);
@@ -1541,20 +1543,20 @@ static void MTestResourceSummary( FILE *fp )
 {
 #ifdef HAVE_GETRUSAGE
     struct rusage ru;
-    static __thread int pfThreshold = -2;
+    SMPI_VARINIT_STATIC_AND_SET(pfThreshold, int, -2);
     int doOutput = 1;
     if (getrusage( RUSAGE_SELF, &ru ) == 0) {
        /* There is an option to generate output only when a resource
           exceeds a threshold.  To date, only page faults supported. */
-       if (pfThreshold == -2) {
+       if (SMPI_VARGET_STATIC(pfThreshold) == -2) {
            char *p = getenv("MPITEST_RUSAGE_PF");
-           pfThreshold = -1;
+           SMPI_VARGET_STATIC(pfThreshold) = -1;
            if (p) {
-               pfThreshold = strtol( p, 0, 0 );
+               SMPI_VARGET_STATIC(pfThreshold) = strtol( p, 0, 0 );
            }
        }
-       if (pfThreshold > 0) {
-           doOutput = ru.ru_minflt > pfThreshold;
+       if (SMPI_VARGET_STATIC(pfThreshold) > 0) {
+           doOutput = ru.ru_minflt > SMPI_VARGET_STATIC(pfThreshold);
        }
        if (doOutput) {
            /* Cast values to long in case some system has defined them
@@ -1582,47 +1584,48 @@ static void MTestResourceSummary( FILE *fp )
 /*
  * Create MPI Windows
  */
-static __thread int win_index = 0;
-static const char *winName;
+SMPI_VARINIT_GLOBAL_AND_SET(win_index, int, 0);
+SMPI_VARINIT_GLOBAL(winName, const char *);
 /* Use an attribute to remember the type of memory allocation (static,
    malloc, or MPI_Alloc_mem) */
-static __thread int mem_keyval = MPI_KEYVAL_INVALID;
+SMPI_VARINIT_GLOBAL_AND_SET(mem_keyval, int, MPI_KEYVAL_INVALID);
 int MTestGetWin( MPI_Win *win, int mustBePassive )
 {
-    static char actbuf[1024];
-    static char *pasbuf;
+    typedef char actbuf_type[1024];
+    SMPI_VARINIT_STATIC(actbuf, actbuf_type);
+    SMPI_VARINIT_STATIC(pasbuf, char *);
     char        *buf;
     int         n, rank, merr;
     MPI_Info    info;
 
-    if (mem_keyval == MPI_KEYVAL_INVALID) {
+    if (SMPI_VARGET_GLOBAL(mem_keyval) == MPI_KEYVAL_INVALID) {
        /* Create the keyval */
        merr = MPI_Win_create_keyval( MPI_WIN_NULL_COPY_FN, 
                                      MPI_WIN_NULL_DELETE_FN, 
-                                     &mem_keyval, 0 );
+                                     &SMPI_VARGET_GLOBAL(mem_keyval), 0 );
        if (merr) MTestPrintError( merr );
 
     }
 
-    switch (win_index) {
+    switch (SMPI_VARGET_GLOBAL(win_index)) {
     case 0:
        /* Active target window */
-       merr = MPI_Win_create( actbuf, 1024, 1, MPI_INFO_NULL, MPI_COMM_WORLD, 
+       merr = MPI_Win_create( SMPI_VARGET_STATIC(actbuf), 1024, 1, MPI_INFO_NULL, MPI_COMM_WORLD,
                               win );
        if (merr) MTestPrintError( merr );
-       winName = "active-window";
-       merr = MPI_Win_set_attr( *win, mem_keyval, (void *)0 );
+       SMPI_VARGET_GLOBAL(winName) = "active-window";
+       merr = MPI_Win_set_attr( *win, SMPI_VARGET_GLOBAL(mem_keyval), (void *)0 );
        if (merr) MTestPrintError( merr );
        break;
     case 1:
        /* Passive target window */
-       merr = MPI_Alloc_mem( 1024, MPI_INFO_NULL, &pasbuf );
+       merr = MPI_Alloc_mem( 1024, MPI_INFO_NULL, &SMPI_VARGET_STATIC(pasbuf) );
        if (merr) MTestPrintError( merr );
-       merr = MPI_Win_create( pasbuf, 1024, 1, MPI_INFO_NULL, MPI_COMM_WORLD, 
+       merr = MPI_Win_create( SMPI_VARGET_STATIC(pasbuf), 1024, 1, MPI_INFO_NULL, MPI_COMM_WORLD,
                               win );
        if (merr) MTestPrintError( merr );
-       winName = "passive-window";
-       merr = MPI_Win_set_attr( *win, mem_keyval, (void *)2 );
+       SMPI_VARGET_GLOBAL(winName) = "passive-window";
+       merr = MPI_Win_set_attr( *win, SMPI_VARGET_GLOBAL(mem_keyval), (void *)2 );
        if (merr) MTestPrintError( merr );
        break;
     case 2:
@@ -1637,8 +1640,8 @@ int MTestGetWin( MPI_Win *win, int mustBePassive )
        merr = MPI_Win_create( buf, n, 1, MPI_INFO_NULL, MPI_COMM_WORLD, 
                               win );
        if (merr) MTestPrintError( merr );
-       winName = "active-all-different-win";
-       merr = MPI_Win_set_attr( *win, mem_keyval, (void *)1 );
+       SMPI_VARGET_GLOBAL(winName) = "active-all-different-win";
+       merr = MPI_Win_set_attr( *win, SMPI_VARGET_GLOBAL(mem_keyval), (void *)1 );
        if (merr) MTestPrintError( merr );
        break;
     case 3:
@@ -1658,20 +1661,20 @@ int MTestGetWin( MPI_Win *win, int mustBePassive )
        if (merr) MTestPrintError( merr );
        merr = MPI_Info_free( &info );
        if (merr) MTestPrintError( merr );
-       winName = "active-nolocks-all-different-win";
-       merr = MPI_Win_set_attr( *win, mem_keyval, (void *)1 );
+       SMPI_VARGET_GLOBAL(winName) = "active-nolocks-all-different-win";
+       merr = MPI_Win_set_attr( *win, SMPI_VARGET_GLOBAL(mem_keyval), (void *)1 );
        if (merr) MTestPrintError( merr );
        break;
     default:
-       win_index = -1;
+       SMPI_VARGET_GLOBAL(win_index) = -1;
     }
-    win_index++;
-    return win_index;
+    SMPI_VARGET_GLOBAL(win_index)++;
+    return SMPI_VARGET_GLOBAL(win_index);
 }
 /* Return a pointer to the name associated with a window object */
 const char *MTestGetWinName( void )
 {
-    return winName;
+    return SMPI_VARGET_GLOBAL(winName);
 }
 /* Free the storage associated with a window object */
 void MTestFreeWin( MPI_Win *win )
@@ -1686,7 +1689,7 @@ void MTestFreeWin( MPI_Win *win )
     }
     if (addr) {
        void *val;
-       merr = MPI_Win_get_attr( *win, mem_keyval, &val, &flag );
+       merr = MPI_Win_get_attr( *win, SMPI_VARGET_GLOBAL(mem_keyval), &val, &flag );
        if (merr) MTestPrintError( merr );
        if (flag) {
            if (val == (void *)1) {
@@ -1704,8 +1707,8 @@ void MTestFreeWin( MPI_Win *win )
 }
 static void MTestRMACleanup( void )
 {
-    if (mem_keyval != MPI_KEYVAL_INVALID) {
-       MPI_Win_free_keyval( &mem_keyval );
+    if (SMPI_VARGET_GLOBAL(mem_keyval) != MPI_KEYVAL_INVALID) {
+       MPI_Win_free_keyval( &SMPI_VARGET_GLOBAL(mem_keyval) );
     }
 }
 #else 
index e7cb94f..7d2677f 100644 (file)
@@ -1,6 +1,6 @@
 /* A simple example pingpong pogram to test MPI_Send and MPI_Recv */
 
-/* Copyright (c) 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 6d2e09a..9b88c7b 100644 (file)
@@ -1,7 +1,7 @@
 p Test dsend
 ! setenv LD_LIBRARY_PATH=../../lib
 ! output sort
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./dsend -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./dsend -q --log=smpi_kernel.thres:warning
 > [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'
@@ -15,7 +15,7 @@ $ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform $
 p Test pingpong
 ! setenv LD_LIBRARY_PATH=../../lib
 ! output sort
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 4 ./pingpong -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 4 ./pingpong -q --log=smpi_kernel.thres:warning
 >     *** Ping-pong test (MPI_Send/MPI_Recv) ***
 > == pivot=0 : pingpong [0] <--> [1]
 > == pivot=1 : pingpong [1] <--> [2]
index 84203e9..92436c9 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 <mpi.h>
 
index 3236486..a191088 100644 (file)
@@ -3,7 +3,7 @@
 # Go for the first test
 p Test Reduce with 3 processes
 ! output sort
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 3 ./reduce -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 3 ./reduce -q --log=smpi_kernel.thres:warning
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
 > [rank 2] -> Fafard
@@ -24,7 +24,7 @@ $ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform $
 ! setenv LD_LIBRARY_PATH=../../lib
 ! output sort
 p Test Reduce with 5 processes
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 5 ./reduce -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 5 ./reduce -q --log=smpi_kernel.thres:warning
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
 > [rank 2] -> Fafard
@@ -49,7 +49,7 @@ $ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform $
 ! output sort
 ! setenv LD_LIBRARY_PATH=../../lib
 p Test Reduce with 12 processes
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 12 ./reduce -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 12 ./reduce -q --log=smpi_kernel.thres:warning
 > You requested to use 12 processes, but there is only 5 processes in your hostfile...
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
index 3b28457..7acc93d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 65e3575..0edfdc7 100644 (file)
@@ -3,7 +3,7 @@
 ! output sort
 
 p Test allreduce
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./reduce_coll
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./reduce_coll --log=smpi_kernel.thres:warning
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
 > [0] rcvbuf=[1920 1936 1952 1968 1984 2000 2016 2032 2048 2064 2080 2096 2112 2128 2144 2160 ]
index f8d9fb3..41b6bc7 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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. */
+
 /* 
  * Test of reduce scatter.
  *
index 5344d64..249f686 100644 (file)
@@ -3,7 +3,7 @@
 ! output sort
 
 p Test reduce_scatter
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./reduce_scatter_coll 
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./reduce_scatter_coll  --log=smpi_kernel.thres:warning
 >  No Errors
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
index 0096064..fda82e1 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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. */
+
 /**
  * MESSAGE PASSING INTERFACE TEST CASE SUITE
  *
index d5ef00d..043ec55 100644 (file)
@@ -3,7 +3,7 @@
 ! output sort
 
 p Test scatter
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./scatter 
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./scatter  --log=smpi_kernel.thres:warning
 >      [0] ok.
 >      [0] ok.
 >      [10] ok.
index 6a1bf0e..5a55887 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 132bf9a..bb5c480 100644 (file)
@@ -1,6 +1,6 @@
 /* A simple example pingpong pogram to test MPI_Send and MPI_Recv */
 
-/* Copyright (c) 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index b1536c5..7875935 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index f9ad65f..3d78abb 100644 (file)
@@ -2,7 +2,7 @@ p Test compute
 ! setenv LD_LIBRARY_PATH=../../lib
 ! output sort
 ! timeout 5
-$ ../../smpi_script/bin/smpirun -platform ${srcdir:=.}/../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir:=.}/hostfile -np 4 ./shared 
+$ ../../smpi_script/bin/smpirun -platform ${srcdir:=.}/../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir:=.}/hostfile -np 4 ./shared  --log=smpi_kernel.thres:warning
 > [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'
index 0a41c47..64a4a86 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 804954b..c6e05db 100644 (file)
@@ -1,7 +1,7 @@
 p Test struct
 ! setenv LD_LIBRARY_PATH=../../lib
 ! output sort
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./struct_test -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./struct_test -q --log=smpi_kernel.thres:warning
 > Process 0 got -2 (-2?) and 8.000000 (8.0?), tab (should be all 0): 0 0 0 0 0 0 
 > Process 1 got -2 (-2?) and 8.000000 (8.0?), tab (should be all 0): 0 0 0 0 0 0 
 > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s)
index 1159b93..658f51a 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 "mpi.h"
 
index 5ffb0fd..c01db5b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 9df5dd2..ddd03a0 100644 (file)
@@ -1,7 +1,7 @@
 p Test vector
 ! setenv LD_LIBRARY_PATH=../../lib
 ! output sort
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./vector_test -q
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./vector_test -q --log=smpi_kernel.thres:warning
 > [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'
index ea41ec2..1025915 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 "mpi.h"
 #define SIZE 4
index a181c6d..a7e9235 100644 (file)
@@ -4,7 +4,7 @@ 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)
-if(HAVE_MMAP)
+if(HAVE_MMALLOC)
   add_executable(mmalloc_test mmalloc_test.c)
 endif()
 add_executable(parmap_test parmap_test.c)
@@ -13,7 +13,7 @@ add_executable(parmap_test parmap_test.c)
 ### Add definitions for compile
 target_link_libraries(log_large_test simgrid)
 target_link_libraries(parallel_log_crashtest simgrid)
-if(HAVE_MMAP)
+if(HAVE_MMALLOC)
   target_link_libraries(mmalloc_test simgrid)
 endif()
 target_link_libraries(parmap_test simgrid)
index cd3ade7..847a57c 100644 (file)
@@ -1,6 +1,6 @@
 /* log_large_test -- log a very large string to test the dynamic variants   */
 
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8b245aa..a09704d 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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/mmalloc.h"
 #include "xbt.h"
 #include <stdio.h>
index 920784f..c5c5c8e 100644 (file)
@@ -1,6 +1,6 @@
 /* synchro_crashtest -- tries to crash the logging mecanism by doing // logs*/
 
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 52c4050..f21e9f7 100644 (file)
@@ -1,6 +1,6 @@
 /* parmap_test -- test parmap                                               */
 
-/* Copyright (c) 2007-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d9d7a01..3d88670 100644 (file)
@@ -1,6 +1,6 @@
 /* A few tests for the maxmin library                                       */
 
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index f08e322..8e7d2b0 100644 (file)
@@ -1,6 +1,6 @@
 /* A crash few tests for the maxmin library                                 */
 
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 1a922a8..45cb3ef 100644 (file)
@@ -1,6 +1,6 @@
 /* A few basic tests for the surf library                                   */
 
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -58,23 +58,23 @@ void test(char *platform)
   parse_platform_file(platform);
 
   /*********************** CPU ***********************************/
-  XBT_DEBUG("%p", surf_cpu_model);
+  XBT_DEBUG("%p", surf_cpu_model_pm);
   cpuA = surf_cpu_resource_by_name("Cpu A");
   cpuB = surf_cpu_resource_by_name("Cpu B");
 
   /* Let's check that those two processors exist */
-  XBT_DEBUG("%s : %p", surf_resource_name(cpuA), cpuA);
-  XBT_DEBUG("%s : %p", surf_resource_name(cpuB), cpuB);
+  XBT_DEBUG("%s : %p", surf_resource_name(surf_cpu_resource_priv(cpuA)), cpuA);
+  XBT_DEBUG("%s : %p", surf_resource_name(surf_cpu_resource_priv(cpuB)), cpuB);
 
   /* Let's do something on it */
-  actionA = surf_cpu_model->extension.cpu.execute(cpuA, 1000.0);
-  actionB = surf_cpu_model->extension.cpu.execute(cpuB, 1000.0);
-  actionC = surf_cpu_model->extension.cpu.sleep(cpuB, 7.32);
+  actionA = surf_cpu_execute(cpuA, 1000.0);
+  actionB = surf_cpu_execute(cpuB, 1000.0);
+  actionC = surf_cpu_sleep(cpuB, 7.32);
 
   /* Use whatever calling style you want... */
-  stateActionA = surf_cpu_model->action_state_get(actionA);     /* When you know actionA model type */
-  stateActionB = actionB->model_type->action_state_get(actionB);        /* If you're unsure about it's model type */
-  stateActionC = surf_cpu_model->action_state_get(actionC);     /* When you know actionA model type */
+  stateActionA = surf_action_get_state(actionA);     /* When you know actionA model type */
+  stateActionB = surf_action_get_state(actionB);        /* If you're unsure about it's model type */
+  stateActionC = surf_action_get_state(actionC);     /* When you know actionA model type */
 
   /* And just look at the state of these tasks */
   XBT_DEBUG("actionA : %p (%s)", actionA, string_action(stateActionA));
@@ -87,12 +87,11 @@ void test(char *platform)
   cardB = sg_routing_edge_by_name_or_null("Cpu B");
 
   /* Let's check that those two processors exist */
-  XBT_DEBUG("%s : %p", surf_resource_name(cardA), cardA);
-  XBT_DEBUG("%s : %p", surf_resource_name(cardB), cardB);
+  XBT_DEBUG("%s : %p", surf_routing_edge_name(cardA), cardA);
+  XBT_DEBUG("%s : %p", surf_routing_edge_name(cardB), cardB);
 
   /* Let's do something on it */
-  surf_network_model->extension.network.communicate(cardA, cardB,
-                                                    150.0, -1.0);
+  surf_network_model_communicate(surf_network_model, cardA, cardB, 150.0, -1.0);
 
   surf_solve(-1.0);                 /* Takes traces into account. Returns 0.0 */
   do {
@@ -101,31 +100,29 @@ void test(char *platform)
     XBT_DEBUG("Next Event : %g", now);
     XBT_DEBUG("\t CPU actions");
     while ((action =
-            xbt_swag_extract(surf_cpu_model->states.failed_action_set))) {
+            surf_model_extract_failed_action_set((surf_model_t)surf_cpu_model_pm))) {
       XBT_DEBUG("\t * Failed : %p", action);
-      action->model_type->action_unref(action);
+      surf_action_unref(action);
     }
     while ((action =
-            xbt_swag_extract(surf_cpu_model->states.done_action_set))) {
+            surf_model_extract_done_action_set((surf_model_t)surf_cpu_model_pm))) {
       XBT_DEBUG("\t * Done : %p", action);
-      action->model_type->action_unref(action);
+      surf_action_unref(action);
     }
     XBT_DEBUG("\t Network actions");
     while ((action =
-            xbt_swag_extract(surf_network_model->states.
-                             failed_action_set))) {
+            surf_model_extract_failed_action_set((surf_model_t)surf_network_model))) {
       XBT_DEBUG("\t * Failed : %p", action);
-      action->model_type->action_unref(action);
+      surf_action_unref(action);
     }
     while ((action =
-            xbt_swag_extract(surf_network_model->states.
-                             done_action_set))) {
+            surf_model_extract_done_action_set((surf_model_t)surf_network_model))) {
       XBT_DEBUG("\t * Done : %p", action);
-      action->model_type->action_unref(action);
+      surf_action_unref(action);
     }
 
-  } while ((xbt_swag_size(surf_network_model->states.running_action_set) ||
-            xbt_swag_size(surf_cpu_model->states.running_action_set)) &&
+  } while ((surf_model_running_action_set_size((surf_model_t)surf_network_model) ||
+            surf_model_running_action_set_size((surf_model_t)surf_cpu_model_pm)) &&
            surf_solve(-1.0) >= 0.0);
 
   XBT_DEBUG("Simulation Terminated");
index 896f959..2e633a9 100644 (file)
@@ -1,10 +1,11 @@
 /* A few basic tests for the surf library                                   */
 
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. 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
@@ -62,12 +63,11 @@ void test(char *platform)
   XBT_DEBUG("%s : %p", surf_resource_name(workstationB), workstationB);
 
   /* Let's do something on it */
-  surf_workstation_model->extension.workstation.execute(workstationA, 1000.0);
-  surf_workstation_model->extension.workstation.execute(workstationB, 1000.0);
-      surf_workstation_model->extension.workstation.sleep(workstationB, 7.32);
+  surf_workstation_execute(workstationA, 1000.0);
+  surf_workstation_execute(workstationB, 1000.0);
+  surf_workstation_sleep(workstationB, 7.32);
 
-  surf_workstation_model->extension.workstation.
-      communicate(workstationA, workstationB, 150.0, -1.0);
+  surf_workstation_model_communicate(surf_workstation_model, workstationA, workstationB, 150.0, -1.0);
 
   surf_solve(-1.0);                 /* Takes traces into account. Returns 0.0 */
   do {
@@ -80,17 +80,17 @@ void test(char *platform)
     XBT_DEBUG("Next Event : %g", now);
 
     xbt_dynar_foreach(model_list, iter, model) {
-      XBT_DEBUG("\t %s actions", model->name);
-      while ((action = xbt_swag_extract(model->states.failed_action_set))) {
+      XBT_DEBUG("\t %s actions", surf_model_name(model));
+      while ((action = surf_model_extract_failed_action_set((surf_model_t)model))) {
         XBT_DEBUG("\t * Failed : %p", action);
-        model->action_unref(action);
+        surf_action_unref(action);
       }
-      while ((action = xbt_swag_extract(model->states.done_action_set))) {
+      while ((action = surf_model_extract_done_action_set((surf_model_t)model))) {
         XBT_DEBUG("\t * Done : %p", action);
-        model->action_unref(action);
+        surf_action_unref(action);
       }
-      if (xbt_swag_size(model->states.running_action_set)) {
-        XBT_DEBUG("running %s", model->name);
+      if (surf_model_running_action_set_size((surf_model_t)model)) {
+        XBT_DEBUG("running %s", surf_model_name(model));
         running = 1;
       }
     }
index b41a667..d56c0d7 100644 (file)
@@ -1,10 +1,11 @@
 /* A few tests for the trace library                                       */
 
-/* Copyright (c) 2004-2006, 2009-2012. The SimGrid Team.
+/* Copyright (c) 2004-2006, 2009-2014. 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
index 965c1e5..5a23fbe 100644 (file)
@@ -1,10 +1,11 @@
 /* A few basic tests for the graphxml library                               */
 
-/* Copyright (c) 2006-2013. The SimGrid Team.
+/* Copyright (c) 2006-2014. 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
index 5cca0cb..a6d9157 100644 (file)
@@ -1,6 +1,6 @@
 /* A few tests for the xbt_heap module                                      */
 
-/* Copyright (c) 2004-2010, 2012, 2013. The SimGrid Team.
+/* Copyright (c) 2004-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 0f32252..e5b41e1 100644 (file)
@@ -1,6 +1,6 @@
 /* log_usage - A test of normal usage of the log facilities                 */
 
-/* Copyright (c) 2004-2007, 2009-2013. The SimGrid Team.
+/* Copyright (c) 2004-2007, 2009-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index e95d77d..e6558bc 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2012-2014. 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 <xbt/dynar.h>
index c346409..b3c5671 100755 (executable)
@@ -1,5 +1,11 @@
 #!/usr/bin/perl
 
+# Copyright (c) 2005, 2007, 2010, 2014. 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.
+
 $col_white    = "\033[00m";
 $col_black    = "\033[30m";
 $col_red      = "\033[31m";
index 712b363..cd23d39 100755 (executable)
@@ -1,4 +1,11 @@
 #!/usr/bin/perl -w
+
+# Copyright (c) 2006-2007, 2014. 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.
+
 use strict;
 #use Data::Dumper;
 use XFig;
index 92092ea..963a4a3 100755 (executable)
@@ -1,5 +1,11 @@
 #!/bin/bash
 
+# Copyright (c) 2013-2014. 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.
+
 set -e
 
 if [ "$1" = "-batch" ]; then
@@ -12,7 +18,7 @@ else
 fi
 
 if [ $# -lt 1 -o $# -gt 3 ]; then
-    cat <<EOF
+    cat >&2 <<EOF
 Usage: $0 [-batch] archive.tar.gz [git_url [git_reference]]
 EOF
     exit 1
@@ -20,7 +26,7 @@ fi
 
 archive=$1
 if [ ! -r "$archive" ]; then
-    printf 'File not found: %s\n' "$archive"
+    printf 'File not found: %s\n' "$archive" >&2
     exit 1
 fi
 
@@ -49,7 +55,7 @@ case "$myname" in
 esac
 
 if [ ! -r "$exclude" ]; then
-    printf 'File not found: %s\n' "$exclude"
+    printf 'File not found: %s\n' "$exclude" >&2
     exit 1
 fi
 
index 6112c8f..8baa979 100644 (file)
@@ -5,6 +5,7 @@
 # lines beginning with '+ ' are expected in git only
 # each line is an extended regexp that should match full file names
 
+- \.gitversion
 - Makefile
 - doc/html/.*
 
@@ -12,6 +13,7 @@
 + \.cproject
 + \.gitignore
 + \.project
++ COPYRIGHT.template
 + README\.(coding|git)
 + mk_win-dist.sh
 
@@ -43,5 +45,8 @@
 
 + tools/check_dist_archive
 + tools/check_dist_archive\.exclude
++ tools/generate-multi-jar\.py
++ tools/normalize-pointers\.py
++ tools/update_copyright_header
 
 + tools/spell/.*
index 281e6eb..b5b7d82 100755 (executable)
@@ -1,5 +1,11 @@
 #! /usr/bin/perl
 
+# Copyright (c) 2010, 2014. 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.
+
 use strict;
 
 my $print = 0;
index 858e611..f9f58d2 100755 (executable)
@@ -1,5 +1,11 @@
 #!/usr/bin/perl -w
 
+# Copyright (c) 2005, 2012-2014. 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.
+
 ($#ARGV >= 1) or die "Usage: index_create.pl <input-tag-file> <output-doc-file>";
 
 my($type) = "";
index 8544ab9..d9a85f5 100755 (executable)
@@ -1,5 +1,11 @@
 #!/usr/bin/perl
 
+# Copyright (c) 2008, 2010, 2012-2014. 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.
+
 use strict;
 use warnings;
 
@@ -86,7 +92,7 @@ sub parse_file {
 }
 # Retrieve all the file names, and add their content to $data
 my $data;
-open FILES, "find ../src/ ../tools/ ../include/ -name '*.c'|" || die "Cannot search for the source file names: $!\n";
+open FILES, "find ../src/ ../tools/ ../include/ -name '*.c' -o -name '*.cpp' |" || die "Cannot search for the source file names: $!\n";
 while (my $file=<FILES>) {
     chomp $file;
     parse_file($file);         
index cb743ce..5305d78 100755 (executable)
@@ -1,5 +1,11 @@
 #!/bin/bash
 
+# Copyright (c) 2010, 2014. 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.
+
 if [ -z $1 ]
 then
   echo "Usage: $0 {X.trace}"
diff --git a/tools/generate-multi-jar.py b/tools/generate-multi-jar.py
new file mode 100755 (executable)
index 0000000..7bd1431
--- /dev/null
@@ -0,0 +1,71 @@
+#!/usr/bin/python
+
+# Copyright (c) 2013-2014. 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.
+
+"""
+Tool to generate the simgrid.jar
+"""
+import urllib2
+import zipfile
+import tempfile
+import os, sys, re
+
+dists = ['https://ci.inria.fr/simgrid/job/SimGrid-Multi/build_mode=Debug,label=%s/lastSuccessfulBuild/artifact/build/SimGrid-3.11/simgrid_full.jar'%dist
+         for dist in ["small-debian-32"
+                     ,"small-debian-64"
+                     ,"small-freebsd-64-clang"]]
+dists.append('https://ci.inria.fr/simgrid/job/Simgrid-Mult-Win7/build_mode=Debug,label=windows-64/lastSuccessfulBuild/artifact/build/simgrid_full.jar')
+
+class SimJar(object):
+  def __init__(self, filename='simgrid.jar'):
+       self.zipfile = zipfile.ZipFile(filename, 'w')
+       self.done = set()
+       self.git_version = None
+
+  def addJar(self, filename):
+    with zipfile.ZipFile(filename) as zf:
+      platform = None
+      arch = None
+      git_version = None
+      for z in zf.infolist():
+       path = filter(None, z.filename.split('/'))
+       if len(path)==3 and path[0] == 'NATIVE':
+         platform, arch = path[1:3]
+       elif z.filename=='META-INF/MANIFEST.MF':
+          zf.read('META-INF/MANIFEST.MF')      
+          git_version = re.findall(r"Implementation-Version: \"(.*?)\"", zf.read('META-INF/MANIFEST.MF'))
+      
+      assert platform is not None and git_version is not None, "Jar file not valid"
+      print "Adding: %s %s"%(platform, arch)
+      if self.git_version is None:
+       self.git_version = git_version
+      elif self.git_version != git_version:
+       print "WARNING: Assembling jar of various commits (%s vs %s)"%(self.git_version, git_version)
+      
+      for info in zf.infolist():
+        if info.filename not in self.done:
+          self.done.add(info.filename)
+          self.zipfile.writestr(info, zf.read(info.filename))
+
+  def addByUrl(self, url):
+    data = urllib2.urlopen(url)
+    f = tempfile.NamedTemporaryFile(delete=False)
+    f.write(data.read())
+    f.close()
+    self.addJar(f.name)
+    os.unlink(f.name)
+
+  def close(self):
+       self.zipfile.close()
+
+if __name__=="__main__":
+  jar = SimJar()
+  for dist in dists:
+       jar.addByUrl(dist)
+  for a in sys.argv[1:]:
+       jar.addJar(a)
+  jar.close()
index a035d51..5020589 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2012. The SimGrid Team.
+/* Copyright (c) 2008-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 8e37750..f9f914a 100755 (executable)
@@ -1,5 +1,11 @@
 #!/bin/bash
 
+# Copyright (c) 2011, 2014. 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.
+
 declare -a OPTIONS
 OPTIONS=(
     -kr         # Use Kernighan & Ritchie coding style. 
diff --git a/tools/normalize-pointers.py b/tools/normalize-pointers.py
new file mode 100755 (executable)
index 0000000..04049fa
--- /dev/null
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+
+# Copyright (c) 2013-2014. 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.
+
+"""
+Tool for normalizing pointers such as two runs have the same 'addresses'
+
+first address encountered will be replaced by 0X0000001, second by 0X0000002, ...
+
+"""
+
+import sys, re
+
+if len(sys.argv)!=2:
+  print "Usage ./normalize-pointers.py <filename>"
+  sys.exit(1)
+
+f = open(sys.argv[1])
+t = f.read()
+f.close()
+
+r = re.compile(r"0x[0-9a-f]+")
+s = r.search(t)
+offset = 0
+pointers = {}
+while (s):
+  if s.group() not in pointers:
+    pointers[s.group()] = "0X%07d"%len(pointers)
+  print t[offset:s.start()],
+  print pointers[s.group()],
+  offset = s.end()
+  s = r.search(t, offset)
+
+print t[offset:]
+
+
+
+
index cddfeaa..948ddbb 100755 (executable)
@@ -1,6 +1,12 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
+# Copyright (c) 2013-2014. 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.
+
 import sys, re
 from lxml import etree
 
index 66ef7d7..08182c7 100755 (executable)
@@ -1,5 +1,11 @@
 #! /usr/bin/perl
 
+# Copyright (c) 2005-2012, 2014. 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.
+
 use strict;
 
 use strict;
index 5b53594..3976f66 100644 (file)
@@ -1,6 +1,12 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
+# Copyright (c) 2013-2014. 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.
+
 # grep -ohrI 'bw=".*"' . | sort | uniq
 
 import sys, fnmatch, os
index 27bab27..dbbae62 100644 (file)
    fun:__libc_dlopen_mode
 }
 
+# Another problem in glibc, where makecontext does not reset the EBP register,
+# and backtrace goes too far when walking up the stack frames
+{
+   Invalid read in backtrace, called after makecontext
+   Memcheck:Addr4
+   fun:backtrace
+   ...
+   fun:makecontext
+}
+
 # Memory leaks appearing to be in libcgraph.  They can be seen with the
 # following simple program:
 # ,----
index 22bf4b3..7ec9879 100755 (executable)
@@ -5,12 +5,11 @@ eval 'exec perl -S $0 ${1+"$@"}'
 # This script updates the simgrid XML file passed as argument (modification in place)
 # It is built to do the conversion incrementally.
 
-# Copyright (c) 2006-2012. The SimGrid Team.
+# Copyright (c) 2006-2014. The SimGrid Team.
 # All rights reserved.
 #
-# This file is part of the SimGrid project. This is free software:
-# You can redistribute and/or modify it under the terms of the
-# GNU LGPL (v2.1) licence.
+# 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.
 
 =encoding UTF-8
 
@@ -96,7 +95,7 @@ Several tags were renamed (for sake of XML sanity):
   
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2006-2012. The SimGrid Team. All rights reserved.
+Copyright (c) 2006-2014. The SimGrid Team. All rights reserved.
   
 This program is free software; you may redistribute it and/or modify it
 under the terms of GNU LGPL (v2.1) license.
index ef09839..e409eef 100644 (file)
@@ -1,5 +1,11 @@
 #!/bin/perl
 
+# Copyright (c) 2013-2014. 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 comment spell checker
 # For each given source file, print the filename, a colon, and the number
 # of misspelled words, then a list of misspelled words.
index 2532575..b9d11b8 100644 (file)
@@ -1,5 +1,11 @@
 #!/bin/perl
 
+# Copyright (c) 2013-2014. 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 noncomment spell checker
 # For each given source file, print the filename, a colon, and the number
 # of misspelled words, then a list of misspelled words.
index bbb97a5..c87cff1 100644 (file)
@@ -2558,8 +2558,6 @@ memset
 Memset
 memuse
 ment
-mergesort
-MERGESORT
 merr
 messageSize
 messageSizes
@@ -3442,7 +3440,6 @@ printTasks
 prio
 prioritarily
 PriorityClass
-PRIu
 priv
 PRN
 PRNG
index 406d634..ef73afd 100644 (file)
@@ -1 +1,9 @@
-(find ./ -name '*.[ch]' | xargs perl tools/spell/lspell2.pl tools/spell/sg_stopwords.txt ; find ./ -name '*.[ch]' | xargs perl tools/spell/lspell.pl tools/spell/sg_stopwords.txt ) | grep -v ':' | sort -f | uniq 
\ No newline at end of file
+#!/bin/sh
+
+# Copyright (c) 2013-2014. 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.
+
+(find ./ -name '*.[ch]' | xargs perl tools/spell/lspell2.pl tools/spell/sg_stopwords.txt ; find ./ -name '*.[ch]' | xargs perl tools/spell/lspell.pl tools/spell/sg_stopwords.txt ) | grep -v ':' | sort -f | uniq
index 045ff68..9cc8d18 100755 (executable)
@@ -1,4 +1,11 @@
 #!/usr/bin/perl -w
+
+# Copyright (c) 2010, 2014. 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.
+
 use Term::ANSIColor qw{:constants};
 $Term::ANSIColor::AUTORESET = 1;
 
index 5768cf9..6f046df 100644 (file)
@@ -1,6 +1,6 @@
 /* run_context -- stuff in which TESH runs a command                        */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index 5a12029..1915e7f 100644 (file)
@@ -1,6 +1,6 @@
 /* run_context -- stuff in which TESH runs a command                        */
 
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index adb9ee1..a43da9b 100644 (file)
@@ -1,6 +1,6 @@
 /* signal -- what TESH needs to know about signals                          */
 
-/* Copyright (c) 2007-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index d5d7283..817110f 100644 (file)
@@ -105,7 +105,7 @@ 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 formatting argument:
-   -log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n
+   --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:
  (1) tesh is effective (no false positive, no false negative)
index 7f75229..e05fd5e 100644 (file)
@@ -1,6 +1,6 @@
 /* TESH (Test Shell) -- mini shell specialized in running test units        */
 
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
index e7f5627..cd9236d 100644 (file)
@@ -1,6 +1,6 @@
 /* TESH (Test Shell) -- mini shell specialized in running test units        */
 
-/* Copyright (c) 2007-2011. The SimGrid Team.
+/* Copyright (c) 2007-2011, 2013-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
diff --git a/tools/update_copyright_header b/tools/update_copyright_header
new file mode 100755 (executable)
index 0000000..36c11af
--- /dev/null
@@ -0,0 +1,139 @@
+#!/bin/bash
+
+# Copyright (c) 2014. 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.
+
+if [ "$1" = "-t" ]; then
+    template=$2
+    shift 2
+else
+    template=$(git rev-parse --show-toplevel)/COPYRIGHT.template
+fi
+
+if [ $# -eq 0 ]; then
+    cat >&2 <<EOF
+Usage: $0 [-t COPYRIGHT.template] files...
+EOF
+    exit 1
+fi
+
+if [ ! -r "$template" ]; then
+    printf 'File not found: %s\n' "$template" >&2
+    exit 1
+fi
+
+printf 'Using template: %s\n' "$template"
+
+now=$(date +%Y)
+
+get_dates() {
+    local file=$1
+    local date
+    sed -n '/Copyright.*SimGrid/{
+              s/.*(c) \([[:digit:], -]*\).*/\1/
+              s/[, ]\+/\n/g
+              p
+            }' "$file" \
+    | while read date; do
+        case "$date" in
+            "")
+                ;;
+            *-*)
+                seq ${date/-/ }
+                ;;
+            *)
+                echo $date
+                ;;
+        esac
+    done
+    git log --format=%ad "$file" | cut -d\  -f5 | uniq
+    echo $now
+}
+
+format_dates() {
+    local first
+    local last
+    local next
+    read first
+    last=$first
+    while read next; do
+        if [ $next -eq $((last + 1)) ]; then
+            last=$next
+        else
+            if [ $first -eq $last ]; then
+                printf '%d, ' $first
+            else
+                printf '%d-%d, ' $first $last
+            fi
+            first=$next
+            last=$first
+        fi
+    done
+    if [ $first -eq $last ]; then
+        printf '%d\n' $first
+    else
+        printf '%d-%d\n' $first $last
+    fi
+}
+
+tmp_head=$(mktemp)
+tmp_copy=$(mktemp)
+tmp_foot=$(mktemp)
+trap "rm -f \"$tmp_head\" \"$tmp_copy\" \"$tmp_foot\"" EXIT
+
+for file; do
+    echo "########## $file ##########"
+
+    if [ ! -f "$file" ]; then
+        echo "!!! skip"
+        continue
+    fi
+
+    if head -n 1 "$file" | grep -q '^#!'; then
+        script=1
+    else
+        script=0
+    fi
+
+    ### 1. create new template
+    dates=$(get_dates "$file" | sort -u | format_dates)
+    sed "s/(c) [[:digit:], -]*\./(c) $dates./" "$template" > "$tmp_copy"
+    printf '\n' >> "$tmp_copy"
+
+    # fix comments for scripts
+    if [ $script = 1 ]; then
+        sed -i 's!^..!#!;s! *\*/!!' "$tmp_copy"
+    fi
+
+    ### 2. copy file body
+    if grep -q 'Copyright.*SimGrid' "$file"; then
+        sed '/Copyright.*SimGrid/,$d' "$file" > "$tmp_head"
+        sed -i '${\!^/\* *$!d}' "$tmp_head"
+        sed '1,/the terms of the license/d' "$file" > "$tmp_foot"
+    elif [ $script = 1 ]; then
+        head -n 1 "$file" > "$tmp_head"
+        tail -n +2  "$file" > "$tmp_foot"
+        printf '\n' >> "$tmp_head"
+    else
+        :> "$tmp_head"
+        cp "$file" "$tmp_foot"
+    fi
+    sed -i '1{\!^ *\*/!d};/[^[:space:]]/,$!d' "$tmp_foot"
+
+    ### 3. concatenate new template and file body into $file
+#    cat "$tmp_head"
+#    cat "$tmp_copy"
+#    cat "$tmp_foot"
+    cat "$tmp_head" "$tmp_copy" "$tmp_foot" > $file
+done
+
+cat <<EOF
+
+All files processed.
+
+*** DO NOT FORGET TO DOUBLE CHECK CHANGES BEFORE DOING ANY COMMIT! ***
+
+EOF