From: Gabriel Corona Date: Thu, 6 Mar 2014 12:29:59 +0000 (+0100) Subject: Merge branch 'mc' into mc++ X-Git-Tag: v3_11~199^2~2^2~19 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/49e85177c669d793e84242983a1b1f430e47184e?hp=d317aaf1effb4c9cea4701cf83e0946fd0828b89 Merge branch 'mc' into mc++ --- diff --git a/.cproject b/.cproject index 2d167a86b9..12679b9f81 100644 --- a/.cproject +++ b/.cproject @@ -1,101 +1,23 @@ - - - + - - - - + + + + - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/.gitignore b/.gitignore index dbcfa12dc4..1dfeaafd7f 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/.project b/.project index d935a7abe1..a3b80ff503 100644 --- a/.project +++ b/.project @@ -1,91 +1,27 @@ - simgrid - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.rubypeople.rdt.core.rubybuilder - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.core.cnature - org.rubypeople.rdt.core.rubynature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - org.eclipse.jdt.core.javanature - + simgrid + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + diff --git a/CMakeLists.txt b/CMakeLists.txt index 747d9fc12c..cfae0bbc05 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 d8bb07bdc4..6ff568f900 100644 --- 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 index 0000000000..29aeb32054 --- /dev/null +++ b/COPYRIGHT.template @@ -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. */ diff --git a/ChangeLog b/ChangeLog index 0b9ae9e53d..4df2e784a3 100644 --- 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 (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 + -- Sun Nov 17 00:26:44 CET 2013 Da SimGrid team SimGrid (3.9) stable; urgency=low diff --git a/NEWS b/NEWS index d6013094c4..716b19f325 100644 --- 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: diff --git a/README.coding b/README.coding index 35c9a55726..c78b39b68c 100644 --- a/README.coding +++ b/README.coding @@ -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 . + 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 diff --git a/buildtools/Cmake/AddTests.cmake b/buildtools/Cmake/AddTests.cmake index ee959c333c..9d5814c4e3 100644 --- a/buildtools/Cmake/AddTests.cmake +++ b/buildtools/Cmake/AddTests.cmake @@ -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) diff --git a/buildtools/Cmake/CTestConfig.cmake b/buildtools/Cmake/CTestConfig.cmake index e51e466323..7c961b1882 100644 --- a/buildtools/Cmake/CTestConfig.cmake +++ b/buildtools/Cmake/CTestConfig.cmake @@ -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() diff --git a/buildtools/Cmake/CompleteInFiles.cmake b/buildtools/Cmake/CompleteInFiles.cmake index 16f8dbaa0c..98cc4617c8 100644 --- a/buildtools/Cmake/CompleteInFiles.cmake +++ b/buildtools/Cmake/CompleteInFiles.cmake @@ -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}") diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index 41b6fab0b5..622d35ff12 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -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 diff --git a/buildtools/Cmake/Distrib.cmake b/buildtools/Cmake/Distrib.cmake index 775512ce86..74b539b171 100644 --- a/buildtools/Cmake/Distrib.cmake +++ b/buildtools/Cmake/Distrib.cmake @@ -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) diff --git a/buildtools/Cmake/Flags.cmake b/buildtools/Cmake/Flags.cmake index 058ea2d979..eb9d3f4d31 100644 --- a/buildtools/Cmake/Flags.cmake +++ b/buildtools/Cmake/Flags.cmake @@ -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}") diff --git a/buildtools/Cmake/GenerateDoc.cmake b/buildtools/Cmake/GenerateDoc.cmake index 9ccde43cc1..0ef519a377 100644 --- a/buildtools/Cmake/GenerateDoc.cmake +++ b/buildtools/Cmake/GenerateDoc.cmake @@ -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}" ) diff --git a/buildtools/Cmake/MaintainerMode.cmake b/buildtools/Cmake/MaintainerMode.cmake index d5fdcad836..cd899125b0 100644 --- a/buildtools/Cmake/MaintainerMode.cmake +++ b/buildtools/Cmake/MaintainerMode.cmake @@ -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) diff --git a/buildtools/Cmake/MakeExe.cmake b/buildtools/Cmake/MakeExe.cmake index 4c6d9d2b06..c854fb5580 100644 --- a/buildtools/Cmake/MakeExe.cmake +++ b/buildtools/Cmake/MakeExe.cmake @@ -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) diff --git a/buildtools/Cmake/MakeJava.cmake b/buildtools/Cmake/MakeJava.cmake index f7c69b4846..f1c43dedbf 100644 --- a/buildtools/Cmake/MakeJava.cmake +++ b/buildtools/Cmake/MakeJava.cmake @@ -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 ) diff --git a/buildtools/Cmake/MakeLib.cmake b/buildtools/Cmake/MakeLib.cmake index 2f81c23c40..25fdfad4b9 100644 --- a/buildtools/Cmake/MakeLib.cmake +++ b/buildtools/Cmake/MakeLib.cmake @@ -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() diff --git a/buildtools/Cmake/MakeLibWin.cmake b/buildtools/Cmake/MakeLibWin.cmake index f596b1f901..3699a3a35f 100644 --- a/buildtools/Cmake/MakeLibWin.cmake +++ b/buildtools/Cmake/MakeLibWin.cmake @@ -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() diff --git a/buildtools/Cmake/Modules/FindF2c.cmake b/buildtools/Cmake/Modules/FindF2c.cmake index 611e7655d0..4d22501fa4 100644 --- a/buildtools/Cmake/Modules/FindF2c.cmake +++ b/buildtools/Cmake/Modules/FindF2c.cmake @@ -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 index 0000000000..2d2aa030af --- /dev/null +++ b/buildtools/Cmake/Modules/FindLibSigc++.cmake @@ -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) diff --git a/buildtools/Cmake/Modules/FindNS3.cmake b/buildtools/Cmake/Modules/FindNS3.cmake index 04e568c836..2e0afbd126 100644 --- a/buildtools/Cmake/Modules/FindNS3.cmake +++ b/buildtools/Cmake/Modules/FindNS3.cmake @@ -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() diff --git a/buildtools/Cmake/Option.cmake b/buildtools/Cmake/Option.cmake index f9f4d28020..1c56b6eba5 100644 --- a/buildtools/Cmake/Option.cmake +++ b/buildtools/Cmake/Option.cmake @@ -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) diff --git a/buildtools/Cmake/PrintArgs.cmake b/buildtools/Cmake/PrintArgs.cmake index 054222c664..09c6b3df0a 100644 --- a/buildtools/Cmake/PrintArgs.cmake +++ b/buildtools/Cmake/PrintArgs.cmake @@ -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}") diff --git a/buildtools/Cmake/Scripts/generate_memcheck_tests.pl b/buildtools/Cmake/Scripts/generate_memcheck_tests.pl index df0880674f..85dd3497e1 100755 --- a/buildtools/Cmake/Scripts/generate_memcheck_tests.pl +++ b/buildtools/Cmake/Scripts/generate_memcheck_tests.pl @@ -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/generate_new_tests.pl b/buildtools/Cmake/Scripts/generate_new_tests.pl index aa2245e9bd..e3c807cd9b 100755 --- a/buildtools/Cmake/Scripts/generate_new_tests.pl +++ b/buildtools/Cmake/Scripts/generate_new_tests.pl @@ -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 index 0000000000..1c232b82a0 --- /dev/null +++ b/buildtools/Cmake/Scripts/java_bundle.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +set -e +#set -x + +if [ $# -lt 3 ]; then + cat >&2 <&2 <&2 <.\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 diff --git a/buildtools/Cmake/src/internal_config.h.in b/buildtools/Cmake/src/internal_config.h.in index 3e988d10ec..bd406de4e9 100644 --- a/buildtools/Cmake/src/internal_config.h.in +++ b/buildtools/Cmake/src/internal_config.h.in @@ -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 @@ -58,12 +57,12 @@ #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@ @@ -127,8 +126,8 @@ /* Define to 1 if you have the 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@ diff --git a/buildtools/Cmake/test_prog/prog_AC_CHECK_MCSC.c b/buildtools/Cmake/test_prog/prog_AC_CHECK_MCSC.c index 59d5289ab1..a20e1bdb14 100644 --- a/buildtools/Cmake/test_prog/prog_AC_CHECK_MCSC.c +++ b/buildtools/Cmake/test_prog/prog_AC_CHECK_MCSC.c @@ -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 diff --git a/buildtools/Cmake/test_prog/prog_gnu_dynlinker.c b/buildtools/Cmake/test_prog/prog_gnu_dynlinker.c index fde4577155..6187f9ed9b 100644 --- a/buildtools/Cmake/test_prog/prog_gnu_dynlinker.c +++ b/buildtools/Cmake/test_prog/prog_gnu_dynlinker.c @@ -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 diff --git a/buildtools/Cmake/test_prog/prog_gtnets.cpp b/buildtools/Cmake/test_prog/prog_gtnets.cpp index 7c68bea39f..4391b466e5 100644 --- a/buildtools/Cmake/test_prog/prog_gtnets.cpp +++ b/buildtools/Cmake/test_prog/prog_gtnets.cpp @@ -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 int main(){ diff --git a/buildtools/Cmake/test_prog/prog_mutex_timedlock.c b/buildtools/Cmake/test_prog/prog_mutex_timedlock.c index cb9d0703bf..60dd8fecfa 100644 --- a/buildtools/Cmake/test_prog/prog_mutex_timedlock.c +++ b/buildtools/Cmake/test_prog/prog_mutex_timedlock.c @@ -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 diff --git a/buildtools/Cmake/test_prog/prog_printf_null.c b/buildtools/Cmake/test_prog/prog_printf_null.c index 00277d405a..10eb15e386 100644 --- a/buildtools/Cmake/test_prog/prog_printf_null.c +++ b/buildtools/Cmake/test_prog/prog_printf_null.c @@ -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 diff --git a/buildtools/Cmake/test_prog/prog_sem_init.c b/buildtools/Cmake/test_prog/prog_sem_init.c index 01d3ff3ed1..43540a0d12 100644 --- a/buildtools/Cmake/test_prog/prog_sem_init.c +++ b/buildtools/Cmake/test_prog/prog_sem_init.c @@ -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 diff --git a/buildtools/Cmake/test_prog/prog_sem_open.c b/buildtools/Cmake/test_prog/prog_sem_open.c index be4a92d607..56a2c4b916 100644 --- a/buildtools/Cmake/test_prog/prog_sem_open.c +++ b/buildtools/Cmake/test_prog/prog_sem_open.c @@ -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 diff --git a/buildtools/Cmake/test_prog/prog_sem_timedwait.c b/buildtools/Cmake/test_prog/prog_sem_timedwait.c index 994d9ad818..c6a94a8a61 100644 --- a/buildtools/Cmake/test_prog/prog_sem_timedwait.c +++ b/buildtools/Cmake/test_prog/prog_sem_timedwait.c @@ -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 diff --git a/buildtools/Cmake/test_prog/prog_snprintf.c b/buildtools/Cmake/test_prog/prog_snprintf.c index 60f24037b3..1e336892c4 100644 --- a/buildtools/Cmake/test_prog/prog_snprintf.c +++ b/buildtools/Cmake/test_prog/prog_snprintf.c @@ -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 diff --git a/buildtools/Cmake/test_prog/prog_stackgrowth.c b/buildtools/Cmake/test_prog/prog_stackgrowth.c index f0f2f1a4ac..81aff74b3a 100644 --- a/buildtools/Cmake/test_prog/prog_stackgrowth.c +++ b/buildtools/Cmake/test_prog/prog_stackgrowth.c @@ -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 diff --git a/buildtools/Cmake/test_prog/prog_stacksetup.c b/buildtools/Cmake/test_prog/prog_stacksetup.c index 66dcba0157..35f08bccb0 100644 --- a/buildtools/Cmake/test_prog/prog_stacksetup.c +++ b/buildtools/Cmake/test_prog/prog_stacksetup.c @@ -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 diff --git a/buildtools/Cmake/test_prog/prog_thread_storage.c b/buildtools/Cmake/test_prog/prog_thread_storage.c index 732a000445..86d2940db7 100644 --- a/buildtools/Cmake/test_prog/prog_thread_storage.c +++ b/buildtools/Cmake/test_prog/prog_thread_storage.c @@ -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 diff --git a/buildtools/Cmake/test_prog/prog_vsnprintf.c b/buildtools/Cmake/test_prog/prog_vsnprintf.c index 26e1db922b..5a392e6489 100644 --- a/buildtools/Cmake/test_prog/prog_vsnprintf.c +++ b/buildtools/Cmake/test_prog/prog_vsnprintf.c @@ -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 diff --git a/buildtools/jenkins/run.sh b/buildtools/jenkins/run.sh index 52e6752fc9..1d1ad6c8a0 100755 --- a/buildtools/jenkins/run.sh +++ b/buildtools/jenkins/run.sh @@ -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" ] diff --git a/buildtools/pipol/rc.debian b/buildtools/pipol/rc.debian index 5fd8a96322..8a65effa15 100644 --- a/buildtools/pipol/rc.debian +++ b/buildtools/pipol/rc.debian @@ -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 diff --git a/buildtools/pipol/rc.fedora b/buildtools/pipol/rc.fedora index 35f9832a29..6dcc08b535 100644 --- a/buildtools/pipol/rc.fedora +++ b/buildtools/pipol/rc.fedora @@ -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 diff --git a/buildtools/pipol/rc.ubuntu b/buildtools/pipol/rc.ubuntu index cfd59e325d..b2b9d25a32 100644 --- a/buildtools/pipol/rc.ubuntu +++ b/buildtools/pipol/rc.ubuntu @@ -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 diff --git a/contrib/benchmarking_code_block/bench.h b/contrib/benchmarking_code_block/bench.h index fc86bc3db0..568a931168 100644 --- a/contrib/benchmarking_code_block/bench.h +++ b/contrib/benchmarking_code_block/bench.h @@ -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; } diff --git a/contrib/benchmarking_code_block/inject.h b/contrib/benchmarking_code_block/inject.h index ba23a6508e..f4d9fa2b1f 100644 --- a/contrib/benchmarking_code_block/inject.h +++ b/contrib/benchmarking_code_block/inject.h @@ -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 */ diff --git a/contrib/deployment_generation/generate_random_deployment.pl b/contrib/deployment_generation/generate_random_deployment.pl index ce58aaebcb..b160b3f4ec 100755 --- a/contrib/deployment_generation/generate_random_deployment.pl +++ b/contrib/deployment_generation/generate_random_deployment.pl @@ -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 { diff --git a/contrib/network_model/calibrate_piecewise.py b/contrib/network_model/calibrate_piecewise.py index f38169843a..8a54e84513 100755 --- a/contrib/network_model/calibrate_piecewise.py +++ b/contrib/network_model/calibrate_piecewise.py @@ -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 diff --git a/contrib/network_model/regress.py b/contrib/network_model/regress.py index 6bffd97faa..6df8e71784 100755 --- a/contrib/network_model/regress.py +++ b/contrib/network_model/regress.py @@ -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 diff --git a/contrib/network_model/regression2.py b/contrib/network_model/regression2.py index ea9e3a4564..f314d9e50e 100755 --- a/contrib/network_model/regression2.py +++ b/contrib/network_model/regression2.py @@ -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 diff --git a/contrib/network_model/smpi_calibration.c b/contrib/network_model/smpi_calibration.c index fd67750523..7c1abb6eaa 100644 --- a/contrib/network_model/smpi_calibration.c +++ b/contrib/network_model/smpi_calibration.c @@ -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. */ + /**--------- ------------- * produced by: * ./regression2.py ./pingpong-in.dat 0.15 30 2 2.4e-5 1.25e8 diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in index 104b4ee2dc..745392566f 100644 --- a/doc/Doxyfile.in +++ b/doc/Doxyfile.in @@ -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 diff --git a/doc/HelloWorld/HelloWorld.c b/doc/HelloWorld/HelloWorld.c index ae6a7fbcbf..72c6d04ad6 100644 --- a/doc/HelloWorld/HelloWorld.c +++ b/doc/HelloWorld/HelloWorld.c @@ -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 #include "xbt/log.h" XBT_LOG_NEW_DEFAULT_CATEGORY(HelloWorld, diff --git a/doc/doxygen/bindings.doc b/doc/doxygen/bindings.doc index 2ad4cd396d..1283603095 100644 --- a/doc/doxygen/bindings.doc +++ b/doc/doxygen/bindings.doc @@ -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 diff --git a/doc/doxygen/inside_extending.doc b/doc/doxygen/inside_extending.doc index f7c796b6f9..cf71bb1066 100644 --- a/doc/doxygen/inside_extending.doc +++ b/doc/doxygen/inside_extending.doc @@ -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 `` 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_(targ1 arg1, targ2 arg2, targ3 arg3){ - return simcall_BODY_(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 `` 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_, , WITH_ANSWER, TSPEC(result, tret), TSPEC(arg1, targ1), TSPEC(arg2, targ2), TSPEC(arg3, targ3)) sep \ -~~~~ +- ` simcall_()` + - `simcall_BODY_()` + - create the simcall + - `SIMIX_process_yield` if not maestro + - ========== KERNEL MODE ========== + - `SIMIX_simcall_pre` + - `SIMIX_pre_(simcall, )` + - `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_` 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_(smx_simcall_t simcall, targ1 arg1, targ2 arg2, targ3 arg3) { - SIMIX_(arg1, arg2, arg3); -} +Furthermode if the simcall_ or the SIMIX_pre_ function are missing, +a warning will show up with a prototype of the corresponding fonction to fill. -tret SIMIX_(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? diff --git a/doc/doxygen/install.doc b/doc/doxygen/install.doc index 8867f4c70f..63aebcf2ac 100644 --- a/doc/doxygen/install.doc +++ b/doc/doxygen/install.doc @@ -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 enable_supernovae (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 enable_compile_warnings (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 diff --git a/doc/doxygen/introduction.doc b/doc/doxygen/introduction.doc index e0915380fc..0851aff91b 100644 --- a/doc/doxygen/introduction.doc +++ b/doc/doxygen/introduction.doc @@ -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 diff --git a/doc/doxygen/module-msg.doc b/doc/doxygen/module-msg.doc index d652b971a7..b27ec73ce4 100644 --- a/doc/doxygen/module-msg.doc +++ b/doc/doxygen/module-msg.doc @@ -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 diff --git a/doc/doxygen/module-surf.doc b/doc/doxygen/module-surf.doc index a756aef6ae..7e3733f7ad 100644 --- a/doc/doxygen/module-surf.doc +++ b/doc/doxygen/module-surf.doc @@ -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 + */ @@ -16,20 +27,6 @@ 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 \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 \endhtmlonly -*/ - /** \defgroup SURF_build_api Create a new API \ingroup SURF_API \brief How to build a new API on top of SURF @@ -83,3 +80,91 @@ 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 @endhtmlonly +*/ + +/** +@defgroup SURF_routing_interface SURF Routing Interface +@ingroup SURF_API +@brief Describes the routing interface + +@htmlonly @endhtmlonly +*/ + +/** +@defgroup SURF_interface SURF Interface +@ingroup SURF_API +@brief Describes the general interface for all components (Cpu, Network, Storage, Workstation, WorkstationVM) + +@htmlonly @endhtmlonly +*/ + +/** +@defgroup SURF_cpu_interface SURF Cpu Interface +@ingroup SURF_API +@brief Describes the general Cpu interface for all Cpu implementations + +@htmlonly @endhtmlonly +*/ + +/** +@defgroup SURF_network_interface SURF Network Interface +@ingroup SURF_API +@brief Describes the general Network interface for all Network implementations + +@htmlonly @endhtmlonly +*/ + +/** +@defgroup SURF_storage_interface SURF Storage Interface +@ingroup SURF_API +@brief Describes the general interface for all Storage implementations + +@htmlonly @endhtmlonly +*/ + +/** +@defgroup SURF_workstation_interface SURF Workstation Interface +@ingroup SURF_API +@brief Describes the general interface for all Workstation implementations + +@htmlonly @endhtmlonly +*/ + +/** +@defgroup SURF_vm_workstation_interface SURF VM Workstation Interface +@ingroup SURF_API +@brief Describes the general interface for all VM Workstation implementations + +@htmlonly @endhtmlonly +*/ + +/** +@defgroup SURF_lmm SURF Linear MaxMin +@ingroup SURF_API +@brief Describes how the linear MaxMin system work + +@htmlonly @endhtmlonly +*/ + +/** +@defgroup SURF_callbacks SURF callbacks +@ingroup SURF_API +@brief Describes how to use the SURF callbacks + +@htmlonly @endhtmlonly +*/ + +/** +@defgroup SURF_plugin_energy SURF Energy Plugin +@ingroup SURF_API +@brief Describes how to use the energy plugin. + +@htmlonly @endhtmlonly +*/ \ No newline at end of file diff --git a/doc/doxygen/options.doc b/doc/doxygen/options.doc index 9f5fa98985..b9ab520108 100644 --- a/doc/doxygen/options.doc +++ b/doc/doxygen/options.doc @@ -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 \ 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 @@ -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. diff --git a/doc/doxygen/platform.doc b/doc/doxygen/platform.doc index 1101198e49..5c3ae9ea82 100644 --- a/doc/doxygen/platform.doc +++ b/doc/doxygen/platform.doc @@ -372,14 +372,17 @@ router_name = prefix + clusterId + router_ + suffix; cluster example \verbatim - - + + + \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 content: default value 0. The file containing the disk content. (may be moved soon or later to storage tag. -The tag must contains some predefined prop, as may do some other -resources tags. This should moved to attributes soon or later. -storage_type mandatory prop : +The tag must contains some predefined model prop, as may do some other +resources tags. +storage_type mandatory model_prop : \li Bwrite: value in B/s. Write throughput \li Bread: value in B/s. Read throughput \li Bconnexion: value in B/s. Connection throughput (i.e. the throughput of the storage connector). +A storage_type can also contain the prop 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 + + + + + + +\endverbatim + \subsubsection pf_sto_st storage storage_type attributes : diff --git a/doc/msg-tuto-src/masterworker0.c b/doc/msg-tuto-src/masterworker0.c index 0311b6e1d0..b283dc5285 100644 --- a/doc/msg-tuto-src/masterworker0.c +++ b/doc/msg-tuto-src/masterworker0.c @@ -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 diff --git a/doc/msg-tuto-src/masterworker1.c b/doc/msg-tuto-src/masterworker1.c index 8a7acff102..5b240e354a 100644 --- a/doc/msg-tuto-src/masterworker1.c +++ b/doc/msg-tuto-src/masterworker1.c @@ -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 diff --git a/doc/msg-tuto-src/masterworker2.c b/doc/msg-tuto-src/masterworker2.c index 98a5687e5f..aa038972b9 100644 --- a/doc/msg-tuto-src/masterworker2.c +++ b/doc/msg-tuto-src/masterworker2.c @@ -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 diff --git a/doc/msg-tuto-src/masterworker3.c b/doc/msg-tuto-src/masterworker3.c index a51c9a9d21..c2891d5d29 100644 --- a/doc/msg-tuto-src/masterworker3.c +++ b/doc/msg-tuto-src/masterworker3.c @@ -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 diff --git a/doc/msg-tuto-src/masterworker4.c b/doc/msg-tuto-src/masterworker4.c index 35755ccd12..1f4bb5073a 100644 --- a/doc/msg-tuto-src/masterworker4.c +++ b/doc/msg-tuto-src/masterworker4.c @@ -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 diff --git a/examples/java/async/AsyncTest.java b/examples/java/async/AsyncTest.java index 77777671bf..983fecd64a 100644 --- a/examples/java/async/AsyncTest.java +++ b/examples/java/async/AsyncTest.java @@ -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; diff --git a/examples/java/async/FinalizeTask.java b/examples/java/async/FinalizeTask.java index 9fa045ca65..1e7b43923e 100644 --- a/examples/java/async/FinalizeTask.java +++ b/examples/java/async/FinalizeTask.java @@ -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; diff --git a/examples/java/async/Forwarder.java b/examples/java/async/Forwarder.java index a4913a6d71..fbf394faf0 100644 --- a/examples/java/async/Forwarder.java +++ b/examples/java/async/Forwarder.java @@ -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; diff --git a/examples/java/async/Master.java b/examples/java/async/Master.java index e39f041972..4960b75645 100644 --- a/examples/java/async/Master.java +++ b/examples/java/async/Master.java @@ -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; diff --git a/examples/java/async/Slave.java b/examples/java/async/Slave.java index a4a651ff2a..1d4f5679cc 100644 --- a/examples/java/async/Slave.java +++ b/examples/java/async/Slave.java @@ -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; diff --git a/examples/java/async/async.tesh b/examples/java/async/async.tesh index 72c3ab7a84..1a1321d5fd 100644 --- a/examples/java/async/async.tesh +++ b/examples/java/async/async.tesh @@ -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. diff --git a/examples/java/bittorrent/Bittorrent.java b/examples/java/bittorrent/Bittorrent.java index 5685bd9a69..b488195123 100644 --- a/examples/java/bittorrent/Bittorrent.java +++ b/examples/java/bittorrent/Bittorrent.java @@ -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; diff --git a/examples/java/bittorrent/Common.java b/examples/java/bittorrent/Common.java index 7e78b5ab01..1fe856e3da 100644 --- a/examples/java/bittorrent/Common.java +++ b/examples/java/bittorrent/Common.java @@ -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 diff --git a/examples/java/bittorrent/Connection.java b/examples/java/bittorrent/Connection.java index 29a30110f2..4ca20fd2e2 100644 --- a/examples/java/bittorrent/Connection.java +++ b/examples/java/bittorrent/Connection.java @@ -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; diff --git a/examples/java/bittorrent/MessageTask.java b/examples/java/bittorrent/MessageTask.java index 88c04c7670..3c98d15eed 100644 --- a/examples/java/bittorrent/MessageTask.java +++ b/examples/java/bittorrent/MessageTask.java @@ -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; diff --git a/examples/java/bittorrent/Peer.java b/examples/java/bittorrent/Peer.java index f1f10c15d6..10fd6c55be 100644 --- a/examples/java/bittorrent/Peer.java +++ b/examples/java/bittorrent/Peer.java @@ -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; diff --git a/examples/java/bittorrent/Tracker.java b/examples/java/bittorrent/Tracker.java index 1a812b6771..338b763468 100644 --- a/examples/java/bittorrent/Tracker.java +++ b/examples/java/bittorrent/Tracker.java @@ -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; diff --git a/examples/java/bittorrent/TrackerTask.java b/examples/java/bittorrent/TrackerTask.java index 4b0664984d..beaf7b82f9 100644 --- a/examples/java/bittorrent/TrackerTask.java +++ b/examples/java/bittorrent/TrackerTask.java @@ -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; diff --git a/examples/java/bittorrent/generate.py b/examples/java/bittorrent/generate.py index 9ba8611257..d4ea09ee9e 100755 --- a/examples/java/bittorrent/generate.py +++ b/examples/java/bittorrent/generate.py @@ -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 diff --git a/examples/java/chord/Chord.java b/examples/java/chord/Chord.java index 36038a1699..2f3d7faea1 100644 --- a/examples/java/chord/Chord.java +++ b/examples/java/chord/Chord.java @@ -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; diff --git a/examples/java/chord/ChordTask.java b/examples/java/chord/ChordTask.java index aac5083ff1..b10940ca32 100644 --- a/examples/java/chord/ChordTask.java +++ b/examples/java/chord/ChordTask.java @@ -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; diff --git a/examples/java/chord/Common.java b/examples/java/chord/Common.java index 6531dc0de5..7031c23185 100644 --- a/examples/java/chord/Common.java +++ b/examples/java/chord/Common.java @@ -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 diff --git a/examples/java/chord/FindSuccessorAnswerTask.java b/examples/java/chord/FindSuccessorAnswerTask.java index f0d2c94e70..a740872bd2 100644 --- a/examples/java/chord/FindSuccessorAnswerTask.java +++ b/examples/java/chord/FindSuccessorAnswerTask.java @@ -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 { diff --git a/examples/java/chord/FindSuccessorTask.java b/examples/java/chord/FindSuccessorTask.java index 51c2310fc5..db770279f2 100644 --- a/examples/java/chord/FindSuccessorTask.java +++ b/examples/java/chord/FindSuccessorTask.java @@ -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 { diff --git a/examples/java/chord/GetPredecessorAnswerTask.java b/examples/java/chord/GetPredecessorAnswerTask.java index 3c58bc149e..ac1b1426d3 100644 --- a/examples/java/chord/GetPredecessorAnswerTask.java +++ b/examples/java/chord/GetPredecessorAnswerTask.java @@ -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 { diff --git a/examples/java/chord/GetPredecessorTask.java b/examples/java/chord/GetPredecessorTask.java index a3b0c0c98e..38fecabccc 100644 --- a/examples/java/chord/GetPredecessorTask.java +++ b/examples/java/chord/GetPredecessorTask.java @@ -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 { diff --git a/examples/java/chord/Node.java b/examples/java/chord/Node.java index 64db0e5004..27cb63a522 100644 --- a/examples/java/chord/Node.java +++ b/examples/java/chord/Node.java @@ -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; diff --git a/examples/java/chord/NotifyTask.java b/examples/java/chord/NotifyTask.java index 84094ca949..b36c4caf6d 100644 --- a/examples/java/chord/NotifyTask.java +++ b/examples/java/chord/NotifyTask.java @@ -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 { diff --git a/examples/java/cloud/Cloud.java b/examples/java/cloud/Cloud.java index 3e6446008c..9848bc3e8d 100644 --- a/examples/java/cloud/Cloud.java +++ b/examples/java/cloud/Cloud.java @@ -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 +} diff --git a/examples/java/cloud/FinalizeTask.java b/examples/java/cloud/FinalizeTask.java index ffaf4b92ee..b710b2fa54 100644 --- a/examples/java/cloud/FinalizeTask.java +++ b/examples/java/cloud/FinalizeTask.java @@ -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; diff --git a/examples/java/cloud/Master.java b/examples/java/cloud/Master.java index 8710bfb916..57806fdc89 100644 --- a/examples/java/cloud/Master.java +++ b/examples/java/cloud/Master.java @@ -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 vms = new ArrayList(); + // 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); } } } diff --git a/examples/java/cloud/Slave.java b/examples/java/cloud/Slave.java index 4d9963e251..7aaa48e10f 100644 --- a/examples/java/cloud/Slave.java +++ b/examples/java/cloud/Slave.java @@ -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 +} diff --git a/examples/java/cloud/cloud.tesh b/examples/java/cloud/cloud.tesh index c8c05d1548..1f3f49da0d 100644 --- a/examples/java/cloud/cloud.tesh +++ b/examples/java/cloud/cloud.tesh @@ -3,154 +3,47 @@ ! 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 index 0000000000..210dc002b0 --- /dev/null +++ b/examples/java/cloud/migration/CMakeLists.txt @@ -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 index 0000000000..80cf2a8b55 --- /dev/null +++ b/examples/java/cloud/migration/Daemon.java @@ -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 index 0000000000..cd0a6ae670 --- /dev/null +++ b/examples/java/cloud/migration/Main.java @@ -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 index 0000000000..7edaa0a3a2 --- /dev/null +++ b/examples/java/cloud/migration/Test.java @@ -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 vms = new ArrayList(); + + /* 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 index 0000000000..97467cb76e --- /dev/null +++ b/examples/java/cloud/migration/XVM.java @@ -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 index 0000000000..707963d190 --- /dev/null +++ b/examples/java/cloud/migration/deploy_simple.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/examples/java/cloud/migration/migration.tesh b/examples/java/cloud/migration/migration.tesh new file mode 100644 index 0000000000..c1337eeefb --- /dev/null +++ b/examples/java/cloud/migration/migration.tesh @@ -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 index 0000000000..7ccd7363f9 --- /dev/null +++ b/examples/java/cloud/migration/platform_simple.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/java/commTime/CommTimeTest.java b/examples/java/commTime/CommTimeTest.java index ba6485110c..417aa27898 100644 --- a/examples/java/commTime/CommTimeTest.java +++ b/examples/java/commTime/CommTimeTest.java @@ -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; diff --git a/examples/java/commTime/FinalizeTask.java b/examples/java/commTime/FinalizeTask.java index d0e3f32899..f5dcc1815f 100644 --- a/examples/java/commTime/FinalizeTask.java +++ b/examples/java/commTime/FinalizeTask.java @@ -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.*; diff --git a/examples/java/commTime/Master.java b/examples/java/commTime/Master.java index 9dc977295d..9193702e32 100644 --- a/examples/java/commTime/Master.java +++ b/examples/java/commTime/Master.java @@ -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; diff --git a/examples/java/commTime/Slave.java b/examples/java/commTime/Slave.java index bb81c9ff43..c90ad64b68 100644 --- a/examples/java/commTime/Slave.java +++ b/examples/java/commTime/Slave.java @@ -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; diff --git a/examples/java/io/IO.java b/examples/java/io/IO.java index 6a6674fb8f..4c94dcf2e3 100644 --- a/examples/java/io/IO.java +++ b/examples/java/io/IO.java @@ -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; diff --git a/examples/java/io/Node.java b/examples/java/io/Node.java index 353db84945..a0a88cd12b 100644 --- a/examples/java/io/Node.java +++ b/examples/java/io/Node.java @@ -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; diff --git a/examples/java/kademlia/Answer.java b/examples/java/kademlia/Answer.java index 9373f50aae..ff0a25b219 100644 --- a/examples/java/kademlia/Answer.java +++ b/examples/java/kademlia/Answer.java @@ -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 diff --git a/examples/java/kademlia/Bucket.java b/examples/java/kademlia/Bucket.java index cd6e6351bc..8ad2326e95 100644 --- a/examples/java/kademlia/Bucket.java +++ b/examples/java/kademlia/Bucket.java @@ -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; diff --git a/examples/java/kademlia/Common.java b/examples/java/kademlia/Common.java index 576d273a4d..7df08e782e 100644 --- a/examples/java/kademlia/Common.java +++ b/examples/java/kademlia/Common.java @@ -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 diff --git a/examples/java/kademlia/Contact.java b/examples/java/kademlia/Contact.java index ac0ba9e933..16d3906f60 100644 --- a/examples/java/kademlia/Contact.java +++ b/examples/java/kademlia/Contact.java @@ -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 diff --git a/examples/java/kademlia/FindNodeAnswerTask.java b/examples/java/kademlia/FindNodeAnswerTask.java index ab85b3afdb..cb036da177 100644 --- a/examples/java/kademlia/FindNodeAnswerTask.java +++ b/examples/java/kademlia/FindNodeAnswerTask.java @@ -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 diff --git a/examples/java/kademlia/FindNodeTask.java b/examples/java/kademlia/FindNodeTask.java index b5bfa97187..9ee53a9972 100644 --- a/examples/java/kademlia/FindNodeTask.java +++ b/examples/java/kademlia/FindNodeTask.java @@ -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 diff --git a/examples/java/kademlia/Kademlia.java b/examples/java/kademlia/Kademlia.java index 567987be80..a9c05c4281 100644 --- a/examples/java/kademlia/Kademlia.java +++ b/examples/java/kademlia/Kademlia.java @@ -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; diff --git a/examples/java/kademlia/KademliaTask.java b/examples/java/kademlia/KademliaTask.java index 17c5d42ba3..9ca0c5f96d 100644 --- a/examples/java/kademlia/KademliaTask.java +++ b/examples/java/kademlia/KademliaTask.java @@ -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 diff --git a/examples/java/kademlia/Node.java b/examples/java/kademlia/Node.java index 447ff8d69b..0a9478185e 100644 --- a/examples/java/kademlia/Node.java +++ b/examples/java/kademlia/Node.java @@ -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; diff --git a/examples/java/kademlia/PingAnswerTask.java b/examples/java/kademlia/PingAnswerTask.java index 097b6a8b3b..46f2fd8556 100644 --- a/examples/java/kademlia/PingAnswerTask.java +++ b/examples/java/kademlia/PingAnswerTask.java @@ -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 diff --git a/examples/java/kademlia/PingTask.java b/examples/java/kademlia/PingTask.java index 38c02a1155..3b08c93384 100644 --- a/examples/java/kademlia/PingTask.java +++ b/examples/java/kademlia/PingTask.java @@ -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 diff --git a/examples/java/kademlia/RoutingTable.java b/examples/java/kademlia/RoutingTable.java index 815d1d0a21..ca136a0431 100644 --- a/examples/java/kademlia/RoutingTable.java +++ b/examples/java/kademlia/RoutingTable.java @@ -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; diff --git a/examples/java/master_slave_bypass/FinalizeTask.java b/examples/java/master_slave_bypass/FinalizeTask.java index 77085c5200..a3b9bd814a 100644 --- a/examples/java/master_slave_bypass/FinalizeTask.java +++ b/examples/java/master_slave_bypass/FinalizeTask.java @@ -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; diff --git a/examples/java/master_slave_bypass/Master.java b/examples/java/master_slave_bypass/Master.java index ea894d8890..39fb1c4b0b 100644 --- a/examples/java/master_slave_bypass/Master.java +++ b/examples/java/master_slave_bypass/Master.java @@ -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; diff --git a/examples/java/master_slave_bypass/MsBypass.java b/examples/java/master_slave_bypass/MsBypass.java index 3a61208be8..8301465160 100644 --- a/examples/java/master_slave_bypass/MsBypass.java +++ b/examples/java/master_slave_bypass/MsBypass.java @@ -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; diff --git a/examples/java/master_slave_bypass/Slave.java b/examples/java/master_slave_bypass/Slave.java index c342df4ac5..05526ea0c9 100644 --- a/examples/java/master_slave_bypass/Slave.java +++ b/examples/java/master_slave_bypass/Slave.java @@ -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; diff --git a/examples/java/master_slave_kill/FinalizeTask.java b/examples/java/master_slave_kill/FinalizeTask.java index 8b5daa3325..ec1a0e2872 100644 --- a/examples/java/master_slave_kill/FinalizeTask.java +++ b/examples/java/master_slave_kill/FinalizeTask.java @@ -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; diff --git a/examples/java/master_slave_kill/Master.java b/examples/java/master_slave_kill/Master.java index 82c8a9d5ea..3aac3fc2a1 100644 --- a/examples/java/master_slave_kill/Master.java +++ b/examples/java/master_slave_kill/Master.java @@ -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; diff --git a/examples/java/master_slave_kill/MsKill.java b/examples/java/master_slave_kill/MsKill.java index cb54fa1a86..8fc9d9770b 100644 --- a/examples/java/master_slave_kill/MsKill.java +++ b/examples/java/master_slave_kill/MsKill.java @@ -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; diff --git a/examples/java/master_slave_kill/Slave.java b/examples/java/master_slave_kill/Slave.java index 630c25b3fb..ab99898d82 100644 --- a/examples/java/master_slave_kill/Slave.java +++ b/examples/java/master_slave_kill/Slave.java @@ -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; diff --git a/examples/java/masterslave/FinalizeTask.java b/examples/java/masterslave/FinalizeTask.java index fc4d97b2e9..e250984baf 100644 --- a/examples/java/masterslave/FinalizeTask.java +++ b/examples/java/masterslave/FinalizeTask.java @@ -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; diff --git a/examples/java/masterslave/Forwarder.java b/examples/java/masterslave/Forwarder.java index 12a9f83a08..f6b8f5b1e2 100644 --- a/examples/java/masterslave/Forwarder.java +++ b/examples/java/masterslave/Forwarder.java @@ -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; diff --git a/examples/java/masterslave/Master.java b/examples/java/masterslave/Master.java index 94e00f5146..8e9d9d1e5d 100644 --- a/examples/java/masterslave/Master.java +++ b/examples/java/masterslave/Master.java @@ -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; diff --git a/examples/java/masterslave/Masterslave.java b/examples/java/masterslave/Masterslave.java index b91c17894b..f5518ab9ea 100644 --- a/examples/java/masterslave/Masterslave.java +++ b/examples/java/masterslave/Masterslave.java @@ -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; diff --git a/examples/java/masterslave/Slave.java b/examples/java/masterslave/Slave.java index e3e4f08d4e..2820c92954 100644 --- a/examples/java/masterslave/Slave.java +++ b/examples/java/masterslave/Slave.java @@ -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; diff --git a/examples/java/masterslave/masterslave.tesh b/examples/java/masterslave/masterslave.tesh index ee1d2074b8..81be5cfed6 100644 --- a/examples/java/masterslave/masterslave.tesh +++ b/examples/java/masterslave/masterslave.tesh @@ -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. diff --git a/examples/java/migration/Emigrant.java b/examples/java/migration/Emigrant.java index c87508125d..5fda9f5bfc 100644 --- a/examples/java/migration/Emigrant.java +++ b/examples/java/migration/Emigrant.java @@ -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; diff --git a/examples/java/migration/Migration.java b/examples/java/migration/Migration.java index 3db138d2b8..97aa53bf21 100644 --- a/examples/java/migration/Migration.java +++ b/examples/java/migration/Migration.java @@ -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; diff --git a/examples/java/migration/Policeman.java b/examples/java/migration/Policeman.java index 3dd8d9707c..664dd335ad 100644 --- a/examples/java/migration/Policeman.java +++ b/examples/java/migration/Policeman.java @@ -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; diff --git a/examples/java/migration/migration.tesh b/examples/java/migration/migration.tesh index 131e9a3493..a954e427a6 100644 --- a/examples/java/migration/migration.tesh +++ b/examples/java/migration/migration.tesh @@ -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. - diff --git a/examples/java/mutualExclusion/Coordinator.java b/examples/java/mutualExclusion/Coordinator.java index 44fc41b84a..7a0e0a679e 100644 --- a/examples/java/mutualExclusion/Coordinator.java +++ b/examples/java/mutualExclusion/Coordinator.java @@ -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; diff --git a/examples/java/mutualExclusion/GrantTask.java b/examples/java/mutualExclusion/GrantTask.java index 60d59e20ef..79e19d0f0b 100644 --- a/examples/java/mutualExclusion/GrantTask.java +++ b/examples/java/mutualExclusion/GrantTask.java @@ -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; diff --git a/examples/java/mutualExclusion/MutexCentral.java b/examples/java/mutualExclusion/MutexCentral.java index e368c3ab47..d5da381303 100644 --- a/examples/java/mutualExclusion/MutexCentral.java +++ b/examples/java/mutualExclusion/MutexCentral.java @@ -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; diff --git a/examples/java/mutualExclusion/Node.java b/examples/java/mutualExclusion/Node.java index b316367208..0b622fe3e6 100644 --- a/examples/java/mutualExclusion/Node.java +++ b/examples/java/mutualExclusion/Node.java @@ -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; diff --git a/examples/java/mutualExclusion/ReleaseTask.java b/examples/java/mutualExclusion/ReleaseTask.java index 46db893027..6348116be2 100644 --- a/examples/java/mutualExclusion/ReleaseTask.java +++ b/examples/java/mutualExclusion/ReleaseTask.java @@ -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 { } diff --git a/examples/java/mutualExclusion/RequestTask.java b/examples/java/mutualExclusion/RequestTask.java index d9d9721a16..225d16bf91 100644 --- a/examples/java/mutualExclusion/RequestTask.java +++ b/examples/java/mutualExclusion/RequestTask.java @@ -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; diff --git a/examples/java/pingPong/PingPongTask.java b/examples/java/pingPong/PingPongTask.java index 5acc673fa1..76f7fff75e 100644 --- a/examples/java/pingPong/PingPongTask.java +++ b/examples/java/pingPong/PingPongTask.java @@ -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; diff --git a/examples/java/pingPong/PingPongTest.java b/examples/java/pingPong/PingPongTest.java index 39f7d386c0..04f71d9431 100644 --- a/examples/java/pingPong/PingPongTest.java +++ b/examples/java/pingPong/PingPongTest.java @@ -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; diff --git a/examples/java/pingPong/Receiver.java b/examples/java/pingPong/Receiver.java index e553e2a60e..57e69cfc43 100644 --- a/examples/java/pingPong/Receiver.java +++ b/examples/java/pingPong/Receiver.java @@ -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; diff --git a/examples/java/pingPong/Sender.java b/examples/java/pingPong/Sender.java index a39430a09a..52fbab1ff3 100644 --- a/examples/java/pingPong/Sender.java +++ b/examples/java/pingPong/Sender.java @@ -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; diff --git a/examples/java/platform.xml b/examples/java/platform.xml index 84db0e240f..495a7b24f5 100644 --- a/examples/java/platform.xml +++ b/examples/java/platform.xml @@ -202,7 +202,7 @@ - + @@ -240,7 +240,7 @@ - + diff --git a/examples/java/priority/Priority.java b/examples/java/priority/Priority.java index 99f0aacf3c..2462ca031b 100644 --- a/examples/java/priority/Priority.java +++ b/examples/java/priority/Priority.java @@ -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; diff --git a/examples/java/priority/Test.java b/examples/java/priority/Test.java index 365e8dfd44..14370f3e6d 100644 --- a/examples/java/priority/Test.java +++ b/examples/java/priority/Test.java @@ -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; diff --git a/examples/java/priority/priority.tesh b/examples/java/priority/priority.tesh index 1a0b8adc45..35646abd95 100644 --- a/examples/java/priority/priority.tesh +++ b/examples/java/priority/priority.tesh @@ -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. diff --git a/examples/java/startKillTime/Master.java b/examples/java/startKillTime/Master.java index 47b2c8fd03..270c4a6724 100644 --- a/examples/java/startKillTime/Master.java +++ b/examples/java/startKillTime/Master.java @@ -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; diff --git a/examples/java/startKillTime/Slave.java b/examples/java/startKillTime/Slave.java index 5978e7047c..0018b6e446 100644 --- a/examples/java/startKillTime/Slave.java +++ b/examples/java/startKillTime/Slave.java @@ -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; diff --git a/examples/java/startKillTime/StartKillTime.java b/examples/java/startKillTime/StartKillTime.java index 3a2999cdbb..8daffbef05 100644 --- a/examples/java/startKillTime/StartKillTime.java +++ b/examples/java/startKillTime/StartKillTime.java @@ -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; diff --git a/examples/java/suspend/DreamMaster.java b/examples/java/suspend/DreamMaster.java index a27be0925e..8dff985403 100644 --- a/examples/java/suspend/DreamMaster.java +++ b/examples/java/suspend/DreamMaster.java @@ -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; diff --git a/examples/java/suspend/LazyGuy.java b/examples/java/suspend/LazyGuy.java index 6a8b17c17e..ffad084d17 100644 --- a/examples/java/suspend/LazyGuy.java +++ b/examples/java/suspend/LazyGuy.java @@ -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; diff --git a/examples/java/suspend/Suspend.java b/examples/java/suspend/Suspend.java index ec31e22ae3..027ed8e9d6 100644 --- a/examples/java/suspend/Suspend.java +++ b/examples/java/suspend/Suspend.java @@ -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; diff --git a/examples/java/suspend/suspend.tesh b/examples/java/suspend/suspend.tesh index 897db64832..8230392315 100644 --- a/examples/java/suspend/suspend.tesh +++ b/examples/java/suspend/suspend.tesh @@ -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. - diff --git a/examples/java/tracing/PingPongTask.java b/examples/java/tracing/PingPongTask.java index 0c3fbd8f69..f43b69e67c 100644 --- a/examples/java/tracing/PingPongTask.java +++ b/examples/java/tracing/PingPongTask.java @@ -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; diff --git a/examples/java/tracing/Receiver.java b/examples/java/tracing/Receiver.java index 3383695e01..dab370f233 100644 --- a/examples/java/tracing/Receiver.java +++ b/examples/java/tracing/Receiver.java @@ -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; diff --git a/examples/java/tracing/Sender.java b/examples/java/tracing/Sender.java index 30d0dc3e24..48a14c4184 100644 --- a/examples/java/tracing/Sender.java +++ b/examples/java/tracing/Sender.java @@ -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; diff --git a/examples/java/tracing/TracingTest.java b/examples/java/tracing/TracingTest.java index 6205296250..b8453bd260 100644 --- a/examples/java/tracing/TracingTest.java +++ b/examples/java/tracing/TracingTest.java @@ -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; diff --git a/examples/lua/SimSplay/chord.lua b/examples/lua/SimSplay/chord.lua index 7e2295428c..1f746d4946 100644 --- a/examples/lua/SimSplay/chord.lua +++ b/examples/lua/SimSplay/chord.lua @@ -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 diff --git a/examples/lua/SimSplay/platform_script.lua b/examples/lua/SimSplay/platform_script.lua index c0f5589afc..1226288658 100644 --- a/examples/lua/SimSplay/platform_script.lua +++ b/examples/lua/SimSplay/platform_script.lua @@ -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"}; diff --git a/examples/lua/SimSplay/sim_splay.lua b/examples/lua/SimSplay/sim_splay.lua index 6202cb382c..a5307140da 100644 --- a/examples/lua/SimSplay/sim_splay.lua +++ b/examples/lua/SimSplay/sim_splay.lua @@ -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 diff --git a/examples/lua/SimSplay/splay_school.lua b/examples/lua/SimSplay/splay_school.lua index 358c36f5d9..e740dd5826 100644 --- a/examples/lua/SimSplay/splay_school.lua +++ b/examples/lua/SimSplay/splay_school.lua @@ -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() diff --git a/examples/lua/bittorrent/bittorrent.lua b/examples/lua/bittorrent/bittorrent.lua index 26381a7fe0..6631d4350d 100644 --- a/examples/lua/bittorrent/bittorrent.lua +++ b/examples/lua/bittorrent/bittorrent.lua @@ -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") diff --git a/examples/lua/bittorrent/peer.lua b/examples/lua/bittorrent/peer.lua index 96a20f3066..496af855a9 100644 --- a/examples/lua/bittorrent/peer.lua +++ b/examples/lua/bittorrent/peer.lua @@ -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") diff --git a/examples/lua/bittorrent/tracker.lua b/examples/lua/bittorrent/tracker.lua index e662990178..e39a2d9179 100644 --- a/examples/lua/bittorrent/tracker.lua +++ b/examples/lua/bittorrent/tracker.lua @@ -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") diff --git a/examples/lua/chord/chord.lua b/examples/lua/chord/chord.lua index 523b15017c..6e6df64f93 100644 --- a/examples/lua/chord/chord.lua +++ b/examples/lua/chord/chord.lua @@ -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 diff --git a/examples/lua/console/deploy.lua b/examples/lua/console/deploy.lua index 5d46da3374..6cd9a48e3c 100644 --- a/examples/lua/console/deploy.lua +++ b/examples/lua/console/deploy.lua @@ -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' diff --git a/examples/lua/console/master.lua b/examples/lua/console/master.lua index 2ce311816e..36f9785360 100644 --- a/examples/lua/console/master.lua +++ b/examples/lua/console/master.lua @@ -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(...) diff --git a/examples/lua/console/master_slave_bypass.lua b/examples/lua/console/master_slave_bypass.lua index 55a79d532c..b88391fdf4 100644 --- a/examples/lua/console/master_slave_bypass.lua +++ b/examples/lua/console/master_slave_bypass.lua @@ -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' diff --git a/examples/lua/console/platform.lua b/examples/lua/console/platform.lua index 6e0f88b249..b38d3ce64e 100644 --- a/examples/lua/console/platform.lua +++ b/examples/lua/console/platform.lua @@ -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(); diff --git a/examples/lua/console/slave.lua b/examples/lua/console/slave.lua index 816fbda5df..b70a75a104 100644 --- a/examples/lua/console/slave.lua +++ b/examples/lua/console/slave.lua @@ -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(...) diff --git a/examples/lua/kademlia/kademlia.lua b/examples/lua/kademlia/kademlia.lua index 70d67d6d41..36418240ce 100644 --- a/examples/lua/kademlia/kademlia.lua +++ b/examples/lua/kademlia/kademlia.lua @@ -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 diff --git a/examples/lua/kademlia/routing_table.lua b/examples/lua/kademlia/routing_table.lua index 3c2b636a03..d4f4d045a4 100644 --- a/examples/lua/kademlia/routing_table.lua +++ b/examples/lua/kademlia/routing_table.lua @@ -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 = {}, diff --git a/examples/lua/kademlia/tools.lua b/examples/lua/kademlia/tools.lua index 664c3424a2..71bb07a2e5 100644 --- a/examples/lua/kademlia/tools.lua +++ b/examples/lua/kademlia/tools.lua @@ -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 diff --git a/examples/lua/masterslave/master.lua b/examples/lua/masterslave/master.lua index 2ee7f419df..0cd88bc1c1 100644 --- a/examples/lua/masterslave/master.lua +++ b/examples/lua/masterslave/master.lua @@ -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 diff --git a/examples/lua/masterslave/master_slave.lua b/examples/lua/masterslave/master_slave.lua index 2aeb917769..9a7f35435a 100644 --- a/examples/lua/masterslave/master_slave.lua +++ b/examples/lua/masterslave/master_slave.lua @@ -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 ---------------------------------------------------------- diff --git a/examples/lua/masterslave/platform.lua b/examples/lua/masterslave/platform.lua index 8ef9d4bf82..9999efdf24 100644 --- a/examples/lua/masterslave/platform.lua +++ b/examples/lua/masterslave/platform.lua @@ -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"}; diff --git a/examples/lua/masterslave/slave.lua b/examples/lua/masterslave/slave.lua index 875698362a..d6f214122c 100644 --- a/examples/lua/masterslave/slave.lua +++ b/examples/lua/masterslave/slave.lua @@ -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 diff --git a/examples/lua/multi_matrix/mult_matrix.lua b/examples/lua/multi_matrix/mult_matrix.lua index 9700b76984..62c89e3973 100644 --- a/examples/lua/multi_matrix/mult_matrix.lua +++ b/examples/lua/multi_matrix/mult_matrix.lua @@ -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" diff --git a/examples/lua/multi_matrix/receiver.lua b/examples/lua/multi_matrix/receiver.lua index e771b7a593..6769b5ca7d 100644 --- a/examples/lua/multi_matrix/receiver.lua +++ b/examples/lua/multi_matrix/receiver.lua @@ -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") diff --git a/examples/lua/multi_matrix/sender.lua b/examples/lua/multi_matrix/sender.lua index dfd1ae8120..16166ffebd 100644 --- a/examples/lua/multi_matrix/sender.lua +++ b/examples/lua/multi_matrix/sender.lua @@ -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") diff --git a/examples/lua/splaySim/master.lua b/examples/lua/splaySim/master.lua index 04951c3658..e495048046 100644 --- a/examples/lua/splaySim/master.lua +++ b/examples/lua/splaySim/master.lua @@ -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(...) diff --git a/examples/lua/splaySim/slave.lua b/examples/lua/splaySim/slave.lua index e188572196..4275c3150d 100644 --- a/examples/lua/splaySim/slave.lua +++ b/examples/lua/splaySim/slave.lua @@ -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(...) diff --git a/examples/lua/splaySim/splay_ctrl.lua b/examples/lua/splaySim/splay_ctrl.lua index 5c8007c961..7b8a5cee57 100644 --- a/examples/lua/splaySim/splay_ctrl.lua +++ b/examples/lua/splaySim/splay_ctrl.lua @@ -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 ---------------------------------------------------------- diff --git a/examples/lua/splaySim/splay_deploy_masterslave.lua b/examples/lua/splaySim/splay_deploy_masterslave.lua index a40ef42249..cd09f6235f 100644 --- a/examples/lua/splaySim/splay_deploy_masterslave.lua +++ b/examples/lua/splaySim/splay_deploy_masterslave.lua @@ -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" diff --git a/examples/lua/splaySim/splay_platform.lua b/examples/lua/splaySim/splay_platform.lua index 1181a1bef3..d2dc99939c 100644 --- a/examples/lua/splaySim/splay_platform.lua +++ b/examples/lua/splaySim/splay_platform.lua @@ -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"}; diff --git a/examples/lua/state_cloner/duplicated_globals.lua b/examples/lua/state_cloner/duplicated_globals.lua index 70366bb8da..5adc010d7c 100644 --- a/examples/lua/state_cloner/duplicated_globals.lua +++ b/examples/lua/state_cloner/duplicated_globals.lua @@ -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 diff --git a/examples/lua/tracing/master.lua b/examples/lua/tracing/master.lua index e189c05001..13bdaa5eaa 100644 --- a/examples/lua/tracing/master.lua +++ b/examples/lua/tracing/master.lua @@ -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(...) diff --git a/examples/lua/tracing/master_slave_trace.lua b/examples/lua/tracing/master_slave_trace.lua index f3ca3f4701..a13006fdb9 100644 --- a/examples/lua/tracing/master_slave_trace.lua +++ b/examples/lua/tracing/master_slave_trace.lua @@ -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' diff --git a/examples/lua/tracing/slave.lua b/examples/lua/tracing/slave.lua index cdbe5f398a..b473a36750 100644 --- a/examples/lua/tracing/slave.lua +++ b/examples/lua/tracing/slave.lua @@ -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(...) diff --git a/examples/msg/actions/actions.c b/examples/msg/actions/actions.c index edb903788e..ef4434456c 100644 --- a/examples/msg/actions/actions.c +++ b/examples/msg/actions/actions.c @@ -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 diff --git a/examples/msg/bittorrent/bittorrent.c b/examples/msg/bittorrent/bittorrent.c index 741cd2c74f..0ad478188e 100644 --- a/examples/msg/bittorrent/bittorrent.c +++ b/examples/msg/bittorrent/bittorrent.c @@ -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); diff --git a/examples/msg/bittorrent/bittorrent.h b/examples/msg/bittorrent/bittorrent.h index 7401336af4..01a80eee72 100644 --- a/examples/msg/bittorrent/bittorrent.h +++ b/examples/msg/bittorrent/bittorrent.h @@ -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 diff --git a/examples/msg/bittorrent/bittorrent_platfgen.c b/examples/msg/bittorrent/bittorrent_platfgen.c index bb9045deef..9afada064b 100644 --- a/examples/msg/bittorrent/bittorrent_platfgen.c +++ b/examples/msg/bittorrent/bittorrent_platfgen.c @@ -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" diff --git a/examples/msg/bittorrent/connection.c b/examples/msg/bittorrent/connection.c index 0378f4a588..c0ee2a546a 100644 --- a/examples/msg/bittorrent/connection.c +++ b/examples/msg/bittorrent/connection.c @@ -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 diff --git a/examples/msg/bittorrent/connection.h b/examples/msg/bittorrent/connection.h index 2d3000891f..418b638c2a 100644 --- a/examples/msg/bittorrent/connection.h +++ b/examples/msg/bittorrent/connection.h @@ -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_ /** diff --git a/examples/msg/bittorrent/generate.py b/examples/msg/bittorrent/generate.py index 1aed434c84..f3460bb3c9 100755 --- a/examples/msg/bittorrent/generate.py +++ b/examples/msg/bittorrent/generate.py @@ -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 diff --git a/examples/msg/bittorrent/messages.c b/examples/msg/bittorrent/messages.c index cd7cd4c24c..bfe1ea4a20 100644 --- a/examples/msg/bittorrent/messages.c +++ b/examples/msg/bittorrent/messages.c @@ -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" diff --git a/examples/msg/bittorrent/messages.h b/examples/msg/bittorrent/messages.h index 4357729e71..dab23afb66 100644 --- a/examples/msg/bittorrent/messages.h +++ b/examples/msg/bittorrent/messages.h @@ -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 diff --git a/examples/msg/bittorrent/peer.c b/examples/msg/bittorrent/peer.c index 2ea4729304..19232336c5 100644 --- a/examples/msg/bittorrent/peer.c +++ b/examples/msg/bittorrent/peer.c @@ -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); } /** diff --git a/examples/msg/bittorrent/peer.h b/examples/msg/bittorrent/peer.h index 39554389f2..e64a2d2357 100644 --- a/examples/msg/bittorrent/peer.h +++ b/examples/msg/bittorrent/peer.h @@ -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 diff --git a/examples/msg/bittorrent/tracker.c b/examples/msg/bittorrent/tracker.c index b45d4646aa..631a4560b8 100644 --- a/examples/msg/bittorrent/tracker.c +++ b/examples/msg/bittorrent/tracker.c @@ -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 #include @@ -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 diff --git a/examples/msg/bittorrent/tracker.h b/examples/msg/bittorrent/tracker.h index 5acc231201..e1b1fea7b3 100644 --- a/examples/msg/bittorrent/tracker.h +++ b/examples/msg/bittorrent/tracker.h @@ -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 diff --git a/examples/msg/chainsend/broadcaster.c b/examples/msg/chainsend/broadcaster.c index 507167a0ff..5daf3d5fa7 100644 --- a/examples/msg/chainsend/broadcaster.c +++ b/examples/msg/chainsend/broadcaster.c @@ -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, diff --git a/examples/msg/chainsend/broadcaster.h b/examples/msg/chainsend/broadcaster.h index ce6fe977bf..2b066565f0 100644 --- a/examples/msg/chainsend/broadcaster.h +++ b/examples/msg/chainsend/broadcaster.h @@ -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 diff --git a/examples/msg/chainsend/chainsend.c b/examples/msg/chainsend/chainsend.c index 06e7bea47d..e8a4d199e3 100644 --- a/examples/msg/chainsend/chainsend.c +++ b/examples/msg/chainsend/chainsend.c @@ -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 diff --git a/examples/msg/chainsend/common.c b/examples/msg/chainsend/common.c index 928c6e3a43..12fc601623 100644 --- a/examples/msg/chainsend/common.c +++ b/examples/msg/chainsend/common.c @@ -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) diff --git a/examples/msg/chainsend/common.h b/examples/msg/chainsend/common.h index e28e098f52..2336685f5b 100644 --- a/examples/msg/chainsend/common.h +++ b/examples/msg/chainsend/common.h @@ -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 diff --git a/examples/msg/chainsend/generate_deployment_file.rb b/examples/msg/chainsend/generate_deployment_file.rb index 3adb0d76cd..e290ae18a0 100755 --- a/examples/msg/chainsend/generate_deployment_file.rb +++ b/examples/msg/chainsend/generate_deployment_file.rb @@ -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 diff --git a/examples/msg/chainsend/iterator.c b/examples/msg/chainsend/iterator.c index 47dfe04fc4..70956eae1b 100644 --- a/examples/msg/chainsend/iterator.c +++ b/examples/msg/chainsend/iterator.c @@ -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 */ diff --git a/examples/msg/chainsend/iterator.h b/examples/msg/chainsend/iterator.h index 3a13ed1f48..dfc26938f0 100644 --- a/examples/msg/chainsend/iterator.h +++ b/examples/msg/chainsend/iterator.h @@ -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 diff --git a/examples/msg/chainsend/messages.c b/examples/msg/chainsend/messages.c index 253cdf7f4c..28a92fb49c 100644 --- a/examples/msg/chainsend/messages.c +++ b/examples/msg/chainsend/messages.c @@ -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) diff --git a/examples/msg/chainsend/messages.h b/examples/msg/chainsend/messages.h index ef1f25ccdc..b717d5c0dc 100644 --- a/examples/msg/chainsend/messages.h +++ b/examples/msg/chainsend/messages.h @@ -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 diff --git a/examples/msg/chainsend/peer.c b/examples/msg/chainsend/peer.c index 1b76e50b45..6be29c17b7 100644 --- a/examples/msg/chainsend/peer.c +++ b/examples/msg/chainsend/peer.c @@ -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, diff --git a/examples/msg/chainsend/peer.h b/examples/msg/chainsend/peer.h index 8ee42f7745..63f5a0ebe7 100644 --- a/examples/msg/chainsend/peer.h +++ b/examples/msg/chainsend/peer.h @@ -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 diff --git a/examples/msg/chord/chord.c b/examples/msg/chord/chord.c index ce2c4bd5b3..4f58233124 100644 --- a/examples/msg/chord/chord.c +++ b/examples/msg/chord/chord.c @@ -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); diff --git a/examples/msg/chord/chord.tesh b/examples/msg/chord/chord.tesh index 96fdb8c87c..ccad098dd3 100644 --- a/examples/msg/chord/chord.tesh +++ b/examples/msg/chord/chord.tesh @@ -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 diff --git a/examples/msg/chord/chord_crosstraffic.tesh b/examples/msg/chord/chord_crosstraffic.tesh index 19bc5ff7be..86bf7c1951 100644 --- a/examples/msg/chord/chord_crosstraffic.tesh +++ b/examples/msg/chord/chord_crosstraffic.tesh @@ -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 diff --git a/examples/msg/chord/generate.py b/examples/msg/chord/generate.py index cc24945eae..3d488ca7c3 100755 --- a/examples/msg/chord/generate.py +++ b/examples/msg/chord/generate.py @@ -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 diff --git a/examples/msg/cloud/CMakeLists.txt b/examples/msg/cloud/CMakeLists.txt index 534992d591..66afe97fdf 100644 --- a/examples/msg/cloud/CMakeLists.txt +++ b/examples/msg/cloud/CMakeLists.txt @@ -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 index 0000000000..ee5fc4971a --- /dev/null +++ b/examples/msg/cloud/bound.c @@ -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 +#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 + * + * - priority/priority.c: 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(¶ms, 0, sizeof(params)); + params.ramsize = 1L * 1000 * 1000 * 1000; // 1Gbytes + MSG_host_set_params(vm0, ¶ms); + 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 index 33513a0bf3..0000000000 --- a/examples/msg/cloud/masterslave_virtual_machines.c +++ /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 -#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 - * - * - cloud/masterslave_virtual_machines.c: Master/slaves - * example, à la cloud. 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=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 index b3dd73a62f..0000000000 --- a/examples/msg/cloud/masterslave_virtual_machines.tesh +++ /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 index 83bcdda2ec..0000000000 --- a/examples/msg/cloud/masterslave_virtual_machines.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/examples/msg/cloud/migrate_vm.c b/examples/msg/cloud/migrate_vm.c new file mode 100644 index 0000000000..7d263c7953 --- /dev/null +++ b/examples/msg/cloud/migrate_vm.c @@ -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 +#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(¶ms, 0, sizeof(params)); + + + + vm0 = MSG_vm_create_core(pm0, "VM0"); + params.ramsize = 1L * 1000 * 1000 * 1000; // 1Gbytes + MSG_host_set_params(vm0, ¶ms); + 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, ¶ms); + 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, ¶ms); + MSG_host_set_params(vm1, ¶ms); + 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, ¶ms); + MSG_host_set_params(vm1, ¶ms); + 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 index 0000000000..64a00c39c9 --- /dev/null +++ b/examples/msg/cloud/multicore.c @@ -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 +#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(¶ms, 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, ¶ms); + MSG_host_set_params(vm1, ¶ms); + MSG_host_set_params(vm2, ¶ms); + MSG_host_set_params(vm3, ¶ms); + + 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 index 0000000000..3a1b616c6e --- /dev/null +++ b/examples/msg/cloud/multicore_plat.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/msg/cloud/scale.c b/examples/msg/cloud/scale.c new file mode 100644 index 0000000000..54a0bfec9b --- /dev/null +++ b/examples/msg/cloud/scale.c @@ -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 +#include +#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 index 0000000000..9bc4478103 --- /dev/null +++ b/examples/msg/cloud/simple_plat.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/msg/cloud/simple_vm.c b/examples/msg/cloud/simple_vm.c new file mode 100644 index 0000000000..624bdc47a8 --- /dev/null +++ b/examples/msg/cloud/simple_vm.c @@ -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 +#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(¶ms, 0, sizeof(params)); + params.ramsize = 1L * 1024 * 1024 * 1024; // 1Gbytes + MSG_host_set_params(vm0, ¶ms); + } + 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 index 0000000000..12d0ad2fc1 --- /dev/null +++ b/examples/msg/cloud/simple_vm.tesh @@ -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 index 0000000000..0e2aaabea3 --- /dev/null +++ b/examples/msg/cloud/two_tasks_vm.c @@ -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 +#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 index 0000000000..05952d92cd --- /dev/null +++ b/examples/msg/cloud/two_tasks_vm.tesh @@ -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) diff --git a/examples/msg/energy/e1/e1.c b/examples/msg/energy/e1/e1.c index 74013fbac9..6a3085d3df 100644 --- a/examples/msg/energy/e1/e1.c +++ b/examples/msg/energy/e1/e1.c @@ -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 */ diff --git a/examples/msg/energy/e1/pstate.tesh b/examples/msg/energy/e1/pstate.tesh index cc2d47da39..24465509d8 100644 --- a/examples/msg/energy/e1/pstate.tesh +++ b/examples/msg/energy/e1/pstate.tesh @@ -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 diff --git a/examples/msg/energy/e2/e2.c b/examples/msg/energy/e2/e2.c index d0ea20bd23..1be86ff8fe 100644 --- a/examples/msg/energy/e2/e2.c +++ b/examples/msg/energy/e2/e2.c @@ -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) { diff --git a/examples/msg/energy/e2/energy_consumption.tesh b/examples/msg/energy/e2/energy_consumption.tesh index 56f87a06e4..105621b813 100644 --- a/examples/msg/energy/e2/energy_consumption.tesh +++ b/examples/msg/energy/e2/energy_consumption.tesh @@ -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 diff --git a/examples/msg/energy/e3/concurrent_tasks.tesh b/examples/msg/energy/e3/concurrent_tasks.tesh index a7d7eac966..9cf2d89916 100644 --- a/examples/msg/energy/e3/concurrent_tasks.tesh +++ b/examples/msg/energy/e3/concurrent_tasks.tesh @@ -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 diff --git a/examples/msg/energy/e3/e3.c b/examples/msg/energy/e3/e3.c index 4230a8e39c..1eab1b8cf8 100644 --- a/examples/msg/energy/e3/e3.c +++ b/examples/msg/energy/e3/e3.c @@ -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) { diff --git a/examples/msg/gpu/test_MSG_gpu_task_create.c b/examples/msg/gpu/test_MSG_gpu_task_create.c index bb7661d501..c968e89ff9 100644 --- a/examples/msg/gpu/test_MSG_gpu_task_create.c +++ b/examples/msg/gpu/test_MSG_gpu_task_create.c @@ -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 diff --git a/examples/msg/gtnets/gtnets.c b/examples/msg/gtnets/gtnets.c index 488f40b4d0..eb7a88054e 100644 --- a/examples/msg/gtnets/gtnets.c +++ b/examples/msg/gtnets/gtnets.c @@ -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 diff --git a/examples/msg/icomms/peer.c b/examples/msg/icomms/peer.c index ef9e78b02a..59f0d3ef0c 100644 --- a/examples/msg/icomms/peer.c +++ b/examples/msg/icomms/peer.c @@ -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 diff --git a/examples/msg/icomms/peer2.c b/examples/msg/icomms/peer2.c index d60cae3ef2..d7542706b9 100644 --- a/examples/msg/icomms/peer2.c +++ b/examples/msg/icomms/peer2.c @@ -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 diff --git a/examples/msg/icomms/peer3.c b/examples/msg/icomms/peer3.c index bfbda570b7..2026f880c4 100644 --- a/examples/msg/icomms/peer3.c +++ b/examples/msg/icomms/peer3.c @@ -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 diff --git a/examples/msg/io/CMakeLists.txt b/examples/msg/io/CMakeLists.txt index 3285b5e0f9..13a39a6369 100644 --- a/examples/msg/io/CMakeLists.txt +++ b/examples/msg/io/CMakeLists.txt @@ -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 diff --git a/examples/msg/io/file.c b/examples/msg/io/file.c index ef7808f66f..1da705b30e 100644 --- a/examples/msg/io/file.c +++ b/examples/msg/io/file.c @@ -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 #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); diff --git a/examples/msg/io/file_unlink.c b/examples/msg/io/file_unlink.c index ec901daaef..49f05232ed 100644 --- a/examples/msg/io/file_unlink.c +++ b/examples/msg/io/file_unlink.c @@ -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 #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); diff --git a/examples/msg/io/io.tesh b/examples/msg/io/io.tesh index bf4bdc249d..e612c10a90 100644 --- a/examples/msg/io/io.tesh +++ b/examples/msg/io/io.tesh @@ -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 index 0000000000..e2778d0e55 --- /dev/null +++ b/examples/msg/io/storage.c @@ -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 index 0000000000..3cd10b53d9 --- /dev/null +++ b/examples/msg/io/storage.tesh @@ -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 diff --git a/examples/msg/kademlia/answer.c b/examples/msg/kademlia/answer.c index 1475d1cb53..ee1082bdd8 100644 --- a/examples/msg/kademlia/answer.c +++ b/examples/msg/kademlia/answer.c @@ -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); diff --git a/examples/msg/kademlia/answer.h b/examples/msg/kademlia/answer.h index a0cea3e1e1..24902dd953 100644 --- a/examples/msg/kademlia/answer.h +++ b/examples/msg/kademlia/answer.h @@ -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 diff --git a/examples/msg/kademlia/common.h b/examples/msg/kademlia/common.h index 5e743be25f..14770e2b40 100644 --- a/examples/msg/kademlia/common.h +++ b/examples/msg/kademlia/common.h @@ -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 diff --git a/examples/msg/kademlia/generate.py b/examples/msg/kademlia/generate.py index 19b483e7b6..b47512022c 100755 --- a/examples/msg/kademlia/generate.py +++ b/examples/msg/kademlia/generate.py @@ -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: diff --git a/examples/msg/kademlia/kademlia.c b/examples/msg/kademlia/kademlia.c index 0173515a8d..5f9bb6aec9 100644 --- a/examples/msg/kademlia/kademlia.c +++ b/examples/msg/kademlia/kademlia.c @@ -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" diff --git a/examples/msg/kademlia/kademlia.h b/examples/msg/kademlia/kademlia.h index 142a7c03b8..1fce788afb 100644 --- a/examples/msg/kademlia/kademlia.h +++ b/examples/msg/kademlia/kademlia.h @@ -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" diff --git a/examples/msg/kademlia/node.c b/examples/msg/kademlia/node.c index 5cdc918290..574afbefff 100644 --- a/examples/msg/kademlia/node.c +++ b/examples/msg/kademlia/node.c @@ -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 diff --git a/examples/msg/kademlia/node.h b/examples/msg/kademlia/node.h index 2db9a51bfe..e93549b7c8 100644 --- a/examples/msg/kademlia/node.h +++ b/examples/msg/kademlia/node.h @@ -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 diff --git a/examples/msg/kademlia/routing_table.c b/examples/msg/kademlia/routing_table.c index 4587f2862f..3d1fcb12bc 100644 --- a/examples/msg/kademlia/routing_table.c +++ b/examples/msg/kademlia/routing_table.c @@ -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" diff --git a/examples/msg/kademlia/routing_table.h b/examples/msg/kademlia/routing_table.h index df34fa5645..6baa1cf99b 100644 --- a/examples/msg/kademlia/routing_table.h +++ b/examples/msg/kademlia/routing_table.h @@ -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 diff --git a/examples/msg/kademlia/task.c b/examples/msg/kademlia/task.c index 770cd62573..5268482b28 100644 --- a/examples/msg/kademlia/task.c +++ b/examples/msg/kademlia/task.c @@ -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, diff --git a/examples/msg/kademlia/task.h b/examples/msg/kademlia/task.h index e116282034..49245499b6 100644 --- a/examples/msg/kademlia/task.h +++ b/examples/msg/kademlia/task.h @@ -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" diff --git a/examples/msg/masterslave/masterslave_arg.c b/examples/msg/masterslave/masterslave_arg.c index fd97d2ab50..7bf9f87e25 100644 --- a/examples/msg/masterslave/masterslave_arg.c +++ b/examples/msg/masterslave/masterslave_arg.c @@ -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 diff --git a/examples/msg/masterslave/masterslave_bypass.c b/examples/msg/masterslave/masterslave_bypass.c index 35e3d93b12..2a4148ffab 100644 --- a/examples/msg/masterslave/masterslave_bypass.c +++ b/examples/msg/masterslave/masterslave_bypass.c @@ -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 diff --git a/examples/msg/masterslave/masterslave_cluster.c b/examples/msg/masterslave/masterslave_cluster.c index 74a7493df5..085d574a9e 100644 --- a/examples/msg/masterslave/masterslave_cluster.c +++ b/examples/msg/masterslave/masterslave_cluster.c @@ -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 diff --git a/examples/msg/masterslave/masterslave_failure.c b/examples/msg/masterslave/masterslave_failure.c index 867c7290ef..90ffa8752c 100644 --- a/examples/msg/masterslave/masterslave_failure.c +++ b/examples/msg/masterslave/masterslave_failure.c @@ -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 diff --git a/examples/msg/masterslave/masterslave_failure_platfgen.c b/examples/msg/masterslave/masterslave_failure_platfgen.c index 1764ba0f7b..ee179e572a 100644 --- a/examples/msg/masterslave/masterslave_failure_platfgen.c +++ b/examples/msg/masterslave/masterslave_failure_platfgen.c @@ -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 diff --git a/examples/msg/masterslave/masterslave_forwarder.c b/examples/msg/masterslave/masterslave_forwarder.c index 643ca79266..7aa886143c 100644 --- a/examples/msg/masterslave/masterslave_forwarder.c +++ b/examples/msg/masterslave/masterslave_forwarder.c @@ -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 diff --git a/examples/msg/masterslave/masterslave_kill.c b/examples/msg/masterslave/masterslave_kill.c index 647364611a..22d18ff573 100644 --- a/examples/msg/masterslave/masterslave_kill.c +++ b/examples/msg/masterslave/masterslave_kill.c @@ -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 diff --git a/examples/msg/masterslave/masterslave_mailbox.c b/examples/msg/masterslave/masterslave_mailbox.c index 76dad7274e..b9f8af621a 100644 --- a/examples/msg/masterslave/masterslave_mailbox.c +++ b/examples/msg/masterslave/masterslave_mailbox.c @@ -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 diff --git a/examples/msg/masterslave/masterslave_platfgen.c b/examples/msg/masterslave/masterslave_platfgen.c index 9d8f3cd425..11d3c2fec7 100644 --- a/examples/msg/masterslave/masterslave_platfgen.c +++ b/examples/msg/masterslave/masterslave_platfgen.c @@ -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" diff --git a/examples/msg/mc/bugged1.c b/examples/msg/mc/bugged1.c index a8f62e7053..62539cd4c1 100644 --- a/examples/msg/mc/bugged1.c +++ b/examples/msg/mc/bugged1.c @@ -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 */ diff --git a/examples/msg/mc/bugged1.tesh b/examples/msg/mc/bugged1.tesh index bcebdf8c9d..504b90e1ad 100644 --- a/examples/msg/mc/bugged1.tesh +++ b/examples/msg/mc/bugged1.tesh @@ -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 diff --git a/examples/msg/mc/bugged1_liveness.c b/examples/msg/mc/bugged1_liveness.c index b6949dda0c..09d374613f 100644 --- a/examples/msg/mc/bugged1_liveness.c +++ b/examples/msg/mc/bugged1_liveness.c @@ -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 */ diff --git a/examples/msg/mc/bugged1_liveness.h b/examples/msg/mc/bugged1_liveness.h index 6ca2dfcd6f..7246422f64 100644 --- a/examples/msg/mc/bugged1_liveness.h +++ b/examples/msg/mc/bugged1_liveness.h @@ -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 diff --git a/examples/msg/mc/bugged1_liveness.tesh b/examples/msg/mc/bugged1_liveness.tesh index 63bee18665..fd34555a56 100644 --- a/examples/msg/mc/bugged1_liveness.tesh +++ b/examples/msg/mc/bugged1_liveness.tesh @@ -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 diff --git a/examples/msg/mc/bugged1_liveness_visited.tesh b/examples/msg/mc/bugged1_liveness_visited.tesh index 25377200eb..f117bb4b22 100644 --- a/examples/msg/mc/bugged1_liveness_visited.tesh +++ b/examples/msg/mc/bugged1_liveness_visited.tesh @@ -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 diff --git a/examples/msg/mc/bugged2.c b/examples/msg/mc/bugged2.c index 528dd1b98b..5d0e375af3 100644 --- a/examples/msg/mc/bugged2.c +++ b/examples/msg/mc/bugged2.c @@ -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 */ diff --git a/examples/msg/mc/bugged2.tesh b/examples/msg/mc/bugged2.tesh index df06aafaaf..3d65e677e7 100644 --- a/examples/msg/mc/bugged2.tesh +++ b/examples/msg/mc/bugged2.tesh @@ -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 diff --git a/examples/msg/mc/bugged2_liveness.c b/examples/msg/mc/bugged2_liveness.c index 26f2b31ca3..d6beac0f42 100644 --- a/examples/msg/mc/bugged2_liveness.c +++ b/examples/msg/mc/bugged2_liveness.c @@ -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 */ diff --git a/examples/msg/mc/bugged2_liveness.h b/examples/msg/mc/bugged2_liveness.h index b44121eff7..ec62e315aa 100644 --- a/examples/msg/mc/bugged2_liveness.h +++ b/examples/msg/mc/bugged2_liveness.h @@ -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 diff --git a/examples/msg/mc/bugged3.c b/examples/msg/mc/bugged3.c index 91d00c1e37..5f949c0d45 100644 --- a/examples/msg/mc/bugged3.c +++ b/examples/msg/mc/bugged3.c @@ -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 */ diff --git a/examples/msg/mc/centralized_mutex.c b/examples/msg/mc/centralized_mutex.c index 3403c88286..d7231e1a2c 100644 --- a/examples/msg/mc/centralized_mutex.c +++ b/examples/msg/mc/centralized_mutex.c @@ -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 */ diff --git a/examples/msg/mc/electric_fence.c b/examples/msg/mc/electric_fence.c index cfe23b7d0e..0e031419ca 100644 --- a/examples/msg/mc/electric_fence.c +++ b/examples/msg/mc/electric_fence.c @@ -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*/ diff --git a/examples/msg/migration/migration.c b/examples/msg/migration/migration.c index 898682f840..23195981ae 100644 --- a/examples/msg/migration/migration.c +++ b/examples/msg/migration/migration.c @@ -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 diff --git a/examples/msg/ns3/ns3.c b/examples/msg/ns3/ns3.c index d1ffeee73c..31ef94156a 100644 --- a/examples/msg/ns3/ns3.c +++ b/examples/msg/ns3/ns3.c @@ -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 diff --git a/examples/msg/ns3/ns3.tesh b/examples/msg/ns3/ns3.tesh index cb26e470c4..52094b2e5e 100644 --- a/examples/msg/ns3/ns3.tesh +++ b/examples/msg/ns3/ns3.tesh @@ -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 diff --git a/examples/msg/parallel_task/parallel_task.c b/examples/msg/parallel_task/parallel_task.c index 5b25179bef..a3dda645e1 100644 --- a/examples/msg/parallel_task/parallel_task.c +++ b/examples/msg/parallel_task/parallel_task.c @@ -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 diff --git a/examples/msg/parallel_task/test_ptask.c b/examples/msg/parallel_task/test_ptask.c index 0e2646323c..8626a98026 100644 --- a/examples/msg/parallel_task/test_ptask.c +++ b/examples/msg/parallel_task/test_ptask.c @@ -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 diff --git a/examples/msg/pastry/pastry.c b/examples/msg/pastry/pastry.c index cbcfcd5ff2..45300c774b 100644 --- a/examples/msg/pastry/pastry.c +++ b/examples/msg/pastry/pastry.c @@ -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 #include #include "msg/msg.h" diff --git a/examples/msg/pmm/msg_pmm.c b/examples/msg/pmm/msg_pmm.c index 1acf31cdbd..59d9e1b3bb 100644 --- a/examples/msg/pmm/msg_pmm.c +++ b/examples/msg/pmm/msg_pmm.c @@ -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" diff --git a/examples/msg/priority/priority.c b/examples/msg/priority/priority.c index 3940a08a9f..43258ddc8a 100644 --- a/examples/msg/priority/priority.c +++ b/examples/msg/priority/priority.c @@ -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 diff --git a/examples/msg/properties/msg_prop.c b/examples/msg/properties/msg_prop.c index 368a09d458..e660024f73 100644 --- a/examples/msg/properties/msg_prop.c +++ b/examples/msg/properties/msg_prop.c @@ -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 diff --git a/examples/msg/semaphores/synchro.c b/examples/msg/semaphores/synchro.c index b66b1d3ad3..cc10147595 100644 --- a/examples/msg/semaphores/synchro.c +++ b/examples/msg/semaphores/synchro.c @@ -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 #include #include "msg/msg.h" diff --git a/examples/msg/sendrecv/sendrecv.c b/examples/msg/sendrecv/sendrecv.c index 1f74408c2f..0656eb2d89 100644 --- a/examples/msg/sendrecv/sendrecv.c +++ b/examples/msg/sendrecv/sendrecv.c @@ -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 diff --git a/examples/msg/start_kill_time/sk_time.c b/examples/msg/start_kill_time/sk_time.c index fc03c409dc..72ce30c6fb 100644 --- a/examples/msg/start_kill_time/sk_time.c +++ b/examples/msg/start_kill_time/sk_time.c @@ -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 diff --git a/examples/msg/suspend/suspend.c b/examples/msg/suspend/suspend.c index 5edb0af46b..1ce043b7ca 100644 --- a/examples/msg/suspend/suspend.c +++ b/examples/msg/suspend/suspend.c @@ -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 diff --git a/examples/msg/token_ring/ring_call.c b/examples/msg/token_ring/ring_call.c index 9a7de6e6a4..dd6107f523 100644 --- a/examples/msg/token_ring/ring_call.c +++ b/examples/msg/token_ring/ring_call.c @@ -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 diff --git a/examples/msg/token_ring/token_bypass.c b/examples/msg/token_ring/token_bypass.c index 2091603114..44a1c7da0d 100644 --- a/examples/msg/token_ring/token_bypass.c +++ b/examples/msg/token_ring/token_bypass.c @@ -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 diff --git a/examples/msg/token_ring/token_ring.tesh b/examples/msg/token_ring/token_ring.tesh index 170145edac..908624d54b 100644 --- a/examples/msg/token_ring/token_ring.tesh +++ b/examples/msg/token_ring/token_ring.tesh @@ -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" diff --git a/examples/msg/tracing/categories.c b/examples/msg/tracing/categories.c index d0dadbd8a4..238e8ef72c 100644 --- a/examples/msg/tracing/categories.c +++ b/examples/msg/tracing/categories.c @@ -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 diff --git a/examples/msg/tracing/link_srcdst_user_variables.c b/examples/msg/tracing/link_srcdst_user_variables.c index 63a19e9004..f9c4c22b4f 100644 --- a/examples/msg/tracing/link_srcdst_user_variables.c +++ b/examples/msg/tracing/link_srcdst_user_variables.c @@ -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 diff --git a/examples/msg/tracing/link_user_variables.c b/examples/msg/tracing/link_user_variables.c index c9754607f0..1ee390dabe 100644 --- a/examples/msg/tracing/link_user_variables.c +++ b/examples/msg/tracing/link_user_variables.c @@ -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 diff --git a/examples/msg/tracing/ms.c b/examples/msg/tracing/ms.c index d9a713f13d..aed734ede0 100644 --- a/examples/msg/tracing/ms.c +++ b/examples/msg/tracing/ms.c @@ -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 diff --git a/examples/msg/tracing/procmig.c b/examples/msg/tracing/procmig.c index c81c26a909..1c832b7ffb 100644 --- a/examples/msg/tracing/procmig.c +++ b/examples/msg/tracing/procmig.c @@ -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 diff --git a/examples/msg/tracing/simple.c b/examples/msg/tracing/simple.c index cb25e32d3d..6f9e6866b2 100644 --- a/examples/msg/tracing/simple.c +++ b/examples/msg/tracing/simple.c @@ -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 diff --git a/examples/msg/tracing/trace_platform.c b/examples/msg/tracing/trace_platform.c index 094c657b75..026524ff55 100644 --- a/examples/msg/tracing/trace_platform.c +++ b/examples/msg/tracing/trace_platform.c @@ -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 diff --git a/examples/msg/tracing/user_variables.c b/examples/msg/tracing/user_variables.c index 5017fc008c..4b585c344a 100644 --- a/examples/msg/tracing/user_variables.c +++ b/examples/msg/tracing/user_variables.c @@ -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 diff --git a/examples/platforms/conf/transform_optorsim_platform.pl b/examples/platforms/conf/transform_optorsim_platform.pl index 5b021e2c75..7e5369af29 100644 --- a/examples/platforms/conf/transform_optorsim_platform.pl +++ b/examples/platforms/conf/transform_optorsim_platform.pl @@ -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 index 0000000000..41bab56704 --- /dev/null +++ b/examples/platforms/content/small_content.txt @@ -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 diff --git a/examples/platforms/generation_scripts/create_hierarchical_clusters.pl b/examples/platforms/generation_scripts/create_hierarchical_clusters.pl index 61384e5b23..33877a1708 100755 --- a/examples/platforms/generation_scripts/create_hierarchical_clusters.pl +++ b/examples/platforms/generation_scripts/create_hierarchical_clusters.pl @@ -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 : p s d where : # - p : 2^p gives the total number of hosts. # - s : cluster size diff --git a/examples/platforms/generation_scripts/enhancedDTDwithHierarchicalCluster.pl b/examples/platforms/generation_scripts/enhancedDTDwithHierarchicalCluster.pl index 1acf037d3f..654f604f62 100755 --- a/examples/platforms/generation_scripts/enhancedDTDwithHierarchicalCluster.pl +++ b/examples/platforms/generation_scripts/enhancedDTDwithHierarchicalCluster.pl @@ -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. diff --git a/examples/platforms/generation_scripts/generate_g5k_platform.pl b/examples/platforms/generation_scripts/generate_g5k_platform.pl index a69de09331..023ffacc4f 100755 --- a/examples/platforms/generation_scripts/generate_g5k_platform.pl +++ b/examples/platforms/generation_scripts/generate_g5k_platform.pl @@ -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; diff --git a/examples/platforms/generation_scripts/generate_g5k_platform_cabinets.pl b/examples/platforms/generation_scripts/generate_g5k_platform_cabinets.pl index ac9084044f..220565087b 100755 --- a/examples/platforms/generation_scripts/generate_g5k_platform_cabinets.pl +++ b/examples/platforms/generation_scripts/generate_g5k_platform_cabinets.pl @@ -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; diff --git a/examples/platforms/storage.xml b/examples/platforms/storage.xml index 84310bd70e..7f755de7d1 100644 --- a/examples/platforms/storage.xml +++ b/examples/platforms/storage.xml @@ -12,50 +12,51 @@ - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/platforms/syscoord/generate_peer_platform.pl b/examples/platforms/syscoord/generate_peer_platform.pl index 659ae83988..a01bcebd1e 100755 --- a/examples/platforms/syscoord/generate_peer_platform.pl +++ b/examples/platforms/syscoord/generate_peer_platform.pl @@ -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 index 0000000000..3ec3036248 --- /dev/null +++ b/examples/platforms/torus_cluster.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/examples/scala/masterslave/masterslave.tesh b/examples/scala/masterslave/masterslave.tesh index ee1d2074b8..81be5cfed6 100644 --- a/examples/scala/masterslave/masterslave.tesh +++ b/examples/scala/masterslave/masterslave.tesh @@ -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. diff --git a/examples/simdag/dax/dax_test.c b/examples/simdag/dax/dax_test.c index 99ec01eff6..d33f9f8182 100644 --- a/examples/simdag/dax/dax_test.c +++ b/examples/simdag/dax/dax_test.c @@ -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 diff --git a/examples/simdag/dax/generate_forkjoin.pl b/examples/simdag/dax/generate_forkjoin.pl index ba0bcd90eb..aafcab1f55 100755 --- a/examples/simdag/dax/generate_forkjoin.pl +++ b/examples/simdag/dax/generate_forkjoin.pl @@ -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"; diff --git a/examples/simdag/dax/generate_strassen.pl b/examples/simdag/dax/generate_strassen.pl index 0166b14b9b..ec59f83884 100755 --- a/examples/simdag/dax/generate_strassen.pl +++ b/examples/simdag/dax/generate_strassen.pl @@ -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 { diff --git a/examples/simdag/dot/dot_test.c b/examples/simdag/dot/dot_test.c index e5863347a9..6f62578c4a 100644 --- a/examples/simdag/dot/dot_test.c +++ b/examples/simdag/dot/dot_test.c @@ -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 diff --git a/examples/simdag/dot/dot_test2.c b/examples/simdag/dot/dot_test2.c index ea5a4c7f5e..d065aad847 100644 --- a/examples/simdag/dot/dot_test2.c +++ b/examples/simdag/dot/dot_test2.c @@ -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 diff --git a/examples/simdag/dot/ptg_test.c b/examples/simdag/dot/ptg_test.c index f206ffff98..cdaf55547b 100644 --- a/examples/simdag/dot/ptg_test.c +++ b/examples/simdag/dot/ptg_test.c @@ -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 diff --git a/examples/simdag/dot/simulate_dot.c b/examples/simdag/dot/simulate_dot.c index 880fe56d2e..e16cb56819 100644 --- a/examples/simdag/dot/simulate_dot.c +++ b/examples/simdag/dot/simulate_dot.c @@ -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 diff --git a/examples/simdag/goal/goal_test.c b/examples/simdag/goal/goal_test.c index 399125681f..fa2251f6f1 100644 --- a/examples/simdag/goal/goal_test.c +++ b/examples/simdag/goal/goal_test.c @@ -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 #include #include "simdag/simdag.h" diff --git a/examples/simdag/io/io.tesh b/examples/simdag/io/io.tesh index 201b14736e..928bd2e624 100644 --- a/examples/simdag/io/io.tesh +++ b/examples/simdag/io/io.tesh @@ -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' diff --git a/examples/simdag/io/sd_io.c b/examples/simdag/io/sd_io.c index 5d3070350b..9d62bc67b0 100644 --- a/examples/simdag/io/sd_io.c +++ b/examples/simdag/io/sd_io.c @@ -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 diff --git a/examples/simdag/metaxml/sd_meta.c b/examples/simdag/metaxml/sd_meta.c index 17947d72dc..d126b9d5f5 100644 --- a/examples/simdag/metaxml/sd_meta.c +++ b/examples/simdag/metaxml/sd_meta.c @@ -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 diff --git a/examples/simdag/platform_script.lua b/examples/simdag/platform_script.lua index b60cfbacf0..f72f9b3231 100644 --- a/examples/simdag/platform_script.lua +++ b/examples/simdag/platform_script.lua @@ -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"}; diff --git a/examples/simdag/properties/sd_prop.c b/examples/simdag/properties/sd_prop.c index 88bfb7d3b8..57367620af 100644 --- a/examples/simdag/properties/sd_prop.c +++ b/examples/simdag/properties/sd_prop.c @@ -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 diff --git a/examples/simdag/scheduling/minmin_test.c b/examples/simdag/scheduling/minmin_test.c index 97947d09a5..87907184d4 100644 --- a/examples/simdag/scheduling/minmin_test.c +++ b/examples/simdag/scheduling/minmin_test.c @@ -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 diff --git a/examples/simdag/sd_avail.c b/examples/simdag/sd_avail.c index 4e75195382..51eec52c09 100644 --- a/examples/simdag/sd_avail.c +++ b/examples/simdag/sd_avail.c @@ -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 diff --git a/examples/simdag/sd_comm_throttling.c b/examples/simdag/sd_comm_throttling.c index 1364f6e73a..b43af3709a 100644 --- a/examples/simdag/sd_comm_throttling.c +++ b/examples/simdag/sd_comm_throttling.c @@ -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/examples/simdag/sd_fail.c b/examples/simdag/sd_fail.c index 0338b0a151..eb1fd82cd7 100644 --- a/examples/simdag/sd_fail.c +++ b/examples/simdag/sd_fail.c @@ -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/examples/simdag/sd_seq_access.c b/examples/simdag/sd_seq_access.c index a35b80aac3..e4cb0e6bff 100644 --- a/examples/simdag/sd_seq_access.c +++ b/examples/simdag/sd_seq_access.c @@ -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 diff --git a/examples/simdag/sd_test.c b/examples/simdag/sd_test.c index bd980808e3..f3e1d5da56 100644 --- a/examples/simdag/sd_test.c +++ b/examples/simdag/sd_test.c @@ -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 diff --git a/examples/simdag/sd_test2.c b/examples/simdag/sd_test2.c index 3eff0d3073..781a7d4ef7 100644 --- a/examples/simdag/sd_test2.c +++ b/examples/simdag/sd_test2.c @@ -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 diff --git a/examples/simdag/sd_typed_tasks_test.c b/examples/simdag/sd_typed_tasks_test.c index f2621663e8..c64bacb89c 100644 --- a/examples/simdag/sd_typed_tasks_test.c +++ b/examples/simdag/sd_typed_tasks_test.c @@ -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/examples/simdag/simdag_trace.c b/examples/simdag/simdag_trace.c index 737f84a77d..b93f1a219f 100644 --- a/examples/simdag/simdag_trace.c +++ b/examples/simdag/simdag_trace.c @@ -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 diff --git a/examples/simdag/test_simdag.in b/examples/simdag/test_simdag.in index 686b26e365..d6e3291f6e 100644 --- a/examples/simdag/test_simdag.in +++ b/examples/simdag/test_simdag.in @@ -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 diff --git a/examples/smpi/MM/2.5D_MM.c b/examples/smpi/MM/2.5D_MM.c index c83548ed8d..041342e8a0 100644 --- a/examples/smpi/MM/2.5D_MM.c +++ b/examples/smpi/MM/2.5D_MM.c @@ -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 * diff --git a/examples/smpi/MM/2.5D_MM.h b/examples/smpi/MM/2.5D_MM.h index 6a92c33f70..3415d6b29e 100644 --- a/examples/smpi/MM/2.5D_MM.h +++ b/examples/smpi/MM/2.5D_MM.h @@ -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 double two_dot_five( size_t m, size_t k, size_t n, diff --git a/examples/smpi/MM/MM_mpi.c b/examples/smpi/MM/MM_mpi.c index d112cdea18..871f83e4df 100644 --- a/examples/smpi/MM/MM_mpi.c +++ b/examples/smpi/MM/MM_mpi.c @@ -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 * diff --git a/examples/smpi/MM/Matrix_init.c b/examples/smpi/MM/Matrix_init.c index 7492f434d5..fe56602dec 100644 --- a/examples/smpi/MM/Matrix_init.c +++ b/examples/smpi/MM/Matrix_init.c @@ -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 #include diff --git a/examples/smpi/MM/Matrix_init.h b/examples/smpi/MM/Matrix_init.h index a4c04d0db1..223f7122ca 100644 --- a/examples/smpi/MM/Matrix_init.h +++ b/examples/smpi/MM/Matrix_init.h @@ -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 //#undef CYCLIC #define CYCLIC diff --git a/examples/smpi/MM/Summa.c b/examples/smpi/MM/Summa.c index b2fb9aaa8a..cb51445097 100644 --- a/examples/smpi/MM/Summa.c +++ b/examples/smpi/MM/Summa.c @@ -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 * diff --git a/examples/smpi/MM/Summa.h b/examples/smpi/MM/Summa.h index ef0dcccb40..c0ce2480ed 100644 --- a/examples/smpi/MM/Summa.h +++ b/examples/smpi/MM/Summa.h @@ -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 double Summa( double *a, double *b, double *c, diff --git a/examples/smpi/bcbench.c b/examples/smpi/bcbench.c index 3ae635e9ba..daea198812 100644 --- a/examples/smpi/bcbench.c +++ b/examples/smpi/bcbench.c @@ -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 diff --git a/examples/smpi/energy/energy.tesh b/examples/smpi/energy/energy.tesh index aac06731a5..c77fdd998a 100644 --- a/examples/smpi/energy/energy.tesh +++ b/examples/smpi/energy/energy.tesh @@ -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 diff --git a/examples/smpi/energy/f77/energy.tesh b/examples/smpi/energy/f77/energy.tesh index 86ceca6c50..c23f3f8a53 100644 --- a/examples/smpi/energy/f77/energy.tesh +++ b/examples/smpi/energy/f77/energy.tesh @@ -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. diff --git a/examples/smpi/energy/f77/sef.f b/examples/smpi/energy/f77/sef.f index a1588bef20..51a6ea277a 100644 --- a/examples/smpi/energy/f77/sef.f +++ b/examples/smpi/energy/f77/sef.f @@ -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) diff --git a/examples/smpi/energy/f90/energy.tesh b/examples/smpi/energy/f90/energy.tesh index fe1859b01b..c39d8bd560 100644 --- a/examples/smpi/energy/f90/energy.tesh +++ b/examples/smpi/energy/f90/energy.tesh @@ -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 diff --git a/examples/smpi/energy/f90/sef90.f90 b/examples/smpi/energy/f90/sef90.f90 index 59b3fbfb61..f1db81a943 100644 --- a/examples/smpi/energy/f90/sef90.f90 +++ b/examples/smpi/energy/f90/sef90.f90 @@ -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 diff --git a/examples/smpi/energy/platform.xml b/examples/smpi/energy/platform.xml index ad57ccaf10..cb6d3325fc 100644 --- a/examples/smpi/energy/platform.xml +++ b/examples/smpi/energy/platform.xml @@ -12,5 +12,9 @@ + + + + diff --git a/examples/smpi/energy/se.c b/examples/smpi/energy/se.c index 6632e3d880..ba969e56ee 100644 --- a/examples/smpi/energy/se.c +++ b/examples/smpi/energy/se.c @@ -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 #include #include @@ -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(); diff --git a/examples/smpi/mc/bugged1.c b/examples/smpi/mc/bugged1.c index 7047affe76..b319f0f460 100644 --- a/examples/smpi/mc/bugged1.c +++ b/examples/smpi/mc/bugged1.c @@ -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 diff --git a/examples/smpi/mc/bugged1_liveness.c b/examples/smpi/mc/bugged1_liveness.c index eab2b55852..cc784eb8e6 100644 --- a/examples/smpi/mc/bugged1_liveness.c +++ b/examples/smpi/mc/bugged1_liveness.c @@ -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 */ diff --git a/examples/smpi/mc/bugged2.c b/examples/smpi/mc/bugged2.c index fdd691c450..42de583df8 100644 --- a/examples/smpi/mc/bugged2.c +++ b/examples/smpi/mc/bugged2.c @@ -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 diff --git a/examples/smpi/mvmul.c b/examples/smpi/mvmul.c index cacc0da30b..15a9e7e0f7 100644 --- a/examples/smpi/mvmul.c +++ b/examples/smpi/mvmul.c @@ -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 diff --git a/examples/smpi/replay/replay.c b/examples/smpi/replay/replay.c index 4880da348c..06b9f9b869 100644 --- a/examples/smpi/replay/replay.c +++ b/examples/smpi/replay/replay.c @@ -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 diff --git a/examples/smpi/replay/smpi_replay.tesh b/examples/smpi/replay/smpi_replay.tesh index 589c0c8920..4cbef48818 100644 --- a/examples/smpi/replay/smpi_replay.tesh +++ b/examples/smpi/replay/smpi_replay.tesh @@ -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 diff --git a/examples/smpi/tracing/smpi_traced.c b/examples/smpi/tracing/smpi_traced.c index fdde9a549f..18ee76cc7b 100644 --- a/examples/smpi/tracing/smpi_traced.c +++ b/examples/smpi/tracing/smpi_traced.c @@ -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 diff --git a/examples/smpi/tracing/smpi_traced.tesh b/examples/smpi/tracing/smpi_traced.tesh index b983230d00..a12e36feb5 100644 --- a/examples/smpi/tracing/smpi_traced.tesh +++ b/examples/smpi/tracing/smpi_traced.tesh @@ -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' diff --git a/examples/smpi/tracing/smpi_traced_simple.c b/examples/smpi/tracing/smpi_traced_simple.c index ff92c0e3f9..027c5f8055 100644 --- a/examples/smpi/tracing/smpi_traced_simple.c +++ b/examples/smpi/tracing/smpi_traced_simple.c @@ -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 diff --git a/examples/xbt/sem_basic.c b/examples/xbt/sem_basic.c index ebf2ecb4a2..7a7299a9db 100644 --- a/examples/xbt/sem_basic.c +++ b/examples/xbt/sem_basic.c @@ -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 diff --git a/examples/xbt/sem_sched.c b/examples/xbt/sem_sched.c index d69ff2697f..c6af2d926c 100644 --- a/examples/xbt/sem_sched.c +++ b/examples/xbt/sem_sched.c @@ -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 diff --git a/include/instr/instr.h b/include/instr/instr.h index 39798356b5..325a0ae024 100644 --- a/include/instr/instr.h +++ b/include/instr/instr.h @@ -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 diff --git a/include/instr/jedule/jedule_events.h b/include/instr/jedule/jedule_events.h index 1a665a8a28..1e88da8c89 100644 --- a/include/instr/jedule/jedule_events.h +++ b/include/instr/jedule/jedule_events.h @@ -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_ diff --git a/include/instr/jedule/jedule_output.h b/include/instr/jedule/jedule_output.h index 1e3287a65e..04a134a9fc 100644 --- a/include/instr/jedule/jedule_output.h +++ b/include/instr/jedule/jedule_output.h @@ -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_ diff --git a/include/instr/jedule/jedule_platform.h b/include/instr/jedule/jedule_platform.h index 282821eb02..f015b77e13 100644 --- a/include/instr/jedule/jedule_platform.h +++ b/include/instr/jedule/jedule_platform.h @@ -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_ diff --git a/include/instr/jedule/jedule_sd_binding.h b/include/instr/jedule/jedule_sd_binding.h index 74c3cb39f9..53d62eed62 100644 --- a/include/instr/jedule/jedule_sd_binding.h +++ b/include/instr/jedule/jedule_sd_binding.h @@ -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_ diff --git a/include/msg/datatypes.h b/include/msg/datatypes.h index efee4e6efd..ed95a57cf0 100644 --- a/include/msg/datatypes.h +++ b/include/msg/datatypes.h @@ -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; diff --git a/include/msg/msg.h b/include/msg/msg.h index 144d42baa2..9f983ca1b1 100644 --- a/include/msg/msg.h +++ b/include/msg/msg.h @@ -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) diff --git a/include/simdag/datatypes.h b/include/simdag/datatypes.h index f80d5ef6df..b4399cdfb6 100644 --- a/include/simdag/datatypes.h +++ b/include/simdag/datatypes.h @@ -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 diff --git a/include/simdag/simdag.h b/include/simdag/simdag.h index d78288f41b..4f2a3e54f5 100644 --- a/include/simdag/simdag.h +++ b/include/simdag/simdag.h @@ -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 index 0000000000..c407a51b0c --- /dev/null +++ b/include/simgrid.h @@ -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 + +#include +#include +#include +#include +#include +#include + +// 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 index 0000000000..006da0af5c --- /dev/null +++ b/include/simgrid/datatypes.h @@ -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_ */ diff --git a/include/simgrid/modelchecker.h b/include/simgrid/modelchecker.h index f97be05bf3..34d9124df0 100644 --- a/include/simgrid/modelchecker.h +++ b/include/simgrid/modelchecker.h @@ -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 */ diff --git a/include/simgrid/platf.h b/include/simgrid/platf.h index ff9095d504..f3619f3bd5 100644 --- a/include/simgrid/platf.h +++ b/include/simgrid/platf.h @@ -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 @@ -11,12 +11,15 @@ #include -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 */ diff --git a/include/simgrid/platf_generator.h b/include/simgrid/platf_generator.h index 84a385babe..fbe912c3fa 100644 --- a/include/simgrid/platf_generator.h +++ b/include/simgrid/platf_generator.h @@ -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 index 0000000000..0855430e45 --- /dev/null +++ b/include/simgrid/plugins.h @@ -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_ */ diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index ecdd1d62ed..91a6269e50 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -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 ***************************/ diff --git a/include/simgrid_config.h.in b/include/simgrid_config.h.in index 789464f23e..b3a3fdfe18 100644 --- a/include/simgrid_config.h.in +++ b/include/simgrid_config.h.in @@ -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 diff --git a/include/smpi/mpi.h b/include/smpi/mpi.h index e8aa3eae90..4224e7ffbc 100644 --- a/include/smpi/mpi.h +++ b/include/smpi/mpi.h @@ -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 diff --git a/include/smpi/mpif.h.in b/include/smpi/mpif.h.in index 213fe84904..b74f559156 100644 --- a/include/smpi/mpif.h.in +++ b/include/smpi/mpif.h.in @@ -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) @@ -109,12 +107,14 @@ 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) @@ -122,7 +122,6 @@ 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 diff --git a/include/smpi/smpi.h b/include/smpi/smpi.h index 3901734b77..5fd5a7c651 100644 --- a/include/smpi/smpi.h +++ b/include/smpi/smpi.h @@ -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); diff --git a/include/smpi/smpi_cocci.h b/include/smpi/smpi_cocci.h index 534c44369b..c4ea46fdbf 100644 --- a/include/smpi/smpi_cocci.h +++ b/include/smpi/smpi_cocci.h @@ -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 @@ -13,18 +13,18 @@ #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); \ } diff --git a/include/smpi/smpi_main.h b/include/smpi/smpi_main.h index 08874c7c9e..b22ab7c5f2 100644 --- a/include/smpi/smpi_main.h +++ b/include/smpi/smpi_main.h @@ -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);\ diff --git a/include/smpi/smpif.h.in b/include/smpi/smpif.h.in index e558101ad8..a61dabcca4 100644 --- a/include/smpi/smpif.h.in +++ b/include/smpi/smpif.h.in @@ -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 @@ -13,13 +13,15 @@ #include #include +/* those are defined in f2c.h */ +#undef min +#undef max #include 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) \ { \ diff --git a/include/surf/simgrid_dtd.h b/include/surf/simgrid_dtd.h index df32d1b768..cb57fd847c 100644 --- a/include/surf/simgrid_dtd.h +++ b/include/surf/simgrid_dtd.h @@ -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; diff --git a/include/surf/surf_routing.h b/include/surf/surf_routing.h index d9e91efaa0..5c0e90c3ff 100644 --- a/include/surf/surf_routing.h +++ b/include/surf/surf_routing.h @@ -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 */ diff --git a/include/surf/surfxml_parse.h b/include/surf/surfxml_parse.h index b143fa848e..8431616dfd 100644 --- a/include/surf/surfxml_parse.h +++ b/include/surf/surfxml_parse.h @@ -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 diff --git a/include/xbt.h b/include/xbt.h index 96c204ad6c..21dd04cdd3 100644 --- a/include/xbt.h +++ b/include/xbt.h @@ -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 diff --git a/include/xbt/RngStream.h b/include/xbt/RngStream.h index cb3041f0f1..8b80e54533 100644 --- a/include/xbt/RngStream.h +++ b/include/xbt/RngStream.h @@ -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 diff --git a/include/xbt/asserts.h b/include/xbt/asserts.h index 4d90d1dbf7..58c226d4e5 100644 --- a/include/xbt/asserts.h +++ b/include/xbt/asserts.h @@ -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 diff --git a/include/xbt/automaton.h b/include/xbt/automaton.h index 0cdf31f64c..c24453f727 100644 --- a/include/xbt/automaton.h +++ b/include/xbt/automaton.h @@ -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; diff --git a/include/xbt/config.h b/include/xbt/config.h index cc255f3f3e..f109024ae5 100644 --- a/include/xbt/config.h +++ b/include/xbt/config.h @@ -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 diff --git a/include/xbt/cunit.h b/include/xbt/cunit.h index 64400346a9..37df800cab 100644 --- a/include/xbt/cunit.h +++ b/include/xbt/cunit.h @@ -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 diff --git a/include/xbt/dict.h b/include/xbt/dict.h index 4f2a88c3be..41a4aba22d 100644 --- a/include/xbt/dict.h +++ b/include/xbt/dict.h @@ -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) { diff --git a/include/xbt/dynar.h b/include/xbt/dynar.h index f0c14cc36b..823dd418a2 100644 --- a/include/xbt/dynar.h +++ b/include/xbt/dynar.h @@ -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 diff --git a/include/xbt/ex.h b/include/xbt/ex.h index e57f166370..dd79d3286d 100644 --- a/include/xbt/ex.h +++ b/include/xbt/ex.h @@ -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 */ /* Copyright (c) 2002-2004 The OSSP Project */ /* Copyright (c) 2002-2004 Cable & Wireless */ @@ -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); diff --git a/include/xbt/fifo.h b/include/xbt/fifo.h index e1871bac05..c57456bd7e 100644 --- a/include/xbt/fifo.h +++ b/include/xbt/fifo.h @@ -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 diff --git a/include/xbt/function_types.h b/include/xbt/function_types.h index 42a8cf1000..18d8c25168 100644 --- a/include/xbt/function_types.h +++ b/include/xbt/function_types.h @@ -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 diff --git a/include/xbt/graph.h b/include/xbt/graph.h index c92df8c060..6fb571898f 100644 --- a/include/xbt/graph.h +++ b/include/xbt/graph.h @@ -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 diff --git a/include/xbt/graphxml_parse.h b/include/xbt/graphxml_parse.h index 8f45895ca5..c10c02922f 100644 --- a/include/xbt/graphxml_parse.h +++ b/include/xbt/graphxml_parse.h @@ -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 diff --git a/include/xbt/hash.h b/include/xbt/hash.h index dcefb7c44e..a5014dd525 100644 --- a/include/xbt/hash.h +++ b/include/xbt/hash.h @@ -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 diff --git a/include/xbt/heap.h b/include/xbt/heap.h index 29a9149284..02fdf0d7c0 100644 --- a/include/xbt/heap.h +++ b/include/xbt/heap.h @@ -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 */ diff --git a/include/xbt/lib.h b/include/xbt/lib.h index 5139ff8264..cfb77025af 100644 --- a/include/xbt/lib.h +++ b/include/xbt/lib.h @@ -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) diff --git a/include/xbt/log.h b/include/xbt/log.h index 697cb50dd2..c33d0ff2c1 100644 --- a/include/xbt/log.h +++ b/include/xbt/log.h @@ -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) \ diff --git a/include/xbt/mallocator.h b/include/xbt/mallocator.h index dcf75a56a9..6241313a58 100644 --- a/include/xbt/mallocator.h +++ b/include/xbt/mallocator.h @@ -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 diff --git a/include/xbt/matrix.h b/include/xbt/matrix.h index 5ce5babe45..dfbc6bb5c7 100644 --- a/include/xbt/matrix.h +++ b/include/xbt/matrix.h @@ -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 diff --git a/include/xbt/misc.h b/include/xbt/misc.h index a6f65de479..43fb3474a3 100644 --- a/include/xbt/misc.h +++ b/include/xbt/misc.h @@ -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 diff --git a/include/xbt/mmalloc.h b/include/xbt/mmalloc.h index cf50ddf312..dc3a51c864 100644 --- a/include/xbt/mmalloc.h +++ b/include/xbt/mmalloc.h @@ -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 diff --git a/include/xbt/module.h b/include/xbt/module.h index b5b9a828d2..9405484950 100644 --- a/include/xbt/module.h +++ b/include/xbt/module.h @@ -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 @@ -11,6 +11,11 @@ #include /* 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 */ diff --git a/include/xbt/parmap.h b/include/xbt/parmap.h index 624d2783cd..51e5cc6ea7 100644 --- a/include/xbt/parmap.h +++ b/include/xbt/parmap.h @@ -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 diff --git a/include/xbt/peer.h b/include/xbt/peer.h index a0767c0b33..4e402c0d08 100644 --- a/include/xbt/peer.h +++ b/include/xbt/peer.h @@ -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 diff --git a/include/xbt/queue.h b/include/xbt/queue.h index b23dd50c5d..4576938c3a 100644 --- a/include/xbt/queue.h +++ b/include/xbt/queue.h @@ -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 diff --git a/include/xbt/replay.h b/include/xbt/replay.h index 069052d687..675a5ad6a9 100644 --- a/include/xbt/replay.h +++ b/include/xbt/replay.h @@ -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); diff --git a/include/xbt/set.h b/include/xbt/set.h index 6264d25df1..1d87320332 100644 --- a/include/xbt/set.h +++ b/include/xbt/set.h @@ -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 diff --git a/include/xbt/setset.h b/include/xbt/setset.h index 2c11a20323..f325d2fa30 100644 --- a/include/xbt/setset.h +++ b/include/xbt/setset.h @@ -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" diff --git a/include/xbt/str.h b/include/xbt/str.h index dc164b72fb..be647e8a0c 100644 --- a/include/xbt/str.h +++ b/include/xbt/str.h @@ -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 diff --git a/include/xbt/strbuff.h b/include/xbt/strbuff.h index 3ed91f42b5..79b2658265 100644 --- a/include/xbt/strbuff.h +++ b/include/xbt/strbuff.h @@ -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 diff --git a/include/xbt/swag.h b/include/xbt/swag.h index 2e3bed9751..df2bdfde4d 100644 --- a/include/xbt/swag.h +++ b/include/xbt/swag.h @@ -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 diff --git a/include/xbt/synchro_core.h b/include/xbt/synchro_core.h index 3a3d3e2423..c41c26c648 100644 --- a/include/xbt/synchro_core.h +++ b/include/xbt/synchro_core.h @@ -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 diff --git a/include/xbt/sysdep.h b/include/xbt/sysdep.h index 8d3a61ecc2..390ef24a7d 100644 --- a/include/xbt/sysdep.h +++ b/include/xbt/sysdep.h @@ -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 diff --git a/include/xbt/virtu.h b/include/xbt/virtu.h index cf25980d1a..3b0a63e086 100644 --- a/include/xbt/virtu.h +++ b/include/xbt/virtu.h @@ -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__ diff --git a/include/xbt/win32_ucontext.h b/include/xbt/win32_ucontext.h index 0cc53b69bc..f58a6d9e98 100644 --- a/include/xbt/win32_ucontext.h +++ b/include/xbt/win32_ucontext.h @@ -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. */ + /* * win32-ucontext: Unix ucontext_t operations on Windows platforms * Copyright(C) 2007 Panagiotis E. Hadjidoukas diff --git a/include/xbt/xbt_os_thread.h b/include/xbt/xbt_os_thread.h index 6283cfcee3..eede122294 100644 --- a/include/xbt/xbt_os_thread.h +++ b/include/xbt/xbt_os_thread.h @@ -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 diff --git a/src/bindings/bindings_global.c b/src/bindings/bindings_global.c index c62642451f..807cf179a4 100644 --- a/src/bindings/bindings_global.c +++ b/src/bindings/bindings_global.c @@ -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 diff --git a/src/bindings/java/MANIFEST.MF b/src/bindings/java/MANIFEST.MF.in similarity index 98% rename from src/bindings/java/MANIFEST.MF rename to src/bindings/java/MANIFEST.MF.in index 8d2c03944a..fc7cbbae96 100644 --- a/src/bindings/java/MANIFEST.MF +++ b/src/bindings/java/MANIFEST.MF.in @@ -2,4 +2,3 @@ Manifest-Version: 1.0 Built-By: Da SimGrid team Main-Class: org.simgrid.msg.Msg Class-Path: . - diff --git a/src/bindings/java/jmsg.c b/src/bindings/java/jmsg.c index 3599905e4c..bfc4115af6 100644 --- a/src/bindings/java/jmsg.c +++ b/src/bindings/java/jmsg.c @@ -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 #include @@ -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); diff --git a/src/bindings/java/jmsg.h b/src/bindings/java/jmsg.h index 092bcfdd34..c6c8625502 100644 --- a/src/bindings/java/jmsg.h +++ b/src/bindings/java/jmsg.h @@ -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 #include +extern int JAVA_HOST_LEVEL; +extern xbt_lib_t host_lib; + JavaVM *get_java_VM(void); JNIEnv *get_current_thread_env(void); /** diff --git a/src/bindings/java/jmsg_as.c b/src/bindings/java/jmsg_as.c index 3589783021..a3daec624b 100644 --- a/src/bindings/java/jmsg_as.c +++ b/src/bindings/java/jmsg_as.c @@ -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)); diff --git a/src/bindings/java/jmsg_as.h b/src/bindings/java/jmsg_as.h index 139c2868e3..ad928b65cb 100644 --- a/src/bindings/java/jmsg_as.h +++ b/src/bindings/java/jmsg_as.h @@ -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 diff --git a/src/bindings/java/jmsg_comm.c b/src/bindings/java/jmsg_comm.c index 6a4a66e424..85b70d673a 100644 --- a/src/bindings/java/jmsg_comm.c +++ b/src/bindings/java/jmsg_comm.c @@ -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" diff --git a/src/bindings/java/jmsg_comm.h b/src/bindings/java/jmsg_comm.h index 13b1b7ee38..5cb7ba5d98 100644 --- a/src/bindings/java/jmsg_comm.h +++ b/src/bindings/java/jmsg_comm.h @@ -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 diff --git a/src/bindings/java/jmsg_file.c b/src/bindings/java/jmsg_file.c index fb2557ada8..f8adbdabfd 100644 --- a/src/bindings/java/jmsg_file.c +++ b/src/bindings/java/jmsg_file.c @@ -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) { diff --git a/src/bindings/java/jmsg_file.h b/src/bindings/java/jmsg_file.h index f79ae22e42..05dc5751ff 100644 --- a/src/bindings/java/jmsg_file.h +++ b/src/bindings/java/jmsg_file.h @@ -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 diff --git a/src/bindings/java/jmsg_host.c b/src/bindings/java/jmsg_host.c index 9a3a1ff99e..81ed7f7340 100644 --- a/src/bindings/java/jmsg_host.c +++ b/src/bindings/java/jmsg_host.c @@ -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)); diff --git a/src/bindings/java/jmsg_host.h b/src/bindings/java/jmsg_host.h index 5eff53481d..429f8f3660 100644 --- a/src/bindings/java/jmsg_host.h +++ b/src/bindings/java/jmsg_host.h @@ -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 diff --git a/src/bindings/java/jmsg_process.c b/src/bindings/java/jmsg_process.c index ec9c9d4fc7..fd7b069842 100644 --- a/src/bindings/java/jmsg_process.c +++ b/src/bindings/java/jmsg_process.c @@ -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" diff --git a/src/bindings/java/jmsg_process.h b/src/bindings/java/jmsg_process.h index b77e9869b2..54b211d702 100644 --- a/src/bindings/java/jmsg_process.h +++ b/src/bindings/java/jmsg_process.h @@ -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 diff --git a/src/bindings/java/jmsg_rngstream.c b/src/bindings/java/jmsg_rngstream.c index d8e2c47c07..5bf195b31a 100644 --- a/src/bindings/java/jmsg_rngstream.c +++ b/src/bindings/java/jmsg_rngstream.c @@ -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" diff --git a/src/bindings/java/jmsg_rngstream.h b/src/bindings/java/jmsg_rngstream.h index e41be2af3a..e50b218de9 100644 --- a/src/bindings/java/jmsg_rngstream.h +++ b/src/bindings/java/jmsg_rngstream.h @@ -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 diff --git a/src/bindings/java/jmsg_synchro.c b/src/bindings/java/jmsg_synchro.c index 2fd40e4014..71ba2ef516 100644 --- a/src/bindings/java/jmsg_synchro.c +++ b/src/bindings/java/jmsg_synchro.c @@ -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 diff --git a/src/bindings/java/jmsg_synchro.h b/src/bindings/java/jmsg_synchro.h index e5e1c42400..a42e9b6dd3 100644 --- a/src/bindings/java/jmsg_synchro.h +++ b/src/bindings/java/jmsg_synchro.h @@ -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 diff --git a/src/bindings/java/jmsg_task.c b/src/bindings/java/jmsg_task.c index 01c30ce3aa..77aa3158e7 100644 --- a/src/bindings/java/jmsg_task.c +++ b/src/bindings/java/jmsg_task.c @@ -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 diff --git a/src/bindings/java/jmsg_task.h b/src/bindings/java/jmsg_task.h index 197d86a6da..068dee06e8 100644 --- a/src/bindings/java/jmsg_task.h +++ b/src/bindings/java/jmsg_task.h @@ -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 diff --git a/src/bindings/java/jmsg_vm.c b/src/bindings/java/jmsg_vm.c index 5c54c1f2b5..e508db122a 100644 --- a/src/bindings/java/jmsg_vm.c +++ b/src/bindings/java/jmsg_vm.c @@ -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; } diff --git a/src/bindings/java/jmsg_vm.h b/src/bindings/java/jmsg_vm.h index 6bf42848e3..ba07003d22 100644 --- a/src/bindings/java/jmsg_vm.h +++ b/src/bindings/java/jmsg_vm.h @@ -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); diff --git a/src/bindings/java/jtrace.c b/src/bindings/java/jtrace.c index d18072c57c..4e602b4a7e 100644 --- a/src/bindings/java/jtrace.c +++ b/src/bindings/java/jtrace.c @@ -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 ;) diff --git a/src/bindings/java/jtrace.h b/src/bindings/java/jtrace.h index 62d9160574..8163775b62 100644 --- a/src/bindings/java/jtrace.h +++ b/src/bindings/java/jtrace.h @@ -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 /* Header for class org_simgrid_trace_Trace */ diff --git a/src/bindings/java/jxbt_utilities.c b/src/bindings/java/jxbt_utilities.c index 0f270e0f46..9d6e309748 100644 --- a/src/bindings/java/jxbt_utilities.c +++ b/src/bindings/java/jxbt_utilities.c @@ -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 /* abort */ #include "xbt/misc.h" diff --git a/src/bindings/java/jxbt_utilities.h b/src/bindings/java/jxbt_utilities.h index 79450a28d1..401fe85785 100644 --- a/src/bindings/java/jxbt_utilities.h +++ b/src/bindings/java/jxbt_utilities.h @@ -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 diff --git a/src/bindings/java/org/simgrid/msg/As.java b/src/bindings/java/org/simgrid/msg/As.java index 0ce553261f..e8a7a983d6 100644 --- a/src/bindings/java/org/simgrid/msg/As.java +++ b/src/bindings/java/org/simgrid/msg/As.java @@ -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 { diff --git a/src/bindings/java/org/simgrid/msg/Comm.java b/src/bindings/java/org/simgrid/msg/Comm.java index a085ed0c05..672e70289c 100644 --- a/src/bindings/java/org/simgrid/msg/Comm.java +++ b/src/bindings/java/org/simgrid/msg/Comm.java @@ -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. diff --git a/src/bindings/java/org/simgrid/msg/File.java b/src/bindings/java/org/simgrid/msg/File.java index 89c7b975d4..db3ff43ac6 100644 --- a/src/bindings/java/org/simgrid/msg/File.java +++ b/src/bindings/java/org/simgrid/msg/File.java @@ -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; diff --git a/src/bindings/java/org/simgrid/msg/Host.java b/src/bindings/java/org/simgrid/msg/Host.java index fc48cbac85..a1d57363e3 100644 --- a/src/bindings/java/org/simgrid/msg/Host.java +++ b/src/bindings/java/org/simgrid/msg/Host.java @@ -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(); diff --git a/src/bindings/java/org/simgrid/msg/HostFailureException.java b/src/bindings/java/org/simgrid/msg/HostFailureException.java index cc328f5a3c..01eb5b9775 100644 --- a/src/bindings/java/org/simgrid/msg/HostFailureException.java +++ b/src/bindings/java/org/simgrid/msg/HostFailureException.java @@ -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; diff --git a/src/bindings/java/org/simgrid/msg/HostNotFoundException.java b/src/bindings/java/org/simgrid/msg/HostNotFoundException.java index 3bcc46cd35..86b830e011 100644 --- a/src/bindings/java/org/simgrid/msg/HostNotFoundException.java +++ b/src/bindings/java/org/simgrid/msg/HostNotFoundException.java @@ -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; diff --git a/src/bindings/java/org/simgrid/msg/JniException.java b/src/bindings/java/org/simgrid/msg/JniException.java index ce2fd39d5b..ee3cafe397 100644 --- a/src/bindings/java/org/simgrid/msg/JniException.java +++ b/src/bindings/java/org/simgrid/msg/JniException.java @@ -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; /** diff --git a/src/bindings/java/org/simgrid/msg/Msg.java b/src/bindings/java/org/simgrid/msg/Msg.java index 93409c5cf8..108c7b53b7 100644 --- a/src/bindings/java/org/simgrid/msg/Msg.java +++ b/src/bindings/java/org/simgrid/msg/Msg.java @@ -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); diff --git a/src/bindings/java/org/simgrid/msg/MsgException.java b/src/bindings/java/org/simgrid/msg/MsgException.java index 7baa8eb5f8..166d5e3a76 100644 --- a/src/bindings/java/org/simgrid/msg/MsgException.java +++ b/src/bindings/java/org/simgrid/msg/MsgException.java @@ -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; /** diff --git a/src/bindings/java/org/simgrid/msg/Mutex.java b/src/bindings/java/org/simgrid/msg/Mutex.java index 1b76bb8bb9..96dca06a4b 100644 --- a/src/bindings/java/org/simgrid/msg/Mutex.java +++ b/src/bindings/java/org/simgrid/msg/Mutex.java @@ -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, diff --git a/src/bindings/java/org/simgrid/msg/NativeException.java b/src/bindings/java/org/simgrid/msg/NativeException.java index 39beed78d2..0787db1849 100644 --- a/src/bindings/java/org/simgrid/msg/NativeException.java +++ b/src/bindings/java/org/simgrid/msg/NativeException.java @@ -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 index 0000000000..151fb9532d --- /dev/null +++ b/src/bindings/java/org/simgrid/msg/NativeLib.java @@ -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()); + } +} diff --git a/src/bindings/java/org/simgrid/msg/Process.java b/src/bindings/java/org/simgrid/msg/Process.java index 0077c044aa..2fe319e41e 100644 --- a/src/bindings/java/org/simgrid/msg/Process.java +++ b/src/bindings/java/org/simgrid/msg/Process.java @@ -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; diff --git a/src/bindings/java/org/simgrid/msg/ProcessKilledError.java b/src/bindings/java/org/simgrid/msg/ProcessKilledError.java index 144f7fbc3f..023e5cfa2d 100644 --- a/src/bindings/java/org/simgrid/msg/ProcessKilledError.java +++ b/src/bindings/java/org/simgrid/msg/ProcessKilledError.java @@ -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 diff --git a/src/bindings/java/org/simgrid/msg/ProcessNotFoundException.java b/src/bindings/java/org/simgrid/msg/ProcessNotFoundException.java index 19047e4e1e..6f90ce61de 100644 --- a/src/bindings/java/org/simgrid/msg/ProcessNotFoundException.java +++ b/src/bindings/java/org/simgrid/msg/ProcessNotFoundException.java @@ -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; diff --git a/src/bindings/java/org/simgrid/msg/RngStream.java b/src/bindings/java/org/simgrid/msg/RngStream.java index bc6c3f2cc9..6d5638c0f1 100644 --- a/src/bindings/java/org/simgrid/msg/RngStream.java +++ b/src/bindings/java/org/simgrid/msg/RngStream.java @@ -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 diff --git a/src/bindings/java/org/simgrid/msg/Semaphore.java b/src/bindings/java/org/simgrid/msg/Semaphore.java index c49d9a1b46..f8e4e1444c 100644 --- a/src/bindings/java/org/simgrid/msg/Semaphore.java +++ b/src/bindings/java/org/simgrid/msg/Semaphore.java @@ -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 diff --git a/src/bindings/java/org/simgrid/msg/Task.java b/src/bindings/java/org/simgrid/msg/Task.java index 319aee6b3a..4be7046fad 100644 --- a/src/bindings/java/org/simgrid/msg/Task.java +++ b/src/bindings/java/org/simgrid/msg/Task.java @@ -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. * diff --git a/src/bindings/java/org/simgrid/msg/TaskCancelledException.java b/src/bindings/java/org/simgrid/msg/TaskCancelledException.java index a4fd085605..950899d137 100644 --- a/src/bindings/java/org/simgrid/msg/TaskCancelledException.java +++ b/src/bindings/java/org/simgrid/msg/TaskCancelledException.java @@ -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; diff --git a/src/bindings/java/org/simgrid/msg/TimeoutException.java b/src/bindings/java/org/simgrid/msg/TimeoutException.java index b6b3c3bf21..1600faed78 100644 --- a/src/bindings/java/org/simgrid/msg/TimeoutException.java +++ b/src/bindings/java/org/simgrid/msg/TimeoutException.java @@ -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; diff --git a/src/bindings/java/org/simgrid/msg/TransferFailureException.java b/src/bindings/java/org/simgrid/msg/TransferFailureException.java index 1d6feddb26..9ba2df93c8 100644 --- a/src/bindings/java/org/simgrid/msg/TransferFailureException.java +++ b/src/bindings/java/org/simgrid/msg/TransferFailureException.java @@ -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; diff --git a/src/bindings/java/org/simgrid/msg/VM.java b/src/bindings/java/org/simgrid/msg/VM.java index 5c9c8e333a..f77a4af1ed 100644 --- a/src/bindings/java/org/simgrid/msg/VM.java +++ b/src/bindings/java/org/simgrid/msg/VM.java @@ -1,73 +1,163 @@ -/* - * 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 #include #include @@ -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; } diff --git a/src/bindings/java/smx_context_cojava.h b/src/bindings/java/smx_context_cojava.h index 6fe924e6f4..85b8c03e56 100644 --- a/src/bindings/java/smx_context_cojava.h +++ b/src/bindings/java/smx_context_cojava.h @@ -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 diff --git a/src/bindings/java/smx_context_java.c b/src/bindings/java/smx_context_java.c index 6d4e75c44a..de3518834b 100644 --- a/src/bindings/java/smx_context_java.c +++ b/src/bindings/java/smx_context_java.c @@ -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 #include #include @@ -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; diff --git a/src/bindings/java/smx_context_java.h b/src/bindings/java/smx_context_java.h index a65e41d52b..fbeee1361f 100644 --- a/src/bindings/java/smx_context_java.h +++ b/src/bindings/java/smx_context_java.h @@ -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 diff --git a/src/bindings/lua/lua_comm.c b/src/bindings/lua/lua_comm.c index 0a38965527..138c3099eb 100644 --- a/src/bindings/lua/lua_comm.c +++ b/src/bindings/lua/lua_comm.c @@ -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 diff --git a/src/bindings/lua/lua_host.c b/src/bindings/lua/lua_host.c index 9e33f3c8f8..21c697cf4f 100644 --- a/src/bindings/lua/lua_host.c +++ b/src/bindings/lua/lua_host.c @@ -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; } diff --git a/src/bindings/lua/lua_platf.c b/src/bindings/lua/lua_platf.c index 477e3b9dfa..aa2dc2dfc7 100644 --- a/src/bindings/lua/lua_platf.c +++ b/src/bindings/lua/lua_platf.c @@ -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 diff --git a/src/bindings/lua/lua_private.h b/src/bindings/lua/lua_private.h index e9dc6b1c79..e551413b22 100644 --- a/src/bindings/lua/lua_private.h +++ b/src/bindings/lua/lua_private.h @@ -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 diff --git a/src/bindings/lua/lua_process.c b/src/bindings/lua/lua_process.c index 48782081e6..4ce814f6cd 100644 --- a/src/bindings/lua/lua_process.c +++ b/src/bindings/lua/lua_process.c @@ -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 diff --git a/src/bindings/lua/lua_state_cloner.c b/src/bindings/lua/lua_state_cloner.c index 3f1452fc06..5128ec54d4 100644 --- a/src/bindings/lua/lua_state_cloner.c +++ b/src/bindings/lua/lua_state_cloner.c @@ -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 diff --git a/src/bindings/lua/lua_state_cloner.h b/src/bindings/lua/lua_state_cloner.h index 7129539fc2..0c323e4c1b 100644 --- a/src/bindings/lua/lua_state_cloner.h +++ b/src/bindings/lua/lua_state_cloner.h @@ -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 diff --git a/src/bindings/lua/lua_task.c b/src/bindings/lua/lua_task.c index 8e8e1932be..41c744e334 100644 --- a/src/bindings/lua/lua_task.c +++ b/src/bindings/lua/lua_task.c @@ -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 diff --git a/src/bindings/lua/lua_utils.c b/src/bindings/lua/lua_utils.c index 444f15d791..7ab708b3b8 100644 --- a/src/bindings/lua/lua_utils.c +++ b/src/bindings/lua/lua_utils.c @@ -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 diff --git a/src/bindings/lua/lua_utils.h b/src/bindings/lua/lua_utils.h index 3ccfe8c94a..42e28c228e 100644 --- a/src/bindings/lua/lua_utils.h +++ b/src/bindings/lua/lua_utils.h @@ -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 diff --git a/src/bindings/lua/simgrid_lua.c b/src/bindings/lua/simgrid_lua.c index db5f4e0cb1..2098267bac 100644 --- a/src/bindings/lua/simgrid_lua.c +++ b/src/bindings/lua/simgrid_lua.c @@ -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 diff --git a/src/bindings/lua/simgrid_lua.h b/src/bindings/lua/simgrid_lua.h index af2b38d351..958440d2b3 100644 --- a/src/bindings/lua/simgrid_lua.h +++ b/src/bindings/lua/simgrid_lua.h @@ -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. */ diff --git a/src/context_sysv_config.h.in b/src/context_sysv_config.h.in index 3217ead2df..6643fd972d 100644 --- a/src/context_sysv_config.h.in +++ b/src/context_sysv_config.h.in @@ -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. */ diff --git a/src/include/instr/instr_interface.h b/src/include/instr/instr_interface.h index 52664c7d4a..0901fbd306 100644 --- a/src/include/instr/instr_interface.h +++ b/src/include/instr/instr_interface.h @@ -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() diff --git a/src/include/mc/datatypes.h b/src/include/mc/datatypes.h index baeb22d8cc..2c4f48d47f 100644 --- a/src/include/mc/datatypes.h +++ b/src/include/mc/datatypes.h @@ -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; diff --git a/src/include/mc/mc.h b/src/include/mc/mc.h index bbcdc2fd14..21d00c1a70 100644 --- a/src/include/mc/mc.h +++ b/src/include/mc/mc.h @@ -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/include/simgrid/platf_interface.h b/src/include/simgrid/platf_interface.h index 2ecc52a20f..c5eb402e2d 100644 --- a/src/include/simgrid/platf_interface.h +++ b/src/include/simgrid/platf_interface.h @@ -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 */ diff --git a/src/include/simgrid/sg_config.h b/src/include/simgrid/sg_config.h index e4142a9e1a..2c1c75aa8e 100644 --- a/src/include/simgrid/sg_config.h +++ b/src/include/simgrid/sg_config.h @@ -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() diff --git a/src/include/smpi/smpi_interface.h b/src/include/smpi/smpi_interface.h index 2a44cfe2c8..d3cab537bf 100644 --- a/src/include/smpi/smpi_interface.h +++ b/src/include/smpi/smpi_interface.h @@ -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" diff --git a/src/include/surf/datatypes.h b/src/include/surf/datatypes.h index 31375cd6b1..23b9a78661 100644 --- a/src/include/surf/datatypes.h +++ b/src/include/surf/datatypes.h @@ -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; diff --git a/src/include/surf/maxmin.h b/src/include/surf/maxmin.h index acd57fb07e..86600a4238 100644 --- a/src/include/surf/maxmin.h +++ b/src/include/surf/maxmin.h @@ -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 @@ -12,6 +12,49 @@ #include "surf/datatypes.h" #include + +/** @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 */ diff --git a/src/include/surf/random_mgr.h b/src/include/surf/random_mgr.h index 7705f0bf1b..19b4a15a58 100644 --- a/src/include/surf/random_mgr.h +++ b/src/include/surf/random_mgr.h @@ -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 diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index 0f0694a186..196cb156b3 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -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); diff --git a/src/include/surf/surf_resource.h b/src/include/surf/surf_resource.h index 963fdffd89..38df8bee98 100644 --- a/src/include/surf/surf_resource.h +++ b/src/include/surf/surf_resource.h @@ -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 */ diff --git a/src/include/surf/surf_resource_lmm.h b/src/include/surf/surf_resource_lmm.h index 44bfeaf447..b0d7e33df7 100644 --- a/src/include/surf/surf_resource_lmm.h +++ b/src/include/surf/surf_resource_lmm.h @@ -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) diff --git a/src/include/surf/surfxml_parse_values.h b/src/include/surf/surfxml_parse_values.h index 93b09e3803..3d6db8b3f5 100644 --- a/src/include/surf/surfxml_parse_values.h +++ b/src/include/surf/surfxml_parse_values.h @@ -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_ */ diff --git a/src/include/surf/trace_mgr.h b/src/include/surf/trace_mgr.h index 85c80a69c8..62cf3acabc 100644 --- a/src/include/surf/trace_mgr.h +++ b/src/include/surf/trace_mgr.h @@ -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 */ diff --git a/src/include/xbt/wine_dbghelp.h b/src/include/xbt/wine_dbghelp.h index 2a42835218..b258f2f79c 100644 --- a/src/include/xbt/wine_dbghelp.h +++ b/src/include/xbt/wine_dbghelp.h @@ -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 * diff --git a/src/include/xbt/xbt_os_time.h b/src/include/xbt/xbt_os_time.h index 42a0c4d4e7..90b1304ee1 100644 --- a/src/include/xbt/xbt_os_time.h +++ b/src/include/xbt/xbt_os_time.h @@ -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 diff --git a/src/instr/instr_TI_trace.c b/src/instr/instr_TI_trace.c index 83e71039b3..29754729df 100644 --- a/src/instr/instr_TI_trace.c +++ b/src/instr/instr_TI_trace.c @@ -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", diff --git a/src/instr/instr_config.c b/src/instr/instr_config.c index 6300219228..8fa57c0907 100644 --- a/src/instr/instr_config.c +++ b/src/instr/instr_config.c @@ -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.", diff --git a/src/instr/instr_interface.c b/src/instr/instr_interface.c index 052144c405..a8e97d3409 100644 --- a/src/instr/instr_interface.c +++ b/src/instr/instr_interface.c @@ -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); } } diff --git a/src/instr/instr_paje_containers.c b/src/instr/instr_paje_containers.c index 327e57c22f..0dc0d0a769 100644 --- a/src/instr/instr_paje_containers.c +++ b/src/instr/instr_paje_containers.c @@ -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" diff --git a/src/instr/instr_paje_header.c b/src/instr/instr_paje_header.c index e8716bf5bd..b4ca75a2fd 100644 --- a/src/instr/instr_paje_header.c +++ b/src/instr/instr_paje_header.c @@ -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" diff --git a/src/instr/instr_paje_trace.c b/src/instr/instr_paje_trace.c index 46603c6f9d..e99bb30572 100644 --- a/src/instr/instr_paje_trace.c +++ b/src/instr/instr_paje_trace.c @@ -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 */ diff --git a/src/instr/instr_paje_types.c b/src/instr/instr_paje_types.c index c2c4c428e2..32177ded7c 100644 --- a/src/instr/instr_paje_types.c +++ b/src/instr/instr_paje_types.c @@ -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 diff --git a/src/instr/instr_paje_values.c b/src/instr/instr_paje_values.c index a2e5748c63..8e81a9ffe1 100644 --- a/src/instr/instr_paje_values.c +++ b/src/instr/instr_paje_values.c @@ -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 diff --git a/src/instr/instr_private.h b/src/instr/instr_private.h index 2c0fc4b57a..908ecd6cc3 100644 --- a/src/instr/instr_private.h +++ b/src/instr/instr_private.h @@ -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_ */ diff --git a/src/instr/instr_resource_utilization.c b/src/instr/instr_resource_utilization.c index d6b8891dcf..c3be52905d 100644 --- a/src/instr/instr_resource_utilization.c +++ b/src/instr/instr_resource_utilization.c @@ -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" diff --git a/src/instr/instr_trace.c b/src/instr/instr_trace.c index 005ec35fbb..8481697cda 100644 --- a/src/instr/instr_trace.c +++ b/src/instr/instr_trace.c @@ -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 */ diff --git a/src/instr/jedule/jedule_events.c b/src/instr/jedule/jedule_events.c index 489cdc72f6..07a5dca5ac 100644 --- a/src/instr/jedule/jedule_events.c +++ b/src/instr/jedule/jedule_events.c @@ -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 #include diff --git a/src/instr/jedule/jedule_output.c b/src/instr/jedule/jedule_output.c index 401b09b7c8..aa286e5f74 100644 --- a/src/instr/jedule/jedule_output.c +++ b/src/instr/jedule/jedule_output.c @@ -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 #include diff --git a/src/instr/jedule/jedule_platform.c b/src/instr/jedule/jedule_platform.c index 29eda01236..b096eeddb4 100644 --- a/src/instr/jedule/jedule_platform.c +++ b/src/instr/jedule/jedule_platform.c @@ -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 #include diff --git a/src/instr/jedule/jedule_sd_binding.c b/src/instr/jedule/jedule_sd_binding.c index 2932fc6f34..ab945ffeae 100644 --- a/src/instr/jedule/jedule_sd_binding.c +++ b/src/instr/jedule/jedule_sd_binding.c @@ -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 diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index 9a923b26c5..3e1f4cb203 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -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; diff --git a/src/mc/mc_compare.c b/src/mc/mc_compare.c index 193a90c550..ca2d81a020 100644 --- a/src/mc/mc_compare.c +++ b/src/mc/mc_compare.c @@ -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); diff --git a/src/mc/mc_dpor.c b/src/mc/mc_dpor.c index 7aaa065a07..5ab8aed15e 100644 --- a/src/mc/mc_dpor.c +++ b/src/mc/mc_dpor.c @@ -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); diff --git a/src/mc/mc_dwarf.c b/src/mc/mc_dwarf.c index 4f86800751..aa5f9f0f4e 100644 --- a/src/mc/mc_dwarf.c +++ b/src/mc/mc_dwarf.c @@ -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; } diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index ceee7f9732..133343e8ee 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -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; diff --git a/src/mc/mc_hash.c b/src/mc/mc_hash.c index 533548bff4..627e708a91 100644 --- a/src/mc/mc_hash.c +++ b/src/mc/mc_hash.c @@ -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: diff --git a/src/mc/mc_liveness.c b/src/mc/mc_liveness.c index 54f5143d8b..96e6513669 100644 --- a/src/mc/mc_liveness.c +++ b/src/mc/mc_liveness.c @@ -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 diff --git a/src/mc/mc_memory.c b/src/mc/mc_memory.c index 110b848354..cc6350be6f 100644 --- a/src/mc/mc_memory.c +++ b/src/mc/mc_memory.c @@ -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/mc/mc_pair.c b/src/mc/mc_pair.c index 1056f444c1..59f27641f1 100644 --- a/src/mc/mc_pair.c +++ b/src/mc/mc_pair.c @@ -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 diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index bda10fd28f..e901815c8c 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -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 + xbt_dynar_t subprograms; // xbt_dynar_t xbt_dynar_t global_variables; // xbt_dynar_t xbt_dict_t types; // xbt_dict_t xbt_dict_t types_by_name; // xbt_dict_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{ diff --git a/src/mc/mc_request.c b/src/mc/mc_request.c index 1a3d2aa558..9fb5ad5cd0 100644 --- a/src/mc/mc_request.c +++ b/src/mc/mc_request.c @@ -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); diff --git a/src/mc/mc_state.c b/src/mc/mc_state.c index 7036c25b43..64dcb1a3b6 100644 --- a/src/mc/mc_state.c +++ b/src/mc/mc_state.c @@ -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/mc/memory_map.c b/src/mc/memory_map.c index d893439a72..e63cab775f 100644 --- a/src/mc/memory_map.c +++ b/src/mc/memory_map.c @@ -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 index bd99ab4238..0000000000 --- a/src/mk_supernovae.pl +++ /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 < -#include "portable.h" -#include "xbt.h" - -EOF - ; - -sub readfile($) { - my $filename=shift; - open IN,"$filename" || die "ERROR: cannot read $filename: $!\n"; - my $res; - while () { - $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"; diff --git a/src/msg/instr_msg_process.c b/src/msg/instr_msg_process.c index bb794161fa..e23f5d863b 100644 --- a/src/msg/instr_msg_process.c +++ b/src/msg/instr_msg_process.c @@ -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" diff --git a/src/msg/instr_msg_task.c b/src/msg/instr_msg_task.c index c8e32885d9..4334eac303 100644 --- a/src/msg/instr_msg_task.c +++ b/src/msg/instr_msg_task.c @@ -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" diff --git a/src/msg/instr_msg_vm.c b/src/msg/instr_msg_vm.c index c72cbfc5ee..481d26bba2 100644 --- a/src/msg/instr_msg_vm.c +++ b/src/msg/instr_msg_vm.c @@ -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; diff --git a/src/msg/msg_actions.c b/src/msg/msg_actions.c index 9b5fe1605c..93bb48f021 100644 --- a/src/msg/msg_actions.c +++ b/src/msg/msg_actions.c @@ -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 diff --git a/src/msg/msg_deployment.c b/src/msg/msg_deployment.c index c72f553bd8..373594265a 100644 --- a/src/msg/msg_deployment.c +++ b/src/msg/msg_deployment.c @@ -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 diff --git a/src/msg/msg_environment.c b/src/msg/msg_environment.c index 279f4adaed..74fc81b9e6 100644 --- a/src/msg/msg_environment.c +++ b/src/msg/msg_environment.c @@ -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 diff --git a/src/msg/msg_global.c b/src/msg/msg_global.c index d98766c398..eee4578bde 100644 --- a/src/msg/msg_global.c +++ b/src/msg/msg_global.c @@ -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; } diff --git a/src/msg/msg_gos.c b/src/msg/msg_gos.c index 3bdc8d85a0..b80ae0f7d1 100644 --- a/src/msg/msg_gos.c +++ b/src/msg/msg_gos.c @@ -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); diff --git a/src/msg/msg_host.c b/src/msg/msg_host.c index 4dbe948fe8..5c2eec831c 100644 --- a/src/msg/msg_host.c +++ b/src/msg/msg_host.c @@ -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; } diff --git a/src/msg/msg_io.c b/src/msg/msg_io.c index cb2018a497..003705605f 100644 --- a/src/msg/msg_io.c +++ b/src/msg/msg_io.c @@ -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 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 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; +} diff --git a/src/msg/msg_mailbox.c b/src/msg/msg_mailbox.c index 83840e5c73..b8b63a28d7 100644 --- a/src/msg/msg_mailbox.c +++ b/src/msg/msg_mailbox.c @@ -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 diff --git a/src/msg/msg_mailbox.h b/src/msg/msg_mailbox.h index 71c4c30f4e..ce93121229 100644 --- a/src/msg/msg_mailbox.h +++ b/src/msg/msg_mailbox.h @@ -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 diff --git a/src/msg/msg_new_api.c b/src/msg/msg_new_api.c index 96dda606db..0bc6ba80e0 100644 --- a/src/msg/msg_new_api.c +++ b/src/msg/msg_new_api.c @@ -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" diff --git a/src/msg/msg_private.h b/src/msg/msg_private.h index f3e1b89f36..d4cc33bc5f 100644 --- a/src/msg/msg_private.h +++ b/src/msg/msg_private.h @@ -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() diff --git a/src/msg/msg_process.c b/src/msg/msg_process.c index 2cefbc744f..6fbe364a69 100644 --- a/src/msg/msg_process.c +++ b/src/msg/msg_process.c @@ -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 */ diff --git a/src/msg/msg_synchro.c b/src/msg/msg_synchro.c index 963fa9cf6f..8c3fa8d28a 100644 --- a/src/msg/msg_synchro.c +++ b/src/msg/msg_synchro.c @@ -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 diff --git a/src/msg/msg_task.c b/src/msg/msg_task.c index f1043873db..bdbbc47e83 100644 --- a/src/msg/msg_task.c +++ b/src/msg/msg_task.c @@ -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. + * \ + * + * 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); + } +} diff --git a/src/msg/msg_vm.c b/src/msg/msg_vm.c index d5bff3559c..a4d0401c28 100644 --- a/src/msg/msg_vm.c +++ b/src/msg/msg_vm.c @@ -1,227 +1,1293 @@ -/* 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(¶ms, 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, ¶ms); + + 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, ¶ms); + 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, ¶ms); + 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)); } diff --git a/src/portable.h b/src/portable.h index fdb6f48bec..6da75502b1 100644 --- a/src/portable.h +++ b/src/portable.h @@ -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 diff --git a/src/simdag/dax_dtd.c b/src/simdag/dax_dtd.c index 8e1cded546..2fcbd20ef2 100644 --- a/src/simdag/dax_dtd.c +++ b/src/simdag/dax_dtd.c @@ -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': `' 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: `' 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': `' 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: `' 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': `' 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: `' expected."); YY_BREAK diff --git a/src/simdag/dax_dtd.h b/src/simdag/dax_dtd.h index e31871dd23..8629a08937 100644 --- a/src/simdag/dax_dtd.h +++ b/src/simdag/dax_dtd.h @@ -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); diff --git a/src/simdag/instr_sd_task.c b/src/simdag/instr_sd_task.c index 5060997bda..be63a536e8 100644 --- a/src/simdag/instr_sd_task.c +++ b/src/simdag/instr_sd_task.c @@ -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 diff --git a/src/simdag/private.h b/src/simdag/private.h index 20cc654dd1..513dd1e2a6 100644 --- a/src/simdag/private.h +++ b/src/simdag/private.h @@ -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 diff --git a/src/simdag/sd_daxloader.c b/src/simdag/sd_daxloader.c index 87b0c9dc83..6113d3cae6 100644 --- a/src/simdag/sd_daxloader.c +++ b/src/simdag/sd_daxloader.c @@ -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 diff --git a/src/simdag/sd_dotloader.c b/src/simdag/sd_dotloader.c index f635a0fbde..cc4edd1abb 100644 --- a/src/simdag/sd_dotloader.c +++ b/src/simdag/sd_dotloader.c @@ -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 diff --git a/src/simdag/sd_global.c b/src/simdag/sd_global.c index 54feb2d027..e3f62b1381 100644 --- a/src/simdag/sd_global.c +++ b/src/simdag/sd_global.c @@ -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); diff --git a/src/simdag/sd_link.c b/src/simdag/sd_link.c index e147c42424..b59b1b407f 100644 --- a/src/simdag/sd_link.c +++ b/src/simdag/sd_link.c @@ -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); } /** diff --git a/src/simdag/sd_task.c b/src/simdag/sd_task.c index c098fd1f73..9c00ca4242 100644 --- a/src/simdag/sd_task.c +++ b/src/simdag/sd_task.c @@ -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; } diff --git a/src/simdag/sd_workstation.c b/src/simdag/sd_workstation.c index 14a0c70f53..730ef9893e 100644 --- a/src/simdag/sd_workstation.c +++ b/src/simdag/sd_workstation.c @@ -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*/ diff --git a/src/simgrid/sg_config.c b/src/simgrid/sg_config.c index dafa40683d..4ebfb8ee45 100644 --- a/src/simgrid/sg_config.c +++ b/src/simgrid/sg_config.c @@ -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=' 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: `' expected."); YY_BREAK -case 167: -/* rule 167 can match eol */ +case 169: +/* rule 169 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 179: +case 181: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 180: -/* rule 180 can match eol */ +case 182: +/* rule 182 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 192: +case 194: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 193: -/* rule 193 can match eol */ +case 195: +/* rule 195 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 221: +case 223: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 222: -/* rule 222 can match eol */ +case 224: +/* rule 224 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 232: +case 234: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 233: -/* rule 233 can match eol */ +case 235: +/* rule 235 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 247: +case 249: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 248: -/* rule 248 can match eol */ +case 250: +/* rule 250 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 298: +case 306: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 299: -/* rule 299 can match eol */ +case 307: +/* rule 307 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 321: +case 329: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 322: -/* rule 322 can match eol */ +case 330: +/* rule 330 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 346: +case 354: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 347: -/* rule 347 can match eol */ +case 355: +/* rule 355 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 359: +case 367: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 360: -/* rule 360 can match eol */ +case 368: +/* rule 368 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 374: +case 382: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 375: -/* rule 375 can match eol */ +case 383: +/* rule 383 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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_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_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_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_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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 405: +case 413: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 406: -/* rule 406 can match eol */ +case 414: +/* rule 414 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 422: +case 430: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 423: -/* rule 423 can match eol */ +case 431: +/* rule 431 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 443: +case 451: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 444: -/* rule 444 can match eol */ +case 452: +/* rule 452 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 460: +case 468: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 461: -/* rule 461 can match eol */ +case 469: +/* rule 469 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 473: +case 481: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 474: -/* rule 474 can match eol */ +case 482: +/* rule 482 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 490: +case 498: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 491: -/* rule 491 can match eol */ +case 499: +/* rule 499 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 511: +case 519: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 512: -/* rule 512 can match eol */ +case 520: +/* rule 520 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 522: +case 530: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK -case 523: -/* rule 523 can match eol */ +case 531: +/* rule 531 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 533: +case 541: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -9170,13 +9336,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); /* * */ -case 534: -/* rule 534 can match eol */ +case 542: +/* rule 542 can match eol */ YY_RULE_SETUP FAIL("Starting tag 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_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_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_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_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': `' expected.",surf_parse_text); YY_BREAK -case 546: +case 554: YY_RULE_SETUP FAIL("Unexpected character `%c': `' 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: `' expected."); YY_BREAK +/* + * */ +case 555: +/* rule 555 can match eol */ +YY_RULE_SETUP +FAIL("Starting tag 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_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_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_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_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': `' expected.",surf_parse_text); + YY_BREAK +case 567: +YY_RULE_SETUP +FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); + YY_BREAK +case YY_STATE_EOF(E_surfxml_model___prop): +if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' 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 index 53691367bd..0000000000 --- a/src/surf/storage.c +++ /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 - -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 index 0000000000..4ddc3c9296 --- /dev/null +++ b/src/surf/storage_interface.cpp @@ -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 index 0000000000..23c82b4c32 --- /dev/null +++ b/src/surf/storage_interface.hpp @@ -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 index 0000000000..4e07fe53c7 --- /dev/null +++ b/src/surf/storage_n11.cpp @@ -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(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(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(_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(&*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(static_cast(_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 index 0000000000..5582e961d0 --- /dev/null +++ b/src/surf/storage_n11.hpp @@ -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 index ee023b417f..0000000000 --- a/src/surf/storage_private.h +++ /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 index 807bfaf8d5..0000000000 --- a/src/surf/surf.c +++ /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 - -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 -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 index 86e752db18..0000000000 --- a/src/surf/surf_action.c +++ /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 index 0000000000..1bcc47f1d9 --- /dev/null +++ b/src/surf/surf_c_bindings.cpp @@ -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(surf_cpu_resource_priv(resource)); +} + +static WorkstationPtr get_casted_workstation(surf_resource_t resource){ + return static_cast(surf_workstation_resource_priv(resource)); +} + +static WorkstationVMPtr get_casted_vm_workstation(surf_resource_t resource){ + return static_cast(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(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(xbt_lib_get_level((xbt_dictelm_t) host, level)); + return ws->getModel(); +} + +void *surf_as_cluster_get_backbone(AS_t as){ + return static_cast(as)->p_backbone; +} + +void surf_as_cluster_set_backbone(AS_t as, void* backbone){ + static_cast(as)->p_backbone = static_cast(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(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::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(link)->isShared(); +} + +double surf_network_link_get_bandwidth(surf_cpp_resource_t link){ + return static_cast(link)->getBandwidth(); +} + +double surf_network_link_get_latency(surf_cpp_resource_t link){ + return static_cast(link)->getLatency(); +} + +xbt_dict_t surf_storage_get_content(surf_resource_t resource){ + return static_cast(surf_storage_resource_priv(resource))->getContent(); +} + +sg_size_t surf_storage_get_size(surf_resource_t resource){ + return static_cast(surf_storage_resource_priv(resource))->getSize(); +} + +void surf_storage_rename(surf_resource_t resource, const char* src, const char* dest){ + static_cast(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(action)->setAffinity(get_casted_cpu(cpu), mask); +} + +void surf_cpu_action_set_bound(surf_action_t action, double bound) { + static_cast(action)->setBound(bound); +} + +#ifdef HAVE_LATENCY_BOUND_TRACKING +double surf_network_action_get_latency_limited(surf_action_t action) { + return static_cast(action)->getLatencyLimited(); +} +#endif + +surf_file_t surf_storage_action_get_file(surf_action_t action){ + return static_cast(action)->p_file; +} + +xbt_dict_t surf_storage_action_get_ls_dict(surf_action_t action){ + return static_cast(action)->p_lsDict; +} diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp new file mode 100644 index 0000000000..4b1889a43c --- /dev/null +++ b/src/surf/surf_interface.cpp @@ -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 +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(r); +} + +static XBT_INLINE void surf_link_free(void *r) +{ + delete static_cast(r); +} + +static XBT_INLINE void surf_workstation_free(void *r) +{ + delete static_cast(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(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(surf_cpu_model_pm) && TRACE_is_enabled()) { + ResourcePtr cpu = static_cast(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(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 index 0000000000..7dac3413f2 --- /dev/null +++ b/src/surf/surf_interface.hpp @@ -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 +#include +#include +#include +#include +#include +#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 +#define surf_callback(arg1, ...) sigc::signal +#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 +#define surf_callback(arg1, ...) boost::signals2::signal +#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 ActionList; +typedef ActionList* ActionListPtr; +typedef boost::intrusive::list_base_hook<> actionHook; + +struct lmmTag; +typedef boost::intrusive::list > > > ActionLmmList; +typedef ActionLmmList* ActionLmmListPtr; +typedef boost::intrusive::list_base_hook > 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 index 3cb98f1270..0000000000 --- a/src/surf/surf_model.c +++ /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); -} diff --git a/src/surf/surf_private.h b/src/surf/surf_private.h index 10066b0323..a983231003 100644 --- a/src/surf/surf_private.h +++ b/src/surf/surf_private.h @@ -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 @@ -17,109 +18,33 @@ #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 */ diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.cpp similarity index 66% rename from src/surf/surf_routing.c rename to src/surf/surf_routing.cpp index ec7334ff20..3828ad2532 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.cpp @@ -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(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("", 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("", 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("", 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_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("", 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("", 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("", 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("", 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_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(current_routing)->p_router = static_cast(xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL)); XBT_DEBUG(""); 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 index 0000000000..3650cf8b1a --- /dev/null +++ b/src/surf/surf_routing.hpp @@ -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 + +#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 index 4e17552cc8..0000000000 --- a/src/surf/surf_routing_cluster.c +++ /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 index 0000000000..25cf788bdd --- /dev/null +++ b/src/surf/surf_routing_cluster.cpp @@ -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(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(info.link_up)->getLatency(); + } + + } + + if (p_backbone) { + xbt_dynar_push_as(route->link_list, void *, static_cast(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(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(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(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 index 0000000000..294fe2b5ab --- /dev/null +++ b/src/surf/surf_routing_cluster.hpp @@ -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 index 0000000000..45b8a935c7 --- /dev/null +++ b/src/surf/surf_routing_cluster_torus.cpp @@ -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(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 index 0000000000..86e9a20e92 --- /dev/null +++ b/src/surf/surf_routing_cluster_torus.hpp @@ -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 diff --git a/src/surf/surf_routing_dijkstra.c b/src/surf/surf_routing_dijkstra.cpp similarity index 56% rename from src/surf/surf_routing_dijkstra.c rename to src/surf/surf_routing_dijkstra.cpp index 8d204bc774..48a3ae2a29 100644 --- a/src/surf/surf_routing_dijkstra.c +++ b/src/surf/surf_routing_dijkstra.cpp @@ -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(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(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(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(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 index 0000000000..7299cb7fde --- /dev/null +++ b/src/surf/surf_routing_dijkstra.hpp @@ -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_ */ diff --git a/src/surf/surf_routing_floyd.c b/src/surf/surf_routing_floyd.cpp similarity index 53% rename from src/surf/surf_routing_floyd.c rename to src/surf/surf_routing_floyd.cpp index 0c1d32ad9d..f116c4e8cc 100644 --- a/src/surf/surf_routing_floyd.c +++ b/src/surf/surf_routing_floyd.cpp @@ -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(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(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 index 0000000000..57fca5eb95 --- /dev/null +++ b/src/surf/surf_routing_floyd.hpp @@ -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_ */ diff --git a/src/surf/surf_routing_full.c b/src/surf/surf_routing_full.cpp similarity index 56% rename from src/surf/surf_routing_full.c rename to src/surf/surf_routing_full.cpp index 89e305fd91..4c0aeb0359 100644 --- a/src/surf/surf_routing_full.c +++ b/src/surf/surf_routing_full.cpp @@ -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(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 index 0000000000..de3d0de2e2 --- /dev/null +++ b/src/surf/surf_routing_full.hpp @@ -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_ */ diff --git a/src/surf/surf_routing_generic.c b/src/surf/surf_routing_generic.cpp similarity index 57% rename from src/surf/surf_routing_generic.c rename to src/surf/surf_routing_generic.cpp index 9c0d4f9714..908e46ecb8 100644 --- a/src/surf/surf_routing_generic.c +++ b/src/surf/surf_routing_generic.cpp @@ -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, ¤t); - 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, ¤t); - 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 index 0000000000..53928b152b --- /dev/null +++ b/src/surf/surf_routing_generic.hpp @@ -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 index 1887c322ed..0000000000 --- a/src/surf/surf_routing_none.c +++ /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 index 0000000000..1ea0e4ab5e --- /dev/null +++ b/src/surf/surf_routing_none.cpp @@ -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 index 0000000000..042161ef72 --- /dev/null +++ b/src/surf/surf_routing_none.hpp @@ -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_ */ diff --git a/src/surf/surf_routing_private.h b/src/surf/surf_routing_private.hpp similarity index 94% rename from src/surf/surf_routing_private.h rename to src/surf/surf_routing_private.hpp index 6c2e754d13..fa365c1518 100644 --- a/src/surf/surf_routing_private.h +++ b/src/surf/surf_routing_private.hpp @@ -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 #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 index 2a925fc050..0000000000 --- a/src/surf/surf_routing_vivaldi.c +++ /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 index 0000000000..efabf717bc --- /dev/null +++ b/src/surf/surf_routing_vivaldi.cpp @@ -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(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(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 index 0000000000..ee0ab652b0 --- /dev/null +++ b/src/surf/surf_routing_vivaldi.hpp @@ -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_ */ diff --git a/src/surf/surfxml_parse.c b/src/surf/surfxml_parse.c index cae8e45bec..6c757e587c 100644 --- a/src/surf/surfxml_parse.c +++ b/src/surf/surfxml_parse.c @@ -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 */ diff --git a/src/surf/surfxml_parseplatf.c b/src/surf/surfxml_parseplatf.c index 04d93a79af..198b74563c 100644 --- a/src/surf/surfxml_parseplatf.c +++ b/src/surf/surfxml_parseplatf.c @@ -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 diff --git a/src/surf/trace_mgr.c b/src/surf/trace_mgr.c index db285978ea..8f44eaa95d 100644 --- a/src/surf/trace_mgr.c +++ b/src/surf/trace_mgr.c @@ -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 diff --git a/src/surf/trace_mgr_private.h b/src/surf/trace_mgr_private.h index 1911def618..820b24560a 100644 --- a/src/surf/trace_mgr_private.h +++ b/src/surf/trace_mgr_private.h @@ -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 index 0000000000..baad9aeb82 --- /dev/null +++ b/src/surf/vm_workstation_hl13.cpp @@ -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(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(ind_phys_workstation)); + + xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, static_cast(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(surf_workstation_model); + ModelPtr vm_ws_model = static_cast(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(ws_vm->p_cpu); + xbt_assert(cpu, "cpu-less workstation"); + + double solved_value = get_solved_value(static_cast(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(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(&*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(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(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(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(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(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(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(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(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( + static_cast(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 index 0000000000..cf3d23f517 --- /dev/null +++ b/src/surf/vm_workstation_hl13.hpp @@ -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 index 0000000000..688ad12418 --- /dev/null +++ b/src/surf/vm_workstation_interface.cpp @@ -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 index 0000000000..66a3e9da10 --- /dev/null +++ b/src/surf/vm_workstation_interface.hpp @@ -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 > + 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 index f50cf05b3d..0000000000 --- a/src/surf/workstation.c +++ /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 index 0000000000..1848fd5396 --- /dev/null +++ b/src/surf/workstation_clm03.cpp @@ -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(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(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(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(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(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 index 0000000000..0028c52a61 --- /dev/null +++ b/src/surf/workstation_clm03.hpp @@ -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 index 0000000000..1b41b0cf1a --- /dev/null +++ b/src/surf/workstation_interface.cpp @@ -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(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(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(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 index 0000000000..d0546b5394 --- /dev/null +++ b/src/surf/workstation_interface.hpp @@ -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 index e6d026b2d1..0000000000 --- a/src/surf/workstation_ptask_L07.c +++ /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 index 0000000000..f44c1a1834 --- /dev/null +++ b/src/surf/workstation_ptask_L07.cpp @@ -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(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(&*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(&*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(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(workstation_list[i])->p_netElm, + static_cast(workstation_list[j])->p_netElm, + &route, + &lat); + latency = MAX(latency, lat); + + xbt_dynar_foreach(route, cpt, _link) { + link = static_cast(_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(static_cast(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(workstation_list[i])->p_netElm, + static_cast(workstation_list[j])->p_netElm, + &route, NULL); + + xbt_dynar_foreach(route, cpt, _link) { + link = static_cast(_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(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(xbt_lib_get_or_null(host_lib, name, ROUTING_HOST_LEVEL)), + static_cast(xbt_lib_get_or_null(host_lib, name, SURF_CPU_LEVEL))); + + xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, static_cast(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(src); + workstation_list[1] = static_cast(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(this); + communication_amount[0] = 0.0; + computation_amount[0] = size; + + return static_cast(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(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(((void**)p_workstationList)[i])->p_netElm, + static_cast(((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(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(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(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(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(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(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(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 index 0000000000..360a851780 --- /dev/null +++ b/src/surf/workstation_ptask_L07.hpp @@ -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_ */ diff --git a/src/win32/config.h b/src/win32/config.h index 36a84eed15..93ab3bfdf4 100644 --- a/src/win32/config.h +++ b/src/win32/config.h @@ -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 diff --git a/src/xbt/RngStream.c b/src/xbt/RngStream.c index 01aa668c34..e4dbbb5a74 100644 --- a/src/xbt/RngStream.c +++ b/src/xbt/RngStream.c @@ -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 diff --git a/src/xbt/automaton/automaton.c b/src/xbt/automaton/automaton.c index e3abf53971..5c63609816 100644 --- a/src/xbt/automaton/automaton.c +++ b/src/xbt/automaton/automaton.c @@ -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 diff --git a/src/xbt/automaton/automaton_lexer.yy.c b/src/xbt/automaton/automaton_lexer.yy.c index 847715569b..9a91800cdd 100644 --- a/src/xbt/automaton/automaton_lexer.yy.c +++ b/src/xbt/automaton/automaton_lexer.yy.c @@ -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 @@ -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" diff --git a/src/xbt/automaton/automatonparse_promela.c b/src/xbt/automaton/automatonparse_promela.c index 1fbf4e58b7..7e73dd7616 100644 --- a/src/xbt/automaton/automatonparse_promela.c +++ b/src/xbt/automaton/automatonparse_promela.c @@ -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 +#include /* 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(); } diff --git a/src/xbt/automaton/parserPromela.lex b/src/xbt/automaton/parserPromela.lex index 7b64a62dd7..2be47f27c0 100644 --- a/src/xbt/automaton/parserPromela.lex +++ b/src/xbt/automaton/parserPromela.lex @@ -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 %{ diff --git a/src/xbt/automaton/parserPromela.tab.cacc b/src/xbt/automaton/parserPromela.tab.cacc index 56cc4b6895..898e1e4bf4 100644 --- a/src/xbt/automaton/parserPromela.tab.cacc +++ b/src/xbt/automaton/parserPromela.tab.cacc @@ -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 . */ @@ -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" @@ -63,14 +63,14 @@ #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" @@ -79,14 +79,13 @@ 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 /* 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 /* 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 /* 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 - - 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 */ diff --git a/src/xbt/automaton/parserPromela.tab.hacc b/src/xbt/automaton/parserPromela.tab.hacc index 483349a029..587506e790 100644 --- a/src/xbt/automaton/parserPromela.tab.hacc +++ b/src/xbt/automaton/parserPromela.tab.hacc @@ -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 . */ @@ -26,13 +26,13 @@ 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 @@ -40,70 +40,55 @@ 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 */ diff --git a/src/xbt/automaton/parserPromela.yacc b/src/xbt/automaton/parserPromela.yacc index c74d2ce67c..57468b65df 100644 --- a/src/xbt/automaton/parserPromela.yacc +++ b/src/xbt/automaton/parserPromela.yacc @@ -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" diff --git a/src/xbt/backtrace_dummy.c b/src/xbt/backtrace_dummy.c index 3b86fe75b7..20970ec7b1 100644 --- a/src/xbt/backtrace_dummy.c +++ b/src/xbt/backtrace_dummy.c @@ -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 diff --git a/src/xbt/backtrace_linux.c b/src/xbt/backtrace_linux.c index b7cb1deb67..b32ec96cb0 100644 --- a/src/xbt/backtrace_linux.c +++ b/src/xbt/backtrace_linux.c @@ -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 diff --git a/src/xbt/backtrace_windows.c b/src/xbt/backtrace_windows.c index c21dacc0d1..0953a8d143 100644 --- a/src/xbt/backtrace_windows.c +++ b/src/xbt/backtrace_windows.c @@ -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 diff --git a/src/xbt/config.c b/src/xbt/config.c index 7873dd451a..0eb3145b86 100644 --- a/src/xbt/config.c +++ b/src/xbt/config.c @@ -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 diff --git a/src/xbt/cunit.c b/src/xbt/cunit.c index dd06384144..0a603bf564 100644 --- a/src/xbt/cunit.c +++ b/src/xbt/cunit.c @@ -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 diff --git a/src/xbt/dict.c b/src/xbt/dict.c index 3984e4315c..0d8985ff7d 100644 --- a/src/xbt/dict.c +++ b/src/xbt/dict.c @@ -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 diff --git a/src/xbt/dict_cursor.c b/src/xbt/dict_cursor.c index c39e65def6..68c5440d06 100644 --- a/src/xbt/dict_cursor.c +++ b/src/xbt/dict_cursor.c @@ -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 diff --git a/src/xbt/dict_elm.c b/src/xbt/dict_elm.c index 3ac7b112b5..286ffe7422 100644 --- a/src/xbt/dict_elm.c +++ b/src/xbt/dict_elm.c @@ -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 diff --git a/src/xbt/dict_multi.c b/src/xbt/dict_multi.c index 30512782da..a8ef163d02 100644 --- a/src/xbt/dict_multi.c +++ b/src/xbt/dict_multi.c @@ -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 diff --git a/src/xbt/dict_private.h b/src/xbt/dict_private.h index f5ccfd95a3..34eb4d0388 100644 --- a/src/xbt/dict_private.h +++ b/src/xbt/dict_private.h @@ -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 diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index d9e20b9250..7b026573e1 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -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 *)) diff --git a/src/xbt/ex.c b/src/xbt/ex.c index 9433046883..4b0d7bdf1c 100644 --- a/src/xbt/ex.c +++ b/src/xbt/ex.c @@ -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 */ /* Copyright (c) 2002-2004 The OSSP Project */ /* Copyright (c) 2002-2004 Cable & Wireless */ @@ -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"; } diff --git a/src/xbt/ex_interface.h b/src/xbt/ex_interface.h index 11ebf27c6d..3abaede608 100644 --- a/src/xbt/ex_interface.h +++ b/src/xbt/ex_interface.h @@ -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 diff --git a/src/xbt/fifo.c b/src/xbt/fifo.c index adaa88dc11..b13b9e154b 100644 --- a/src/xbt/fifo.c +++ b/src/xbt/fifo.c @@ -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 diff --git a/src/xbt/fifo_private.h b/src/xbt/fifo_private.h index 64067af03d..47bdc4dc99 100644 --- a/src/xbt/fifo_private.h +++ b/src/xbt/fifo_private.h @@ -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 diff --git a/src/xbt/graph.c b/src/xbt/graph.c index 6e5fdb163a..52bed433e6 100644 --- a/src/xbt/graph.c +++ b/src/xbt/graph.c @@ -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 diff --git a/src/xbt/graph_private.h b/src/xbt/graph_private.h index 9028ed67ef..819a11fc39 100644 --- a/src/xbt/graph_private.h +++ b/src/xbt/graph_private.h @@ -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 diff --git a/src/xbt/graphxml.c b/src/xbt/graphxml.c index 0f5a9e4ce3..7c6579dd5b 100644 --- a/src/xbt/graphxml.c +++ b/src/xbt/graphxml.c @@ -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': `' 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: `' 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; } } diff --git a/src/xbt/graphxml_parse.c b/src/xbt/graphxml_parse.c index 679e9b1ddf..d143e32bb8 100644 --- a/src/xbt/graphxml_parse.c +++ b/src/xbt/graphxml_parse.c @@ -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 diff --git a/src/xbt/heap.c b/src/xbt/heap.c index ac3cafec92..292b5f704b 100644 --- a/src/xbt/heap.c +++ b/src/xbt/heap.c @@ -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 diff --git a/src/xbt/heap_private.h b/src/xbt/heap_private.h index 6ff1e78220..0186ee1e58 100644 --- a/src/xbt/heap_private.h +++ b/src/xbt/heap_private.h @@ -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 diff --git a/src/xbt/lib.c b/src/xbt/lib.c index cc6f9e6163..8c594cfb82 100644 --- a/src/xbt/lib.c +++ b/src/xbt/lib.c @@ -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); +} diff --git a/src/xbt/log.c b/src/xbt/log.c index dbea34ad13..24d7ec43f4 100644 --- a/src/xbt/log.c +++ b/src/xbt/log.c @@ -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 #include #include /* 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 */ diff --git a/src/xbt/log_private.h b/src/xbt/log_private.h index 56692e6d39..7afcafdf26 100644 --- a/src/xbt/log_private.h +++ b/src/xbt/log_private.h @@ -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 diff --git a/src/xbt/mallocator.c b/src/xbt/mallocator.c index 85288344fc..9ac395b0c7 100644 --- a/src/xbt/mallocator.c +++ b/src/xbt/mallocator.c @@ -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 diff --git a/src/xbt/mallocator_private.h b/src/xbt/mallocator_private.h index 266c026534..603e231760 100644 --- a/src/xbt/mallocator_private.h +++ b/src/xbt/mallocator_private.h @@ -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 diff --git a/src/xbt/mmalloc/mfree.c b/src/xbt/mmalloc/mfree.c index 6cfd06cf31..322d81875f 100644 --- a/src/xbt/mmalloc/mfree.c +++ b/src/xbt/mmalloc/mfree.c @@ -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(); } diff --git a/src/xbt/mmalloc/mm.c b/src/xbt/mmalloc/mm.c index d5d5610b18..074dec3e64 100644 --- a/src/xbt/mmalloc/mm.c +++ b/src/xbt/mmalloc/mm.c @@ -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 diff --git a/src/xbt/mmalloc/mm_diff.c b/src/xbt/mmalloc/mm_diff.c index ec4c90cbb8..c681d8b728 100644 --- a/src/xbt/mmalloc/mm_diff.c +++ b/src/xbt/mmalloc/mm_diff.c @@ -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); diff --git a/src/xbt/mmalloc/mm_legacy.c b/src/xbt/mmalloc/mm_legacy.c index 2a1a5863ce..7984ad0bfe 100644 --- a/src/xbt/mmalloc/mm_legacy.c +++ b/src/xbt/mmalloc/mm_legacy.c @@ -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 diff --git a/src/xbt/mmalloc/mm_module.c b/src/xbt/mmalloc/mm_module.c index 01c0bce8c2..7cfde64607 100644 --- a/src/xbt/mmalloc/mm_module.c +++ b/src/xbt/mmalloc/mm_module.c @@ -20,6 +20,12 @@ 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 #include /* After sys/types.h, at least for dpx/2. */ #include @@ -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){ diff --git a/src/xbt/mmalloc/mmalloc.c b/src/xbt/mmalloc/mmalloc.c index fd710759c4..2fb4338de2 100644 --- a/src/xbt/mmalloc/mmalloc.c +++ b/src/xbt/mmalloc/mmalloc.c @@ -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 diff --git a/src/xbt/mmalloc/mmorecore.c b/src/xbt/mmalloc/mmorecore.c index 197341d9d4..5ad7cd37af 100644 --- a/src/xbt/mmalloc/mmorecore.c +++ b/src/xbt/mmalloc/mmorecore.c @@ -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 diff --git a/src/xbt/mmalloc/mmprivate.h b/src/xbt/mmalloc/mmprivate.h index aad689ee4e..370f84b224 100644 --- a/src/xbt/mmalloc/mmprivate.h +++ b/src/xbt/mmalloc/mmprivate.h @@ -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 diff --git a/src/xbt/mmalloc/mrealloc.c b/src/xbt/mmalloc/mrealloc.c index 3569c14d5c..03bc80b6ac 100644 --- a/src/xbt/mmalloc/mrealloc.c +++ b/src/xbt/mmalloc/mrealloc.c @@ -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 diff --git a/src/xbt/parmap.c b/src/xbt/parmap.c index 3e56435315..cdb6e916b6 100644 --- a/src/xbt/parmap.c +++ b/src/xbt/parmap.c @@ -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 diff --git a/src/xbt/set.c b/src/xbt/set.c index 27e767a5cc..7f2030e91b 100644 --- a/src/xbt/set.c +++ b/src/xbt/set.c @@ -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 diff --git a/src/xbt/setset.c b/src/xbt/setset.c index 33328fd3af..2b0ec89424 100644 --- a/src/xbt/setset.c +++ b/src/xbt/setset.c @@ -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 #include #include diff --git a/src/xbt/setset_private.h b/src/xbt/setset_private.h index 6e12ee469c..128db6364f 100644 --- a/src/xbt/setset_private.h +++ b/src/xbt/setset_private.h @@ -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" diff --git a/src/xbt/snprintf.c b/src/xbt/snprintf.c index 641f294e10..c1a4983a1f 100644 --- a/src/xbt/snprintf.c +++ b/src/xbt/snprintf.c @@ -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 diff --git a/src/xbt/swag.c b/src/xbt/swag.c index 47dc3ba923..308074f4bf 100644 --- a/src/xbt/swag.c +++ b/src/xbt/swag.c @@ -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 diff --git a/src/xbt/win32_ucontext.c b/src/xbt/win32_ucontext.c index b6d5caf9fb..560b06cb1b 100644 --- a/src/xbt/win32_ucontext.c +++ b/src/xbt/win32_ucontext.c @@ -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. */ + /* * win32-ucontext: Unix ucontext_t operations on Windows platforms * Copyright(C) 2007 Panagiotis E. Hadjidoukas diff --git a/src/xbt/xbt_log_appender_file.c b/src/xbt/xbt_log_appender_file.c index f66389da14..124c51f956 100644 --- a/src/xbt/xbt_log_appender_file.c +++ b/src/xbt/xbt_log_appender_file.c @@ -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 diff --git a/src/xbt/xbt_log_layout_format.c b/src/xbt/xbt_log_layout_format.c index 9dc242639b..366766786b 100644 --- a/src/xbt/xbt_log_layout_format.c +++ b/src/xbt/xbt_log_layout_format.c @@ -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 diff --git a/src/xbt/xbt_log_layout_simple.c b/src/xbt/xbt_log_layout_simple.c index 80439e0bb7..174e3430f8 100644 --- a/src/xbt/xbt_log_layout_simple.c +++ b/src/xbt/xbt_log_layout_simple.c @@ -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 diff --git a/src/xbt/xbt_main.c b/src/xbt/xbt_main.c index 141e329035..26e8dd1a71 100644 --- a/src/xbt/xbt_main.c +++ b/src/xbt/xbt_main.c @@ -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" diff --git a/src/xbt/xbt_matrix.c b/src/xbt/xbt_matrix.c index 574e2b9df9..333d5cd44a 100644 --- a/src/xbt/xbt_matrix.c +++ b/src/xbt/xbt_matrix.c @@ -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 diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index c6b858e2bd..ff9d996ee3 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -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 diff --git a/src/xbt/xbt_os_time.c b/src/xbt/xbt_os_time.c index 6b06a6ba36..2f45c1c14f 100644 --- a/src/xbt/xbt_os_time.c +++ b/src/xbt/xbt_os_time.c @@ -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 diff --git a/src/xbt/xbt_peer.c b/src/xbt/xbt_peer.c index 8af65f81d7..d8339587f1 100644 --- a/src/xbt/xbt_peer.c +++ b/src/xbt/xbt_peer.c @@ -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 diff --git a/src/xbt/xbt_queue.c b/src/xbt/xbt_queue.c index ee98e0d51b..68be624238 100644 --- a/src/xbt/xbt_queue.c +++ b/src/xbt/xbt_queue.c @@ -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 diff --git a/src/xbt/xbt_replay.c b/src/xbt/xbt_replay.c index c2c5bd2afe..ffd80026a3 100644 --- a/src/xbt/xbt_replay.c +++ b/src/xbt/xbt_replay.c @@ -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); } diff --git a/src/xbt/xbt_sg_stubs.c b/src/xbt/xbt_sg_stubs.c index bd85f59684..149fb39052 100644 --- a/src/xbt/xbt_sg_stubs.c +++ b/src/xbt/xbt_sg_stubs.c @@ -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 diff --git a/src/xbt/xbt_sg_synchro.c b/src/xbt/xbt_sg_synchro.c index d9e3d59f8d..4907e6f246 100644 --- a/src/xbt/xbt_sg_synchro.c +++ b/src/xbt/xbt_sg_synchro.c @@ -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 diff --git a/src/xbt/xbt_sha.c b/src/xbt/xbt_sha.c index d03cd8932c..f9eae05b0e 100644 --- a/src/xbt/xbt_sha.c +++ b/src/xbt/xbt_sha.c @@ -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 diff --git a/src/xbt/xbt_str.c b/src/xbt/xbt_str.c index 01a4052a2e..eedfa87092 100644 --- a/src/xbt/xbt_str.c +++ b/src/xbt/xbt_str.c @@ -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 diff --git a/src/xbt/xbt_strbuff.c b/src/xbt/xbt_strbuff.c index f066ef7060..e52a575b2b 100644 --- a/src/xbt/xbt_strbuff.c +++ b/src/xbt/xbt_strbuff.c @@ -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 diff --git a/src/xbt/xbt_virtu.c b/src/xbt/xbt_virtu.c index e8ff9d730a..a046cfa9a3 100644 --- a/src/xbt/xbt_virtu.c +++ b/src/xbt/xbt_virtu.c @@ -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 diff --git a/src/xbt_modinter.h b/src/xbt_modinter.h index 1f88a67e16..079e050d76 100644 --- a/src/xbt_modinter.h +++ b/src/xbt_modinter.h @@ -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 diff --git a/teshsuite/msg/get_sender.c b/teshsuite/msg/get_sender.c index 0f8270c105..bc9deb5bb1 100644 --- a/teshsuite/msg/get_sender.c +++ b/teshsuite/msg/get_sender.c @@ -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 diff --git a/teshsuite/msg/pid.c b/teshsuite/msg/pid.c index e5b8ac70c2..6d8c14c517 100644 --- a/teshsuite/msg/pid.c +++ b/teshsuite/msg/pid.c @@ -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 diff --git a/teshsuite/msg/storage/CMakeLists.txt b/teshsuite/msg/storage/CMakeLists.txt index 8f2c3fc13b..55b0bccec6 100644 --- a/teshsuite/msg/storage/CMakeLists.txt +++ b/teshsuite/msg/storage/CMakeLists.txt @@ -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 diff --git a/teshsuite/msg/storage/platform.xml b/teshsuite/msg/storage/platform.xml index caec3dabcd..18382b2160 100644 --- a/teshsuite/msg/storage/platform.xml +++ b/teshsuite/msg/storage/platform.xml @@ -4,33 +4,35 @@ - - - - + + + + - - - - + + + + - - - + content="content/storage_content.txt" size="300GiB"> + + + - - - - + + + + + + + + - - diff --git a/teshsuite/msg/storage/storage.tesh b/teshsuite/msg/storage/storage.tesh deleted file mode 100644 index 11c12a9bd3..0000000000 --- a/teshsuite/msg/storage/storage.tesh +++ /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 diff --git a/teshsuite/msg/storage/storage.c b/teshsuite/msg/storage/storage_basic.c similarity index 68% rename from teshsuite/msg/storage/storage.c rename to teshsuite/msg/storage/storage_basic.c index a9d1ebcc23..c386966d46 100644 --- a/teshsuite/msg/storage/storage.c +++ b/teshsuite/msg/storage/storage_basic.c @@ -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 index 0000000000..210727f10b --- /dev/null +++ b/teshsuite/msg/storage/storage_basic.tesh @@ -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 + diff --git a/teshsuite/msg/storage/storage_content_c.txt b/teshsuite/msg/storage/storage_content_c.txt index fef7c556b2..1c5713fc83 100644 --- a/teshsuite/msg/storage/storage_content_c.txt +++ b/teshsuite/msg/storage/storage_content_c.txt @@ -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 diff --git a/teshsuite/msg/storage/storage_content_s1.txt b/teshsuite/msg/storage/storage_content_s1.txt index 55968d0b7c..34cb554c7c 100644 --- a/teshsuite/msg/storage/storage_content_s1.txt +++ b/teshsuite/msg/storage/storage_content_s1.txt @@ -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 diff --git a/teshsuite/msg/storage/storage_content_s2.txt b/teshsuite/msg/storage/storage_content_s2.txt index 0721dbf8b8..06ed884aa8 100644 --- a/teshsuite/msg/storage/storage_content_s2.txt +++ b/teshsuite/msg/storage/storage_content_s2.txt @@ -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 diff --git a/teshsuite/msg/trace/test_trace_integration.c b/teshsuite/msg/trace/test_trace_integration.c index d09b5c5e4a..2974e68233 100644 --- a/teshsuite/msg/trace/test_trace_integration.c +++ b/teshsuite/msg/trace/test_trace_integration.c @@ -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 diff --git a/teshsuite/simdag/availability/availability_test.c b/teshsuite/simdag/availability/availability_test.c index 8a397b6a73..0bec635890 100644 --- a/teshsuite/simdag/availability/availability_test.c +++ b/teshsuite/simdag/availability/availability_test.c @@ -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 #include #include diff --git a/teshsuite/simdag/basic0.c b/teshsuite/simdag/basic0.c index 579b769612..2961efdd87 100644 --- a/teshsuite/simdag/basic0.c +++ b/teshsuite/simdag/basic0.c @@ -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 diff --git a/teshsuite/simdag/basic1.c b/teshsuite/simdag/basic1.c index a3dcd3aeaa..48b79528a6 100644 --- a/teshsuite/simdag/basic1.c +++ b/teshsuite/simdag/basic1.c @@ -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 diff --git a/teshsuite/simdag/basic2.c b/teshsuite/simdag/basic2.c index 6e4ac837f4..44e6d7bde9 100644 --- a/teshsuite/simdag/basic2.c +++ b/teshsuite/simdag/basic2.c @@ -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 diff --git a/teshsuite/simdag/basic3.c b/teshsuite/simdag/basic3.c index 7f747bcb3d..273e1177ad 100644 --- a/teshsuite/simdag/basic3.c +++ b/teshsuite/simdag/basic3.c @@ -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 diff --git a/teshsuite/simdag/basic4.c b/teshsuite/simdag/basic4.c index b6435cfdaa..0005e04d3a 100644 --- a/teshsuite/simdag/basic4.c +++ b/teshsuite/simdag/basic4.c @@ -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 diff --git a/teshsuite/simdag/basic5.c b/teshsuite/simdag/basic5.c index 1bf80b3c1d..9dfa416dd4 100644 --- a/teshsuite/simdag/basic5.c +++ b/teshsuite/simdag/basic5.c @@ -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 diff --git a/teshsuite/simdag/basic6.c b/teshsuite/simdag/basic6.c index 66e2d341a9..bd1de6cd5f 100644 --- a/teshsuite/simdag/basic6.c +++ b/teshsuite/simdag/basic6.c @@ -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 diff --git a/teshsuite/simdag/incomplete.c b/teshsuite/simdag/incomplete.c index 696ab7bb55..b82a105e86 100644 --- a/teshsuite/simdag/incomplete.c +++ b/teshsuite/simdag/incomplete.c @@ -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 diff --git a/teshsuite/simdag/network/mxn/test_intra_all2all.c b/teshsuite/simdag/network/mxn/test_intra_all2all.c index 5c74d67bfd..e864eb5ab4 100644 --- a/teshsuite/simdag/network/mxn/test_intra_all2all.c +++ b/teshsuite/simdag/network/mxn/test_intra_all2all.c @@ -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 diff --git a/teshsuite/simdag/network/mxn/test_intra_independent_comm.c b/teshsuite/simdag/network/mxn/test_intra_independent_comm.c index adc6b777fa..e7baa31af0 100644 --- a/teshsuite/simdag/network/mxn/test_intra_independent_comm.c +++ b/teshsuite/simdag/network/mxn/test_intra_independent_comm.c @@ -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 diff --git a/teshsuite/simdag/network/mxn/test_intra_scatter.c b/teshsuite/simdag/network/mxn/test_intra_scatter.c index f32dea693e..c0efc7632f 100644 --- a/teshsuite/simdag/network/mxn/test_intra_scatter.c +++ b/teshsuite/simdag/network/mxn/test_intra_scatter.c @@ -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 diff --git a/teshsuite/simdag/network/p2p/test_latency1.c b/teshsuite/simdag/network/p2p/test_latency1.c index 1b52f079d2..51080ceaad 100644 --- a/teshsuite/simdag/network/p2p/test_latency1.c +++ b/teshsuite/simdag/network/p2p/test_latency1.c @@ -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 diff --git a/teshsuite/simdag/network/p2p/test_latency2.c b/teshsuite/simdag/network/p2p/test_latency2.c index 19024ceafe..70d584c172 100644 --- a/teshsuite/simdag/network/p2p/test_latency2.c +++ b/teshsuite/simdag/network/p2p/test_latency2.c @@ -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 diff --git a/teshsuite/simdag/network/p2p/test_latency3.c b/teshsuite/simdag/network/p2p/test_latency3.c index 277ac2c906..5d314201e9 100644 --- a/teshsuite/simdag/network/p2p/test_latency3.c +++ b/teshsuite/simdag/network/p2p/test_latency3.c @@ -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 diff --git a/teshsuite/simdag/network/p2p/test_latency_bound.c b/teshsuite/simdag/network/p2p/test_latency_bound.c index 63c1a6753f..694a5c3de5 100644 --- a/teshsuite/simdag/network/p2p/test_latency_bound.c +++ b/teshsuite/simdag/network/p2p/test_latency_bound.c @@ -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 diff --git a/teshsuite/simdag/network/test_reinit_costs.c b/teshsuite/simdag/network/test_reinit_costs.c index a85311bf0e..fa9e319c4b 100644 --- a/teshsuite/simdag/network/test_reinit_costs.c +++ b/teshsuite/simdag/network/test_reinit_costs.c @@ -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 diff --git a/teshsuite/simdag/partask/test_comp_only_par.c b/teshsuite/simdag/partask/test_comp_only_par.c index 665f6d114d..b1c7480571 100644 --- a/teshsuite/simdag/partask/test_comp_only_par.c +++ b/teshsuite/simdag/partask/test_comp_only_par.c @@ -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 diff --git a/teshsuite/simdag/partask/test_comp_only_seq.c b/teshsuite/simdag/partask/test_comp_only_seq.c index 1ad0f28a34..5b24395b6f 100644 --- a/teshsuite/simdag/partask/test_comp_only_seq.c +++ b/teshsuite/simdag/partask/test_comp_only_seq.c @@ -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 diff --git a/teshsuite/simdag/platforms/Evaluate_get_route_time.c b/teshsuite/simdag/platforms/Evaluate_get_route_time.c index 14905f20f1..03285b7aa4 100644 --- a/teshsuite/simdag/platforms/Evaluate_get_route_time.c +++ b/teshsuite/simdag/platforms/Evaluate_get_route_time.c @@ -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/teshsuite/simdag/platforms/Evaluate_parse_time.c b/teshsuite/simdag/platforms/Evaluate_parse_time.c index e93d9727d6..a291e6d759 100644 --- a/teshsuite/simdag/platforms/Evaluate_parse_time.c +++ b/teshsuite/simdag/platforms/Evaluate_parse_time.c @@ -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/teshsuite/simdag/platforms/basic_link_test.c b/teshsuite/simdag/platforms/basic_link_test.c index 5b0cfc69ec..5a484e3411 100644 --- a/teshsuite/simdag/platforms/basic_link_test.c +++ b/teshsuite/simdag/platforms/basic_link_test.c @@ -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 diff --git a/teshsuite/simdag/platforms/basic_parsing_test.c b/teshsuite/simdag/platforms/basic_parsing_test.c index aaffd2e333..245cd48ddc 100644 --- a/teshsuite/simdag/platforms/basic_parsing_test.c +++ b/teshsuite/simdag/platforms/basic_parsing_test.c @@ -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/teshsuite/simdag/platforms/basic_tracing.c b/teshsuite/simdag/platforms/basic_tracing.c index 5220a03b0d..b0b9a695a4 100644 --- a/teshsuite/simdag/platforms/basic_tracing.c +++ b/teshsuite/simdag/platforms/basic_tracing.c @@ -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 diff --git a/teshsuite/simdag/platforms/flatifier.c b/teshsuite/simdag/platforms/flatifier.c index 46ae1b4dfc..b47590261d 100644 --- a/teshsuite/simdag/platforms/flatifier.c +++ b/teshsuite/simdag/platforms/flatifier.c @@ -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(" \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); } diff --git a/teshsuite/simdag/platforms/flatifier.tesh b/teshsuite/simdag/platforms/flatifier.tesh index 4ffe91a437..873b810cf5 100644 --- a/teshsuite/simdag/platforms/flatifier.tesh +++ b/teshsuite/simdag/platforms/flatifier.tesh @@ -1018,3 +1018,618 @@ $ ${bindir:=.}/flatifier$EXEEXT ${srcdir:=.}/examples/platforms/bypassASroute.xm > > > + + +$ ${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 +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> +> diff --git a/teshsuite/simdag/platforms/is_router_test.c b/teshsuite/simdag/platforms/is_router_test.c index 10bf46450d..9ad9de83f8 100644 --- a/teshsuite/simdag/platforms/is_router_test.c +++ b/teshsuite/simdag/platforms/is_router_test.c @@ -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/teshsuite/simix/check_defaults.c b/teshsuite/simix/check_defaults.c index f1af0078e3..bf009d1e7b 100644 --- a/teshsuite/simix/check_defaults.c +++ b/teshsuite/simix/check_defaults.c @@ -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 diff --git a/teshsuite/smpi/TI_output.tesh b/teshsuite/smpi/TI_output.tesh index d8cc911669..33e4cd797c 100644 --- a/teshsuite/smpi/TI_output.tesh +++ b/teshsuite/smpi/TI_output.tesh @@ -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 diff --git a/teshsuite/smpi/allgather_coll.c b/teshsuite/smpi/allgather_coll.c index e0132ce903..045154b4cc 100644 --- a/teshsuite/smpi/allgather_coll.c +++ b/teshsuite/smpi/allgather_coll.c @@ -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 diff --git a/teshsuite/smpi/allgather_coll.tesh b/teshsuite/smpi/allgather_coll.tesh index fd076cbbd2..3e23a6b6e0 100644 --- a/teshsuite/smpi/allgather_coll.tesh +++ b/teshsuite/smpi/allgather_coll.tesh @@ -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 diff --git a/teshsuite/smpi/allgatherv_coll.c b/teshsuite/smpi/allgatherv_coll.c index f55f311442..d5ffa8d9d9 100644 --- a/teshsuite/smpi/allgatherv_coll.c +++ b/teshsuite/smpi/allgatherv_coll.c @@ -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 diff --git a/teshsuite/smpi/allgatherv_coll.tesh b/teshsuite/smpi/allgatherv_coll.tesh index 8497a1f146..a4a9e46ee7 100644 --- a/teshsuite/smpi/allgatherv_coll.tesh +++ b/teshsuite/smpi/allgatherv_coll.tesh @@ -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 diff --git a/teshsuite/smpi/allreduce.c b/teshsuite/smpi/allreduce.c index 72f5b61c70..a8044afdbc 100644 --- a/teshsuite/smpi/allreduce.c +++ b/teshsuite/smpi/allreduce.c @@ -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 #include diff --git a/teshsuite/smpi/allreduce_coll.c b/teshsuite/smpi/allreduce_coll.c index 00024b736b..e2953f9e7e 100644 --- a/teshsuite/smpi/allreduce_coll.c +++ b/teshsuite/smpi/allreduce_coll.c @@ -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 diff --git a/teshsuite/smpi/allreduce_coll.tesh b/teshsuite/smpi/allreduce_coll.tesh index a1ba6ea45b..b797b2e0aa 100644 --- a/teshsuite/smpi/allreduce_coll.tesh +++ b/teshsuite/smpi/allreduce_coll.tesh @@ -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 diff --git a/teshsuite/smpi/allreduce_coll_large.tesh b/teshsuite/smpi/allreduce_coll_large.tesh index 663e552e9e..ec96371807 100644 --- a/teshsuite/smpi/allreduce_coll_large.tesh +++ b/teshsuite/smpi/allreduce_coll_large.tesh @@ -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 diff --git a/teshsuite/smpi/alltoall2.c b/teshsuite/smpi/alltoall2.c index 34e5912f17..885756104c 100644 --- a/teshsuite/smpi/alltoall2.c +++ b/teshsuite/smpi/alltoall2.c @@ -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 diff --git a/teshsuite/smpi/alltoall_basic.c b/teshsuite/smpi/alltoall_basic.c index c3af311b85..9e2a166b9a 100644 --- a/teshsuite/smpi/alltoall_basic.c +++ b/teshsuite/smpi/alltoall_basic.c @@ -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 diff --git a/teshsuite/smpi/alltoall_coll.c b/teshsuite/smpi/alltoall_coll.c index a8cb7ce784..8a9bd730cb 100644 --- a/teshsuite/smpi/alltoall_coll.c +++ b/teshsuite/smpi/alltoall_coll.c @@ -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 diff --git a/teshsuite/smpi/alltoall_coll.tesh b/teshsuite/smpi/alltoall_coll.tesh index 5a4f09513d..a99b590346 100644 --- a/teshsuite/smpi/alltoall_coll.tesh +++ b/teshsuite/smpi/alltoall_coll.tesh @@ -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 diff --git a/teshsuite/smpi/alltoallv_coll.c b/teshsuite/smpi/alltoallv_coll.c index 0b4c71b1f0..6a2c169e76 100644 --- a/teshsuite/smpi/alltoallv_coll.c +++ b/teshsuite/smpi/alltoallv_coll.c @@ -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. diff --git a/teshsuite/smpi/alltoallv_coll.tesh b/teshsuite/smpi/alltoallv_coll.tesh index 5a565949a5..3346488ea1 100644 --- a/teshsuite/smpi/alltoallv_coll.tesh +++ b/teshsuite/smpi/alltoallv_coll.tesh @@ -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 diff --git a/teshsuite/smpi/barrier.c b/teshsuite/smpi/barrier.c index 1a680de27b..5c87292dfb 100644 --- a/teshsuite/smpi/barrier.c +++ b/teshsuite/smpi/barrier.c @@ -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 diff --git a/teshsuite/smpi/barrier_coll.tesh b/teshsuite/smpi/barrier_coll.tesh index 6e5a74aafb..a58751e5a2 100644 --- a/teshsuite/smpi/barrier_coll.tesh +++ b/teshsuite/smpi/barrier_coll.tesh @@ -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) diff --git a/teshsuite/smpi/bcast.c b/teshsuite/smpi/bcast.c index 0743d23351..e0bff2db7f 100644 --- a/teshsuite/smpi/bcast.c +++ b/teshsuite/smpi/bcast.c @@ -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 diff --git a/teshsuite/smpi/bcast.tesh b/teshsuite/smpi/bcast.tesh index 9fb30594f7..7b5430e82d 100644 --- a/teshsuite/smpi/bcast.tesh +++ b/teshsuite/smpi/bcast.tesh @@ -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 diff --git a/teshsuite/smpi/bcast_coll.c b/teshsuite/smpi/bcast_coll.c index a78bd5d542..c9d898e391 100644 --- a/teshsuite/smpi/bcast_coll.c +++ b/teshsuite/smpi/bcast_coll.c @@ -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 diff --git a/teshsuite/smpi/bcast_coll.tesh b/teshsuite/smpi/bcast_coll.tesh index dc5c70a8f6..641e8d2dcf 100644 --- a/teshsuite/smpi/bcast_coll.tesh +++ b/teshsuite/smpi/bcast_coll.tesh @@ -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 diff --git a/teshsuite/smpi/compute.c b/teshsuite/smpi/compute.c index e67315eead..92bce0f1e1 100644 --- a/teshsuite/smpi/compute.c +++ b/teshsuite/smpi/compute.c @@ -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 { diff --git a/teshsuite/smpi/compute.tesh b/teshsuite/smpi/compute.tesh index aec5db38fe..8e74bb9b7e 100644 --- a/teshsuite/smpi/compute.tesh +++ b/teshsuite/smpi/compute.tesh @@ -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. diff --git a/teshsuite/smpi/compute2.c b/teshsuite/smpi/compute2.c index 1720d84c89..3102858088 100644 --- a/teshsuite/smpi/compute2.c +++ b/teshsuite/smpi/compute2.c @@ -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 { diff --git a/teshsuite/smpi/compute3.c b/teshsuite/smpi/compute3.c index f0445ba537..31177306a5 100644 --- a/teshsuite/smpi/compute3.c +++ b/teshsuite/smpi/compute3.c @@ -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 #include +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; diff --git a/teshsuite/smpi/dsend.c b/teshsuite/smpi/dsend.c index 8043e5b0d8..30d63893cc 100644 --- a/teshsuite/smpi/dsend.c +++ b/teshsuite/smpi/dsend.c @@ -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 diff --git a/teshsuite/smpi/gather_coll.c b/teshsuite/smpi/gather_coll.c index d3944e7b1c..feed6360a1 100644 --- a/teshsuite/smpi/gather_coll.c +++ b/teshsuite/smpi/gather_coll.c @@ -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 diff --git a/teshsuite/smpi/gather_coll.tesh b/teshsuite/smpi/gather_coll.tesh index 2faa727a91..9498cf1db7 100644 --- a/teshsuite/smpi/gather_coll.tesh +++ b/teshsuite/smpi/gather_coll.tesh @@ -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 diff --git a/teshsuite/smpi/get_processor_name.c b/teshsuite/smpi/get_processor_name.c index 5601e719fa..90b9a0bb0e 100644 --- a/teshsuite/smpi/get_processor_name.c +++ b/teshsuite/smpi/get_processor_name.c @@ -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 diff --git a/teshsuite/smpi/hvector.tesh b/teshsuite/smpi/hvector.tesh index c0a66fe9e3..99e111128c 100644 --- a/teshsuite/smpi/hvector.tesh +++ b/teshsuite/smpi/hvector.tesh @@ -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' diff --git a/teshsuite/smpi/hvector_test.c b/teshsuite/smpi/hvector_test.c index f3cb04fc9c..f37f2341cc 100644 --- a/teshsuite/smpi/hvector_test.c +++ b/teshsuite/smpi/hvector_test.c @@ -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 #include "mpi.h" #define SIZE 4 diff --git a/teshsuite/smpi/indexed.tesh b/teshsuite/smpi/indexed.tesh index 6e1d4587ee..c5e6f8d7f4 100644 --- a/teshsuite/smpi/indexed.tesh +++ b/teshsuite/smpi/indexed.tesh @@ -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' diff --git a/teshsuite/smpi/indexed_test.c b/teshsuite/smpi/indexed_test.c index 5d2dac07c7..4ceed68d32 100644 --- a/teshsuite/smpi/indexed_test.c +++ b/teshsuite/smpi/indexed_test.c @@ -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 #include "mpi.h" diff --git a/teshsuite/smpi/mpich3-test/CMakeLists.txt b/teshsuite/smpi/mpich3-test/CMakeLists.txt index 645ace8aa1..f8b8f8ecd6 100644 --- a/teshsuite/smpi/mpich3-test/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/CMakeLists.txt @@ -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) + + + diff --git a/teshsuite/smpi/mpich3-test/attr/CMakeLists.txt b/teshsuite/smpi/mpich3-test/attr/CMakeLists.txt index 90e04da047..95c7d48c6b 100644 --- a/teshsuite/smpi/mpich3-test/attr/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/attr/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/coll/CMakeLists.txt b/teshsuite/smpi/mpich3-test/coll/CMakeLists.txt index 4d4093b034..a7e5d0b34c 100644 --- a/teshsuite/smpi/mpich3-test/coll/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/coll/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/coll/allgatherv4.c b/teshsuite/smpi/mpich3-test/coll/allgatherv4.c index 29e4d473a4..60bf0a4ebe 100644 --- a/teshsuite/smpi/mpich3-test/coll/allgatherv4.c +++ b/teshsuite/smpi/mpich3-test/coll/allgatherv4.c @@ -7,6 +7,7 @@ #include "mpi.h" #include "mpitest.h" +#include "smpi_cocci.h" #include #include #ifdef HAVE_SYS_TIME_H @@ -25,9 +26,11 @@ #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); diff --git a/teshsuite/smpi/mpich3-test/comm/CMakeLists.txt b/teshsuite/smpi/mpich3-test/comm/CMakeLists.txt index 030ac6b456..715ced56ae 100644 --- a/teshsuite/smpi/mpich3-test/comm/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/comm/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/datatype/CMakeLists.txt b/teshsuite/smpi/mpich3-test/datatype/CMakeLists.txt index 9a95d09329..f8686dc0b9 100644 --- a/teshsuite/smpi/mpich3-test/datatype/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/datatype/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/datatype/contents.c b/teshsuite/smpi/mpich3-test/datatype/contents.c index fb513c30a8..2e96a9e28b 100644 --- a/teshsuite/smpi/mpich3-test/datatype/contents.c +++ b/teshsuite/smpi/mpich3-test/datatype/contents.c @@ -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, diff --git a/teshsuite/smpi/mpich3-test/datatype/testlist b/teshsuite/smpi/mpich3-test/datatype/testlist index 6c35b3d497..ea89c43f04 100644 --- a/teshsuite/smpi/mpich3-test/datatype/testlist +++ b/teshsuite/smpi/mpich3-test/datatype/testlist @@ -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 diff --git a/teshsuite/smpi/mpich3-test/f77/attr/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f77/attr/CMakeLists.txt index 46e9d881d7..b3f9899cdd 100644 --- a/teshsuite/smpi/mpich3-test/f77/attr/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/f77/attr/CMakeLists.txt @@ -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 - ) +) diff --git a/teshsuite/smpi/mpich3-test/f77/coll/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f77/coll/CMakeLists.txt index e7264dcbc1..ad84557dfa 100644 --- a/teshsuite/smpi/mpich3-test/f77/coll/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/f77/coll/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/f77/coll/exscanf.f b/teshsuite/smpi/mpich3-test/f77/coll/exscanf.f index 5e6f64e63e..27de6b97df 100644 --- a/teshsuite/smpi/mpich3-test/f77/coll/exscanf.f +++ b/teshsuite/smpi/mpich3-test/f77/coll/exscanf.f @@ -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) diff --git a/teshsuite/smpi/mpich3-test/f77/comm/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f77/comm/CMakeLists.txt index 60e5e9fc1b..cedc5c14cd 100644 --- a/teshsuite/smpi/mpich3-test/f77/comm/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/f77/comm/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/f77/datatype/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f77/datatype/CMakeLists.txt index 0b7c83630f..bc07be4001 100644 --- a/teshsuite/smpi/mpich3-test/f77/datatype/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/f77/datatype/CMakeLists.txt @@ -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 ) diff --git a/teshsuite/smpi/mpich3-test/f77/ext/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f77/ext/CMakeLists.txt index 9a0a418b05..cf6b636f33 100644 --- a/teshsuite/smpi/mpich3-test/f77/ext/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/f77/ext/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/f77/init/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f77/init/CMakeLists.txt index c307f82ad5..523aa93657 100644 --- a/teshsuite/smpi/mpich3-test/f77/init/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/f77/init/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/f77/pt2pt/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f77/pt2pt/CMakeLists.txt index 7ccf42061c..5d4714b624 100644 --- a/teshsuite/smpi/mpich3-test/f77/pt2pt/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/f77/pt2pt/CMakeLists.txt @@ -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 index 0000000000..c0e65e2bcd --- /dev/null +++ b/teshsuite/smpi/mpich3-test/f77/util/CMakeLists.txt @@ -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 + ) diff --git a/teshsuite/smpi/mpich3-test/f77/util/mtestf.f b/teshsuite/smpi/mpich3-test/f77/util/mtestf.f index 9bef6e158d..f1a137ca7b 100644 --- a/teshsuite/smpi/mpich3-test/f77/util/mtestf.f +++ b/teshsuite/smpi/mpich3-test/f77/util/mtestf.f @@ -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 diff --git a/teshsuite/smpi/mpich3-test/f90/coll/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f90/coll/CMakeLists.txt index b2da1526bc..1f8e36bfa7 100644 --- a/teshsuite/smpi/mpich3-test/f90/coll/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/f90/coll/CMakeLists.txt @@ -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 ) diff --git a/teshsuite/smpi/mpich3-test/f90/coll/exscanf90.f90 b/teshsuite/smpi/mpich3-test/f90/coll/exscanf90.f90 index 1f1ec517e7..59cb7e447b 100644 --- a/teshsuite/smpi/mpich3-test/f90/coll/exscanf90.f90 +++ b/teshsuite/smpi/mpich3-test/f90/coll/exscanf90.f90 @@ -10,10 +10,12 @@ 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) diff --git a/teshsuite/smpi/mpich3-test/f90/coll/redscatf90.f90 b/teshsuite/smpi/mpich3-test/f90/coll/redscatf90.f90 index 66339f216a..2230ac2fa6 100644 --- a/teshsuite/smpi/mpich3-test/f90/coll/redscatf90.f90 +++ b/teshsuite/smpi/mpich3-test/f90/coll/redscatf90.f90 @@ -30,7 +30,7 @@ program main use mpi - integer errs, ierr, toterr + integer errs, ierr integer maxsize parameter (maxsize=1024) integer recvbuf diff --git a/teshsuite/smpi/mpich3-test/f90/datatype/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f90/datatype/CMakeLists.txt index ca51980a93..3ad68e743c 100644 --- a/teshsuite/smpi/mpich3-test/f90/datatype/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/f90/datatype/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/f90/init/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f90/init/CMakeLists.txt index 3e4ec844f3..398f3db671 100644 --- a/teshsuite/smpi/mpich3-test/f90/init/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/f90/init/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/f90/pt2pt/CMakeLists.txt b/teshsuite/smpi/mpich3-test/f90/pt2pt/CMakeLists.txt index dfed73b875..51a0fcbf9c 100644 --- a/teshsuite/smpi/mpich3-test/f90/pt2pt/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/f90/pt2pt/CMakeLists.txt @@ -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 index 0000000000..04968a4e46 --- /dev/null +++ b/teshsuite/smpi/mpich3-test/f90/util/CMakeLists.txt @@ -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 + ) diff --git a/teshsuite/smpi/mpich3-test/group/CMakeLists.txt b/teshsuite/smpi/mpich3-test/group/CMakeLists.txt index e67cccac1b..f4bcdc47eb 100644 --- a/teshsuite/smpi/mpich3-test/group/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/group/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/init/CMakeLists.txt b/teshsuite/smpi/mpich3-test/init/CMakeLists.txt index c84f088115..7b035fb906 100644 --- a/teshsuite/smpi/mpich3-test/init/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/init/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/pt2pt/CMakeLists.txt b/teshsuite/smpi/mpich3-test/pt2pt/CMakeLists.txt index b70536731f..01f8aaf50e 100644 --- a/teshsuite/smpi/mpich3-test/pt2pt/CMakeLists.txt +++ b/teshsuite/smpi/mpich3-test/pt2pt/CMakeLists.txt @@ -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() diff --git a/teshsuite/smpi/mpich3-test/util/mtest.c b/teshsuite/smpi/mpich3-test/util/mtest.c index 0fd3032f98..e922072ddf 100644 --- a/teshsuite/smpi/mpich3-test/util/mtest.c +++ b/teshsuite/smpi/mpich3-test/util/mtest.c @@ -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 #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 diff --git a/teshsuite/smpi/pingpong.c b/teshsuite/smpi/pingpong.c index e7cb94fedb..7d2677f008 100644 --- a/teshsuite/smpi/pingpong.c +++ b/teshsuite/smpi/pingpong.c @@ -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 diff --git a/teshsuite/smpi/pt2pt.tesh b/teshsuite/smpi/pt2pt.tesh index 6d2e09ada0..9b88c7b07f 100644 --- a/teshsuite/smpi/pt2pt.tesh +++ b/teshsuite/smpi/pt2pt.tesh @@ -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] diff --git a/teshsuite/smpi/reduce.c b/teshsuite/smpi/reduce.c index 84203e9a8e..92436c9021 100644 --- a/teshsuite/smpi/reduce.c +++ b/teshsuite/smpi/reduce.c @@ -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 #include diff --git a/teshsuite/smpi/reduce.tesh b/teshsuite/smpi/reduce.tesh index 3236486fe0..a1910888d4 100644 --- a/teshsuite/smpi/reduce.tesh +++ b/teshsuite/smpi/reduce.tesh @@ -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 diff --git a/teshsuite/smpi/reduce_coll.c b/teshsuite/smpi/reduce_coll.c index 3b284570f4..7acc93d99f 100644 --- a/teshsuite/smpi/reduce_coll.c +++ b/teshsuite/smpi/reduce_coll.c @@ -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 diff --git a/teshsuite/smpi/reduce_coll.tesh b/teshsuite/smpi/reduce_coll.tesh index 65e3575bed..0edfdc7a03 100644 --- a/teshsuite/smpi/reduce_coll.tesh +++ b/teshsuite/smpi/reduce_coll.tesh @@ -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 ] diff --git a/teshsuite/smpi/reduce_scatter_coll.c b/teshsuite/smpi/reduce_scatter_coll.c index f8d9fb332f..41b6bc7118 100644 --- a/teshsuite/smpi/reduce_scatter_coll.c +++ b/teshsuite/smpi/reduce_scatter_coll.c @@ -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. * diff --git a/teshsuite/smpi/reduce_scatter_coll.tesh b/teshsuite/smpi/reduce_scatter_coll.tesh index 5344d6488a..249f686ff9 100644 --- a/teshsuite/smpi/reduce_scatter_coll.tesh +++ b/teshsuite/smpi/reduce_scatter_coll.tesh @@ -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) diff --git a/teshsuite/smpi/scatter.c b/teshsuite/smpi/scatter.c index 0096064d9c..fda82e1724 100644 --- a/teshsuite/smpi/scatter.c +++ b/teshsuite/smpi/scatter.c @@ -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 * diff --git a/teshsuite/smpi/scatter_coll.tesh b/teshsuite/smpi/scatter_coll.tesh index d5ef00d24c..043ec55a09 100644 --- a/teshsuite/smpi/scatter_coll.tesh +++ b/teshsuite/smpi/scatter_coll.tesh @@ -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. diff --git a/teshsuite/smpi/sendrecv.c b/teshsuite/smpi/sendrecv.c index 6a1bf0e71d..5a55887039 100644 --- a/teshsuite/smpi/sendrecv.c +++ b/teshsuite/smpi/sendrecv.c @@ -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 diff --git a/teshsuite/smpi/sendtest.c b/teshsuite/smpi/sendtest.c index 132bf9a52d..bb5c4803d8 100644 --- a/teshsuite/smpi/sendtest.c +++ b/teshsuite/smpi/sendtest.c @@ -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 diff --git a/teshsuite/smpi/shared.c b/teshsuite/smpi/shared.c index b1536c5179..78759352b6 100644 --- a/teshsuite/smpi/shared.c +++ b/teshsuite/smpi/shared.c @@ -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 diff --git a/teshsuite/smpi/shared.tesh b/teshsuite/smpi/shared.tesh index f9ad65fe68..3d78abb398 100644 --- a/teshsuite/smpi/shared.tesh +++ b/teshsuite/smpi/shared.tesh @@ -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' diff --git a/teshsuite/smpi/split.c b/teshsuite/smpi/split.c index 0a41c476a0..64a4a862d6 100644 --- a/teshsuite/smpi/split.c +++ b/teshsuite/smpi/split.c @@ -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 diff --git a/teshsuite/smpi/struct.tesh b/teshsuite/smpi/struct.tesh index 804954beec..c6e05dbaa8 100644 --- a/teshsuite/smpi/struct.tesh +++ b/teshsuite/smpi/struct.tesh @@ -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) diff --git a/teshsuite/smpi/struct_test.c b/teshsuite/smpi/struct_test.c index 1159b933e3..658f51a57c 100644 --- a/teshsuite/smpi/struct_test.c +++ b/teshsuite/smpi/struct_test.c @@ -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 #include "mpi.h" diff --git a/teshsuite/smpi/ttest01.c b/teshsuite/smpi/ttest01.c index 5ffb0fdb87..c01db5b7a6 100644 --- a/teshsuite/smpi/ttest01.c +++ b/teshsuite/smpi/ttest01.c @@ -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 diff --git a/teshsuite/smpi/vector.tesh b/teshsuite/smpi/vector.tesh index 9df5dd2418..ddd03a0408 100644 --- a/teshsuite/smpi/vector.tesh +++ b/teshsuite/smpi/vector.tesh @@ -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' diff --git a/teshsuite/smpi/vector_test.c b/teshsuite/smpi/vector_test.c index ea41ec2c57..1025915127 100644 --- a/teshsuite/smpi/vector_test.c +++ b/teshsuite/smpi/vector_test.c @@ -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 #include "mpi.h" #define SIZE 4 diff --git a/teshsuite/xbt/CMakeLists.txt b/teshsuite/xbt/CMakeLists.txt index a181c6d614..a7e923586f 100644 --- a/teshsuite/xbt/CMakeLists.txt +++ b/teshsuite/xbt/CMakeLists.txt @@ -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) diff --git a/teshsuite/xbt/log_large_test.c b/teshsuite/xbt/log_large_test.c index cd3ade7c05..847a57c123 100644 --- a/teshsuite/xbt/log_large_test.c +++ b/teshsuite/xbt/log_large_test.c @@ -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 diff --git a/teshsuite/xbt/mmalloc_test.c b/teshsuite/xbt/mmalloc_test.c index 8b245aa1a2..a09704de3e 100644 --- a/teshsuite/xbt/mmalloc_test.c +++ b/teshsuite/xbt/mmalloc_test.c @@ -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 diff --git a/teshsuite/xbt/parallel_log_crashtest.c b/teshsuite/xbt/parallel_log_crashtest.c index 920784f0e1..c5c5c8e122 100644 --- a/teshsuite/xbt/parallel_log_crashtest.c +++ b/teshsuite/xbt/parallel_log_crashtest.c @@ -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 diff --git a/teshsuite/xbt/parmap_test.c b/teshsuite/xbt/parmap_test.c index 52c4050925..f21e9f70b7 100644 --- a/teshsuite/xbt/parmap_test.c +++ b/teshsuite/xbt/parmap_test.c @@ -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 diff --git a/testsuite/surf/lmm_usage.c b/testsuite/surf/lmm_usage.c index d9d7a01656..3d886707c9 100644 --- a/testsuite/surf/lmm_usage.c +++ b/testsuite/surf/lmm_usage.c @@ -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 diff --git a/testsuite/surf/maxmin_bench.c b/testsuite/surf/maxmin_bench.c index f08e3220ff..8e7d2b0fad 100644 --- a/testsuite/surf/maxmin_bench.c +++ b/testsuite/surf/maxmin_bench.c @@ -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 diff --git a/testsuite/surf/surf_usage.c b/testsuite/surf/surf_usage.c index 1a922a8e63..45cb3efd86 100644 --- a/testsuite/surf/surf_usage.c +++ b/testsuite/surf/surf_usage.c @@ -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"); diff --git a/testsuite/surf/surf_usage2.c b/testsuite/surf/surf_usage2.c index 896f95971b..2e633a99c9 100644 --- a/testsuite/surf/surf_usage2.c +++ b/testsuite/surf/surf_usage2.c @@ -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; } } diff --git a/testsuite/surf/trace_usage.c b/testsuite/surf/trace_usage.c index b41a6670a2..d56c0d755d 100644 --- a/testsuite/surf/trace_usage.c +++ b/testsuite/surf/trace_usage.c @@ -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 diff --git a/testsuite/xbt/graphxml_usage.c b/testsuite/xbt/graphxml_usage.c index 965c1e52eb..5a23fbe54f 100644 --- a/testsuite/xbt/graphxml_usage.c +++ b/testsuite/xbt/graphxml_usage.c @@ -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 diff --git a/testsuite/xbt/heap_bench.c b/testsuite/xbt/heap_bench.c index 5cca0cb233..a6d9157be3 100644 --- a/testsuite/xbt/heap_bench.c +++ b/testsuite/xbt/heap_bench.c @@ -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 diff --git a/testsuite/xbt/log_usage.c b/testsuite/xbt/log_usage.c index 0f32252fde..e5b41e1ef1 100644 --- a/testsuite/xbt/log_usage.c +++ b/testsuite/xbt/log_usage.c @@ -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 diff --git a/testsuite/xbt/parmap_bench.c b/testsuite/xbt/parmap_bench.c index e95d77deae..e6558bc986 100644 --- a/testsuite/xbt/parmap_bench.c +++ b/testsuite/xbt/parmap_bench.c @@ -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 #include #include diff --git a/tools/MSG_visualization/colorize.pl b/tools/MSG_visualization/colorize.pl index c346409b4c..b3c567189d 100755 --- a/tools/MSG_visualization/colorize.pl +++ b/tools/MSG_visualization/colorize.pl @@ -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"; diff --git a/tools/MSG_visualization/trace2fig.pl b/tools/MSG_visualization/trace2fig.pl index 712b363806..cd23d39cec 100755 --- a/tools/MSG_visualization/trace2fig.pl +++ b/tools/MSG_visualization/trace2fig.pl @@ -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; diff --git a/tools/check_dist_archive b/tools/check_dist_archive index 92092eacb8..963a4a3495 100755 --- a/tools/check_dist_archive +++ b/tools/check_dist_archive @@ -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 <&2 <&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 diff --git a/tools/check_dist_archive.exclude b/tools/check_dist_archive.exclude index 6112c8fa70..8baa979b32 100644 --- a/tools/check_dist_archive.exclude +++ b/tools/check_dist_archive.exclude @@ -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/.* diff --git a/tools/doxygen/fig2dev_postprocessor.pl b/tools/doxygen/fig2dev_postprocessor.pl index 281e6eba60..b5b7d82215 100755 --- a/tools/doxygen/fig2dev_postprocessor.pl +++ b/tools/doxygen/fig2dev_postprocessor.pl @@ -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; diff --git a/tools/doxygen/index_create.pl b/tools/doxygen/index_create.pl index 858e611eee..f9f58d2953 100755 --- a/tools/doxygen/index_create.pl +++ b/tools/doxygen/index_create.pl @@ -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 "; my($type) = ""; diff --git a/tools/doxygen/xbt_log_extract_hierarchy.pl b/tools/doxygen/xbt_log_extract_hierarchy.pl index 8544ab92d1..d9a85f58a9 100755 --- a/tools/doxygen/xbt_log_extract_hierarchy.pl +++ b/tools/doxygen/xbt_log_extract_hierarchy.pl @@ -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=) { chomp $file; parse_file($file); diff --git a/tools/fix-paje-trace.sh b/tools/fix-paje-trace.sh index cb743ce069..5305d78b53 100755 --- a/tools/fix-paje-trace.sh +++ b/tools/fix-paje-trace.sh @@ -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 index 0000000000..7bd1431a9a --- /dev/null +++ b/tools/generate-multi-jar.py @@ -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() diff --git a/tools/graphicator/graphicator.c b/tools/graphicator/graphicator.c index a035d51af8..502058978f 100644 --- a/tools/graphicator/graphicator.c +++ b/tools/graphicator/graphicator.c @@ -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 diff --git a/tools/indent b/tools/indent index 8e37750474..f9f914a61e 100755 --- a/tools/indent +++ b/tools/indent @@ -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 index 0000000000..04049fa48f --- /dev/null +++ b/tools/normalize-pointers.py @@ -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 " + 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:] + + + + diff --git a/tools/platf_route_rulebased2full.py b/tools/platf_route_rulebased2full.py index cddfeaa94a..948ddbb505 100755 --- a/tools/platf_route_rulebased2full.py +++ b/tools/platf_route_rulebased2full.py @@ -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 diff --git a/tools/sg_unit_extractor.pl b/tools/sg_unit_extractor.pl index 66ef7d7dcd..08182c7093 100755 --- a/tools/sg_unit_extractor.pl +++ b/tools/sg_unit_extractor.pl @@ -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; diff --git a/tools/sg_xml_unit_converter.py b/tools/sg_xml_unit_converter.py index 5b53594932..3976f667b1 100644 --- a/tools/sg_xml_unit_converter.py +++ b/tools/sg_xml_unit_converter.py @@ -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 diff --git a/tools/simgrid.supp b/tools/simgrid.supp index 27bab275b2..dbbae62ac1 100644 --- a/tools/simgrid.supp +++ b/tools/simgrid.supp @@ -31,6 +31,16 @@ 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: # ,---- diff --git a/tools/simgrid_update_xml.pl b/tools/simgrid_update_xml.pl index 22bf4b3a0d..7ec98798be 100755 --- a/tools/simgrid_update_xml.pl +++ b/tools/simgrid_update_xml.pl @@ -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. diff --git a/tools/spell/lspell.pl b/tools/spell/lspell.pl index ef098396ad..e409eef58c 100644 --- a/tools/spell/lspell.pl +++ b/tools/spell/lspell.pl @@ -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. diff --git a/tools/spell/lspell2.pl b/tools/spell/lspell2.pl index 25325753be..b9d11b8601 100644 --- a/tools/spell/lspell2.pl +++ b/tools/spell/lspell2.pl @@ -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. diff --git a/tools/spell/sg_stopwords.txt b/tools/spell/sg_stopwords.txt index bbb97a5dc6..c87cff166c 100644 --- a/tools/spell/sg_stopwords.txt +++ b/tools/spell/sg_stopwords.txt @@ -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 diff --git a/tools/spell/spell.sh b/tools/spell/spell.sh index 406d634bff..ef73afdc93 100644 --- a/tools/spell/spell.sh +++ b/tools/spell/spell.sh @@ -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 diff --git a/tools/tesh/colorize.pl b/tools/tesh/colorize.pl index 045ff68447..9cc8d183c9 100755 --- a/tools/tesh/colorize.pl +++ b/tools/tesh/colorize.pl @@ -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; diff --git a/tools/tesh/run_context.c b/tools/tesh/run_context.c index 5768cf986f..6f046dfa49 100644 --- a/tools/tesh/run_context.c +++ b/tools/tesh/run_context.c @@ -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 diff --git a/tools/tesh/run_context.h b/tools/tesh/run_context.h index 5a12029081..1915e7f58e 100644 --- a/tools/tesh/run_context.h +++ b/tools/tesh/run_context.h @@ -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 diff --git a/tools/tesh/signal.c b/tools/tesh/signal.c index adb9ee18f1..a43da9b3a7 100644 --- a/tools/tesh/signal.c +++ b/tools/tesh/signal.c @@ -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 diff --git a/tools/tesh/tesh.1 b/tools/tesh/tesh.1 index d5d7283d57..817110ffc6 100644 --- a/tools/tesh/tesh.1 +++ b/tools/tesh/tesh.1 @@ -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) diff --git a/tools/tesh/tesh.c b/tools/tesh/tesh.c index 7f752291ac..e05fd5ee62 100644 --- a/tools/tesh/tesh.c +++ b/tools/tesh/tesh.c @@ -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 diff --git a/tools/tesh/tesh.h b/tools/tesh/tesh.h index e7f5627af5..cd9236d654 100644 --- a/tools/tesh/tesh.h +++ b/tools/tesh/tesh.h @@ -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 index 0000000000..36c11af230 --- /dev/null +++ b/tools/update_copyright_header @@ -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 <&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 <